@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
@@ -0,0 +1,119 @@
1
+ import { useT } from "@agent-native/core/client";
2
+ import { IconChevronDown, IconChevronRight } from "@tabler/icons-react";
3
+ import { useState } from "react";
4
+
5
+ import {
6
+ FRAME_SIZE_PRESET_CATEGORIES,
7
+ type FrameSizePreset,
8
+ type FrameSizePresetCategoryKey,
9
+ } from "../inspector";
10
+
11
+ /**
12
+ * One collapsible category group in the frame-tool presets panel — e.g.
13
+ * "Phone" or "Tablet". Unlike {@link PanelSection} (used for property
14
+ * sections, which shows no chevron), this renders a leading chevron like
15
+ * Figma's own preset list and LayersPanel's disclosure triangles.
16
+ */
17
+ function FramePresetCategoryGroup({
18
+ title,
19
+ presets,
20
+ defaultOpen = false,
21
+ onPick,
22
+ }: {
23
+ title: string;
24
+ presets: FrameSizePreset[];
25
+ defaultOpen?: boolean;
26
+ onPick: (preset: FrameSizePreset) => void;
27
+ }) {
28
+ const [open, setOpen] = useState(defaultOpen);
29
+
30
+ return (
31
+ <section className="shrink-0 border-t border-[var(--design-editor-control-border)] first:border-t-0">
32
+ <button
33
+ type="button"
34
+ className="flex h-9 w-full min-w-0 cursor-pointer items-center gap-1.5 px-3 text-left"
35
+ onClick={() => setOpen((current) => !current)}
36
+ aria-expanded={open}
37
+ >
38
+ {open ? (
39
+ <IconChevronDown className="size-3.5 shrink-0 text-muted-foreground" />
40
+ ) : (
41
+ <IconChevronRight className="size-3.5 shrink-0 text-muted-foreground rtl:-scale-x-100" />
42
+ )}
43
+ <h3 className="min-w-0 flex-1 truncate !text-[11px] font-semibold text-foreground">
44
+ {title}
45
+ </h3>
46
+ </button>
47
+ {open ? (
48
+ <div className="pb-1.5">
49
+ {presets.map((preset) => (
50
+ <button
51
+ key={preset.name}
52
+ type="button"
53
+ className="flex h-8 w-full min-w-0 cursor-pointer items-center gap-2 px-3 pl-8 text-left hover:bg-[var(--design-editor-control-hover-bg)]"
54
+ onClick={() => onPick(preset)}
55
+ >
56
+ <span className="min-w-0 flex-1 truncate !text-[11px] text-foreground">
57
+ {preset.name}
58
+ </span>
59
+ <span className="shrink-0 !text-[11px] tabular-nums text-muted-foreground">
60
+ {preset.width}
61
+ {"×" /* × */}
62
+ {preset.height}
63
+ </span>
64
+ </button>
65
+ ))}
66
+ </div>
67
+ ) : null}
68
+ </section>
69
+ );
70
+ }
71
+
72
+ const FRAME_PRESET_CATEGORY_LABEL_KEYS: Record<
73
+ FrameSizePresetCategoryKey,
74
+ string
75
+ > = {
76
+ phone: "editPanel.framePresets.categories.phone",
77
+ tablet: "editPanel.framePresets.categories.tablet",
78
+ desktop: "editPanel.framePresets.categories.desktop",
79
+ presentation: "editPanel.framePresets.categories.presentation",
80
+ watch: "editPanel.framePresets.categories.watch",
81
+ paper: "editPanel.framePresets.categories.paper",
82
+ socialMedia: "editPanel.framePresets.categories.socialMedia",
83
+ };
84
+
85
+ /**
86
+ * Figma-parity frame-tool panel: replaces the whole inspector body with a
87
+ * scrollable, categorized list of screen-size presets while the Frame tool
88
+ * is armed. Clicking a row calls `onCreateScreenFromPreset` with the exact
89
+ * size — see the `activeTool`/`onCreateScreenFromPreset` doc comments on
90
+ * `EditPanelProps` for the parent-side creation/tool-revert contract.
91
+ */
92
+ export function FramePresetsPanel({
93
+ onPick,
94
+ }: {
95
+ onPick: (preset: FrameSizePreset) => void;
96
+ }) {
97
+ const t = useT();
98
+
99
+ return (
100
+ <div className="flex min-h-0 flex-1 flex-col overflow-hidden">
101
+ <div className="flex h-10 shrink-0 items-center border-b border-border/90 px-3">
102
+ <h3 className="min-w-0 flex-1 truncate text-[13px] font-semibold text-foreground">
103
+ {t("editPanel.framePresets.title")}
104
+ </h3>
105
+ </div>
106
+ <div className="design-inspector-scroll min-h-0 flex-1 overflow-y-auto overscroll-contain">
107
+ {FRAME_SIZE_PRESET_CATEGORIES.map((category, index) => (
108
+ <FramePresetCategoryGroup
109
+ key={category.key}
110
+ title={t(FRAME_PRESET_CATEGORY_LABEL_KEYS[category.key])}
111
+ presets={category.presets}
112
+ defaultOpen={index === 0}
113
+ onPick={onPick}
114
+ />
115
+ ))}
116
+ </div>
117
+ </div>
118
+ );
119
+ }
@@ -0,0 +1,248 @@
1
+ import { IconGripVertical } from "@tabler/icons-react";
2
+ import { useRef, useState, type DragEvent, type ReactNode } from "react";
3
+
4
+ import { Button } from "@/components/ui/button";
5
+ import {
6
+ Tooltip,
7
+ TooltipContent,
8
+ TooltipTrigger,
9
+ } from "@/components/ui/tooltip";
10
+ import { cn } from "@/lib/utils";
11
+
12
+ export function SectionIconButton({
13
+ label,
14
+ onClick,
15
+ children,
16
+ activateOnPointerDown = false,
17
+ disabled = false,
18
+ className,
19
+ }: {
20
+ label: string;
21
+ onClick?: () => void;
22
+ children: ReactNode;
23
+ activateOnPointerDown?: boolean;
24
+ disabled?: boolean;
25
+ className?: string;
26
+ }) {
27
+ const pointerActivatedRef = useRef(false);
28
+
29
+ return (
30
+ <Tooltip>
31
+ <TooltipTrigger asChild>
32
+ <Button
33
+ type="button"
34
+ variant="ghost"
35
+ size="icon"
36
+ className={cn(
37
+ "size-6 shrink-0 cursor-pointer rounded-md text-muted-foreground hover:text-foreground disabled:cursor-not-allowed",
38
+ className,
39
+ )}
40
+ disabled={disabled}
41
+ onPointerDown={(event) => {
42
+ if (!activateOnPointerDown || disabled || event.button !== 0) {
43
+ return;
44
+ }
45
+ pointerActivatedRef.current = true;
46
+ event.preventDefault();
47
+ event.stopPropagation();
48
+ onClick?.();
49
+ }}
50
+ onClick={() => {
51
+ if (pointerActivatedRef.current) {
52
+ pointerActivatedRef.current = false;
53
+ return;
54
+ }
55
+ onClick?.();
56
+ }}
57
+ aria-label={label}
58
+ >
59
+ {children}
60
+ </Button>
61
+ </TooltipTrigger>
62
+ <TooltipContent>{label}</TooltipContent>
63
+ </Tooltip>
64
+ );
65
+ }
66
+
67
+ /**
68
+ * Section-header toggle icon (the design editor's right-aligned section actions, e.g. the
69
+ * auto-layout ⊞ toggle). Highlights with the accent color when active.
70
+ */
71
+ export function SectionIconToggle({
72
+ label,
73
+ active = false,
74
+ onClick,
75
+ children,
76
+ }: {
77
+ label: string;
78
+ active?: boolean;
79
+ onClick?: () => void;
80
+ children: ReactNode;
81
+ }) {
82
+ return (
83
+ <Tooltip>
84
+ <TooltipTrigger asChild>
85
+ <Button
86
+ type="button"
87
+ variant="ghost"
88
+ size="icon"
89
+ aria-label={label}
90
+ aria-pressed={active}
91
+ onClick={onClick}
92
+ className={cn(
93
+ "size-6 cursor-pointer rounded-md text-muted-foreground hover:text-foreground",
94
+ active &&
95
+ "bg-[var(--design-editor-accent-color)]/15 text-[var(--design-editor-accent-color)] hover:text-[var(--design-editor-accent-color)]",
96
+ )}
97
+ >
98
+ {children}
99
+ </Button>
100
+ </TooltipTrigger>
101
+ <TooltipContent>{label}</TooltipContent>
102
+ </Tooltip>
103
+ );
104
+ }
105
+
106
+ /**
107
+ * Minimal pointer-based reorder for a flat row list (fill layers, shadow
108
+ * layers). Deliberately not shared with LayersPanel.tsx's tree-drag logic —
109
+ * that implementation is coupled to nested/multi-select layer nodes, while
110
+ * this only ever needs "move index A to index B" over a flat array.
111
+ *
112
+ * Reads live in a ref (not React state) so a fast pointermove sequence never
113
+ * reorders against a stale `count`/`onReorder` closure, mirroring why
114
+ * ScrubInput tracks its draft in a ref alongside state.
115
+ */
116
+ export function useRowDragReorder(
117
+ count: number,
118
+ onReorder: (from: number, to: number) => void,
119
+ ) {
120
+ const [dragIndex, setDragIndex] = useState<number | null>(null);
121
+ const [overIndex, setOverIndex] = useState<number | null>(null);
122
+ const liveRef = useRef({ count, onReorder });
123
+ liveRef.current = { count, onReorder };
124
+
125
+ const getRowProps = (index: number) => ({
126
+ onDragOver: (event: DragEvent<HTMLDivElement>) => {
127
+ if (dragIndex == null) return;
128
+ event.preventDefault();
129
+ event.dataTransfer.dropEffect = "move";
130
+ if (index !== overIndex) setOverIndex(index);
131
+ },
132
+ onDrop: (event: DragEvent<HTMLDivElement>) => {
133
+ event.preventDefault();
134
+ const from = dragIndex;
135
+ setDragIndex(null);
136
+ setOverIndex(null);
137
+ if (from == null || from === index) return;
138
+ const { count: liveCount, onReorder: liveOnReorder } = liveRef.current;
139
+ if (index < 0 || index >= liveCount) return;
140
+ liveOnReorder(from, index);
141
+ },
142
+ });
143
+
144
+ const getHandleProps = (index: number) => ({
145
+ draggable: true,
146
+ onDragStart: (event: DragEvent<HTMLSpanElement>) => {
147
+ // Firefox requires setData to be called for the drag to start at all.
148
+ event.dataTransfer.setData("text/plain", String(index));
149
+ event.dataTransfer.effectAllowed = "move";
150
+ setDragIndex(index);
151
+ },
152
+ onDragEnd: () => {
153
+ setDragIndex(null);
154
+ setOverIndex(null);
155
+ },
156
+ });
157
+
158
+ return {
159
+ dragIndex,
160
+ overIndex,
161
+ getRowProps,
162
+ getHandleProps,
163
+ };
164
+ }
165
+
166
+ /** Drag handle + before/after drop-indicator line for a reorderable row.
167
+ * Grip is hover-revealed (Figma convention); the row itself uses always-visible
168
+ * eye/remove buttons per this file's existing convention, so only the grip
169
+ * gets the opacity treatment. */
170
+ export function RowDragHandle({
171
+ label,
172
+ dropIndicator,
173
+ draggable,
174
+ onDragStart,
175
+ onDragEnd,
176
+ }: {
177
+ label: string;
178
+ dropIndicator?: "before" | "after" | null;
179
+ draggable: boolean;
180
+ onDragStart: (event: DragEvent<HTMLSpanElement>) => void;
181
+ onDragEnd: () => void;
182
+ }) {
183
+ return (
184
+ <span
185
+ draggable={draggable}
186
+ onDragStart={onDragStart}
187
+ onDragEnd={onDragEnd}
188
+ role="button"
189
+ aria-label={label}
190
+ className="relative flex size-6 shrink-0 cursor-grab items-center justify-center rounded-md text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100 active:cursor-grabbing"
191
+ >
192
+ <IconGripVertical className="size-3.5" />
193
+ {dropIndicator === "before" ? (
194
+ <span className="pointer-events-none absolute -top-[3px] left-0 right-0 h-px bg-[var(--design-editor-accent-color)]" />
195
+ ) : null}
196
+ {dropIndicator === "after" ? (
197
+ <span className="pointer-events-none absolute -bottom-[3px] left-0 right-0 h-px bg-[var(--design-editor-accent-color)]" />
198
+ ) : null}
199
+ </span>
200
+ );
201
+ }
202
+
203
+ export function InspectorIconButton({
204
+ label,
205
+ active,
206
+ onClick,
207
+ children,
208
+ shortcut,
209
+ }: {
210
+ label: string;
211
+ active?: boolean;
212
+ onClick?: () => void;
213
+ children: ReactNode;
214
+ /** Optional keyboard-shortcut hint (e.g. "⌥A") appended to the tooltip only — aria-label stays plain text. */
215
+ shortcut?: string;
216
+ }) {
217
+ return (
218
+ <Tooltip>
219
+ <TooltipTrigger asChild>
220
+ <Button
221
+ type="button"
222
+ variant="ghost"
223
+ size="icon"
224
+ className={cn(
225
+ "h-6 min-w-6 cursor-pointer rounded-none border-r border-border/50 text-muted-foreground first:rounded-l-md last:rounded-r-md last:border-r-0 hover:bg-[var(--design-editor-panel-raised-bg)] hover:text-foreground disabled:cursor-not-allowed",
226
+ active &&
227
+ "bg-[var(--design-editor-panel-bg)] text-[var(--design-editor-accent-color)] shadow-[inset_0_0_0_1px_var(--design-editor-control-border)]",
228
+ )}
229
+ onClick={onClick}
230
+ aria-label={label}
231
+ >
232
+ {children}
233
+ </Button>
234
+ </TooltipTrigger>
235
+ <TooltipContent>
236
+ {shortcut ? `${label} ${shortcut}` : label}
237
+ </TooltipContent>
238
+ </Tooltip>
239
+ );
240
+ }
241
+
242
+ export function InspectorSegment({ children }: { children: ReactNode }) {
243
+ return (
244
+ <div className="flex w-fit max-w-full min-w-0 overflow-hidden rounded-md bg-[var(--design-editor-control-bg)]">
245
+ {children}
246
+ </div>
247
+ );
248
+ }
@@ -0,0 +1,45 @@
1
+ import type { ElementInfo } from "../types";
2
+
3
+ export function authoredStyleValue(
4
+ element: ElementInfo,
5
+ property: string,
6
+ ): string | undefined {
7
+ const inline = element.inlineStyles?.[property];
8
+ if (inline !== undefined) return inline === "auto" ? "" : inline;
9
+ return element.computedStyles[property];
10
+ }
11
+
12
+ /**
13
+ * While a non-default interaction state is active, style-section fields
14
+ * display the STATE's value for a property when it has one, else fall back
15
+ * to the base (Default-state) value — never blank. This is the "overridden
16
+ * shows the override, else shows the inherited base" convention (documented
17
+ * choice: values are shown in their normal weight/color either way, since
18
+ * the state-selector's own accent already signals "you are editing Hover" —
19
+ * repeating that with dimmed/greyed-out base values on every single field
20
+ * would be visual noise; the per-property override DOT, rendered via
21
+ * `InteractionStateOverrideIndicator`, is what marks which specific fields
22
+ * differ from the base in the active state).
23
+ *
24
+ * @param stateStyles `activeInteractionStateStyles` — the active state's
25
+ * declared properties for the selected element, or `undefined` when no
26
+ * state is active / nothing is overridden.
27
+ * @param property CSS property, camelCase or kebab-case (normalized the
28
+ * same way `shared/interaction-states.ts` normalizes keys, so callers can
29
+ * pass either).
30
+ * @param baseValue The value that would render with no state active
31
+ * (typically `authoredStyleValue(element, property)` or a computed style).
32
+ */
33
+ export function resolveInteractionStateValue(
34
+ stateStyles: Record<string, string> | undefined,
35
+ property: string,
36
+ baseValue: string | undefined,
37
+ ): string | undefined {
38
+ if (!stateStyles) return baseValue;
39
+ const kebabProperty = property.replace(
40
+ /[A-Z]/g,
41
+ (letter) => `-${letter.toLowerCase()}`,
42
+ );
43
+ const override = stateStyles[property] ?? stateStyles[kebabProperty];
44
+ return override !== undefined ? override : baseValue;
45
+ }