Split the tremor import so only AreaChart/BarChart remain; replace the
Grid layout with Tailwind grid classes, Card with shadcn Card (adding
explicit p-6 to preserve tremor's default padding), Text with <p> tags,
and Title with <h3>. Swap raw text-gray-500/bg-gray-50 to semantic
text-muted-foreground/bg-muted. Update the test mock + heading level
query (Title used to render <h2>, now <h3>).
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
Refactors TeamsHeaderTabs to accept explicit panel props instead of
tremor-positional children, migrates the parent TeamsView to pass those
panels, and updates the TeamsHeaderTabs test to use the new API and
query by role.
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
Migrates the ModelsAndEndpointsView page Tab/TabGroup/TabList/TabPanel
to shadcn Tabs with explicit value props, and removes the TabPanel
wrappers from AllModelsTab/ModelRetrySettingsTab/PriceDataManagementTab
(they are now rendered directly inside TabsContent).
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
Batch migration of files that only use Tremor for the Table family
(Table/TableHead/TableHeaderCell/TableBody/TableRow/TableCell).
Renames per shadcn: TableHead (thead wrapper) -> TableHeader, and
TableHeaderCell (th) -> TableHead. Updates related test mocks and
replaces the tremor Icon-based expand/collapse stub in ModelsCell.tsx
with semantic Expand/Collapse aria-labels.
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
- AllModelsTab.tsx: drop antd Badge/Button/Select/Skeleton/Space/Typography + @ant-design/icons -> shadcn Badge/Button/Select/Skeleton + lucide Info/Settings/Filter/RefreshCw/Search. Pagination buttons become shadcn Button variant=outline. Tremor Grid dropped (already a plain div). Kept Tremor TabPanel (still required wrapper for parent TabGroup).
- RouterConfigBuilder.tsx: antd Select/Collapse/Empty/InputNumber -> shadcn Accordion/Select + shadcn Input type=number + custom empty-state div. The tags-mode utterances picker becomes a small UtterancesInput with press-Enter/paste-multiline behavior preserved. Remove-route button is now aria-labeled 'Remove route' on the AccordionTrigger sibling.
- RouterConfigBuilder.test.tsx: two delete-button tests repaired to query by /remove route/i instead of the old antd 'delete' aria label. All 16 tests pass.
AllModelsTab is added to the raw-tailwind-colors eslint override for the categorical team/view-mode palette dots (bg-blue-500 / bg-emerald-500 / bg-purple-500).
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
- LoginPage.tsx: antd Form/Input/Select/Popover/Card/Alert/Space/Typography -> shadcn/Tailwind equivalents. Preserves SSO popover, worker selector, admin-disabled view, and credentials info banner. All 8 existing tests still pass.
- OnboardingFormBody.tsx: antd Form.useForm -> react-hook-form; antd Input.Password -> shadcn Input type=password. Retains aria-label='loading' spinner so existing test selector continues to work.
- src/app/page.tsx: drop antd ConfigProvider/theme wrapper; dark-mode state now toggles the 'dark' class on <html> so shadcn CSS variables switch. Removed unused QueryClient imports.
Adds src/app/onboarding/OnboardingFormBody.tsx to the raw-tailwind-colors lint exception list (SSO info-banner uses bg-blue-50 per existing design pattern).
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
Migrates view_users (list dashboard), view_users/user_info_view (user
detail + edit + add-to-team modal), and user_agent_activity (DAU/WAU/
MAU analytics) off Tremor TabGroup/Card/Grid/Text/Title/Metric and off
antd Modal/Form/Select/Tooltip/Button/Skeleton. All three now use
shadcn Tabs + Card + Dialog + react-hook-form (in the add-team modal),
keeping the existing Tremor BarChart (chart exemption) and Tag-chip
multi-select shim. Tests updated to use Radix tab roles and
role='alertdialog' for the DeleteResourceModal selector.
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
Migrates user_edit_view, CreateUserButton, BulkEditUsers,
bulk_create_users_button, and DefaultUserSettings off antd Form/Select/
Modal/Input/Typography and off Tremor Card/Text/Title. All five now use
shadcn Dialog + react-hook-form + shadcn Select/Input/Textarea/Badge/
Table, with a local multi-select shim (shadcn Select + badge chips).
The categorical status palette used by the CSV bulk import (red/green/
blue/yellow for invalid/success/pending/warning) and the bulk-edit
amber warning are preserved as raw Tailwind classes and the owning
files are added to the no-raw-tailwind-colors override list and
DEVIATIONS.md per blueprint rule 3.
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
- Migrate src/components/mcp_tools/mcp_servers.tsx from Tremor TabGroup/
Tab/TabList/TabPanels + antd Modal/Descriptions/Select/Tooltip/Typography
to shadcn Tabs/AlertDialog/Select/Tooltip/Separator. Delete confirm
uses AlertDialog with a dl/dt/dd Descriptions replacement. The Team /
Access Group filter dropdowns become shadcn Radix Selects with
aria-label. Update mcp_servers.test.tsx to drive the new Radix Select
via getByRole('combobox', { name: 'Team' }) and getAllByRole('option')
instead of .ant-select class selectors.
- Migrate src/components/mcp_tools/mcp_tools.tsx from Tremor Card/Title/
Text + antd Input/Button to shadcn Card/Input/Button. Retains the
loader/selection visual treatment with lucide icons.
- Migrate src/components/mcp_tools/mcp_connect.tsx from antd Card/Alert/
Button/Switch/Form/Collapse + Tremor TabGroup/Tab/Title/Text to
shadcn Card/Alert/Button/Switch/Tabs (Form.Item replaced with a plain
Switch + Label pair — the connect screens have no form submit).
- Migrate src/components/mcp_tools/mcp_discovery.tsx from antd Modal/
Input.Search/Typography to shadcn Dialog + Input with an inline search
icon. Inline styles replaced with Tailwind classes, keeping the custom
2-column server grid and category pills.
- Migrate src/components/mcp_tools/MCPToolsetsTab.tsx from antd Modal/
Form/Input/Typography/message/Spin + Tremor Button/Text/Title to
shadcn Dialog/Input/Label/Button/AlertDialog and MessageManager for
toasts. Form state moves to react-hook-form with register().
- Migrate src/components/mcp_tools/ToolTestPanel.tsx from antd Form.useForm
+ Form.Item + Tremor Button/TextInput to react-hook-form + Controller
with shadcn Input/Textarea/Select/Label/Button. The ref-exposed
boolean-select keeps its title attribute on the trigger so the
existing ToolTestPanel.test.tsx getByTitle('True') assertion still
matches. Categorical green palette retained per BLUEPRINT rule and
added to the eslint overrides list for categorical-palette files
(mcp_connect.tsx, mcp_tools.tsx, ToolTestPanel.tsx).
- Migrate src/components/mcp_tools/mcp_tools.tsx. Categorical palette
overrides recorded in .eslintrc.json.
- MCPPermissionManagement.tsx is already in BLOCKERS.md from commit A as
part of the antd Form cluster; no change required here.
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
- Migrate src/components/mcp_tools/mcp_tool_configuration.tsx from
Tremor Card/Title/Text + antd Badge/Spin/Checkbox/Input/Radio to shadcn
Card/Input/Checkbox/Badge/ToggleGroup + lucide icons. Replaces the
Radio.Group view-mode toggle with a shadcn ToggleGroup, and the
antd Spin with a spinning lucide icon. Raw Tailwind colors swapped for
semantic tokens (text-muted-foreground, bg-primary/5, border-primary,
text-destructive).
- Migrate src/components/mcp_tools/MCPToolArgumentsForm.tsx from antd
Form.useForm + Form.Item + antd Input/InputNumber/Select/Tooltip to
react-hook-form with useForm + Controller and shadcn Input/Textarea/
Select/Label/Tooltip. Ref-exposed getSubmitValues() now triggers RHF
validation via trigger() + getValues() and still returns the typed,
JSON-normalised payload expected by playground/chat_ui.
- Record create_mcp_server.tsx / mcp_server_edit.tsx / OAuthFormFields.tsx /
StdioConfiguration.tsx / OpenAPIFormSection.tsx / MCPPermissionManagement.tsx
in BLOCKERS.md. These form a single antd Form cluster (parent +
Form.Item-based children registering into the parent's FormInstance)
whose migration, including rewriting the antd-class-based test helpers
in create_mcp_server.test.tsx / mcp_server_edit.test.tsx, exceeds the
two-attempt budget for this batch.
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
Migrate the add-model surface (AddModelForm, add_model_tab,
add_auto_router_tab, advanced_settings, cache_control_settings,
conditional_public_model_name, litellm_model_name,
provider_specific_fields) from antd Form + tremor to shadcn primitives
and react-hook-form.
- Root form state moves from antd FormInstance (Form.useForm) to RHF
UseFormReturn, created in ModelsAndEndpointsView.tsx and threaded
through AddModelTab / AddModelForm. Children use useFormContext /
Controller / useWatch / useFieldArray.
- antd Modal -> shadcn Dialog; antd Tag -> Badge; antd Select -> shadcn
Select; antd Radio.Group -> RadioGroup; antd Accordion (tremor) ->
shadcn Accordion; antd Form.List -> RHF useFieldArray.
- Submit helpers (handle_add_model_submit, handle_add_auto_router_submit)
feature-detect antd.resetFields vs RHF.reset so both paths keep
working through the mixed migration window.
- UploadProps type import migrates from antd/es/upload to a local shim
at add_model/add_model_upload_types.ts (structurally compatible with
the antd shape still used by model_add/AddCredentialModal.tsx and
model_add/EditCredentialModal.tsx).
- cache_control_settings ships both an RHF path (new callers) and a
legacy antd bridge used by model_info_view.tsx so the out-of-scope
detail view keeps working without cascading its migration.
- validateJsonValue added to utils/textUtils.ts to replace the antd
Promise-style formItemValidateJSON for RHF rules.
- Tests repaired: AddModelForm, add_model_tab,
conditional_public_model_name, litellm_model_name,
provider_specific_fields, advanced_settings now wrap with RHF
FormProvider instead of antd Form.
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
- add_plugin_form: replace antd Modal/Form/Input/Select and Tremor
Button with shadcn Dialog + react-hook-form + shadcn Input/Textarea/
Select/Button. Validation messages now rendered inline via
formState.errors instead of antd Form.Item's rules. URL preview keeps
the categorical blue palette and is recorded in .eslintrc allowlist.
- MakeSkillPublicForm: drop antd Form wrapper + Steps. Replace with
inline lucide-based Stepper; step state stays plain React useState.
Dialog was already shadcn.
All 60 claude_code_plugins tests pass (AddPluginForm + helpers).
tsc --noEmit clean; eslint clean with categorical-palette
allowlist.
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
- MakeAgentPublicForm, MakeMCPPublicForm, MakeModelPublicForm: drop
antd Form + Steps shells. Replace with inline lucide-based Stepper
component; step state stays plain React useState, dialog is already
shadcn Dialog.
- ModelHubTable: replace antd Modal with shadcn Dialog, Tremor
TabGroup/Tab/TabList/TabPanel with shadcn Tabs, Tremor Badge with
shadcn Badge + semantic color helper, Tremor Card/Text/Title/Button
with shadcn primitives + Tailwind, Ant icons with lucide Copy. Keep
categorical palette (blue/green/purple/etc) classes for hub badges;
file remains in .eslintrc allowlist.
- Tests: update mocks to stop stubbing antd (real shadcn Checkbox now
exposes data-state="indeterminate" instead of the old
data-indeterminate prop; tests assert against the Radix attribute).
Split two-click "select/deselect" sequences into separate act()
calls so state updates propagate between clicks.
- All 47 scoped tests pass (MakeAgentPublicForm, MakeMCPPublicForm,
MakeModelPublicForm). ModelHubTable existing 8 tests still pass.
tsc --noEmit clean for migrated files. eslint clean.
Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>