@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.
Files changed (295) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +14 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/client/AgentPanel.tsx +1 -1
  5. package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +11 -6
  6. package/corpus/core/src/client/use-action.ts +39 -2
  7. package/corpus/core/src/client/use-db-sync.ts +44 -18
  8. package/corpus/core/src/db/create-get-db.ts +32 -2
  9. package/corpus/core/src/server/framework-request-handler.ts +52 -4
  10. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +5 -0
  11. package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +34 -6
  12. package/corpus/templates/assets/AGENTS.md +23 -4
  13. package/corpus/templates/assets/actions/_generation-preset-settings.ts +48 -0
  14. package/corpus/templates/assets/actions/_helpers.ts +8 -1
  15. package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +64 -0
  16. package/corpus/templates/assets/actions/create-generation-preset.ts +11 -3
  17. package/corpus/templates/assets/actions/generate-image-batch.ts +7 -2
  18. package/corpus/templates/assets/actions/generate-image.ts +342 -25
  19. package/corpus/templates/assets/actions/get-library.ts +4 -3
  20. package/corpus/templates/assets/actions/navigate.ts +2 -1
  21. package/corpus/templates/assets/actions/refresh-generation-run.ts +5 -1
  22. package/corpus/templates/assets/actions/update-asset.ts +1 -0
  23. package/corpus/templates/assets/actions/update-generation-preset.ts +8 -1
  24. package/corpus/templates/assets/actions/view-screen.ts +8 -1
  25. package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +9 -1
  26. package/corpus/templates/assets/app/hooks/use-image-model-menu.ts +1 -0
  27. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +11 -0
  28. package/corpus/templates/assets/app/i18n/zh-TW.ts +64 -0
  29. package/corpus/templates/assets/app/i18n-data.ts +650 -0
  30. package/corpus/templates/assets/app/routes/asset.$id.tsx +2 -1
  31. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +44 -33
  32. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1474 -0
  33. package/corpus/templates/assets/app/routes/library.tsx +43 -1
  34. package/corpus/templates/assets/server/lib/generation.ts +366 -44
  35. package/corpus/templates/assets/server/lib/image-processing.ts +252 -0
  36. package/corpus/templates/assets/server/lib/preset-skeleton.ts +137 -0
  37. package/corpus/templates/assets/shared/api.ts +47 -0
  38. package/corpus/templates/clips/app/components/library/library-layout.tsx +7 -2
  39. package/corpus/templates/clips/app/components/library/sort-menu.tsx +1 -1
  40. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +114 -33
  41. package/corpus/templates/clips/app/routes/_app.library._index.tsx +27 -1
  42. package/corpus/templates/clips/app/routes/record.tsx +157 -68
  43. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +5 -5
  44. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +20 -3
  45. package/corpus/templates/clips/shared/finalize-recovery.ts +23 -3
  46. package/corpus/templates/content/AGENTS.md +52 -52
  47. package/corpus/templates/content/actions/_builder-cms-read-client.ts +188 -8
  48. package/corpus/templates/content/actions/_builder-docs-client.ts +41 -3
  49. package/corpus/templates/content/actions/_database-source-utils.ts +998 -160
  50. package/corpus/templates/content/actions/_database-utils.ts +44 -4
  51. package/corpus/templates/content/actions/_notion-action-utils.ts +6 -2
  52. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -1
  53. package/corpus/templates/content/actions/attach-content-database-source.ts +85 -12
  54. package/corpus/templates/content/actions/change-content-database-source-role.ts +9 -1
  55. package/corpus/templates/content/actions/delete-content-database.ts +1 -0
  56. package/corpus/templates/content/actions/get-document.ts +11 -2
  57. package/corpus/templates/content/actions/list-content-databases.ts +57 -9
  58. package/corpus/templates/content/actions/prepare-builder-source-review.ts +23 -6
  59. package/corpus/templates/content/actions/refresh-content-database-source.ts +26 -3
  60. package/corpus/templates/content/actions/restore-content-database.ts +1 -0
  61. package/corpus/templates/content/actions/update-document.ts +43 -0
  62. package/corpus/templates/content/app/components/editor/BuilderBodySyncingNotice.tsx +21 -0
  63. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +0 -1
  64. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +70 -28
  65. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +69 -17
  66. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +4 -4
  67. package/corpus/templates/content/app/components/editor/body-hydration.ts +112 -0
  68. package/corpus/templates/content/app/components/editor/builder-body-hydration-pump.ts +52 -0
  69. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +9076 -2876
  70. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +41 -1
  71. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +36 -11
  72. package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +21 -1
  73. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -1
  74. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +11 -8
  75. package/corpus/templates/content/app/global.css +41 -0
  76. package/corpus/templates/content/app/hooks/use-content-database.ts +346 -42
  77. package/corpus/templates/content/app/hooks/use-db-sync.ts +9 -0
  78. package/corpus/templates/content/app/hooks/use-documents.ts +47 -0
  79. package/corpus/templates/content/app/hooks/use-notion.ts +12 -10
  80. package/corpus/templates/content/app/i18n/zh-TW.ts +35 -0
  81. package/corpus/templates/content/app/i18n-data.ts +355 -0
  82. package/corpus/templates/content/app/root.tsx +22 -0
  83. package/corpus/templates/content/changelog/2026-07-01-builder-database-sources-keep-loading-rows-in-the-background.md +6 -0
  84. package/corpus/templates/content/changelog/2026-07-01-builder-source-attach-starts-with-usable-rows.md +6 -0
  85. package/corpus/templates/content/changelog/2026-07-01-builder-source-attachment-now-stays-connected-after-large.md +6 -0
  86. package/corpus/templates/content/changelog/2026-07-01-builder-source-refreshes-now-show-progress-for-large-docs-blog.md +6 -0
  87. package/corpus/templates/content/changelog/2026-07-01-database-pages-now-delete-to-trash-without-route-errors.md +6 -0
  88. package/corpus/templates/content/changelog/2026-07-02-builder-source-refreshes-recover-from-stalled-background-row.md +6 -0
  89. package/corpus/templates/content/changelog/2026-07-02-builder-sourced-rows-open-with-sync-protection.md +6 -0
  90. package/corpus/templates/content/changelog/2026-07-02-database-rows-and-pages-open-faster-from-recently-loaded-dat.md +6 -0
  91. package/corpus/templates/content/changelog/2026-07-02-preview-panels-close-reliably-narrow-sidebar-row-actions-sta.md +6 -0
  92. package/corpus/templates/content/changelog/2026-07-06-builder-sync-progress-no-longer-shows-continue.md +6 -0
  93. package/corpus/templates/content/shared/api.ts +13 -0
  94. package/corpus/templates/content/shared/builder-mdx.ts +16 -3
  95. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +23 -13
  96. package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +98 -0
  97. package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +162 -0
  98. package/corpus/templates/design/AGENTS.md +9 -2
  99. package/corpus/templates/design/actions/add-breakpoint.ts +6 -3
  100. package/corpus/templates/design/actions/apply-a11y-fix.ts +57 -37
  101. package/corpus/templates/design/actions/apply-component-prop-edit.ts +41 -20
  102. package/corpus/templates/design/actions/apply-motion-edit.ts +251 -38
  103. package/corpus/templates/design/actions/apply-shader-fill.ts +90 -66
  104. package/corpus/templates/design/actions/apply-visual-edit.ts +282 -55
  105. package/corpus/templates/design/actions/create-component.ts +29 -60
  106. package/corpus/templates/design/actions/create-file.ts +9 -2
  107. package/corpus/templates/design/actions/duplicate-design.ts +31 -2
  108. package/corpus/templates/design/actions/edit-design.ts +36 -38
  109. package/corpus/templates/design/actions/generate-design-title.ts +87 -0
  110. package/corpus/templates/design/actions/generate-design.ts +53 -18
  111. package/corpus/templates/design/actions/generate-screens.ts +108 -4
  112. package/corpus/templates/design/actions/get-motion-timeline.ts +35 -7
  113. package/corpus/templates/design/actions/insert-asset.ts +34 -29
  114. package/corpus/templates/design/actions/insert-design-native-asset.ts +129 -32
  115. package/corpus/templates/design/actions/insert-figma-library-asset.ts +35 -30
  116. package/corpus/templates/design/actions/present-design-variants.ts +7 -2
  117. package/corpus/templates/design/actions/remove-motion-timeline.ts +31 -36
  118. package/corpus/templates/design/actions/update-file.ts +190 -75
  119. package/corpus/templates/design/app/components/design/BreakpointBar.tsx +403 -0
  120. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +469 -222
  121. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +708 -53
  122. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +83 -3
  123. package/corpus/templates/design/app/components/design/EditPanel.tsx +1091 -6948
  124. package/corpus/templates/design/app/components/design/LayersPanel.tsx +419 -85
  125. package/corpus/templates/design/app/components/design/MotionDock.tsx +1124 -103
  126. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2610 -1398
  127. package/corpus/templates/design/app/components/design/ReadOnlyDesignBanner.tsx +22 -0
  128. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2182 -235
  129. package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +187 -11
  130. package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +376 -1
  131. package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +746 -0
  132. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +17 -0
  133. package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +1 -1
  134. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +1 -3
  135. package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +1 -1
  136. package/corpus/templates/design/app/components/design/edit-panel/appearance-properties.tsx +518 -0
  137. package/corpus/templates/design/app/components/design/edit-panel/code-inspect-helpers.tsx +562 -0
  138. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +763 -0
  139. package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +94 -0
  140. package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +780 -0
  141. package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +446 -0
  142. package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +79 -0
  143. package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +315 -0
  144. package/corpus/templates/design/app/components/design/edit-panel/fill-gradient-helpers.ts +344 -0
  145. package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +594 -0
  146. package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +119 -0
  147. package/corpus/templates/design/app/components/design/edit-panel/inspector-controls.tsx +248 -0
  148. package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +45 -0
  149. package/corpus/templates/design/app/components/design/edit-panel/layout-properties.tsx +693 -0
  150. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +724 -0
  151. package/corpus/templates/design/app/components/design/edit-panel/position-helpers.ts +207 -0
  152. package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +628 -0
  153. package/corpus/templates/design/app/components/design/edit-panel/selection-helpers.ts +91 -0
  154. package/corpus/templates/design/app/components/design/edit-panel/stroke-properties.tsx +649 -0
  155. package/corpus/templates/design/app/components/design/edit-panel/style-change-types.ts +118 -0
  156. package/corpus/templates/design/app/components/design/edit-panel/style-options.ts +88 -0
  157. package/corpus/templates/design/app/components/design/edit-panel/transform-helpers.ts +100 -0
  158. package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +117 -0
  159. package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +501 -0
  160. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +91 -40
  161. package/corpus/templates/design/app/components/design/inspector/BreakpointOverrideIndicator.tsx +82 -0
  162. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +189 -87
  163. package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +1097 -0
  164. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +44 -0
  165. package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +258 -0
  166. package/corpus/templates/design/app/components/design/inspector/MotionKeyframeDiamond.tsx +144 -0
  167. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +99 -9
  168. package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +116 -0
  169. package/corpus/templates/design/app/components/design/inspector/index.ts +26 -0
  170. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +29 -0
  171. package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +171 -0
  172. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +220 -0
  173. package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +35 -0
  174. package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +134 -0
  175. package/corpus/templates/design/app/components/design/multi-screen/culling.ts +185 -0
  176. package/corpus/templates/design/app/components/design/multi-screen/gradient-overlay-geometry.ts +120 -0
  177. package/corpus/templates/design/app/components/design/multi-screen/types.ts +892 -0
  178. package/corpus/templates/design/app/components/design/multi-screen/vector-edit-geometry.ts +21 -0
  179. package/corpus/templates/design/app/components/design/types.ts +15 -0
  180. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +109 -5
  181. package/corpus/templates/design/app/global.css +8 -8
  182. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +259 -2
  183. package/corpus/templates/design/app/i18n/zh-TW.ts +163 -9
  184. package/corpus/templates/design/app/i18n-breakpoints.ts +205 -0
  185. package/corpus/templates/design/app/i18n-data.ts +1664 -152
  186. package/corpus/templates/design/app/i18n-motion.ts +563 -0
  187. package/corpus/templates/design/app/lib/design-import.ts +73 -0
  188. package/corpus/templates/design/app/pages/Index.tsx +41 -22
  189. package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +1 -1
  190. package/corpus/templates/design/changelog/2026-06-30-design-now-has-a-figma-style-left-rail-for-file-agent-assets.md +1 -1
  191. package/corpus/templates/design/changelog/2026-06-30-design-tools-now-use-a-quieter-figma-style-list-layout.md +1 -1
  192. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +1 -1
  193. package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +1 -1
  194. package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +1 -1
  195. package/corpus/templates/design/changelog/2026-07-05-designs-get-ai-generated-names-from-your-prompt.md +6 -0
  196. package/corpus/templates/design/changelog/2026-07-05-local-code-screens-keep-their-connection-when-duplicated-and.md +6 -0
  197. package/corpus/templates/design/changelog/2026-07-05-press-a-to-draw-screens-on-the-canvas-inside-a-screen-it-dr.md +6 -0
  198. package/corpus/templates/design/changelog/2026-07-06-3d-rotation-and-perspective-controls-on-every-element.md +6 -0
  199. package/corpus/templates/design/changelog/2026-07-06-ai-generated-and-duplicated-screens-now-get-their-editor-sel.md +6 -0
  200. package/corpus/templates/design/changelog/2026-07-06-applying-shaders-and-fills-in-quick-succession-can-no-longer.md +6 -0
  201. package/corpus/templates/design/changelog/2026-07-06-breakpoint-frames-in-the-overview-now-support-click-to-selec.md +6 -0
  202. package/corpus/templates/design/changelog/2026-07-06-breakpoint-segments-in-the-inspector-now-show-a-device-icon-.md +6 -0
  203. package/corpus/templates/design/changelog/2026-07-06-breakpoint-targeting-now-lives-in-one-compact-control-in-the.md +6 -0
  204. package/corpus/templates/design/changelog/2026-07-06-canvas-edits-can-no-longer-be-overwritten-by-stale-collabora.md +6 -0
  205. package/corpus/templates/design/changelog/2026-07-06-canvas-edits-inside-screens-save-reliably-again.md +6 -0
  206. package/corpus/templates/design/changelog/2026-07-06-cleaner-inspector-removed-the-ask-ai-box-from-the-design-tab.md +6 -0
  207. package/corpus/templates/design/changelog/2026-07-06-clicking-empty-canvas-space-now-deselects-an-element-inside-.md +6 -0
  208. package/corpus/templates/design/changelog/2026-07-06-dragging-an-element-onto-a-rectangle-now-nests-it-inside-wit.md +6 -0
  209. package/corpus/templates/design/changelog/2026-07-06-dragging-screens-and-objects-on-the-canvas-is-now-much-smoot.md +6 -0
  210. package/corpus/templates/design/changelog/2026-07-06-drawing-a-shape-or-text-on-the-canvas-no-longer-flashes-away.md +6 -0
  211. package/corpus/templates/design/changelog/2026-07-06-dropping-an-element-between-two-others-inside-a-screen-now-s.md +6 -0
  212. package/corpus/templates/design/changelog/2026-07-06-duplicating-a-screen-now-places-the-copy-exactly-where-you-d.md +6 -0
  213. package/corpus/templates/design/changelog/2026-07-06-edit-gradients-directly-on-elements-inside-screens-scale-str.md +6 -0
  214. package/corpus/templates/design/changelog/2026-07-06-edits-from-collaborators-and-the-agent-now-update-the-canvas.md +6 -0
  215. package/corpus/templates/design/changelog/2026-07-06-fixed-a-bug-where-most-style-position-and-text-edits-briefly.md +6 -0
  216. package/corpus/templates/design/changelog/2026-07-06-fixed-a-confusing-raw-error-message-when-a-file-upload-fails.md +6 -0
  217. package/corpus/templates/design/changelog/2026-07-06-fixed-a-rare-case-where-an-edit-could-be-silently-overwritte.md +6 -0
  218. package/corpus/templates/design/changelog/2026-07-06-fixed-inserted-assets-sometimes-disappearing-reappearing-or-.md +6 -0
  219. package/corpus/templates/design/changelog/2026-07-06-fixed-inspector-value-scrubbing-producing-erratic-numbers-an.md +6 -0
  220. package/corpus/templates/design/changelog/2026-07-06-fixed-padding-gap-and-min-max-size-scrubbing-not-updating-th.md +6 -0
  221. package/corpus/templates/design/changelog/2026-07-06-fixed-text-stroke-color-turning-black-and-glyphs-disappearin.md +6 -0
  222. package/corpus/templates/design/changelog/2026-07-06-fixed-the-collapsed-effects-and-stroke-inspector-sections-sh.md +6 -0
  223. package/corpus/templates/design/changelog/2026-07-06-fixed-the-new-design-dialog-closing-unexpectedly-when-using-.md +6 -0
  224. package/corpus/templates/design/changelog/2026-07-06-fixed-the-typography-section-missing-when-selecting-text-nes.md +6 -0
  225. package/corpus/templates/design/changelog/2026-07-06-full-view-no-longer-flashes-back-to-the-overview-on-entry-no.md +6 -0
  226. package/corpus/templates/design/changelog/2026-07-06-keyframe-animation-timeline-per-property-keyframes-easing-cu.md +6 -0
  227. package/corpus/templates/design/changelog/2026-07-06-moving-restyling-and-scrubbing-values-on-elements-in-ai-gene.md +6 -0
  228. package/corpus/templates/design/changelog/2026-07-06-padding-and-corner-radius-value-scrubbing-now-snaps-to-whole.md +6 -0
  229. package/corpus/templates/design/changelog/2026-07-06-padding-handles-now-only-resize-on-the-handle-line-itself-sh.md +6 -0
  230. package/corpus/templates/design/changelog/2026-07-06-preview-and-edit-hover-focus-and-pressed-states-with-real-cs.md +6 -0
  231. package/corpus/templates/design/changelog/2026-07-06-promoting-an-element-to-a-component-now-works-correctly-for-.md +6 -0
  232. package/corpus/templates/design/changelog/2026-07-06-reduced-url-history-churn-and-selection-overlay-flicker-whil.md +6 -0
  233. package/corpus/templates/design/changelog/2026-07-06-removed-the-decorative-dot-before-screen-names-in-the-overvi.md +6 -0
  234. package/corpus/templates/design/changelog/2026-07-06-responsive-breakpoints-edit-at-any-width-with-cascading-over.md +6 -0
  235. package/corpus/templates/design/changelog/2026-07-06-screen-labels-no-longer-turn-blue-when-you-hover-inside-the-.md +6 -0
  236. package/corpus/templates/design/changelog/2026-07-06-scrolling-a-screen-with-an-element-selected-stays-smooth-on-.md +6 -0
  237. package/corpus/templates/design/changelog/2026-07-06-selecting-multiple-elements-and-dragging-now-moves-the-whole.md +6 -0
  238. package/corpus/templates/design/changelog/2026-07-06-selection-borders-handles-and-value-readouts-now-stay-the-sa.md +6 -0
  239. package/corpus/templates/design/changelog/2026-07-06-selection-handles-and-editing-chrome-now-stay-a-constant-siz.md +6 -0
  240. package/corpus/templates/design/changelog/2026-07-06-shader-fills-and-effects-ai-authored-or-preset-glsl-shaders-.md +6 -0
  241. package/corpus/templates/design/changelog/2026-07-06-text-drawn-on-the-canvas-now-defaults-to-white-and-inter-in-.md +6 -0
  242. package/corpus/templates/design/changelog/2026-07-06-text-dropped-into-a-shape-now-stays-readable-instead-of-disa.md +6 -0
  243. package/corpus/templates/design/changelog/2026-07-06-the-add-tweak-controls-prompt-no-longer-jumps-to-the-corner-.md +6 -0
  244. package/corpus/templates/design/changelog/2026-07-06-the-padding-value-readout-now-stays-visible-while-you-hover-.md +6 -0
  245. package/corpus/templates/design/changelog/2026-07-06-the-selected-element-attachment-now-clears-from-the-chat-com.md +6 -0
  246. package/corpus/templates/design/changelog/2026-07-06-the-zoom-menu-is-more-compact-with-tight-rows-and-right-alig.md +6 -0
  247. package/corpus/templates/design/changelog/2026-07-06-undo-and-redo-no-longer-flash-the-screen-changes-now-apply-i.md +6 -0
  248. package/corpus/templates/design/changelog/2026-07-06-zoom-presets-like-zoom-to-50-now-stay-on-the-focused-screen-.md +6 -0
  249. package/corpus/templates/design/server/lib/import-design-files.ts +11 -2
  250. package/corpus/templates/design/server/source-workspace.ts +139 -59
  251. package/corpus/templates/design/shared/board-file.ts +11 -2
  252. package/corpus/templates/design/shared/breakpoint-media.ts +543 -0
  253. package/corpus/templates/design/shared/canvas-math.ts +354 -35
  254. package/corpus/templates/design/shared/code-layer.ts +277 -8
  255. package/corpus/templates/design/shared/design-state.ts +11 -4
  256. package/corpus/templates/design/shared/interaction-states.ts +548 -0
  257. package/corpus/templates/design/shared/motion-compiler.ts +186 -23
  258. package/corpus/templates/design/shared/motion-easing.ts +294 -0
  259. package/corpus/templates/design/shared/motion-timeline.ts +400 -34
  260. package/corpus/templates/design/shared/prompt-title.ts +95 -0
  261. package/corpus/templates/design/shared/responsive-classes.ts +448 -10
  262. package/corpus/templates/design/shared/screen-annotation.ts +46 -0
  263. package/corpus/templates/design/shared/shader-fills.ts +1009 -0
  264. package/corpus/templates/design/shared/shader-presets.ts +852 -4
  265. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +15 -2
  266. package/corpus/templates/slides/app/components/editor/ImportButton.tsx +10 -1
  267. package/corpus/templates/slides/app/lib/upload-response.ts +71 -0
  268. package/dist/client/AgentPanel.js +1 -1
  269. package/dist/client/AgentPanel.js.map +1 -1
  270. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  271. package/dist/client/rich-markdown-editor/useCollabReconcile.js +11 -6
  272. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  273. package/dist/client/use-action.d.ts +3 -0
  274. package/dist/client/use-action.d.ts.map +1 -1
  275. package/dist/client/use-action.js +34 -3
  276. package/dist/client/use-action.js.map +1 -1
  277. package/dist/client/use-db-sync.d.ts +4 -0
  278. package/dist/client/use-db-sync.d.ts.map +1 -1
  279. package/dist/client/use-db-sync.js +37 -18
  280. package/dist/client/use-db-sync.js.map +1 -1
  281. package/dist/collab/routes.d.ts +1 -1
  282. package/dist/collab/struct-routes.d.ts +1 -1
  283. package/dist/db/create-get-db.d.ts +25 -0
  284. package/dist/db/create-get-db.d.ts.map +1 -1
  285. package/dist/db/create-get-db.js +25 -2
  286. package/dist/db/create-get-db.js.map +1 -1
  287. package/dist/observability/routes.d.ts +3 -3
  288. package/dist/secrets/routes.d.ts +9 -9
  289. package/dist/server/framework-request-handler.d.ts.map +1 -1
  290. package/dist/server/framework-request-handler.js +37 -1
  291. package/dist/server/framework-request-handler.js.map +1 -1
  292. package/package.json +1 -1
  293. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +0 -153
  294. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +0 -133
  295. package/corpus/templates/design/app/pages/DesignEditor.tsx +0 -22924
