@agent-native/core 0.80.0 → 0.80.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +8 -0
  3. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  4. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +14 -1
  5. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  6. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +15 -1
  7. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  8. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +15 -1
  9. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  10. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +15 -1
  11. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  12. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +15 -1
  13. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  14. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +16 -1
  15. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  16. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +14 -1
  17. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  18. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +14 -1
  19. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  20. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +14 -1
  21. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  22. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +14 -1
  23. package/corpus/core/docs/content/skills-guide.mdx +5 -0
  24. package/corpus/core/docs/content/template-design.mdx +14 -1
  25. package/corpus/core/package.json +1 -1
  26. package/corpus/core/src/application-state/handlers.ts +1 -1
  27. package/corpus/core/src/brand-kit/index.ts +1 -1
  28. package/corpus/core/src/cli/skills.ts +18 -0
  29. package/corpus/core/src/client/AgentPanel.tsx +1 -1
  30. package/corpus/core/src/client/MultiTabAssistantChat.tsx +1 -1
  31. package/corpus/core/src/client/extensions/portable-extension.ts +1 -1
  32. package/corpus/core/src/code-agents/transcript-normalizer.ts +1 -1
  33. package/corpus/core/src/extensions/path.ts +1 -4
  34. package/corpus/core/src/integrations/a2a-continuation-processor.ts +1 -1
  35. package/corpus/core/src/mcp/build-server.ts +1 -1
  36. package/corpus/core/src/org/handlers.ts +5 -5
  37. package/corpus/core/src/org/plugin.ts +2 -2
  38. package/corpus/core/src/scripts/call-agent.ts +1 -1
  39. package/corpus/core/src/scripts/db/safety.ts +1 -1
  40. package/corpus/core/src/server/auth.ts +3 -0
  41. package/corpus/core/src/server/builder-design-systems.ts +308 -0
  42. package/corpus/core/src/server/core-routes-plugin.ts +29 -3
  43. package/corpus/core/src/server/index.ts +8 -0
  44. package/corpus/core/src/styles/agent-native.css +14 -7
  45. package/corpus/core/src/usage/store.ts +2 -2
  46. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +298 -15
  47. package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -4
  48. package/corpus/templates/analytics/actions/mutate-dashboard.ts +18 -2
  49. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +12 -2
  50. package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +66 -0
  51. package/corpus/templates/analytics/app/i18n/zh-TW.ts +37 -0
  52. package/corpus/templates/analytics/app/i18n-data.ts +404 -0
  53. package/corpus/templates/analytics/app/pages/Settings.tsx +333 -0
  54. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
  55. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +121 -3
  56. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +49 -26
  57. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +137 -36
  58. package/corpus/templates/analytics/changelog/2026-06-29-analytics-agents-can-now-place-new-charts-into-requested-das.md +6 -0
  59. package/corpus/templates/analytics/changelog/2026-06-29-analytics-queries-now-report-failed-source-query-errors-inst.md +6 -0
  60. package/corpus/templates/analytics/changelog/2026-06-29-charts-can-now-be-dropped-between-full-dashboard-rows-to-cre.md +6 -0
  61. package/corpus/templates/analytics/changelog/2026-06-29-dashboard-email-reports-include-the-full-dashboard-image-wit.md +6 -0
  62. package/corpus/templates/analytics/changelog/2026-06-29-main-surface-border-reaches-the-top.md +6 -0
  63. package/corpus/templates/analytics/changelog/2026-06-29-session-replay-now-records-playable-sessions-in-production-a.md +6 -0
  64. package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +6 -0
  65. package/corpus/templates/analytics/scripts/cleanup-empty-session-recordings.ts +102 -0
  66. package/corpus/templates/analytics/server/lib/dashboard-report.ts +49 -26
  67. package/corpus/templates/analytics/server/lib/real-data-actions.ts +81 -20
  68. package/corpus/templates/analytics/server/lib/replay-storage.ts +79 -0
  69. package/corpus/templates/analytics/server/lib/s3-upload-provider.ts +255 -0
  70. package/corpus/templates/analytics/server/lib/session-replay.ts +29 -8
  71. package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -2
  72. package/corpus/templates/analytics/server/plugins/onboarding.ts +97 -0
  73. package/corpus/templates/clips/desktop/src/lib/recorder.ts +24 -0
  74. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +105 -5
  75. package/corpus/templates/content/actions/set-image-alt-text.ts +1 -1
  76. package/corpus/templates/content/shared/document-export.ts +1 -1
  77. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -18
  78. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +17 -0
  79. package/corpus/templates/design/actions/add-localhost-screens.ts +32 -5
  80. package/corpus/templates/design/actions/index-design-system-with-builder.ts +259 -0
  81. package/corpus/templates/design/actions/update-file.ts +9 -2
  82. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +33 -75
  83. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +72 -9
  84. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +41 -39
  85. package/corpus/templates/design/app/components/design/EditPanel.tsx +1029 -249
  86. package/corpus/templates/design/app/components/design/LayersPanel.tsx +450 -101
  87. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +978 -154
  88. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +7 -9
  89. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +133 -66
  90. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +1234 -344
  91. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +144 -94
  92. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +301 -72
  93. package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +876 -286
  94. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +601 -0
  95. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +242 -0
  96. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +30 -7
  97. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +212 -155
  98. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +423 -0
  99. package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +487 -107
  100. package/corpus/templates/design/app/components/design/inspector/index.ts +27 -0
  101. package/corpus/templates/design/app/global.css +29 -3
  102. package/corpus/templates/design/app/i18n/zh-TW.ts +13 -0
  103. package/corpus/templates/design/app/i18n-data.ts +239 -1
  104. package/corpus/templates/design/app/pages/DesignEditor.tsx +1023 -353
  105. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +57 -221
  106. package/corpus/templates/design/changelog/2026-06-29-canvas-selection-no-longer-flashes-broken-prototype-html-whe.md +6 -0
  107. package/corpus/templates/design/changelog/2026-06-29-command-menu-selections-are-clearer-in-dark-mode.md +6 -0
  108. package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +6 -0
  109. package/corpus/templates/design/changelog/2026-06-29-element-selection-now-stays-on-the-intended-layer-after-sele.md +6 -0
  110. package/corpus/templates/design/changelog/2026-06-29-screen-overview-full-view-controls-now-sit-above-frames-inst.md +6 -0
  111. package/corpus/templates/design/changelog/2026-06-29-screen-overview-tools-can-draw-shapes-create-screens-and-kee.md +6 -0
  112. package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-now-creates-anchor-based-bezier-vectors-with-ha.md +6 -0
  113. package/corpus/templates/design/server/handlers/import-figma-system.ts +38 -85
  114. package/corpus/templates/design/server/lib/design-snapshot.ts +9 -1
  115. package/corpus/templates/design/shared/code-layer.ts +209 -9
  116. package/corpus/templates/design/shared/html-content.ts +21 -0
  117. package/corpus/templates/design/shared/pen-path.ts +207 -0
  118. package/corpus/templates/mail/app/lib/utils.ts +2 -2
  119. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -10
  120. package/corpus/templates/slides/AGENTS.md +3 -2
  121. package/corpus/templates/slides/actions/import-file.ts +26 -17
  122. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +259 -0
  123. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +35 -167
  124. package/corpus/templates/slides/app/components/design-system/fig-import-response.ts +9 -13
  125. package/corpus/templates/slides/app/context/DeckContext.tsx +1 -1
  126. package/corpus/templates/slides/app/i18n/ar-SA.ts +9 -37
  127. package/corpus/templates/slides/app/i18n/de-DE.ts +10 -25
  128. package/corpus/templates/slides/app/i18n/en-US.ts +9 -26
  129. package/corpus/templates/slides/app/i18n/es-ES.ts +10 -28
  130. package/corpus/templates/slides/app/i18n/fr-FR.ts +10 -28
  131. package/corpus/templates/slides/app/i18n/hi-IN.ts +9 -26
  132. package/corpus/templates/slides/app/i18n/ja-JP.ts +10 -22
  133. package/corpus/templates/slides/app/i18n/ko-KR.ts +9 -23
  134. package/corpus/templates/slides/app/i18n/pt-BR.ts +10 -28
  135. package/corpus/templates/slides/app/i18n/zh-CN.ts +9 -22
  136. package/corpus/templates/slides/app/i18n/zh-TW.ts +9 -22
  137. package/corpus/templates/slides/server/handlers/import-figma-system.ts +44 -12
  138. package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
  139. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +1 -1
  140. package/dist/application-state/handlers.js +1 -1
  141. package/dist/application-state/handlers.js.map +1 -1
  142. package/dist/brand-kit/index.d.ts +1 -1
  143. package/dist/brand-kit/index.js +1 -1
  144. package/dist/brand-kit/index.js.map +1 -1
  145. package/dist/cli/skills.d.ts.map +1 -1
  146. package/dist/cli/skills.js +18 -0
  147. package/dist/cli/skills.js.map +1 -1
  148. package/dist/client/AgentPanel.js +1 -1
  149. package/dist/client/AgentPanel.js.map +1 -1
  150. package/dist/client/MultiTabAssistantChat.js +1 -1
  151. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  152. package/dist/client/extensions/portable-extension.d.ts +1 -1
  153. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  154. package/dist/client/extensions/portable-extension.js.map +1 -1
  155. package/dist/code-agents/transcript-normalizer.js +1 -1
  156. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  157. package/dist/collab/awareness.d.ts +2 -2
  158. package/dist/collab/awareness.d.ts.map +1 -1
  159. package/dist/extensions/path.d.ts +1 -1
  160. package/dist/extensions/path.d.ts.map +1 -1
  161. package/dist/extensions/path.js.map +1 -1
  162. package/dist/integrations/a2a-continuation-processor.js +1 -1
  163. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  164. package/dist/mcp/build-server.d.ts +1 -1
  165. package/dist/mcp/build-server.d.ts.map +1 -1
  166. package/dist/mcp/build-server.js.map +1 -1
  167. package/dist/observability/routes.d.ts +3 -3
  168. package/dist/org/handlers.js +5 -5
  169. package/dist/org/handlers.js.map +1 -1
  170. package/dist/org/plugin.js +2 -2
  171. package/dist/org/plugin.js.map +1 -1
  172. package/dist/progress/routes.d.ts +1 -1
  173. package/dist/scripts/call-agent.js +1 -1
  174. package/dist/scripts/call-agent.js.map +1 -1
  175. package/dist/scripts/db/safety.js +1 -1
  176. package/dist/scripts/db/safety.js.map +1 -1
  177. package/dist/server/auth.d.ts.map +1 -1
  178. package/dist/server/auth.js +3 -0
  179. package/dist/server/auth.js.map +1 -1
  180. package/dist/server/builder-design-systems.d.ts +28 -0
  181. package/dist/server/builder-design-systems.d.ts.map +1 -0
  182. package/dist/server/builder-design-systems.js +217 -0
  183. package/dist/server/builder-design-systems.js.map +1 -0
  184. package/dist/server/core-routes-plugin.d.ts +1 -0
  185. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  186. package/dist/server/core-routes-plugin.js +20 -3
  187. package/dist/server/core-routes-plugin.js.map +1 -1
  188. package/dist/server/index.d.ts +1 -0
  189. package/dist/server/index.d.ts.map +1 -1
  190. package/dist/server/index.js +1 -0
  191. package/dist/server/index.js.map +1 -1
  192. package/dist/server/transcribe-voice.d.ts +1 -1
  193. package/dist/styles/agent-native.css +14 -7
  194. package/dist/usage/store.js +2 -2
  195. package/dist/usage/store.js.map +1 -1
  196. package/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  197. package/docs/content/locales/ar-SA/template-design.mdx +14 -1
  198. package/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  199. package/docs/content/locales/de-DE/template-design.mdx +15 -1
  200. package/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  201. package/docs/content/locales/es-ES/template-design.mdx +15 -1
  202. package/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  203. package/docs/content/locales/fr-FR/template-design.mdx +15 -1
  204. package/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  205. package/docs/content/locales/hi-IN/template-design.mdx +15 -1
  206. package/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  207. package/docs/content/locales/ja-JP/template-design.mdx +16 -1
  208. package/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  209. package/docs/content/locales/ko-KR/template-design.mdx +14 -1
  210. package/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  211. package/docs/content/locales/pt-BR/template-design.mdx +14 -1
  212. package/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  213. package/docs/content/locales/zh-CN/template-design.mdx +14 -1
  214. package/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  215. package/docs/content/locales/zh-TW/template-design.mdx +14 -1
  216. package/docs/content/skills-guide.mdx +5 -0
  217. package/docs/content/template-design.mdx +14 -1
  218. package/package.json +1 -1
  219. package/corpus/templates/design/actions/import-figma-file.ts +0 -166
  220. package/corpus/templates/slides/server/lib/fig-design-system.ts +0 -110
