@agent-native/core 0.136.4 → 0.137.0

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 (170) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +53 -0
  3. package/corpus/templates/clips/actions/import-loom-recording.ts +7 -0
  4. package/corpus/templates/clips/actions/lib/loom-import-job.ts +24 -4
  5. package/corpus/templates/clips/app/components/import-menu.tsx +109 -0
  6. package/corpus/templates/clips/app/components/library/library-grid.tsx +8 -18
  7. package/corpus/templates/clips/app/components/library/library-layout.tsx +14 -50
  8. package/corpus/templates/clips/app/components/library/sort-menu.tsx +20 -6
  9. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +10 -34
  10. package/corpus/templates/clips/app/routes/_app.library._index.tsx +0 -2
  11. package/corpus/templates/clips/changelog/2026-08-03-restart-during-a-recording-now-immediately-starts-a-fresh-ta.md +6 -0
  12. package/corpus/templates/clips/changelog/2026-08-04-cleaner-library-controls-with-an-icon-only-sort-button.md +6 -0
  13. package/corpus/templates/clips/changelog/2026-08-04-upload-and-loom-imports-now-live-under-one-import-menu.md +6 -0
  14. package/corpus/templates/clips/desktop/src/app.tsx +81 -30
  15. package/corpus/templates/clips/desktop/src/lib/recorder.ts +436 -158
  16. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +14 -1
  17. package/corpus/templates/clips/server/plugins/auth.ts +9 -0
  18. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +13 -0
  19. package/corpus/templates/content/actions/_database-utils.ts +6 -0
  20. package/corpus/templates/content/actions/bind-content-database-source-field.ts +273 -97
  21. package/corpus/templates/content/actions/change-content-database-source-role.ts +65 -29
  22. package/corpus/templates/content/actions/configure-document-property.ts +113 -32
  23. package/corpus/templates/content/actions/delete-content-database.ts +5 -7
  24. package/corpus/templates/content/actions/delete-document-property.ts +109 -62
  25. package/corpus/templates/content/actions/delete-document.ts +178 -36
  26. package/corpus/templates/content/actions/duplicate-database-item.ts +27 -0
  27. package/corpus/templates/content/actions/duplicate-database-items.ts +31 -1
  28. package/corpus/templates/content/actions/permanently-delete-document.ts +4 -6
  29. package/corpus/templates/content/actions/remove-database-items.ts +13 -0
  30. package/corpus/templates/content/actions/set-document-property.ts +69 -1
  31. package/corpus/templates/content/actions/upsert-database-item-by-key.ts +814 -0
  32. package/corpus/templates/content/parity/matrix.md +1 -1
  33. package/corpus/templates/content/parity/matrix.ts +1 -0
  34. package/corpus/templates/content/server/db/schema.ts +27 -0
  35. package/corpus/templates/content/server/plugins/db.ts +24 -0
  36. package/corpus/templates/design/app/components/design/BreakpointBar.tsx +122 -114
  37. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +2 -2
  38. package/corpus/templates/design/app/components/design/EditPanel.tsx +68 -34
  39. package/corpus/templates/design/app/components/design/KeyboardShortcutsPanel.tsx +78 -4
  40. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +8 -0
  41. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +5 -2
  42. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +10 -9
  43. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +31 -69
  44. package/corpus/templates/design/app/components/design/inspector/design-icons.tsx +80 -106
  45. package/corpus/templates/design/app/components/design/multi-screen/types.ts +4 -0
  46. package/corpus/templates/design/app/hooks/use-editor-preferences.ts +75 -0
  47. package/corpus/templates/design/app/i18n-data.ts +8 -0
  48. package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +61 -0
  49. package/corpus/templates/design/app/pages/design-editor/editor-preferences.ts +98 -0
  50. package/corpus/templates/design/app/pages/design-editor/nudge-intent.ts +491 -0
  51. package/corpus/templates/design/app/pages/design-editor/paste-placement.ts +133 -0
  52. package/corpus/templates/design/app/pages/design-editor/png-export-render.ts +8 -0
  53. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -12
  54. package/corpus/templates/design/changelog/2026-08-03-arrow-keys-now-reorder-a-layer-inside-an-auto-layout-frame.md +6 -0
  55. package/corpus/templates/design/changelog/2026-08-03-auto-layout-flow-icons-show-the-direction-at-a-glance-instea.md +6 -0
  56. package/corpus/templates/design/changelog/2026-08-03-auto-layout-icons-share-one-outlined-square-style-so-flow-ga.md +6 -0
  57. package/corpus/templates/design/changelog/2026-08-03-export-has-a-named-preview-section-you-can-expand-replacing-.md +6 -0
  58. package/corpus/templates/design/changelog/2026-08-03-export-preview-shows-the-selected-element-instead-of-the-who.md +6 -0
  59. package/corpus/templates/design/changelog/2026-08-03-inspector-sections-show-an-expand-indicator-so-it-is-clear-w.md +6 -0
  60. package/corpus/templates/design/changelog/2026-08-03-paste-lands-inside-a-selected-frame-instead-of-beside-it.md +6 -0
  61. package/corpus/templates/design/changelog/2026-08-03-the-add-breakpoint-button-sits-outside-the-breakpoint-select.md +6 -0
  62. package/corpus/templates/design/changelog/2026-08-03-the-agent-s-follow-up-questions-keep-space-below-the-continu.md +6 -0
  63. package/corpus/templates/design/changelog/2026-08-03-the-agent-s-follow-up-questions-share-the-chat-panel-s-backg.md +6 -0
  64. package/corpus/templates/design/changelog/2026-08-03-the-export-panel-no-longer-stacks-a-duplicate-export-block-o.md +6 -0
  65. package/corpus/templates/design/changelog/2026-08-03-the-text-tool-uses-a-t-icon-matching-the-letter-it-inserts.md +6 -0
  66. package/corpus/templates/factory/.env.example +17 -0
  67. package/corpus/templates/factory/AGENTS.md +27 -17
  68. package/corpus/templates/factory/README.md +19 -9
  69. package/corpus/templates/factory/actions/get-slack-feedback-context.ts +90 -0
  70. package/corpus/templates/factory/actions/get-triage-config.ts +14 -3
  71. package/corpus/templates/factory/actions/govern-agent-native-pull-request.ts +386 -0
  72. package/corpus/templates/factory/actions/list-factory-automations.ts +53 -0
  73. package/corpus/templates/factory/actions/list-triage-items.ts +7 -2
  74. package/corpus/templates/factory/actions/poll-github-sources.ts +203 -0
  75. package/corpus/templates/factory/actions/poll-sentry-errors.ts +161 -0
  76. package/corpus/templates/factory/actions/poll-slack-channel.ts +4 -2
  77. package/corpus/templates/factory/actions/run-factory-automation.ts +42 -0
  78. package/corpus/templates/factory/actions/save-factory-automation.ts +69 -0
  79. package/corpus/templates/factory/actions/save-triage-config.ts +28 -2
  80. package/corpus/templates/factory/actions/start-builder-for-item.ts +411 -0
  81. package/corpus/templates/factory/app/components/factory/FactoryCanvas.tsx +14 -3
  82. package/corpus/templates/factory/app/components/ui/checkbox.tsx +1 -0
  83. package/corpus/templates/factory/app/hooks/use-navigation-state.ts +7 -0
  84. package/corpus/templates/factory/app/i18n/en-US.ts +35 -1
  85. package/corpus/templates/factory/app/routes/factory.tsx +462 -9
  86. package/corpus/templates/factory/changelog/2026-08-04-added-organization-owned-factory-automations-for-slack-bug-t.md +6 -0
  87. package/corpus/templates/factory/changelog/2026-08-04-automation-editor-controls-and-model-picker.md +6 -0
  88. package/corpus/templates/factory/netlify.toml +2 -2
  89. package/corpus/templates/factory/server/connectors/credentials.ts +6 -5
  90. package/corpus/templates/factory/server/connectors/slack.ts +133 -5
  91. package/corpus/templates/factory/server/db/schema.ts +6 -0
  92. package/corpus/templates/factory/server/lib/require-factory-automation.ts +65 -0
  93. package/corpus/templates/factory/server/plugins/agent-chat.ts +29 -11
  94. package/corpus/templates/factory/server/plugins/auth.ts +1 -0
  95. package/corpus/templates/factory/server/plugins/factory-migrations.ts +12 -0
  96. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +218 -67
  97. package/corpus/templates/factory/server/triage/builder-executor.ts +4 -0
  98. package/corpus/templates/factory/server/triage/contracts.ts +14 -1
  99. package/corpus/templates/factory/server/triage/github-client.ts +404 -0
  100. package/corpus/templates/factory/server/triage/metadata.ts +44 -0
  101. package/corpus/templates/factory/server/triage/pr-babysit.ts +5 -5
  102. package/corpus/templates/factory/server/triage/pr-policy.ts +144 -0
  103. package/corpus/templates/factory/server/triage/sentry-client.ts +180 -0
  104. package/corpus/templates/factory/server/triage/slack-client.ts +43 -0
  105. package/corpus/templates/factory/server/triage/slack-poller.ts +9 -2
  106. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +27 -0
  107. package/corpus/templates/plan/.agents/skills/visual-plan/references/canvas.md +14 -4
  108. package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +7 -0
  109. package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +7 -0
  110. package/corpus/templates/plan/actions/create-plan-design.ts +8 -6
  111. package/corpus/templates/plan/actions/create-prototype-plan.ts +8 -6
  112. package/corpus/templates/plan/actions/create-ui-plan.ts +7 -7
  113. package/corpus/templates/plan/actions/get-plan-blocks.ts +7 -1
  114. package/corpus/templates/plan/actions/validate-plan-input.ts +39 -0
  115. package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +167 -11
  116. package/corpus/templates/plan/app/i18n/en-US.ts +1 -0
  117. package/corpus/templates/plan/changelog/2026-08-04-canvas-zoom-controls-now-explain-the-command-ctrl-plus-scrol.md +6 -0
  118. package/corpus/templates/plan/changelog/2026-08-04-pinch-to-zoom-is-now-supported-on-touchscreens-in-visual-pla.md +6 -0
  119. package/corpus/templates/plan/shared/plan-content.ts +17 -2
  120. package/dist/cli/skills-content/canvas.d.ts +3 -3
  121. package/dist/cli/skills-content/canvas.js +16 -5
  122. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  123. package/dist/cli/skills-content/visual-plan-skill.js +27 -0
  124. package/dist/cli/skills-content/wireframe.d.ts +2 -2
  125. package/dist/cli/skills-content/wireframe.js +7 -0
  126. package/dist/client/AgentPanel.js +23 -8
  127. package/dist/client/api-path.d.ts +6 -0
  128. package/dist/client/api-path.js +55 -0
  129. package/dist/client/onboarding/FirstRunOnboarding.d.ts +3 -0
  130. package/dist/client/onboarding/FirstRunOnboarding.js +93 -0
  131. package/dist/client/onboarding/first-run-enabled.d.ts +2 -0
  132. package/dist/client/onboarding/first-run-enabled.js +9 -0
  133. package/dist/client/onboarding/index.d.ts +2 -1
  134. package/dist/client/onboarding/index.js +1 -0
  135. package/dist/client/onboarding/use-onboarding.d.ts +6 -1
  136. package/dist/client/onboarding/use-onboarding.js +32 -1
  137. package/dist/client/route-state.js +10 -0
  138. package/dist/client/settings/SecretsSection.js +32 -8
  139. package/dist/collab/struct-routes.d.ts +1 -1
  140. package/dist/connections/catalog.d.ts +4 -4
  141. package/dist/connections/catalog.js +3 -3
  142. package/dist/db/index.d.ts +1 -1
  143. package/dist/db/index.js +1 -1
  144. package/dist/localization/default-messages.d.ts +5 -0
  145. package/dist/localization/default-messages.js +5 -0
  146. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  147. package/dist/observability/routes.d.ts +3 -3
  148. package/dist/onboarding/app-profile.d.ts +4 -0
  149. package/dist/onboarding/app-profile.js +378 -0
  150. package/dist/onboarding/index.d.ts +2 -1
  151. package/dist/onboarding/index.js +1 -0
  152. package/dist/onboarding/plugin.d.ts +2 -0
  153. package/dist/onboarding/plugin.js +21 -1
  154. package/dist/onboarding/types.d.ts +19 -0
  155. package/dist/progress/routes.d.ts +1 -1
  156. package/dist/provider-api/actions/custom-provider-registration.d.ts +9 -9
  157. package/dist/provider-api/actions/provider-api.d.ts +12 -12
  158. package/dist/secrets/routes.d.ts +2 -2
  159. package/dist/secrets/routes.js +41 -17
  160. package/dist/server/auth.js +21 -1
  161. package/dist/server/better-auth-instance.d.ts +3 -2
  162. package/dist/server/better-auth-instance.js +9 -7
  163. package/dist/server/email-markdown.js +3 -8
  164. package/dist/server/transcribe-voice.d.ts +1 -1
  165. package/dist/shared/first-run-onboarding.d.ts +3 -0
  166. package/dist/shared/first-run-onboarding.js +3 -0
  167. package/dist/triggers/index.d.ts +3 -0
  168. package/dist/triggers/index.js +5 -0
  169. package/docs/content/cross-app-sso.mdx +26 -0
  170. package/package.json +1 -1
