@agent-native/core 0.79.27 → 0.80.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +34 -0
- package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +55 -1
- package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +66 -1
- package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +65 -1
- package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +64 -1
- package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +59 -1
- package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +62 -1
- package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +58 -1
- package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +62 -1
- package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +50 -1
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +52 -1
- package/corpus/core/docs/content/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/template-design.mdx +59 -1
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/agent/engine/index.ts +1 -0
- package/corpus/core/src/agent/engine/registry.ts +40 -0
- package/corpus/core/src/agent/production-agent.ts +6 -2
- package/corpus/core/src/application-state/handlers.ts +1 -1
- package/corpus/core/src/brand-kit/index.ts +1 -1
- package/corpus/core/src/cli/design-connect.ts +490 -0
- package/corpus/core/src/cli/index.ts +16 -0
- package/corpus/core/src/cli/skills.ts +144 -3
- package/corpus/core/src/client/AgentPanel.tsx +1 -1
- package/corpus/core/src/client/AssistantChat.tsx +43 -7
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +1 -1
- package/corpus/core/src/client/agent-chat.ts +27 -3
- package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
- package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
- package/corpus/core/src/client/blocks/library/wireframe.tsx +1 -1
- package/corpus/core/src/client/chat/message-components.tsx +1 -1
- package/corpus/core/src/client/chat-model-groups.ts +1 -2
- package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
- package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
- package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
- package/corpus/core/src/client/extensions/portable-extension.ts +1 -1
- package/corpus/core/src/client/frame-protocol.ts +17 -2
- package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
- package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
- package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
- package/corpus/core/src/code-agents/transcript-normalizer.ts +1 -1
- package/corpus/core/src/extensions/path.ts +1 -4
- package/corpus/core/src/integrations/a2a-continuation-processor.ts +1 -1
- package/corpus/core/src/mcp/build-server.ts +1 -1
- package/corpus/core/src/org/handlers.ts +5 -5
- package/corpus/core/src/org/plugin.ts +2 -2
- package/corpus/core/src/scripts/call-agent.ts +1 -1
- package/corpus/core/src/scripts/db/safety.ts +1 -1
- package/corpus/core/src/server/auth.ts +3 -0
- package/corpus/core/src/server/builder-design-systems.ts +308 -0
- package/corpus/core/src/server/core-routes-plugin.ts +29 -3
- package/corpus/core/src/server/index.ts +8 -0
- package/corpus/core/src/server/transcribe-voice.ts +57 -22
- package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
- package/corpus/core/src/styles/agent-native.css +60 -4
- package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- package/corpus/core/src/usage/store.ts +2 -2
- package/corpus/core/src/vite/client.ts +2 -0
- package/corpus/core/src/voice/index.ts +18 -0
- package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
- package/corpus/core/src/voice/voice-context.ts +217 -0
- package/corpus/core/src/voice/voice-replacements.ts +75 -0
- package/corpus/templates/analytics/AGENTS.md +4 -3
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +298 -15
- package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -4
- package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
- package/corpus/templates/analytics/actions/mutate-dashboard.ts +18 -2
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +12 -2
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
- package/corpus/templates/analytics/app/global.css +0 -4
- package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +66 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +39 -0
- package/corpus/templates/analytics/app/i18n-data.ts +424 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +333 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +121 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +82 -34
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +144 -36
- package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-analytics-agents-can-now-place-new-charts-into-requested-das.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-analytics-queries-now-report-failed-source-query-errors-inst.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-charts-can-now-be-dropped-between-full-dashboard-rows-to-cre.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-dashboard-email-reports-include-the-full-dashboard-image-wit.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-main-surface-border-reaches-the-top.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-session-replay-now-records-playable-sessions-in-production-a.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +6 -0
- package/corpus/templates/analytics/scripts/cleanup-empty-session-recordings.ts +102 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +75 -30
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +81 -20
- package/corpus/templates/analytics/server/lib/replay-storage.ts +79 -0
- package/corpus/templates/analytics/server/lib/s3-upload-provider.ts +255 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +53 -12
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -2
- package/corpus/templates/analytics/server/plugins/onboarding.ts +97 -0
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
- package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
- package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/brain/app/i18n-data.ts +20 -0
- package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/calendar/app/i18n-data.ts +20 -0
- package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
- package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/clips/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/cleanup-transcript.ts +39 -9
- package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
- package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
- package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
- package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
- package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
- package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +24 -0
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +105 -5
- package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
- package/corpus/templates/content/actions/set-image-alt-text.ts +1 -1
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
- package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/content/shared/document-export.ts +1 -1
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -18
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +154 -0
- package/corpus/templates/design/AGENTS.md +95 -5
- package/corpus/templates/design/DESIGN.md +82 -0
- package/corpus/templates/design/DEVELOPING.md +43 -0
- package/corpus/templates/design/actions/add-localhost-screens.ts +453 -0
- package/corpus/templates/design/actions/apply-shader.ts +277 -0
- package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
- package/corpus/templates/design/actions/connect-localhost.ts +183 -0
- package/corpus/templates/design/actions/edit-design.ts +195 -42
- package/corpus/templates/design/actions/generate-design.ts +71 -1
- package/corpus/templates/design/actions/generate-screens.ts +193 -0
- package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
- package/corpus/templates/design/actions/get-shader.ts +119 -0
- package/corpus/templates/design/actions/index-design-system-with-builder.ts +259 -0
- package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
- package/corpus/templates/design/actions/navigate.ts +55 -2
- package/corpus/templates/design/actions/update-file.ts +9 -2
- package/corpus/templates/design/actions/view-screen.ts +68 -1
- package/corpus/templates/design/agent-native.app-skill.json +10 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +719 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2120 -103
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +401 -0
- package/corpus/templates/design/app/components/design/EditPanel.tsx +3966 -440
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +1473 -0
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3940 -147
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +105 -63
- package/corpus/templates/design/app/components/design/index.ts +0 -5
- package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +353 -0
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +1589 -0
- package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +511 -0
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +395 -0
- package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +2010 -0
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +601 -0
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +242 -0
- package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +238 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +575 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +423 -0
- package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +741 -0
- package/corpus/templates/design/app/components/design/inspector/index.ts +87 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
- package/corpus/templates/design/app/components/design/types.ts +23 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
- package/corpus/templates/design/app/global.css +149 -5
- package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +277 -0
- package/corpus/templates/design/app/i18n-data.ts +3028 -1
- package/corpus/templates/design/app/pages/DesignEditor.tsx +5831 -904
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +57 -221
- package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-canvas-selection-no-longer-flashes-broken-prototype-html-whe.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-command-menu-selections-are-clearer-in-dark-mode.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-element-selection-now-stays-on-the-intended-layer-after-sele.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-full-view-controls-now-sit-above-frames-inst.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-tools-can-draw-shapes-create-screens-and-kee.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-now-creates-anchor-based-bezier-vectors-with-ha.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
- package/corpus/templates/design/package.json +1 -0
- package/corpus/templates/design/server/db/schema.ts +26 -0
- package/corpus/templates/design/server/handlers/import-figma-system.ts +38 -85
- package/corpus/templates/design/server/lib/design-snapshot.ts +9 -1
- package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
- package/corpus/templates/design/shared/api.ts +27 -0
- package/corpus/templates/design/shared/canvas-frames.ts +103 -0
- package/corpus/templates/design/shared/canvas-math.ts +1058 -0
- package/corpus/templates/design/shared/code-layer.ts +2412 -0
- package/corpus/templates/design/shared/color-utils.ts +180 -0
- package/corpus/templates/design/shared/generation-session.ts +61 -0
- package/corpus/templates/design/shared/html-content.ts +21 -0
- package/corpus/templates/design/shared/pen-path.ts +207 -0
- package/corpus/templates/design/shared/shader-presets.ts +782 -0
- package/corpus/templates/design/shared/shader-safety.ts +137 -0
- package/corpus/templates/design/shared/source-mode.ts +237 -0
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
- package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
- package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
- package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
- package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
- package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
- package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
- package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
- package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
- package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
- package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
- package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
- package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
- package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
- package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
- package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
- package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
- package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
- package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
- package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
- package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
- package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
- package/corpus/templates/mail/app/lib/utils.ts +2 -2
- package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
- package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
- package/corpus/templates/plan/app/global.css +61 -78
- package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
- package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
- package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -10
- package/corpus/templates/slides/AGENTS.md +3 -2
- package/corpus/templates/slides/actions/import-file.ts +26 -17
- package/corpus/templates/slides/actions/index-design-system-with-builder.ts +259 -0
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +35 -167
- package/corpus/templates/slides/app/components/design-system/fig-import-response.ts +9 -13
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
- package/corpus/templates/slides/app/context/DeckContext.tsx +1 -1
- package/corpus/templates/slides/app/i18n/ar-SA.ts +9 -37
- package/corpus/templates/slides/app/i18n/de-DE.ts +10 -25
- package/corpus/templates/slides/app/i18n/en-US.ts +9 -26
- package/corpus/templates/slides/app/i18n/es-ES.ts +10 -28
- package/corpus/templates/slides/app/i18n/fr-FR.ts +10 -28
- package/corpus/templates/slides/app/i18n/hi-IN.ts +9 -26
- package/corpus/templates/slides/app/i18n/ja-JP.ts +10 -22
- package/corpus/templates/slides/app/i18n/ko-KR.ts +9 -23
- package/corpus/templates/slides/app/i18n/pt-BR.ts +10 -28
- package/corpus/templates/slides/app/i18n/zh-CN.ts +9 -22
- package/corpus/templates/slides/app/i18n/zh-TW.ts +9 -22
- package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/slides/server/handlers/import-figma-system.ts +44 -12
- package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
- package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +1 -1
- package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
- package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
- package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
- package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
- package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
- package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
- package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
- package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
- package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
- package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
- package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
- package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
- package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +9 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +37 -0
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +4 -3
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/application-state/handlers.js +1 -1
- package/dist/application-state/handlers.js.map +1 -1
- package/dist/brand-kit/index.d.ts +1 -1
- package/dist/brand-kit/index.js +1 -1
- package/dist/brand-kit/index.js.map +1 -1
- package/dist/cli/design-connect.d.ts +52 -0
- package/dist/cli/design-connect.d.ts.map +1 -0
- package/dist/cli/design-connect.js +409 -0
- package/dist/cli/design-connect.js.map +1 -0
- package/dist/cli/index.js +15 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/skills.d.ts +3 -0
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +139 -3
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +38 -8
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat.d.ts +6 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +17 -3
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/blocks/library/MermaidBlock.js +1 -1
- package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
- package/dist/client/blocks/library/diagram.js +1 -1
- package/dist/client/blocks/library/diagram.js.map +1 -1
- package/dist/client/blocks/library/wireframe.js +1 -1
- package/dist/client/blocks/library/wireframe.js.map +1 -1
- package/dist/client/chat/message-components.js +1 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat-model-groups.d.ts.map +1 -1
- package/dist/client/chat-model-groups.js +1 -2
- package/dist/client/chat-model-groups.js.map +1 -1
- package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
- package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
- package/dist/client/components/LiveCursorOverlay.js +19 -40
- package/dist/client/components/LiveCursorOverlay.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +3 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +86 -24
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts +9 -0
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +154 -32
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts +1 -1
- package/dist/client/extensions/portable-extension.d.ts.map +1 -1
- package/dist/client/extensions/portable-extension.js.map +1 -1
- package/dist/client/frame-protocol.d.ts +17 -2
- package/dist/client/frame-protocol.d.ts.map +1 -1
- package/dist/client/frame-protocol.js.map +1 -1
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +2 -0
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +7 -6
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts +5 -0
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +51 -25
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/code-agents/transcript-normalizer.js +1 -1
- package/dist/code-agents/transcript-normalizer.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/extensions/path.d.ts +1 -1
- package/dist/extensions/path.d.ts.map +1 -1
- package/dist/extensions/path.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/integrations/a2a-continuation-processor.js +1 -1
- package/dist/integrations/a2a-continuation-processor.js.map +1 -1
- package/dist/mcp/build-server.d.ts +1 -1
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/org/handlers.js +5 -5
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/plugin.js +2 -2
- package/dist/org/plugin.js.map +1 -1
- package/dist/scripts/call-agent.js +1 -1
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/db/safety.js +1 -1
- package/dist/scripts/db/safety.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +3 -0
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-design-systems.d.ts +28 -0
- package/dist/server/builder-design-systems.d.ts.map +1 -0
- package/dist/server/builder-design-systems.js +217 -0
- package/dist/server/builder-design-systems.js.map +1 -0
- package/dist/server/core-routes-plugin.d.ts +1 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +20 -3
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +40 -24
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/shared/mcp-embed-headers.d.ts +1 -0
- package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
- package/dist/shared/mcp-embed-headers.js +20 -1
- package/dist/shared/mcp-embed-headers.js.map +1 -1
- package/dist/styles/agent-native.css +60 -4
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- package/dist/usage/store.js +2 -2
- package/dist/usage/store.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +2 -0
- package/dist/vite/client.js.map +1 -1
- package/dist/voice/index.d.ts +5 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +4 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
- package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
- package/dist/voice/voice-cleanup-prompt.js +26 -0
- package/dist/voice/voice-cleanup-prompt.js.map +1 -0
- package/dist/voice/voice-context.d.ts +25 -0
- package/dist/voice/voice-context.d.ts.map +1 -0
- package/dist/voice/voice-context.js +156 -0
- package/dist/voice/voice-context.js.map +1 -0
- package/dist/voice/voice-replacements.d.ts +4 -0
- package/dist/voice/voice-replacements.d.ts.map +1 -0
- package/dist/voice/voice-replacements.js +52 -0
- package/dist/voice/voice-replacements.js.map +1 -0
- package/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
- package/docs/content/locales/ar-SA/template-design.mdx +55 -1
- package/docs/content/locales/de-DE/skills-guide.mdx +5 -0
- package/docs/content/locales/de-DE/template-design.mdx +66 -1
- package/docs/content/locales/es-ES/skills-guide.mdx +5 -0
- package/docs/content/locales/es-ES/template-design.mdx +65 -1
- package/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
- package/docs/content/locales/fr-FR/template-design.mdx +64 -1
- package/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
- package/docs/content/locales/hi-IN/template-design.mdx +59 -1
- package/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
- package/docs/content/locales/ja-JP/template-design.mdx +62 -1
- package/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
- package/docs/content/locales/ko-KR/template-design.mdx +58 -1
- package/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
- package/docs/content/locales/pt-BR/template-design.mdx +62 -1
- package/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
- package/docs/content/locales/zh-CN/template-design.mdx +50 -1
- package/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
- package/docs/content/locales/zh-TW/template-design.mdx +52 -1
- package/docs/content/skills-guide.mdx +5 -0
- package/docs/content/template-design.mdx +59 -1
- package/package.json +2 -1
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- package/corpus/templates/design/actions/import-figma-file.ts +0 -166
- package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
- package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
- package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
- package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
- package/corpus/templates/slides/server/lib/fig-design-system.ts +0 -110
|
@@ -22,6 +22,8 @@ import {
|
|
|
22
22
|
IconCheck,
|
|
23
23
|
IconEye,
|
|
24
24
|
IconEyeOff,
|
|
25
|
+
IconLayoutSidebarLeftCollapse,
|
|
26
|
+
IconLayoutSidebarLeftExpand,
|
|
25
27
|
} from "@tabler/icons-react";
|
|
26
28
|
import {
|
|
27
29
|
startOfMonth,
|
|
@@ -99,6 +101,8 @@ const navItems = [
|
|
|
99
101
|
interface SidebarProps {
|
|
100
102
|
open: boolean;
|
|
101
103
|
onClose: () => void;
|
|
104
|
+
collapsed?: boolean;
|
|
105
|
+
onCollapsedChange?: (collapsed: boolean) => void;
|
|
102
106
|
}
|
|
103
107
|
|
|
104
108
|
const MONTH_LABELS = [
|
|
@@ -597,7 +601,12 @@ function GoogleAccountsSection({
|
|
|
597
601
|
);
|
|
598
602
|
}
|
|
599
603
|
|
|
600
|
-
export function Sidebar({
|
|
604
|
+
export function Sidebar({
|
|
605
|
+
open,
|
|
606
|
+
onClose,
|
|
607
|
+
collapsed = false,
|
|
608
|
+
onCollapsedChange,
|
|
609
|
+
}: SidebarProps) {
|
|
601
610
|
const location = useLocation();
|
|
602
611
|
const navigate = useNavigate();
|
|
603
612
|
const t = useT();
|
|
@@ -656,348 +665,457 @@ export function Sidebar({ open, onClose }: SidebarProps) {
|
|
|
656
665
|
|
|
657
666
|
<aside
|
|
658
667
|
data-open={open ? "true" : "false"}
|
|
668
|
+
data-collapsed={collapsed ? "true" : "false"}
|
|
659
669
|
className={cn(
|
|
660
|
-
"agent-layout-left-drawer calendar-app-sidebar fixed start-0 top-0 z-50 flex h-full
|
|
670
|
+
"agent-layout-left-drawer calendar-app-sidebar fixed start-0 top-0 z-50 flex h-full min-w-0 flex-col overflow-hidden border-e border-border bg-card transition-[width,translate] duration-200 ease-out lg:static",
|
|
671
|
+
collapsed ? "w-12" : "w-56",
|
|
661
672
|
)}
|
|
662
673
|
>
|
|
663
674
|
{/* Logo */}
|
|
664
|
-
<div
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
className="flex items-center gap-2 rounded outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
669
|
-
>
|
|
670
|
-
<img
|
|
671
|
-
src={appPath("/agent-native-icon-light.svg")}
|
|
672
|
-
alt=""
|
|
673
|
-
aria-hidden="true"
|
|
674
|
-
className="block h-4 w-auto shrink-0 dark:hidden"
|
|
675
|
-
/>
|
|
676
|
-
<img
|
|
677
|
-
src={appPath("/agent-native-icon-dark.svg")}
|
|
678
|
-
alt=""
|
|
679
|
-
aria-hidden="true"
|
|
680
|
-
className="hidden h-4 w-auto shrink-0 dark:block"
|
|
681
|
-
/>
|
|
682
|
-
<span className="text-base font-semibold tracking-tight">
|
|
683
|
-
{t("navigation.brand")}
|
|
684
|
-
</span>
|
|
685
|
-
</Link>
|
|
686
|
-
</div>
|
|
687
|
-
|
|
688
|
-
<div className="min-h-0 flex-1 overflow-y-auto">
|
|
689
|
-
{/* Mini calendar */}
|
|
690
|
-
<MiniCalendar
|
|
691
|
-
selectedDate={selectedDate}
|
|
692
|
-
onDateSelect={handleMiniCalendarDateSelect}
|
|
693
|
-
/>
|
|
694
|
-
|
|
695
|
-
{/* Nav */}
|
|
696
|
-
<nav className="space-y-0.5 border-t border-border p-2.5">
|
|
697
|
-
{navItems.map((item) => {
|
|
698
|
-
const isActive =
|
|
699
|
-
item.path === "/"
|
|
700
|
-
? location.pathname === "/"
|
|
701
|
-
: location.pathname.startsWith(item.path);
|
|
702
|
-
|
|
703
|
-
return (
|
|
704
|
-
<Link
|
|
705
|
-
key={item.path}
|
|
706
|
-
to={item.path}
|
|
707
|
-
onClick={onClose}
|
|
708
|
-
className={cn(
|
|
709
|
-
"flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors",
|
|
710
|
-
isActive
|
|
711
|
-
? "bg-primary/10 text-primary"
|
|
712
|
-
: "text-muted-foreground hover:bg-accent/60 hover:text-foreground",
|
|
713
|
-
)}
|
|
714
|
-
>
|
|
715
|
-
<item.icon className="h-4 w-4" />
|
|
716
|
-
{t(item.labelKey)}
|
|
717
|
-
</Link>
|
|
718
|
-
);
|
|
719
|
-
})}
|
|
720
|
-
</nav>
|
|
721
|
-
|
|
722
|
-
{/* Google status / connect CTA */}
|
|
723
|
-
{!googleStatus.isLoading && !isConnected && (
|
|
724
|
-
<GoogleConnectSidebarButton />
|
|
725
|
-
)}
|
|
726
|
-
|
|
727
|
-
{isConnected && (googleStatus.data?.accounts?.length ?? 0) > 0 && (
|
|
728
|
-
<GoogleAccountsSection
|
|
729
|
-
accounts={googleStatus.data!.accounts!}
|
|
730
|
-
onClose={onClose}
|
|
731
|
-
/>
|
|
675
|
+
<div
|
|
676
|
+
className={cn(
|
|
677
|
+
"flex h-12 shrink-0 items-center justify-between gap-2.5 border-b border-border",
|
|
678
|
+
collapsed ? "px-1" : "px-4",
|
|
732
679
|
)}
|
|
733
|
-
|
|
734
|
-
{
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
680
|
+
>
|
|
681
|
+
{collapsed && onCollapsedChange ? (
|
|
682
|
+
<Tooltip>
|
|
683
|
+
<TooltipTrigger asChild>
|
|
684
|
+
<Button
|
|
685
|
+
type="button"
|
|
686
|
+
variant="ghost"
|
|
687
|
+
size="icon"
|
|
688
|
+
className="h-10 w-10 shrink-0 text-muted-foreground"
|
|
689
|
+
onClick={() => onCollapsedChange(false)}
|
|
690
|
+
aria-label={t("sidebar.expandSidebar")}
|
|
691
|
+
>
|
|
692
|
+
<IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
|
|
693
|
+
</Button>
|
|
694
|
+
</TooltipTrigger>
|
|
695
|
+
<TooltipContent side="right">
|
|
696
|
+
{t("sidebar.expandSidebar")}
|
|
697
|
+
</TooltipContent>
|
|
698
|
+
</Tooltip>
|
|
699
|
+
) : (
|
|
700
|
+
<>
|
|
701
|
+
<Link
|
|
702
|
+
to="/"
|
|
703
|
+
onClick={onClose}
|
|
704
|
+
className="flex items-center gap-2 rounded outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
705
|
+
>
|
|
706
|
+
<img
|
|
707
|
+
src={appPath("/agent-native-icon-light.svg")}
|
|
708
|
+
alt=""
|
|
709
|
+
aria-hidden="true"
|
|
710
|
+
className="block h-4 w-auto shrink-0 dark:hidden"
|
|
711
|
+
/>
|
|
712
|
+
<img
|
|
713
|
+
src={appPath("/agent-native-icon-dark.svg")}
|
|
714
|
+
alt=""
|
|
715
|
+
aria-hidden="true"
|
|
716
|
+
className="hidden h-4 w-auto shrink-0 dark:block"
|
|
717
|
+
/>
|
|
718
|
+
<span className="text-base font-semibold tracking-tight">
|
|
719
|
+
{t("navigation.brand")}
|
|
740
720
|
</span>
|
|
721
|
+
</Link>
|
|
722
|
+
{onCollapsedChange ? (
|
|
741
723
|
<Tooltip>
|
|
742
724
|
<TooltipTrigger asChild>
|
|
743
|
-
<
|
|
744
|
-
|
|
745
|
-
|
|
725
|
+
<Button
|
|
726
|
+
type="button"
|
|
727
|
+
variant="ghost"
|
|
728
|
+
size="icon"
|
|
729
|
+
className="h-8 w-8 shrink-0 text-muted-foreground"
|
|
730
|
+
onClick={() => onCollapsedChange(!collapsed)}
|
|
731
|
+
aria-label={
|
|
732
|
+
collapsed
|
|
733
|
+
? t("sidebar.expandSidebar")
|
|
734
|
+
: t("sidebar.collapseSidebar")
|
|
735
|
+
}
|
|
736
|
+
>
|
|
737
|
+
{collapsed ? (
|
|
738
|
+
<IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
|
|
739
|
+
) : (
|
|
740
|
+
<IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
|
|
741
|
+
)}
|
|
742
|
+
</Button>
|
|
746
743
|
</TooltipTrigger>
|
|
747
744
|
<TooltipContent side="right">
|
|
748
|
-
|
|
745
|
+
{collapsed
|
|
746
|
+
? t("sidebar.expandSidebar")
|
|
747
|
+
: t("sidebar.collapseSidebar")}
|
|
749
748
|
</TooltipContent>
|
|
750
749
|
</Tooltip>
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
>
|
|
775
|
-
{peopleGroupOpen ? (
|
|
776
|
-
<IconChevronDown className="h-3 w-3" />
|
|
777
|
-
) : (
|
|
778
|
-
<IconChevronRight className="h-3 w-3 rtl:-scale-x-100" />
|
|
750
|
+
) : null}
|
|
751
|
+
</>
|
|
752
|
+
)}
|
|
753
|
+
</div>
|
|
754
|
+
|
|
755
|
+
<div className="min-h-0 flex-1 overflow-y-auto">
|
|
756
|
+
{collapsed ? (
|
|
757
|
+
<nav className="flex flex-col items-center gap-1 px-1 py-2">
|
|
758
|
+
{navItems.map((item) => {
|
|
759
|
+
const isActive =
|
|
760
|
+
item.path === "/"
|
|
761
|
+
? location.pathname === "/"
|
|
762
|
+
: location.pathname.startsWith(item.path);
|
|
763
|
+
return (
|
|
764
|
+
<Tooltip key={item.path}>
|
|
765
|
+
<TooltipTrigger asChild>
|
|
766
|
+
<Link
|
|
767
|
+
to={item.path}
|
|
768
|
+
onClick={onClose}
|
|
769
|
+
aria-label={t(item.labelKey)}
|
|
770
|
+
className={cn(
|
|
771
|
+
"flex h-10 w-10 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent/60 hover:text-foreground",
|
|
772
|
+
isActive && "bg-primary/10 text-primary",
|
|
779
773
|
)}
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
774
|
+
>
|
|
775
|
+
<item.icon className="h-4 w-4" />
|
|
776
|
+
</Link>
|
|
777
|
+
</TooltipTrigger>
|
|
778
|
+
<TooltipContent side="right">
|
|
779
|
+
{t(item.labelKey)}
|
|
780
|
+
</TooltipContent>
|
|
781
|
+
</Tooltip>
|
|
782
|
+
);
|
|
783
|
+
})}
|
|
784
|
+
</nav>
|
|
785
|
+
) : (
|
|
786
|
+
<>
|
|
787
|
+
{/* Mini calendar */}
|
|
788
|
+
<MiniCalendar
|
|
789
|
+
selectedDate={selectedDate}
|
|
790
|
+
onDateSelect={handleMiniCalendarDateSelect}
|
|
791
|
+
/>
|
|
792
|
+
|
|
793
|
+
{/* Nav */}
|
|
794
|
+
<nav className="space-y-0.5 border-t border-border p-2.5">
|
|
795
|
+
{navItems.map((item) => {
|
|
796
|
+
const isActive =
|
|
797
|
+
item.path === "/"
|
|
798
|
+
? location.pathname === "/"
|
|
799
|
+
: location.pathname.startsWith(item.path);
|
|
800
|
+
|
|
801
|
+
return (
|
|
802
|
+
<Link
|
|
803
|
+
key={item.path}
|
|
804
|
+
to={item.path}
|
|
805
|
+
onClick={onClose}
|
|
806
|
+
className={cn(
|
|
807
|
+
"flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors",
|
|
808
|
+
isActive
|
|
809
|
+
? "bg-primary/10 text-primary"
|
|
810
|
+
: "text-muted-foreground hover:bg-accent/60 hover:text-foreground",
|
|
811
|
+
)}
|
|
812
|
+
>
|
|
813
|
+
<item.icon className="h-4 w-4" />
|
|
814
|
+
{t(item.labelKey)}
|
|
815
|
+
</Link>
|
|
816
|
+
);
|
|
817
|
+
})}
|
|
818
|
+
</nav>
|
|
819
|
+
|
|
820
|
+
{/* Google status / connect CTA */}
|
|
821
|
+
{!googleStatus.isLoading && !isConnected && (
|
|
822
|
+
<GoogleConnectSidebarButton />
|
|
823
|
+
)}
|
|
824
|
+
|
|
825
|
+
{isConnected &&
|
|
826
|
+
(googleStatus.data?.accounts?.length ?? 0) > 0 && (
|
|
827
|
+
<GoogleAccountsSection
|
|
828
|
+
accounts={googleStatus.data!.accounts!}
|
|
829
|
+
onClose={onClose}
|
|
830
|
+
/>
|
|
831
|
+
)}
|
|
832
|
+
|
|
833
|
+
{/* Other Calendars — people overlays + external ICS feeds combined */}
|
|
834
|
+
<div className="border-t border-border px-1.5 py-1.5">
|
|
835
|
+
<div className="flex min-h-8 items-center justify-between px-3">
|
|
836
|
+
<div className="flex items-center gap-1">
|
|
837
|
+
<span className="text-[11px] font-medium uppercase tracking-wider text-muted-foreground">
|
|
838
|
+
{t("sidebar.otherCalendars")}
|
|
839
|
+
</span>
|
|
840
|
+
<Tooltip>
|
|
841
|
+
<TooltipTrigger asChild>
|
|
842
|
+
<span className="flex items-center text-muted-foreground/40 hover:text-muted-foreground cursor-default">
|
|
843
|
+
<IconInfoCircle className="h-3 w-3" />
|
|
785
844
|
</span>
|
|
786
|
-
</
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
845
|
+
</TooltipTrigger>
|
|
846
|
+
<TooltipContent side="right">
|
|
847
|
+
<p>{t("sidebar.otherCalendarsDescription")}</p>
|
|
848
|
+
</TooltipContent>
|
|
849
|
+
</Tooltip>
|
|
850
|
+
</div>
|
|
851
|
+
<button
|
|
852
|
+
type="button"
|
|
853
|
+
onClick={() => {
|
|
854
|
+
setAddCalendarDefaultTab("people");
|
|
855
|
+
setAddCalendarOpen(true);
|
|
856
|
+
}}
|
|
857
|
+
className="flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground"
|
|
858
|
+
>
|
|
859
|
+
<IconPlus className="h-3.5 w-3.5" />
|
|
860
|
+
</button>
|
|
861
|
+
</div>
|
|
862
|
+
{(overlayPeople.length > 0 || externalCalendars.length > 0) && (
|
|
863
|
+
<div className="mt-1 space-y-1">
|
|
864
|
+
{overlayPeople.length > 0 && (
|
|
865
|
+
<Collapsible
|
|
866
|
+
open={peopleGroupOpen}
|
|
867
|
+
onOpenChange={setPeopleGroupOpen}
|
|
868
|
+
>
|
|
869
|
+
<CollapsibleTrigger asChild>
|
|
870
|
+
<button
|
|
871
|
+
type="button"
|
|
872
|
+
className="flex h-7 w-full items-center gap-1 rounded px-3 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground"
|
|
802
873
|
>
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
874
|
+
{peopleGroupOpen ? (
|
|
875
|
+
<IconChevronDown className="h-3 w-3" />
|
|
876
|
+
) : (
|
|
877
|
+
<IconChevronRight className="h-3 w-3 rtl:-scale-x-100" />
|
|
878
|
+
)}
|
|
879
|
+
<span className="min-w-0 flex-1 text-start">
|
|
880
|
+
People
|
|
881
|
+
</span>
|
|
882
|
+
<span className="text-[10px]">
|
|
883
|
+
{overlayPeople.length}
|
|
884
|
+
</span>
|
|
885
|
+
</button>
|
|
886
|
+
</CollapsibleTrigger>
|
|
887
|
+
<CollapsibleContent className="space-y-0.5">
|
|
888
|
+
{overlayPeople.map((person) => (
|
|
889
|
+
<div
|
|
890
|
+
key={person.email}
|
|
891
|
+
className="group flex min-h-7 items-center gap-2 px-3 text-xs"
|
|
806
892
|
>
|
|
893
|
+
<ColorPickerPopover
|
|
894
|
+
color={person.color}
|
|
895
|
+
onColorChange={(color) =>
|
|
896
|
+
updatePersonColor.mutate({
|
|
897
|
+
email: person.email,
|
|
898
|
+
color,
|
|
899
|
+
})
|
|
900
|
+
}
|
|
901
|
+
>
|
|
902
|
+
<button
|
|
903
|
+
type="button"
|
|
904
|
+
className="shrink-0 cursor-pointer rounded-full p-0.5 hover:ring-2 hover:ring-border"
|
|
905
|
+
>
|
|
906
|
+
<span
|
|
907
|
+
className={cn(
|
|
908
|
+
"block h-2.5 w-2.5 rounded-full",
|
|
909
|
+
isHiddenCalendar(
|
|
910
|
+
"people",
|
|
911
|
+
person.email,
|
|
912
|
+
) && "opacity-40",
|
|
913
|
+
)}
|
|
914
|
+
style={{ backgroundColor: person.color }}
|
|
915
|
+
/>
|
|
916
|
+
</button>
|
|
917
|
+
</ColorPickerPopover>
|
|
807
918
|
<span
|
|
808
919
|
className={cn(
|
|
809
|
-
"
|
|
810
|
-
isHiddenCalendar("people", person.email)
|
|
811
|
-
"
|
|
920
|
+
"min-w-0 flex-1 truncate",
|
|
921
|
+
isHiddenCalendar("people", person.email)
|
|
922
|
+
? "text-muted-foreground/40"
|
|
923
|
+
: "text-muted-foreground",
|
|
812
924
|
)}
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
925
|
+
>
|
|
926
|
+
{person.name || person.email}
|
|
927
|
+
</span>
|
|
928
|
+
<div className="flex items-center">
|
|
929
|
+
<Tooltip>
|
|
930
|
+
<TooltipTrigger asChild>
|
|
931
|
+
<button
|
|
932
|
+
type="button"
|
|
933
|
+
onClick={() =>
|
|
934
|
+
toggleHiddenCalendar(
|
|
935
|
+
"people",
|
|
936
|
+
person.email,
|
|
937
|
+
)
|
|
938
|
+
}
|
|
939
|
+
className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/40 hover:text-foreground group-hover:text-muted-foreground/80"
|
|
940
|
+
>
|
|
941
|
+
{isHiddenCalendar(
|
|
942
|
+
"people",
|
|
943
|
+
person.email,
|
|
944
|
+
) ? (
|
|
945
|
+
<IconEyeOff className="h-3 w-3" />
|
|
946
|
+
) : (
|
|
947
|
+
<IconEye className="h-3 w-3" />
|
|
948
|
+
)}
|
|
949
|
+
</button>
|
|
950
|
+
</TooltipTrigger>
|
|
951
|
+
<TooltipContent side="right">
|
|
952
|
+
{isHiddenCalendar("people", person.email)
|
|
953
|
+
? t("sidebar.showCalendar")
|
|
954
|
+
: t("sidebar.hideCalendar")}
|
|
955
|
+
</TooltipContent>
|
|
956
|
+
</Tooltip>
|
|
830
957
|
<button
|
|
831
958
|
type="button"
|
|
832
959
|
onClick={() =>
|
|
833
|
-
|
|
960
|
+
removePerson.mutate(person.email)
|
|
834
961
|
}
|
|
835
|
-
className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/
|
|
962
|
+
className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 opacity-0 hover:text-foreground group-hover:opacity-100"
|
|
836
963
|
>
|
|
837
|
-
|
|
838
|
-
<IconEyeOff className="h-3 w-3" />
|
|
839
|
-
) : (
|
|
840
|
-
<IconEye className="h-3 w-3" />
|
|
841
|
-
)}
|
|
964
|
+
<IconX className="h-3 w-3" />
|
|
842
965
|
</button>
|
|
843
|
-
</
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
</Tooltip>
|
|
850
|
-
<button
|
|
851
|
-
type="button"
|
|
852
|
-
onClick={() => removePerson.mutate(person.email)}
|
|
853
|
-
className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 opacity-0 hover:text-foreground group-hover:opacity-100"
|
|
854
|
-
>
|
|
855
|
-
<IconX className="h-3 w-3" />
|
|
856
|
-
</button>
|
|
857
|
-
</div>
|
|
858
|
-
</div>
|
|
859
|
-
))}
|
|
860
|
-
</CollapsibleContent>
|
|
861
|
-
</Collapsible>
|
|
862
|
-
)}
|
|
966
|
+
</div>
|
|
967
|
+
</div>
|
|
968
|
+
))}
|
|
969
|
+
</CollapsibleContent>
|
|
970
|
+
</Collapsible>
|
|
971
|
+
)}
|
|
863
972
|
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
>
|
|
869
|
-
<CollapsibleTrigger asChild>
|
|
870
|
-
<button
|
|
871
|
-
type="button"
|
|
872
|
-
className="flex h-7 w-full items-center gap-1 rounded px-3 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground"
|
|
973
|
+
{externalCalendars.length > 0 && (
|
|
974
|
+
<Collapsible
|
|
975
|
+
open={feedsGroupOpen}
|
|
976
|
+
onOpenChange={setFeedsGroupOpen}
|
|
873
977
|
>
|
|
874
|
-
|
|
875
|
-
<
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
)}
|
|
879
|
-
<span className="min-w-0 flex-1 text-start">Feeds</span>
|
|
880
|
-
<span className="text-[10px]">
|
|
881
|
-
{externalCalendars.length}
|
|
882
|
-
</span>
|
|
883
|
-
</button>
|
|
884
|
-
</CollapsibleTrigger>
|
|
885
|
-
<CollapsibleContent className="space-y-0.5">
|
|
886
|
-
{externalCalendars.map((cal) => (
|
|
887
|
-
<div
|
|
888
|
-
key={cal.id}
|
|
889
|
-
className="group flex min-h-7 items-center gap-2 px-3 text-xs"
|
|
890
|
-
>
|
|
891
|
-
<ColorPickerPopover
|
|
892
|
-
color={cal.color}
|
|
893
|
-
onColorChange={(color) =>
|
|
894
|
-
updateExternalColor.mutate({ id: cal.id, color })
|
|
895
|
-
}
|
|
978
|
+
<CollapsibleTrigger asChild>
|
|
979
|
+
<button
|
|
980
|
+
type="button"
|
|
981
|
+
className="flex h-7 w-full items-center gap-1 rounded px-3 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground"
|
|
896
982
|
>
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
983
|
+
{feedsGroupOpen ? (
|
|
984
|
+
<IconChevronDown className="h-3 w-3" />
|
|
985
|
+
) : (
|
|
986
|
+
<IconChevronRight className="h-3 w-3 rtl:-scale-x-100" />
|
|
987
|
+
)}
|
|
988
|
+
<span className="min-w-0 flex-1 text-start">
|
|
989
|
+
Feeds
|
|
990
|
+
</span>
|
|
991
|
+
<span className="text-[10px]">
|
|
992
|
+
{externalCalendars.length}
|
|
993
|
+
</span>
|
|
994
|
+
</button>
|
|
995
|
+
</CollapsibleTrigger>
|
|
996
|
+
<CollapsibleContent className="space-y-0.5">
|
|
997
|
+
{externalCalendars.map((cal) => (
|
|
998
|
+
<div
|
|
999
|
+
key={cal.id}
|
|
1000
|
+
className="group flex min-h-7 items-center gap-2 px-3 text-xs"
|
|
900
1001
|
>
|
|
1002
|
+
<ColorPickerPopover
|
|
1003
|
+
color={cal.color}
|
|
1004
|
+
onColorChange={(color) =>
|
|
1005
|
+
updateExternalColor.mutate({
|
|
1006
|
+
id: cal.id,
|
|
1007
|
+
color,
|
|
1008
|
+
})
|
|
1009
|
+
}
|
|
1010
|
+
>
|
|
1011
|
+
<button
|
|
1012
|
+
type="button"
|
|
1013
|
+
className="shrink-0 cursor-pointer rounded-full p-0.5 hover:ring-2 hover:ring-border"
|
|
1014
|
+
>
|
|
1015
|
+
<span
|
|
1016
|
+
className={cn(
|
|
1017
|
+
"block h-2.5 w-2.5 rounded-full",
|
|
1018
|
+
isHiddenCalendar("external", cal.id) &&
|
|
1019
|
+
"opacity-40",
|
|
1020
|
+
)}
|
|
1021
|
+
style={{ backgroundColor: cal.color }}
|
|
1022
|
+
/>
|
|
1023
|
+
</button>
|
|
1024
|
+
</ColorPickerPopover>
|
|
901
1025
|
<span
|
|
902
1026
|
className={cn(
|
|
903
|
-
"
|
|
904
|
-
isHiddenCalendar("external", cal.id)
|
|
905
|
-
"
|
|
1027
|
+
"min-w-0 flex-1 truncate",
|
|
1028
|
+
isHiddenCalendar("external", cal.id)
|
|
1029
|
+
? "text-muted-foreground/40"
|
|
1030
|
+
: "text-muted-foreground",
|
|
906
1031
|
)}
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
1032
|
+
>
|
|
1033
|
+
{cal.name}
|
|
1034
|
+
</span>
|
|
1035
|
+
<div className="flex items-center">
|
|
1036
|
+
<Tooltip>
|
|
1037
|
+
<TooltipTrigger asChild>
|
|
1038
|
+
<button
|
|
1039
|
+
type="button"
|
|
1040
|
+
onClick={() =>
|
|
1041
|
+
toggleHiddenCalendar("external", cal.id)
|
|
1042
|
+
}
|
|
1043
|
+
className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/40 hover:text-foreground group-hover:text-muted-foreground/80"
|
|
1044
|
+
>
|
|
1045
|
+
{isHiddenCalendar("external", cal.id) ? (
|
|
1046
|
+
<IconEyeOff className="h-3 w-3" />
|
|
1047
|
+
) : (
|
|
1048
|
+
<IconEye className="h-3 w-3" />
|
|
1049
|
+
)}
|
|
1050
|
+
</button>
|
|
1051
|
+
</TooltipTrigger>
|
|
1052
|
+
<TooltipContent side="right">
|
|
1053
|
+
{isHiddenCalendar("external", cal.id)
|
|
1054
|
+
? t("sidebar.showCalendar")
|
|
1055
|
+
: t("sidebar.hideCalendar")}
|
|
1056
|
+
</TooltipContent>
|
|
1057
|
+
</Tooltip>
|
|
924
1058
|
<button
|
|
925
1059
|
type="button"
|
|
926
|
-
onClick={() =>
|
|
927
|
-
|
|
928
|
-
}
|
|
929
|
-
className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/40 hover:text-foreground group-hover:text-muted-foreground/80"
|
|
1060
|
+
onClick={() => removeExternal.mutate(cal.id)}
|
|
1061
|
+
className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 opacity-0 hover:text-foreground group-hover:opacity-100"
|
|
930
1062
|
>
|
|
931
|
-
|
|
932
|
-
<IconEyeOff className="h-3 w-3" />
|
|
933
|
-
) : (
|
|
934
|
-
<IconEye className="h-3 w-3" />
|
|
935
|
-
)}
|
|
1063
|
+
<IconX className="h-3 w-3" />
|
|
936
1064
|
</button>
|
|
937
|
-
</
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
<button
|
|
945
|
-
type="button"
|
|
946
|
-
onClick={() => removeExternal.mutate(cal.id)}
|
|
947
|
-
className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 opacity-0 hover:text-foreground group-hover:opacity-100"
|
|
948
|
-
>
|
|
949
|
-
<IconX className="h-3 w-3" />
|
|
950
|
-
</button>
|
|
951
|
-
</div>
|
|
952
|
-
</div>
|
|
953
|
-
))}
|
|
954
|
-
</CollapsibleContent>
|
|
955
|
-
</Collapsible>
|
|
1065
|
+
</div>
|
|
1066
|
+
</div>
|
|
1067
|
+
))}
|
|
1068
|
+
</CollapsibleContent>
|
|
1069
|
+
</Collapsible>
|
|
1070
|
+
)}
|
|
1071
|
+
</div>
|
|
956
1072
|
)}
|
|
957
1073
|
</div>
|
|
958
|
-
|
|
959
|
-
|
|
1074
|
+
</>
|
|
1075
|
+
)}
|
|
960
1076
|
</div>
|
|
961
1077
|
|
|
962
|
-
|
|
963
|
-
<div className="
|
|
964
|
-
<
|
|
965
|
-
|
|
1078
|
+
{!collapsed ? (
|
|
1079
|
+
<div className="shrink-0">
|
|
1080
|
+
<div className="px-2.5 py-1.5">
|
|
1081
|
+
<ExtensionsSidebarSection />
|
|
1082
|
+
</div>
|
|
966
1083
|
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
1084
|
+
<div className="px-3 py-2">
|
|
1085
|
+
<OrgSwitcher reserveSpace />
|
|
1086
|
+
</div>
|
|
970
1087
|
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
1088
|
+
<div className="flex items-center gap-1 px-1.5 py-1.5">
|
|
1089
|
+
<DevDatabaseLink />
|
|
1090
|
+
<div className="min-w-0 flex-1">
|
|
1091
|
+
<FeedbackButton className="px-3 py-2" />
|
|
1092
|
+
</div>
|
|
1093
|
+
<Tooltip>
|
|
1094
|
+
<TooltipTrigger asChild>
|
|
1095
|
+
<Button
|
|
1096
|
+
variant="ghost"
|
|
1097
|
+
size="icon"
|
|
1098
|
+
className="h-8 w-8 text-muted-foreground"
|
|
1099
|
+
onClick={() =>
|
|
1100
|
+
window.dispatchEvent(new Event("calendar:open-shortcuts"))
|
|
1101
|
+
}
|
|
1102
|
+
>
|
|
1103
|
+
<IconKeyboard className="h-4 w-4" />
|
|
1104
|
+
</Button>
|
|
1105
|
+
</TooltipTrigger>
|
|
1106
|
+
<TooltipContent side="top">
|
|
1107
|
+
<p>
|
|
1108
|
+
{t("keyboardShortcuts.title")}{" "}
|
|
1109
|
+
<kbd className="ms-1 rounded border border-border bg-muted px-1 font-mono text-[10px]">
|
|
1110
|
+
?
|
|
1111
|
+
</kbd>
|
|
1112
|
+
</p>
|
|
1113
|
+
</TooltipContent>
|
|
1114
|
+
</Tooltip>
|
|
1115
|
+
<ThemeToggle className="h-8 w-8" />
|
|
975
1116
|
</div>
|
|
976
|
-
<Tooltip>
|
|
977
|
-
<TooltipTrigger asChild>
|
|
978
|
-
<Button
|
|
979
|
-
variant="ghost"
|
|
980
|
-
size="icon"
|
|
981
|
-
className="h-8 w-8 text-muted-foreground"
|
|
982
|
-
onClick={() =>
|
|
983
|
-
window.dispatchEvent(new Event("calendar:open-shortcuts"))
|
|
984
|
-
}
|
|
985
|
-
>
|
|
986
|
-
<IconKeyboard className="h-4 w-4" />
|
|
987
|
-
</Button>
|
|
988
|
-
</TooltipTrigger>
|
|
989
|
-
<TooltipContent side="top">
|
|
990
|
-
<p>
|
|
991
|
-
{t("keyboardShortcuts.title")}{" "}
|
|
992
|
-
<kbd className="ms-1 rounded border border-border bg-muted px-1 font-mono text-[10px]">
|
|
993
|
-
?
|
|
994
|
-
</kbd>
|
|
995
|
-
</p>
|
|
996
|
-
</TooltipContent>
|
|
997
|
-
</Tooltip>
|
|
998
|
-
<ThemeToggle className="h-8 w-8" />
|
|
999
1117
|
</div>
|
|
1000
|
-
|
|
1118
|
+
) : null}
|
|
1001
1119
|
</aside>
|
|
1002
1120
|
</>
|
|
1003
1121
|
);
|