@para-ui/core 5.0.0-beta.11 → 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.
Files changed (650) 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/FieldForm/component.json +196 -0
  36. package/Form/component.json +161 -0
  37. package/FormItem/component.json +171 -0
  38. package/FunctionModal/component.json +197 -0
  39. package/Help/component.json +118 -0
  40. package/HelperText/component.json +126 -0
  41. package/Image/component.json +165 -0
  42. package/InputCode/component.json +191 -0
  43. package/InputLang/component.json +205 -0
  44. package/InputNumber/component.json +162 -0
  45. package/Label/component.json +126 -0
  46. package/Loading/component.json +91 -0
  47. package/Menu/component.json +180 -0
  48. package/Message/component.json +246 -0
  49. package/Modal/component.json +277 -0
  50. package/MultiBox/component.json +216 -0
  51. package/Notification/component.json +184 -0
  52. package/OperateBtn/component.json +134 -0
  53. package/PageHeader/component.json +112 -0
  54. package/Pagination/component.json +181 -0
  55. package/PasswordRules/component.json +105 -0
  56. package/PopConfirm/component.json +227 -0
  57. package/PopMenu/component.json +131 -0
  58. package/Popover/component.json +165 -0
  59. package/Progress/component.json +161 -0
  60. package/Prompt/component.json +144 -0
  61. package/Querying/component.json +96 -0
  62. package/QuickReply/component.json +129 -0
  63. package/Radio/component.json +136 -0
  64. package/RadioGroup/component.json +149 -0
  65. package/RangeInput/component.json +198 -0
  66. package/Result/component.json +104 -0
  67. package/ScrollBar/component.json +115 -0
  68. package/Search/component.json +177 -0
  69. package/Select/component.json +244 -0
  70. package/SelectInput/component.json +184 -0
  71. package/Selector/component.json +203 -0
  72. package/SelectorPicker/component.json +179 -0
  73. package/SingleBox/component.json +151 -0
  74. package/Slider/component.json +181 -0
  75. package/SortBox/component.json +108 -0
  76. package/Status/component.json +104 -0
  77. package/Stepper/component.json +129 -0
  78. package/Switch/component.json +207 -0
  79. package/Table/component.json +547 -0
  80. package/Tabs/component.json +227 -0
  81. package/Tag/component.json +221 -0
  82. package/TextEditor/component.json +186 -0
  83. package/TextField/component.json +290 -0
  84. package/TimePicker/component.json +176 -0
  85. package/Timeline/component.json +110 -0
  86. package/Title/component.json +156 -0
  87. package/ToggleButton/component.json +153 -0
  88. package/Tooltip/component.json +176 -0
  89. package/Transfer/component.json +157 -0
  90. package/Tree/component.json +512 -0
  91. package/Upload/component.json +450 -0
  92. package/ai-workflows/01-crud-list-multi-drawer.md +278 -0
  93. package/ai-workflows/02-rbac-operation-buttons.md +290 -0
  94. package/ai-workflows/03-complex-form-async-cascade.md +350 -0
  95. package/ai-workflows/04-array-field-form.md +281 -0
  96. package/ai-workflows/05-popconfirm-async-message-queue.md +333 -0
  97. package/ai-workflows/06-modal-drawer-form-workflow.md +385 -0
  98. package/ai-workflows/07-search-filter-table-trio.md +387 -0
  99. package/ai-workflows/08-table-advanced-features.md +365 -0
  100. package/ai-workflows/09-batch-operation-export-progress.md +367 -0
  101. package/ai-workflows/10-cross-component-state-coordination.md +412 -0
  102. package/es/AlignBox/component.json +89 -0
  103. package/es/AlignBox/index.css +1 -1
  104. package/es/AlignBox/index.d.ts +6 -2
  105. package/es/AlignBox/index.js +1 -1
  106. package/es/AlignBox/style/index.css +1 -1
  107. package/es/Anchor/anchorMenu/index.d.ts +2 -1
  108. package/es/Anchor/anchorMenu/index.js +36 -33
  109. package/es/Anchor/component.json +130 -0
  110. package/es/Anchor/index.js +52 -49
  111. package/es/Anchor/type.d.ts +8 -4
  112. package/es/Argv/component.json +216 -0
  113. package/es/Argv/dataGenerator/index.js +1 -1
  114. package/es/Argv/index.d.ts +5 -6
  115. package/es/Argv/index.js +1 -1
  116. package/es/AutoBox/component.json +133 -0
  117. package/es/AutoBox/index.d.ts +3 -3
  118. package/es/AutoBox/index.js +1 -1
  119. package/es/AutoBox/protal.d.ts +2 -2
  120. package/es/AutoBox/protal.js +33 -30
  121. package/es/AutoButton/component.json +109 -0
  122. package/es/AutoButton/index.js +1 -1
  123. package/es/AutoTips/autoTipsMultiline/index.d.ts +1 -1
  124. package/es/AutoTips/autoTipsMultiline/index.js +1 -1
  125. package/es/AutoTips/component.json +121 -0
  126. package/es/AutoTips/index.js +1 -1
  127. package/es/Badge/component.json +92 -0
  128. package/es/Breadcrumbs/component.json +142 -0
  129. package/es/Breadcrumbs/index.js +1 -1
  130. package/es/Button/SplitButton.d.ts +2 -2
  131. package/es/Button/component.json +168 -0
  132. package/es/Button/index.js +44 -44
  133. package/es/ButtonGroup/component.json +132 -0
  134. package/es/ButtonGroup/index.d.ts +1 -1
  135. package/es/Card/component.json +162 -0
  136. package/es/Card/index.d.ts +2 -2
  137. package/es/Card/index.js +2 -2
  138. package/es/Carousel/component.json +142 -0
  139. package/es/Carousel/index.d.ts +1 -1
  140. package/es/Cascader/Cascader.js +1 -1
  141. package/es/Cascader/OptionList/Column.js +1 -1
  142. package/es/Cascader/OptionList/index.js +1 -1
  143. package/es/Cascader/component.json +196 -0
  144. package/es/Cascader/hooks/useEntities.js +7 -7
  145. package/es/Cascader/interface.d.ts +1 -0
  146. package/es/Cascader/utils/commonUtil.d.ts +1 -1
  147. package/es/Cascader/utils/commonUtil.js +16 -16
  148. package/es/Cascader/utils/treeUtil.d.ts +14 -5
  149. package/es/Cascader/utils/treeUtil.js +1 -1
  150. package/es/Checkbox/component.json +138 -0
  151. package/es/CheckboxGroup/component.json +152 -0
  152. package/es/CheckboxGroup/index.js +1 -1
  153. package/es/CodeEditor/component.json +189 -0
  154. package/es/CodeEditor/index.d.ts +11 -10
  155. package/es/CodeEditor/index.js +19 -19
  156. package/es/Collapse/component.json +166 -0
  157. package/es/Collapse/index.d.ts +1 -1
  158. package/es/Collapse/index.js +23 -22
  159. package/es/CollapseBox/component.json +84 -0
  160. package/es/CollapseLayout/component.json +155 -0
  161. package/es/ColorPicker/component.json +142 -0
  162. package/es/ComboSelect/component.json +181 -0
  163. package/es/ComboSelect/index.js +115 -109
  164. package/es/ComboSelect/interface.d.ts +2 -2
  165. package/es/ComboSelect/utils.d.ts +3 -3
  166. package/es/ComboSelect/utils.js +1 -1
  167. package/es/Container/component.json +111 -0
  168. package/es/ContentBox/component.json +81 -0
  169. package/es/CopyText/component.json +118 -0
  170. package/es/CycleSelector/component.json +98 -0
  171. package/es/CycleSelector/index.js +14 -13
  172. package/es/DatePicker/component.json +192 -0
  173. package/es/DatePicker/generatePicker/generateRangePicker.js +11 -11
  174. package/es/DatePicker/generatePicker/generateSinglePicker.js +2 -2
  175. package/es/Descriptions/component.json +142 -0
  176. package/es/Descriptions/index.d.ts +1 -1
  177. package/es/Desktop/component.json +171 -0
  178. package/es/Desktop/index.js +1 -1
  179. package/es/DragVerify/component.json +114 -0
  180. package/es/DragVerify/index.js +19 -19
  181. package/es/Drawer/component.json +200 -0
  182. package/es/Drawer/index.js +86 -86
  183. package/es/Drawer/interface.d.ts +1 -1
  184. package/es/Drawer/util.d.ts +1 -6
  185. package/es/Drawer/util.js +9 -6
  186. package/es/Dropdown/component.json +147 -0
  187. package/es/Dropdown/index.js +1 -1
  188. package/es/DynamicMultiBox/component.json +278 -0
  189. package/es/DynamicMultiBox/formItem.d.ts +1 -1
  190. package/es/DynamicMultiBox/index.js +1 -1
  191. package/es/DynamicMultiBox/rowForm.d.ts +2 -2
  192. package/es/Empty/component.json +123 -0
  193. package/es/Empty/index.css +1 -1
  194. package/es/Empty/index.d.ts +2 -2
  195. package/es/Empty/index.js +27 -26
  196. package/es/Empty/style/index.css +1 -1
  197. package/es/FieldForm/FieldFormItem/ItemHolder.js +1 -1
  198. package/es/FieldForm/FieldFormItem/MemoInput.d.ts +2 -2
  199. package/es/FieldForm/FieldFormItem/StatusProvider.js +1 -1
  200. package/es/FieldForm/FieldFormItem/index.d.ts +6 -6
  201. package/es/FieldForm/Form.d.ts +2 -2
  202. package/es/FieldForm/Form.js +1 -1
  203. package/es/FieldForm/FormItemInput.js +1 -1
  204. package/es/FieldForm/FormItemLabel.js +1 -1
  205. package/es/FieldForm/FormList.d.ts +2 -2
  206. package/es/FieldForm/component.json +196 -0
  207. package/es/FieldForm/context.d.ts +5 -1
  208. package/es/FieldForm/context.js +2 -2
  209. package/es/FieldForm/hooks/useForm.d.ts +4 -3
  210. package/es/FieldForm/hooks/useFormInstance.d.ts +1 -1
  211. package/es/FieldForm/hooks/useFormItemStatus.d.ts +9 -5
  212. package/es/FieldForm/hooks/useFormItemStatus.js +2 -2
  213. package/es/FieldForm/hooks/useItemRef.d.ts +1 -1
  214. package/es/FieldForm/hooks/useItemRef.js +6 -6
  215. package/es/Form/component.json +161 -0
  216. package/es/Form/index.d.ts +52 -49
  217. package/es/Form/index.js +1 -1
  218. package/es/FormItem/compoments/defaultCompoments/index.d.ts +5 -5
  219. package/es/FormItem/compoments/defaultCompoments/index.js +12 -11
  220. package/es/FormItem/compoments/formCheckboxGroup/index.d.ts +2 -2
  221. package/es/FormItem/compoments/formFile/index.js +8 -8
  222. package/es/FormItem/compoments/formRadioGroup/index.d.ts +1 -1
  223. package/es/FormItem/compoments/formSelect/index.d.ts +1 -1
  224. package/es/FormItem/component.json +171 -0
  225. package/es/FormItem/index.d.ts +5 -5
  226. package/es/FormItem/index.js +23 -23
  227. package/es/FormItem/itemType.js +1 -1
  228. package/es/FunctionModal/component.json +197 -0
  229. package/es/FunctionModal/dialog.d.ts +1 -1
  230. package/es/FunctionModal/modalContext.d.ts +4 -1
  231. package/es/GlobalContext/confirmLocale.js +1 -1
  232. package/es/GlobalContext/index.js +1 -1
  233. package/es/Help/component.json +118 -0
  234. package/es/HelperText/component.json +126 -0
  235. package/es/Image/PreviewGroup.js +1 -1
  236. package/es/Image/component.json +165 -0
  237. package/es/Image/index.js +1 -1
  238. package/es/InputCode/component.json +191 -0
  239. package/es/InputCode/index.d.ts +2 -2
  240. package/es/InputLang/component.json +205 -0
  241. package/es/InputLang/index.js +2 -2
  242. package/es/InputNumber/component.json +162 -0
  243. package/es/Label/component.json +126 -0
  244. package/es/Label/index.d.ts +2 -2
  245. package/es/Loading/component.json +91 -0
  246. package/es/Menu/component.json +180 -0
  247. package/es/Menu/verticalMenuList.js +1 -1
  248. package/es/Message/component.json +246 -0
  249. package/es/Message/index.d.ts +2 -2
  250. package/es/Message/index.js +2 -2
  251. package/es/Modal/Confirm/index.d.ts +1 -1
  252. package/es/Modal/Confirm/index.js +1 -1
  253. package/es/Modal/component.json +277 -0
  254. package/es/Modal/index.d.ts +85 -5
  255. package/es/Modal/index.js +159 -122
  256. package/es/Modal/interface.d.ts +1 -0
  257. package/es/MultiBox/component.json +216 -0
  258. package/es/MultiBox/index.js +19 -14
  259. package/es/Notification/component.json +184 -0
  260. package/es/OperateBtn/component.json +134 -0
  261. package/es/OperateBtn/index.d.ts +3 -3
  262. package/es/PageHeader/component.json +112 -0
  263. package/es/PageHeader/horizontalMeun.js +1 -1
  264. package/es/PageHeader/horizontalMeunRight.js +1 -1
  265. package/es/Pagination/component.json +181 -0
  266. package/es/Pagination/index.js +15 -15
  267. package/es/ParauiProvider/index.js +1 -1
  268. package/es/PasswordRules/component.json +105 -0
  269. package/es/PasswordRules/index.d.ts +4 -4
  270. package/es/PopConfirm/component.json +227 -0
  271. package/es/PopConfirm/index.d.ts +1 -1
  272. package/es/PopConfirm/index.js +1 -1
  273. package/es/PopMenu/component.json +131 -0
  274. package/es/PopMenu/hooks.d.ts +1 -1
  275. package/es/PopMenu/index.js +8 -8
  276. package/es/Popover/component.json +165 -0
  277. package/es/Popover/index.js +1 -1
  278. package/es/Progress/component.json +161 -0
  279. package/es/Prompt/component.json +144 -0
  280. package/es/Querying/component.json +96 -0
  281. package/es/Querying/index.css +1 -1
  282. package/es/Querying/index.d.ts +2 -2
  283. package/es/Querying/index.js +20 -19
  284. package/es/Querying/style/index.css +1 -1
  285. package/es/QuickReply/QuickReplyCode/index.js +1 -1
  286. package/es/QuickReply/component.json +129 -0
  287. package/es/QuickReply/index.d.ts +1 -1
  288. package/es/Radio/component.json +136 -0
  289. package/es/RadioGroup/component.json +149 -0
  290. package/es/RangeInput/component.json +198 -0
  291. package/es/RangeInput/index.js +20 -20
  292. package/es/Result/component.json +104 -0
  293. package/es/ScrollBar/component.json +115 -0
  294. package/es/Search/component.json +177 -0
  295. package/es/Search/index.d.ts +1 -1
  296. package/es/Select/component.json +244 -0
  297. package/es/Select/index.js +114 -114
  298. package/es/SelectInput/component.json +184 -0
  299. package/es/Selector/component.json +203 -0
  300. package/es/Selector/index.js +56 -50
  301. package/es/Selector/interface.d.ts +2 -2
  302. package/es/Selector/selectorData/index.js +1 -1
  303. package/es/Selector/selectorMain/index.js +3 -3
  304. package/es/Selector/selectorNode/index.js +1 -1
  305. package/es/Selector/util.d.ts +3 -3
  306. package/es/Selector/util.js +6 -12
  307. package/es/SelectorPicker/component.json +179 -0
  308. package/es/SelectorPicker/index.d.ts +5 -5
  309. package/es/SelectorPicker/index.js +15 -15
  310. package/es/SingleBox/component.json +151 -0
  311. package/es/SingleBox/index.d.ts +2 -2
  312. package/es/Slider/component.json +181 -0
  313. package/es/SortBox/component.json +108 -0
  314. package/es/Status/component.json +104 -0
  315. package/es/Stepper/component.json +129 -0
  316. package/es/Stepper/index.d.ts +2 -2
  317. package/es/Switch/component.json +207 -0
  318. package/es/Switch/index.css +1 -1
  319. package/es/Switch/index.d.ts +3 -2
  320. package/es/Switch/index.js +60 -59
  321. package/es/Switch/style/index.css +1 -1
  322. package/es/Table/component.json +547 -0
  323. package/es/Table/index.d.ts +2 -2
  324. package/es/Table/index.js +385 -382
  325. package/es/Table/interface.d.ts +30 -0
  326. package/es/Table/tableHead.js +1 -1
  327. package/es/Table/util.d.ts +1 -1
  328. package/es/Table/util.js +3 -12
  329. package/es/Tabs/component.json +227 -0
  330. package/es/Tag/component.json +221 -0
  331. package/es/Tag/index.css +1 -1
  332. package/es/Tag/index.d.ts +1 -1
  333. package/es/Tag/index.js +20 -20
  334. package/es/Tag/style/index.css +1 -1
  335. package/es/TextEditor/component.json +186 -0
  336. package/es/TextEditor/index.d.ts +5 -5
  337. package/es/TextEditor/index.js +1 -1
  338. package/es/TextField/component.json +290 -0
  339. package/es/TextField/index.d.ts +2 -2
  340. package/es/TextField/index.js +1 -1
  341. package/es/TimePicker/component.json +176 -0
  342. package/es/Timeline/component.json +110 -0
  343. package/es/Title/component.json +156 -0
  344. package/es/ToggleButton/component.json +153 -0
  345. package/es/ToggleButton/index.js +1 -1
  346. package/es/Tooltip/component.json +176 -0
  347. package/es/Tooltip/index.js +58 -53
  348. package/es/Tooltip/interface.d.ts +14 -1
  349. package/es/Tooltip/utils.js +6 -6
  350. package/es/Transfer/component.json +157 -0
  351. package/es/Tree/OperateBar/index.js +1 -1
  352. package/es/Tree/Tree.js +3 -3
  353. package/es/Tree/component.json +512 -0
  354. package/es/Tree/interface.d.ts +1 -1
  355. package/es/Upload/component.json +450 -0
  356. package/es/Upload/util.js +1 -1
  357. package/es/Utils/snack-kit-shims.d.ts +18 -0
  358. package/es/Utils/snack-kit-shims.js +19 -0
  359. package/es/Utils/type.d.ts +0 -2
  360. package/es/_virtual/index.js +5 -3
  361. package/es/_virtual/index2.js +2 -5
  362. package/es/index.d.ts +2 -0
  363. package/es/index.js +1 -1
  364. package/es/locale/en_US.d.ts +361 -0
  365. package/es/locale/en_US.js +364 -0
  366. package/es/locale/index.d.ts +1 -723
  367. package/es/locale/index2.js +10 -0
  368. package/es/locale/zh_CN.d.ts +361 -0
  369. package/es/locale/zh_CN.js +364 -0
  370. package/es/node_modules/classnames/index.js +1 -1
  371. package/lib/AlignBox/component.json +89 -0
  372. package/lib/AlignBox/index.css +1 -1
  373. package/lib/AlignBox/index.d.ts +6 -2
  374. package/lib/AlignBox/index.js +1 -1
  375. package/lib/AlignBox/style/index.css +1 -1
  376. package/lib/Anchor/anchorMenu/index.d.ts +2 -1
  377. package/lib/Anchor/anchorMenu/index.js +1 -1
  378. package/lib/Anchor/component.json +130 -0
  379. package/lib/Anchor/index.js +1 -1
  380. package/lib/Anchor/type.d.ts +8 -4
  381. package/lib/Argv/component.json +216 -0
  382. package/lib/Argv/dataGenerator/index.js +1 -1
  383. package/lib/Argv/index.d.ts +5 -6
  384. package/lib/Argv/index.js +1 -1
  385. package/lib/AutoBox/component.json +133 -0
  386. package/lib/AutoBox/index.d.ts +3 -3
  387. package/lib/AutoBox/index.js +1 -1
  388. package/lib/AutoBox/protal.d.ts +2 -2
  389. package/lib/AutoBox/protal.js +1 -1
  390. package/lib/AutoButton/component.json +109 -0
  391. package/lib/AutoButton/index.js +1 -1
  392. package/lib/AutoTips/autoTipsMultiline/index.d.ts +1 -1
  393. package/lib/AutoTips/autoTipsMultiline/index.js +1 -1
  394. package/lib/AutoTips/component.json +121 -0
  395. package/lib/AutoTips/index.js +1 -1
  396. package/lib/Badge/component.json +92 -0
  397. package/lib/Breadcrumbs/component.json +142 -0
  398. package/lib/Breadcrumbs/index.js +1 -1
  399. package/lib/Button/SplitButton.d.ts +2 -2
  400. package/lib/Button/component.json +168 -0
  401. package/lib/Button/index.js +1 -1
  402. package/lib/ButtonGroup/component.json +132 -0
  403. package/lib/ButtonGroup/index.d.ts +1 -1
  404. package/lib/Card/component.json +162 -0
  405. package/lib/Card/index.d.ts +2 -2
  406. package/lib/Card/index.js +1 -1
  407. package/lib/Carousel/component.json +142 -0
  408. package/lib/Carousel/index.d.ts +1 -1
  409. package/lib/Cascader/Cascader.js +1 -1
  410. package/lib/Cascader/OptionList/Column.js +1 -1
  411. package/lib/Cascader/OptionList/index.js +1 -1
  412. package/lib/Cascader/component.json +196 -0
  413. package/lib/Cascader/hooks/useEntities.js +1 -1
  414. package/lib/Cascader/interface.d.ts +1 -0
  415. package/lib/Cascader/utils/commonUtil.d.ts +1 -1
  416. package/lib/Cascader/utils/commonUtil.js +1 -1
  417. package/lib/Cascader/utils/treeUtil.d.ts +14 -5
  418. package/lib/Cascader/utils/treeUtil.js +1 -1
  419. package/lib/Checkbox/component.json +138 -0
  420. package/lib/CheckboxGroup/component.json +152 -0
  421. package/lib/CheckboxGroup/index.js +1 -1
  422. package/lib/CodeEditor/component.json +189 -0
  423. package/lib/CodeEditor/index.d.ts +11 -10
  424. package/lib/CodeEditor/index.js +1 -1
  425. package/lib/Collapse/component.json +166 -0
  426. package/lib/Collapse/index.d.ts +1 -1
  427. package/lib/Collapse/index.js +1 -1
  428. package/lib/CollapseBox/component.json +84 -0
  429. package/lib/CollapseLayout/component.json +155 -0
  430. package/lib/ColorPicker/component.json +142 -0
  431. package/lib/ComboSelect/component.json +181 -0
  432. package/lib/ComboSelect/index.js +1 -1
  433. package/lib/ComboSelect/interface.d.ts +2 -2
  434. package/lib/ComboSelect/utils.d.ts +3 -3
  435. package/lib/ComboSelect/utils.js +1 -1
  436. package/lib/Container/component.json +111 -0
  437. package/lib/ContentBox/component.json +81 -0
  438. package/lib/CopyText/component.json +118 -0
  439. package/lib/CycleSelector/component.json +98 -0
  440. package/lib/CycleSelector/index.js +1 -1
  441. package/lib/DatePicker/component.json +192 -0
  442. package/lib/DatePicker/generatePicker/generateRangePicker.js +1 -1
  443. package/lib/DatePicker/generatePicker/generateSinglePicker.js +1 -1
  444. package/lib/Descriptions/component.json +142 -0
  445. package/lib/Descriptions/index.d.ts +1 -1
  446. package/lib/Desktop/component.json +171 -0
  447. package/lib/Desktop/index.js +1 -1
  448. package/lib/DragVerify/component.json +114 -0
  449. package/lib/DragVerify/index.js +1 -1
  450. package/lib/Drawer/component.json +200 -0
  451. package/lib/Drawer/index.js +1 -1
  452. package/lib/Drawer/interface.d.ts +1 -1
  453. package/lib/Drawer/util.d.ts +1 -6
  454. package/lib/Drawer/util.js +1 -1
  455. package/lib/Dropdown/component.json +147 -0
  456. package/lib/Dropdown/index.js +1 -1
  457. package/lib/DynamicMultiBox/component.json +278 -0
  458. package/lib/DynamicMultiBox/formItem.d.ts +1 -1
  459. package/lib/DynamicMultiBox/index.js +1 -1
  460. package/lib/DynamicMultiBox/rowForm.d.ts +2 -2
  461. package/lib/Empty/component.json +123 -0
  462. package/lib/Empty/index.css +1 -1
  463. package/lib/Empty/index.d.ts +2 -2
  464. package/lib/Empty/index.js +1 -1
  465. package/lib/Empty/style/index.css +1 -1
  466. package/lib/FieldForm/FieldFormItem/ItemHolder.js +1 -1
  467. package/lib/FieldForm/FieldFormItem/MemoInput.d.ts +2 -2
  468. package/lib/FieldForm/FieldFormItem/StatusProvider.js +1 -1
  469. package/lib/FieldForm/FieldFormItem/index.d.ts +6 -6
  470. package/lib/FieldForm/Form.d.ts +2 -2
  471. package/lib/FieldForm/Form.js +1 -1
  472. package/lib/FieldForm/FormItemInput.js +1 -1
  473. package/lib/FieldForm/FormItemLabel.js +1 -1
  474. package/lib/FieldForm/FormList.d.ts +2 -2
  475. package/lib/FieldForm/component.json +196 -0
  476. package/lib/FieldForm/context.d.ts +5 -1
  477. package/lib/FieldForm/context.js +1 -1
  478. package/lib/FieldForm/hooks/useForm.d.ts +4 -3
  479. package/lib/FieldForm/hooks/useFormInstance.d.ts +1 -1
  480. package/lib/FieldForm/hooks/useFormItemStatus.d.ts +9 -5
  481. package/lib/FieldForm/hooks/useFormItemStatus.js +1 -1
  482. package/lib/FieldForm/hooks/useItemRef.d.ts +1 -1
  483. package/lib/FieldForm/hooks/useItemRef.js +1 -1
  484. package/lib/Form/component.json +161 -0
  485. package/lib/Form/index.d.ts +52 -49
  486. package/lib/Form/index.js +1 -1
  487. package/lib/FormItem/compoments/defaultCompoments/index.d.ts +5 -5
  488. package/lib/FormItem/compoments/defaultCompoments/index.js +1 -1
  489. package/lib/FormItem/compoments/formCheckboxGroup/index.d.ts +2 -2
  490. package/lib/FormItem/compoments/formFile/index.js +1 -1
  491. package/lib/FormItem/compoments/formRadioGroup/index.d.ts +1 -1
  492. package/lib/FormItem/compoments/formSelect/index.d.ts +1 -1
  493. package/lib/FormItem/component.json +171 -0
  494. package/lib/FormItem/index.d.ts +5 -5
  495. package/lib/FormItem/index.js +1 -1
  496. package/lib/FormItem/itemType.js +1 -1
  497. package/lib/FunctionModal/component.json +197 -0
  498. package/lib/FunctionModal/dialog.d.ts +1 -1
  499. package/lib/FunctionModal/modalContext.d.ts +4 -1
  500. package/lib/GlobalContext/confirmLocale.js +1 -1
  501. package/lib/GlobalContext/index.js +1 -1
  502. package/lib/Help/component.json +118 -0
  503. package/lib/HelperText/component.json +126 -0
  504. package/lib/Image/PreviewGroup.js +1 -1
  505. package/lib/Image/component.json +165 -0
  506. package/lib/Image/index.js +1 -1
  507. package/lib/InputCode/component.json +191 -0
  508. package/lib/InputCode/index.d.ts +2 -2
  509. package/lib/InputLang/component.json +205 -0
  510. package/lib/InputLang/index.js +1 -1
  511. package/lib/InputNumber/component.json +162 -0
  512. package/lib/Label/component.json +126 -0
  513. package/lib/Label/index.d.ts +2 -2
  514. package/lib/Loading/component.json +91 -0
  515. package/lib/Menu/component.json +180 -0
  516. package/lib/Menu/verticalMenuList.js +1 -1
  517. package/lib/Message/component.json +246 -0
  518. package/lib/Message/index.d.ts +2 -2
  519. package/lib/Message/index.js +1 -1
  520. package/lib/Modal/Confirm/index.d.ts +1 -1
  521. package/lib/Modal/Confirm/index.js +1 -1
  522. package/lib/Modal/component.json +277 -0
  523. package/lib/Modal/index.d.ts +85 -5
  524. package/lib/Modal/index.js +1 -1
  525. package/lib/Modal/interface.d.ts +1 -0
  526. package/lib/MultiBox/component.json +216 -0
  527. package/lib/MultiBox/index.js +1 -1
  528. package/lib/Notification/component.json +184 -0
  529. package/lib/OperateBtn/component.json +134 -0
  530. package/lib/OperateBtn/index.d.ts +3 -3
  531. package/lib/PageHeader/component.json +112 -0
  532. package/lib/PageHeader/horizontalMeun.js +1 -1
  533. package/lib/PageHeader/horizontalMeunRight.js +1 -1
  534. package/lib/Pagination/component.json +181 -0
  535. package/lib/Pagination/index.js +1 -1
  536. package/lib/ParauiProvider/index.js +1 -1
  537. package/lib/PasswordRules/component.json +105 -0
  538. package/lib/PasswordRules/index.d.ts +4 -4
  539. package/lib/PopConfirm/component.json +227 -0
  540. package/lib/PopConfirm/index.d.ts +1 -1
  541. package/lib/PopConfirm/index.js +1 -1
  542. package/lib/PopMenu/component.json +131 -0
  543. package/lib/PopMenu/hooks.d.ts +1 -1
  544. package/lib/PopMenu/index.js +1 -1
  545. package/lib/Popover/component.json +165 -0
  546. package/lib/Popover/index.js +1 -1
  547. package/lib/Progress/component.json +161 -0
  548. package/lib/Prompt/component.json +144 -0
  549. package/lib/Querying/component.json +96 -0
  550. package/lib/Querying/index.css +1 -1
  551. package/lib/Querying/index.d.ts +2 -2
  552. package/lib/Querying/index.js +1 -1
  553. package/lib/Querying/style/index.css +1 -1
  554. package/lib/QuickReply/QuickReplyCode/index.js +1 -1
  555. package/lib/QuickReply/component.json +129 -0
  556. package/lib/QuickReply/index.d.ts +1 -1
  557. package/lib/Radio/component.json +136 -0
  558. package/lib/RadioGroup/component.json +149 -0
  559. package/lib/RangeInput/component.json +198 -0
  560. package/lib/RangeInput/index.js +1 -1
  561. package/lib/Result/component.json +104 -0
  562. package/lib/ScrollBar/component.json +115 -0
  563. package/lib/Search/component.json +177 -0
  564. package/lib/Search/index.d.ts +1 -1
  565. package/lib/Select/component.json +244 -0
  566. package/lib/Select/index.js +1 -1
  567. package/lib/SelectInput/component.json +184 -0
  568. package/lib/Selector/component.json +203 -0
  569. package/lib/Selector/index.js +1 -1
  570. package/lib/Selector/interface.d.ts +2 -2
  571. package/lib/Selector/selectorData/index.js +1 -1
  572. package/lib/Selector/selectorMain/index.js +1 -1
  573. package/lib/Selector/selectorNode/index.js +1 -1
  574. package/lib/Selector/util.d.ts +3 -3
  575. package/lib/Selector/util.js +1 -1
  576. package/lib/SelectorPicker/component.json +179 -0
  577. package/lib/SelectorPicker/index.d.ts +5 -5
  578. package/lib/SelectorPicker/index.js +1 -1
  579. package/lib/SingleBox/component.json +151 -0
  580. package/lib/SingleBox/index.d.ts +2 -2
  581. package/lib/Slider/component.json +181 -0
  582. package/lib/SortBox/component.json +108 -0
  583. package/lib/Status/component.json +104 -0
  584. package/lib/Stepper/component.json +129 -0
  585. package/lib/Stepper/index.d.ts +2 -2
  586. package/lib/Switch/component.json +207 -0
  587. package/lib/Switch/index.css +1 -1
  588. package/lib/Switch/index.d.ts +3 -2
  589. package/lib/Switch/index.js +1 -1
  590. package/lib/Switch/style/index.css +1 -1
  591. package/lib/Table/component.json +547 -0
  592. package/lib/Table/index.d.ts +2 -2
  593. package/lib/Table/index.js +1 -1
  594. package/lib/Table/interface.d.ts +30 -0
  595. package/lib/Table/tableHead.js +1 -1
  596. package/lib/Table/util.d.ts +1 -1
  597. package/lib/Table/util.js +1 -1
  598. package/lib/Tabs/component.json +227 -0
  599. package/lib/Tag/component.json +221 -0
  600. package/lib/Tag/index.css +1 -1
  601. package/lib/Tag/index.d.ts +1 -1
  602. package/lib/Tag/index.js +1 -1
  603. package/lib/Tag/style/index.css +1 -1
  604. package/lib/TextEditor/component.json +186 -0
  605. package/lib/TextEditor/index.d.ts +5 -5
  606. package/lib/TextEditor/index.js +1 -1
  607. package/lib/TextField/component.json +290 -0
  608. package/lib/TextField/index.d.ts +2 -2
  609. package/lib/TextField/index.js +1 -1
  610. package/lib/TimePicker/component.json +176 -0
  611. package/lib/Timeline/component.json +110 -0
  612. package/lib/Title/component.json +156 -0
  613. package/lib/ToggleButton/component.json +153 -0
  614. package/lib/ToggleButton/index.js +1 -1
  615. package/lib/Tooltip/component.json +176 -0
  616. package/lib/Tooltip/index.js +1 -1
  617. package/lib/Tooltip/interface.d.ts +14 -1
  618. package/lib/Tooltip/utils.js +1 -1
  619. package/lib/Transfer/component.json +157 -0
  620. package/lib/Tree/OperateBar/index.js +2 -2
  621. package/lib/Tree/Tree.js +1 -1
  622. package/lib/Tree/component.json +512 -0
  623. package/lib/Tree/interface.d.ts +1 -1
  624. package/lib/Upload/component.json +450 -0
  625. package/lib/Upload/util.js +1 -1
  626. package/lib/Utils/snack-kit-shims.d.ts +18 -0
  627. package/lib/Utils/snack-kit-shims.js +2 -0
  628. package/lib/Utils/type.d.ts +0 -2
  629. package/lib/_virtual/index.js +1 -1
  630. package/lib/_virtual/index2.js +1 -1
  631. package/lib/index.d.ts +2 -0
  632. package/lib/index.js +1 -1
  633. package/lib/locale/en_US.d.ts +361 -0
  634. package/lib/locale/en_US.js +2 -0
  635. package/lib/locale/index.d.ts +1 -723
  636. package/lib/locale/index2.js +2 -0
  637. package/lib/locale/zh_CN.d.ts +361 -0
  638. package/lib/locale/zh_CN.js +2 -0
  639. package/lib/node_modules/classnames/index.js +1 -1
  640. package/package.json +11 -4
  641. package/es/_virtual/index3.js +0 -5
  642. package/es/_virtual/index4.js +0 -5
  643. package/es/node_modules/@para-snack/core/dist/index.js +0 -5231
  644. package/lib/_virtual/index3.js +0 -2
  645. package/lib/_virtual/index4.js +0 -2
  646. package/lib/node_modules/@para-snack/core/dist/index.js +0 -20
  647. /package/es/{Utils/Hooks → Hooks}/useResizeObserver.d.ts +0 -0
  648. /package/es/{Utils/Hooks → Hooks}/useResizeObserver.js +0 -0
  649. /package/lib/{Utils/Hooks → Hooks}/useResizeObserver.d.ts +0 -0
  650. /package/lib/{Utils/Hooks → Hooks}/useResizeObserver.js +0 -0
