amis 1.4.2-beta.6 → 1.5.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 (488) hide show
  1. package/lib/Schema.d.ts +11 -3
  2. package/lib/Schema.js.map +1 -1
  3. package/lib/components/Alert2.d.ts +26 -21
  4. package/lib/components/Alert2.js +11 -4
  5. package/lib/components/Alert2.js.map +2 -2
  6. package/lib/components/AnchorNav.d.ts +22 -21
  7. package/lib/components/AnchorNav.js +7 -3
  8. package/lib/components/AnchorNav.js.map +2 -2
  9. package/lib/components/ArrayInput.d.ts +84 -84
  10. package/lib/components/AssociatedSelection.d.ts +930 -0
  11. package/lib/components/AssociatedSelection.js +89 -0
  12. package/lib/components/AssociatedSelection.js.map +13 -0
  13. package/lib/components/Badge.js +2 -2
  14. package/lib/components/Badge.js.map +2 -2
  15. package/lib/components/Button.js +1 -1
  16. package/lib/components/Button.js.map +2 -2
  17. package/lib/components/{ChainedCheckboxes.d.ts → ChainedSelection.d.ts} +267 -98
  18. package/lib/components/{ChainedCheckboxes.js → ChainedSelection.js} +30 -24
  19. package/lib/components/ChainedSelection.js.map +13 -0
  20. package/lib/components/Checkbox.d.ts +20 -20
  21. package/lib/components/Collapse.d.ts +51 -23
  22. package/lib/components/Collapse.js +70 -11
  23. package/lib/components/Collapse.js.map +2 -2
  24. package/lib/components/CollapseGroup.d.ts +88 -0
  25. package/lib/components/CollapseGroup.js +81 -0
  26. package/lib/components/CollapseGroup.js.map +13 -0
  27. package/lib/components/ColorPicker.d.ts +89 -85
  28. package/lib/components/ColorPicker.js +17 -4
  29. package/lib/components/ColorPicker.js.map +2 -2
  30. package/lib/components/DatePicker.d.ts +84 -84
  31. package/lib/components/DateRangePicker.d.ts +84 -84
  32. package/lib/components/Drawer.js +2 -2
  33. package/lib/components/Drawer.js.map +2 -2
  34. package/lib/components/Editor.d.ts +84 -84
  35. package/lib/components/GridNav.d.ts +52 -0
  36. package/lib/components/GridNav.js +123 -0
  37. package/lib/components/GridNav.js.map +13 -0
  38. package/lib/components/GroupedSelection.d.ts +907 -0
  39. package/lib/components/GroupedSelection.js +48 -0
  40. package/lib/components/GroupedSelection.js.map +13 -0
  41. package/lib/components/InputBox.d.ts +22 -21
  42. package/lib/components/InputBox.js +10 -2
  43. package/lib/components/InputBox.js.map +2 -2
  44. package/lib/components/Link.d.ts +29 -36
  45. package/lib/components/Link.js +14 -15
  46. package/lib/components/Link.js.map +2 -2
  47. package/lib/components/ListGroup.d.ts +21 -21
  48. package/lib/components/ModalManager.js +1 -1
  49. package/lib/components/ModalManager.js.map +2 -2
  50. package/lib/components/MonthRangePicker.d.ts +84 -84
  51. package/lib/components/NumberInput.d.ts +20 -20
  52. package/lib/components/Overlay.js +5 -0
  53. package/lib/components/Overlay.js.map +2 -2
  54. package/lib/components/PickerColumn.d.ts +514 -0
  55. package/lib/components/PickerColumn.js +279 -0
  56. package/lib/components/PickerColumn.js.map +13 -0
  57. package/lib/components/PickerContainer.d.ts +513 -0
  58. package/lib/components/PickerContainer.js +96 -0
  59. package/lib/components/PickerContainer.js.map +13 -0
  60. package/lib/components/PopOver.d.ts +1 -0
  61. package/lib/components/PopOver.js +12 -1
  62. package/lib/components/PopOver.js.map +2 -2
  63. package/lib/components/Progress.d.ts +85 -0
  64. package/lib/components/Progress.js +81 -0
  65. package/lib/components/Progress.js.map +13 -0
  66. package/lib/components/Radios.d.ts +22 -21
  67. package/lib/components/Radios.js +1 -0
  68. package/lib/components/Radios.js.map +2 -2
  69. package/lib/components/Rating.d.ts +21 -21
  70. package/lib/components/ResultBox.d.ts +84 -84
  71. package/lib/components/ResultBox.js +10 -2
  72. package/lib/components/ResultBox.js.map +2 -2
  73. package/lib/components/SearchBox.d.ts +84 -84
  74. package/lib/components/Select.d.ts +245 -237
  75. package/lib/components/Select.js +25 -4
  76. package/lib/components/Select.js.map +2 -2
  77. package/lib/components/{Checkboxes.d.ts → Selection.d.ts} +273 -98
  78. package/lib/components/Selection.js +134 -0
  79. package/lib/components/Selection.js.map +13 -0
  80. package/lib/components/{TableCheckboxes.d.ts → TableSelection.d.ts} +266 -96
  81. package/lib/components/{TableCheckboxes.js → TableSelection.js} +30 -30
  82. package/lib/components/TableSelection.js.map +13 -0
  83. package/lib/components/Tabs.d.ts +20 -20
  84. package/lib/components/TabsTransfer.d.ts +84 -84
  85. package/lib/components/TabsTransfer.js +9 -9
  86. package/lib/components/TabsTransfer.js.map +2 -2
  87. package/lib/components/TabsTransferPicker.d.ts +489 -0
  88. package/lib/components/TabsTransferPicker.js +60 -0
  89. package/lib/components/TabsTransferPicker.js.map +13 -0
  90. package/lib/components/Toast.d.ts +90 -87
  91. package/lib/components/Toast.js +15 -5
  92. package/lib/components/Toast.js.map +2 -2
  93. package/lib/components/Transfer.d.ts +908 -274
  94. package/lib/components/Transfer.js +31 -24
  95. package/lib/components/Transfer.js.map +2 -2
  96. package/lib/components/TransferDropDown.d.ts +488 -0
  97. package/lib/components/TransferDropDown.js +59 -0
  98. package/lib/components/TransferDropDown.js.map +13 -0
  99. package/lib/components/TransferPicker.d.ts +493 -0
  100. package/lib/components/TransferPicker.js +60 -0
  101. package/lib/components/TransferPicker.js.map +13 -0
  102. package/lib/components/Tree.d.ts +115 -84
  103. package/lib/components/Tree.js +183 -30
  104. package/lib/components/Tree.js.map +2 -2
  105. package/lib/components/{TreeCheckboxes.d.ts → TreeSelection.d.ts} +269 -99
  106. package/lib/components/{TreeCheckboxes.js → TreeSelection.js} +36 -32
  107. package/lib/components/TreeSelection.js.map +13 -0
  108. package/lib/components/condition-builder/Field.js +4 -2
  109. package/lib/components/condition-builder/Field.js.map +2 -2
  110. package/lib/components/condition-builder/Func.js +2 -2
  111. package/lib/components/condition-builder/Func.js.map +2 -2
  112. package/lib/components/condition-builder/InputSwitch.js +2 -2
  113. package/lib/components/condition-builder/InputSwitch.js.map +2 -2
  114. package/lib/components/condition-builder/Item.js +3 -3
  115. package/lib/components/condition-builder/Item.js.map +2 -2
  116. package/lib/components/icons.js +10 -0
  117. package/lib/components/icons.js.map +2 -2
  118. package/lib/components/index.d.ts +8 -8
  119. package/lib/components/index.js +16 -16
  120. package/lib/components/index.js.map +2 -2
  121. package/lib/envOverwrite.d.ts +1 -1
  122. package/lib/envOverwrite.js +24 -9
  123. package/lib/envOverwrite.js.map +2 -2
  124. package/lib/factory.d.ts +15 -1
  125. package/lib/factory.js +35 -6
  126. package/lib/factory.js.map +2 -2
  127. package/lib/helper.css.map +1 -1
  128. package/lib/hooks/index.d.ts +5 -0
  129. package/lib/hooks/index.js +14 -0
  130. package/lib/hooks/index.js.map +13 -0
  131. package/lib/hooks/use-set-state.d.ts +2 -0
  132. package/lib/hooks/use-set-state.js +15 -0
  133. package/lib/hooks/use-set-state.js.map +13 -0
  134. package/lib/hooks/use-touch.d.ts +16 -0
  135. package/lib/hooks/use-touch.js +73 -0
  136. package/lib/hooks/use-touch.js.map +13 -0
  137. package/lib/hooks/use-update-effect.d.ts +3 -0
  138. package/lib/hooks/use-update-effect.js +17 -0
  139. package/lib/hooks/use-update-effect.js.map +13 -0
  140. package/lib/icons/alert-danger.js +7 -0
  141. package/lib/icons/alert-info.js +7 -0
  142. package/lib/icons/alert-success.js +7 -0
  143. package/lib/icons/alert-warning.js +7 -0
  144. package/lib/icons/download.js +7 -0
  145. package/lib/icons/drag-bar.js +10 -3
  146. package/lib/index.d.ts +5 -0
  147. package/lib/index.js +6 -1
  148. package/lib/index.js.map +2 -2
  149. package/lib/locale/de-DE.js +2 -0
  150. package/lib/locale/de-DE.js.map +2 -2
  151. package/lib/locale/en-US.js +3 -0
  152. package/lib/locale/en-US.js.map +2 -2
  153. package/lib/locale/zh-CN.js +5 -2
  154. package/lib/locale/zh-CN.js.map +2 -2
  155. package/lib/renderers/Action.d.ts +10 -5
  156. package/lib/renderers/Action.js +23 -5
  157. package/lib/renderers/Action.js.map +2 -2
  158. package/lib/renderers/Alert.d.ts +21 -1
  159. package/lib/renderers/Alert.js.map +2 -2
  160. package/lib/renderers/AnchorNav.d.ts +1 -0
  161. package/lib/renderers/AnchorNav.js +2 -2
  162. package/lib/renderers/AnchorNav.js.map +2 -2
  163. package/lib/renderers/Avatar.js +3 -3
  164. package/lib/renderers/Avatar.js.map +2 -2
  165. package/lib/renderers/Breadcrumb.js +1 -1
  166. package/lib/renderers/Breadcrumb.js.map +2 -2
  167. package/lib/renderers/CRUD.d.ts +5 -0
  168. package/lib/renderers/CRUD.js +25 -4
  169. package/lib/renderers/CRUD.js.map +2 -2
  170. package/lib/renderers/Card.d.ts +5 -0
  171. package/lib/renderers/Card.js +34 -23
  172. package/lib/renderers/Card.js.map +2 -2
  173. package/lib/renderers/Collapse.d.ts +25 -20
  174. package/lib/renderers/Collapse.js +10 -72
  175. package/lib/renderers/Collapse.js.map +2 -2
  176. package/lib/renderers/CollapseGroup.d.ts +42 -0
  177. package/lib/renderers/CollapseGroup.js +33 -0
  178. package/lib/renderers/CollapseGroup.js.map +13 -0
  179. package/lib/renderers/Form/ConditionBuilder.js +2 -2
  180. package/lib/renderers/Form/ConditionBuilder.js.map +2 -2
  181. package/lib/renderers/Form/DiffEditor.d.ts +4 -3
  182. package/lib/renderers/Form/Editor.d.ts +3 -2
  183. package/lib/renderers/Form/InputCity.d.ts +84 -84
  184. package/lib/renderers/Form/InputCity.js +7 -6
  185. package/lib/renderers/Form/InputCity.js.map +2 -2
  186. package/lib/renderers/Form/InputColor.d.ts +86 -85
  187. package/lib/renderers/Form/InputColor.js +1 -1
  188. package/lib/renderers/Form/InputColor.js.map +2 -2
  189. package/lib/renderers/Form/InputFile.d.ts +6 -0
  190. package/lib/renderers/Form/InputFile.js +28 -8
  191. package/lib/renderers/Form/InputFile.js.map +2 -2
  192. package/lib/renderers/Form/InputImage.js +11 -4
  193. package/lib/renderers/Form/InputImage.js.map +2 -2
  194. package/lib/renderers/Form/Item.d.ts +1 -1
  195. package/lib/renderers/Form/Item.js +2 -1
  196. package/lib/renderers/Form/Item.js.map +2 -2
  197. package/lib/renderers/Form/Options.js +25 -4
  198. package/lib/renderers/Form/Options.js.map +2 -2
  199. package/lib/renderers/Form/Select.d.ts +42 -4
  200. package/lib/renderers/Form/Select.js +37 -3
  201. package/lib/renderers/Form/Select.js.map +2 -2
  202. package/lib/renderers/Form/TabsTransferPicker.d.ts +48 -0
  203. package/lib/renderers/Form/TabsTransferPicker.js +29 -0
  204. package/lib/renderers/Form/TabsTransferPicker.js.map +13 -0
  205. package/lib/renderers/Form/Transfer.js +18 -3
  206. package/lib/renderers/Form/Transfer.js.map +2 -2
  207. package/lib/renderers/Form/TransferPicker.d.ts +52 -0
  208. package/lib/renderers/Form/TransferPicker.js +43 -0
  209. package/lib/renderers/Form/TransferPicker.js.map +13 -0
  210. package/lib/renderers/Form/TreeSelect.js +2 -2
  211. package/lib/renderers/Form/TreeSelect.js.map +2 -2
  212. package/lib/renderers/Form/index.d.ts +5 -0
  213. package/lib/renderers/Form/index.js +5 -3
  214. package/lib/renderers/Form/index.js.map +2 -2
  215. package/lib/renderers/Form/wrapControl.js +13 -1
  216. package/lib/renderers/Form/wrapControl.js.map +2 -2
  217. package/lib/renderers/GridNav.d.ts +99 -0
  218. package/lib/renderers/GridNav.js +82 -0
  219. package/lib/renderers/GridNav.js.map +13 -0
  220. package/lib/renderers/IFrame.js +1 -3
  221. package/lib/renderers/IFrame.js.map +2 -2
  222. package/lib/renderers/Image.js +7 -5
  223. package/lib/renderers/Image.js.map +2 -2
  224. package/lib/renderers/Json.d.ts +4 -0
  225. package/lib/renderers/Json.js +4 -13
  226. package/lib/renderers/Json.js.map +2 -2
  227. package/lib/renderers/Link.d.ts +4 -2
  228. package/lib/renderers/Link.js +15 -8
  229. package/lib/renderers/Link.js.map +2 -2
  230. package/lib/renderers/List.js +1 -1
  231. package/lib/renderers/List.js.map +2 -2
  232. package/lib/renderers/Nav.d.ts +21 -21
  233. package/lib/renderers/Nav.js +37 -19
  234. package/lib/renderers/Nav.js.map +2 -2
  235. package/lib/renderers/Page.d.ts +18 -0
  236. package/lib/renderers/Page.js +53 -9
  237. package/lib/renderers/Page.js.map +2 -2
  238. package/lib/renderers/Portlet.d.ts +125 -0
  239. package/lib/renderers/Portlet.js +156 -0
  240. package/lib/renderers/Portlet.js.map +13 -0
  241. package/lib/renderers/Progress.d.ts +23 -3
  242. package/lib/renderers/Progress.js +15 -19
  243. package/lib/renderers/Progress.js.map +2 -2
  244. package/lib/renderers/Property.js +1 -1
  245. package/lib/renderers/Property.js.map +2 -2
  246. package/lib/renderers/Table/ColumnToggler.js +1 -1
  247. package/lib/renderers/Table/ColumnToggler.js.map +2 -2
  248. package/lib/renderers/Table/TableContent.d.ts +4 -1
  249. package/lib/renderers/Table/TableContent.js +21 -1
  250. package/lib/renderers/Table/TableContent.js.map +2 -2
  251. package/lib/renderers/Table/index.d.ts +5 -1
  252. package/lib/renderers/Table/index.js +65 -30
  253. package/lib/renderers/Table/index.js.map +2 -2
  254. package/lib/renderers/Tabs.js +9 -1
  255. package/lib/renderers/Tabs.js.map +2 -2
  256. package/lib/renderers/WebComponent.js +1 -1
  257. package/lib/renderers/WebComponent.js.map +2 -2
  258. package/lib/store/combo.d.ts +2 -2
  259. package/lib/store/form.d.ts +1 -1
  260. package/lib/store/form.js +3 -5
  261. package/lib/store/form.js.map +2 -2
  262. package/lib/store/formItem.js +44 -4
  263. package/lib/store/formItem.js.map +2 -2
  264. package/lib/store/table.d.ts +3 -2
  265. package/lib/store/table.js +35 -12
  266. package/lib/store/table.js.map +2 -2
  267. package/lib/themes/ang-ie11.css +934 -222
  268. package/lib/themes/ang.css +934 -222
  269. package/lib/themes/ang.css.map +1 -1
  270. package/lib/themes/antd-ie11.css +934 -222
  271. package/lib/themes/antd.css +934 -222
  272. package/lib/themes/antd.css.map +1 -1
  273. package/lib/themes/cxd-ie11.css +970 -260
  274. package/lib/themes/cxd.css +970 -260
  275. package/lib/themes/cxd.css.map +1 -1
  276. package/lib/themes/dark-ie11.css +934 -222
  277. package/lib/themes/dark.css +934 -222
  278. package/lib/themes/dark.css.map +1 -1
  279. package/lib/themes/default.css +970 -260
  280. package/lib/themes/default.css.map +1 -1
  281. package/lib/types.d.ts +38 -1
  282. package/lib/types.js +0 -5
  283. package/lib/types.js.map +2 -2
  284. package/lib/utils/api.d.ts +3 -2
  285. package/lib/utils/api.js +90 -17
  286. package/lib/utils/api.js.map +2 -2
  287. package/lib/utils/dom.d.ts +4 -0
  288. package/lib/utils/dom.js +11 -1
  289. package/lib/utils/dom.js.map +2 -2
  290. package/lib/utils/helper.d.ts +12 -23
  291. package/lib/utils/helper.js +62 -166
  292. package/lib/utils/helper.js.map +2 -2
  293. package/lib/utils/tpl-builtin.d.ts +2 -20
  294. package/lib/utils/tpl-builtin.js +25 -743
  295. package/lib/utils/tpl-builtin.js.map +2 -2
  296. package/lib/utils/tpl.js +24 -0
  297. package/lib/utils/tpl.js.map +2 -2
  298. package/package.json +5 -2
  299. package/schema.json +3966 -1263
  300. package/scss/_mixins.scss +1 -3
  301. package/scss/_properties.scss +42 -13
  302. package/scss/base/_common.scss +3 -0
  303. package/scss/base/_normalize.scss +2 -0
  304. package/scss/components/_alert.scss +28 -5
  305. package/scss/components/_anchor-nav.scss +89 -29
  306. package/scss/components/_button.scss +12 -0
  307. package/scss/components/_card.scss +9 -15
  308. package/scss/components/_collapse-group.scss +15 -0
  309. package/scss/components/_collapse.scss +48 -23
  310. package/scss/components/_grid-nav.scss +128 -0
  311. package/scss/components/_images.scss +1 -0
  312. package/scss/components/_input-box.scss +1 -0
  313. package/scss/components/_nav.scss +2 -7
  314. package/scss/components/_page.scss +35 -2
  315. package/scss/components/_picker-columns.scss +124 -0
  316. package/scss/components/_popover.scss +13 -0
  317. package/scss/components/_portlet.scss +51 -0
  318. package/scss/components/_progress.scss +141 -33
  319. package/scss/components/_result-box.scss +1 -0
  320. package/scss/components/_spinner.scss +5 -4
  321. package/scss/components/_status.scss +1 -1
  322. package/scss/components/_table.scss +32 -0
  323. package/scss/components/_toast.scss +41 -11
  324. package/scss/components/form/_checks.scss +0 -351
  325. package/scss/components/form/_color.scss +32 -3
  326. package/scss/components/form/_combo.scss +4 -0
  327. package/scss/components/form/_fieldset.scss +6 -1
  328. package/scss/components/form/_file.scss +11 -0
  329. package/scss/components/form/_form.scss +48 -0
  330. package/scss/components/form/_selection.scss +354 -0
  331. package/scss/components/form/_transfer.scss +76 -18
  332. package/scss/components/form/_tree.scss +42 -0
  333. package/scss/themes/_common.scss +6 -0
  334. package/scss/themes/_cxd-variables.scss +13 -6
  335. package/scss/themes/cxd.scss +19 -20
  336. package/sdk/ang-ie11.css +1065 -246
  337. package/sdk/ang.css +1069 -230
  338. package/sdk/antd-ie11.css +1068 -249
  339. package/sdk/antd.css +1069 -230
  340. package/sdk/charts.js +17 -17
  341. package/sdk/color-picker.js +65 -69
  342. package/sdk/cropperjs.js +3 -3
  343. package/sdk/cxd-ie11.css +1081 -268
  344. package/sdk/cxd.css +1116 -279
  345. package/sdk/dark-ie11.css +1069 -250
  346. package/sdk/dark.css +1069 -230
  347. package/sdk/exceljs.js +1 -1
  348. package/sdk/helper.css.map +1 -1
  349. package/sdk/iconfont.svg +2513 -0
  350. package/sdk/iconfont.ttf +0 -0
  351. package/sdk/iconfont.woff +0 -0
  352. package/sdk/locale/de-DE.js +2 -0
  353. package/sdk/markdown.js +69 -69
  354. package/sdk/papaparse.js +1 -1
  355. package/sdk/renderers/Form/CityDB.js +1 -1
  356. package/sdk/rest.js +20 -28
  357. package/sdk/rich-text.js +62 -62
  358. package/sdk/sdk-ie11.css +1081 -268
  359. package/sdk/sdk.css +1116 -279
  360. package/sdk/sdk.js +1371 -1189
  361. package/sdk/thirds/hls.js/hls.js +18 -18
  362. package/sdk/thirds/mpegts.js/mpegts.js +2 -2
  363. package/sdk/tinymce.js +57 -57
  364. package/src/Schema.ts +19 -1
  365. package/src/components/Alert2.tsx +32 -4
  366. package/src/components/AnchorNav.tsx +15 -4
  367. package/src/components/{AssociatedCheckboxes.tsx → AssociatedSelection.tsx} +43 -37
  368. package/src/components/Badge.tsx +3 -3
  369. package/src/components/Button.tsx +1 -0
  370. package/src/components/{ChainedCheckboxes.tsx → ChainedSelection.tsx} +57 -40
  371. package/src/components/Collapse.tsx +139 -20
  372. package/src/components/CollapseGroup.tsx +130 -0
  373. package/src/components/ColorPicker.tsx +32 -10
  374. package/src/components/Drawer.tsx +8 -6
  375. package/src/components/GridNav.tsx +233 -0
  376. package/src/components/{ListCheckboxes.tsx → GroupedSelection.tsx} +26 -21
  377. package/src/components/InputBox.tsx +10 -9
  378. package/src/components/Link.tsx +28 -37
  379. package/src/components/ModalManager.ts +1 -1
  380. package/src/components/Overlay.tsx +6 -0
  381. package/src/components/PickerColumn.tsx +429 -0
  382. package/src/components/PickerContainer.tsx +128 -0
  383. package/src/components/PopOver.tsx +15 -1
  384. package/src/components/Progress.tsx +140 -0
  385. package/src/components/Radios.tsx +3 -8
  386. package/src/components/ResultBox.tsx +9 -9
  387. package/src/components/Select.tsx +57 -5
  388. package/src/components/{Checkboxes.tsx → Selection.tsx} +75 -21
  389. package/src/components/{TableCheckboxes.tsx → TableSelection.tsx} +46 -25
  390. package/src/components/TabsTransfer.tsx +13 -7
  391. package/src/components/TabsTransferPicker.tsx +85 -0
  392. package/src/components/Toast.tsx +48 -21
  393. package/src/components/Transfer.tsx +71 -50
  394. package/src/components/TransferDropDown.tsx +120 -0
  395. package/src/components/TransferPicker.tsx +91 -0
  396. package/src/components/Tree.tsx +194 -8
  397. package/src/components/{TreeCheckboxes.tsx → TreeSelection.tsx} +33 -26
  398. package/src/components/condition-builder/Field.tsx +7 -5
  399. package/src/components/condition-builder/Func.tsx +3 -3
  400. package/src/components/condition-builder/InputSwitch.tsx +3 -3
  401. package/src/components/condition-builder/Item.tsx +5 -12
  402. package/src/components/icons.tsx +10 -0
  403. package/src/components/index.tsx +13 -13
  404. package/src/envOverwrite.ts +20 -8
  405. package/src/factory.tsx +70 -9
  406. package/src/hooks/index.ts +5 -0
  407. package/src/hooks/use-set-state.ts +19 -0
  408. package/src/hooks/use-touch.ts +100 -0
  409. package/src/hooks/use-update-effect.ts +16 -0
  410. package/src/icons/alert-danger.svg +1 -0
  411. package/src/icons/alert-info.svg +1 -0
  412. package/src/icons/alert-success.svg +1 -0
  413. package/src/icons/alert-warning.svg +1 -0
  414. package/src/icons/download.svg +4 -0
  415. package/src/icons/drag-bar.svg +12 -6
  416. package/src/index.tsx +5 -0
  417. package/src/locale/de-DE.ts +2 -0
  418. package/src/locale/en-US.ts +3 -0
  419. package/src/locale/zh-CN.ts +5 -2
  420. package/src/renderers/Action.tsx +58 -3
  421. package/src/renderers/Alert.tsx +31 -1
  422. package/src/renderers/AnchorNav.tsx +4 -0
  423. package/src/renderers/Avatar.tsx +8 -4
  424. package/src/renderers/Breadcrumb.tsx +5 -1
  425. package/src/renderers/CRUD.tsx +29 -3
  426. package/src/renderers/Card.tsx +76 -36
  427. package/src/renderers/Collapse.tsx +70 -115
  428. package/src/renderers/CollapseGroup.tsx +80 -0
  429. package/src/renderers/Form/ConditionBuilder.tsx +2 -2
  430. package/src/renderers/Form/InputCity.tsx +4 -8
  431. package/src/renderers/Form/InputColor.tsx +4 -2
  432. package/src/renderers/Form/InputFile.tsx +65 -24
  433. package/src/renderers/Form/InputImage.tsx +11 -3
  434. package/src/renderers/Form/Item.tsx +3 -2
  435. package/src/renderers/Form/Options.tsx +29 -3
  436. package/src/renderers/Form/Select.tsx +162 -21
  437. package/src/renderers/Form/TabsTransferPicker.tsx +123 -0
  438. package/src/renderers/Form/Transfer.tsx +19 -4
  439. package/src/renderers/Form/TransferPicker.tsx +145 -0
  440. package/src/renderers/Form/TreeSelect.tsx +25 -0
  441. package/src/renderers/Form/index.tsx +15 -2
  442. package/src/renderers/Form/wrapControl.tsx +26 -1
  443. package/src/renderers/GridNav.tsx +204 -0
  444. package/src/renderers/IFrame.tsx +2 -4
  445. package/src/renderers/Image.tsx +19 -15
  446. package/src/renderers/Json.tsx +9 -9
  447. package/src/renderers/Link.tsx +29 -16
  448. package/src/renderers/List.tsx +1 -1
  449. package/src/renderers/Nav.tsx +105 -56
  450. package/src/renderers/Page.tsx +62 -1
  451. package/src/renderers/Portlet.tsx +423 -0
  452. package/src/renderers/Progress.tsx +56 -38
  453. package/src/renderers/Property.tsx +6 -4
  454. package/src/renderers/Table/ColumnToggler.tsx +1 -1
  455. package/src/renderers/Table/TableContent.tsx +40 -2
  456. package/src/renderers/Table/index.tsx +88 -43
  457. package/src/renderers/Tabs.tsx +9 -1
  458. package/src/renderers/WebComponent.tsx +2 -2
  459. package/src/store/form.ts +3 -9
  460. package/src/store/formItem.ts +94 -2
  461. package/src/store/table.ts +55 -14
  462. package/src/types.ts +58 -1
  463. package/src/utils/api.ts +120 -26
  464. package/src/utils/dom.tsx +12 -0
  465. package/src/utils/helper.ts +55 -185
  466. package/src/utils/tpl-builtin.ts +40 -866
  467. package/src/utils/tpl.ts +33 -0
  468. package/tsconfig-for-declaration.json +1 -1
  469. package/dump.rdb +0 -0
  470. package/lib/components/AssociatedCheckboxes.d.ts +0 -762
  471. package/lib/components/AssociatedCheckboxes.js +0 -90
  472. package/lib/components/AssociatedCheckboxes.js.map +0 -13
  473. package/lib/components/ChainedCheckboxes.js.map +0 -13
  474. package/lib/components/Checkboxes.js +0 -101
  475. package/lib/components/Checkboxes.js.map +0 -13
  476. package/lib/components/ListCheckboxes.d.ts +0 -739
  477. package/lib/components/ListCheckboxes.js +0 -48
  478. package/lib/components/ListCheckboxes.js.map +0 -13
  479. package/lib/components/ListRadios.d.ts +0 -763
  480. package/lib/components/ListRadios.js +0 -86
  481. package/lib/components/ListRadios.js.map +0 -13
  482. package/lib/components/TableCheckboxes.js.map +0 -13
  483. package/lib/components/TreeCheckboxes.js.map +0 -13
  484. package/lib/components/TreeRadios.d.ts +0 -838
  485. package/lib/components/TreeRadios.js +0 -116
  486. package/lib/components/TreeRadios.js.map +0 -13
  487. package/src/components/ListRadios.tsx +0 -159
  488. package/src/components/TreeRadios.tsx +0 -202
