@agent-native/core 0.149.1 → 0.149.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/analytics/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/analytics/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/analytics/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/analytics/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/analytics/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +2 -0
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/analytics/AGENTS.md +25 -32
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +150 -46
- package/corpus/templates/analytics/app/global.css +1 -1
- package/corpus/templates/analytics/app/i18n-data.ts +37 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +32 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +2 -0
- package/corpus/templates/analytics/changelog/2026-08-10-dashboard-tables-can-be-copied-and-sorted-by-multiple-column.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/assets/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/assets/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/assets/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/assets/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/assets/AGENTS.md +6 -9
- package/corpus/templates/assets/app/global.css +1 -1
- package/corpus/templates/assets/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/assets/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/brain/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/brain/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/brain/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/brain/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/brain/AGENTS.md +5 -12
- package/corpus/templates/brain/app/global.css +1 -1
- package/corpus/templates/brain/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/brain/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/calendar/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/calendar/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/calendar/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/calendar/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/calendar/AGENTS.md +8 -9
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/chat/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/chat/AGENTS.md +32 -80
- package/corpus/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/clips/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/clips/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/clips/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/clips/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/clips/AGENTS.md +25 -31
- package/corpus/templates/clips/changelog/2026-08-10-clips-desktop-sign-in-now-starts-with-magic-links-and-google.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/overlay.css +1 -0
- package/corpus/templates/clips/desktop/src/app.tsx +274 -137
- package/corpus/templates/clips/desktop/src/styles.css +35 -0
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/content/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/content/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/content/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/content/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/content/AGENTS.md +5 -9
- package/corpus/templates/content/app/global.css +1 -0
- package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/crm/AGENTS.md +7 -11
- package/corpus/templates/crm/app/global.css +1 -1
- package/corpus/templates/crm/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/crm/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/design/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/design/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/design/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/design/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +4 -2
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +70 -3
- package/corpus/templates/design/AGENTS.md +13 -21
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -0
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +19 -2
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +115 -7
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +82 -7
- package/corpus/templates/design/app/components/design/design-trace.ts +120 -0
- package/corpus/templates/design/app/components/design/dnd-debug.ts +2 -1
- package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +40 -26
- package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +4 -1
- package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +12 -3
- package/corpus/templates/design/app/components/design/multi-screen/screen-content-cache.ts +4 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +7 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +3 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +1 -0
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +5 -5
- package/corpus/templates/design/app/pages/DesignSystems.tsx +3 -2
- package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +100 -13
- package/corpus/templates/design/app/pages/design-editor/cross-screen-text-color.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/data-operations.ts +14 -0
- package/corpus/templates/design/changelog/2026-08-10-marquee-selecting-layers-far-down-a-tall-screen-now-selects-.md +6 -0
- package/corpus/templates/design/changelog/2026-08-10-the-frame-tool-draws-a-plain-frame-by-default-with-screen-av.md +6 -0
- package/corpus/templates/design/e2e/global-setup.ts +27 -32
- package/corpus/templates/design/playwright.config.ts +3 -5
- package/corpus/templates/design/shared/breakpoint-media.ts +9 -2
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/dispatch/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/dispatch/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/dispatch/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/dispatch/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/dispatch/AGENTS.md +9 -16
- package/corpus/templates/dispatch/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/factory/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/factory/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/factory/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/factory/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/factory/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/factory/AGENTS.md +10 -24
- package/corpus/templates/factory/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/forms/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/forms/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/forms/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/forms/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/forms/AGENTS.md +11 -17
- package/corpus/templates/forms/app/global.css +1 -0
- package/corpus/templates/forms/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/forms/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/macros/AGENTS.md +8 -8
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/mail/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/mail/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/mail/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/mail/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/mail/AGENTS.md +5 -6
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/plan/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/plan/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/plan/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/plan/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/plan/AGENTS.md +5 -14
- package/corpus/templates/plan/app/global.css +1 -0
- package/corpus/templates/plan/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/corpus/templates/plan/changelog/2026-08-11-plan-no-longer-reloads-when-runtime-state-changes.md +6 -0
- package/corpus/templates/plan/server/ui-plan-html.ts +4 -1
- package/corpus/templates/plan/vite.config.ts +5 -0
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/slides/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/slides/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/slides/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +2 -2
- package/corpus/templates/slides/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +6 -3
- package/corpus/templates/slides/.agents/skills/deck-management/SKILL.md +6 -1
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +3 -2
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +3 -0
- package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +3 -3
- package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/slides/AGENTS.md +33 -35
- package/corpus/templates/slides/actions/add-deck.ts +2 -0
- package/corpus/templates/slides/actions/add-slide.ts +15 -1
- package/corpus/templates/slides/actions/create-deck.ts +18 -6
- package/corpus/templates/slides/actions/get-deck-reference-context.ts +2 -2
- package/corpus/templates/slides/actions/get-deck.ts +83 -7
- package/corpus/templates/slides/actions/import-file.ts +2 -1
- package/corpus/templates/slides/actions/patch-deck.ts +165 -9
- package/corpus/templates/slides/actions/save-deck.ts +24 -1
- package/corpus/templates/slides/actions/update-slide.ts +1 -1
- package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +2 -2
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +1 -23
- package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +2 -2
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +6 -6
- package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +3 -3
- package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +4 -4
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +432 -668
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +296 -259
- package/corpus/templates/slides/app/components/editor/GeneratingSlidePreview.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +13 -1
- package/corpus/templates/slides/app/components/editor/NewDeckReferenceStep.tsx +56 -174
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +241 -116
- package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +42 -14
- package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +6 -12
- package/corpus/templates/slides/app/components/editor/editor-command-model.ts +35 -0
- package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +1 -1
- package/corpus/templates/slides/app/components/layout/Layout.tsx +34 -35
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +8 -10
- package/corpus/templates/slides/app/components/layout/layout-route-policy.ts +2 -5
- package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +45 -40
- package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +63 -16
- package/corpus/templates/slides/app/context/DeckContext.tsx +2 -1
- package/corpus/templates/slides/app/global.css +76 -1
- package/corpus/templates/slides/app/hooks/use-generating-slide-preview.ts +25 -3
- package/corpus/templates/slides/app/i18n/en-US.ts +2 -0
- package/corpus/templates/slides/app/lib/create-deck-generation.ts +52 -23
- package/corpus/templates/slides/app/lib/recent-references.ts +23 -1
- package/corpus/templates/slides/app/lib/slide-animation-elements.ts +104 -3
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +17 -33
- package/corpus/templates/slides/app/pages/DesignSystems.tsx +2 -2
- package/corpus/templates/slides/app/pages/Index.tsx +315 -151
- package/corpus/templates/slides/app/root.tsx +43 -0
- package/corpus/templates/slides/changelog/2026-08-10-ai-editing-avatar-badge.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-generated-decks-keep-a-clear-human-readable-title.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-new-deck-creation-now-shows-progress-opens-the-editor-direct.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-presentation-reveals-now-follow-valid-targets.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-slides-editing-controls-are-consolidated-into-one-focused-me.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-slides-now-verify-and-restyle-every-imported-slide-in-one-pa.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-slides-only-suggests-a-google-connection-for-relevant-reques.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-10-the-google-slides-import-option-is-now-labeled-slides.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-11-faster-slides-chat-deck-reads.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-11-slides-chat-can-read-one-slide-without-loading-the-full-deck.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-11-slides-clearly-indicate-when-an-ai-agent-is-editing-alongsid.md +6 -0
- package/corpus/templates/slides/package.json +1 -0
- package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
- package/corpus/templates/slides/server/lib/validate-slide-animations.ts +163 -0
- package/corpus/templates/slides/server/plugins/agent-chat.ts +8 -5
- package/corpus/templates/slides/shared/api.ts +47 -15
- package/corpus/templates/slides/shared/deck-title.ts +135 -0
- package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +54 -488
- package/corpus/templates/tasks/.agents/skills/actions/references/action-fields.md +136 -0
- package/corpus/templates/tasks/.agents/skills/actions/references/examples.md +94 -0
- package/corpus/templates/tasks/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/tasks/.agents/skills/agent-watchdog/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +9 -35
- package/corpus/templates/tasks/.agents/skills/efficient-fable/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/efficient-frontier/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +4 -5
- package/corpus/templates/tasks/.agents/skills/plan-arbiter/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/plow-ahead/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/quick-recap/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/stay-within-limits/SKILL.md +1 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/corpus/templates/tasks/AGENTS.md +5 -20
- package/corpus/templates/tasks/app/components/tasks/TaskListRow.tsx +4 -1
- package/dist/agent/engine/ai-sdk-engine.js +1 -1
- package/dist/agent/production-agent.d.ts +21 -1
- package/dist/agent/production-agent.js +505 -355
- package/dist/agent/run-manager.js +156 -14
- package/dist/agent/run-store.d.ts +11 -10
- package/dist/agent/run-store.js +17 -13
- package/dist/agent/tool-approval-store.d.ts +18 -0
- package/dist/agent/tool-approval-store.js +122 -0
- package/dist/agent/types.d.ts +1 -1
- package/dist/cli/code-agent-executor.js +11 -2
- package/dist/client/AgentPanel.js +31 -6
- package/dist/client/AssistantChat.d.ts +9 -4
- package/dist/client/AssistantChat.js +221 -149
- package/dist/client/active-run-state.d.ts +9 -1
- package/dist/client/active-run-state.js +34 -3
- package/dist/client/agent-chat/index.d.ts +1 -1
- package/dist/client/agent-chat-adapter.d.ts +8 -0
- package/dist/client/agent-chat-adapter.js +125 -28
- package/dist/client/agent-chat.d.ts +1 -1
- package/dist/client/chat/markdown-renderer.js +14 -2
- package/dist/client/chat/message-components.d.ts +13 -3
- package/dist/client/chat/message-components.js +57 -52
- package/dist/client/chat/run-recovery.d.ts +1 -0
- package/dist/client/chat/run-recovery.js +8 -0
- package/dist/client/chat/tool-call-display.d.ts +5 -5
- package/dist/client/chat/tool-call-display.js +9 -212
- package/dist/client/chat-first/apps-rail.js +3 -3
- package/dist/client/chat-first/browser-pane.js +4 -1
- package/dist/client/chat-first/chat-history.d.ts +3 -1
- package/dist/client/chat-first/chat-history.js +7 -4
- package/dist/client/chat-first/surface-tabs.d.ts +1 -1
- package/dist/client/chat-first/surface-tabs.js +52 -41
- package/dist/client/chat-first/types.d.ts +3 -0
- package/dist/client/chat-first.d.ts +10 -0
- package/dist/client/chat-first.js +37 -2
- package/dist/client/components/ui/message-scroller.js +4 -1
- package/dist/client/i18n.js +3 -1
- package/dist/client/resources/McpConnectionSuggestion.js +9 -1
- package/dist/client/sse-event-processor.d.ts +4 -2
- package/dist/client/sse-event-processor.js +46 -6
- package/dist/client/use-chat-models.js +156 -80
- package/dist/client/use-run-stuck-detection.d.ts +2 -0
- package/dist/client/use-run-stuck-detection.js +85 -9
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/integrations/adapters/slack.d.ts +0 -4
- package/dist/integrations/adapters/slack.js +6 -30
- package/dist/integrations/catalog.js +1 -1
- package/dist/integrations/pending-tasks-store.d.ts +0 -8
- package/dist/integrations/pending-tasks-store.js +0 -21
- package/dist/integrations/slack-manifest.d.ts +2 -2
- package/dist/integrations/slack-manifest.js +0 -3
- package/dist/integrations/webhook-handler.js +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/observability/routes.d.ts +3 -3
- package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
- package/dist/provider-api/actions/provider-api.d.ts +8 -8
- package/dist/scripts/docs/source-search.js +2 -2
- package/dist/server/agent-chat/framework-prompts.js +7 -2
- package/dist/server/agent-chat/prompt-resources.js +2 -2
- package/dist/server/agent-chat/skill-frontmatter.d.ts +31 -2
- package/dist/server/agent-chat/skill-frontmatter.js +41 -15
- package/dist/server/agent-chat-plugin.js +3 -3
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agents-bundle.d.ts +16 -19
- package/dist/server/agents-bundle.js +19 -35
- package/dist/server/auth.js +262 -31
- package/dist/server/better-auth-instance.d.ts +1 -0
- package/dist/server/better-auth-instance.js +17 -2
- package/dist/server/onboarding-html.js +56 -9
- package/dist/server/prompts/framework-core-compact.d.ts +6 -1
- package/dist/server/prompts/framework-core-compact.js +12 -9
- package/dist/server/prompts/framework-core.d.ts +6 -1
- package/dist/server/prompts/framework-core.js +11 -9
- package/dist/server/prompts/index.d.ts +1 -1
- package/dist/server/prompts/index.js +1 -1
- package/dist/server/prompts/shared-rules.d.ts +15 -11
- package/dist/server/prompts/shared-rules.js +17 -13
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/shared/reasoning-effort.d.ts +8 -8
- package/dist/shared/reasoning-effort.js +10 -10
- package/dist/shared/streaming-text-smoothing.js +41 -11
- package/dist/styles/agent-native.css +19 -32
- package/dist/templates/chat/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/chat/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
- package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/chat/AGENTS.md +32 -80
- package/dist/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/default/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/default/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/default/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/default/.agents/skills/create-skill/SKILL.md +9 -35
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +4 -5
- package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/headless/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/headless/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/headless/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/headless/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +54 -488
- package/dist/templates/workspace-core/.agents/skills/actions/references/action-fields.md +136 -0
- package/dist/templates/workspace-core/.agents/skills/actions/references/examples.md +94 -0
- package/dist/templates/workspace-core/.agents/skills/actions/references/provider-apis.md +95 -0
- package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +1 -0
- package/dist/templates/workspace-core/.agents/skills/agent-page/SKILL.md +1 -0
- package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +9 -35
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -5
- package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +21 -29
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -17
- package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +3 -3
- package/dist/templates/workspace-core/AGENTS.md +7 -16
- package/docs/content/messaging.mdx +6 -7
- package/docs/content/template-chat.mdx +1 -1
- package/package.json +2 -2
- package/src/templates/chat/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/chat/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
- package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/chat/AGENTS.md +32 -80
- package/src/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
- package/src/templates/default/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/default/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/default/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/default/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/default/.agents/skills/create-skill/SKILL.md +9 -35
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +4 -5
- package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/headless/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/headless/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/headless/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/headless/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +54 -488
- package/src/templates/workspace-core/.agents/skills/actions/references/action-fields.md +136 -0
- package/src/templates/workspace-core/.agents/skills/actions/references/examples.md +94 -0
- package/src/templates/workspace-core/.agents/skills/actions/references/provider-apis.md +95 -0
- package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +1 -0
- package/src/templates/workspace-core/.agents/skills/agent-page/SKILL.md +1 -0
- package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +9 -35
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -5
- package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +21 -29
- package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -31
- package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -17
- package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +3 -3
- package/src/templates/workspace-core/AGENTS.md +7 -16
package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx
CHANGED
|
@@ -367,6 +367,13 @@ export function PositionLayoutProperties({
|
|
|
367
367
|
const authoredTransform = authoredStyleValue(element, "transform");
|
|
368
368
|
const constraintsValue = deriveConstraintsValue(element);
|
|
369
369
|
const [constraintsExpanded, setConstraintsExpanded] = useState(false);
|
|
370
|
+
// position:absolute/fixed takes a child out of the parent's flex flow, so it
|
|
371
|
+
// still anchors and keeps constraints.
|
|
372
|
+
const constraintsSuppressed =
|
|
373
|
+
element.isFlexChild &&
|
|
374
|
+
!["absolute", "fixed"].includes(
|
|
375
|
+
(element.computedStyles?.position ?? "").toLowerCase(),
|
|
376
|
+
);
|
|
370
377
|
// 3D rotation/perspective progressive-disclosure expander — mirrors
|
|
371
378
|
// CornerRadiusControl's showIndependentCorners pattern. Default-expanded
|
|
372
379
|
// when the authored transform already has non-zero X/Y rotation or
|
|
@@ -544,33 +551,40 @@ export function PositionLayoutProperties({
|
|
|
544
551
|
hoverRevealClassName="opacity-0 group-hover/field:opacity-100"
|
|
545
552
|
/>
|
|
546
553
|
</div>
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
554
|
+
{/* Figma: constraints cannot apply to a child of an auto layout
|
|
555
|
+
frame — the parent's layout owns the position. An absolutely
|
|
556
|
+
positioned descendant is out of that flow and still anchors. */}
|
|
557
|
+
{constraintsSuppressed ? null : (
|
|
558
|
+
<Tooltip>
|
|
559
|
+
<TooltipTrigger asChild>
|
|
560
|
+
<button
|
|
561
|
+
type="button"
|
|
562
|
+
aria-label={
|
|
563
|
+
"Constraints" /* i18n-ignore design inspector action */
|
|
564
|
+
}
|
|
565
|
+
aria-pressed={constraintsExpanded}
|
|
566
|
+
onClick={() =>
|
|
567
|
+
setConstraintsExpanded((expanded) => !expanded)
|
|
568
|
+
}
|
|
569
|
+
className={cn(
|
|
570
|
+
"flex size-7 items-center justify-center rounded-md transition-colors",
|
|
571
|
+
"hover:bg-[var(--design-editor-control-bg)] hover:text-foreground",
|
|
572
|
+
"focus:outline-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]",
|
|
573
|
+
constraintsExpanded
|
|
574
|
+
? "bg-[var(--design-editor-selection-color)] text-[var(--design-editor-accent-color)] hover:text-[var(--design-editor-accent-color)]"
|
|
575
|
+
: "text-muted-foreground",
|
|
576
|
+
)}
|
|
577
|
+
>
|
|
578
|
+
<ConstraintsPreview value={constraintsValue} />
|
|
579
|
+
</button>
|
|
580
|
+
</TooltipTrigger>
|
|
581
|
+
<TooltipContent>
|
|
582
|
+
{"Constraints" /* i18n-ignore design inspector tooltip */}
|
|
583
|
+
</TooltipContent>
|
|
584
|
+
</Tooltip>
|
|
585
|
+
)}
|
|
572
586
|
</div>
|
|
573
|
-
{constraintsExpanded ? (
|
|
587
|
+
{constraintsExpanded && !constraintsSuppressed ? (
|
|
574
588
|
<ConstraintsWidget
|
|
575
589
|
value={constraintsValue}
|
|
576
590
|
onChange={handleConstraintsChange}
|
|
@@ -310,6 +310,8 @@ function stripExecutableStaticPreviewContent(html: string) {
|
|
|
310
310
|
* logical board paintable without allocating or scrolling a 131k iframe.
|
|
311
311
|
*/
|
|
312
312
|
export function getBoardSurfaceStaticPreviewContent(args: {
|
|
313
|
+
/** Themed canvas colour; falls back to the dark default when unresolved. */
|
|
314
|
+
background?: string;
|
|
313
315
|
html: string;
|
|
314
316
|
logicalGeometry: FrameGeometry;
|
|
315
317
|
viewport: { width: number; height: number };
|
|
@@ -321,10 +323,11 @@ export function getBoardSurfaceStaticPreviewContent(args: {
|
|
|
321
323
|
const height = Math.max(1, args.logicalGeometry.height);
|
|
322
324
|
const viewportWidth = Math.max(1, args.viewport.width);
|
|
323
325
|
const viewportHeight = Math.max(1, args.viewport.height);
|
|
326
|
+
const background = args.background?.trim() || BOARD_SURFACE_BACKGROUND;
|
|
324
327
|
const scale = Math.min(viewportWidth / width, viewportHeight / height);
|
|
325
328
|
const offsetX = -args.logicalGeometry.x;
|
|
326
329
|
const offsetY = -args.logicalGeometry.y;
|
|
327
|
-
const style = `<style data-agent-native-board-static-preview>*,*::before,*::after{animation:none!important;animation-delay:0s!important;transition:none!important;caret-color:transparent!important;}html{width:${viewportWidth}px!important;height:${viewportHeight}px!important;overflow:hidden!important;}html,body{background:${
|
|
330
|
+
const style = `<style data-agent-native-board-static-preview>*,*::before,*::after{animation:none!important;animation-delay:0s!important;transition:none!important;caret-color:transparent!important;}html{width:${viewportWidth}px!important;height:${viewportHeight}px!important;overflow:hidden!important;}html,body{background:${background}!important;background-color:${background}!important;background-image:none!important;}body{margin:0!important;width:${width}px!important;height:${height}px!important;overflow:visible!important;transform:scale(${scale})!important;transform-origin:0 0!important;}body>[data-agent-native-node-id]{translate:${offsetX}px ${offsetY}px!important;}</style>`;
|
|
328
331
|
if (/<\/head\s*>/i.test(renderHtml)) {
|
|
329
332
|
return injectDocumentMarkup(renderHtml, style, { target: "head" });
|
|
330
333
|
}
|
|
@@ -337,6 +337,9 @@ export function getBreakpointFrameGeometry(args: {
|
|
|
337
337
|
/** Measured content height at this width; wins over the primary-aspect
|
|
338
338
|
* projection, which clipped narrower frames (they reflow taller). */
|
|
339
339
|
contentHeightPx?: number;
|
|
340
|
+
/** A height the user set. Content measurement must never overwrite it, or
|
|
341
|
+
* the frame grows out from under them and 100vh content chases itself. */
|
|
342
|
+
pinnedHeightPx?: number;
|
|
340
343
|
}): {
|
|
341
344
|
frameWidth: number;
|
|
342
345
|
frameHeight: number;
|
|
@@ -353,10 +356,16 @@ export function getBreakpointFrameGeometry(args: {
|
|
|
353
356
|
: undefined;
|
|
354
357
|
// Until the frame's own content is measured, use the pure aspect projection;
|
|
355
358
|
// the device-viewport floor only applies once a real height is known.
|
|
359
|
+
const pinned =
|
|
360
|
+
args.pinnedHeightPx && args.pinnedHeightPx > 0
|
|
361
|
+
? Math.round(args.pinnedHeightPx)
|
|
362
|
+
: undefined;
|
|
356
363
|
const naturalHeight =
|
|
357
|
-
|
|
358
|
-
?
|
|
359
|
-
:
|
|
364
|
+
pinned !== undefined
|
|
365
|
+
? pinned
|
|
366
|
+
: measured !== undefined
|
|
367
|
+
? Math.max(deviceViewportFloorForWidth(args.widthPx), measured)
|
|
368
|
+
: Math.round(args.widthPx * Math.max(0.01, args.naturalAspect));
|
|
360
369
|
const frameWidth = Math.round(args.widthPx * scale);
|
|
361
370
|
const frameHeight = Math.round(naturalHeight * scale);
|
|
362
371
|
return { frameWidth, frameHeight, naturalHeight, scale };
|
|
@@ -30,6 +30,7 @@ export function sameResolvedMetadata(
|
|
|
30
30
|
a.title === b.title &&
|
|
31
31
|
a.width === b.width &&
|
|
32
32
|
a.height === b.height &&
|
|
33
|
+
a.heightPinned === b.heightPinned &&
|
|
33
34
|
a.previewUrl === b.previewUrl
|
|
34
35
|
);
|
|
35
36
|
}
|
|
@@ -49,6 +50,7 @@ function sameScreenMetadataInput(
|
|
|
49
50
|
a.title === b.title &&
|
|
50
51
|
a.width === b.width &&
|
|
51
52
|
a.height === b.height &&
|
|
53
|
+
a.heightPinned === b.heightPinned &&
|
|
52
54
|
a.url === b.url &&
|
|
53
55
|
a.previewUrl === b.previewUrl &&
|
|
54
56
|
a.bridgeUrl === b.bridgeUrl &&
|
|
@@ -187,6 +189,8 @@ export function resolveScreenMetadata(
|
|
|
187
189
|
title: metadata.title,
|
|
188
190
|
width,
|
|
189
191
|
height,
|
|
192
|
+
// A height the user dragged. Auto-fit must not grow past it.
|
|
193
|
+
heightPinned: metadata.heightPinned === true,
|
|
190
194
|
previewUrl,
|
|
191
195
|
};
|
|
192
196
|
}
|
|
@@ -32,6 +32,8 @@ export interface ScreenFile {
|
|
|
32
32
|
updatedAt?: string;
|
|
33
33
|
width?: number;
|
|
34
34
|
height?: number;
|
|
35
|
+
/** A height the user dragged; auto-fit must not grow past it. */
|
|
36
|
+
heightPinned?: boolean;
|
|
35
37
|
url?: string;
|
|
36
38
|
previewUrl?: string;
|
|
37
39
|
bridgeUrl?: string;
|
|
@@ -105,6 +107,7 @@ export interface ScreenMetadata {
|
|
|
105
107
|
title?: string;
|
|
106
108
|
width?: number;
|
|
107
109
|
height?: number;
|
|
110
|
+
heightPinned?: boolean;
|
|
108
111
|
url?: string;
|
|
109
112
|
previewUrl?: string;
|
|
110
113
|
bridgeUrl?: string;
|
|
@@ -195,6 +198,8 @@ export interface MultiScreenCanvasProps {
|
|
|
195
198
|
placement: "before" | "after" | "inside";
|
|
196
199
|
}) => void;
|
|
197
200
|
onCreateScreenFrame?: (geometry: FrameGeometry) => void;
|
|
201
|
+
/** Whether the frame tool commits a top-level screen or a plain frame. */
|
|
202
|
+
frameToolDraws?: "screen" | "frame";
|
|
198
203
|
onDeleteSelection?: (ids: string[]) => boolean | void;
|
|
199
204
|
/** Return false to keep the arrow key: the host's real selection is an
|
|
200
205
|
* element inside a screen, and this canvas still lists that screen in
|
|
@@ -971,6 +976,8 @@ export interface ResolvedScreenMetadata {
|
|
|
971
976
|
title?: string;
|
|
972
977
|
width: number;
|
|
973
978
|
height: number;
|
|
979
|
+
/** A height the user dragged; auto-fit must not grow past it. */
|
|
980
|
+
heightPinned?: boolean;
|
|
974
981
|
previewUrl?: string;
|
|
975
982
|
}
|
|
976
983
|
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
import {
|
|
12
12
|
IconApps,
|
|
13
13
|
IconCheck,
|
|
14
|
+
IconComponents,
|
|
14
15
|
IconChevronDown,
|
|
15
16
|
IconPalette,
|
|
16
17
|
IconPhoto,
|
|
@@ -822,7 +823,7 @@ export default function PromptPopover({
|
|
|
822
823
|
}}
|
|
823
824
|
>
|
|
824
825
|
<SelectTrigger className="h-9 min-w-0 justify-start gap-2 px-2.5 text-xs [&>svg:last-child]:ms-auto">
|
|
825
|
-
<
|
|
826
|
+
<IconComponents className="size-4 shrink-0 text-muted-foreground" />
|
|
826
827
|
<span
|
|
827
828
|
className="min-w-0 flex-1 truncate text-start"
|
|
828
829
|
title={
|
|
@@ -851,7 +852,7 @@ export default function PromptPopover({
|
|
|
851
852
|
</Select>
|
|
852
853
|
) : (
|
|
853
854
|
<div className="flex h-9 min-w-0 items-center gap-2 rounded-md border border-input px-2.5 text-xs text-muted-foreground">
|
|
854
|
-
<
|
|
855
|
+
<IconComponents className="size-4 shrink-0" />
|
|
855
856
|
<span className="truncate">
|
|
856
857
|
{t("promptDialog.noDesignSystem")}
|
|
857
858
|
</span>
|
|
@@ -8,7 +8,7 @@ import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
|
|
|
8
8
|
import {
|
|
9
9
|
IconPencil,
|
|
10
10
|
IconTemplate,
|
|
11
|
-
|
|
11
|
+
IconComponents,
|
|
12
12
|
IconSettings,
|
|
13
13
|
IconLayoutSidebarLeftCollapse,
|
|
14
14
|
IconLayoutSidebarLeftExpand,
|
|
@@ -28,7 +28,7 @@ const navItems = [
|
|
|
28
28
|
{ icon: IconPencil, labelKey: "navigation.designs", href: "/" },
|
|
29
29
|
{ icon: IconTemplate, labelKey: "navigation.templates", href: "/templates" },
|
|
30
30
|
{
|
|
31
|
-
icon:
|
|
31
|
+
icon: IconComponents,
|
|
32
32
|
labelKey: "navigation.designSystems",
|
|
33
33
|
href: "/design-systems",
|
|
34
34
|
},
|
|
@@ -308,6 +308,9 @@ function isFocusableChromeTarget(target: EventTarget | null) {
|
|
|
308
308
|
if (target === document.body || target === document.documentElement) {
|
|
309
309
|
return false;
|
|
310
310
|
}
|
|
311
|
+
// A layer row is a selection surface, not focus chrome — clicking one leaves
|
|
312
|
+
// focus on its button, and Figma traverses siblings from there.
|
|
313
|
+
if (target.closest("[data-layer-row-button]")) return false;
|
|
311
314
|
return Boolean(
|
|
312
315
|
target.closest(
|
|
313
316
|
[
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
IconWorld,
|
|
20
20
|
IconFileDescription,
|
|
21
21
|
IconPhoto,
|
|
22
|
-
|
|
22
|
+
IconComponents,
|
|
23
23
|
IconCheck,
|
|
24
24
|
IconExternalLink,
|
|
25
25
|
IconChevronDown,
|
|
@@ -714,7 +714,7 @@ export default function DesignSystemSetup() {
|
|
|
714
714
|
</Section>
|
|
715
715
|
|
|
716
716
|
<SourceAccordionRow
|
|
717
|
-
icon={
|
|
717
|
+
icon={IconComponents}
|
|
718
718
|
title={t("designSystemSetup.otherSources")}
|
|
719
719
|
description={t("designSystemSetup.otherSourcesDescription")}
|
|
720
720
|
expanded={sourcePanel === "other"}
|
|
@@ -734,7 +734,7 @@ export default function DesignSystemSetup() {
|
|
|
734
734
|
<div className="divide-y divide-border">
|
|
735
735
|
<SourceAccordionRow
|
|
736
736
|
className="rounded-none border-0"
|
|
737
|
-
icon={
|
|
737
|
+
icon={IconComponents}
|
|
738
738
|
title={t("designSystemSetup.sections.company.title")}
|
|
739
739
|
description={t(
|
|
740
740
|
"designSystemSetup.sections.company.description",
|
|
@@ -769,7 +769,7 @@ export default function DesignSystemSetup() {
|
|
|
769
769
|
existingSystems.length > 0) && (
|
|
770
770
|
<SourceAccordionRow
|
|
771
771
|
className="rounded-none border-0"
|
|
772
|
-
icon={
|
|
772
|
+
icon={IconComponents}
|
|
773
773
|
title={t(
|
|
774
774
|
"designSystemSetup.sections.importExisting.title",
|
|
775
775
|
)}
|
|
@@ -1134,7 +1134,7 @@ export default function DesignSystemSetup() {
|
|
|
1134
1134
|
}`}
|
|
1135
1135
|
>
|
|
1136
1136
|
<div className="flex items-center gap-2">
|
|
1137
|
-
<
|
|
1137
|
+
<IconComponents className="w-3.5 h-3.5 text-muted-foreground" />
|
|
1138
1138
|
<span className="text-sm text-foreground/70 truncate">
|
|
1139
1139
|
{ds.title}
|
|
1140
1140
|
</span>
|
|
@@ -12,6 +12,7 @@ import { VisibilityBadge } from "@agent-native/toolkit/sharing";
|
|
|
12
12
|
import {
|
|
13
13
|
IconCheckbox,
|
|
14
14
|
IconChecks,
|
|
15
|
+
IconComponents,
|
|
15
16
|
IconDots,
|
|
16
17
|
IconPlus,
|
|
17
18
|
IconPalette,
|
|
@@ -587,7 +588,7 @@ export default function DesignSystems() {
|
|
|
587
588
|
{!primaryColor &&
|
|
588
589
|
!secondaryColor &&
|
|
589
590
|
!accentColor && (
|
|
590
|
-
<
|
|
591
|
+
<IconComponents className="w-8 h-8 text-muted-foreground/40" />
|
|
591
592
|
)}
|
|
592
593
|
</div>
|
|
593
594
|
<div className="p-4 pb-3">
|
|
@@ -1229,7 +1230,7 @@ function EmptyState() {
|
|
|
1229
1230
|
return (
|
|
1230
1231
|
<div className="flex flex-col items-center justify-center py-10 sm:py-14 text-center">
|
|
1231
1232
|
<div className="w-16 h-16 rounded-2xl bg-gradient-to-br from-[#609FF8]/20 to-[#4080E0]/20 border border-[#609FF8]/20 flex items-center justify-center mb-6">
|
|
1232
|
-
<
|
|
1233
|
+
<IconComponents className="w-7 h-7 text-primary" />
|
|
1233
1234
|
</div>
|
|
1234
1235
|
<h2 className="text-xl font-semibold text-foreground mb-2">
|
|
1235
1236
|
{t("designSystems.empty.title")}
|
|
@@ -11,7 +11,10 @@ import {
|
|
|
11
11
|
CANVAS_TEXT_DEFAULT_FONT_FAMILY,
|
|
12
12
|
defaultCanvasTextColor,
|
|
13
13
|
} from "./canvas-primitives";
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
BOARD_TEXT_AUTO_COLOR_MARKER,
|
|
16
|
+
destinationBackgroundIsLightForNode,
|
|
17
|
+
} from "./cross-screen-text-color";
|
|
15
18
|
import { escapeHtmlAttributeValue, escapeHtmlText } from "./dom-utils";
|
|
16
19
|
import { isStandaloneHttpUrl } from "./editor-state";
|
|
17
20
|
import type { DesignFile } from "./types";
|
|
@@ -183,6 +186,81 @@ export function polygonPointsForHtmlShape(
|
|
|
183
186
|
* adaptAutoTextColorForCrossScreenNode. Any explicit user color edit must
|
|
184
187
|
* remove this attribute so the text is never "helpfully" overridden again.
|
|
185
188
|
*/
|
|
189
|
+
|
|
190
|
+
/** Inline absolute rect, or null when the element is not absolutely placed. */
|
|
191
|
+
function absoluteRect(
|
|
192
|
+
element: Element,
|
|
193
|
+
): { x: number; y: number; w: number; h: number } | null {
|
|
194
|
+
const style = (element as HTMLElement).style;
|
|
195
|
+
if (style.position !== "absolute") return null;
|
|
196
|
+
const read = (value: string) => {
|
|
197
|
+
const parsed = Number.parseFloat(value);
|
|
198
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
199
|
+
};
|
|
200
|
+
const x = read(style.left);
|
|
201
|
+
const y = read(style.top);
|
|
202
|
+
const w = read(style.width);
|
|
203
|
+
const h = read(style.height);
|
|
204
|
+
if (x === null || y === null || w === null || h === null) return null;
|
|
205
|
+
// Inline left/top are relative to the nearest positioned ancestor, so a
|
|
206
|
+
// nested frame must add its own offsets or it matches the wrong origin.
|
|
207
|
+
let originX = 0;
|
|
208
|
+
let originY = 0;
|
|
209
|
+
for (
|
|
210
|
+
let ancestor = element.parentElement;
|
|
211
|
+
ancestor && ancestor.tagName.toLowerCase() !== "body";
|
|
212
|
+
ancestor = ancestor.parentElement
|
|
213
|
+
) {
|
|
214
|
+
const position = ancestor.style.position;
|
|
215
|
+
if (
|
|
216
|
+
position !== "absolute" &&
|
|
217
|
+
position !== "relative" &&
|
|
218
|
+
position !== "fixed"
|
|
219
|
+
) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
originX += read(ancestor.style.left) ?? 0;
|
|
223
|
+
originY += read(ancestor.style.top) ?? 0;
|
|
224
|
+
}
|
|
225
|
+
return { x: originX + x, y: originY + y, w, h };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Figma's frame is the container primitive and a rectangle is not, so only
|
|
230
|
+
* `data-an-primitive="frame"` adopts. Bounds come from inline geometry
|
|
231
|
+
* because this document is parsed, never laid out.
|
|
232
|
+
*/
|
|
233
|
+
function deepestFrameContaining(
|
|
234
|
+
root: Element,
|
|
235
|
+
x: number,
|
|
236
|
+
y: number,
|
|
237
|
+
w: number,
|
|
238
|
+
h: number,
|
|
239
|
+
): { element: Element; x: number; y: number } | null {
|
|
240
|
+
const contained = Array.from(
|
|
241
|
+
root.querySelectorAll('[data-an-primitive="frame"]'),
|
|
242
|
+
)
|
|
243
|
+
.map((element) => ({ element, rect: absoluteRect(element) }))
|
|
244
|
+
.filter(
|
|
245
|
+
(
|
|
246
|
+
candidate,
|
|
247
|
+
): candidate is {
|
|
248
|
+
element: Element;
|
|
249
|
+
rect: { x: number; y: number; w: number; h: number };
|
|
250
|
+
} =>
|
|
251
|
+
candidate.rect !== null &&
|
|
252
|
+
x >= candidate.rect.x &&
|
|
253
|
+
y >= candidate.rect.y &&
|
|
254
|
+
x + w <= candidate.rect.x + candidate.rect.w &&
|
|
255
|
+
y + h <= candidate.rect.y + candidate.rect.h,
|
|
256
|
+
)
|
|
257
|
+
.sort((a, b) => a.rect.w * a.rect.h - b.rect.w * b.rect.h);
|
|
258
|
+
const best = contained[0];
|
|
259
|
+
return best
|
|
260
|
+
? { element: best.element, x: best.rect.x, y: best.rect.y }
|
|
261
|
+
: null;
|
|
262
|
+
}
|
|
263
|
+
|
|
186
264
|
export function appendCanvasPrimitiveToHtml(
|
|
187
265
|
content: string,
|
|
188
266
|
primitive: CanvasPrimitiveInsert,
|
|
@@ -208,6 +286,10 @@ export function appendCanvasPrimitiveToHtml(
|
|
|
208
286
|
const height = Math.max(1, Math.round(geometry.height));
|
|
209
287
|
const nodeId = primitive.nodeId ?? uniqueLayerId(primitive.kind);
|
|
210
288
|
const layerName = primitiveLayerName(primitive);
|
|
289
|
+
// Resolved once so every primitive kind nests identically, and so text can
|
|
290
|
+
// pick a fill that is legible against its actual container.
|
|
291
|
+
const host = deepestFrameContaining(doc.body, left, top, width, height);
|
|
292
|
+
const hostOrBody: Element = host?.element ?? doc.body;
|
|
211
293
|
|
|
212
294
|
if (
|
|
213
295
|
primitive.kind === "path" ||
|
|
@@ -327,7 +409,7 @@ export function appendCanvasPrimitiveToHtml(
|
|
|
327
409
|
.join(";"),
|
|
328
410
|
);
|
|
329
411
|
svg.appendChild(path);
|
|
330
|
-
|
|
412
|
+
hostOrBody.appendChild(svg);
|
|
331
413
|
return `<!DOCTYPE html>\n${doc.documentElement.outerHTML}`;
|
|
332
414
|
}
|
|
333
415
|
|
|
@@ -370,7 +452,7 @@ export function appendCanvasPrimitiveToHtml(
|
|
|
370
452
|
.join(";"),
|
|
371
453
|
);
|
|
372
454
|
svg.appendChild(polygon);
|
|
373
|
-
|
|
455
|
+
hostOrBody.appendChild(svg);
|
|
374
456
|
return `<!DOCTYPE html>\n${doc.documentElement.outerHTML}`;
|
|
375
457
|
}
|
|
376
458
|
|
|
@@ -428,16 +510,17 @@ export function appendCanvasPrimitiveToHtml(
|
|
|
428
510
|
// not centered — match that instead of centering the text block.
|
|
429
511
|
element.style.alignItems = "flex-start";
|
|
430
512
|
}
|
|
431
|
-
//
|
|
432
|
-
//
|
|
433
|
-
//
|
|
434
|
-
//
|
|
435
|
-
// the
|
|
436
|
-
//
|
|
437
|
-
|
|
513
|
+
// "currentColor" inherits the unstyled document's black body text, so
|
|
514
|
+
// it is invisible on any dark surface — the always-dark board, and
|
|
515
|
+
// equally a screen whose own background is dark. Light screens keep
|
|
516
|
+
// "currentColor" so text still inherits their theme.
|
|
517
|
+
// Measure the frame the text actually lands in: a dark frame on a light
|
|
518
|
+
// page would otherwise keep currentColor and render invisible.
|
|
519
|
+
const autoTextNeedsLightFill =
|
|
520
|
+
options?.isBoardTarget === true ||
|
|
521
|
+
!destinationBackgroundIsLightForNode(hostOrBody);
|
|
438
522
|
const resolvedTextColor =
|
|
439
|
-
primitive.fill ??
|
|
440
|
-
defaultCanvasTextColor(options?.isBoardTarget === true);
|
|
523
|
+
primitive.fill ?? defaultCanvasTextColor(autoTextNeedsLightFill);
|
|
441
524
|
element.style.color = resolvedTextColor;
|
|
442
525
|
// Stamp the auto-color marker whenever the color came from the
|
|
443
526
|
// default (no explicit primitive.fill) rather than a user-chosen
|
|
@@ -477,7 +560,11 @@ export function appendCanvasPrimitiveToHtml(
|
|
|
477
560
|
element.style.borderRadius = canonical.borderRadius;
|
|
478
561
|
}
|
|
479
562
|
|
|
480
|
-
|
|
563
|
+
if (host) {
|
|
564
|
+
element.style.left = `${left - host.x}px`;
|
|
565
|
+
element.style.top = `${top - host.y}px`;
|
|
566
|
+
}
|
|
567
|
+
hostOrBody.appendChild(element);
|
|
481
568
|
return `<!DOCTYPE html>\n${doc.documentElement.outerHTML}`;
|
|
482
569
|
} catch {
|
|
483
570
|
return null;
|
|
@@ -209,7 +209,7 @@ function collectDestinationBackgroundSignals(
|
|
|
209
209
|
* dark-class-hint chain when no live document is available (e.g. the
|
|
210
210
|
* destination screen isn't currently mounted).
|
|
211
211
|
*/
|
|
212
|
-
function destinationBackgroundIsLightForNode(
|
|
212
|
+
export function destinationBackgroundIsLightForNode(
|
|
213
213
|
element: Element,
|
|
214
214
|
liveDoc?: Document | null,
|
|
215
215
|
): boolean {
|
|
@@ -114,6 +114,8 @@ export function buildFrameGeometryDataOperations(args: {
|
|
|
114
114
|
nextGeometry: CanvasFrameGeometryById;
|
|
115
115
|
designData: Record<string, unknown>;
|
|
116
116
|
syncViewportFrameIds?: readonly string[];
|
|
117
|
+
/** Frames whose height the user just dragged. */
|
|
118
|
+
pinHeightFrameIds?: readonly string[];
|
|
117
119
|
}): DesignDataOperation[] {
|
|
118
120
|
const operations: DesignDataOperation[] = [];
|
|
119
121
|
const frameIds = new Set([
|
|
@@ -156,6 +158,18 @@ export function buildFrameGeometryDataOperations(args: {
|
|
|
156
158
|
value: viewport.height,
|
|
157
159
|
});
|
|
158
160
|
}
|
|
161
|
+
// A resize is a deliberate height. Without this the content-fit pass in
|
|
162
|
+
// MultiScreenCanvas grows the frame straight back past the drag.
|
|
163
|
+
if (
|
|
164
|
+
args.pinHeightFrameIds?.includes(frameId) &&
|
|
165
|
+
!metadataEntry.heightPinned
|
|
166
|
+
) {
|
|
167
|
+
operations.push({
|
|
168
|
+
op: "set",
|
|
169
|
+
path: ["screenMetadata", frameId, "heightPinned"],
|
|
170
|
+
value: true,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
159
173
|
|
|
160
174
|
const localhostEntry = recordValue(localhostScreens, frameId);
|
|
161
175
|
if (Object.keys(localhostEntry).length === 0) continue;
|
|
@@ -173,42 +173,37 @@ export default async function globalSetup(config: FullConfig) {
|
|
|
173
173
|
BROWSER_CHANNEL ? { channel: BROWSER_CHANNEL } : {},
|
|
174
174
|
);
|
|
175
175
|
const context = await browser.newContext();
|
|
176
|
-
const page = await context.newPage();
|
|
177
176
|
|
|
178
177
|
try {
|
|
179
|
-
await
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
if (await isSignIn()) {
|
|
194
|
-
// Account exists; switch to the Sign in tab and log in.
|
|
195
|
-
await page
|
|
196
|
-
.getByRole("button", { name: "Sign in", exact: true })
|
|
197
|
-
.first()
|
|
198
|
-
.click()
|
|
199
|
-
.catch(() => {});
|
|
200
|
-
await page.locator("#l-email").fill(E2E_EMAIL);
|
|
201
|
-
await page.locator("#l-pass").fill(E2E_PASSWORD);
|
|
202
|
-
await page.locator("#login-form button[type='submit']").click();
|
|
203
|
-
await page.waitForTimeout(2500);
|
|
204
|
-
}
|
|
178
|
+
const registration = await context.request.post(
|
|
179
|
+
`${baseURL}/_agent-native/auth/register`,
|
|
180
|
+
{
|
|
181
|
+
data: {
|
|
182
|
+
email: E2E_EMAIL,
|
|
183
|
+
password: E2E_PASSWORD,
|
|
184
|
+
},
|
|
185
|
+
headers: { "Content-Type": "application/json" },
|
|
186
|
+
},
|
|
187
|
+
);
|
|
188
|
+
if (!registration.ok() && registration.status() !== 409) {
|
|
189
|
+
throw new Error(
|
|
190
|
+
`registration failed: ${registration.status()} ${await registration.text()}`,
|
|
191
|
+
);
|
|
205
192
|
}
|
|
206
193
|
|
|
207
|
-
await
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
194
|
+
const login = await context.request.post(
|
|
195
|
+
`${baseURL}/_agent-native/auth/login`,
|
|
196
|
+
{
|
|
197
|
+
data: {
|
|
198
|
+
email: E2E_EMAIL,
|
|
199
|
+
password: E2E_PASSWORD,
|
|
200
|
+
},
|
|
201
|
+
headers: { "Content-Type": "application/json" },
|
|
202
|
+
},
|
|
203
|
+
);
|
|
204
|
+
if (!login.ok()) {
|
|
205
|
+
throw new Error(`login failed: ${login.status()} ${await login.text()}`);
|
|
206
|
+
}
|
|
212
207
|
|
|
213
208
|
await context.storageState({ path: STATE_PATH });
|
|
214
209
|
|
|
@@ -18,11 +18,9 @@ const BASE_URL = process.env.E2E_BASE_URL ?? `http://127.0.0.1:${PORT}`;
|
|
|
18
18
|
const AUTH_DIR = process.env.E2E_AUTH_DIR
|
|
19
19
|
? path.resolve(process.env.E2E_AUTH_DIR)
|
|
20
20
|
: path.join(import.meta.dirname, "e2e", ".auth");
|
|
21
|
-
const E2E_DATABASE_URL =
|
|
22
|
-
|
|
23
|
-
"data",
|
|
24
|
-
"e2e.db",
|
|
25
|
-
)}`;
|
|
21
|
+
const E2E_DATABASE_URL =
|
|
22
|
+
process.env.E2E_DATABASE_URL ??
|
|
23
|
+
`file:${path.join(import.meta.dirname, "data", "e2e.db")}`;
|
|
26
24
|
const BROWSER_CHANNEL = process.env.E2E_BROWSER_CHANNEL;
|
|
27
25
|
|
|
28
26
|
export default defineConfig({
|