@agent-native/core 0.176.1 → 0.176.2-nightly-20260831184159
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/frontend-design/SKILL.md +4 -0
- package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/analytics/AGENTS.md +13 -2
- package/corpus/templates/analytics/CHANGELOG.md +8 -0
- package/corpus/templates/analytics/actions/certify-dashboard.ts +39 -0
- package/corpus/templates/analytics/actions/get-sql-dashboard.ts +1 -1
- package/corpus/templates/analytics/actions/list-analysis-revisions.ts +4 -2
- package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +4 -2
- package/corpus/templates/analytics/actions/search-analytics-query-catalog.ts +1 -0
- package/corpus/templates/analytics/actions/search-dashboard-references.ts +2 -1
- package/corpus/templates/analytics/actions/set-workspace-feature-flag.ts +2 -2
- package/corpus/templates/analytics/app/components/agents/FeatureFlagsFleetPanel.tsx +16 -1
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +58 -0
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +7 -19
- package/corpus/templates/analytics/app/global.css +0 -7
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/analytics/app/i18n-data.ts +42 -0
- package/corpus/templates/analytics/app/lib/track-metric.ts +15 -0
- package/corpus/templates/analytics/app/pages/NotFound.tsx +1 -1
- package/corpus/templates/analytics/app/pages/Placeholder.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +115 -2
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +8 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +23 -25
- package/corpus/templates/analytics/app/root.tsx +5 -5
- package/corpus/templates/analytics/app/routes/_index.tsx +18 -20
- package/corpus/templates/analytics/app/routes/dashboard.tsx +1 -1
- package/corpus/templates/analytics/app/routes/home.tsx +39 -0
- package/corpus/templates/analytics/changelog/2026-08-27-show-analytics-s-own-registered-flags-in-fleet-feature-flag-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-28-analytics-loading-placeholders-now-use-a-smooth-whole-surfac.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-28-analytics-loading-states-use-a-softer-whole-surfac.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-28-analytics-sidebar-horizontal-spacing-is-tighter.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-28-sidebar-branding-matches-the-app-text-color-with-a-tighter-m.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-28-sidebar-branding-uses-a-monochrome-agent-native-mark.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-29-analytics-loading-shine-is-more-subtle.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-29-chat-edits-can-be-reverted-to-saved-checkpoints.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-29-dashboard-certification-lives-in-the-overflow-menu.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-29-public-marketing-home.md +6 -0
- package/corpus/templates/analytics/package.json +2 -0
- package/corpus/templates/analytics/public/manifest.json +1 -1
- package/corpus/templates/analytics/server/db/schema.ts +4 -0
- package/corpus/templates/analytics/server/handlers/events.ts +10 -1
- package/corpus/templates/analytics/server/handlers/first-party-analytics.ts +9 -1
- package/corpus/templates/analytics/server/handlers/session-replay.ts +10 -1
- package/corpus/templates/analytics/server/lib/agent-readable-resource-context.ts +22 -2
- package/corpus/templates/analytics/server/lib/analytics-query-catalog.ts +82 -7
- package/corpus/templates/analytics/server/lib/dashboard-certification.ts +58 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +1 -0
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +429 -46
- package/corpus/templates/analytics/server/lib/workspace-feature-flags.ts +204 -32
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +139 -0
- package/corpus/templates/analytics/server/plugins/auth.ts +1 -0
- package/corpus/templates/analytics/server/plugins/core-routes.ts +3 -2
- package/corpus/templates/analytics/server/plugins/db.ts +11 -0
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/assets/app/components/layout/Header.tsx +2 -2
- package/corpus/templates/assets/app/components/layout/Layout.tsx +4 -3
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +14 -27
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +2 -2
- package/corpus/templates/assets/app/root.tsx +29 -9
- package/corpus/templates/assets/app/routes/_index.tsx +15 -116
- package/corpus/templates/assets/app/routes/chat.$threadId.tsx +1 -1
- package/corpus/templates/assets/app/routes/home.tsx +137 -0
- package/corpus/templates/assets/app/routes/library.tsx +5 -1
- package/corpus/templates/assets/app/routes/settings.tsx +28 -25
- package/corpus/templates/assets/changelog/2026-08-26-templates-across-brand-kits.md +1 -0
- package/corpus/templates/assets/public/manifest.json +1 -1
- package/corpus/templates/assets/server/plugins/auth.ts +1 -0
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +3 -3
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +10 -23
- package/corpus/templates/brain/app/lib/brain.ts +2 -2
- package/corpus/templates/brain/app/root.tsx +13 -3
- package/corpus/templates/brain/app/routes/_index.tsx +15 -55
- package/corpus/templates/brain/app/routes/home.tsx +76 -0
- package/corpus/templates/brain/app/routes.ts +1 -0
- package/corpus/templates/brain/public/manifest.json +1 -1
- package/corpus/templates/brain/server/lib/brain-health.ts +2 -2
- package/corpus/templates/brain/server/plugins/auth.ts +1 -1
- package/corpus/templates/brain/server/plugins/core-routes.ts +2 -1
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/calendar/CHANGELOG.md +12 -0
- package/corpus/templates/calendar/actions/event-action-helpers.ts +2 -1
- package/corpus/templates/calendar/actions/manage-event-draft.ts +1 -1
- package/corpus/templates/calendar/actions/update-event.ts +8 -1
- package/corpus/templates/calendar/amplify.yml +15 -0
- package/corpus/templates/calendar/app/components/calendar/ApolloPanel.tsx +2 -2
- package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +102 -109
- package/corpus/templates/calendar/app/components/calendar/DayView.tsx +23 -10
- package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +2 -11
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +150 -141
- package/corpus/templates/calendar/app/components/calendar/EventCard.tsx +3 -1
- package/corpus/templates/calendar/app/components/calendar/EventDescription.tsx +2 -2
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +359 -222
- package/corpus/templates/calendar/app/components/calendar/InlineEventPickers.tsx +13 -5
- package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +21 -9
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +21 -32
- package/corpus/templates/calendar/app/global.css +11 -0
- package/corpus/templates/calendar/app/hooks/use-meeting-start-notifications.ts +10 -0
- package/corpus/templates/calendar/app/hooks/use-navigation-state.ts +3 -3
- package/corpus/templates/calendar/app/i18n-data.ts +110 -0
- package/corpus/templates/calendar/app/lib/calendar-timezone.ts +12 -3
- package/corpus/templates/calendar/app/lib/event-popover-style.ts +43 -0
- package/corpus/templates/calendar/app/lib/mcp-embed.ts +8 -2
- package/corpus/templates/calendar/app/lib/utils.ts +3 -1
- package/corpus/templates/calendar/app/pages/BookingPage.tsx +2 -8
- package/corpus/templates/calendar/app/pages/CalendarView.tsx +9 -11
- package/corpus/templates/calendar/app/pages/ManageBookingPage.tsx +2 -6
- package/corpus/templates/calendar/app/pages/NotFound.tsx +1 -1
- package/corpus/templates/calendar/app/pages/Settings.tsx +54 -0
- package/corpus/templates/calendar/app/root.tsx +9 -1
- package/corpus/templates/calendar/app/routes/{_app._index.tsx → _app.home.tsx} +1 -1
- package/corpus/templates/calendar/app/routes/_index.tsx +34 -0
- package/corpus/templates/calendar/app/routes/event.tsx +2 -6
- package/corpus/templates/calendar/changelog/2026-08-28-all-day-events-stay-in-the-compact-top-bar-in-day-and-week-v.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-calendar-organizer-note-emails-now-link-back-to-agent-native.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-calendar-shows-google-profile-photos-in-the-desktop-app.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-event-creators-can-choose-whether-a-meeting-shows-as-free-or.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-event-popovers-match-notion-calendar-s-density-a-284px-blurr.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-fixed-calendar-navigation-scheduling-permissions-and-action-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-google-calendar-connections-use-the-registered-callback-on-m.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-sidebar-branding-matches-the-app-text-color-with-a-tighter-m.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-sidebar-branding-uses-a-monochrome-agent-native-mark.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-the-calendar-sidebar-keeps-the-settings-link-compact.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-the-calendar-sidebar-keeps-the-workspace-picker-compact.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-29-public-marketing-home.md +6 -0
- package/corpus/templates/calendar/public/manifest.json +1 -1
- package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
- package/corpus/templates/calendar/server/lib/emails.ts +2 -1
- package/corpus/templates/calendar/server/lib/event-guest-notifications.ts +31 -5
- package/corpus/templates/calendar/server/lib/google-calendar.ts +4 -2
- package/corpus/templates/calendar/server/plugins/auth.ts +1 -0
- package/corpus/templates/calendar/server/plugins/core-routes.ts +5 -3
- package/corpus/templates/calendar/shared/event-permissions.ts +12 -0
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/chat/AGENTS.md +5 -4
- package/corpus/templates/chat/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/chat/app/components/layout/Layout.tsx +5 -4
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +16 -25
- package/corpus/templates/chat/app/hooks/use-navigation-state.ts +5 -5
- package/corpus/templates/chat/app/root.tsx +16 -3
- package/corpus/templates/chat/app/routes/_index.tsx +17 -74
- package/corpus/templates/chat/app/routes/chat.$threadId.tsx +1 -1
- package/corpus/templates/chat/app/routes/home.tsx +94 -0
- package/corpus/templates/chat/netlify.toml +2 -1
- package/corpus/templates/chat/public/manifest.json +1 -1
- package/corpus/templates/chat/server/plugins/auth.ts +1 -0
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/clips/actions/add-comment.ts +18 -1
- package/corpus/templates/clips/actions/get-recording-player-data.ts +2 -0
- package/corpus/templates/clips/actions/list-comments.ts +2 -0
- package/corpus/templates/clips/actions/list-notifications.ts +60 -28
- package/corpus/templates/clips/actions/list-recording-mention-members.ts +64 -0
- package/corpus/templates/clips/actions/list-recordings.ts +1 -1
- package/corpus/templates/clips/actions/reply-to-comment.ts +17 -1
- package/corpus/templates/clips/actions/update-comment.ts +36 -2
- package/corpus/templates/clips/app/components/library/empty-state.tsx +1 -3
- package/corpus/templates/clips/app/components/library/library-grid.tsx +18 -6
- package/corpus/templates/clips/app/components/library/library-layout.tsx +6 -58
- package/corpus/templates/clips/app/components/library/recording-card.tsx +101 -3
- package/corpus/templates/clips/app/components/library/sort-menu.tsx +2 -2
- package/corpus/templates/clips/app/components/player/comment-composer.tsx +284 -0
- package/corpus/templates/clips/app/components/player/comments-panel.tsx +162 -46
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +38 -133
- package/corpus/templates/clips/app/components/player/video-player.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +99 -20
- package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +110 -116
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +83 -60
- package/corpus/templates/clips/app/components/settings/ai-setup-section.tsx +17 -11
- package/corpus/templates/clips/app/components/settings/types.ts +5 -1
- package/corpus/templates/clips/app/components/settings/video-storage-section.tsx +21 -12
- package/corpus/templates/clips/app/global.css +0 -27
- package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +3 -17
- package/corpus/templates/clips/app/hooks/use-mention-members.ts +24 -0
- package/corpus/templates/clips/app/hooks/use-navigation-state.ts +2 -2
- package/corpus/templates/clips/app/i18n/en-US.ts +15 -0
- package/corpus/templates/clips/app/lib/recording-backup.ts +245 -0
- package/corpus/templates/clips/app/lib/recording-retry.ts +189 -0
- package/corpus/templates/clips/app/lib/recording-status.ts +32 -0
- package/corpus/templates/clips/app/root.tsx +11 -2
- package/corpus/templates/clips/app/routes/_app.home.tsx +62 -0
- package/corpus/templates/clips/app/routes/_app.notifications.tsx +45 -12
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +2 -0
- package/corpus/templates/clips/app/routes/_index.tsx +11 -40
- package/corpus/templates/clips/app/routes/download.tsx +148 -15
- package/corpus/templates/clips/app/routes/embed.$shareId.tsx +4 -3
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +6 -11
- package/corpus/templates/clips/app/routes/record.tsx +72 -13
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +40 -24
- package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +2 -7
- package/corpus/templates/clips/changelog/2026-08-28-chrome-extension-download-help.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-28-clips-loading-skeletons-use-a-softer-whole-surface.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-28-comment-composer-no-longer-has-an-outer-border.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-29-clips-loading-shine-is-more-subtle.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +377 -476
- package/corpus/templates/clips/desktop/src/components/ui/skeleton.tsx +1 -1
- package/corpus/templates/clips/desktop/src/components/ui/spinner.tsx +1 -17
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +4 -0
- package/corpus/templates/clips/desktop/src/overlays/countdown.tsx +0 -8
- package/corpus/templates/clips/desktop/src/overlays/record-pill.tsx +221 -460
- package/corpus/templates/clips/desktop/src/styles.css +0 -40
- package/corpus/templates/clips/desktop/src/tailwind.css +28 -14
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +15 -11
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +9 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +192 -57
- package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +9 -3
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
- package/corpus/templates/clips/desktop/src-tauri/src/util.rs +97 -3
- package/corpus/templates/clips/public/manifest.json +1 -1
- package/corpus/templates/clips/server/db/schema.ts +1 -0
- package/corpus/templates/clips/server/lib/activity-notifications.ts +30 -5
- package/corpus/templates/clips/server/lib/comment-mentions.ts +23 -0
- package/corpus/templates/clips/server/lib/emails.ts +2 -2
- package/corpus/templates/clips/server/lib/recording-page-access.ts +16 -0
- package/corpus/templates/clips/server/lib/transactional-email-templates.ts +14 -7
- package/corpus/templates/clips/server/plugins/auth.ts +1 -0
- package/corpus/templates/clips/server/plugins/core-routes.ts +5 -0
- package/corpus/templates/clips/server/plugins/db.ts +5 -0
- package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +4 -2
- package/corpus/templates/clips/server/routes/api/clips-latest.json.get.ts +77 -22
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +11 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/interrupt.post.ts +4 -4
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/resume.get.ts +1 -1
- package/corpus/templates/clips/shared/comment-mentions.ts +71 -0
- package/corpus/templates/clips/shared/prerendered-public-paths.ts +1 -1
- package/corpus/templates/clips/shared/recording-core.ts +5 -0
- package/corpus/templates/clips/shared/recording-playhead.css +207 -0
- package/corpus/templates/clips/shared/recording-playhead.tsx +616 -0
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/content/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/content/CHANGELOG.md +6 -0
- package/corpus/templates/content/actions/_property-utils.ts +45 -9
- package/corpus/templates/content/actions/edit-document.ts +17 -0
- package/corpus/templates/content/actions/get-document.ts +31 -11
- package/corpus/templates/content/actions/list-document-properties.ts +30 -2
- package/corpus/templates/content/actions/list-document-versions.ts +49 -17
- package/corpus/templates/content/actions/list-documents.ts +13 -2
- package/corpus/templates/content/actions/restore-document-version.ts +8 -1
- package/corpus/templates/content/actions/update-document.ts +8 -0
- package/corpus/templates/content/app/components/QueryErrorState.tsx +1 -0
- package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +28 -8
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +94 -61
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +24 -10
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +16 -13
- package/corpus/templates/content/app/components/editor/database/settings.tsx +16 -13
- package/corpus/templates/content/app/components/layout/Layout.tsx +35 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -18
- package/corpus/templates/content/app/hooks/use-document-properties.ts +5 -3
- package/corpus/templates/content/app/hooks/use-documents.ts +3 -1
- package/corpus/templates/content/app/hooks/use-navigation-state.ts +3 -3
- package/corpus/templates/content/app/root.tsx +9 -4
- package/corpus/templates/content/app/routes/{_app._index.tsx → _app.home.tsx} +12 -4
- package/corpus/templates/content/app/routes/_index.tsx +33 -0
- package/corpus/templates/content/changelog/2026-08-26-shared-page-load-failures-now-stay-visible-and-safe.md +6 -0
- package/corpus/templates/content/docs/product/capabilities/content.workspace.session-restore.md +2 -2
- package/corpus/templates/content/e2e/playwright.config.ts +1 -1
- package/corpus/templates/content/package.json +2 -0
- package/corpus/templates/content/parity/matrix.md +1 -1
- package/corpus/templates/content/parity/matrix.ts +1 -1
- package/corpus/templates/content/public/manifest.json +1 -1
- package/corpus/templates/content/server/db/schema.ts +1 -0
- package/corpus/templates/content/server/lib/document-version-context.ts +67 -0
- package/corpus/templates/content/server/plugins/agent-chat.ts +155 -0
- package/corpus/templates/content/server/plugins/auth.ts +1 -0
- package/corpus/templates/content/server/plugins/core-routes.ts +3 -2
- package/corpus/templates/content/server/plugins/db.ts +5 -0
- package/corpus/templates/content/shared/api.ts +6 -4
- package/corpus/templates/crm/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +1 -1
- package/corpus/templates/crm/agent-native.app-skill.json +1 -1
- package/corpus/templates/crm/app/components/layout/CrmCommandMenu.tsx +1 -1
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +36 -1
- package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +3 -3
- package/corpus/templates/crm/app/root.tsx +28 -7
- package/corpus/templates/crm/app/routes/_index.tsx +28 -18
- package/corpus/templates/crm/app/routes/home.tsx +27 -0
- package/corpus/templates/crm/app/routes/setup.tsx +2 -2
- package/corpus/templates/crm/app/routes.ts +1 -0
- package/corpus/templates/crm/public/manifest.json +1 -1
- package/corpus/templates/crm/server/plugins/agent-chat.ts +81 -0
- package/corpus/templates/crm/server/plugins/auth.ts +1 -0
- package/corpus/templates/crm/server/plugins/core-routes.ts +2 -1
- package/corpus/templates/crm/server/plugins/db.ts +7 -1
- package/corpus/templates/crm/shared/crm-navigation.ts +3 -2
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +13 -0
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/design/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +22 -10
- package/corpus/templates/design/AGENTS.md +1 -1
- package/corpus/templates/design/actions/add-breakpoint.ts +3 -1
- package/corpus/templates/design/actions/add-fusion-screens.ts +2 -0
- package/corpus/templates/design/actions/add-localhost-screens.ts +16 -11
- package/corpus/templates/design/actions/apply-a11y-fix.ts +6 -8
- package/corpus/templates/design/actions/apply-component-prop-edit.ts +3 -1
- package/corpus/templates/design/actions/apply-design-token-edit.ts +3 -1
- package/corpus/templates/design/actions/apply-motion-edit.ts +18 -13
- package/corpus/templates/design/actions/apply-shader-fill.ts +3 -1
- package/corpus/templates/design/actions/apply-source-edit.ts +6 -1
- package/corpus/templates/design/actions/apply-tweaks.ts +3 -1
- package/corpus/templates/design/actions/apply-visual-edit.ts +14 -9
- package/corpus/templates/design/actions/clone-creative-context-design.ts +6 -1
- package/corpus/templates/design/actions/create-component.ts +3 -1
- package/corpus/templates/design/actions/create-file.ts +3 -1
- package/corpus/templates/design/actions/delete-file.ts +3 -1
- package/corpus/templates/design/actions/detach-component-instance.ts +3 -1
- package/corpus/templates/design/actions/edit-design.ts +16 -11
- package/corpus/templates/design/actions/generate-design.ts +19 -14
- package/corpus/templates/design/actions/get-design-branch-diff.ts +26 -31
- package/corpus/templates/design/actions/get-design-review.ts +25 -31
- package/corpus/templates/design/actions/get-design-system-index-status.ts +55 -0
- package/corpus/templates/design/actions/get-design-system.ts +1 -1
- package/corpus/templates/design/actions/hydrate-figma-paste-images.ts +3 -1
- package/corpus/templates/design/actions/import-design-source.ts +16 -9
- package/corpus/templates/design/actions/import-design-tokens.ts +3 -1
- package/corpus/templates/design/actions/import-figma-clipboard.ts +28 -16
- package/corpus/templates/design/actions/import-figma-frame.ts +3 -1
- package/corpus/templates/design/actions/insert-asset.ts +3 -1
- package/corpus/templates/design/actions/insert-design-native-asset.ts +3 -1
- package/corpus/templates/design/actions/insert-figma-library-asset.ts +3 -1
- package/corpus/templates/design/actions/list-design-versions.ts +23 -0
- package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +3 -1
- package/corpus/templates/design/actions/open-visual-edit.ts +23 -20
- package/corpus/templates/design/actions/present-design-variants.ts +7 -2
- package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +66 -10
- package/corpus/templates/design/actions/remove-breakpoint.ts +3 -1
- package/corpus/templates/design/actions/remove-motion-timeline.ts +3 -1
- package/corpus/templates/design/actions/restore-design-version.ts +16 -0
- package/corpus/templates/design/actions/set-layout-grid.ts +94 -0
- package/corpus/templates/design/actions/swap-component-instance.ts +6 -1
- package/corpus/templates/design/actions/update-design.ts +16 -11
- package/corpus/templates/design/actions/update-file.ts +2 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +25 -0
- package/corpus/templates/design/app/components/design/EditPanel.tsx +36 -8
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +185 -29
- package/corpus/templates/design/app/components/design/ReviewCommentsPanel.tsx +4 -4
- package/corpus/templates/design/app/components/design/ReviewPanel.tsx +1 -1
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +35 -10
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +16 -9
- package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +51 -21
- package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +18 -17
- package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +6 -1
- package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +3 -3
- package/corpus/templates/design/app/components/design/edit-panel/layout-grid-properties.tsx +88 -0
- package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +5 -2
- package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +8 -4
- package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +8 -103
- package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +68 -83
- package/corpus/templates/design/app/components/design/editor/MakeRealDialog.tsx +35 -10
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +29 -24
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +6 -0
- package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +72 -71
- package/corpus/templates/design/app/components/design/inspector/InspectorControlPopover.tsx +1 -1
- package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +9 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +8 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +32 -0
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +8 -21
- package/corpus/templates/design/app/global.css +72 -1
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +32 -1
- package/corpus/templates/design/app/i18n-data.ts +116 -12
- package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +3 -1
- package/corpus/templates/design/app/lib/design-system-data.ts +36 -0
- package/corpus/templates/design/app/pages/DesignEditor.tsx +170 -34
- package/corpus/templates/design/app/pages/DesignSystems.tsx +126 -11
- package/corpus/templates/design/app/pages/Index.tsx +15 -7
- package/corpus/templates/design/app/pages/NotFound.tsx +1 -1
- package/corpus/templates/design/app/pages/Templates.tsx +18 -3
- package/corpus/templates/design/app/pages/VisualEdit.tsx +1 -1
- package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +3 -3
- package/corpus/templates/design/app/pages/design-editor/commands/README.md +1 -0
- package/corpus/templates/design/app/pages/design-editor/commands/geometry-commit.ts +2 -1
- package/corpus/templates/design/app/pages/design-editor/commands/set-layout-grid.ts +66 -0
- package/corpus/templates/design/app/pages/design-editor/design-data-geometry-utils.ts +5 -0
- package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +9 -1
- package/corpus/templates/design/app/pages/design-editor/effects/resume-pending-generation.ts +39 -9
- package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +31 -2
- package/corpus/templates/design/app/pages/design-editor/geometry-persistence.ts +26 -0
- package/corpus/templates/design/app/pages/design-editor/intake-question-topics.ts +335 -0
- package/corpus/templates/design/app/pages/design-editor/nudge-intent.ts +8 -1
- package/corpus/templates/design/app/root.tsx +12 -2
- package/corpus/templates/design/app/routes/_index.tsx +14 -1
- package/corpus/templates/design/app/routes/home.tsx +21 -0
- package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +1 -1
- package/corpus/templates/design/changelog/2026-08-28-frames-can-carry-an-8px-layout-grid-that-positions-snap-to.md +6 -0
- package/corpus/templates/design/changelog/2026-08-28-x-and-y-are-always-whole-numbers.md +6 -0
- package/corpus/templates/design/public/manifest.json +1 -1
- package/corpus/templates/design/server/db/schema.ts +2 -0
- package/corpus/templates/design/server/handlers/design-system-builder-link.ts +84 -0
- package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +9 -1
- package/corpus/templates/design/server/lib/design-versions.ts +1017 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +144 -0
- package/corpus/templates/design/server/plugins/auth.ts +1 -1
- package/corpus/templates/design/server/plugins/core-routes.ts +3 -2
- package/corpus/templates/design/server/plugins/db.ts +7 -0
- package/corpus/templates/design/server/routes/api/design-system-builder-link.get.ts +1 -0
- package/corpus/templates/design/shared/canvas-math.ts +106 -14
- package/corpus/templates/design/shared/layout-grid.ts +80 -0
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/dispatch/AGENTS.md +11 -13
- package/corpus/templates/dispatch/actions/list-workspace-connections.ts +10 -5
- package/corpus/templates/dispatch/app/i18n-data.ts +120 -0
- package/corpus/templates/dispatch/app/root.tsx +11 -1
- package/corpus/templates/dispatch/app/routes/_index.tsx +34 -7
- package/corpus/templates/dispatch/app/routes/home.tsx +7 -0
- package/corpus/templates/dispatch/package.json +1 -0
- package/corpus/templates/dispatch/public/manifest.json +1 -1
- package/corpus/templates/factory/.agents/skills/factory-graphs/SKILL.md +11 -2
- package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/factory/.env.example +2 -14
- package/corpus/templates/factory/AGENTS.md +12 -11
- package/corpus/templates/factory/README.md +15 -17
- package/corpus/templates/factory/actions/{babysit-agent-native-pull-request.ts → babysit-factory-pull-request.ts} +125 -88
- package/corpus/templates/factory/actions/create-factory-automation.ts +161 -0
- package/corpus/templates/factory/actions/create-factory.ts +4 -124
- package/corpus/templates/factory/actions/delete-factory.ts +11 -23
- package/corpus/templates/factory/actions/{start-builder-for-item.ts → dispatch-factory-item.ts} +169 -57
- package/corpus/templates/factory/actions/get-slack-feedback-context.ts +30 -10
- package/corpus/templates/factory/actions/get-triage-config.ts +22 -0
- package/corpus/templates/factory/actions/get-triage-item.ts +49 -2
- package/corpus/templates/factory/actions/{govern-agent-native-pull-request.ts → govern-factory-pull-request.ts} +95 -112
- package/corpus/templates/factory/actions/ingest-github-observation.ts +9 -2
- package/corpus/templates/factory/actions/list-factory-audit.ts +85 -12
- package/corpus/templates/factory/actions/list-factory-automation-templates.ts +56 -0
- package/corpus/templates/factory/actions/list-factory-automations.ts +36 -3
- package/corpus/templates/factory/actions/list-factory-graph-versions.ts +37 -10
- package/corpus/templates/factory/actions/list-triage-items.ts +120 -15
- package/corpus/templates/factory/actions/poll-github-sources.ts +102 -58
- package/corpus/templates/factory/actions/poll-sentry-errors.ts +73 -36
- package/corpus/templates/factory/actions/poll-slack-channel.ts +112 -28
- package/corpus/templates/factory/actions/{babysit-pull-request.ts → propose-pr-babysit-status.ts} +9 -47
- package/corpus/templates/factory/actions/reconcile-triage-run.ts +1 -1
- package/corpus/templates/factory/actions/save-factory-automation.ts +131 -33
- package/corpus/templates/factory/actions/save-factory-graph.ts +31 -8
- package/corpus/templates/factory/actions/save-triage-config.ts +7 -27
- package/corpus/templates/factory/actions/save-triage-rule.ts +1 -1
- package/corpus/templates/factory/app/components/factory/CreateFactoryAutomationView.tsx +258 -0
- package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +349 -106
- package/corpus/templates/factory/app/components/factory/FactoryAutomationFields.tsx +614 -0
- package/corpus/templates/factory/app/components/factory/FactoryInboxView.tsx +1136 -0
- package/corpus/templates/factory/app/components/factory/FactoryInspector.tsx +7 -14
- package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +4 -223
- package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +10 -205
- package/corpus/templates/factory/app/components/factory/SlackMrkdwn.tsx +100 -0
- package/corpus/templates/factory/app/components/factory/audit-filters.ts +30 -0
- package/corpus/templates/factory/app/components/factory/factory-automation-form.ts +120 -0
- package/corpus/templates/factory/app/components/factory/inbox-filters.ts +84 -0
- package/corpus/templates/factory/app/components/factory/inbox-source-url.ts +23 -0
- package/corpus/templates/factory/app/components/factory/slack-emoji.ts +165 -0
- package/corpus/templates/factory/app/components/factory/slack-mrkdwn.ts +128 -0
- package/corpus/templates/factory/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/factory/app/components/layout/Layout.tsx +63 -6
- package/corpus/templates/factory/app/components/layout/Sidebar.tsx +13 -26
- package/corpus/templates/factory/app/components/triage/triage-status-pill.tsx +63 -14
- package/corpus/templates/factory/app/global.css +106 -0
- package/corpus/templates/factory/app/hooks/use-navigation-state.ts +16 -10
- package/corpus/templates/factory/app/i18n/en-US.ts +154 -7
- package/corpus/templates/factory/app/lib/factory-tab-params.ts +59 -0
- package/corpus/templates/factory/app/lib/safe-http-url.ts +8 -0
- package/corpus/templates/factory/app/root.tsx +16 -3
- package/corpus/templates/factory/app/routes/_index.tsx +27 -5
- package/corpus/templates/factory/app/routes/factory.tsx +325 -733
- package/corpus/templates/factory/app/routes/home.tsx +13 -0
- package/corpus/templates/factory/app/routes/new-factory.tsx +3 -5
- package/corpus/templates/factory/changelog/2026-08-26-inbox-full-screen-thread.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-26-inbox-thread-and-audit-labels.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-audit-run-list-stacks.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-audit-run-names-wrap.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-factory-opens-on-inbox.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-github-repository-url.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-inbox-filters.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-polling-does-not-enable-automations.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-pr-babysit-can-poll-github.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-factory-automations-use-workspace-connections.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-inbox-approve-and-start-removed.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-audit-shows-decisions.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-reviews-next-github-prs.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-sticky-out-of-scope.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-uses-github-evidence.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-29-audit-filters-pagination-scroll.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-29-create-factory-automations.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-29-dispatch-reaction-argument.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-29-factory-action-names-match-behavior.md +6 -0
- package/corpus/templates/factory/public/manifest.json +1 -1
- package/corpus/templates/factory/server/connectors/slack.ts +8 -6
- package/corpus/templates/factory/server/db/schema.ts +23 -0
- package/corpus/templates/factory/server/lib/audit-cursor.ts +44 -0
- package/corpus/templates/factory/server/lib/factory-action-names.ts +15 -0
- package/corpus/templates/factory/server/lib/factory-audit-report.ts +29 -9
- package/corpus/templates/factory/server/lib/factory-automation-caller.ts +38 -0
- package/corpus/templates/factory/server/lib/factory-automation-config.ts +543 -0
- package/corpus/templates/factory/server/lib/factory-automation-plan.ts +0 -48
- package/corpus/templates/factory/server/lib/factory-automation-repair.ts +2 -18
- package/corpus/templates/factory/server/lib/factory-poll-cursors.ts +98 -0
- package/corpus/templates/factory/server/lib/factory-scope.ts +8 -0
- package/corpus/templates/factory/server/lib/github-repository.ts +104 -0
- package/corpus/templates/factory/server/lib/inbox-cursor.ts +34 -0
- package/corpus/templates/factory/server/lib/pr-babysit-prompt.ts +33 -0
- package/corpus/templates/factory/server/lib/require-factory-automation.ts +58 -17
- package/corpus/templates/factory/server/lib/safe-http-url.ts +8 -0
- package/corpus/templates/factory/server/lib/slack-feedback-prompt.ts +19 -10
- package/corpus/templates/factory/server/lib/source-reaction.ts +37 -0
- package/corpus/templates/factory/server/plugins/agent-chat.ts +18 -22
- package/corpus/templates/factory/server/plugins/auth.ts +1 -0
- package/corpus/templates/factory/server/plugins/factory-migrations.ts +26 -0
- package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +277 -164
- package/corpus/templates/factory/server/plugins/integrations.ts +5 -7
- package/corpus/templates/factory/server/triage/github-client.ts +274 -3
- package/corpus/templates/factory/server/triage/github-ingestion.ts +3 -1
- package/corpus/templates/factory/server/triage/metadata.ts +12 -0
- package/corpus/templates/factory/server/triage/pr-babysit.ts +22 -21
- package/corpus/templates/factory/server/triage/review-skill-alignment.ts +11 -11
- package/corpus/templates/factory/server/triage/review-state.ts +39 -0
- package/corpus/templates/factory/server/triage/slack-client.ts +14 -6
- package/corpus/templates/factory/server/triage/slack-poller.ts +34 -65
- package/corpus/templates/factory/server/triage/slack-user-labels.ts +126 -0
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/forms/AGENTS.md +4 -3
- package/corpus/templates/forms/actions/response-insights.ts +4 -4
- package/corpus/templates/forms/actions/retry-response-deliveries.ts +26 -0
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +8 -33
- package/corpus/templates/forms/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/forms/app/lib/route-prewarm.ts +1 -1
- package/corpus/templates/forms/app/root.tsx +3 -2
- package/corpus/templates/forms/app/routes/_app.home.tsx +47 -0
- package/corpus/templates/forms/app/routes/_app.tsx +2 -1
- package/corpus/templates/forms/app/routes/_index.tsx +10 -23
- package/corpus/templates/forms/public/manifest.json +1 -1
- package/corpus/templates/forms/server/db/schema.ts +64 -17
- package/corpus/templates/forms/server/handlers/submissions.ts +1022 -94
- package/corpus/templates/forms/server/lib/integrations.ts +100 -33
- package/corpus/templates/forms/server/middleware/00-public-cors.ts +1 -1
- package/corpus/templates/forms/server/plugins/auth.ts +1 -0
- package/corpus/templates/forms/server/plugins/core-routes.ts +1 -0
- package/corpus/templates/forms/server/plugins/db.ts +40 -0
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/macros/actions/view-screen.ts +1 -1
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +9 -21
- package/corpus/templates/macros/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/macros/app/root.tsx +22 -8
- package/corpus/templates/macros/app/routes/_index.tsx +16 -291
- package/corpus/templates/macros/app/routes/home.tsx +312 -0
- package/corpus/templates/macros/server/plugins/auth.ts +9 -7
- package/corpus/templates/macros/server/plugins/core-routes.ts +1 -0
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/mail/.agents/skills/inbox-automations/SKILL.md +13 -2
- package/corpus/templates/mail/.agents/skills/inbox-reads-and-triage/SKILL.md +1 -1
- package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/mail/AGENTS.md +5 -2
- package/corpus/templates/mail/actions/apply-ai-filter.ts +294 -0
- package/corpus/templates/mail/actions/create-automation.ts +1 -0
- package/corpus/templates/mail/actions/get-ai-filter.ts +19 -0
- package/corpus/templates/mail/actions/manage-automations.ts +162 -157
- package/corpus/templates/mail/actions/manage-email-rules.ts +3 -0
- package/corpus/templates/mail/actions/navigate.ts +1 -1
- package/corpus/templates/mail/actions/update-automation.ts +1 -0
- package/corpus/templates/mail/actions/update-mail-preferences.ts +1 -0
- package/corpus/templates/mail/app/components/email/AiFilterDialog.tsx +127 -0
- package/corpus/templates/mail/app/components/email/EmailList.tsx +63 -0
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +95 -0
- package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +35 -3
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +17 -22
- package/corpus/templates/mail/app/components/settings/AiFilterSection.tsx +401 -0
- package/corpus/templates/mail/app/hooks/use-ai-filter.ts +48 -0
- package/corpus/templates/mail/app/hooks/use-automations.ts +1 -0
- package/corpus/templates/mail/app/hooks/use-emails.ts +11 -3
- package/corpus/templates/mail/app/i18n/en-US.ts +55 -0
- package/corpus/templates/mail/app/lib/automation-visibility.ts +17 -0
- package/corpus/templates/mail/app/pages/InboxPage.tsx +5 -2
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +16 -8
- package/corpus/templates/mail/app/pages/inbox-zero.ts +1 -2
- package/corpus/templates/mail/app/root.tsx +20 -8
- package/corpus/templates/mail/app/routes/_index.tsx +16 -55
- package/corpus/templates/mail/app/routes/home.tsx +71 -0
- package/corpus/templates/mail/changelog/2026-08-28-mail-settings-show-chat-created-automations.md +6 -0
- package/corpus/templates/mail/public/manifest.json +1 -1
- package/corpus/templates/mail/server/db/schema.ts +3 -0
- package/corpus/templates/mail/server/handlers/emails.ts +34 -11
- package/corpus/templates/mail/server/handlers/google-auth.ts +1 -1
- package/corpus/templates/mail/server/lib/ai-filter.ts +103 -0
- package/corpus/templates/mail/server/lib/automation-actions.ts +14 -9
- package/corpus/templates/mail/server/lib/automation-engine.ts +142 -18
- package/corpus/templates/mail/server/lib/automations.ts +9 -0
- package/corpus/templates/mail/server/lib/email-state.ts +7 -2
- package/corpus/templates/mail/server/lib/gmail-query.ts +10 -0
- package/corpus/templates/mail/server/lib/google-auth.ts +5 -8
- package/corpus/templates/mail/server/lib/jobs.ts +1 -5
- package/corpus/templates/mail/server/onboarding.ts +2 -2
- package/corpus/templates/mail/server/plugins/agent-chat.ts +5 -2
- package/corpus/templates/mail/server/plugins/auth.ts +1 -0
- package/corpus/templates/mail/server/plugins/core-routes.ts +4 -1
- package/corpus/templates/mail/server/plugins/db.ts +6 -0
- package/corpus/templates/mail/server/routes/api/attachments.get.ts +1 -5
- package/corpus/templates/mail/shared/ai-filter.ts +74 -0
- package/corpus/templates/mail/shared/types.ts +2 -0
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/plan/actions/list-plan-versions.ts +20 -5
- package/corpus/templates/plan/agent-native.json +1 -4
- package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +5 -2
- package/corpus/templates/plan/app/components/layout/Layout.tsx +41 -1
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +4 -16
- package/corpus/templates/plan/app/components/plan/PlanMarkdownEditor.tsx +7 -4
- package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
- package/corpus/templates/plan/app/components/plan/wireframe/html-artboard.css +15 -0
- package/corpus/templates/plan/app/components/plan/wireframe/kit/plan-wireframe-tokens.css +0 -15
- package/corpus/templates/plan/app/components/plan/wireframe/kit/primitives.tsx +2 -2
- package/corpus/templates/plan/app/hooks/use-plan-presence.ts +20 -10
- package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
- package/corpus/templates/plan/app/root.tsx +13 -7
- package/corpus/templates/plan/app/routes/_index.tsx +31 -6
- package/corpus/templates/plan/app/routes/chat.tsx +3 -6
- package/corpus/templates/plan/app/routes/home.tsx +11 -0
- package/corpus/templates/plan/app/routes/local-plans.$slug.tsx +2 -6
- package/corpus/templates/plan/app/routes/plans.$id.tsx +3 -6
- package/corpus/templates/plan/app/routes/plans.tsx +3 -6
- package/corpus/templates/plan/app/routes/recaps.$id.tsx +3 -6
- package/corpus/templates/plan/app/routes/recaps.tsx +3 -6
- package/corpus/templates/plan/changelog/2026-08-28-plan-loading-skeletons-use-a-softer-whole-surface.md +6 -0
- package/corpus/templates/plan/changelog/2026-08-29-plan-loading-shine-is-more-subtle.md +6 -0
- package/corpus/templates/plan/public/manifest.json +1 -1
- package/corpus/templates/plan/server/db/schema.ts +1 -0
- package/corpus/templates/plan/server/lib/plan-versions.ts +57 -0
- package/corpus/templates/plan/server/plugins/agent-chat.ts +83 -0
- package/corpus/templates/plan/server/plugins/core-routes.ts +1 -0
- package/corpus/templates/plan/server/plugins/db.ts +10 -0
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/slides/CHANGELOG.md +9 -0
- package/corpus/templates/slides/actions/_deck-write.ts +65 -0
- package/corpus/templates/slides/actions/add-slide.ts +44 -24
- package/corpus/templates/slides/actions/clone-context-slide.ts +22 -12
- package/corpus/templates/slides/actions/create-deck.ts +36 -21
- package/corpus/templates/slides/actions/delete-design-system.ts +10 -3
- package/corpus/templates/slides/actions/import-file.ts +9 -3
- package/corpus/templates/slides/actions/import-pptx.ts +11 -4
- package/corpus/templates/slides/actions/list-deck-versions.ts +20 -8
- package/corpus/templates/slides/actions/patch-deck.ts +29 -3
- package/corpus/templates/slides/actions/restore-deck-version.ts +37 -22
- package/corpus/templates/slides/actions/save-deck.ts +35 -22
- package/corpus/templates/slides/actions/update-deck-aspect-ratio.ts +31 -16
- package/corpus/templates/slides/actions/update-slide.ts +250 -37
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +10 -4
- package/corpus/templates/slides/app/components/editor/EditorActionCluster.tsx +2 -2
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +7 -8
- package/corpus/templates/slides/app/components/editor/ImageOverlay.tsx +78 -12
- package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +42 -4
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +381 -53
- package/corpus/templates/slides/app/components/editor/SlidesLayersPanel.tsx +20 -34
- package/corpus/templates/slides/app/components/editor/slide-style.ts +5 -0
- package/corpus/templates/slides/app/components/editor/style-clipboard.ts +2 -0
- package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +18 -2
- package/corpus/templates/slides/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/slides/app/components/layout/Layout.tsx +39 -10
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +7 -20
- package/corpus/templates/slides/app/components/presentation/PresenterView.tsx +35 -15
- package/corpus/templates/slides/app/components/presentation/present-channel.ts +12 -0
- package/corpus/templates/slides/app/global.css +45 -13
- package/corpus/templates/slides/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/slides/app/i18n/en-US.ts +11 -0
- package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +133 -5
- package/corpus/templates/slides/app/lib/slide-image-replacement.ts +741 -17
- package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +1 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +288 -95
- package/corpus/templates/slides/app/pages/DesignSystems.tsx +5 -5
- package/corpus/templates/slides/app/pages/Index.tsx +7 -7
- package/corpus/templates/slides/app/pages/NotFound.tsx +1 -1
- package/corpus/templates/slides/app/pages/SharedPresentation.tsx +1 -1
- package/corpus/templates/slides/app/root.tsx +4 -23
- package/corpus/templates/slides/app/routes/_index.tsx +18 -7
- package/corpus/templates/slides/app/routes/home.tsx +26 -0
- package/corpus/templates/slides/changelog/2026-08-27-image-fit-controls-apply-cover-crops-and-position.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-28-image-edits-persist-while-dropped-images-finish-uploading.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-28-shared-slides-with-a-style-block-render-again.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-28-slides-loading-skeletons-use-a-softer-whole-surface.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-28-standard-empty-home-layout.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-29-chat-imports-attached-decks-on-request.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-29-slides-loading-shine-is-more-subtle.md +6 -0
- package/corpus/templates/slides/package.json +3 -0
- package/corpus/templates/slides/public/manifest.json +1 -1
- package/corpus/templates/slides/server/db/schema.ts +1 -0
- package/corpus/templates/slides/server/handlers/google-docs-auth.ts +1 -1
- package/corpus/templates/slides/server/lib/chat-attachments.ts +102 -7
- package/corpus/templates/slides/server/lib/deck-versions.ts +77 -2
- package/corpus/templates/slides/server/plugins/agent-chat.ts +95 -1
- package/corpus/templates/slides/server/plugins/auth.ts +1 -0
- package/corpus/templates/slides/server/plugins/core-routes.ts +8 -1
- package/corpus/templates/slides/server/plugins/db.ts +5 -0
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/tasks/AGENTS.md +2 -1
- package/corpus/templates/tasks/README.md +3 -1
- package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +5 -18
- package/corpus/templates/tasks/app/root.tsx +19 -3
- package/corpus/templates/tasks/app/routes/_index.tsx +28 -14
- package/corpus/templates/tasks/app/routes/home.tsx +24 -0
- package/corpus/templates/tasks/public/manifest.json +1 -1
- package/corpus/templates/tasks/server/plugins/auth.ts +1 -0
- package/dist/a2a/client.d.ts +4 -0
- package/dist/a2a/client.js +15 -2
- package/dist/action.d.ts +3 -1
- package/dist/agent/engine/ai-sdk-engine.js +13 -9
- package/dist/agent/engine/anthropic-engine.js +2 -1
- package/dist/agent/engine/builder-engine.js +23 -5
- package/dist/agent/engine/limit-provider-tools.d.ts +3 -0
- package/dist/agent/engine/limit-provider-tools.js +23 -0
- package/dist/agent/engine/openai-compatible-endpoint.d.ts +2 -0
- package/dist/agent/engine/openai-compatible-endpoint.js +4 -0
- package/dist/agent/engine/output-tokens.d.ts +12 -6
- package/dist/agent/engine/output-tokens.js +42 -16
- package/dist/agent/engine/registry.d.ts +1 -1
- package/dist/agent/engine/registry.js +69 -16
- package/dist/agent/production-agent.js +107 -13
- package/dist/agent/run-manager.d.ts +9 -0
- package/dist/agent/run-manager.js +35 -6
- package/dist/agent/thread-data-builder.d.ts +6 -1
- package/dist/agent/thread-data-builder.js +20 -5
- package/dist/agent/types.d.ts +2 -0
- package/dist/app-config/agent.d.ts +4 -0
- package/dist/app-config/agent.js +44 -0
- package/dist/app-config/integrations.d.ts +1 -0
- package/dist/app-config/integrations.js +8 -0
- package/dist/app-config/migration.d.ts +1 -0
- package/dist/app-config/migration.js +4 -0
- package/dist/app-config/observability.d.ts +4 -1
- package/dist/app-config/observability.js +25 -1
- package/dist/app-config/schema.d.ts +9 -0
- package/dist/app-config/store.js +1 -0
- package/dist/client/AgentAskPopover.d.ts +2 -1
- package/dist/client/AgentAskPopover.js +2 -2
- package/dist/client/AgentPanel.d.ts +35 -10
- package/dist/client/AgentPanel.js +136 -119
- package/dist/client/AssistantChat.d.ts +9 -2
- package/dist/client/AssistantChat.js +161 -36
- package/dist/client/ConnectBuilderCard.js +3 -1
- package/dist/client/DefaultSpinner.d.ts +13 -1
- package/dist/client/DefaultSpinner.js +52 -46
- package/dist/client/FeedbackButton.d.ts +12 -0
- package/dist/client/FeedbackButton.js +62 -28
- package/dist/client/MultiTabAssistantChat.js +30 -11
- package/dist/client/NewWorkspaceAppFlow.js +5 -3
- package/dist/client/agent-chat/index.d.ts +1 -0
- package/dist/client/agent-chat/index.js +1 -0
- package/dist/client/agent-chat-adapter.js +16 -1
- package/dist/client/agent-chat.d.ts +9 -0
- package/dist/client/agent-chat.js +6 -3
- package/dist/client/agent-page/AgentJobsTab.d.ts +2 -1
- package/dist/client/agent-page/AgentJobsTab.js +8 -5
- package/dist/client/agent-page/AgentTabsPage.js +2 -2
- package/dist/client/analytics.d.ts +2 -0
- package/dist/client/analytics.js +86 -15
- package/dist/client/app-providers.js +13 -1
- package/dist/client/auth/AuthPage.d.ts +87 -0
- package/dist/client/auth/AuthPage.js +1847 -0
- package/dist/client/auth/ResetPasswordPage.d.ts +9 -0
- package/dist/client/auth/ResetPasswordPage.js +119 -0
- package/dist/client/auth/entry.d.ts +1 -0
- package/dist/client/auth/entry.js +15 -0
- package/dist/client/chat/message-components.d.ts +53 -0
- package/dist/client/chat/message-components.js +181 -11
- package/dist/client/chat/run-recovery.d.ts +4 -1
- package/dist/client/chat/run-recovery.js +30 -12
- package/dist/client/chat/tool-call-display.d.ts +4 -2
- package/dist/client/chat/tool-call-display.js +16 -11
- package/dist/client/chat-first.js +8 -2
- package/dist/client/chat-model-groups.js +11 -1
- package/dist/client/collab/index.d.ts +1 -1
- package/dist/client/components/CodeRequiredDialog.js +22 -35
- package/dist/client/components/icons/AgentNativeIcon.d.ts +3 -3
- package/dist/client/components/icons/AgentNativeIcon.js +4 -4
- package/dist/client/components/ui/message-scroller.js +1 -1
- package/dist/client/composer/runtime-adapters.js +2 -0
- package/dist/client/feedback-context.d.ts +1 -0
- package/dist/client/feedback-context.js +3 -2
- package/dist/client/host-bridge.d.ts +1 -0
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts +2 -1
- package/dist/client/integrations/IntegrationsPanel.js +3 -3
- package/dist/client/observability/ThumbsFeedback.js +73 -10
- package/dist/client/onboarding/FirstRunOnboarding.js +24 -15
- package/dist/client/onboarding/OnboardingPanel.js +5 -3
- package/dist/client/onboarding/first-run-startup-gate.js +7 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts +2 -1
- package/dist/client/resources/McpIntegrationDialog.js +10 -2
- package/dist/client/session-replay.js +10 -0
- package/dist/client/settings/BuilderConnectPopover.d.ts +25 -0
- package/dist/client/settings/BuilderConnectPopover.js +55 -0
- package/dist/client/settings/SettingsPanel.js +21 -7
- package/dist/client/settings/SettingsTabsPage.d.ts +1 -1
- package/dist/client/settings/SettingsTabsPage.js +42 -25
- package/dist/client/settings/VoiceTranscriptionSection.js +16 -22
- package/dist/client/settings/index.d.ts +1 -0
- package/dist/client/settings/index.js +1 -0
- package/dist/client/settings/useBuilderStatus.d.ts +7 -0
- package/dist/client/settings/useBuilderStatus.js +77 -21
- package/dist/client/setup-connections/BuilderConnectCard.js +2 -1
- package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +3 -1
- package/dist/client/setup-connections/useBuilderConnectCardController.js +4 -2
- package/dist/client/sse-event-processor.js +8 -0
- package/dist/client/terminal/AgentTerminal.js +6 -7
- package/dist/client/transcription/BuilderTranscriptionCta.js +17 -69
- package/dist/client/ui/index.d.ts +1 -0
- package/dist/client/ui/index.js +1 -0
- package/dist/client/use-chat-models.js +5 -4
- package/dist/client/webmcp.d.ts +4 -0
- package/dist/client/webmcp.js +51 -4
- package/dist/collab/client.d.ts +13 -0
- package/dist/collab/client.js +96 -21
- package/dist/dashboard-storage/index.d.ts +1 -1
- package/dist/dashboard-storage/schema.d.ts +19 -0
- package/dist/dashboard-storage/schema.js +1 -0
- package/dist/dashboard-storage/store.d.ts +9 -0
- package/dist/dashboard-storage/store.js +93 -3
- package/dist/deploy/build.d.ts +19 -3
- package/dist/deploy/build.js +262 -10
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/ingestion/media.js +7 -2
- package/dist/integrations/config-store.js +2 -4
- package/dist/integrations/google-docs-poller.d.ts +1 -1
- package/dist/integrations/google-docs-poller.js +100 -24
- package/dist/integrations/plugin.js +45 -15
- package/dist/integrations/webhook-handler.js +2 -1
- package/dist/jobs/background-automation-runner.js +17 -1
- package/dist/localization/core-messages/ar-SA.js +19 -0
- package/dist/localization/core-messages/de-DE.js +19 -0
- package/dist/localization/core-messages/en-US.d.ts +19 -0
- package/dist/localization/core-messages/en-US.js +19 -0
- package/dist/localization/core-messages/es-ES.js +19 -0
- package/dist/localization/core-messages/fr-FR.js +19 -0
- package/dist/localization/core-messages/hi-IN.js +19 -0
- package/dist/localization/core-messages/ja-JP.js +19 -0
- package/dist/localization/core-messages/ko-KR.js +19 -0
- package/dist/localization/core-messages/pt-BR.js +19 -0
- package/dist/localization/core-messages/zh-CN.js +19 -0
- package/dist/localization/core-messages/zh-TW.js +19 -0
- package/dist/localization/core-messages.d.ts +19 -0
- package/dist/localization/default-messages.d.ts +11 -0
- package/dist/localization/default-messages.js +11 -0
- package/dist/mcp/analytics.d.ts +103 -0
- package/dist/mcp/analytics.js +204 -0
- package/dist/mcp/build-server.d.ts +7 -0
- package/dist/mcp/build-server.js +132 -35
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/mcp/server.js +37 -8
- package/dist/mcp/stdio.js +1 -0
- package/dist/mcp-client/errors.js +30 -10
- package/dist/mcp-client/oauth-routes.d.ts +7 -2
- package/dist/mcp-client/oauth-routes.js +12 -3
- package/dist/mcp-client/routes.js +2 -1
- package/dist/oauth-tokens/store.js +6 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/observability/routes.js +8 -2
- package/dist/observability/store.d.ts +1 -1
- package/dist/observability/store.js +18 -3
- package/dist/observability/types.d.ts +1 -0
- package/dist/onboarding/plugin.js +16 -4
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +16 -16
- package/dist/provider-api/actions/provider-api.d.ts +12 -12
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/action-routes.d.ts +1 -6
- package/dist/server/action-routes.js +61 -18
- package/dist/server/agent-chat/plugin-options.d.ts +8 -1
- package/dist/server/agent-chat-plugin.d.ts +3 -0
- package/dist/server/agent-chat-plugin.js +49 -4
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agent-run-context.d.ts +1 -0
- package/dist/server/agent-run-context.js +6 -0
- package/dist/server/analytics.d.ts +3 -2
- package/dist/server/analytics.js +18 -7
- package/dist/server/app-url.d.ts +5 -2
- package/dist/server/app-url.js +4 -3
- package/dist/server/auth.d.ts +25 -0
- package/dist/server/auth.js +168 -21
- package/dist/server/better-auth-instance.js +18 -4
- package/dist/server/better-auth-migrations.d.ts +14 -0
- package/dist/server/better-auth-migrations.js +5 -1
- package/dist/server/builder-api-auth.js +30 -6
- package/dist/server/builder-browser.d.ts +10 -0
- package/dist/server/builder-browser.js +22 -5
- package/dist/server/builder-design-systems.d.ts +11 -0
- package/dist/server/builder-design-systems.js +52 -3
- package/dist/server/builder-oauth.d.ts +13 -6
- package/dist/server/builder-oauth.js +121 -63
- package/dist/server/capture-error.js +3 -0
- package/dist/server/cookie-namespace.d.ts +1 -0
- package/dist/server/cookie-namespace.js +3 -0
- package/dist/server/core-routes-plugin.d.ts +25 -9
- package/dist/server/core-routes-plugin.js +180 -76
- package/dist/server/credential-provider.js +22 -12
- package/dist/server/email.d.ts +4 -0
- package/dist/server/email.js +13 -5
- package/dist/server/framework-request-handler.js +6 -3
- package/dist/server/google-credential-check.d.ts +7 -3
- package/dist/server/google-credential-check.js +71 -0
- package/dist/server/google-oauth-credentials.d.ts +4 -3
- package/dist/server/google-oauth-credentials.js +7 -8
- package/dist/server/google-oauth.d.ts +9 -4
- package/dist/server/google-oauth.js +14 -93
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/jwks-secret-rotation.d.ts +29 -0
- package/dist/server/jwks-secret-rotation.js +150 -0
- package/dist/server/onboarding-html.d.ts +2 -14
- package/dist/server/onboarding-html.js +254 -2519
- package/dist/server/origin-allowlist.d.ts +15 -0
- package/dist/server/origin-allowlist.js +93 -0
- package/dist/server/release-migrations.js +48 -0
- package/dist/server/request-context.d.ts +2 -0
- package/dist/server/request-context.js +7 -2
- package/dist/server/self-dispatch.js +5 -0
- package/dist/server/sentry.js +5 -0
- package/dist/server/ssr-handler.js +5 -0
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/server/workspace-provider-oauth.d.ts +9 -0
- package/dist/server/workspace-provider-oauth.js +96 -31
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/loading-labels.d.ts +1 -0
- package/dist/shared/loading-labels.js +55 -0
- package/dist/shared/qa-test-email.d.ts +1 -0
- package/dist/shared/qa-test-email.js +42 -0
- package/dist/shared/route-warmup-config.js +2 -2
- package/dist/shared/sign-in-journey.js +1 -1
- package/dist/shared/ssr-auth-redirect.d.ts +8 -0
- package/dist/shared/ssr-auth-redirect.js +56 -0
- package/dist/shared/test-traffic.d.ts +8 -0
- package/dist/shared/test-traffic.js +11 -0
- package/dist/styles/agent-native.css +50 -14
- package/dist/styles/blocks.css +0 -6
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -0
- package/dist/templates/chat/.agents/skills/secrets/SKILL.md +47 -0
- package/dist/templates/chat/AGENTS.md +5 -4
- package/dist/templates/chat/app/components/layout/Header.tsx +1 -1
- package/dist/templates/chat/app/components/layout/Layout.tsx +5 -4
- package/dist/templates/chat/app/components/layout/Sidebar.tsx +16 -25
- package/dist/templates/chat/app/hooks/use-navigation-state.ts +5 -5
- package/dist/templates/chat/app/root.tsx +16 -3
- package/dist/templates/chat/app/routes/_index.tsx +17 -74
- package/dist/templates/chat/app/routes/chat.$threadId.tsx +1 -1
- package/dist/templates/chat/app/routes/home.tsx +94 -0
- package/dist/templates/chat/netlify.toml +2 -1
- package/dist/templates/chat/public/manifest.json +1 -1
- package/dist/templates/chat/server/plugins/auth.ts +1 -0
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +4 -0
- package/dist/templates/default/.agents/skills/secrets/SKILL.md +47 -0
- package/dist/templates/default/AGENTS.md +10 -6
- package/dist/templates/default/DEVELOPING.md +8 -1
- package/dist/templates/default/app/hooks/use-navigation-state.ts +1 -1
- package/dist/templates/default/app/root.tsx +10 -3
- package/dist/templates/default/app/routes/_index.tsx +10 -86
- package/dist/templates/default/app/routes/home.tsx +94 -0
- package/dist/templates/default/app/routes/settings.tsx +1 -1
- package/dist/templates/default/public/manifest.json +1 -1
- package/dist/templates/default/server/plugins/auth.ts +5 -0
- package/dist/templates/headless/.agents/skills/secrets/SKILL.md +47 -0
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +47 -0
- package/dist/templates/workspace-root/.env.example +3 -2
- package/dist/terminal/pty-server.d.ts +2 -0
- package/dist/terminal/pty-server.js +22 -5
- package/dist/tracking/registry.d.ts +1 -0
- package/dist/tracking/registry.js +12 -0
- package/dist/usage/store.d.ts +1 -0
- package/dist/usage/store.js +16 -7
- package/dist/vite/client.d.ts +1 -1
- package/dist/vite/client.js +59 -0
- package/dist/workspace-connections/index.d.ts +1 -1
- package/dist/workspace-connections/index.js +1 -1
- package/dist/workspace-connections/store.d.ts +1 -0
- package/dist/workspace-connections/store.js +4 -0
- package/docs/content/aws-amplify.mdx +179 -0
- package/docs/content/client-agent-chat.mdx +1 -1
- package/docs/content/deploy-an-app.mdx +2 -1
- package/docs/content/deployment.mdx +14 -3
- package/docs/content/environment-variables.mdx +1 -0
- package/docs/content/template-forms-agent.mdx +65 -0
- package/docs/content/template-forms-developers.mdx +220 -65
- package/docs/content/template-forms-features.mdx +154 -0
- package/docs/content/template-forms-integrations.mdx +40 -0
- package/docs/content/template-forms.mdx +49 -36
- package/docs/content/template-mail-developers.mdx +3 -3
- package/docs/content/toolkit-settings.mdx +3 -3
- package/docs/content/webmcp.mdx +31 -12
- package/package.json +3 -3
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -0
- package/src/templates/chat/.agents/skills/secrets/SKILL.md +47 -0
- package/src/templates/chat/AGENTS.md +5 -4
- package/src/templates/chat/app/components/layout/Header.tsx +1 -1
- package/src/templates/chat/app/components/layout/Layout.tsx +5 -4
- package/src/templates/chat/app/components/layout/Sidebar.tsx +16 -25
- package/src/templates/chat/app/hooks/use-navigation-state.ts +5 -5
- package/src/templates/chat/app/root.tsx +16 -3
- package/src/templates/chat/app/routes/_index.tsx +17 -74
- package/src/templates/chat/app/routes/chat.$threadId.tsx +1 -1
- package/src/templates/chat/app/routes/home.tsx +94 -0
- package/src/templates/chat/netlify.toml +2 -1
- package/src/templates/chat/public/manifest.json +1 -1
- package/src/templates/chat/server/plugins/auth.ts +1 -0
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +4 -0
- package/src/templates/default/.agents/skills/secrets/SKILL.md +47 -0
- package/src/templates/default/AGENTS.md +10 -6
- package/src/templates/default/DEVELOPING.md +8 -1
- package/src/templates/default/app/hooks/use-navigation-state.ts +1 -1
- package/src/templates/default/app/root.tsx +10 -3
- package/src/templates/default/app/routes/_index.tsx +10 -86
- package/src/templates/default/app/routes/home.tsx +94 -0
- package/src/templates/default/app/routes/settings.tsx +1 -1
- package/src/templates/default/public/manifest.json +1 -1
- package/src/templates/default/server/plugins/auth.ts +5 -0
- package/src/templates/headless/.agents/skills/secrets/SKILL.md +47 -0
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -0
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +47 -0
- package/src/templates/workspace-root/.env.example +3 -2
- package/corpus/templates/factory/actions/approve-factory-item.ts +0 -244
- package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +0 -33
- package/corpus/templates/factory/server/routes/_agent-native/factory/builder-callback.post.ts +0 -116
- package/corpus/templates/factory/server/triage/ai-services-git.ts +0 -205
- package/corpus/templates/factory/server/triage/builder-executor.ts +0 -123
- package/docs/content/template-forms-building-publishing.mdx +0 -135
- package/docs/content/template-forms-responses.mdx +0 -120
- /package/corpus/templates/clips/{server/lib → shared}/upload-interruption.ts +0 -0
|
@@ -100,6 +100,15 @@ import {
|
|
|
100
100
|
type ReminderMode,
|
|
101
101
|
validateAttachmentDrafts,
|
|
102
102
|
} from "@/lib/event-form-utils";
|
|
103
|
+
import {
|
|
104
|
+
eventPopoverDivider,
|
|
105
|
+
eventPopoverHeader,
|
|
106
|
+
eventPopoverHeaderButton,
|
|
107
|
+
eventPopoverHeaderTitle,
|
|
108
|
+
eventPopoverPrimaryAction,
|
|
109
|
+
eventPopoverShell,
|
|
110
|
+
eventPopoverWidth,
|
|
111
|
+
} from "@/lib/event-popover-style";
|
|
103
112
|
import { isOutOfOfficeEvent } from "@/lib/out-of-office";
|
|
104
113
|
import {
|
|
105
114
|
createEventDetailPopoverToken,
|
|
@@ -581,6 +590,33 @@ export function EventDetailPopover({
|
|
|
581
590
|
const connectZoom = useConnectZoom();
|
|
582
591
|
const locationRef = useRef<HTMLInputElement>(null);
|
|
583
592
|
const meetingLinkRef = useRef<HTMLInputElement>(null);
|
|
593
|
+
const detailsScrollRef = useRef<HTMLDivElement>(null);
|
|
594
|
+
const actionPendingRef = useRef(false);
|
|
595
|
+
const [actionPending, setActionPending] = useState(false);
|
|
596
|
+
|
|
597
|
+
const beginAction = useCallback(() => {
|
|
598
|
+
if (
|
|
599
|
+
actionPendingRef.current ||
|
|
600
|
+
updateEvent.isPending ||
|
|
601
|
+
connectZoom.isPending
|
|
602
|
+
) {
|
|
603
|
+
return false;
|
|
604
|
+
}
|
|
605
|
+
actionPendingRef.current = true;
|
|
606
|
+
setActionPending(true);
|
|
607
|
+
return true;
|
|
608
|
+
}, [connectZoom.isPending, updateEvent.isPending]);
|
|
609
|
+
|
|
610
|
+
const endAction = useCallback(() => {
|
|
611
|
+
actionPendingRef.current = false;
|
|
612
|
+
setActionPending(false);
|
|
613
|
+
}, []);
|
|
614
|
+
|
|
615
|
+
const mutationPending =
|
|
616
|
+
actionPending ||
|
|
617
|
+
updateEvent.isPending ||
|
|
618
|
+
connectZoom.isPending ||
|
|
619
|
+
pendingVideoProvider !== null;
|
|
584
620
|
|
|
585
621
|
useEffect(() => {
|
|
586
622
|
setSelectedAccountEmail(event.accountEmail);
|
|
@@ -599,35 +635,52 @@ export function EventDetailPopover({
|
|
|
599
635
|
) {
|
|
600
636
|
return;
|
|
601
637
|
}
|
|
638
|
+
if (!beginAction()) return;
|
|
602
639
|
|
|
603
640
|
setSelectedAccountEmail(targetAccountEmail);
|
|
604
641
|
void (async () => {
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
642
|
+
try {
|
|
643
|
+
const guestNotification = await promptGuestNotification({
|
|
644
|
+
event,
|
|
645
|
+
action: "update",
|
|
646
|
+
});
|
|
647
|
+
if (!guestNotification) {
|
|
648
|
+
setSelectedAccountEmail(event.accountEmail);
|
|
649
|
+
endAction();
|
|
650
|
+
return;
|
|
651
|
+
}
|
|
652
|
+
updateEvent.mutate(
|
|
653
|
+
{
|
|
654
|
+
id: event.id,
|
|
655
|
+
accountEmail: event.accountEmail,
|
|
656
|
+
targetAccountEmail,
|
|
657
|
+
...guestNotification,
|
|
658
|
+
},
|
|
659
|
+
{
|
|
660
|
+
onSuccess: () => toast.success(t("eventForm.eventUpdated")),
|
|
661
|
+
onError: () => {
|
|
662
|
+
setSelectedAccountEmail(event.accountEmail);
|
|
663
|
+
toast.error(t("eventForm.updateFailed"));
|
|
664
|
+
},
|
|
665
|
+
onSettled: endAction,
|
|
666
|
+
},
|
|
667
|
+
);
|
|
668
|
+
} catch {
|
|
610
669
|
setSelectedAccountEmail(event.accountEmail);
|
|
611
|
-
|
|
670
|
+
endAction();
|
|
612
671
|
}
|
|
613
|
-
updateEvent.mutate(
|
|
614
|
-
{
|
|
615
|
-
id: event.id,
|
|
616
|
-
accountEmail: event.accountEmail,
|
|
617
|
-
targetAccountEmail,
|
|
618
|
-
...guestNotification,
|
|
619
|
-
},
|
|
620
|
-
{
|
|
621
|
-
onSuccess: () => toast.success(t("eventForm.eventUpdated")),
|
|
622
|
-
onError: () => {
|
|
623
|
-
setSelectedAccountEmail(event.accountEmail);
|
|
624
|
-
toast.error(t("eventForm.updateFailed"));
|
|
625
|
-
},
|
|
626
|
-
},
|
|
627
|
-
);
|
|
628
672
|
})();
|
|
629
673
|
},
|
|
630
|
-
[
|
|
674
|
+
[
|
|
675
|
+
beginAction,
|
|
676
|
+
endAction,
|
|
677
|
+
event,
|
|
678
|
+
isDraft,
|
|
679
|
+
onDraftUpdate,
|
|
680
|
+
promptGuestNotification,
|
|
681
|
+
t,
|
|
682
|
+
updateEvent,
|
|
683
|
+
],
|
|
631
684
|
);
|
|
632
685
|
|
|
633
686
|
// Sync editing state when the event changes (incl. live agent/other-user
|
|
@@ -722,6 +775,17 @@ export function EventDetailPopover({
|
|
|
722
775
|
? event.visibility
|
|
723
776
|
: "default";
|
|
724
777
|
const reminderValue = getReminderValue(event);
|
|
778
|
+
|
|
779
|
+
useEffect(() => {
|
|
780
|
+
if (!showMoreOptions) return;
|
|
781
|
+
const container = detailsScrollRef.current;
|
|
782
|
+
if (!container) return;
|
|
783
|
+
const frame = requestAnimationFrame(() => {
|
|
784
|
+
container.scrollTop = container.scrollHeight;
|
|
785
|
+
});
|
|
786
|
+
return () => cancelAnimationFrame(frame);
|
|
787
|
+
}, [showMoreOptions]);
|
|
788
|
+
|
|
725
789
|
// Save a field update
|
|
726
790
|
const saveField = useCallback(
|
|
727
791
|
(updates: EventUpdatePatch) => {
|
|
@@ -731,32 +795,50 @@ export function EventDetailPopover({
|
|
|
731
795
|
onDraftUpdate?.(event.id, draftUpdates);
|
|
732
796
|
return true;
|
|
733
797
|
}
|
|
798
|
+
if (!beginAction()) return false;
|
|
734
799
|
void (async () => {
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
800
|
+
try {
|
|
801
|
+
const {
|
|
802
|
+
scope: _scope,
|
|
803
|
+
addAttendees,
|
|
804
|
+
...notificationUpdates
|
|
805
|
+
} = updates;
|
|
806
|
+
const promptUpdates = addAttendees
|
|
807
|
+
? {
|
|
808
|
+
...notificationUpdates,
|
|
809
|
+
attendees: mergeAttendeesForPrompt(
|
|
810
|
+
event.attendees,
|
|
811
|
+
addAttendees,
|
|
812
|
+
),
|
|
813
|
+
}
|
|
814
|
+
: notificationUpdates;
|
|
815
|
+
const shouldChooseGuestScope =
|
|
816
|
+
isRecurringEvent &&
|
|
817
|
+
("attendees" in updates || "addAttendees" in updates);
|
|
818
|
+
const guestNotification = await promptGuestNotification({
|
|
819
|
+
event,
|
|
820
|
+
action: "update",
|
|
821
|
+
updates: promptUpdates,
|
|
822
|
+
recurrenceScope: shouldChooseGuestScope
|
|
823
|
+
? { enabled: true, defaultScope: "single" }
|
|
824
|
+
: undefined,
|
|
825
|
+
});
|
|
826
|
+
if (!guestNotification) {
|
|
827
|
+
endAction();
|
|
828
|
+
return;
|
|
829
|
+
}
|
|
830
|
+
updateEvent.mutate(
|
|
831
|
+
{
|
|
832
|
+
id: event.id,
|
|
833
|
+
accountEmail: event.accountEmail,
|
|
834
|
+
...updates,
|
|
835
|
+
...guestNotification,
|
|
836
|
+
},
|
|
837
|
+
{ onSettled: endAction },
|
|
838
|
+
);
|
|
839
|
+
} catch {
|
|
840
|
+
endAction();
|
|
841
|
+
}
|
|
760
842
|
})();
|
|
761
843
|
return true;
|
|
762
844
|
},
|
|
@@ -764,6 +846,8 @@ export function EventDetailPopover({
|
|
|
764
846
|
event,
|
|
765
847
|
isDraft,
|
|
766
848
|
isRecurringEvent,
|
|
849
|
+
beginAction,
|
|
850
|
+
endAction,
|
|
767
851
|
onDraftUpdate,
|
|
768
852
|
promptGuestNotification,
|
|
769
853
|
updateEvent,
|
|
@@ -826,33 +910,52 @@ export function EventDetailPopover({
|
|
|
826
910
|
onDraftUpdate?.(event.id, { addGoogleMeet: true, addZoom: false });
|
|
827
911
|
return;
|
|
828
912
|
}
|
|
913
|
+
if (!beginAction()) return;
|
|
829
914
|
setPendingVideoProvider("meet");
|
|
830
915
|
void (async () => {
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
916
|
+
try {
|
|
917
|
+
const updates = { addGoogleMeet: true };
|
|
918
|
+
const guestNotification = await promptGuestNotification({
|
|
919
|
+
event,
|
|
920
|
+
action: "update",
|
|
921
|
+
updates,
|
|
922
|
+
});
|
|
923
|
+
if (!guestNotification) {
|
|
924
|
+
setPendingVideoProvider(null);
|
|
925
|
+
endAction();
|
|
926
|
+
return;
|
|
927
|
+
}
|
|
928
|
+
updateEvent.mutate(
|
|
929
|
+
{
|
|
930
|
+
id: event.id,
|
|
931
|
+
accountEmail: event.accountEmail,
|
|
932
|
+
...updates,
|
|
933
|
+
...guestNotification,
|
|
934
|
+
},
|
|
935
|
+
{
|
|
936
|
+
onSuccess: () => toast(t("eventForm.googleMeetAdded")),
|
|
937
|
+
onError: () => toast.error(t("eventForm.googleMeetAddFailed")),
|
|
938
|
+
onSettled: () => {
|
|
939
|
+
setPendingVideoProvider(null);
|
|
940
|
+
endAction();
|
|
941
|
+
},
|
|
942
|
+
},
|
|
943
|
+
);
|
|
944
|
+
} catch {
|
|
838
945
|
setPendingVideoProvider(null);
|
|
839
|
-
|
|
946
|
+
endAction();
|
|
840
947
|
}
|
|
841
|
-
updateEvent.mutate(
|
|
842
|
-
{
|
|
843
|
-
id: event.id,
|
|
844
|
-
accountEmail: event.accountEmail,
|
|
845
|
-
...updates,
|
|
846
|
-
...guestNotification,
|
|
847
|
-
},
|
|
848
|
-
{
|
|
849
|
-
onSuccess: () => toast(t("eventForm.googleMeetAdded")),
|
|
850
|
-
onError: () => toast.error(t("eventForm.googleMeetAddFailed")),
|
|
851
|
-
onSettled: () => setPendingVideoProvider(null),
|
|
852
|
-
},
|
|
853
|
-
);
|
|
854
948
|
})();
|
|
855
|
-
}, [
|
|
949
|
+
}, [
|
|
950
|
+
beginAction,
|
|
951
|
+
endAction,
|
|
952
|
+
event,
|
|
953
|
+
isDraft,
|
|
954
|
+
onDraftUpdate,
|
|
955
|
+
promptGuestNotification,
|
|
956
|
+
t,
|
|
957
|
+
updateEvent,
|
|
958
|
+
]);
|
|
856
959
|
|
|
857
960
|
const addZoomToConnectedEvent = useCallback(() => {
|
|
858
961
|
if (!event.id || updateEvent.isPending) return;
|
|
@@ -862,38 +965,57 @@ export function EventDetailPopover({
|
|
|
862
965
|
return;
|
|
863
966
|
}
|
|
864
967
|
|
|
968
|
+
if (!beginAction()) return;
|
|
865
969
|
setPendingVideoProvider("zoom");
|
|
866
970
|
void (async () => {
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
971
|
+
try {
|
|
972
|
+
const updates = { addZoom: true };
|
|
973
|
+
const guestNotification = await promptGuestNotification({
|
|
974
|
+
event,
|
|
975
|
+
action: "update",
|
|
976
|
+
updates,
|
|
977
|
+
});
|
|
978
|
+
if (!guestNotification) {
|
|
979
|
+
setPendingVideoProvider(null);
|
|
980
|
+
endAction();
|
|
981
|
+
return;
|
|
982
|
+
}
|
|
983
|
+
updateEvent.mutate(
|
|
984
|
+
{
|
|
985
|
+
id: event.id,
|
|
986
|
+
accountEmail: event.accountEmail,
|
|
987
|
+
...updates,
|
|
988
|
+
...guestNotification,
|
|
989
|
+
},
|
|
990
|
+
{
|
|
991
|
+
onSuccess: () => toast(t("eventForm.zoomAdded")),
|
|
992
|
+
onError: (error) =>
|
|
993
|
+
toast.error(
|
|
994
|
+
error instanceof Error
|
|
995
|
+
? error.message
|
|
996
|
+
: t("eventForm.zoomAddFailed"),
|
|
997
|
+
),
|
|
998
|
+
onSettled: () => {
|
|
999
|
+
setPendingVideoProvider(null);
|
|
1000
|
+
endAction();
|
|
1001
|
+
},
|
|
1002
|
+
},
|
|
1003
|
+
);
|
|
1004
|
+
} catch {
|
|
874
1005
|
setPendingVideoProvider(null);
|
|
875
|
-
|
|
1006
|
+
endAction();
|
|
876
1007
|
}
|
|
877
|
-
updateEvent.mutate(
|
|
878
|
-
{
|
|
879
|
-
id: event.id,
|
|
880
|
-
accountEmail: event.accountEmail,
|
|
881
|
-
...updates,
|
|
882
|
-
...guestNotification,
|
|
883
|
-
},
|
|
884
|
-
{
|
|
885
|
-
onSuccess: () => toast(t("eventForm.zoomAdded")),
|
|
886
|
-
onError: (error) =>
|
|
887
|
-
toast.error(
|
|
888
|
-
error instanceof Error
|
|
889
|
-
? error.message
|
|
890
|
-
: t("eventForm.zoomAddFailed"),
|
|
891
|
-
),
|
|
892
|
-
onSettled: () => setPendingVideoProvider(null),
|
|
893
|
-
},
|
|
894
|
-
);
|
|
895
1008
|
})();
|
|
896
|
-
}, [
|
|
1009
|
+
}, [
|
|
1010
|
+
beginAction,
|
|
1011
|
+
endAction,
|
|
1012
|
+
event,
|
|
1013
|
+
isDraft,
|
|
1014
|
+
onDraftUpdate,
|
|
1015
|
+
promptGuestNotification,
|
|
1016
|
+
t,
|
|
1017
|
+
updateEvent,
|
|
1018
|
+
]);
|
|
897
1019
|
|
|
898
1020
|
useEffect(() => {
|
|
899
1021
|
if (
|
|
@@ -928,6 +1050,7 @@ export function EventDetailPopover({
|
|
|
928
1050
|
toast.error(t("eventForm.zoomNotConfiguredDeployment"));
|
|
929
1051
|
return;
|
|
930
1052
|
}
|
|
1053
|
+
if (!beginAction()) return;
|
|
931
1054
|
|
|
932
1055
|
setZoomAfterConnectEventId(event.id);
|
|
933
1056
|
setStoredZoomAfterConnectEventId(event.id);
|
|
@@ -942,10 +1065,13 @@ export function EventDetailPopover({
|
|
|
942
1065
|
: t("eventForm.zoomConnectFailed"),
|
|
943
1066
|
);
|
|
944
1067
|
},
|
|
1068
|
+
onSettled: endAction,
|
|
945
1069
|
});
|
|
946
1070
|
}, [
|
|
947
1071
|
addZoomToConnectedEvent,
|
|
1072
|
+
beginAction,
|
|
948
1073
|
connectZoom,
|
|
1074
|
+
endAction,
|
|
949
1075
|
event,
|
|
950
1076
|
t,
|
|
951
1077
|
updateEvent,
|
|
@@ -1016,11 +1142,13 @@ export function EventDetailPopover({
|
|
|
1016
1142
|
onDraftUpdate?.(event.id, draftUpdate);
|
|
1017
1143
|
return;
|
|
1018
1144
|
}
|
|
1145
|
+
if (!beginAction()) return;
|
|
1019
1146
|
updateEvent.mutate(update, {
|
|
1020
1147
|
onError: () => toast.error(t("calendarView.failedUpdateEvent")),
|
|
1148
|
+
onSettled: endAction,
|
|
1021
1149
|
});
|
|
1022
1150
|
},
|
|
1023
|
-
[event, isDraft, onDraftUpdate, t, updateEvent],
|
|
1151
|
+
[beginAction, endAction, event, isDraft, onDraftUpdate, t, updateEvent],
|
|
1024
1152
|
);
|
|
1025
1153
|
|
|
1026
1154
|
const saveTimeValues = useCallback(
|
|
@@ -1514,6 +1642,17 @@ export function EventDetailPopover({
|
|
|
1514
1642
|
return () => setEventDetailPopoverOpen(token, false);
|
|
1515
1643
|
}, [popoverOpen]);
|
|
1516
1644
|
|
|
1645
|
+
const repeatControl = canEditRecurrence ? (
|
|
1646
|
+
<RepeatPicker
|
|
1647
|
+
compact
|
|
1648
|
+
preset={getRecurrencePreset(recurrenceRules)}
|
|
1649
|
+
referenceDate={event.start}
|
|
1650
|
+
recurrence={recurrenceRules}
|
|
1651
|
+
onChange={handleSaveRecurrence}
|
|
1652
|
+
onCustomChange={handleSaveCustomRecurrence}
|
|
1653
|
+
/>
|
|
1654
|
+
) : null;
|
|
1655
|
+
|
|
1517
1656
|
return (
|
|
1518
1657
|
<Popover open={popoverOpen} onOpenChange={handleOpenChange}>
|
|
1519
1658
|
<PopoverTrigger asChild onClick={handleTriggerClick}>
|
|
@@ -1524,7 +1663,7 @@ export function EventDetailPopover({
|
|
|
1524
1663
|
side={isMobile ? "bottom" : (popoverSide ?? "right")}
|
|
1525
1664
|
sideOffset={isMobile ? 6 : 8}
|
|
1526
1665
|
collisionPadding={12}
|
|
1527
|
-
className=
|
|
1666
|
+
className={`${eventPopoverShell} ${eventPopoverWidth}`}
|
|
1528
1667
|
onClick={(e) => e.stopPropagation()}
|
|
1529
1668
|
onOpenAutoFocus={(e) => {
|
|
1530
1669
|
e.preventDefault();
|
|
@@ -1553,8 +1692,8 @@ export function EventDetailPopover({
|
|
|
1553
1692
|
>
|
|
1554
1693
|
<TooltipProvider>
|
|
1555
1694
|
{/* Header */}
|
|
1556
|
-
<div className=
|
|
1557
|
-
<div className=
|
|
1695
|
+
<div className={eventPopoverHeader}>
|
|
1696
|
+
<div className={eventPopoverHeaderTitle}>
|
|
1558
1697
|
<span>
|
|
1559
1698
|
{isWorkingLocation
|
|
1560
1699
|
? t("eventForm.workingLocation")
|
|
@@ -1570,9 +1709,10 @@ export function EventDetailPopover({
|
|
|
1570
1709
|
<Button
|
|
1571
1710
|
variant="ghost"
|
|
1572
1711
|
size="icon"
|
|
1573
|
-
className=
|
|
1712
|
+
className={eventPopoverHeaderButton}
|
|
1574
1713
|
aria-label={t("eventForm.eventOptions")}
|
|
1575
1714
|
aria-expanded={showMoreOptions}
|
|
1715
|
+
aria-controls={`event-more-options-${event.id}`}
|
|
1576
1716
|
onClick={() => setShowMoreOptions((current) => !current)}
|
|
1577
1717
|
>
|
|
1578
1718
|
<IconDots className="size-4" />
|
|
@@ -1589,10 +1729,10 @@ export function EventDetailPopover({
|
|
|
1589
1729
|
<Button
|
|
1590
1730
|
variant="ghost"
|
|
1591
1731
|
size="icon"
|
|
1592
|
-
className=
|
|
1732
|
+
className={eventPopoverHeaderButton}
|
|
1593
1733
|
onClick={handlePinToSidebar}
|
|
1594
1734
|
>
|
|
1595
|
-
<IconLayoutSidebarRight className="
|
|
1735
|
+
<IconLayoutSidebarRight className="size-4" />
|
|
1596
1736
|
</Button>
|
|
1597
1737
|
</TooltipTrigger>
|
|
1598
1738
|
<TooltipContent side="bottom">
|
|
@@ -1603,17 +1743,17 @@ export function EventDetailPopover({
|
|
|
1603
1743
|
<Button
|
|
1604
1744
|
variant="ghost"
|
|
1605
1745
|
size="icon"
|
|
1606
|
-
className=
|
|
1746
|
+
className={eventPopoverHeaderButton}
|
|
1607
1747
|
onClick={() => handleOpenChange(false)}
|
|
1608
1748
|
>
|
|
1609
|
-
<IconX className="
|
|
1749
|
+
<IconX className="size-4" />
|
|
1610
1750
|
</Button>
|
|
1611
1751
|
</div>
|
|
1612
1752
|
</div>
|
|
1613
1753
|
|
|
1614
1754
|
{/* Content */}
|
|
1615
|
-
<div className="flex-1 overflow-y-auto">
|
|
1616
|
-
<div className="px-
|
|
1755
|
+
<div ref={detailsScrollRef} className="flex-1 overflow-y-auto">
|
|
1756
|
+
<div className="px-2 py-2">
|
|
1617
1757
|
{/* Title — always editable */}
|
|
1618
1758
|
{isEditingTitle && !isWorkingLocation ? (
|
|
1619
1759
|
<input
|
|
@@ -1657,11 +1797,11 @@ export function EventDetailPopover({
|
|
|
1657
1797
|
setIsEditingTitle(false);
|
|
1658
1798
|
}}
|
|
1659
1799
|
placeholder={t("eventForm.addTitle")}
|
|
1660
|
-
className="w-full
|
|
1800
|
+
className="w-full rounded-md bg-muted/40 px-2 py-1.5 font-normal text-foreground outline-none placeholder:text-muted-foreground/60 focus:ring-0"
|
|
1661
1801
|
/>
|
|
1662
1802
|
) : (
|
|
1663
1803
|
<h2
|
|
1664
|
-
className={`
|
|
1804
|
+
className={`rounded-md px-2 py-1.5 font-normal text-foreground ${!isOverlay && !isWorkingLocation ? "cursor-text hover:bg-muted/50" : ""}`}
|
|
1665
1805
|
onClick={() => {
|
|
1666
1806
|
if (isOverlay || isWorkingLocation) return;
|
|
1667
1807
|
setEditingTitle(getEditableEventTitle(event));
|
|
@@ -1673,6 +1813,8 @@ export function EventDetailPopover({
|
|
|
1673
1813
|
)}
|
|
1674
1814
|
</div>
|
|
1675
1815
|
|
|
1816
|
+
<div className={eventPopoverDivider} />
|
|
1817
|
+
|
|
1676
1818
|
<div className="px-4 space-y-1">
|
|
1677
1819
|
{(isDraft || (!isOverlay && event.source === "google")) && (
|
|
1678
1820
|
<EventCalendarSelect
|
|
@@ -1680,13 +1822,13 @@ export function EventDetailPopover({
|
|
|
1680
1822
|
isDraft ? event.accountEmail : selectedAccountEmail
|
|
1681
1823
|
}
|
|
1682
1824
|
onAccountChange={handleAccountChange}
|
|
1683
|
-
disabled={
|
|
1825
|
+
disabled={mutationPending}
|
|
1684
1826
|
/>
|
|
1685
1827
|
)}
|
|
1686
1828
|
|
|
1687
1829
|
{/* Time, date, timezone, and repeat stay editable in place. */}
|
|
1688
|
-
<div className="flex items-start gap-
|
|
1689
|
-
<IconClock className="mt-1
|
|
1830
|
+
<div className="flex items-start gap-2 rounded-md py-1.5">
|
|
1831
|
+
<IconClock className="mt-1 size-[18px] shrink-0 text-muted-foreground" />
|
|
1690
1832
|
<div className="min-w-0 flex-1">
|
|
1691
1833
|
{isWorkingLocation && (
|
|
1692
1834
|
<div className="mb-1 flex items-center gap-2">
|
|
@@ -1694,7 +1836,7 @@ export function EventDetailPopover({
|
|
|
1694
1836
|
id={`working-location-all-day-${event.id}`}
|
|
1695
1837
|
checked={event.allDay}
|
|
1696
1838
|
onCheckedChange={handleWorkingLocationAllDayChange}
|
|
1697
|
-
disabled={
|
|
1839
|
+
disabled={mutationPending}
|
|
1698
1840
|
/>
|
|
1699
1841
|
<Label
|
|
1700
1842
|
htmlFor={`working-location-all-day-${event.id}`}
|
|
@@ -1705,7 +1847,7 @@ export function EventDetailPopover({
|
|
|
1705
1847
|
</div>
|
|
1706
1848
|
)}
|
|
1707
1849
|
{event.allDay ? (
|
|
1708
|
-
<div className="flex flex-wrap items-center gap-1
|
|
1850
|
+
<div className="flex flex-wrap items-center gap-1">
|
|
1709
1851
|
{!isWorkingLocation && (
|
|
1710
1852
|
<span className="text-muted-foreground">
|
|
1711
1853
|
{t("eventForm.allDay")}
|
|
@@ -1730,6 +1872,7 @@ export function EventDetailPopover({
|
|
|
1730
1872
|
/>
|
|
1731
1873
|
</>
|
|
1732
1874
|
)}
|
|
1875
|
+
<span className="ml-auto">{repeatControl}</span>
|
|
1733
1876
|
</div>
|
|
1734
1877
|
) : (
|
|
1735
1878
|
<>
|
|
@@ -1767,11 +1910,11 @@ export function EventDetailPopover({
|
|
|
1767
1910
|
handleInlineTimeChange("endTime", value)
|
|
1768
1911
|
}
|
|
1769
1912
|
/>
|
|
1770
|
-
<span className="text-
|
|
1913
|
+
<span className="text-muted-foreground/70">
|
|
1771
1914
|
{formatDuration(event.start, event.end)}
|
|
1772
1915
|
</span>
|
|
1773
1916
|
</div>
|
|
1774
|
-
<div className="mt-0.5 flex flex-wrap items-center gap-1
|
|
1917
|
+
<div className="mt-0.5 flex flex-wrap items-center gap-1">
|
|
1775
1918
|
<DatePickerPopover
|
|
1776
1919
|
value={editDate}
|
|
1777
1920
|
label={t("eventForm.startDate")}
|
|
@@ -1791,7 +1934,8 @@ export function EventDetailPopover({
|
|
|
1791
1934
|
/>
|
|
1792
1935
|
</>
|
|
1793
1936
|
)}
|
|
1794
|
-
<span className="ml-auto">
|
|
1937
|
+
<span className="ml-auto flex items-center gap-1">
|
|
1938
|
+
{repeatControl}
|
|
1795
1939
|
<TimezonePickerPopover
|
|
1796
1940
|
compact
|
|
1797
1941
|
value={editTimezone}
|
|
@@ -1805,27 +1949,18 @@ export function EventDetailPopover({
|
|
|
1805
1949
|
</div>
|
|
1806
1950
|
</div>
|
|
1807
1951
|
|
|
1808
|
-
{canEditRecurrence && (
|
|
1809
|
-
<RepeatPicker
|
|
1810
|
-
preset={getRecurrencePreset(recurrenceRules)}
|
|
1811
|
-
referenceDate={event.start}
|
|
1812
|
-
recurrence={recurrenceRules}
|
|
1813
|
-
onChange={handleSaveRecurrence}
|
|
1814
|
-
onCustomChange={handleSaveCustomRecurrence}
|
|
1815
|
-
/>
|
|
1816
|
-
)}
|
|
1817
|
-
|
|
1818
1952
|
{!event.allDay && !isOverlay && !isWorkingLocation && (
|
|
1819
|
-
<div className="flex items-center gap-
|
|
1820
|
-
<div className="
|
|
1953
|
+
<div className="flex items-center gap-2 py-1">
|
|
1954
|
+
<div className="size-[18px] shrink-0" />
|
|
1821
1955
|
<Button
|
|
1822
1956
|
type="button"
|
|
1823
|
-
variant="
|
|
1957
|
+
variant="outline"
|
|
1824
1958
|
size="sm"
|
|
1825
|
-
className="h-
|
|
1959
|
+
className="h-[30px] flex-1 justify-center gap-1.5 px-2 font-medium"
|
|
1960
|
+
disabled={mutationPending}
|
|
1826
1961
|
onClick={() => setFindTimeOpen(true)}
|
|
1827
1962
|
>
|
|
1828
|
-
<IconCalendarTime className="
|
|
1963
|
+
<IconCalendarTime className="size-4" />
|
|
1829
1964
|
{t("eventForm.findTime")}
|
|
1830
1965
|
</Button>
|
|
1831
1966
|
</div>
|
|
@@ -1859,7 +1994,7 @@ export function EventDetailPopover({
|
|
|
1859
1994
|
isRecurring={isRecurringEvent}
|
|
1860
1995
|
isDraft={isDraft}
|
|
1861
1996
|
readOnly={isOverlay}
|
|
1862
|
-
disabled={
|
|
1997
|
+
disabled={mutationPending}
|
|
1863
1998
|
onSave={handleSaveWorkingLocation}
|
|
1864
1999
|
/>
|
|
1865
2000
|
)}
|
|
@@ -1868,7 +2003,7 @@ export function EventDetailPopover({
|
|
|
1868
2003
|
{!isWorkingLocation && (
|
|
1869
2004
|
<>
|
|
1870
2005
|
{/* Separator */}
|
|
1871
|
-
<div className=
|
|
2006
|
+
<div className={eventPopoverDivider} />
|
|
1872
2007
|
|
|
1873
2008
|
{/* Attendees — always shown */}
|
|
1874
2009
|
{event.attendees && event.attendees.length > 0 ? (
|
|
@@ -1882,8 +2017,8 @@ export function EventDetailPopover({
|
|
|
1882
2017
|
{/* Add guest input */}
|
|
1883
2018
|
{!isOverlay && (
|
|
1884
2019
|
<div className="px-4 py-1">
|
|
1885
|
-
<div className="flex items-center gap-
|
|
1886
|
-
<IconPlus className="
|
|
2020
|
+
<div className="flex items-center gap-2">
|
|
2021
|
+
<IconPlus className="size-[18px] shrink-0 text-muted-foreground/40" />
|
|
1887
2022
|
<AttendeeAutocomplete
|
|
1888
2023
|
selectedEmails={(event.attendees || []).map(
|
|
1889
2024
|
(attendee) => attendee.email,
|
|
@@ -1902,20 +2037,18 @@ export function EventDetailPopover({
|
|
|
1902
2037
|
{/* Research Meeting button */}
|
|
1903
2038
|
{event.attendees && event.attendees.length > 0 && (
|
|
1904
2039
|
<>
|
|
1905
|
-
<div className=
|
|
2040
|
+
<div className={eventPopoverDivider} />
|
|
1906
2041
|
<div className="px-4 py-1">
|
|
1907
2042
|
<ResearchMeetingButton event={event} />
|
|
1908
2043
|
</div>
|
|
1909
2044
|
</>
|
|
1910
2045
|
)}
|
|
1911
2046
|
|
|
1912
|
-
<
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
/>
|
|
1918
|
-
</div>
|
|
2047
|
+
<ExtensionSlot
|
|
2048
|
+
id="calendar.event-detail.bottom"
|
|
2049
|
+
context={buildEventDetailSlotContext(event)}
|
|
2050
|
+
className="my-2 border-t border-border/60 px-4 pt-2"
|
|
2051
|
+
/>
|
|
1919
2052
|
</>
|
|
1920
2053
|
)}
|
|
1921
2054
|
|
|
@@ -1923,21 +2056,21 @@ export function EventDetailPopover({
|
|
|
1923
2056
|
{!isWorkingLocation &&
|
|
1924
2057
|
(meetingLink ? (
|
|
1925
2058
|
<>
|
|
1926
|
-
<div className=
|
|
2059
|
+
<div className={eventPopoverDivider} />
|
|
1927
2060
|
<div className="px-4 py-1.5">
|
|
1928
2061
|
<a
|
|
1929
2062
|
href={meetingLink.url}
|
|
1930
2063
|
target="_blank"
|
|
1931
2064
|
rel="noopener noreferrer"
|
|
1932
|
-
className=
|
|
2065
|
+
className={`${eventPopoverPrimaryAction} relative bg-conference text-conference-foreground hover:bg-conference/90`}
|
|
1933
2066
|
>
|
|
1934
|
-
<IconVideo className="
|
|
2067
|
+
<IconVideo className="mr-2 size-4 opacity-80" />
|
|
1935
2068
|
<span>{getMeetingLabel(meetingLink.type, t)}</span>
|
|
1936
|
-
<span className="absolute right-
|
|
1937
|
-
<kbd className="text-
|
|
2069
|
+
<span className="absolute right-2 hidden items-center gap-1 opacity-70 sm:flex">
|
|
2070
|
+
<kbd className="inline-flex size-4 items-center justify-center rounded bg-conference-foreground/20 text-[11px] font-medium">
|
|
1938
2071
|
{shortcutModifierLabel()}
|
|
1939
2072
|
</kbd>
|
|
1940
|
-
<kbd className="inline-flex
|
|
2073
|
+
<kbd className="inline-flex size-4 items-center justify-center rounded bg-conference-foreground/20 text-[11px] font-medium">
|
|
1941
2074
|
J
|
|
1942
2075
|
</kbd>
|
|
1943
2076
|
</span>
|
|
@@ -1965,15 +2098,15 @@ export function EventDetailPopover({
|
|
|
1965
2098
|
</>
|
|
1966
2099
|
) : pendingConferenceProvider ? (
|
|
1967
2100
|
<>
|
|
1968
|
-
<div className=
|
|
2101
|
+
<div className={eventPopoverDivider} />
|
|
1969
2102
|
<div className="px-4 py-1.5">
|
|
1970
|
-
<div className="flex w-full items-center rounded-
|
|
2103
|
+
<div className="flex h-[30px] w-full items-center rounded-md bg-conference pl-2.5 pr-1 text-conference-foreground">
|
|
1971
2104
|
{pendingConferenceProvider === "zoom" ? (
|
|
1972
|
-
<IconBrandZoom className="mr-2
|
|
2105
|
+
<IconBrandZoom className="mr-2 size-4 opacity-90" />
|
|
1973
2106
|
) : (
|
|
1974
|
-
<IconVideo className="mr-2
|
|
2107
|
+
<IconVideo className="mr-2 size-4 opacity-90" />
|
|
1975
2108
|
)}
|
|
1976
|
-
<span className="
|
|
2109
|
+
<span className="font-medium">
|
|
1977
2110
|
{pendingConferenceProvider === "zoom"
|
|
1978
2111
|
? t("eventForm.zoom")
|
|
1979
2112
|
: t("eventForm.googleMeet")}
|
|
@@ -1986,7 +2119,7 @@ export function EventDetailPopover({
|
|
|
1986
2119
|
? t("eventForm.zoom")
|
|
1987
2120
|
: t("eventForm.googleMeet")
|
|
1988
2121
|
}`}
|
|
1989
|
-
className="ml-auto rounded-md p-1 text-
|
|
2122
|
+
className="ml-auto rounded-md p-1 text-conference-foreground/70 transition-colors hover:bg-conference-foreground/15 hover:text-conference-foreground"
|
|
1990
2123
|
>
|
|
1991
2124
|
<IconX className="h-4 w-4" />
|
|
1992
2125
|
</button>
|
|
@@ -2006,7 +2139,7 @@ export function EventDetailPopover({
|
|
|
2006
2139
|
) : editingField === "meetingLink" ? (
|
|
2007
2140
|
<div className="px-4 py-1.5">
|
|
2008
2141
|
<div className="flex items-center gap-2">
|
|
2009
|
-
<IconVideo className="
|
|
2142
|
+
<IconVideo className="size-[18px] shrink-0 text-muted-foreground" />
|
|
2010
2143
|
<input
|
|
2011
2144
|
ref={meetingLinkRef}
|
|
2012
2145
|
value={editMeetingLink}
|
|
@@ -2025,7 +2158,7 @@ export function EventDetailPopover({
|
|
|
2025
2158
|
}}
|
|
2026
2159
|
onBlur={handleSaveMeetingLink}
|
|
2027
2160
|
placeholder={t("eventForm.pasteMeetingLink")}
|
|
2028
|
-
className="flex-1 bg-transparent border-none outline-none text-
|
|
2161
|
+
className="flex-1 bg-transparent border-none outline-none text-foreground placeholder:text-muted-foreground/40 focus:ring-0"
|
|
2029
2162
|
/>
|
|
2030
2163
|
</div>
|
|
2031
2164
|
</div>
|
|
@@ -2036,8 +2169,8 @@ export function EventDetailPopover({
|
|
|
2036
2169
|
type="button"
|
|
2037
2170
|
variant="outline"
|
|
2038
2171
|
size="sm"
|
|
2039
|
-
className="h-
|
|
2040
|
-
disabled={
|
|
2172
|
+
className="h-[30px] flex-1 justify-center gap-1.5 px-2 text-xs"
|
|
2173
|
+
disabled={mutationPending}
|
|
2041
2174
|
onClick={handleAddGoogleMeet}
|
|
2042
2175
|
>
|
|
2043
2176
|
<IconVideo className="h-3.5 w-3.5" />
|
|
@@ -2047,10 +2180,8 @@ export function EventDetailPopover({
|
|
|
2047
2180
|
type="button"
|
|
2048
2181
|
variant="outline"
|
|
2049
2182
|
size="sm"
|
|
2050
|
-
className="h-
|
|
2051
|
-
disabled={
|
|
2052
|
-
updateEvent.isPending || connectZoom.isPending
|
|
2053
|
-
}
|
|
2183
|
+
className="h-[30px] flex-1 justify-center gap-1.5 px-2 text-xs"
|
|
2184
|
+
disabled={mutationPending}
|
|
2054
2185
|
onClick={handleAddZoom}
|
|
2055
2186
|
>
|
|
2056
2187
|
<IconBrandZoom className="h-3.5 w-3.5" />
|
|
@@ -2060,7 +2191,7 @@ export function EventDetailPopover({
|
|
|
2060
2191
|
type="button"
|
|
2061
2192
|
variant="ghost"
|
|
2062
2193
|
size="sm"
|
|
2063
|
-
className="h-
|
|
2194
|
+
className="h-[30px] flex-1 justify-center gap-1.5 px-2 text-xs text-muted-foreground"
|
|
2064
2195
|
onClick={() => setEditingField("meetingLink")}
|
|
2065
2196
|
>
|
|
2066
2197
|
<IconPlus className="h-3.5 w-3.5" />
|
|
@@ -2072,7 +2203,7 @@ export function EventDetailPopover({
|
|
|
2072
2203
|
) : (
|
|
2073
2204
|
<button
|
|
2074
2205
|
type="button"
|
|
2075
|
-
className="flex w-full items-center gap-
|
|
2206
|
+
className="flex w-full items-center gap-2 rounded-md px-4 py-1.5 text-left text-muted-foreground/60 transition-colors hover:bg-muted/50 hover:text-foreground"
|
|
2076
2207
|
onClick={() => setShowConferencingOptions(true)}
|
|
2077
2208
|
>
|
|
2078
2209
|
<IconVideo className="h-4 w-4 shrink-0" />
|
|
@@ -2089,12 +2220,12 @@ export function EventDetailPopover({
|
|
|
2089
2220
|
editingField === "attachments" ||
|
|
2090
2221
|
(event.attachments?.length ?? 0) > 0) && (
|
|
2091
2222
|
<>
|
|
2092
|
-
<div className=
|
|
2223
|
+
<div className={eventPopoverDivider} />
|
|
2093
2224
|
{editingField === "attachments" ? (
|
|
2094
2225
|
<div className="px-4 py-1.5">
|
|
2095
|
-
<div className="mb-2 flex items-center gap-
|
|
2096
|
-
<IconPaperclip className="
|
|
2097
|
-
<span className="
|
|
2226
|
+
<div className="mb-2 flex items-center gap-2">
|
|
2227
|
+
<IconPaperclip className="size-[18px] shrink-0 text-muted-foreground" />
|
|
2228
|
+
<span className="font-medium text-foreground">
|
|
2098
2229
|
{t("eventForm.attachments")}
|
|
2099
2230
|
</span>
|
|
2100
2231
|
</div>
|
|
@@ -2120,6 +2251,7 @@ export function EventDetailPopover({
|
|
|
2120
2251
|
<Button
|
|
2121
2252
|
size="sm"
|
|
2122
2253
|
className="h-6 text-xs"
|
|
2254
|
+
disabled={mutationPending}
|
|
2123
2255
|
onClick={handleSaveAttachments}
|
|
2124
2256
|
>
|
|
2125
2257
|
{t("eventForm.save")}
|
|
@@ -2134,7 +2266,7 @@ export function EventDetailPopover({
|
|
|
2134
2266
|
href={att.fileUrl}
|
|
2135
2267
|
target="_blank"
|
|
2136
2268
|
rel="noopener noreferrer"
|
|
2137
|
-
className="flex items-center gap-2.5 rounded-lg px-2 py-1.5
|
|
2269
|
+
className="flex items-center gap-2.5 rounded-lg px-2 py-1.5 hover:bg-muted/50 group"
|
|
2138
2270
|
>
|
|
2139
2271
|
{att.iconLink ? (
|
|
2140
2272
|
<img
|
|
@@ -2143,7 +2275,7 @@ export function EventDetailPopover({
|
|
|
2143
2275
|
className="h-4 w-4 shrink-0"
|
|
2144
2276
|
/>
|
|
2145
2277
|
) : (
|
|
2146
|
-
<IconFileText className="
|
|
2278
|
+
<IconFileText className="size-[18px] shrink-0 text-muted-foreground" />
|
|
2147
2279
|
)}
|
|
2148
2280
|
<span className="truncate text-foreground">
|
|
2149
2281
|
{att.title}
|
|
@@ -2153,7 +2285,7 @@ export function EventDetailPopover({
|
|
|
2153
2285
|
))}
|
|
2154
2286
|
<button
|
|
2155
2287
|
type="button"
|
|
2156
|
-
className="flex items-center gap-2.5 rounded-lg px-2 py-1.5 text-
|
|
2288
|
+
className="flex items-center gap-2.5 rounded-lg px-2 py-1.5 text-muted-foreground hover:bg-muted/50 hover:text-foreground"
|
|
2157
2289
|
onClick={() => {
|
|
2158
2290
|
setEditAttachments(
|
|
2159
2291
|
attachmentsToDrafts(event.attachments),
|
|
@@ -2168,13 +2300,13 @@ export function EventDetailPopover({
|
|
|
2168
2300
|
) : (
|
|
2169
2301
|
<button
|
|
2170
2302
|
type="button"
|
|
2171
|
-
className="flex w-full items-center gap-
|
|
2303
|
+
className="flex w-full items-center gap-2 px-4 py-1.5 text-muted-foreground/60 hover:bg-muted/50 hover:text-foreground"
|
|
2172
2304
|
onClick={() => {
|
|
2173
2305
|
setEditAttachments([attachmentsToDrafts(undefined)[0]]);
|
|
2174
2306
|
setEditingField("attachments");
|
|
2175
2307
|
}}
|
|
2176
2308
|
>
|
|
2177
|
-
<IconPaperclip className="
|
|
2309
|
+
<IconPaperclip className="size-[18px] shrink-0 text-muted-foreground/40" />
|
|
2178
2310
|
{t("eventForm.addAttachment")}
|
|
2179
2311
|
</button>
|
|
2180
2312
|
)}
|
|
@@ -2184,10 +2316,10 @@ export function EventDetailPopover({
|
|
|
2184
2316
|
{!isWorkingLocation && (
|
|
2185
2317
|
<>
|
|
2186
2318
|
{/* Location — always shown, editable */}
|
|
2187
|
-
<div className=
|
|
2319
|
+
<div className={eventPopoverDivider} />
|
|
2188
2320
|
{editingField === "location" ? (
|
|
2189
|
-
<div className="flex items-start gap-
|
|
2190
|
-
<IconMapPin className="mt-1.5
|
|
2321
|
+
<div className="flex items-start gap-2 px-4 py-1.5">
|
|
2322
|
+
<IconMapPin className="mt-1.5 size-[18px] shrink-0 text-muted-foreground" />
|
|
2191
2323
|
<input
|
|
2192
2324
|
ref={locationRef}
|
|
2193
2325
|
value={editLocation}
|
|
@@ -2206,18 +2338,18 @@ export function EventDetailPopover({
|
|
|
2206
2338
|
}}
|
|
2207
2339
|
onBlur={handleSaveLocation}
|
|
2208
2340
|
placeholder={t("eventForm.addLocation")}
|
|
2209
|
-
className="flex-1 bg-transparent border-none outline-none text-
|
|
2341
|
+
className="flex-1 bg-transparent border-none outline-none text-foreground placeholder:text-muted-foreground/40 focus:ring-0"
|
|
2210
2342
|
/>
|
|
2211
2343
|
</div>
|
|
2212
2344
|
) : event.location && !locationIsMeetingLink ? (
|
|
2213
2345
|
<div
|
|
2214
|
-
className={`flex items-start gap-
|
|
2346
|
+
className={`flex items-start gap-2 px-4 py-1.5 ${!isOverlay ? "cursor-pointer hover:bg-muted/50 rounded-md" : ""}`}
|
|
2215
2347
|
onClick={() => {
|
|
2216
2348
|
if (isOverlay) return;
|
|
2217
2349
|
setEditingField("location");
|
|
2218
2350
|
}}
|
|
2219
2351
|
>
|
|
2220
|
-
<IconMapPin className="mt-0.5
|
|
2352
|
+
<IconMapPin className="mt-0.5 size-[18px] shrink-0 text-muted-foreground" />
|
|
2221
2353
|
{locationIsUrl ? (
|
|
2222
2354
|
<Tooltip>
|
|
2223
2355
|
<TooltipTrigger asChild>
|
|
@@ -2225,7 +2357,7 @@ export function EventDetailPopover({
|
|
|
2225
2357
|
href={event.location}
|
|
2226
2358
|
target="_blank"
|
|
2227
2359
|
rel="noopener noreferrer"
|
|
2228
|
-
className="text-
|
|
2360
|
+
className="text-primary hover:underline truncate block max-w-full"
|
|
2229
2361
|
onClick={(e) => e.stopPropagation()}
|
|
2230
2362
|
>
|
|
2231
2363
|
{event.location}
|
|
@@ -2234,21 +2366,21 @@ export function EventDetailPopover({
|
|
|
2234
2366
|
<TooltipContent>{event.location}</TooltipContent>
|
|
2235
2367
|
</Tooltip>
|
|
2236
2368
|
) : (
|
|
2237
|
-
<span className="text-
|
|
2369
|
+
<span className="text-muted-foreground">
|
|
2238
2370
|
{event.location}
|
|
2239
2371
|
</span>
|
|
2240
2372
|
)}
|
|
2241
2373
|
</div>
|
|
2242
2374
|
) : locationIsMeetingLink && meetingLink ? (
|
|
2243
2375
|
<>
|
|
2244
|
-
<div className="flex items-start gap-
|
|
2245
|
-
<IconVideo className="mt-0.5
|
|
2376
|
+
<div className="flex items-start gap-2 px-4 py-1.5 rounded-md">
|
|
2377
|
+
<IconVideo className="mt-0.5 size-[18px] shrink-0 text-muted-foreground" />
|
|
2246
2378
|
<div className="min-w-0">
|
|
2247
2379
|
<a
|
|
2248
2380
|
href={meetingLink.url}
|
|
2249
2381
|
target="_blank"
|
|
2250
2382
|
rel="noopener noreferrer"
|
|
2251
|
-
className="block max-w-full truncate text-
|
|
2383
|
+
className="block max-w-full truncate text-primary hover:underline"
|
|
2252
2384
|
>
|
|
2253
2385
|
{getMeetingLabel(meetingLink.type, t)}
|
|
2254
2386
|
</a>
|
|
@@ -2259,14 +2391,14 @@ export function EventDetailPopover({
|
|
|
2259
2391
|
</div>
|
|
2260
2392
|
{!isOverlay && (
|
|
2261
2393
|
<div
|
|
2262
|
-
className="flex items-center gap-
|
|
2394
|
+
className="flex items-center gap-2 px-4 py-1.5 cursor-pointer hover:bg-muted/50 rounded-md"
|
|
2263
2395
|
onClick={() => {
|
|
2264
2396
|
setEditLocation(editableLocationValue);
|
|
2265
2397
|
setEditingField("location");
|
|
2266
2398
|
}}
|
|
2267
2399
|
>
|
|
2268
|
-
<IconMapPin className="
|
|
2269
|
-
<span className="text-
|
|
2400
|
+
<IconMapPin className="size-[18px] shrink-0 text-muted-foreground/40" />
|
|
2401
|
+
<span className="text-muted-foreground/40">
|
|
2270
2402
|
{t("eventForm.addLocation")}
|
|
2271
2403
|
</span>
|
|
2272
2404
|
</div>
|
|
@@ -2274,7 +2406,7 @@ export function EventDetailPopover({
|
|
|
2274
2406
|
</>
|
|
2275
2407
|
) : !isOverlay ? (
|
|
2276
2408
|
<div
|
|
2277
|
-
className="flex items-center gap-
|
|
2409
|
+
className="flex items-center gap-2 px-4 py-1.5 cursor-pointer hover:bg-muted/50 rounded-md"
|
|
2278
2410
|
onClick={() => {
|
|
2279
2411
|
setEditLocation(
|
|
2280
2412
|
locationIsMeetingLink ? "" : editableLocationValue,
|
|
@@ -2282,8 +2414,8 @@ export function EventDetailPopover({
|
|
|
2282
2414
|
setEditingField("location");
|
|
2283
2415
|
}}
|
|
2284
2416
|
>
|
|
2285
|
-
<IconMapPin className="
|
|
2286
|
-
<span className="text-
|
|
2417
|
+
<IconMapPin className="size-[18px] shrink-0 text-muted-foreground/40" />
|
|
2418
|
+
<span className="text-muted-foreground/40">
|
|
2287
2419
|
{t("eventForm.addLocation")}
|
|
2288
2420
|
</span>
|
|
2289
2421
|
</div>
|
|
@@ -2295,8 +2427,8 @@ export function EventDetailPopover({
|
|
|
2295
2427
|
{!isWorkingLocation && (!isOverlay || event.description) && (
|
|
2296
2428
|
<>
|
|
2297
2429
|
<div className="px-4 py-1.5">
|
|
2298
|
-
<div className="flex items-start gap-
|
|
2299
|
-
<IconAlignLeft className="mt-1.5
|
|
2430
|
+
<div className="flex items-start gap-2">
|
|
2431
|
+
<IconAlignLeft className="mt-1.5 size-[18px] shrink-0 text-muted-foreground" />
|
|
2300
2432
|
<div className="min-w-0 flex-1">
|
|
2301
2433
|
{isOverlay ? (
|
|
2302
2434
|
event.description ? (
|
|
@@ -2325,7 +2457,7 @@ export function EventDetailPopover({
|
|
|
2325
2457
|
) : (
|
|
2326
2458
|
<button
|
|
2327
2459
|
type="button"
|
|
2328
|
-
className="rounded-md text-left text-
|
|
2460
|
+
className="rounded-md text-left text-muted-foreground/60 transition-colors hover:text-foreground"
|
|
2329
2461
|
onClick={() => setEditingField("description")}
|
|
2330
2462
|
>
|
|
2331
2463
|
{t("eventForm.description")}
|
|
@@ -2341,11 +2473,11 @@ export function EventDetailPopover({
|
|
|
2341
2473
|
{!isWorkingLocation &&
|
|
2342
2474
|
(!isOverlay && editingField === "reminders" ? (
|
|
2343
2475
|
<>
|
|
2344
|
-
<div className=
|
|
2476
|
+
<div className={eventPopoverDivider} />
|
|
2345
2477
|
<div className="px-4 py-1.5">
|
|
2346
|
-
<div className="mb-2 flex items-center gap-
|
|
2347
|
-
<IconBell className="
|
|
2348
|
-
<span className="
|
|
2478
|
+
<div className="mb-2 flex items-center gap-2">
|
|
2479
|
+
<IconBell className="size-[18px] shrink-0 text-muted-foreground" />
|
|
2480
|
+
<span className="font-medium text-foreground">
|
|
2349
2481
|
{t("eventForm.eventAlerts")}
|
|
2350
2482
|
</span>
|
|
2351
2483
|
</div>
|
|
@@ -2373,6 +2505,7 @@ export function EventDetailPopover({
|
|
|
2373
2505
|
<Button
|
|
2374
2506
|
size="sm"
|
|
2375
2507
|
className="h-6 text-xs"
|
|
2508
|
+
disabled={mutationPending}
|
|
2376
2509
|
onClick={handleSaveReminders}
|
|
2377
2510
|
>
|
|
2378
2511
|
{t("eventForm.save")}
|
|
@@ -2382,12 +2515,12 @@ export function EventDetailPopover({
|
|
|
2382
2515
|
</>
|
|
2383
2516
|
) : event.reminders && event.reminders.length > 0 ? (
|
|
2384
2517
|
<>
|
|
2385
|
-
<div className=
|
|
2386
|
-
<div className="flex items-start gap-
|
|
2387
|
-
<IconBell className="mt-0.5
|
|
2518
|
+
<div className={eventPopoverDivider} />
|
|
2519
|
+
<div className="flex items-start gap-2 px-4 py-1.5">
|
|
2520
|
+
<IconBell className="mt-0.5 size-[18px] shrink-0 text-muted-foreground" />
|
|
2388
2521
|
<div className="space-y-0.5">
|
|
2389
2522
|
{event.reminders.map((r, i) => (
|
|
2390
|
-
<div key={i} className="text-
|
|
2523
|
+
<div key={i} className="text-muted-foreground">
|
|
2391
2524
|
{formatReminderText(r.minutes)}
|
|
2392
2525
|
</div>
|
|
2393
2526
|
))}
|
|
@@ -2401,11 +2534,14 @@ export function EventDetailPopover({
|
|
|
2401
2534
|
(!isOverlay ? (
|
|
2402
2535
|
showMoreOptions ? (
|
|
2403
2536
|
<>
|
|
2404
|
-
<div className=
|
|
2405
|
-
<div
|
|
2537
|
+
<div className={eventPopoverDivider} />
|
|
2538
|
+
<div
|
|
2539
|
+
id={`event-more-options-${event.id}`}
|
|
2540
|
+
className="px-4 py-1.5"
|
|
2541
|
+
>
|
|
2406
2542
|
<div className="grid grid-cols-3 gap-2">
|
|
2407
2543
|
<div className="space-y-1">
|
|
2408
|
-
<span className="text-
|
|
2544
|
+
<span className="text-xs text-muted-foreground">
|
|
2409
2545
|
{t("eventForm.showAs")}
|
|
2410
2546
|
</span>
|
|
2411
2547
|
<Select
|
|
@@ -2415,9 +2551,9 @@ export function EventDetailPopover({
|
|
|
2415
2551
|
value as AvailabilityValue,
|
|
2416
2552
|
)
|
|
2417
2553
|
}
|
|
2418
|
-
disabled={
|
|
2554
|
+
disabled={mutationPending}
|
|
2419
2555
|
>
|
|
2420
|
-
<SelectTrigger className="h-
|
|
2556
|
+
<SelectTrigger className="h-[30px] text-xs">
|
|
2421
2557
|
<SelectValue />
|
|
2422
2558
|
</SelectTrigger>
|
|
2423
2559
|
<SelectContent>
|
|
@@ -2431,7 +2567,7 @@ export function EventDetailPopover({
|
|
|
2431
2567
|
</Select>
|
|
2432
2568
|
</div>
|
|
2433
2569
|
<div className="space-y-1">
|
|
2434
|
-
<span className="text-
|
|
2570
|
+
<span className="text-xs text-muted-foreground">
|
|
2435
2571
|
{t("eventForm.visibility")}
|
|
2436
2572
|
</span>
|
|
2437
2573
|
<Select
|
|
@@ -2439,9 +2575,9 @@ export function EventDetailPopover({
|
|
|
2439
2575
|
onValueChange={(value) =>
|
|
2440
2576
|
handleVisibilityChange(value as VisibilityValue)
|
|
2441
2577
|
}
|
|
2442
|
-
disabled={
|
|
2578
|
+
disabled={mutationPending}
|
|
2443
2579
|
>
|
|
2444
|
-
<SelectTrigger className="h-
|
|
2580
|
+
<SelectTrigger className="h-[30px] text-xs">
|
|
2445
2581
|
<SelectValue />
|
|
2446
2582
|
</SelectTrigger>
|
|
2447
2583
|
<SelectContent>
|
|
@@ -2458,7 +2594,7 @@ export function EventDetailPopover({
|
|
|
2458
2594
|
</Select>
|
|
2459
2595
|
</div>
|
|
2460
2596
|
<div className="space-y-1">
|
|
2461
|
-
<span className="text-
|
|
2597
|
+
<span className="text-xs text-muted-foreground">
|
|
2462
2598
|
{t("eventForm.alerts")}
|
|
2463
2599
|
</span>
|
|
2464
2600
|
<Select
|
|
@@ -2466,9 +2602,9 @@ export function EventDetailPopover({
|
|
|
2466
2602
|
onValueChange={(value) =>
|
|
2467
2603
|
handleReminderChange(value as ReminderValue)
|
|
2468
2604
|
}
|
|
2469
|
-
disabled={
|
|
2605
|
+
disabled={mutationPending}
|
|
2470
2606
|
>
|
|
2471
|
-
<SelectTrigger className="h-
|
|
2607
|
+
<SelectTrigger className="h-[30px] text-xs">
|
|
2472
2608
|
<SelectValue />
|
|
2473
2609
|
</SelectTrigger>
|
|
2474
2610
|
<SelectContent>
|
|
@@ -2497,8 +2633,8 @@ export function EventDetailPopover({
|
|
|
2497
2633
|
) : null
|
|
2498
2634
|
) : event.status || event.visibility ? (
|
|
2499
2635
|
<>
|
|
2500
|
-
<div className=
|
|
2501
|
-
<div className="flex items-center gap-
|
|
2636
|
+
<div className={eventPopoverDivider} />
|
|
2637
|
+
<div className="flex items-center gap-2 px-4 py-1.5 text-muted-foreground">
|
|
2502
2638
|
<div className="h-4 w-4 shrink-0" />
|
|
2503
2639
|
<span>
|
|
2504
2640
|
{event.transparency === "transparent"
|
|
@@ -2515,14 +2651,14 @@ export function EventDetailPopover({
|
|
|
2515
2651
|
{/* Overlay person badge */}
|
|
2516
2652
|
{event.overlayEmail && (
|
|
2517
2653
|
<>
|
|
2518
|
-
<div className=
|
|
2519
|
-
<div className="flex items-center gap-
|
|
2654
|
+
<div className={eventPopoverDivider} />
|
|
2655
|
+
<div className="flex items-center gap-2 px-4 py-1.5">
|
|
2520
2656
|
<span
|
|
2521
2657
|
aria-hidden="true"
|
|
2522
2658
|
className="ml-1 size-2 shrink-0 rounded-full ring-1 ring-border"
|
|
2523
2659
|
style={{ backgroundColor: event.ownerColor }}
|
|
2524
2660
|
/>
|
|
2525
|
-
<span className="text-
|
|
2661
|
+
<span className="text-muted-foreground">
|
|
2526
2662
|
{t("eventForm.viewingOwnerCalendar", {
|
|
2527
2663
|
owner: ownerLabel,
|
|
2528
2664
|
})}
|
|
@@ -2541,7 +2677,8 @@ export function EventDetailPopover({
|
|
|
2541
2677
|
<Button
|
|
2542
2678
|
variant="ghost"
|
|
2543
2679
|
size="sm"
|
|
2544
|
-
className="text-
|
|
2680
|
+
className="h-[26px] text-xs text-destructive hover:bg-destructive/10 hover:text-destructive"
|
|
2681
|
+
disabled={mutationPending}
|
|
2545
2682
|
onClick={() => {
|
|
2546
2683
|
if (isDraft) onDraftDiscard?.(event.id);
|
|
2547
2684
|
else onDelete(event.id);
|
|
@@ -2555,7 +2692,7 @@ export function EventDetailPopover({
|
|
|
2555
2692
|
asChild
|
|
2556
2693
|
variant="outline"
|
|
2557
2694
|
size="sm"
|
|
2558
|
-
className="ml-auto gap-1.5
|
|
2695
|
+
className="ml-auto h-[26px] gap-1.5"
|
|
2559
2696
|
>
|
|
2560
2697
|
<a
|
|
2561
2698
|
href={event.htmlLink}
|
|
@@ -2570,7 +2707,7 @@ export function EventDetailPopover({
|
|
|
2570
2707
|
{isDraft && (
|
|
2571
2708
|
<Button
|
|
2572
2709
|
size="sm"
|
|
2573
|
-
className="ml-auto
|
|
2710
|
+
className="ml-auto h-[26px]"
|
|
2574
2711
|
disabled={!isWorkingLocationDraftReadyToCreate(event)}
|
|
2575
2712
|
onClick={handleCreateDraft}
|
|
2576
2713
|
>
|