@@ -0,0 +1,429 @@
1
+ /**
2
+ * @file Picker
3
+ * @description 移动端选择器
4
+ */
5
+ import React, {
6
+ useEffect,
7
+ useMemo,
8
+ useRef,
9
+ useImperativeHandle,
10
+ useCallback,
11
+ forwardRef,
12
+ CSSProperties
13
+ } from 'react';
14
+ import isObject from 'lodash/isObject';
15
+ import cloneDeep from 'lodash/cloneDeep';
16
+ import {uncontrollable} from 'uncontrollable';
17
+
18
+ import {useSetState, useUpdateEffect} from '../hooks';
19
+ import {range} from '../utils/helper';
20
+ import {themeable, ThemeProps} from '../theme';
21
+ import {localeable, LocaleProps} from '../locale';
22
+ import useTouch from '../hooks/use-touch';
23
+ import Button from './Button';
24
+
25
+ export interface PickerColumnProps extends ThemeProps, LocaleProps {
26
+ mobileClassName?: string;
27
+ style?: CSSProperties;
28
+ index?: number;
29
+ labelField: string;
30
+ readonly?: boolean;
31
+ value: any;
32
+ swipeDuration?: number | string;
33
+ visibleItemCount?: number | string;
34
+ options?: PickerOption[];
35
+ children?: any;
36
+ optionRender?: (option: string | object | PickerOption) => React.ReactNode;
37
+ onChange?: (
38
+ value?: PickerOption | string,
39
+ index?: number,
40
+ confirm?: boolean
41
+ ) => void;
42
+ onClose?: () => void;
43
+ onConfirm?: () => void;
44
+ }
45
+
46
+ export interface Column {
47
+ values?: string[];
48
+ className?: string;
49
+ children?: Column[];
50
+ disabled?: boolean;
51
+ }
52
+
53
+ export type PickerOption = string | number | PickerObjectOption;
54
+
55
+ export type PickerObjectOption = {
56
+ value?: string | number;
57
+ text?: string | number;
58
+ disabled?: boolean;
59
+ } & Record<string, {}>;
60
+
61
+ const DEFAULT_DURATION = 200;
62
+ const MOMENTUM_LIMIT_TIME = 300;
63
+ const MOMENTUM_LIMIT_DISTANCE = 15;
64
+
65
+ function getElementTranslateY(element: HTMLElement | null) {
66
+ if (!element) {
67
+ return 0;
68
+ }
69
+ const style = window.getComputedStyle(element);
70
+ const transform = style.transform || style.webkitTransform;
71
+ // 格式如:matrix( scaleX(), skewY(), skewX(), scaleY(), translateX(), translateY() );
72
+ const translateY = transform.slice(7, transform.length - 1).split(', ')[5];
73
+
74
+ return Number(translateY);
75
+ }
76
+
77
+ function isOptionDisabled(option: PickerOption) {
78
+ return isObject(option) && option.disabled;
79
+ }
80
+
81
+ const PickerColumn = forwardRef<{}, PickerColumnProps>((props, ref) => {
82
+ const {
83
+ onClose,
84
+ onConfirm,
85
+ mobileClassName,
86
+ visibleItemCount = 5,
87
+ value,
88
+ swipeDuration = 1000,
89
+ labelField = 'value',
90
+ translate: __,
91
+ options = [],
92
+ classnames: cx
93
+ } = props;
94
+ let itemHeight = 24;
95
+
96
+ const defaultIndex = options.findIndex(item => item === value);
97
+
98
+ const root = useRef(null);
99
+ const menuItemRef = useRef(null);
100
+ const wrapper = useRef(null);
101
+
102
+ const moving = useRef(false);
103
+ const startOffset = useRef(0);
104
+ const transitionEndTrigger = useRef(null);
105
+ const touchStartTime = useRef(0);
106
+ const momentumOffset = useRef(0);
107
+
108
+ if (menuItemRef.current) {
109
+ //@ts-ignore
110
+ itemHeight = menuItemRef.current.getBoundingClientRect().height;
111
+ }
112
+
113
+ const [state, updateState] = useSetState({
114
+ index: defaultIndex,
115
+ offset: 0,
116
+ duration: 0,
117
+ options: cloneDeep(options)
118
+ });
119
+
120
+ const touch = useTouch();
121
+
122
+ const count = state.options.length;
123
+
124
+ const baseOffset = useMemo(() => {
125
+ // 默认转入第一个选项的位置
126
+ return (itemHeight * (+visibleItemCount - 1)) / 2;
127
+ }, [itemHeight, visibleItemCount]);
128
+
129
+ const adjustIndex = (index: number) => {
130
+ index = range(index, 0, count);
131
+ if (!state.options) {
132
+ return;
133
+ }
134
+
135
+ for (let i = index; i < count; i += 1) {
136
+ if (!isOptionDisabled(state.options[i])) return i;
137
+ }
138
+ for (let i = index - 1; i >= 0; i -= 1) {
139
+ if (!isOptionDisabled(state.options[i])) return i;
140
+ }
141
+
142
+ return null;
143
+ };
144
+
145
+ /**
146
+ *
147
+ * @param index 索引
148
+ * @param emitChange 是否派发变动消息
149
+ * @param confirm 是否为确认类型,为真时触发value改变
150
+ */
151
+ const setIndex = (index: number, emitChange?: boolean, confirm?: boolean) => {
152
+ index = adjustIndex(index) || 0;
153
+
154
+ const offset = -index * itemHeight;
155
+ const trigger = () => {
156
+ updateState({index});
157
+
158
+ if (emitChange && props.onChange) {
159
+ setTimeout(() => {
160
+ props.onChange?.(options[index], index, confirm);
161
+ }, 0);
162
+ }
163
+ };
164
+
165
+ // trigger the change event after transitionend when moving
166
+ if (moving.current && offset !== state.offset) {
167
+ //@ts-ignore
168
+ transitionEndTrigger.current = trigger;
169
+ } else {
170
+ trigger();
171
+ }
172
+ updateState({offset});
173
+ };
174
+
175
+ const setOptions = (options: Array<PickerOption>) => {
176
+ if (JSON.stringify(options) !== JSON.stringify(state.options)) {
177
+ updateState({options});
178
+ setIndex(defaultIndex, true);
179
+ }
180
+ };
181
+
182
+ const onClickItem = (index: number) => {
183
+ if (moving.current || props.readonly) {
184
+ return;
185
+ }
186
+ transitionEndTrigger.current = null;
187
+ updateState({duration: DEFAULT_DURATION});
188
+ setIndex(index, true, true);
189
+ };
190
+
191
+ const getOptionText = (option: [] | PickerOption) => {
192
+ if (isObject(option) && props.labelField in option) {
193
+ //@ts-ignore
194
+ return option[labelField];
195
+ }
196
+ return option;
197
+ };
198
+
199
+ const getIndexByOffset = (offset: number) =>
200
+ range(Math.round(-offset / itemHeight), 0, count - 1);
201
+
202
+ const momentum = (distance: number, duration: number) => {
203
+ const speed = Math.abs(distance / duration);
204
+
205
+ distance = state.offset + (speed / 0.003) * (distance < 0 ? -1 : 1);
206
+
207
+ const index = getIndexByOffset(distance);
208
+ updateState({duration: +swipeDuration});
209
+ setIndex(index, true);
210
+ };
211
+
212
+ const stopMomentum = () => {
213
+ moving.current = false;
214
+ updateState({duration: 0});
215
+
216
+ if (transitionEndTrigger.current) {
217
+ //@ts-ignore
218
+ transitionEndTrigger.current();
219
+ transitionEndTrigger.current = null;
220
+ }
221
+ };
222
+
223
+ const onTouchStart = (event: any) => {
224
+ if (props.readonly) {
225
+ return;
226
+ }
227
+
228
+ touch.start(event);
229
+ let {offset} = state;
230
+
231
+ if (moving.current) {
232
+ const translateY = getElementTranslateY(wrapper.current);
233
+ offset = Math.min(0, translateY - baseOffset);
234
+ startOffset.current = offset;
235
+ } else {
236
+ startOffset.current = offset;
237
+ }
238
+
239
+ updateState({duration: 0, offset});
240
+ touchStartTime.current = Date.now();
241
+ momentumOffset.current = startOffset.current;
242
+ transitionEndTrigger.current = null;
243
+ };
244
+
245
+ const onTouchMove = (event: TouchEvent | React.TouchEvent) => {
246
+ if (props.readonly) {
247
+ return;
248
+ }
249
+
250
+ touch.move(event as TouchEvent);
251
+
252
+ if (touch.isVertical()) {
253
+ moving.current = true;
254
+ }
255
+
256
+ const offset = range(
257
+ startOffset.current + touch.deltaY,
258
+ -(count * itemHeight),
259
+ itemHeight
260
+ );
261
+
262
+ updateState({
263
+ offset
264
+ });
265
+
266
+ const now = Date.now();
267
+ if (now - touchStartTime.current > MOMENTUM_LIMIT_TIME) {
268
+ touchStartTime.current = now;
269
+ momentumOffset.current = offset;
270
+ }
271
+ };
272
+
273
+ const onTouchEnd = () => {
274
+ if (props.readonly) {
275
+ return;
276
+ }
277
+ const distance = state.offset - momentumOffset.current;
278
+ const duration = Date.now() - touchStartTime.current;
279
+
280
+ const allowMomentum =
281
+ duration < MOMENTUM_LIMIT_TIME &&
282
+ Math.abs(distance) > MOMENTUM_LIMIT_DISTANCE;
283
+
284
+ if (allowMomentum) {
285
+ momentum(distance, duration);
286
+ return;
287
+ }
288
+
289
+ const index = getIndexByOffset(state.offset);
290
+ updateState({duration: DEFAULT_DURATION});
291
+ setIndex(index, true);
292
+
293
+ // compatible with desktop scenario
294
+ // use setTimeout to skip the click event triggered after touchstart
295
+ setTimeout(() => {
296
+ moving.current = false;
297
+ }, 0);
298
+ };
299
+
300
+ const renderOptions = () => {
301
+ return state.options.map((option, index: number) => {
302
+ const text: string | PickerOption = getOptionText(option);
303
+ const disabled = isOptionDisabled(option);
304
+
305
+ const data = {
306
+ role: 'button',
307
+ key: index,
308
+ tabIndex: disabled ? -1 : 0,
309
+ className: props.classnames(`PickerColumns-columnItem`, {
310
+ 'is-disabled': disabled,
311
+ 'is-selected': index === state.index
312
+ }),
313
+ onClick: () => {
314
+ onClickItem(index);
315
+ }
316
+ };
317
+
318
+ const childData = {
319
+ className: 'text-ellipsis',
320
+ children: text
321
+ };
322
+
323
+ return (
324
+ <li {...data} ref={menuItemRef}>
325
+ {props.optionRender ? (
326
+ props.optionRender(option)
327
+ ) : (
328
+ <div {...childData} />
329
+ )}
330
+ </li>
331
+ );
332
+ });
333
+ };
334
+
335
+ const setValue = (value: string) => {
336
+ const {options} = state;
337
+ for (let i = 0; i < options.length; i += 1) {
338
+ if (getOptionText(options[i]) === value) {
339
+ return setIndex(i);
340
+ }
341
+ }
342
+ return null;
343
+ };
344
+
345
+ const getValue = useCallback<() => PickerOption>(
346
+ () => state.options[state.index],
347
+ [state.index, state.options]
348
+ );
349
+
350
+ useEffect(() => {
351
+ setIndex(defaultIndex, true);
352
+ }, [defaultIndex]);
353
+
354
+ useUpdateEffect(() => {
355
+ setOptions(cloneDeep(options));
356
+ }, [options]);
357
+
358
+ useImperativeHandle(ref, () => ({
359
+ state,
360
+ setIndex,
361
+ getValue,
362
+ setValue,
363
+ setOptions,
364
+ stopMomentum
365
+ }));
366
+
367
+ const wrapperStyle = {
368
+ transform: `translate3d(0, ${state.offset + baseOffset}px, 0)`,
369
+ transitionDuration: `${state.duration}ms`,
370
+ transitionProperty: state.duration ? 'all' : 'none'
371
+ };
372
+
373
+ const wrapHeight = itemHeight * +visibleItemCount;
374
+ const frameStyle = {height: `${itemHeight}px`};
375
+ const columnsStyle = {height: `${wrapHeight}px`};
376
+ const maskStyle = {
377
+ backgroundSize: `100% ${(wrapHeight - itemHeight) / 2}px`
378
+ };
379
+
380
+ return (
381
+ <div
382
+ className={cx(mobileClassName, 'PickerColumns', 'PickerColumns-popOver')}
383
+ >
384
+ <div className={cx('PickerColumns-toolbar')}>
385
+ <Button level="default" onClick={onClose}>
386
+ {__('cancel')}
387
+ </Button>
388
+ <Button level="primary" onClick={onConfirm}>
389
+ {__('confirm')}
390
+ </Button>
391
+ </div>
392
+ <div className={cx('PickerColumns-columns')} style={columnsStyle}>
393
+ <div
394
+ ref={root}
395
+ className={props.classnames(props.className)}
396
+ onTouchStart={onTouchStart}
397
+ onTouchMove={onTouchMove}
398
+ onTouchEnd={onTouchEnd}
399
+ onTouchCancel={onTouchEnd}
400
+ >
401
+ <ul
402
+ ref={wrapper}
403
+ style={wrapperStyle}
404
+ className={props.classnames('PickerColumns-columnWrapper')}
405
+ onTransitionEnd={stopMomentum}
406
+ >
407
+ {renderOptions()}
408
+ </ul>
409
+ </div>
410
+ <div className={cx('PickerColumns-mask')} style={maskStyle}></div>
411
+ <div className={cx('PickerColumns-frame')} style={frameStyle}></div>
412
+ </div>
413
+ </div>
414
+ );
415
+ });
416
+
417
+ PickerColumn.defaultProps = {
418
+ options: [],
419
+ visibleItemCount: 5,
420
+ swipeDuration: 1000
421
+ };
422
+
423
+ export default themeable(
424
+ localeable(
425
+ uncontrollable(PickerColumn, {
426
+ value: 'onChange'
427
+ })
428
+ )
429
+ );
@@ -0,0 +1,128 @@
1
+ import React from 'react';
2
+ import {autobind} from '../utils/helper';
3
+ import Overlay from './Overlay';
4
+ import PopOver from './PopOver';
5
+ import {findDOMNode} from 'react-dom';
6
+ import Modal from './Modal';
7
+ import {themeable, ThemeProps} from '../theme';
8
+ import {localeable, LocaleProps} from '../locale';
9
+ import Button from './Button';
10
+
11
+ export interface PickerContainerProps extends ThemeProps, LocaleProps {
12
+ title?: string;
13
+ children: (props: {
14
+ onClick: (e: React.MouseEvent) => void;
15
+ isOpened: boolean;
16
+ }) => JSX.Element;
17
+ popOverRender: (props: {
18
+ onClose: () => void;
19
+ value: any;
20
+ onChange: (value: any) => void;
21
+ }) => JSX.Element;
22
+ value?: any;
23
+ onConfirm?: (value?: any) => void;
24
+ onCancel?: () => void;
25
+ popOverContainer?: any;
26
+ popOverClassName?: string;
27
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
28
+ }
29
+
30
+ export interface PickerContainerState {
31
+ isOpened: boolean;
32
+ value?: any;
33
+ }
34
+
35
+ export class PickerContainer extends React.Component<
36
+ PickerContainerProps,
37
+ PickerContainerState
38
+ > {
39
+ state: PickerContainerState = {
40
+ isOpened: false,
41
+ value: this.props.value
42
+ };
43
+
44
+ componentDidUpdate(prevProps: PickerContainerProps) {
45
+ const props = this.props;
46
+
47
+ if (props.value !== prevProps.value) {
48
+ this.setState({
49
+ value: props.value
50
+ });
51
+ }
52
+ }
53
+
54
+ @autobind
55
+ handleClick() {
56
+ this.setState({
57
+ isOpened: true
58
+ });
59
+ }
60
+
61
+ @autobind
62
+ close(e?: any, callback?: () => void) {
63
+ this.setState(
64
+ {
65
+ isOpened: false
66
+ },
67
+ callback || (() => this.props.onCancel?.())
68
+ );
69
+ }
70
+
71
+ @autobind
72
+ handleChange(value: any) {
73
+ this.setState({
74
+ value
75
+ });
76
+ }
77
+
78
+ @autobind
79
+ confirm() {
80
+ const {onConfirm} = this.props;
81
+
82
+ this.close(undefined, () => onConfirm?.(this.state.value));
83
+ }
84
+
85
+ render() {
86
+ const {
87
+ children,
88
+ popOverRender: dropdownRender,
89
+ title,
90
+ translate: __,
91
+ size
92
+ } = this.props;
93
+ return (
94
+ <>
95
+ {children({
96
+ isOpened: this.state.isOpened,
97
+ onClick: this.handleClick
98
+ })}
99
+
100
+ <Modal
101
+ size={size}
102
+ closeOnEsc
103
+ show={this.state.isOpened}
104
+ onHide={this.close}
105
+ >
106
+ <Modal.Header onClose={this.close}>
107
+ {__(title || 'Select.placeholder')}
108
+ </Modal.Header>
109
+ <Modal.Body>
110
+ {dropdownRender({
111
+ onClose: this.close,
112
+ value: this.state.value,
113
+ onChange: this.handleChange
114
+ })}
115
+ </Modal.Body>
116
+ <Modal.Footer>
117
+ <Button onClick={this.close}>{__('cancel')}</Button>
118
+ <Button onClick={this.confirm} level="primary">
119
+ {__('confirm')}
120
+ </Button>
121
+ </Modal.Footer>
122
+ </Modal>
123
+ </>
124
+ );
125
+ }
126
+ }
127
+
128
+ export default themeable(localeable(PickerContainer));
@@ -7,7 +7,7 @@
7
7
  import React from 'react';