@@ -606,6 +606,16 @@ const EDITOR_CHROME_BRIDGE_SCRIPT = `
606
606
  return false;
607
607
  }
608
608
 
609
+ function matchesExactSelectorList(el, selectors) {
610
+ if (!el || !selectors || selectors.length === 0) return false;
611
+ for (var i = 0; i < selectors.length; i += 1) {
612
+ try {
613
+ if (el.matches(selectors[i])) return true;
614
+ } catch (_err) {}
615
+ }
616
+ return false;
617
+ }
618
+
609
619
  function isLayerInteractionBlocked(el) {
610
620
  return matchesSelectorList(el, lockedSelectors) || matchesSelectorList(el, hiddenSelectors);
611
621
  }
@@ -666,16 +676,30 @@ const EDITOR_CHROME_BRIDGE_SCRIPT = `
666
676
  var currentMatch = null;
667
677
  var nextMatch = null;
668
678
  var matchedSelector = '';
679
+ var fallbackCurrentMatch = null;
680
+ var fallbackSelector = '';
669
681
  for (var matchIndex = 0; matchIndex < activeCandidates.length; matchIndex += 1) {
670
682
  try {
671
- currentMatch = document.querySelector(activeCandidates[matchIndex]);
672
- nextMatch = nextDoc.querySelector(activeCandidates[matchIndex]);
673
- matchedSelector = activeCandidates[matchIndex];
683
+ var currentCandidate = document.querySelector(activeCandidates[matchIndex]);
684
+ var nextCandidate = nextDoc.querySelector(activeCandidates[matchIndex]);
685
+ if (currentCandidate && !fallbackCurrentMatch) {
686
+ fallbackCurrentMatch = currentCandidate;
687
+ fallbackSelector = activeCandidates[matchIndex];
688
+ }
689
+ if (currentCandidate && nextCandidate) {
690
+ currentMatch = currentCandidate;
691
+ nextMatch = nextCandidate;
692
+ matchedSelector = activeCandidates[matchIndex];
693
+ break;
694
+ }
674
695
  } catch (_err) {
675
- currentMatch = null;
676
- nextMatch = null;
696
+ // Keep trying later aliases; bridge selectors can differ between
697
+ // runtime and DOMParser passes.
677
698
  }
678
- if (currentMatch) break;
699
+ }
700
+ if (!currentMatch && fallbackCurrentMatch) {
701
+ currentMatch = fallbackCurrentMatch;
702
+ matchedSelector = fallbackSelector;
679
703
  }