@@ -40,13 +40,20 @@ import {
40
40
  IconSizingRemove,
41
41
  IconSizingVariable,
42
42
  } from "./design-icons";
43
- import { ScrubInput } from "./ScrubInput";
43
+ import { ScrubInput, type ScrubInputChangeMeta } from "./ScrubInput";
44
44
 
45
45
  export type AutoLayoutDirection = "horizontal" | "vertical";
46
46
  export type AutoLayoutWrap = "nowrap" | "wrap";
47
47
  export type AutoLayoutSizing = "hug" | "fill" | "fixed";
48
48
  export type AutoLayoutSizingAxis = "horizontal" | "vertical";
49
49
 
50
+ /** Round to one decimal place — matches the `precision={1}` ScrubInput fields
51
+ * advertise (e.g. X/Y position, stroke weight) so W/H commit sub-pixel values
52
+ * like Figma instead of silently flooring to whole pixels. */
53
+ function roundToOneDecimal(value: number): number {
54
+ return Math.round(value * 10) / 10;
55
+ }
56
+
50
57
  /**
51
58
  * The active flow option. "normal" represents block / normal-flow layout for
52
59
  * non-flex containers; the other four map to flex direction + wrap state.
@@ -146,8 +153,19 @@ export interface AutoLayoutMatrixProps {
146
153
  onDirectionChange: (direction: AutoLayoutDirection) => void;
147
154
  onWrapChange: (wrap: AutoLayoutWrap) => void;
148
155
  onAlignmentChange: (alignment: AlignmentMatrixValue) => void;
149
- onGapChange: (gap: number) => void;
150
- onPaddingChange: (padding: AutoLayoutPadding) => void;
156
+ /**
157
+ * `meta` forwards the originating ScrubInput's gesture metadata
158
+ * (phase "preview" per drag tick / "commit" on release) so consumers can
159
+ * route preview ticks to the live style fast path and only persist on
160
+ * commit — same contract as `onChildSizeChange`. Dropping it forces every
161
+ * scrub tick down the slow full-persist path (B5-14: padding scrubs showed
162
+ * nothing until reselect).
163
+ */
164
+ onGapChange: (gap: number, meta?: ScrubInputChangeMeta) => void;
165
+ onPaddingChange: (
166
+ padding: AutoLayoutPadding,
167
+ meta?: ScrubInputChangeMeta,
168
+ ) => void;
151
169
  onPaddingLinkedChange: (linked: boolean) => void;
