@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.
- package/corpus/README.md +1 -1
- package/corpus/templates/clips/.agents/skills/recording/SKILL.md +53 -0
- package/corpus/templates/clips/actions/import-loom-recording.ts +7 -0
- package/corpus/templates/clips/actions/lib/loom-import-job.ts +24 -4
- package/corpus/templates/clips/app/components/import-menu.tsx +109 -0
- package/corpus/templates/clips/app/components/library/library-grid.tsx +8 -18
- package/corpus/templates/clips/app/components/library/library-layout.tsx +14 -50
- package/corpus/templates/clips/app/components/library/sort-menu.tsx +20 -6
- package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +10 -34
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +0 -2
- package/corpus/templates/clips/changelog/2026-08-03-restart-during-a-recording-now-immediately-starts-a-fresh-ta.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-04-cleaner-library-controls-with-an-icon-only-sort-button.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-04-upload-and-loom-imports-now-live-under-one-import-menu.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +81 -30
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +436 -158
- package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +14 -1
- package/corpus/templates/clips/server/plugins/auth.ts +9 -0
- package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +13 -0
- package/corpus/templates/content/actions/_database-utils.ts +6 -0
- package/corpus/templates/content/actions/bind-content-database-source-field.ts +273 -97
- package/corpus/templates/content/actions/change-content-database-source-role.ts +65 -29
- package/corpus/templates/content/actions/configure-document-property.ts +113 -32
- package/corpus/templates/content/actions/delete-content-database.ts +5 -7
- package/corpus/templates/content/actions/delete-document-property.ts +109 -62
- package/corpus/templates/content/actions/delete-document.ts +178 -36
- package/corpus/templates/content/actions/duplicate-database-item.ts +27 -0
- package/corpus/templates/content/actions/duplicate-database-items.ts +31 -1
- package/corpus/templates/content/actions/permanently-delete-document.ts +4 -6
- package/corpus/templates/content/actions/remove-database-items.ts +13 -0
- package/corpus/templates/content/actions/set-document-property.ts +69 -1
- package/corpus/templates/content/actions/upsert-database-item-by-key.ts +814 -0
- package/corpus/templates/content/parity/matrix.md +1 -1
- package/corpus/templates/content/parity/matrix.ts +1 -0
- package/corpus/templates/content/server/db/schema.ts +27 -0
- package/corpus/templates/content/server/plugins/db.ts +24 -0
- package/corpus/templates/design/app/components/design/BreakpointBar.tsx +122 -114
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +2 -2
- package/corpus/templates/design/app/components/design/EditPanel.tsx +68 -34
- package/corpus/templates/design/app/components/design/KeyboardShortcutsPanel.tsx +78 -4
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +8 -0
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +5 -2
- package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +10 -9
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +31 -69
- package/corpus/templates/design/app/components/design/inspector/design-icons.tsx +80 -106
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +4 -0
- package/corpus/templates/design/app/hooks/use-editor-preferences.ts +75 -0
- package/corpus/templates/design/app/i18n-data.ts +8 -0
- package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +61 -0
- package/corpus/templates/design/app/pages/design-editor/editor-preferences.ts +98 -0
- package/corpus/templates/design/app/pages/design-editor/nudge-intent.ts +491 -0
- package/corpus/templates/design/app/pages/design-editor/paste-placement.ts +133 -0
- package/corpus/templates/design/app/pages/design-editor/png-export-render.ts +8 -0
- package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -12
- package/corpus/templates/design/changelog/2026-08-03-arrow-keys-now-reorder-a-layer-inside-an-auto-layout-frame.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-auto-layout-flow-icons-show-the-direction-at-a-glance-instea.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-auto-layout-icons-share-one-outlined-square-style-so-flow-ga.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-export-has-a-named-preview-section-you-can-expand-replacing-.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-export-preview-shows-the-selected-element-instead-of-the-who.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-inspector-sections-show-an-expand-indicator-so-it-is-clear-w.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-paste-lands-inside-a-selected-frame-instead-of-beside-it.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-the-add-breakpoint-button-sits-outside-the-breakpoint-select.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-the-agent-s-follow-up-questions-keep-space-below-the-continu.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-the-agent-s-follow-up-questions-share-the-chat-panel-s-backg.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-the-export-panel-no-longer-stacks-a-duplicate-export-block-o.md +6 -0
- package/corpus/templates/design/changelog/2026-08-03-the-text-tool-uses-a-t-icon-matching-the-letter-it-inserts.md +6 -0
- package/corpus/templates/factory/.env.example +17 -0
- package/corpus/templates/factory/AGENTS.md +27 -17
- package/corpus/templates/factory/README.md +19 -9
- package/corpus/templates/factory/actions/get-slack-feedback-context.ts +90 -0
- package/corpus/templates/factory/actions/get-triage-config.ts +14 -3
- package/corpus/templates/factory/actions/govern-agent-native-pull-request.ts +386 -0
- package/corpus/templates/factory/actions/list-factory-automations.ts +53 -0
- package/corpus/templates/factory/actions/list-triage-items.ts +7 -2
- package/corpus/templates/factory/actions/poll-github-sources.ts +203 -0
- package/corpus/templates/factory/actions/poll-sentry-errors.ts +161 -0
- package/corpus/templates/factory/actions/poll-slack-channel.ts +4 -2
- package/corpus/templates/factory/actions/run-factory-automation.ts +42 -0
- package/corpus/templates/factory/actions/save-factory-automation.ts +69 -0
- package/corpus/templates/factory/actions/save-triage-config.ts +28 -2
- package/corpus/templates/factory/actions/start-builder-for-item.ts +411 -0
- package/corpus/templates/factory/app/components/factory/FactoryCanvas.tsx +14 -3
- package/corpus/templates/factory/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/factory/app/hooks/use-navigation-state.ts +7 -0
- package/corpus/templates/factory/app/i18n/en-US.ts +35 -1
- package/corpus/templates/factory/app/routes/factory.tsx +462 -9
- package/corpus/templates/factory/changelog/2026-08-04-added-organization-owned-factory-automations-for-slack-bug-t.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-04-automation-editor-controls-and-model-picker.md +6 -0
- package/corpus/templates/factory/netlify.toml +2 -2
- package/corpus/templates/factory/server/connectors/credentials.ts +6 -5
- package/corpus/templates/factory/server/connectors/slack.ts +133 -5
- package/corpus/templates/factory/server/db/schema.ts +6 -0
- package/corpus/templates/factory/server/lib/require-factory-automation.ts +65 -0
- package/corpus/templates/factory/server/plugins/agent-chat.ts +29 -11
- package/corpus/templates/factory/server/plugins/auth.ts +1 -0
- package/corpus/templates/factory/server/plugins/factory-migrations.ts +12 -0
- package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +218 -67
- package/corpus/templates/factory/server/triage/builder-executor.ts +4 -0
- package/corpus/templates/factory/server/triage/contracts.ts +14 -1
- package/corpus/templates/factory/server/triage/github-client.ts +404 -0
- package/corpus/templates/factory/server/triage/metadata.ts +44 -0
- package/corpus/templates/factory/server/triage/pr-babysit.ts +5 -5
- package/corpus/templates/factory/server/triage/pr-policy.ts +144 -0
- package/corpus/templates/factory/server/triage/sentry-client.ts +180 -0
- package/corpus/templates/factory/server/triage/slack-client.ts +43 -0
- package/corpus/templates/factory/server/triage/slack-poller.ts +9 -2
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +27 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/references/canvas.md +14 -4
- package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +7 -0
- package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +7 -0
- package/corpus/templates/plan/actions/create-plan-design.ts +8 -6
- package/corpus/templates/plan/actions/create-prototype-plan.ts +8 -6
- package/corpus/templates/plan/actions/create-ui-plan.ts +7 -7
- package/corpus/templates/plan/actions/get-plan-blocks.ts +7 -1
- package/corpus/templates/plan/actions/validate-plan-input.ts +39 -0
- package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +167 -11
- package/corpus/templates/plan/app/i18n/en-US.ts +1 -0
- package/corpus/templates/plan/changelog/2026-08-04-canvas-zoom-controls-now-explain-the-command-ctrl-plus-scrol.md +6 -0
- package/corpus/templates/plan/changelog/2026-08-04-pinch-to-zoom-is-now-supported-on-touchscreens-in-visual-pla.md +6 -0
- package/corpus/templates/plan/shared/plan-content.ts +17 -2
- package/dist/cli/skills-content/canvas.d.ts +3 -3
- package/dist/cli/skills-content/canvas.js +16 -5
- package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js +27 -0
- package/dist/cli/skills-content/wireframe.d.ts +2 -2
- package/dist/cli/skills-content/wireframe.js +7 -0
- package/dist/client/AgentPanel.js +23 -8
- package/dist/client/api-path.d.ts +6 -0
- package/dist/client/api-path.js +55 -0
- package/dist/client/onboarding/FirstRunOnboarding.d.ts +3 -0
- package/dist/client/onboarding/FirstRunOnboarding.js +93 -0
- package/dist/client/onboarding/first-run-enabled.d.ts +2 -0
- package/dist/client/onboarding/first-run-enabled.js +9 -0
- package/dist/client/onboarding/index.d.ts +2 -1
- package/dist/client/onboarding/index.js +1 -0
- package/dist/client/onboarding/use-onboarding.d.ts +6 -1
- package/dist/client/onboarding/use-onboarding.js +32 -1
- package/dist/client/route-state.js +10 -0
- package/dist/client/settings/SecretsSection.js +32 -8
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/connections/catalog.d.ts +4 -4
- package/dist/connections/catalog.js +3 -3
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.js +1 -1
- package/dist/localization/default-messages.d.ts +5 -0
- package/dist/localization/default-messages.js +5 -0
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/observability/routes.d.ts +3 -3
- package/dist/onboarding/app-profile.d.ts +4 -0
- package/dist/onboarding/app-profile.js +378 -0
- package/dist/onboarding/index.d.ts +2 -1
- package/dist/onboarding/index.js +1 -0
- package/dist/onboarding/plugin.d.ts +2 -0
- package/dist/onboarding/plugin.js +21 -1
- package/dist/onboarding/types.d.ts +19 -0
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +9 -9
- package/dist/provider-api/actions/provider-api.d.ts +12 -12
- package/dist/secrets/routes.d.ts +2 -2
- package/dist/secrets/routes.js +41 -17
- package/dist/server/auth.js +21 -1
- package/dist/server/better-auth-instance.d.ts +3 -2
- package/dist/server/better-auth-instance.js +9 -7
- package/dist/server/email-markdown.js +3 -8
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/shared/first-run-onboarding.d.ts +3 -0
- package/dist/shared/first-run-onboarding.js +3 -0
- package/dist/triggers/index.d.ts +3 -0
- package/dist/triggers/index.js +5 -0
- package/docs/content/cross-app-sso.mdx +26 -0
- 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<
|
|
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":
|
|
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
|
-
|
|
85
|
-
|
|
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
|
|
656
|
-
*
|
|
657
|
-
*
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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: [
|
|
2009
|
-
right: [
|
|
2010
|
-
bottom: [
|
|
2011
|
-
left: [
|
|
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="
|
|
2034
|
-
<line x1={x1} y1={y1} x2={x2} y2={y2}
|
|
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
|
|
2024
|
+
/** Distribute spacing (space-between) along each axis. */
|
|
2040
2025
|
function IconDistributeH() {
|
|
2041
2026
|
return (
|
|
2042
2027
|
<svg
|
|
2043
|
-
viewBox="0 0
|
|
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.
|
|
2033
|
+
strokeWidth="1.5"
|
|
2049
2034
|
strokeLinecap="round"
|
|
2035
|
+
strokeLinejoin="round"
|
|
2050
2036
|
aria-hidden="true"
|
|
2051
2037
|
>
|
|
2052
|
-
|
|
2053
|
-
<line x1="
|
|
2054
|
-
|
|
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
|
|
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.
|
|
2053
|
+
strokeWidth="1.5"
|
|
2081
2054
|
strokeLinecap="round"
|
|
2055
|
+
strokeLinejoin="round"
|
|
2082
2056
|
aria-hidden="true"
|
|
2083
2057
|
>
|
|
2084
|
-
|
|
2085
|
-
<line x1="
|
|
2086
|
-
|
|
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
|
}
|