8
8
  import {findDOMNode} from 'react-dom';
9
9
  import {ClassNamesFn, themeable} from '../theme';
10
- import {camel} from '../utils/helper';
10
+ import {camel, preventDefault} from '../utils/helper';
11
11
 
12
12
  export interface Offset {
13
13
  x: number;
@@ -53,12 +53,21 @@ export class PopOver extends React.PureComponent<PopOverPorps, PopOverState> {
53
53
  };
54
54
 
55
55
  parent: HTMLElement;
56
+ wrapperRef: React.RefObject<HTMLDivElement> = React.createRef();
56
57
 
57
58
  componentDidMount() {
58
59
  this.mayUpdateOffset();
59
60
  const dom = findDOMNode(this) as HTMLElement;
60
61
  this.parent = dom.parentNode as HTMLElement;
61
62
  this.parent.classList.add('has-popover');
63
+
64
+ if (this.wrapperRef && this.wrapperRef.current) {
65
+ // https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener#使用_passive_改善的滚屏性能
66
+ this.wrapperRef.current.addEventListener('touchmove', preventDefault, {
67
+ passive: false,
68
+ capture: false
69
+ });
70
+ }
62
71
  }
63
72
 
64
73
  componentDidUpdate() {
@@ -67,6 +76,10 @@ export class PopOver extends React.PureComponent<PopOverPorps, PopOverState> {
67
76
 
68
77
  componentWillUnmount() {
69
78
  this.parent && this.parent.classList.remove('has-popover');
79
+
80
+ if (this.wrapperRef && this.wrapperRef.current) {
81
+ this.wrapperRef.current.removeEventListener('touchmove', preventDefault);
82
+ }
70
83
  }
71
84
 
72
85
  mayUpdateOffset() {
@@ -122,6 +135,7 @@ export class PopOver extends React.PureComponent<PopOverPorps, PopOverState> {
122
135
 
123
136
  return (
124
137
  <div
138
+ ref={this.wrapperRef}
125
139
  className={cx(
126
140
  `${ns}PopOver`,
127
141
  className,