@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
|
@@ -43,6 +43,10 @@ import {
|
|
|
43
43
|
} from "@/components/ui/tooltip";
|
|
44
44
|
import { cn } from "@/lib/utils";
|
|
45
45
|
|
|
46
|
+
import {
|
|
47
|
+
GlslShaderPanel,
|
|
48
|
+
type GlslShaderPanelContext,
|
|
49
|
+
} from "./GlslShaderPanel";
|
|
46
50
|
import {
|
|
47
51
|
GradientEditor,
|
|
48
52
|
defaultGradient,
|
|
@@ -186,6 +190,16 @@ export interface DesignColorPickerProps {
|
|
|
186
190
|
* limited in the caller; the component renders whatever is passed.
|
|
187
191
|
*/
|
|
188
192
|
documentColors?: string[];
|
|
193
|
+
/**
|
|
194
|
+
* Restricts which paint-type tabs are rendered (Solid, Linear, Radial, …).
|
|
195
|
+
* Omit to show every type (default, backward compatible). Callers that
|
|
196
|
+
* can't structurally support layered/gradient/image paints for the
|
|
197
|
+
* property they're editing (e.g. a CSS `border`/`outline` stroke, which
|
|
198
|
+
* has no clean gradient/image equivalent) should pass a restricted list
|
|
199
|
+
* — e.g. `["solid"]` — so the tab is never shown rather than shown and
|
|
200
|
+
* then silently discarded on write.
|
|
201
|
+
*/
|
|
202
|
+
supportedPaintTypes?: DesignPaintType[];
|
|
189
203
|
/**
|
|
190
204
|
* Optional design context forwarded to the apply-shader action when a shader
|
|
191
205
|
* fill is selected, so the agent can write real shader code for the target.
|
|
@@ -196,6 +210,14 @@ export interface DesignColorPickerProps {
|
|
|
196
210
|
nodeId?: string;
|
|
197
211
|
selector?: string;
|
|
198
212
|
};
|
|
213
|
+
/**
|
|
214
|
+
* Context for the code-backed GLSL shader picker. When provided, the
|
|
215
|
+
* Shader paint type opens the GlslShaderPanel (Created by you / Create
|
|
216
|
+
* new (AI) / Presets), which persists real GLSL fragment source into the
|
|
217
|
+
* screen HTML per shared/shader-fills.ts. When absent, the legacy
|
|
218
|
+
* ShaderFillsPanel (CSS-approximation presets) renders instead.
|
|
219
|
+
*/
|
|
220
|
+
glslShaderContext?: GlslShaderPanelContext;
|
|
199
221
|
/** Notified when a shader fill is applied/tuned (descriptor + CSS fallback). */
|
|
200
222
|
onShaderChange?: (descriptor: ShaderDescriptor, css: string) => void;
|
|
201
223
|
labels?: Partial<DesignColorPickerLabels>;
|
|
@@ -617,6 +639,40 @@ const BLEND_MODE_OPTIONS = [
|
|
|
617
639
|
{ value: "luminosity", label: "Luminosity" },
|
|
618
640
|
] as const;
|
|
619
641
|
|
|
642
|
+
// ─── Eyedropper (browser EyeDropper API) ────────────────────────────────────
|
|
643
|
+
//
|
|
644
|
+
// Extracted from the picker's own "pick from screen" button so DesignEditor
|
|
645
|
+
// can bind Figma's "I" shortcut to the same flow without duplicating the
|
|
646
|
+
// EyeDropper wiring. Pure/standalone: no dependency on component state, so it
|
|
647
|
+
// can be called from anywhere a `document`/`window` is available.
|
|
648
|
+
|
|
649
|
+
type EyeDropperCtor = new () => { open: () => Promise<{ sRGBHex: string }> };
|
|
650
|
+
|
|
651
|
+
/** True when the browser exposes the experimental EyeDropper API. */
|
|
652
|
+
export function hasEyeDropperSupport(): boolean {
|
|
653
|
+
return typeof window !== "undefined" && "EyeDropper" in window;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
/**
|
|
657
|
+
* Opens the browser's native eyedropper and resolves with the picked color as
|
|
658
|
+
* a `#rrggbb` hex string, or `null` if the API is unsupported or the user
|
|
659
|
+
* cancels the pick (e.g. by pressing Escape). Never rejects — callers don't
|
|
660
|
+
* need a try/catch to handle the "user cancelled" case.
|
|
661
|
+
*/
|
|
662
|
+
export async function beginEyedropperPick(): Promise<string | null> {
|
|
663
|
+
const EyeDropper = (window as unknown as { EyeDropper?: EyeDropperCtor })
|
|
664
|
+
.EyeDropper;
|
|
665
|
+
if (!EyeDropper) return null;
|
|
666
|
+
try {
|
|
667
|
+
const result = await new EyeDropper().open();
|
|
668
|
+
return result.sRGBHex ?? null;
|
|
669
|
+
} catch {
|
|
670
|
+
// Browser cancels (Escape / click-away) reject the promise — treat as a
|
|
671
|
+
// no-op pick rather than an error.
|
|
672
|
+
return null;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
|
|
620
676
|
// ─── Main component ────────────────────────────────────────────────────────────
|
|
621
677
|
|
|
622
678
|
export function DesignColorPicker({
|
|
@@ -652,7 +708,9 @@ export function DesignColorPicker({
|
|
|
652
708
|
onAddGradientStop: _onAddGradientStop,
|
|
653
709
|
onRemoveGradientStop: _onRemoveGradientStop,
|
|
654
710
|
documentColors,
|
|
711
|
+
supportedPaintTypes,
|
|
655
712
|
shaderContext,
|
|
713
|
+
glslShaderContext,
|
|
656
714
|
onShaderChange,
|
|
657
715
|
labels,
|
|
658
716
|
disabled = false,
|
|
@@ -721,13 +779,33 @@ export function DesignColorPicker({
|
|
|
721
779
|
const [shaderDescriptor, setShaderDescriptor] =
|
|
722
780
|
useState<ShaderDescriptor | null>(null);
|
|
723
781
|
|
|
782
|
+
// Tabs actually rendered — restricted to `supportedPaintTypes` when the
|
|
783
|
+
// caller passes it (e.g. strokes only support "solid": there's no clean
|
|
784
|
+
// CSS border/outline equivalent for gradients or images). Undefined means
|
|
785
|
+
// "no restriction", preserving today's full-tab behavior everywhere else.
|
|
786
|
+
const visiblePaintTypes = supportedPaintTypes
|
|
787
|
+
? PAINT_TYPES.filter((entry) => supportedPaintTypes.includes(entry.type))
|
|
788
|
+
: PAINT_TYPES;
|
|
789
|
+
const isPaintTypeSupported = (type: DesignPaintType) =>
|
|
790
|
+
!supportedPaintTypes || supportedPaintTypes.includes(type);
|
|
791
|
+
|
|
724
792
|
// The user's explicit paint-type click (localPaintType) wins over the
|
|
725
793
|
// EditPanel-driven `paintType` prop so selecting a gradient/image/shader
|
|
726
794
|
// engages its editor even when EditPanel doesn't complete the structural
|
|
727
795
|
// fill switch. localPaintType is reset below when the prop changes (i.e. a
|
|
728
796
|
// different element/fill is selected) so the picker still follows selection.
|
|
729
|
-
|
|
797
|
+
// Defense in depth: if a stale `localPaintType`/prop-driven `paintType` (or
|
|
798
|
+
// `inferPaintType`'s guess) ever resolves outside `supportedPaintTypes` —
|
|
799
|
+
// there is no tab to click since it's filtered out of `visiblePaintTypes`
|
|
800
|
+
// above — fall back to "solid" instead of rendering an editor for a type
|
|
801
|
+
// the caller declared unsupported.
|
|
802
|
+
const rawEffectivePaintType: DesignPaintType =
|
|
730
803
|
localPaintType ?? paintType ?? inferPaintType(value, effectiveOpacity);
|
|
804
|
+
const effectivePaintType: DesignPaintType = isPaintTypeSupported(
|
|
805
|
+
rawEffectivePaintType,
|
|
806
|
+
)
|
|
807
|
+
? rawEffectivePaintType
|
|
808
|
+
: "solid";
|
|
731
809
|
|
|
732
810
|
// Resolve the active gradient: prefer EditPanel-driven props; otherwise parse
|
|
733
811
|
// the live CSS value, falling back to local edit state.
|
|
@@ -952,6 +1030,9 @@ export function DesignColorPicker({
|
|
|
952
1030
|
|
|
953
1031
|
const setPaintType = (nextType: DesignPaintType) => {
|
|
954
1032
|
if (disabled) return;
|
|
1033
|
+
// Tabs outside `supportedPaintTypes` aren't rendered, but guard here too
|
|
1034
|
+
// in case a caller invokes setPaintType via another path in the future.
|
|
1035
|
+
if (!isPaintTypeSupported(nextType)) return;
|
|
955
1036
|
|
|
956
1037
|
// Shader opens the dedicated shader fills panel.
|
|
957
1038
|
if (nextType === "shader") {
|
|
@@ -1028,37 +1109,30 @@ export function DesignColorPicker({
|
|
|
1028
1109
|
};
|
|
1029
1110
|
|
|
1030
1111
|
const pickScreenColor = async () => {
|
|
1031
|
-
|
|
1032
|
-
window as unknown as {
|
|
1033
|
-
EyeDropper?: new () => { open: () => Promise<{ sRGBHex: string }> };
|
|
1034
|
-
}
|
|
1035
|
-
).EyeDropper;
|
|
1036
|
-
if (!EyeDropperCtor || disabled) return;
|
|
1112
|
+
if (!hasEyeDropperSupport() || disabled) return;
|
|
1037
1113
|
setPicking(true);
|
|
1038
1114
|
try {
|
|
1039
|
-
const
|
|
1040
|
-
if (
|
|
1115
|
+
const hex = await beginEyedropperPick();
|
|
1116
|
+
if (hex) {
|
|
1041
1117
|
if (activeGradient) {
|
|
1042
1118
|
// In gradient mode, route to the selected stop (preserving its alpha)
|
|
1043
1119
|
// like every other color edit — don't replace the whole gradient with
|
|
1044
1120
|
// a solid hex.
|
|
1045
|
-
const parsed = parseCssColor(
|
|
1121
|
+
const parsed = parseCssColor(hex);
|
|
1046
1122
|
if (parsed) emitStopColor({ ...parsed, a: fieldColor.a });
|
|
1047
1123
|
} else {
|
|
1048
|
-
lastEmittedValueRef.current =
|
|
1049
|
-
onChange(
|
|
1124
|
+
lastEmittedValueRef.current = hex;
|
|
1125
|
+
onChange(hex);
|
|
1050
1126
|
}
|
|
1051
1127
|
// The eyedropper pick is a single discrete commit, not a drag tick.
|
|
1052
1128
|
notifyChangeComplete();
|
|
1053
1129
|
}
|
|
1054
|
-
} catch {
|
|
1055
|
-
// Browser cancels are expected; keep the current color.
|
|
1056
1130
|
} finally {
|
|
1057
1131
|
setPicking(false);
|
|
1058
1132
|
}
|
|
1059
1133
|
};
|
|
1060
1134
|
|
|
1061
|
-
const hasEyeDropper =
|
|
1135
|
+
const hasEyeDropper = hasEyeDropperSupport();
|
|
1062
1136
|
|
|
1063
1137
|
// ── Value row inputs by mode ─────────────────────────────────────────────────
|
|
1064
1138
|
|
|
@@ -1226,7 +1300,22 @@ export function DesignColorPicker({
|
|
|
1226
1300
|
onFocusOutside={(e) => e.preventDefault()}
|
|
1227
1301
|
>
|
|
1228
1302
|
<div className="rounded-md bg-popover text-popover-foreground">
|
|
1229
|
-
{view === "shader" ? (
|
|
1303
|
+
{view === "shader" && glslShaderContext ? (
|
|
1304
|
+
/* Code-backed GLSL shader picker — persists real GLSL source
|
|
1305
|
+
into the screen HTML (Created by you / Create new (AI) /
|
|
1306
|
+
Presets). Rendered whenever the caller provides the
|
|
1307
|
+
persistence context; the legacy CSS-approximation panel
|
|
1308
|
+
below stays for callers that don't. */
|
|
1309
|
+
<GlslShaderPanel
|
|
1310
|
+
mode="fill"
|
|
1311
|
+
context={glslShaderContext}
|
|
1312
|
+
disabled={disabled}
|
|
1313
|
+
onBack={() => {
|
|
1314
|
+
setView("picker");
|
|
1315
|
+
if (effectivePaintType === "shader") setPaintType("solid");
|
|
1316
|
+
}}
|
|
1317
|
+
/>
|
|
1318
|
+
) : view === "shader" ? (
|
|
1230
1319
|
<ShaderFillsPanel
|
|
1231
1320
|
descriptor={shaderDescriptor ?? undefined}
|
|
1232
1321
|
applyContext={shaderContext}
|
|
@@ -1243,82 +1332,95 @@ export function DesignColorPicker({
|
|
|
1243
1332
|
) : (
|
|
1244
1333
|
<>
|
|
1245
1334
|
{/* ── Paint-type icon row (design-editor, full-width tabs) ─── */}
|
|
1246
|
-
{/* 11 types
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
aria-label={label}
|
|
1260
|
-
aria-pressed={isActive}
|
|
1261
|
-
disabled={disabled}
|
|
1262
|
-
onClick={() => setPaintType(type)}
|
|
1263
|
-
className={cn(
|
|
1264
|
-
"flex h-8 w-full cursor-pointer flex-col items-center justify-center gap-0.5 rounded transition-colors",
|
|
1265
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
1266
|
-
"active:scale-95",
|
|
1267
|
-
isActive
|
|
1268
|
-
? "bg-accent text-accent-foreground ring-1 ring-primary/60"
|
|
1269
|
-
: "text-muted-foreground hover:bg-[var(--design-editor-control-bg)] hover:text-foreground",
|
|
1270
|
-
disabled && "pointer-events-none opacity-40",
|
|
1271
|
-
)}
|
|
1272
|
-
>
|
|
1273
|
-
<Icon className="size-4" />
|
|
1274
|
-
</button>
|
|
1275
|
-
</TooltipTrigger>
|
|
1276
|
-
<TooltipContent side="bottom" className="text-[10px]">
|
|
1277
|
-
{label}
|
|
1278
|
-
</TooltipContent>
|
|
1279
|
-
</Tooltip>
|
|
1335
|
+
{/* Up to 11 types, split across two rows (first row capped at
|
|
1336
|
+
6 columns). When `supportedPaintTypes` restricts the set
|
|
1337
|
+
(e.g. solid-only for strokes), only the allowed tabs
|
|
1338
|
+
render — never a tab that would silently discard its
|
|
1339
|
+
write. Each icon is a clearly-hittable 36×32px target with
|
|
1340
|
+
a distinct active accent so the selected mode is
|
|
1341
|
+
immediately obvious. */}
|
|
1342
|
+
{visiblePaintTypes.length > 1 && (
|
|
1343
|
+
<div className="border-b border-border/70 px-2 pt-2 pb-1.5">
|
|
1344
|
+
{(() => {
|
|
1345
|
+
const firstRowCount = Math.min(
|
|
1346
|
+
6,
|
|
1347
|
+
visiblePaintTypes.length,
|
|
1280
1348
|
);
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
const
|
|
1349
|
+
const firstRow = visiblePaintTypes.slice(
|
|
1350
|
+
0,
|
|
1351
|
+
firstRowCount,
|
|
1352
|
+
);
|
|
1353
|
+
const secondRow = visiblePaintTypes.slice(firstRowCount);
|
|
1354
|
+
const renderTab = ({
|
|
1355
|
+
type,
|
|
1356
|
+
label,
|
|
1357
|
+
Icon,
|
|
1358
|
+
}: (typeof visiblePaintTypes)[number]) => {
|
|
1359
|
+
const isActive = effectivePaintType === type;
|
|
1360
|
+
return (
|
|
1361
|
+
<Tooltip key={type}>
|
|
1362
|
+
<TooltipTrigger asChild>
|
|
1363
|
+
<button
|
|
1364
|
+
type="button"
|
|
1365
|
+
aria-label={label}
|
|
1366
|
+
aria-pressed={isActive}
|
|
1367
|
+
disabled={disabled}
|
|
1368
|
+
onClick={() => setPaintType(type)}
|
|
1369
|
+
className={cn(
|
|
1370
|
+
"flex h-8 w-full cursor-pointer flex-col items-center justify-center gap-0.5 rounded transition-colors",
|
|
1371
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
1372
|
+
"active:scale-95",
|
|
1373
|
+
isActive
|
|
1374
|
+
? "bg-accent text-accent-foreground ring-1 ring-primary/60"
|
|
1375
|
+
: "text-muted-foreground hover:bg-[var(--design-editor-control-bg)] hover:text-foreground",
|
|
1376
|
+
disabled && "pointer-events-none opacity-40",
|
|
1377
|
+
)}
|
|
1378
|
+
>
|
|
1379
|
+
<Icon className="size-4" />
|
|
1380
|
+
</button>
|
|
1381
|
+
</TooltipTrigger>
|
|
1382
|
+
<TooltipContent
|
|
1383
|
+
side="bottom"
|
|
1384
|
+
className="text-[10px]"
|
|
1385
|
+
>
|
|
1386
|
+
{label}
|
|
1387
|
+
</TooltipContent>
|
|
1388
|
+
</Tooltip>
|
|
1389
|
+
);
|
|
1390
|
+
};
|
|
1287
1391
|
return (
|
|
1288
|
-
|
|
1289
|
-
<
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1392
|
+
<>
|
|
1393
|
+
<div
|
|
1394
|
+
className={cn(
|
|
1395
|
+
"grid gap-1",
|
|
1396
|
+
secondRow.length > 0 && "mb-1",
|
|
1397
|
+
)}
|
|
1398
|
+
style={{
|
|
1399
|
+
gridTemplateColumns: `repeat(${firstRowCount}, minmax(0, 1fr))`,
|
|
1400
|
+
}}
|
|
1401
|
+
>
|
|
1402
|
+
{firstRow.map(renderTab)}
|
|
1403
|
+
</div>
|
|
1404
|
+
{secondRow.length > 0 && (
|
|
1405
|
+
<div
|
|
1406
|
+
className="grid gap-1"
|
|
1407
|
+
style={{
|
|
1408
|
+
gridTemplateColumns: `repeat(${secondRow.length}, minmax(0, 1fr))`,
|
|
1409
|
+
}}
|
|
1305
1410
|
>
|
|
1306
|
-
|
|
1307
|
-
</
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
{label}
|
|
1311
|
-
</TooltipContent>
|
|
1312
|
-
</Tooltip>
|
|
1411
|
+
{secondRow.map(renderTab)}
|
|
1412
|
+
</div>
|
|
1413
|
+
)}
|
|
1414
|
+
</>
|
|
1313
1415
|
);
|
|
1314
|
-
})}
|
|
1416
|
+
})()}
|
|
1417
|
+
{/* Active-type label — shows which mode is selected */}
|
|
1418
|
+
<p className="mt-1 text-center text-[10px] font-medium text-muted-foreground">
|
|
1419
|
+
{PAINT_TYPES.find((p) => p.type === effectivePaintType)
|
|
1420
|
+
?.label ?? effectivePaintType}
|
|
1421
|
+
</p>
|
|
1315
1422
|
</div>
|
|
1316
|
-
|
|
1317
|
-
<p className="mt-1 text-center text-[10px] font-medium text-muted-foreground">
|
|
1318
|
-
{PAINT_TYPES.find((p) => p.type === effectivePaintType)
|
|
1319
|
-
?.label ?? effectivePaintType}
|
|
1320
|
-
</p>
|
|
1321
|
-
</div>
|
|
1423
|
+
)}
|
|
1322
1424
|
|
|
1323
1425
|
{/* ── Image fill controls ─────────────────────────────────── */}
|
|
1324
1426
|
{effectivePaintType === "image" && (
|