@para-ui/core 5.0.0-beta.12 → 5.0.0-beta.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +315 -0
- package/AlignBox/component.json +89 -0
- package/Anchor/component.json +130 -0
- package/Argv/component.json +216 -0
- package/AutoBox/component.json +133 -0
- package/AutoButton/component.json +109 -0
- package/AutoTips/component.json +121 -0
- package/Badge/component.json +92 -0
- package/Breadcrumbs/component.json +142 -0
- package/Button/component.json +168 -0
- package/ButtonGroup/component.json +132 -0
- package/Card/component.json +162 -0
- package/Carousel/component.json +142 -0
- package/Cascader/component.json +196 -0
- package/Checkbox/component.json +138 -0
- package/CheckboxGroup/component.json +152 -0
- package/CodeEditor/component.json +189 -0
- package/Collapse/component.json +166 -0
- package/CollapseBox/component.json +84 -0
- package/CollapseLayout/component.json +155 -0
- package/ColorPicker/component.json +142 -0
- package/ComboSelect/component.json +181 -0
- package/Container/component.json +111 -0
- package/ContentBox/component.json +81 -0
- package/CopyText/component.json +118 -0
- package/CycleSelector/component.json +98 -0
- package/DatePicker/component.json +192 -0
- package/Descriptions/component.json +142 -0
- package/Desktop/component.json +171 -0
- package/DragVerify/component.json +114 -0
- package/Drawer/component.json +200 -0
- package/Dropdown/component.json +147 -0
- package/DynamicMultiBox/component.json +278 -0
- package/Empty/component.json +123 -0
- package/FieldForm/component.json +196 -0
- package/Form/component.json +161 -0
- package/FormItem/component.json +171 -0
- package/FunctionModal/component.json +197 -0
- package/Help/component.json +118 -0
- package/HelperText/component.json +126 -0
- package/Image/component.json +165 -0
- package/InputCode/component.json +191 -0
- package/InputLang/component.json +205 -0
- package/InputNumber/component.json +162 -0
- package/Label/component.json +126 -0
- package/Loading/component.json +91 -0
- package/Menu/component.json +180 -0
- package/Message/component.json +246 -0
- package/Modal/component.json +277 -0
- package/MultiBox/component.json +216 -0
- package/Notification/component.json +184 -0
- package/OperateBtn/component.json +134 -0
- package/PageHeader/component.json +112 -0
- package/Pagination/component.json +181 -0
- package/PasswordRules/component.json +105 -0
- package/PopConfirm/component.json +227 -0
- package/PopMenu/component.json +131 -0
- package/Popover/component.json +165 -0
- package/Progress/component.json +161 -0
- package/Prompt/component.json +144 -0
- package/Querying/component.json +96 -0
- package/QuickReply/component.json +129 -0
- package/Radio/component.json +136 -0
- package/RadioGroup/component.json +149 -0
- package/RangeInput/component.json +198 -0
- package/Result/component.json +104 -0
- package/ScrollBar/component.json +115 -0
- package/Search/component.json +177 -0
- package/Select/component.json +244 -0
- package/SelectInput/component.json +184 -0
- package/Selector/component.json +203 -0
- package/SelectorPicker/component.json +179 -0
- package/SingleBox/component.json +151 -0
- package/Slider/component.json +181 -0
- package/SortBox/component.json +108 -0
- package/Status/component.json +104 -0
- package/Stepper/component.json +129 -0
- package/Switch/component.json +207 -0
- package/Table/component.json +547 -0
- package/Tabs/component.json +227 -0
- package/Tag/component.json +221 -0
- package/TextEditor/component.json +186 -0
- package/TextField/component.json +290 -0
- package/TimePicker/component.json +176 -0
- package/Timeline/component.json +110 -0
- package/Title/component.json +156 -0
- package/ToggleButton/component.json +153 -0
- package/Tooltip/component.json +176 -0
- package/Transfer/component.json +157 -0
- package/Tree/component.json +512 -0
- package/Upload/component.json +450 -0
- package/ai-workflows/01-crud-list-multi-drawer.md +278 -0
- package/ai-workflows/02-rbac-operation-buttons.md +290 -0
- package/ai-workflows/03-complex-form-async-cascade.md +350 -0
- package/ai-workflows/04-array-field-form.md +281 -0
- package/ai-workflows/05-popconfirm-async-message-queue.md +333 -0
- package/ai-workflows/06-modal-drawer-form-workflow.md +385 -0
- package/ai-workflows/07-search-filter-table-trio.md +387 -0
- package/ai-workflows/08-table-advanced-features.md +365 -0
- package/ai-workflows/09-batch-operation-export-progress.md +367 -0
- package/ai-workflows/10-cross-component-state-coordination.md +412 -0
- package/codemods/modal-onCancel-to-onDismiss.js +69 -0
- package/es/AlignBox/component.json +89 -0
- package/es/AlignBox/index.css +1 -1
- package/es/AlignBox/index.d.ts +6 -2
- package/es/AlignBox/index.js +1 -1
- package/es/AlignBox/style/index.css +1 -1
- package/es/Anchor/anchorMenu/index.d.ts +2 -1
- package/es/Anchor/anchorMenu/index.js +36 -33
- package/es/Anchor/component.json +130 -0
- package/es/Anchor/index.js +50 -47
- package/es/Anchor/type.d.ts +8 -4
- package/es/Argv/component.json +216 -0
- package/es/Argv/index.d.ts +5 -6
- package/es/AutoBox/component.json +133 -0
- package/es/AutoBox/index.d.ts +3 -3
- package/es/AutoBox/index.js +1 -1
- package/es/AutoBox/protal.d.ts +2 -2
- package/es/AutoBox/protal.js +32 -29
- package/es/AutoButton/component.json +109 -0
- package/es/AutoButton/index.js +1 -1
- package/es/AutoTips/autoTipsMultiline/index.d.ts +1 -1
- package/es/AutoTips/autoTipsMultiline/index.js +1 -1
- package/es/AutoTips/component.json +121 -0
- package/es/Badge/component.json +92 -0
- package/es/Breadcrumbs/component.json +142 -0
- package/es/Breadcrumbs/index.js +1 -1
- package/es/Button/SplitButton.d.ts +2 -2
- package/es/Button/component.json +168 -0
- package/es/Button/index.js +44 -44
- package/es/ButtonGroup/component.json +132 -0
- package/es/ButtonGroup/index.d.ts +1 -1
- package/es/Card/component.json +162 -0
- package/es/Card/index.d.ts +2 -2
- package/es/Card/index.js +2 -2
- package/es/Carousel/component.json +142 -0
- package/es/Carousel/index.d.ts +1 -1
- package/es/Cascader/Cascader.js +188 -180
- package/es/Cascader/component.json +196 -0
- package/es/Cascader/hooks/useEntities.js +7 -7
- package/es/Cascader/interface.d.ts +1 -0
- package/es/Cascader/utils/commonUtil.d.ts +1 -1
- package/es/Cascader/utils/commonUtil.js +16 -16
- package/es/Cascader/utils/treeUtil.d.ts +14 -5
- package/es/Cascader/utils/treeUtil.js +1 -1
- package/es/Checkbox/component.json +138 -0
- package/es/CheckboxGroup/component.json +152 -0
- package/es/CodeEditor/component.json +189 -0
- package/es/CodeEditor/index.d.ts +10 -9
- package/es/Collapse/component.json +166 -0
- package/es/Collapse/index.d.ts +1 -1
- package/es/Collapse/index.js +41 -33
- package/es/CollapseBox/component.json +84 -0
- package/es/CollapseLayout/component.json +155 -0
- package/es/ColorPicker/component.json +142 -0
- package/es/ComboSelect/component.json +181 -0
- package/es/ComboSelect/index.js +299 -287
- package/es/ComboSelect/interface.d.ts +6 -3
- package/es/ComboSelect/utils.d.ts +3 -3
- package/es/ComboSelect/utils.js +1 -1
- package/es/Container/component.json +111 -0
- package/es/ContentBox/component.json +81 -0
- package/es/CopyText/component.json +118 -0
- package/es/CycleSelector/component.json +98 -0
- package/es/CycleSelector/index.js +14 -13
- package/es/DatePicker/component.json +192 -0
- package/es/DatePicker/generatePicker/generateRangePicker.d.ts +0 -8
- package/es/DatePicker/generatePicker/generateRangePicker.js +73 -65
- package/es/DatePicker/generatePicker/generateSinglePicker.js +1 -1
- package/es/DatePicker/generatePicker/index.d.ts +11 -4
- package/es/Descriptions/component.json +142 -0
- package/es/Descriptions/index.d.ts +1 -1
- package/es/Desktop/component.json +171 -0
- package/es/DragVerify/component.json +114 -0
- package/es/DragVerify/index.js +19 -19
- package/es/Drawer/component.json +200 -0
- package/es/Drawer/index.js +86 -86
- package/es/Drawer/interface.d.ts +1 -1
- package/es/Drawer/util.d.ts +1 -6
- package/es/Drawer/util.js +9 -6
- package/es/Dropdown/component.json +147 -0
- package/es/DynamicMultiBox/component.json +278 -0
- package/es/DynamicMultiBox/formItem.d.ts +1 -1
- package/es/DynamicMultiBox/rowForm.d.ts +2 -2
- package/es/Empty/component.json +123 -0
- package/es/Empty/index.css +1 -1
- package/es/Empty/index.d.ts +2 -2
- package/es/Empty/index.js +27 -26
- package/es/Empty/style/index.css +1 -1
- package/es/FieldForm/FieldFormItem/MemoInput.d.ts +2 -2
- package/es/FieldForm/FieldFormItem/index.d.ts +6 -6
- package/es/FieldForm/Form.d.ts +2 -2
- package/es/FieldForm/FormList.d.ts +2 -2
- package/es/FieldForm/component.json +196 -0
- package/es/FieldForm/context.d.ts +5 -1
- package/es/FieldForm/context.js +2 -2
- package/es/FieldForm/hooks/useForm.d.ts +4 -3
- package/es/FieldForm/hooks/useFormInstance.d.ts +1 -1
- package/es/FieldForm/hooks/useFormItemStatus.d.ts +9 -5
- package/es/FieldForm/hooks/useFormItemStatus.js +2 -2
- package/es/FieldForm/hooks/useItemRef.d.ts +1 -1
- package/es/FieldForm/hooks/useItemRef.js +6 -6
- package/es/Form/component.json +161 -0
- package/es/Form/index.d.ts +52 -49
- package/es/FormItem/compoments/defaultCompoments/index.d.ts +5 -5
- package/es/FormItem/compoments/defaultCompoments/index.js +12 -11
- package/es/FormItem/compoments/formCheckboxGroup/index.d.ts +2 -2
- package/es/FormItem/compoments/formFile/index.js +8 -8
- package/es/FormItem/compoments/formRadioGroup/index.d.ts +1 -1
- package/es/FormItem/compoments/formSelect/index.d.ts +1 -1
- package/es/FormItem/component.json +171 -0
- package/es/FormItem/index.d.ts +5 -5
- package/es/FormItem/index.js +23 -23
- package/es/FormItem/itemType.js +1 -1
- package/es/FunctionModal/component.json +197 -0
- package/es/FunctionModal/dialog.d.ts +1 -1
- package/es/FunctionModal/modalContext.d.ts +4 -1
- package/es/Help/component.json +118 -0
- package/es/HelperText/component.json +126 -0
- package/es/Image/component.json +165 -0
- package/es/InputCode/component.json +191 -0
- package/es/InputCode/index.d.ts +2 -2
- package/es/InputLang/component.json +205 -0
- package/es/InputLang/index.js +1 -1
- package/es/InputNumber/component.json +162 -0
- package/es/Label/component.json +126 -0
- package/es/Label/index.d.ts +2 -2
- package/es/Loading/component.json +91 -0
- package/es/Menu/component.json +180 -0
- package/es/Message/component.json +246 -0
- package/es/Message/index.d.ts +2 -2
- package/es/Message/index.js +2 -2
- package/es/Modal/Confirm/index.d.ts +1 -1
- package/es/Modal/Confirm/index.js +81 -75
- package/es/Modal/component.json +277 -0
- package/es/Modal/index.d.ts +97 -6
- package/es/Modal/index.js +174 -122
- package/es/Modal/interface.d.ts +1 -0
- package/es/MultiBox/component.json +216 -0
- package/es/MultiBox/index.js +19 -14
- package/es/Notification/component.json +184 -0
- package/es/OperateBtn/component.json +134 -0
- package/es/OperateBtn/index.d.ts +3 -3
- package/es/PageHeader/component.json +112 -0
- package/es/Pagination/component.json +181 -0
- package/es/Pagination/index.js +15 -15
- package/es/PasswordRules/component.json +105 -0
- package/es/PasswordRules/index.d.ts +4 -4
- package/es/PopConfirm/component.json +227 -0
- package/es/PopConfirm/index.d.ts +1 -1
- package/es/PopConfirm/index.js +1 -1
- package/es/PopMenu/component.json +131 -0
- package/es/PopMenu/hooks.d.ts +1 -1
- package/es/PopMenu/index.js +8 -8
- package/es/Popover/component.json +165 -0
- package/es/Popover/index.js +1 -1
- package/es/Progress/component.json +161 -0
- package/es/Prompt/component.json +144 -0
- package/es/Querying/component.json +96 -0
- package/es/Querying/index.css +1 -1
- package/es/Querying/index.d.ts +2 -2
- package/es/Querying/index.js +20 -19
- package/es/Querying/style/index.css +1 -1
- package/es/QuickReply/component.json +129 -0
- package/es/QuickReply/index.d.ts +1 -1
- package/es/Radio/component.json +136 -0
- package/es/RadioGroup/component.json +149 -0
- package/es/RangeInput/component.json +198 -0
- package/es/RangeInput/index.js +1 -1
- package/es/Result/component.json +104 -0
- package/es/ScrollBar/component.json +115 -0
- package/es/Search/component.json +177 -0
- package/es/Search/index.d.ts +1 -1
- package/es/Select/component.json +244 -0
- package/es/Select/index.js +113 -113
- package/es/SelectInput/component.json +184 -0
- package/es/Selector/component.json +203 -0
- package/es/Selector/index.js +28 -27
- package/es/Selector/interface.d.ts +1 -1
- package/es/Selector/selectorMain/index.js +2 -2
- package/es/Selector/selectorNode/index.js +1 -1
- package/es/Selector/util.d.ts +2 -2
- package/es/SelectorPicker/component.json +179 -0
- package/es/SelectorPicker/index.d.ts +5 -5
- package/es/SelectorPicker/index.js +15 -15
- package/es/SingleBox/component.json +151 -0
- package/es/SingleBox/index.d.ts +2 -2
- package/es/Slider/component.json +181 -0
- package/es/SortBox/component.json +108 -0
- package/es/Status/component.json +104 -0
- package/es/Stepper/component.json +129 -0
- package/es/Stepper/index.d.ts +2 -2
- package/es/Switch/component.json +207 -0
- package/es/Switch/index.css +1 -1
- package/es/Switch/index.d.ts +3 -2
- package/es/Switch/index.js +60 -59
- package/es/Switch/style/index.css +1 -1
- package/es/Table/component.json +547 -0
- package/es/Table/index.d.ts +2 -2
- package/es/Table/index.js +414 -414
- package/es/Table/interface.d.ts +6 -0
- package/es/Tabs/component.json +227 -0
- package/es/Tag/component.json +221 -0
- package/es/Tag/index.css +1 -1
- package/es/Tag/index.d.ts +1 -1
- package/es/Tag/index.js +20 -20
- package/es/Tag/style/index.css +1 -1
- package/es/TextEditor/component.json +186 -0
- package/es/TextEditor/index.d.ts +5 -5
- package/es/TextField/component.json +290 -0
- package/es/TextField/index.d.ts +2 -2
- package/es/TimePicker/component.json +176 -0
- package/es/Timeline/component.json +110 -0
- package/es/Title/component.json +156 -0
- package/es/ToggleButton/component.json +153 -0
- package/es/Tooltip/component.json +176 -0
- package/es/Tooltip/index.js +74 -63
- package/es/Tooltip/interface.d.ts +14 -1
- package/es/Tooltip/utils.js +6 -6
- package/es/Transfer/component.json +157 -0
- package/es/Tree/component.json +512 -0
- package/es/Upload/component.json +450 -0
- package/es/Utils/type.d.ts +0 -2
- package/es/index.d.ts +2 -0
- package/es/index.js +1 -1
- package/es/locale/en_US.d.ts +361 -0
- package/es/locale/en_US.js +364 -0
- package/es/locale/index.d.ts +1 -723
- package/es/locale/index2.js +10 -0
- package/es/locale/zh_CN.d.ts +361 -0
- package/es/locale/zh_CN.js +364 -0
- package/lib/AlignBox/component.json +89 -0
- package/lib/AlignBox/index.css +1 -1
- package/lib/AlignBox/index.d.ts +6 -2
- package/lib/AlignBox/index.js +1 -1
- package/lib/AlignBox/style/index.css +1 -1
- package/lib/Anchor/anchorMenu/index.d.ts +2 -1
- package/lib/Anchor/anchorMenu/index.js +1 -1
- package/lib/Anchor/component.json +130 -0
- package/lib/Anchor/index.js +1 -1
- package/lib/Anchor/type.d.ts +8 -4
- package/lib/Argv/component.json +216 -0
- package/lib/Argv/index.d.ts +5 -6
- package/lib/AutoBox/component.json +133 -0
- package/lib/AutoBox/index.d.ts +3 -3
- package/lib/AutoBox/index.js +1 -1
- package/lib/AutoBox/protal.d.ts +2 -2
- package/lib/AutoBox/protal.js +1 -1
- package/lib/AutoButton/component.json +109 -0
- package/lib/AutoButton/index.js +1 -1
- package/lib/AutoTips/autoTipsMultiline/index.d.ts +1 -1
- package/lib/AutoTips/autoTipsMultiline/index.js +1 -1
- package/lib/AutoTips/component.json +121 -0
- package/lib/Badge/component.json +92 -0
- package/lib/Breadcrumbs/component.json +142 -0
- package/lib/Breadcrumbs/index.js +1 -1
- package/lib/Button/SplitButton.d.ts +2 -2
- package/lib/Button/component.json +168 -0
- package/lib/Button/index.js +1 -1
- package/lib/ButtonGroup/component.json +132 -0
- package/lib/ButtonGroup/index.d.ts +1 -1
- package/lib/Card/component.json +162 -0
- package/lib/Card/index.d.ts +2 -2
- package/lib/Card/index.js +1 -1
- package/lib/Carousel/component.json +142 -0
- package/lib/Carousel/index.d.ts +1 -1
- package/lib/Cascader/Cascader.js +1 -1
- package/lib/Cascader/component.json +196 -0
- package/lib/Cascader/hooks/useEntities.js +1 -1
- package/lib/Cascader/interface.d.ts +1 -0
- package/lib/Cascader/utils/commonUtil.d.ts +1 -1
- package/lib/Cascader/utils/commonUtil.js +1 -1
- package/lib/Cascader/utils/treeUtil.d.ts +14 -5
- package/lib/Cascader/utils/treeUtil.js +1 -1
- package/lib/Checkbox/component.json +138 -0
- package/lib/CheckboxGroup/component.json +152 -0
- package/lib/CodeEditor/component.json +189 -0
- package/lib/CodeEditor/index.d.ts +10 -9
- package/lib/Collapse/component.json +166 -0
- package/lib/Collapse/index.d.ts +1 -1
- package/lib/Collapse/index.js +1 -1
- package/lib/CollapseBox/component.json +84 -0
- package/lib/CollapseLayout/component.json +155 -0
- package/lib/ColorPicker/component.json +142 -0
- package/lib/ComboSelect/component.json +181 -0
- package/lib/ComboSelect/index.js +1 -1
- package/lib/ComboSelect/interface.d.ts +6 -3
- package/lib/ComboSelect/utils.d.ts +3 -3
- package/lib/ComboSelect/utils.js +1 -1
- package/lib/Container/component.json +111 -0
- package/lib/ContentBox/component.json +81 -0
- package/lib/CopyText/component.json +118 -0
- package/lib/CycleSelector/component.json +98 -0
- package/lib/CycleSelector/index.js +1 -1
- package/lib/DatePicker/component.json +192 -0
- package/lib/DatePicker/generatePicker/generateRangePicker.d.ts +0 -8
- package/lib/DatePicker/generatePicker/generateRangePicker.js +1 -1
- package/lib/DatePicker/generatePicker/generateSinglePicker.js +1 -1
- package/lib/DatePicker/generatePicker/index.d.ts +11 -4
- package/lib/Descriptions/component.json +142 -0
- package/lib/Descriptions/index.d.ts +1 -1
- package/lib/Desktop/component.json +171 -0
- package/lib/DragVerify/component.json +114 -0
- package/lib/DragVerify/index.js +1 -1
- package/lib/Drawer/component.json +200 -0
- package/lib/Drawer/index.js +1 -1
- package/lib/Drawer/interface.d.ts +1 -1
- package/lib/Drawer/util.d.ts +1 -6
- package/lib/Drawer/util.js +1 -1
- package/lib/Dropdown/component.json +147 -0
- package/lib/DynamicMultiBox/component.json +278 -0
- package/lib/DynamicMultiBox/formItem.d.ts +1 -1
- package/lib/DynamicMultiBox/rowForm.d.ts +2 -2
- package/lib/Empty/component.json +123 -0
- package/lib/Empty/index.css +1 -1
- package/lib/Empty/index.d.ts +2 -2
- package/lib/Empty/index.js +1 -1
- package/lib/Empty/style/index.css +1 -1
- package/lib/FieldForm/FieldFormItem/MemoInput.d.ts +2 -2
- package/lib/FieldForm/FieldFormItem/index.d.ts +6 -6
- package/lib/FieldForm/Form.d.ts +2 -2
- package/lib/FieldForm/FormList.d.ts +2 -2
- package/lib/FieldForm/component.json +196 -0
- package/lib/FieldForm/context.d.ts +5 -1
- package/lib/FieldForm/context.js +1 -1
- package/lib/FieldForm/hooks/useForm.d.ts +4 -3
- package/lib/FieldForm/hooks/useFormInstance.d.ts +1 -1
- package/lib/FieldForm/hooks/useFormItemStatus.d.ts +9 -5
- package/lib/FieldForm/hooks/useFormItemStatus.js +1 -1
- package/lib/FieldForm/hooks/useItemRef.d.ts +1 -1
- package/lib/FieldForm/hooks/useItemRef.js +1 -1
- package/lib/Form/component.json +161 -0
- package/lib/Form/index.d.ts +52 -49
- package/lib/FormItem/compoments/defaultCompoments/index.d.ts +5 -5
- package/lib/FormItem/compoments/defaultCompoments/index.js +1 -1
- package/lib/FormItem/compoments/formCheckboxGroup/index.d.ts +2 -2
- package/lib/FormItem/compoments/formFile/index.js +1 -1
- package/lib/FormItem/compoments/formRadioGroup/index.d.ts +1 -1
- package/lib/FormItem/compoments/formSelect/index.d.ts +1 -1
- package/lib/FormItem/component.json +171 -0
- package/lib/FormItem/index.d.ts +5 -5
- package/lib/FormItem/index.js +1 -1
- package/lib/FormItem/itemType.js +1 -1
- package/lib/FunctionModal/component.json +197 -0
- package/lib/FunctionModal/dialog.d.ts +1 -1
- package/lib/FunctionModal/modalContext.d.ts +4 -1
- package/lib/Help/component.json +118 -0
- package/lib/HelperText/component.json +126 -0
- package/lib/Image/component.json +165 -0
- package/lib/InputCode/component.json +191 -0
- package/lib/InputCode/index.d.ts +2 -2
- package/lib/InputLang/component.json +205 -0
- package/lib/InputLang/index.js +1 -1
- package/lib/InputNumber/component.json +162 -0
- package/lib/Label/component.json +126 -0
- package/lib/Label/index.d.ts +2 -2
- package/lib/Loading/component.json +91 -0
- package/lib/Menu/component.json +180 -0
- package/lib/Message/component.json +246 -0
- package/lib/Message/index.d.ts +2 -2
- package/lib/Message/index.js +1 -1
- package/lib/Modal/Confirm/index.d.ts +1 -1
- package/lib/Modal/Confirm/index.js +1 -1
- package/lib/Modal/component.json +277 -0
- package/lib/Modal/index.d.ts +97 -6
- package/lib/Modal/index.js +1 -1
- package/lib/Modal/interface.d.ts +1 -0
- package/lib/MultiBox/component.json +216 -0
- package/lib/MultiBox/index.js +1 -1
- package/lib/Notification/component.json +184 -0
- package/lib/OperateBtn/component.json +134 -0
- package/lib/OperateBtn/index.d.ts +3 -3
- package/lib/PageHeader/component.json +112 -0
- package/lib/Pagination/component.json +181 -0
- package/lib/Pagination/index.js +1 -1
- package/lib/PasswordRules/component.json +105 -0
- package/lib/PasswordRules/index.d.ts +4 -4
- package/lib/PopConfirm/component.json +227 -0
- package/lib/PopConfirm/index.d.ts +1 -1
- package/lib/PopConfirm/index.js +1 -1
- package/lib/PopMenu/component.json +131 -0
- package/lib/PopMenu/hooks.d.ts +1 -1
- package/lib/PopMenu/index.js +1 -1
- package/lib/Popover/component.json +165 -0
- package/lib/Popover/index.js +1 -1
- package/lib/Progress/component.json +161 -0
- package/lib/Prompt/component.json +144 -0
- package/lib/Querying/component.json +96 -0
- package/lib/Querying/index.css +1 -1
- package/lib/Querying/index.d.ts +2 -2
- package/lib/Querying/index.js +1 -1
- package/lib/Querying/style/index.css +1 -1
- package/lib/QuickReply/component.json +129 -0
- package/lib/QuickReply/index.d.ts +1 -1
- package/lib/Radio/component.json +136 -0
- package/lib/RadioGroup/component.json +149 -0
- package/lib/RangeInput/component.json +198 -0
- package/lib/RangeInput/index.js +1 -1
- package/lib/Result/component.json +104 -0
- package/lib/ScrollBar/component.json +115 -0
- package/lib/Search/component.json +177 -0
- package/lib/Search/index.d.ts +1 -1
- package/lib/Select/component.json +244 -0
- package/lib/Select/index.js +1 -1
- package/lib/SelectInput/component.json +184 -0
- package/lib/Selector/component.json +203 -0
- package/lib/Selector/index.js +1 -1
- package/lib/Selector/interface.d.ts +1 -1
- package/lib/Selector/selectorMain/index.js +1 -1
- package/lib/Selector/selectorNode/index.js +1 -1
- package/lib/Selector/util.d.ts +2 -2
- package/lib/SelectorPicker/component.json +179 -0
- package/lib/SelectorPicker/index.d.ts +5 -5
- package/lib/SelectorPicker/index.js +1 -1
- package/lib/SingleBox/component.json +151 -0
- package/lib/SingleBox/index.d.ts +2 -2
- package/lib/Slider/component.json +181 -0
- package/lib/SortBox/component.json +108 -0
- package/lib/Status/component.json +104 -0
- package/lib/Stepper/component.json +129 -0
- package/lib/Stepper/index.d.ts +2 -2
- package/lib/Switch/component.json +207 -0
- package/lib/Switch/index.css +1 -1
- package/lib/Switch/index.d.ts +3 -2
- package/lib/Switch/index.js +1 -1
- package/lib/Switch/style/index.css +1 -1
- package/lib/Table/component.json +547 -0
- package/lib/Table/index.d.ts +2 -2
- package/lib/Table/index.js +1 -1
- package/lib/Table/interface.d.ts +6 -0
- package/lib/Tabs/component.json +227 -0
- package/lib/Tag/component.json +221 -0
- package/lib/Tag/index.css +1 -1
- package/lib/Tag/index.d.ts +1 -1
- package/lib/Tag/index.js +1 -1
- package/lib/Tag/style/index.css +1 -1
- package/lib/TextEditor/component.json +186 -0
- package/lib/TextEditor/index.d.ts +5 -5
- package/lib/TextField/component.json +290 -0
- package/lib/TextField/index.d.ts +2 -2
- package/lib/TimePicker/component.json +176 -0
- package/lib/Timeline/component.json +110 -0
- package/lib/Title/component.json +156 -0
- package/lib/ToggleButton/component.json +153 -0
- package/lib/Tooltip/component.json +176 -0
- package/lib/Tooltip/index.js +1 -1
- package/lib/Tooltip/interface.d.ts +14 -1
- package/lib/Tooltip/utils.js +1 -1
- package/lib/Transfer/component.json +157 -0
- package/lib/Tree/component.json +512 -0
- package/lib/Upload/component.json +450 -0
- package/lib/Utils/type.d.ts +0 -2
- package/lib/index.d.ts +2 -0
- package/lib/index.js +1 -1
- package/lib/locale/en_US.d.ts +361 -0
- package/lib/locale/en_US.js +2 -0
- package/lib/locale/index.d.ts +1 -723
- package/lib/locale/index2.js +2 -0
- package/lib/locale/zh_CN.d.ts +361 -0
- package/lib/locale/zh_CN.js +2 -0
- package/package.json +10 -3
- /package/es/{Utils/Hooks → Hooks}/useResizeObserver.d.ts +0 -0
- /package/es/{Utils/Hooks → Hooks}/useResizeObserver.js +0 -0
- /package/lib/{Utils/Hooks → Hooks}/useResizeObserver.d.ts +0 -0
- /package/lib/{Utils/Hooks → Hooks}/useResizeObserver.js +0 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# @para-ui/core AI 使用指南
|
|
2
|
+
|
|
3
|
+
本文档帮助 AI 工具(Cursor、Claude Code 等)正确使用 @para-ui/core 组件库。
|
|
4
|
+
|
|
5
|
+
## 🚨 必查 Top 9 高频陷阱(写代码前必读,不分组件)
|
|
6
|
+
|
|
7
|
+
**M5 + combo baseline 实证**:以下 9 个陷阱在多轮实验中是主要失败模式。**忽略其中任何一个 = 概率失败一个 task**。
|
|
8
|
+
|
|
9
|
+
| # | 陷阱 | 错误 | 正确 |
|
|
10
|
+
|---|------|------|------|
|
|
11
|
+
| 1 | **Message 命令式 API import** | `import { Message } from '@para-ui/core'` → 拿到 JSX 组件,`Message.success()` 运行时报错 | `import { Message } from '@para-ui/core/Message'`(子路径) |
|
|
12
|
+
| 2 | **Table 列定义字段名** | `<Table columns={[{title, dataIndex}]} />`(antd 风格) | `<Table headData={[{name, label, width}]} rowKey="id" />`(headData 不是 columns;render 第一参是 row 不是 value) |
|
|
13
|
+
| 3 | **Form configList 类型** | `<Form configList={undefined} />` → TS2345 | `<Form configList={list \|\| []} />` 或 `''` |
|
|
14
|
+
| 4 | **Form 不接受 ref** | `<Form ref={formRef} />` → TS2322 | `<Form form={formRef} />`(form prop,不是 ref) |
|
|
15
|
+
| 5 | **Upload onChange 参数** | `onChange={({fileList, file}) => ...}` → TS2339 | `onChange={(files: UploadFile[]) => ...}`(参数就是数组) |
|
|
16
|
+
| 6 | **rules.validate 大小写** | `{ maxLength, minlength }` → 静默失效 | `{ maxlength, minLength }`(maxlength 小写 L,minLength 驼峰 L) |
|
|
17
|
+
| 7 | **DynamicMultiBox 类型导入** | `import { IConfig } from '@para-ui/core/DynamicMultiBox/interface'` → TS2307 | `import type { IConfig } from '@para-ui/core/DynamicMultiBox'`(不走 /interface 子路径) |
|
|
18
|
+
| 8 | **Button variant 不是 antd 的 type** | `<Button type="primary">` / `type="default"` / `type="text"` → TS2322(type 是 HTML button type) | `<Button variant="contained">` / `variant="outlined"` / `variant="text"`(注意是 `outlined` 不是 `outline`) |
|
|
19
|
+
| 9 | **Table data prop 名** | `<Table rowData={...}>` → TS2322 | `<Table data={...}>`(不是 rowData/dataSource) |
|
|
20
|
+
|
|
21
|
+
→ **任何 prompt 即使强调"重点 X",这 9 条也必须先扫一遍**。这是兜底防线,不是"可选优化"。
|
|
22
|
+
|
|
23
|
+
⚠️ **prompt over-focus 风险**:即使 prompt 说"重点关注 X",也不要让 over-focus 让你跳过这 9 条。这些是跨组件的全局陷阱,**Button** 和 **Table** 几乎在每个组合场景里都出现,最易被忽视。
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 快速开始
|
|
28
|
+
|
|
29
|
+
安装后,在你的项目配置中(`.cursor/rules` / `CLAUDE.md` / IDE config)加入以下引导,确保 AI 工具优先读取本库的 metadata:
|
|
30
|
+
|
|
31
|
+
### 对于 Claude Code 用户(CLAUDE.md)
|
|
32
|
+
|
|
33
|
+
在项目根目录的 `CLAUDE.md` 中,加入:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
## @para-ui/core 使用指南
|
|
37
|
+
|
|
38
|
+
使用本库时:
|
|
39
|
+
1. 优先读 `node_modules/@para-ui/core/AGENTS.md`(本文件)
|
|
40
|
+
2. 查组件 API:读 `node_modules/@para-ui/core/{ComponentName}/component.json`(完整的 metadata)
|
|
41
|
+
3. 或读自动生成的文档:`node_modules/@para-ui/core/dist/components/{ComponentName}.md`(Phase 2 后可用)
|
|
42
|
+
|
|
43
|
+
查组件时的优先级:
|
|
44
|
+
1️⃣ component.json(最新、最准)
|
|
45
|
+
2️⃣ 自动生成的 .md 文档
|
|
46
|
+
3️⃣ src 的 TypeScript 类型定义(作为最后参考)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 对于 Cursor 用户(.cursor/rules)
|
|
50
|
+
|
|
51
|
+
在 `.cursor/rules` 中,加入:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
## @para-ui/core 规则
|
|
55
|
+
|
|
56
|
+
使用 @para-ui/core 组件库时:
|
|
57
|
+
- 优先读 node_modules/@para-ui/core/{ComponentName}/component.json 的 do/dont 和 semantic 字段
|
|
58
|
+
- 不要使用内部 class(以 .paraui-v4- 开头)
|
|
59
|
+
- 受控/非受控模式不要混用
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 组件使用规范
|
|
65
|
+
|
|
66
|
+
### 标准查阅流程
|
|
67
|
+
|
|
68
|
+
每次使用组件前,按这个顺序查阅:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
1. 需要用 Button?
|
|
72
|
+
→ 读 node_modules/@para-ui/core/Button/component.json
|
|
73
|
+
→ 看 idealProps、do、dont、semantic 字段
|
|
74
|
+
→ 参考 do 中的最佳实践
|
|
75
|
+
→ 避免 dont 中的常见错误
|
|
76
|
+
|
|
77
|
+
2. 组件有多个 variant?
|
|
78
|
+
→ component.json 的 variants 字段列出所有变体
|
|
79
|
+
→ 按 semantic.intent 选择正确的变体
|
|
80
|
+
|
|
81
|
+
3. 受控 vs 非受控?
|
|
82
|
+
→ 查 component.json 的 semantic 字段
|
|
83
|
+
→ 通常:value + onChange = 受控
|
|
84
|
+
→ defaultValue / initialValues = 非受控
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 常见规范
|
|
88
|
+
|
|
89
|
+
#### 禁止使用内部样式 class
|
|
90
|
+
|
|
91
|
+
❌ **错误**:
|
|
92
|
+
```tsx
|
|
93
|
+
<div className="paraui-v4-button paraui-v4-button--primary">
|
|
94
|
+
Click me
|
|
95
|
+
</div>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
✅ **正确**:
|
|
99
|
+
```tsx
|
|
100
|
+
import { Button } from '@para-ui/core';
|
|
101
|
+
|
|
102
|
+
<Button variant="primary">
|
|
103
|
+
Click me
|
|
104
|
+
</Button>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
eslint rule `@para-ui/eslint-plugin:no-internal-class` 会自动挡住内部 class 的使用。
|
|
108
|
+
|
|
109
|
+
#### 受控/非受控不混用
|
|
110
|
+
|
|
111
|
+
❌ **错误**:
|
|
112
|
+
```tsx
|
|
113
|
+
<Form
|
|
114
|
+
initialValues={{ name: '' }}
|
|
115
|
+
value={values} {/* ❌ 不要同时用 initialValues 和 value */}
|
|
116
|
+
onChange={handleChange}
|
|
117
|
+
>
|
|
118
|
+
...
|
|
119
|
+
</Form>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
✅ **正确**(非受控):
|
|
123
|
+
```tsx
|
|
124
|
+
<Form initialValues={{ name: '' }}>
|
|
125
|
+
...
|
|
126
|
+
</Form>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
✅ **正确**(受控):
|
|
130
|
+
```tsx
|
|
131
|
+
const [values, setValues] = useState({ name: '' });
|
|
132
|
+
|
|
133
|
+
<Form value={values} onChange={setValues}>
|
|
134
|
+
...
|
|
135
|
+
</Form>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### Modal / 对话框受控示例
|
|
139
|
+
|
|
140
|
+
✅ **正确**(受控):
|
|
141
|
+
```tsx
|
|
142
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
143
|
+
|
|
144
|
+
<>
|
|
145
|
+
<Button onClick={() => setIsOpen(true)}>打开对话框</Button>
|
|
146
|
+
<Modal open={isOpen} onClose={() => setIsOpen(false)}>
|
|
147
|
+
<Modal.Header>标题</Modal.Header>
|
|
148
|
+
<Modal.Body>内容</Modal.Body>
|
|
149
|
+
</Modal>
|
|
150
|
+
</>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 工具与命令
|
|
156
|
+
|
|
157
|
+
### 验证你的代码
|
|
158
|
+
|
|
159
|
+
在下游项目中,运行 eslint 来检查是否违反 @para-ui/core 规范:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
npm run lint
|
|
163
|
+
# 或
|
|
164
|
+
npx eslint . --ext .tsx,.ts --plugin @para-ui/eslint-plugin
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
常见 rule:
|
|
168
|
+
- `@para-ui/no-internal-class` — 禁止内部 class
|
|
169
|
+
- `@para-ui/controlled-defaults` — 禁止受控/非受控混用
|
|
170
|
+
- `@para-ui/no-deprecated-prop` — 废弃 prop 警告
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 常见问题
|
|
175
|
+
|
|
176
|
+
**Q: 如何找到所有可用的组件?**
|
|
177
|
+
|
|
178
|
+
A: 读 `node_modules/@para-ui/core/dist/llms.txt`(自动生成的组件清单和导航)
|
|
179
|
+
|
|
180
|
+
**Q: component.json 在哪里?**
|
|
181
|
+
|
|
182
|
+
A: 每个组件都有:`node_modules/@para-ui/core/{ComponentName}/component.json`
|
|
183
|
+
|
|
184
|
+
**Q: 如何了解组件的最佳实践(do/dont)?**
|
|
185
|
+
|
|
186
|
+
A: 读 component.json 的 `do` 和 `dont` 字段,或读自动生成的 `dist/components/{ComponentName}.md`
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 更新频率
|
|
191
|
+
|
|
192
|
+
本文档与组件库版本同步更新。每个新版本的 component.json 都会包含最新的 metadata 和最佳实践。
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## ⭐ 跨组件工作流模板(v2 新增,Phase 3a M4)
|
|
197
|
+
|
|
198
|
+
**重要**:写**多组件协作**场景(如 CRUD 列表 / 表单工作流 / 批量操作)前,**必须先读对应工作流模板**。这些模板基于 Para 真实业务代码 + 对照实验失败数据,每个都经 mini-baseline 实测通过。
|
|
199
|
+
|
|
200
|
+
位置:`node_modules/@para-ui/core/ai-workflows/`
|
|
201
|
+
|
|
202
|
+
### 10 个工作流(按场景速查)
|
|
203
|
+
|
|
204
|
+
| 场景 | 文件 | 涉及组件 |
|
|
205
|
+
|------|------|----------|
|
|
206
|
+
| 列表 + 多 Drawer + 操作列 | `01-crud-list-multi-drawer.md` | Table / Drawer / OperateBtn / PopConfirm / Message |
|
|
207
|
+
| RBAC 权限驱动操作列 | `02-rbac-operation-buttons.md` | Table / Tag / OperateBtn |
|
|
208
|
+
| 复杂表单(异步/级联/上传) | `03-complex-form-async-cascade.md` | Form / Select / DatePicker / Upload |
|
|
209
|
+
| 数组字段表单 | `04-array-field-form.md` | DynamicMultiBox / Form |
|
|
210
|
+
| PopConfirm 异步链 / Message 队列 | `05-popconfirm-async-message-queue.md` | PopConfirm / Message / Switch |
|
|
211
|
+
| Modal/Drawer 嵌套 Form | `06-modal-drawer-form-workflow.md` | Modal / Drawer / Form |
|
|
212
|
+
| Search + Filter + Table 三件套 | `07-search-filter-table-trio.md` | Search / Select / DatePicker / Table |
|
|
213
|
+
| 表格高级(排序/编辑/展开/分页) | `08-table-advanced-features.md` | Table(深度用法) |
|
|
214
|
+
| 批量操作 + 导出进度 | `09-batch-operation-export-progress.md` | Table / Modal / Progress / Upload |
|
|
215
|
+
| 跨组件状态联动(Dashboard/切换/撤销) | `10-cross-component-state-coordination.md` | Tabs / Form / Tree |
|
|
216
|
+
|
|
217
|
+
### 工作流模板结构
|
|
218
|
+
|
|
219
|
+
每个模板包含:
|
|
220
|
+
1. **何时使用 + 不要用的场景**(决策树)
|
|
221
|
+
2. **错误 vs 正确模式对照表**(提前防 AI 出错)
|
|
222
|
+
3. **完整代码**(120-180 行可运行 TSX)
|
|
223
|
+
4. **5 个真实陷阱详解**(每条 wrong/right 对照 + M2/M3/M4 实证)
|
|
224
|
+
5. **真实参考行号**(指向 Para 团队业务代码)
|
|
225
|
+
|
|
226
|
+
### 硬约束
|
|
227
|
+
|
|
228
|
+
- ❌ **不要先写代码再查模板** — 先查模板看是否有现成模式
|
|
229
|
+
- ❌ **不要忽略"错误模式对照"** — 那里列的就是 AI 常犯错
|
|
230
|
+
- ✅ **复制模板代码后,按业务场景改业务名词**(用户/订单/资产等)
|
|
231
|
+
- ✅ **保留所有 typescriptPitfalls 中的"正确写法"**(如 Table 用 headData 不是 columns)
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## ⚙️ ESLint plugin 手动接入(可选,强烈推荐)
|
|
236
|
+
|
|
237
|
+
`@para-ui/eslint-plugin` 含 10 条 rule,能自动挡住 AI 写代码时常犯的 @para-ui/core 风格错误(如 `Table.columns`、`Button.type='primary'`、`Message` 主入口 import 等)。M5 实测启用 plugin 后多组件场景准确率 21% → 92%。
|
|
238
|
+
|
|
239
|
+
**v1.0.0-beta 阶段 plugin 未在 npm 独立发布**。下游用户可通过以下任一方式手动接入:
|
|
240
|
+
|
|
241
|
+
### 方式 A:本地 `file:` 引用(最直接)
|
|
242
|
+
|
|
243
|
+
1. clone `@para-ui/core` 仓库到本地任意位置(如 `~/projects/para-ui-core`)
|
|
244
|
+
2. 在你项目的 `package.json` 加:
|
|
245
|
+
|
|
246
|
+
```json
|
|
247
|
+
{
|
|
248
|
+
"devDependencies": {
|
|
249
|
+
"@para-ui/eslint-plugin": "file:~/projects/para-ui-core/packages/eslint-plugin-para-ui"
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
3. `npm install`
|
|
255
|
+
|
|
256
|
+
### 方式 B:tgz 包
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
# 在 @para-ui/core 仓库内
|
|
260
|
+
cd packages/eslint-plugin-para-ui
|
|
261
|
+
npm pack
|
|
262
|
+
# 生成 para-ui-eslint-plugin-0.1.0.tgz
|
|
263
|
+
|
|
264
|
+
# 在你项目内
|
|
265
|
+
npm install /path/to/para-ui-eslint-plugin-0.1.0.tgz --save-dev
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### `.eslintrc.json` 配置
|
|
269
|
+
|
|
270
|
+
接入后,在你项目根目录的 `.eslintrc.json` 加:
|
|
271
|
+
|
|
272
|
+
```json
|
|
273
|
+
{
|
|
274
|
+
"plugins": ["@para-ui"],
|
|
275
|
+
"rules": {
|
|
276
|
+
"@para-ui/no-internal-class": "error",
|
|
277
|
+
"@para-ui/no-wrong-table-props": "error",
|
|
278
|
+
"@para-ui/no-wrong-button-type": "error",
|
|
279
|
+
"@para-ui/no-wrong-table-data": "error",
|
|
280
|
+
"@para-ui/require-headdata-generic": "error",
|
|
281
|
+
"@para-ui/require-rowkey": "error",
|
|
282
|
+
"@para-ui/message-import-from-subpath": "error",
|
|
283
|
+
"@para-ui/form-use-form-prop-not-ref": "error",
|
|
284
|
+
"@para-ui/no-deprecated-prop": "warn",
|
|
285
|
+
"@para-ui/overlay-conventions": "warn"
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**⚠️ `plugins` 字段用短名 `@para-ui`,不是 `@para-ui/eslint-plugin`**(ESLint scoped 包命名约定)。
|
|
291
|
+
|
|
292
|
+
### 验证
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
npx eslint src/your-file.tsx
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
如果代码里有 `<Button type="primary">` 这种 antd 风格,会报错:
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
src/your-file.tsx:10:5 error Para UI Button 用 variant,不是 type。
|
|
302
|
+
type="primary" 应该是 variant="contained" @para-ui/no-wrong-button-type
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### 与 IDE 集成
|
|
306
|
+
|
|
307
|
+
VSCode / Cursor 装了 ESLint 扩展后,**写代码时实时报错**——这是 plugin 真正的价值(AI 写错的瞬间就被挡住)。
|
|
308
|
+
|
|
309
|
+
### 后续路径
|
|
310
|
+
|
|
311
|
+
v1.1(如有真实下游需求)将正式发布 `@para-ui/eslint-plugin` 到 npm,届时只需 `npm i -D @para-ui/eslint-plugin` 即可。
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
**最后更新**:2026-05-18
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "AlignBox",
|
|
3
|
+
"category": "Layout",
|
|
4
|
+
"description": "方向语义对齐容器:direction='horizontal'(默认)子元素水平排列+垂直居中;direction='vertical'子元素纵向堆叠+水平居中。根元素为 block 级 flex div,style/className 直接作用于该 flex 容器。",
|
|
5
|
+
"semantic": {
|
|
6
|
+
"intent": [
|
|
7
|
+
"方向对齐",
|
|
8
|
+
"水平排列容器",
|
|
9
|
+
"纵向堆叠容器"
|
|
10
|
+
],
|
|
11
|
+
"useCases": [
|
|
12
|
+
"图标 + 文字 + 标签 一行内水平对齐(direction='horizontal')",
|
|
13
|
+
"字段纵向堆叠每行一个(direction='vertical')",
|
|
14
|
+
"卡片内简单的横向元素对齐"
|
|
15
|
+
],
|
|
16
|
+
"riskLevel": "low"
|
|
17
|
+
},
|
|
18
|
+
"variants": {
|
|
19
|
+
"horizontal": {
|
|
20
|
+
"meaning": "**子元素水平排列 + 垂直居中** — `display:flex; align-items:center`;子元素按 row 排列,在交叉轴(垂直)居中。默认值。**主轴对齐默认 flex-start**(DEFECT-006):两端对齐 / 居中等需 className 或 style 追加 justify-content"
|
|
21
|
+
},
|
|
22
|
+
"vertical": {
|
|
23
|
+
"meaning": "**子元素纵向堆叠 + 水平居中** — `display:flex; flex-direction:column; align-items:center`;子元素从上到下堆叠,在交叉轴(水平)居中。**⚠️ DEFECT-007:子元素宽度 = 内容宽度**(align-items:center 收缩,非撑满容器);修复方案:① 给子元素自身加 `width:100%`(推荐):`<div style={{ width: '100%' }}>内容</div>`;② 或在 AlignBox 上加 `style={{ alignItems: 'stretch' }}` 覆盖。嵌套场景(vertical 包 horizontal):内层 AlignBox 必须加 `style={{ width: '100%' }}` 才能撑满父容器"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"states": [
|
|
27
|
+
"default"
|
|
28
|
+
],
|
|
29
|
+
"idealProps": {
|
|
30
|
+
"direction": {
|
|
31
|
+
"type": "enum",
|
|
32
|
+
"values": [
|
|
33
|
+
"horizontal",
|
|
34
|
+
"vertical"
|
|
35
|
+
],
|
|
36
|
+
"default": "horizontal",
|
|
37
|
+
"description": "子元素排列方向(字面 = 行为):`horizontal` = 水平排列 + 垂直居中(`display:flex; align-items:center`;主轴对齐默认 flex-start,需要两端对齐用 `style={{ justifyContent: 'space-between' }}`,需要右对齐用 `justifyContent: 'flex-end'`);`vertical` = 纵向堆叠 + 水平居中(`display:flex; flex-direction:column; align-items:center`)。**vertical 模式两个注意点**:① 子元素间**无默认 gap**——需要均匀间距时加 `style={{ gap: '8px' }}`(8px 紧凑 / 12px 标准 / 16px 宽松);② 子元素**宽度默认收缩至内容宽度**(DEFECT-007,align-items:center 副作用)——若子元素需要撑满父宽度,加 `style={{ alignItems: 'stretch' }}`(整体)或在每个子元素上加 `style={{ width: '100%' }}`(单独控制)。**2026-05-08 跨组件命名 epic §3.3 选项 I 重设计** — 替代旧 `alignType: 'vertical' | 'flex'`(BREAKING-CHANGES §A5)"
|
|
38
|
+
},
|
|
39
|
+
"children": {
|
|
40
|
+
"type": "ReactNode",
|
|
41
|
+
"description": "子元素;按 direction 控制的轴向排列"
|
|
42
|
+
},
|
|
43
|
+
"className": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "外层根 div 的类名(AlignBox-DEFECT-003:src/AlignBox/index.tsx 实证)。常用于追加自定义样式覆盖,如 `flex-wrap: wrap` / `gap` / `justify-content` 等 direction 未提供的属性"
|
|
46
|
+
},
|
|
47
|
+
"style": {
|
|
48
|
+
"type": "React.CSSProperties",
|
|
49
|
+
"description": "外层根 div 的内联样式(AlignBox-DEFECT-003:src/AlignBox/index.tsx 实证)。**根 div 同时也是 flex 容器**(不存在两层 div 分离),因此 style 可直接传 flexWrap / gap / justifyContent 等 flex 属性,与 className 追加等效。常用示例:`style={{ flexWrap: 'wrap', gap: '8px' }}`(换行 + 间距);`style={{ justifyContent: 'space-between' }}`(两端对齐);`style={{ width: '100%' }}`(vertical 模式下覆盖 DEFECT-007 宽度收缩)"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"do": [
|
|
53
|
+
"需要『一行内水平排列 + 垂直居中』(图标 + 文字 + 标签)用 direction='horizontal'(默认值,可省略)",
|
|
54
|
+
"需要『子元素纵向堆叠 + 水平居中』(字段每行一个)用 direction='vertical'",
|
|
55
|
+
"vertical 模式需要子元素间均匀间距:加 `style={{ gap: '8px' }}`(8px 紧凑 / 12px 标准 / 16px 宽松)——vertical 本身无默认 gap",
|
|
56
|
+
"vertical 模式需要子元素撑满父宽度(卡片内容、表单字段):加 `style={{ alignItems: 'stretch' }}`——vertical 子元素默认宽度收缩至内容宽度(DEFECT-007)",
|
|
57
|
+
"horizontal 需要两端对齐:`style={{ justifyContent: 'space-between', width: '100%' }}`;需要右对齐:`style={{ justifyContent: 'flex-end' }}`——horizontal 默认 flex-start(左对齐)",
|
|
58
|
+
"需要 wrap / gap / justify-content 等 direction 未提供的 flex 属性,用 **className** 追加 *或* **style 内联**(两种方式等效,因为 style 直接作用于根 flex div):`style={{ flexWrap: 'wrap', gap: '8px', justifyContent: 'space-between' }}`",
|
|
59
|
+
"**业务方语义直觉 = direction 字面**:从 v6 开始 horizontal/vertical 即字面对齐 — 不再有命名错位"
|
|
60
|
+
],
|
|
61
|
+
"dont": [
|
|
62
|
+
"过度嵌套 AlignBox",
|
|
63
|
+
"替代 CSS Grid/Flexbox 进行复杂布局",
|
|
64
|
+
"**不要再传旧 prop `alignType`** — 已 BREAKING 移除(BREAKING-CHANGES §A5);从 v5.x 之前升级请按以下映射:旧 `alignType='vertical'`(实为 inline vertical-align middle)→ 新 `direction='horizontal'`(语义最接近);旧 `alignType='flex'`(实为 flex row 居中)→ 新 `direction='horizontal'`(行为完全一致)。要用真正的纵向堆叠请显式传 `direction='vertical'`",
|
|
65
|
+
"不要假设 `direction='horizontal'` 自动 flex-wrap — src 仅 `display:flex; align-items:center`,无 wrap;要换行请加 className"
|
|
66
|
+
],
|
|
67
|
+
"events": {},
|
|
68
|
+
"typescriptPitfalls": [
|
|
69
|
+
{
|
|
70
|
+
"issue": "direction 只接受 'horizontal' | 'vertical',不接受 antd flex 方向字符串",
|
|
71
|
+
"wrong": "<AlignBox direction='row'>...</AlignBox> // 'row' 不在联合类型中,TS 报错",
|
|
72
|
+
"right": "<AlignBox direction='horizontal'>...</AlignBox> // 水平排列用 'horizontal'"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"issue": "vertical 模式下子元素宽度默认收缩至内容宽度(align-items:center 副作用),需显式覆盖",
|
|
76
|
+
"wrong": "<AlignBox direction='vertical'><div className='full-row'>...</div></AlignBox> // 子 div 宽度收缩,不是撑满",
|
|
77
|
+
"right": "<AlignBox direction='vertical' style={{ alignItems: 'stretch' }}>...</AlignBox> // 或在子元素加 style={{ width: '100%' }}"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"issue": "style 和 className 直接作用于根 flex div,不存在两层 div 分离",
|
|
81
|
+
"wrong": "// 以为有内外两层 div,试图用 className 覆盖内层 flex 容器\n<AlignBox style={{ display: 'block' }}>...</AlignBox> // 覆盖 display 会破坏 flex 对齐",
|
|
82
|
+
"right": "// style 直接透传到根 flex div,追加 flex 属性即可\n<AlignBox style={{ gap: '8px', justifyContent: 'space-between' }}>...</AlignBox>"
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"mapping": {
|
|
86
|
+
"realComponent": "AlignBox",
|
|
87
|
+
"adapter": null
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Anchor",
|
|
3
|
+
"category": "Navigation",
|
|
4
|
+
"description": "页面内锚点导航——自动生成目录侧栏并监听内容区滚动高亮目录项,点击目录项内置滚动定位行为。高度约束写在 Anchor 直接父 div 上,无限高度时内部不产生滚动。",
|
|
5
|
+
"semantic": {
|
|
6
|
+
"intent": [
|
|
7
|
+
"快速定位",
|
|
8
|
+
"内容索引"
|
|
9
|
+
],
|
|
10
|
+
"useCases": [
|
|
11
|
+
"长文档",
|
|
12
|
+
"API 文档",
|
|
13
|
+
"单页应用"
|
|
14
|
+
],
|
|
15
|
+
"riskLevel": "low"
|
|
16
|
+
},
|
|
17
|
+
"variants": {
|
|
18
|
+
"default": {
|
|
19
|
+
"meaning": "标准锚点"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"states": [
|
|
23
|
+
"active",
|
|
24
|
+
"default"
|
|
25
|
+
],
|
|
26
|
+
"idealProps": {
|
|
27
|
+
"children": {
|
|
28
|
+
"type": "ReactNode",
|
|
29
|
+
"description": "内容区,放置带 `id` 属性的各章节 div;Anchor 通过监听滚动位置高亮左侧目录。⚠️ children 是必需的,缺少会导致锚点无法定位",
|
|
30
|
+
"required": true
|
|
31
|
+
},
|
|
32
|
+
"list": {
|
|
33
|
+
"type": "AnchorItem[]",
|
|
34
|
+
"typeDefinition": "interface AnchorItem { name: string; id: string; children?: AnchorItem[]; expanded?: boolean }",
|
|
35
|
+
"description": "目录数据源。**AnchorItem 字段一览(仅 name + id 必填)**:① name: string — 侧栏显示文案;② id: string — 对应 children 内章节 `<div id={item.id}>` 的 DOM id(Anchor 内部用 id 定位高亮,大小写必须精确一致;建议仅用字母/数字/-/_,避免 CSS 选择器特殊字符;若业务数据字段是 href='#intro',映射时去掉 # 前缀:`id: s.href.replace(/^#/, '')`);③ children?: AnchorItem[] — 多级嵌套(自动渲染为缩进树,建议 ≤3 级;递归时复用同一映射函数);④ expanded?: boolean — 该项初始展开态(default false;⚠️ 与 allExpanded prop 完全独立:allExpanded 控制顶部「全部展开」按钮可见性,不等于初始全展开;初始全展开需对每个含 children 的 AnchorItem 设 expanded:true)。完整 TS 定义:interface AnchorItem { name: string; id: string; children?: AnchorItem[]; expanded?: boolean }(parentId 是 Anchor 内部字段,业务传 list 时无需提供)。"
|
|
36
|
+
},
|
|
37
|
+
"scrollId": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"default": "\"paraui-v4-anchor-scroll-id\"",
|
|
40
|
+
"description": "**Anchor 内部自动创建的滚动容器 DOM id**——业务方只需传一个全局唯一字符串,Anchor 会在渲染时自动创建 `<div id={scrollId}>` 并把 children 放入其中;**不需要在 children 外部或内部手动创建该 div**。Anchor 对此 div 监听 scroll 事件 + 用 `[id]` 选择器定位高亮目录项。单页只有一个 Anchor 时可省略(默认 'paraui-v4-anchor-scroll-id');同页多个 Anchor 实例必须各自传不同的 scrollId 以隔离滚动监听。scrollId 查找:Anchor 内部用 `document.getElementById(scrollId)` 获取滚动容器——正常渲染后此 div 必然存在,无需业务方手动创建。"
|
|
41
|
+
},
|
|
42
|
+
"title": {
|
|
43
|
+
"type": "ReactNode",
|
|
44
|
+
"description": "目录标题;只有传 title 才显示折叠按钮 / 全部展开按钮 / search 搜索框。**(R6 §6 类型放宽:从 string → ReactNode)**——支持嵌入徽标 / 计数 / 动态状态文本(如 `<span>目录<Tag>当前: intro</Tag></span>`)。string 是 ReactNode 子集,完全向后兼容旧 string 用法。详见 BREAKING-CHANGES §维护规则边界(类型 widening 不入档)+ discussions/Anchor-title-reactnode.md"
|
|
45
|
+
},
|
|
46
|
+
"placement": {
|
|
47
|
+
"type": "'left' | 'right'",
|
|
48
|
+
"values": ["left", "right"],
|
|
49
|
+
"default": "'right'",
|
|
50
|
+
"description": "目录位于内容的左侧还是右侧。⚠️ 默认 'right'(目录在右侧);要实现左侧目录须显式传 placement='left'"
|
|
51
|
+
},
|
|
52
|
+
"search": {
|
|
53
|
+
"type": "boolean",
|
|
54
|
+
"default": false,
|
|
55
|
+
"description": "目录是否带搜索框(按 name 模糊匹配)。需配合 title 使用。"
|
|
56
|
+
},
|
|
57
|
+
"allExpanded": {
|
|
58
|
+
"type": "boolean",
|
|
59
|
+
"default": true,
|
|
60
|
+
"description": "顶部『全部展开』按钮是否启用(控制按钮可见性,不影响 `list[].expanded` 的初始值)。仅在 list 含 children 且传了 title 时生效。\n\n**⚠️ 命名歧义警告(R15+R16 双轮再现 · 3/6 sub-agent 混淆)**:allExpanded 命名容易被理解为「初始全展开」(类似 defaultExpandAll),但实际含义是「全部展开」**按钮**的可见性控制开关:\n- `allExpanded=true`(默认)→ 顶部出现「全部展开」按钮,用户**点击按钮后**才展开全部目录项\n- `allExpanded=false` → 隐藏「全部展开」按钮\n- **若要初始全展开(组件挂载即全展开)**:对 list[] 中每个含 children 的 AnchorItem 设置 `expanded: true`,与 allExpanded prop 无关\n\n**R17 路线图**:正在评审 src rename `allExpanded → expandedAll`(BREAKING,更准确地表达「控制展开按钮」含义),详见 `discussions/Anchor-allExpanded-naming-epic.md`;R17 拍板前 allExpanded 继续有效,0 BREAKING。"
|
|
61
|
+
},
|
|
62
|
+
"listWidth": {
|
|
63
|
+
"type": "number",
|
|
64
|
+
"description": "目录列表宽度(px);不传时默认 140px。"
|
|
65
|
+
},
|
|
66
|
+
"customPrefixIcon": {
|
|
67
|
+
"type": "ReactNode | ((item: AnchorItem, isActive: boolean) => ReactNode)",
|
|
68
|
+
"description": "自定义目录每项的前缀图标。**(R6 §6 类型放宽:从 ReactNode → ReactNode | function)**:<br>- **静态 ReactNode** — 所有目录项共用同一前缀图标(原行为,完全向后兼容)<br>- **函数形式 `(item, isActive) => ReactNode`** — 按当前激活态返回不同 ReactNode(墨水点指示器 / 激活态指示符 / 复选框联动等);函数版每次激活变化触发 list 重渲染,内部 AnchorListMemo 已优化。<br>**初始激活态说明**:页面 mount 时 Anchor 不主动激活任何目录项——需要用户滚动(或点击)触发第一次 scroll 事件后才会激活;初始激活项由滚动位置决定(内部算法:找第一个 offsetTop >= scrollTop 的 [id] 元素)。若需要初始激活特定项,可在 mount 后手动调用 `document.getElementById(SCROLL_ID)?.dispatchEvent(new Event('scroll'))` 触发一次。<br>**业务方仍可走激活态 CSS 联动**(向后兼容):Anchor 内部对激活目录项加 className `.anchor-menu-item.active`(无 prefixCls 前缀,见 src/Anchor/anchorMenu/index.scss:14);可在外层 style 选择器 `:global(.anchor-menu-item.active) [data-ink-dot] { visibility: visible }` 联动。但函数形式更直接、类型安全。详见 discussions/Anchor-customPrefixIcon-function.md(R6 实施选项 B 类型 widening)"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"do": [
|
|
72
|
+
"在长页面(如文档)右侧提供 Anchor",
|
|
73
|
+
"Anchor 标题应简洁",
|
|
74
|
+
"把章节 DOM 作为 children 直接传入:`<Anchor list={list} scrollId='xxx'>{sections.map(s => <div id={s.id}>...</div>)}</Anchor>`",
|
|
75
|
+
"list[].id 必须与 children 中对应章节 div 的 id 完全一致(含大小写);建议仅使用 CSS selector 安全字符",
|
|
76
|
+
"业务侧 `{ href, title }` 数据派生 list 时使用 `sections.map(s => ({ name: s.title, id: s.href.replace(/^#/, '') }))` 映射;多级数据写递归映射函数(参见 docs/view/anchor/codeString.ts hrefMappingDemo / nestedMappingDemo)",
|
|
77
|
+
"Anchor 内部滚动容器需要由父级提供有限高度(如 `style={{ height: 400 }}` 或外层 wrapper 设 `height: 100vh`)才能产生滚动;外层高度无限时内容不会滚动,stickyDemo 也无法体现『内容滚动而目录吸顶』效果",
|
|
78
|
+
"需要把激活 id 还原成业务 href 时:用 useEffect 监听 activeId 变化 + 业务侧维护 id->href 反向 map(参见 codeString.ts notifyParentDemo)",
|
|
79
|
+
"需要『吸顶 / 滚动偏移头部 / 激活回调』时:用外层 div 包 `position: sticky; top: 0` 实现吸顶(**前置条件:外层必须有滚动祖先——body 高度 > 视口、或某 wrapper 设了 `overflow:auto/scroll`;⚠️ `overflow:auto/scroll` 是合法滚动祖先,不会导致 sticky 失效——仅 `overflow:hidden` 的祖先会使 sticky 退化为 relative;flex 容器中配合 `alignSelf: flex-start` 避免 stretch 拉满高度**;缺少任一条件则 sticky 退化为 relative);用 `<section style={{ scrollMarginTop: headerOffset }}>` **写在每个章节元素自身** 实现偏移;用容器自定义 `addEventListener('scroll', ...)` 计算激活章节并 onChange 通知父组件——这些不是 Anchor 内置能力"
|
|
80
|
+
],
|
|
81
|
+
"dont": [
|
|
82
|
+
"Anchor 嵌套层级过深 (>3级) —— 设计/视觉建议;src 实现层 formatList 递归无硬限制,违反仅触发缩进过深视觉异常",
|
|
83
|
+
"内容过少的页面使用 Anchor",
|
|
84
|
+
"不要传 `targetOffset` / `affix` / `showInkInFixed` / `onChange` / `items` / `onClick` 等 prop——这些 prop 在 AnchorProps 中不存在,传入会被 React 忽略且能力不会生效",
|
|
85
|
+
"不要在 children 内再包一层 `<div id={scrollId}>` 自管理滚动——Anchor 已内部包了 `<div id={scrollId}>`",
|
|
86
|
+
"不要把 `scrollPaddingTop` 写在 children 内的 wrapper 上——`scrollPaddingTop` 仅对滚动容器生效(即 Anchor 内部 `<div id={scrollId}>`,外部无法直接访问);偏移请用 `scrollMarginTop` 写在**每个章节元素自身**上"
|
|
87
|
+
],
|
|
88
|
+
"events": {
|
|
89
|
+
"onClickItem (via AnchorMenu internal)": {
|
|
90
|
+
"signature": "内部点击目录项时调用 handleClick(id: string),无外部事件 prop",
|
|
91
|
+
"asyncSupported": false,
|
|
92
|
+
"examples": [
|
|
93
|
+
"点击目录项时 Anchor 内部调用 scrollTo 滚动到对应章节,无需业务方处理",
|
|
94
|
+
"需要监听激活变化时,用外层 wrapper 的 addEventListener('scroll', ...) 计算当前 id",
|
|
95
|
+
"需要把 activeId 回传父组件:用 useEffect 监听 scrollId 容器的 scroll 事件 + 业务侧 id→href 反向 map"
|
|
96
|
+
],
|
|
97
|
+
"commonMistakes": [
|
|
98
|
+
"传 onChange prop 期望激活目录项变化时被回调——Anchor 不存在 onChange prop",
|
|
99
|
+
"传 onClick prop 期望拦截目录项点击——AnchorProps 无此 prop,传入会被 React 忽略",
|
|
100
|
+
"期望 customPrefixIcon 在点击瞬间触发回调——它只是渲染函数,激活态变化驱动重渲染"
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"typescriptPitfalls": [
|
|
105
|
+
{
|
|
106
|
+
"issue": "AnchorItem 无法从 @para-ui/core/Anchor 直接命名导出——Anchor/index.tsx 只有默认导出,AnchorItem 定义在 Anchor/type.ts",
|
|
107
|
+
"wrong": "import type { AnchorItem } from '@para-ui/core/Anchor'; // TS2614: 无此命名导出",
|
|
108
|
+
"right": "import type { AnchorItem } from '@para-ui/core/Anchor/type'; // 从 type.ts 子路径导入"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"issue": "AnchorItem 的 id 必须与 children 内章节 div 的 DOM id 完全一致(大小写敏感)",
|
|
112
|
+
"wrong": "// list: [{ name: '介绍', id: 'Introduction' }]\n// children: <div id='introduction'> // 大小写不同,无法高亮",
|
|
113
|
+
"right": "// 保持一致且使用 CSS selector 安全字符\n// list: [{ name: '介绍', id: 'introduction' }]\n// children: <div id='introduction'>..."
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"issue": "title prop 从 string 扩宽到 ReactNode,但 allExpanded 是控制按钮可见性,不是初始全展开",
|
|
117
|
+
"wrong": "// 以为 allExpanded=true 会初始展开所有目录项\n<Anchor allExpanded={true} list={tree} /> // 实际只是显示'全部展开'按钮",
|
|
118
|
+
"right": "// 初始全展开需要对每个含 children 的 AnchorItem 设 expanded: true\nconst tree = data.map(item => ({ ...item, expanded: true, children: item.children?.map(c => ({ ...c, expanded: true })) }))"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"issue": "customPrefixIcon 函数形式的参数类型必须显式标注,避免 noImplicitAny 报错",
|
|
122
|
+
"wrong": "// 内联函数不标注类型\n<Anchor customPrefixIcon={(item, isActive) => <span />} /> // TS7006: item 隐式 any",
|
|
123
|
+
"right": "import type { AnchorItem } from '@para-ui/core/Anchor';\n<Anchor customPrefixIcon={(item: AnchorItem, isActive: boolean) => <span style={{ color: isActive ? 'blue' : 'gray' }}>•</span>} />"
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
"mapping": {
|
|
127
|
+
"realComponent": "Anchor",
|
|
128
|
+
"adapter": null
|
|
129
|
+
}
|
|
130
|
+
}
|