@agent-native/core 0.90.1 → 0.90.2
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/core/CHANGELOG.md +14 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/client/AgentPanel.tsx +1 -1
- package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +11 -6
- package/corpus/core/src/client/use-action.ts +39 -2
- package/corpus/core/src/client/use-db-sync.ts +44 -18
- package/corpus/core/src/db/create-get-db.ts +32 -2
- package/corpus/core/src/server/framework-request-handler.ts +52 -4
- package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +5 -0
- package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +34 -6
- package/corpus/templates/assets/AGENTS.md +23 -4
- package/corpus/templates/assets/actions/_generation-preset-settings.ts +48 -0
- package/corpus/templates/assets/actions/_helpers.ts +8 -1
- package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +64 -0
- package/corpus/templates/assets/actions/create-generation-preset.ts +11 -3
- package/corpus/templates/assets/actions/generate-image-batch.ts +7 -2
- package/corpus/templates/assets/actions/generate-image.ts +342 -25
- package/corpus/templates/assets/actions/get-library.ts +4 -3
- package/corpus/templates/assets/actions/navigate.ts +2 -1
- package/corpus/templates/assets/actions/refresh-generation-run.ts +5 -1
- package/corpus/templates/assets/actions/update-asset.ts +1 -0
- package/corpus/templates/assets/actions/update-generation-preset.ts +8 -1
- package/corpus/templates/assets/actions/view-screen.ts +8 -1
- package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +9 -1
- package/corpus/templates/assets/app/hooks/use-image-model-menu.ts +1 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +11 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +64 -0
- package/corpus/templates/assets/app/i18n-data.ts +650 -0
- package/corpus/templates/assets/app/routes/asset.$id.tsx +2 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +44 -33
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1474 -0
- package/corpus/templates/assets/app/routes/library.tsx +43 -1
- package/corpus/templates/assets/server/lib/generation.ts +366 -44
- package/corpus/templates/assets/server/lib/image-processing.ts +252 -0
- package/corpus/templates/assets/server/lib/preset-skeleton.ts +137 -0
- package/corpus/templates/assets/shared/api.ts +47 -0
- package/corpus/templates/clips/app/components/library/library-layout.tsx +7 -2
- package/corpus/templates/clips/app/components/library/sort-menu.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +114 -33
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +27 -1
- package/corpus/templates/clips/app/routes/record.tsx +157 -68
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +5 -5
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +20 -3
- package/corpus/templates/clips/shared/finalize-recovery.ts +23 -3
- package/corpus/templates/content/AGENTS.md +52 -52
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +188 -8
- package/corpus/templates/content/actions/_builder-docs-client.ts +41 -3
- package/corpus/templates/content/actions/_database-source-utils.ts +998 -160
- package/corpus/templates/content/actions/_database-utils.ts +44 -4
- package/corpus/templates/content/actions/_notion-action-utils.ts +6 -2
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -1
- package/corpus/templates/content/actions/attach-content-database-source.ts +85 -12
- package/corpus/templates/content/actions/change-content-database-source-role.ts +9 -1
- package/corpus/templates/content/actions/delete-content-database.ts +1 -0
- package/corpus/templates/content/actions/get-document.ts +11 -2
- package/corpus/templates/content/actions/list-content-databases.ts +57 -9
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +23 -6
- package/corpus/templates/content/actions/refresh-content-database-source.ts +26 -3
- package/corpus/templates/content/actions/restore-content-database.ts +1 -0
- package/corpus/templates/content/actions/update-document.ts +43 -0
- package/corpus/templates/content/app/components/editor/BuilderBodySyncingNotice.tsx +21 -0
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +0 -1
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +70 -28
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +69 -17
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +4 -4
- package/corpus/templates/content/app/components/editor/body-hydration.ts +112 -0
- package/corpus/templates/content/app/components/editor/builder-body-hydration-pump.ts +52 -0
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +9076 -2876
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +41 -1
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +36 -11
- package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +21 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -1
- package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +11 -8
- package/corpus/templates/content/app/global.css +41 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +346 -42
- package/corpus/templates/content/app/hooks/use-db-sync.ts +9 -0
- package/corpus/templates/content/app/hooks/use-documents.ts +47 -0
- package/corpus/templates/content/app/hooks/use-notion.ts +12 -10
- package/corpus/templates/content/app/i18n/zh-TW.ts +35 -0
- package/corpus/templates/content/app/i18n-data.ts +355 -0
- package/corpus/templates/content/app/root.tsx +22 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-database-sources-keep-loading-rows-in-the-background.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-attach-starts-with-usable-rows.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-attachment-now-stays-connected-after-large.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-refreshes-now-show-progress-for-large-docs-blog.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-database-pages-now-delete-to-trash-without-route-errors.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-builder-source-refreshes-recover-from-stalled-background-row.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-builder-sourced-rows-open-with-sync-protection.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-database-rows-and-pages-open-faster-from-recently-loaded-dat.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-preview-panels-close-reliably-narrow-sidebar-row-actions-sta.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-builder-sync-progress-no-longer-shows-continue.md +6 -0
- package/corpus/templates/content/shared/api.ts +13 -0
- package/corpus/templates/content/shared/builder-mdx.ts +16 -3
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +23 -13
- package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +98 -0
- package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +162 -0
- package/corpus/templates/design/AGENTS.md +9 -2
- package/corpus/templates/design/actions/add-breakpoint.ts +6 -3
- package/corpus/templates/design/actions/apply-a11y-fix.ts +57 -37
- package/corpus/templates/design/actions/apply-component-prop-edit.ts +41 -20
- package/corpus/templates/design/actions/apply-motion-edit.ts +251 -38
- package/corpus/templates/design/actions/apply-shader-fill.ts +90 -66
- package/corpus/templates/design/actions/apply-visual-edit.ts +282 -55
- package/corpus/templates/design/actions/create-component.ts +29 -60
- package/corpus/templates/design/actions/create-file.ts +9 -2
- package/corpus/templates/design/actions/duplicate-design.ts +31 -2
- package/corpus/templates/design/actions/edit-design.ts +36 -38
- package/corpus/templates/design/actions/generate-design-title.ts +87 -0
- package/corpus/templates/design/actions/generate-design.ts +53 -18
- package/corpus/templates/design/actions/generate-screens.ts +108 -4
- package/corpus/templates/design/actions/get-motion-timeline.ts +35 -7
- package/corpus/templates/design/actions/insert-asset.ts +34 -29
- package/corpus/templates/design/actions/insert-design-native-asset.ts +129 -32
- package/corpus/templates/design/actions/insert-figma-library-asset.ts +35 -30
- package/corpus/templates/design/actions/present-design-variants.ts +7 -2
- package/corpus/templates/design/actions/remove-motion-timeline.ts +31 -36
- package/corpus/templates/design/actions/update-file.ts +190 -75
- package/corpus/templates/design/app/components/design/BreakpointBar.tsx +403 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +469 -222
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +708 -53
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +83 -3
- package/corpus/templates/design/app/components/design/EditPanel.tsx +1091 -6948
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +419 -85
- package/corpus/templates/design/app/components/design/MotionDock.tsx +1124 -103
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2610 -1398
- package/corpus/templates/design/app/components/design/ReadOnlyDesignBanner.tsx +22 -0
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2182 -235
- package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +187 -11
- package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +376 -1
- package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +746 -0
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +17 -0
- package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +1 -1
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +1 -3
- package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +1 -1
- package/corpus/templates/design/app/components/design/edit-panel/appearance-properties.tsx +518 -0
- package/corpus/templates/design/app/components/design/edit-panel/code-inspect-helpers.tsx +562 -0
- package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +763 -0
- package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +94 -0
- package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +780 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +446 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +79 -0
- package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +315 -0
- package/corpus/templates/design/app/components/design/edit-panel/fill-gradient-helpers.ts +344 -0
- package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +594 -0
- package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +119 -0
- package/corpus/templates/design/app/components/design/edit-panel/inspector-controls.tsx +248 -0
- package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +45 -0
- package/corpus/templates/design/app/components/design/edit-panel/layout-properties.tsx +693 -0
- package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +724 -0
- package/corpus/templates/design/app/components/design/edit-panel/position-helpers.ts +207 -0
- package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +628 -0
- package/corpus/templates/design/app/components/design/edit-panel/selection-helpers.ts +91 -0
- package/corpus/templates/design/app/components/design/edit-panel/stroke-properties.tsx +649 -0
- package/corpus/templates/design/app/components/design/edit-panel/style-change-types.ts +118 -0
- package/corpus/templates/design/app/components/design/edit-panel/style-options.ts +88 -0
- package/corpus/templates/design/app/components/design/edit-panel/transform-helpers.ts +100 -0
- package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +117 -0
- package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +501 -0
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +91 -40
- package/corpus/templates/design/app/components/design/inspector/BreakpointOverrideIndicator.tsx +82 -0
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +189 -87
- package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +1097 -0
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +44 -0
- package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +258 -0
- package/corpus/templates/design/app/components/design/inspector/MotionKeyframeDiamond.tsx +144 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +99 -9
- package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +116 -0
- package/corpus/templates/design/app/components/design/inspector/index.ts +26 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +29 -0
- package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +171 -0
- package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +220 -0
- package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +35 -0
- package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +134 -0
- package/corpus/templates/design/app/components/design/multi-screen/culling.ts +185 -0
- package/corpus/templates/design/app/components/design/multi-screen/gradient-overlay-geometry.ts +120 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +892 -0
- package/corpus/templates/design/app/components/design/multi-screen/vector-edit-geometry.ts +21 -0
- package/corpus/templates/design/app/components/design/types.ts +15 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +109 -5
- package/corpus/templates/design/app/global.css +8 -8
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +259 -2
- package/corpus/templates/design/app/i18n/zh-TW.ts +163 -9
- package/corpus/templates/design/app/i18n-breakpoints.ts +205 -0
- package/corpus/templates/design/app/i18n-data.ts +1664 -152
- package/corpus/templates/design/app/i18n-motion.ts +563 -0
- package/corpus/templates/design/app/lib/design-import.ts +73 -0
- package/corpus/templates/design/app/pages/Index.tsx +41 -22
- package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-design-now-has-a-figma-style-left-rail-for-file-agent-assets.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-design-tools-now-use-a-quieter-figma-style-list-layout.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +1 -1
- package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +1 -1
- package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +1 -1
- package/corpus/templates/design/changelog/2026-07-05-designs-get-ai-generated-names-from-your-prompt.md +6 -0
- package/corpus/templates/design/changelog/2026-07-05-local-code-screens-keep-their-connection-when-duplicated-and.md +6 -0
- package/corpus/templates/design/changelog/2026-07-05-press-a-to-draw-screens-on-the-canvas-inside-a-screen-it-dr.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-3d-rotation-and-perspective-controls-on-every-element.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-ai-generated-and-duplicated-screens-now-get-their-editor-sel.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-applying-shaders-and-fills-in-quick-succession-can-no-longer.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-frames-in-the-overview-now-support-click-to-selec.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-segments-in-the-inspector-now-show-a-device-icon-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-targeting-now-lives-in-one-compact-control-in-the.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-canvas-edits-can-no-longer-be-overwritten-by-stale-collabora.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-canvas-edits-inside-screens-save-reliably-again.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-cleaner-inspector-removed-the-ask-ai-box-from-the-design-tab.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-clicking-empty-canvas-space-now-deselects-an-element-inside-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dragging-an-element-onto-a-rectangle-now-nests-it-inside-wit.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dragging-screens-and-objects-on-the-canvas-is-now-much-smoot.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-drawing-a-shape-or-text-on-the-canvas-no-longer-flashes-away.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dropping-an-element-between-two-others-inside-a-screen-now-s.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-duplicating-a-screen-now-places-the-copy-exactly-where-you-d.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-edit-gradients-directly-on-elements-inside-screens-scale-str.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-edits-from-collaborators-and-the-agent-now-update-the-canvas.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-bug-where-most-style-position-and-text-edits-briefly.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-confusing-raw-error-message-when-a-file-upload-fails.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-rare-case-where-an-edit-could-be-silently-overwritte.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-inserted-assets-sometimes-disappearing-reappearing-or-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-inspector-value-scrubbing-producing-erratic-numbers-an.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-padding-gap-and-min-max-size-scrubbing-not-updating-th.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-text-stroke-color-turning-black-and-glyphs-disappearin.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-collapsed-effects-and-stroke-inspector-sections-sh.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-new-design-dialog-closing-unexpectedly-when-using-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-typography-section-missing-when-selecting-text-nes.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-full-view-no-longer-flashes-back-to-the-overview-on-entry-no.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-keyframe-animation-timeline-per-property-keyframes-easing-cu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-moving-restyling-and-scrubbing-values-on-elements-in-ai-gene.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-padding-and-corner-radius-value-scrubbing-now-snaps-to-whole.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-padding-handles-now-only-resize-on-the-handle-line-itself-sh.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-preview-and-edit-hover-focus-and-pressed-states-with-real-cs.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-promoting-an-element-to-a-component-now-works-correctly-for-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-reduced-url-history-churn-and-selection-overlay-flicker-whil.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-removed-the-decorative-dot-before-screen-names-in-the-overvi.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-responsive-breakpoints-edit-at-any-width-with-cascading-over.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-screen-labels-no-longer-turn-blue-when-you-hover-inside-the-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-scrolling-a-screen-with-an-element-selected-stays-smooth-on-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selecting-multiple-elements-and-dragging-now-moves-the-whole.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selection-borders-handles-and-value-readouts-now-stay-the-sa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selection-handles-and-editing-chrome-now-stay-a-constant-siz.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-shader-fills-and-effects-ai-authored-or-preset-glsl-shaders-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-text-drawn-on-the-canvas-now-defaults-to-white-and-inter-in-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-text-dropped-into-a-shape-now-stays-readable-instead-of-disa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-add-tweak-controls-prompt-no-longer-jumps-to-the-corner-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-padding-value-readout-now-stays-visible-while-you-hover-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-selected-element-attachment-now-clears-from-the-chat-com.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-zoom-menu-is-more-compact-with-tight-rows-and-right-alig.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-undo-and-redo-no-longer-flash-the-screen-changes-now-apply-i.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-zoom-presets-like-zoom-to-50-now-stay-on-the-focused-screen-.md +6 -0
- package/corpus/templates/design/server/lib/import-design-files.ts +11 -2
- package/corpus/templates/design/server/source-workspace.ts +139 -59
- package/corpus/templates/design/shared/board-file.ts +11 -2
- package/corpus/templates/design/shared/breakpoint-media.ts +543 -0
- package/corpus/templates/design/shared/canvas-math.ts +354 -35
- package/corpus/templates/design/shared/code-layer.ts +277 -8
- package/corpus/templates/design/shared/design-state.ts +11 -4
- package/corpus/templates/design/shared/interaction-states.ts +548 -0
- package/corpus/templates/design/shared/motion-compiler.ts +186 -23
- package/corpus/templates/design/shared/motion-easing.ts +294 -0
- package/corpus/templates/design/shared/motion-timeline.ts +400 -34
- package/corpus/templates/design/shared/prompt-title.ts +95 -0
- package/corpus/templates/design/shared/responsive-classes.ts +448 -10
- package/corpus/templates/design/shared/screen-annotation.ts +46 -0
- package/corpus/templates/design/shared/shader-fills.ts +1009 -0
- package/corpus/templates/design/shared/shader-presets.ts +852 -4
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +15 -2
- package/corpus/templates/slides/app/components/editor/ImportButton.tsx +10 -1
- package/corpus/templates/slides/app/lib/upload-response.ts +71 -0
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.js +11 -6
- package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
- package/dist/client/use-action.d.ts +3 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +34 -3
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +4 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +37 -18
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/db/create-get-db.d.ts +25 -0
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +25 -2
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +37 -1
- package/dist/server/framework-request-handler.js.map +1 -1
- package/package.json +1 -1
- package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +0 -153
- package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +0 -133
- package/corpus/templates/design/app/pages/DesignEditor.tsx +0 -22924
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Localized strings for MotionDock and its motion-timeline sub-components.
|
|
3
|
+
* Used in: app/components/design/MotionDock.tsx (the bottom motion timeline
|
|
4
|
+
* dock in the Design Studio — toolbar, layer sidebar, keyframe/segment
|
|
5
|
+
* affordances, and the Curve/Spring easing panel).
|
|
6
|
+
*/
|
|
7
|
+
export const motionDockOverrides = {
|
|
8
|
+
"en-US": {
|
|
9
|
+
designEditor: {
|
|
10
|
+
motion: {
|
|
11
|
+
dockLabel: "Motion dock",
|
|
12
|
+
collapseDock: "Collapse motion dock",
|
|
13
|
+
play: "Play",
|
|
14
|
+
pause: "Pause",
|
|
15
|
+
resetPlayhead: "Reset playhead",
|
|
16
|
+
reset: "Reset",
|
|
17
|
+
addKeyframeAtPlayhead: "Add keyframe at playhead",
|
|
18
|
+
addKeyframeAtPlayheadForProperty:
|
|
19
|
+
"Add keyframe at playhead ({{property}})",
|
|
20
|
+
selectPropertyRowFirst: "Select a property row first",
|
|
21
|
+
currentTimeMs: "Current time in ms",
|
|
22
|
+
duration: "Duration",
|
|
23
|
+
durationMs: "Duration in ms",
|
|
24
|
+
playbackMode: "Playback mode: {{mode}}",
|
|
25
|
+
playback: "Playback: {{mode}}",
|
|
26
|
+
loop: "Loop",
|
|
27
|
+
once: "Once",
|
|
28
|
+
pingPong: "Ping-pong",
|
|
29
|
+
toggleAutoKeyframe: "Toggle auto-keyframe",
|
|
30
|
+
autoKeyframe: "Auto-keyframe",
|
|
31
|
+
savingMotion: "Saving motion",
|
|
32
|
+
emptyStateAnimate: "Animate",
|
|
33
|
+
emptyStatePickProperty: ". Pick a property to add the first track.",
|
|
34
|
+
emptyStateNoSelection:
|
|
35
|
+
"Select an element on the canvas, then add a track to animate it.",
|
|
36
|
+
addMotion: "Add motion",
|
|
37
|
+
selectElementFirst: "Select an element on the canvas first",
|
|
38
|
+
animateLayer: 'Animate "{{label}}"',
|
|
39
|
+
more: "More",
|
|
40
|
+
addKeyframe: "Add keyframe",
|
|
41
|
+
trackExists:
|
|
42
|
+
'A "{{property}}" track already exists for {{label}}. Edit its keyframes in the timeline instead.',
|
|
43
|
+
layerAnimationSpan: "{{label}} animation span",
|
|
44
|
+
keyframeAt: "Keyframe at {{ms}}ms",
|
|
45
|
+
deleteKeyframe: "Delete keyframe",
|
|
46
|
+
segmentEasing: "Segment easing: {{ease}}",
|
|
47
|
+
curveTab: "Curve",
|
|
48
|
+
springTab: "Spring",
|
|
49
|
+
customBezier: "Custom bezier",
|
|
50
|
+
customSpring: "Custom spring",
|
|
51
|
+
bounce: "Bounce",
|
|
52
|
+
bezierCurveEditor: "Bezier curve editor",
|
|
53
|
+
springCurvePreview: "Spring curve preview",
|
|
54
|
+
defaultEase: "Default",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
"zh-CN": {
|
|
59
|
+
designEditor: {
|
|
60
|
+
motion: {
|
|
61
|
+
dockLabel: "运动面板",
|
|
62
|
+
collapseDock: "收起运动面板",
|
|
63
|
+
play: "播放",
|
|
64
|
+
pause: "暂停",
|
|
65
|
+
resetPlayhead: "重置播放头",
|
|
66
|
+
reset: "重置",
|
|
67
|
+
addKeyframeAtPlayhead: "在播放头处添加关键帧",
|
|
68
|
+
addKeyframeAtPlayheadForProperty:
|
|
69
|
+
"在播放头处添加关键帧({{property}})",
|
|
70
|
+
selectPropertyRowFirst: "请先选择属性行",
|
|
71
|
+
currentTimeMs: "当前时间(毫秒)",
|
|
72
|
+
duration: "时长",
|
|
73
|
+
durationMs: "时长(毫秒)",
|
|
74
|
+
playbackMode: "播放模式:{{mode}}",
|
|
75
|
+
playback: "播放:{{mode}}",
|
|
76
|
+
loop: "循环",
|
|
77
|
+
once: "一次",
|
|
78
|
+
pingPong: "往复",
|
|
79
|
+
toggleAutoKeyframe: "切换自动关键帧",
|
|
80
|
+
autoKeyframe: "自动关键帧",
|
|
81
|
+
savingMotion: "正在保存动效",
|
|
82
|
+
emptyStateAnimate: "为",
|
|
83
|
+
emptyStatePickProperty: "添加动效。选择一个属性以添加首个轨道。",
|
|
84
|
+
emptyStateNoSelection:
|
|
85
|
+
"在画布上选择一个元素,然后添加轨道为其添加动效。",
|
|
86
|
+
addMotion: "添加动效",
|
|
87
|
+
selectElementFirst: "请先在画布上选择一个元素",
|
|
88
|
+
animateLayer: "为「{{label}}」添加动效",
|
|
89
|
+
more: "更多",
|
|
90
|
+
addKeyframe: "添加关键帧",
|
|
91
|
+
trackExists:
|
|
92
|
+
"「{{property}}」轨道已存在于 {{label}}。请在时间线中编辑其关键帧。",
|
|
93
|
+
layerAnimationSpan: "{{label}} 动效时间范围",
|
|
94
|
+
keyframeAt: "{{ms}}毫秒处的关键帧",
|
|
95
|
+
deleteKeyframe: "删除关键帧",
|
|
96
|
+
segmentEasing: "分段缓动:{{ease}}",
|
|
97
|
+
curveTab: "曲线",
|
|
98
|
+
springTab: "弹簧",
|
|
99
|
+
customBezier: "自定义贝塞尔曲线",
|
|
100
|
+
customSpring: "自定义弹簧",
|
|
101
|
+
bounce: "弹性",
|
|
102
|
+
bezierCurveEditor: "贝塞尔曲线编辑器",
|
|
103
|
+
springCurvePreview: "弹簧曲线预览",
|
|
104
|
+
defaultEase: "默认",
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
"zh-TW": {
|
|
109
|
+
designEditor: {
|
|
110
|
+
motion: {
|
|
111
|
+
dockLabel: "動態面板",
|
|
112
|
+
collapseDock: "收起動態面板",
|
|
113
|
+
play: "播放",
|
|
114
|
+
pause: "暫停",
|
|
115
|
+
resetPlayhead: "重設播放頭",
|
|
116
|
+
reset: "重設",
|
|
117
|
+
addKeyframeAtPlayhead: "在播放頭處新增關鍵影格",
|
|
118
|
+
addKeyframeAtPlayheadForProperty:
|
|
119
|
+
"在播放頭處新增關鍵影格({{property}})",
|
|
120
|
+
selectPropertyRowFirst: "請先選取屬性列",
|
|
121
|
+
currentTimeMs: "目前時間(毫秒)",
|
|
122
|
+
duration: "持續時間",
|
|
123
|
+
durationMs: "持續時間(毫秒)",
|
|
124
|
+
playbackMode: "播放模式:{{mode}}",
|
|
125
|
+
playback: "播放:{{mode}}",
|
|
126
|
+
loop: "循環",
|
|
127
|
+
once: "一次",
|
|
128
|
+
pingPong: "往復",
|
|
129
|
+
toggleAutoKeyframe: "切換自動關鍵影格",
|
|
130
|
+
autoKeyframe: "自動關鍵影格",
|
|
131
|
+
savingMotion: "正在儲存動態效果",
|
|
132
|
+
emptyStateAnimate: "為",
|
|
133
|
+
emptyStatePickProperty: "新增動態效果。選擇一個屬性以新增第一個軌道。",
|
|
134
|
+
emptyStateNoSelection:
|
|
135
|
+
"在畫布上選取一個元素,然後新增軌道為其新增動態效果。",
|
|
136
|
+
addMotion: "新增動態",
|
|
137
|
+
selectElementFirst: "請先在畫布上選取一個元素",
|
|
138
|
+
animateLayer: "為「{{label}}」新增動態",
|
|
139
|
+
more: "更多",
|
|
140
|
+
addKeyframe: "新增關鍵影格",
|
|
141
|
+
trackExists:
|
|
142
|
+
"「{{property}}」軌道已存在於 {{label}}。請在時間軸中編輯其關鍵影格。",
|
|
143
|
+
layerAnimationSpan: "{{label}} 動態時間範圍",
|
|
144
|
+
keyframeAt: "{{ms}}毫秒處的關鍵影格",
|
|
145
|
+
deleteKeyframe: "刪除關鍵影格",
|
|
146
|
+
segmentEasing: "區段緩動:{{ease}}",
|
|
147
|
+
curveTab: "曲線",
|
|
148
|
+
springTab: "彈簧",
|
|
149
|
+
customBezier: "自訂貝茲曲線",
|
|
150
|
+
customSpring: "自訂彈簧",
|
|
151
|
+
bounce: "彈性",
|
|
152
|
+
bezierCurveEditor: "貝茲曲線編輯器",
|
|
153
|
+
springCurvePreview: "彈簧曲線預覽",
|
|
154
|
+
defaultEase: "預設",
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
"es-ES": {
|
|
159
|
+
designEditor: {
|
|
160
|
+
motion: {
|
|
161
|
+
dockLabel: "Panel de movimiento",
|
|
162
|
+
collapseDock: "Contraer panel de movimiento",
|
|
163
|
+
play: "Reproducir",
|
|
164
|
+
pause: "Pausar",
|
|
165
|
+
resetPlayhead: "Restablecer cabezal de reproducción",
|
|
166
|
+
reset: "Restablecer",
|
|
167
|
+
addKeyframeAtPlayhead: "Añadir fotograma clave en el cabezal",
|
|
168
|
+
addKeyframeAtPlayheadForProperty:
|
|
169
|
+
"Añadir fotograma clave en el cabezal ({{property}})",
|
|
170
|
+
selectPropertyRowFirst: "Selecciona primero una fila de propiedad",
|
|
171
|
+
currentTimeMs: "Tiempo actual en ms",
|
|
172
|
+
duration: "Duración",
|
|
173
|
+
durationMs: "Duración en ms",
|
|
174
|
+
playbackMode: "Modo de reproducción: {{mode}}",
|
|
175
|
+
playback: "Reproducción: {{mode}}",
|
|
176
|
+
loop: "Bucle",
|
|
177
|
+
once: "Una vez",
|
|
178
|
+
pingPong: "Ida y vuelta",
|
|
179
|
+
toggleAutoKeyframe: "Alternar fotograma clave automático",
|
|
180
|
+
autoKeyframe: "Fotograma clave automático",
|
|
181
|
+
savingMotion: "Guardando movimiento",
|
|
182
|
+
emptyStateAnimate: "Animar",
|
|
183
|
+
emptyStatePickProperty:
|
|
184
|
+
". Elige una propiedad para añadir la primera pista.",
|
|
185
|
+
emptyStateNoSelection:
|
|
186
|
+
"Selecciona un elemento en el lienzo y añade una pista para animarlo.",
|
|
187
|
+
addMotion: "Añadir movimiento",
|
|
188
|
+
selectElementFirst: "Selecciona primero un elemento en el lienzo",
|
|
189
|
+
animateLayer: 'Animar "{{label}}"',
|
|
190
|
+
more: "Más",
|
|
191
|
+
addKeyframe: "Añadir fotograma clave",
|
|
192
|
+
trackExists:
|
|
193
|
+
'Ya existe una pista de "{{property}}" para {{label}}. Edita sus fotogramas clave en la línea de tiempo.',
|
|
194
|
+
layerAnimationSpan: "Rango de animación de {{label}}",
|
|
195
|
+
keyframeAt: "Fotograma clave en {{ms}}ms",
|
|
196
|
+
deleteKeyframe: "Eliminar fotograma clave",
|
|
197
|
+
segmentEasing: "Suavizado del segmento: {{ease}}",
|
|
198
|
+
curveTab: "Curva",
|
|
199
|
+
springTab: "Resorte",
|
|
200
|
+
customBezier: "Bézier personalizada",
|
|
201
|
+
customSpring: "Resorte personalizado",
|
|
202
|
+
bounce: "Rebote",
|
|
203
|
+
bezierCurveEditor: "Editor de curva Bézier",
|
|
204
|
+
springCurvePreview: "Vista previa de curva de resorte",
|
|
205
|
+
defaultEase: "Predeterminado",
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
"fr-FR": {
|
|
210
|
+
designEditor: {
|
|
211
|
+
motion: {
|
|
212
|
+
dockLabel: "Panneau de mouvement",
|
|
213
|
+
collapseDock: "Réduire le panneau de mouvement",
|
|
214
|
+
play: "Lecture",
|
|
215
|
+
pause: "Pause",
|
|
216
|
+
resetPlayhead: "Réinitialiser la tête de lecture",
|
|
217
|
+
reset: "Réinitialiser",
|
|
218
|
+
addKeyframeAtPlayhead: "Ajouter une image clé à la tête de lecture",
|
|
219
|
+
addKeyframeAtPlayheadForProperty:
|
|
220
|
+
"Ajouter une image clé à la tête de lecture ({{property}})",
|
|
221
|
+
selectPropertyRowFirst: "Sélectionnez d'abord une ligne de propriété",
|
|
222
|
+
currentTimeMs: "Temps actuel en ms",
|
|
223
|
+
duration: "Durée",
|
|
224
|
+
durationMs: "Durée en ms",
|
|
225
|
+
playbackMode: "Mode de lecture : {{mode}}",
|
|
226
|
+
playback: "Lecture : {{mode}}",
|
|
227
|
+
loop: "Boucle",
|
|
228
|
+
once: "Une fois",
|
|
229
|
+
pingPong: "Aller-retour",
|
|
230
|
+
toggleAutoKeyframe: "Activer/désactiver l'image clé automatique",
|
|
231
|
+
autoKeyframe: "Image clé automatique",
|
|
232
|
+
savingMotion: "Enregistrement du mouvement",
|
|
233
|
+
emptyStateAnimate: "Animer",
|
|
234
|
+
emptyStatePickProperty:
|
|
235
|
+
". Choisissez une propriété pour ajouter la première piste.",
|
|
236
|
+
emptyStateNoSelection:
|
|
237
|
+
"Sélectionnez un élément sur le canevas, puis ajoutez une piste pour l'animer.",
|
|
238
|
+
addMotion: "Ajouter un mouvement",
|
|
239
|
+
selectElementFirst: "Sélectionnez d'abord un élément sur le canevas",
|
|
240
|
+
animateLayer: "Animer « {{label}} »",
|
|
241
|
+
more: "Plus",
|
|
242
|
+
addKeyframe: "Ajouter une image clé",
|
|
243
|
+
trackExists:
|
|
244
|
+
"Une piste « {{property}} » existe déjà pour {{label}}. Modifiez ses images clés dans la chronologie.",
|
|
245
|
+
layerAnimationSpan: "Plage d'animation de {{label}}",
|
|
246
|
+
keyframeAt: "Image clé à {{ms}}ms",
|
|
247
|
+
deleteKeyframe: "Supprimer l'image clé",
|
|
248
|
+
segmentEasing: "Accélération du segment : {{ease}}",
|
|
249
|
+
curveTab: "Courbe",
|
|
250
|
+
springTab: "Ressort",
|
|
251
|
+
customBezier: "Bézier personnalisée",
|
|
252
|
+
customSpring: "Ressort personnalisé",
|
|
253
|
+
bounce: "Rebond",
|
|
254
|
+
bezierCurveEditor: "Éditeur de courbe de Bézier",
|
|
255
|
+
springCurvePreview: "Aperçu de la courbe de ressort",
|
|
256
|
+
defaultEase: "Par défaut",
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
"de-DE": {
|
|
261
|
+
designEditor: {
|
|
262
|
+
motion: {
|
|
263
|
+
dockLabel: "Bewegungsleiste",
|
|
264
|
+
collapseDock: "Bewegungsleiste einklappen",
|
|
265
|
+
play: "Abspielen",
|
|
266
|
+
pause: "Pausieren",
|
|
267
|
+
resetPlayhead: "Wiedergabekopf zurücksetzen",
|
|
268
|
+
reset: "Zurücksetzen",
|
|
269
|
+
addKeyframeAtPlayhead: "Keyframe am Wiedergabekopf hinzufügen",
|
|
270
|
+
addKeyframeAtPlayheadForProperty:
|
|
271
|
+
"Keyframe am Wiedergabekopf hinzufügen ({{property}})",
|
|
272
|
+
selectPropertyRowFirst: "Wähle zuerst eine Eigenschaftszeile aus",
|
|
273
|
+
currentTimeMs: "Aktuelle Zeit in ms",
|
|
274
|
+
duration: "Dauer",
|
|
275
|
+
durationMs: "Dauer in ms",
|
|
276
|
+
playbackMode: "Wiedergabemodus: {{mode}}",
|
|
277
|
+
playback: "Wiedergabe: {{mode}}",
|
|
278
|
+
loop: "Schleife",
|
|
279
|
+
once: "Einmal",
|
|
280
|
+
pingPong: "Hin und her",
|
|
281
|
+
toggleAutoKeyframe: "Auto-Keyframe umschalten",
|
|
282
|
+
autoKeyframe: "Auto-Keyframe",
|
|
283
|
+
savingMotion: "Bewegung wird gespeichert",
|
|
284
|
+
emptyStateAnimate: "Animiere",
|
|
285
|
+
emptyStatePickProperty:
|
|
286
|
+
". Wähle eine Eigenschaft, um die erste Spur hinzuzufügen.",
|
|
287
|
+
emptyStateNoSelection:
|
|
288
|
+
"Wähle ein Element auf der Leinwand aus und füge dann eine Spur hinzu, um es zu animieren.",
|
|
289
|
+
addMotion: "Bewegung hinzufügen",
|
|
290
|
+
selectElementFirst: "Wähle zuerst ein Element auf der Leinwand aus",
|
|
291
|
+
animateLayer: "Animiere „{{label}}“",
|
|
292
|
+
more: "Mehr",
|
|
293
|
+
addKeyframe: "Keyframe hinzufügen",
|
|
294
|
+
trackExists:
|
|
295
|
+
"Eine „{{property}}“-Spur für {{label}} existiert bereits. Bearbeite ihre Keyframes in der Zeitleiste.",
|
|
296
|
+
layerAnimationSpan: "Animationsbereich von {{label}}",
|
|
297
|
+
keyframeAt: "Keyframe bei {{ms}}ms",
|
|
298
|
+
deleteKeyframe: "Keyframe löschen",
|
|
299
|
+
segmentEasing: "Segment-Easing: {{ease}}",
|
|
300
|
+
curveTab: "Kurve",
|
|
301
|
+
springTab: "Feder",
|
|
302
|
+
customBezier: "Benutzerdefinierte Bézier-Kurve",
|
|
303
|
+
customSpring: "Benutzerdefinierte Feder",
|
|
304
|
+
bounce: "Sprungkraft",
|
|
305
|
+
bezierCurveEditor: "Bézier-Kurveneditor",
|
|
306
|
+
springCurvePreview: "Federkurvenvorschau",
|
|
307
|
+
defaultEase: "Standard",
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
"ja-JP": {
|
|
312
|
+
designEditor: {
|
|
313
|
+
motion: {
|
|
314
|
+
dockLabel: "モーションドック",
|
|
315
|
+
collapseDock: "モーションドックを閉じる",
|
|
316
|
+
play: "再生",
|
|
317
|
+
pause: "一時停止",
|
|
318
|
+
resetPlayhead: "再生ヘッドをリセット",
|
|
319
|
+
reset: "リセット",
|
|
320
|
+
addKeyframeAtPlayhead: "再生ヘッドの位置にキーフレームを追加",
|
|
321
|
+
addKeyframeAtPlayheadForProperty:
|
|
322
|
+
"再生ヘッドの位置にキーフレームを追加({{property}})",
|
|
323
|
+
selectPropertyRowFirst: "まずプロパティ行を選択してください",
|
|
324
|
+
currentTimeMs: "現在時刻(ms)",
|
|
325
|
+
duration: "長さ",
|
|
326
|
+
durationMs: "長さ(ms)",
|
|
327
|
+
playbackMode: "再生モード: {{mode}}",
|
|
328
|
+
playback: "再生: {{mode}}",
|
|
329
|
+
loop: "ループ",
|
|
330
|
+
once: "1回",
|
|
331
|
+
pingPong: "往復",
|
|
332
|
+
toggleAutoKeyframe: "自動キーフレームの切り替え",
|
|
333
|
+
autoKeyframe: "自動キーフレーム",
|
|
334
|
+
savingMotion: "モーションを保存中",
|
|
335
|
+
emptyStateAnimate: "",
|
|
336
|
+
emptyStatePickProperty:
|
|
337
|
+
"にモーションを追加するには、プロパティを選んで最初のトラックを追加してください。",
|
|
338
|
+
emptyStateNoSelection:
|
|
339
|
+
"キャンバス上で要素を選択し、トラックを追加してアニメーションを設定します。",
|
|
340
|
+
addMotion: "モーションを追加",
|
|
341
|
+
selectElementFirst: "まずキャンバス上で要素を選択してください",
|
|
342
|
+
animateLayer: "「{{label}}」にモーションを追加",
|
|
343
|
+
more: "その他",
|
|
344
|
+
addKeyframe: "キーフレームを追加",
|
|
345
|
+
trackExists:
|
|
346
|
+
"「{{property}}」トラックは {{label}} にすでに存在します。タイムラインでキーフレームを編集してください。",
|
|
347
|
+
layerAnimationSpan: "{{label}} のアニメーション範囲",
|
|
348
|
+
keyframeAt: "{{ms}}ms のキーフレーム",
|
|
349
|
+
deleteKeyframe: "キーフレームを削除",
|
|
350
|
+
segmentEasing: "セグメントのイージング: {{ease}}",
|
|
351
|
+
curveTab: "カーブ",
|
|
352
|
+
springTab: "スプリング",
|
|
353
|
+
customBezier: "カスタムベジェ",
|
|
354
|
+
customSpring: "カスタムスプリング",
|
|
355
|
+
bounce: "バウンス",
|
|
356
|
+
bezierCurveEditor: "ベジェ曲線エディター",
|
|
357
|
+
springCurvePreview: "スプリング カーブ プレビュー",
|
|
358
|
+
defaultEase: "デフォルト",
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
},
|
|
362
|
+
"ko-KR": {
|
|
363
|
+
designEditor: {
|
|
364
|
+
motion: {
|
|
365
|
+
dockLabel: "모션 독",
|
|
366
|
+
collapseDock: "모션 독 접기",
|
|
367
|
+
play: "재생",
|
|
368
|
+
pause: "일시정지",
|
|
369
|
+
resetPlayhead: "재생 헤드 재설정",
|
|
370
|
+
reset: "재설정",
|
|
371
|
+
addKeyframeAtPlayhead: "재생 헤드 위치에 키프레임 추가",
|
|
372
|
+
addKeyframeAtPlayheadForProperty:
|
|
373
|
+
"재생 헤드 위치에 키프레임 추가 ({{property}})",
|
|
374
|
+
selectPropertyRowFirst: "먼저 속성 행을 선택하세요",
|
|
375
|
+
currentTimeMs: "현재 시간(ms)",
|
|
376
|
+
duration: "지속 시간",
|
|
377
|
+
durationMs: "지속 시간(ms)",
|
|
378
|
+
playbackMode: "재생 모드: {{mode}}",
|
|
379
|
+
playback: "재생: {{mode}}",
|
|
380
|
+
loop: "반복",
|
|
381
|
+
once: "한 번",
|
|
382
|
+
pingPong: "왕복",
|
|
383
|
+
toggleAutoKeyframe: "자동 키프레임 전환",
|
|
384
|
+
autoKeyframe: "자동 키프레임",
|
|
385
|
+
savingMotion: "모션 저장 중",
|
|
386
|
+
emptyStateAnimate: "",
|
|
387
|
+
emptyStatePickProperty:
|
|
388
|
+
"에 모션을 추가하려면 속성을 선택하여 첫 트랙을 추가하세요.",
|
|
389
|
+
emptyStateNoSelection:
|
|
390
|
+
"캔버스에서 요소를 선택한 다음 트랙을 추가하여 애니메이션을 적용하세요.",
|
|
391
|
+
addMotion: "모션 추가",
|
|
392
|
+
selectElementFirst: "먼저 캔버스에서 요소를 선택하세요",
|
|
393
|
+
animateLayer: "'{{label}}'에 모션 추가",
|
|
394
|
+
more: "더 보기",
|
|
395
|
+
addKeyframe: "키프레임 추가",
|
|
396
|
+
trackExists:
|
|
397
|
+
"'{{property}}' 트랙이 {{label}}에 이미 있습니다. 타임라인에서 키프레임을 편집하세요.",
|
|
398
|
+
layerAnimationSpan: "{{label}} 애니메이션 범위",
|
|
399
|
+
keyframeAt: "{{ms}}ms의 키프레임",
|
|
400
|
+
deleteKeyframe: "키프레임 삭제",
|
|
401
|
+
segmentEasing: "구간 이징: {{ease}}",
|
|
402
|
+
curveTab: "커브",
|
|
403
|
+
springTab: "스프링",
|
|
404
|
+
customBezier: "사용자 지정 베지어",
|
|
405
|
+
customSpring: "사용자 지정 스프링",
|
|
406
|
+
bounce: "바운스",
|
|
407
|
+
bezierCurveEditor: "베지어 곡선 편집기",
|
|
408
|
+
springCurvePreview: "스프링 곡선 미리보기",
|
|
409
|
+
defaultEase: "기본값",
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
"pt-BR": {
|
|
414
|
+
designEditor: {
|
|
415
|
+
motion: {
|
|
416
|
+
dockLabel: "Painel de movimento",
|
|
417
|
+
collapseDock: "Recolher painel de movimento",
|
|
418
|
+
play: "Reproduzir",
|
|
419
|
+
pause: "Pausar",
|
|
420
|
+
resetPlayhead: "Redefinir cabeçote de reprodução",
|
|
421
|
+
reset: "Redefinir",
|
|
422
|
+
addKeyframeAtPlayhead: "Adicionar quadro-chave no cabeçote",
|
|
423
|
+
addKeyframeAtPlayheadForProperty:
|
|
424
|
+
"Adicionar quadro-chave no cabeçote ({{property}})",
|
|
425
|
+
selectPropertyRowFirst: "Selecione primeiro uma linha de propriedade",
|
|
426
|
+
currentTimeMs: "Tempo atual em ms",
|
|
427
|
+
duration: "Duração",
|
|
428
|
+
durationMs: "Duração em ms",
|
|
429
|
+
playbackMode: "Modo de reprodução: {{mode}}",
|
|
430
|
+
playback: "Reprodução: {{mode}}",
|
|
431
|
+
loop: "Repetir",
|
|
432
|
+
once: "Uma vez",
|
|
433
|
+
pingPong: "Ida e volta",
|
|
434
|
+
toggleAutoKeyframe: "Alternar quadro-chave automático",
|
|
435
|
+
autoKeyframe: "Quadro-chave automático",
|
|
436
|
+
savingMotion: "Salvando movimento",
|
|
437
|
+
emptyStateAnimate: "Animar",
|
|
438
|
+
emptyStatePickProperty:
|
|
439
|
+
". Escolha uma propriedade para adicionar a primeira faixa.",
|
|
440
|
+
emptyStateNoSelection:
|
|
441
|
+
"Selecione um elemento na tela e adicione uma faixa para animá-lo.",
|
|
442
|
+
addMotion: "Adicionar movimento",
|
|
443
|
+
selectElementFirst: "Selecione primeiro um elemento na tela",
|
|
444
|
+
animateLayer: 'Animar "{{label}}"',
|
|
445
|
+
more: "Mais",
|
|
446
|
+
addKeyframe: "Adicionar quadro-chave",
|
|
447
|
+
trackExists:
|
|
448
|
+
'Uma faixa de "{{property}}" já existe para {{label}}. Edite os quadros-chave na linha do tempo.',
|
|
449
|
+
layerAnimationSpan: "Intervalo de animação de {{label}}",
|
|
450
|
+
keyframeAt: "Quadro-chave em {{ms}}ms",
|
|
451
|
+
deleteKeyframe: "Excluir quadro-chave",
|
|
452
|
+
segmentEasing: "Suavização do segmento: {{ease}}",
|
|
453
|
+
curveTab: "Curva",
|
|
454
|
+
springTab: "Mola",
|
|
455
|
+
customBezier: "Bézier personalizada",
|
|
456
|
+
customSpring: "Mola personalizada",
|
|
457
|
+
bounce: "Quique",
|
|
458
|
+
bezierCurveEditor: "Editor de curva Bézier",
|
|
459
|
+
springCurvePreview: "Pré-visualização da curva de mola",
|
|
460
|
+
defaultEase: "Padrão",
|
|
461
|
+
},
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
"hi-IN": {
|
|
465
|
+
designEditor: {
|
|
466
|
+
motion: {
|
|
467
|
+
dockLabel: "मोशन डॉक",
|
|
468
|
+
collapseDock: "मोशन डॉक संक्षिप्त करें",
|
|
469
|
+
play: "चलाएं",
|
|
470
|
+
pause: "रोकें",
|
|
471
|
+
resetPlayhead: "प्लेहेड रीसेट करें",
|
|
472
|
+
reset: "रीसेट करें",
|
|
473
|
+
addKeyframeAtPlayhead: "प्लेहेड पर कीफ़्रेम जोड़ें",
|
|
474
|
+
addKeyframeAtPlayheadForProperty: "प्लेहेड पर कीफ़्रेम जोड़ें ({{property}})",
|
|
475
|
+
selectPropertyRowFirst: "पहले एक प्रॉपर्टी रो चुनें",
|
|
476
|
+
currentTimeMs: "वर्तमान समय (ms में)",
|
|
477
|
+
duration: "अवधि",
|
|
478
|
+
durationMs: "अवधि (ms में)",
|
|
479
|
+
playbackMode: "प्लेबैक मोड: {{mode}}",
|
|
480
|
+
playback: "प्लेबैक: {{mode}}",
|
|
481
|
+
loop: "लूप",
|
|
482
|
+
once: "एक बार",
|
|
483
|
+
pingPong: "आगे-पीछे",
|
|
484
|
+
toggleAutoKeyframe: "ऑटो-कीफ़्रेम टॉगल करें",
|
|
485
|
+
autoKeyframe: "ऑटो-कीफ़्रेम",
|
|
486
|
+
savingMotion: "मोशन सेव हो रहा है",
|
|
487
|
+
emptyStateAnimate: "",
|
|
488
|
+
emptyStatePickProperty:
|
|
489
|
+
"को एनिमेट करें। पहला ट्रैक जोड़ने के लिए एक प्रॉपर्टी चुनें।",
|
|
490
|
+
emptyStateNoSelection:
|
|
491
|
+
"कैनवस पर एक एलिमेंट चुनें, फिर उसे एनिमेट करने के लिए एक ट्रैक जोड़ें।",
|
|
492
|
+
addMotion: "मोशन जोड़ें",
|
|
493
|
+
selectElementFirst: "पहले कैनवस पर एक एलिमेंट चुनें",
|
|
494
|
+
animateLayer: "“{{label}}” को एनिमेट करें",
|
|
495
|
+
more: "अधिक",
|
|
496
|
+
addKeyframe: "कीफ़्रेम जोड़ें",
|
|
497
|
+
trackExists:
|
|
498
|
+
"{{label}} के लिए “{{property}}” ट्रैक पहले से मौजूद है। टाइमलाइन में इसके कीफ़्रेम संपादित करें।",
|
|
499
|
+
layerAnimationSpan: "{{label}} एनिमेशन रेंज",
|
|
500
|
+
keyframeAt: "{{ms}}ms पर कीफ़्रेम",
|
|
501
|
+
deleteKeyframe: "कीफ़्रेम हटाएं",
|
|
502
|
+
segmentEasing: "सेगमेंट ईज़िंग: {{ease}}",
|
|
503
|
+
curveTab: "कर्व",
|
|
504
|
+
springTab: "स्प्रिंग",
|
|
505
|
+
customBezier: "कस्टम बेज़ियर",
|
|
506
|
+
customSpring: "कस्टम स्प्रिंग",
|
|
507
|
+
bounce: "बाउंस",
|
|
508
|
+
bezierCurveEditor: "बेज़ियर कर्व एडिटर",
|
|
509
|
+
springCurvePreview: "स्प्रिंग कर्व पूर्वावलोकन",
|
|
510
|
+
defaultEase: "डिफ़ॉल्ट",
|
|
511
|
+
},
|
|
512
|
+
},
|
|
513
|
+
},
|
|
514
|
+
"ar-SA": {
|
|
515
|
+
designEditor: {
|
|
516
|
+
motion: {
|
|
517
|
+
dockLabel: "لوحة الحركة",
|
|
518
|
+
collapseDock: "طي لوحة الحركة",
|
|
519
|
+
play: "تشغيل",
|
|
520
|
+
pause: "إيقاف مؤقت",
|
|
521
|
+
resetPlayhead: "إعادة تعيين رأس التشغيل",
|
|
522
|
+
reset: "إعادة تعيين",
|
|
523
|
+
addKeyframeAtPlayhead: "إضافة إطار أساسي عند رأس التشغيل",
|
|
524
|
+
addKeyframeAtPlayheadForProperty:
|
|
525
|
+
"إضافة إطار أساسي عند رأس التشغيل ({{property}})",
|
|
526
|
+
selectPropertyRowFirst: "الرجاء تحديد صف خاصية أولاً",
|
|
527
|
+
currentTimeMs: "الوقت الحالي بالملي ثانية",
|
|
528
|
+
duration: "المدة",
|
|
529
|
+
durationMs: "المدة بالملي ثانية",
|
|
530
|
+
playbackMode: "وضع التشغيل: {{mode}}",
|
|
531
|
+
playback: "التشغيل: {{mode}}",
|
|
532
|
+
loop: "تكرار",
|
|
533
|
+
once: "مرة واحدة",
|
|
534
|
+
pingPong: "ذهاب وإياب",
|
|
535
|
+
toggleAutoKeyframe: "تبديل الإطار الأساسي التلقائي",
|
|
536
|
+
autoKeyframe: "إطار أساسي تلقائي",
|
|
537
|
+
savingMotion: "جارٍ حفظ الحركة",
|
|
538
|
+
emptyStateAnimate: "تحريك",
|
|
539
|
+
emptyStatePickProperty: ". اختر خاصية لإضافة المسار الأول.",
|
|
540
|
+
emptyStateNoSelection: "حدد عنصرًا على اللوحة، ثم أضف مسارًا لتحريكه.",
|
|
541
|
+
addMotion: "إضافة حركة",
|
|
542
|
+
selectElementFirst: "الرجاء تحديد عنصر على اللوحة أولاً",
|
|
543
|
+
animateLayer: "تحريك “{{label}}”",
|
|
544
|
+
more: "المزيد",
|
|
545
|
+
addKeyframe: "إضافة إطار أساسي",
|
|
546
|
+
trackExists:
|
|
547
|
+
"يوجد بالفعل مسار “{{property}}” لـ {{label}}. عدّل إطاراته الأساسية في المخطط الزمني.",
|
|
548
|
+
layerAnimationSpan: "نطاق حركة {{label}}",
|
|
549
|
+
keyframeAt: "إطار أساسي عند {{ms}} م.ث",
|
|
550
|
+
deleteKeyframe: "حذف الإطار الأساسي",
|
|
551
|
+
segmentEasing: "تسارع الجزء: {{ease}}",
|
|
552
|
+
curveTab: "منحنى",
|
|
553
|
+
springTab: "زنبرك",
|
|
554
|
+
customBezier: "بيزييه مخصص",
|
|
555
|
+
customSpring: "زنبرك مخصص",
|
|
556
|
+
bounce: "الارتداد",
|
|
557
|
+
bezierCurveEditor: "محرر منحنى بيزييه",
|
|
558
|
+
springCurvePreview: "معاينة منحنى الزنبرك",
|
|
559
|
+
defaultEase: "افتراضي",
|
|
560
|
+
},
|
|
561
|
+
},
|
|
562
|
+
},
|
|
563
|
+
};
|
|
@@ -46,6 +46,79 @@ export function importResultSummary(
|
|
|
46
46
|
return `Imported ${count} screens.`;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
// --- R83: safe fetch-response parsing for the file upload path ---
|
|
50
|
+
//
|
|
51
|
+
// A failed upload can come back as a non-JSON body — a plaintext "Internal
|
|
52
|
+
// Error" from an upstream proxy/platform crash page, an HTML error page, or
|
|
53
|
+
// any other unexpected content-type — even though this app's own
|
|
54
|
+
// import-design-file route always returns a JSON `{ error }` envelope on its
|
|
55
|
+
// own thrown failures. Calling `response.json()` unconditionally on a body
|
|
56
|
+
// like that throws a raw `SyntaxError` ("Unexpected token 'I', "Internal
|
|
57
|
+
// E"... is not valid JSON"), which then surfaces verbatim in the upload
|
|
58
|
+
// toast instead of a clean message. Route every parse through this helper so
|
|
59
|
+
// a non-JSON body always degrades to a readable message instead of a raw
|
|
60
|
+
// parser error leaking into the UI.
|
|
61
|
+
|
|
62
|
+
/** Minimal shape `parseUploadResponse` needs — a subset of the real `Response`. */
|
|
63
|
+
export interface JsonParsableResponse {
|
|
64
|
+
ok: boolean;
|
|
65
|
+
status: number;
|
|
66
|
+
text(): Promise<string>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Parses a fetch `Response` as JSON only when it is actually JSON, and
|
|
71
|
+
* always resolves rather than throwing a parse error — the fallback branch
|
|
72
|
+
* folds an unparsable failure body into the same `{ error }` shape a
|
|
73
|
+
* well-behaved server route would have sent, truncating an overlong body so
|
|
74
|
+
* a raw HTML/proxy error page doesn't blow up the toast description.
|
|
75
|
+
*
|
|
76
|
+
* Success responses are still expected to be real JSON: a genuinely broken
|
|
77
|
+
* 200 (should not happen for this route) throws the underlying SyntaxError
|
|
78
|
+
* rather than silently returning `{}`, so that failure mode stays loud
|
|
79
|
+
* instead of masquerading as an empty successful import.
|
|
80
|
+
*/
|
|
81
|
+
export async function parseUploadResponse<T extends ImportResult>(
|
|
82
|
+
response: JsonParsableResponse,
|
|
83
|
+
fallbackErrorMessage: string,
|
|
84
|
+
): Promise<T> {
|
|
85
|
+
const raw = await response.text();
|
|
86
|
+
const contentLooksJson = /^\s*[{[]/.test(raw);
|
|
87
|
+
if (!contentLooksJson) {
|
|
88
|
+
if (response.ok) {
|
|
89
|
+
// Successful response that isn't JSON at all — this is a real bug
|
|
90
|
+
// (route contract broken), not an expected failure mode. Surface it
|
|
91
|
+
// loudly rather than swallowing it as a fake success.
|
|
92
|
+
throw new SyntaxError(
|
|
93
|
+
`Expected a JSON response but received: ${truncateForToast(raw)}`,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
error: raw.trim()
|
|
98
|
+
? `${fallbackErrorMessage}: ${truncateForToast(raw)}`
|
|
99
|
+
: fallbackErrorMessage,
|
|
100
|
+
} as T;
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
return JSON.parse(raw) as T;
|
|
104
|
+
} catch {
|
|
105
|
+
if (response.ok) {
|
|
106
|
+
throw new SyntaxError(
|
|
107
|
+
`Expected a JSON response but received: ${truncateForToast(raw)}`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
return { error: fallbackErrorMessage } as T;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const MAX_TOAST_BODY_CHARS = 160;
|
|
115
|
+
|
|
116
|
+
function truncateForToast(value: string): string {
|
|
117
|
+
const trimmed = value.trim();
|
|
118
|
+
if (trimmed.length <= MAX_TOAST_BODY_CHARS) return trimmed;
|
|
119
|
+
return `${trimmed.slice(0, MAX_TOAST_BODY_CHARS)}…`;
|
|
120
|
+
}
|
|
121
|
+
|
|
49
122
|
// --- Cross-tab / system-clipboard round-trip (U4/U6) ---
|
|
50
123
|
//
|
|
51
124
|
// The in-memory clipboard refs (copiedLayerEntriesRef etc.) never survive a
|