@para-ui/core 5.0.0-beta.9 → 5.0.0

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.
Files changed (730) hide show
  1. package/AGENTS.md +315 -0
  2. package/AlignBox/component.json +89 -0
  3. package/Anchor/component.json +130 -0
  4. package/Argv/component.json +216 -0
  5. package/AutoBox/component.json +133 -0
  6. package/AutoButton/component.json +109 -0
  7. package/AutoTips/component.json +121 -0
  8. package/Badge/component.json +92 -0
  9. package/Breadcrumbs/component.json +142 -0
  10. package/Button/component.json +168 -0
  11. package/ButtonGroup/component.json +132 -0
  12. package/Card/component.json +162 -0
  13. package/Carousel/component.json +142 -0
  14. package/Cascader/component.json +196 -0
  15. package/Checkbox/component.json +138 -0
  16. package/CheckboxGroup/component.json +152 -0
  17. package/CodeEditor/component.json +189 -0
  18. package/Collapse/component.json +166 -0
  19. package/CollapseBox/component.json +84 -0
  20. package/CollapseLayout/component.json +155 -0
  21. package/ColorPicker/component.json +142 -0
  22. package/ComboSelect/component.json +181 -0
  23. package/Container/component.json +111 -0
  24. package/ContentBox/component.json +81 -0
  25. package/CopyText/component.json +118 -0
  26. package/CycleSelector/component.json +98 -0
  27. package/DatePicker/component.json +192 -0
  28. package/Descriptions/component.json +142 -0
  29. package/Desktop/component.json +171 -0
  30. package/DragVerify/component.json +114 -0
  31. package/Drawer/component.json +200 -0
  32. package/Dropdown/component.json +147 -0
  33. package/DynamicMultiBox/component.json +278 -0
  34. package/Empty/component.json +123 -0
  35. package/ExpressionInput/component.json +79 -0
  36. package/FieldForm/component.json +196 -0
  37. package/Form/component.json +161 -0
  38. package/FormItem/component.json +171 -0
  39. package/FunctionModal/component.json +197 -0
  40. package/Help/component.json +118 -0
  41. package/HelperText/component.json +126 -0
  42. package/Image/component.json +165 -0
  43. package/InputCode/component.json +191 -0
  44. package/InputLang/component.json +205 -0
  45. package/InputNumber/component.json +162 -0
  46. package/Label/component.json +126 -0
  47. package/Loading/component.json +91 -0
  48. package/Menu/component.json +180 -0
  49. package/Message/component.json +246 -0
  50. package/Modal/component.json +277 -0
  51. package/MultiBox/component.json +216 -0
  52. package/Notification/component.json +184 -0
  53. package/OperateBtn/component.json +134 -0
  54. package/PageHeader/component.json +112 -0
  55. package/Pagination/component.json +181 -0
  56. package/PasswordRules/component.json +105 -0
  57. package/PopConfirm/component.json +227 -0
  58. package/PopMenu/component.json +131 -0
  59. package/Popover/component.json +165 -0
  60. package/Progress/component.json +161 -0
  61. package/Prompt/component.json +144 -0
  62. package/Querying/component.json +96 -0
  63. package/QuickReply/component.json +129 -0
  64. package/Radio/component.json +136 -0
  65. package/RadioGroup/component.json +149 -0
  66. package/RangeInput/component.json +198 -0
  67. package/Result/component.json +104 -0
  68. package/ScrollBar/component.json +115 -0
  69. package/Search/component.json +177 -0
  70. package/Select/component.json +244 -0
  71. package/SelectInput/component.json +184 -0
  72. package/Selector/component.json +203 -0
  73. package/SelectorPicker/component.json +179 -0
  74. package/SingleBox/component.json +151 -0
  75. package/Slider/component.json +181 -0
  76. package/SortBox/component.json +108 -0
  77. package/Status/component.json +104 -0
  78. package/Stepper/component.json +129 -0
  79. package/Switch/component.json +207 -0
  80. package/Table/component.json +547 -0
  81. package/Tabs/component.json +227 -0
  82. package/Tag/component.json +221 -0
  83. package/TextEditor/component.json +186 -0
  84. package/TextField/component.json +290 -0
  85. package/TimePicker/component.json +176 -0
  86. package/Timeline/component.json +110 -0
  87. package/Title/component.json +156 -0
  88. package/ToggleButton/component.json +153 -0
  89. package/Tooltip/component.json +176 -0
  90. package/Transfer/component.json +157 -0
  91. package/Tree/component.json +512 -0
  92. package/Upload/component.json +450 -0
  93. package/ai-workflows/01-crud-list-multi-drawer.md +278 -0
  94. package/ai-workflows/02-rbac-operation-buttons.md +290 -0
  95. package/ai-workflows/03-complex-form-async-cascade.md +350 -0
  96. package/ai-workflows/04-array-field-form.md +281 -0
  97. package/ai-workflows/05-popconfirm-async-message-queue.md +333 -0
  98. package/ai-workflows/06-modal-drawer-form-workflow.md +385 -0
  99. package/ai-workflows/07-search-filter-table-trio.md +387 -0
  100. package/ai-workflows/08-table-advanced-features.md +365 -0
  101. package/ai-workflows/09-batch-operation-export-progress.md +367 -0
  102. package/ai-workflows/10-cross-component-state-coordination.md +412 -0
  103. package/es/AlignBox/component.json +89 -0
  104. package/es/AlignBox/index.css +1 -1
  105. package/es/AlignBox/index.d.ts +6 -2
  106. package/es/AlignBox/index.js +1 -1
  107. package/es/AlignBox/style/index.css +1 -1
  108. package/es/Anchor/anchorMenu/index.d.ts +2 -1
  109. package/es/Anchor/anchorMenu/index.js +36 -33
  110. package/es/Anchor/component.json +130 -0
  111. package/es/Anchor/index.js +52 -49
  112. package/es/Anchor/type.d.ts +8 -4
  113. package/es/Argv/batchEdit/index.js +1 -1
  114. package/es/Argv/component.json +216 -0
  115. package/es/Argv/dataGenerator/index.js +1 -1
  116. package/es/Argv/index.d.ts +5 -6
  117. package/es/Argv/index.js +1 -1
  118. package/es/AutoBox/component.json +133 -0
  119. package/es/AutoBox/index.d.ts +3 -3
  120. package/es/AutoBox/index.js +1 -1
  121. package/es/AutoBox/protal.d.ts +2 -2
  122. package/es/AutoBox/protal.js +33 -30
  123. package/es/AutoButton/component.json +109 -0
  124. package/es/AutoButton/index.js +1 -1
  125. package/es/AutoTips/autoTipsMultiline/index.d.ts +1 -1
  126. package/es/AutoTips/autoTipsMultiline/index.js +1 -1
  127. package/es/AutoTips/component.json +121 -0
  128. package/es/AutoTips/index.js +1 -1
  129. package/es/Badge/component.json +92 -0
  130. package/es/Breadcrumbs/component.json +142 -0
  131. package/es/Breadcrumbs/index.js +1 -1
  132. package/es/Button/SplitButton.d.ts +2 -2
  133. package/es/Button/component.json +168 -0
  134. package/es/Button/index.js +44 -44
  135. package/es/ButtonGroup/component.json +132 -0
  136. package/es/ButtonGroup/index.d.ts +1 -1
  137. package/es/Card/component.json +162 -0
  138. package/es/Card/index.d.ts +2 -2
  139. package/es/Card/index.js +2 -2
  140. package/es/Carousel/component.json +142 -0
  141. package/es/Carousel/index.d.ts +1 -1
  142. package/es/Cascader/Cascader.js +1 -1
  143. package/es/Cascader/OptionList/Column.js +1 -1
  144. package/es/Cascader/OptionList/index.js +1 -1
  145. package/es/Cascader/component.json +196 -0
  146. package/es/Cascader/hooks/useEntities.js +7 -7
  147. package/es/Cascader/interface.d.ts +1 -0
  148. package/es/Cascader/utils/commonUtil.d.ts +1 -1
  149. package/es/Cascader/utils/commonUtil.js +16 -16
  150. package/es/Cascader/utils/treeUtil.d.ts +14 -5
  151. package/es/Cascader/utils/treeUtil.js +1 -1
  152. package/es/Checkbox/component.json +138 -0
  153. package/es/CheckboxGroup/component.json +152 -0
  154. package/es/CheckboxGroup/index.js +1 -1
  155. package/es/CodeEditor/component.json +189 -0
  156. package/es/CodeEditor/index.d.ts +11 -10
  157. package/es/CodeEditor/index.js +25 -25
  158. package/es/Collapse/component.json +166 -0
  159. package/es/Collapse/index.d.ts +1 -1
  160. package/es/Collapse/index.js +23 -22
  161. package/es/CollapseBox/component.json +84 -0
  162. package/es/CollapseLayout/component.json +155 -0
  163. package/es/ColorPicker/component.json +142 -0
  164. package/es/ComboSelect/component.json +181 -0
  165. package/es/ComboSelect/index.js +115 -109
  166. package/es/ComboSelect/interface.d.ts +2 -2
  167. package/es/ComboSelect/utils.d.ts +3 -3
  168. package/es/ComboSelect/utils.js +1 -1
  169. package/es/Container/component.json +111 -0
  170. package/es/ContentBox/component.json +81 -0
  171. package/es/CopyText/component.json +118 -0
  172. package/es/CycleSelector/component.json +98 -0
  173. package/es/CycleSelector/index.js +14 -13
  174. package/es/DatePicker/component.json +192 -0
  175. package/es/DatePicker/generatePicker/generateRangePicker.js +11 -11
  176. package/es/DatePicker/generatePicker/generateSinglePicker.js +2 -2
  177. package/es/Descriptions/component.json +142 -0
  178. package/es/Descriptions/index.d.ts +1 -1
  179. package/es/Desktop/component.json +171 -0
  180. package/es/Desktop/index.js +1 -1
  181. package/es/DragVerify/component.json +114 -0
  182. package/es/DragVerify/index.js +19 -19
  183. package/es/Drawer/component.json +200 -0
  184. package/es/Drawer/index.js +86 -86
  185. package/es/Drawer/interface.d.ts +1 -1
  186. package/es/Drawer/util.d.ts +1 -6
  187. package/es/Drawer/util.js +9 -6
  188. package/es/Dropdown/component.json +147 -0
  189. package/es/Dropdown/index.js +1 -1
  190. package/es/DynamicMultiBox/component.json +278 -0
  191. package/es/DynamicMultiBox/formItem.d.ts +1 -1
  192. package/es/DynamicMultiBox/index.js +1 -1
  193. package/es/DynamicMultiBox/rowForm.d.ts +2 -2
  194. package/es/Empty/component.json +123 -0
  195. package/es/Empty/index.css +1 -1
  196. package/es/Empty/index.d.ts +2 -2
  197. package/es/Empty/index.js +27 -26
  198. package/es/Empty/style/index.css +1 -1
  199. package/es/ExpressionInput/HighlightOverlay.d.ts +8 -0
  200. package/es/ExpressionInput/HighlightOverlay.js +27 -0
  201. package/es/ExpressionInput/Popup.d.ts +19 -0
  202. package/es/ExpressionInput/Popup.js +93 -0
  203. package/es/ExpressionInput/component.json +79 -0
  204. package/es/ExpressionInput/detectChainAtCursor.d.ts +17 -0
  205. package/es/ExpressionInput/detectChainAtCursor.js +31 -0
  206. package/es/ExpressionInput/filterCandidatesByPartial.d.ts +2 -0
  207. package/es/ExpressionInput/filterCandidatesByPartial.js +15 -0
  208. package/es/ExpressionInput/highlightSegments.d.ts +9 -0
  209. package/es/ExpressionInput/highlightSegments.js +14 -0
  210. package/es/ExpressionInput/index.css +1 -0
  211. package/es/ExpressionInput/index.d.ts +5 -0
  212. package/es/ExpressionInput/index.js +178 -0
  213. package/es/ExpressionInput/interface.d.ts +52 -0
  214. package/es/ExpressionInput/isExpressionValue.d.ts +5 -0
  215. package/es/ExpressionInput/isExpressionValue.js +18 -0
  216. package/es/ExpressionInput/lang/en_US.d.ts +4 -0
  217. package/es/ExpressionInput/lang/en_US.js +7 -0
  218. package/es/ExpressionInput/lang/index.d.ts +9 -0
  219. package/es/ExpressionInput/lang/index.js +10 -0
  220. package/es/ExpressionInput/lang/zh_CN.d.ts +4 -0
  221. package/es/ExpressionInput/lang/zh_CN.js +7 -0
  222. package/es/ExpressionInput/style/css.js +1 -0
  223. package/es/ExpressionInput/style/index.css +1 -0
  224. package/es/ExpressionInput/style/index.js +1 -0
  225. package/es/ExpressionInput/useExpressionInput.d.ts +26 -0
  226. package/es/ExpressionInput/useExpressionInput.js +59 -0
  227. package/es/FieldForm/FieldFormItem/ItemHolder.js +1 -1
  228. package/es/FieldForm/FieldFormItem/MemoInput.d.ts +2 -2
  229. package/es/FieldForm/FieldFormItem/StatusProvider.js +1 -1
  230. package/es/FieldForm/FieldFormItem/index.d.ts +6 -6
  231. package/es/FieldForm/Form.d.ts +2 -2
  232. package/es/FieldForm/Form.js +1 -1
  233. package/es/FieldForm/FormItemInput.js +1 -1
  234. package/es/FieldForm/FormItemLabel.js +1 -1
  235. package/es/FieldForm/FormList.d.ts +2 -2
  236. package/es/FieldForm/component.json +196 -0
  237. package/es/FieldForm/context.d.ts +5 -1
  238. package/es/FieldForm/context.js +2 -2
  239. package/es/FieldForm/hooks/useForm.d.ts +4 -3
  240. package/es/FieldForm/hooks/useFormInstance.d.ts +1 -1
  241. package/es/FieldForm/hooks/useFormItemStatus.d.ts +9 -5
  242. package/es/FieldForm/hooks/useFormItemStatus.js +2 -2
  243. package/es/FieldForm/hooks/useItemRef.d.ts +1 -1
  244. package/es/FieldForm/hooks/useItemRef.js +6 -6
  245. package/es/Form/component.json +161 -0
  246. package/es/Form/index.d.ts +52 -49
  247. package/es/Form/index.js +1 -1
  248. package/es/FormItem/compoments/defaultCompoments/index.d.ts +5 -5
  249. package/es/FormItem/compoments/defaultCompoments/index.js +12 -11
  250. package/es/FormItem/compoments/formCheckboxGroup/index.d.ts +2 -2
  251. package/es/FormItem/compoments/formFile/index.js +8 -8
  252. package/es/FormItem/compoments/formRadioGroup/index.d.ts +1 -1
  253. package/es/FormItem/compoments/formSelect/index.d.ts +1 -1
  254. package/es/FormItem/component.json +171 -0
  255. package/es/FormItem/index.d.ts +5 -5
  256. package/es/FormItem/index.js +23 -23
  257. package/es/FormItem/itemType.js +1 -1
  258. package/es/FunctionModal/component.json +197 -0
  259. package/es/FunctionModal/dialog.d.ts +1 -1
  260. package/es/FunctionModal/modalContext.d.ts +4 -1
  261. package/es/GlobalContext/confirmLocale.js +1 -1
  262. package/es/GlobalContext/index.js +1 -1
  263. package/es/Help/component.json +118 -0
  264. package/es/HelperText/component.json +126 -0
  265. package/es/Image/PreviewGroup.js +1 -1
  266. package/es/Image/component.json +165 -0
  267. package/es/Image/index.js +1 -1
  268. package/es/InputCode/component.json +191 -0
  269. package/es/InputCode/index.d.ts +2 -2
  270. package/es/InputCode/index.js +1 -1
  271. package/es/InputLang/component.json +205 -0
  272. package/es/InputLang/index.js +2 -2
  273. package/es/InputNumber/component.json +162 -0
  274. package/es/InputNumber/index.d.ts +13 -7
  275. package/es/InputNumber/index.js +152 -144
  276. package/es/Label/component.json +126 -0
  277. package/es/Label/index.d.ts +2 -2
  278. package/es/Loading/component.json +91 -0
  279. package/es/Menu/component.json +180 -0
  280. package/es/Menu/verticalMenuList.js +1 -1
  281. package/es/Message/component.json +246 -0
  282. package/es/Message/index.d.ts +2 -2
  283. package/es/Message/index.js +19 -19
  284. package/es/Modal/Confirm/index.d.ts +1 -1
  285. package/es/Modal/Confirm/index.js +1 -1
  286. package/es/Modal/component.json +277 -0
  287. package/es/Modal/index.d.ts +85 -5
  288. package/es/Modal/index.js +159 -122
  289. package/es/Modal/interface.d.ts +1 -0
  290. package/es/MultiBox/component.json +216 -0
  291. package/es/MultiBox/index.js +19 -14
  292. package/es/Notification/component.json +184 -0
  293. package/es/OperateBtn/component.json +134 -0
  294. package/es/OperateBtn/index.d.ts +3 -3
  295. package/es/PageHeader/component.json +112 -0
  296. package/es/PageHeader/horizontalMeun.js +1 -1
  297. package/es/PageHeader/horizontalMeunRight.js +1 -1
  298. package/es/Pagination/component.json +181 -0
  299. package/es/Pagination/index.js +15 -15
  300. package/es/ParauiProvider/index.js +1 -1
  301. package/es/PasswordRules/component.json +105 -0
  302. package/es/PasswordRules/index.d.ts +4 -4
  303. package/es/PopConfirm/component.json +227 -0
  304. package/es/PopConfirm/index.d.ts +1 -1
  305. package/es/PopConfirm/index.js +1 -1
  306. package/es/PopMenu/component.json +131 -0
  307. package/es/PopMenu/hooks.d.ts +1 -1
  308. package/es/PopMenu/index.js +8 -8
  309. package/es/Popover/component.json +165 -0
  310. package/es/Popover/index.js +1 -1
  311. package/es/Progress/component.json +161 -0
  312. package/es/Prompt/component.json +144 -0
  313. package/es/Querying/component.json +96 -0
  314. package/es/Querying/index.css +1 -1
  315. package/es/Querying/index.d.ts +2 -2
  316. package/es/Querying/index.js +20 -19
  317. package/es/Querying/style/index.css +1 -1
  318. package/es/QuickReply/QuickReplyCode/index.js +1 -1
  319. package/es/QuickReply/component.json +129 -0
  320. package/es/QuickReply/index.d.ts +1 -1
  321. package/es/Radio/component.json +136 -0
  322. package/es/RadioGroup/component.json +149 -0
  323. package/es/RangeInput/component.json +198 -0
  324. package/es/RangeInput/index.d.ts +15 -7
  325. package/es/RangeInput/index.js +120 -103
  326. package/es/Result/component.json +104 -0
  327. package/es/ScrollBar/component.json +115 -0
  328. package/es/Search/component.json +177 -0
  329. package/es/Search/index.d.ts +1 -1
  330. package/es/Select/component.json +244 -0
  331. package/es/Select/index.d.ts +11 -8
  332. package/es/Select/index.js +441 -438
  333. package/es/SelectInput/component.json +184 -0
  334. package/es/SelectInput/index.d.ts +4 -4
  335. package/es/SelectInput/index.js +8 -8
  336. package/es/Selector/component.json +203 -0
  337. package/es/Selector/index.js +56 -50
  338. package/es/Selector/interface.d.ts +2 -2
  339. package/es/Selector/selectorData/index.js +1 -1
  340. package/es/Selector/selectorMain/index.js +3 -3
  341. package/es/Selector/selectorNode/index.js +1 -1
  342. package/es/Selector/util.d.ts +3 -3
  343. package/es/Selector/util.js +6 -12
  344. package/es/SelectorPicker/component.json +179 -0
  345. package/es/SelectorPicker/index.d.ts +5 -5
  346. package/es/SelectorPicker/index.js +15 -15
  347. package/es/SingleBox/component.json +151 -0
  348. package/es/SingleBox/index.d.ts +2 -2
  349. package/es/Slider/component.json +181 -0
  350. package/es/SortBox/component.json +108 -0
  351. package/es/Status/component.json +104 -0
  352. package/es/Stepper/component.json +129 -0
  353. package/es/Stepper/index.d.ts +2 -2
  354. package/es/Switch/component.json +207 -0
  355. package/es/Switch/index.css +1 -1
  356. package/es/Switch/index.d.ts +3 -2
  357. package/es/Switch/index.js +60 -59
  358. package/es/Switch/style/index.css +1 -1
  359. package/es/Table/component.json +547 -0
  360. package/es/Table/index.d.ts +2 -2
  361. package/es/Table/index.js +385 -382
  362. package/es/Table/interface.d.ts +30 -0
  363. package/es/Table/tableHead.js +1 -1
  364. package/es/Table/util.d.ts +1 -1
  365. package/es/Table/util.js +3 -12
  366. package/es/Tabs/component.json +227 -0
  367. package/es/Tag/component.json +221 -0
  368. package/es/Tag/index.css +1 -1
  369. package/es/Tag/index.d.ts +1 -1
  370. package/es/Tag/index.js +20 -20
  371. package/es/Tag/style/index.css +1 -1
  372. package/es/TextEditor/component.json +186 -0
  373. package/es/TextEditor/index.d.ts +5 -5
  374. package/es/TextEditor/index.js +1 -1
  375. package/es/TextField/component.json +290 -0
  376. package/es/TextField/index.d.ts +2 -2
  377. package/es/TextField/index.js +1 -1
  378. package/es/TimePicker/component.json +176 -0
  379. package/es/Timeline/component.json +110 -0
  380. package/es/Title/component.json +156 -0
  381. package/es/ToggleButton/component.json +153 -0
  382. package/es/ToggleButton/index.js +1 -1
  383. package/es/Tooltip/component.json +176 -0
  384. package/es/Tooltip/index.js +58 -53
  385. package/es/Tooltip/interface.d.ts +14 -1
  386. package/es/Tooltip/utils.js +6 -6
  387. package/es/Transfer/component.json +157 -0
  388. package/es/Tree/OperateBar/index.js +1 -1
  389. package/es/Tree/Tree.js +3 -3
  390. package/es/Tree/component.json +512 -0
  391. package/es/Tree/interface.d.ts +1 -1
  392. package/es/Upload/component.json +450 -0
  393. package/es/Upload/util.js +1 -1
  394. package/es/Utils/snack-kit-shims.d.ts +18 -0
  395. package/es/Utils/snack-kit-shims.js +19 -0
  396. package/es/Utils/type.d.ts +0 -6
  397. package/es/_virtual/index.js +5 -3
  398. package/es/_virtual/index2.js +2 -5
  399. package/es/index.d.ts +4 -0
  400. package/es/index.js +152 -150
  401. package/es/locale/en-US.d.ts +3 -0
  402. package/es/locale/en-US.js +3 -0
  403. package/es/locale/en_US.d.ts +361 -0
  404. package/es/locale/en_US.js +364 -0
  405. package/es/locale/index.d.ts +1 -723
  406. package/es/locale/index2.js +10 -0
  407. package/es/locale/zh-CN.d.ts +3 -0
  408. package/es/locale/zh-CN.js +3 -0
  409. package/es/locale/zh_CN.d.ts +361 -0
  410. package/es/locale/zh_CN.js +364 -0
  411. package/es/node_modules/classnames/index.js +1 -1
  412. package/lib/AlignBox/component.json +89 -0
  413. package/lib/AlignBox/index.css +1 -1
  414. package/lib/AlignBox/index.d.ts +6 -2
  415. package/lib/AlignBox/index.js +1 -1
  416. package/lib/AlignBox/style/index.css +1 -1
  417. package/lib/Anchor/anchorMenu/index.d.ts +2 -1
  418. package/lib/Anchor/anchorMenu/index.js +1 -1
  419. package/lib/Anchor/component.json +130 -0
  420. package/lib/Anchor/index.js +1 -1
  421. package/lib/Anchor/type.d.ts +8 -4
  422. package/lib/Argv/component.json +216 -0
  423. package/lib/Argv/dataGenerator/index.js +1 -1
  424. package/lib/Argv/index.d.ts +5 -6
  425. package/lib/Argv/index.js +1 -1
  426. package/lib/AutoBox/component.json +133 -0
  427. package/lib/AutoBox/index.d.ts +3 -3
  428. package/lib/AutoBox/index.js +1 -1
  429. package/lib/AutoBox/protal.d.ts +2 -2
  430. package/lib/AutoBox/protal.js +1 -1
  431. package/lib/AutoButton/component.json +109 -0
  432. package/lib/AutoButton/index.js +1 -1
  433. package/lib/AutoTips/autoTipsMultiline/index.d.ts +1 -1
  434. package/lib/AutoTips/autoTipsMultiline/index.js +1 -1
  435. package/lib/AutoTips/component.json +121 -0
  436. package/lib/AutoTips/index.js +1 -1
  437. package/lib/Badge/component.json +92 -0
  438. package/lib/Breadcrumbs/component.json +142 -0
  439. package/lib/Breadcrumbs/index.js +1 -1
  440. package/lib/Button/SplitButton.d.ts +2 -2
  441. package/lib/Button/component.json +168 -0
  442. package/lib/Button/index.js +1 -1
  443. package/lib/ButtonGroup/component.json +132 -0
  444. package/lib/ButtonGroup/index.d.ts +1 -1
  445. package/lib/Card/component.json +162 -0
  446. package/lib/Card/index.d.ts +2 -2
  447. package/lib/Card/index.js +1 -1
  448. package/lib/Carousel/component.json +142 -0
  449. package/lib/Carousel/index.d.ts +1 -1
  450. package/lib/Cascader/Cascader.js +1 -1
  451. package/lib/Cascader/OptionList/Column.js +1 -1
  452. package/lib/Cascader/OptionList/index.js +1 -1
  453. package/lib/Cascader/component.json +196 -0
  454. package/lib/Cascader/hooks/useEntities.js +1 -1
  455. package/lib/Cascader/interface.d.ts +1 -0
  456. package/lib/Cascader/utils/commonUtil.d.ts +1 -1
  457. package/lib/Cascader/utils/commonUtil.js +1 -1
  458. package/lib/Cascader/utils/treeUtil.d.ts +14 -5
  459. package/lib/Cascader/utils/treeUtil.js +1 -1
  460. package/lib/Checkbox/component.json +138 -0
  461. package/lib/CheckboxGroup/component.json +152 -0
  462. package/lib/CheckboxGroup/index.js +1 -1
  463. package/lib/CodeEditor/component.json +189 -0
  464. package/lib/CodeEditor/index.d.ts +11 -10
  465. package/lib/CodeEditor/index.js +1 -1
  466. package/lib/Collapse/component.json +166 -0
  467. package/lib/Collapse/index.d.ts +1 -1
  468. package/lib/Collapse/index.js +1 -1
  469. package/lib/CollapseBox/component.json +84 -0
  470. package/lib/CollapseLayout/component.json +155 -0
  471. package/lib/ColorPicker/component.json +142 -0
  472. package/lib/ComboSelect/component.json +181 -0
  473. package/lib/ComboSelect/index.js +1 -1
  474. package/lib/ComboSelect/interface.d.ts +2 -2
  475. package/lib/ComboSelect/utils.d.ts +3 -3
  476. package/lib/ComboSelect/utils.js +1 -1
  477. package/lib/Container/component.json +111 -0
  478. package/lib/ContentBox/component.json +81 -0
  479. package/lib/CopyText/component.json +118 -0
  480. package/lib/CycleSelector/component.json +98 -0
  481. package/lib/CycleSelector/index.js +1 -1
  482. package/lib/DatePicker/component.json +192 -0
  483. package/lib/DatePicker/generatePicker/generateRangePicker.js +1 -1
  484. package/lib/DatePicker/generatePicker/generateSinglePicker.js +1 -1
  485. package/lib/Descriptions/component.json +142 -0
  486. package/lib/Descriptions/index.d.ts +1 -1
  487. package/lib/Desktop/component.json +171 -0
  488. package/lib/Desktop/index.js +1 -1
  489. package/lib/DragVerify/component.json +114 -0
  490. package/lib/DragVerify/index.js +1 -1
  491. package/lib/Drawer/component.json +200 -0
  492. package/lib/Drawer/index.js +1 -1
  493. package/lib/Drawer/interface.d.ts +1 -1
  494. package/lib/Drawer/util.d.ts +1 -6
  495. package/lib/Drawer/util.js +1 -1
  496. package/lib/Dropdown/component.json +147 -0
  497. package/lib/Dropdown/index.js +1 -1
  498. package/lib/DynamicMultiBox/component.json +278 -0
  499. package/lib/DynamicMultiBox/formItem.d.ts +1 -1
  500. package/lib/DynamicMultiBox/index.js +1 -1
  501. package/lib/DynamicMultiBox/rowForm.d.ts +2 -2
  502. package/lib/Empty/component.json +123 -0
  503. package/lib/Empty/index.css +1 -1
  504. package/lib/Empty/index.d.ts +2 -2
  505. package/lib/Empty/index.js +1 -1
  506. package/lib/Empty/style/index.css +1 -1
  507. package/lib/ExpressionInput/HighlightOverlay.d.ts +8 -0
  508. package/lib/ExpressionInput/HighlightOverlay.js +2 -0
  509. package/lib/ExpressionInput/Popup.d.ts +19 -0
  510. package/lib/ExpressionInput/Popup.js +2 -0
  511. package/lib/ExpressionInput/component.json +79 -0
  512. package/lib/ExpressionInput/detectChainAtCursor.d.ts +17 -0
  513. package/lib/ExpressionInput/detectChainAtCursor.js +2 -0
  514. package/lib/ExpressionInput/filterCandidatesByPartial.d.ts +2 -0
  515. package/lib/ExpressionInput/filterCandidatesByPartial.js +2 -0
  516. package/lib/ExpressionInput/highlightSegments.d.ts +9 -0
  517. package/lib/ExpressionInput/highlightSegments.js +2 -0
  518. package/lib/ExpressionInput/index.css +1 -0
  519. package/lib/ExpressionInput/index.d.ts +5 -0
  520. package/lib/ExpressionInput/index.js +2 -0
  521. package/lib/ExpressionInput/interface.d.ts +52 -0
  522. package/lib/ExpressionInput/isExpressionValue.d.ts +5 -0
  523. package/lib/ExpressionInput/isExpressionValue.js +2 -0
  524. package/lib/ExpressionInput/lang/en_US.d.ts +4 -0
  525. package/lib/ExpressionInput/lang/en_US.js +2 -0
  526. package/lib/ExpressionInput/lang/index.d.ts +9 -0
  527. package/lib/ExpressionInput/lang/index.js +2 -0
  528. package/lib/ExpressionInput/lang/zh_CN.d.ts +4 -0
  529. package/lib/ExpressionInput/lang/zh_CN.js +2 -0
  530. package/lib/ExpressionInput/style/css.js +1 -0
  531. package/lib/ExpressionInput/style/index.css +1 -0
  532. package/lib/ExpressionInput/style/index.js +1 -0
  533. package/lib/ExpressionInput/useExpressionInput.d.ts +26 -0
  534. package/lib/ExpressionInput/useExpressionInput.js +2 -0
  535. package/lib/FieldForm/FieldFormItem/ItemHolder.js +1 -1
  536. package/lib/FieldForm/FieldFormItem/MemoInput.d.ts +2 -2
  537. package/lib/FieldForm/FieldFormItem/StatusProvider.js +1 -1
  538. package/lib/FieldForm/FieldFormItem/index.d.ts +6 -6
  539. package/lib/FieldForm/Form.d.ts +2 -2
  540. package/lib/FieldForm/Form.js +1 -1
  541. package/lib/FieldForm/FormItemInput.js +1 -1
  542. package/lib/FieldForm/FormItemLabel.js +1 -1
  543. package/lib/FieldForm/FormList.d.ts +2 -2
  544. package/lib/FieldForm/component.json +196 -0
  545. package/lib/FieldForm/context.d.ts +5 -1
  546. package/lib/FieldForm/context.js +1 -1
  547. package/lib/FieldForm/hooks/useForm.d.ts +4 -3
  548. package/lib/FieldForm/hooks/useFormInstance.d.ts +1 -1
  549. package/lib/FieldForm/hooks/useFormItemStatus.d.ts +9 -5
  550. package/lib/FieldForm/hooks/useFormItemStatus.js +1 -1
  551. package/lib/FieldForm/hooks/useItemRef.d.ts +1 -1
  552. package/lib/FieldForm/hooks/useItemRef.js +1 -1
  553. package/lib/Form/component.json +161 -0
  554. package/lib/Form/index.d.ts +52 -49
  555. package/lib/Form/index.js +1 -1
  556. package/lib/FormItem/compoments/defaultCompoments/index.d.ts +5 -5
  557. package/lib/FormItem/compoments/defaultCompoments/index.js +1 -1
  558. package/lib/FormItem/compoments/formCheckboxGroup/index.d.ts +2 -2
  559. package/lib/FormItem/compoments/formFile/index.js +1 -1
  560. package/lib/FormItem/compoments/formRadioGroup/index.d.ts +1 -1
  561. package/lib/FormItem/compoments/formSelect/index.d.ts +1 -1
  562. package/lib/FormItem/component.json +171 -0
  563. package/lib/FormItem/index.d.ts +5 -5
  564. package/lib/FormItem/index.js +1 -1
  565. package/lib/FormItem/itemType.js +1 -1
  566. package/lib/FunctionModal/component.json +197 -0
  567. package/lib/FunctionModal/dialog.d.ts +1 -1
  568. package/lib/FunctionModal/modalContext.d.ts +4 -1
  569. package/lib/GlobalContext/confirmLocale.js +1 -1
  570. package/lib/GlobalContext/index.js +1 -1
  571. package/lib/Help/component.json +118 -0
  572. package/lib/HelperText/component.json +126 -0
  573. package/lib/Image/PreviewGroup.js +1 -1
  574. package/lib/Image/component.json +165 -0
  575. package/lib/Image/index.js +1 -1
  576. package/lib/InputCode/component.json +191 -0
  577. package/lib/InputCode/index.d.ts +2 -2
  578. package/lib/InputLang/component.json +205 -0
  579. package/lib/InputLang/index.js +1 -1
  580. package/lib/InputNumber/component.json +162 -0
  581. package/lib/InputNumber/index.d.ts +13 -7
  582. package/lib/InputNumber/index.js +1 -1
  583. package/lib/Label/component.json +126 -0
  584. package/lib/Label/index.d.ts +2 -2
  585. package/lib/Loading/component.json +91 -0
  586. package/lib/Menu/component.json +180 -0
  587. package/lib/Menu/verticalMenuList.js +1 -1
  588. package/lib/Message/component.json +246 -0
  589. package/lib/Message/index.d.ts +2 -2
  590. package/lib/Message/index.js +1 -1
  591. package/lib/Modal/Confirm/index.d.ts +1 -1
  592. package/lib/Modal/Confirm/index.js +1 -1
  593. package/lib/Modal/component.json +277 -0
  594. package/lib/Modal/index.d.ts +85 -5
  595. package/lib/Modal/index.js +1 -1
  596. package/lib/Modal/interface.d.ts +1 -0
  597. package/lib/MultiBox/component.json +216 -0
  598. package/lib/MultiBox/index.js +1 -1
  599. package/lib/Notification/component.json +184 -0
  600. package/lib/OperateBtn/component.json +134 -0
  601. package/lib/OperateBtn/index.d.ts +3 -3
  602. package/lib/PageHeader/component.json +112 -0
  603. package/lib/PageHeader/horizontalMeun.js +1 -1
  604. package/lib/PageHeader/horizontalMeunRight.js +1 -1
  605. package/lib/Pagination/component.json +181 -0
  606. package/lib/Pagination/index.js +1 -1
  607. package/lib/ParauiProvider/index.js +1 -1
  608. package/lib/PasswordRules/component.json +105 -0
  609. package/lib/PasswordRules/index.d.ts +4 -4
  610. package/lib/PopConfirm/component.json +227 -0
  611. package/lib/PopConfirm/index.d.ts +1 -1
  612. package/lib/PopConfirm/index.js +1 -1
  613. package/lib/PopMenu/component.json +131 -0
  614. package/lib/PopMenu/hooks.d.ts +1 -1
  615. package/lib/PopMenu/index.js +1 -1
  616. package/lib/Popover/component.json +165 -0
  617. package/lib/Popover/index.js +1 -1
  618. package/lib/Progress/component.json +161 -0
  619. package/lib/Prompt/component.json +144 -0
  620. package/lib/Querying/component.json +96 -0
  621. package/lib/Querying/index.css +1 -1
  622. package/lib/Querying/index.d.ts +2 -2
  623. package/lib/Querying/index.js +1 -1
  624. package/lib/Querying/style/index.css +1 -1
  625. package/lib/QuickReply/QuickReplyCode/index.js +1 -1
  626. package/lib/QuickReply/component.json +129 -0
  627. package/lib/QuickReply/index.d.ts +1 -1
  628. package/lib/Radio/component.json +136 -0
  629. package/lib/RadioGroup/component.json +149 -0
  630. package/lib/RangeInput/component.json +198 -0
  631. package/lib/RangeInput/index.d.ts +15 -7
  632. package/lib/RangeInput/index.js +1 -1
  633. package/lib/Result/component.json +104 -0
  634. package/lib/ScrollBar/component.json +115 -0
  635. package/lib/Search/component.json +177 -0
  636. package/lib/Search/index.d.ts +1 -1
  637. package/lib/Select/component.json +244 -0
  638. package/lib/Select/index.d.ts +11 -8
  639. package/lib/Select/index.js +1 -1
  640. package/lib/SelectInput/component.json +184 -0
  641. package/lib/SelectInput/index.d.ts +4 -4
  642. package/lib/SelectInput/index.js +1 -1
  643. package/lib/Selector/component.json +203 -0
  644. package/lib/Selector/index.js +1 -1
  645. package/lib/Selector/interface.d.ts +2 -2
  646. package/lib/Selector/selectorData/index.js +1 -1
  647. package/lib/Selector/selectorMain/index.js +1 -1
  648. package/lib/Selector/selectorNode/index.js +1 -1
  649. package/lib/Selector/util.d.ts +3 -3
  650. package/lib/Selector/util.js +1 -1
  651. package/lib/SelectorPicker/component.json +179 -0
  652. package/lib/SelectorPicker/index.d.ts +5 -5
  653. package/lib/SelectorPicker/index.js +1 -1
  654. package/lib/SingleBox/component.json +151 -0
  655. package/lib/SingleBox/index.d.ts +2 -2
  656. package/lib/Slider/component.json +181 -0
  657. package/lib/SortBox/component.json +108 -0
  658. package/lib/Status/component.json +104 -0
  659. package/lib/Stepper/component.json +129 -0
  660. package/lib/Stepper/index.d.ts +2 -2
  661. package/lib/Switch/component.json +207 -0
  662. package/lib/Switch/index.css +1 -1
  663. package/lib/Switch/index.d.ts +3 -2
  664. package/lib/Switch/index.js +1 -1
  665. package/lib/Switch/style/index.css +1 -1
  666. package/lib/Table/component.json +547 -0
  667. package/lib/Table/index.d.ts +2 -2
  668. package/lib/Table/index.js +1 -1
  669. package/lib/Table/interface.d.ts +30 -0
  670. package/lib/Table/tableHead.js +1 -1
  671. package/lib/Table/util.d.ts +1 -1
  672. package/lib/Table/util.js +1 -1
  673. package/lib/Tabs/component.json +227 -0
  674. package/lib/Tag/component.json +221 -0
  675. package/lib/Tag/index.css +1 -1
  676. package/lib/Tag/index.d.ts +1 -1
  677. package/lib/Tag/index.js +1 -1
  678. package/lib/Tag/style/index.css +1 -1
  679. package/lib/TextEditor/component.json +186 -0
  680. package/lib/TextEditor/index.d.ts +5 -5
  681. package/lib/TextEditor/index.js +1 -1
  682. package/lib/TextField/component.json +290 -0
  683. package/lib/TextField/index.d.ts +2 -2
  684. package/lib/TextField/index.js +1 -1
  685. package/lib/TimePicker/component.json +176 -0
  686. package/lib/Timeline/component.json +110 -0
  687. package/lib/Title/component.json +156 -0
  688. package/lib/ToggleButton/component.json +153 -0
  689. package/lib/ToggleButton/index.js +1 -1
  690. package/lib/Tooltip/component.json +176 -0
  691. package/lib/Tooltip/index.js +1 -1
  692. package/lib/Tooltip/interface.d.ts +14 -1
  693. package/lib/Tooltip/utils.js +1 -1
  694. package/lib/Transfer/component.json +157 -0
  695. package/lib/Tree/OperateBar/index.js +2 -2
  696. package/lib/Tree/Tree.js +1 -1
  697. package/lib/Tree/component.json +512 -0
  698. package/lib/Tree/interface.d.ts +1 -1
  699. package/lib/Upload/component.json +450 -0
  700. package/lib/Upload/util.js +1 -1
  701. package/lib/Utils/snack-kit-shims.d.ts +18 -0
  702. package/lib/Utils/snack-kit-shims.js +2 -0
  703. package/lib/Utils/type.d.ts +0 -6
  704. package/lib/_virtual/index.js +1 -1
  705. package/lib/_virtual/index2.js +1 -1
  706. package/lib/index.d.ts +4 -0
  707. package/lib/index.js +1 -1
  708. package/lib/locale/en-US.d.ts +3 -0
  709. package/lib/locale/en-US.js +1 -1
  710. package/lib/locale/en_US.d.ts +361 -0
  711. package/lib/locale/en_US.js +2 -0
  712. package/lib/locale/index.d.ts +1 -723
  713. package/lib/locale/index2.js +2 -0
  714. package/lib/locale/zh-CN.d.ts +3 -0
  715. package/lib/locale/zh-CN.js +1 -1
  716. package/lib/locale/zh_CN.d.ts +361 -0
  717. package/lib/locale/zh_CN.js +2 -0
  718. package/lib/node_modules/classnames/index.js +1 -1
  719. package/package.json +24 -4
  720. package/es/_virtual/index3.js +0 -5
  721. package/es/_virtual/index4.js +0 -5
  722. package/es/node_modules/@para-snack/core/dist/index.js +0 -5231
  723. package/lib/_virtual/index3.js +0 -2
  724. package/lib/_virtual/index4.js +0 -2
  725. package/lib/node_modules/@para-snack/core/dist/index.js +0 -20
  726. /package/es/{InputCode → CodeEditor}/index.css +0 -0
  727. /package/es/{Utils/Hooks → Hooks}/useResizeObserver.d.ts +0 -0
  728. /package/es/{Utils/Hooks → Hooks}/useResizeObserver.js +0 -0
  729. /package/lib/{Utils/Hooks → Hooks}/useResizeObserver.d.ts +0 -0
  730. /package/lib/{Utils/Hooks → Hooks}/useResizeObserver.js +0 -0
