@para-ui/core 5.0.0-beta.12 → 5.0.0-beta.13
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/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/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 +23 -22
- 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 +73 -68
- package/es/ComboSelect/interface.d.ts +2 -2
- 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.js +10 -10
- package/es/DatePicker/generatePicker/generateSinglePicker.js +1 -1
- 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/component.json +277 -0
- package/es/Modal/index.d.ts +85 -5
- package/es/Modal/index.js +159 -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 +58 -53
- 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/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 +2 -2
- 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.js +1 -1
- package/lib/DatePicker/generatePicker/generateSinglePicker.js +1 -1
- 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/component.json +277 -0
- package/lib/Modal/index.d.ts +85 -5
- 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 +9 -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
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Descriptions",
|
|
3
|
+
"category": "Data Display",
|
|
4
|
+
"description": "描述列表,成组展示多个只读键值对字段,支持折叠展开和边框模式",
|
|
5
|
+
"semantic": {
|
|
6
|
+
"intent": [
|
|
7
|
+
"信息展示",
|
|
8
|
+
"详情查看",
|
|
9
|
+
"键值对展示"
|
|
10
|
+
],
|
|
11
|
+
"useCases": [
|
|
12
|
+
"用户信息",
|
|
13
|
+
"订单详情",
|
|
14
|
+
"配置概览"
|
|
15
|
+
],
|
|
16
|
+
"riskLevel": "low"
|
|
17
|
+
},
|
|
18
|
+
"variants": {
|
|
19
|
+
"default": {
|
|
20
|
+
"meaning": "标准描述列表(无边框,horizontal 布局)"
|
|
21
|
+
},
|
|
22
|
+
"bordered": {
|
|
23
|
+
"meaning": "带边框描述列表(border=true)"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"states": [
|
|
27
|
+
"default",
|
|
28
|
+
"collapsed",
|
|
29
|
+
"expanded"
|
|
30
|
+
],
|
|
31
|
+
"idealProps": {
|
|
32
|
+
"list": {
|
|
33
|
+
"type": "DescriptionsListProps[]",
|
|
34
|
+
"description": "列表配置数组;DescriptionsListProps 字段:label(ReactNode 标题)、content(ReactNode 内容)、column(number 占比列数,默认 1)。**不是 antd 风格的 items 字段——para-ui 用 list**"
|
|
35
|
+
},
|
|
36
|
+
"layout": {
|
|
37
|
+
"type": "enum",
|
|
38
|
+
"values": [
|
|
39
|
+
"horizontal",
|
|
40
|
+
"vertical"
|
|
41
|
+
],
|
|
42
|
+
"default": "horizontal",
|
|
43
|
+
"description": "布局方向;horizontal=标题+内容在同一行,vertical=标题在上内容在下(各占一行)"
|
|
44
|
+
},
|
|
45
|
+
"column": {
|
|
46
|
+
"type": "number",
|
|
47
|
+
"description": "每行显示的列数;horizontal 无 border 默认 4,horizontal 有 border 默认 3,vertical 默认 4;也可通过 list 每项的 column 字段单独设置跨列数"
|
|
48
|
+
},
|
|
49
|
+
"border": {
|
|
50
|
+
"type": "boolean",
|
|
51
|
+
"default": false,
|
|
52
|
+
"description": "是否显示边框(table 形式);border=true 时 collapse 功能不可用(src/Descriptions/index.tsx:235 实证:collapse && !border 才启用折叠)"
|
|
53
|
+
},
|
|
54
|
+
"title": {
|
|
55
|
+
"type": "string | TitleProps",
|
|
56
|
+
"description": "标题;传 string 时自动包装为 TitleProps;传 TitleProps 对象可自定义 title/subtitle/action 等"
|
|
57
|
+
},
|
|
58
|
+
"collapse": {
|
|
59
|
+
"type": "boolean",
|
|
60
|
+
"default": false,
|
|
61
|
+
"description": "是否启用折叠(仅 horizontal 无 border 时有效);启用后显示展开/收起按钮,配合 collapsedHeight 控制收起最小高度"
|
|
62
|
+
},
|
|
63
|
+
"collapsedHeight": {
|
|
64
|
+
"type": "string | number",
|
|
65
|
+
"default": 60,
|
|
66
|
+
"description": "收起状态最小高度(default 60);仅 collapse=true 且 border=false 时生效"
|
|
67
|
+
},
|
|
68
|
+
"defaultOpen": {
|
|
69
|
+
"type": "boolean",
|
|
70
|
+
"default": false,
|
|
71
|
+
"description": "初始是否展开(非受控,仅首次渲染生效)"
|
|
72
|
+
},
|
|
73
|
+
"open": {
|
|
74
|
+
"type": "boolean",
|
|
75
|
+
"description": "受控展开状态;传入后外部可控制展开/收起;不传时组件内部维护状态"
|
|
76
|
+
},
|
|
77
|
+
"onCollapse": {
|
|
78
|
+
"type": "(bol: boolean) => void",
|
|
79
|
+
"description": "折叠状态变化回调;bol=true 表示展开"
|
|
80
|
+
},
|
|
81
|
+
"paddingRight": {
|
|
82
|
+
"type": "number | string",
|
|
83
|
+
"default": 40,
|
|
84
|
+
"description": "横向模式每个字段的右内边距(控制标题与内容间距)"
|
|
85
|
+
},
|
|
86
|
+
"className": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"description": "根容器自定义类名"
|
|
89
|
+
},
|
|
90
|
+
"style": {
|
|
91
|
+
"type": "React.CSSProperties",
|
|
92
|
+
"description": "根容器自定义样式"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"do": [
|
|
96
|
+
"用于展示键值对形式的详情数据——list 每项传 { label, content } 即可",
|
|
97
|
+
"根据内容量决定 column:内容较少用 column=2,内容较多用 column=3/4",
|
|
98
|
+
"需要折叠功能:传 collapse=true(仅 horizontal + 无 border 时有效),配合 collapsedHeight 设置预览高度"
|
|
99
|
+
],
|
|
100
|
+
"dont": [
|
|
101
|
+
"在 Descriptions 中放入可编辑表单——应使用 Form 组件",
|
|
102
|
+
"Label 过长导致排版错乱——label 超过 6 个字时建议配合 AutoTips 或缩短文案",
|
|
103
|
+
"border=true 时传 collapse=true 期望折叠生效——两者互斥(src 实证:border=true 时 collapse 被忽略)",
|
|
104
|
+
"用 items 字段传数据(antd 风格)——para-ui Descriptions 用 list 字段"
|
|
105
|
+
],
|
|
106
|
+
"events": {
|
|
107
|
+
"onCollapse": {
|
|
108
|
+
"signature": "(bol: boolean) => void",
|
|
109
|
+
"asyncSupported": false,
|
|
110
|
+
"examples": [
|
|
111
|
+
"受控折叠:<Descriptions collapse open={isOpen} onCollapse={(bol) => setIsOpen(bol)} />",
|
|
112
|
+
"仅监听不受控:<Descriptions collapse onCollapse={(bol) => trackEvent(bol ? 'expand' : 'collapse')} />",
|
|
113
|
+
"bol=true 表示用户点击展开,bol=false 表示用户点击收起"
|
|
114
|
+
],
|
|
115
|
+
"commonMistakes": [
|
|
116
|
+
"期望 border=true 时 onCollapse 触发——collapse 功能在 border=true 时不可用,onCollapse 永不触发",
|
|
117
|
+
"传 open 不传 onCollapse,以为可以完全受控——open prop 变化会同步状态,但不传 onCollapse 用户点击无法反向通知父端"
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"typescriptPitfalls": [
|
|
122
|
+
{
|
|
123
|
+
"issue": "list 字段名是 list,不是 antd 风格的 items",
|
|
124
|
+
"wrong": "<Descriptions items={[{ label: '姓名', children: '张三' }]} /> // items/children 是 antd 风格,para-ui 不支持",
|
|
125
|
+
"right": "<Descriptions list={[{ label: '姓名', content: '张三' }]} /> // 用 list + content"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"issue": "border=true 时 collapse 不生效,两者在 TS 层面不互斥但运行时 border 优先级更高",
|
|
129
|
+
"wrong": "<Descriptions border collapse /> // border=true 时 collapse 被忽略,无折叠按钮",
|
|
130
|
+
"right": "<Descriptions collapse /> // 折叠功能只在 border=false(默认)时可用"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"issue": "title 同时接受 string 和 TitleProps 对象,混用导致 TS 联合类型错误",
|
|
134
|
+
"wrong": "title={{ text: '标题' }} // TitleProps 字段是 title,不是 text",
|
|
135
|
+
"right": "title='标题' // 字符串即可;或 title={{ title: '标题', subtitle: '副标题' }}"
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
"mapping": {
|
|
139
|
+
"realComponent": "Descriptions",
|
|
140
|
+
"adapter": null
|
|
141
|
+
}
|
|
142
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Desktop",
|
|
3
|
+
"category": "Layout",
|
|
4
|
+
"description": "桌面布局组件,支持拖拽排序的网格布局。**API 设计上有 3 个已知硬约束**(见 limitations):1) onClick/onSort 回调返回完整数组而非单项;2) icon 只接受 base64 string 不接受 ReactNode;3) 无 children / render prop 不支持任意内容渲染",
|
|
5
|
+
"semantic": {
|
|
6
|
+
"intent": [
|
|
7
|
+
"拖拽排序的应用网格",
|
|
8
|
+
"可自定义顺序的图标列表",
|
|
9
|
+
"持久化用户布局偏好"
|
|
10
|
+
],
|
|
11
|
+
"useCases": [
|
|
12
|
+
"工作台(可拖拽的应用入口集合)",
|
|
13
|
+
"仪表盘首页(应用列表,需要内容用 base64 icon)",
|
|
14
|
+
"个性化首页(顺序持久化到 localStorage)"
|
|
15
|
+
],
|
|
16
|
+
"riskLevel": "low"
|
|
17
|
+
},
|
|
18
|
+
"limitations": {
|
|
19
|
+
"L1_onClick_returns_full_array": {
|
|
20
|
+
"issue": "**onClick(data) 的 data 是完整 DesktopDataItem 数组,不是被点击的单个 item**。无法直接知道用户点的是第几项",
|
|
21
|
+
"rootCause": "src/Desktop/index.tsx:44 实证:click handler 传 `[...data]` 给外部",
|
|
22
|
+
"workaround": "在 data 项挂 _payload 扩展字段(如 _index / _app),配合 onSort 维护当前顺序的引用,在 onClick 内根据 e.target.closest('[data-key]') 或自维护的 currentClickedKey 反查 —— 但**Desktop 内部没有暴露 click 时的 key,只能改用 data[0] 假设是被点击项或外部加 React 事件代理**。**结构性限制,docs 救不了**",
|
|
23
|
+
"alternative": "**强烈建议**:如果业务需要识别点击项,改用 Container + Card 自行实现网格 + onClick,或者只用 Desktop 做'排序'功能,'打开应用'功能由 data 项上的 children 字段(若需嵌入按钮)在外层另起 UI"
|
|
24
|
+
},
|
|
25
|
+
"L2_icon_no_reactnode": {
|
|
26
|
+
"issue": "**icon 字段只接受 base64 string,不接受 React.ReactNode**(SVG 组件 / 图标组件等)",
|
|
27
|
+
"rootCause": "Desktop 内部用 `<img src={icon} />` 渲染,React.ReactNode 会触发 TypeScript 类型错误或运行时 ReactNode-as-string 错误",
|
|
28
|
+
"workaround": "**适配上层 AppItem.icon: ReactNode 接口的 3 种方式**:\n1. **改业务接口**(推荐):AppItem.icon 改成 `string | { reactNode: ReactNode }`,Desktop 只读 string 分支\n2. **运行时转换**:用 dom-to-image / html-to-image 把 ReactNode 渲染成 base64(performance 代价大)\n3. **降级**:typeof icon === 'string' 时透传,否则不传 icon 字段(显示无图标,只显示 name)\n\n业务方常踩坑写 `<Desktop data={[{key, name, icon: <Icon />}]} />` 直接传 ReactNode,会 tsc 报错",
|
|
29
|
+
"alternative": "需要任意 ReactNode 渲染:换用 Container + 自实现网格,或者 RcDraggable 类组件"
|
|
30
|
+
},
|
|
31
|
+
"L3_no_children_render": {
|
|
32
|
+
"issue": "**Desktop 不支持 children / render prop / itemRender 自定义格子内容**。每个格子只能渲染 icon (img) + name (text)",
|
|
33
|
+
"rootCause": "src/Desktop/index.tsx:33 - DesktopProps 无 children / renderItem / itemRender 等字段",
|
|
34
|
+
"workaround": "无 —— 这是结构性限制",
|
|
35
|
+
"alternative": "需要每格放 React 组件(如 Widget / Card / 按钮组):**不要用 Desktop**,改用 Container + 自己用 react-grid-layout / dnd-kit 实现拖拽网格"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"adaptationPatterns": {
|
|
39
|
+
"patternA_localStorageOrder": "**持久化排序到 localStorage**(主流场景):\n```ts\n// 1. 读初始顺序\nconst orderKey = 'myApp:desktopOrder';\nconst initialOrder: string[] = JSON.parse(localStorage.getItem(orderKey) || '[]');\n// 2. 按持久化顺序对业务数据排序\nconst orderedApps = useMemo(() => {\n if (!initialOrder.length) return apps;\n return [...apps].sort((a, b) => initialOrder.indexOf(a.id) - initialOrder.indexOf(b.id));\n}, [apps, initialOrder]);\n// 3. onSort 时只保存 key 序列,sort prop 保持 {}\nconst handleSort = (nextData) => {\n setApps(nextData.map(d => d._app));\n localStorage.setItem(orderKey, JSON.stringify(nextData.map(d => d.key)));\n};\n```\n**关键:sort prop 只在'恢复历史 sort 对象'场景才需要,正常持久化 key 序列就够**",
|
|
40
|
+
"patternB_clickIdentification": "**识别点击项 (workaround,有限可靠)**:\nDesktop 的 onClick(data) 不告诉你点了哪项,只能用 DOM 事件代理:\n```ts\n<div onClick={(e) => {\n const cell = (e.target as HTMLElement).closest('[data-id]');\n const id = cell?.getAttribute('data-id');\n if (id) handleAppClick(id);\n}}>\n <Desktop data={dataWithDataIdAttr} ... />\n</div>\n```\n或更**推荐:不依赖 Desktop.onClick,Desktop 只管排序,'打开应用'的点击行为另起方案**",
|
|
41
|
+
"patternC_reactNodeIcon": "**业务接口声明 icon: ReactNode 的衔接**:\n```ts\ninterface BusinessApp { id: string; name: string; icon: ReactNode; iconUrl?: string; }\n// 映射时只取 iconUrl(base64),不传 ReactNode\nconst desktopData = apps.map(app => ({\n key: app.id,\n name: app.name,\n icon: app.iconUrl // 只透传 string,ReactNode 不传\n}));\n```"
|
|
42
|
+
},
|
|
43
|
+
"variants": {
|
|
44
|
+
"default": {
|
|
45
|
+
"meaning": "默认样式"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"states": [
|
|
49
|
+
"default",
|
|
50
|
+
"dragging"
|
|
51
|
+
],
|
|
52
|
+
"idealProps": {
|
|
53
|
+
"data": {
|
|
54
|
+
"type": "Array<DesktopDataItem>",
|
|
55
|
+
"required": true,
|
|
56
|
+
"description": "拖拽列表数据;DesktopDataItem 接口 src/Desktop/index.tsx:23 已 export,字段:key(string 必填 唯一)、name(string?)、disable(boolean?)、icon(string? base64,**不支持 React.ReactNode** —— 见 limitations.L2)、disabledTooltip(TooltipProps?)、可挂任意扩展字段(`[k]: string|boolean|number|...`,常用 _payload / _app 挂业务模型)"
|
|
57
|
+
},
|
|
58
|
+
"sort": {
|
|
59
|
+
"type": "{ [key: string]: mapProps[] }",
|
|
60
|
+
"description": "排序映射,**可选受控**;value 为内部 mapProps[](opaque),`interface mapProps` 未 export,**调用方不应手动构造**。**典型用法 1**:首次渲染传 `{}`,组件按 data 顺序推导默认排序(推荐,99% 场景)。**典型用法 2**:从 localStorage 反序列化某次 onSort 后保存的 sort 对象再透传(罕见,通常直接持久化 key 序列即可)。**onSort 回调后通常无需更新 sort prop** —— 组件会基于新 data 顺序自动重排"
|
|
61
|
+
},
|
|
62
|
+
"onSort": {
|
|
63
|
+
"type": "(data: Array<DesktopDataItem>) => void",
|
|
64
|
+
"signature": "(data: Array<DesktopDataItem>) => void",
|
|
65
|
+
"description": "排序变化回调;**⚠️ data 参数为【排序后的完整 DesktopDataItem 数组】,不是 sort 映射对象,也不是 diff**。src/Desktop/index.tsx:42 实证;持久化新顺序时:**推荐保存 data.map(d => d.key) 数组**(简单稳定),而不是 sort 对象(opaque + 易过期)"
|
|
66
|
+
},
|
|
67
|
+
"onClick": {
|
|
68
|
+
"type": "(data: Array<DesktopDataItem>) => void",
|
|
69
|
+
"signature": "(data: Array<DesktopDataItem>) => void",
|
|
70
|
+
"description": "点击回调;**⚠️ data 参数为【完整 DesktopDataItem 数组】,不是被点击的单个 item**(已知 API 限制,见 limitations.L1)。**workaround**:在 Desktop 外层 div 用 React 事件代理 + 自维护 data-id 属性(见 adaptationPatterns.patternB)。**或不用 onClick**——只用 Desktop 排序,'打开应用'另起方案"
|
|
71
|
+
},
|
|
72
|
+
"tipMaxWidth": {
|
|
73
|
+
"type": "number",
|
|
74
|
+
"description": "禁用项 Tooltip 的最大宽度(px);仅在 DesktopDataItem 设置了 disable=true + disabledTooltip 字段时生效"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"commonMisconceptions": {
|
|
78
|
+
"M1": {
|
|
79
|
+
"wrong": "把 onSort(data) 的 data 当成 sort 映射对象处理:`onSort: (sortObj) => setSort(sortObj)`",
|
|
80
|
+
"result": "**data 实际是数组**,setSort 收到数组而期望对象 → TS 类型错误 + sort prop 状态混乱",
|
|
81
|
+
"fix": "改成 `onSort: (nextData) => setData(nextData)` —— data 是【排序后的完整 DesktopDataItem 数组】。sort prop 通常不需要在 onSort 回调里更新,保持 {} 即可"
|
|
82
|
+
},
|
|
83
|
+
"M2": {
|
|
84
|
+
"wrong": "在 data 项的 icon 字段传 React.ReactNode: `<Desktop data={[{key, name, icon: <Icon />}]} />`",
|
|
85
|
+
"result": "**TS 报错**(icon: string 字段类型不匹配) 或 runtime 渲染 [object Object]",
|
|
86
|
+
"fix": "icon 必须是 base64 string。需要 SVG / 图标组件:**预先用工具转 base64**(`btoa` + SVG 字符串),或**不传 icon**(显示无图标,只显示 name)。见 adaptationPatterns.patternC"
|
|
87
|
+
},
|
|
88
|
+
"M3": {
|
|
89
|
+
"wrong": "期望 onClick(data) 的 data 就是被点击的单项: `onClick: (item) => openApp(item.key)`",
|
|
90
|
+
"result": "**item 实际是完整数组**,`item.key` 是 undefined,openApp(undefined) 触发空指针",
|
|
91
|
+
"fix": "Desktop **结构性不支持识别单项点击**(L1)。两种 workaround:1) 外层 div 事件代理 + data-id(patternB);2) 不依赖 Desktop.onClick,改用 Desktop 仅管排序,点击行为另起 UI"
|
|
92
|
+
},
|
|
93
|
+
"M4": {
|
|
94
|
+
"wrong": "期望 Desktop 接受 children / renderItem 自定义格子内容: `<Desktop>{apps.map(...)}</Desktop>` 或 `<Desktop renderItem={...} />`",
|
|
95
|
+
"result": "**DesktopProps 无 children / renderItem 字段**,传入被静默忽略,格子仍只渲染 icon + name",
|
|
96
|
+
"fix": "需要每格放 React 组件:**不要用 Desktop**,改 Container + react-grid-layout / dnd-kit"
|
|
97
|
+
},
|
|
98
|
+
"M5": {
|
|
99
|
+
"wrong": "手动构造 sort prop 的 mapProps[] 形态: `sort={{ 'group-1': [{type: 'app', key: 'a', index: 0, ...}] }}`",
|
|
100
|
+
"result": "mapProps 接口未 export,字段会变(opaque),手动构造容易引发不可预期的渲染状态",
|
|
101
|
+
"fix": "sort 只用两种值:`{}` (默认,组件按 data 顺序推导) 或 上次 onSort 后从 localStorage 反序列化的整个 sort 对象。**永远不手动写 sort 字面量**"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"do": [
|
|
105
|
+
"**默认用法**:`<Desktop data={data} sort={{}} onSort={setData} />`(sort 用空对象,Desktop 自动推导)",
|
|
106
|
+
"用户排序偏好:保存 `nextData.map(d => d.key)` 到 localStorage(而非 sort 对象,见 patternA)",
|
|
107
|
+
"业务模型挂在 data 项的扩展字段(`_app`, `_payload` 等),onSort 时 map(_app) 取回",
|
|
108
|
+
"上层接口 icon 是 ReactNode 时:映射时只取 string 字段(iconUrl / iconBase64),不传 ReactNode(patternC)",
|
|
109
|
+
"需要识别点击项:外层 div 事件代理 + data-id 自维护(patternB);或不用 Desktop.onClick"
|
|
110
|
+
],
|
|
111
|
+
"dont": [
|
|
112
|
+
"**不要**把 onSort 的参数当 sort 对象处理——是数组(M1)",
|
|
113
|
+
"**不要**给 icon 传 React.ReactNode——只接受 base64 string(M2,L2)",
|
|
114
|
+
"**不要**期望 onClick 知道点的是哪一项——是数组(M3,L1)",
|
|
115
|
+
"**不要**用 children / renderItem 自定义格子——不存在(M4,L3)",
|
|
116
|
+
"**不要**手动构造 sort prop 的 mapProps 字面量——opaque(M5)",
|
|
117
|
+
"**不要**在每格需要嵌入任意 React 组件的场景使用 Desktop——换 Container + dnd-kit",
|
|
118
|
+
"拖拽项过多(>100)导致性能问题"
|
|
119
|
+
],
|
|
120
|
+
"events": {
|
|
121
|
+
"onSort": {
|
|
122
|
+
"signature": "(data: Array<DesktopDataItem>) => void",
|
|
123
|
+
"asyncSupported": false,
|
|
124
|
+
"examples": [
|
|
125
|
+
"基本排序:<Desktop data={data} sort={{}} onSort={(nextData) => setData(nextData)} />",
|
|
126
|
+
"持久化排序:onSort={(nextData) => { setData(nextData); localStorage.setItem('order', JSON.stringify(nextData.map(d => d.key))); }}",
|
|
127
|
+
"onSort 的 data 参数是排序后的完整 DesktopDataItem 数组(不是 diff,不是 sort 映射对象)"
|
|
128
|
+
],
|
|
129
|
+
"commonMistakes": [
|
|
130
|
+
"把 onSort(data) 的 data 当 sort 映射对象处理:setSort(data)——data 是数组,sort 期望 { [key]: mapProps[] }",
|
|
131
|
+
"期望 onSort 在初始化时触发——只有用户拖拽后才触发",
|
|
132
|
+
"持久化保存整个 data 数组(含业务 _payload 字段)——推荐只保存 data.map(d => d.key) 的 key 序列"
|
|
133
|
+
]
|
|
134
|
+
},
|
|
135
|
+
"onClick": {
|
|
136
|
+
"signature": "(data: Array<DesktopDataItem>) => void",
|
|
137
|
+
"asyncSupported": false,
|
|
138
|
+
"examples": [
|
|
139
|
+
"注意:data 是完整数组,不是被点击的单项——识别点击项需要外层事件代理",
|
|
140
|
+
"外层事件代理识别点击项:通过 e.target.closest('[data-id]') 反查 id",
|
|
141
|
+
"若不需要识别单项:仅用 onClick 感知'有项被点击'的触发,具体 item 由 sort 顺序推断"
|
|
142
|
+
],
|
|
143
|
+
"commonMistakes": [
|
|
144
|
+
"期望 onClick(item) 的 item 是被点击的单个 DesktopDataItem——实际是完整数组",
|
|
145
|
+
"item.key 是 undefined(因为 item 是数组):openApp(item.key) 触发空指针",
|
|
146
|
+
"期望通过 children/renderItem 自定义格子点击行为——Desktop 不支持 children/renderItem"
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"typescriptPitfalls": [
|
|
151
|
+
{
|
|
152
|
+
"issue": "icon 字段只接受 base64 string,传 ReactNode 会 TS 报错或运行时渲染 [object Object]",
|
|
153
|
+
"wrong": "data={[{ key: 'app1', name: '应用1', icon: <AppIcon /> }]} // TS 报错:icon: string 类型不匹配",
|
|
154
|
+
"right": "// icon 必须是 base64 字符串,ReactNode 图标需预先转 base64\ndata={[{ key: 'app1', name: '应用1', icon: 'data:image/png;base64,...' }]}"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"issue": "onSort/onClick 的参数 data 是完整数组,不是单个 item,类型声明也是 Array<DesktopDataItem>",
|
|
158
|
+
"wrong": "onClick={(item) => openApp(item.key)} // item 实际是数组,item.key 是 undefined",
|
|
159
|
+
"right": "// Desktop 不支持识别单项点击,只能用事件代理:\n<div onClick={(e) => { const id = (e.target as HTMLElement).closest('[data-id]')?.getAttribute('data-id'); }}>\n <Desktop ... />\n</div>"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"issue": "sort prop 的 mapProps[] 接口未 export,不能手动构造 sort 字面量",
|
|
163
|
+
"wrong": "sort={{ 'group-1': [{ type: 'app', key: 'a', index: 0 }] }} // mapProps 接口未公开,字段会变",
|
|
164
|
+
"right": "sort={{}} // 传空对象,Desktop 自动按 data 顺序推导"
|
|
165
|
+
}
|
|
166
|
+
],
|
|
167
|
+
"mapping": {
|
|
168
|
+
"realComponent": "Desktop",
|
|
169
|
+
"adapter": null
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "DragVerify",
|
|
3
|
+
"category": "Data Entry",
|
|
4
|
+
"description": "拖拽验证,用于人机验证",
|
|
5
|
+
"semantic": {
|
|
6
|
+
"intent": [
|
|
7
|
+
"人机验证",
|
|
8
|
+
"安全校验"
|
|
9
|
+
],
|
|
10
|
+
"useCases": [
|
|
11
|
+
"登录验证",
|
|
12
|
+
"表单提交",
|
|
13
|
+
"敏感操作"
|
|
14
|
+
],
|
|
15
|
+
"riskLevel": "high"
|
|
16
|
+
},
|
|
17
|
+
"variants": {
|
|
18
|
+
"default": {
|
|
19
|
+
"meaning": "默认样式"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"states": [
|
|
23
|
+
"default",
|
|
24
|
+
"success",
|
|
25
|
+
"error"
|
|
26
|
+
],
|
|
27
|
+
"idealProps": {
|
|
28
|
+
"getImgInfo": {
|
|
29
|
+
"type": "function",
|
|
30
|
+
"signature": "() => Promise<DragVerifyImgProps> | DragVerifyImgProps",
|
|
31
|
+
"required": true,
|
|
32
|
+
"description": "获取图片接口;返回 DragVerifyImgProps 接口(src/DragVerify/index.tsx:18 已 export),字段:sourceImage(string? 背景图 URL)、newImage(string? 滑块拼图 URL)、y(number? Y 轴目标位置 px,src 内部用 `imgInfo.y!/imgScale` 定位,**不传会 NaN**)、可挂任意扩展字段(`[k]: string|number|undefined`)。⚠️ 业务侧常错猜字段名 bgUrl/sliderUrl/xPos — 实际是 sourceImage/newImage/y。组件在挂载与 refresh 变化时调用此接口"
|
|
33
|
+
},
|
|
34
|
+
"verify": {
|
|
35
|
+
"type": "function",
|
|
36
|
+
"signature": "(xPos: number, imgInfo: DragVerifyImgProps) => Promise<boolean> | boolean",
|
|
37
|
+
"required": true,
|
|
38
|
+
"description": "提交校验接口;xPos = 用户滑动落点的 x 坐标(已按图片真实尺寸缩放回原图坐标);⚠️ 返回 **true = 通过 / false = 不通过**(src/DragVerify/index.tsx:42-46 注释实证)。组件根据返回值切换 success/error class。**目前无 onSuccess/onError 回调 prop**,父组件感知验证结果的唯一办法是在 verify 内部包装一层拦截返回值(见 codeString.ts verifyWithCallback 示例);后续可能升级,见 discussions/DragVerify-onSuccess-onError-callback-epic.md"
|
|
39
|
+
},
|
|
40
|
+
"refresh": {
|
|
41
|
+
"type": "string | number",
|
|
42
|
+
"description": "刷新触发器;⚠️ 实际类型 string|number(组件 src/DragVerify/index.tsx:39 实证,旧 api.ts 写 any 不准);组件 useEffect 监听该值,值变化即重新调用 getImgInfo 并复位 state。典型用法:外层 useState<number> 自增"
|
|
43
|
+
},
|
|
44
|
+
"width": {
|
|
45
|
+
"type": "number | string",
|
|
46
|
+
"description": "图片框宽度;number 视为 px(如 300 → 300px),string 直接透传(支持 '100%' / '80vw' 等响应式单位,src handStyle 实证);未传则 CSS 默认"
|
|
47
|
+
},
|
|
48
|
+
"height": {
|
|
49
|
+
"type": "number | string",
|
|
50
|
+
"description": "图片框高度;number 视为 px,string 直接透传;未传则 CSS 默认"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"do": [
|
|
54
|
+
"在需要防止机器人的场景使用(登录/注册/敏感操作)",
|
|
55
|
+
"提供刷新和重试机制:父组件维护 useState<number> 计数器,每次刷新时 setRefresh(n+1) 触发组件重新获取图片",
|
|
56
|
+
"通过 verify 包装层感知验证结果(组件无 onSuccess/onError 回调,在 verify 内拦截返回值):verify={async (x, info) => { const ok = await api.check(x, info); if (ok) toast('验证通过'); return ok; }}",
|
|
57
|
+
"若 API 返回字段名不是 sourceImage/newImage/y:在 getImgInfo 内部做字段映射后返回标准 DragVerifyImgProps"
|
|
58
|
+
],
|
|
59
|
+
"dont": [
|
|
60
|
+
"在低风险操作中使用(增加用户摩擦,适用登录/支付/批量操作等场景)",
|
|
61
|
+
"猜测 DragVerifyImgProps 字段名为 bgUrl/sliderUrl/xPos——实际是 sourceImage/newImage/y(见 src/DragVerify/index.tsx:18 interface 实证)",
|
|
62
|
+
"在 verify 内总是 return true——绕过验证,失去安全意义"
|
|
63
|
+
],
|
|
64
|
+
"events": {
|
|
65
|
+
"getImgInfo": {
|
|
66
|
+
"signature": "() => Promise<DragVerifyImgProps> | DragVerifyImgProps",
|
|
67
|
+
"asyncSupported": true,
|
|
68
|
+
"examples": [
|
|
69
|
+
"异步获取:getImgInfo={async () => { const res = await api.getCaptcha(); return { sourceImage: res.bg, newImage: res.slider, y: res.yPos }; }}",
|
|
70
|
+
"组件在挂载时和 refresh prop 变化时自动调用此函数",
|
|
71
|
+
"返回值字段:sourceImage(背景图 URL)、newImage(滑块图 URL)、y(滑块 Y 轴位置 px)"
|
|
72
|
+
],
|
|
73
|
+
"commonMistakes": [
|
|
74
|
+
"直接返回 API 响应对象未映射字段名——API 字段 bgUrl/sliderImg/yOffset 需映射为 sourceImage/newImage/y",
|
|
75
|
+
"y 字段不传导致 NaN——src 内部用 imgInfo.y!/imgScale 定位,缺失 y 会 NaN,滑块位置异常",
|
|
76
|
+
"期望 getImgInfo 在用户刷新时自动调用——刷新需要父组件修改 refresh prop 值"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"verify": {
|
|
80
|
+
"signature": "(xPos: number, imgInfo: DragVerifyImgProps) => Promise<boolean> | boolean",
|
|
81
|
+
"asyncSupported": true,
|
|
82
|
+
"examples": [
|
|
83
|
+
"API 校验:verify={async (x, info) => { const ok = await api.verify({ x, ...info }); return ok; }}",
|
|
84
|
+
"返回 true=通过(组件显示成功状态),返回 false=失败(组件显示错误状态并自动重置)",
|
|
85
|
+
"在 verify 内包装 onSuccess 回调:verify={async (x, info) => { const ok = await check(x); if (ok) onSuccess(); return ok; }}"
|
|
86
|
+
],
|
|
87
|
+
"commonMistakes": [
|
|
88
|
+
"期望通过 verify 回调外的 onSuccess prop 感知成功——组件无 onSuccess/onError prop,需在 verify 内包装",
|
|
89
|
+
"返回非 boolean 类型(如 '1'/'0' 字符串)——truthiness 判断可能意外通过,必须返回 boolean"
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"typescriptPitfalls": [
|
|
94
|
+
{
|
|
95
|
+
"issue": "DragVerifyImgProps 字段名是 sourceImage/newImage/y,不是 bgUrl/sliderUrl/xPos",
|
|
96
|
+
"wrong": "getImgInfo={async () => ({ bgUrl: res.bg, sliderUrl: res.slider, yPos: res.y })} // 字段名不匹配,图片不显示",
|
|
97
|
+
"right": "getImgInfo={async () => ({ sourceImage: res.bg, newImage: res.slider, y: res.y })} // 正确字段名"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"issue": "getImgInfo 和 verify 是必填 prop(无问号),不传会 TS 报错",
|
|
101
|
+
"wrong": "<DragVerify /> // 缺少必填 getImgInfo 和 verify",
|
|
102
|
+
"right": "<DragVerify getImgInfo={fetchCaptcha} verify={verifyCaptcha} />"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"issue": "refresh prop 的实际类型是 string|number,不是 any",
|
|
106
|
+
"wrong": "const [refresh, setRefresh] = useState<boolean>(false); // boolean 类型赋给 string|number 会 TS 报错",
|
|
107
|
+
"right": "const [refresh, setRefresh] = useState<number>(0);\n// 刷新时:setRefresh(prev => prev + 1)"
|
|
108
|
+
}
|
|
109
|
+
],
|
|
110
|
+
"mapping": {
|
|
111
|
+
"realComponent": "DragVerify",
|
|
112
|
+
"adapter": null
|
|
113
|
+
}
|
|
114
|
+
}
|
package/es/DragVerify/index.js
CHANGED
|
@@ -11,9 +11,9 @@ import Z from "./lang/index.js";
|
|
|
11
11
|
import { Loading as _ } from "../Loading/index.js";
|
|
12
12
|
import './index.css';/* empty css */
|
|
13
13
|
const fe = (L) => {
|
|
14
|
-
const { className: D, style: R, refresh: q, getImgInfo: x, verify: w, width:
|
|
14
|
+
const { className: D, style: R, refresh: q, getImgInfo: x, verify: w, width: a, height: u } = L, v = Y("DragVerify", Z), [C, E] = N(), [M, S] = N(!1), c = k(null), t = k({ getImgInfo: x, verify: w }), l = `${U}-drag-verify`;
|
|
15
15
|
t.current.getImgInfo = x, t.current.verify = w, J(() => (b(), I(), () => {
|
|
16
|
-
clearTimeout(t.current.timerError), clearTimeout(t.current.timerSuccess);
|
|
16
|
+
clearTimeout(t.current.timerError ?? void 0), clearTimeout(t.current.timerSuccess ?? void 0);
|
|
17
17
|
}), [q, C]);
|
|
18
18
|
const I = async () => {
|
|
19
19
|
t.current.padding = !0, S(!0);
|
|
@@ -31,28 +31,28 @@ const fe = (L) => {
|
|
|
31
31
|
const s = c.current.querySelector(".slider-img"), i = c.current.querySelector(".refresh");
|
|
32
32
|
!s || !i || (i.style.display = "none", s.innerHTML = "", s.append(e), e.onload = () => {
|
|
33
33
|
e.style.display = "inline-block", r.setAttribute("src", t.current.imgInfo?.newImage);
|
|
34
|
-
const
|
|
34
|
+
const p = e.width;
|
|
35
35
|
if (e.className = "slider-img-bg", e.style.display = "inline-block", !c.current) return;
|
|
36
36
|
const f = c.current.querySelector(".slider-img"), g = f?.clientWidth;
|
|
37
|
-
t.current.imgScale =
|
|
37
|
+
t.current.imgScale = p / g, f?.append(r), r.onload = () => {
|
|
38
38
|
t.current.padding = !1, r.style.display = "inline-block", i.style.display = "inline-block", r.width = r.width / t.current.imgScale, r.style.top = `${t.current.imgInfo?.y / t.current.imgScale}px`, S(!1);
|
|
39
39
|
};
|
|
40
40
|
}, W(e, r));
|
|
41
41
|
}, W = (e, r) => {
|
|
42
42
|
const s = c.current;
|
|
43
43
|
if (!s) return;
|
|
44
|
-
const i = s.querySelector(".slider-move-box"),
|
|
45
|
-
let o = m.pageX -
|
|
46
|
-
o < 0 && (o = 0), o + h > e.width && (o = e.width - h), i.style.left = `${o - 1}px`,
|
|
44
|
+
const i = s.querySelector(".slider-move-box"), p = s.querySelector(".slider-move-mask"), f = s.querySelector(".slider-move"), g = s.querySelector(".slider-move-text"), B = f.getBoundingClientRect(), h = i.getBoundingClientRect().width, P = B.width, j = (m, d) => {
|
|
45
|
+
let o = m.pageX - d.pageX;
|
|
46
|
+
o < 0 && (o = 0), o + h > e.width && (o = e.width - h), i.style.left = `${o - 1}px`, p.style.width = `${o < 2 ? 2 : o}px`;
|
|
47
47
|
const y = o / (P - h), V = (e.width - r.width) * y;
|
|
48
48
|
r.style.left = `${V}px`, g.innerHTML = "";
|
|
49
49
|
}, $ = () => {
|
|
50
50
|
s.classList.remove(`${l}-move`), t.current.padding = !0;
|
|
51
|
-
const
|
|
52
|
-
T(
|
|
51
|
+
const d = parseFloat(r.style.left) * t.current.imgScale;
|
|
52
|
+
T(d, (o) => {
|
|
53
53
|
if (!o) {
|
|
54
54
|
s.classList.add(`${l}-error`), t.current.timerError = setTimeout(() => {
|
|
55
|
-
t.current.padding = !1, b(), g.innerHTML =
|
|
55
|
+
t.current.padding = !1, b(), g.innerHTML = v({ id: "tryAgain" }), I();
|
|
56
56
|
}, 1e3);
|
|
57
57
|
return;
|
|
58
58
|
}
|
|
@@ -60,18 +60,18 @@ const fe = (L) => {
|
|
|
60
60
|
});
|
|
61
61
|
};
|
|
62
62
|
i.onmousedown = (m) => {
|
|
63
|
-
t.current.padding || (s.classList.add(`${l}-move`), document.onmousemove = (
|
|
64
|
-
j(
|
|
63
|
+
t.current.padding || (s.classList.add(`${l}-move`), document.onmousemove = (d) => {
|
|
64
|
+
j(d, m);
|
|
65
65
|
}, document.onmouseup = () => {
|
|
66
66
|
document.onmousemove = null, document.onmouseup = null, $();
|
|
67
67
|
});
|
|
68
68
|
}, i.ontouchstart = (m) => {
|
|
69
69
|
if (m.preventDefault(), t.current.padding) return !1;
|
|
70
|
-
const
|
|
70
|
+
const d = m.touches[0];
|
|
71
71
|
return s.classList.add(`${l}-move`), document.ontouchmove = (o) => {
|
|
72
72
|
o.preventDefault();
|
|
73
73
|
const y = o.touches[0];
|
|
74
|
-
return j(y,
|
|
74
|
+
return j(y, d), !1;
|
|
75
75
|
}, document.ontouchend = () => {
|
|
76
76
|
document.ontouchmove = null, document.ontouchend = null, $();
|
|
77
77
|
}, !1;
|
|
@@ -81,14 +81,14 @@ const fe = (L) => {
|
|
|
81
81
|
if (!e) return;
|
|
82
82
|
e.classList.remove(`${l}-success`), e.classList.remove(`${l}-error`);
|
|
83
83
|
const r = e.querySelector(".slider-move-box"), s = e.querySelector(".slider-move-mask"), i = e.querySelector(".slider-move-text");
|
|
84
|
-
i.innerHTML =
|
|
84
|
+
i.innerHTML = v({ id: "swipe" }), r.style.left = "-1px", s.style.width = "0px", t.current.imgMove && (t.current.imgMove.style.left = "0px");
|
|
85
85
|
}, X = () => {
|
|
86
86
|
E(Math.random());
|
|
87
87
|
}, F = () => {
|
|
88
88
|
const e = {};
|
|
89
|
-
if (
|
|
90
|
-
let r =
|
|
91
|
-
typeof
|
|
89
|
+
if (a) {
|
|
90
|
+
let r = a;
|
|
91
|
+
typeof a == "number" && (r = `${a}px`), e.width = r;
|
|
92
92
|
}
|
|
93
93
|
if (u) {
|
|
94
94
|
let r = u;
|
|
@@ -131,7 +131,7 @@ const fe = (L) => {
|
|
|
131
131
|
]
|
|
132
132
|
}
|
|
133
133
|
) }),
|
|
134
|
-
/* @__PURE__ */ n.jsx("span", { className: "slider-move-text", children:
|
|
134
|
+
/* @__PURE__ */ n.jsx("span", { className: "slider-move-text", children: v({ id: "swipe" }) })
|
|
135
135
|
] }),
|
|
136
136
|
M && /* @__PURE__ */ n.jsx(_, {})
|
|
137
137
|
]
|