152
170
  onClipContentChange?: (clipContent: boolean) => void;
153
171
  onDistribute?: (axis: DistributionAxis) => void;
@@ -160,8 +178,14 @@ export interface AutoLayoutMatrixProps {
160
178
  * Invoked when the user directly edits the resolved size (scrub or type) in
161
179
  * fixed-sizing mode. `value` is the new size in CSS pixels. Optional —
162
180
  * when omitted the resolved-size display is read-only (mode-picker only).
181
+ * `meta` forwards the originating ScrubInput's gesture-coalescing metadata
182
+ * (see `SizingFieldProps.onSizeChange`).
163
183
  */
164
- onChildSizeChange?: (axis: AutoLayoutSizingAxis, value: number) => void;
184
+ onChildSizeChange?: (
185
+ axis: AutoLayoutSizingAxis,
186
+ value: number,
187
+ meta?: ScrubInputChangeMeta,
188
+ ) => void;
165
189
  /**
166
190
  * Set or clear a min/max constraint on an axis. `value === null` clears it.
167
191
  * Optional — when omitted the "Add min/max…" rows and constraint sub-rows are
@@ -171,6 +195,8 @@ export interface AutoLayoutMatrixProps {
171
195
  axis: AutoLayoutSizingAxis,
172
196
  kind: "min" | "max",
173
197
  value: number | null,
198
+ /** Scrub gesture meta — see onPaddingChange. Absent for remove (null). */
199
+ meta?: ScrubInputChangeMeta,
174
200
  ) => void;
