VAI-CLIP Desktop UI Design System

Status: Active project-level standard
Applies to: all desktop clinical and operational workspaces
Last updated: 2026-10-27
Canonical language: English. desktop_ui_design_system.zh-CN.md is the complete Chinese translation. Update both files in the same pull request.

This is the shared standard for VAI-CLIP desktop UI. It defines how pages look and behave; domain PRDs define business fields, permissions and workflow rules.

Reception and Registration Queue (PatientIntakeWorkflowApp) is the main presentation reference: compact filters, a full-width el-table, patient-first rows, a clear next action, AppDialog and Element Plus loading. Reuse its UI approach, not its Registration workflow.

1. Scope and required rules

Use this guide in this order: choose components in §3, arrange the page with §4, then verify with §5.

Mandatory adoption

Legacy pages and existing local styles are migration candidates, not examples for new pages. This standard does not automatically start their renovation; a delivery deadline or existing code is not an exception once renovation has been explicitly requested.

Existing-module compatibility

UI renovation boundary

Work Required boundary
New desktop page Follow this standard in full from the first merge.
Existing page UI renovation Start only with an explicit page/component renovation request. Apply this standard to the requested and changed area while keeping its business behaviour; preserve stable unaffected legacy layout under Existing-module compatibility.
UI-only change Do not change fields, validation rules, permissions, state transitions, API contracts, audit behaviour or authorised workflow steps.
Business change needed Define and approve it in the domain PRD before implementation; it is not part of a visual renovation.

Before renovating an existing page, identify its current key actions and states. After the UI change, verify the same authorised workflow still works, including success, validation failure, permission denial and recoverable server error where applicable.

Renovation request template

Use this instruction when requesting an existing desktop page or component renovation:

Redesign the desktop UI of [module/page/component] according to agent_docs/product/desktop_ui_design_system.md. Use Element Plus and shared components to standardise forms, tables, buttons, dialogs and feedback. Change UI only; do not change existing fields, permissions, state transitions, API contracts, audit behaviour or business workflows.

2. Common look and feel

Style ownership

Item Standard
Radius 6px controls; 8px cards, tables and rows; 12px dialogs/drawers; pill shape only for badges
Height Use 32px by default. Controls in the same filter row, form row or action group must use the same height. Use 36px only when a documented usability requirement needs a larger target; use 40px only for a deliberately prominent main workflow or confirmation action.
Type Page title 18–20px; section title 16px; body, fields and table values 14px; supporting text at least 12px
Spacing 4px rhythm; 16px normal section spacing; 12–16px field groups; 8px button groups

Do not use text-xs as the only readable label for a clinical, financial or destructive action.

2.1. Colour system and semantic tokens

User correction, 14 October 2026: primary actions, active navigation, selection and focus follow the colour theme selected in Personal Settings. Do not hardcode purple in an individual workspace. The palette below remains the semantic/category reference adopted on 8 October; its purple primary values are reference examples, not an override of the selected system theme. Existing-page renovation boundaries in §1 still apply.

The supplied clickup_inspired_color_system.md is the source proposal. The four gradient endpoints are published in ClickUp's brand guidelines, checked on 8 October 2026. The UI tokens and 60 tag colours are our adopted ClickUp-inspired specification, not a claim about ClickUp's internal UI tokens. Use VAI-CLIP identity and the existing typography, spacing, radius and component standards.

Separate three purposes: brand accents express identity; semantic colours express actions and states; category colours distinguish labels. A module's icon or header may have an identity accent, but must not recolour its primary buttons, selections, warnings or clinical risks.

Shared token HEX Purpose
--ui-primary #6647F0 Primary action, active navigation and selection accent
--ui-purple #7B68EE Secondary decorative accent
--ui-pink #FD71AF Decorative accent
--ui-blue #0091FF Information accent; readable links use the stronger variant below
--ui-cyan #49CCF9 Decorative accent
--ui-yellow #FFC800 Decorative accent, not a new warning state
--ui-success #00B884 Success/completion accent
--ui-warning #FFB800 Warning/pending-review accent
--ui-error #F7685B Error/risk accent
--ui-background #FFFFFF Page and task surfaces, inputs and tables
--ui-surface #F7F8FA Workspace canvas and supporting panels
--ui-border #E4E7EC Decorative dividers and surface boundaries
--ui-text-muted #64748B Supporting text on white
--ui-text #292D34 Body text, headings and dark foreground