@@ -0,0 +1,412 @@
1
+ # Workflow 10: 跨组件状态联动(Dashboard / 撤销重做 / 状态切换)
2
+
3
+ > **基于**:console/src/package/Dashboard/src/content.tsx(多 Widget 状态同步)/ console/src/package/Cluster/src/content.tsx(Tabs 驱动状态切换 + 实时刷新)
4
+ > **覆盖 baseline 失败任务**:Task 25(Dashboard 多组件联动)/ Task 27(撤销重做)/ Task 32(Tabs 状态切换)
5
+ > **集成 typescriptPitfalls**:Form check() 返回 false|object / Switch loading loadingMap / Tree checkStrictly 类型(M3 修复同款)/ Tabs activeKey onChange / Form ref 类型必须 `useRef<FormRefObject>({} as FormRefObject)`
6
+
7
+ ---
8
+
9
+ ## 何时使用
10
+
11
+ 单个页面中多个独立组件的状态需要协调联动,包括:
12
+
13
+ ```
14
+ Tabs 切换驱动多组件刷新 + Form 提交状态控制 Switch/Button + Tree 勾选同步列表 + 撤销重做栈
15
+ ```
16
+
17
+ **典型业务**:Dashboard 看板 / 角色权限配置(Tree + 表格联动)/ 工作流编辑器(撤销重做)/ 分组切换(Tabs + 列表联动)
18
+
19
+ **不要用此模板的场景**:
20
+ - 单组件内部状态(无跨组件依赖)→ 用各组件独立模板
21
+ - 全局状态(跨页面)→ 用 Context / Redux
22
+
23
+ ---
24
+
25
+ ## 关键模式(与脑补的区别)
26
+
27
+ | 错误模式(AI 常犯) | 正确模式 |
28
+ |------------------|--------|
29
+ | ❌ `const formRef = useRef(null)` → `ref={formRef}` 两处都错 | ✅ **`useRef<FormRefObject>({} as FormRefObject)`** 且用 **`form={formRef}`**(form prop 而非 ref prop)|
30
+ | ❌ `if (!formRef.current.check()) throw new Error(...)` check() 当 boolean 用 | ✅ **`const values = formRef.current.check?.(); if (!values) return; submit(values)`** check() 返回 `false | object` |
31
+ | ❌ Switch loading 用单个 boolean state(多行并发互相覆盖) | ✅ **`loadingMap: Record<string, boolean>`** 每个 Switch 独立 loading 状态 |
32
+ | ❌ Tree `checkStrictly=true` 但 `checkedKeys={keys: Key[]}` 类型不匹配 | ✅ **`checkedKeys={{ checked: keys, halfChecked: halfKeys }}`** checkStrictly=true 时必须传对象形式 |
33
+ | ❌ Tabs `onChange={(value) => setTab(value)}` 混用参数名 | ✅ **`onChange={(activeKey) => setTab(activeKey)}`** 参数名与 API 签名一致 |
34
+ | ❌ Dashboard 多 Widget 用 useEffect 监听数据相互触发 | ✅ **`timer.current` ref + setInterval 独立驱动各 Widget**,停止时统一 clearInterval |
35
+
36
+ ---
37
+
38
+ ## 完整代码(自包含,可直接复制)
39
+
40
+ ```tsx
41
+ import React, {
42
+ FunctionComponent, useState, useRef, useMemo, useCallback, useEffect
43
+ } from 'react';
44
+ import { Tabs, Form, Switch, Tree, Button, Card } from '@para-ui/core';
45
+ import { Message } from '@para-ui/core/Message';
46
+ import type { FormRefObject } from '@para-ui/core';
47
+ import type { TabProps } from '@para-ui/core';
48
+
49
+ // ============================================================
50
+ // 类型定义
51
+ // ============================================================
52
+
53
+ interface RoleItem {
54
+ id: string;
55
+ name: string;
56
+ permissionCount: number;
57
+ enabled: boolean;
58
+ }
59
+
60
+ interface PermTreeNode {
61
+ key: string;
62
+ title: string;
63
+ children?: PermTreeNode[];
64
+ }
65
+
66
+ type GroupTab = 'all' | 'admin' | 'readonly';
67
+
68
+ // ============================================================
69
+ // 主组件:跨组件状态联动示例
70
+ // ============================================================
71
+
72
+ const RolePermissionPage: FunctionComponent = () => {
73
+ // ── 1. Tabs 状态(驱动下方 Tree 和列表联动)────────────────
74
+ const [activeGroup, setActiveGroup] = useState<GroupTab>('all');
75
+
76
+ // ── 2. Tree 多选状态(checkStrictly 类型陷阱)────────────────
77
+ const [checkedKeys, setCheckedKeys] = useState<React.Key[]>([]);
78
+ const [halfCheckedKeys, setHalfCheckedKeys] = useState<React.Key[]>([]);
79
+ // checkStrictly=true 时 checkedKeys 必须是对象形式,不能是数组
80
+
81
+ // ── 3. Form ref(必须显式类型,不能 useRef(null))────────────
82
+ // 错误:const formRef = useRef(null) → formRef.current.check() TS 报 unknown
83
+ // 正确:
84
+ const formRef = useRef<FormRefObject>({} as FormRefObject);
85
+
86
+ // ── 4. Switch loadingMap(多行独立 loading)────────────────
87
+ const [switchLoadingMap, setSwitchLoadingMap] = useState<Record<string, boolean>>({});
88
+
89
+ // ── 5. 撤销重做栈 ──────────────────────────────────────────
90
+ const [history, setHistory] = useState<React.Key[][]>([[]]);
91
+ const [historyIndex, setHistoryIndex] = useState<number>(0);
92
+
93
+ const pushHistory = (keys: React.Key[]): void => {
94
+ const newHistory = history.slice(0, historyIndex + 1);
95
+ newHistory.push([...keys]);
96
+ setHistory(newHistory);
97
+ setHistoryIndex(newHistory.length - 1);
98
+ };
99
+
100
+ const undo = (): void => {
101
+ if (historyIndex <= 0) return;
102
+ const newIndex = historyIndex - 1;
103
+ setHistoryIndex(newIndex);
104
+ setCheckedKeys(history[newIndex]);
105
+ };
106
+
107
+ const redo = (): void => {
108
+ if (historyIndex >= history.length - 1) return;
109
+ const newIndex = historyIndex + 1;
110
+ setHistoryIndex(newIndex);
111
+ setCheckedKeys(history[newIndex]);
112
+ };
113
+
114
+ // ── 6. Tabs 切换 → 清空 Tree 选择 + 刷新列表 ─────────────────
115
+ // onChange 参数名用 activeKey 与 API 签名一致(不要用 value)
116
+ const handleTabChange = (activeKey: string): void => {
117
+ setActiveGroup(activeKey as GroupTab);
118
+ setCheckedKeys([]); // Tabs 切换时清空 Tree 选择
119
+ setHalfCheckedKeys([]);
120
+ pushHistory([]); // 记录初始空状态到历史栈
121
+ };
122
+
123
+ // ── 7. Tree onCheck(checkStrictly 类型处理)─────────────────
124
+ const handleTreeCheck = (
125
+ keys: React.Key[] | { checked: React.Key[]; halfChecked: React.Key[] }
126
+ ): void => {
127
+ // checkStrictly=false 时 keys 是 Key[];checkStrictly=true 时是对象
128
+ const checkedArr = Array.isArray(keys) ? keys : keys.checked;
129
+ const halfArr = Array.isArray(keys) ? [] : keys.halfChecked;
130
+ setCheckedKeys(checkedArr);
131
+ setHalfCheckedKeys(halfArr);
132
+ pushHistory(checkedArr); // 每次勾选变化压栈
133
+ };
134
+
135
+ // ── 8. Switch 行内切换(loadingMap 避免并发干扰)─────────────
136
+ const handleToggleRole = async (role: RoleItem): Promise<void> => {
137
+ setSwitchLoadingMap(prev => ({ ...prev, [role.id]: true }));
138
+ try {
139
+ await mockApi.toggleRole(role.id, !role.enabled);
140
+ Message.success(`已${role.enabled ? '停用' : '启用'} ${role.name}`);
141
+ } finally {
142
+ setSwitchLoadingMap(prev => ({ ...prev, [role.id]: false }));
143
+ }
144
+ };
145
+
146
+ // ── 9. Form 提交(check() 返回 false | object,不是 boolean)─
147
+ const handleSavePermissions = async (): Promise<void> => {
148
+ // check() 返回 false(失败)或 values 对象(成功),不抛异常
149
+ const values = formRef.current.check?.();
150
+ if (!values) return; // false 表示验证失败,直接 return
151
+ // values 是包含表单字段的对象
152
+ await mockApi.savePermissions({
153
+ group: activeGroup,
154
+ permissions: checkedKeys,
155
+ remark: (values as Record<string, unknown>).remark as string
156
+ });
157
+ Message.success('权限保存成功');
158
+ };
159
+
160
+ // ── 10. Tabs 数据 ──────────────────────────────────────────
161
+ const tabsData = useMemo<TabProps<GroupTab>[]>(() => [
162
+ { value: 'all', label: '全部角色' },
163
+ { value: 'admin', label: '管理员' },
164
+ { value: 'readonly', label: '只读角色' }
165
+ ], []);
166
+
167
+ // ── 11. Tabs 驱动的 Tree 数据(按 activeGroup 过滤)──────────
168
+ const treeData: PermTreeNode[] = useMemo(() => {
169
+ // 实际项目里按 activeGroup 过滤权限树
170
+ return mockPermTree.filter(node =>
171
+ activeGroup === 'all' || node.key.startsWith(activeGroup)
172
+ );
173
+ }, [activeGroup]);
174
+
175
+ return (
176
+ <div style={{ display: 'flex', gap: 24 }}>
177
+ {/* 左侧:Tabs + Tree */}
178
+ <div style={{ width: 280, flexShrink: 0 }}>
179
+ <Tabs<GroupTab>
180
+ data={tabsData}
181
+ activeKey={activeGroup}
182
+ // onChange 参数名 activeKey 与 API 一致
183
+ onChange={(activeKey) => handleTabChange(activeKey)}
184
+ />
185
+
186
+ <div style={{ margin: '16px 0 8px', display: 'flex', gap: 8 }}>
187
+ <Button
188
+ size="small"
189
+ disabled={historyIndex <= 0}
190
+ onClick={undo}
191
+ >
192
+ 撤销
193
+ </Button>
194
+ <Button
195
+ size="small"
196
+ disabled={historyIndex >= history.length - 1}
197
+ onClick={redo}
198
+ >
199
+ 重做
200
+ </Button>
201
+ </div>
202
+
203
+ {/* Tree checkStrictly=true 时 checkedKeys 必须是对象形式 */}
204
+ <Tree
205
+ treeData={treeData}
206
+ checkable={true}
207
+ checkStrictly={true}
208
+ checkedKeys={{ checked: checkedKeys, halfChecked: halfCheckedKeys }}
209
+ onCheck={handleTreeCheck}
210
+ />
211
+ </div>
212
+
213
+ {/* 右侧:角色列表 + Form 保存 */}
214
+ <div style={{ flex: 1 }}>
215
+ {mockRoles
216
+ .filter(r => activeGroup === 'all' || r.id.startsWith(activeGroup))
217
+ .map(role => (
218
+ <Card key={role.id} style={{ marginBottom: 12 }}>
219
+ <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
220
+ <span>{role.name}</span>
221
+ <span style={{ color: '#999', fontSize: 12 }}>
222
+ {role.permissionCount} 个权限
223
+ </span>
224
+ {/* Switch loading 用 loadingMap,每行独立互不干扰 */}
225
+ <Switch
226
+ checked={role.enabled}
227
+ loading={switchLoadingMap[role.id] ?? false}
228
+ onChange={() => handleToggleRole(role)}
229
+ />
230
+ </div>
231
+ </Card>
232
+ ))
233
+ }
234
+
235
+ {/* Form:命令式 API 通过 form prop 传 ref(不是 ref prop,Form 不是 forwardRef 组件)*/}
236
+ <Form
237
+ form={formRef}
238
+ configList={[
239
+ {
240
+ name: 'remark',
241
+ label: '备注',
242
+ InputType: 'text', // InputType 不是 type(type 是布局覆盖)
243
+ rules: { validate: { required: false } } // required 在 rules.validate 下
244
+ }
245
+ ]}
246
+ />
247
+
248
+ <div style={{ marginTop: 16, display: 'flex', gap: 8 }}>
249
+ <Button onClick={handleSavePermissions}>
250
+ 保存权限(已选 {checkedKeys.length} 项)
251
+ </Button>
252
+ </div>
253
+ </div>
254
+ </div>
255
+ );
256
+ };
257
+
258
+ export default RolePermissionPage;
259
+
260
+ // === 占位 Mock ===
261
+ const mockPermTree: PermTreeNode[] = [
262
+ { key: 'admin-read', title: '管理员只读' },
263
+ { key: 'admin-write', title: '管理员读写' },
264
+ { key: 'readonly-view', title: '只读查看' }
265
+ ];
266
+ const mockRoles: RoleItem[] = [
267
+ { id: 'admin-1', name: '超级管理员', permissionCount: 24, enabled: true },
268
+ { id: 'readonly-1', name: '审计员', permissionCount: 6, enabled: false }
269
+ ];
270
+ const mockApi = {
271
+ toggleRole: async (id: string, enabled: boolean): Promise<void> => { void id; void enabled; },
272
+ savePermissions: async (data: {
273
+ group: string; permissions: React.Key[]; remark?: string
274
+ }): Promise<void> => { void data; }
275
+ };
276
+ ```
277
+
278
+ ---
279
+
280
+ ## 5 个真实陷阱(来自 M2/M3 修复实证)
281
+
282
+ ### ❌ 陷阱 1:Form ref 类型写错 + 用 ref prop 而非 form prop
283
+
284
+ ```tsx
285
+ // 错(最高频 Form 陷阱,M3 Stage 修复实证)
286
+ const formRef = useRef(null);
287
+ formRef.current?.check();
288
+ // TS 报错:类型"null"上不存在属性"check"
289
+
290
+ // 错(错误的泛型)
291
+ const formRef = useRef<HTMLElement>(null);
292
+ formRef.current?.check();
293
+ // TS 报错:类型"HTMLElement"上不存在属性"check"
294
+
295
+ // 错(Form 不是 forwardRef 组件,不接受 ref prop)
296
+ <Form ref={formRef} configList={...} />
297
+ // TS 报错:Property 'ref' does not exist on type 'IntrinsicAttributes & FormProps'
298
+
299
+ // 对:用 FormRefObject + form prop(不是 ref prop)
300
+ import type { FormRefObject } from '@para-ui/core';
301
+ const formRef = useRef<FormRefObject>({} as FormRefObject);
302
+ <Form form={formRef} configList={...} /> // form prop 接收 ref,不是 ref prop
303
+ formRef.current?.check(); // 正确,有类型提示
304
+ ```
305
+
306
+ ### ❌ 陷阱 2:check() 返回值当 boolean 用 → 丢失表单数据
307
+
308
+ ```tsx
309
+ // 错(check() 不是 boolean,是 false | object)
310
+ const ok: boolean = formRef.current.check?.() as boolean;
311
+ if (!ok) return;
312
+ submit({ data: '硬编码' }); // 丢失了 check() 返回的表单值
313
+
314
+ // 错(当 boolean 判断 + 取值分离,两次调用)
315
+ if (!formRef.current.check?.()) return;
316
+ const values = formRef.current.getData?.(); // getData 不存在
317
+
318
+ // 对:check() 返回 false 表失败,返回 object 表成功并含字段值
319
+ const values = formRef.current.check?.();
320
+ if (!values) return; // false 或 undefined → 验证失败
321
+ submit(values as Record<string, unknown>); // values 就是表单字段对象
322
+ ```
323
+
324
+ ### ❌ 陷阱 3:Tree checkStrictly=true 但 checkedKeys 传数组(M3 修复同款)
325
+
326
+ ```tsx
327
+ // 错(checkStrictly=true 时 checkedKeys 必须是 { checked, halfChecked } 对象)
328
+ <Tree
329
+ checkStrictly={true}
330
+ checkedKeys={selectedKeys} // TS: Key[] 不匹配 {checked: Key[]; halfChecked: Key[]}
331
+ onCheck={(keys) => setSelectedKeys(keys as React.Key[])}
332
+ // keys 实际是 {checked,halfChecked} 对象,强转为 Key[] 会出错
333
+ />
334
+
335
+ // 对
336
+ <Tree
337
+ checkStrictly={true}
338
+ checkedKeys={{ checked: checkedKeys, halfChecked: halfCheckedKeys }}
339
+ onCheck={(keys) => {
340
+ // keys 类型随 checkStrictly 变化,必须判断
341
+ const arr = Array.isArray(keys) ? keys : keys.checked;
342
+ setCheckedKeys(arr);
343
+ }}
344
+ />
345
+ ```
346
+
347
+ ### ❌ 陷阱 4:Tabs onChange 参数名混用导致语义混乱
348
+
349
+ ```tsx
350
+ // 错(参数名 value 与 API 签名 activeKey 不一致,运行正确但误导)
351
+ <Tabs
352
+ data={tabsData}
353
+ activeKey={currentTab}
354
+ onChange={(value) => {
355
+ setCurrentTab(value); // value 实际是 activeKey,命名混乱
356
+ }}
357
+ />
358
+
359
+ // 对(参数名与 API 一致)
360
+ <Tabs
361
+ data={tabsData}
362
+ activeKey={currentTab}
363
+ onChange={(activeKey) => {
364
+ setCurrentTab(activeKey as GroupTab);
365
+ }}
366
+ />
367
+
368
+ // 另一个 Tabs 陷阱:data 是 TabProps[] 不是 antd 的 items
369
+ // data={[{ value: 'home', label: '首页', content: <Home /> }]}
370
+ // 不是 items={[{ key: 'home', label: '首页', children: <Home /> }]}
371
+ ```
372
+
373
+ ### ❌ 陷阱 5:Dashboard 多 Widget 用 useEffect 监听相互触发死循环
374
+
375
+ ```tsx
376
+ // 错(多组件状态互相监听,容易触发死循环或闪烁)
377
+ useEffect(() => {
378
+ fetchWidgetA(activeGroup).then(setDataA);
379
+ }, [activeGroup, dataB]); // dataB 变化又触发 fetchWidgetA,形成环
380
+
381
+ // 对(Dashboard/content.tsx 实证):各 Widget 独立用 timer ref 驱动
382
+ const timer = useRef<Record<string, NodeJS.Timeout>>({});
383
+
384
+ const startPolling = () => {
385
+ timer.current.widgetA = setInterval(() => fetchWidgetA(), 5000);
386
+ timer.current.widgetB = setInterval(() => fetchWidgetB(), 10000);
387
+ };
388
+
389
+ const stopPolling = () => {
390
+ Object.keys(timer.current).forEach(key => clearInterval(timer.current[key]));
391
+ };
392
+
393
+ useEffect(() => {
394
+ startPolling();
395
+ return stopPolling; // 组件卸载时统一清理
396
+ }, [activeGroup]); // 只依赖 activeGroup,不依赖 data
397
+ ```
398
+
399
+ ---
400
+
401
+ ## 真实参考
402
+
403
+ **Para 团队真实业务代码**
404
+
405
+ | 文件 | 关键模式 | 行号 |
406
+ |------|---------|------|
407
+ | `Dashboard/src/content.tsx` | `timer.current` ref + `setInterval` 独立驱动各 Widget | 36, 79-90 |
408
+ | `Dashboard/src/content.tsx` | `stopGetMonitor` 统一 clearInterval 所有 timer | 136-139 |
409
+ | `Dashboard/src/content.tsx` | `useEffect(() => { startGetMonitor(); return stopGetMonitor; }, [wsStatus])` | 151-154 |
410
+ | `Cluster/src/content.tsx` | `Tabs onChange={(val) => setGroupId(val)}` 驱动 useEffect 联动 | 73-78 |
411
+ | `Cluster/src/content.tsx` | `useEffect(() => { queryGroupNodes(groupId)... }, [groupId])` Tabs 切换触发数据刷新 | 81-87 |
412
+ | `Service/src/content.tsx` | `useAsync(updateDisabled, 'id')` + `updateDisabledLoadingMap[row.id]` loadingMap 模式 | 66, 452 |
@@ -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
+ }
@@ -1 +1 @@
1
- @charset "UTF-8";.paraui-v4-align-box.paraui-v4-align-box-vertical *{vertical-align:middle}.paraui-v4-align-box.paraui-v4-align-box-flex{display:flex;align-items:center}
1
+ @charset "UTF-8";.paraui-v4-align-box.paraui-v4-align-box-horizontal{display:flex;align-items:center}.paraui-v4-align-box.paraui-v4-align-box-vertical{display:flex;flex-direction:column;align-items:center}
@@ -4,8 +4,12 @@ export interface AlignBoxProps {
4
4
  className?: string;
5
5
  /** style */
6
6
  style?: React.CSSProperties;
7
- /** 对齐方式 默认vertical */
8
- alignType?: 'vertical' | 'flex';
7
+ /**
8
+ * 子元素排列方向(字面 = 行为,2026-05-08 跨组件命名 epic §3.3 选项 I 重设计)
9
+ * - 'horizontal'(默认): display:flex; align-items:center — 子元素水平排列、垂直居中
10
+ * - 'vertical': display:flex; flex-direction:column; align-items:center — 子元素纵向堆叠、水平居中
11
+ */
12
+ direction?: 'horizontal' | 'vertical';
9
13
  children?: ReactNode;
10
14
  }
