From 0dd379c271e84125ab60ce555c35a019877eb4ef Mon Sep 17 00:00:00 2001 From: Pavel Date: Fri, 25 Sep 2026 12:26:39 +0400 Subject: [PATCH] phase 3 --- frontend/DESIGN.md | 259 ++++++-- frontend/eslint.config.js | 7 + frontend/src/App.tsx | 2 +- frontend/src/Navigation.tsx | 53 +- frontend/src/admin/AdminUI.tsx | 6 +- frontend/src/admin/Usage.tsx | 10 +- frontend/src/admin/Users.tsx | 121 ++-- frontend/src/agents/AgentCard.tsx | 266 ++------ frontend/src/agents/AgentsList.tsx | 7 +- frontend/src/agents/FolderCard.tsx | 88 +-- frontend/src/agents/NewAgent.tsx | 182 +++--- frontend/src/agents/SharedAgent.tsx | 2 +- frontend/src/agents/SharedAgentCard.tsx | 6 +- .../agents/components/GuardrailsSection.tsx | 160 +++-- .../agents/schedules/ScheduleFormModal.tsx | 49 +- .../src/agents/schedules/SchedulesView.tsx | 2 +- .../src/agents/workflow/WorkflowBuilder.tsx | 244 +++---- .../src/agents/workflow/WorkflowPreview.tsx | 23 +- .../agents/workflow/WorkflowRunArtifacts.tsx | 4 +- .../components/NodeDocumentsControl.tsx | 24 +- .../workflow/components/PromptTextArea.tsx | 179 +++--- frontend/src/agents/workflow/nodes/index.tsx | 2 +- frontend/src/assets/DragFileUpload.svg | 4 - frontend/src/assets/alert.svg | 3 - frontend/src/assets/arrow-down.svg | 3 - frontend/src/assets/arrow-full-right.svg | 3 - frontend/src/assets/arrow-left.svg | 3 - frontend/src/assets/arrow-right.svg | 3 - frontend/src/assets/book.svg | 3 - frontend/src/assets/calendar.svg | 4 - frontend/src/assets/check-circle-filled.svg | 3 - frontend/src/assets/checkMark2.svg | 3 - frontend/src/assets/checkmark.svg | 1 - frontend/src/assets/chevron-down.svg | 1 - frontend/src/assets/chevron-right.svg | 3 - frontend/src/assets/circle-check.svg | 1 - frontend/src/assets/circle-x.svg | 1 - frontend/src/assets/clip.svg | 3 - frontend/src/assets/cloud.svg | 11 - frontend/src/assets/copy.svg | 3 - frontend/src/assets/cross.svg | 1 - frontend/src/assets/disc.svg | 3 - frontend/src/assets/dislike.svg | 4 - frontend/src/assets/document.svg | 3 - frontend/src/assets/double-arrow-left.svg | 5 - frontend/src/assets/double-arrow-right.svg | 5 - frontend/src/assets/download.svg | 5 - frontend/src/assets/dropdown-arrow.svg | 3 - frontend/src/assets/duplicate.svg | 4 - frontend/src/assets/edit.svg | 3 - frontend/src/assets/envelope.svg | 3 - frontend/src/assets/external-link.svg | 3 - frontend/src/assets/eye-view.svg | 11 - frontend/src/assets/file.svg | 3 - frontend/src/assets/folder.svg | 3 - frontend/src/assets/full-logo.svg | 26 - frontend/src/assets/images.svg | 3 - frontend/src/assets/info.svg | 3 - frontend/src/assets/like.svg | 4 - frontend/src/assets/link-gray.svg | 3 - frontend/src/assets/link.svg | 3 - frontend/src/assets/logo.svg | 18 - frontend/src/assets/monitoring.svg | 3 - frontend/src/assets/pin.svg | 1 - frontend/src/assets/red-trash.svg | 3 - frontend/src/assets/redirect.svg | 3 - frontend/src/assets/rounded-tick.svg | 3 - frontend/src/assets/single-left-arrow.svg | 3 - frontend/src/assets/single-right-arrow.svg | 3 - frontend/src/assets/source.svg | 4 - frontend/src/assets/sources.svg | 25 - frontend/src/assets/speaker.svg | 4 - frontend/src/assets/stopspeech.svg | 5 - frontend/src/assets/sync.svg | 1 - frontend/src/assets/three-dots.svg | 3 - frontend/src/assets/tool.svg | 6 - frontend/src/assets/trash.svg | 3 - frontend/src/assets/unpin.svg | 1 - frontend/src/assets/upload.svg | 3 - frontend/src/assets/user.svg | 27 - frontend/src/assets/warn.svg | 3 - frontend/src/components/ActionButtons.tsx | 4 +- frontend/src/components/AdminRoute.tsx | 2 +- frontend/src/components/ArtifactSidebar.tsx | 2 +- frontend/src/components/Chunks.tsx | 32 +- frontend/src/components/ConfigFields.tsx | 46 +- frontend/src/components/ConnectorTree.tsx | 22 +- .../src/components/DocumentArtifactView.tsx | 26 +- .../components/DocumentPagination.test.tsx | 16 + .../src/components/DocumentPagination.tsx | 38 +- frontend/src/components/FilePicker.test.tsx | 12 +- frontend/src/components/FilePicker.tsx | 392 ++++++------ frontend/src/components/FileTree.tsx | 22 +- frontend/src/components/FileUpload.tsx | 6 +- frontend/src/components/GoogleDrivePicker.tsx | 8 +- frontend/src/components/GraphView.tsx | 14 +- frontend/src/components/Help.tsx | 18 +- frontend/src/components/MessageInput.tsx | 11 +- .../components/MultiSelectPopover.test.tsx | 12 + .../src/components/MultiSelectPopover.tsx | 17 +- frontend/src/components/Notification.tsx | 11 +- frontend/src/components/ProfileButton.tsx | 5 +- frontend/src/components/SkeletonLoader.tsx | 72 ++- .../src/components/SourcesPopoverFooter.tsx | 4 +- frontend/src/components/Spinner.tsx | 15 - .../src/components/TextToSpeechButton.tsx | 14 +- frontend/src/components/WikiViewer.tsx | 24 +- .../message-input/AttachFileButton.tsx | 8 +- .../message-input/AttachmentChipList.tsx | 10 +- .../message-input/SourcesTrigger.tsx | 8 +- .../components/message-input/ToolsTrigger.tsx | 16 +- frontend/src/components/tree/TreeBrowser.tsx | 112 +--- frontend/src/components/tree/types.ts | 13 +- frontend/src/components/ui/accordion.test.tsx | 7 + frontend/src/components/ui/accordion.tsx | 6 +- frontend/src/components/ui/alert.test.tsx | 17 +- frontend/src/components/ui/alert.tsx | 74 +-- frontend/src/components/ui/breadcrumb.tsx | 4 +- frontend/src/components/ui/button.test.tsx | 91 +++ frontend/src/components/ui/button.tsx | 76 ++- frontend/src/components/ui/card.test.tsx | 10 + frontend/src/components/ui/card.tsx | 6 +- frontend/src/components/ui/checkbox.test.tsx | 54 ++ frontend/src/components/ui/checkbox.tsx | 52 ++ frontend/src/components/ui/dialog.test.tsx | 67 ++ frontend/src/components/ui/dialog.tsx | 20 +- .../src/components/ui/dropdown-menu.test.tsx | 111 ++++ frontend/src/components/ui/dropdown-menu.tsx | 98 ++- frontend/src/components/ui/dropzone.test.tsx | 17 + frontend/src/components/ui/dropzone.tsx | 14 +- frontend/src/components/ui/feedback.test.tsx | 88 --- .../src/components/ui/form-field.test.tsx | 159 +++++ frontend/src/components/ui/form-field.tsx | 139 ++++ frontend/src/components/ui/input.test.tsx | 22 + frontend/src/components/ui/input.tsx | 40 +- frontend/src/components/ui/modal.test.tsx | 222 +++++++ frontend/src/components/ui/modal.tsx | 154 ++++- .../src/components/ui/multi-select.test.tsx | 63 ++ frontend/src/components/ui/multi-select.tsx | 30 +- .../src/components/ui/overlay-chrome.test.tsx | 129 ++++ frontend/src/components/ui/popover.tsx | 25 +- frontend/src/components/ui/progress.test.tsx | 39 ++ frontend/src/components/ui/progress.tsx | 1 + frontend/src/components/ui/select.test.tsx | 51 ++ frontend/src/components/ui/select.tsx | 78 ++- .../src/components/ui/setting-row.test.tsx | 92 +++ frontend/src/components/ui/setting-row.tsx | 89 +++ frontend/src/components/ui/sheet.test.tsx | 104 +++ frontend/src/components/ui/sheet.tsx | 49 +- frontend/src/components/ui/skeleton.test.tsx | 14 + frontend/src/components/ui/spinner.test.tsx | 15 + frontend/src/components/ui/switch.tsx | 4 +- frontend/src/components/ui/table.test.tsx | 60 ++ frontend/src/components/ui/table.tsx | 139 ++-- frontend/src/components/ui/tabs.test.tsx | 83 +++ frontend/src/components/ui/tabs.tsx | 56 +- frontend/src/components/ui/textarea.test.tsx | 19 +- frontend/src/components/ui/textarea.tsx | 20 +- .../src/components/ui/time-picker.test.tsx | 34 + frontend/src/components/ui/time-picker.tsx | 7 +- frontend/src/components/ui/toast.test.tsx | 20 + frontend/src/components/ui/toast.tsx | 4 +- frontend/src/components/ui/tooltip.test.tsx | 19 + frontend/src/conversation/AnswerFlow.tsx | 5 +- .../conversation/ConversationBubble.test.tsx | 5 +- .../src/conversation/ConversationBubble.tsx | 133 ++-- .../src/conversation/ConversationMessages.tsx | 12 +- .../src/conversation/ConversationTile.tsx | 89 +-- frontend/src/conversation/MarkdownAnswer.tsx | 2 +- .../src/conversation/SharedConversation.tsx | 10 +- frontend/src/design/DesignSystem.tsx | 260 +++++++- frontend/src/index.css | 12 + frontend/src/lib/utils.test.ts | 39 ++ frontend/src/lib/utils.ts | 15 + frontend/src/locale/de.json | 15 +- frontend/src/locale/en.json | 15 +- frontend/src/locale/es.json | 15 +- frontend/src/locale/jp.json | 15 +- frontend/src/locale/ru.json | 15 +- frontend/src/locale/zh-TW.json | 15 +- frontend/src/locale/zh.json | 15 +- .../src/modals/AccessTokenCreatedModal.tsx | 21 +- frontend/src/modals/AddActionModal.tsx | 22 +- frontend/src/modals/AddToolModal.tsx | 2 +- frontend/src/modals/AgentDetailsModal.tsx | 58 +- frontend/src/modals/ConfigToolModal.tsx | 39 +- frontend/src/modals/ConfirmationModal.tsx | 36 +- .../src/modals/CreateAccessTokenModal.tsx | 160 ++--- frontend/src/modals/CustomModelModal.tsx | 602 ++++++++---------- frontend/src/modals/FolderManagementModal.tsx | 32 +- frontend/src/modals/ImportAgentModal.tsx | 67 +- frontend/src/modals/ImportSpecModal.tsx | 95 ++- frontend/src/modals/MCPServerModal.tsx | 477 ++++++-------- .../src/modals/MoveToFolderModal.test.tsx | 8 +- frontend/src/modals/MoveToFolderModal.tsx | 14 +- .../src/modals/RegenerateAccessTokenModal.tsx | 94 +-- .../src/modals/ShareConversationModal.tsx | 20 +- frontend/src/navigation/SectionIndexPage.tsx | 6 +- frontend/src/navigation/SectionNav.tsx | 9 +- frontend/src/navigation/SectionPageHeader.tsx | 4 +- frontend/src/navigation/SectionRail.tsx | 4 +- frontend/src/preferences/PromptsModal.tsx | 270 +++----- frontend/src/settings/Analytics.tsx | 24 +- frontend/src/settings/ConvertToWikiModal.tsx | 126 ++-- frontend/src/settings/CustomModels.tsx | 107 +--- frontend/src/settings/EnableGraphRAGModal.tsx | 148 ++--- frontend/src/settings/General.tsx | 6 +- frontend/src/settings/Logs.tsx | 9 +- frontend/src/settings/PairDeviceModal.tsx | 26 +- .../src/settings/PersonalAccessTokens.tsx | 12 +- frontend/src/settings/Prompts.tsx | 26 +- frontend/src/settings/RemoteDeviceConfig.tsx | 9 +- frontend/src/settings/SourceConfigModal.tsx | 198 +++--- frontend/src/settings/Sources.tsx | 144 +---- frontend/src/settings/Teams.tsx | 136 ++-- frontend/src/settings/TestRetrievalModal.tsx | 21 +- frontend/src/settings/ToolConfig.tsx | 138 ++-- frontend/src/settings/Tools.tsx | 122 +--- .../settings/components/RetrievalOptions.tsx | 62 +- frontend/src/settings/traces/TraceSheet.tsx | 2 +- frontend/src/teams/ShareToTeamModal.tsx | 8 +- frontend/src/teams/TeamSwitcher.tsx | 17 +- frontend/src/upload/Upload.tsx | 48 +- 223 files changed, 5297 insertions(+), 4598 deletions(-) delete mode 100644 frontend/src/assets/DragFileUpload.svg delete mode 100644 frontend/src/assets/alert.svg delete mode 100644 frontend/src/assets/arrow-down.svg delete mode 100644 frontend/src/assets/arrow-full-right.svg delete mode 100644 frontend/src/assets/arrow-left.svg delete mode 100644 frontend/src/assets/arrow-right.svg delete mode 100644 frontend/src/assets/book.svg delete mode 100644 frontend/src/assets/calendar.svg delete mode 100644 frontend/src/assets/check-circle-filled.svg delete mode 100644 frontend/src/assets/checkMark2.svg delete mode 100644 frontend/src/assets/checkmark.svg delete mode 100644 frontend/src/assets/chevron-down.svg delete mode 100644 frontend/src/assets/chevron-right.svg delete mode 100644 frontend/src/assets/circle-check.svg delete mode 100644 frontend/src/assets/circle-x.svg delete mode 100644 frontend/src/assets/clip.svg delete mode 100644 frontend/src/assets/cloud.svg delete mode 100644 frontend/src/assets/copy.svg delete mode 100644 frontend/src/assets/cross.svg delete mode 100644 frontend/src/assets/disc.svg delete mode 100644 frontend/src/assets/dislike.svg delete mode 100644 frontend/src/assets/document.svg delete mode 100644 frontend/src/assets/double-arrow-left.svg delete mode 100644 frontend/src/assets/double-arrow-right.svg delete mode 100644 frontend/src/assets/download.svg delete mode 100644 frontend/src/assets/dropdown-arrow.svg delete mode 100644 frontend/src/assets/duplicate.svg delete mode 100644 frontend/src/assets/edit.svg delete mode 100644 frontend/src/assets/envelope.svg delete mode 100644 frontend/src/assets/external-link.svg delete mode 100644 frontend/src/assets/eye-view.svg delete mode 100644 frontend/src/assets/file.svg delete mode 100644 frontend/src/assets/folder.svg delete mode 100644 frontend/src/assets/full-logo.svg delete mode 100644 frontend/src/assets/images.svg delete mode 100644 frontend/src/assets/info.svg delete mode 100644 frontend/src/assets/like.svg delete mode 100644 frontend/src/assets/link-gray.svg delete mode 100644 frontend/src/assets/link.svg delete mode 100644 frontend/src/assets/logo.svg delete mode 100644 frontend/src/assets/monitoring.svg delete mode 100644 frontend/src/assets/pin.svg delete mode 100644 frontend/src/assets/red-trash.svg delete mode 100644 frontend/src/assets/redirect.svg delete mode 100644 frontend/src/assets/rounded-tick.svg delete mode 100644 frontend/src/assets/single-left-arrow.svg delete mode 100644 frontend/src/assets/single-right-arrow.svg delete mode 100644 frontend/src/assets/source.svg delete mode 100644 frontend/src/assets/sources.svg delete mode 100644 frontend/src/assets/speaker.svg delete mode 100644 frontend/src/assets/stopspeech.svg delete mode 100644 frontend/src/assets/sync.svg delete mode 100644 frontend/src/assets/three-dots.svg delete mode 100644 frontend/src/assets/tool.svg delete mode 100644 frontend/src/assets/trash.svg delete mode 100644 frontend/src/assets/unpin.svg delete mode 100644 frontend/src/assets/upload.svg delete mode 100644 frontend/src/assets/user.svg delete mode 100644 frontend/src/assets/warn.svg delete mode 100644 frontend/src/components/Spinner.tsx create mode 100644 frontend/src/components/ui/checkbox.test.tsx create mode 100644 frontend/src/components/ui/checkbox.tsx create mode 100644 frontend/src/components/ui/dialog.test.tsx create mode 100644 frontend/src/components/ui/dropdown-menu.test.tsx delete mode 100644 frontend/src/components/ui/feedback.test.tsx create mode 100644 frontend/src/components/ui/form-field.test.tsx create mode 100644 frontend/src/components/ui/form-field.tsx create mode 100644 frontend/src/components/ui/modal.test.tsx create mode 100644 frontend/src/components/ui/multi-select.test.tsx create mode 100644 frontend/src/components/ui/overlay-chrome.test.tsx create mode 100644 frontend/src/components/ui/progress.test.tsx create mode 100644 frontend/src/components/ui/setting-row.test.tsx create mode 100644 frontend/src/components/ui/setting-row.tsx create mode 100644 frontend/src/components/ui/sheet.test.tsx create mode 100644 frontend/src/components/ui/skeleton.test.tsx create mode 100644 frontend/src/components/ui/spinner.test.tsx create mode 100644 frontend/src/components/ui/table.test.tsx create mode 100644 frontend/src/components/ui/tabs.test.tsx create mode 100644 frontend/src/components/ui/time-picker.test.tsx create mode 100644 frontend/src/components/ui/tooltip.test.tsx create mode 100644 frontend/src/lib/utils.test.ts diff --git a/frontend/DESIGN.md b/frontend/DESIGN.md index 81a41e0c..005438b1 100644 --- a/frontend/DESIGN.md +++ b/frontend/DESIGN.md @@ -23,23 +23,23 @@ through `@theme inline`, so `bg-`, `text-`, `border-`, `ring-`, `fill-` and `stroke-` all accept them, including opacity modifiers such as `bg-success/10`. One token class replaces a light + dark pair. -| Token | Use for | Replaces | -| --------------------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------- | -| `background`, `foreground` | page surface and primary text | `bg-white`, `text-gray-700/800/900`, `dark:text-gray-200/300` | -| `card`, `card-foreground` | raised surfaces (cards, dialogs, dropdowns) | `bg-white dark:bg-[#2b2c31]` | -| `popover`, `popover-foreground` | floating menus and popovers | same as card | -| `muted`, `muted-foreground` | quiet fills and secondary text, icons, placeholders, timestamps | `bg-gray-100/200`, `text-gray-400/500/600`, `dark:text-gray-400` | -| `accent`, `accent-foreground` | hover and selected fills | `hover:bg-gray-100`, `dark:hover:bg-gray-700` | -| `border`, `input`, `ring` | dividers, field borders, focus rings | `border-gray-200/300`, `dark:border-gray-600/700` | -| `primary`, `primary-foreground` | brand purple: primary actions, links, selected states | `bg-purple-*`, `text-purple-*`, `#7D54D1`, `#A076F6` | +| Token | Use for | Replaces | +| --------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `background`, `foreground` | page surface and primary text | `bg-white`, `text-gray-700/800/900`, `dark:text-gray-200/300` | +| `card`, `card-foreground` | raised surfaces (cards, dialogs, dropdowns) | `bg-white dark:bg-[#2b2c31]` | +| `popover`, `popover-foreground` | floating menus and popovers | same as card | +| `muted`, `muted-foreground` | quiet fills and secondary text, icons, placeholders, timestamps | `bg-gray-100/200`, `text-gray-400/500/600`, `dark:text-gray-400` | +| `accent`, `accent-foreground` | hover and selected fills | `hover:bg-gray-100`, `dark:hover:bg-gray-700` | +| `border`, `input`, `ring` | dividers, field borders, focus rings | `border-gray-200/300`, `dark:border-gray-600/700` | +| `primary`, `primary-foreground` | brand purple: primary actions, links, selected states | `bg-purple-*`, `text-purple-*`, `#7D54D1`, `#A076F6` | | `secondary`, `secondary-foreground` | pressed and active toggles (a brand tint), secondary buttons, the question bubble | `bg-accent` on an active icon button | -| `destructive`, `destructive-foreground` | errors, failed states, dangerous actions | `text-red-*`, `bg-red-50/100`, `#B42318`, `#E60000` | -| `success`, `success-foreground` | completed, active, healthy | `text-green-*`, `text-emerald-*`, `bg-green-50/100` | -| `warning`, `warning-foreground` | paused, pending review, degraded | `text-amber-*`, `text-yellow-*`, `text-orange-*`, `bg-amber-50/100` | -| `info`, `info-foreground` | running, informational | `text-blue-*`, `bg-blue-50/100` | -| `sidebar-*` | the navigation rail | | -| `chart-1` to `chart-5` | data series only, never UI chrome (see below) | | -| `answer-bubble` | assistant message background | | +| `destructive`, `destructive-foreground` | errors, failed states, dangerous actions | `text-red-*`, `bg-red-50/100`, `#B42318`, `#E60000` | +| `success`, `success-foreground` | completed, active, healthy | `text-green-*`, `text-emerald-*`, `bg-green-50/100` | +| `warning`, `warning-foreground` | paused, pending review, degraded | `text-amber-*`, `text-yellow-*`, `text-orange-*`, `bg-amber-50/100` | +| `info`, `info-foreground` | running, informational | `text-blue-*`, `bg-blue-50/100` | +| `sidebar-*` | the navigation rail | | +| `chart-1` to `chart-5` | data series only, never UI chrome (see below) | | +| `answer-bubble` | assistant message background | | Status colours are tuned to stay vivid rather than turning brown or olive, so their contrast is low. Against white in light mode, `destructive` and @@ -89,11 +89,11 @@ Patterns: ### Button (`ui/button.tsx`) -| Prop | Values | -| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `variant` | `default`, `secondary`, `outline`, `outline-primary`, `ghost`, `ghost-muted`, `ghost-destructive`, `link`, `destructive`, `destructive-outline`, `combobox`, `sidebar-item`, `tab`, `section-toggle` | -| `size` | `xs`, `sm`, `default`, `lg`, `field`, `icon-xs`, `icon-sm`, `icon`, `icon-lg`, `inline` | -| `shape` | `default` (rounded-md), `pill` (rounded-full, wider padding) | +| Prop | Values | +| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `variant` | `default`, `secondary`, `outline`, `outline-primary`, `ghost`, `ghost-muted`, `ghost-destructive`, `ghost-on-accent`, `ghost-destructive-on-accent`, `link`, `destructive`, `destructive-outline`, `combobox`, `sidebar-item`, `tab`, `section-toggle` | +| `size` | `xs`, `sm`, `default`, `lg`, `field`, `icon-xs`, `icon-sm`, `icon`, `icon-lg`, `inline` | +| `shape` | `default` (rounded-md), `pill` (rounded-full, wider padding) | - Round brand buttons (`rounded-3xl px-5`, `rounded-full px-6`): `shape="pill"`, plus `size="lg"` if they were `px-6`. @@ -102,6 +102,14 @@ Patterns: - Icon actions that remove something (a trash can on a member or shared resource row) are `variant="ghost-destructive"`: muted at rest, red on hover, so the warning shows even where the click deletes without asking. +- Icon buttons on a row that is already `bg-accent` or `bg-sidebar-accent` + while you point at it (a highlighted Command item, a card or tile with + `hover:bg-accent`, a hovered sidebar row) are `variant="ghost-on-accent"` + (delete: `ghost-destructive-on-accent`). They hover with a + `foreground/15` (`destructive/15`) tint, which shows on accent where + ghost's accent square would not. +- Icons are `lucide-react` at the default stroke (2). Don't pass + `strokeWidth`, and don't use an `` for a glyph lucide has. - Bordered purple buttons (`border-primary text-primary hover:bg-primary`): `variant="outline-primary"`. - Tiny inline actions (`h-auto px-2 py-1 text-xs`): `size="xs"`. @@ -117,9 +125,10 @@ Patterns: while `data-placeholder` is set (`data-placeholder={value ? undefined : ''}`). Pass only layout (`w-full justify-between`) and keep the chevron as the last child. -- A button or picker that sits in a row of fields is `size="field"`: 42px, - the height of `Input` (default) and `SelectTrigger size="lg"`, so a form - column has one height. With `shape="pill"` its text starts 21px in, like +- A button or picker that sits in a row of fields is `size="field"`: 42px. + `Input` and `SelectTrigger` take `size="field"` too (the same 42px as + Input `default` and SelectTrigger `lg`), so a form column has one name for + one height; prefer `field` in new form rows. With `shape="pill"` its text starts 21px in, like the Input and Select pills beside it. The agent form's pickers are `combobox field pill`, its Add button `outline-primary field pill`. - Rows in the navigation sidebar (`hover:bg-sidebar-accent … pl-3 gap-2.5 @@ -136,20 +145,37 @@ rounded-3xl`) are `variant="sidebar-item"`: left-aligned, full-radius, normal gives it `foreground` text and a `primary` underline. Padding-free tabs (a sub-nav with `gap-6`) add `size="inline"`, which keeps 4px above the line; the row draws the 1px baseline, and `-mb-px` lays the underline over it. - Tabs that switch a panel in place use `ui/tabs` instead. + Use them for a row of route links (the agent sub-nav: a `