diff --git a/CLAUDE.md b/CLAUDE.md index ceeb8ce7..affdc97b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -124,13 +124,24 @@ Always check `@gpustack/core-ui` first. Frequently reused: - **Form fields**: `BaseSelect`, `Input` (labeled). - **Text overflow**: `AutoTooltip`. - **Icons**: `IconFont`. -- **Status display** (success/failed/processing/warning): `StatusTag`. +- **Tags & status** (4 variants): see the section below. - **Permission-gated visibility**: `Access` / `useAccess`. - **Request hooks**: `useRequest` / `useQueryData` / `useQueryDataList`. - **Table data fetching**: `useTableFetch`. - **Submit guard** (prevent double-submit): `useSubmitLock`. - **Tabbed forms**: `ScrollSpyTabs`. +# Tags & status indicators + +Four core-ui components cover tag/status display in tables and lists. Pick by **what the value means**, not by how it looks — don't reach for a generic antd `Tag`: + +- **`StatusTag`** — semantic status with a **dynamic message/detail** (tooltip, download, extra content). Use when a row's status carries variable text, e.g. a failed job with an error message. Colors come from `StatusColorMap` (error/warning/transitioning/success/inactive). +- **`StatusDot`** — colored dot + short label, **no message**. Use for a plain status/type cell where the value is a fixed enum (e.g. an event-type or log column). Same `StatusColorMap` palette; `inactive` dot is quaternary. If the status needs dynamic text, use `StatusTag` instead. +- **`ThemeTag`** — a **standalone category label** (independent content, e.g. a permission scope or a model name). Default neutral; wraps antd `Tag`. +- **`TextAttribute`** — a small neutral pill that is a **subordinate annotation following a primary text** (e.g. `key-name [custom]`), not a standalone tag. Manages its own leading margin. Two variants: `filled` (default) and `outlined`. Ref the name column in `src/pages/api-keys/hooks/use-keys-columns.tsx`. + +Rule of thumb: semantic + dynamic text → `StatusTag`; semantic + fixed enum → `StatusDot`; independent category → `ThemeTag`; annotation of nearby text → `TextAttribute`. + # Dynamic add-item form fields When building a form, select the add-item component from the **shape of the field's data** (its schema). Match the schema, don't hand-roll a list UI: diff --git a/src/pages/_components/model-tag.tsx b/src/pages/_components/model-tag.tsx index 9dd8c440..f34cc894 100644 --- a/src/pages/_components/model-tag.tsx +++ b/src/pages/_components/model-tag.tsx @@ -60,7 +60,8 @@ const ModelTag: React.FC = ({ categoryKey, size }) => { opacity: 1, paddingInline: 8, borderRadius: 12, - transform: 'scale(0.9)' + transform: 'scale(0.9)', + backgroundColor: 'transparent' }} color={config.color} > diff --git a/src/pages/api-keys/hooks/use-keys-columns.tsx b/src/pages/api-keys/hooks/use-keys-columns.tsx index 30900cf8..f116c2ed 100644 --- a/src/pages/api-keys/hooks/use-keys-columns.tsx +++ b/src/pages/api-keys/hooks/use-keys-columns.tsx @@ -6,10 +6,12 @@ import { AutoTooltip, DropdownButtons, IconFont, - icons + icons, + TextAttribute, + ThemeTag } from '@gpustack/core-ui'; import { useIntl } from '@umijs/max'; -import { MenuProps, Tag, Tooltip } from 'antd'; +import { MenuProps, Tooltip } from 'antd'; import { ColumnsType } from 'antd/lib/table'; import dayjs from 'dayjs'; import { useMemo } from 'react'; @@ -139,23 +141,14 @@ const useModelsColumns = ({ key: 'name', sorter: tableSorter(1), render: (text: string, record: ListItem) => ( - + {text} {record.is_custom && ( - + {intl.formatMessage({ id: 'playground.params.custom' })} - + )} ) @@ -203,26 +196,13 @@ const useModelsColumns = ({ )} {(record.scope?.includes('inference') || record.scope?.includes('*')) && ( -
+ {record.allowed_model_names?.length ? record.allowed_model_names.join(', ') : intl.formatMessage({ id: 'apikeys.models.all' })} -
+ )} ) diff --git a/src/pages/gpu-service/storage-types/hooks/use-storage-type-columns.tsx b/src/pages/gpu-service/storage-types/hooks/use-storage-type-columns.tsx index 51ec2a25..b61c8e68 100644 --- a/src/pages/gpu-service/storage-types/hooks/use-storage-type-columns.tsx +++ b/src/pages/gpu-service/storage-types/hooks/use-storage-type-columns.tsx @@ -28,21 +28,13 @@ interface ColumnsHookProps { const getKindLabel = (record: ListItem) => { if (record.spec?.nfs) return ( - } - > + }> {StorageTypeKindLabelMap.nfs} ); if (record.spec?.s3) return ( - } - > + }> {StorageTypeKindLabelMap.s3} );