175
201
  /**
176
202
  * Invoked when the user picks "Apply variable…". Optional — when omitted the
@@ -403,7 +429,7 @@ export function AutoLayoutMatrix({
403
429
  onChange={(next) => onChildSizingChange("horizontal", next)}
404
430
  onSizeChange={
405
431
  onChildSizeChange
406
- ? (px) => onChildSizeChange("horizontal", px)
432
+ ? (px, meta) => onChildSizeChange("horizontal", px, meta)
407
433
  : undefined
408
434
  }
409
435
  onMinMaxChange={onChildMinMaxChange}
@@ -425,7 +451,7 @@ export function AutoLayoutMatrix({
425
451
  onChange={(next) => onChildSizingChange("vertical", next)}
426
452
  onSizeChange={
427
453
  onChildSizeChange
428
- ? (px) => onChildSizeChange("vertical", px)
454
+ ? (px, meta) => onChildSizeChange("vertical", px, meta)
429
455
  : undefined
430
456
  }
431
457
  onMinMaxChange={onChildMinMaxChange}
@@ -500,13 +526,16 @@ export function AutoLayoutMatrix({
500
526
  icon={IconPaddingHorizontal}
501
527
  ariaLabel={copy.paddingLeft + " / " + copy.paddingRight}
502
528
  value={horizontalPaddingValue}
503
- onChange={(next) =>
504
- onPaddingChange({
505
- top: value.padding.top,
506
- bottom: value.padding.bottom,
507
- left: next,
508
- right: next,
509
- })
529
+ onChange={(next, meta) =>
530
+ onPaddingChange(
531
+ {
532
+ top: value.padding.top,
533
+ bottom: value.padding.bottom,
534
+ left: next,
535
+ right: next,
536
+ },
537
+ meta,
538
+ )
510
539
  }
511
540
  disabled={disabled}
512
541
  />
@@ -514,13 +543,16 @@ export function AutoLayoutMatrix({
514
543
  icon={IconPaddingVertical}
515
544
  ariaLabel={copy.paddingTop + " / " + copy.paddingBottom}
516
545
  value={verticalPaddingValue}
517
- onChange={(next) =>
518
- onPaddingChange({
519
- top: next,
520
- bottom: next,
521
- left: value.padding.left,
522
- right: value.padding.right,
523
- })
546
+ onChange={(next, meta) =>
547
+ onPaddingChange(
548
+ {
549
+ top: next,
550
+ bottom: next,
551
+ left: value.padding.left,
552
+ right: value.padding.right,
553
+ },
554
+ meta,
555
+ )
524
556
  }
525
557
  disabled={disabled}
526
558
  />
@@ -540,8 +572,8 @@ export function AutoLayoutMatrix({
540
572
  icon={IconPaddingTopMini}
541
573
  ariaLabel={copy.paddingTop}
542
574
  value={value.padding.top}
543
- onChange={(next) =>
544
- onPaddingChange({ ...value.padding, top: next })
575
+ onChange={(next, meta) =>
576
+ onPaddingChange({ ...value.padding, top: next }, meta)
545
577
  }
546
578
  disabled={disabled}
547
579
  />
@@ -549,8 +581,8 @@ export function AutoLayoutMatrix({
549
581
  icon={IconPaddingRightMini}
550
582
  ariaLabel={copy.paddingRight}
551
583
  value={value.padding.right}
552
- onChange={(next) =>
553
- onPaddingChange({ ...value.padding, right: next })
584
+ onChange={(next, meta) =>
585
+ onPaddingChange({ ...value.padding, right: next }, meta)
554
586
  }
555
587
  disabled={disabled}
556
588
  />
@@ -558,8 +590,8 @@ export function AutoLayoutMatrix({
558
590
  icon={IconPaddingBottomMini}
559
591
  ariaLabel={copy.paddingBottom}
560
592
  value={value.padding.bottom}
561
- onChange={(next) =>
562
- onPaddingChange({ ...value.padding, bottom: next })
593
+ onChange={(next, meta) =>
594
+ onPaddingChange({ ...value.padding, bottom: next }, meta)
563
595
  }
564
596
  disabled={disabled}
565
597
  />
@@ -567,8 +599,8 @@ export function AutoLayoutMatrix({
567
599
  icon={IconPaddingLeftMini}
568
600
  ariaLabel={copy.paddingLeft}
569
601
  value={value.padding.left}
570
- onChange={(next) =>
571
- onPaddingChange({ ...value.padding, left: next })
602
+ onChange={(next, meta) =>
603
+ onPaddingChange({ ...value.padding, left: next }, meta)
572
604
  }
573
605
  disabled={disabled}
574
606
  />
@@ -894,7 +926,8 @@ function GapField({
894
926
  gapMode = "fixed",
895
927
  }: {
896
928
  value: number;
897
- onGapChange: (gap: number) => void;
929
+ /** Forwards ScrubInput's gesture meta — see AutoLayoutMatrixProps.onGapChange. */
930
+ onGapChange: (gap: number, meta?: ScrubInputChangeMeta) => void;
898
931
  onDistribute?: (axis: DistributionAxis) => void;
