@agent-native/core 0.83.0 → 0.84.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +34 -0
- package/corpus/core/README.md +2 -2
- package/corpus/core/docs/content/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/evals.mdx +34 -12
- package/corpus/core/docs/content/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/ar-SA/evals.mdx +7 -0
- package/corpus/core/docs/content/locales/ar-SA/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/de-DE/evals.mdx +8 -0
- package/corpus/core/docs/content/locales/de-DE/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/es-ES/evals.mdx +8 -0
- package/corpus/core/docs/content/locales/es-ES/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/fr-FR/evals.mdx +8 -0
- package/corpus/core/docs/content/locales/fr-FR/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/hi-IN/evals.mdx +8 -0
- package/corpus/core/docs/content/locales/hi-IN/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/ja-JP/evals.mdx +7 -0
- package/corpus/core/docs/content/locales/ja-JP/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/ko-KR/evals.mdx +7 -0
- package/corpus/core/docs/content/locales/ko-KR/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/pt-BR/evals.mdx +8 -0
- package/corpus/core/docs/content/locales/pt-BR/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-CN/evals.mdx +7 -0
- package/corpus/core/docs/content/locales/zh-CN/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-TW/evals.mdx +7 -0
- package/corpus/core/docs/content/locales/zh-TW/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/template-chat.mdx +1 -1
- package/corpus/core/docs/content/template-chat.mdx +1 -1
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/engine/builtin.ts +1 -1
- package/corpus/core/src/agent/engine/output-tokens.ts +1 -1
- package/corpus/core/src/agent/harness/acp-adapter.ts +28 -4
- package/corpus/core/src/agent/harness/ai-sdk-adapter.ts +3 -0
- package/corpus/core/src/agent/harness/translate.ts +3 -0
- package/corpus/core/src/agent/harness/types.ts +1 -0
- package/corpus/core/src/agent/model-config.ts +34 -13
- package/corpus/core/src/agent/production-agent.ts +87 -10
- package/corpus/core/src/agent/thread-data-builder.ts +29 -4
- package/corpus/core/src/agent/tool-call-journal.ts +109 -48
- package/corpus/core/src/agent/types.ts +6 -1
- package/corpus/core/src/cli/design-connect.ts +106 -0
- package/corpus/core/src/cli/gateway-helpers.ts +17 -0
- package/corpus/core/src/cli/recap.ts +0 -2
- package/corpus/core/src/cli/skills.ts +54 -16
- package/corpus/core/src/cli/workspace-dev.ts +29 -5
- package/corpus/core/src/client/AssistantChat.tsx +89 -42
- package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
- package/corpus/core/src/client/chat/message-components.tsx +49 -1
- package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
- package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
- package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
- package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
- package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
- package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
- package/corpus/core/src/client/guided-questions.tsx +21 -27
- package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
- package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
- package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
- package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
- package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
- package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
- package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
- package/corpus/core/src/client/useProductionAgent.ts +6 -2
- package/corpus/core/src/deploy/build.ts +1 -1
- package/corpus/core/src/eval/define-eval.ts +4 -1
- package/corpus/core/src/eval/report.ts +23 -8
- package/corpus/core/src/eval/runner.ts +41 -6
- package/corpus/core/src/eval/types.ts +11 -0
- package/corpus/core/src/observability/traces.ts +3 -3
- package/corpus/core/src/onboarding/default-steps.ts +1 -1
- package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
- package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
- package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
- package/corpus/core/src/server/core-routes-plugin.ts +7 -1
- package/corpus/core/src/server/open-route.ts +59 -40
- package/corpus/core/src/shared/reasoning-effort.ts +2 -0
- package/corpus/core/src/sharing/access.ts +22 -2
- package/corpus/core/src/sharing/registry.ts +18 -0
- package/corpus/core/src/styles/agent-native.css +104 -20
- package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
- package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
- package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
- package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
- package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
- package/corpus/templates/analytics/app/global.css +4 -0
- package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
- package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
- package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
- package/corpus/templates/calendar/AGENTS.md +4 -0
- package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
- package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
- package/corpus/templates/content/AGENTS.md +9 -2
- package/corpus/templates/content/actions/_database-row-batch.ts +230 -0
- package/corpus/templates/content/actions/_database-utils.ts +17 -9
- package/corpus/templates/content/actions/_notion-action-utils.ts +26 -0
- package/corpus/templates/content/actions/connect-notion-status.ts +13 -4
- package/corpus/templates/content/actions/create-and-link-notion-page.ts +23 -0
- package/corpus/templates/content/actions/delete-database-items.ts +55 -0
- package/corpus/templates/content/actions/delete-document.ts +4 -4
- package/corpus/templates/content/actions/disconnect-notion.ts +16 -0
- package/corpus/templates/content/actions/duplicate-database-item.ts +1 -1
- package/corpus/templates/content/actions/duplicate-database-items.ts +191 -0
- package/corpus/templates/content/actions/link-notion-page.ts +10 -7
- package/corpus/templates/content/actions/list-notion-links.ts +3 -4
- package/corpus/templates/content/actions/pull-notion-page.ts +7 -9
- package/corpus/templates/content/actions/push-notion-page.ts +7 -9
- package/corpus/templates/content/actions/refresh-notion-sync-status.ts +24 -0
- package/corpus/templates/content/actions/resolve-notion-sync-conflict.ts +23 -0
- package/corpus/templates/content/actions/search-notion-pages.ts +67 -0
- package/corpus/templates/content/actions/unlink-notion-page.ts +23 -0
- package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +27 -34
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +16 -13
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +10 -10
- package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +1 -1
- package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +18 -9
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +27 -34
- package/corpus/templates/content/app/components/editor/database/navigation-state.ts +10 -4
- package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +32 -17
- package/corpus/templates/content/app/global.css +6 -5
- package/corpus/templates/content/app/hooks/use-content-database.ts +35 -0
- package/corpus/templates/content/app/hooks/use-notion.ts +108 -99
- package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
- package/corpus/templates/content/package.json +3 -0
- package/corpus/templates/content/parity/README.md +69 -0
- package/corpus/templates/content/parity/eval-scenarios.ts +118 -0
- package/corpus/templates/content/parity/exceptions.allowlist.ts +17 -0
- package/corpus/templates/content/parity/matrix.md +28 -0
- package/corpus/templates/content/parity/matrix.ts +606 -0
- package/corpus/templates/content/parity/matrix.types.ts +42 -0
- package/corpus/templates/content/parity/parity-evals.eval.ts +4 -0
- package/corpus/templates/content/parity/render-matrix.ts +90 -0
- package/corpus/templates/content/parity/scenario-to-eval.ts +57 -0
- package/corpus/templates/content/shared/api.ts +11 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
- package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
- package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
- package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
- package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
- package/corpus/templates/design/actions/navigate.ts +3 -12
- package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
- package/corpus/templates/design/actions/view-screen.ts +1 -1
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +345 -14
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
- package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
- package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
- package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
- package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1038 -150
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
- package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
- package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1129 -155
- package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
- package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
- package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
- package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
- package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
- package/corpus/templates/design/app/components/design/types.ts +19 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
- package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
- package/corpus/templates/design/app/global.css +56 -0
- package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
- package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
- package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
- package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
- package/corpus/templates/design/app/i18n-data.ts +63 -188
- package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
- package/corpus/templates/design/app/pages/DesignEditor.tsx +1428 -384
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
- package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
- package/corpus/templates/design/app/pages/Index.tsx +49 -26
- package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
- package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
- package/corpus/templates/design/app/routes/examples.tsx +1 -7
- package/corpus/templates/design/app/routes/templates.tsx +7 -4
- package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
- package/corpus/templates/design/e2e/helpers.ts +15 -4
- package/corpus/templates/design/server/db/index.ts +52 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
- package/corpus/templates/design/server/plugins/auth.ts +1 -0
- package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
- package/corpus/templates/design/shared/board-file.ts +380 -5
- package/corpus/templates/design/shared/board-objects.ts +2 -2
- package/corpus/templates/design/shared/code-layer.ts +50 -6
- package/corpus/templates/design/shared/motion-compiler.ts +27 -0
- package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
- package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
- package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
- package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
- package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
- package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
- package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
- package/corpus/templates/macros/app/routes/_index.tsx +5 -5
- package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
- package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
- package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
- package/corpus/templates/mail/app/global.css +3 -2
- package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
- package/corpus/templates/slides/app/global.css +10 -0
- package/corpus/templates/slides/app/pages/Index.tsx +55 -51
- package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
- package/dist/agent/engine/anthropic-engine.d.ts +2 -2
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +2 -2
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builtin.js +1 -1
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/agent/engine/output-tokens.js +1 -1
- package/dist/agent/engine/output-tokens.js.map +1 -1
- package/dist/agent/harness/acp-adapter.d.ts +4 -1
- package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
- package/dist/agent/harness/acp-adapter.js +19 -2
- package/dist/agent/harness/acp-adapter.js.map +1 -1
- package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
- package/dist/agent/harness/ai-sdk-adapter.js +3 -0
- package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
- package/dist/agent/harness/translate.d.ts.map +1 -1
- package/dist/agent/harness/translate.js +3 -0
- package/dist/agent/harness/translate.js.map +1 -1
- package/dist/agent/harness/types.d.ts +1 -0
- package/dist/agent/harness/types.d.ts.map +1 -1
- package/dist/agent/harness/types.js.map +1 -1
- package/dist/agent/model-config.d.ts +21 -20
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +31 -13
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +85 -10
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +27 -6
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/tool-call-journal.d.ts +11 -9
- package/dist/agent/tool-call-journal.d.ts.map +1 -1
- package/dist/agent/tool-call-journal.js +92 -40
- package/dist/agent/tool-call-journal.js.map +1 -1
- package/dist/agent/types.d.ts +5 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +84 -0
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/gateway-helpers.d.ts +4 -0
- package/dist/cli/gateway-helpers.d.ts.map +1 -1
- package/dist/cli/gateway-helpers.js +9 -0
- package/dist/cli/gateway-helpers.js.map +1 -1
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +0 -2
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +54 -16
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/workspace-dev.d.ts.map +1 -1
- package/dist/cli/workspace-dev.js +33 -6
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +72 -26
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/DefaultSpinner.d.ts.map +1 -1
- package/dist/client/DefaultSpinner.js +8 -1
- package/dist/client/DefaultSpinner.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +7 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +37 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/repo-helpers.d.ts +1 -0
- package/dist/client/chat/repo-helpers.d.ts.map +1 -1
- package/dist/client/chat/repo-helpers.js +59 -0
- package/dist/client/chat/repo-helpers.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +4 -4
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/components/ApiKeySettings.js +8 -8
- package/dist/client/components/ApiKeySettings.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +24 -15
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
- package/dist/client/components/MissingKeyCard.js +11 -6
- package/dist/client/components/MissingKeyCard.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +4 -3
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +6 -6
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/client/integrations/IntegrationCard.js +1 -1
- package/dist/client/integrations/IntegrationCard.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +1 -1
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/onboarding/OnboardingBanner.js +2 -2
- package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +23 -19
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
- package/dist/client/resources/ResourceEditor.js +13 -10
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +2 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +8 -3
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +6 -38
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts +2 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/deploy/build.js +1 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/eval/define-eval.d.ts.map +1 -1
- package/dist/eval/define-eval.js +2 -1
- package/dist/eval/define-eval.js.map +1 -1
- package/dist/eval/report.d.ts.map +1 -1
- package/dist/eval/report.js +19 -4
- package/dist/eval/report.js.map +1 -1
- package/dist/eval/runner.d.ts.map +1 -1
- package/dist/eval/runner.js +38 -6
- package/dist/eval/runner.js.map +1 -1
- package/dist/eval/types.d.ts +11 -0
- package/dist/eval/types.d.ts.map +1 -1
- package/dist/eval/types.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js.map +1 -1
- package/dist/onboarding/default-steps.js +1 -1
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +3 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +134 -72
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +3 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +4 -1
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/open-route.d.ts +9 -0
- package/dist/server/open-route.d.ts.map +1 -1
- package/dist/server/open-route.js +48 -38
- package/dist/server/open-route.js.map +1 -1
- package/dist/shared/reasoning-effort.js +3 -0
- package/dist/shared/reasoning-effort.js.map +1 -1
- package/dist/sharing/access.d.ts.map +1 -1
- package/dist/sharing/access.js +18 -2
- package/dist/sharing/access.js.map +1 -1
- package/dist/sharing/registry.d.ts +10 -0
- package/dist/sharing/registry.d.ts.map +1 -1
- package/dist/sharing/registry.js.map +1 -1
- package/dist/styles/agent-native.css +104 -20
- package/dist/styles/rich-markdown-editor.css +11 -10
- package/docs/content/cloneable-saas.mdx +2 -2
- package/docs/content/evals.mdx +34 -12
- package/docs/content/faq.mdx +1 -1
- package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
- package/docs/content/locales/ar-SA/evals.mdx +7 -0
- package/docs/content/locales/ar-SA/faq.mdx +1 -1
- package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
- package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
- package/docs/content/locales/de-DE/evals.mdx +8 -0
- package/docs/content/locales/de-DE/faq.mdx +1 -1
- package/docs/content/locales/de-DE/template-chat.mdx +1 -1
- package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
- package/docs/content/locales/es-ES/evals.mdx +8 -0
- package/docs/content/locales/es-ES/faq.mdx +1 -1
- package/docs/content/locales/es-ES/template-chat.mdx +1 -1
- package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
- package/docs/content/locales/fr-FR/evals.mdx +8 -0
- package/docs/content/locales/fr-FR/faq.mdx +1 -1
- package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
- package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
- package/docs/content/locales/hi-IN/evals.mdx +8 -0
- package/docs/content/locales/hi-IN/faq.mdx +1 -1
- package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
- package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
- package/docs/content/locales/ja-JP/evals.mdx +7 -0
- package/docs/content/locales/ja-JP/faq.mdx +1 -1
- package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
- package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
- package/docs/content/locales/ko-KR/evals.mdx +7 -0
- package/docs/content/locales/ko-KR/faq.mdx +1 -1
- package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
- package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
- package/docs/content/locales/pt-BR/evals.mdx +8 -0
- package/docs/content/locales/pt-BR/faq.mdx +1 -1
- package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
- package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
- package/docs/content/locales/zh-CN/evals.mdx +7 -0
- package/docs/content/locales/zh-CN/faq.mdx +1 -1
- package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
- package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
- package/docs/content/locales/zh-TW/evals.mdx +7 -0
- package/docs/content/locales/zh-TW/faq.mdx +1 -1
- package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
- package/docs/content/template-chat.mdx +1 -1
- package/package.json +1 -1
- package/corpus/templates/content/server/routes/api/notion/disconnect.post.ts +0 -12
- package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
- package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
- package/corpus/templates/design/app/pages/Templates.tsx +0 -279
|
@@ -3,6 +3,7 @@ import { useState } from "react";
|
|
|
3
3
|
import {
|
|
4
4
|
Select,
|
|
5
5
|
SelectContent,
|
|
6
|
+
SelectGroup,
|
|
6
7
|
SelectItem,
|
|
7
8
|
SelectTrigger,
|
|
8
9
|
SelectValue,
|
|
@@ -49,6 +50,15 @@ export interface ConstraintsWidgetProps {
|
|
|
49
50
|
className?: string;
|
|
50
51
|
}
|
|
51
52
|
|
|
53
|
+
export interface ConstraintsPreviewProps {
|
|
54
|
+
value: ConstraintsValue;
|
|
55
|
+
labels?: Partial<ConstraintsWidgetLabels>;
|
|
56
|
+
disabled?: boolean;
|
|
57
|
+
size?: number;
|
|
58
|
+
surface?: boolean;
|
|
59
|
+
className?: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
52
62
|
const DEFAULT_LABELS: ConstraintsWidgetLabels = {
|
|
53
63
|
title: "Constraints", // i18n-ignore fallback component label
|
|
54
64
|
horizontal: "Horizontal", // i18n-ignore fallback component label
|
|
@@ -163,6 +173,10 @@ interface PinBoxProps {
|
|
|
163
173
|
labels: Pick<ConstraintsWidgetLabels, "left" | "right" | "top" | "bottom">;
|
|
164
174
|
onToggleH: (side: "left" | "right") => void;
|
|
165
175
|
onToggleV: (side: "top" | "bottom") => void;
|
|
176
|
+
interactive?: boolean;
|
|
177
|
+
size?: number;
|
|
178
|
+
surface?: boolean;
|
|
179
|
+
className?: string;
|
|
166
180
|
}
|
|
167
181
|
|
|
168
182
|
function PinBox({
|
|
@@ -171,6 +185,10 @@ function PinBox({
|
|
|
171
185
|
labels,
|
|
172
186
|
onToggleH,
|
|
173
187
|
onToggleV,
|
|
188
|
+
interactive = true,
|
|
189
|
+
size = BOX,
|
|
190
|
+
surface = true,
|
|
191
|
+
className,
|
|
174
192
|
}: PinBoxProps) {
|
|
175
193
|
const [hoveredPin, setHoveredPin] = useState<
|
|
176
194
|
"left" | "right" | "top" | "bottom" | null
|
|
@@ -189,7 +207,7 @@ function PinBox({
|
|
|
189
207
|
// active / scale → accent (primary)
|
|
190
208
|
// hovered inactive → slightly brighter muted
|
|
191
209
|
// inactive → muted (30% foreground opacity)
|
|
192
|
-
const ACCENT = "hsl(var(--primary))";
|
|
210
|
+
const ACCENT = "var(--design-editor-accent-color, hsl(var(--primary)))";
|
|
193
211
|
// Hover: lighten inactive pins on hover — use 55% opacity instead of 30%
|
|
194
212
|
const MUTED = "hsl(var(--foreground) / 0.30)";
|
|
195
213
|
const MUTED_HOVER = "hsl(var(--foreground) / 0.60)";
|
|
@@ -229,15 +247,20 @@ function PinBox({
|
|
|
229
247
|
|
|
230
248
|
return (
|
|
231
249
|
<svg
|
|
232
|
-
width={
|
|
233
|
-
height={
|
|
250
|
+
width={size}
|
|
251
|
+
height={size}
|
|
234
252
|
viewBox={`0 0 ${BOX} ${BOX}`}
|
|
235
253
|
aria-hidden="true"
|
|
236
254
|
className={cn(
|
|
237
|
-
"shrink-0 rounded-
|
|
255
|
+
"shrink-0 rounded-[5px]",
|
|
238
256
|
disabled && "pointer-events-none opacity-40",
|
|
257
|
+
className,
|
|
239
258
|
)}
|
|
240
|
-
style={{
|
|
259
|
+
style={{
|
|
260
|
+
background: surface
|
|
261
|
+
? "var(--design-editor-control-bg, hsl(var(--muted) / 0.4))"
|
|
262
|
+
: "transparent",
|
|
263
|
+
}}
|
|
241
264
|
>
|
|
242
265
|
{/* outer border */}
|
|
243
266
|
<rect
|
|
@@ -336,7 +359,7 @@ function PinBox({
|
|
|
336
359
|
/>
|
|
337
360
|
|
|
338
361
|
{/* invisible click + hover targets — rendered on top of strokes */}
|
|
339
|
-
{!disabled && (
|
|
362
|
+
{interactive && !disabled && (
|
|
340
363
|
<>
|
|
341
364
|
{/* left pin hit area */}
|
|
342
365
|
<rect
|
|
@@ -402,6 +425,92 @@ function PinBox({
|
|
|
402
425
|
|
|
403
426
|
// ── Main widget ──────────────────────────────────────────────────────────────
|
|
404
427
|
|
|
428
|
+
export function ConstraintsPreview({
|
|
429
|
+
value,
|
|
430
|
+
labels,
|
|
431
|
+
disabled = false,
|
|
432
|
+
size = 22,
|
|
433
|
+
surface = false,
|
|
434
|
+
className,
|
|
435
|
+
}: ConstraintsPreviewProps) {
|
|
436
|
+
const copy = { ...DEFAULT_LABELS, ...labels };
|
|
437
|
+
|
|
438
|
+
return (
|
|
439
|
+
<PinBox
|
|
440
|
+
value={value}
|
|
441
|
+
disabled={disabled}
|
|
442
|
+
labels={copy}
|
|
443
|
+
onToggleH={() => undefined}
|
|
444
|
+
onToggleV={() => undefined}
|
|
445
|
+
interactive={false}
|
|
446
|
+
size={size}
|
|
447
|
+
surface={surface}
|
|
448
|
+
className={className}
|
|
449
|
+
/>
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function ConstraintSelect({
|
|
454
|
+
axis,
|
|
455
|
+
value,
|
|
456
|
+
onChange,
|
|
457
|
+
disabled,
|
|
458
|
+
labels,
|
|
459
|
+
}: {
|
|
460
|
+
axis: "horizontal" | "vertical";
|
|
461
|
+
value: HorizontalConstraint | VerticalConstraint;
|
|
462
|
+
onChange: (value: HorizontalConstraint | VerticalConstraint) => void;
|
|
463
|
+
disabled: boolean;
|
|
464
|
+
labels: ConstraintsWidgetLabels;
|
|
465
|
+
}) {
|
|
466
|
+
const options =
|
|
467
|
+
axis === "horizontal"
|
|
468
|
+
? [
|
|
469
|
+
{ value: "left", label: labels.left },
|
|
470
|
+
{ value: "right", label: labels.right },
|
|
471
|
+
{ value: "left-right", label: labels.leftRight },
|
|
472
|
+
{ value: "center", label: labels.center },
|
|
473
|
+
{ value: "scale", label: labels.scale },
|
|
474
|
+
]
|
|
475
|
+
: [
|
|
476
|
+
{ value: "top", label: labels.top },
|
|
477
|
+
{ value: "bottom", label: labels.bottom },
|
|
478
|
+
{ value: "top-bottom", label: labels.topBottom },
|
|
479
|
+
{ value: "center", label: labels.center },
|
|
480
|
+
{ value: "scale", label: labels.scale },
|
|
481
|
+
];
|
|
482
|
+
|
|
483
|
+
return (
|
|
484
|
+
<Select
|
|
485
|
+
value={value}
|
|
486
|
+
onValueChange={(next) =>
|
|
487
|
+
onChange(next as HorizontalConstraint | VerticalConstraint)
|
|
488
|
+
}
|
|
489
|
+
disabled={disabled}
|
|
490
|
+
>
|
|
491
|
+
<SelectTrigger
|
|
492
|
+
className="h-8 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[12px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)] focus:ring-offset-0 [&>svg]:size-3"
|
|
493
|
+
aria-label={axis === "horizontal" ? labels.horizontal : labels.vertical}
|
|
494
|
+
>
|
|
495
|
+
<SelectValue />
|
|
496
|
+
</SelectTrigger>
|
|
497
|
+
<SelectContent className="z-[270]">
|
|
498
|
+
<SelectGroup>
|
|
499
|
+
{options.map((option) => (
|
|
500
|
+
<SelectItem
|
|
501
|
+
key={option.value}
|
|
502
|
+
value={option.value}
|
|
503
|
+
className="text-[12px]"
|
|
504
|
+
>
|
|
505
|
+
{option.label}
|
|
506
|
+
</SelectItem>
|
|
507
|
+
))}
|
|
508
|
+
</SelectGroup>
|
|
509
|
+
</SelectContent>
|
|
510
|
+
</Select>
|
|
511
|
+
);
|
|
512
|
+
}
|
|
513
|
+
|
|
405
514
|
export function ConstraintsWidget({
|
|
406
515
|
value,
|
|
407
516
|
onChange,
|
|
@@ -420,91 +529,40 @@ export function ConstraintsWidget({
|
|
|
420
529
|
}
|
|
421
530
|
|
|
422
531
|
return (
|
|
423
|
-
<div className={cn("space-y-
|
|
424
|
-
|
|
425
|
-
<span className="text-[11px] font-medium text-muted-foreground">
|
|
532
|
+
<div className={cn("space-y-2", className)}>
|
|
533
|
+
<span className="!text-[11px] font-medium text-muted-foreground">
|
|
426
534
|
{copy.title}
|
|
427
535
|
</span>
|
|
428
536
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
value={value}
|
|
434
|
-
disabled={disabled}
|
|
435
|
-
labels={copy}
|
|
436
|
-
onToggleH={handleToggleH}
|
|
437
|
-
onToggleV={handleToggleV}
|
|
438
|
-
/>
|
|
439
|
-
|
|
440
|
-
{/* dropdowns column */}
|
|
441
|
-
<div className="flex min-w-0 flex-1 flex-col gap-1">
|
|
442
|
-
{/* horizontal constraint */}
|
|
443
|
-
<Select
|
|
537
|
+
<div className="grid grid-cols-[minmax(0,1fr)_4rem] items-stretch gap-2">
|
|
538
|
+
<div className="flex min-w-0 flex-col gap-1.5">
|
|
539
|
+
<ConstraintSelect
|
|
540
|
+
axis="horizontal"
|
|
444
541
|
value={value.horizontal}
|
|
445
|
-
|
|
542
|
+
onChange={(next) =>
|
|
446
543
|
onChange({ ...value, horizontal: next as HorizontalConstraint })
|
|
447
544
|
}
|
|
448
545
|
disabled={disabled}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
>
|
|
454
|
-
<SelectValue />
|
|
455
|
-
</SelectTrigger>
|
|
456
|
-
<SelectContent>
|
|
457
|
-
<SelectItem value="left" className="text-[11px]">
|
|
458
|
-
{copy.left}
|
|
459
|
-
</SelectItem>
|
|
460
|
-
<SelectItem value="right" className="text-[11px]">
|
|
461
|
-
{copy.right}
|
|
462
|
-
</SelectItem>
|
|
463
|
-
<SelectItem value="left-right" className="text-[11px]">
|
|
464
|
-
{copy.leftRight}
|
|
465
|
-
</SelectItem>
|
|
466
|
-
<SelectItem value="center" className="text-[11px]">
|
|
467
|
-
{copy.center}
|
|
468
|
-
</SelectItem>
|
|
469
|
-
<SelectItem value="scale" className="text-[11px]">
|
|
470
|
-
{copy.scale}
|
|
471
|
-
</SelectItem>
|
|
472
|
-
</SelectContent>
|
|
473
|
-
</Select>
|
|
474
|
-
|
|
475
|
-
{/* vertical constraint */}
|
|
476
|
-
<Select
|
|
546
|
+
labels={copy}
|
|
547
|
+
/>
|
|
548
|
+
<ConstraintSelect
|
|
549
|
+
axis="vertical"
|
|
477
550
|
value={value.vertical}
|
|
478
|
-
|
|
551
|
+
onChange={(next) =>
|
|
479
552
|
onChange({ ...value, vertical: next as VerticalConstraint })
|
|
480
553
|
}
|
|
481
554
|
disabled={disabled}
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
className="h-6 w-full px-1.5 text-[11px]"
|
|
485
|
-
aria-label={copy.vertical}
|
|
486
|
-
>
|
|
487
|
-
<SelectValue />
|
|
488
|
-
</SelectTrigger>
|
|
489
|
-
<SelectContent>
|
|
490
|
-
<SelectItem value="top" className="text-[11px]">
|
|
491
|
-
{copy.top}
|
|
492
|
-
</SelectItem>
|
|
493
|
-
<SelectItem value="bottom" className="text-[11px]">
|
|
494
|
-
{copy.bottom}
|
|
495
|
-
</SelectItem>
|
|
496
|
-
<SelectItem value="top-bottom" className="text-[11px]">
|
|
497
|
-
{copy.topBottom}
|
|
498
|
-
</SelectItem>
|
|
499
|
-
<SelectItem value="center" className="text-[11px]">
|
|
500
|
-
{copy.center}
|
|
501
|
-
</SelectItem>
|
|
502
|
-
<SelectItem value="scale" className="text-[11px]">
|
|
503
|
-
{copy.scale}
|
|
504
|
-
</SelectItem>
|
|
505
|
-
</SelectContent>
|
|
506
|
-
</Select>
|
|
555
|
+
labels={copy}
|
|
556
|
+
/>
|
|
507
557
|
</div>
|
|
558
|
+
<PinBox
|
|
559
|
+
value={value}
|
|
560
|
+
disabled={disabled}
|
|
561
|
+
labels={copy}
|
|
562
|
+
onToggleH={handleToggleH}
|
|
563
|
+
onToggleV={handleToggleV}
|
|
564
|
+
size={64}
|
|
565
|
+
/>
|
|
508
566
|
</div>
|
|
509
567
|
</div>
|
|
510
568
|
);
|
|
@@ -1085,7 +1085,7 @@ export function DesignColorPicker({
|
|
|
1085
1085
|
disabled={disabled}
|
|
1086
1086
|
aria-label={copy.hex}
|
|
1087
1087
|
spellCheck={false}
|
|
1088
|
-
className="h-6 min-w-0 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[11px] tabular-nums uppercase"
|
|
1088
|
+
className="h-6 min-w-0 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 !text-[11px] tabular-nums uppercase md:!text-[11px]"
|
|
1089
1089
|
onChange={(e) => {
|
|
1090
1090
|
hexDraftRef.current = e.target.value;
|
|
1091
1091
|
setHexDraft(e.target.value);
|
|
@@ -1206,7 +1206,7 @@ export function DesignColorPicker({
|
|
|
1206
1206
|
disabled={disabled}
|
|
1207
1207
|
aria-label={copy.trigger}
|
|
1208
1208
|
className={cn(
|
|
1209
|
-
"flex h-6 w-full items-center gap-1.5 rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[11px] shadow-none",
|
|
1209
|
+
"flex h-6 w-full items-center gap-1.5 rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 !text-[11px] shadow-none",
|
|
1210
1210
|
"hover:bg-[var(--design-editor-panel-raised-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
|
|
1211
1211
|
disabled && "pointer-events-none opacity-50",
|
|
1212
1212
|
)}
|
|
@@ -1216,10 +1216,10 @@ export function DesignColorPicker({
|
|
|
1216
1216
|
className="size-4 shrink-0 rounded-[3px] border border-border/60"
|
|
1217
1217
|
style={triggerSwatchStyle(value, color)}
|
|
1218
1218
|
/>
|
|
1219
|
-
<span className="min-w-0 flex-1 truncate text-left tabular-nums uppercase text-[11px]">
|
|
1219
|
+
<span className="min-w-0 flex-1 truncate text-left tabular-nums uppercase !text-[11px]">
|
|
1220
1220
|
{triggerLabel(effectivePaintType, color)}
|
|
1221
1221
|
</span>
|
|
1222
|
-
<span className="tabular-nums text-muted-foreground text-[11px]">
|
|
1222
|
+
<span className="tabular-nums text-muted-foreground !text-[11px]">
|
|
1223
1223
|
{effectiveOpacity}%
|
|
1224
1224
|
</span>
|
|
1225
1225
|
</button>
|
|
@@ -1362,7 +1362,7 @@ export function DesignColorPicker({
|
|
|
1362
1362
|
placeholder={"Video URL (mp4, webm)" /* i18n-ignore */}
|
|
1363
1363
|
aria-label={"Video URL" /* i18n-ignore */}
|
|
1364
1364
|
spellCheck={false}
|
|
1365
|
-
className="h-6 w-full rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[11px]"
|
|
1365
|
+
className="h-6 w-full rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 !text-[11px] md:!text-[11px]"
|
|
1366
1366
|
onKeyDown={(e) => {
|
|
1367
1367
|
if (e.key === "Enter") {
|
|
1368
1368
|
e.preventDefault();
|
|
@@ -1565,7 +1565,7 @@ export function DesignColorPicker({
|
|
|
1565
1565
|
setOpacity(next);
|
|
1566
1566
|
}
|
|
1567
1567
|
}}
|
|
1568
|
-
className="h-full min-w-0 flex-1 rounded-none border-0 bg-transparent px-1 text-[11px] tabular-nums shadow-none focus-visible:ring-0"
|
|
1568
|
+
className="h-full min-w-0 flex-1 rounded-none border-0 bg-transparent px-1 !text-[11px] tabular-nums shadow-none focus-visible:ring-0"
|
|
1569
1569
|
compact
|
|
1570
1570
|
/>
|
|
1571
1571
|
<span className="flex w-4 shrink-0 items-center justify-center border-l border-border/60 text-[10px] text-muted-foreground">
|
|
@@ -1579,7 +1579,7 @@ export function DesignColorPicker({
|
|
|
1579
1579
|
{showBlendMode && onBlendModeChange && (
|
|
1580
1580
|
<div className="border-t border-border/70 px-3 py-2.5">
|
|
1581
1581
|
<div className="flex items-center gap-1.5">
|
|
1582
|
-
<span className="min-w-0 flex-1 text-[11px] text-muted-foreground">
|
|
1582
|
+
<span className="min-w-0 flex-1 !text-[11px] text-muted-foreground">
|
|
1583
1583
|
{copy.blendMode}
|
|
1584
1584
|
</span>
|
|
1585
1585
|
<Select
|
|
@@ -1589,7 +1589,7 @@ export function DesignColorPicker({
|
|
|
1589
1589
|
>
|
|
1590
1590
|
<SelectTrigger
|
|
1591
1591
|
aria-label={copy.blendMode}
|
|
1592
|
-
className="h-6 min-w-0 flex-1 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-[11px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]"
|
|
1592
|
+
className="h-6 min-w-0 flex-1 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 !text-[11px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]"
|
|
1593
1593
|
>
|
|
1594
1594
|
<SelectValue />
|
|
1595
1595
|
</SelectTrigger>
|
|
@@ -1598,7 +1598,7 @@ export function DesignColorPicker({
|
|
|
1598
1598
|
<SelectItem
|
|
1599
1599
|
key={option.value}
|
|
1600
1600
|
value={option.value}
|
|
1601
|
-
className="text-[11px]"
|
|
1601
|
+
className="!text-[11px]"
|
|
1602
1602
|
>
|
|
1603
1603
|
{option.label}
|
|
1604
1604
|
</SelectItem>
|
|
@@ -1616,7 +1616,7 @@ export function DesignColorPicker({
|
|
|
1616
1616
|
section is never empty. */}
|
|
1617
1617
|
<div className="border-t border-border/70 px-3 py-2.5">
|
|
1618
1618
|
{/* Source label — matches the design editor layout */}
|
|
1619
|
-
<div className="mb-2 flex h-6 w-full items-center justify-between px-0.5 text-[11px] text-muted-foreground">
|
|
1619
|
+
<div className="mb-2 flex h-6 w-full items-center justify-between px-0.5 !text-[11px] text-muted-foreground">
|
|
1620
1620
|
{"Document colors" /* i18n-ignore design picker source */}
|
|
1621
1621
|
</div>
|
|
1622
1622
|
|
|
@@ -1718,7 +1718,7 @@ function ColorModelPill({
|
|
|
1718
1718
|
onClick={() => setMenuOpen((o) => !o)}
|
|
1719
1719
|
className={cn(
|
|
1720
1720
|
"flex h-6 w-[4.5rem] items-center gap-0.5 rounded px-1.5",
|
|
1721
|
-
"text-[11px] font-semibold text-foreground",
|
|
1721
|
+
"!text-[11px] font-semibold text-foreground",
|
|
1722
1722
|
"bg-transparent border-0 shadow-none",
|
|
1723
1723
|
"hover:bg-[var(--design-editor-control-bg)]",
|
|
1724
1724
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
@@ -1751,7 +1751,7 @@ function ColorModelPill({
|
|
|
1751
1751
|
setMenuOpen(false);
|
|
1752
1752
|
}}
|
|
1753
1753
|
className={cn(
|
|
1754
|
-
"flex w-full items-center px-2 py-1 text-[11px]",
|
|
1754
|
+
"flex w-full items-center px-2 py-1 !text-[11px]",
|
|
1755
1755
|
"hover:bg-accent hover:text-accent-foreground",
|
|
1756
1756
|
"focus-visible:outline-none focus-visible:bg-accent",
|
|
1757
1757
|
m.value === value
|
|
@@ -2018,7 +2018,7 @@ function ScrubbyNumberInput({
|
|
|
2018
2018
|
max={max}
|
|
2019
2019
|
disabled={disabled}
|
|
2020
2020
|
className={cn(
|
|
2021
|
-
"h-6 w-full rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] text-center text-[11px] tabular-nums",
|
|
2021
|
+
"h-6 w-full rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] text-center !text-[11px] tabular-nums",
|
|
2022
2022
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
2023
2023
|
compact && "border-0 shadow-none focus-visible:ring-0",
|
|
2024
2024
|
className,
|
|
@@ -140,7 +140,7 @@ function ScaleSelect({
|
|
|
140
140
|
>
|
|
141
141
|
<SelectTrigger
|
|
142
142
|
className={cn(
|
|
143
|
-
"h-6 w-14 shrink-0 px-1.5 text-[11px]",
|
|
143
|
+
"h-6 w-14 shrink-0 px-1.5 !text-[11px]",
|
|
144
144
|
controlChromeClass,
|
|
145
145
|
)}
|
|
146
146
|
>
|
|
@@ -149,7 +149,7 @@ function ScaleSelect({
|
|
|
149
149
|
<SelectContent>
|
|
150
150
|
<SelectGroup>
|
|
151
151
|
{SCALE_PRESETS.map((p) => (
|
|
152
|
-
<SelectItem key={p.value} value={p.value} className="text-[11px]">
|
|
152
|
+
<SelectItem key={p.value} value={p.value} className="!text-[11px]">
|
|
153
153
|
{p.label}
|
|
154
154
|
</SelectItem>
|
|
155
155
|
))}
|
|
@@ -241,7 +241,7 @@ export function ExportSettingsPanel({
|
|
|
241
241
|
<div className={cn("space-y-1.5", className)}>
|
|
242
242
|
{/* Section header: title left, "+" right — matches the design editor export header */}
|
|
243
243
|
<div className="flex h-6 items-center justify-between">
|
|
244
|
-
<span className="text-[11px] font-medium text-muted-foreground">
|
|
244
|
+
<span className="!text-[11px] font-medium text-muted-foreground">
|
|
245
245
|
{copy.title}
|
|
246
246
|
</span>
|
|
247
247
|
<button
|
|
@@ -275,7 +275,7 @@ export function ExportSettingsPanel({
|
|
|
275
275
|
variant="outline"
|
|
276
276
|
disabled={isDisabled}
|
|
277
277
|
onClick={handleExport}
|
|
278
|
-
className={cn("h-6 w-full px-2 text-[11px]", controlChromeClass)}
|
|
278
|
+
className={cn("h-6 w-full px-2 !text-[11px]", controlChromeClass)}
|
|
279
279
|
>
|
|
280
280
|
<IconDownload className="size-3.5" />
|
|
281
281
|
{copy.export}
|
|
@@ -333,7 +333,7 @@ function ExportRow({
|
|
|
333
333
|
}
|
|
334
334
|
}}
|
|
335
335
|
className={cn(
|
|
336
|
-
"h-6 w-14 shrink-0 px-1.5 text-[11px] tabular-nums",
|
|
336
|
+
"h-6 w-14 shrink-0 px-1.5 !text-[11px] tabular-nums md:!text-[11px]",
|
|
337
337
|
controlChromeClass,
|
|
338
338
|
)}
|
|
339
339
|
aria-label="Scale"
|
|
@@ -365,7 +365,7 @@ function ExportRow({
|
|
|
365
365
|
>
|
|
366
366
|
<SelectTrigger
|
|
367
367
|
className={cn(
|
|
368
|
-
"h-6 min-w-0 flex-1 px-1.5 text-[11px]",
|
|
368
|
+
"h-6 min-w-0 flex-1 px-1.5 !text-[11px]",
|
|
369
369
|
controlChromeClass,
|
|
370
370
|
)}
|
|
371
371
|
>
|
|
@@ -377,7 +377,7 @@ function ExportRow({
|
|
|
377
377
|
<SelectItem
|
|
378
378
|
key={format}
|
|
379
379
|
value={format}
|
|
380
|
-
className="text-[11px] uppercase"
|
|
380
|
+
className="!text-[11px] uppercase"
|
|
381
381
|
>
|
|
382
382
|
{format.toUpperCase()}
|
|
383
383
|
</SelectItem>
|
|
@@ -393,7 +393,7 @@ function ExportRow({
|
|
|
393
393
|
onChange={(e) => onPatchRow(row.id, { suffix: e.target.value })}
|
|
394
394
|
placeholder={labels.suffix}
|
|
395
395
|
className={cn(
|
|
396
|
-
"h-6 min-w-0 flex-1 px-1.5 text-[11px]",
|
|
396
|
+
"h-6 min-w-0 flex-1 px-1.5 !text-[11px] md:!text-[11px]",
|
|
397
397
|
controlChromeClass,
|
|
398
398
|
)}
|
|
399
399
|
aria-label={labels.suffix}
|
|
@@ -564,7 +564,7 @@ export function GradientEditor({
|
|
|
564
564
|
if (Number.isFinite(next))
|
|
565
565
|
updateStopPosition(selectedStopId, clamp(next, 0, 100));
|
|
566
566
|
}}
|
|
567
|
-
className="h-full min-w-0 flex-1 bg-transparent px-1.5 text-[11px] tabular-nums focus-visible:outline-none"
|
|
567
|
+
className="h-full min-w-0 flex-1 bg-transparent px-1.5 !text-[11px] tabular-nums focus-visible:outline-none"
|
|
568
568
|
/>
|
|
569
569
|
</div>
|
|
570
570
|
|
|
@@ -595,7 +595,7 @@ export function GradientEditor({
|
|
|
595
595
|
}
|
|
596
596
|
}}
|
|
597
597
|
onBlur={() => setAngleInput(null)}
|
|
598
|
-
className="h-full min-w-0 flex-1 bg-transparent px-1.5 text-[11px] tabular-nums focus-visible:outline-none"
|
|
598
|
+
className="h-full min-w-0 flex-1 bg-transparent px-1.5 !text-[11px] tabular-nums focus-visible:outline-none"
|
|
599
599
|
/>
|
|
600
600
|
<span className="flex w-4 shrink-0 items-center justify-center text-[10px] text-muted-foreground">
|
|
601
601
|
°
|
|
@@ -347,7 +347,7 @@ export function ImageFillControls({
|
|
|
347
347
|
placeholder={"Image URL" /* i18n-ignore */}
|
|
348
348
|
aria-label={"Image URL" /* i18n-ignore */}
|
|
349
349
|
spellCheck={false}
|
|
350
|
-
className="h-6 min-w-0 flex-1 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[11px]"
|
|
350
|
+
className="h-6 min-w-0 flex-1 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 !text-[11px] md:!text-[11px]"
|
|
351
351
|
onChange={(event) => {
|
|
352
352
|
urlDraftRef.current = event.target.value;
|
|
353
353
|
setUrlDraft(event.target.value);
|
|
@@ -400,13 +400,13 @@ export function ImageFillControls({
|
|
|
400
400
|
>
|
|
401
401
|
<SelectTrigger
|
|
402
402
|
aria-label={"Fill" /* i18n-ignore image fit selector */}
|
|
403
|
-
className="h-6 w-full rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[11px] shadow-none focus:ring-0 focus:ring-offset-0 focus-visible:ring-2 focus-visible:ring-ring [&>svg]:size-3 [&>svg]:shrink-0"
|
|
403
|
+
className="h-6 w-full rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 !text-[11px] shadow-none focus:ring-0 focus:ring-offset-0 focus-visible:ring-2 focus-visible:ring-ring [&>svg]:size-3 [&>svg]:shrink-0"
|
|
404
404
|
>
|
|
405
405
|
<SelectValue />
|
|
406
406
|
</SelectTrigger>
|
|
407
|
-
<SelectContent className="text-[11px]">
|
|
407
|
+
<SelectContent className="!text-[11px]">
|
|
408
408
|
{FIT_MODES.map(({ mode, label }) => (
|
|
409
|
-
<SelectItem key={mode} value={mode} className="text-[11px]">
|
|
409
|
+
<SelectItem key={mode} value={mode} className="!text-[11px]">
|
|
410
410
|
{label}
|
|
411
411
|
</SelectItem>
|
|
412
412
|
))}
|
|
@@ -2,7 +2,7 @@ import { useT } from "@agent-native/core/client";
|
|
|
2
2
|
import {
|
|
3
3
|
IconClipboard,
|
|
4
4
|
IconChevronDown,
|
|
5
|
-
|
|
5
|
+
IconMessageCircle,
|
|
6
6
|
} from "@tabler/icons-react";
|
|
7
7
|
import { useState } from "react";
|
|
8
8
|
|
|
@@ -71,7 +71,7 @@ export function InspectorAiActions({
|
|
|
71
71
|
)}
|
|
72
72
|
>
|
|
73
73
|
<span className="flex items-center gap-1.5">
|
|
74
|
-
<
|
|
74
|
+
<IconMessageCircle className="size-3.5 shrink-0" />
|
|
75
75
|
{t("designEditor.localSourceEdit.askAi")}
|
|
76
76
|
</span>
|
|
77
77
|
<IconChevronDown
|
|
@@ -115,7 +115,7 @@ export function InspectorAiActions({
|
|
|
115
115
|
setOpen(false);
|
|
116
116
|
}}
|
|
117
117
|
>
|
|
118
|
-
<
|
|
118
|
+
<IconMessageCircle className="size-3.5 shrink-0" />
|
|
119
119
|
{t("designEditor.localSourceEdit.applyWithAi")}
|
|
120
120
|
</Button>
|
|
121
121
|
<Button
|
|
@@ -42,6 +42,7 @@ export interface ScrubInputProps extends ScrubExpressionOptions {
|
|
|
42
42
|
icon?: ScrubInputIcon | null;
|
|
43
43
|
disabled?: boolean;
|
|
44
44
|
placeholder?: string;
|
|
45
|
+
mixed?: boolean;
|
|
45
46
|
className?: string;
|
|
46
47
|
inputClassName?: string;
|
|
47
48
|
labelClassName?: string;
|
|
@@ -62,6 +63,7 @@ export function ScrubInput({
|
|
|
62
63
|
icon: Icon = IconArrowsHorizontal,
|
|
63
64
|
disabled = false,
|
|
64
65
|
placeholder,
|
|
66
|
+
mixed = false,
|
|
65
67
|
className,
|
|
66
68
|
inputClassName,
|
|
67
69
|
labelClassName,
|
|
@@ -71,7 +73,7 @@ export function ScrubInput({
|
|
|
71
73
|
const generatedId = useId();
|
|
72
74
|
const inputId = id ?? generatedId;
|
|
73
75
|
const [draft, setDraft] = useState(() =>
|
|
74
|
-
formatScrubValue(value, { unit, precision }),
|
|
76
|
+
mixed ? "Mixed" : formatScrubValue(value, { unit, precision }),
|
|
75
77
|
);
|
|
76
78
|
// Track the latest draft in a ref so commitDraft always reads the most
|
|
77
79
|
// up-to-date value even if the blur event fires before the React state
|
|
@@ -90,11 +92,13 @@ export function ScrubInput({
|
|
|
90
92
|
|
|
91
93
|
useEffect(() => {
|
|
92
94
|
if (!focused) {
|
|
93
|
-
const formatted =
|
|
95
|
+
const formatted = mixed
|
|
96
|
+
? "Mixed"
|
|
97
|
+
: formatScrubValue(value, { unit, precision });
|
|
94
98
|
draftRef.current = formatted;
|
|
95
99
|
setDraft(formatted);
|
|
96
100
|
}
|
|
97
|
-
}, [focused, precision, unit, value]);
|
|
101
|
+
}, [focused, mixed, precision, unit, value]);
|
|
98
102
|
|
|
99
103
|
const options = { unit, min, max, precision };
|
|
100
104
|
const resolvedTooltipLabel = tooltipLabel ?? ariaLabel ?? label;
|
|
@@ -112,9 +116,10 @@ export function ScrubInput({
|
|
|
112
116
|
// React render with the updated draft state hasn't committed yet (e.g.
|
|
113
117
|
// when blur fires in the same synchronous batch as the last onChange).
|
|
114
118
|
const currentDraft = draftRef.current;
|
|
119
|
+
if (mixed && currentDraft === "Mixed") return;
|
|
115
120
|
const parsed = parseScrubExpression(currentDraft, value, options);
|
|
116
121
|
if (!parsed) {
|
|
117
|
-
const reverted = formatScrubValue(value, options);
|
|
122
|
+
const reverted = mixed ? "Mixed" : formatScrubValue(value, options);
|
|
118
123
|
draftRef.current = reverted;
|
|
119
124
|
setDraft(reverted);
|
|
120
125
|
return;
|
|
@@ -151,7 +156,7 @@ export function ScrubInput({
|
|
|
151
156
|
|
|
152
157
|
if (event.key === "Escape") {
|
|
153
158
|
event.preventDefault();
|
|
154
|
-
const reverted = formatScrubValue(value, options);
|
|
159
|
+
const reverted = mixed ? "Mixed" : formatScrubValue(value, options);
|
|
155
160
|
draftRef.current = reverted;
|
|
156
161
|
setDraft(reverted);
|
|
157
162
|
skipNextBlurCommitRef.current = true;
|
|
@@ -216,7 +221,7 @@ export function ScrubInput({
|
|
|
216
221
|
onPointerUp={endDrag}
|
|
217
222
|
onPointerCancel={endDrag}
|
|
218
223
|
className={cn(
|
|
219
|
-
"flex h-6 w-20 shrink-0 cursor-ew-resize select-none items-center gap-1 rounded-sm text-[11px] text-muted-foreground transition-colors",
|
|
224
|
+
"flex h-6 w-20 shrink-0 cursor-ew-resize select-none items-center gap-1 rounded-sm !text-[11px] text-muted-foreground transition-colors",
|
|
220
225
|
"hover:bg-[var(--design-editor-control-bg)] hover:text-foreground",
|
|
221
226
|
dragging &&
|
|
222
227
|
"bg-[var(--design-editor-control-bg)] text-foreground",
|
|
@@ -257,9 +262,10 @@ export function ScrubInput({
|
|
|
257
262
|
onKeyDown={handleKeyDown}
|
|
258
263
|
className={cn(
|
|
259
264
|
// Compact design-editor: h-6, 11px tabular text, ring-1 with no offset.
|
|
260
|
-
"h-6 text-[11px] tabular-nums",
|
|
265
|
+
"h-6 !text-[11px] tabular-nums",
|
|
261
266
|
"focus-visible:ring-1 focus-visible:ring-offset-0",
|
|
262
267
|
inputClassName,
|
|
268
|
+
mixed && "text-muted-foreground",
|
|
263
269
|
)}
|
|
264
270
|
/>
|
|
265
271
|
</div>
|