@agent-native/core 0.149.1 → 0.149.3
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 +1 -1
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/analytics/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/analytics/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/analytics/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/analytics/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/analytics/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +2 -0
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/analytics/AGENTS.md +25 -32
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +150 -46
- package/corpus/templates/analytics/app/global.css +1 -1
- package/corpus/templates/analytics/app/i18n-data.ts +37 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +32 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +2 -0
- package/corpus/templates/analytics/changelog/2026-08-10-dashboard-tables-can-be-copied-and-sorted-by-multiple-column.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/assets/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/assets/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/assets/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/assets/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/assets/AGENTS.md +6 -9
- package/corpus/templates/assets/app/global.css +1 -1
- package/corpus/templates/assets/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/assets/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/brain/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/brain/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/brain/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/brain/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/brain/AGENTS.md +5 -12
- package/corpus/templates/brain/app/global.css +1 -1
- package/corpus/templates/brain/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/brain/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/calendar/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/calendar/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/calendar/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/calendar/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/calendar/AGENTS.md +8 -9
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/chat/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/chat/AGENTS.md +32 -80
- package/corpus/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/clips/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/clips/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/clips/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/clips/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/clips/AGENTS.md +25 -31
- package/corpus/templates/clips/changelog/2026-08-10-clips-desktop-sign-in-now-starts-with-magic-links-and-google.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/overlay.css +1 -0
- package/corpus/templates/clips/desktop/src/app.tsx +274 -137
- package/corpus/templates/clips/desktop/src/styles.css +35 -0
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/content/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/content/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/content/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/content/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/content/AGENTS.md +5 -9
- package/corpus/templates/content/app/global.css +1 -0
- package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/crm/AGENTS.md +7 -11
- package/corpus/templates/crm/app/global.css +1 -1
- package/corpus/templates/crm/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/crm/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/design/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/design/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/design/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/design/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +70 -3
- package/corpus/templates/design/AGENTS.md +13 -21
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -0
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +19 -2
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +115 -7
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +82 -7
- package/corpus/templates/design/app/components/design/design-trace.ts +120 -0
- package/corpus/templates/design/app/components/design/dnd-debug.ts +2 -1
- package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +40 -26
- package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +4 -1
- package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +12 -3
- package/corpus/templates/design/app/components/design/multi-screen/screen-content-cache.ts +4 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +7 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +3 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +1 -0
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +5 -5
- package/corpus/templates/design/app/pages/DesignSystems.tsx +3 -2
- package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +100 -13
- package/corpus/templates/design/app/pages/design-editor/cross-screen-text-color.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/data-operations.ts +14 -0
- package/corpus/templates/design/changelog/2026-08-10-marquee-selecting-layers-far-down-a-tall-screen-now-selects-.md +6 -0
- package/corpus/templates/design/changelog/2026-08-10-the-frame-tool-draws-a-plain-frame-by-default-with-screen-av.md +6 -0
- package/corpus/templates/design/e2e/global-setup.ts +27 -32
- package/corpus/templates/design/playwright.config.ts +3 -5
- package/corpus/templates/design/shared/breakpoint-media.ts +9 -2
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/dispatch/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/dispatch/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/dispatch/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/dispatch/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/dispatch/AGENTS.md +9 -16
- package/corpus/templates/dispatch/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/factory/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/factory/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/factory/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/factory/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/factory/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/factory/AGENTS.md +10 -24
- package/corpus/templates/factory/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/forms/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/forms/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/forms/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/forms/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/forms/AGENTS.md +11 -17
- package/corpus/templates/forms/app/global.css +1 -0
- package/corpus/templates/forms/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/forms/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/macros/AGENTS.md +8 -8
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/mail/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/mail/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/mail/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/mail/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/mail/AGENTS.md +5 -6
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/plan/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/plan/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/plan/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/plan/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/plan/AGENTS.md +5 -14
- package/corpus/templates/plan/app/global.css +1 -0
- package/corpus/templates/plan/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/plan/changelog/2026-08-11-plan-no-longer-reloads-when-runtime-state-changes.md +6 -0
- package/corpus/templates/plan/server/ui-plan-html.ts +4 -1
- package/corpus/templates/plan/vite.config.ts +5 -0
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/slides/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/slides/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/slides/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +2 -2
- package/corpus/templates/slides/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +6 -3
- package/corpus/templates/slides/.agents/skills/deck-management/SKILL.md +6 -1
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +3 -2
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +3 -0
- package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +3 -3
- package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/slides/AGENTS.md +33 -35
- package/corpus/templates/slides/actions/add-deck.ts +2 -0
- package/corpus/templates/slides/actions/add-slide.ts +15 -1
- package/corpus/templates/slides/actions/create-deck.ts +18 -6
- package/corpus/templates/slides/actions/get-deck-reference-context.ts +2 -2
- package/corpus/templates/slides/actions/get-deck.ts +83 -7
- package/corpus/templates/slides/actions/import-file.ts +2 -1
- package/corpus/templates/slides/actions/patch-deck.ts +165 -9
- package/corpus/templates/slides/actions/save-deck.ts +24 -1
- package/corpus/templates/slides/actions/update-slide.ts +1 -1
- package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +2 -2
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +1 -23
- package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +2 -2
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +6 -6
- package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +3 -3
- package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +4 -4
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +432 -668
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +296 -259
- package/corpus/templates/slides/app/components/editor/GeneratingSlidePreview.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +13 -1
- package/corpus/templates/slides/app/components/editor/NewDeckReferenceStep.tsx +56 -174
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +241 -116
- package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +42 -14
- package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +6 -12
- package/corpus/templates/slides/app/components/editor/editor-command-model.ts +35 -0
- package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +1 -1
- package/corpus/templates/slides/app/components/layout/Layout.tsx +34 -35
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +8 -10
- package/corpus/templates/slides/app/components/layout/layout-route-policy.ts +2 -5
- package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +45 -40
- package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +63 -16
- package/corpus/templates/slides/app/context/DeckContext.tsx +2 -1
- package/corpus/templates/slides/app/global.css +76 -1
- package/corpus/templates/slides/app/hooks/use-generating-slide-preview.ts +25 -3
- package/corpus/templates/slides/app/i18n/en-US.ts +2 -0
- package/corpus/templates/slides/app/lib/create-deck-generation.ts +52 -23
- package/corpus/templates/slides/app/lib/recent-references.ts +23 -1
- package/corpus/templates/slides/app/lib/slide-animation-elements.ts +104 -3
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +17 -33
- package/corpus/templates/slides/app/pages/DesignSystems.tsx +2 -2
- package/corpus/templates/slides/app/pages/Index.tsx +315 -151
- package/corpus/templates/slides/app/root.tsx +43 -0
- package/corpus/templates/slides/changelog/2026-08-10-ai-editing-avatar-badge.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-generated-decks-keep-a-clear-human-readable-title.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-new-deck-creation-now-shows-progress-opens-the-editor-direct.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-presentation-reveals-now-follow-valid-targets.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-slides-editing-controls-are-consolidated-into-one-focused-me.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-slides-now-verify-and-restyle-every-imported-slide-in-one-pa.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-slides-only-suggests-a-google-connection-for-relevant-reques.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-the-google-slides-import-option-is-now-labeled-slides.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-11-faster-slides-chat-deck-reads.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-11-slides-chat-can-read-one-slide-without-loading-the-full-deck.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-11-slides-clearly-indicate-when-an-ai-agent-is-editing-alongsid.md +6 -0
- package/corpus/templates/slides/package.json +1 -0
- package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
- package/corpus/templates/slides/server/lib/validate-slide-animations.ts +163 -0
- package/corpus/templates/slides/server/plugins/agent-chat.ts +8 -5
- package/corpus/templates/slides/shared/api.ts +47 -15
- package/corpus/templates/slides/shared/deck-title.ts +135 -0
- package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/tasks/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/tasks/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/tasks/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/tasks/.agents/skills/agent-watchdog/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/tasks/.agents/skills/efficient-fable/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/efficient-frontier/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/tasks/.agents/skills/plan-arbiter/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/plow-ahead/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/quick-recap/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/stay-within-limits/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/tasks/AGENTS.md +5 -20
- package/corpus/templates/tasks/app/components/tasks/TaskListRow.tsx +4 -1
- package/dist/agent/engine/ai-sdk-engine.js +1 -1
- package/dist/agent/production-agent.d.ts +21 -1
- package/dist/agent/production-agent.js +505 -355
- package/dist/agent/run-manager.js +156 -14
- package/dist/agent/run-store.d.ts +11 -10
- package/dist/agent/run-store.js +17 -13
- package/dist/agent/tool-approval-store.d.ts +18 -0
- package/dist/agent/tool-approval-store.js +122 -0
- package/dist/agent/types.d.ts +1 -1
- package/dist/cli/code-agent-executor.js +11 -2
- package/dist/client/AgentPanel.js +31 -6
- package/dist/client/AssistantChat.d.ts +9 -4
- package/dist/client/AssistantChat.js +221 -149
- package/dist/client/active-run-state.d.ts +9 -1
- package/dist/client/active-run-state.js +34 -3
- package/dist/client/agent-chat/index.d.ts +1 -1
- package/dist/client/agent-chat-adapter.d.ts +8 -0
- package/dist/client/agent-chat-adapter.js +125 -28
- package/dist/client/agent-chat.d.ts +1 -1
- package/dist/client/chat/markdown-renderer.js +14 -2
- package/dist/client/chat/message-components.d.ts +13 -3
- package/dist/client/chat/message-components.js +57 -52
- package/dist/client/chat/run-recovery.d.ts +1 -0
- package/dist/client/chat/run-recovery.js +8 -0
- package/dist/client/chat/tool-call-display.d.ts +5 -5
- package/dist/client/chat/tool-call-display.js +9 -212
- package/dist/client/chat-first/apps-rail.js +3 -3
- package/dist/client/chat-first/browser-pane.js +4 -1
- package/dist/client/chat-first/chat-history.d.ts +3 -1
- package/dist/client/chat-first/chat-history.js +7 -4
- package/dist/client/chat-first/surface-tabs.d.ts +1 -1
- package/dist/client/chat-first/surface-tabs.js +52 -41
- package/dist/client/chat-first/types.d.ts +3 -0
- package/dist/client/chat-first.d.ts +10 -0
- package/dist/client/chat-first.js +37 -2
- package/dist/client/components/ui/message-scroller.js +4 -1
- package/dist/client/i18n.js +3 -1
- package/dist/client/resources/McpConnectionSuggestion.js +9 -1
- package/dist/client/sse-event-processor.d.ts +4 -2
- package/dist/client/sse-event-processor.js +46 -6
- package/dist/client/use-chat-models.js +156 -80
- package/dist/client/use-run-stuck-detection.d.ts +2 -0
- package/dist/client/use-run-stuck-detection.js +85 -9
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/integrations/adapters/slack.d.ts +0 -4
- package/dist/integrations/adapters/slack.js +6 -30
- package/dist/integrations/catalog.js +1 -1
- package/dist/integrations/pending-tasks-store.d.ts +0 -8
- package/dist/integrations/pending-tasks-store.js +0 -21
- package/dist/integrations/slack-manifest.d.ts +2 -2
- package/dist/integrations/slack-manifest.js +0 -3
- package/dist/integrations/webhook-handler.js +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/observability/routes.d.ts +3 -3
- package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
- package/dist/provider-api/actions/provider-api.d.ts +8 -8
- package/dist/scripts/docs/source-search.js +2 -2
- package/dist/server/agent-chat/framework-prompts.js +7 -2
- package/dist/server/agent-chat/prompt-resources.js +2 -2
- package/dist/server/agent-chat/skill-frontmatter.d.ts +31 -2
- package/dist/server/agent-chat/skill-frontmatter.js +41 -15
- package/dist/server/agent-chat-plugin.js +3 -3
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agents-bundle.d.ts +16 -19
- package/dist/server/agents-bundle.js +19 -35
- package/dist/server/auth.js +262 -31
- package/dist/server/better-auth-instance.d.ts +1 -0
- package/dist/server/better-auth-instance.js +17 -2
- package/dist/server/onboarding-html.js +56 -9
- package/dist/server/prompts/framework-core-compact.d.ts +6 -1
- package/dist/server/prompts/framework-core-compact.js +12 -9
- package/dist/server/prompts/framework-core.d.ts +6 -1
- package/dist/server/prompts/framework-core.js +11 -9
- package/dist/server/prompts/index.d.ts +1 -1
- package/dist/server/prompts/index.js +1 -1
- package/dist/server/prompts/shared-rules.d.ts +15 -11
- package/dist/server/prompts/shared-rules.js +17 -13
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/shared/reasoning-effort.d.ts +8 -8
- package/dist/shared/reasoning-effort.js +10 -10
- package/dist/shared/streaming-text-smoothing.js +41 -11
- package/dist/styles/agent-native.css +19 -32
- package/dist/templates/chat/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/chat/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
- package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/chat/AGENTS.md +32 -80
- package/dist/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/default/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/default/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/default/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/default/.agents/skills/create-skill/SKILL.md +9 -35
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +4 -5
- package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/headless/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/headless/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/headless/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/headless/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/workspace-core/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/workspace-core/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/workspace-core/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +1 -0
- package/dist/templates/workspace-core/.agents/skills/agent-page/SKILL.md +1 -0
- package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +9 -35
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -5
- package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +21 -29
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -17
- package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +3 -3
- package/dist/templates/workspace-core/AGENTS.md +7 -16
- package/docs/content/messaging.mdx +6 -7
- package/docs/content/template-chat.mdx +1 -1
- package/package.json +2 -2
- package/src/templates/chat/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/chat/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
- package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/chat/AGENTS.md +32 -80
- package/src/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/src/templates/default/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/default/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/default/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/default/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/default/.agents/skills/create-skill/SKILL.md +9 -35
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +4 -5
- package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/headless/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/headless/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/headless/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/headless/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/workspace-core/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/workspace-core/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/workspace-core/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +1 -0
- package/src/templates/workspace-core/.agents/skills/agent-page/SKILL.md +1 -0
- package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +9 -35
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -5
- package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +21 -29
- package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -17
- package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +3 -3
- package/src/templates/workspace-core/AGENTS.md +7 -16
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
|
|
3
|
+
export type EditorCommandGroup =
|
|
4
|
+
| "media"
|
|
5
|
+
| "slideTools"
|
|
6
|
+
| "comments"
|
|
7
|
+
| "deck"
|
|
8
|
+
| "other";
|
|
9
|
+
|
|
10
|
+
export interface EditorCommand {
|
|
11
|
+
id: string;
|
|
12
|
+
group: EditorCommandGroup;
|
|
13
|
+
label: string;
|
|
14
|
+
keywords?: string[];
|
|
15
|
+
icon?: ComponentType<{ className?: string; size?: number }>;
|
|
16
|
+
active?: boolean;
|
|
17
|
+
run: () => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const EMPTY_COMMANDS: readonly EditorCommand[] = [];
|
|
21
|
+
type EditorCommandSource = () => readonly EditorCommand[];
|
|
22
|
+
|
|
23
|
+
let activeCommandSource: EditorCommandSource | null = null;
|
|
24
|
+
|
|
25
|
+
export function registerEditorCommands(source: EditorCommandSource) {
|
|
26
|
+
activeCommandSource = source;
|
|
27
|
+
|
|
28
|
+
return () => {
|
|
29
|
+
if (activeCommandSource === source) activeCommandSource = null;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getEditorCommands(): readonly EditorCommand[] {
|
|
34
|
+
return activeCommandSource?.() ?? EMPTY_COMMANDS;
|
|
35
|
+
}
|
|
@@ -87,7 +87,7 @@ export function AgentWorkIndicator() {
|
|
|
87
87
|
|
|
88
88
|
return (
|
|
89
89
|
<div className="pointer-events-none fixed bottom-4 left-1/2 z-50 w-[calc(100vw-2rem)] max-w-sm -translate-x-1/2 md:bottom-5">
|
|
90
|
-
<div className="pointer-events-auto flex items-center justify-between gap-3 rounded-lg border border-border bg-popover/95 px-3 py-2 text-popover-foreground shadow-xl shadow-black/20
|
|
90
|
+
<div className="pointer-events-auto flex items-center justify-between gap-3 rounded-lg border border-border bg-popover/95 px-3 py-2 text-popover-foreground shadow-xl shadow-black/20">
|
|
91
91
|
<div className="flex min-w-0 items-center gap-2">
|
|
92
92
|
<IconLoader2 className="h-4 w-4 shrink-0 animate-spin text-[#609FF8]" />
|
|
93
93
|
<span className="truncate text-sm font-medium">
|
|
@@ -12,13 +12,12 @@ import { useSidebarCollapsed } from "@/hooks/use-sidebar-collapsed";
|
|
|
12
12
|
import { TAB_ID } from "@/lib/tab-id";
|
|
13
13
|
import { cn } from "@/lib/utils";
|
|
14
14
|
|
|
15
|
-
import { GoogleDriveConnectionCta } from "../editor/GoogleDriveConnectionCta";
|
|
16
15
|
import { AgentWorkIndicator } from "./AgentWorkIndicator";
|
|
17
16
|
import { Header } from "./Header";
|
|
18
17
|
import {
|
|
19
|
-
getDeckChatScopeLabel,
|
|
20
18
|
getEffectiveSlidesSidebarCollapsed,
|
|
21
19
|
isSlidesEditorRoute,
|
|
20
|
+
shouldShowSlidesAppSidebar,
|
|
22
21
|
} from "./layout-route-policy";
|
|
23
22
|
import { Sidebar } from "./Sidebar";
|
|
24
23
|
|
|
@@ -50,26 +49,24 @@ export function Layout({ children }: LayoutProps) {
|
|
|
50
49
|
useState<EditorSidebarOverride | null>(null);
|
|
51
50
|
const { collapsed: sidebarCollapsed, setCollapsed: setSidebarCollapsed } =
|
|
52
51
|
useSidebarCollapsed();
|
|
53
|
-
const { decks,
|
|
52
|
+
const { decks, loading: decksLoading } = useDecks();
|
|
54
53
|
const isEmptyDecksState =
|
|
55
54
|
location.pathname === "/" && !decksLoading && decks.length === 0;
|
|
56
55
|
|
|
57
56
|
// Scope new chats to the deck the user is currently editing. The route
|
|
58
57
|
// is `/deck/:id`; everywhere else (list, presentation) leaves
|
|
59
|
-
// scope null so chats stay in the general pool.
|
|
60
|
-
//
|
|
61
|
-
// streamed in — once the title arrives the badge updates in place.
|
|
58
|
+
// scope null so chats stay in the general pool. Keep the visible label
|
|
59
|
+
// semantic so an imported deck id never leaks into the composer chip.
|
|
62
60
|
const deckScope = useMemo(() => {
|
|
63
61
|
const match = location.pathname.match(/^\/deck\/([^/]+)/);
|
|
64
62
|
const deckId = match?.[1];
|
|
65
63
|
if (!deckId) return null;
|
|
66
|
-
const deck = getDeck(deckId);
|
|
67
64
|
return {
|
|
68
65
|
type: "deck" as const,
|
|
69
66
|
id: deckId,
|
|
70
|
-
label:
|
|
67
|
+
label: t("agent.thisDeck"),
|
|
71
68
|
};
|
|
72
|
-
}, [location.pathname,
|
|
69
|
+
}, [location.pathname, t]);
|
|
73
70
|
|
|
74
71
|
useEffect(() => {
|
|
75
72
|
setSidebarOpen(false);
|
|
@@ -84,6 +81,7 @@ export function Layout({ children }: LayoutProps) {
|
|
|
84
81
|
}, []);
|
|
85
82
|
|
|
86
83
|
const ownToolbar = pageHasOwnToolbar(location.pathname);
|
|
84
|
+
const showAppSidebar = shouldShowSlidesAppSidebar(location.pathname);
|
|
87
85
|
const editorSidebarOverrideForLocation =
|
|
88
86
|
editorSidebarOverride?.locationKey === location.key
|
|
89
87
|
? editorSidebarOverride.collapsed
|
|
@@ -120,35 +118,36 @@ export function Layout({ children }: LayoutProps) {
|
|
|
120
118
|
agentPageHref="/settings/agent"
|
|
121
119
|
suppressFirstRunOnboarding={isSlidesEditorRoute(location.pathname)}
|
|
122
120
|
composerSlot={<CreativeContextComposerChip />}
|
|
123
|
-
threadFooterSlot={<GoogleDriveConnectionCta />}
|
|
124
121
|
>
|
|
125
122
|
<div className="agent-layout-shell flex h-screen w-full overflow-hidden bg-background text-foreground">
|
|
126
|
-
{
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
<div
|
|
134
|
-
className={cn(
|
|
135
|
-
"agent-layout-left-drawer fixed inset-y-0 start-0 z-50 transition-transform duration-200 ease-out md:static md:z-auto md:transition-none",
|
|
136
|
-
sidebarOpen
|
|
137
|
-
? "translate-x-0"
|
|
138
|
-
: "-translate-x-full rtl:translate-x-full md:translate-x-0 md:rtl:translate-x-0",
|
|
123
|
+
{!isEmptyDecksState && showAppSidebar && (
|
|
124
|
+
<>
|
|
125
|
+
{sidebarOpen && (
|
|
126
|
+
<div
|
|
127
|
+
className="fixed inset-0 z-40 bg-foreground/50 md:hidden"
|
|
128
|
+
onClick={() => setSidebarOpen(false)}
|
|
129
|
+
/>
|
|
139
130
|
)}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
131
|
+
<div
|
|
132
|
+
className={cn(
|
|
133
|
+
"agent-layout-left-drawer fixed inset-y-0 start-0 z-50 transition-transform duration-200 ease-out md:static md:z-auto md:transition-none",
|
|
134
|
+
sidebarOpen
|
|
135
|
+
? "translate-x-0"
|
|
136
|
+
: "-translate-x-full rtl:translate-x-full md:translate-x-0 md:rtl:translate-x-0",
|
|
137
|
+
)}
|
|
138
|
+
>
|
|
139
|
+
<Sidebar
|
|
140
|
+
collapsed={effectiveSidebarCollapsed && !sidebarOpen}
|
|
141
|
+
// In the mobile drawer the sidebar is forced expanded, so the
|
|
142
|
+
// desktop collapse toggle would be a silent no-op (worse: it'd
|
|
143
|
+
// mutate the desktop preference). Hide it while the drawer is
|
|
144
|
+
// open.
|
|
145
|
+
onToggleCollapsed={
|
|
146
|
+
sidebarOpen ? undefined : toggleSidebarCollapsed
|
|
147
|
+
}
|
|
148
|
+
/>
|
|
149
|
+
</div>
|
|
150
|
+
</>
|
|
152
151
|
)}
|
|
153
152
|
<div className="agent-layout-main-surface flex h-full min-w-0 flex-1 flex-col overflow-hidden">
|
|
154
153
|
{/* Mobile-only nav strip with hamburger — only when there's no page toolbar */}
|
|
@@ -6,8 +6,8 @@ import { OrgSwitcher } from "@agent-native/core/client/org";
|
|
|
6
6
|
import { FeedbackButton } from "@agent-native/core/client/ui";
|
|
7
7
|
import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
|
|
8
8
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
IconLayoutGrid,
|
|
10
|
+
IconComponents,
|
|
11
11
|
IconSettings,
|
|
12
12
|
IconLayoutSidebarLeftCollapse,
|
|
13
13
|
IconLayoutSidebarLeftExpand,
|
|
@@ -23,9 +23,9 @@ import {
|
|
|
23
23
|
import { cn } from "@/lib/utils";
|
|
24
24
|
|
|
25
25
|
const navItems = [
|
|
26
|
-
{ icon:
|
|
26
|
+
{ icon: IconLayoutGrid, labelKey: "navigation.decks", href: "/" },
|
|
27
27
|
{
|
|
28
|
-
icon:
|
|
28
|
+
icon: IconComponents,
|
|
29
29
|
labelKey: "navigation.designSystems",
|
|
30
30
|
href: "/design-systems",
|
|
31
31
|
},
|
|
@@ -161,8 +161,8 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
|
|
|
161
161
|
|
|
162
162
|
if (collapsed) {
|
|
163
163
|
return (
|
|
164
|
-
<aside className="flex h-full w-12 shrink-0 flex-col items-center overflow-hidden
|
|
165
|
-
<div className="flex h-12 w-full shrink-0 items-center justify-center
|
|
164
|
+
<aside className="flex h-full w-12 shrink-0 flex-col items-center overflow-hidden bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
|
|
165
|
+
<div className="flex h-12 w-full shrink-0 items-center justify-center">
|
|
166
166
|
{brandControl}
|
|
167
167
|
</div>
|
|
168
168
|
<nav className="flex min-h-0 flex-1 flex-col items-center gap-1 overflow-y-auto pt-1">
|
|
@@ -224,10 +224,8 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
|
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
return (
|
|
227
|
-
<aside className="flex h-full w-56 min-w-0 shrink-0 flex-col overflow-hidden
|
|
228
|
-
<div className="flex h-12 shrink-0 items-center
|
|
229
|
-
{brandControl}
|
|
230
|
-
</div>
|
|
227
|
+
<aside className="flex h-full w-56 min-w-0 shrink-0 flex-col overflow-hidden bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
|
|
228
|
+
<div className="flex h-12 shrink-0 items-center px-4">{brandControl}</div>
|
|
231
229
|
|
|
232
230
|
<div className="flex min-h-0 flex-1 flex-col overflow-y-auto">
|
|
233
231
|
<nav className="space-y-1 px-2 py-2">
|
|
@@ -2,11 +2,8 @@ export function isSlidesEditorRoute(pathname: string): boolean {
|
|
|
2
2
|
return /^\/deck\/[^/]+\/?$/.test(pathname);
|
|
3
3
|
}
|
|
4
4
|
|
|
5
|
-
export function
|
|
6
|
-
|
|
7
|
-
untitledDeckLabel: string,
|
|
8
|
-
): string {
|
|
9
|
-
return deckTitle === "Untitled Deck" ? untitledDeckLabel : deckTitle || "";
|
|
5
|
+
export function shouldShowSlidesAppSidebar(pathname: string): boolean {
|
|
6
|
+
return !isSlidesEditorRoute(pathname);
|
|
10
7
|
}
|
|
11
8
|
|
|
12
9
|
export function getEffectiveSlidesSidebarCollapsed({
|
|
@@ -26,6 +26,7 @@ import { useDesignSystems } from "@/hooks/use-design-systems";
|
|
|
26
26
|
import { useWorkspaceDefaults } from "@/hooks/use-workspace-defaults";
|
|
27
27
|
import { startDeckGeneration } from "@/lib/create-deck-generation";
|
|
28
28
|
import {
|
|
29
|
+
forgetRecentReference,
|
|
29
30
|
readRecentReferences,
|
|
30
31
|
rememberRecentReference,
|
|
31
32
|
type RecentReference,
|
|
@@ -45,11 +46,8 @@ export function FirstDeckOnboardingFlow({
|
|
|
45
46
|
const { session } = useSession();
|
|
46
47
|
const { decks, createDeck, ensureDeckPersisted, deleteDeck, reloadDecks } =
|
|
47
48
|
useDecks();
|
|
48
|
-
const { designSystems
|
|
49
|
-
const {
|
|
50
|
-
referenceDeck: workspaceReferenceDeck,
|
|
51
|
-
designSystem: workspaceDesignSystem,
|
|
52
|
-
} = useWorkspaceDefaults();
|
|
49
|
+
const { designSystems } = useDesignSystems();
|
|
50
|
+
const { designSystem: workspaceDesignSystem } = useWorkspaceDefaults();
|
|
53
51
|
const { submit: agentSubmit } = useAgentGenerating();
|
|
54
52
|
const [step, setStep] = useState<FirstDeckStep>("prompt");
|
|
55
53
|
const [prompt, setPrompt] = useState("");
|
|
@@ -63,19 +61,25 @@ export function FirstDeckOnboardingFlow({
|
|
|
63
61
|
);
|
|
64
62
|
|
|
65
63
|
const initialPrompt = searchParams.get("initialPrompt")?.trim() ?? "";
|
|
66
|
-
const workspaceReferenceDeckId =
|
|
67
|
-
workspaceReferenceDeck && !workspaceReferenceDeck.unavailable
|
|
68
|
-
? workspaceReferenceDeck.id
|
|
69
|
-
: null;
|
|
70
64
|
const workspaceDesignSystemId =
|
|
71
65
|
workspaceDesignSystem && !workspaceDesignSystem.unavailable
|
|
72
66
|
? workspaceDesignSystem.id
|
|
73
67
|
: null;
|
|
68
|
+
const lastUsedDesignSystemId =
|
|
69
|
+
recentReferences.find(
|
|
70
|
+
(reference) =>
|
|
71
|
+
reference.kind === "design-system" &&
|
|
72
|
+
designSystems.some((designSystem) => designSystem.id === reference.id),
|
|
73
|
+
)?.id ?? null;
|
|
74
|
+
const lastUsedReferenceDeckId =
|
|
75
|
+
recentReferences.find(
|
|
76
|
+
(reference) =>
|
|
77
|
+
reference.kind === "deck" &&
|
|
78
|
+
decks.some((deck) => deck.id === reference.id),
|
|
79
|
+
)?.id ?? null;
|
|
74
80
|
const initialDesignSystemId =
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
defaultSystem?.id ??
|
|
78
|
-
null;
|
|
81
|
+
lastUsedDesignSystemId ?? workspaceDesignSystemId;
|
|
82
|
+
const initialReferenceDeckId = lastUsedReferenceDeckId;
|
|
79
83
|
|
|
80
84
|
useEffect(() => {
|
|
81
85
|
const result = readRecentReferences();
|
|
@@ -103,6 +107,10 @@ export function FirstDeckOnboardingFlow({
|
|
|
103
107
|
},
|
|
104
108
|
[],
|
|
105
109
|
);
|
|
110
|
+
const forgetReference = useCallback((kind: RecentReference["kind"]) => {
|
|
111
|
+
const result = forgetRecentReference(kind);
|
|
112
|
+
if (result.readable) setRecentReferences(result.items);
|
|
113
|
+
}, []);
|
|
106
114
|
|
|
107
115
|
const handlePromptSubmit = useCallback(
|
|
108
116
|
async (text: string, files: File[]) => {
|
|
@@ -137,7 +145,7 @@ export function FirstDeckOnboardingFlow({
|
|
|
137
145
|
files,
|
|
138
146
|
referenceSelection: selection,
|
|
139
147
|
selectedDesignSystemId: initialDesignSystemId,
|
|
140
|
-
selectedReferenceDeckId:
|
|
148
|
+
selectedReferenceDeckId: initialReferenceDeckId,
|
|
141
149
|
designSystems,
|
|
142
150
|
createDeck,
|
|
143
151
|
ensureDeckPersisted,
|
|
@@ -185,24 +193,32 @@ export function FirstDeckOnboardingFlow({
|
|
|
185
193
|
prompt,
|
|
186
194
|
session,
|
|
187
195
|
t,
|
|
188
|
-
|
|
196
|
+
initialReferenceDeckId,
|
|
189
197
|
],
|
|
190
198
|
);
|
|
191
199
|
|
|
192
200
|
const handleReferenceSelect = useCallback(
|
|
193
201
|
async (selection: NewDeckReferenceSelection) => {
|
|
194
|
-
if (selection.designSystemId) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
202
|
+
if (selection.designSystemId !== undefined) {
|
|
203
|
+
if (selection.designSystemId) {
|
|
204
|
+
rememberReference({
|
|
205
|
+
id: selection.designSystemId,
|
|
206
|
+
kind: "design-system",
|
|
207
|
+
});
|
|
208
|
+
} else {
|
|
209
|
+
forgetReference("design-system");
|
|
210
|
+
}
|
|
199
211
|
}
|
|
200
|
-
if (selection.referenceDeckId) {
|
|
201
|
-
|
|
212
|
+
if (selection.referenceDeckId !== undefined) {
|
|
213
|
+
if (selection.referenceDeckId) {
|
|
214
|
+
rememberReference({ id: selection.referenceDeckId, kind: "deck" });
|
|
215
|
+
} else {
|
|
216
|
+
forgetReference("deck");
|
|
217
|
+
}
|
|
202
218
|
}
|
|
203
219
|
await startGeneration(promptFiles, selection);
|
|
204
220
|
},
|
|
205
|
-
[promptFiles, rememberReference, startGeneration],
|
|
221
|
+
[forgetReference, promptFiles, rememberReference, startGeneration],
|
|
206
222
|
);
|
|
207
223
|
|
|
208
224
|
const handleReferenceImport = useCallback(
|
|
@@ -296,7 +312,6 @@ export function FirstDeckOnboardingFlow({
|
|
|
296
312
|
setPromptFiles((current) => [...current, ...generationFiles]);
|
|
297
313
|
if (importedReference) {
|
|
298
314
|
await reloadDecks();
|
|
299
|
-
rememberReference({ id: importedReference.id, kind: "deck" });
|
|
300
315
|
}
|
|
301
316
|
return importedReference;
|
|
302
317
|
} catch (error) {
|
|
@@ -311,15 +326,7 @@ export function FirstDeckOnboardingFlow({
|
|
|
311
326
|
setReferenceImporting(false);
|
|
312
327
|
}
|
|
313
328
|
},
|
|
314
|
-
[
|
|
315
|
-
callAction,
|
|
316
|
-
createDeck,
|
|
317
|
-
deleteDeck,
|
|
318
|
-
ensureDeckPersisted,
|
|
319
|
-
reloadDecks,
|
|
320
|
-
rememberReference,
|
|
321
|
-
t,
|
|
322
|
-
],
|
|
329
|
+
[callAction, createDeck, deleteDeck, ensureDeckPersisted, reloadDecks, t],
|
|
323
330
|
);
|
|
324
331
|
|
|
325
332
|
const handleReferenceSourceImport = useCallback(
|
|
@@ -357,7 +364,6 @@ export function FirstDeckOnboardingFlow({
|
|
|
357
364
|
source: "google-slides",
|
|
358
365
|
};
|
|
359
366
|
await reloadDecks();
|
|
360
|
-
rememberReference({ id: importedReference.id, kind: "deck" });
|
|
361
367
|
return importedReference;
|
|
362
368
|
} catch (error) {
|
|
363
369
|
toast.error(t("editorToolbar.uploadFailed"), {
|
|
@@ -371,15 +377,17 @@ export function FirstDeckOnboardingFlow({
|
|
|
371
377
|
setReferenceImporting(false);
|
|
372
378
|
}
|
|
373
379
|
},
|
|
374
|
-
[callAction, reloadDecks,
|
|
380
|
+
[callAction, reloadDecks, t],
|
|
375
381
|
);
|
|
376
382
|
|
|
377
383
|
const handleReferenceSkip = useCallback(() => {
|
|
384
|
+
forgetReference("design-system");
|
|
385
|
+
forgetReference("deck");
|
|
378
386
|
void startGeneration(promptFiles, {
|
|
379
387
|
designSystemId: null,
|
|
380
388
|
referenceDeckId: null,
|
|
381
389
|
});
|
|
382
|
-
}, [promptFiles, startGeneration]);
|
|
390
|
+
}, [forgetReference, promptFiles, startGeneration]);
|
|
383
391
|
|
|
384
392
|
if (step === "references") {
|
|
385
393
|
return (
|
|
@@ -388,8 +396,7 @@ export function FirstDeckOnboardingFlow({
|
|
|
388
396
|
decks={decks}
|
|
389
397
|
designSystems={designSystems}
|
|
390
398
|
defaultDesignSystemId={initialDesignSystemId}
|
|
391
|
-
defaultReferenceDeckId={
|
|
392
|
-
recentReferences={recentReferences}
|
|
399
|
+
defaultReferenceDeckId={initialReferenceDeckId}
|
|
393
400
|
onSelect={handleReferenceSelect}
|
|
394
401
|
onImport={handleReferenceImport}
|
|
395
402
|
onImportSource={handleReferenceSourceImport}
|
|
@@ -404,8 +411,6 @@ export function FirstDeckOnboardingFlow({
|
|
|
404
411
|
chooseDeckLabel={t("home.referenceDeckPlaceholder")}
|
|
405
412
|
importingLabel={t("raw.uploading")}
|
|
406
413
|
skipLabel={t("home.referenceDeckNone")}
|
|
407
|
-
starredLabel={t("home.referenceDeckStarredGroup")}
|
|
408
|
-
otherDecksLabel={t("home.referenceDeckOtherGroup")}
|
|
409
414
|
searchDecksLabel={t("root.searchDecks")}
|
|
410
415
|
promptSummary={prompt}
|
|
411
416
|
/>
|
|
@@ -19,7 +19,7 @@ import type { AspectRatio } from "@/lib/aspect-ratios";
|
|
|
19
19
|
import {
|
|
20
20
|
findLegacyAnimationContainer,
|
|
21
21
|
getElementPath,
|
|
22
|
-
|
|
22
|
+
resolveSlideAnimationTargets,
|
|
23
23
|
} from "@/lib/slide-animation-elements";
|
|
24
24
|
|
|
25
25
|
import type { DesignSystemData } from "../../../shared/api";
|
|
@@ -40,7 +40,17 @@ interface PresentationViewProps {
|
|
|
40
40
|
* Uses slide.animations if defined, falls back to splitByParagraph auto-detection.
|
|
41
41
|
*/
|
|
42
42
|
function getAnimationSteps(slide: Slide): SlideAnimation[] | null {
|
|
43
|
-
if (slide.animations && slide.animations.length > 0)
|
|
43
|
+
if (slide.animations && slide.animations.length > 0) {
|
|
44
|
+
const doc = new DOMParser().parseFromString(slide.content, "text/html");
|
|
45
|
+
const root = doc.querySelector(".fmd-slide");
|
|
46
|
+
// Explicit metadata is authoritative only when every target still points
|
|
47
|
+
// at a unique element in the final HTML. Otherwise disable the reveal
|
|
48
|
+
// layer for this slide instead of counting invisible phantom steps while
|
|
49
|
+
// leaving the rest of the content visible.
|
|
50
|
+
return root && resolveSlideAnimationTargets(root, slide.animations)
|
|
51
|
+
? slide.animations
|
|
52
|
+
: null;
|
|
53
|
+
}
|
|
44
54
|
// Legacy splitByParagraph: auto-detect and create steps
|
|
45
55
|
if (slide.splitByParagraph) {
|
|
46
56
|
const doc = new DOMParser().parseFromString(slide.content, "text/html");
|
|
@@ -111,14 +121,16 @@ function annotateStepsForPresentation(
|
|
|
111
121
|
const root = doc.querySelector(".fmd-slide");
|
|
112
122
|
if (!root) return html;
|
|
113
123
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
124
|
+
const resolvedSteps = resolveSlideAnimationTargets(root, steps);
|
|
125
|
+
if (!resolvedSteps) return html;
|
|
126
|
+
|
|
127
|
+
// Annotate each resolved step element with data-pstep.
|
|
128
|
+
resolvedSteps.forEach(({ element }, stepIdx) => {
|
|
129
|
+
element.setAttribute("data-pstep", String(stepIdx));
|
|
118
130
|
});
|
|
119
131
|
|
|
120
|
-
const styleLines =
|
|
121
|
-
.map((
|
|
132
|
+
const styleLines = resolvedSteps
|
|
133
|
+
.map(({ target }, stepIdx) => {
|
|
122
134
|
if (stepIdx >= currentStep) {
|
|
123
135
|
return `[data-pstep="${stepIdx}"] { opacity: 0; pointer-events: none; }`;
|
|
124
136
|
} else if (stepIdx < currentStep - 1) {
|
|
@@ -126,7 +138,7 @@ function annotateStepsForPresentation(
|
|
|
126
138
|
return `[data-pstep="${stepIdx}"] { opacity: 1; pointer-events: auto; animation: elem-appear 1ms both; }`;
|
|
127
139
|
} else {
|
|
128
140
|
// Newly revealed — animate with its type
|
|
129
|
-
return `[data-pstep="${stepIdx}"] { opacity: 1; pointer-events: auto; ${getElemAnimCss(
|
|
141
|
+
return `[data-pstep="${stepIdx}"] { opacity: 1; pointer-events: auto; ${getElemAnimCss(target.type)} }`;
|
|
130
142
|
}
|
|
131
143
|
})
|
|
132
144
|
.join("\n");
|
|
@@ -219,6 +231,10 @@ export default function PresentationView({
|
|
|
219
231
|
const [cursorVisible, setCursorVisible] = useState(true);
|
|
220
232
|
const [needsFullscreenGesture, setNeedsFullscreenGesture] = useState(false);
|
|
221
233
|
const enteredFullscreenRef = useRef(false);
|
|
234
|
+
const transitionTimerRef = useRef<number | null>(null);
|
|
235
|
+
const queuedNavigationRef = useRef<"next" | "prev" | null>(null);
|
|
236
|
+
const goNextRef = useRef<() => void>(() => {});
|
|
237
|
+
const goPrevRef = useRef<() => void>(() => {});
|
|
222
238
|
const navigate = useNavigate();
|
|
223
239
|
|
|
224
240
|
const isShared = deckId.startsWith("__shared__/");
|
|
@@ -230,9 +246,23 @@ export default function PresentationView({
|
|
|
230
246
|
);
|
|
231
247
|
}, [clampIndex, safeSlides.length]);
|
|
232
248
|
|
|
249
|
+
const clearTransitionTimer = useCallback(() => {
|
|
250
|
+
if (transitionTimerRef.current !== null) {
|
|
251
|
+
window.clearTimeout(transitionTimerRef.current);
|
|
252
|
+
transitionTimerRef.current = null;
|
|
253
|
+
}
|
|
254
|
+
}, []);
|
|
255
|
+
|
|
256
|
+
useEffect(() => clearTransitionTimer, [clearTransitionTimer]);
|
|
257
|
+
|
|
233
258
|
useEffect(() => {
|
|
259
|
+
clearTransitionTimer();
|
|
260
|
+
queuedNavigationRef.current = null;
|
|
234
261
|
setCurrentIndex(clampIndex(startIndex));
|
|
235
|
-
|
|
262
|
+
setCurrentStep(0);
|
|
263
|
+
setPrevIndex(null);
|
|
264
|
+
setAnimating(false);
|
|
265
|
+
}, [clearTransitionTimer, clampIndex, startIndex]);
|
|
236
266
|
|
|
237
267
|
const currentSlide = safeSlides[currentIndex];
|
|
238
268
|
const animSteps = currentSlide ? getAnimationSteps(currentSlide) : null;
|
|
@@ -247,7 +277,11 @@ export default function PresentationView({
|
|
|
247
277
|
const initialStep =
|
|
248
278
|
dir === "prev" ? (incomingSteps ? incomingSteps.length : 0) : 0;
|
|
249
279
|
|
|
280
|
+
clearTransitionTimer();
|
|
281
|
+
queuedNavigationRef.current = null;
|
|
250
282
|
if (isInstant(t)) {
|
|
283
|
+
setPrevIndex(null);
|
|
284
|
+
setAnimating(false);
|
|
251
285
|
setCurrentIndex(newIndex);
|
|
252
286
|
setCurrentStep(initialStep);
|
|
253
287
|
return;
|
|
@@ -259,16 +293,28 @@ export default function PresentationView({
|
|
|
259
293
|
setCurrentIndex(newIndex);
|
|
260
294
|
setCurrentStep(initialStep);
|
|
261
295
|
|
|
262
|
-
setTimeout(() => {
|
|
296
|
+
transitionTimerRef.current = window.setTimeout(() => {
|
|
297
|
+
transitionTimerRef.current = null;
|
|
263
298
|
setPrevIndex(null);
|
|
264
299
|
setAnimating(false);
|
|
300
|
+
const queued = queuedNavigationRef.current;
|
|
301
|
+
queuedNavigationRef.current = null;
|
|
302
|
+
if (queued) {
|
|
303
|
+
window.setTimeout(() => {
|
|
304
|
+
if (queued === "next") goNextRef.current();
|
|
305
|
+
else goPrevRef.current();
|
|
306
|
+
}, 0);
|
|
307
|
+
}
|
|
265
308
|
}, 400);
|
|
266
309
|
},
|
|
267
|
-
[currentIndex, safeSlides],
|
|
310
|
+
[clearTransitionTimer, currentIndex, safeSlides],
|
|
268
311
|
);
|
|
269
312
|
|
|
270
313
|
const goNext = useCallback(() => {
|
|
271
|
-
if (animating)
|
|
314
|
+
if (animating) {
|
|
315
|
+
queuedNavigationRef.current = "next";
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
272
318
|
// Reveal next paragraph step if enabled
|
|
273
319
|
if (maxSteps > 0 && currentStep < maxSteps /* i18n-ignore */) {
|
|
274
320
|
setCurrentStep((prev) => prev + 1);
|
|
@@ -286,7 +332,10 @@ export default function PresentationView({
|
|
|
286
332
|
]);
|
|
287
333
|
|
|
288
334
|
const goPrev = useCallback(() => {
|
|
289
|
-
if (animating)
|
|
335
|
+
if (animating) {
|
|
336
|
+
queuedNavigationRef.current = "prev";
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
290
339
|
if (currentIndex <= 0) return;
|
|
291
340
|
startTransition(currentIndex - 1, "prev");
|
|
292
341
|
}, [animating, currentIndex, startTransition]);
|
|
@@ -307,8 +356,6 @@ export default function PresentationView({
|
|
|
307
356
|
// commands and mirrors whatever we echo back — so build steps stay
|
|
308
357
|
// authoritative here.
|
|
309
358
|
const channelRef = useRef<BroadcastChannel | null>(null);
|
|
310
|
-
const goNextRef = useRef(goNext);
|
|
311
|
-
const goPrevRef = useRef(goPrev);
|
|
312
359
|
goNextRef.current = goNext;
|
|
313
360
|
goPrevRef.current = goPrev;
|
|
314
361
|
|
|
@@ -8,6 +8,7 @@ import { callAction } from "@agent-native/core/client/hooks";
|
|
|
8
8
|
import { isEmbedAuthActive } from "@agent-native/core/client/host";
|
|
9
9
|
import { useOrg } from "@agent-native/core/client/org";
|
|
10
10
|
import { subscribeSyncEvents } from "@agent-native/core/client/use-db-sync";
|
|
11
|
+
import { DEFAULT_DECK_TITLE } from "@shared/deck-title";
|
|
11
12
|
import { nanoid } from "nanoid";
|
|
12
13
|
import {
|
|
13
14
|
createContext,
|
|
@@ -1760,7 +1761,7 @@ export function DeckProvider({ children }: { children: ReactNode }) {
|
|
|
1760
1761
|
const insertIndex = decksRef.current.length;
|
|
1761
1762
|
const newDeck: Deck = {
|
|
1762
1763
|
id: nanoid(10),
|
|
1763
|
-
title: title ||
|
|
1764
|
+
title: title?.trim() || DEFAULT_DECK_TITLE,
|
|
1764
1765
|
createdAt: new Date().toISOString(),
|
|
1765
1766
|
updatedAt: new Date().toISOString(),
|
|
1766
1767
|
createdByMe: true,
|
|
@@ -143,7 +143,7 @@ button[title="Open agent sidebar"] {
|
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
.slide-style-inspector .slides-inspector-section {
|
|
146
|
-
border-bottom:
|
|
146
|
+
border-bottom: 0;
|
|
147
147
|
border-radius: 0;
|
|
148
148
|
padding: 0.625rem 0.75rem;
|
|
149
149
|
}
|
|
@@ -239,6 +239,81 @@ button[title="Open agent sidebar"] {
|
|
|
239
239
|
container-type: inline-size;
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
+
.deck-editor-shell {
|
|
243
|
+
--slides-editor-surface: hsl(var(--background));
|
|
244
|
+
container-type: inline-size;
|
|
245
|
+
container-name: deck-editor;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
@supports (background: color-mix(in srgb, white, black)) {
|
|
249
|
+
.deck-editor-shell {
|
|
250
|
+
--slides-editor-surface: color-mix(
|
|
251
|
+
in srgb,
|
|
252
|
+
hsl(var(--background)) 35%,
|
|
253
|
+
var(--agent-native-lower-surface, hsl(var(--background))) 65%
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.deck-editor-context-toolbar-host {
|
|
259
|
+
min-width: 0;
|
|
260
|
+
overflow: hidden;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.deck-editor-context-toolbar-host--wide {
|
|
264
|
+
display: none;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.deck-editor-context-toolbar-host--narrow {
|
|
268
|
+
display: flex;
|
|
269
|
+
justify-content: flex-end;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.deck-editor-context-toolbar-host--narrow
|
|
273
|
+
> [data-slide-inline-edit-surface="true"] {
|
|
274
|
+
min-width: 0;
|
|
275
|
+
width: fit-content;
|
|
276
|
+
max-width: 100%;
|
|
277
|
+
flex: 0 1 auto;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
@container deck-editor (max-width: 1149px) {
|
|
281
|
+
.deck-editor-context-toolbar-host--wide {
|
|
282
|
+
display: none;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.deck-editor-context-toolbar-host--narrow {
|
|
286
|
+
display: flex;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
@container deck-editor (min-width: 1150px) {
|
|
291
|
+
.deck-editor-context-toolbar-host--narrow {
|
|
292
|
+
display: none;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.deck-editor-context-toolbar-host--wide[data-context-toolbar-visible="true"] {
|
|
296
|
+
display: flex;
|
|
297
|
+
flex: 1 1 0%;
|
|
298
|
+
align-items: center;
|
|
299
|
+
justify-content: flex-end;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.deck-editor-context-toolbar-host--wide
|
|
303
|
+
> [data-slide-inline-edit-surface="true"] {
|
|
304
|
+
min-width: 0;
|
|
305
|
+
max-width: 100%;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.deck-editor-context-toolbar-host--wide .slide-context-toolbar--top-row {
|
|
309
|
+
height: 2.75rem;
|
|
310
|
+
justify-content: flex-end;
|
|
311
|
+
border: 0;
|
|
312
|
+
background: transparent;
|
|
313
|
+
padding-inline: 0;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
242
317
|
@container (max-width: 36rem) {
|
|
243
318
|
.deck-grid {
|
|
244
319
|
grid-template-columns: minmax(0, 1fr);
|