The warm brand gradient is linear-gradient(90deg, #FF02F0, #FC6D2D); the cool brand gradient is linear-gradient(90deg, #6647F0, #0091FF). Reserve them for small identity/decorative areas. Routine commands, tables, status badges and clinical alerts use solid or pastel semantic colours. Place text on a solid readable surface rather than assuming every gradient stop has adequate contrast.

2.2. Readable variants and interaction states

The following VAI-CLIP variants complement the supplied accent colours. Use them consistently rather than selecting a different shade per page.

Role Background token / HEX Foreground token / HEX
Primary button --ui-primary / #6647F0 --ui-on-primary / #FFFFFF
Primary hover / pressed --ui-primary-strong / #5B21B6 --ui-on-primary / #FFFFFF
Selected row, tab or option --ui-primary-soft / #EDE9FE --ui-primary-strong / #5B21B6
Information badge / alert --ui-info-soft / #DBEAFE --ui-info-strong / #1E40AF
Success badge / alert --ui-success-soft / #DCFCE7 --ui-success-strong / #166534
Warning badge / alert --ui-warning-soft / #FEF3C7 --ui-warning-strong / #92400E
Error / risk badge / alert --ui-error-soft / #FFE4E6 --ui-error-strong / #9F1239
Destructive filled button --ui-error-strong / #9F1239 --ui-on-primary / #FFFFFF
Muted text on a supporting panel --ui-surface / #F7F8FA --ui-text-muted-on-surface / #475569

2.3. Category and tag palette

Use this shared 60-colour palette for an existing or separately requested category/tag colour capability. Ten families each have six fixed shades. It does not introduce a colour picker, custom-field feature, priority model or new workflow state by itself.

Family 1 (Lightest) 2 3 4 5 6 (Darkest)
Red #FFE4E6 #FDA4AF #FB7185 #F43F5E #E11D48 #9F1239
Orange #FFEDD5 #FDBA74 #FB923C #F97316 #EA580C #9A3412
Amber #FEF3C7 #FCD34D #FBBF24 #F59E0B #D97706 #92400E
Yellow #FEF9C3 #FDE047 #FACC15 #EAB308 #CA8A04 #854D0E
Green #DCFCE7 #86EFAC #4ADE80 #22C55E #16A34A #166534
Teal #CCFBF1 #5EEAD4 #2DD4BF #14B8A6 #0D9488 #115E59
Cyan #CFFAFE #67E8F9 #22D3EE #06B6D4 #0891B2 #155E75
Blue #DBEAFE #93C5FD #60A5FA #3B82F6 #2563EB #1E40AF
Purple #EDE9FE #C4B5FD #A78BFA #8B5CF6 #7C3AED #5B21B6
Pink #FCE7F3 #F9A8D4 #F472B6 #EC4899 #DB2777 #9D174D

The default category badge pairs shade 1 as background with shade 6 as text. A selected shade is not automatically its text colour; choose a separately contrast-verified foreground. When a colour picker is in scope, show a label/tooltip, keyboard-visible focus, a non-colour selection indicator and the selected colour value. Persist the normalised HEX value through the owning feature's existing contract rather than a palette position; no database change is implied by this specification.

Illustrative label Background Text
Development #EDE9FE #5B21B6
Design #FCE7F3 #9D174D
Bug #FFE4E6 #9F1239
Documentation #DBEAFE #1E40AF
Research #CCFBF1 #115E59
Planning #CFFAFE #155E75

These are examples, not new required labels. The source's In Review and Approved examples use the warning and success pairs in §2.2 when they represent an actual workflow state; such states do not receive freely chosen category colours.

2.4. Vue / Element Plus implementation and adoption

2.5. Desktop icon gradient palette

The separate desktop icon gradient library, supplied as clickup_60_ui_gradients.md and adopted on 8 October 2026, contains the 60 numbered variants with their names, exact stops, angles and CSS variables. Use it for desktop app icon backgrounds. The library owns gradient values; this design system owns shared control and interaction styling. It is distinct from the solid category/tag palette in §2.3.

Keep icon identity gradients separate from command buttons, selections, clinical alerts and status colours. Apply the existing Iconify, readable-label and actual-gradient contrast rules. App-to-gradient assignments and application migration are separate implementation work; this saved palette does not establish either.

3. Common components and interactions

Need Use Do not use
Command or submit el-button or a compatible shared wrapper Native button styling system
Data entry and validation el-form, el-form-item and the suitable Element Plus control Raw inputs or toast-only validation
Interactive records el-table and Element table controls Hand-built interactive HTML table
Dialog with fields, review or async work AppDialog Feature-local dialog shell
Short confirmation without input ElMessageBox.confirm Custom confirmation dialog
Result, warning or error ElMessage, el-alert, ElNotification Page-local toast/banner system
Loading or empty state v-loading, el-skeleton, el-empty Full-page spinner for a bounded task
Paging or clipped supporting text el-pagination, el-tooltip or the shared ellipsis tooltip Hand-built paging, native title tooltip or silent clipping

Actions and icons

Forms and tables

Shared record-list presentation (2026-10-27)

The confirmed reference for comparable record lists is Reception and Registration Queue. Apply the same presentation to front-desk, Consultation, Cashier, Lab, pharmacy, catalogue and administrative record lists. Keep each list's columns, permissions, filters, sorting and business actions.

Choice groups

Dialog, feedback and loading

4. Page layout and common patterns

Page area Rule
App shell Reuse AppWindow; keep business actions and state out of the window bar
Page header One compact title, primary navigation and global tools; Settings is at the far right only when it is a real permitted capability
Filters Keep search, date, doctor, clinic and status filters above or beside the list they change. Separate editing submissions from filters; Reception may group Refresh and Add appointment at the toolbar end to preserve list height
Object context Put patient, visit, invoice or prescription identity above single-object work; show actions on the right
Content Use white task surfaces, neutral section headings and one main scroll area
Decision Keep current amount or blocker with Cancel and one primary action; use a fixed footer only in a long workflow that owns it

Catalogue selection searches (confirmed 2026-11-06): A blank or whitespace-only search must not populate an entire catalogue by default. Show a brief instruction to enter a name/code, select a specific category/vendor/account, or open an explicit history/browse source. Clear old candidates immediately when the query is cleared; invalidate in-flight responses so they cannot repopulate the list. Keep selected values and their labels visible while filtering. Apply this to service/Lab/Imaging, medication, package, vaccine and related procurement, stock-count, recall, pricing and clinic-request pickers. Minimum query lengths already required by a domain remain in effect. Operational queues, management tables and small finite configuration choices retain their normal list behavior; an explicit category or history action may show its scoped options.

List pages normally follow header → filters → content. Object work follows header → context → content → decision. Keep Settings return context, filters and pagination. Put search above its list, table next-step actions at the right, and pagination at the bottom.

Show patient/object name first, identifier/source second and state/actions on the right. Do not hide identity, amount, risk or current blockers. A patient link must have a stable ID and return context, and must not activate its selectable row.

Taskbar window selectors distinguish the active, non-minimized window with a solid shared-primary-strong background, readable on-primary text and a persistent underline. Keep the app identity icon/strip, neutral inactive buttons and reduced icon emphasis for minimized windows. Hover must not erase selection; keyboard focus remains visible on both selected and inactive buttons in Bottom and Left layouts.

The linked eMR, Consultation and Cashier family retains each app’s original icon gradient in its title bar (eMR blue/cyan, Consultation pink/coral, Cashier orange/red), with the original white title text and app/link icons, shared solid primary controls, neutral content surfaces and one PatientIdentityHeader: 36px initials avatar, 18px semibold primary name, optional 14px Chinese name, and at least 12px identity details. Use the same name fallback, date format and sex wording; recorded PN and MRN remain distinctly labelled. Consultation/Cashier add the current Chit; historical eMR browsing remains patient-scoped. Semantic risks and financial gates keep their existing meaning and colours. Compact Consultation uses a bounded Patients drawer instead of an initials/minute rail; opening or closing this presentation retains the editor, and actual visit selection uses the existing guard.

Pattern Use Required shape
Appointment Time and resource scheduling Date and view controls above the calendar; detail follows Time → Patient → Details → Actions; editor groups Patient → Appointment → Payment arrangement → Resources/plan → Notes
Registration State queue with a next step State/count and search/doctor/date toolbar; full-height queue; patient link opens eMR while the row action handles the visit; dialog keeps patient context and the current next action
Cashier List to full-width object work Compact list filters, full-width list/detail, patient/invoice identity, aligned charge/payment table and a fixed decision footer when needed
Drug Dispensing Queue plus staged task Narrow selection queue; right side shows context → progress → blocker → current stage → next action; keep prescription, medicine details and remarks separate

These patterns define layout only. Fields, permissions, state changes and completion rules remain in the domain PRD.

4.1. Confirmed cross-workspace refinement (27 October 2026)

5. Development and acceptance

Before handoff, check: page and action placement; shared tokens; Element Plus controls; icon accessibility; form/table/dialog/feedback states; search and bulk-action scope; meaningful text without clipping; loading, empty, error, permission and disabled states; and desktop visual evidence. See component compliance verification for executable checks.