cogover-fe
npx skills add https://github.com/stringeecom/cogover-fe-skills --skill cogover-fe
Agent 安装分布
Skill 文档
UI Kit
Quy tắc sá» dụng ui-kit trong dá»± án Cogover Frontend. Bao gá»m foundations, common components, form components, và hooks.
Khi nà o áp dụng
Tham khảo các hưá»ng dẫn nà y khi:
Import
- Import bất kỳ component, hook, hoặc utility nà o từ ui-kit â luôn import từ
@stringeecom/ui-kit
Form
- Tạo form vá»i react-hook-form, FormProvider, Controlled components, yup validation â xem chi tiết tại
uikit-form-react-hook-form
Object, Field, Record
- Mô hình dữ liá»u Object-Field-Record, các hook lấy/tạo/sá»a/xóa record, kiá»m tra quyá»n xem/sá»a field â xem chi tiết tại
uikit-object-field-record
Text & i18n
- Tất cả text má»i tạo ra phải viết bằng tiếng Viá»t, chá» dá»ch sang i18n key khi ÄÆ°á»£c yêu cầu sá» dụng skill
ui-i18n
Date/Time
- Là m viá»c vá»i ngà y giá»: parse, format, so sánh, tÃnh toán, chuyá»n Äá»i timestamp â luôn dùng
dayjs, xem chi tiết tạidayjs-date-time
Page Patterns
Không cần tham khảo cấu trúc của các list page khác trong dự án, chỠcần tuân theo các quy tắc trong rule
page-list-resource.
RULE-LIST-PAGE-01â Cấu trúc thư mục:index.tsx,type.ts,options.tsx,components/{Resource}List/,FilterMenu/,ActionMenu/RULE-LIST-PAGE-02â Tầng Type: enum FilterType, interface FilterForm vá»i operator Äi kèm má»i filter fieldRULE-LIST-PAGE-03â Options tách riêng file, label luôn là i18n keyRULE-LIST-PAGE-04â Trang chÃnh: FormProvider + useGetStateFromSearchParams + SyncFilterFormWithSearchParams + ResizableMenuRULE-LIST-PAGE-05â Bảng dữ liá»u: TableSettings + ListViewTable + useTableV2 + useDebounceValue + buildParamsFromFilterRULE-LIST-PAGE-06â Helper: guard bằngfilterTypes.includes(), chá» gá»i param có giá trá», normalize date rangeRULE-LIST-PAGE-07â useGetColumns hook: useMemo, nháºn action callbacks, dùng SmartTooltip/CreatedByInfo/DateTimeWithTooltipRULE-LIST-PAGE-08â FilterMenu: useFormContext, render có Äiá»u kiá»n theo filterTypes, sync URL, appendToBody={false}RULE-LIST-PAGE-09â ActionMenu: Popper + PopperMenu + PopperMenuItem, spread{...params} {...attributes}, hide-on-clickRULE-LIST-PAGE-10â Flow: URL â Form â useWatch â debounce â buildParams â React Query â Table
Workflow
- Trưá»c khi là m, phân tÃch yêu cầu Äá» tách công viá»c Äá»c láºp â nếu tách ÄÆ°á»£c từ 2 công viá»c trá» lên thì tá»± Äá»ng dùng sub agent song song
- Không bao giá» tá»± tạo git commit trừ khi ÄÆ°á»£c user yêu cầu rõ rà ng
Foundations
- Cấu hình Tailwind CSS hoặc design tokens
- Là m viá»c vá»i color palette, spacing, hoặc typography scales
- Thiết láºp CSS custom properties / variables
- Quản lý themes (light/dark mode)
Common Components
- SỠdụng
Accordiontừ ui-kit cho expandable/collapsible sections (uncontrolled) - SỠdụng
Alerttừ ui-kit cho hiá»n thá» thông báo warning/info - Sá» dụng
AvatarhoặcAvatarFieldtừ ui-kit cho hiá»n thỠảnh Äại diá»n - Sá» dụng
BreadCrumbstừ ui-kit cho navigation breadcrumbs vá»i dropdown - Sá» dụng
Button,ButtonGroup,IconButton,Tooltip, hoặcSmartTooltiptừ ui-kit - SỠdụng
Calendartừ ui-kit cho hiá»n thá» calendar standalone - Sá» dụng
Cascadertừ ui-kit cho hierarchical selection (chá»n theo cấp báºc) - Sá» dụng
Checkbox,CheckboxGroup, hoặcFormControlLabeltừ ui-kit - SỠdụng
CircularProgressBartừ ui-kit cho hiá»n thá» progress dạng vòng tròn - Sá» dụng
CKEditortừ ui-kit cho rich text editor - SỠdụng
CollapsibleContainertừ ui-kit - SỠdụng
ColorPickertừ ui-kit cho chá»n mà u sắc - Sá» dụng
ConfirmModalcho xác nháºn hà nh Äá»ng nguy hiá»m - Sá» dụng
CopyButtonÄá» copy text và o clipboard - Sá» dụng
CountrySelecttừ ui-kit cho chá»n quá»c gia - Sá» dụng
CreatedByInfoÄá» hiá»n thá» thông tin creator (avatar + name) - Sá» dụng
DatePickerhoặcDatePickerRelativetừ ui-kit cho chá»n ngà y/giá» - Sá» dụng
DateRangeCalendartừ ui-kit cho chá»n khoảng ngà y trên calendar - Sá» dụng
DateRangePickertừ ui-kit cho chá»n khoảng ngà y vá»i input - Sá» dụng
DateTimeWithTooltiptừ ui-kit cho hiá»n thá» ngà y giá» vá»i tooltip timezone - Sá» dụng
DraggableWrappervÃDraggableItemtừ ui-kit cho sortable drag-and-drop (react-beautiful-dnd) - Sá» dụng
Drawertừ ui-kit cho side panel/drawer - SỠdụng
FilePreviewhoặcBaseFilePreviewtừ ui-kit cho xem trưá»c file - Sá» dụng
FilterGeneratortừ ui-kit cho bá» lá»c Äiá»u kiá»n vá»i DataField - Sá» dụng
FilterGeneratorBasetừ ui-kit cho bá» lá»c Äiá»u kiá»n tuỳ chá»nh (base component) - Sá» dụng
FormBuildertừ ui-kit cho form Äá»ng dá»±a trên layout từ server (server-driven form) - Sá» dụng
FormControlLabeltừ ui-kit Äá» gắn label cho control (Checkbox, Radio, Switch) - Sá» dụng
HelpButtonÄá» thêm inline contextual help - Sá» dụng
HelperTextÄá» hiá»n thá» form field helper/error/warning messages - Sá» dụng
HorizontalStepsÄá» implement multi-step wizard UI - Sá» dụng
InsertFieldObjectButtonV2từ ui-kit cho nút má» modal chá»n trưá»ng dữ liá»u - Sá» dụng
InsertFieldObjectButtonWrapper2từ ui-kit cho wrapper hiá»n thá» biến Äã chá»n vá»i nút clear - Sá» dụng
InsertFieldObjectV2từ ui-kit cho modal chá»n trưá»ng dữ liá»u dạng cascader - Sá» dụng
LayoutSelectButtontừ ui-kit cho nút chá»n layout hiá»n thá» - Sá» dụng
LazyImageÄá» render images vá»i lazy loading và fallback - Sá» dụng
LimitableListtừ ui-kit cho hiá»n thá» danh sách vá»i giá»i hạn sá» lượng - Sá» dụng
ListViewTabletừ ui-kit cho bảng dữ liá»u có header vá»i action buttons - Sá» dụng
MarkdownPreviewtừ ui-kit cho render markdown content - SỠdụng
ModalvÃModalFooterÄá» xây dá»±ng dialog và overlay - Sá» dụng
Paginationtừ ui-kit cho phân trang - SỠdụng
PersonnelDetailCardhoặcPersonnelDetailPoppertừ ui-kit cho hiá»n thá» thông tin nhân sá»± - Sá» dụng
Popper,PopperMenu, hoặcPopperMenuItemtừ ui-kit - SỠdụng
PopperRecordInfotừ ui-kit cho hiá»n thá» thông tin record trong popup - Sá» dụng
ResizeBarÄá» implement resizable panels hoặc sidebar - Sá» dụng
Showtừ ui-kit cho conditional rendering - SỠdụng
Skeletontừ ui-kit cho loading placeholder - SỠdụng
SpinnerComponenttừ ui-kit cho loading spinner - SỠdụng
StepProgressBarÄá» hiá»n thá» step-based progress - Sá» dụng
StepsÄá» render step wizard indicator - Sá» dụng
StringeeDndContext,DndContainer, vÃuseDndHandlecho drag-and-drop - Sá» dụng
Tabletừ ui-kit cho hiá»n thá» bảng dữ liá»u - Sá» dụng
TableSettingstừ ui-kit cho cà i Äặt cá»t bảng (ẩn/hiá»n, ghim, kéo thả, editable) - Sá» dụng
TabsÄá» xây dá»±ng tab navigation - Sá» dụng
TagÄá» hiá»n thá» labels, chips, hoặc removable tags - Sá» dụng
ToastMessage,ToastContainer, vÃshowToastMessagecho in-app notifications - Sá» dụng
ToggleCollapseButtontừ ui-kit cho nút toggle collapse vá»i icon chevron - Sá» dụng
UsageHelpButtonÄá» hiá»n thá» contextual feature documentation - Sá» dụng
VerticalStepsÄá» render vertical sidebar step navigator - Sá» dụng hook
useResponsive - Review code có sỠdụng bất kỳ component nà o Ỡtrên
- Lá»±a chá»n giữa
TooltipvsSmartTooltip, hoặcButton onlyIconvsIconButton - Lá»±a chá»n giữa controlled vs uncontrolled mode cho
CollapsibleContainer
Form Components
- SỠdụng
DurationInputhoặcDurationRangeInputtừ ui-kit cho nháºp thá»i lượng - Sá» dụng
EmailInputtừ ui-kit cho input email vá»i nút mailto - Sá» dụng
EmojiControlPickerhoặcEmojiPickertừ ui-kit cho chá»n emoji - Sá» dụng
FileInputtừ ui-kit cho upload file vá»i drag-and-drop - Sá» dụng
FormItemtừ ui-kit cho layout label + component trong form - SỠdụng
InputGrouptừ ui-kit cho input kết hợp select - SỠdụng
InputNumbertừ ui-kit cho nháºp sá» vá»i format - Sá» dụng
MarkdownEditortừ ui-kit cho markdown editor - SỠdụng
MonacoEditortừ ui-kit cho code editor - SỠdụng
MultipleSelecttừ ui-kit cho chá»n nhiá»u giá trá» - Sá» dụng
PhoneInputtừ ui-kit cho nháºp sá» Äiá»n thoại vá»i mã quá»c gia - Sá» dụng
Radio,RadioGrouptừ ui-kit cho radio buttons - SỠdụng
Ratingtừ ui-kit cho Äánh giá sao - Sá» dụng
Reactiontừ ui-kit cho chá»n emoji reaction - Sá» dụng
SearchInputtừ ui-kit cho input tìm kiếm - SỠdụng
Selecttừ ui-kit cho dropdown select - SỠdụng
Slidertừ ui-kit cho range/volume inputs - SỠdụng
Switchtừ ui-kit cho toggle báºt/tắt - Sá» dụng
TagsInputtừ ui-kit cho nháºp tags - Sá» dụng
TextFieldtừ ui-kit cho text input/textarea - SỠdụng
TextLinktừ ui-kit cho hyperlink text - SỠdụng
TimePickertừ ui-kit cho chá»n giá» - Sá» dụng
TimeRangePickertừ ui-kit cho chá»n khoảng thá»i gian - Sá» dụng
TimeSelecttừ ui-kit cho danh sách chá»n giá» dạng scroll - Sá» dụng
TreeSelecttừ ui-kit cho chá»n từ cây phân cấp - Sá» dụng
UrlInputtừ ui-kit cho input URL vá»i nút má» link - Lá»±a chá»n giữa controlled vs uncontrolled mode cho form inputs
Tham khảo nhanh
Foundations
1. Design Tokens (QUAN TRá»NG)
tokens-tailwind-config– Cách Äá»nh nghÄ©a và sá» dụng design tokens qua tailwind.config.js
2. Há» thá»ng mà u sắc (QUAN TRá»NG)
color-palette-usage– Luôn sá» dụng configured color classes, không bao giá» dùng raw hex/rgb hoặc default Tailwind palette
3. Typography (QUAN TRá»NG)
typography-prose-classes– Sá» dụngprose-<type>cho font-size, font-weight, line-height; Äá»c types từ tailwind.config.js; default body text =prose-body2
4. Spacing & Layout (QUAN TRá»NG)
spacing-rem-only– Luôn sá» dụng rem, không bao giá» dùng px (1rem = 16px); ngoại lá» duy nhất là 1px borders
5. className Composition (CAO)
cx-class-grouping– Luôn import và sá» dụngcx(); nhóm các class liên quan và o các argument riêng biá»t; sá» dụng object syntax cho conditionals
6. TypeScript Type Safety (QUAN TRá»NG)
no-typescript-any– Không bao giá» sá» dụng kiá»uanyvà dấu!(non-null assertion); sá» dụngunknown,Record<string, unknown>, generic types, optional chaining thay thế
7. Prettier & Lint Check (CAO)
prettier-and-lint-check– Sau khi sá»a code xong phải kiá»m tra.prettierrcá» root và chạy prettier, sau Äó kiá»m tra và sá»a hết lá»i lint trong các file vừa sá»a
8. Không Tự Tạo File Markdown (CAO)
no-auto-markdown– Không tá»± Äá»ng tạo file markdown trừ khi user yêu cầu rõ rà ng
9. Date/Time vá»i dayjs (CAO)
dayjs-date-time– Luôn sá» dụng dayjs cho má»i thao tác date/time; không dùng native Date, moment.js, hoặc tá»± tÃnh toán
Common Components
Accordion (uikit-accordion)
RULE-ACCORDION-01â Accordion chá» há» trợ uncontrolled mode â không có propisOpen/onChangeRULE-ACCORDION-02â Sá» dụngdefaultOpenthay vì tá»± quản lý initial stateRULE-ACCORDION-03â Không truyá»n rõ rà ngdefaultOpen={false}â Äó là giá trá» mặc Äá»nhRULE-ACCORDION-04â Truyá»ntitledạng ReactNode cho header phong phúRULE-ACCORDION-05â Sá» dụngheaderClassNameÄá» style header, không override bằng children wrapperRULE-ACCORDION-06â Sá» dụngclassNameÄá» style container ngoà i cùngRULE-ACCORDION-07â Không tá»± tạo animation collapse/expand cho children
Alert (uikit-alert)
RULE-ALERT-01â Sá» dụngvariantphù hợp vá»i ngữ cảnh thông báo â"warning"hoặc"info"RULE-ALERT-02â Không truyá»n rõ rà ng giá trá» mặc Äá»nh chovariantvÃiconRULE-ALERT-03â Truyá»nicon={null}ÄỠẩn icon, không truyá»n icon rá»ngRULE-ALERT-04â Sá» dụngtitlekhi cần phân biá»t tiêu Äá» và ná»i dung chi tiếtRULE-ALERT-05â Sá» dụngmessageClassNamevÃtitleClassNameÄá» tuỳ chá»nh style
Avatar (uikit-avatar)
RULE-AVT-01â Luôn truyá»naltÄá» hiá»n thá» tên viết tắt khi không có ảnhRULE-AVT-02â Sá» dụngfallbackImagethay vì tá»± xá» lý onErrorRULE-AVT-03â Sá» dụngsize(sá», ÄÆ¡n vá» px) thay vì className Äá» Äặt kÃch thưá»cRULE-AVT-04â Sá» dụng propbadgeÄá» hiá»n thá» badge, không tá»± wrap thêm AvatarRULE-AVT-05â Truyá»nidÄá» kÃch hoạt popup thông tin nhân sá»± và mà u ná»n tá»± Äá»ngRULE-AVT-06â Sá» dụngpersonnelDetailPopperPropsÄá» tùy chá»nh popup, không tá»± wrap PopperRULE-AVT-07â Không tá»± tạo component avatar vá»i img tag hoặc div
AvatarField (uikit-avatar-field)
RULE-AVATARFIELD-01â Sá» dụngAvatarFieldthay vì tá»± xá» lý URL từImageFieldResponseRULE-AVATARFIELD-02â Chá»nresolutionSizephù hợp vá»i kÃch thưá»c hiá»n thá»RULE-AVATARFIELD-03âAvatarFieldchấp nháºn cả URL string lẫnImageFieldResponseRULE-AVATARFIELD-04â Sá» dụngImageFieldkhi cần hiá»n thá» hình ảnh (không phải avatar)RULE-AVATARFIELD-05âAvatarFieldkế thừa tất cả props cá»§aAvatarRULE-AVATARFIELD-06â Truyá»naltcho avatar Äá» Äảm bảo accessibility
BreadCrumbs (uikit-breadcrumbs)
RULE-BREADCRUMBS-01â Truyá»nitemsÄúng cấu trúcBreadCrumbItems[]â má»i item phải cólabelRULE-BREADCRUMBS-02â Sá» dụngchildrenÄá» tạo dropdown menu cho itemRULE-BREADCRUMBS-03â Sá» dụngisAutoRedirectkhi item cóchildrenvà cần click Äá» Äiá»u hưá»ngRULE-BREADCRUMBS-04â Sá» dụngisFullLabelkhi không muá»n label bá» cắt ngắnRULE-BREADCRUMBS-05â Sá» dụngisDisabledÄá» vô hiá»u hóa Äiá»u hưá»ngRULE-BREADCRUMBS-06â Sá» dụngisShowtrên item ÄỠẩn item, không dùng filter bên ngoà i
Button (uikit-button)
RULE-BTN-01â Sá» dụngButton onlyIcon(không phải bareIconButton) khi cần tooltipRULE-BTN-02â Sá» dụng proploadingthay vì manual spinner + disabledRULE-BTN-03â Sá» dụngstartIcon/endIcon, không phải icon as childrenRULE-BTN-04â Sá» dụngdisabledTooltipÄá» suppress tooltip trênonlyIconbuttons
ButtonGroup (uikit-button-group)
RULE-BTN-GROUP-01â Sá» dụngButtonGroupÄá» nhóm các button liên quan, không dùng manual flex wrappersRULE-BTN-GROUP-02â SetsizetrênButtonGroup, không phải trên từng childrenRULE-BTN-GROUP-03â Sá» dụngrow={false}cho vertical layout (mặc Äá»nh là horizontal)RULE-BTN-GROUP-04â Không nestButtonGroupbên trongButtonGroupkhác
Calendar (uikit-calendar)
RULE-CALENDAR-01âvaluelÃDayjs | nullâ không truyá»n Date, string, hay timestampRULE-CALENDAR-02âonChangenháºn callback vá»i 2 tham sá» â phải xá» lýoptions.isChangeTimeRULE-CALENDAR-03â Sá» dụngmin/maxlÃDayjsÄá» giá»i hạn khoảng ngà y â không tá»± validate bên ngoà iRULE-CALENDAR-04â BáºtdateTimeÄá» hiá»n thá» TimeSelect â không tá»± build time picker bên ngoà iRULE-CALENDAR-05â Sá» dụngheaderTextFormatÄá» tuỳ chá»nh hiá»n thá» tháng/nÄm â không tá»± build headerRULE-CALENDAR-06â Sá» dụngdisabledKeyboardkhi không muá»n keyboard navigationRULE-CALENDAR-07âtimeSelectPropschá» truyá»n khidateTime={true}RULE-CALENDAR-08â Calendar tá»± Äiá»u hưá»ng Äến tháng/nÄm cá»§avalueâ không cần tá»± quản lý
Cascader (uikit-cascader)
RULE-CASCADER-01â Luôn truyá»n Äá»§ 5 props bắt buá»c âvalue,onChange,options,getValue,getLabelRULE-CASCADER-02â Sá» dụngsingleSelectÄá» chuyá»n sang chế Äá» chá»n má»t â không tá»± quản lý logic single selectRULE-CASCADER-03â Option cóchildrensẽ má» rá»ng cá»t con â không chá»n trá»±c tiếpRULE-CASCADER-04â Sá» dụngfullWidththay vì override className cho chiá»u rá»ngRULE-CASCADER-05â Sá» dụngerrorkết hợphelperTextcho validation â không tá»± thêm HelperText bên ngoà iRULE-CASCADER-06â Sá» dụngclearableÄá» hiá»n thá» nút xoá â không tá»± build clear buttonRULE-CASCADER-07â Sá» dụngsearchable={false}Äá» tắt tìm kiếm â không ẩn bằng CSSRULE-CASCADER-08â Sá» dụngrenderOptionÄá» tuỳ chá»nh hiá»n thá» option â không override CSS ná»i bá»RULE-CASCADER-09âdisabledvÃreadOnlycó hà nh vi khác nhau â không nhầm lẫnRULE-CASCADER-10â Sá» dụngrenderTagvÃrenderLimitTagÄá» tuỳ chá»nh tag â không tá»± build tag list bên ngoà i
Checkbox & CheckboxGroup (uikit-checkbox)
RULE-CHECKBOX-01â Paircheckedvá»ionChangetrong controlled mode â omitcheckedcho uncontrolledRULE-CHECKBOX-02â Sá» dụngindeterminatecho trạng thái “chá»n má»t phần” â không tá»± build iconRULE-CHECKBOX-03â Sá» dụngsizecho kÃch thưá»c â không override width/height qua classNameRULE-CHECKBOX-04â Không truyá»ntypeâ component luôn là checkboxRULE-CHECKBOX-05â Sá» dụngCheckboxGroupÄá» quản lý nhóm checkbox â không tá»± viết logic toggle mảngRULE-CHECKBOX-06â Sá» dụngFormControlLabelÄá» thêm label cho checkbox trong CheckboxGroupRULE-CHECKBOX-07â Sá» dụngrowtrên CheckboxGroup cho layout ngang â không override flex directionRULE-CHECKBOX-08âdisabledtrên CheckboxGroup override disabled cá»§a từng childrenRULE-CHECKBOX-09â Má»i Checkbox trong CheckboxGroup phải cóvalueuniqueRULE-CHECKBOX-10â Sá» dụnglabelPlacementtrên FormControlLabel Äá» Äá»i vá» trà label â không Äảo thứ tá»± JSX
CheckboxGroup (uikit-checkbox-group)
RULE-CBXGRP-01â Luôn truyá»nvalue(mảng) vÃonChangeâ CheckboxGroup là controlled componentRULE-CBXGRP-02â Không tá»± viết logic toggle mảng â CheckboxGroup Äã xá» lý sẵnRULE-CBXGRP-03â Má»i Checkbox con phải cóvalueuniqueRULE-CBXGRP-04â Sá» dụngrowÄá» chuyá»n layout ngang â không override flex direction qua classNameRULE-CBXGRP-05âdisabledtrên CheckboxGroup override disabled cá»§a từng childrenRULE-CBXGRP-06â Sá» dụngFormControlLabelÄá» thêm label â không tá»± tạo layout label + checkboxRULE-CBXGRP-07â Không tá»± wrap container div â CheckboxGroup Äã render div vá»i flex layoutRULE-CBXGRP-08â Generic type T ÄÆ°á»£c suy luáºn từvalueâ Äảm bảo kiá»u nhất quán
CircularProgressBar (uikit-circular-progress-bar)
RULE-CPB-01âpercentagelà prop duy nhất bắt buá»c â luôn truyá»n giá trá» hợp lá» từ 0 Äến 100RULE-CPB-02â Khi báºtisUnlimited, vòng tròn luôn hiá»n thá» Äầy và bá» quapercentageRULE-CPB-03â Luôn truyá»nwidthvÃheightcùng giá trá» Äá» vòng tròn không bá» méoRULE-CPB-04â Sá» dụngclassFontSizeÄá» Äiá»u chá»nh kÃch thưá»c chữ khi thay Äá»i kÃch thưá»c vòng trònRULE-CPB-05â Sá» dụng propcolorÄá» thay Äá»i mà u thanh progress â không override qua CSSRULE-CPB-06â Gradient IDgradientStrokelà cá» Äá»nh â tránh render nhiá»u instanceisUnlimited
CKEditor (uikit-ckeditor)
RULE-CKEDITOR-01â Luôn truyá»nvaluevÃonChangeâ CKEditor là controlled componentRULE-CKEDITOR-02â Sá» dụngminHeight/maxHeighthoặcautoGrowcho editor co giãn â không override CSS heightRULE-CKEDITOR-03â Truyá»n Äá»§uploadImageUrl+getUrlFromFileUploadResponseÄá» upload ảnh hoạt Äá»ngRULE-CKEDITOR-04â Cấu hìnhautocompleteConfigsÄầy Äá»§patternvÃdataCallbackâ không tá»± build autocompleteRULE-CKEDITOR-05â Sá» dụng refsetTextValueÄá» chèn text â không truy cáºp DOM trá»±c tiếpRULE-CKEDITOR-06â Sá» dụngerrorvÃhelperTextcho validation â không tá»± thêm HelperText bên ngoà iRULE-CKEDITOR-07â Sá» dụngstickyTopToolbarkhi editor nằm trong scrollable containerRULE-CKEDITOR-08â Sá» dụngdisabledModulesÄá» tắt toolbar items â không ẩn bằng CSS
CollapsibleContainer (uikit-collapsible-container)
RULE-COLLAPSIBLE-01â Sá» dụng uncontrolled mode khi không cần external stateRULE-COLLAPSIBLE-02â Luôn paircollapsedvá»ionToggleCollapsetrong controlled modeRULE-COLLAPSIBLE-03â Sá» dụngunmountOnHide={false}Äá» preserve children stateRULE-COLLAPSIBLE-04â Không manually control visibility cá»§a childrenRULE-COLLAPSIBLE-05â PasstitleasReactNodecho rich header content
ColorPicker (uikit-color-picker)
RULE-COLOR-PICKER-01â Truyá»ndefaultValuelà mà u hợp lá» âonChangeColorchá» fire khi mà u validRULE-COLOR-PICKER-02â Sá» dụngshowCurrentColorÄá» hiá»n thá» mà u hiá»n tại là m background nútRULE-COLOR-PICKER-03â Sá» dụngshowResetÄá» hiá»n nút reset â không tá»± build reset bên ngoà iRULE-COLOR-PICKER-04â Sá» dụngshowTransparentkhi cần há» trợ mà u trong suá»tRULE-COLOR-PICKER-05â Sá» dụngisSelected+onClickÄá» quản lý selection trong danh sách mà uRULE-COLOR-PICKER-06â Sá» dụngchildrenÄá» tuỳ chá»nh trigger â không wrap ColorPicker trong custom buttonRULE-COLOR-PICKER-07â Sá» dụngwidth/heightÄá» thay Äá»i kÃch thưá»c nút â không override qua className
ConfirmModal (uikit-confirm-modal)
RULE-CONFIRM-01â Sá» dụngConfirmModalcho tất cả destructive action confirmations, không bao giá» build customRULE-CONFIRM-02â OmitonCancelkhi nó có behavior giá»ngonCloseRULE-CONFIRM-03â Sá» dụng proploadingthay vì manual disabled + spinnerRULE-CONFIRM-04â PassmessageasReactNodecho rich contentRULE-CONFIRM-05â CustomizecancelText/confirmTextkhi default text không rõ rà ng
CopyButton (uikit-copy-button)
RULE-COPY-01â Sá» dụngCopyButtonthay vì manual clipboard logicRULE-COPY-02â Sá» dụngonClickchá» cho side effects, không phải cho clipboard logicRULE-COPY-03â Sá» dụngshowTooltip={false}chá» khi context Äã communicate action rõ rà ngRULE-COPY-04â Không manually manage copied state bên ngoà i componentRULE-COPY-05â Sá» dụng propsicon/successIconÄá» customize icons, không phải children
CopyLinkButton (uikit-copy-link-button)
RULE-COPYLINK-01â Sá» dụngCopyLinkButtonthay vì tá»± xây dá»±ng logic sao chép URLRULE-COPYLINK-02â Truyá»n ÄÆ°á»ng dẫn tương Äá»i cho proplink, không truyá»n full URLRULE-COPYLINK-03â Không tá»± quản lý trạng thái copied bên ngoà i componentRULE-COPYLINK-04â Phân biá»tCopyButtonvÃCopyLinkButton
CountrySelect (uikit-country-select)
RULE-COUNTRY-SELECT-01â Sá» dụng mã ISO2 chovaluevÃcountriesâ không dùng tên quá»c giaRULE-COUNTRY-SELECT-02â Pairvaluevá»ionChangecho controlled mode â omitvaluecho uncontrolledRULE-COUNTRY-SELECT-03â Sá» dụngshowDialCodevÃshowCurrencyCodeÄá» hiá»n thá» thông tin bá» sungRULE-COUNTRY-SELECT-04â Sá» dụngcountriesÄá» lá»c danh sách â không tá»± filter optionsRULE-COUNTRY-SELECT-05â Không override các props hardcoded âsearchable,showCheckIcon,getValue,getLabel,options
CreatedByInfo (uikit-created-by-info)
RULE-CREATED-BY-01â Sá» dụngisSystemcho Automation Cogover, không phải manual markupRULE-CREATED-BY-02â Luôn passidÄá» Äảm bảo avatar fallback color nhất quánRULE-CREATED-BY-03â Pass objectImageResponsetrá»±c tiếp khi avatar Äến từ APIRULE-CREATED-BY-04â Không wrap vá»i custom tooltip â SmartTooltip Äã built-inRULE-CREATED-BY-05â Không recreate layout nà y manually vá»i Avatar + name span
DatePicker (uikit-date-picker)
RULE-DATE-PICKER-01âvaluelÃDayjs | nullâ không truyá»n Date, string, hay timestampRULE-DATE-PICKER-02â Format có chứa giá» tá»± kÃch hoạt DateTime mode â không cần prop riêngRULE-DATE-PICKER-03â Sá» dụngmin/maxlÃDayjsÄá» giá»i hạn khoảng ngà y â không tá»± validate bên ngoà iRULE-DATE-PICKER-04â Sá» dụngclearableÄá» cho phép xoá giá trá» â mặc Äá»nh Äã báºtRULE-DATE-PICKER-05â Sá» dụnguseTimeAgoValuevá»itimeAgoValue+onChangeTimeAgoValuecho preset time agoRULE-DATE-PICKER-06â Sá» dụngrenderValueÄá» tuỳ chá»nh hiá»n thá» â không override input value bên ngoà iRULE-DATE-PICKER-07â Sá» dụngcalendarPropsÄá» truyá»n config xuá»ng Calendar â không tá»± build calendarRULE-DATE-PICKER-08â Input há» trợ nháºp tay â blur sẽ parse và validate theoformat
DateRangeCalendar (uikit-date-range-calendar)
RULE-DATE-RANGE-CAL-01âvaluelà tuple[Dayjs | null, Dayjs | null]â không truyá»n Date, stringRULE-DATE-RANGE-CAL-02âonChangetrả vá» má»tDayjsduy nhất â tá»± quản lý logic from/to bên ngoà iRULE-DATE-RANGE-CAL-03â Sá» dụngfocusedValueIndexÄá» Äiá»u khiá»n focus và o from (0) hoặc to (1)RULE-DATE-RANGE-CAL-04â BáºtdateTimeÄá» hiá»n thá» TimeSelect â không tá»± build time pickerRULE-DATE-RANGE-CAL-05â Sá» dụngmin/maxlÃDayjsÄá» giá»i hạn khoảng ngà yRULE-DATE-RANGE-CAL-06â Sá» dụngdisabledKeyboardkhi dùng trong Popper/PopupRULE-DATE-RANGE-CAL-07â Sá» dụngheaderTextFormatÄá» tuỳ chá»nh header â không tá»± buildRULE-DATE-RANGE-CAL-08â Highlight khoảng ngà y ÄÆ°á»£c xá» lý tá»± Äá»ng â không cần tuỳ chá»nh
DateRangePicker (uikit-date-range-picker)
RULE-DATE-RANGE-PICKER-01âvaluelÃ[Dayjs | null, Dayjs | null]â không truyá»n Date, stringRULE-DATE-RANGE-PICKER-02â Format có chứa giá» tá»± kÃch hoạt DateTime mode â không cần prop riêngRULE-DATE-RANGE-PICKER-03â Sá» dụngfromMin/fromMax/toMin/toMaxÄá» giá»i hạn khoảng ngà yRULE-DATE-RANGE-PICKER-04â Component tá»± Äá»ng hoán Äá»i from/to khi from > toRULE-DATE-RANGE-PICKER-05â Sá» dụngrenderValueÄá» tuỳ chá»nh hiá»n thá»RULE-DATE-RANGE-PICKER-06â Sá» dụngcalendarPropsÄá» truyá»n config xuá»ng DateRangeCalendarRULE-DATE-RANGE-PICKER-07â Input há» trợ nháºp tay â blur sẽ parse và validate theoformatRULE-DATE-RANGE-PICKER-08â Sá» dụnghelperTextvÃerrorcho thông báo lá»iRULE-DATE-RANGE-PICKER-09â Sá» dụnggetFromRefvÃgetToRefÄá» truy cáºp input refRULE-DATE-RANGE-PICKER-10â Xoá giá trá» bằng icon clear có sẵn â không tá»± build nút clear
DateTimeWithTooltip (uikit-date-time-with-tooltip)
RULE-DTWT-01âtimephải là timestamp (number) hoặc date string â không truyá»n Dayjs, Date objectRULE-DTWT-02â Không tá»± format ngà y giá» + wrap Tooltip thá»§ công â sá» dụng DateTimeWithTooltipRULE-DTWT-03â Không cần kiá»m tratimetrưá»c khi render â component tá»± trả vá»nullRULE-DTWT-04â Sá» dụng spread HTMLAttributes Äá» tuỳ chá»nh â không wrap thêm span/divRULE-DTWT-05â Không tá»± xá» lý logic AM/PM sang SA/CH â component tá»± chuyá»n Äá»i theo ngôn ngữRULE-DTWT-06â Không wrap DateTimeWithTooltip vá»i Tooltip bên ngoà i â tooltip Äã tÃch hợp sẵn
DraggableWrapper & DraggableItem (uikit-draggable-wrapper, uikit-draggable-item)
RULE-DW-01â Luôn sá» dụngDraggableWrapperkết hợp vá»iDraggableItemâ không dùng trá»±c tiếpreact-beautiful-dndRULE-DW-02âchildrencá»§aDraggableItemphải là render function nháºndragHandlePropsRULE-DW-03â Luôn spreaddragHandlePropslên phần tá» dùng là m tay cầm kéoRULE-DW-04âdraggableIdphải là duy nhất â không sá» dụngindexRULE-DW-05â Sá» dụngdirection="horizontal"khi cần kéo thả ngang â mặc Äá»nh"vertical"RULE-DW-06â Xá» lýdestinationIndexcó thá» lÃundefinedtrongonDragEndRULE-DW-07â Truyá»nhasDraggable={true}và oModalkhi DraggableWrapper bên trongRULE-DW-08â Sá» dụngisDragDisabledÄá» vô hiá»u hóa kéo â không ẩndragHandlePropsRULE-DI-01â Luôn sá» dụngDraggableItembên trongDraggableWrapperRULE-DI-02âchildrenlà render function â phải spreaddragHandlePropslên drag handleRULE-DI-03â SpreaddragHandlePropslên phần tá» con cụ thá» khi cần drag handle riêngRULE-DI-04âdraggableIdphải là duy nhất và chuá»i á»n Äá»nhRULE-DI-05âindexphải là sá» thứ tá»± liên tục bắt Äầu từ 0RULE-DI-06â Sá» dụngisDragDisabledÄá» vô hiá»u hóa kéo có Äiá»u kiá»nRULE-DI-07â Khi sá» dụng trongModal, phải truyá»nhasDraggable={true}
Drawer (uikit-drawer)
RULE-DRAWER-01â Render có Äiá»u kiá»n Drawer Äá» má»/Äóng â không có propopen/visibleRULE-DRAWER-02â Sá» dụngplacementÄá» xác Äá»nh vá» trà hiá»n thá»RULE-DRAWER-03â Sá» dụngwidthvÃheightÄá» tùy chá»nh kÃch thưá»cRULE-DRAWER-04â Truyá»nonOverlayClickÄá» Äóng drawer khi nhấn overlayRULE-DRAWER-05â Sá» dụnghasOverlay={false}khi không cần overlayRULE-DRAWER-06â Không truyá»n rõ rà ng các giá trá» mặc Äá»nhRULE-DRAWER-07â Sá» dụngtitleÄá» hiá»n thá» header vá»i nút ÄóngRULE-DRAWER-08â Quản lýtriggerEscPresskhi có modal/dialog lá»ng nhauRULE-DRAWER-09â Sá» dụngheadingClassNamevÃoverlayClassNameÄá» tùy chá»nh style
FilterGenerator (uikit-filter-generator)
RULE-FILTER-GENERATOR-01â FilterGenerator là controlled component â phải truyá»n Äầy Äá»§logicType,logicValue,filterItemsvà các hà m onChange tương ứngRULE-FILTER-GENERATOR-02âdataFieldsphải là mảngDataField[]hợp lá» â không truyá»n mảng rá»ng hoặc dữ liá»u không Äúng kiá»uRULE-FILTER-GENERATOR-03â Sá» dụnglogicTypeÄá» chá»n kiá»u logic kết hợp â không tá»± build logic select bên ngoà iRULE-FILTER-GENERATOR-04â Sá» dụnglogicType="CUSTOM"kết hợplogicValueÄá» tạo biá»u thức logic tuỳ chá»nhRULE-FILTER-GENERATOR-05â Sá» dụngrequiredÄỠẩn tuỳ chá»n “NONE” trong logic selectRULE-FILTER-GENERATOR-06â Sá» dụngrecordDataFieldskết hợptextÄá» hiá»n thá» trưá»ng dữ liá»u record theo nhómRULE-FILTER-GENERATOR-07â Sá» dụngclearablekết hợponResetÄá» cho phép reset filterRULE-FILTER-GENERATOR-08âdisabledvÃreadOnlycó hà nh vi khác nhau â không nhầm lẫnRULE-FILTER-GENERATOR-09â Sá» dụngmaxFilterItemCountÄá» giá»i hạn sá» Äiá»u kiá»nRULE-FILTER-GENERATOR-10â Sá» dụngshowPreviewvÃonClickPreviewÄá» hiá»n thá» nút xem trưá»cRULE-FILTER-GENERATOR-11â Sá» dụnginsertFieldObjectButtonWrapperPropskhi cần chá»n giá trá» từ biếnRULE-FILTER-GENERATOR-12â Sá» dụngrenderValueInputWrapperÄá» tuỳ chá»nh wrapper cá»§a input giá trá»RULE-FILTER-GENERATOR-13â Sá» dụngshowCustomLogicErrorÄá» kiá»m soát hiá»n thá» lá»i logic tuỳ chá»nhRULE-FILTER-GENERATOR-14â Sá» dụngFilterGeneratorItemÄúng cấu trúc khi khá»i tạo filterItemsRULE-FILTER-GENERATOR-15â Sá» dụngonChangeFilterItemParamskhi cần theo dõi thay Äá»i params cá»§a từng Äiá»u kiá»n
FilterGeneratorBase (uikit-filter-generator-base)
RULE-FILTER-GENERATOR-BASE-01â FilterGeneratorBase là controlled component â phải truyá»n Äầy Äá»§ state và callbackRULE-FILTER-GENERATOR-BASE-02â Phải khai báo generic type choFilterGeneratorBasevÃFilterGeneratorBaseItemRULE-FILTER-GENERATOR-BASE-03â Sá» dụngrenderFieldÄá» render field selector â không tá»± build bên ngoà iRULE-FILTER-GENERATOR-BASE-04â Sá» dụngrenderOperatorsÄá» render operator dá»±a trên field Äã chá»nRULE-FILTER-GENERATOR-BASE-05â Sá» dụngrenderValueInputÄá» render input giá trá» dá»±a trên field và operatorRULE-FILTER-GENERATOR-BASE-06â Sá» dụnglogicTypeÄá» chá»n kiá»u kết hợp Äiá»u kiá»nRULE-FILTER-GENERATOR-BASE-07â Sá» dụngminFilterItemCountÄá» giá»i hạn sá» Äiá»u kiá»n tá»i thiá»uRULE-FILTER-GENERATOR-BASE-08â Sá» dụngmaxFilterItemCountÄá» giá»i hạn sá» Äiá»u kiá»n tá»i ÄaRULE-FILTER-GENERATOR-BASE-09â Sá» dụnggetNewParamsWhenChangeOperatorÄá» reset params khi Äá»i operatorRULE-FILTER-GENERATOR-BASE-10â Sá» dụnggetNewOperatorWhenChangeFieldÄá» tá»± Äá»ng Äá»i operator khi Äá»i fieldRULE-FILTER-GENERATOR-BASE-11â Sá» dụngtextÄá» tuỳ chá»nh nhãn cá»tRULE-FILTER-GENERATOR-BASE-12â Sá» dụngrequiredÄỠẩn lá»±a chá»n “NONE” trong logic typeRULE-FILTER-GENERATOR-BASE-13â Sá» dụngdisabledÄá» vô hiá»u hoá toà n bá» bá» lá»cRULE-FILTER-GENERATOR-BASE-14â Sá» dụngshowCustomLogicErrorÄá» kiá»m soát hiá»n thá» lá»i custom logic
FormBuilder (uikit-form-builder)
RULE-FORM-BUILDER-01â FormBuilder bắt buá»c phải nằm trong FormProvider cá»§a react-hook-formRULE-FORM-BUILDER-02â Phải sá» dụng useCreateDefaultValues và useCreateSchema Äá» tạo defaultValues và schema từ layoutRULE-FORM-BUILDER-03â Phải truyá»n ref cho FormBuilder và sá» dụng useSubmitFormBuilder Äá» submitRULE-FORM-BUILDER-04â Sá» dụng formId từ uuid, không tá»± tạo string bất kỳRULE-FORM-BUILDER-05â Phân biá»t rõ layoutType và detailForm cho create mode và edit modeRULE-FORM-BUILDER-06â Truyá»n layoutId Äá» báºt layout rules â không truyá»n khi không cầnRULE-FORM-BUILDER-07â Sá» dụng useGetLayout Äá» lấy layout data â không tá»± build layout treeRULE-FORM-BUILDER-08â Sá» dụng setFormBuilderFieldError Äá» hiá»n thá» lá»i từ API responseRULE-FORM-BUILDER-09â Sá» dụng useFormBuilderButton và useHandleClickButtonGroup Äá» xá» lý button groupRULE-FORM-BUILDER-10â Sá» dụng groupSlots và fieldSlots Äá» custom render â không override CSS ná»i bá»RULE-FORM-BUILDER-11â Sá» dụng LayoutRuleProvider khi cần kiá»m tra change layout trưá»c khi render FormBuilderRULE-FORM-BUILDER-12â Phải kiá»m tra dữ liá»u sẵn sà ng trưá»c khi render FormBuilder
FilePreview (uikit-file-preview)
RULE-FP-01â Chá»n Äúng variantFilePreviewhoặcBaseFilePreviewRULE-FP-02â Render có Äiá»u kiá»n Äá» má»/Äóng FilePreviewRULE-FP-03â Sá» dụng controlledactiveIndexkhi cần Äá»ng bá» trạng thái bên ngoà iRULE-FP-04â Không truyá»n rõ rà ng các giá trá» mặc Äá»nh choscaleStep,minScale,maxScaleRULE-FP-05â Sá» dụnggetPublicUrltrongBaseFilePreviewcho file cần xác thá»±cRULE-FP-06â Không tá»± xây dá»±ng nút Äiá»u hưá»ng hoặc zoom cho FilePreviewRULE-FP-07â Truyá»n mảngfileschứa Ãt nhất má»t phần tá»
FormControlLabel (uikit-form-control-label)
RULE-FCL-01â Sá» dụngFormControlLabelÄá» gắn label cho control â không tá»± tạo layoutRULE-FCL-02â Truyá»n component và o propcontrolâ không truyá»n và o childrenRULE-FCL-03â Sá» dụnglabelPlacementÄá» Äá»i vá» trà label â không Äảo thứ tá»± JSXRULE-FCL-04â Sá» dụnglabelAlignÄá» cÄn chá»nh labelRULE-FCL-05â Truyá»ndisabledtrên FormControlLabel Äá» Äá»ng bá» disabled stateRULE-FCL-06â Sá» dụngdisabledLabelÄá» kiá»m soát style label khi disabledRULE-FCL-07â Sá» dụngusingHtmlFor={false}khi control không há» trợ htmlForRULE-FCL-08â Sá» dụngclassNameLabelÄá» style label â không override quaclassNameRULE-FCL-09â Label há» trợ ReactNode â sá» dụng cho ná»i dung phức tạp
HelpButton (uikit-help-button)
RULE-HELP-01â Sá» dụngHelpButtoncho tất cả inline help/hint content, không phải custom tooltipsRULE-HELP-02â Sá» dụngrenderHTML={true}khihelpTextlà Quill rich-text HTML stringRULE-HELP-03â Pass plainReactNodechohelpTextkhi là simple text contentRULE-HELP-04â Sá» dụngpopperPropsÄá» override placement/offset, không re-wrap vá»i PopperRULE-HELP-05â Sá» dụngclassNameContainerÄá» style popover box, không phảiclassName
HelperText (uikit-helper-text)
RULE-HELPER-01â Sá» dụngHelperTextcho tất cả form field helper/error/warning messagesRULE-HELPER-02â Sá» dụng propcolorcho semantic feedback, không bao giá» override color quaclassNameRULE-HELPER-03â Omitcolorcho neutral/secondary helper textRULE-HELPER-04â Không thêmmt-*margin manually âHelperTextÄã cómt-[4px]RULE-HELPER-05â Conditionally renderHelperText, không pass empty string
HorizontalSteps (uikit-horizontal-steps)
RULE-HSTEPS-01âcurrentSteplà 0-based â không pass giá trá» 1-basedRULE-HSTEPS-02â Luôn setisCanClickkhionClickStepenables navigationRULE-HSTEPS-03â Không passonClickStepkhi steps không navigableRULE-HSTEPS-04â Giữ length cá»§astepLabelsá»n Äá»nh â không conditionally add/remove stepsRULE-HSTEPS-05â Sá» dụngclassNameIconÄá» style step circles, không phảiclassName
IconButton (uikit-icon-button)
RULE-ICON-01â Chá» sá» dụng trá»±c tiếp khi không cần tooltipRULE-ICON-02â Pass icon as children, không phải quastartIcon/endIconRULE-ICON-03â Không overridep-0hoặcmin-w-[unset]
InsertFieldObjectButtonV2 (uikit-insert-field-object-button-v2)
RULE-INSERT-FIELD-V2-01â Phải truyá»nrootObjectsvÃonInsertâ Äây là các props bắt buá»cRULE-INSERT-FIELD-V2-02â Cấu hìnhrootObjectsÄúng Äá»nh dạngInsertFieldRootObjectItemRULE-INSERT-FIELD-V2-03â Sá» dụngisAdditionalOptioncho các option Äặc biá»t không phải objectRULE-INSERT-FIELD-V2-04â Sá» dụngchildrenrender prop Äá» tuỳ chá»nh nút bấmRULE-INSERT-FIELD-V2-05â Sá» dụngisDisabledÄá» vô hiá»u hoá nútRULE-INSERT-FIELD-V2-06â Sá» dụngselectedDataFieldÄá» tá»± Äá»ng lá»c trưá»ng tương thÃchRULE-INSERT-FIELD-V2-07â Sá» dụngcheckSelectableFieldkhi cần logic lá»c phức tạpRULE-INSERT-FIELD-V2-08â Sá» dụngfilterDataFieldÄá» lá»c danh sách trưá»ng hiá»n thá» â không nhầm vá»icheckSelectableFieldRULE-INSERT-FIELD-V2-09â Sá» dụngmaxLevelÄá» giá»i hạn Äá» sâu duyá»t object liên kếtRULE-INSERT-FIELD-V2-10â Sá» dụngdescriptionÄá» thay Äá»i mô tả trong modalRULE-INSERT-FIELD-V2-11â Sá» dụngrenderNametrong rootObjects Äá» tuỳ chá»nh tên hiá»n thá»RULE-INSERT-FIELD-V2-12â Kết hợp vá»iInsertFieldObjectButtonWrapper2khi cần hiá»n thá» giá trá» Äã chá»n và nút xoá
InsertFieldObjectButtonWrapper2 (uikit-insert-field-object-button-wrapper2)
RULE-INSERT-WRAPPER2-01â Phải truyá»nchildrenlà m ná»i dung mặc Äá»nh khi chưa chá»n biếnRULE-INSERT-WRAPPER2-02âselectedVariableSlugvÃonClearphải Äi cùng nhauRULE-INSERT-WRAPPER2-03ârootObjectsphải Äúng Äá»nh dạngInsertFieldRootObjectItem[]RULE-INSERT-WRAPPER2-04â Sá» dụngonInsertÄá» nháºn giá trá» biến Äã chá»n â không tá»± build modalRULE-INSERT-WRAPPER2-05â Sá» dụngisHideButtonÄỠẩn nút chèn biến â không ẩn bằng CSSRULE-INSERT-WRAPPER2-06â Sá» dụngisDisabledÄá» vô hiá»u hoá nút chèn biến và nút clearRULE-INSERT-WRAPPER2-07â Sá» dụngselectedDataFieldÄá» lá»c field mặc Äá»nhRULE-INSERT-WRAPPER2-08â Sá» dụngcheckSelectableFieldkhi cần logic lá»c tuỳ chá»nhRULE-INSERT-WRAPPER2-09â Sá» dụngmaxLevelÄá» giá»i hạn Äá» sâu treeRULE-INSERT-WRAPPER2-10â Wrapper chiếm toà n bá» chiá»u rá»ng parent â bá»c trong container Äá» kiá»m soát kÃch thưá»c
InsertFieldObjectV2 (uikit-insert-field-object-v2)
RULE-INSERT-OBJECT-V2-01â Sá» dụngInsertFieldObjectButtonWrapper2thay vì tá»± build UI má» modalRULE-INSERT-OBJECT-V2-02â Cấu trúcrootObjectsphải cóslugvÃvariableSlugâ không nhầm lẫnRULE-INSERT-OBJECT-V2-03â Sá» dụngisAdditionalOptioncho các option không phải objectRULE-INSERT-OBJECT-V2-04â Sá» dụngrenderNametrongrootObjectsÄá» tuỳ chá»nh tên hiá»n thá»RULE-INSERT-OBJECT-V2-05â Sá» dụngselectedDataFieldÄá» tá»± Äá»ng lá»c field tương thÃchRULE-INSERT-OBJECT-V2-06â Sá» dụngcheckSelectableFieldkhi cần logic lá»c tuỳ chá»nh â trả vá» Äúng kiá»uRULE-INSERT-OBJECT-V2-07â Sá» dụngfilterDataFieldÄá» lá»c field hiá»n thá» â không nhầm vá»icheckSelectableFieldRULE-INSERT-OBJECT-V2-08â Sá» dụngmaxLevelÄá» giá»i hạn Äá» sâu cascaderRULE-INSERT-OBJECT-V2-09â CallbackonInsertnháºn(value, treeData)â sá» dụng Äúng tham sá»RULE-INSERT-OBJECT-V2-10â Sá» dụngInsertFieldObjectButtonV2khi cần tuỳ chá»nh nút má» modalRULE-INSERT-OBJECT-V2-11â Sá» dụngisHideButtonÄỠẩn nút má» modal trong WrapperRULE-INSERT-OBJECT-V2-12â Sá» dụngisDisabledÄá» vô hiá»u hoá nút má» modal
LayoutSelectButton (uikit-layout-select-button)
RULE-LAYOUT-SELECT-BTN-01â LayoutSelectButton là controlled component â phải truyá»n Äá»§ 3 props bắt buá»cRULE-LAYOUT-SELECT-BTN-02â Sá» dụnguseGetLayouthook Äá» lấy dữ liá»u â không tá»± build state và fetch layoutRULE-LAYOUT-SELECT-BTN-03â Không tá»± build dropdown chá»n layout â sá» dụng LayoutSelectButtonRULE-LAYOUT-SELECT-BTN-04â Äặt LayoutSelectButton trong container flex justify-endRULE-LAYOUT-SELECT-BTN-05â Ẩn khi danh sách layout rá»ng hoặc Äang loadingRULE-LAYOUT-SELECT-BTN-06â Má»i item tronglistLayoutsphải cóidvÃnameduy nhất
LazyImage (uikit-lazy-image)
RULE-LAZY-IMG-01â Sá» dụngLazyImagethay vì raw<img>cho tất cả imagesRULE-LAZY-IMG-02â Sá» dụngfallbackSrccho graceful degradation khi image bá» lá»iRULE-LAZY-IMG-03â Không override attributeloadingtrừ khi image á» above-the-foldRULE-LAZY-IMG-04â PassonErrorchá» cho side effects, không phải Äá» swap srcRULE-LAZY-IMG-05â Không sá» dụngfallbackSrclà m primary src
LimitableList (uikit-limitable-list)
RULE-LIMLIST-01â Cung cấpgetItemWidthkhirenderItemtrả vá» ná»i dung có chiá»u rá»ng khác text thuầnRULE-LIMLIST-02â Sá» dụngrenderItemcho dòng chÃnh,renderListItemcho popupRULE-LIMLIST-03â Truyá»nshowSeparate={false}khi không muá»n dấu chấm phân cáchRULE-LIMLIST-04â Sá» dụngrenderListItemskhi cần tuỳ chá»nh toà n bá» ná»i dung popupRULE-LIMLIST-05â Sá» dụngpopperPropsÄá» tuỳ chá»nh popup, không wrap bằng PopperRULE-LIMLIST-06â Cung cấpgetTooltipContentkhi item không phải kiá»u string
ListViewTable (uikit-list-view-table)
RULE-LIST-VIEW-TABLE-01â Luôn truyá»ndataKeyvÃcolumnsvì Äây là props bắt buá»c kế thừa từ TableRULE-LIST-VIEW-TABLE-02â Sá» dụngclassNamecho container ngoà i vÃtableClassNamecho Table bên trong â không nhầm lẫnRULE-LIST-VIEW-TABLE-03â Sá» dụngrenderActionButtonsvÃrenderContextButtonsÄá» hiá»n thá» nút hà nh Äá»ngRULE-LIST-VIEW-TABLE-04â Sá» dụngrenderHeadingOptionsÄá» render phần tuỳ chá»n giữa header và bảngRULE-LIST-VIEW-TABLE-05â Sá» dụngtitlevÃsubTitlecho tiêu Äá» â không tá»± tạo heading bên ngoà iRULE-LIST-VIEW-TABLE-06â Kiá»m soátfullHeightÄúng cách Äá» bảng chiếm toà n bá» chiá»u cao containerRULE-LIST-VIEW-TABLE-07â Kết hợp ListViewTable vá»i TableSettings Äúng cách qua render props patternRULE-LIST-VIEW-TABLE-08â Không truyá»n Table props và o sai vá» trà â tất cả Table props truyá»n trá»±c tiếp và o ListViewTable
MarkdownPreview (uikit-markdown-preview)
RULE-MDP-01â Truyá»n ná»i dung markdown qua propcontent, không dùngdangerouslySetInnerHTMLRULE-MDP-02â Luôn Äảm bảocontentkhông phảinullhoặcundefinedRULE-MDP-03â Sá» dụngclassNameÄá» tuỳ chá»nh style containerRULE-MDP-04â Sá» dụng propstylecho các giá trá» Äá»ngRULE-MDP-05â Không tá»± cà i Äặtreact-markdownkhi Äã cóMarkdownPreviewRULE-MDP-06â Phân biá»t khi nà o dùngMarkdownPreviewvÃRenderRichEditorValue
Modal (uikit-modal)
RULE-MODAL-01â Conditionally render<Modal>Äá» open/close â không có propopen/visibleRULE-MODAL-02â Sá» dụngrenderFootervá»iModalFootercho footer content, không phải manual childrenRULE-MODAL-03â PasshasDraggable={true}chá» khi sá» dụngreact-beautiful-dndbên trong ModalRULE-MODAL-04â Sá» dụngsizecho standard widths; sá» dụngwidthstring chá» cho custom widthsRULE-MODAL-05â Sá» dụngshowHeader={false}khi không cần header, không phải emptytitleRULE-MODAL-06â Không explicitly pass default values chotriggerEscPressvÃhideOnClickOutsideRULE-MODAL-07â Sá» dụngfixedHeightchá» khi modal body phải luôn fill viewport heightRULE-MODAL-08â Sá» dụngplacementcho corner-anchored modals, không phải manualclassNamepositioning
Pagination (uikit-pagination)
RULE-PAGINATION-01â Sá» dụngdisabledPrev/disabledNextchá» khi cần override logic mặc Äá»nhRULE-PAGINATION-02â Tuỳ chá»nh text hiá»n thá» qua proptext, không tá»± render bên ngoà iRULE-PAGINATION-03â Sá» dụngperPageOptionsÄá» tuỳ chá»nh danh sách lá»±a chá»nRULE-PAGINATION-04â Sá» dụnghideNextPrevvÃhidePerPageÄỠẩn phần tá», không dùng CSSRULE-PAGINATION-05â Luôn truyá»nperPagekhi sá» dụngonChangePerPage
PersonnelDetailCard (uikit-personnel-detail-card)
RULE-PDC-01â Truyá»npersonnelIdÄá» component tá»± gá»i API lấy thông tin nhân sá»±RULE-PDC-02â Sá» dụngPersonnelDetailPopperhoặc Avatar prop thay vì tá»± wrap PopperRULE-PDC-03â Sá» dụngisSystemUsercho tà i khoản há» thá»ng Automation CogoverRULE-PDC-04â Sá» dụngisShowÄá» Äiá»u khiá»n hiá»n thá»RULE-PDC-05â Truyá»npopperPropsqua PersonnelDetailPopper Äá» tuỳ chá»nh vá» trÃRULE-PDC-06â Không tá»± tạo card thông tin nhân sá»± bằng HTML/CSS
PersonnelDetailPopper (uikit-personnel-detail-popper)
RULE-PDP-01â Luôn truyá»npersonnelIdÄá» popup có dữ liá»u hiá»n thá»RULE-PDP-02â Truyá»nisSystemUser={true}khi nhân sá»± là tà i khoản há» thá»ngRULE-PDP-03â Sá» dụngpopperPropsÄá» tuỳ chá»nh Popper, không tá»± wrapRULE-PDP-04âchildrenphải là React element có thá» nháºn DOM eventsRULE-PDP-05â Khi dùng trong Avatar, sá» dụng propidthay vì tá»± wrap PersonnelDetailPopperRULE-PDP-06â Không override các prop mặc Äá»nh cá»§a Popper trừ khi có lý do cụ thá»
Popper (uikit-popper)
RULE-POPPER-01â Sá» dụng render prop pattern vá»ichildren(trigger) vÃrender(content)RULE-POPPER-02â Spread{...params} {...attributes}trongrender, không bao giá» Äảo ngược thứ tá»±RULE-POPPER-03â Sá» dụngPopperMenu+PopperMenuItemcho standard dropdown menusRULE-POPPER-04â Sá» dụngreftyped lÃPopperRefÄá» gá»ishow/hidetừ bên ngoà iRULE-POPPER-05â Sá» dụng propisOpencho controlled mode; không kết hợp vá»i internalonClicktoggleRULE-POPPER-06â Sá» dụngallowHideFunction/allowShowFunctionÄá» conditionally block show/hideRULE-POPPER-07â Sá» dụng utilitycloseAllPopper()Äá» Äóng tất cả poppers cùng lúcRULE-POPPER-08â Thêm classhide-on-clickÄá» auto-close popper khi click itemRULE-POPPER-09â Sá» dụngappendTokhi popper bá» clipped bá»ioverflow: hiddenRULE-POPPER-10â Sá» dụngisFixedkhi anchor element cóposition: fixed
PopperRecordInfo (uikit-popper-record-info)
RULE-PRI-01â Luôn truyá»nobjectSlugvÃrecordIdâ Äây là hai props bắt buá»cRULE-PRI-02â Sá» dụngonClickViewDetailthay vì tá»± xá» lý Äiá»u hưá»ngRULE-PRI-03â Sá» dụngwidthvÃheight(sá», ÄÆ¡n vá» px) Äá» tùy chá»nh kÃch thưá»c popupRULE-PRI-04â Sá» dụnglayoutIdkhi cần hiá»n thá» layout cụ thá»RULE-PRI-05â Không tá»± tạo Popper hiá»n thá» thông tin record â sá» dụng PopperRecordInfoRULE-PRI-06â Có thá» truyá»n thêm các props cá»§a Popper (ngoại trừrender)RULE-PRI-07â Sá» dụng render prop pattern cá»§achildrengiá»ng như Popper
ResizeBar (uikit-resize-bar)
RULE-RESIZE-01â Luôn pass currentwidthstate và o propwidthRULE-RESIZE-02â Update width state quaonResize, không phảionResizeEndRULE-RESIZE-03âonResizeEndnháºndiffWidth(delta), không phải final widthRULE-RESIZE-04â Chá»nplacementdá»±a trên panel á» phÃa nà oRULE-RESIZE-05â Luôn setminWidthvÃmaxWidthÄá» tránh extreme sizesRULE-RESIZE-06â Không manually re-implement resize logic vá»ionResizeStart/onResizeEnd
Show (uikit-show)
RULE-SHOW-01â Sá» dụngShowthay vì toán tá»&&hoặc ternary cho conditional renderingRULE-SHOW-02â Sá» dụng propfallbackthay vì ÄặtShowtrong ternaryRULE-SHOW-03â Sá» dụng render function khi cần giá trá»whenÄã ÄÆ°á»£c thu hẹp kiá»uRULE-SHOW-04â Không lá»ng nhiá»uShowkhi có thá» gá»p Äiá»u kiá»nRULE-SHOW-05â Không truyá»nfallback={null}â Äây là giá trá» mặc Äá»nh
Skeleton (uikit-skeleton)
RULE-SKEL-01â Chá»nvariantphù hợp vá»i hình dạng ná»i dung cần hiá»n thá»RULE-SKEL-02â Không truyá»n rõ rà ng giá trá» mặc Äá»nh chovariantRULE-SKEL-03â Tuỳ chá»nh kÃch thưá»c bằngclassName, không dùng inline styleRULE-SKEL-04â Không tá»± tạo animation loading thá»§ công, sá» dụng SkeletonRULE-SKEL-05â Tá» hợp nhiá»u Skeleton Äá» tạo layout loading phức tạp
SmartTooltip (uikit-smart-tooltip)
RULE-SMTTP-01â Sá» dụng khi tooltip chá» nên xuất hiá»n khi overflow/clampRULE-SMTTP-02â AttachgetRefvà o overflowing element, không phải wrapperRULE-SMTTP-03â Sá» dụngmultipleLinescholine-clamptextRULE-SMTTP-04âchildrenlà render prop({ getRef }) => ReactElement
Spinner (uikit-spinner)
RULE-SPINNER-01â Sá» dụngSpinnerComponentthay vì tá»± tạo spinnerRULE-SPINNER-02â Không thêmanimate-spinvà oclassNameâ animation Äã tÃch hợp sẵnRULE-SPINNER-03â Tuỳ chá»nh kÃch thưá»c bằngclassNamevá»iw-*vÃh-*RULE-SPINNER-04â Khi dùng trong Button, sá» dụng proploadingthay vì chèn Spinner thá»§ công
StepProgressBar (uikit-step-progress-bar)
RULE-SPB-01âpercentagelà required prop duy nhất â luôn pass giá trá» valid từ 0 Äến 100RULE-SPB-02â Hiá»u step circle color behavior: auto-lightened khistepBackgroundColorabsent;stepTextColorchá» có hiá»u lá»±c khistepBackgroundColorÄÆ°á»£c provideRULE-SPB-03â Step circle chá» render khi CẢshowStepNumber=trueVÃstepNumberÄÆ°á»£c providedRULE-SPB-04â Bottom info tá»± hide khi không có content â không setshowBottomInfo={false}unnecessarilyRULE-SPB-05âbottomInfoưu tiên hÆ¡nbottomInfoTextâ không pass cả hai cùng lúcRULE-SPB-06â Sá» dụng propcolorlà single source of truth â không override color qua wrapper stylesRULE-SPB-07â Sá» dụngrightElementcho avatars hoặc badges bên cạnh title â không build custom wrapper layout
Steps (uikit-steps)
RULE-STEPS-01âcurrentStepIndexlà 0-based â không bao giá» pass giá trá» 1-basedRULE-STEPS-02â Tất cả steps Äến và bao gá»mcurrentStepIndexÄÆ°á»£c highlighted â không có phân biá»t “completed vs current”RULE-STEPS-03â Connector line activates giữa hai adjacent active steps â không chá» tại current stepRULE-STEPS-04â Không thêm click handlers trênStepsitself â navigation phải ÄÆ°á»£c managed externallyRULE-STEPS-05â Äảm bảo container Äá»§ rá»ng â step labels ÄÆ°á»£c absolutely positioned và có thá» overlapRULE-STEPS-06â Giữ length cá»§astepLabelsá»n Äá»nh â không conditionally add hoặc remove steps
StringeeDndContext (uikit-stringee-dnd-context)
RULE-DND-01â Luôn sá» dụnguseDndHandleâ không manually manage drag state và handlersRULE-DND-02âdndIdphải unique across TẤT CẢ containers, không chá» trong má»t containerRULE-DND-03â Luôn spread cảlistenersVÃattributestrên drag handle elementRULE-DND-04â Không spreadlistenershoặcattributestrongrenderOverlayRULE-DND-05âDndContaineridphải khá»p chÃnh xác vá»i key trongitemsmapRULE-DND-06â Hiá»urootContainerIdsâ items dragged từ root containers ÄÆ°á»£c cloned, không movedRULE-DND-07â Sá» dụngdroppableContainerIdstrên items Äá» restrict containers chúng có thá» drop và oRULE-DND-08â Sá» dụng callbackonDragEndÄá» persist changes â rely onactiveContainerIdStartÄá» detect cross-container movesRULE-DND-09â PasshasDraggable={true}choModalkhiStringeeDndContextÄÆ°á»£c render inside nó
Table (uikit-table)
RULE-TABLE-01â Luôn truyá»ndataKeylÃ ÄÆ°á»ng dẫn Äến trưá»ng unique identifierRULE-TABLE-02â Sá» dụngcolumn.renderÄá» tùy chá»nh ná»i dung cellRULE-TABLE-03â Truyá»nwidthcho cá»t bằng sá» (ÄÆ¡n vá» pixel), không dùng chuá»iRULE-TABLE-04â Sá» dụngselectablekết hợpselectedItems,onChangeSelectvÃonChangeSelectAllRULE-TABLE-05â Sá» dụngdisabledSelectvÃdisabledSelectTooltipÄá» vô hiá»u hóa chá»n hà ngRULE-TABLE-06â Sá» dụngpinnedColumnsÄá» ghim cá»t trái/phảiRULE-TABLE-07â Không sá» dụngcanReorderRowcùng vá»ipinnedColumnshoặc grouped dataRULE-TABLE-08â Sá» dụngonSortChangevá»isortByvÃsortDircho sắp xếpRULE-TABLE-09â Sá» dụng proppaginationtÃch hợp, không tá»± render Pagination bên ngoà iRULE-TABLE-10â Truyá»ndataSourcedạng object khi sá» dụng grouped tableRULE-TABLE-11â Sá» dụngvirtualizedcho bảng có nhiá»u hà ngRULE-TABLE-12â Sá» dụngshowingColumnsÄỠẩn/hiá»n cá»t, không lá»c mảngcolumnsRULE-TABLE-13â Sá» dụnguseTableV2hook Äá» quản lý state cho TableRULE-TABLE-14â Sá» dụngborderÄá» cấu hình ÄÆ°á»ng viá»n, không override bằng classNameRULE-TABLE-15â Sá» dụngparamsForRenderCellÄá» truyá»n dữ liá»u bá» sung và o renderRULE-TABLE-16â Sá» dụngcolumnResizablekết hợponResizeColumncho thay Äá»i chiá»u rá»ng cá»t
TableSettings (uikit-table-settings)
RULE-TABLE-SETTINGS-01â Luôn truyá»nchildrendưá»i dạng render function nháºn các callback từ TableSettingsRULE-TABLE-SETTINGS-02â Sá» dụnguseTableSettingshook Äá» quản lý state và persist và o localStorageRULE-TABLE-SETTINGS-03â Truyá»nstorageKeylà chuá»i duy nhất cho má»i bảng khi dùnguseTableSettingsRULE-TABLE-SETTINGS-04â Truyá»nsettingsvÃonChangeSettingsÄầy Äá»§ và Äá»ng bá»RULE-TABLE-SETTINGS-05â DùngdisablePinnedColumnkhi không cần tÃnh nÄng ghim cá»tRULE-TABLE-SETTINGS-06â Sá» dụngtextprop Äá» tuỳ chá»nh nhãn hiá»n thá» trong modalRULE-TABLE-SETTINGS-07â Sá» dụngonConfirmÄá» xá» lý logic sau khi nhấn LưuRULE-TABLE-SETTINGS-08â Sá» dụngrefvà phương thứcresetÄá» reset cà i ÄặtRULE-TABLE-SETTINGS-09â BáºtshowEditableSelectkhi cần cho phép cấu hình cá»t editableRULE-TABLE-SETTINGS-10â Sá» dụngcolumn.canHidevÃcolumn.canChangePositionÄá» kiá»m soát hà nh vi từng cá»tRULE-TABLE-SETTINGS-11â Sá» dụngtext.defaultActionFooterÄá» thêm ná»i dung tuỳ chá»nh và o footerRULE-TABLE-SETTINGS-12â Truyá»nonResizeColumnvÃonResizeWidthtừ children params xuá»ng TableRULE-TABLE-SETTINGS-13â Sá» dụngrenderSubColumnsSelectButtoncho nút chá»n sub-columnsRULE-TABLE-SETTINGS-14â Dùngcolumn.readOnlyÄá» disable checkbox “Cho phép sá»a” cho cá»t cụ thá»
Tabs (uikit-tabs)
RULE-TABS-01âTabskhông có state ná»i bá» â luôn truyá»ncurrentTabIndex,onChangechá» cần khi xá» lý click chuyá»n tabRULE-TABS-02âcurrentTabIndexlà 0-based â không bao giá» pass giá trá» 1-basedRULE-TABS-03â Sá» dụngscrollablekhi tabs có thá» overflow container widthRULE-TABS-04â Sá» dụngunderlineÄá» show full-width baseline dưá»i tất cả tabsRULE-TABS-05â Sá» dụnglayout={TAB_LAYOUT.VERTICAL}cho vertical tab lists â không sá» dụng CSS overridesRULE-TABS-06â Sá» dụngrenderRightIconcho actions bên phải â không wrap manually
Tag (uikit-tag)
RULE-TAG-01â Delete icon yêu cầu CẢonDeleteVÃshowDeleteIcon=trueVÃiconClosephải truthyRULE-TAG-02â Sá» dụngvariantÄá» control visual style â không override colors quaclassNameRULE-TAG-03â Sá» dụngselectedÄá» toggle active/chosen state â không swap variantsRULE-TAG-04â Sá» dụng propsiconLeft/iconRightâ không Äặt icons as childrenRULE-TAG-05â Sá» dụngiconClosechá» Äá» replace default à icon â dùngshowDeleteIcon={false}Äá» hide buttonRULE-TAG-06âdisabledlà m tag non-interactive â không combine vá»ionClick
ToastMessage (uikit-toast-message)
RULE-TOAST-01â MountToastContainerchá» má»t lần tại app root â không bao giá» inside page componentRULE-TOAST-02â Sá» dụngshowToastMessageÄá» trigger toasts â không bao giá» renderToastMessagetrá»±c tiếpRULE-TOAST-03â MatchplacementtrongshowToastMessagevá»i mountedToastContainerRULE-TOAST-04â Sá» dụngtypeÄá» communicate semantic meaning â không dùng"default"cho feedback messagesRULE-TOAST-05âshowToastMessagecó thá» ÄÆ°á»£c gá»i outside React â không cần context hoặc hookRULE-TOAST-06â Sá» dụngshowBrowserNotificationcho native OS notifications â không phải replacement cho toasts
ToggleCollapseButton (uikit-toggle-collapse-button)
RULE-TCB-01â Luôn truyá»nisCollapsedÄá» Äá»ng bá» hưá»ng icon chevronRULE-TCB-02â Chá»nplacementphù hợp vá»i vá» trà Äặt buttonRULE-TCB-03â Chá»nvariantphù hợp vá»i ngữ cảnh giao diá»nRULE-TCB-04â Không tá»± render icon chevron bên ngoà i componentRULE-TCB-05â Sá» dụngclassNameÄá» tuỳ chá»nh vá» trÃ, không override kÃch thưá»c
Tooltip (uikit-tooltip)
RULE-TTP-01â Children phải là má»t React element duy nhấtRULE-TTP-02â Auto-hide trên mobile mặc Äá»nh (disabledOnTouchedDevice=true)RULE-TTP-03â Sá» dụng propdisabled, không bao giá» conditionally render<Tooltip>RULE-TTP-04â Æ¯u tiênSmartTooltipcho truncated textRULE-TTP-05â Không override các pre-configured core styles
UsageHelpButton (uikit-usage-help-button)
RULE-USAGE-HELP-01â Chá» sá» dụng predefined keys từHelpTextVariantâ không pass arbitrary stringsRULE-USAGE-HELP-02â Sá» dụngmode="icon"cho inline help bên cạnh label â dùngmode="text"cho descriptive paragraphsRULE-USAGE-HELP-03â Không conditionally render dá»±a trênhelpKeyâ component tá»± returnnullautomaticallyRULE-USAGE-HELP-04â Sá» dụngtextLinkPropsÄá» customize link bên trong help content
VerticalSteps (uikit-vertical-steps)
RULE-VSTEPS-01âcurrentSteplà 0-based â không bao giá» pass giá trá» 1-basedRULE-VSTEPS-02â Hiá»u ba visual states: past (primary), current (primary), upcoming (gray)RULE-VSTEPS-03â Luôn setisCanClickkhi provideonClickStepâ omit cả hai khi navigation bá» disabledRULE-VSTEPS-04âVerticalStepscó fixed dimensions â sá» dụngclassNameÄá» override cho non-standard layoutsRULE-VSTEPS-05â Giữ length cá»§astepLabelsá»n Äá»nh â không conditionally add hoặc remove steps
useResponsive (uikit-use-responsive)
RULE-RESP-01â Sá» dụngisMobileDevicecho touch detection,isMobilecho viewport widthRULE-RESP-02â Sá» dụngisMaxWidth(n)cho custom breakpointsRULE-RESP-03â Không bao giá» viếtwindow.innerWidthcomparisons trá»±c tiếpRULE-RESP-04â Auth layouts sá» dụngisAuthDesktop/isAuthTablet
Form Components
DurationInput (uikit-duration-input)
RULE-DURATION-01â Sá» dụngonChangeÄá» nháºn giá trá» Äã format,onInputChangeÄá» theo dõi giá trá» Äang nháºpRULE-DURATION-02â Truyá»nvaluevÃdefaultValuedưá»i dạng chuá»i có ÄÆ¡n vá», không truyá»n sá»RULE-DURATION-03â Chá» truyá»ndurationRulekhi cần tuỳ chá»nh ÄÆ¡n vá» hoặc tá»· lá» quy Äá»iRULE-DURATION-04â Các ÄÆ¡n vá» trong giá trá» phải theo Äúng thứ tá»± từ lá»n Äến nhá»RULE-DURATION-05â Sá» dụng các props kế thừa từ TextField Äúng cáchRULE-DURATION-06â Giá trá» tá»± Äá»ng format khi blur â không tá»± format bên ngoà i
DurationRangeInput (uikit-duration-range-input)
RULE-DRI-01â Giá trá»valuevÃdefaultValuephải là tuple[string, string]RULE-DRI-02â Sá» dụngonChangeÄá» nháºn giá trá» Äã format,onInputChangeÄá» nháºn sá»± kiá»n input thôRULE-DRI-03â Tuỳ chá»nhdurationRulekhi cần thay Äá»i ký hiá»u hoặc quy Äá»i ÄÆ¡n vá»RULE-DRI-04â Sá» dụng controlled hoặc uncontrolled, không trá»n lẫnRULE-DRI-05â Sá» dụngerrorvÃhelperTextÄá» hiá»n thá» lá»i validationRULE-DRI-06â Sá» dụngreadOnlythay vìdisabledkhi chá» cần hiá»n thá» giá trá»
EmailInput (uikit-email-input)
RULE-EMAIL-01â Sá» dụngEmailInputthay vì tá»± tạo TextField + nút mailtoRULE-EMAIL-02â Luôn truyá»nvalueÄá» nút mailto hoạt Äá»ng ÄúngRULE-EMAIL-03â Sá» dụngfullWidthkhi cần EmailInput chiếm toà n bá» chiá»u rá»ngRULE-EMAIL-04â Không truyá»nendAdornmentvì nút email Äã chiếm vá» trà bên phảiRULE-EMAIL-05â Sá» dụng các prop cá»§a TextField cho validation và trạng thái
EmojiControlPicker (uikit-emoji-control-picker)
RULE-EMOJI-PICKER-01â Luôn truyá»nonChangecallback â Äây là prop bắt buá»c duy nhấtRULE-EMOJI-PICKER-02â Sá» dụngclassNamesÄá» tuỳ chá»nh style containerRULE-EMOJI-PICKER-03â Component tá»± quản lý danh sách frequently usedRULE-EMOJI-PICKER-04â Component Äã tÃch hợp sẵn tìm kiếmRULE-EMOJI-PICKER-05â Kết hợp vá»i Popper Äá» hiá»n thá» dạng dropdown
EmojiPicker (uikit-emoji-picker)
RULE-EMOJI-01â Luôn truyá»n Äá»§ 3 props bắt buá»c:icons,value,onChangeRULE-EMOJI-02â Sá» dụngsingleSelectkhi chá» cho phép chá»n má»t emojiRULE-EMOJI-03â Sá» dụngfullWidththay vì wrapper hoặc style thá»§ côngRULE-EMOJI-04â Sá» dụngdisabledthay vì tá»± chặn tương tácRULE-EMOJI-05â Cấu trúc Äúng choiconsvá»i các loại icon khác nhauRULE-EMOJI-06â Xoá tất cả giá trá» bằngonChange([]), không tá»± reset state
FileInput (uikit-file-input)
RULE-FILEINPUT-01â Sá» dụngFileInputthay vì tá»± tạo input file vá»i nút chá»n fileRULE-FILEINPUT-02â Luôn truyá»nisMaxFileÄá» kiá»m soát hiá»n thá» componentRULE-FILEINPUT-03â Truyá»ntooltipvÃmaxSizeÄá» hiá»n thá» thông tin hưá»ng dẫnRULE-FILEINPUT-04â Truyá»nacceptTypesdưá»i dạng mảng tên phần má» rá»ng (không có dấu chấm)RULE-FILEINPUT-05â Sá» dụngmultipleFilekhi cần cho phép chá»n nhiá»u fileRULE-FILEINPUT-06â Sá» dụngiconRightÄá» thêm ná»i dung bên phải nút “Chá»n file”RULE-FILEINPUT-07â Reset giá trá» input sau khi xá» lý onChange
FormItem (uikit-form-item)
RULE-FI-01â Sá» dụngFormItemÄá» tạo layout label + component â không tá»± tạo layout bằng divRULE-FI-02â Truyá»n form control và o propcomponentâ không truyá»n và o childrenRULE-FI-03â Sá» dụnglabelPlacementÄá» Äá»i vá» trà labelRULE-FI-04â Sá» dụnglabelAlignÄá» cÄn chá»nh ná»i dung labelRULE-FI-05â Sá» dụng proprequiredÄá» hiá»n thá» dấu sao Äá» â không tá»± thêm và o labelRULE-FI-06â Sá» dụng prophelperTextÄá» hiá»n thá» tooltip hưá»ng dẫnRULE-FI-07â Sá» dụng propreadOnlyÄá» hiá»n thá» icon khóaRULE-FI-08â Sá» dụngrightIconvÃrightEndComponentÄúng mục ÄÃchRULE-FI-09â Sá» dụnghintvÃsubTitleÄá» hiá»n thá» thông tin phụRULE-FI-10â Sá» dụngshowLabel={false}ÄỠẩn label nhưng vẫn giữ hint/subTitleRULE-FI-11â Sá» dụnglabelContainerClassNameÄá» style container cá»§a labelRULE-FI-12â Sá» dụngpreviewComponentÄá» hiá»n thá» ná»i dung xem trưá»c
InputGroup (uikit-input-group)
RULE-INPUTGROUP-01â Truyá»ngroupSelectPropsÄúng cách â bao gá»mvalue,onChange,optionsRULE-INPUTGROUP-02â Sá» dụnggroupSelectWidthÄá» Äiá»u chá»nh chiá»u rá»ng SelectRULE-INPUTGROUP-03â Không truyá»n rõ rà ng giá trá» mặc Äá»nh chogroupSelectWidthvÃfullWidthRULE-INPUTGROUP-04â Sá» dụngfullWidthkhi cần InputGroup chiếm toà n bá» chiá»u rá»ngRULE-INPUTGROUP-05â Children phải là component input có há» trợ classstringee-input-rootRULE-INPUTGROUP-06â Không truyá»nminWidthPopperchogroupSelectPropstrừ khi cần ghi Äè
InputNumber (uikit-input-number)
RULE-INPUTNUMBER-01â Sá» dụngformatphù hợp vá»i yêu cầu hiá»n thá» sá»RULE-INPUTNUMBER-02â Sá» dụngonChangevá»i signature(value: number | null) => voidRULE-INPUTNUMBER-03â Sá» dụngmin/maxkết hợpallowTypeOutsideRangeÄá» kiá»m soát giá»i hạnRULE-INPUTNUMBER-04â Sá» dụngshowIncreaseDecreaseButton={false}khi không cần nút tÄng/giảmRULE-INPUTNUMBER-05â Sá» dụngfillMissingZeroÄá» tá»± Äá»ng Äiá»n sá» 0 và o phần tháºp phânRULE-INPUTNUMBER-06â Sá» dụngroundRulevÃprecisionÄá» là m tròn sá»RULE-INPUTNUMBER-07â Sá» dụngnumberOfIntegerDigitvÃnumberOfDecimalDigitÄá» giá»i hạn sá» chữ sá»RULE-INPUTNUMBER-08â Không truyá»n rõ rà ng giá trá» mặc Äá»nh
MarkdownEditor (uikit-markdown-editor)
RULE-MKEDITOR-01â Luôn truyá»nvaluevÃonChangeâ MarkdownEditor là controlled componentRULE-MKEDITOR-02â Sá» dụngminHeight/maxHeighthoặcheightcho chiá»u cao editorRULE-MKEDITOR-03â Sá» dụngdefaultModeÄá» chá»n chế Äá» hiá»n thá»RULE-MKEDITOR-04â Sá» dụngshowMenu/showMarkdown/showPreview/showFullScreenÄá» kiá»m soát toolbarRULE-MKEDITOR-05â Sá» dụnghandleImageUploadÄá» upload ảnhRULE-MKEDITOR-06â Sá» dụngerrorvÃhelperTextcho validationRULE-MKEDITOR-07â Sá» dụngpluginsÄá» thêm toolbar itemsRULE-MKEDITOR-08â Sá» dụngreadOnlyÄá» chặn chá»nh sá»a
MonacoEditor (uikit-monaco-editor)
RULE-MONACO-01â ImportMonacoEditorvÃuseMonacotừ ui-kit â không import từ@monaco-editor/reactRULE-MONACO-02â Không gá»i lạiloader.configâ ui-kit Äã cấu hình sẵnRULE-MONACO-03â Truyá»n cấu hình editor qua propoptionsâ không thao tác DOM trá»±c tiếpRULE-MONACO-04â Sá» dụng propheightÄá» Äặt chiá»u cao â không override bằng CSSRULE-MONACO-05â Sá» dụng hookuseMonacoÄá» truy cáºp Monaco instanceRULE-MONACO-06â WrapMonacoEditortrong container có chiá»u rá»ng xác Äá»nh
MultipleSelect (uikit-multiple-select)
RULE-MSEL-01â Luôn truyá»n Äá»§ 5 props bắt buá»c:value,options,onChange,getLabel,getValueRULE-MSEL-02â Sá» dụngsingleSelectthay vì tá»± xây dá»±ng logic chá»n má»tRULE-MSEL-03â Sá» dụngchangeOnBlurkhi muá»n trì hoãn thay Äá»i giá trá»RULE-MSEL-04â Sá» dụngdisabledValuesthay vì lá»c options Äá» vô hiá»u hoáRULE-MSEL-05â Sá» dụngclearablevÃalsoClearDisabledValuesÄúng cáchRULE-MSEL-06â Sá» dụngsearchValuevÃonInputChangecho remote searchRULE-MSEL-07â Sá» dụngrenderOptionÄá» tuỳ chá»nh hiá»n thá» optionRULE-MSEL-08â Sá» dụngrenderTagÄá» tuỳ chá»nh hiá»n thá» tagRULE-MSEL-09â Sá» dụnghideAfterSelectkhi muá»n Äóng dropdown sau má»i lần chá»nRULE-MSEL-10â Sá» dụngmaxSelectedValueÄá» giá»i hạn sá» lượng lá»±a chá»nRULE-MSEL-11â Sá» dụnghasSelectAllÄá» hiá»n thá» option “Chá»n tất cả”RULE-MSEL-12â Sá» dụngisShowIconSearchkhi muá»n hiá»n thá» icon searchRULE-MSEL-13â Sá» dụngonScrollToBottomcho lazy loadingRULE-MSEL-14â Không truyá»n rõ rà ng các giá trá» mặc Äá»nhRULE-MSEL-15â Sá» dụngrenderLimitTagvÃrenderLimitValueÄá» tuỳ chá»nh tag bá» giá»i hạnRULE-MSEL-16â Sá» dụngstartAdornmentvÃalwaysShowAdornmentÄá» thêm icon/text phÃa trưá»c
PhoneInput (uikit-phone-input)
RULE-PHONE-01â Sá» dụngPhoneInputthay vì tá»± tạo TextField + CountrySelectRULE-PHONE-02â Luôn truyá»nvaluevÃonChangeÄá» component hoạt Äá»ng ÄúngRULE-PHONE-03â Sá» dụngisShowButtonCallhoặcisShowButtonCallWhenHovercho nút gá»i Äiá»nRULE-PHONE-04â Sá» dụnghandleCallkhi cần tuỳ chá»nh hà nh vi gá»i Äiá»nRULE-PHONE-05â Sá» dụngcountriesÄá» giá»i hạn danh sách quá»c giaRULE-PHONE-06â Sá» dụngfullWidthkhi cần PhoneInput chiếm toà n bá» chiá»u rá»ngRULE-PHONE-07â Không truyá»nstartAdornmentvì CountrySelect Äã chiếm vá» trà bên tráiRULE-PHONE-08â Sá» dụngautoFillDialCodeÄá» tá»± Äá»ng Äiá»n mã quá»c giaRULE-PHONE-09â Sá» dụng các prop cá»§a TextField cho validation và trạng tháiRULE-PHONE-10â Sá» dụng helpervalidatePhoneNumberÄá» kiá»m tra sá» Äiá»n thoại
Radio (uikit-radio)
RULE-RADIO-01â Paircheckedvá»ionChangetrong controlled mode â omitcheckedcho uncontrolledRULE-RADIO-02â Sá» dụngsizecho kÃch thưá»c â không override width/height qua classNameRULE-RADIO-03â Không truyá»ntypeâ component luôn là radioRULE-RADIO-04â Sá» dụngRadioGroupÄá» quản lý nhóm radioRULE-RADIO-05â Sá» dụngFormControlLabelÄá» thêm label cho radioRULE-RADIO-06â Sá» dụngrowtrên RadioGroup cho layout ngangRULE-RADIO-07âdisabledtrên RadioGroup override disabled cá»§a từng childrenRULE-RADIO-08â Má»i Radio trong RadioGroup phải cóvalueuniqueRULE-RADIO-09â Sá» dụnglabelPlacementtrên FormControlLabel Äá» Äá»i vá» trà labelRULE-RADIO-10âvaluehá» trợnumber | string | booleanâ không cần ép kiá»u thá»§ công
RadioGroup (uikit-radio-group)
RULE-RADIO-01â RadioGroup luôn là controlled â phải truyá»nvaluevÃonChangeRULE-RADIO-02â Sá» dụngRadioGroupÄá» quản lý nhóm radio â không tá»± viết logic chá»nRULE-RADIO-03â Sá» dụngFormControlLabelÄá» thêm label cho radioRULE-RADIO-04â Sá» dụngrowtrên RadioGroup cho layout ngangRULE-RADIO-05âdisabledtrên RadioGroup override disabled cá»§a từng childrenRULE-RADIO-06â Má»i Radio trong RadioGroup phải cóvalueuniqueRULE-RADIO-07â Sá» dụngsizetrên Radio cho kÃch thưá»cRULE-RADIO-08â Không truyá»ntypeâ component luôn là radioRULE-RADIO-09â Sá» dụnglabelPlacementtrên FormControlLabel Äá» Äá»i vá» trà labelRULE-RADIO-10âonChangetrả vá» giá trá» cá»§a radio ÄÆ°á»£c chá»n â không lấy từ event
Rating (uikit-rating)
RULE-RATING-01â Pairvaluevá»ionChangetrong controlled modeRULE-RATING-02â OmitvaluevÃonChangecho uncontrolled; dùngdefaultValueRULE-RATING-03âonChangetrả vá»number | null, không phải eventRULE-RATING-04â Sá» dụng propiconÄá» tuỳ chá»nh iconRULE-RATING-05â Sá» dụngmaxÄá» thay Äá»i sá» lượng iconRULE-RATING-06â Sá» dụngiconSizevÃgapÄá» tuỳ chá»nh kÃch thưá»cRULE-RATING-07â Sá» dụngdirectionÄá» thay Äá»i hưá»ng hiá»n thá»RULE-RATING-08â Sá» dụngdisabledÄá» vô hiá»u hoá tương tác
Reaction (uikit-reaction)
RULE-REACTION-01â Sá» dụng options mặc Äá»nh khi chá» cần 5 emoji cÆ¡ bảnRULE-REACTION-02â Truyá»noptionsÄúng formatReactionOptionkhi cần tuỳ chá»nhRULE-REACTION-03â Sá» dụng controlled (value+onChange) hoặc uncontrolled (defaultValue)RULE-REACTION-04â Sá» dụng propdirectionÄá» thay Äá»i hưá»ng hiá»n thá»RULE-REACTION-05â Sá» dụnggapvÃiconSizeÄá» tuỳ chá»nh khoảng cáchRULE-REACTION-06â Xá» lý giá trá»nulltrongonChangekhi ngưá»i dùng bá» chá»n
SearchInput (uikit-search-input)
RULE-SINPUT-01â Luôn truyá»nvaluevÃonChangeâ Äây là controlled componentRULE-SINPUT-02â Sá» dụng proponClearÄá» hiá»n thá» nút xoáRULE-SINPUT-03â Chá» truyá»niconClearkhi cần thay Äá»i icon xoá mặc Äá»nhRULE-SINPUT-04â Sá» dụngclassNameÄá» tuỳ chá»nh kÃch thưá»c và styleRULE-SINPUT-05â Nút xoá chá» hiá»n thá» khi có cảonClearvÃvalue
Select (uikit-select)
RULE-SELECT-01â Select là controlled component â phải truyá»nvaluevÃonChangeRULE-SELECT-02â Sá» dụnggetLabelvÃgetValuekhi option không có dạng{ label, value }RULE-SELECT-03â Sá» dụngmode="group"kết hợpgroupOptionscho option theo nhómRULE-SELECT-04â Sá» dụngsearchableÄá» báºt tìm kiếmRULE-SELECT-05â Sá» dụngfilterBySearch={false}khi muá»n tá»± lá»c option bên ngoà iRULE-SELECT-06â Sá» dụngclearableÄá» hiá»n thá» nút xoáRULE-SELECT-07â Sá» dụngerrorkết hợphelperTextcho validationRULE-SELECT-08â Sá» dụngrenderOptionvÃrenderValueÄá» tuỳ chá»nh hiá»n thá»RULE-SELECT-09âdisabledvÃreadOnlycó hà nh vi khác nhauRULE-SELECT-10â Sá» dụngdisabledValuesÄá» vô hiá»u hoá option cụ thá»RULE-SELECT-11â Sá» dụngfullWidththay vì override className cho chiá»u rá»ngRULE-SELECT-12â Sá» dụngonScrollToBottomcho lazy loadingRULE-SELECT-13â Sá» dụnghidePopperOnSelect={false}khi không muá»n Äóng dropdownRULE-SELECT-14â Sá» dụngisEqualkhi cần so sánh option tuỳ chá»nhRULE-SELECT-15â Sá» dụngheightÄá» thay Äá»i chiá»u cao input
Slider (uikit-slider)
RULE-SLIDER-01â Pairvaluevá»ionChangetrong controlled modeRULE-SLIDER-02â Omitvaluecho uncontrolled usage; KHÃNG passdefaultValueRULE-SLIDER-03âclassNamestyle outer wrapper, không phải inputRULE-SLIDER-04â Sá» dụngmin,max, vÃstepcho range control; không tÃnh toán lại externallyRULE-SLIDER-05â Không bao giá» passtypeâ nó luôn lÃ"range"
Switch (uikit-switch)
RULE-SWITCH-01â Paircheckedvá»ionChangetrong controlled mode â omitcheckedcho uncontrolledRULE-SWITCH-02â Sá» dụngsizecho kÃch thưá»c â không override width/height qua classNameRULE-SWITCH-03â Không truyá»ntypeâ component luôn là checkboxRULE-SWITCH-04â Không tá»± build giao diá»n switch bằng div/span â sá» dụng component SwitchRULE-SWITCH-05â Sá» dụngdisabledprop â không override style disabled qua classNameRULE-SWITCH-06â Không sá» dụngCheckboxkhi ngữ nghÄ©a là báºt/tắt â dùngSwitch
TagsInput (uikit-tags-input)
RULE-TAGSINPUT-01â Khi sá» dụng vá»i object, phải truyá»ngetLabelvÃgetValueRULE-TAGSINPUT-02â Sá» dụngsubmitWithStringValue={false}khi chá» cho phép chá»n từ suggest listRULE-TAGSINPUT-03â BáºtsearchablevÃfilterBySearchÄá»ng thá»i Äá» lá»c suggest listRULE-TAGSINPUT-04â Sá» dụngrenderSuggestItemkhi dùngsuggestListOptionsvá»i kiá»u objectRULE-TAGSINPUT-05â Sá» dụngclearablekết hợponClearableÄá» xá» lý logic khi xoá tất cảRULE-TAGSINPUT-06â Sá» dụngisChangeOverlapÄá» cho phép tag trùng lặpRULE-TAGSINPUT-07â Sá» dụngrenderTagÄá» tuỳ chá»nh giao diá»n tagRULE-TAGSINPUT-08â Truyá»nstartAdornment/endAdornmentÄúng cáchRULE-TAGSINPUT-09âerrortá»± Äá»ng setcolor="error"â không cần truyá»n cả haiRULE-TAGSINPUT-10â Sá» dụngappendToBody={false}khi cần suggest list nằm trong container cha
TextField (uikit-text-field)
RULE-TF-01â Sá» dụngmultipleLineÄá» chuyá»n sang textarea, không tá»± render<textarea>RULE-TF-02â Truyá»n icons/elements quastartAdornment/endAdornmentRULE-TF-03â Sá» dụngreadOnlyÄá» hiá»n thá» chế Äá» chá» Äá»cRULE-TF-04â Sá» dụnghtmlReadOnlykhi cần input không cho nháºp nhưng vẫn giữ giao diá»nRULE-TF-05â Sá» dụngerrorkết hợphelperTextÄá» hiá»n thá» lá»iRULE-TF-06â Sá» dụnginputClassNameÄá» tuỳ chá»nh style inputRULE-TF-07â Sá» dụnghideValuethay vìtype="password"ÄỠẩn giá trá»RULE-TF-08â Sá» dụngdefaultExpandÄá» textarea tá»± Äá»ng giãn theo ná»i dungRULE-TF-09â Không truyá»n rõ rà ng giá trá» mặc Äá»nh choshowBorderOnBlur,rows,resizeRULE-TF-10â Sá» dụnghideMaxLengthÄỠẩn bá» Äếm ký tá»±
TextLink (uikit-text-link)
RULE-TEXTLINK-01â Sá» dụng propcomponentÄá» tÃch hợp vá»i router, không wrap bằng LinkRULE-TEXTLINK-02â Truyá»n icons quastartIcon/endIcon, không Äặt trong childrenRULE-TEXTLINK-03â Sá» dụngsizephù hợp vá»i ngữ cảnhRULE-TEXTLINK-04â Không truyá»n rõ rà ng giá trá» mặc Äá»nh chosize,underlinevÃcomponentRULE-TEXTLINK-05â Sá» dụngunderlinekhi cần nhấn mạnh tÃnh tương tácRULE-TEXTLINK-06â Luôn truyá»ntarget="_blank"khi link má» trang ngoà i
TimePicker (uikit-time-picker)
RULE-TIME-PICKER-01âvaluelÃDayjs | nullâ không truyá»n Date, string, hay timestampRULE-TIME-PICKER-02â Sá» dụngformatÄá» Äá»nh dạng hiá»n thá» â mặc Äá»nh"HH:mm:ss"RULE-TIME-PICKER-03â Sá» dụngmin/maxlÃDayjsÄá» giá»i hạn khoảng thá»i gianRULE-TIME-PICKER-04â Sá» dụngrenderValueÄá» tuỳ chá»nh hiá»n thá»RULE-TIME-PICKER-05â Sá» dụngtimeSelectPropsÄá» tuỳ chá»nh TimeSelectRULE-TIME-PICKER-06â Input há» trợ nháºp tay â blur sẽ parse và validate theoformatRULE-TIME-PICKER-07â Sá» dụnghidePopperOnClearÄá» Äóng popup khi xoá giá trá»RULE-TIME-PICKER-08â Sá» dụnghelperTextkết hợperrorÄá» hiá»n thá» thông báo lá»iRULE-TIME-PICKER-09â Sá» dụngpopperPropsÄá» tuỳ chá»nh PopperRULE-TIME-PICKER-10â Không tá»± build icon â component Äã tÃch hợp sẵn
TimeRangePicker (uikit-time-range-picker)
RULE-TIME-RANGE-PICKER-01âvaluelà tuple[Dayjs | null, Dayjs | null]RULE-TIME-RANGE-PICKER-02âonChangenháºn tuple[Dayjs | null, Dayjs | null]RULE-TIME-RANGE-PICKER-03â Sá» dụngfromMin/fromMax/toMin/toMaxÄá» giá»i hạn thá»i gianRULE-TIME-RANGE-PICKER-04â Sá» dụngformatÄá» thay Äá»i format hiá»n thá»RULE-TIME-RANGE-PICKER-05â Sá» dụngrenderValueÄá» tuỳ chá»nh hiá»n thá»RULE-TIME-RANGE-PICKER-06â Sá» dụngtimeSelectPropsÄá» tuỳ chá»nh TimeSelectRULE-TIME-RANGE-PICKER-07â Sá» dụngerror+helperTextcho validationRULE-TIME-RANGE-PICKER-08â Sá» dụnggetFromRefvÃgetToRefÄá» truy cáºp input elementRULE-TIME-RANGE-PICKER-09â Clear giá trá» bằng[null, null]â icon clear Äã tÃch hợpRULE-TIME-RANGE-PICKER-10â Input há» trợ nháºp tay â blur sẽ parse và validate
TimeSelect (uikit-time-select)
RULE-TIME-SELECT-01âvaluelÃDayjs | nullâ không truyá»n Date, string, hay timestampRULE-TIME-SELECT-02â Sá» dụngformatÄá» thay Äá»i hiá»n thá» â không tá»± format bên ngoà iRULE-TIME-SELECT-03â Sá» dụngmin/maxlÃDayjsÄá» giá»i hạn khoảng thá»i gianRULE-TIME-SELECT-04â Sá» dụngheightÄá» thay Äá»i chiá»u cao danh sáchRULE-TIME-SELECT-05â Sá» dụngfullWidthÄá» má» rá»ng chiá»u ngangRULE-TIME-SELECT-06â Không tá»± build danh sách chá»n giá» â sá» dụng TimeSelectRULE-TIME-SELECT-07â Æ¯u tiên dùng DatePicker vá»i format có token giá» thay vì kết hợp riêng TimeSelect
TreeSelect (uikit-tree-select)
RULE-TREE-SELECT-01â Luôn truyá»n Äá»§ 4 props bắt buá»c:value,onChange,modeSelectTreeData,optionsRULE-TREE-SELECT-02â Sá» dụngtreeProps.fieldNamesÄỠánh xạ dữ liá»uRULE-TREE-SELECT-03â Chá»n ÄúngmodeSelectTreeDatatheo yêu cầu nghiá»p vụRULE-TREE-SELECT-04â Sá» dụngclearablevÃonClearÄá» xoá giá trá»RULE-TREE-SELECT-05â Sá» dụngshowSearchÄá» báºt tìm kiếmRULE-TREE-SELECT-06â Sá» dụnginputPropscho validationRULE-TREE-SELECT-07â Sá» dụngmaxLengthÄá» giá»i hạn sá» lượng chá»nRULE-TREE-SELECT-08â Sá» dụngdisableNodeIdsÄá» vô hiá»u hoá node cụ thá»RULE-TREE-SELECT-09â Sá» dụngusePoper={false}khi cần nhúng tree trá»±c tiếpRULE-TREE-SELECT-10â Truyá»nselectedOptionskhi giá trá» Äã chá»n có thá» không nằm trongoptionsRULE-TREE-SELECT-11â Sá» dụngshowOperatorSelectcho bá» lá»c toán tá»RULE-TREE-SELECT-12â Sá» dụngshowBorderOnBlur={false}ÄỠẩn border khi blur
UrlInput (uikit-url-input)
RULE-URL-01â Sá» dụngUrlInputthay vì tá»± tạo TextField + nút má» linkRULE-URL-02â Luôn truyá»nvalueÄá» nút má» URL hoạt Äá»ng ÄúngRULE-URL-03â Sá» dụnghasDisplayTextkhi cần hiá»n thá» text thay thế cho URLRULE-URL-04â Truyá»nautoFillDisplayText={false}khi không muá»n tá»± Äá»ng lấy title từ URLRULE-URL-05â Sá» dụngfullWidthkhi cần UrlInput chiếm toà n bá» chiá»u rá»ngRULE-URL-06â Sá» dụngwrapperClassNameÄá» style container ngoà iRULE-URL-07â Sá» dụngdisplayTextInputPropsÄá» tùy chá»nh input display textRULE-URL-08â Popper display text tá»± Äá»ng bá» vô hiá»u hóa khidisabledhoặcreadOnly
Rule Files
rules/tokens-tailwind-config.md
rules/color-palette-usage.md
rules/typography-prose-classes.md
rules/spacing-rem-only.md
rules/cx-class-grouping.md
rules/uikit-accordion.md
rules/uikit-alert.md
rules/uikit-avatar.md
rules/uikit-avatar-field.md
rules/uikit-breadcrumbs.md
rules/uikit-button.md
rules/uikit-button-group.md
rules/uikit-calendar.md
rules/uikit-cascader.md
rules/uikit-checkbox.md
rules/uikit-checkbox-group.md
rules/uikit-circular-progress-bar.md
rules/uikit-ckeditor.md
rules/uikit-collapsible-container.md
rules/uikit-color-picker.md
rules/uikit-confirm-modal.md
rules/uikit-copy-button.md
rules/uikit-copy-link-button.md
rules/uikit-country-select.md
rules/uikit-created-by-info.md
rules/uikit-date-picker.md
rules/uikit-date-range-calendar.md
rules/uikit-date-range-picker.md
rules/uikit-date-time-with-tooltip.md
rules/uikit-draggable-item.md
rules/uikit-draggable-wrapper.md
rules/uikit-drawer.md
rules/uikit-duration-input.md
rules/uikit-duration-range-input.md
rules/uikit-email-input.md
rules/uikit-emoji-control-picker.md
rules/uikit-emoji-picker.md
rules/uikit-file-input.md
rules/uikit-file-preview.md
rules/uikit-filter-generator.md
rules/uikit-filter-generator-base.md
rules/uikit-form-control-label.md
rules/uikit-form-item.md
rules/uikit-help-button.md
rules/uikit-helper-text.md
rules/uikit-horizontal-steps.md
rules/uikit-icon-button.md
rules/uikit-insert-field-object-button-v2.md
rules/uikit-insert-field-object-button-wrapper2.md
rules/uikit-insert-field-object-v2.md
rules/uikit-input-group.md
rules/uikit-input-number.md
rules/uikit-layout-select-button.md
rules/uikit-lazy-image.md
rules/uikit-limitable-list.md
rules/uikit-list-view-table.md
rules/uikit-markdown-editor.md
rules/uikit-markdown-preview.md
rules/uikit-modal.md
rules/uikit-monaco-editor.md
rules/uikit-multiple-select.md
rules/uikit-pagination.md
rules/uikit-personnel-detail-card.md
rules/uikit-personnel-detail-popper.md
rules/uikit-phone-input.md
rules/uikit-popper.md
rules/uikit-popper-record-info.md
rules/uikit-radio.md
rules/uikit-radio-group.md
rules/uikit-rating.md
rules/uikit-reaction.md
rules/uikit-resize-bar.md
rules/uikit-search-input.md
rules/uikit-select.md
rules/uikit-show.md
rules/uikit-skeleton.md
rules/uikit-slider.md
rules/uikit-smart-tooltip.md
rules/uikit-spinner.md
rules/uikit-step-progress-bar.md
rules/uikit-steps.md
rules/uikit-stringee-dnd-context.md
rules/uikit-switch.md
rules/uikit-table.md
rules/uikit-table-settings.md
rules/uikit-tabs.md
rules/uikit-tag.md
rules/uikit-tags-input.md
rules/uikit-text-field.md
rules/uikit-text-link.md
rules/uikit-time-picker.md
rules/uikit-time-range-picker.md
rules/uikit-time-select.md
rules/uikit-toast-message.md
rules/uikit-toggle-collapse-button.md
rules/uikit-tooltip.md
rules/uikit-tree-select.md
rules/uikit-url-input.md
rules/uikit-usage-help-button.md
rules/uikit-use-responsive.md
rules/uikit-vertical-steps.md
rules/uikit-import-source.md
rules/uikit-text-vietnamese-first.md
rules/uikit-parallel-sub-agents.md
rules/uikit-no-auto-commit.md
rules/uikit-form-react-hook-form.md
rules/uikit-object-field-record.md
rules/no-typescript-any.md
rules/prettier-and-lint-check.md
rules/no-auto-markdown.md
rules/page-list-resource.md
rules/dayjs-date-time.md
Create Commit
Quy trình tạo git commit tuân theo quy ưá»c commit message cá»§a Cogover.
Khi nà o áp dụng
SỠdụng khi:
- ÄÆ°á»£c yêu cầu “tạo commit” hoặc “create commit”
- Cần stage và commit các thay Äá»i vá»i Äá»nh dạng message Äúng
- Là m viá»c trên các nhánh có hoặc không có mã task SPT
Cách sỠdụng
Äá»c file AGENTS.md phần Hưá»ng dẫn tạo Commit Äá» xem quy trình commit Äầy Äá»§ và các quy tắc.
i18n
Hưá»ng dẫn Äầy Äá»§ Äá» dá»ch text tiếng Viá»t trong các dá»± án React sá» dụng react-i18next.
Khi nà o áp dụng
SỠdụng khi:
- ÄÆ°á»£c yêu cầu “dá»ch các text tiếng Viá»t” (translate Vietnamese texts)
- Cần thay thế hardcoded Vietnamese strings bằng i18n translation calls
- Là m viá»c vá»i plain strings, strings có placeholders, hoặc HTML templates
Cách sỠdụng
Äá»c file AGENTS.md phần Hưá»ng dẫn Dá»ch i18n cho UI Äá» xem quy trình dá»ch Äầy Äá»§ và các quy tắc.