@agent-native/core 0.176.1 → 0.176.2-nightly-20260831185956
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 +74 -17
- 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 +166 -41
- 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/collab/struct-routes.d.ts +1 -1
- 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/notifications/routes.d.ts +1 -1
- package/dist/oauth-tokens/store.js +6 -3
- package/dist/observability/routes.d.ts +3 -3
- 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/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-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 +29 -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/realtime-token.d.ts +1 -1
- 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/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
|
@@ -21,6 +21,8 @@ import {
|
|
|
21
21
|
getNudgeDelta,
|
|
22
22
|
getPanForZoomToCursor,
|
|
23
23
|
getResizeCursorForHandle,
|
|
24
|
+
quantizeCanvasPoint,
|
|
25
|
+
WHOLE_PIXEL_SNAP_STEP,
|
|
24
26
|
resizeFrameGroupFromDelta,
|
|
25
27
|
resizeFrameGroupToBounds,
|
|
26
28
|
resizeRotatedFrameFromDeltaWithSnap,
|
|
@@ -29,6 +31,7 @@ import {
|
|
|
29
31
|
screenToCanvasPoint,
|
|
30
32
|
type ArrowNudgeKey,
|
|
31
33
|
} from "@shared/canvas-math";
|
|
34
|
+
import { resolveLayoutGridSnapStep } from "@shared/layout-grid";
|
|
32
35
|
import {
|
|
33
36
|
appendPenNode,
|
|
34
37
|
clonePenPath,
|
|
@@ -197,6 +200,14 @@ const MAX_WHEEL_PAN_DELTA = 240;
|
|
|
197
200
|
* element every gesture frame by applyViewToDom. React supplies the same
|
|
198
201
|
* number as the var's fallback, so first paint and SSR are unaffected. */
|
|
199
202
|
const CHROME_SCALE_CSS_VAR = "--an-chrome-scale";
|
|
203
|
+
|
|
204
|
+
/** A grid line lives inside the scaled world layer, so it needs the chrome
|
|
205
|
+
* counter-scale to stay hairline instead of fattening as you zoom in. */
|
|
206
|
+
const LAYOUT_GRID_LINE_CSS = `calc(1px * var(${CHROME_SCALE_CSS_VAR}, 1))`;
|
|
207
|
+
|
|
208
|
+
/** Below this on-screen spacing the lines read as a tint, not a grid. Our own
|
|
209
|
+
* call: Figma zoom-gates only its pixel grid and always draws layout guides. */
|
|
210
|
+
const MIN_LAYOUT_GRID_SCREEN_PX = 10;
|
|
200
211
|
const PIXEL_GRID_ZOOM = 800;
|
|
201
212
|
|
|
202
213
|
function hasScreenChildLayers(content: string): boolean {
|
|
@@ -501,6 +512,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
501
512
|
frameToolDraws = "frame",
|
|
502
513
|
onDeleteSelection,
|
|
503
514
|
onNudgeSelection,
|
|
515
|
+
nudgeAmounts,
|
|
516
|
+
layoutGrids,
|
|
504
517
|
onZoomChange,
|
|
505
518
|
renderScreenContent,
|
|
506
519
|
renderBreakpointContent,
|
|
@@ -580,6 +593,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
580
593
|
const onGeometryChangeRef = useRef(onGeometryChange);
|
|
581
594
|
const onGeometryCommitRef = useRef(onGeometryCommit);
|
|
582
595
|
const onNudgeSelectionRef = useRef(onNudgeSelection);
|
|
596
|
+
const nudgeAmountsRef = useRef(nudgeAmounts);
|
|
597
|
+
const layoutGridsRef = useRef(layoutGrids);
|
|
583
598
|
const screensRef = useRef(screens);
|
|
584
599
|
const [draftPrimitives, setDraftPrimitives] = useState<DraftPrimitive[]>([]);
|
|
585
600
|
const draftPrimitivesRef = useRef(draftPrimitives);
|
|
@@ -1177,6 +1192,44 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
1177
1192
|
[getScreenMetadata, metadataById, previewDeviceFrame],
|
|
1178
1193
|
);
|
|
1179
1194
|
|
|
1195
|
+
/** Every board<->content conversion must resolve the viewport here. A second
|
|
1196
|
+
* derivation drew cross-screen drop guides at 4x the hit-test geometry; the
|
|
1197
|
+
* live iframe size beats `resolveScreenMetadata`'s defaulted fallback. */
|
|
1198
|
+
const getFrameViewportSize = useCallback(
|
|
1199
|
+
(screen: ScreenFile): { width: number; height: number } => {
|
|
1200
|
+
const iframe = findCanvasIframeForScreen(
|
|
1201
|
+
surfaceRef.current,
|
|
1202
|
+
getActiveScreenIframeId(screen),
|
|
1203
|
+
boardFileId,
|
|
1204
|
+
);
|
|
1205
|
+
const metadata = getResolvedMetadata(screen);
|
|
1206
|
+
return {
|
|
1207
|
+
width: iframe?.clientWidth || metadata.width,
|
|
1208
|
+
height: iframe?.clientHeight || metadata.height,
|
|
1209
|
+
};
|
|
1210
|
+
},
|
|
1211
|
+
[boardFileId, getResolvedMetadata],
|
|
1212
|
+
);
|
|
1213
|
+
|
|
1214
|
+
/** Board-space step for a gesture inside `frameId`. Scaled because a 1280px
|
|
1215
|
+
* screen shown as a 320px card renders at 0.25, where snapping 8 board px
|
|
1216
|
+
* would commit a 32px content offset. */
|
|
1217
|
+
const resolveBoardSnapStepForFrame = useCallback(
|
|
1218
|
+
(frameId: string | null | undefined): number => {
|
|
1219
|
+
const grids = layoutGridsRef.current;
|
|
1220
|
+
if (!grids || !frameId) return WHOLE_PIXEL_SNAP_STEP;
|
|
1221
|
+
const contentStep = resolveLayoutGridSnapStep(grids, frameId);
|
|
1222
|
+
if (contentStep <= WHOLE_PIXEL_SNAP_STEP) return WHOLE_PIXEL_SNAP_STEP;
|
|
1223
|
+
const screen = screensRef.current.find((item) => item.id === frameId);
|
|
1224
|
+
const geometry = frameGeometryRef.current[frameId];
|
|
1225
|
+
if (!screen || !geometry?.width) return contentStep;
|
|
1226
|
+
const viewport = getFrameViewportSize(screen);
|
|
1227
|
+
const boardPerContentPx = geometry.width / Math.max(1, viewport.width);
|
|
1228
|
+
return contentStep * boardPerContentPx;
|
|
1229
|
+
},
|
|
1230
|
+
[getFrameViewportSize],
|
|
1231
|
+
);
|
|
1232
|
+
|
|
1180
1233
|
// Per-screen entry-object reuse for canvasFrames (PF21) and per-screen
|
|
1181
1234
|
// content-node cache for screenContentById (PF21). See the definitions of
|
|
1182
1235
|
// canvasFrames/screenContentById below for the full invalidation-key
|
|
@@ -1209,6 +1262,14 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
1209
1262
|
onNudgeSelectionRef.current = onNudgeSelection;
|
|
1210
1263
|
}, [onNudgeSelection]);
|
|
1211
1264
|
|
|
1265
|
+
useEffect(() => {
|
|
1266
|
+
nudgeAmountsRef.current = nudgeAmounts;
|
|
1267
|
+
}, [nudgeAmounts]);
|
|
1268
|
+
|
|
1269
|
+
useEffect(() => {
|
|
1270
|
+
layoutGridsRef.current = layoutGrids;
|
|
1271
|
+
}, [layoutGrids]);
|
|
1272
|
+
|
|
1212
1273
|
useEffect(() => {
|
|
1213
1274
|
onPrimitiveReparentRef.current = onPrimitiveReparent;
|
|
1214
1275
|
}, [onPrimitiveReparent]);
|
|
@@ -1878,6 +1939,32 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
1878
1939
|
[activeId, getSelectableFrameEntries],
|
|
1879
1940
|
);
|
|
1880
1941
|
|
|
1942
|
+
/** Container hit-tests want "which screen is this object in", and an object
|
|
1943
|
+
* flush against a frame edge misses on its own corner. */
|
|
1944
|
+
const frameGeometryCenter = useCallback(
|
|
1945
|
+
(geometry: FrameGeometry | undefined): Point => ({
|
|
1946
|
+
x: (geometry?.x ?? 0) + (geometry?.width ?? 0) / 2,
|
|
1947
|
+
y: (geometry?.y ?? 0) + (geometry?.height ?? 0) / 2,
|
|
1948
|
+
}),
|
|
1949
|
+
[],
|
|
1950
|
+
);
|
|
1951
|
+
|
|
1952
|
+
/** A screen frame is laid out by the board, which has no grid, so any screen
|
|
1953
|
+
* in the selection keeps the whole-pixel floor. */
|
|
1954
|
+
const resolveSnapStepForTargets = useCallback(
|
|
1955
|
+
(targetIds: readonly string[], center: Point): number => {
|
|
1956
|
+
if (!layoutGridsRef.current) return WHOLE_PIXEL_SNAP_STEP;
|
|
1957
|
+
const movesAFrame = targetIds.some(
|
|
1958
|
+
(targetId) => frameGeometryRef.current[targetId] !== undefined,
|
|
1959
|
+
);
|
|
1960
|
+
if (movesAFrame) return WHOLE_PIXEL_SNAP_STEP;
|
|
1961
|
+
return resolveBoardSnapStepForFrame(
|
|
1962
|
+
getFrameEntryAtPoint(center)?.id ?? null,
|
|
1963
|
+
);
|
|
1964
|
+
},
|
|
1965
|
+
[getFrameEntryAtPoint, resolveBoardSnapStepForFrame],
|
|
1966
|
+
);
|
|
1967
|
+
|
|
1881
1968
|
// Mirrors getFrameEntryAtPoint above, but hit-tests draft primitives
|
|
1882
1969
|
// instead of committed screens/frames — used by the alt-hover measurement
|
|
1883
1970
|
// (Figma parity) so hovering an uncommitted draft while a selection exists
|
|
@@ -2067,26 +2154,15 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2067
2154
|
crossScreenLastHitResultRef.current.clear();
|
|
2068
2155
|
};
|
|
2069
2156
|
|
|
2070
|
-
//
|
|
2071
|
-
//
|
|
2072
|
-
// clientWidth/clientHeight over resolveScreenMetadata's DEFAULTED
|
|
2073
|
-
// 1280x2560 fallback (used for screens — e.g. duplicated screens — with
|
|
2074
|
-
// no screenMetadata entry in designs.data). runHitTest and
|
|
2075
|
-
// getTargetLocalPoint already did this correctly; requestCrossScreenDropGuide
|
|
2076
|
-
// previously called getResolvedMetadata directly with no iframe fallback,
|
|
2077
|
-
// so the drawn guide used different (often wrong-by-4x) geometry than the
|
|
2078
|
-
// hit-test that produced it — guides rendered squashed/mispositioned for
|
|
2079
|
-
// any screen missing metadata. Centralizing here keeps all three call
|
|
2080
|
-
// sites in sync going forward.
|
|
2157
|
+
// Routed through getFrameViewportSize so this effect, the draft-commit
|
|
2158
|
+
// conversion, and grid snapping cannot disagree.
|
|
2081
2159
|
const getTargetViewportMetadata = (
|
|
2082
2160
|
targetScreen: (typeof screensRef.current)[number],
|
|
2083
2161
|
targetIframe: HTMLIFrameElement | null | undefined,
|
|
2084
|
-
): { width: number; height: number } =>
|
|
2085
|
-
|
|
2086
|
-
targetIframe
|
|
2087
|
-
|
|
2088
|
-
targetIframe?.clientHeight || getResolvedMetadata(targetScreen).height,
|
|
2089
|
-
});
|
|
2162
|
+
): { width: number; height: number } =>
|
|
2163
|
+
targetIframe?.clientWidth && targetIframe.clientHeight
|
|
2164
|
+
? { width: targetIframe.clientWidth, height: targetIframe.clientHeight }
|
|
2165
|
+
: getFrameViewportSize(targetScreen);
|
|
2090
2166
|
|
|
2091
2167
|
const runHitTest = (
|
|
2092
2168
|
candidate: CrossScreenDragTarget,
|
|
@@ -2983,6 +3059,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2983
3059
|
boardFrameGeometry,
|
|
2984
3060
|
boardSurfaceRenderGeometry,
|
|
2985
3061
|
getFrameEntryAtPoint,
|
|
3062
|
+
getFrameViewportSize,
|
|
2986
3063
|
getCanvasPoint,
|
|
2987
3064
|
getResolvedMetadata,
|
|
2988
3065
|
onCrossScreenElementDrop,
|
|
@@ -4755,8 +4832,16 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
4755
4832
|
e.preventDefault();
|
|
4756
4833
|
e.stopPropagation();
|
|
4757
4834
|
|
|
4758
|
-
|
|
4759
|
-
|
|
4835
|
+
// Quantized from the first sample: `clientPoint / zoom` is fractional at
|
|
4836
|
+
// every zoom but 100%, and a new object's x/y come straight off these.
|
|
4837
|
+
// The frame resolves from the raw point, which decides the step.
|
|
4838
|
+
const rawOriginCanvas = getCanvasPoint(e.clientX, e.clientY);
|
|
4839
|
+
const originFrameId = getFrameEntryAtPoint(rawOriginCanvas)?.id;
|
|
4840
|
+
const creationSnapStep = resolveBoardSnapStepForFrame(originFrameId);
|
|
4841
|
+
const originCanvas = quantizeCanvasPoint(
|
|
4842
|
+
rawOriginCanvas,
|
|
4843
|
+
creationSnapStep,
|
|
4844
|
+
);
|
|
4760
4845
|
const initialGeometry = getDraftPreviewGeometryForTool(
|
|
4761
4846
|
tool,
|
|
4762
4847
|
originCanvas,
|
|
@@ -4790,7 +4875,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
4790
4875
|
const handleMouseMove = (ev: MouseEvent) => {
|
|
4791
4876
|
const state = dragState.current;
|
|
4792
4877
|
if (!state || state.type !== "draft-create") return;
|
|
4793
|
-
const nextCanvas =
|
|
4878
|
+
const nextCanvas = quantizeCanvasPoint(
|
|
4879
|
+
getCanvasPoint(ev.clientX, ev.clientY),
|
|
4880
|
+
creationSnapStep,
|
|
4881
|
+
);
|
|
4794
4882
|
if (
|
|
4795
4883
|
!state.hasMoved &&
|
|
4796
4884
|
Math.hypot(
|
|
@@ -4830,7 +4918,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
4830
4918
|
return;
|
|
4831
4919
|
}
|
|
4832
4920
|
|
|
4833
|
-
const endCanvas =
|
|
4921
|
+
const endCanvas = quantizeCanvasPoint(
|
|
4922
|
+
getCanvasPoint(ev.clientX, ev.clientY),
|
|
4923
|
+
creationSnapStep,
|
|
4924
|
+
);
|
|
4834
4925
|
const canvasMoved =
|
|
4835
4926
|
Math.hypot(
|
|
4836
4927
|
endCanvas.x - state.originCanvas.x,
|
|
@@ -4944,6 +5035,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
4944
5035
|
installDragListeners,
|
|
4945
5036
|
onActiveToolChange,
|
|
4946
5037
|
onCreateScreenFrame,
|
|
5038
|
+
resolveBoardSnapStepForFrame,
|
|
4947
5039
|
toolProps,
|
|
4948
5040
|
],
|
|
4949
5041
|
);
|
|
@@ -5051,7 +5143,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
5051
5143
|
thresholdScreenPx: DEFAULT_SNAP_THRESHOLD_SCREEN_PX,
|
|
5052
5144
|
zoom: zoomRef.current,
|
|
5053
5145
|
bypass: ev.metaKey || ev.ctrlKey,
|
|
5054
|
-
|
|
5146
|
+
snapStep: resolveSnapStepForTargets(
|
|
5147
|
+
state.targetIds,
|
|
5148
|
+
frameGeometryCenter(movingEntries[0]?.geometry),
|
|
5149
|
+
),
|
|
5055
5150
|
lockedAxes: ev.shiftKey ? { x: dx === 0, y: dy === 0 } : undefined,
|
|
5056
5151
|
});
|
|
5057
5152
|
|
|
@@ -5268,6 +5363,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
5268
5363
|
updatePrimitiveDropTarget,
|
|
5269
5364
|
updateSelectedDraftIds,
|
|
5270
5365
|
updateSelectedIds,
|
|
5366
|
+
frameGeometryCenter,
|
|
5367
|
+
resolveSnapStepForTargets,
|
|
5271
5368
|
],
|
|
5272
5369
|
);
|
|
5273
5370
|
|
|
@@ -5378,6 +5475,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
5378
5475
|
thresholdScreenPx: DEFAULT_SNAP_THRESHOLD_SCREEN_PX,
|
|
5379
5476
|
zoom: zoomRef.current,
|
|
5380
5477
|
bypass: ev.metaKey || ev.ctrlKey,
|
|
5478
|
+
snapStep: resolveSnapStepForTargets(
|
|
5479
|
+
state.targetIds,
|
|
5480
|
+
frameGeometryCenter(resized.bounds),
|
|
5481
|
+
),
|
|
5381
5482
|
},
|
|
5382
5483
|
);
|
|
5383
5484
|
const resizedEntries = resizeFrameGroupToBounds(
|
|
@@ -5485,6 +5586,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
5485
5586
|
updateDraftPrimitivesRefOnly,
|
|
5486
5587
|
updateSelectedDraftIds,
|
|
5487
5588
|
updateSelectedIds,
|
|
5589
|
+
frameGeometryCenter,
|
|
5590
|
+
resolveSnapStepForTargets,
|
|
5488
5591
|
],
|
|
5489
5592
|
);
|
|
5490
5593
|
|
|
@@ -5861,7 +5964,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
5861
5964
|
thresholdScreenPx: DEFAULT_SNAP_THRESHOLD_SCREEN_PX,
|
|
5862
5965
|
zoom: zoomRef.current,
|
|
5863
5966
|
bypass: ev.metaKey || ev.ctrlKey,
|
|
5864
|
-
|
|
5967
|
+
snapStep: resolveSnapStepForTargets(
|
|
5968
|
+
state.targetIds,
|
|
5969
|
+
frameGeometryCenter(movingEntries[0]?.geometry),
|
|
5970
|
+
),
|
|
5865
5971
|
lockedAxes: ev.shiftKey ? { x: dx === 0, y: dy === 0 } : undefined,
|
|
5866
5972
|
});
|
|
5867
5973
|
|
|
@@ -6068,6 +6174,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
6068
6174
|
updatePrimitiveDropTarget,
|
|
6069
6175
|
updateSelectedDraftIds,
|
|
6070
6176
|
updateSelectedIds,
|
|
6177
|
+
frameGeometryCenter,
|
|
6178
|
+
resolveSnapStepForTargets,
|
|
6071
6179
|
],
|
|
6072
6180
|
);
|
|
6073
6181
|
|
|
@@ -6381,6 +6489,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
6381
6489
|
// K-scale (aspect-locked) resize away from its ratio — see
|
|
6382
6490
|
// computeAspectPreservingResizeSnap in canvas-math.ts.
|
|
6383
6491
|
preserveAspectRatio: lockAspectRatio,
|
|
6492
|
+
snapStep: resolveSnapStepForTargets(
|
|
6493
|
+
state.targetIds,
|
|
6494
|
+
frameGeometryCenter(resized.bounds),
|
|
6495
|
+
),
|
|
6384
6496
|
},
|
|
6385
6497
|
);
|
|
6386
6498
|
const resizedEntries = resizeFrameGroupToBounds(
|
|
@@ -6449,6 +6561,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
6449
6561
|
updateFrameGeometry,
|
|
6450
6562
|
updateFrameGeometryRefOnly,
|
|
6451
6563
|
updateSelectedIds,
|
|
6564
|
+
frameGeometryCenter,
|
|
6565
|
+
resolveSnapStepForTargets,
|
|
6452
6566
|
],
|
|
6453
6567
|
);
|
|
6454
6568
|
|
|
@@ -7585,12 +7699,19 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
7585
7699
|
event.preventDefault();
|
|
7586
7700
|
event.stopPropagation();
|
|
7587
7701
|
|
|
7588
|
-
const nudge = getNudgeDelta(
|
|
7589
|
-
|
|
7590
|
-
|
|
7591
|
-
|
|
7592
|
-
|
|
7593
|
-
|
|
7702
|
+
const nudge = getNudgeDelta(
|
|
7703
|
+
event.key,
|
|
7704
|
+
{
|
|
7705
|
+
altKey: event.altKey,
|
|
7706
|
+
ctrlKey: event.ctrlKey,
|
|
7707
|
+
metaKey: event.metaKey,
|
|
7708
|
+
shiftKey: event.shiftKey,
|
|
7709
|
+
},
|
|
7710
|
+
{
|
|
7711
|
+
baseStep: nudgeAmountsRef.current?.small,
|
|
7712
|
+
bigStep: nudgeAmountsRef.current?.big,
|
|
7713
|
+
},
|
|
7714
|
+
);
|
|
7594
7715
|
const movingFrameEntries = targetIds.map((targetId) => {
|
|
7595
7716
|
const origin = frameGeometryRef.current[targetId];
|
|
7596
7717
|
return {
|
|
@@ -8100,6 +8221,24 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
8100
8221
|
selectedLayerSelectorGroupsByScreen,
|
|
8101
8222
|
]);
|
|
8102
8223
|
|
|
8224
|
+
/** Uses the same content->board scale as the snap: lines that sit anywhere
|
|
8225
|
+
* other than where objects land are worse than no lines. 0 means no paint. */
|
|
8226
|
+
const layoutGridBoardSizeById = useMemo(() => {
|
|
8227
|
+
const sizes: Record<string, number> = {};
|
|
8228
|
+
if (!layoutGrids) return sizes;
|
|
8229
|
+
const scale = canvasZoom / 100;
|
|
8230
|
+
for (const { screen, metadata, geometry } of canvasFrames) {
|
|
8231
|
+
const grid = layoutGrids[screen.id];
|
|
8232
|
+
if (!grid?.visible || !geometry.width) continue;
|
|
8233
|
+
const viewport = getScreenPreviewViewport(metadata, geometry);
|
|
8234
|
+
const boardSize =
|
|
8235
|
+
grid.size * (geometry.width / Math.max(1, viewport.viewportWidth));
|
|
8236
|
+
if (boardSize * scale < MIN_LAYOUT_GRID_SCREEN_PX) continue;
|
|
8237
|
+
sizes[screen.id] = boardSize;
|
|
8238
|
+
}
|
|
8239
|
+
return sizes;
|
|
8240
|
+
}, [canvasFrames, canvasZoom, layoutGrids]);
|
|
8241
|
+
|
|
8103
8242
|
// Resolve a bounded live-context allocation from the committed camera. The
|
|
8104
8243
|
// overscan still makes imminent pan destinations live early; unlike the old
|
|
8105
8244
|
// one-way hasBeenVisible Set, however, the LRU pool cannot grow forever.
|
|
@@ -8523,6 +8662,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
8523
8662
|
return (
|
|
8524
8663
|
<Screen
|
|
8525
8664
|
key={screen.id}
|
|
8665
|
+
layoutGridBoardSize={layoutGridBoardSizeById[screen.id] ?? 0}
|
|
8526
8666
|
screen={screen}
|
|
8527
8667
|
metadata={metadata}
|
|
8528
8668
|
geometry={geometry}
|
|
@@ -9948,9 +10088,13 @@ interface ScreenProps {
|
|
|
9948
10088
|
) => void;
|
|
9949
10089
|
/** Item 8b — full-view entry for one breakpoint frame. */
|
|
9950
10090
|
onEditBreakpoint?: (screenId: string, widthPx: number) => void;
|
|
10091
|
+
/** Board-space cell size for this frame's layout grid, already converted
|
|
10092
|
+
* from content px. 0 means draw nothing. */
|
|
10093
|
+
layoutGridBoardSize?: number;
|
|
9951
10094
|
}
|
|
9952
10095
|
|
|
9953
10096
|
const Screen = memo(function Screen({
|
|
10097
|
+
layoutGridBoardSize = 0,
|
|
9954
10098
|
screen,
|
|
9955
10099
|
metadata,
|
|
9956
10100
|
geometry,
|
|
@@ -10384,6 +10528,18 @@ const Screen = memo(function Screen({
|
|
|
10384
10528
|
/>
|
|
10385
10529
|
))
|
|
10386
10530
|
)}
|
|
10531
|
+
{layoutGridBoardSize > 0 ? (
|
|
10532
|
+
<span
|
|
10533
|
+
data-layout-grid={screen.id}
|
|
10534
|
+
data-layout-grid-size={layoutGridBoardSize}
|
|
10535
|
+
aria-hidden="true"
|
|
10536
|
+
className="pointer-events-none absolute inset-0 z-10"
|
|
10537
|
+
style={{
|
|
10538
|
+
backgroundImage: `linear-gradient(to right, var(--design-editor-layout-grid-color) ${LAYOUT_GRID_LINE_CSS}, transparent ${LAYOUT_GRID_LINE_CSS}), linear-gradient(to bottom, var(--design-editor-layout-grid-color) ${LAYOUT_GRID_LINE_CSS}, transparent ${LAYOUT_GRID_LINE_CSS})`,
|
|
10539
|
+
backgroundSize: `${layoutGridBoardSize}px ${layoutGridBoardSize}px`,
|
|
10540
|
+
}}
|
|
10541
|
+
/>
|
|
10542
|
+
) : null}
|
|
10387
10543
|
{creationToolActive ? (
|
|
10388
10544
|
<span
|
|
10389
10545
|
className="pointer-events-auto absolute inset-0 z-20 cursor-crosshair"
|
|
@@ -89,16 +89,16 @@ export function ReviewCommentsPanel({
|
|
|
89
89
|
onValueChange={(value) => setScope(value as "screen" | "all")}
|
|
90
90
|
className="w-full"
|
|
91
91
|
>
|
|
92
|
-
<TabsList className="grid h-
|
|
92
|
+
<TabsList className="grid min-h-[var(--design-control-height)] w-full grid-cols-2 rounded-md bg-muted p-0.5">
|
|
93
93
|
<TabsTrigger
|
|
94
94
|
value="screen"
|
|
95
|
-
className="design-sidebar-section-title h-
|
|
95
|
+
className="design-sidebar-section-title min-h-[var(--design-control-height)] px-2"
|
|
96
96
|
>
|
|
97
97
|
{t("review.thisScreen")}
|
|
98
98
|
</TabsTrigger>
|
|
99
99
|
<TabsTrigger
|
|
100
100
|
value="all"
|
|
101
|
-
className="design-sidebar-section-title h-
|
|
101
|
+
className="design-sidebar-section-title min-h-[var(--design-control-height)] px-2"
|
|
102
102
|
>
|
|
103
103
|
{t("review.allScreens")}
|
|
104
104
|
</TabsTrigger>
|
|
@@ -111,7 +111,7 @@ export function ReviewCommentsPanel({
|
|
|
111
111
|
asChild
|
|
112
112
|
variant="outline"
|
|
113
113
|
size="sm"
|
|
114
|
-
className="mx-
|
|
114
|
+
className="mx-2 mt-2 min-h-[var(--design-row-height)] shrink-0"
|
|
115
115
|
>
|
|
116
116
|
<a href={signInHref}>{t("review.signInToComment")}</a>
|
|
117
117
|
</Button>
|
|
@@ -379,7 +379,7 @@ function A11ySection({
|
|
|
379
379
|
|
|
380
380
|
return (
|
|
381
381
|
<section aria-labelledby="review-a11y-heading">
|
|
382
|
-
<div className="flex h-
|
|
382
|
+
<div className="flex min-h-[var(--design-row-height)] items-center justify-between gap-2">
|
|
383
383
|
<div className="flex items-center gap-1.5">
|
|
384
384
|
<IconShieldCheck className="size-3.5 text-muted-foreground" />
|
|
385
385
|
<span
|
|
@@ -9973,8 +9973,12 @@ declare var __INITIAL_SOURCE_HEAD__: string;
|
|
|
9973
9973
|
}
|
|
9974
9974
|
var currentLeft = readPx(htmlEl.style.left || cs.left);
|
|
9975
9975
|
var currentTop = readPx(htmlEl.style.top || cs.top);
|
|
9976
|
-
|
|
9977
|
-
|
|
9976
|
+
// Both origins come from getBoundingClientRect, so the raw difference is
|
|
9977
|
+
// subpixel and would be authored as one.
|
|
9978
|
+
htmlEl.style.left =
|
|
9979
|
+
Math.round(currentLeft + (oldOriginX - newOriginX)) + "px";
|
|
9980
|
+
htmlEl.style.top =
|
|
9981
|
+
Math.round(currentTop + (oldOriginY - newOriginY)) + "px";
|
|
9978
9982
|
}
|
|
9979
9983
|
|
|
9980
9984
|
/** Convert flow members to absolute positioning at their drag release point
|
|
@@ -10083,8 +10087,10 @@ declare var __INITIAL_SOURCE_HEAD__: string;
|
|
|
10083
10087
|
}
|
|
10084
10088
|
var localDx = (clientDx * yy - yx * clientDy) / determinant;
|
|
10085
10089
|
var localDy = (xx * clientDy - clientDx * xy) / determinant;
|
|
10086
|
-
|
|
10087
|
-
|
|
10090
|
+
// The exact client point is worth at most a subpixel here, and paying for
|
|
10091
|
+
// it in a fractional authored left/top is the wrong trade.
|
|
10092
|
+
htmlEl.style.left = Math.round(baseLeft + localDx) + "px";
|
|
10093
|
+
htmlEl.style.top = Math.round(baseTop + localDy) + "px";
|
|
10088
10094
|
}
|
|
10089
10095
|
|
|
10090
10096
|
function applyRuntimeReorder(el, target) {
|
|
@@ -10270,6 +10276,15 @@ declare var __INITIAL_SOURCE_HEAD__: string;
|
|
|
10270
10276
|
// base converted to content px at snap time via chromeLineScale (1/zoom) to
|
|
10271
10277
|
// keep the snap tolerance constant on screen at any zoom.
|
|
10272
10278
|
var SNAP_THRESHOLD_PX = 6;
|
|
10279
|
+
|
|
10280
|
+
/** This screen's layout grid step in content px, pushed by the host. 1 means
|
|
10281
|
+
* no grid, which is the whole-pixel floor every gesture already lands on. */
|
|
10282
|
+
var layoutGridStep = 1;
|
|
10283
|
+
|
|
10284
|
+
function quantizeToLayoutGrid(value: number): number {
|
|
10285
|
+
if (!(layoutGridStep > 1)) return Math.round(value);
|
|
10286
|
+
return Math.round(value / layoutGridStep) * layoutGridStep;
|
|
10287
|
+
}
|
|
10273
10288
|
var SNAP_CANDIDATE_CAP = 200;
|
|
10274
10289
|
|
|
10275
10290
|
// Accepts either a real DOMRect (getBoundingClientRect()) or a plain
|
|
@@ -12285,8 +12300,10 @@ declare var __INITIAL_SOURCE_HEAD__: string;
|
|
|
12285
12300
|
var appliedDx = nextLeft - originLeft;
|
|
12286
12301
|
var appliedDy = nextTop - originTop;
|
|
12287
12302
|
memberStates.forEach(function (state) {
|
|
12288
|
-
state.el.style.left =
|
|
12289
|
-
|
|
12303
|
+
state.el.style.left =
|
|
12304
|
+
quantizeToLayoutGrid(state.originLeft + appliedDx) + "px";
|
|
12305
|
+
state.el.style.top =
|
|
12306
|
+
quantizeToLayoutGrid(state.originTop + appliedDy) + "px";
|
|
12290
12307
|
});
|
|
12291
12308
|
if (!duplicatedForDrag && !isGroupDrag) {
|
|
12292
12309
|
scheduleCrossScreenDragMove(ev);
|
|
@@ -12841,15 +12858,17 @@ declare var __INITIAL_SOURCE_HEAD__: string;
|
|
|
12841
12858
|
var rect = nextRect(ev);
|
|
12842
12859
|
if (rect.touchesWidth) widthTouched = true;
|
|
12843
12860
|
if (rect.touchesHeight) heightTouched = true;
|
|
12844
|
-
resizeEl.style.left =
|
|
12845
|
-
resizeEl.style.top =
|
|
12861
|
+
resizeEl.style.left = quantizeToLayoutGrid(rect.left) + "px";
|
|
12862
|
+
resizeEl.style.top = quantizeToLayoutGrid(rect.top) + "px";
|
|
12846
12863
|
// Only write width/height for an axis this gesture actually touched —
|
|
12847
12864
|
// writing the untouched axis every tick (even to its own unchanged
|
|
12848
12865
|
// origin value) would silently convert e.g. `width: 100%` to a px
|
|
12849
12866
|
// value on a pure vertical drag, which is exactly the "shrank instead
|
|
12850
12867
|
// of preserved" class of bug this fixes.
|
|
12851
|
-
if (widthTouched)
|
|
12852
|
-
|
|
12868
|
+
if (widthTouched)
|
|
12869
|
+
resizeEl.style.width = quantizeToLayoutGrid(rect.width) + "px";
|
|
12870
|
+
if (heightTouched)
|
|
12871
|
+
resizeEl.style.height = quantizeToLayoutGrid(rect.height) + "px";
|
|
12853
12872
|
if (scaleToolEnabled) {
|
|
12854
12873
|
// Uniform scale factor: scaleToolEnabled already forces the
|
|
12855
12874
|
// aspect-ratio lock above (nextRect), so width/origin.width and
|
|
@@ -14844,6 +14863,12 @@ declare var __INITIAL_SOURCE_HEAD__: string;
|
|
|
14844
14863
|
// set-read-only: toggle the bridge's readOnly state in-place without a reload.
|
|
14845
14864
|
// When readOnly becomes true the shield/selection/drag/edit entry points are
|
|
14846
14865
|
// gated so the surface is safe for background/inactive display use.
|
|
14866
|
+
if (e.data.type === "set-layout-grid-step") {
|
|
14867
|
+
var nextStep = Number(e.data.step);
|
|
14868
|
+
layoutGridStep =
|
|
14869
|
+
Number.isFinite(nextStep) && nextStep >= 1 ? nextStep : 1;
|
|
14870
|
+
return;
|
|
14871
|
+
}
|
|
14847
14872
|
if (e.data.type === "set-read-only") {
|
|
14848
14873
|
var nextReadOnly = !!e.data.readOnly;
|
|
14849
14874
|
if (readOnly === nextReadOnly) return;
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
* drawn with no explicit color should look the same (a soft Figma-like
|
|
14
14
|
* gray) regardless of which document theme it lands in, rather than
|
|
15
15
|
* silently tinting to whatever `--primary` resolves to there.
|
|
16
|
-
* - Stroke (rect/ellipse):
|
|
17
|
-
*
|
|
16
|
+
* - Stroke (rect/ellipse): none by default. Selection chrome supplies the
|
|
17
|
+
* temporary outline while a user-chosen stroke is still preserved.
|
|
18
18
|
* - Frame fill: the one default that *is* theme-adaptive —
|
|
19
19
|
* `hsl(var(--primary) / 0.05)`, a very faint tint of the editor's accent
|
|
20
20
|
* color so a layout frame's interior reads as "structural chrome" rather
|
|
21
21
|
* than a fixed gray. Its border stays a plain dashed gray, same as
|
|
22
|
-
*
|
|
22
|
+
* a plain dashed gray border.
|
|
23
23
|
* - Stroke width: 1px for div-based shapes.
|
|
24
24
|
* - Ellipse: borderRadius "50%" in both paths — no more "oval on commit" jump.
|
|
25
25
|
* - Rect: borderRadius "2px" (small, matches the previous committed value; the
|
|
@@ -72,14 +72,14 @@ export interface CanvasPrimitiveVisual {
|
|
|
72
72
|
/** Default fill — a soft Figma-like neutral gray. */
|
|
73
73
|
const DEFAULT_FILL = "rgb(218 218 218)";
|
|
74
74
|
|
|
75
|
-
/** Default stroke
|
|
75
|
+
/** Default stroke used when a caller explicitly enables a stroke. */
|
|
76
76
|
const DEFAULT_STROKE = "rgb(168 168 168)";
|
|
77
77
|
|
|
78
78
|
/** Stroke width in pixels for div-based shapes. */
|
|
79
79
|
const DEFAULT_STROKE_WIDTH_PX = 1;
|
|
80
80
|
|
|
81
|
-
/**
|
|
82
|
-
const
|
|
81
|
+
/** Shapes start un-stroked; selection chrome owns their temporary outline. */
|
|
82
|
+
const NO_BORDER = "0 solid transparent";
|
|
83
83
|
|
|
84
84
|
/** Text nodes rely on editor chrome for outlines; the element itself is bare. */
|
|
85
85
|
const TEXT_BORDER = "0 solid transparent";
|
|
@@ -134,7 +134,7 @@ export function canvasPrimitiveVisual(
|
|
|
134
134
|
case "ellipse":
|
|
135
135
|
return {
|
|
136
136
|
background: DEFAULT_FILL,
|
|
137
|
-
border:
|
|
137
|
+
border: NO_BORDER,
|
|
138
138
|
borderRadius: "50%",
|
|
139
139
|
};
|
|
140
140
|
case "frame":
|
|
@@ -155,7 +155,7 @@ export function canvasPrimitiveVisual(
|
|
|
155
155
|
default:
|
|
156
156
|
return {
|
|
157
157
|
background: DEFAULT_FILL,
|
|
158
|
-
border:
|
|
158
|
+
border: NO_BORDER,
|
|
159
159
|
borderRadius: RECT_RADIUS,
|
|
160
160
|
};
|
|
161
161
|
}
|
|
@@ -236,7 +236,9 @@ export function canvasPrimitiveReactStyle(
|
|
|
236
236
|
|
|
237
237
|
let background = v.background as string | undefined;
|
|
238
238
|
let borderColor: string | undefined;
|
|
239
|
-
let borderWidth: number | string | undefined =
|
|
239
|
+
let borderWidth: number | string | undefined = v.border.startsWith("0 ")
|
|
240
|
+
? 0
|
|
241
|
+
: DEFAULT_STROKE_WIDTH_PX;
|
|
240
242
|
let borderStyle: string | undefined = "solid";
|
|
241
243
|
|
|
242
244
|
if (kind === "frame" || isText) {
|
|
@@ -260,6 +262,11 @@ export function canvasPrimitiveReactStyle(
|
|
|
260
262
|
}
|
|
261
263
|
if (overrides?.stroke) {
|
|
262
264
|
borderColor = overrides.stroke;
|
|
265
|
+
if (overrides.strokeWidth === undefined) {
|
|
266
|
+
borderWidth = DEFAULT_STROKE_WIDTH_PX;
|
|
267
|
+
}
|
|
268
|
+
} else if (overrides?.strokeWidth !== undefined) {
|
|
269
|
+
borderColor = DEFAULT_STROKE;
|
|
263
270
|
} else {
|
|
264
271
|
// Extract from canonical border shorthand: "Npx style color"
|
|
265
272
|
const borderParts = v.border.split(" ");
|