899
932
  onGapModeChange?: (mode: "fixed" | "auto", axis: DistributionAxis) => void;
900
933
  label: string;
@@ -917,7 +950,7 @@ function GapField({
917
950
  tooltipLabel={label}
918
951
  icon={IconGap}
919
952
  value={value}
920
- onChange={(next) => onGapChange(next)}
953
+ onChange={(next, meta) => onGapChange(next, meta)}
921
954
  unit="px"
922
955
  min={0}
923
956
  step={1}
@@ -1016,7 +1049,8 @@ function PaddingField({
1016
1049
  icon: (props: { className?: string }) => ReactNode;
1017
1050
  ariaLabel: string;
1018
1051
  value: number;
1019
- onChange: (value: number) => void;
1052
+ /** Forwards ScrubInput's gesture meta — see AutoLayoutMatrixProps.onPaddingChange. */
1053
+ onChange: (value: number, meta?: ScrubInputChangeMeta) => void;
1020
1054
  disabled: boolean;
1021
1055
  }) {
1022
1056
  return (
@@ -1032,7 +1066,7 @@ function PaddingField({
1032
1066
  tooltipLabel={ariaLabel}
1033
1067
  icon={Icon}
1034
1068
  value={value}
1035
- onChange={(next) => onChange(next)}
1069
+ onChange={(next, meta) => onChange(next, meta)}
1036
1070
  unit="px"
1037
1071
  min={0}
1038
1072
  step={1}
@@ -1109,12 +1143,22 @@ export interface SizingFieldProps {
1109
1143
  * Invoked when the user directly scrubs or types a new pixel value while in
1110
1144
  * "fixed" sizing mode. When omitted the numeric display is read-only and the
1111
1145
  * entire trigger is a mode-picker dropdown (legacy behaviour).
1146
+ *
1147
+ * `meta` mirrors the same `ScrubInputChangeMeta` the X/Y position fields
1148
+ * already forward to `onStyleChange` (see `ScrubStyleInput` in
1149
+ * EditPanel.tsx) — in particular `meta.phase`, which lets the caller
1150
+ * coalesce a whole scrub-drag gesture (many "preview" ticks + one final
1151
+ * "commit") into a single undo step instead of one per tick. Callers that
1152
+ * ignore the second argument keep today's every-tick-commits behavior.
1112
1153
  */
1113
- onSizeChange?: (px: number) => void;
1154
+ onSizeChange?: (px: number, meta?: ScrubInputChangeMeta) => void;
1114
1155
  onMinMaxChange?: (
1115
1156
  axis: AutoLayoutSizingAxis,
1116
1157
  kind: "min" | "max",
1117
1158
  value: number | null,
1159
+ /** Scrub gesture meta — same contract as onSizeChange. Absent for
1160
+ * remove (null) and the discrete add-constraint seed. */
1161
+ meta?: ScrubInputChangeMeta,
1118
1162
  ) => void;
1119
1163
  onApplyVariable?: (axis: AutoLayoutSizingAxis) => void;
1120
1164
  }
@@ -1263,13 +1307,15 @@ export function SizingField({
1263
1307
  ariaLabel={`${axis} size in pixels`}
1264
1308
  tooltipLabel={`${axis} size`}
1265
1309
  icon={null}
1266
- value={mixed ? 0 : Math.round(resolvedSize ?? 0)}
1267
- onChange={(next) => onSizeChange!(Math.max(0, Math.round(next)))}
1310
+ value={mixed ? 0 : roundToOneDecimal(resolvedSize ?? 0)}
1311
+ onChange={(next, meta) =>
1312
+ onSizeChange!(Math.max(0, roundToOneDecimal(next)), meta)
1313
+ }
1268
1314
  mixed={mixed}
1269
1315
  unit="px"
1270
1316
  min={0}
1271
1317
  step={1}
1272
- precision={0}
1318
+ precision={1}
1273
1319
  disabled={disabled}
1274
1320
  className="min-w-0 flex-1 gap-0"
1275
1321
  labelClassName="h-7 w-5 justify-center gap-0 rounded-l-md rounded-r-none px-0 text-muted-foreground"
@@ -1358,7 +1404,9 @@ export function SizingField({
1358
1404
  value={minValue ?? 0}
1359
1405
  disabled={disabled}
1360
1406
  removeLabel={labels.removeConstraint}
1361
- onChange={(next) => onMinMaxChange?.(sizingAxis, "min", next)}
1407
+ onChange={(next, meta) =>
1408
+ onMinMaxChange?.(sizingAxis, "min", next, meta)
1409
+ }
1362
1410
  onRemove={() => {
1363
1411
  onMinMaxChange?.(sizingAxis, "min", null);
1364
1412
  }}
@@ -1370,7 +1418,9 @@ export function SizingField({
1370
1418
  value={maxValue ?? 0}
1371
1419
  disabled={disabled}
1372
1420
  removeLabel={labels.removeConstraint}
1373
- onChange={(next) => onMinMaxChange?.(sizingAxis, "max", next)}
1421
+ onChange={(next, meta) =>
1422
+ onMinMaxChange?.(sizingAxis, "max", next, meta)
1423
+ }
1374
1424
  onRemove={() => {
1375
1425
  onMinMaxChange?.(sizingAxis, "max", null);
1376
1426
  }}
@@ -1424,7 +1474,8 @@ function ConstraintSubRow({
1424
1474
  value: number;
1425
1475
  disabled: boolean;
1426
1476
  removeLabel: string;
1427
- onChange: (value: number) => void;
1477
+ /** Forwards ScrubInput's gesture meta — see AutoLayoutMatrixProps.onChildMinMaxChange. */
1478
+ onChange: (value: number, meta?: ScrubInputChangeMeta) => void;
1428
1479
  onRemove: () => void;
1429
1480
  }) {
1430
1481
  return (
@@ -1438,7 +1489,7 @@ function ConstraintSubRow({
1438
1489
  label={label}
1439
1490
  ariaLabel={label}
1440
1491
  value={value}
1441
- onChange={(next) => onChange(Math.max(0, Math.round(next)))}
1492
+ onChange={(next, meta) => onChange(Math.max(0, Math.round(next)), meta)}
1442
1493
  unit="px"
1443
1494
  min={0}
1444
1495
  step={1}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * BreakpointOverrideIndicator — per-field accent dot + reset affordance for
3
+ * a style-section field whose property is overridden at the currently
4
+ * active breakpoint. Mirrors `InteractionStateOverrideIndicator`'s
5
+ * "dot + reset" shape (see `InteractionStatePanel.tsx`) so the two
6
+ * override conventions (interaction state, breakpoint) read consistently
7
+ * across the inspector.
8
+ *
9
+ * This component owns ONLY the indicator's rendering — it has no opinion on
10
+ * how the override state is computed (see `getBreakpointOverrideState` in
11
+ * `@shared/breakpoint-media`) or how a reset is persisted (the caller wires
12
+ * `onReset` to commit through the normal `onStyleChange` path with
13
+ * `meta.breakpointReset`, per the `EditPanel` `StyleChangeMeta` contract).
14
+ */
15
+
16
+ import { useT } from "@agent-native/core/client";
17
+
18
+ import {
19
+ Tooltip,
20
+ TooltipContent,
21
+ TooltipTrigger,
22
+ } from "@/components/ui/tooltip";
23
+ import { cn } from "@/lib/utils";
24
+
25
+ export interface BreakpointOverrideIndicatorProps {
26
+ /** True when the active breakpoint has an override for this property. */
27
+ overridden: boolean;
28
+ /**
29
+ * The width (px) the override is scoped to — used only for the tooltip
30
+ * copy ("Overridden at 810px"). Required whenever `overridden` is true.
31
+ */
32
+ maxWidthPx?: number | null;
33
+ onReset?: () => void;
34
+ className?: string;
35
+ }
36
+
37
+ export function BreakpointOverrideIndicator({
38
+ overridden,
39
+ maxWidthPx,
40
+ onReset,
41
+ className,
42
+ }: BreakpointOverrideIndicatorProps) {
43
+ const t = useT();
44
+ if (!overridden) return null;
45
+ const tooltip =
46
+ maxWidthPx != null
47
+ ? t("editPanel.breakpointOverride.overriddenAtTooltip", {
48
+ width: String(Math.round(maxWidthPx)),
49
+ })
50
+ : t("editPanel.breakpointOverride.overriddenTooltip");
51
+ return (
52
+ <span className={cn("inline-flex shrink-0 items-center", className)}>
53
+ <Tooltip>
54
+ <TooltipTrigger asChild>
55
+ <span
56
+ className="inline-block size-1.5 shrink-0 rounded-full bg-[var(--design-editor-accent-color)]"
57
+ role="img"
58
+ aria-label={tooltip}
59
+ />
60
+ </TooltipTrigger>
61
+ <TooltipContent>{tooltip}</TooltipContent>
62
+ </Tooltip>
63
+ {onReset ? (
64
+ <Tooltip>
65
+ <TooltipTrigger asChild>
66
+ <button
67
+ type="button"
68
+ onClick={onReset}
69
+ className="ml-0.5 cursor-pointer text-[10px] font-medium text-muted-foreground hover:text-foreground"
70
+ aria-label={t("editPanel.breakpointOverride.reset")}
71
+ >
72
+ {t("editPanel.breakpointOverride.resetShort")}
73
+ </button>
74
+ </TooltipTrigger>
75
+ <TooltipContent>
76
+ {t("editPanel.breakpointOverride.resetTooltip")}
77
+ </TooltipContent>
78
+ </Tooltip>
79
+ ) : null}
80
+ </span>
81
+ );
82
+ }