11
15
  declare const AlignBox: FunctionComponent<AlignBoxProps>;
@@ -3,7 +3,7 @@ import m from "clsx";
3
3
  import { $prefixCls as o } from "../GlobalContext/constant.js";
4
4
  import './index.css';/* empty css */
5
5
  const f = (r) => {
6
- const { className: s, style: t, children: i, alignType: e = "vertical", ...l } = r;
6
+ const { className: s, style: t, children: i, direction: e = "horizontal", ...l } = r;
7
7
  return /* @__PURE__ */ a.jsx(
8
8
  "div",
9
9
  {
@@ -1 +1 @@
1
- .paraui-v4-align-box.paraui-v4-align-box-vertical *{vertical-align:middle}.paraui-v4-align-box.paraui-v4-align-box-flex{display:flex;align-items:center}
1
+ .paraui-v4-align-box.paraui-v4-align-box-horizontal{display:flex;align-items:center}.paraui-v4-align-box.paraui-v4-align-box-vertical{display:flex;flex-direction:column;align-items:center}
@@ -8,7 +8,8 @@ interface IProps {
8
8
  isTree?: boolean;
9
9
  anchorMap?: AnchorMap;
10
10
  setAnchorMap?: (map: AnchorMap) => void;
11
- customPrefixIcon?: React.ReactNode;
11
+ /** R6 §6 类型放宽:静态 ReactNode 或函数形式 (item, isActive) => ReactNode */
12
+ customPrefixIcon?: React.ReactNode | ((item: AnchorItem, isActive: boolean) => React.ReactNode);
12
13
  onlyOneLevel?: boolean;
13
14
  }
14
15
  declare const AnchorMenu: (props: IProps) => import("react/jsx-runtime").JSX.Element;