@@ -11,10 +11,9 @@ import {
11
11
  IconScale,
12
12
  IconScribble,
13
13
  IconSquare,
14
- IconTypography,
15
14
  IconX,
16
15
  } from "@tabler/icons-react";
17
- import { useEffect, useMemo, useRef, useState } from "react";
16
+ import { useEffect, useMemo, useRef, useState, type ReactNode } from "react";
18
17
 
19
18
  import { createCoreCommands } from "@/components/design/code-workbench/commands";
20
19
  import {
@@ -24,17 +23,34 @@ import {
24
23
  formatShortcutKeycaps,
25
24
  } from "@/components/design/keyboard-shortcuts";
26
25
  import { Button } from "@/components/ui/button";
26
+ import { Input } from "@/components/ui/input";
27
27
  import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
28
28
  import { isApplePlatform } from "@/hooks/useDesignHotkeys";
29
+ import {
30
+ MAX_NUDGE_AMOUNT,
31
+ MIN_NUDGE_AMOUNT,
32
+ normalizeNudgeAmount,
33
+ } from "@/pages/design-editor/editor-preferences";
34
+ import {
35
+ DEFAULT_NUDGE_AMOUNTS,
36
+ type NudgeAmounts,
37
+ } from "@/pages/design-editor/nudge-intent";
38
+
39
+ import { IconText } from "./inspector/design-icons";
29
40
 
30
41
  interface KeyboardShortcutsPanelProps {
31
42
  onClose: () => void;
43
+ nudgeAmounts?: NudgeAmounts;
44
+ onNudgeAmountsChange?: (next: NudgeAmounts) => void;
32
45
  }
33
46
 
34
- const TOOL_ICON_BY_SHORTCUT: Record<string, typeof IconPointer> = {
47
+ const TOOL_ICON_BY_SHORTCUT: Record<
48
+ string,
49
+ (props: { className?: string }) => ReactNode
50
+ > = {
35
51
  "move-tool": IconPointer,
36
52
  "frame-tool": IconFrame,
37
- "text-tool": IconTypography,
53
+ "text-tool": IconText,
38
54
  "pen-tool": IconPencil,
39
55
  "hand-tool": IconHandStop,
40
56
  "scale-tool": IconScale,
@@ -160,8 +176,60 @@ function ShortcutBindings({ bindings }: { bindings: readonly string[] }) {
160
176
  );
161
177
  }
162
178
 
179
+ function NudgeAmountFields({
180
+ amounts,
181
+ onChange,
182
+ }: {
183
+ amounts: NudgeAmounts;
184
+ onChange: (next: NudgeAmounts) => void;
185
+ }) {
186
+ const t = useT();
187
+ const field = (key: keyof NudgeAmounts, labelKey: string) => (
188
+ <label className="flex items-center gap-2 text-[11px] text-neutral-200">
189
+ <span className="min-w-20">{t(labelKey)}</span>
190
+ <Input
191
+ data-nudge-amount={key}
192
+ type="number"
193
+ min={MIN_NUDGE_AMOUNT}
194
+ max={MAX_NUDGE_AMOUNT}
195
+ value={amounts[key]}
196
+ onChange={(event) =>
197
+ onChange({
198
+ ...amounts,
199
+ [key]: normalizeNudgeAmount(event.target.value, amounts[key]),
200
+ })
201
+ }
202
+ className="h-7 w-20 bg-neutral-800 text-[11px] text-neutral-100"
203
+ />
204
+ <span className="text-neutral-400">
205
+ {t("designEditor.keyboardShortcuts.nudgeAmount.unit")}
206
+ </span>
207
+ </label>
208
+ );
209
+
210
+ return (
211
+ <section
212
+ data-nudge-amount-settings
213
+ className="mb-3 border-b border-neutral-800 pb-3"
214
+ >
215
+ <h3 className="mb-2 text-[11px] font-semibold text-neutral-100">
216
+ {t("designEditor.keyboardShortcuts.nudgeAmount.title")}
217
+ </h3>
218
+ <div className="flex flex-col gap-2">
219
+ {field("small", "designEditor.keyboardShortcuts.nudgeAmount.small")}
220
+ {field("big", "designEditor.keyboardShortcuts.nudgeAmount.big")}
221
+ </div>
222
+ <p className="mt-2 text-[10px] leading-4 text-neutral-400">
223
+ {t("designEditor.keyboardShortcuts.nudgeAmount.description")}
224
+ </p>
225
+ </section>
226
+ );
227
+ }
228
+
163
229
  export function KeyboardShortcutsPanel({
164
230
  onClose,
231
+ nudgeAmounts = DEFAULT_NUDGE_AMOUNTS,
232
+ onNudgeAmountsChange,
165
233
  }: KeyboardShortcutsPanelProps) {
166
234
  const t = useT();
167
235
  const [category, setCategory] = useState<DesignShortcutCategory>("essential");
@@ -313,6 +381,12 @@ export function KeyboardShortcutsPanel({
313
381
  data-shortcuts-content-column
314
382
  className="mx-auto max-w-[400px]"
315
383
  >
384
+ {categoryId === "cursor" && onNudgeAmountsChange ? (
385
+ <NudgeAmountFields
386
+ amounts={nudgeAmounts}
387
+ onChange={onNudgeAmountsChange}
388
+ />
389
+ ) : null}
316
390
  {designRows.map((item) => (
317
391
  <div
318
392
  data-shortcut-id={item.id}
@@ -181,6 +181,7 @@ const MAX_WHEEL_PAN_DELTA = 140;
181
181
  * number as the var's fallback, so first paint and SSR are unaffected. */
182
182
  const CHROME_SCALE_CSS_VAR = "--an-chrome-scale";
183
183
  const PIXEL_GRID_ZOOM = 800;
184
+
184
185
  import {
185
186
  BOARD_SURFACE_BACKGROUND,
186
187
  getBoardContentKey,
@@ -450,6 +451,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
450
451
  onPrimitiveReparent,
451
452
  onCreateScreenFrame,
452
453
  onDeleteSelection,
454
+ onNudgeSelection,
453
455
  onZoomChange,
454
456
  renderScreenContent,
455
457
  renderBreakpointContent,
@@ -527,6 +529,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
527
529
  } | null>(null);
528
530
  const onGeometryChangeRef = useRef(onGeometryChange);
529
531
  const onGeometryCommitRef = useRef(onGeometryCommit);
532
+ const onNudgeSelectionRef = useRef(onNudgeSelection);
530
533
  const screensRef = useRef(screens);
531
534
  const [draftPrimitives, setDraftPrimitives] = useState<DraftPrimitive[]>([]);
532
535
  const draftPrimitivesRef = useRef(draftPrimitives);
@@ -1080,6 +1083,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
1080
1083
  onGeometryCommitRef.current = onGeometryCommit;
1081
1084
  }, [onGeometryCommit]);
1082
1085
 
1086
+ useEffect(() => {
1087
+ onNudgeSelectionRef.current = onNudgeSelection;
1088
+ }, [onNudgeSelection]);
1089
+
1083
1090
  useEffect(() => {
1084
1091
  onPrimitiveReparentRef.current = onPrimitiveReparent;
1085
1092
  }, [onPrimitiveReparent]);
@@ -7084,6 +7091,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
7084
7091
  draftPrimitivesRef.current.some((draft) => draft.id === id),
7085
7092
  );
7086
7093
  if (targetIds.length === 0 && targetDraftIds.length === 0) return;
7094
+ if (onNudgeSelectionRef.current?.(targetIds) === false) return;
7087
7095
 
7088
7096
  event.preventDefault();
7089
7097
  event.stopPropagation();
@@ -81,8 +81,11 @@ export function QuestionFlow({
81
81
  : Math.round((answeredCount / guidedQuestions.length) * 100);
82
82
 
83
83
  return (
84
- <div className="flex h-full w-full justify-center overflow-y-auto bg-transparent px-5 py-8 text-[13px] text-foreground sm:px-8 lg:px-10">
85
- <main className="w-full max-w-[820px] pb-8">
84
+ /* `items-start` is what makes the trailing space real: stretched, this
85
+ column overflows its own padding box, so its `pb` renders above the
86
+ overflow and the scroll container's `py` bottom is dropped. */
87
+ <div className="flex h-full w-full items-start justify-center overflow-y-auto bg-transparent px-5 py-8 text-[13px] text-foreground sm:px-8 lg:px-10">
88
+ <main className="w-full max-w-[820px] pb-16">
86
89
  <div className="mb-6 border-b border-[var(--design-editor-panel-divider-color)] pb-5">
87
90
  <h2 className="text-[22px] font-semibold leading-7 tracking-normal text-foreground sm:text-2xl sm:leading-8">
88
91
  {title ?? t("questionFlow.defaultTitle")}
@@ -3,6 +3,7 @@ import {
3
3
  rgbaToCss,
4
4
  withColorOpacity,
5
5
  } from "@shared/color-utils";
6
+ import { IconChevronDown, IconChevronRight } from "@tabler/icons-react";
6
7
  import { useEffect, useRef, useState, type ReactNode } from "react";
7
8
 
8
9
  import { Input } from "@/components/ui/input";
@@ -652,14 +653,9 @@ export function PropSlider({
652
653
  }
653
654
 
654
655
  /**
655
- * design-editor inspector section. Matches the design editor "Design" panel chrome:
656
- * - NO left collapse chevron (the design editor uses none).
657
- * - A thin divider line above each section.
658
- * - A bold left-aligned title.
659
- * - Right-aligned action icons (add layer, toggles, styles, etc.).
660
- *
661
- * The title is still clickable to collapse the body (design sections collapse
662
- * on title click) but renders no chevron glyph, just the same way.
656
+ * design-editor inspector section: divider above, title left, actions right.
657
+ * Without the leading chevron a collapsed section is indistinguishable from a
658
+ * section with nothing to show, so the panel reads as fixed, not expandable.
663
659
  */
664
660
  export function PanelSection({
665
661
  title,
@@ -679,10 +675,15 @@ export function PanelSection({
679
675
  <div className="flex min-h-9 items-center gap-2 px-3">
680
676
  <button
681
677
  type="button"
682
- className="flex min-w-0 flex-1 cursor-pointer items-center bg-transparent text-left"
678
+ className="flex min-w-0 flex-1 cursor-pointer items-center gap-1 bg-transparent text-left"
683
679
  onClick={() => setCollapsed((c) => !c)}
684
680
  aria-expanded={!collapsed}
685
681
  >
682
+ {collapsed ? (
683
+ <IconChevronRight className="size-3 shrink-0 text-muted-foreground/50 rtl:-scale-x-100" />
684
+ ) : (
685
+ <IconChevronDown className="size-3 shrink-0 text-muted-foreground/50" />
686
+ )}
686
687
  <h3 className="min-w-0 flex-1 truncate !text-[11px] font-semibold text-foreground">
687
688
  {title}
688
689
  </h3>
@@ -28,6 +28,7 @@ import type {
28
28
  import {
29
29
  IconFlowGrid,
30
30
  IconFlowHorizontal,
31
+ IconFlowNormal,
31
32
  IconFlowVertical,
32
33
  IconGap,
33
34
  IconPaddingHorizontal,
@@ -431,7 +432,7 @@ export function AutoLayoutMatrix({
431
432
  disabled={disabled}
432
433
  onClick={() => selectFlow("normal")}
433
434
  >
434
- <IconFlowNormal />
435
+ <IconFlowNormal className="size-4" />
435
436
  </FlowButton>
436
437
  <FlowButton
437
438
  label={copy.vertical}
@@ -439,7 +440,7 @@ export function AutoLayoutMatrix({
439
440
  disabled={disabled}
440
441
  onClick={() => selectFlow("vertical")}
441
442
  >
442
- <IconFlowVertical className="size-3.5" />
443
+ <IconFlowVertical className="size-4" />
443
444
  </FlowButton>
444
445
  <FlowButton
445
446
  label={copy.horizontal}
@@ -447,7 +448,7 @@ export function AutoLayoutMatrix({
447
448
  disabled={disabled}
448
449
  onClick={() => selectFlow("horizontal")}
449
450
  >
450
- <IconFlowHorizontal className="size-3.5" />
451
+ <IconFlowHorizontal className="size-4" />
451
452
  </FlowButton>
452
453
  <FlowButton
453
454
  label={"Grid" /* i18n-ignore design inspector label */}
@@ -455,7 +456,7 @@ export function AutoLayoutMatrix({
455
456
  disabled={disabled}
456
457
  onClick={() => selectFlow("grid")}
457
458
  >
458
- <IconFlowGrid className="size-3.5" />
459
+ <IconFlowGrid className="size-4" />
459
460
  </FlowButton>
460
461
  </div>
461
462
  {/* Swap axis: flips between horizontal/vertical flex flow
@@ -1853,7 +1854,7 @@ function CheckMini() {
1853
1854
  <path
1854
1855
  d="M2.5 7.5 L5.5 10.5 L11.5 3.5"
1855
1856
  stroke="currentColor"
1856
- strokeWidth="1.6"
1857
+ strokeWidth="1.5"
1857
1858
  strokeLinecap="round"
1858
1859
  strokeLinejoin="round"
1859
1860
  />
@@ -1879,7 +1880,7 @@ function ChevronDownMini() {
1879
1880
  <path
1880
1881
  d="M1.5 3 L4 5.5 L6.5 3"
1881
1882
  stroke="currentColor"
1882
- strokeWidth="1.2"
1883
+ strokeWidth="1.5"
1883
1884
  strokeLinecap="round"
1884
1885
  strokeLinejoin="round"
1885
1886
  />
@@ -1887,23 +1888,6 @@ function ChevronDownMini() {
1887
1888
  );
1888
1889
  }
1889
1890
 
1890
- /** Normal / free-flow layout glyph — loosely placed small rects. */
1891
- function IconFlowNormal() {
1892
- return (
1893
- <svg
1894
- viewBox="0 0 24 24"
1895
- width={14}
1896
- height={14}
1897
- fill="currentColor"
1898
- aria-hidden="true"
1899
- >
1900
- <rect x="4" y="4" width="6" height="6" rx="1.5" />
1901
- <rect x="14" y="6" width="6" height="6" rx="1.5" />
1902
- <rect x="6" y="14" width="6" height="6" rx="1.5" />
1903
- </svg>
1904
- );
1905
- }
1906
-
1907
1891
  /** Resize-to-fit diagonal arrows. */
1908
1892
  function IconResizeToFitMini() {
1909
1893
  return (
@@ -1913,7 +1897,7 @@ function IconResizeToFitMini() {
1913
1897
  height={16}
1914
1898
  fill="none"
1915
1899
  stroke="currentColor"
1916
- strokeWidth="1.6"
1900
+ strokeWidth="1.5"
1917
1901
  strokeLinecap="round"
1918
1902
  strokeLinejoin="round"
1919
1903
  aria-hidden="true"
@@ -1935,7 +1919,7 @@ function IconSlidersMini() {
1935
1919
  height={16}
1936
1920
  fill="none"
1937
1921
  stroke="currentColor"
1938
- strokeWidth="1.6"
1922
+ strokeWidth="1.5"
1939
1923
  strokeLinecap="round"
1940
1924
  strokeLinejoin="round"
1941
1925
  aria-hidden="true"
@@ -1957,7 +1941,7 @@ function IconPaddingLinked() {
1957
1941
  height={16}
1958
1942
  fill="none"
1959
1943
  stroke="currentColor"
1960
- strokeWidth="1.6"
1944
+ strokeWidth="1.5"
1961
1945
  strokeLinecap="round"
1962
1946
  strokeLinejoin="round"
1963
1947
  aria-hidden="true"
@@ -1977,7 +1961,7 @@ function IconPaddingUnlinked() {
1977
1961
  height={16}
1978
1962
  fill="none"
1979
1963
  stroke="currentColor"
1980
- strokeWidth="1.6"
1964
+ strokeWidth="1.5"
1981
1965
  strokeLinecap="round"
1982
1966
  strokeLinejoin="round"
1983
1967
  aria-hidden="true"
@@ -2004,11 +1988,12 @@ function IconPaddingLeftMini({ className }: { className?: string }) {
2004
1988
 
2005
1989
  type PaddingSide = "top" | "right" | "bottom" | "left";
2006
1990
 
1991
+ /** Inset line for each side, matching IconPaddingHorizontal/Vertical. */
2007
1992
  const PADDING_EDGE: Record<PaddingSide, [number, number, number, number]> = {
2008
- top: [4, 4, 20, 4],
2009
- right: [20, 4, 20, 20],
2010
- bottom: [4, 20, 20, 20],
2011
- left: [4, 4, 4, 20],
1993
+ top: [8, 7.5, 16, 7.5],
1994
+ right: [16.5, 8, 16.5, 16],
1995
+ bottom: [8, 16.5, 16, 16.5],
1996
+ left: [7.5, 8, 7.5, 16],
2012
1997
  };
2013
1998
 
2014
1999
  function PaddingSideGlyph({
@@ -2030,72 +2015,49 @@ function PaddingSideGlyph({
2030
2015
  strokeLinejoin="round"
2031
2016
  aria-hidden="true"
2032
2017
  >
2033
- <rect x="4" y="4" width="16" height="16" rx="2" opacity="0.4" />
2034
- <line x1={x1} y1={y1} x2={x2} y2={y2} strokeWidth="3" />
2018
+ <rect x="3.5" y="3.5" width="17" height="17" rx="1.5" />
2019
+ <line x1={x1} y1={y1} x2={x2} y2={y2} />
2035
2020
  </svg>
2036
2021
  );
2037
2022
  }
2038
2023
 
2039
- /** Distribute horizontal spacing (space-between on main/cross axis). */
2024
+ /** Distribute spacing (space-between) along each axis. */
2040
2025
  function IconDistributeH() {
2041
2026
  return (
2042
2027
  <svg
2043
- viewBox="0 0 14 14"
2028
+ viewBox="0 0 24 24"
2044
2029
  width={14}
2045
2030
  height={14}
2046
2031
  fill="none"
2047
2032
  stroke="currentColor"
2048
- strokeWidth="1.2"
2033
+ strokeWidth="1.5"
2049
2034
  strokeLinecap="round"
2035
+ strokeLinejoin="round"
2050
2036
  aria-hidden="true"
2051
2037
  >
2052
- {/* left edge line */}
2053
- <line x1="1.5" y1="2" x2="1.5" y2="12" />
2054
- {/* right edge line */}
2055
- <line x1="12.5" y1="2" x2="12.5" y2="12" />
2056
- {/* center block */}
2057
- <rect
2058
- x="4.5"
2059
- y="4"
2060
- width="5"
2061
- height="6"
2062
- rx="1"
2063
- fill="currentColor"
2064
- stroke="none"
2065
- opacity="0.5"
2066
- />
2038
+ <line x1="3" y1="4" x2="3" y2="20" />
2039
+ <line x1="21" y1="4" x2="21" y2="20" />
2040
+ <rect x="8" y="7" width="8" height="10" rx="1" />
2067
2041
  </svg>
2068
2042
  );
2069
2043
  }
2070
2044
 
2071
- /** Distribute vertical spacing (space-between on cross/main axis). */
2072
2045
  function IconDistributeV() {
2073
2046
  return (
2074
2047
  <svg
2075
- viewBox="0 0 14 14"
2048
+ viewBox="0 0 24 24"
2076
2049
  width={14}
2077
2050
  height={14}
2078
2051
  fill="none"
2079
2052
  stroke="currentColor"
2080
- strokeWidth="1.2"
2053
+ strokeWidth="1.5"
2081
2054
  strokeLinecap="round"
2055
+ strokeLinejoin="round"
2082
2056
  aria-hidden="true"
2083
2057
  >
2084
- {/* top edge line */}
2085
- <line x1="2" y1="1.5" x2="12" y2="1.5" />
2086
- {/* bottom edge line */}
2087
- <line x1="2" y1="12.5" x2="12" y2="12.5" />
2088
- {/* center block */}
2089
- <rect
2090
- x="4"
2091
- y="4.5"
2092
- width="6"
2093
- height="5"
2094
- rx="1"
2095
- fill="currentColor"
2096
- stroke="none"
2097
- opacity="0.5"
2098
- />
2058
+ <line x1="4" y1="3" x2="20" y2="3" />
2059
+ <line x1="4" y1="21" x2="20" y2="21" />
2060
+ <rect x="7" y="8" width="10" height="8" rx="1" />
2099
2061
  </svg>
2100
2062
  );
2101
2063
  }