680
704
  if (
681
705
  currentMatch &&
@@ -1018,7 +1042,13 @@ const EDITOR_CHROME_BRIDGE_SCRIPT = `
1018
1042
  });
1019
1043
  }
1020
1044
  if (selector && candidates.indexOf(selector) === -1) candidates.push(selector);
1021
- if (selectedEl && document.documentElement.contains(selectedEl)) return selectedEl;
1045
+ if (
1046
+ selectedEl &&
1047
+ document.documentElement.contains(selectedEl) &&
1048
+ (candidates.length === 0 || matchesExactSelectorList(selectedEl, candidates))
1049
+ ) {
1050
+ return selectedEl;
1051
+ }
1022
1052
  for (var i = 0; i < candidates.length; i += 1) {
1023
1053
  try {
1024
1054
  var match = document.querySelector(candidates[i]);
@@ -1739,7 +1769,12 @@ const EDITOR_CHROME_BRIDGE_SCRIPT = `
1739
1769
  if (e.data.selector && candidates.indexOf(String(e.data.selector)) === -1) {
1740
1770
  candidates.push(String(e.data.selector));
1741
1771
  }
1742
- var target = null;
1772
+ var target =
1773
+ selectedEl &&
1774
+ document.documentElement.contains(selectedEl) &&
1775
+ matchesExactSelectorList(selectedEl, candidates)
1776
+ ? selectedEl
1777
+ : null;
1743
1778
  for (var i = 0; i < candidates.length && !target; i += 1) {
1744
1779
  try {
1745
1780
  var matches = document.querySelectorAll(candidates[i]);
@@ -1758,7 +1793,35 @@ const EDITOR_CHROME_BRIDGE_SCRIPT = `
1758
1793
  window.parent.postMessage({ type: 'element-select', payload: selectedInfo }, '*');
1759
1794
  return;
1760
1795
  }
1761
- if (e.data.type === 'layer-states') {
1796
+ if (e.data.type === 'hover-element') {
1797
+ var hoverCandidates = [];
1798
+ if (Array.isArray(e.data.selectorCandidates)) {
1799
+ e.data.selectorCandidates.forEach(function(selector) {
1800
+ if (typeof selector === 'string' && selector && hoverCandidates.indexOf(selector) === -1) {
1801
+ hoverCandidates.push(selector);
1802
+ }
1803
+ });
1804
+ }
1805
+ if (e.data.selector && hoverCandidates.indexOf(String(e.data.selector)) === -1) {
1806
+ hoverCandidates.push(String(e.data.selector));
1807
+ }
1808
+ if (hoverCandidates.length === 0) {
1809
+ hoveredEl = null;
1810
+ highlightOverlay.style.display = 'none';
1811
+ hideMeasurements();
1812
+ return;
1813
+ }
1814
+ var hoverTarget = findRuntimeTarget(String(e.data.selector || ''), hoverCandidates);
1815
+ hoveredEl = hoverTarget;
1816
+ if (hoveredEl && !isLayerInteractionBlocked(hoveredEl)) {
1817
+ positionOverlay(highlightOverlay, hoveredEl);
1818
+ } else {
1819
+ highlightOverlay.style.display = 'none';
1820
+ hideMeasurements();
1821
+ }
1822
+ return;
1823
+ }
1824
+ if (e.data.type === 'layer-states') {
1762
1825
  lockedSelectors = Array.isArray(e.data.lockedSelectors) ? e.data.lockedSelectors.filter(function(item) { return typeof item === 'string'; }) : [];
1763
1826
  hiddenSelectors = Array.isArray(e.data.hiddenSelectors) ? e.data.hiddenSelectors.filter(function(item) { return typeof item === 'string'; }) : [];
1764
1827
  if (selectedEl && isLayerInteractionBlocked(selectedEl)) {
@@ -230,8 +230,9 @@ export function DesignExtensionsPanel({
230
230
 
231
231
  return (
232
232
  <div className={cn("flex min-h-0 flex-1 flex-col", className)}>
233
- <div className="flex h-10 shrink-0 items-center justify-between gap-2 border-b border-border/90 px-3">
234
- <h3 className="min-w-0 flex-1 truncate text-[13px] font-semibold text-foreground">
233
+ {/* Section header 32 px tall, matches PanelSection / Figma inspector headers */}
234
+ <div className="flex min-h-8 shrink-0 items-center gap-1.5 border-b border-border/60 px-3">
235
+ <h3 className="min-w-0 flex-1 truncate text-xs font-semibold text-foreground">
235
236
  {t("designEditor.extensions")}
236
237
  </h3>
237
238
  <Tooltip>
@@ -240,7 +241,7 @@ export function DesignExtensionsPanel({
240
241
  href="https://www.agent-native.com/docs/extensions"
241
242
  target="_blank"
242
243
  rel="noreferrer"
243
- className="inline-flex size-7 items-center justify-center rounded-sm text-muted-foreground hover:bg-accent hover:text-foreground"
244
+ className="inline-flex size-6 cursor-pointer items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
244
245
  aria-label={t("designEditor.extensionsDocs")}
245
246
  >
246
247
  <IconExternalLink className="size-3.5" />
@@ -255,39 +256,42 @@ export function DesignExtensionsPanel({
255
256
  />
256
257
  </div>
257
258
 
258
- <div className="design-inspector-scroll min-h-0 flex-1 overflow-y-auto overscroll-contain px-3 py-3">
259
+ <div className="design-inspector-scroll min-h-0 flex-1 overflow-y-auto overscroll-contain px-3 pb-2 pt-1.5">
259
260
  {isLoading ? (
260
- <div className="space-y-3">
261
- <Skeleton className="h-24 rounded-lg" />
262
- <Skeleton className="h-32 rounded-lg" />
261
+ <div className="space-y-1.5">
262
+ <Skeleton className="h-24 rounded" />
263
+ <Skeleton className="h-32 rounded" />
263
264
  </div>
264
265
  ) : installs.length === 0 ? (
265
- <div className="flex min-h-[18rem] flex-col items-center justify-center rounded-lg border border-dashed border-border/80 bg-muted/20 px-3 py-8 text-center">
266
- <div className="mb-3 flex size-10 items-center justify-center rounded-lg border border-border/70 bg-background text-muted-foreground">
267
- <IconPuzzle className="size-5" />
266
+ /* Empty state compact, matches TweaksPanel empty style */
267
+ <div className="flex flex-col items-center gap-2 py-6 text-center">
268
+ <div className="flex size-8 items-center justify-center rounded-lg bg-muted/60">
269
+ <IconPuzzle className="size-4 text-muted-foreground/70" />
268
270
  </div>
269
- <p className="text-sm font-semibold text-foreground">
270
- {t("designEditor.extensionsEmptyTitle")}
271
- </p>
272
- <p className="mt-1 max-w-[14rem] text-xs leading-relaxed text-muted-foreground">
273
- {t("designEditor.extensionsEmptyDescription")}
274
- </p>
275
- <div className="mt-4 flex flex-wrap items-center justify-center gap-2">
271
+ <div>
272
+ <p className="text-[11px] font-medium text-foreground">
273
+ {t("designEditor.extensionsEmptyTitle")}
274
+ </p>
275
+ <p className="mt-0.5 text-[11px] leading-snug text-muted-foreground">
276
+ {t("designEditor.extensionsEmptyDescription")}
277
+ </p>
278
+ </div>
279
+ <div className="flex flex-wrap items-center justify-center gap-1.5">
276
280
  <Button
277
281
  type="button"
278
282
  size="sm"
279
- className="h-8 cursor-pointer text-xs"
283
+ className="h-6 cursor-pointer px-2.5 text-[11px]"
280
284
  onClick={() => setCreateOpen(true)}
281
285
  >
282
- <IconPlus className="size-3.5" />
286
+ <IconPlus className="size-3" />
283
287
  {t("designEditor.addExtension")}
284
288
  </Button>
285
289
  <Button
286
290
  asChild
287
291
  type="button"
288
- variant="ghost"
292
+ variant="outline"
289
293
  size="sm"
290
- className="h-8 cursor-pointer text-xs"
294
+ className="h-6 cursor-pointer px-2.5 text-[11px]"
291
295
  >
292
296
  <a
293
297
  href="https://www.agent-native.com/docs/extensions"
@@ -300,7 +304,7 @@ export function DesignExtensionsPanel({
300
304
  </div>
301
305
  </div>
302
306
  ) : (
303
- <div className="space-y-3">
307
+ <div className="space-y-1.5">
304
308
  {installs.map((install) => (
305
309
  <EmbeddedExtension
306
310
  key={install.installId}
@@ -308,38 +312,36 @@ export function DesignExtensionsPanel({
308
312
  slotId={slotId}
309
313
  context={context}
310
314
  initialHeight={180}
311
- className="overflow-hidden rounded-lg border border-border bg-background"
315
+ className="overflow-hidden rounded border border-border bg-background"
312
316
  />
313
317
  ))}
314
318
  </div>
315
319
  )}
316
320
 
317
321
  {installable.length > 0 ? (
318
- <div className="mt-4 border-t border-border/70 pt-3">
319
- <p className="mb-2 text-[11px] font-semibold uppercase text-muted-foreground">
322
+ <div className="mt-3 border-t border-border/60 pt-1.5">
323
+ <p className="mb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
320
324
  {t("designEditor.extensionsAvailable")}
321
325
  </p>
322
- <div className="space-y-1.5">
326
+ <div className="space-y-px">
323
327
  {installable.map((extension) => (
324
328
  <button
325
329
  key={extension.extensionId}
326
330
  type="button"
327
331
  disabled={installingId === extension.extensionId}
328
332
  onClick={() => installExtension(extension.extensionId)}
329
- className="flex w-full cursor-pointer items-center gap-2 rounded-md border border-border/70 bg-background px-2.5 py-2 text-left hover:bg-accent disabled:cursor-default disabled:opacity-60"
333
+ className="flex h-6 w-full cursor-pointer items-center gap-1.5 rounded px-2 text-left transition-colors hover:bg-accent active:bg-accent/80 disabled:cursor-default disabled:opacity-50"
330
334
  >
331
- <IconSparkles className="size-3.5 shrink-0 text-muted-foreground" />
332
- <span className="min-w-0 flex-1">
333
- <span className="block truncate text-xs font-medium text-foreground">
334
- {extension.name}
335
- </span>
336
- {extension.description ? (
337
- <span className="block truncate text-[11px] text-muted-foreground">
338
- {extension.description}
339
- </span>
340
- ) : null}
335
+ <IconSparkles className="size-3 shrink-0 text-muted-foreground" />
336
+ <span className="min-w-0 flex-1 truncate text-[11px] font-medium text-foreground">
337
+ {extension.name}
341
338
  </span>
342
- <span className="text-[11px] font-medium text-muted-foreground">
339
+ {extension.description ? (
340
+ <span className="hidden truncate text-[11px] text-muted-foreground sm:block">
341
+ {extension.description}
342
+ </span>
343
+ ) : null}
344
+ <span className="shrink-0 text-[11px] text-muted-foreground">
343
345
  {t("designEditor.extensionsInstall")}
344
346
  </span>
345
347
  </button>
@@ -371,7 +373,7 @@ function CreateExtensionPopover({
371
373
  type="button"
372
374
  variant="ghost"
373
375
  size="icon"
374
- className="size-7 rounded-sm text-muted-foreground hover:bg-accent hover:text-foreground"
376
+ className="size-6 rounded text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
375
377
  aria-label={t("designEditor.addExtension")}
376
378
  >
377
379
  <IconPlus className="size-3.5" />