@@ -0,0 +1,221 @@
1
+ {
2
+ "name": "Tag",
3
+ "category": "Data Display",
4
+ "description": "进行标记和分类的小标签,支持 4 种预设色 + 自定义色、描边/实色、closable 可关闭、editable 内置编辑模式、visible 显隐控制",
5
+ "semantic": {
6
+ "intent": [
7
+ "分类",
8
+ "标记",
9
+ "选择"
10
+ ],
11
+ "useCases": [
12
+ "文章标签",
13
+ "状态展示",
14
+ "筛选条件"
15
+ ],
16
+ "riskLevel": "low"
17
+ },
18
+ "variants": {
19
+ "normal": {
20
+ "meaning": "普通标签"
21
+ },
22
+ "outline": {
23
+ "meaning": "描边标签"
24
+ }
25
+ },
26
+ "states": [
27
+ "default",
28
+ "closable",
29
+ "visible",
30
+ "editable"
31
+ ],
32
+ "idealProps": {
33
+ "children": {
34
+ "type": "ReactNode",
35
+ "description": "**标签文案**(src 通过 PropsWithChildren 接收,与 props 分开)。直接作为 children 传入:`<Tag>已激活</Tag>`。**editable 模式下**:当 children 是 string 时会作为内嵌 input 的初始值(src/Tag/index.tsx:118-122 实证)"
36
+ },
37
+ "color": {
38
+ "type": "'blue' | 'green' | 'yellow' | 'red' | string",
39
+ "description": "标签颜色。**预设色(4 个)**:blue / green / yellow / red——会命中专门 CSS 类生成完整配色方案。**非预设值**(如 'gray' / hex / rgb())走 tinycolor 解析,渲染为带 0.1 alpha 的对应色背景 + 原色文字(无 hover/active 等专门 CSS)。**状态色推荐语义**(业界常见映射):green=success/激活、yellow=warning/待处理、red=error/危险、blue=info/默认;灰色场景建议传 hex '#808080' 或 '#999'。需求方若需要灰色等常用色,可以提议加入预设清单(src 改 PresetColors + 加专门样式)",
40
+ "_presetNote": "DEFECT 反查:src/Tag/index.tsx:67 PresetColors = ['blue','green','yellow','red'];非预设走 tinycolor 通用渲染但视觉效果有差异——不是 bug 是设计取舍"
41
+ },
42
+ "type": {
43
+ "type": "enum",
44
+ "values": [
45
+ "normal",
46
+ "outline"
47
+ ],
48
+ "default": "normal",
49
+ "description": "标签类型——normal 实色填充,outline 描边版(color 仍生效,但作为边框色 + 文字色,背景透明)"
50
+ },
51
+ "size": {
52
+ "type": "enum",
53
+ "values": [
54
+ "small",
55
+ "medium",
56
+ "large"
57
+ ],
58
+ "default": "small",
59
+ "description": "标签大小。三档统一为 small / medium / large(2026-05-08 跨组件命名 epic §3.1 选项 B 实施,medium 为新增视觉档,默认 small 不变,既有 small/large 调用零回归)"
60
+ },
61
+ "closable": {
62
+ "type": "boolean",
63
+ "default": false,
64
+ "description": "是否可关闭——开启后右侧自动渲染 ✕ 图标;自定义关闭图标传 closeIcon prop。**半受控行为**(src/Tag/index.tsx:175-178 实证):未传 visible prop 时点击 ✕ 自动 setVisible(false) 内部隐藏;传了 visible 后由父组件控制(点击 ✕ 仅触发 onClose 不自动隐藏)"
65
+ },
66
+ "onClose": {
67
+ "type": "function",
68
+ "signature": "(event: React.MouseEvent) => void",
69
+ "description": "关闭按钮点击回调(**完整签名带 React MouseEvent 参数**,src/Tag/index.tsx:36 实证)。**事件**:内部已 stopPropagation;如需阻止默认隐藏(visible 未受控场景),调用 event.preventDefault() 即可——src 检查 e.defaultPrevented 后跳过 setVisible(false)"
70
+ },
71
+ "closeIcon": {
72
+ "type": "ReactNode",
73
+ "description": "自定义关闭图标节点(替代默认 CloseIcon),仅在 closable=true 时渲染"
74
+ },
75
+ "visible": {
76
+ "type": "boolean",
77
+ "default": true,
78
+ "description": "是否显示标签。**受控**:传入后 Tag 显隐完全跟随 visible(onClose 后不会自动隐藏,由父组件 setState 控制)。**非受控**:不传时 onClose 后 src 内部 setVisible(false) 自动隐藏。如需完全不挂载 DOM,在父组件做条件渲染 `{isShown && <Tag />}` 而非依赖 visible prop(visible=false 时 DOM 仍渲染只是 CSS 隐藏)"
79
+ },
80
+ "icon": {
81
+ "type": "ReactNode",
82
+ "description": "**前置图标**(src/Tag/index.tsx:231-254 实证 icon 渲染在文案左侧;与 closeIcon 在右侧不同)。editable=true 时此 prop 被忽略(前缀位置改渲染 EditIcon)"
83
+ },
84
+ "editable": {
85
+ "type": "boolean",
86
+ "default": false,
87
+ "description": "**Tag 内置可编辑模式**——传 editable={true} 后,Tag 在前缀位置自动渲染编辑图标(EditIcon),点击图标会切换为内嵌 input;按 Enter 或失焦提交。**回调通过 tagChange prop 触发**:`tagChange?: (value: string) => void`。**初值来源**:children 为 string 时作为 input 初始值;不是 string 时初值为空字符串。无需手写原生 input。editable 模式下 children 仅作为编辑态进入时的 initialValue;父组件后续更新 children **不会刷新已激活 input**;父组件需通过 tagChange 回调维护 state"
88
+ },
89
+ "tagChange": {
90
+ "type": "function",
91
+ "signature": "(value: string) => void",
92
+ "description": "**editable=true 模式下 input 值变化的回调**(src/Tag/index.tsx:259 实证:每次 onChange 触发 = 实时键入回调,**不是 onBlur/Enter 才触发**)。提交动作仅控制是否退出编辑态,与 tagChange 触发频率无关"
93
+ },
94
+ "editInputClassName": {
95
+ "type": "string",
96
+ "description": "editable 模式下内嵌 input 的类名"
97
+ },
98
+ "editInputWidth": {
99
+ "type": "number",
100
+ "description": "editable 模式下内嵌 input 的宽度(默认根据内容自适应)"
101
+ },
102
+ "maxWidth": {
103
+ "type": "number | string",
104
+ "description": "标签最大宽度。超出时配合 AutoTips 显示 tooltip(不截断)"
105
+ },
106
+ "tipMaxWidth": {
107
+ "type": "number | string",
108
+ "description": "AutoTips tooltip 的最大宽度(src/Tag/index.tsx:56,310 实证:透传给 AutoTips 的 tipMaxWidth prop,控制文案截断时 tooltip 浮层宽度)"
109
+ },
110
+ "onEdit": {
111
+ "type": "function",
112
+ "signature": "(event: React.MouseEvent) => void",
113
+ "description": "编辑图标点击回调(src/Tag/index.tsx:38,198 实证:editable=true 时点击前缀 EditIcon 触发,可通过 event.preventDefault() 阻止切换为 input 编辑状态)"
114
+ },
115
+ "getWidth": {
116
+ "type": "function",
117
+ "signature": "(width: number) => void",
118
+ "description": "获取标签宽度回调(src/Tag/index.tsx:40,115 实证:挂载及 inputVisible 变化后通过 useEffect 将 tagRef 的 offsetWidth 传出)"
119
+ },
120
+ "marginBottom": {
121
+ "type": "string",
122
+ "description": "标签下边距(src/Tag/index.tsx:58,136 实证:inline style 直接透传,用于 TagGroup 等批量排列场景控制行间距)"
123
+ },
124
+ "marginRight": {
125
+ "type": "string",
126
+ "description": "标签右边距(src/Tag/index.tsx:60,137 实证:inline style 直接透传,用于 TagGroup 等批量排列场景控制列间距)"
127
+ },
128
+ "className": {
129
+ "type": "string",
130
+ "description": "自定义类名(src/Tag/index.tsx:48 interface 声明,透传到根 span 元素)"
131
+ }
132
+ },
133
+ "do": [
134
+ "使用颜色区分不同类型的标签——状态徽章推荐:green=激活/成功、yellow=警告/待处理、red=错误/危险、blue=信息/默认、灰色用 hex '#808080'",
135
+ "使用 closable 实现标签的删除交互(visible 受控时父组件 setState 移除;非受控时 src 内部自动隐藏)",
136
+ "需要可编辑标签时直接传 editable={true} + tagChange 回调——Tag 内置 EditIcon + input 渲染逻辑,**不需要在 children 内手写原生 <input>**;children 为 string 时作为 input 初始值",
137
+ "**跨组件引用 Tag 表达状态色**:在 Table render / Form 选项渲染等场景,用 `<Tag color='green'>已激活</Tag>` 而非 inline style 兜底——预设 4 色已覆盖大多数状态语义"
138
+ ],
139
+ "dont": [
140
+ "在 Tag 中放置过长的文本",
141
+ "滥用 Tag 作为按钮使用",
142
+ "**不要在 editable 模式同时传 icon**——editable=true 时前缀位置改渲染 EditIcon,icon prop 被忽略;如需图标 + 编辑混用,需自实现",
143
+ "不要假设非预设色(hex / rgb / 'gray')有完整 hover/active CSS——非预设走 tinycolor 0.1 alpha 渲染,无专门样式"
144
+ ],
145
+ "events": {
146
+ "onClose": {
147
+ "signature": "(event: React.MouseEvent) => void",
148
+ "asyncSupported": false,
149
+ "examples": [
150
+ "受控关闭:onClose={(e) => setVisible(false)}",
151
+ "阻止默认隐藏(非受控场景):onClose={(e) => { e.preventDefault(); /* 自定义逻辑 */ }}",
152
+ "受控模式父组件删除标签:onClose={() => setTags(prev => prev.filter(t => t.id !== id))}"
153
+ ],
154
+ "commonMistakes": [
155
+ "不传 visible prop 时期望 onClose 后标签仍显示——未传 visible 时 Tag 内部自动 setVisible(false);要阻止需调 e.preventDefault()",
156
+ "假设 onClose 只在显式关闭时触发——Tag 本体 stopPropagation,但父元素 onClick 不受影响",
157
+ "忘记在受控模式(传了 visible)中通过 onClose 更新父 state——Tag 不会自动隐藏,需父组件响应 onClose 更新 visible"
158
+ ]
159
+ },
160
+ "onEdit": {
161
+ "signature": "(event: React.MouseEvent) => void",
162
+ "asyncSupported": false,
163
+ "examples": [
164
+ "监听编辑图标点击:onEdit={(e) => console.log('edit clicked')}",
165
+ "阻止进入内置编辑态:onEdit={(e) => { e.preventDefault(); openCustomEditModal(); }}"
166
+ ],
167
+ "commonMistakes": [
168
+ "期望 onEdit 是编辑完成后的回调——onEdit 是点击编辑图标时触发;编辑完成回调是 tagChange",
169
+ "同时传 onEdit 和 editable 却期望自定义完全替代内置 input——onEdit 调 e.preventDefault() 才能阻止切换 input"
170
+ ]
171
+ },
172
+ "tagChange": {
173
+ "signature": "(value: string) => void",
174
+ "asyncSupported": false,
175
+ "examples": [
176
+ "实时同步编辑值:tagChange={(v) => setTagValue(v)}",
177
+ "受控:在 tagChange 中更新父组件 state,children 随之变化(editable 模式下 children 是初始值)"
178
+ ],
179
+ "commonMistakes": [
180
+ "假设 tagChange 是 onBlur/Enter 确认后触发——实际是实时 onChange(每次键入都触发)",
181
+ "不传 tagChange 期望 Tag 自己保存编辑值——编辑完成后父组件 children 不更新则下次进入编辑态仍是旧初始值"
182
+ ]
183
+ },
184
+ "getWidth": {
185
+ "signature": "(width: number) => void",
186
+ "asyncSupported": false,
187
+ "examples": [
188
+ "获取标签实际渲染宽度:getWidth={(w) => setTagWidth(w)}"
189
+ ],
190
+ "commonMistakes": [
191
+ "期望 getWidth 实时响应容器宽度变化——实际只在挂载时和 inputVisible 变化时触发(不是 ResizeObserver)"
192
+ ]
193
+ }
194
+ },
195
+ "typescriptPitfalls": [
196
+ {
197
+ "issue": "TagProps extends React.HTMLAttributes<HTMLSpanElement>,onClick 等原生事件直接透传,不需要单独声明",
198
+ "wrong": "// 以为 Tag 没有 onClick,外层包一个 div:<div onClick={handleClick}><Tag>文本</Tag></div>",
199
+ "right": "<Tag onClick={handleClick}>文本</Tag> // HTMLAttributes 的所有事件都可直接传"
200
+ },
201
+ {
202
+ "issue": "editable 模式下 children 只作为编辑态初始值,不是受控值——父组件更新 children 不刷新已激活 input",
203
+ "wrong": "// 期望 children 变化实时反映到编辑 input 中\n<Tag editable tagChange={setVal}>{controlledValue}</Tag> // editInputVisible 激活后 children 更新不生效",
204
+ "right": "// 用 key 或在 tagChange 回调中维护 state:\nconst [val, setVal] = useState(initialValue);\n<Tag editable tagChange={setVal}>{val}</Tag> // 父组件维护 val,但注意切换编辑时仍取最新 children 作初始值"
205
+ },
206
+ {
207
+ "issue": "非预设色(hex/rgb/'gray' 等)走 tinycolor 渲染,TS 不报错但无完整 hover/active CSS",
208
+ "wrong": "color='gray' // TS 接受(string 类型),但没有专门 CSS,只有 tinycolor 0.1 alpha 背景",
209
+ "right": "// 预设色(有完整 CSS):color='blue' | 'green' | 'yellow' | 'red'\n// 非预设色自定义(通用渲染):color='#808080' // 接受但无专门 hover/active 样式"
210
+ },
211
+ {
212
+ "issue": "closable 半受控行为:未传 visible 时 onClose 自动隐藏;传了 visible 则需父组件主动响应 onClose",
213
+ "wrong": "// 传了 visible 但不响应 onClose:\n<Tag closable visible={isVisible} onClose={() => {}}>文本</Tag> // 点关闭后 Tag 不隐藏",
214
+ "right": "// 受控:onClose 更新父组件 state\n<Tag closable visible={isVisible} onClose={() => setIsVisible(false)}>文本</Tag>"
215
+ }
216
+ ],
217
+ "mapping": {
218
+ "realComponent": "Tag",
219
+ "adapter": null
220
+ }
221
+ }
package/lib/Tag/index.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.paraui-v4-tag-outline.paraui-v4-tag{border:.5px solid rgb(92,101,115)}.paraui-v4-tag-outline.paraui-v4-tag-blue{border:.5px solid rgb(46,101,230)}.paraui-v4-tag-outline.paraui-v4-tag-green{border:.5px solid rgb(19,191,76)}.paraui-v4-tag-outline.paraui-v4-tag-yellow{border:.5px solid rgb(255,147,38)}.paraui-v4-tag-outline.paraui-v4-tag-red{border:.5px solid rgb(244,66,66)}.paraui-v4-tag-edit-input{height:24px;align-self:flex-start;font-size:14px;color:#1d2126;text-indent:8px;border:1px solid rgb(46,101,230);border-radius:4px}.paraui-v4-tag{vertical-align:bottom;display:inline-flex;justify-content:center;align-items:center;max-width:100%;height:24px;padding:0 10px;font-size:14px;color:#1d2126;white-space:nowrap;background:#eaecf1;border-radius:2px;line-height:18px}.paraui-v4-tag .tag-custom-icon:hover{background:none!important;cursor:default}.paraui-v4-tag .tag-close-icon:hover{background-color:#d4dae3}.paraui-v4-tag .tag-edit-icon{display:flex}.paraui-v4-tag.paraui-v4-tag-small{height:20px;font-size:12px;padding:0 6px}.paraui-v4-tag.paraui-v4-tag-small>svg{font-size:12px}.paraui-v4-tag.paraui-v4-tag-small>svg+.paraui-v4-auto-tips{margin-left:2px}.paraui-v4-tag.paraui-v4-tag-small .tag-close-icon{margin-left:2px}.paraui-v4-tag.paraui-v4-tag-small .tag-edit-icon{font-size:12px}.paraui-v4-tag>svg{color:inherit;font-size:16px}.paraui-v4-tag .tag-edit-icon{color:inherit;font-size:16px;cursor:pointer}.paraui-v4-tag .tag-edit-icon>svg{color:#1d2126}.paraui-v4-tag .tag-close-icon{margin-left:4px;color:inherit;font-size:16px;cursor:pointer}.paraui-v4-tag .tag-close-icon:hover{color:inherit}.paraui-v4-tag>svg+.paraui-v4-auto-tips{margin-left:4px}.paraui-v4-tag.paraui-v4-tag-has-color,.paraui-v4-tag.paraui-v4-tag-has-color svg,.paraui-v4-tag.paraui-v4-tag-has-color svg:hover{color:inherit}.paraui-v4-tag.paraui-v4-tag-blue{color:#2e65e6;background-color:#2e65e61a}.paraui-v4-tag.paraui-v4-tag-green{color:#13bf4c;background-color:#13bf4c1a}.paraui-v4-tag.paraui-v4-tag-yellow{color:#ff9326;background-color:#ff93261a}.paraui-v4-tag.paraui-v4-tag-red{color:#f44242;background-color:#f442421a}.paraui-v4-tag.paraui-v4-tag-hidden{display:none}.paraui-v4-tag-small svg{font-size:12px}.paraui-v4-tag-group{display:flex;align-items:center;flex-flow:row wrap}.paraui-v4-tag-group .tag-group-input{height:24px;align-self:flex-start;font-size:14px;color:#1d2126;text-indent:8px;border:1px solid rgb(46,101,230);border-radius:4px}.paraui-v4-tag-group .tag-group-input .tag-group-input-large{height:28px}.paraui-v4-tag-group .tag-group-new .tag-group-new-icon{padding:0 5px}.paraui-v4-tag-group .tag-group-add-btn{border:1px dashed rgb(212,218,227)}.paraui-v4-tag-group .tag-group-add-btn .tag-edit-icon{background:none!important}.paraui-v4-tag-group .tag-group-add-btn:hover{cursor:pointer}.paraui-v4-tag-group .tag-group-add-btn:hover svg{color:#2e65e6}.paraui-v4-tag-group .tag-group-add-btn:hover .tag-text{color:#2e65e6}
1
+ @charset "UTF-8";.paraui-v4-tag-outline.paraui-v4-tag{border:.5px solid rgb(92,101,115)}.paraui-v4-tag-outline.paraui-v4-tag-blue{border:.5px solid rgb(46,101,230)}.paraui-v4-tag-outline.paraui-v4-tag-green{border:.5px solid rgb(19,191,76)}.paraui-v4-tag-outline.paraui-v4-tag-yellow{border:.5px solid rgb(255,147,38)}.paraui-v4-tag-outline.paraui-v4-tag-red{border:.5px solid rgb(244,66,66)}.paraui-v4-tag-edit-input{align-self:flex-start;height:24px;font-size:14px;color:#1d2126;text-indent:8px;border:1px solid rgb(46,101,230);border-radius:4px}.paraui-v4-tag{display:inline-flex;align-items:center;justify-content:center;max-width:100%;height:24px;padding:0 10px;font-size:14px;line-height:18px;color:#1d2126;white-space:nowrap;vertical-align:bottom;background:#eaecf1;border-radius:2px}.paraui-v4-tag .tag-custom-icon:hover{cursor:default;background:none!important}.paraui-v4-tag .tag-close-icon:hover{background-color:#d4dae3}.paraui-v4-tag .tag-edit-icon{display:flex}.paraui-v4-tag.paraui-v4-tag-large{line-height:28px}.paraui-v4-tag.paraui-v4-tag-medium{line-height:24px}.paraui-v4-tag.paraui-v4-tag-small{height:20px;padding:0 6px;font-size:12px}.paraui-v4-tag.paraui-v4-tag-small>svg{font-size:12px}.paraui-v4-tag.paraui-v4-tag-small>svg+.paraui-v4-auto-tips{margin-left:2px}.paraui-v4-tag.paraui-v4-tag-small .tag-close-icon{margin-left:2px}.paraui-v4-tag.paraui-v4-tag-small .tag-edit-icon{font-size:12px}.paraui-v4-tag>svg{font-size:16px;color:inherit}.paraui-v4-tag .tag-edit-icon{font-size:16px;color:inherit;cursor:pointer}.paraui-v4-tag .tag-edit-icon>svg{color:#1d2126}.paraui-v4-tag .tag-close-icon{margin-left:4px;font-size:16px;color:inherit;cursor:pointer}.paraui-v4-tag .tag-close-icon:hover{color:inherit}.paraui-v4-tag>svg+.paraui-v4-auto-tips{margin-left:4px}.paraui-v4-tag.paraui-v4-tag-has-color,.paraui-v4-tag.paraui-v4-tag-has-color svg,.paraui-v4-tag.paraui-v4-tag-has-color svg:hover{color:inherit}.paraui-v4-tag.paraui-v4-tag-blue{color:#2e65e6;background-color:#2e65e61a}.paraui-v4-tag.paraui-v4-tag-green{color:#13bf4c;background-color:#13bf4c1a}.paraui-v4-tag.paraui-v4-tag-yellow{color:#ff9326;background-color:#ff93261a}.paraui-v4-tag.paraui-v4-tag-red{color:#f44242;background-color:#f442421a}.paraui-v4-tag.paraui-v4-tag-hidden{display:none}.paraui-v4-tag-small svg{font-size:12px}.paraui-v4-tag-group{display:flex;flex-flow:row wrap;align-items:center}.paraui-v4-tag-group .tag-group-input{align-self:flex-start;height:24px;font-size:14px;color:#1d2126;text-indent:8px;border:1px solid rgb(46,101,230);border-radius:4px}.paraui-v4-tag-group .tag-group-input .tag-group-input-large{height:28px}.paraui-v4-tag-group .tag-group-new .tag-group-new-icon{padding:0 5px}.paraui-v4-tag-group .tag-group-add-btn{border:1px dashed rgb(212,218,227)}.paraui-v4-tag-group .tag-group-add-btn .tag-edit-icon{background:none!important}.paraui-v4-tag-group .tag-group-add-btn:hover{cursor:pointer}.paraui-v4-tag-group .tag-group-add-btn:hover svg{color:#2e65e6}.paraui-v4-tag-group .tag-group-add-btn:hover .tag-text{color:#2e65e6}
@@ -30,7 +30,7 @@ export interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
30
30
  /** cls */
31
31
  className?: string;
32
32
  /** 大小 */
33
- size?: 'small' | 'large';
33
+ size?: 'small' | 'medium' | 'large';
34
34
  /** 编辑输入框样式 */
35
35
  editInputClassName?: string;
36
36
  /** 编辑输入框宽度 */
package/lib/Tag/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('./index.css');const s=require("../_virtual/jsx-runtime.js"),n=require("react");require("../node_modules/@para-ui/icons/SvgIcon/index.js");const le=require("../node_modules/@para-ui/icons/Close/index.js"),ae=require("../node_modules/@para-ui/icons/EditOutline/index.js"),w=require("clsx"),ue=require("./TagGroup.js"),o=require("../GlobalContext/constant.js"),ce=require("../AutoTips/index.js"),p=require("../node_modules/tinycolor2/esm/tinycolor.js"),de=require("../Hooks/useGlobalProps.js");;/* empty css */const pe=["blue","green","yellow","red"],fe=a=>{const{type:f="normal",className:A,children:r,icon:u,color:t,onClose:G,onEdit:x,getWidth:g,tagChange:h,editInputClassName:F,closeIcon:m,closable:_=!1,editable:C=!1,size:E="larage",maxWidth:B,style:O,visible:R,editInputWidth:z,tipMaxWidth:D,marginBottom:j,marginRight:v,...K}=de.default(a,"TagGroup"),[H,b]=n.useState(!0),[I,$]=n.useState(!1),[y,S]=n.useState(""),[q,J]=n.useState(0),[Q,c]=n.useState(!1),[U,d]=n.useState(!1),X=n.useRef(),i=n.useRef(null);n.useEffect(()=>{"visible"in a&&b(!!R)},[R]),n.useEffect(()=>{if(!i.current)return;const{offsetWidth:e}=i.current;J(e),g&&g(e)},[i,I]),n.useEffect(()=>{typeof r=="string"&&S(r)},[r]);const l=()=>t?pe.includes(t):!1,Y={color:t&&!l()?t:void 0,backgroundColor:t&&!l()?p.default(t).setAlpha(.1).toRgbString():void 0,borderColor:t&&!l()&&f==="outline"?t:void 0,maxWidth:B,marginBottom:j,marginRight:v,...O},M={backgroundColor:Q?p.default(t).setAlpha(.1).toRgbString():void 0,borderRadius:"2px"},Z={backgroundColor:U?p.default(t).setAlpha(.1).toRgbString():void 0,marginRight:r?E==="small"?"2px":"4px":void 0,borderRadius:"2px"},ee=w(`${o.$prefixCls}-tag`,`${o.$prefixCls}-tag-${f}`,`${o.$prefixCls}-tag-${E}`,A,{[`${o.$prefixCls}-tag-has-color`]:t,[`${o.$prefixCls}-tag-hidden`]:!H,[`${o.$prefixCls}-tag-${t}`]:l()}),N=e=>{e.stopPropagation(),G?.(e),c(!1),!e.defaultPrevented&&("visible"in a||b(!1))},P=()=>{c(!0)},k=()=>{c(!1)},T=()=>{d(!0)},W=()=>{d(!1)},te=e=>{e.stopPropagation(),x&&x(e),!e.defaultPrevented&&(d(!1),$(!0))},se=()=>_?m?s.jsxRuntimeExports.jsx("span",{className:"tag-close-icon",style:M,onClick:N,onMouseEnter:P,onMouseLeave:k,children:m}):s.jsxRuntimeExports.jsx(le.Close,{className:"tag-close-icon",style:M,onClick:N,onMouseEnter:P,onMouseLeave:k}):null,ne=()=>(C||u)&&s.jsxRuntimeExports.jsx("span",{className:`tag-edit-icon ${u?"tag-custom-icon":""}`,style:Z,onMouseEnter:T,onMouseLeave:W,children:C?s.jsxRuntimeExports.jsx(ae.EditOutline,{onMouseEnter:T,onMouseLeave:W,className:"tag-edit-icon",onClick:te}):s.jsxRuntimeExports.jsx(s.jsxRuntimeExports.Fragment,{children:u})}),oe=e=>{S(e.target.value),h&&h(e.target.value)},L=()=>{$(!1)},re=e=>{(e.keyCode===13||e.which===13)&&L()},ie=()=>{const e=w(`${o.$prefixCls}-tag-edit-input`,F);return s.jsxRuntimeExports.jsx("input",{style:{width:z||q,minWidth:q,marginBottom:j,marginRight:v},type:"text",autoFocus:!0,ref:X,className:e,value:y,onChange:oe,onBlur:L,onKeyDown:re})};return s.jsxRuntimeExports.jsx(s.jsxRuntimeExports.Fragment,{children:I?ie():s.jsxRuntimeExports.jsxs("span",{...K,className:ee,style:Y,ref:i,children:[ne(),r&&s.jsxRuntimeExports.jsx(ce.default,{tipMaxWidth:D,children:s.jsxRuntimeExports.jsx("span",{className:"tag-text",children:y||r})}),se()]})})},V=fe;exports.TagGroup=ue.default;exports.Tag=V;exports.default=V;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('./index.css');const s=require("../_virtual/jsx-runtime.js"),n=require("react");require("../node_modules/@para-ui/icons/SvgIcon/index.js");const le=require("../node_modules/@para-ui/icons/Close/index.js"),ae=require("../node_modules/@para-ui/icons/EditOutline/index.js"),w=require("clsx"),ue=require("./TagGroup.js"),o=require("../GlobalContext/constant.js"),ce=require("../AutoTips/index.js"),p=require("../node_modules/tinycolor2/esm/tinycolor.js"),de=require("../Hooks/useGlobalProps.js");;/* empty css */const pe=["blue","green","yellow","red"],fe=a=>{const{type:f="normal",className:A,children:r,icon:u,color:t,onClose:G,onEdit:x,getWidth:g,tagChange:h,editInputClassName:F,closeIcon:m,closable:_=!1,editable:C=!1,size:E="small",maxWidth:B,style:O,visible:R,editInputWidth:z,tipMaxWidth:D,marginBottom:j,marginRight:v,...K}=de.default(a,"TagGroup"),[H,b]=n.useState(!0),[I,$]=n.useState(!1),[y,S]=n.useState(""),[q,J]=n.useState(0),[Q,c]=n.useState(!1),[U,d]=n.useState(!1),X=n.useRef(),i=n.useRef(null);n.useEffect(()=>{"visible"in a&&b(!!R)},[R]),n.useEffect(()=>{if(!i.current)return;const{offsetWidth:e}=i.current;J(e),g&&g(e)},[i,I]),n.useEffect(()=>{typeof r=="string"&&S(r)},[r]);const l=()=>t?pe.includes(t):!1,Y={color:t&&!l()?t:void 0,backgroundColor:t&&!l()?p.default(t).setAlpha(.1).toRgbString():void 0,borderColor:t&&!l()&&f==="outline"?t:void 0,maxWidth:B,marginBottom:j,marginRight:v,...O},M={backgroundColor:Q?p.default(t).setAlpha(.1).toRgbString():void 0,borderRadius:"2px"},Z={backgroundColor:U?p.default(t).setAlpha(.1).toRgbString():void 0,marginRight:r?E==="small"?"2px":"4px":void 0,borderRadius:"2px"},ee=w(`${o.$prefixCls}-tag`,`${o.$prefixCls}-tag-${f}`,`${o.$prefixCls}-tag-${E}`,A,{[`${o.$prefixCls}-tag-has-color`]:t,[`${o.$prefixCls}-tag-hidden`]:!H,[`${o.$prefixCls}-tag-${t}`]:l()}),N=e=>{e.stopPropagation(),G?.(e),c(!1),!e.defaultPrevented&&("visible"in a||b(!1))},P=()=>{c(!0)},k=()=>{c(!1)},T=()=>{d(!0)},W=()=>{d(!1)},te=e=>{e.stopPropagation(),x&&x(e),!e.defaultPrevented&&(d(!1),$(!0))},se=()=>_?m?s.jsxRuntimeExports.jsx("span",{className:"tag-close-icon",style:M,onClick:N,onMouseEnter:P,onMouseLeave:k,children:m}):s.jsxRuntimeExports.jsx(le.Close,{className:"tag-close-icon",style:M,onClick:N,onMouseEnter:P,onMouseLeave:k}):null,ne=()=>(C||u)&&s.jsxRuntimeExports.jsx("span",{className:`tag-edit-icon ${u?"tag-custom-icon":""}`,style:Z,onMouseEnter:T,onMouseLeave:W,children:C?s.jsxRuntimeExports.jsx(ae.EditOutline,{onMouseEnter:T,onMouseLeave:W,className:"tag-edit-icon",onClick:te}):s.jsxRuntimeExports.jsx(s.jsxRuntimeExports.Fragment,{children:u})}),oe=e=>{S(e.target.value),h&&h(e.target.value)},L=()=>{$(!1)},re=e=>{(e.keyCode===13||e.which===13)&&L()},ie=()=>{const e=w(`${o.$prefixCls}-tag-edit-input`,F);return s.jsxRuntimeExports.jsx("input",{style:{width:z||q,minWidth:q,marginBottom:j,marginRight:v},type:"text",autoFocus:!0,ref:X,className:e,value:y,onChange:oe,onBlur:L,onKeyDown:re})};return s.jsxRuntimeExports.jsx(s.jsxRuntimeExports.Fragment,{children:I?ie():s.jsxRuntimeExports.jsxs("span",{...K,className:ee,style:Y,ref:i,children:[ne(),r&&s.jsxRuntimeExports.jsx(ce.default,{tipMaxWidth:D,children:s.jsxRuntimeExports.jsx("span",{className:"tag-text",children:y||r})}),se()]})})},V=fe;exports.TagGroup=ue.default;exports.Tag=V;exports.default=V;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- .paraui-v4-tag-outline.paraui-v4-tag{border:.5px solid #5c6573}.paraui-v4-tag-outline.paraui-v4-tag-blue{border:.5px solid #2e65e6}.paraui-v4-tag-outline.paraui-v4-tag-green{border:.5px solid #13bf4c}.paraui-v4-tag-outline.paraui-v4-tag-yellow{border:.5px solid #ff9326}.paraui-v4-tag-outline.paraui-v4-tag-red{border:.5px solid #f44242}.paraui-v4-tag-edit-input{height:24px;align-self:flex-start;font-size:14px;color:#1d2126;text-indent:8px;border:1px solid #2e65e6;border-radius:4px}.paraui-v4-tag{vertical-align:bottom;display:inline-flex;justify-content:center;align-items:center;max-width:100%;height:24px;padding:0 10px;font-size:14px;color:#1d2126;white-space:nowrap;background:#eaecf1;border-radius:2px;line-height:18px}.paraui-v4-tag .tag-custom-icon:hover{background:none !important;cursor:default}.paraui-v4-tag .tag-close-icon:hover{background-color:#d4dae3}.paraui-v4-tag .tag-edit-icon{display:flex}.paraui-v4-tag.paraui-v4-tag-small{height:20px;font-size:12px;padding:0 6px}.paraui-v4-tag.paraui-v4-tag-small>svg{font-size:12px}.paraui-v4-tag.paraui-v4-tag-small>svg+.paraui-v4-auto-tips{margin-left:2px}.paraui-v4-tag.paraui-v4-tag-small .tag-close-icon{margin-left:2px}.paraui-v4-tag.paraui-v4-tag-small .tag-edit-icon{font-size:12px}.paraui-v4-tag>svg{color:inherit;font-size:16px}.paraui-v4-tag .tag-edit-icon{color:inherit;font-size:16px;cursor:pointer}.paraui-v4-tag .tag-edit-icon>svg{color:#1d2126}.paraui-v4-tag .tag-close-icon{margin-left:4px;color:inherit;font-size:16px;cursor:pointer}.paraui-v4-tag .tag-close-icon:hover{color:inherit}.paraui-v4-tag>svg+.paraui-v4-auto-tips{margin-left:4px}.paraui-v4-tag.paraui-v4-tag-has-color,.paraui-v4-tag.paraui-v4-tag-has-color svg,.paraui-v4-tag.paraui-v4-tag-has-color svg:hover{color:inherit}.paraui-v4-tag.paraui-v4-tag-blue{color:#2e65e6;background-color:rgba(46,101,230,.1)}.paraui-v4-tag.paraui-v4-tag-green{color:#13bf4c;background-color:rgba(19,191,76,.1)}.paraui-v4-tag.paraui-v4-tag-yellow{color:#ff9326;background-color:rgba(255,147,38,.1)}.paraui-v4-tag.paraui-v4-tag-red{color:#f44242;background-color:rgba(244,66,66,.1)}.paraui-v4-tag.paraui-v4-tag-hidden{display:none}.paraui-v4-tag-small svg{font-size:12px}.paraui-v4-tag-group{display:flex;align-items:center;flex-flow:row wrap}.paraui-v4-tag-group .tag-group-input{height:24px;align-self:flex-start;font-size:14px;color:#1d2126;text-indent:8px;border:1px solid #2e65e6;border-radius:4px}.paraui-v4-tag-group .tag-group-input .tag-group-input-large{height:28px}.paraui-v4-tag-group .tag-group-new .tag-group-new-icon{padding:0 5px}.paraui-v4-tag-group .tag-group-add-btn{border:1px dashed #d4dae3}.paraui-v4-tag-group .tag-group-add-btn .tag-edit-icon{background:none !important}.paraui-v4-tag-group .tag-group-add-btn:hover{cursor:pointer}.paraui-v4-tag-group .tag-group-add-btn:hover svg{color:#2e65e6}.paraui-v4-tag-group .tag-group-add-btn:hover .tag-text{color:#2e65e6}
1
+ .paraui-v4-tag-outline.paraui-v4-tag{border:.5px solid #5c6573}.paraui-v4-tag-outline.paraui-v4-tag-blue{border:.5px solid #2e65e6}.paraui-v4-tag-outline.paraui-v4-tag-green{border:.5px solid #13bf4c}.paraui-v4-tag-outline.paraui-v4-tag-yellow{border:.5px solid #ff9326}.paraui-v4-tag-outline.paraui-v4-tag-red{border:.5px solid #f44242}.paraui-v4-tag-edit-input{align-self:flex-start;height:24px;font-size:14px;color:#1d2126;text-indent:8px;border:1px solid #2e65e6;border-radius:4px}.paraui-v4-tag{display:inline-flex;align-items:center;justify-content:center;max-width:100%;height:24px;padding:0 10px;font-size:14px;line-height:18px;color:#1d2126;white-space:nowrap;vertical-align:bottom;background:#eaecf1;border-radius:2px}.paraui-v4-tag .tag-custom-icon:hover{cursor:default;background:none !important}.paraui-v4-tag .tag-close-icon:hover{background-color:#d4dae3}.paraui-v4-tag .tag-edit-icon{display:flex}.paraui-v4-tag.paraui-v4-tag-large{line-height:28px}.paraui-v4-tag.paraui-v4-tag-medium{line-height:24px}.paraui-v4-tag.paraui-v4-tag-small{height:20px;padding:0 6px;font-size:12px}.paraui-v4-tag.paraui-v4-tag-small>svg{font-size:12px}.paraui-v4-tag.paraui-v4-tag-small>svg+.paraui-v4-auto-tips{margin-left:2px}.paraui-v4-tag.paraui-v4-tag-small .tag-close-icon{margin-left:2px}.paraui-v4-tag.paraui-v4-tag-small .tag-edit-icon{font-size:12px}.paraui-v4-tag>svg{font-size:16px;color:inherit}.paraui-v4-tag .tag-edit-icon{font-size:16px;color:inherit;cursor:pointer}.paraui-v4-tag .tag-edit-icon>svg{color:#1d2126}.paraui-v4-tag .tag-close-icon{margin-left:4px;font-size:16px;color:inherit;cursor:pointer}.paraui-v4-tag .tag-close-icon:hover{color:inherit}.paraui-v4-tag>svg+.paraui-v4-auto-tips{margin-left:4px}.paraui-v4-tag.paraui-v4-tag-has-color,.paraui-v4-tag.paraui-v4-tag-has-color svg,.paraui-v4-tag.paraui-v4-tag-has-color svg:hover{color:inherit}.paraui-v4-tag.paraui-v4-tag-blue{color:#2e65e6;background-color:rgba(46,101,230,.1)}.paraui-v4-tag.paraui-v4-tag-green{color:#13bf4c;background-color:rgba(19,191,76,.1)}.paraui-v4-tag.paraui-v4-tag-yellow{color:#ff9326;background-color:rgba(255,147,38,.1)}.paraui-v4-tag.paraui-v4-tag-red{color:#f44242;background-color:rgba(244,66,66,.1)}.paraui-v4-tag.paraui-v4-tag-hidden{display:none}.paraui-v4-tag-small svg{font-size:12px}.paraui-v4-tag-group{display:flex;flex-flow:row wrap;align-items:center}.paraui-v4-tag-group .tag-group-input{align-self:flex-start;height:24px;font-size:14px;color:#1d2126;text-indent:8px;border:1px solid #2e65e6;border-radius:4px}.paraui-v4-tag-group .tag-group-input .tag-group-input-large{height:28px}.paraui-v4-tag-group .tag-group-new .tag-group-new-icon{padding:0 5px}.paraui-v4-tag-group .tag-group-add-btn{border:1px dashed #d4dae3}.paraui-v4-tag-group .tag-group-add-btn .tag-edit-icon{background:none !important}.paraui-v4-tag-group .tag-group-add-btn:hover{cursor:pointer}.paraui-v4-tag-group .tag-group-add-btn:hover svg{color:#2e65e6}.paraui-v4-tag-group .tag-group-add-btn:hover .tag-text{color:#2e65e6}
@@ -0,0 +1,186 @@
1
+ {
2
+ "name": "TextEditor",
3
+ "category": "Data Entry",
4
+ "description": "基于 wangEditor 的富文本编辑器,支持图片/视频上传与自定义工具栏",
5
+ "semantic": {
6
+ "intent": [
7
+ "富文本编辑",
8
+ "内容创作"
9
+ ],
10
+ "useCases": [
11
+ "文章编辑",
12
+ "邮件编辑",
13
+ "公告发布"
14
+ ],
15
+ "riskLevel": "normal"
16
+ },
17
+ "variants": {
18
+ "default": {
19
+ "meaning": "默认样式"
20
+ }
21
+ },
22
+ "states": [
23
+ "default",
24
+ "disabled",
25
+ "readonly"
26
+ ],
27
+ "idealProps": {
28
+ "server": {
29
+ "type": "string",
30
+ "required": true,
31
+ "description": "⚠️ 必传。文件上传服务地址(string 无问号);**即使不上传图片/视频也必须传占位 url(如 /api/noop)**;不传 TS 报错。占位场景安全:仅在用户主动插入图片/视频时才触发上传请求,纯文字编辑不会请求"
32
+ },
33
+ "value": {
34
+ "type": "string",
35
+ "description": "受控 HTML 字符串(配 onChange)"
36
+ },
37
+ "defaultValue": {
38
+ "type": "string",
39
+ "description": "非受控初始 HTML 字符串(配 ref 拿值);**也可与 onChange 同时使用监听变化,不互斥**"
40
+ },
41
+ "onChange": {
42
+ "type": "function",
43
+ "description": "(value: string, text: string) => void 内容变化回调;受控/非受控均可用"
44
+ },
45
+ "toolbarKeys": {
46
+ "type": "array",
47
+ "description": "完整工具栏菜单白名单(覆盖默认;空数组进入预览模式)。常用 menuKey:bold/italic/underline/bulletedList/numberedList/insertLink/uploadImage;详见 api.ts toolbarKeys 列出的完整 key"
48
+ },
49
+ "excludeKeys": {
50
+ "type": "array",
51
+ "description": "从默认工具栏排除的菜单 key 数组"
52
+ },
53
+ "max": {
54
+ "type": "number",
55
+ "description": "纯文本最大字符数"
56
+ },
57
+ "label": {
58
+ "type": "ReactNode",
59
+ "description": "编辑器顶部标题"
60
+ },
61
+ "placeholder": {
62
+ "type": "string",
63
+ "default": "请输入内容",
64
+ "description": "空内容占位文案"
65
+ },
66
+ "required": {
67
+ "type": "boolean",
68
+ "default": "false",
69
+ "description": "UI 必填标记"
70
+ },
71
+ "readOnly": {
72
+ "type": "boolean",
73
+ "default": "false",
74
+ "description": "只读模式(展示语义)"
75
+ },
76
+ "disabled": {
77
+ "type": "boolean",
78
+ "default": "false",
79
+ "description": "禁用模式(权限语义;内部强制 readOnly)"
80
+ },
81
+ "uploadImage": {
82
+ "type": "object",
83
+ "description": "图片上传配置 Partial<UpLoadImgConfig>"
84
+ },
85
+ "in18": {
86
+ "type": "enum",
87
+ "values": [
88
+ "en",
89
+ "zh-CN"
90
+ ],
91
+ "description": "国际化语言。**⚠️ src prop 名是 in18(历史 typo · 实际应为 i18n);写 i18n 不会切换语言也不报错**"
92
+ }
93
+ },
94
+ "do": [
95
+ "受控模式传 value + onChange 保持内容同步;非受控模式传 defaultValue + ref 拿值",
96
+ "server 必传:即使纯文字场景也要传占位 URL(如 /api/noop),否则 TS 报错",
97
+ "用 ref 调用命令式 API(getContent/getText/clearEditor/setContent)而非直接操控 DOM",
98
+ "toolbarKeys=[] 可切换到预览模式(只读展示,无工具栏),适合详情页展示富文本内容",
99
+ "in18 属性控制工具栏语言,注意 prop 名是 in18(历史 typo,不是 i18n)",
100
+ "需要限制字数时用 max 属性(对应 wangEditor maxLength,按纯文本字符数计算)"
101
+ ],
102
+ "dont": [
103
+ "不要同时传 value + defaultValue(受控/非受控不能混用)",
104
+ "不要忘记 server 属性——即使不上传图片也必须传占位 URL,否则 TS 类型错误",
105
+ "不要把 onChange 回调中的 value 直接 dangerouslySetInnerHTML 展示——须经 XSS 过滤",
106
+ "不要在 onBlur/onFocus 中直接操作 editor 实例的 DOM,应通过 IDomEditor 提供的 API",
107
+ "不要在组件卸载后访问 ref.current(组件内部已在 useEffect cleanup 中 destroy editor)"
108
+ ],
109
+ "events": {
110
+ "onChange": {
111
+ "signature": "(value: string, text: string) => void",
112
+ "asyncSupported": false,
113
+ "examples": [
114
+ "内容变化时触发:value 是 HTML 字符串(getHtml()),text 是纯文本(getText())",
115
+ "受控模式:onChange 中调用 setState 更新 value prop,实现受控回路",
116
+ "字数统计:用 text.length 而非 value.length(HTML 含标签字符会计入 value.length)"
117
+ ],
118
+ "commonMistakes": [
119
+ "假设 value 参数是纯文本——value 实际是 HTML 字符串,纯文本用第二参 text",
120
+ "受控模式下不在 onChange 中更新 value prop——导致编辑器内容反复跳回",
121
+ "初始化时 defaultValue 设置后 onChange 也会触发——内部 valueRef 机制防抖,但需注意初始渲染的 HTML 等价性检查"
122
+ ]
123
+ },
124
+ "onBlur": {
125
+ "signature": "(editor: IDomEditor) => void",
126
+ "asyncSupported": false,
127
+ "examples": [
128
+ "失焦时触发:editor 是 wangEditor IDomEditor 实例,可通过 editor.getHtml() 获取最新内容",
129
+ "表单校验场景:在 onBlur 中调用父表单的校验方法",
130
+ "自动保存:onBlur 时发送草稿保存请求"
131
+ ],
132
+ "commonMistakes": [
133
+ "假设 onBlur 时内容一定与 onChange 最后一次触发一致——如果内容没变 onChange 不触发,onBlur 仍会触发",
134
+ "在 onBlur 中直接调用 editor.destroy()——组件内部有自己的生命周期管理,外部不要手动销毁"
135
+ ]
136
+ },
137
+ "onFocus": {
138
+ "signature": "(editor: IDomEditor) => void",
139
+ "asyncSupported": false,
140
+ "examples": [
141
+ "聚焦时触发:editor 是 IDomEditor 实例",
142
+ "显示字数统计 UI:onFocus 时展示计数条"
143
+ ],
144
+ "commonMistakes": [
145
+ "在 onFocus 中调用 editor.focus() 会造成递归触发——已经聚焦不要再次 focus"
146
+ ]
147
+ },
148
+ "onDestroyed": {
149
+ "signature": "(editor: IDomEditor) => void",
150
+ "asyncSupported": false,
151
+ "examples": [
152
+ "编辑器实例销毁时触发(组件卸载时内部调用 editor.destroy())",
153
+ "用于清理与 editor 实例关联的外部副作用(如自定义菜单注册)"
154
+ ],
155
+ "commonMistakes": [
156
+ "在 onDestroyed 中访问 editor.getHtml()——销毁时内部 editor 状态可能已清空"
157
+ ]
158
+ }
159
+ },
160
+ "typescriptPitfalls": [
161
+ {
162
+ "issue": "prop 名是 in18 不是 i18n(历史拼写 typo)",
163
+ "wrong": "// 写 i18n 不报错但不生效\n<TextEditor i18n='en' server='/api/upload' />",
164
+ "right": "<TextEditor in18='en' server='/api/upload' /> // 注意是 in18,不是 i18n"
165
+ },
166
+ {
167
+ "issue": "server 属性是必填的,即使不上传图片也要传",
168
+ "wrong": "// 缺少 server 会导致 TS 类型错误 'Property server is missing'\n<TextEditor value={html} onChange={setHtml} />",
169
+ "right": "<TextEditor value={html} onChange={setHtml} server='/api/upload' />"
170
+ },
171
+ {
172
+ "issue": "useRef 拿 TextEditorRef 类型时需正确声明泛型",
173
+ "wrong": "const ref = useRef(null); ref.current.getContent(); // ref.current 为 null,TS 报错",
174
+ "right": "import { TextEditorRef } from '@para-ui/core'; const ref = useRef<TextEditorRef>(null); ref.current?.getContent();"
175
+ },
176
+ {
177
+ "issue": "onChange 第一参是 HTML 字符串不是纯文本",
178
+ "wrong": "onChange={(value) => setCount(value.length)} // value.length 包含 HTML 标签字符数",
179
+ "right": "onChange={(value, text) => setCount(text.length)} // 用第二参 text 获取纯文本长度"
180
+ }
181
+ ],
182
+ "mapping": {
183
+ "realComponent": "TextEditor",
184
+ "adapter": null
185
+ }
186
+ }
@@ -34,19 +34,19 @@ export interface UpLoadImgConfig {
34
34
  /** 5 * 1024(5kb) */
35
35
  base64LimitSize: number;
36
36
  /** 单个文件上传成功之后 */
37
- onSuccess: (file: File, res: any) => void;
37
+ onSuccess: (file: File, res: unknown) => void;
38
38
  /** 单个文件上传失败 */
39
- onFailed: (file: File, res: any) => void;
39
+ onFailed: (file: File, res: unknown) => void;
40
40
  /** 上传进度回调 */
41
41
  onProgress: (progress: number) => void;
42
42
  /** 上传之前触发 */
43
- onBeforeUpload: (file: File) => any;
43
+ onBeforeUpload: (file: File) => unknown;
44
44
  /** 上传错误,或者触发 timeout 超时 */
45
- onError: (file: File, err: any, res: any) => void;
45
+ onError: (file: File, err: unknown, res: unknown) => void;
46
46
  /** 用户自定义图片上传 */
47
47
  customUpload: (file: File, insertFn: InsertFnType) => void;
48
48
  /** 用户自定义图片插入 */
49
- customInsert: (res: any, insertFn: InsertFnType) => void;
49
+ customInsert: (res: unknown, insertFn: InsertFnType) => void;
50
50
  }
51
51
  export type UpLoadVideoConfig = Omit<UpLoadImgConfig, 'base64LimitSize'>;
52
52
  export interface TextEditorProps extends HelperTextDetailProps {
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('../node_modules/@wangeditor/editor/dist/css/style.css');require('./index.css');const o=require("../_virtual/jsx-runtime.js"),t=require("react"),le=require("../Label/index.js"),T=require("@wangeditor/editor-for-react"),ae=require("@wangeditor/editor"),ie=require("../HelperText/index.js"),ce=require("../GlobalContext/constant.js"),de=require("./common.js"),fe=require("@paraview/lib"),me=require("../GlobalContext/useFormatMessage.js"),xe=require("./lang/index.js");;/* empty css */;/* empty css */const ge=t.forwardRef((d,S)=>{const N=me.default("TextEditor",xe.default),{style:F,toolbarStyle:H={},editorStyle:$={height:"300px",overflowY:"hidden"},hideErrorDom:M,className:f,error:m,server:x,helperText:_,required:g,labelSign:C,label:u,labelTooltip:s,placeholder:B=N({id:"pleaseEnter"}),onChange:E,onFocus:b,onBlur:p,onDestroyed:v,readOnly:I=!1,autoFocus:L=!1,max:O,in18:l,defaultValue:h,value:n,excludeKeys:w,insertKeys:D,toolbarKeys:a=de.TOOL_BAR_CONFIG,uploadImage:K={base64LimitSize:5*1024*1024,timeout:15*1e3},uploadVideo:V={timeout:15*1e3},disabled:y}=d,i=t.useRef(""),[r,q]=t.useState(null),[P,c]=t.useState(""),[U,k]=t.useState(fe.UUID),[z,A]=t.useState(!1);t.useEffect(()=>{A(a.length<1)},[a]);const G=e=>{b&&b(e)},Y=e=>{p&&p(e)},J=e=>{v&&v(e)},Q=e=>{d.value===void 0&&c(e.getHtml()),i.current!==e.getHtml()&&(i.current=e.getHtml(),E&&E(e.getHtml(),e.getText()))},W={excludeKeys:w,toolbarKeys:a,insertKeys:D},X={placeholder:B,onFocus:G,onBlur:Y,onDestroyed:J,readOnly:I,autoFocus:L,maxLength:O,MENU_CONF:{uploadImage:{...K,server:x},uploadVideo:{...V,server:x}}};t.useEffect(()=>{l&&ae.i18nChangeLanguage(l),k(Math.random().toString(36).slice(-8))},[l]),t.useEffect(()=>{h!==void 0&&c(h)},[]),t.useEffect(()=>{n!==void 0&&c(n),i.current=n||""},[n]),t.useEffect(()=>{y?r?.disable():r?.enable()},[y]);const Z=()=>{if(r)return r.getHtml()},ee=()=>{if(r)return r.getText()},te=()=>{r&&r.clear()},re=e=>{r&&(r.setHtml(e),setTimeout(()=>{r.focus(!0)}))},oe=()=>r;t.useEffect(()=>()=>{r!=null&&(r.destroy(),q(null))},[r]),t.useImperativeHandle(S,()=>({getContent:Z,getText:ee,clearEditor:te,setContent:re,getEditor:oe}));const se=()=>{let e=`${ce.$prefixCls}-text-editor`;return f&&(e+=` ${f}`),m&&(e+=" is-error"),e},ne=t.useMemo(()=>{const e=()=>{let R="text-editor-label";return s&&s.className&&(R+=` ${s.className}`),R};return u?o.jsxRuntimeExports.jsx(le.default,{label:u,required:g,labelSign:C,...s,className:e()}):null},[u,C,g,s]),j=t.useRef(!1),ue=t.useCallback(e=>{j.current||q(e)},[]);return t.useEffect(()=>()=>{j.current=!0},[]),o.jsxRuntimeExports.jsxs("div",{className:se(),style:F,children:[ne,o.jsxRuntimeExports.jsxs("div",{className:`text-editor-content ${z?"preview-mode":""}`,children:[o.jsxRuntimeExports.jsx(T.Toolbar,{editor:r,defaultConfig:W,mode:"default",style:H},U),o.jsxRuntimeExports.jsx(T.Editor,{defaultConfig:X,value:P,onCreated:ue,onChange:Q,mode:"default",style:$})]}),o.jsxRuntimeExports.jsx(ie.default,{className:"text-editor-error-text",error:m,helperText:_,hideErrorDom:M})]})});exports.default=ge;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('../node_modules/@wangeditor/editor/dist/css/style.css');require('./index.css');const o=require("../_virtual/jsx-runtime.js"),t=require("react"),le=require("../Label/index.js"),T=require("@wangeditor/editor-for-react"),ae=require("@wangeditor/editor"),ie=require("../HelperText/index.js"),ce=require("../GlobalContext/constant.js"),de=require("./common.js"),fe=require("@snack-kit/lib"),me=require("../GlobalContext/useFormatMessage.js"),xe=require("./lang/index.js");;/* empty css */;/* empty css */const ge=t.forwardRef((d,S)=>{const N=me.default("TextEditor",xe.default),{style:F,toolbarStyle:H={},editorStyle:M={height:"300px",overflowY:"hidden"},hideErrorDom:_,className:f,error:m,server:x,helperText:B,required:g,labelSign:C,label:u,labelTooltip:s,placeholder:I=N({id:"pleaseEnter"}),onChange:E,onFocus:b,onBlur:p,onDestroyed:v,readOnly:L=!1,autoFocus:O=!1,max:$,in18:l,defaultValue:h,value:n,excludeKeys:w,insertKeys:D,toolbarKeys:a=de.TOOL_BAR_CONFIG,uploadImage:K={base64LimitSize:5*1024*1024,timeout:15*1e3},uploadVideo:V={timeout:15*1e3},disabled:y}=d,i=t.useRef(""),[r,j]=t.useState(null),[P,c]=t.useState(""),[U,k]=t.useState(fe.UUID),[z,A]=t.useState(!1);t.useEffect(()=>{A(a.length<1)},[a]);const G=e=>{b&&b(e)},Y=e=>{p&&p(e)},J=e=>{v&&v(e)},Q=e=>{d.value===void 0&&c(e.getHtml()),i.current!==e.getHtml()&&(i.current=e.getHtml(),E&&E(e.getHtml(),e.getText()))},W={excludeKeys:w,toolbarKeys:a,insertKeys:D},X={placeholder:I,onFocus:G,onBlur:Y,onDestroyed:J,readOnly:L,autoFocus:O,maxLength:$,MENU_CONF:{uploadImage:{...K,server:x},uploadVideo:{...V,server:x}}};t.useEffect(()=>{l&&ae.i18nChangeLanguage(l),k(Math.random().toString(36).slice(-8))},[l]),t.useEffect(()=>{h!==void 0&&c(h)},[]),t.useEffect(()=>{n!==void 0&&c(n),i.current=n||""},[n]),t.useEffect(()=>{y?r?.disable():r?.enable()},[y]);const Z=()=>{if(r)return r.getHtml()},ee=()=>{if(r)return r.getText()},te=()=>{r&&r.clear()},re=e=>{r&&(r.setHtml(e),setTimeout(()=>{r.focus(!0)}))},oe=()=>r;t.useEffect(()=>()=>{r!=null&&(r.destroy(),j(null))},[r]),t.useImperativeHandle(S,()=>({getContent:Z,getText:ee,clearEditor:te,setContent:re,getEditor:oe}));const se=()=>{let e=`${ce.$prefixCls}-text-editor`;return f&&(e+=` ${f}`),m&&(e+=" is-error"),e},ne=t.useMemo(()=>{const e=()=>{let R="text-editor-label";return s&&s.className&&(R+=` ${s.className}`),R};return u?o.jsxRuntimeExports.jsx(le.default,{label:u,required:g,labelSign:C,...s,className:e()}):null},[u,C,g,s]),q=t.useRef(!1),ue=t.useCallback(e=>{q.current||j(e)},[]);return t.useEffect(()=>()=>{q.current=!0},[]),o.jsxRuntimeExports.jsxs("div",{className:se(),style:F,children:[ne,o.jsxRuntimeExports.jsxs("div",{className:`text-editor-content ${z?"preview-mode":""}`,children:[o.jsxRuntimeExports.jsx(T.Toolbar,{editor:r,defaultConfig:W,mode:"default",style:H},U),o.jsxRuntimeExports.jsx(T.Editor,{defaultConfig:X,value:P,onCreated:ue,onChange:Q,mode:"default",style:M})]}),o.jsxRuntimeExports.jsx(ie.default,{className:"text-editor-error-text",error:m,helperText:B,hideErrorDom:_})]})});exports.default=ge;
2
2
  //# sourceMappingURL=index.js.map