@agent-native/core 0.90.1 → 0.90.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +26 -0
- package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -80
- package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/toolkit-agent-ux.mdx +43 -0
- package/corpus/core/docs/content/toolkit-app-adapters.mdx +9 -0
- package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +12 -0
- package/corpus/core/docs/content/toolkit-collaboration.mdx +74 -0
- package/corpus/core/docs/content/toolkit-command-navigation.mdx +106 -0
- package/corpus/core/docs/content/toolkit-comments-review.mdx +98 -0
- package/corpus/core/docs/content/toolkit-history.mdx +95 -0
- package/corpus/core/docs/content/toolkit-observability.mdx +41 -0
- package/corpus/core/docs/content/toolkit-org-team.mdx +80 -0
- package/corpus/core/docs/content/toolkit-resources.mdx +57 -0
- package/corpus/core/docs/content/toolkit-settings.mdx +65 -0
- package/corpus/core/docs/content/toolkit-setup-connections.mdx +109 -0
- package/corpus/core/docs/content/toolkit-sharing-ui.mdx +18 -6
- package/corpus/core/docs/content/toolkit-sharing.mdx +81 -0
- package/corpus/core/docs/content/toolkit-shell-hooks.mdx +9 -0
- package/corpus/core/docs/content/toolkit-ui.mdx +9 -0
- package/corpus/core/package.json +35 -1
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +19 -1
- package/corpus/core/src/agent/engine/anthropic-engine.ts +25 -1
- package/corpus/core/src/agent/engine/registry.ts +23 -16
- package/corpus/core/src/agent/production-agent.ts +37 -6
- package/corpus/core/src/client/AgentPanel.tsx +1 -1
- package/corpus/core/src/client/command-navigation/index.ts +15 -0
- package/corpus/core/src/client/comments-review/index.ts +1 -0
- package/corpus/core/src/client/history/VersionHistoryPanel.tsx +145 -0
- package/corpus/core/src/client/history/index.ts +18 -0
- package/corpus/core/src/client/history/use-history.ts +86 -0
- package/corpus/core/src/client/index.ts +76 -9
- package/corpus/core/src/client/org/OrgSwitcher.tsx +6 -6
- package/corpus/core/src/client/org/RequireActiveOrg.tsx +2 -2
- package/corpus/core/src/client/org/TeamPage.tsx +3 -3
- package/corpus/core/src/client/org/hooks.ts +32 -0
- package/corpus/core/src/client/org/index.ts +30 -1
- package/corpus/core/src/client/org-team/index.ts +1 -0
- package/corpus/core/src/client/review/ReviewStatusBadge.tsx +39 -0
- package/corpus/core/src/client/review/ReviewThreadPanel.tsx +278 -0
- package/corpus/core/src/client/review/index.ts +25 -0
- package/corpus/core/src/client/review/use-review.ts +114 -0
- package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +11 -6
- package/corpus/core/src/client/settings/index.ts +11 -1
- package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +94 -0
- package/corpus/core/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
- package/corpus/core/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
- package/corpus/core/src/client/setup-connections/index.ts +46 -0
- package/corpus/core/src/client/sharing/ShareButton.tsx +20 -14
- package/corpus/core/src/client/sharing/ShareDialog.tsx +3 -3
- package/corpus/core/src/client/use-action.ts +39 -2
- package/corpus/core/src/client/use-db-sync.ts +44 -18
- package/corpus/core/src/command-navigation/actions.ts +100 -0
- package/corpus/core/src/command-navigation/index.ts +12 -0
- package/corpus/core/src/comments-review/index.ts +1 -0
- package/corpus/core/src/db/create-get-db.ts +32 -2
- package/corpus/core/src/file-upload/builder.ts +24 -3
- package/corpus/core/src/file-upload/types.ts +3 -1
- package/corpus/core/src/history/actions/create-resource-version.ts +89 -0
- package/corpus/core/src/history/actions/get-resource-version.ts +60 -0
- package/corpus/core/src/history/actions/list-resource-history.ts +53 -0
- package/corpus/core/src/history/actions/list-resource-versions.ts +43 -0
- package/corpus/core/src/history/actions/restore-resource-version.ts +96 -0
- package/corpus/core/src/history/index.ts +27 -0
- package/corpus/core/src/history/registry.ts +99 -0
- package/corpus/core/src/history/store.ts +348 -0
- package/corpus/core/src/history/types.ts +69 -0
- package/corpus/core/src/index.ts +10 -0
- package/corpus/core/src/navigation/index.ts +170 -0
- package/corpus/core/src/org/index.ts +8 -0
- package/corpus/core/src/org/permissions.ts +30 -0
- package/corpus/core/src/org-team/index.ts +1 -0
- package/corpus/core/src/private-blob/registry.ts +1 -0
- package/corpus/core/src/review/actions/consume-review-feedback.ts +38 -0
- package/corpus/core/src/review/actions/create-review-comment.ts +107 -0
- package/corpus/core/src/review/actions/delete-review-comment.ts +55 -0
- package/corpus/core/src/review/actions/get-review-feedback.ts +54 -0
- package/corpus/core/src/review/actions/list-review-comments.ts +53 -0
- package/corpus/core/src/review/actions/reply-review-comment.ts +107 -0
- package/corpus/core/src/review/actions/resolve-review-thread.ts +60 -0
- package/corpus/core/src/review/actions/set-review-status.ts +58 -0
- package/corpus/core/src/review/index.ts +36 -0
- package/corpus/core/src/review/mentions.ts +44 -0
- package/corpus/core/src/review/registry.ts +99 -0
- package/corpus/core/src/review/store.ts +687 -0
- package/corpus/core/src/review/types.ts +97 -0
- package/corpus/core/src/server/action-discovery.ts +54 -0
- package/corpus/core/src/server/agent-engine-api-key-route.ts +5 -0
- package/corpus/core/src/server/credential-provider.ts +108 -0
- package/corpus/core/src/server/framework-request-handler.ts +52 -4
- package/corpus/core/src/setup-connections/index.ts +89 -0
- package/corpus/core/src/setup-connections/onboarding.ts +47 -0
- package/corpus/core/src/transcription/builder-transcription.ts +9 -2
- package/corpus/core/src/vite/action-types-plugin.ts +52 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/analytics/app/global.css +22 -10
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -1
- package/corpus/templates/analytics/app/i18n-data.ts +81 -13
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -2
- package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +528 -108
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +466 -183
- package/corpus/templates/analytics/changelog/2026-07-07-session-replays-load-sooner-show-clearer-activity-timelines-.md +6 -0
- package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +5 -0
- package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +34 -6
- package/corpus/templates/assets/AGENTS.md +23 -4
- package/corpus/templates/assets/actions/_generation-preset-settings.ts +48 -0
- package/corpus/templates/assets/actions/_helpers.ts +8 -1
- package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +64 -0
- package/corpus/templates/assets/actions/create-generation-preset.ts +11 -3
- package/corpus/templates/assets/actions/generate-image-batch.ts +7 -2
- package/corpus/templates/assets/actions/generate-image.ts +342 -25
- package/corpus/templates/assets/actions/get-library.ts +4 -3
- package/corpus/templates/assets/actions/navigate.ts +2 -1
- package/corpus/templates/assets/actions/refresh-generation-run.ts +5 -1
- package/corpus/templates/assets/actions/update-asset.ts +1 -0
- package/corpus/templates/assets/actions/update-generation-preset.ts +8 -1
- package/corpus/templates/assets/actions/view-screen.ts +8 -1
- package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +9 -1
- package/corpus/templates/assets/app/hooks/use-image-model-menu.ts +1 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +11 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +64 -0
- package/corpus/templates/assets/app/i18n-data.ts +650 -0
- package/corpus/templates/assets/app/routes/asset.$id.tsx +2 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +44 -33
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1474 -0
- package/corpus/templates/assets/app/routes/library.tsx +43 -1
- package/corpus/templates/assets/server/lib/generation.ts +366 -44
- package/corpus/templates/assets/server/lib/image-processing.ts +252 -0
- package/corpus/templates/assets/server/lib/preset-skeleton.ts +137 -0
- package/corpus/templates/assets/shared/api.ts +47 -0
- package/corpus/templates/brain/app/routes/settings.tsx +2 -2
- package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +32 -6
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +120 -40
- package/corpus/templates/calendar/app/hooks/use-people.ts +55 -0
- package/corpus/templates/calendar/changelog/2026-07-07-guest-suggestions-now-find-coworkers-from-your-google-worksp.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-07-zoom-stays-selected-after-connecting-it-from-a-draft-event.md +6 -0
- package/corpus/templates/clips/actions/create-recording.ts +5 -1
- package/corpus/templates/clips/actions/finalize-recording.ts +140 -1
- package/corpus/templates/clips/actions/import-loom-recording.ts +1 -0
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +1 -0
- package/corpus/templates/clips/actions/request-transcript.ts +31 -0
- package/corpus/templates/clips/actions/set-thumbnail.ts +2 -0
- package/corpus/templates/clips/app/components/library/library-layout.tsx +7 -2
- package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
- package/corpus/templates/clips/app/components/library/sort-menu.tsx +1 -1
- package/corpus/templates/clips/app/components/player/scrubber-position.ts +9 -0
- package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -2
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +69 -41
- package/corpus/templates/clips/app/components/player/video-player.tsx +38 -1
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +114 -33
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -3
- package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +9 -19
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +27 -1
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +9 -3
- package/corpus/templates/clips/app/routes/record.tsx +178 -80
- package/corpus/templates/clips/changelog/2026-07-02-recordings-now-wait-for-storage-media-to-serve-before-finishing.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-a-pending-app-update-no-longer-blocks-screen-recording-updat.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-chrome-extension-recordings-keep-audio-after-refreshing-tab.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-clip-playback-progress-now-starts-and-finishes-at-the-right-times.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-sharing-public-clips-now-stays-focused-on-the-normal-link-wi.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +18 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +23 -8
- package/corpus/templates/clips/desktop/src/app.tsx +40 -3
- package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +19 -7
- package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
- package/corpus/templates/clips/desktop/src/lib/updater.ts +25 -2
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +7 -0
- package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +1 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +23 -6
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +28 -3
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +13 -6
- package/corpus/templates/clips/shared/finalize-recovery.ts +35 -3
- package/corpus/templates/content/AGENTS.md +52 -52
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +188 -8
- package/corpus/templates/content/actions/_builder-docs-client.ts +41 -3
- package/corpus/templates/content/actions/_database-source-utils.ts +998 -160
- package/corpus/templates/content/actions/_database-utils.ts +44 -4
- package/corpus/templates/content/actions/_notion-action-utils.ts +6 -2
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -1
- package/corpus/templates/content/actions/attach-content-database-source.ts +85 -12
- package/corpus/templates/content/actions/change-content-database-source-role.ts +9 -1
- package/corpus/templates/content/actions/delete-content-database.ts +1 -0
- package/corpus/templates/content/actions/delete-document.ts +337 -52
- package/corpus/templates/content/actions/get-document.ts +11 -2
- package/corpus/templates/content/actions/list-content-databases.ts +57 -9
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +23 -6
- package/corpus/templates/content/actions/refresh-content-database-source.ts +26 -3
- package/corpus/templates/content/actions/restore-content-database.ts +1 -0
- package/corpus/templates/content/actions/update-document.ts +43 -0
- package/corpus/templates/content/app/components/editor/BuilderBodySyncingNotice.tsx +21 -0
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +0 -1
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +70 -28
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +69 -17
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +4 -4
- package/corpus/templates/content/app/components/editor/body-hydration.ts +112 -0
- package/corpus/templates/content/app/components/editor/builder-body-hydration-pump.ts +52 -0
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +9076 -2876
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +41 -1
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +36 -11
- package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +21 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -1
- package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +11 -8
- package/corpus/templates/content/app/global.css +41 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +346 -42
- package/corpus/templates/content/app/hooks/use-db-sync.ts +9 -0
- package/corpus/templates/content/app/hooks/use-documents.ts +47 -0
- package/corpus/templates/content/app/hooks/use-notion.ts +12 -10
- package/corpus/templates/content/app/i18n/zh-TW.ts +35 -0
- package/corpus/templates/content/app/i18n-data.ts +355 -0
- package/corpus/templates/content/app/root.tsx +22 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-database-sources-keep-loading-rows-in-the-background.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-attach-starts-with-usable-rows.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-attachment-now-stays-connected-after-large.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-refreshes-now-show-progress-for-large-docs-blog.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-database-pages-now-delete-to-trash-without-route-errors.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-builder-source-refreshes-recover-from-stalled-background-row.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-builder-sourced-rows-open-with-sync-protection.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-database-rows-and-pages-open-faster-from-recently-loaded-dat.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-preview-panels-close-reliably-narrow-sidebar-row-actions-sta.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-builder-sync-progress-no-longer-shows-continue.md +6 -0
- package/corpus/templates/content/changelog/2026-07-07-permanently-deleting-trashed-databases-now-finishes-reliably.md +6 -0
- package/corpus/templates/content/shared/api.ts +13 -0
- package/corpus/templates/content/shared/builder-mdx.ts +16 -3
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +23 -13
- package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +98 -0
- package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +162 -0
- package/corpus/templates/design/AGENTS.md +9 -2
- package/corpus/templates/design/actions/add-breakpoint.ts +6 -3
- package/corpus/templates/design/actions/apply-a11y-fix.ts +57 -37
- package/corpus/templates/design/actions/apply-component-prop-edit.ts +41 -20
- package/corpus/templates/design/actions/apply-motion-edit.ts +251 -38
- package/corpus/templates/design/actions/apply-shader-fill.ts +90 -66
- package/corpus/templates/design/actions/apply-visual-edit.ts +282 -55
- package/corpus/templates/design/actions/create-component.ts +29 -60
- package/corpus/templates/design/actions/create-file.ts +9 -2
- package/corpus/templates/design/actions/duplicate-design.ts +31 -2
- package/corpus/templates/design/actions/edit-design.ts +36 -38
- package/corpus/templates/design/actions/generate-design-title.ts +87 -0
- package/corpus/templates/design/actions/generate-design.ts +53 -18
- package/corpus/templates/design/actions/generate-screens.ts +108 -4
- package/corpus/templates/design/actions/get-motion-timeline.ts +35 -7
- package/corpus/templates/design/actions/insert-asset.ts +34 -29
- package/corpus/templates/design/actions/insert-design-native-asset.ts +129 -32
- package/corpus/templates/design/actions/insert-figma-library-asset.ts +35 -30
- package/corpus/templates/design/actions/present-design-variants.ts +7 -2
- package/corpus/templates/design/actions/remove-motion-timeline.ts +31 -36
- package/corpus/templates/design/actions/update-file.ts +190 -75
- package/corpus/templates/design/app/components/design/BreakpointBar.tsx +403 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +469 -222
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +708 -53
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +83 -3
- package/corpus/templates/design/app/components/design/EditPanel.tsx +1091 -6948
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +419 -85
- package/corpus/templates/design/app/components/design/MotionDock.tsx +1124 -103
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2610 -1398
- package/corpus/templates/design/app/components/design/ReadOnlyDesignBanner.tsx +22 -0
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2182 -235
- package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +187 -11
- package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +376 -1
- package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +746 -0
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +17 -0
- package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +1 -1
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +1 -3
- package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +1 -1
- package/corpus/templates/design/app/components/design/edit-panel/appearance-properties.tsx +518 -0
- package/corpus/templates/design/app/components/design/edit-panel/code-inspect-helpers.tsx +562 -0
- package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +763 -0
- package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +94 -0
- package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +780 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +446 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +79 -0
- package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +315 -0
- package/corpus/templates/design/app/components/design/edit-panel/fill-gradient-helpers.ts +344 -0
- package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +594 -0
- package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +119 -0
- package/corpus/templates/design/app/components/design/edit-panel/inspector-controls.tsx +248 -0
- package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +45 -0
- package/corpus/templates/design/app/components/design/edit-panel/layout-properties.tsx +693 -0
- package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +724 -0
- package/corpus/templates/design/app/components/design/edit-panel/position-helpers.ts +207 -0
- package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +628 -0
- package/corpus/templates/design/app/components/design/edit-panel/selection-helpers.ts +91 -0
- package/corpus/templates/design/app/components/design/edit-panel/stroke-properties.tsx +649 -0
- package/corpus/templates/design/app/components/design/edit-panel/style-change-types.ts +118 -0
- package/corpus/templates/design/app/components/design/edit-panel/style-options.ts +88 -0
- package/corpus/templates/design/app/components/design/edit-panel/transform-helpers.ts +100 -0
- package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +117 -0
- package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +501 -0
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +91 -40
- package/corpus/templates/design/app/components/design/inspector/BreakpointOverrideIndicator.tsx +82 -0
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +189 -87
- package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +1097 -0
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +44 -0
- package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +258 -0
- package/corpus/templates/design/app/components/design/inspector/MotionKeyframeDiamond.tsx +144 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +99 -9
- package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +116 -0
- package/corpus/templates/design/app/components/design/inspector/index.ts +26 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +29 -0
- package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +171 -0
- package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +220 -0
- package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +35 -0
- package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +134 -0
- package/corpus/templates/design/app/components/design/multi-screen/culling.ts +185 -0
- package/corpus/templates/design/app/components/design/multi-screen/gradient-overlay-geometry.ts +120 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +892 -0
- package/corpus/templates/design/app/components/design/multi-screen/vector-edit-geometry.ts +21 -0
- package/corpus/templates/design/app/components/design/types.ts +15 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +109 -5
- package/corpus/templates/design/app/global.css +8 -8
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +259 -2
- package/corpus/templates/design/app/i18n/zh-TW.ts +163 -9
- package/corpus/templates/design/app/i18n-breakpoints.ts +205 -0
- package/corpus/templates/design/app/i18n-data.ts +1664 -152
- package/corpus/templates/design/app/i18n-motion.ts +563 -0
- package/corpus/templates/design/app/lib/design-import.ts +73 -0
- package/corpus/templates/design/app/pages/Index.tsx +41 -22
- package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-design-now-has-a-figma-style-left-rail-for-file-agent-assets.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-design-tools-now-use-a-quieter-figma-style-list-layout.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +1 -1
- package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +1 -1
- package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +1 -1
- package/corpus/templates/design/changelog/2026-07-05-designs-get-ai-generated-names-from-your-prompt.md +6 -0
- package/corpus/templates/design/changelog/2026-07-05-local-code-screens-keep-their-connection-when-duplicated-and.md +6 -0
- package/corpus/templates/design/changelog/2026-07-05-press-a-to-draw-screens-on-the-canvas-inside-a-screen-it-dr.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-3d-rotation-and-perspective-controls-on-every-element.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-ai-generated-and-duplicated-screens-now-get-their-editor-sel.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-applying-shaders-and-fills-in-quick-succession-can-no-longer.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-frames-in-the-overview-now-support-click-to-selec.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-segments-in-the-inspector-now-show-a-device-icon-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-targeting-now-lives-in-one-compact-control-in-the.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-canvas-edits-can-no-longer-be-overwritten-by-stale-collabora.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-canvas-edits-inside-screens-save-reliably-again.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-cleaner-inspector-removed-the-ask-ai-box-from-the-design-tab.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-clicking-empty-canvas-space-now-deselects-an-element-inside-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dragging-an-element-onto-a-rectangle-now-nests-it-inside-wit.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dragging-screens-and-objects-on-the-canvas-is-now-much-smoot.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-drawing-a-shape-or-text-on-the-canvas-no-longer-flashes-away.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dropping-an-element-between-two-others-inside-a-screen-now-s.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-duplicating-a-screen-now-places-the-copy-exactly-where-you-d.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-edit-gradients-directly-on-elements-inside-screens-scale-str.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-edits-from-collaborators-and-the-agent-now-update-the-canvas.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-bug-where-most-style-position-and-text-edits-briefly.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-confusing-raw-error-message-when-a-file-upload-fails.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-rare-case-where-an-edit-could-be-silently-overwritte.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-inserted-assets-sometimes-disappearing-reappearing-or-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-inspector-value-scrubbing-producing-erratic-numbers-an.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-padding-gap-and-min-max-size-scrubbing-not-updating-th.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-text-stroke-color-turning-black-and-glyphs-disappearin.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-collapsed-effects-and-stroke-inspector-sections-sh.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-new-design-dialog-closing-unexpectedly-when-using-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-typography-section-missing-when-selecting-text-nes.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-full-view-no-longer-flashes-back-to-the-overview-on-entry-no.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-keyframe-animation-timeline-per-property-keyframes-easing-cu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-moving-restyling-and-scrubbing-values-on-elements-in-ai-gene.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-padding-and-corner-radius-value-scrubbing-now-snaps-to-whole.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-padding-handles-now-only-resize-on-the-handle-line-itself-sh.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-preview-and-edit-hover-focus-and-pressed-states-with-real-cs.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-promoting-an-element-to-a-component-now-works-correctly-for-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-reduced-url-history-churn-and-selection-overlay-flicker-whil.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-removed-the-decorative-dot-before-screen-names-in-the-overvi.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-responsive-breakpoints-edit-at-any-width-with-cascading-over.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-screen-labels-no-longer-turn-blue-when-you-hover-inside-the-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-scrolling-a-screen-with-an-element-selected-stays-smooth-on-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selecting-multiple-elements-and-dragging-now-moves-the-whole.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selection-borders-handles-and-value-readouts-now-stay-the-sa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selection-handles-and-editing-chrome-now-stay-a-constant-siz.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-shader-fills-and-effects-ai-authored-or-preset-glsl-shaders-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-text-drawn-on-the-canvas-now-defaults-to-white-and-inter-in-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-text-dropped-into-a-shape-now-stays-readable-instead-of-disa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-add-tweak-controls-prompt-no-longer-jumps-to-the-corner-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-padding-value-readout-now-stays-visible-while-you-hover-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-selected-element-attachment-now-clears-from-the-chat-com.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-zoom-menu-is-more-compact-with-tight-rows-and-right-alig.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-undo-and-redo-no-longer-flash-the-screen-changes-now-apply-i.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-zoom-presets-like-zoom-to-50-now-stay-on-the-focused-screen-.md +6 -0
- package/corpus/templates/design/server/lib/import-design-files.ts +11 -2
- package/corpus/templates/design/server/source-workspace.ts +139 -59
- package/corpus/templates/design/shared/board-file.ts +11 -2
- package/corpus/templates/design/shared/breakpoint-media.ts +543 -0
- package/corpus/templates/design/shared/canvas-math.ts +354 -35
- package/corpus/templates/design/shared/code-layer.ts +277 -8
- package/corpus/templates/design/shared/design-state.ts +11 -4
- package/corpus/templates/design/shared/interaction-states.ts +548 -0
- package/corpus/templates/design/shared/motion-compiler.ts +186 -23
- package/corpus/templates/design/shared/motion-easing.ts +294 -0
- package/corpus/templates/design/shared/motion-timeline.ts +400 -34
- package/corpus/templates/design/shared/prompt-title.ts +95 -0
- package/corpus/templates/design/shared/responsive-classes.ts +448 -10
- package/corpus/templates/design/shared/screen-annotation.ts +46 -0
- package/corpus/templates/design/shared/shader-fills.ts +1009 -0
- package/corpus/templates/design/shared/shader-presets.ts +852 -4
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +15 -2
- package/corpus/templates/slides/app/components/editor/ImportButton.tsx +10 -1
- package/corpus/templates/slides/app/lib/upload-response.ts +71 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +2 -2
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +15 -1
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +20 -1
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +22 -14
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +27 -7
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/command-navigation/index.d.ts +4 -0
- package/dist/client/command-navigation/index.d.ts.map +1 -0
- package/dist/client/command-navigation/index.js +4 -0
- package/dist/client/command-navigation/index.js.map +1 -0
- package/dist/client/comments-review/index.d.ts +2 -0
- package/dist/client/comments-review/index.d.ts.map +1 -0
- package/dist/client/comments-review/index.js +2 -0
- package/dist/client/comments-review/index.js.map +1 -0
- package/dist/client/history/VersionHistoryPanel.d.ts +18 -0
- package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -0
- package/dist/client/history/VersionHistoryPanel.js +24 -0
- package/dist/client/history/VersionHistoryPanel.js.map +1 -0
- package/dist/client/history/index.d.ts +3 -0
- package/dist/client/history/index.d.ts.map +1 -0
- package/dist/client/history/index.js +3 -0
- package/dist/client/history/index.js.map +1 -0
- package/dist/client/history/use-history.d.ts +46 -0
- package/dist/client/history/use-history.d.ts.map +1 -0
- package/dist/client/history/use-history.js +18 -0
- package/dist/client/history/use-history.js.map +1 -0
- package/dist/client/index.d.ts +6 -4
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +6 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.js +5 -5
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.js +2 -2
- package/dist/client/org/RequireActiveOrg.js.map +1 -1
- package/dist/client/org/TeamPage.js +3 -3
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts +12 -1
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +15 -0
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +4 -2
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +3 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/org-team/index.d.ts +2 -0
- package/dist/client/org-team/index.d.ts.map +1 -0
- package/dist/client/org-team/index.js +2 -0
- package/dist/client/org-team/index.js.map +1 -0
- package/dist/client/review/ReviewStatusBadge.d.ts +7 -0
- package/dist/client/review/ReviewStatusBadge.d.ts.map +1 -0
- package/dist/client/review/ReviewStatusBadge.js +19 -0
- package/dist/client/review/ReviewStatusBadge.js.map +1 -0
- package/dist/client/review/ReviewThreadPanel.d.ts +20 -0
- package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -0
- package/dist/client/review/ReviewThreadPanel.js +84 -0
- package/dist/client/review/ReviewThreadPanel.js.map +1 -0
- package/dist/client/review/index.d.ts +4 -0
- package/dist/client/review/index.d.ts.map +1 -0
- package/dist/client/review/index.js +4 -0
- package/dist/client/review/index.js.map +1 -0
- package/dist/client/review/use-review.d.ts +68 -0
- package/dist/client/review/use-review.d.ts.map +1 -0
- package/dist/client/review/use-review.js +22 -0
- package/dist/client/review/use-review.js.map +1 -0
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.js +11 -6
- package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
- package/dist/client/settings/index.d.ts +1 -1
- package/dist/client/settings/index.d.ts.map +1 -1
- package/dist/client/settings/index.js +1 -1
- package/dist/client/settings/index.js.map +1 -1
- package/dist/client/setup-connections/BuilderConnectCard.d.ts +9 -0
- package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -0
- package/dist/client/setup-connections/BuilderConnectCard.js +25 -0
- package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.d.ts +8 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.d.ts.map +1 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.js +32 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.js.map +1 -0
- package/dist/client/setup-connections/SetupConnectionsPage.d.ts +17 -0
- package/dist/client/setup-connections/SetupConnectionsPage.d.ts.map +1 -0
- package/dist/client/setup-connections/SetupConnectionsPage.js +10 -0
- package/dist/client/setup-connections/SetupConnectionsPage.js.map +1 -0
- package/dist/client/setup-connections/index.d.ts +7 -0
- package/dist/client/setup-connections/index.d.ts.map +1 -0
- package/dist/client/setup-connections/index.js +7 -0
- package/dist/client/setup-connections/index.js.map +1 -0
- package/dist/client/sharing/ShareButton.d.ts +4 -4
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +13 -7
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.js +3 -3
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/client/use-action.d.ts +3 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +34 -3
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +4 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +37 -18
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/command-navigation/actions.d.ts +25 -0
- package/dist/command-navigation/actions.d.ts.map +1 -0
- package/dist/command-navigation/actions.js +64 -0
- package/dist/command-navigation/actions.js.map +1 -0
- package/dist/command-navigation/index.d.ts +4 -0
- package/dist/command-navigation/index.d.ts.map +1 -0
- package/dist/command-navigation/index.js +4 -0
- package/dist/command-navigation/index.js.map +1 -0
- package/dist/comments-review/index.d.ts +2 -0
- package/dist/comments-review/index.d.ts.map +1 -0
- package/dist/comments-review/index.js +2 -0
- package/dist/comments-review/index.js.map +1 -0
- package/dist/db/create-get-db.d.ts +25 -0
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +25 -2
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +18 -2
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/file-upload/types.d.ts +3 -0
- package/dist/file-upload/types.d.ts.map +1 -1
- package/dist/file-upload/types.js.map +1 -1
- package/dist/history/actions/create-resource-version.d.ts +10 -0
- package/dist/history/actions/create-resource-version.d.ts.map +1 -0
- package/dist/history/actions/create-resource-version.js +65 -0
- package/dist/history/actions/create-resource-version.js.map +1 -0
- package/dist/history/actions/get-resource-version.d.ts +10 -0
- package/dist/history/actions/get-resource-version.d.ts.map +1 -0
- package/dist/history/actions/get-resource-version.js +38 -0
- package/dist/history/actions/get-resource-version.js.map +1 -0
- package/dist/history/actions/list-resource-history.d.ts +10 -0
- package/dist/history/actions/list-resource-history.d.ts.map +1 -0
- package/dist/history/actions/list-resource-history.js +45 -0
- package/dist/history/actions/list-resource-history.js.map +1 -0
- package/dist/history/actions/list-resource-versions.d.ts +10 -0
- package/dist/history/actions/list-resource-versions.d.ts.map +1 -0
- package/dist/history/actions/list-resource-versions.js +35 -0
- package/dist/history/actions/list-resource-versions.js.map +1 -0
- package/dist/history/actions/restore-resource-version.d.ts +11 -0
- package/dist/history/actions/restore-resource-version.d.ts.map +1 -0
- package/dist/history/actions/restore-resource-version.js +59 -0
- package/dist/history/actions/restore-resource-version.js.map +1 -0
- package/dist/history/index.d.ts +4 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +3 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/registry.d.ts +10 -0
- package/dist/history/registry.d.ts.map +1 -0
- package/dist/history/registry.js +61 -0
- package/dist/history/registry.js.map +1 -0
- package/dist/history/store.d.ts +34 -0
- package/dist/history/store.d.ts.map +1 -0
- package/dist/history/store.js +265 -0
- package/dist/history/store.js.map +1 -0
- package/dist/history/types.d.ts +55 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +2 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/navigation/index.d.ts +53 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +105 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/observability/routes.d.ts +3 -3
- package/dist/org/index.d.ts +1 -0
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +1 -0
- package/dist/org/index.js.map +1 -1
- package/dist/org/permissions.d.ts +7 -0
- package/dist/org/permissions.d.ts.map +1 -0
- package/dist/org/permissions.js +21 -0
- package/dist/org/permissions.js.map +1 -0
- package/dist/org-team/index.d.ts +2 -0
- package/dist/org-team/index.d.ts.map +1 -0
- package/dist/org-team/index.js +2 -0
- package/dist/org-team/index.js.map +1 -0
- package/dist/private-blob/registry.d.ts.map +1 -1
- package/dist/private-blob/registry.js +1 -0
- package/dist/private-blob/registry.js.map +1 -1
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/review/actions/consume-review-feedback.d.ts +9 -0
- package/dist/review/actions/consume-review-feedback.d.ts.map +1 -0
- package/dist/review/actions/consume-review-feedback.js +29 -0
- package/dist/review/actions/consume-review-feedback.js.map +1 -0
- package/dist/review/actions/create-review-comment.d.ts +18 -0
- package/dist/review/actions/create-review-comment.d.ts.map +1 -0
- package/dist/review/actions/create-review-comment.js +81 -0
- package/dist/review/actions/create-review-comment.js.map +1 -0
- package/dist/review/actions/delete-review-comment.d.ts +10 -0
- package/dist/review/actions/delete-review-comment.d.ts.map +1 -0
- package/dist/review/actions/delete-review-comment.js +45 -0
- package/dist/review/actions/delete-review-comment.js.map +1 -0
- package/dist/review/actions/get-review-feedback.d.ts +10 -0
- package/dist/review/actions/get-review-feedback.d.ts.map +1 -0
- package/dist/review/actions/get-review-feedback.js +45 -0
- package/dist/review/actions/get-review-feedback.js.map +1 -0
- package/dist/review/actions/list-review-comments.d.ts +13 -0
- package/dist/review/actions/list-review-comments.d.ts.map +1 -0
- package/dist/review/actions/list-review-comments.js +44 -0
- package/dist/review/actions/list-review-comments.js.map +1 -0
- package/dist/review/actions/reply-review-comment.d.ts +16 -0
- package/dist/review/actions/reply-review-comment.d.ts.map +1 -0
- package/dist/review/actions/reply-review-comment.js +84 -0
- package/dist/review/actions/reply-review-comment.js.map +1 -0
- package/dist/review/actions/resolve-review-thread.d.ts +11 -0
- package/dist/review/actions/resolve-review-thread.d.ts.map +1 -0
- package/dist/review/actions/resolve-review-thread.js +46 -0
- package/dist/review/actions/resolve-review-thread.js.map +1 -0
- package/dist/review/actions/set-review-status.d.ts +9 -0
- package/dist/review/actions/set-review-status.d.ts.map +1 -0
- package/dist/review/actions/set-review-status.js +43 -0
- package/dist/review/actions/set-review-status.js.map +1 -0
- package/dist/review/index.d.ts +5 -0
- package/dist/review/index.d.ts.map +1 -0
- package/dist/review/index.js +4 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review/mentions.d.ts +4 -0
- package/dist/review/mentions.d.ts.map +1 -0
- package/dist/review/mentions.js +39 -0
- package/dist/review/mentions.js.map +1 -0
- package/dist/review/registry.d.ts +10 -0
- package/dist/review/registry.d.ts.map +1 -0
- package/dist/review/registry.js +61 -0
- package/dist/review/registry.js.map +1 -0
- package/dist/review/store.d.ts +63 -0
- package/dist/review/store.d.ts.map +1 -0
- package/dist/review/store.js +558 -0
- package/dist/review/store.js.map +1 -0
- package/dist/review/types.d.ts +77 -0
- package/dist/review/types.d.ts.map +1 -0
- package/dist/review/types.js +2 -0
- package/dist/review/types.js.map +1 -0
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +54 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts.map +1 -1
- package/dist/server/agent-engine-api-key-route.js +5 -0
- package/dist/server/agent-engine-api-key-route.js.map +1 -1
- package/dist/server/credential-provider.d.ts +26 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +82 -0
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +37 -1
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/setup-connections/index.d.ts +6 -0
- package/dist/setup-connections/index.d.ts.map +1 -0
- package/dist/setup-connections/index.js +6 -0
- package/dist/setup-connections/index.js.map +1 -0
- package/dist/setup-connections/onboarding.d.ts +14 -0
- package/dist/setup-connections/onboarding.d.ts.map +1 -0
- package/dist/setup-connections/onboarding.js +23 -0
- package/dist/setup-connections/onboarding.js.map +1 -0
- package/dist/transcription/builder-transcription.d.ts +1 -0
- package/dist/transcription/builder-transcription.d.ts.map +1 -1
- package/dist/transcription/builder-transcription.js +5 -2
- package/dist/transcription/builder-transcription.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +52 -0
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +87 -80
- package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
- package/docs/content/toolkit-agent-ux.mdx +43 -0
- package/docs/content/toolkit-app-adapters.mdx +9 -0
- package/docs/content/toolkit-collaboration-ui.mdx +12 -0
- package/docs/content/toolkit-collaboration.mdx +74 -0
- package/docs/content/toolkit-command-navigation.mdx +106 -0
- package/docs/content/toolkit-comments-review.mdx +98 -0
- package/docs/content/toolkit-history.mdx +95 -0
- package/docs/content/toolkit-observability.mdx +41 -0
- package/docs/content/toolkit-org-team.mdx +80 -0
- package/docs/content/toolkit-resources.mdx +57 -0
- package/docs/content/toolkit-settings.mdx +65 -0
- package/docs/content/toolkit-setup-connections.mdx +109 -0
- package/docs/content/toolkit-sharing-ui.mdx +18 -6
- package/docs/content/toolkit-sharing.mdx +81 -0
- package/docs/content/toolkit-shell-hooks.mdx +9 -0
- package/docs/content/toolkit-ui.mdx +9 -0
- package/package.json +36 -2
- package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +0 -153
- package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +0 -133
- package/corpus/templates/design/app/pages/DesignEditor.tsx +0 -22924
|
@@ -9,21 +9,35 @@
|
|
|
9
9
|
* { type: 'motion-load-tracks', tracks: Array<{
|
|
10
10
|
* targetNodeId: string,
|
|
11
11
|
* property: string,
|
|
12
|
-
* keyframes: Array<{ t: number, value: string, ease?: string }
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
12
|
+
* keyframes: Array<{ t: number, value: string, ease?: string }>,
|
|
13
|
+
* delayMs?: number, // track start offset within the timeline
|
|
14
|
+
* durationMs?: number // per-track span; omitted = whole timeline
|
|
15
|
+
* }>, defaultEase?: string, durationMs?: number }
|
|
16
|
+
* Load (or replace) the track list. Keyframe t ∈ [0, 1] is normalised to
|
|
17
|
+
* the TRACK's own span. defaultEase is the timeline-level fallback easing
|
|
18
|
+
* applied to any keyframe that omits its own `ease` (mirrors the compiled
|
|
19
|
+
* stylesheet); defaults to "ease". durationMs is the timeline duration,
|
|
20
|
+
* needed to map offset tracks; also refreshed by each motion-preview tick.
|
|
17
21
|
*
|
|
18
22
|
* { type: 'motion-preview', t, durationMs }
|
|
19
|
-
* Seek all loaded tracks to normalised position t ∈ [0, 1] and
|
|
20
|
-
* interpolated CSS property values as inline styles on the matching
|
|
21
|
-
* [data-agent-native-node-id="…"] elements.
|
|
23
|
+
* Seek all loaded tracks to normalised TIMELINE position t ∈ [0, 1] and
|
|
24
|
+
* apply interpolated CSS property values as inline styles on the matching
|
|
25
|
+
* [data-agent-native-node-id="…"] elements. Tracks with delayMs /
|
|
26
|
+
* durationMs map the timeline time into their own span, clamping outside
|
|
27
|
+
* it (animation-fill-mode: both semantics). Never writes to storage.
|
|
22
28
|
*
|
|
23
29
|
* { type: 'motion-preview-clear' }
|
|
24
30
|
* Remove all motion-preview inline-style overrides and the in-memory
|
|
25
31
|
* track list. Called when the dock is closed or the timeline is discarded.
|
|
26
32
|
*
|
|
33
|
+
* Easing parity: per-segment easing reads the ease of the keyframe LEAVING
|
|
34
|
+
* each interval (CSS keyframe semantics — equivalently, Figma's easing INTO
|
|
35
|
+
* the next keyframe). Supported forms: CSS keywords, cubic-bezier(...),
|
|
36
|
+
* steps(...), CSS linear(...) stop lists, and real spring physics via
|
|
37
|
+
* spring(bounce[, settle]) tokens — keep the samplers in sync with
|
|
38
|
+
* shared/motion-easing.ts. Playback modes (loop/once/ping-pong) live in the
|
|
39
|
+
* MotionDock's rAF driver, which shapes the `t` values it sends here.
|
|
40
|
+
*
|
|
27
41
|
* Rules:
|
|
28
42
|
* • No import/require of any module (DOM globals only).
|
|
29
43
|
* • No references to outer/module scope (the code runs inside an iframe).
|
|
@@ -35,12 +49,19 @@
|
|
|
35
49
|
targetNodeId: string;
|
|
36
50
|
property: string;
|
|
37
51
|
keyframes: Array<{ t: number; value: string; ease?: string }>;
|
|
52
|
+
delayMs?: number;
|
|
53
|
+
durationMs?: number;
|
|
38
54
|
}> = [];
|
|
39
55
|
// Timeline-level default easing sent alongside the tracks. Applied to any
|
|
40
56
|
// keyframe that omits its own `ease`, matching the compiled stylesheet's
|
|
41
57
|
// defaultEase fallback so scrub/playback preview equals the persisted CSS.
|
|
42
58
|
// Falls back to "ease" when the loader doesn't provide one.
|
|
43
59
|
var loadedDefaultEase = "ease";
|
|
60
|
+
// Timeline duration in ms, needed to map timeline time into the local span
|
|
61
|
+
// of tracks that carry delayMs / durationMs offsets. Provided by
|
|
62
|
+
// 'motion-load-tracks' and refreshed by every 'motion-preview' tick; when
|
|
63
|
+
// unknown, offset-free tracks still preview correctly (local t = t).
|
|
64
|
+
var loadedTimelineDurationMs: number | null = null;
|
|
44
65
|
// Map of nodeId -> [property, ...] we have touched, for cleanup.
|
|
45
66
|
var touchedProps: Record<string, string[]> = {};
|
|
46
67
|
// Map of nodeId -> property -> original inline style value.
|
|
@@ -348,13 +369,131 @@
|
|
|
348
369
|
);
|
|
349
370
|
}
|
|
350
371
|
}
|
|
351
|
-
//
|
|
372
|
+
// Real spring physics: spring(bounce[, settle]) tokens sampled from a
|
|
373
|
+
// damped oscillator. Keep in sync with shared/motion-easing.ts.
|
|
352
374
|
if (raw.indexOf("spring") === 0) {
|
|
353
|
-
|
|
375
|
+
var spr = parseSpringEase(raw);
|
|
376
|
+
if (spr) return sampleSpringAt(spr[0], spr[1], clamped);
|
|
377
|
+
return clamped;
|
|
378
|
+
}
|
|
379
|
+
// CSS linear(...) stop lists (compiled springs / recovered timelines).
|
|
380
|
+
if (raw.indexOf("linear(") === 0) {
|
|
381
|
+
var lin = evalCssLinear(raw, clamped);
|
|
382
|
+
if (lin !== null) return lin;
|
|
354
383
|
}
|
|
355
384
|
return clamped;
|
|
356
385
|
}
|
|
357
386
|
|
|
387
|
+
// Parse spring(bounce[, settle]) or the bare `spring` keyword into
|
|
388
|
+
// [bounce, settle], or null. Mirror of shared/motion-easing.ts.
|
|
389
|
+
function parseSpringEase(raw: string): [number, number] | null {
|
|
390
|
+
if (/^spring$/.test(raw)) return [0.25, 1];
|
|
391
|
+
var m = /^spring\(\s*([+-]?[\d.]+)\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/.exec(
|
|
392
|
+
raw,
|
|
393
|
+
);
|
|
394
|
+
if (!m) return null;
|
|
395
|
+
var bounce = parseFloat(m[1]);
|
|
396
|
+
if (!Number.isFinite(bounce)) return null;
|
|
397
|
+
var settle = m[2] === undefined ? 1 : parseFloat(m[2]);
|
|
398
|
+
if (!Number.isFinite(settle)) return null;
|
|
399
|
+
if (settle < 0.05) settle = 0.05;
|
|
400
|
+
if (settle > 1) settle = 1;
|
|
401
|
+
return [clamp01(bounce), settle];
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Damped-oscillator sampler. Mirror of sampleSpring in
|
|
405
|
+
// shared/motion-easing.ts — keep the two in sync.
|
|
406
|
+
function sampleSpringAt(bounce: number, settle: number, x: number): number {
|
|
407
|
+
if (x <= 0) return 0;
|
|
408
|
+
var u = x / settle;
|
|
409
|
+
if (u >= 1) return 1;
|
|
410
|
+
var zeta = 1 - clamp01(bounce);
|
|
411
|
+
if (zeta < 0.02) zeta = 0.02;
|
|
412
|
+
if (zeta > 1) zeta = 1;
|
|
413
|
+
var omega = Math.log(1 / 0.001) / zeta;
|
|
414
|
+
if (zeta >= 1) {
|
|
415
|
+
return 1 - Math.exp(-omega * u) * (1 + omega * u);
|
|
416
|
+
}
|
|
417
|
+
var omegaD = omega * Math.sqrt(1 - zeta * zeta);
|
|
418
|
+
var decay = Math.exp(-zeta * omega * u);
|
|
419
|
+
return (
|
|
420
|
+
1 -
|
|
421
|
+
decay *
|
|
422
|
+
(Math.cos(omegaD * u) +
|
|
423
|
+
((zeta * omega) / omegaD) * Math.sin(omegaD * u))
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// Evaluate a CSS linear(value <percent>{0,2}, ...) timing function at
|
|
428
|
+
// progress x. Mirror of evaluateCssLinear in shared/motion-easing.ts.
|
|
429
|
+
function evalCssLinear(raw: string, x: number): number | null {
|
|
430
|
+
var m = /^linear\(([^)]*)\)$/.exec(raw);
|
|
431
|
+
if (!m) return null;
|
|
432
|
+
var entries = m[1].split(",");
|
|
433
|
+
var values: number[] = [];
|
|
434
|
+
var positions: Array<number | null> = [];
|
|
435
|
+
for (var i = 0; i < entries.length; i++) {
|
|
436
|
+
var entry = entries[i].trim();
|
|
437
|
+
if (!entry) continue;
|
|
438
|
+
var parts = entry.split(/\s+/);
|
|
439
|
+
var value = parseFloat(parts[0]);
|
|
440
|
+
if (!Number.isFinite(value)) return null;
|
|
441
|
+
var found = 0;
|
|
442
|
+
for (var j = 1; j < parts.length && j <= 2; j++) {
|
|
443
|
+
if (!/%$/.test(parts[j])) return null;
|
|
444
|
+
var pct = parseFloat(parts[j]);
|
|
445
|
+
if (!Number.isFinite(pct)) return null;
|
|
446
|
+
values.push(value);
|
|
447
|
+
positions.push(pct / 100);
|
|
448
|
+
found++;
|
|
449
|
+
}
|
|
450
|
+
if (found === 0) {
|
|
451
|
+
values.push(value);
|
|
452
|
+
positions.push(null);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
if (values.length < 2) return null;
|
|
456
|
+
if (positions[0] === null) positions[0] = 0;
|
|
457
|
+
if (positions[positions.length - 1] === null) {
|
|
458
|
+
positions[positions.length - 1] = 1;
|
|
459
|
+
}
|
|
460
|
+
var runningMax = positions[0] as number;
|
|
461
|
+
for (var k = 0; k < positions.length; k++) {
|
|
462
|
+
var pos = positions[k];
|
|
463
|
+
if (pos !== null) {
|
|
464
|
+
var clampedPos = pos < runningMax ? runningMax : pos;
|
|
465
|
+
positions[k] = clampedPos;
|
|
466
|
+
runningMax = clampedPos;
|
|
467
|
+
continue;
|
|
468
|
+
}
|
|
469
|
+
var nextIdx = k + 1;
|
|
470
|
+
while (nextIdx < positions.length && positions[nextIdx] === null) {
|
|
471
|
+
nextIdx++;
|
|
472
|
+
}
|
|
473
|
+
var prevPos = runningMax;
|
|
474
|
+
var nextPosRaw = positions[nextIdx] as number;
|
|
475
|
+
var nextPos = nextPosRaw < prevPos ? prevPos : nextPosRaw;
|
|
476
|
+
var span = nextIdx - (k - 1);
|
|
477
|
+
for (var q = k; q < nextIdx; q++) {
|
|
478
|
+
positions[q] = prevPos + ((q - (k - 1)) / span) * (nextPos - prevPos);
|
|
479
|
+
}
|
|
480
|
+
k = nextIdx - 1;
|
|
481
|
+
runningMax = nextPos;
|
|
482
|
+
}
|
|
483
|
+
var cx = clamp01(x);
|
|
484
|
+
if (cx <= (positions[0] as number)) return values[0];
|
|
485
|
+
for (var p = 0; p < values.length - 1; p++) {
|
|
486
|
+
var aPos = positions[p] as number;
|
|
487
|
+
var bPos = positions[p + 1] as number;
|
|
488
|
+
if (cx > bPos) continue;
|
|
489
|
+
if (bPos === aPos) return values[p + 1];
|
|
490
|
+
return (
|
|
491
|
+
values[p] + ((values[p + 1] - values[p]) * (cx - aPos)) / (bPos - aPos)
|
|
492
|
+
);
|
|
493
|
+
}
|
|
494
|
+
return values[values.length - 1];
|
|
495
|
+
}
|
|
496
|
+
|
|
358
497
|
// Build the identity counterpart of a transform/filter list so a
|
|
359
498
|
// `none` endpoint interpolates smoothly instead of midpoint-snapping
|
|
360
499
|
// (e.g. none -> translateY(16px) lerps from translateY(0px)).
|
|
@@ -505,6 +644,32 @@
|
|
|
505
644
|
return lerp(prev.value, next.value, eased);
|
|
506
645
|
}
|
|
507
646
|
|
|
647
|
+
// Map a normalised TIMELINE time to a track-local normalised time,
|
|
648
|
+
// honouring the track's delayMs / durationMs span. Clamped outside the
|
|
649
|
+
// span (animation-fill-mode: both semantics). Without a known timeline
|
|
650
|
+
// duration, offset-free tracks behave as before (local t = t).
|
|
651
|
+
function trackLocalT(
|
|
652
|
+
track: { delayMs?: number; durationMs?: number },
|
|
653
|
+
t: number,
|
|
654
|
+
): number {
|
|
655
|
+
var delay =
|
|
656
|
+
typeof track.delayMs === "number" && track.delayMs > 0
|
|
657
|
+
? track.delayMs
|
|
658
|
+
: 0;
|
|
659
|
+
var dur =
|
|
660
|
+
typeof track.durationMs === "number" && track.durationMs > 0
|
|
661
|
+
? track.durationMs
|
|
662
|
+
: null;
|
|
663
|
+
if (loadedTimelineDurationMs === null || (delay === 0 && dur === null)) {
|
|
664
|
+
return t;
|
|
665
|
+
}
|
|
666
|
+
var timeMs = t * loadedTimelineDurationMs;
|
|
667
|
+
var span = dur === null ? loadedTimelineDurationMs : dur;
|
|
668
|
+
if (span <= 0) return 0;
|
|
669
|
+
var local = (timeMs - delay) / span;
|
|
670
|
+
return local < 0 ? 0 : local > 1 ? 1 : local;
|
|
671
|
+
}
|
|
672
|
+
|
|
508
673
|
function applyPreview(t: number): void {
|
|
509
674
|
for (var i = 0; i < loadedTracks.length; i++) {
|
|
510
675
|
var track = loadedTracks[i];
|
|
@@ -512,7 +677,7 @@
|
|
|
512
677
|
'[data-agent-native-node-id="' + track.targetNodeId + '"]',
|
|
513
678
|
) as HTMLElement | null;
|
|
514
679
|
if (!el) continue;
|
|
515
|
-
var value = interpolate(track.keyframes, t);
|
|
680
|
+
var value = interpolate(track.keyframes, trackLocalT(track, t));
|
|
516
681
|
if (value === "") continue;
|
|
517
682
|
// Normalize kebab properties (e.g. background-color) to the camelCase
|
|
518
683
|
// CSSOM accessor; el.style['background-color'] = … is unreliable.
|
|
@@ -552,6 +717,7 @@
|
|
|
552
717
|
originalInlineValues = {};
|
|
553
718
|
loadedTracks = [];
|
|
554
719
|
loadedDefaultEase = "ease";
|
|
720
|
+
loadedTimelineDurationMs = null;
|
|
555
721
|
}
|
|
556
722
|
|
|
557
723
|
// Last previewed playhead position, so reloading the track list (which
|
|
@@ -573,6 +739,12 @@
|
|
|
573
739
|
typeof e.data.defaultEase === "string" && e.data.defaultEase
|
|
574
740
|
? e.data.defaultEase
|
|
575
741
|
: "ease";
|
|
742
|
+
// Timeline duration (read AFTER clearPreview, which resets it): needed
|
|
743
|
+
// to map offset tracks before the first motion-preview tick arrives.
|
|
744
|
+
var loadDur = Number(e.data.durationMs);
|
|
745
|
+
if (Number.isFinite(loadDur) && loadDur > 0) {
|
|
746
|
+
loadedTimelineDurationMs = loadDur;
|
|
747
|
+
}
|
|
576
748
|
// Defensive: interpolate() scans keyframe pairs in array order, so an
|
|
577
749
|
// unsorted track (e.g. mid-drag ordering) would fail the window test.
|
|
578
750
|
for (var i = 0; i < loadedTracks.length; i++) {
|
|
@@ -592,6 +764,10 @@
|
|
|
592
764
|
var t = Number(e.data.t);
|
|
593
765
|
if (!Number.isFinite(t)) return;
|
|
594
766
|
t = Math.max(0, Math.min(1, t));
|
|
767
|
+
var tickDur = Number(e.data.durationMs);
|
|
768
|
+
if (Number.isFinite(tickDur) && tickDur > 0) {
|
|
769
|
+
loadedTimelineDurationMs = tickDur;
|
|
770
|
+
}
|
|
595
771
|
lastPreviewT = t;
|
|
596
772
|
applyPreview(t);
|
|
597
773
|
return;
|
|
@@ -10,13 +10,49 @@
|
|
|
10
10
|
* Apply `css` as the `background` inline style on the first element that
|
|
11
11
|
* matches `selector` (preferred) or `[data-agent-native-node-id="nodeId"]`.
|
|
12
12
|
* When both are absent, targets `document.body`. Stores the previous
|
|
13
|
-
* background value so it can be restored on clear.
|
|
13
|
+
* background value so it can be restored on clear. `css` is run through
|
|
14
|
+
* isSafeBackgroundStyleValue() below (a minimal duplicate of
|
|
15
|
+
* isSafeStyleValue() in shared/code-layer.ts) before it ever touches
|
|
16
|
+
* el.style.background — unsafe values are dropped silently (no style
|
|
17
|
+
* write) and a `shader-fill-preview-rejected` message is posted back.
|
|
14
18
|
* Preview-only — never writes to DB, Yjs, or source files.
|
|
15
19
|
*
|
|
16
20
|
* { type: 'shader-fill-preview-clear' }
|
|
17
21
|
* Remove the applied background override and restore the previous value.
|
|
18
22
|
* Called when the user discards the preview or switches selections.
|
|
19
23
|
*
|
|
24
|
+
* GLSL protocol (delegates to the code-backed shader runtime injected right
|
|
25
|
+
* before this bridge — see shader-runtime.bridge.ts / window.__anShaders; all
|
|
26
|
+
* of these no-op harmlessly when the runtime is unavailable):
|
|
27
|
+
*
|
|
28
|
+
* { type: 'glsl-shader-preview', target: { selector?, nodeId? },
|
|
29
|
+
* shader: { id?, name?, glsl, uniforms? }, values?, mode: 'fill'|'effect' }
|
|
30
|
+
* Mount a live WebGL preview of the shader on the target element without
|
|
31
|
+
* persisting anything. Only the iframe that actually contains the target
|
|
32
|
+
* mounts it (no body fallback), so the parent can safely broadcast to
|
|
33
|
+
* every screen iframe. `shader.glsl`/`shader.uniforms` are run through
|
|
34
|
+
* validatePreviewShaderDef() below — a minimal duplicate of the
|
|
35
|
+
* structural checks validateShaderDef()/validateGlslSource()/
|
|
36
|
+
* validateUniformManifest() apply on the persist path in
|
|
37
|
+
* shared/shader-fills.ts — before ever reaching the WebGL compiler; a
|
|
38
|
+
* rejected shader posts `glsl-shader-preview-rejected` with the reasons
|
|
39
|
+
* instead of compiling. Also enforces a local MAX_PREVIEW_MOUNTS (8) cap
|
|
40
|
+
* — every accepted preview request increments a counter that only resets
|
|
41
|
+
* on `glsl-shader-preview-clear` — matching the runtime's own MAX_MOUNTS,
|
|
42
|
+
* independent of the runtime's internal bookkeeping.
|
|
43
|
+
*
|
|
44
|
+
* { type: 'glsl-shader-set-uniform', filter: { shaderId?, nodeId?, preview? },
|
|
45
|
+
* name, value }
|
|
46
|
+
* Live-update one uniform on matching mounts (knob scrubbing).
|
|
47
|
+
*
|
|
48
|
+
* { type: 'glsl-shader-update', id, glsl?, uniforms? }
|
|
49
|
+
* Hot-swap a registered shader's source/manifest (Edit-code live preview).
|
|
50
|
+
* Same structural validation as glsl-shader-preview runs before the
|
|
51
|
+
* hot-swap is forwarded to the runtime.
|
|
52
|
+
*
|
|
53
|
+
* { type: 'glsl-shader-preview-clear' } — unmount preview mounts.
|
|
54
|
+
* { type: 'glsl-shader-rescan' } — re-scan persisted annotations.
|
|
55
|
+
*
|
|
20
56
|
* Rules:
|
|
21
57
|
* • No import/require of any module (DOM globals only).
|
|
22
58
|
* • No references to outer/module scope (the code runs inside an iframe).
|
|
@@ -43,9 +79,45 @@
|
|
|
43
79
|
return document.body;
|
|
44
80
|
}
|
|
45
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Minimal inline equivalent of isSafeStyleValue() in shared/code-layer.ts
|
|
84
|
+
* (the sanitizer the persist path runs style edits through), scoped to the
|
|
85
|
+
* one property this bridge ever writes: the `background` shorthand. Bridge
|
|
86
|
+
* files cannot import shared modules (see bridge.guard.spec.ts's no-import
|
|
87
|
+
* guard), so this duplicates the source-of-truth's rules instead of
|
|
88
|
+
* reusing them — keep in sync with isSafeStyleValue() in
|
|
89
|
+
* shared/code-layer.ts:
|
|
90
|
+
* - reject empty values
|
|
91
|
+
* - reject expression(...) and javascript: breakouts
|
|
92
|
+
* - reject url(...) (only the background-image longhand is ever allowed
|
|
93
|
+
* a url() reference on the persist path; the background shorthand
|
|
94
|
+
* this bridge writes stays on the strict no-url path)
|
|
95
|
+
* - reject raw <>{}; breakout characters
|
|
96
|
+
*/
|
|
97
|
+
function isSafeBackgroundStyleValue(value: string): boolean {
|
|
98
|
+
if (typeof value !== "string") return false;
|
|
99
|
+
var trimmed = value.trim();
|
|
100
|
+
if (!trimmed) return false;
|
|
101
|
+
if (/expression\s*\(/i.test(trimmed)) return false;
|
|
102
|
+
if (/javascript\s*:/i.test(trimmed)) return false;
|
|
103
|
+
if (/url\s*\(/i.test(trimmed)) return false;
|
|
104
|
+
if (/[<>{};]/.test(trimmed)) return false;
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
|
|
46
108
|
function applyPreview(selector: string, nodeId: string, css: string): void {
|
|
47
109
|
// Clear any prior patch first so we don't stack patches.
|
|
48
110
|
clearPreview();
|
|
111
|
+
if (css && !isSafeBackgroundStyleValue(css)) {
|
|
112
|
+
// Reject silently (no style write) + tell the parent why.
|
|
113
|
+
try {
|
|
114
|
+
window.parent.postMessage(
|
|
115
|
+
{ type: "shader-fill-preview-rejected", reason: "unsafe-css-value" },
|
|
116
|
+
"*",
|
|
117
|
+
);
|
|
118
|
+
} catch (_err) {}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
49
121
|
var el = resolveTarget(selector, nodeId);
|
|
50
122
|
if (!el) return;
|
|
51
123
|
originalBackground = el.style.background || "";
|
|
@@ -60,6 +132,214 @@
|
|
|
60
132
|
originalBackground = "";
|
|
61
133
|
}
|
|
62
134
|
|
|
135
|
+
/**
|
|
136
|
+
* Minimal inline duplicate of the STRUCTURAL (string-level) checks
|
|
137
|
+
* validateGlslSource() / validateUniformManifest() / validateShaderDef()
|
|
138
|
+
* apply on the persist path in shared/shader-fills.ts, run here before any
|
|
139
|
+
* preview/live-edit GLSL reaches the WebGL compiler. Bridge files cannot
|
|
140
|
+
* import shared modules (see bridge.guard.spec.ts's no-import guard), so
|
|
141
|
+
* this duplicates the source-of-truth's rules instead of reusing them —
|
|
142
|
+
* keep in sync with shared/shader-fills.ts. Deliberately a SUBSET: it skips
|
|
143
|
+
* the cross-check that every manifest uniform is declared in the GLSL with
|
|
144
|
+
* the matching type (a knob-completeness nicety, not a GPU-hang/injection
|
|
145
|
+
* risk), since previews render even with unused/partial knobs.
|
|
146
|
+
*
|
|
147
|
+
* Script-tag handling also intentionally differs from a naive "reject both
|
|
148
|
+
* tags" rule, to stay in sync with shader script breakout hardening in
|
|
149
|
+
* shared/shader-fills.ts: an opening `<script` tag is a real injection
|
|
150
|
+
* vector (starts a brand new, arbitrary script), so it stays a hard
|
|
151
|
+
* rejection here too. A bare closing `</script` — e.g. inside a GLSL line
|
|
152
|
+
* comment — is NOT rejected here or on the persist path: escaping
|
|
153
|
+
* (escapeShaderScriptBreakout) happens only at persist-time serialization
|
|
154
|
+
* (serializeShaderScriptBlock), not here on the preview path, since preview
|
|
155
|
+
* GLSL never gets embedded in a `<script>` block in the first place.
|
|
156
|
+
*/
|
|
157
|
+
var MAX_GLSL_LENGTH = 20000;
|
|
158
|
+
var UNIFORM_NAME_RE = /^u_[A-Za-z0-9_]{1,48}$/;
|
|
159
|
+
var SHADER_BUILTIN_UNIFORMS = ["u_time", "u_resolution"];
|
|
160
|
+
|
|
161
|
+
function validatePreviewGlslSource(glsl: unknown): string[] {
|
|
162
|
+
var errors: string[] = [];
|
|
163
|
+
if (typeof glsl !== "string" || glsl.trim().length === 0) {
|
|
164
|
+
return ["GLSL source is empty"];
|
|
165
|
+
}
|
|
166
|
+
if (glsl.length > MAX_GLSL_LENGTH) {
|
|
167
|
+
errors.push(
|
|
168
|
+
"GLSL source is " + glsl.length + " chars — max is " + MAX_GLSL_LENGTH,
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
if (!/void\s+main\s*\(/.test(glsl)) {
|
|
172
|
+
errors.push("GLSL source must define void main()");
|
|
173
|
+
}
|
|
174
|
+
if (!/gl_FragColor/.test(glsl)) {
|
|
175
|
+
errors.push("GLSL source must write gl_FragColor");
|
|
176
|
+
}
|
|
177
|
+
if (/<script/i.test(glsl)) {
|
|
178
|
+
errors.push("GLSL source must not contain an opening script tag");
|
|
179
|
+
}
|
|
180
|
+
// eslint-disable-next-line no-control-regex
|
|
181
|
+
if (/[\u0000-\u0008\u000B\u000C\u000E-\u001F]/.test(glsl)) {
|
|
182
|
+
errors.push("GLSL source contains control characters");
|
|
183
|
+
}
|
|
184
|
+
return errors;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function validatePreviewUniformManifest(uniforms: unknown): string[] {
|
|
188
|
+
var errors: string[] = [];
|
|
189
|
+
if (uniforms === undefined || uniforms === null) return errors;
|
|
190
|
+
if (typeof uniforms !== "object") {
|
|
191
|
+
return ["uniforms manifest must be an object"];
|
|
192
|
+
}
|
|
193
|
+
var manifest = uniforms as Record<string, unknown>;
|
|
194
|
+
var names = Object.keys(manifest);
|
|
195
|
+
if (names.length > 16) {
|
|
196
|
+
errors.push("too many uniforms (" + names.length + ") — max is 16");
|
|
197
|
+
}
|
|
198
|
+
for (var i = 0; i < names.length; i++) {
|
|
199
|
+
var name = names[i];
|
|
200
|
+
var def = manifest[name] as
|
|
201
|
+
| { type?: unknown; value?: unknown; min?: unknown; max?: unknown }
|
|
202
|
+
| undefined;
|
|
203
|
+
if (!UNIFORM_NAME_RE.test(name)) {
|
|
204
|
+
errors.push(
|
|
205
|
+
'uniform "' + name + '" must match u_[A-Za-z0-9_]+ (max 50 chars)',
|
|
206
|
+
);
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (SHADER_BUILTIN_UNIFORMS.indexOf(name) !== -1) {
|
|
210
|
+
errors.push(
|
|
211
|
+
'uniform "' + name + '" is a built-in provided by the runtime',
|
|
212
|
+
);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (!def || typeof def !== "object") {
|
|
216
|
+
errors.push('uniform "' + name + '" definition must be an object');
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (def.type === "float") {
|
|
220
|
+
if (typeof def.value !== "number" || !isFinite(def.value as number)) {
|
|
221
|
+
errors.push('uniform "' + name + '" value must be a finite number');
|
|
222
|
+
}
|
|
223
|
+
} else if (def.type === "vec2") {
|
|
224
|
+
var v = def.value;
|
|
225
|
+
if (
|
|
226
|
+
!Array.isArray(v) ||
|
|
227
|
+
v.length !== 2 ||
|
|
228
|
+
typeof v[0] !== "number" ||
|
|
229
|
+
typeof v[1] !== "number" ||
|
|
230
|
+
!isFinite(v[0]) ||
|
|
231
|
+
!isFinite(v[1])
|
|
232
|
+
) {
|
|
233
|
+
errors.push(
|
|
234
|
+
'uniform "' + name + '" value must be [x, y] finite numbers',
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
} else if (def.type === "color") {
|
|
238
|
+
if (
|
|
239
|
+
typeof def.value !== "string" ||
|
|
240
|
+
!/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(def.value)
|
|
241
|
+
) {
|
|
242
|
+
errors.push(
|
|
243
|
+
'uniform "' + name + '" value must be a hex color like "#1a2b3c"',
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
} else {
|
|
247
|
+
errors.push(
|
|
248
|
+
'uniform "' + name + '" has unknown type — use float, vec2, or color',
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return errors;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Full structural validation for a preview/live-edit shader def. Returns an
|
|
257
|
+
* empty array when valid. Mirrors validateShaderDef()'s string-level checks
|
|
258
|
+
* (see the comment above) without the GLSL↔manifest type cross-check.
|
|
259
|
+
*/
|
|
260
|
+
function validatePreviewShaderDef(shader: {
|
|
261
|
+
id?: unknown;
|
|
262
|
+
name?: unknown;
|
|
263
|
+
glsl?: unknown;
|
|
264
|
+
uniforms?: unknown;
|
|
265
|
+
}): string[] {
|
|
266
|
+
var errors = validatePreviewGlslSource(shader.glsl);
|
|
267
|
+
errors = errors.concat(validatePreviewUniformManifest(shader.uniforms));
|
|
268
|
+
if (shader.name !== undefined) {
|
|
269
|
+
if (typeof shader.name !== "string" || shader.name.length > 80) {
|
|
270
|
+
errors.push("shader name must be a string ≤ 80 chars");
|
|
271
|
+
} else if (
|
|
272
|
+
shader.name.indexOf("*/") !== -1 ||
|
|
273
|
+
/<\/?script/i.test(shader.name)
|
|
274
|
+
) {
|
|
275
|
+
errors.push("shader name contains forbidden sequences");
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return errors;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function postShaderRejected(errors: string[]): void {
|
|
282
|
+
try {
|
|
283
|
+
window.parent.postMessage(
|
|
284
|
+
{ type: "glsl-shader-preview-rejected", errors: errors },
|
|
285
|
+
"*",
|
|
286
|
+
);
|
|
287
|
+
} catch (_err) {}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Local preview-mount bookkeeping — enforces the same cap the runtime uses
|
|
291
|
+
// (MAX_MOUNTS = 8 in shader-runtime.bridge.ts) independent of the
|
|
292
|
+
// runtime's own internal `mounts` array, which this bridge has no access
|
|
293
|
+
// to (no imports). Today's single-target glsl-shader-preview protocol only
|
|
294
|
+
// ever needs ONE live preview mount at a time (the runtime's own
|
|
295
|
+
// applyPreview() tears down any prior preview mount before creating a new
|
|
296
|
+
// one), so this counter is deliberately conservative: it counts every
|
|
297
|
+
// ACCEPTED preview request since the last explicit clear rather than
|
|
298
|
+
// trusting that every caller pairs each preview with one, so a
|
|
299
|
+
// hostile/misbehaving parent that fires many previews without ever
|
|
300
|
+
// clearing still gets capped at MAX_PREVIEW_MOUNTS instead of unbounded
|
|
301
|
+
// WebGL context churn.
|
|
302
|
+
var MAX_PREVIEW_MOUNTS = 8;
|
|
303
|
+
var acceptedPreviewCountSinceClear = 0;
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* The code-backed GLSL runtime (shader-runtime.bridge.ts) registers itself
|
|
307
|
+
* as window.__anShaders. It is injected immediately before this bridge in
|
|
308
|
+
* the editor, and embedded directly in persisted screen HTML. Everything
|
|
309
|
+
* here degrades to a no-op when it is missing.
|
|
310
|
+
*/
|
|
311
|
+
interface AnShadersGlobal {
|
|
312
|
+
version: number;
|
|
313
|
+
scan: () => void;
|
|
314
|
+
applyPreview: (
|
|
315
|
+
target: { nodeId?: string; selector?: string },
|
|
316
|
+
def: {
|
|
317
|
+
id?: string;
|
|
318
|
+
name?: string;
|
|
319
|
+
glsl: string;
|
|
320
|
+
uniforms?: Record<string, unknown>;
|
|
321
|
+
values?: Record<string, unknown>;
|
|
322
|
+
},
|
|
323
|
+
mode?: string,
|
|
324
|
+
) => boolean;
|
|
325
|
+
clearPreview: () => void;
|
|
326
|
+
setUniform: (
|
|
327
|
+
filter: { shaderId?: string; nodeId?: string; preview?: boolean },
|
|
328
|
+
name: string,
|
|
329
|
+
value: unknown,
|
|
330
|
+
) => void;
|
|
331
|
+
updateShader: (
|
|
332
|
+
id: string,
|
|
333
|
+
patch: { glsl?: string; uniforms?: Record<string, unknown> },
|
|
334
|
+
) => void;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
function runtime(): AnShadersGlobal | null {
|
|
338
|
+
var api = (window as unknown as { __anShaders?: AnShadersGlobal })
|
|
339
|
+
.__anShaders;
|
|
340
|
+
return api && api.version >= 1 ? api : null;
|
|
341
|
+
}
|
|
342
|
+
|
|
63
343
|
window.addEventListener("message", function (e: MessageEvent) {
|
|
64
344
|
if (e.source !== window.parent) return;
|
|
65
345
|
if (!e.data || typeof e.data.type !== "string") return;
|
|
@@ -74,5 +354,100 @@
|
|
|
74
354
|
clearPreview();
|
|
75
355
|
return;
|
|
76
356
|
}
|
|
357
|
+
if (e.data.type === "glsl-shader-preview") {
|
|
358
|
+
var api = runtime();
|
|
359
|
+
if (!api) return;
|
|
360
|
+
var target =
|
|
361
|
+
e.data.target && typeof e.data.target === "object" ? e.data.target : {};
|
|
362
|
+
var shader =
|
|
363
|
+
e.data.shader && typeof e.data.shader === "object"
|
|
364
|
+
? e.data.shader
|
|
365
|
+
: null;
|
|
366
|
+
if (!shader || typeof shader.glsl !== "string") return;
|
|
367
|
+
// Reject a hostile/broken shader BEFORE it ever reaches the WebGL
|
|
368
|
+
// compiler (GPU-hang risk from arbitrary postMessage GLSL) — same
|
|
369
|
+
// structural checks the persist path runs via validateShaderDef().
|
|
370
|
+
var validationErrors = validatePreviewShaderDef(shader);
|
|
371
|
+
if (validationErrors.length > 0) {
|
|
372
|
+
postShaderRejected(validationErrors);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
// Enforce the same mount cap the runtime uses (8), independent of the
|
|
376
|
+
// runtime's own bookkeeping — see acceptedPreviewCountSinceClear above.
|
|
377
|
+
if (acceptedPreviewCountSinceClear >= MAX_PREVIEW_MOUNTS) {
|
|
378
|
+
postShaderRejected([
|
|
379
|
+
"too many active shader previews — max is " + MAX_PREVIEW_MOUNTS,
|
|
380
|
+
]);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
acceptedPreviewCountSinceClear += 1;
|
|
384
|
+
api.applyPreview(
|
|
385
|
+
{ nodeId: target.nodeId, selector: target.selector },
|
|
386
|
+
{
|
|
387
|
+
id: shader.id,
|
|
388
|
+
name: shader.name,
|
|
389
|
+
glsl: shader.glsl,
|
|
390
|
+
uniforms: shader.uniforms,
|
|
391
|
+
values:
|
|
392
|
+
e.data.values && typeof e.data.values === "object"
|
|
393
|
+
? e.data.values
|
|
394
|
+
: undefined,
|
|
395
|
+
},
|
|
396
|
+
e.data.mode === "effect" ? "effect" : "fill",
|
|
397
|
+
);
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
if (e.data.type === "glsl-shader-set-uniform") {
|
|
401
|
+
var api2 = runtime();
|
|
402
|
+
if (!api2) return;
|
|
403
|
+
if (typeof e.data.name !== "string") return;
|
|
404
|
+
api2.setUniform(
|
|
405
|
+
e.data.filter && typeof e.data.filter === "object" ? e.data.filter : {},
|
|
406
|
+
e.data.name,
|
|
407
|
+
e.data.value,
|
|
408
|
+
);
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
if (e.data.type === "glsl-shader-update") {
|
|
412
|
+
var api3 = runtime();
|
|
413
|
+
if (!api3) return;
|
|
414
|
+
if (typeof e.data.id !== "string") return;
|
|
415
|
+
// Same structural validation as glsl-shader-preview before hot-swapping
|
|
416
|
+
// a registered shader's live GLSL/manifest — glsl-shader-update allows
|
|
417
|
+
// a partial patch (e.g. uniforms-only), so only validate whichever
|
|
418
|
+
// parts are actually present in this message.
|
|
419
|
+
var updateErrors: string[] = [];
|
|
420
|
+
if (typeof e.data.glsl === "string") {
|
|
421
|
+
updateErrors = updateErrors.concat(
|
|
422
|
+
validatePreviewGlslSource(e.data.glsl),
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
updateErrors = updateErrors.concat(
|
|
426
|
+
validatePreviewUniformManifest(e.data.uniforms),
|
|
427
|
+
);
|
|
428
|
+
if (updateErrors.length > 0) {
|
|
429
|
+
postShaderRejected(updateErrors);
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
api3.updateShader(e.data.id, {
|
|
433
|
+
glsl: typeof e.data.glsl === "string" ? e.data.glsl : undefined,
|
|
434
|
+
uniforms:
|
|
435
|
+
e.data.uniforms && typeof e.data.uniforms === "object"
|
|
436
|
+
? e.data.uniforms
|
|
437
|
+
: undefined,
|
|
438
|
+
});
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
if (e.data.type === "glsl-shader-preview-clear") {
|
|
442
|
+
var api4 = runtime();
|
|
443
|
+
if (api4) api4.clearPreview();
|
|
444
|
+
acceptedPreviewCountSinceClear = 0;
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
if (e.data.type === "glsl-shader-rescan") {
|
|
448
|
+
var api5 = runtime();
|
|
449
|
+
if (api5) api5.scan();
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
77
452
|
});
|
|
78
453
|
})();
|