@tendaui/components 1.2.4 → 1.3.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 (406) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +176 -176
  3. package/_util/scroll.ts +9 -0
  4. package/alert/_example/base.tsx +13 -0
  5. package/alert/_example/collapse.tsx +15 -0
  6. package/badge/_example/base.tsx +10 -0
  7. package/badge/_example/count.tsx +29 -0
  8. package/badge/_example/custom-color.tsx +32 -0
  9. package/badge/_example/dot.tsx +26 -0
  10. package/badge/_example/max-count.tsx +26 -0
  11. package/badge/_example/offset.tsx +29 -0
  12. package/badge/_example/shape.tsx +32 -0
  13. package/badge/_example/show-zero.tsx +23 -0
  14. package/badge/_example/size.tsx +35 -0
  15. package/badge/_example/standalone.tsx +14 -0
  16. package/badge/_example/text-count.tsx +26 -0
  17. package/badge/_example/with-button.tsx +23 -0
  18. package/button/_example/block.tsx +18 -0
  19. package/button/_example/disabled.tsx +22 -0
  20. package/button/_example/ghost.tsx +24 -0
  21. package/button/_example/link.tsx +15 -0
  22. package/button/_example/loading.tsx +19 -0
  23. package/button/_example/shape.tsx +18 -0
  24. package/button/_example/size.tsx +18 -0
  25. package/button/_example/suffix.tsx +16 -0
  26. package/button/_example/theme.tsx +14 -0
  27. package/button/_example/variant-base.tsx +24 -0
  28. package/button/_example/variant-dashed.tsx +24 -0
  29. package/button/_example/variant-outline.tsx +24 -0
  30. package/button/_example/variant-text.tsx +24 -0
  31. package/checkbox/_example/base.tsx +8 -0
  32. package/checkbox/_example/controlled.tsx +11 -0
  33. package/checkbox/_example/group-disabled.tsx +13 -0
  34. package/checkbox/_example/group-with-check-all.tsx +22 -0
  35. package/checkbox/_example/group-with-max.tsx +17 -0
  36. package/checkbox/_example/group-with-options.tsx +18 -0
  37. package/checkbox/_example/group.tsx +17 -0
  38. package/checkbox/_example/states.tsx +19 -0
  39. package/color-picker/ColorPicker.tsx +16 -2
  40. package/color-picker/_example/base.tsx +12 -0
  41. package/color-picker/_example/borderless.tsx +17 -0
  42. package/color-picker/_example/clearable.tsx +12 -0
  43. package/color-picker/_example/disabled.tsx +17 -0
  44. package/color-picker/_example/formats.tsx +30 -0
  45. package/color-picker/_example/manual-input.tsx +39 -0
  46. package/color-picker/_example/recent-colors.tsx +19 -0
  47. package/color-picker/_example/swatch-colors.tsx +28 -0
  48. package/color-picker/_example/with-alpha.tsx +21 -0
  49. package/color-picker/components/panel/format/inputs.tsx +1 -1
  50. package/color-picker/components/panel/index.tsx +13 -0
  51. package/color-picker/components/trigger.tsx +64 -13
  52. package/color-picker/defaultProps.ts +4 -1
  53. package/color-picker/utils/color-picker/cmyk.ts +89 -89
  54. package/color-picker/utils/color-picker/color.ts +467 -467
  55. package/color-picker/utils/color-picker/constants.ts +187 -187
  56. package/color-picker/utils/color-picker/draggable.ts +99 -100
  57. package/color-picker/utils/color-picker/format.ts +90 -95
  58. package/color-picker/utils/color-picker/gradient.ts +237 -243
  59. package/color-picker/utils/color-picker/index.ts +7 -7
  60. package/color-picker/utils/color-picker/types.ts +33 -33
  61. package/config-provider/ConfigContext.tsx +1 -0
  62. package/config-provider/ConfigProvider.tsx +18 -1
  63. package/config-provider/type.ts +5 -0
  64. package/dialog/_example/base.tsx +27 -0
  65. package/dialog/_example/confirm-loading.tsx +32 -0
  66. package/dialog/_example/custom-buttons.tsx +24 -0
  67. package/dialog/_example/full-screen.tsx +26 -0
  68. package/dialog/_example/hide-buttons.tsx +39 -0
  69. package/dialog/_example/modeless.tsx +25 -0
  70. package/dialog/_example/placement.tsx +40 -0
  71. package/dialog/_example/plugin-example.tsx +69 -0
  72. package/dialog/_example/themes.tsx +41 -0
  73. package/dialog/hooks/useDialogPosition.ts +35 -35
  74. package/drawer/Drawer.tsx +17 -9
  75. package/drawer/_example/custom-header-footer.tsx +29 -0
  76. package/drawer/_example/default.tsx +20 -0
  77. package/drawer/_example/events.tsx +53 -0
  78. package/drawer/_example/no-footer.tsx +20 -0
  79. package/drawer/_example/no-overlay.tsx +20 -0
  80. package/drawer/_example/placement.tsx +43 -0
  81. package/drawer/_example/size-draggable.tsx +26 -0
  82. package/drawer/_example/size.tsx +40 -0
  83. package/drawer/defaultProps.ts +1 -1
  84. package/fireworks/Fireworks.tsx +1 -10
  85. package/fireworks/index.ts +0 -1
  86. package/fireworks/type.ts +0 -1
  87. package/form/_example/complex.tsx +76 -0
  88. package/form/_example/default.tsx +58 -0
  89. package/form/_example/disabled.tsx +26 -0
  90. package/form/_example/form-list.tsx +74 -0
  91. package/form/_example/inline-layout.tsx +20 -0
  92. package/form/_example/label-align.tsx +46 -0
  93. package/form/_example/methods.tsx +66 -0
  94. package/form/_example/validation.tsx +71 -0
  95. package/form/hooks/useFormItemStyle.tsx +19 -7
  96. package/form/index.ts +20 -2
  97. package/form/type.ts +519 -519
  98. package/global-config/default-config.ts +95 -95
  99. package/global-config/locale/ar_KW.ts +259 -270
  100. package/global-config/locale/en_US.ts +265 -280
  101. package/global-config/locale/it_IT.ts +264 -287
  102. package/global-config/locale/ja_JP.ts +264 -279
  103. package/global-config/locale/ko_KR.ts +264 -279
  104. package/global-config/locale/ru_RU.ts +277 -288
  105. package/global-config/locale/zh_CN.ts +265 -279
  106. package/global-config/locale/zh_TW.ts +265 -279
  107. package/global-config/mobile/default-config.ts +6 -6
  108. package/global-config/mobile/locale/ar_KW.ts +112 -113
  109. package/global-config/mobile/locale/en_US.ts +113 -114
  110. package/global-config/mobile/locale/it_IT.ts +113 -114
  111. package/global-config/mobile/locale/ja_JP.ts +100 -101
  112. package/global-config/mobile/locale/ko_KR.ts +100 -101
  113. package/global-config/mobile/locale/ru_RU.ts +112 -113
  114. package/global-config/mobile/locale/zh_CN.ts +100 -101
  115. package/global-config/mobile/locale/zh_TW.ts +100 -101
  116. package/global-config/t.ts +111 -111
  117. package/hooks/useDebounce.ts +27 -0
  118. package/hooks/useLastest.ts +6 -2
  119. package/hooks/useResizeObserve.ts +0 -1
  120. package/index.ts +1 -1
  121. package/input/Input.tsx +53 -10
  122. package/input/_example/auto-width.tsx +14 -0
  123. package/input/_example/borderless.tsx +17 -0
  124. package/input/_example/clearable.tsx +14 -0
  125. package/input/_example/default.tsx +10 -0
  126. package/input/_example/disabled-readonly.tsx +12 -0
  127. package/input/_example/events.tsx +42 -0
  128. package/input/_example/group.tsx +14 -0
  129. package/input/_example/label-suffix.tsx +12 -0
  130. package/input/_example/max-length.tsx +11 -0
  131. package/input/_example/password.tsx +14 -0
  132. package/input/_example/sizes.tsx +12 -0
  133. package/input/_example/status.tsx +13 -0
  134. package/input/_example/text-align.tsx +12 -0
  135. package/input/_example/with-icon.tsx +13 -0
  136. package/input/type.ts +3 -0
  137. package/input/useLengthLimit.ts +122 -0
  138. package/input-number/InputNumber.tsx +124 -124
  139. package/input-number/_example/align.tsx +23 -0
  140. package/input-number/_example/auto-width.tsx +8 -0
  141. package/input-number/_example/default.tsx +8 -0
  142. package/input-number/_example/events.tsx +45 -0
  143. package/input-number/_example/format.tsx +27 -0
  144. package/input-number/_example/large-number.tsx +17 -0
  145. package/input-number/_example/min-max.tsx +14 -0
  146. package/input-number/_example/sizes.tsx +35 -0
  147. package/input-number/_example/status.tsx +65 -0
  148. package/input-number/_example/step-and-decimal.tsx +14 -0
  149. package/input-number/_example/themes.tsx +21 -0
  150. package/input-number/_example/with-suffix.tsx +12 -0
  151. package/input-number/defaultProps.ts +17 -17
  152. package/input-number/index.ts +9 -9
  153. package/input-number/style/css.js +1 -1
  154. package/input-number/style/index.js +1 -1
  155. package/input-number/useInputNumber.tsx +270 -270
  156. package/ip-input/_example/controlled.tsx +26 -0
  157. package/ip-input/_example/default.tsx +12 -0
  158. package/ip-input/_example/full-featured.tsx +32 -0
  159. package/ip-input/_example/ipv6.tsx +23 -0
  160. package/ip-input/_example/keyboard-navigation.tsx +19 -0
  161. package/ip-input/_example/paste-demo.tsx +23 -0
  162. package/ip-input/_example/states.tsx +21 -0
  163. package/ip-input/_example/with-cidr.tsx +23 -0
  164. package/layout/_example/combine-left.tsx +54 -0
  165. package/layout/_example/combine-right.tsx +54 -0
  166. package/layout/_example/custom-aside-width.tsx +56 -0
  167. package/layout/_example/custom-height.tsx +45 -0
  168. package/layout/_example/double-sidebar.tsx +57 -0
  169. package/layout/_example/side-navigation-right.tsx +51 -0
  170. package/layout/_example/side-navigation.tsx +51 -0
  171. package/layout/_example/top-navigation.tsx +41 -0
  172. package/list/ListItem.tsx +36 -36
  173. package/list/ListItemMeta.tsx +40 -40
  174. package/list/_example/async-loading.tsx +46 -0
  175. package/list/_example/default.tsx +23 -0
  176. package/list/_example/header-footer.tsx +40 -0
  177. package/list/_example/multiline.tsx +24 -0
  178. package/list/_example/scroll-loading.tsx +69 -0
  179. package/list/_example/sizes.tsx +45 -0
  180. package/list/_example/split.tsx +36 -0
  181. package/list/_example/stripe.tsx +24 -0
  182. package/list/_example/virtual-scroll.tsx +51 -0
  183. package/list/_example/with-image.tsx +26 -0
  184. package/list/defaultProps.ts +11 -11
  185. package/list/hooks/useListVirtualScroll.ts +82 -82
  186. package/list/style/css.js +1 -1
  187. package/list/style/index.js +1 -1
  188. package/loading/_example/default.tsx +6 -0
  189. package/loading/_example/delay.tsx +53 -0
  190. package/loading/_example/fullscreen.tsx +29 -0
  191. package/loading/_example/inherit-color.tsx +24 -0
  192. package/loading/_example/no-overlay.tsx +15 -0
  193. package/loading/_example/sizes.tsx +25 -0
  194. package/loading/_example/with-text.tsx +12 -0
  195. package/loading/_example/wrapper.tsx +30 -0
  196. package/locale/LocalReceiver.ts +55 -55
  197. package/locale/ar_KW.ts +7 -7
  198. package/locale/en_US.ts +7 -7
  199. package/locale/it_IT.ts +6 -6
  200. package/locale/ja_JP.ts +6 -6
  201. package/locale/ko_KR.ts +6 -6
  202. package/locale/ru_RU.ts +6 -6
  203. package/locale/zh_CN.ts +5 -5
  204. package/locale/zh_TW.ts +7 -7
  205. package/notification/_example/default.tsx +31 -0
  206. package/notification/_example/long-content.tsx +37 -0
  207. package/notification/_example/stacking.tsx +40 -0
  208. package/notification/_example/types.tsx +78 -0
  209. package/notification/_example/usage-example.tsx +62 -0
  210. package/package.json +4 -3
  211. package/popup/Popup.tsx +17 -5
  212. package/popup/_example/controlled.tsx +32 -0
  213. package/popup/_example/custom-content.tsx +64 -0
  214. package/popup/_example/default.tsx +19 -0
  215. package/popup/_example/delay.tsx +35 -0
  216. package/popup/_example/disabled.tsx +17 -0
  217. package/popup/_example/no-arrow.tsx +17 -0
  218. package/popup/_example/placements.tsx +61 -0
  219. package/popup/_example/triggers.tsx +26 -0
  220. package/radio/_example/allow-uncheck.tsx +19 -0
  221. package/radio/_example/button-style.tsx +40 -0
  222. package/radio/_example/controlled.tsx +13 -0
  223. package/radio/_example/default.tsx +13 -0
  224. package/radio/_example/group-disabled.tsx +22 -0
  225. package/radio/_example/group-with-options.tsx +20 -0
  226. package/radio/_example/group.tsx +19 -0
  227. package/radio/_example/sizes.tsx +37 -0
  228. package/radio/_example/states.tsx +20 -0
  229. package/select/_example/collapsed.tsx +30 -0
  230. package/select/_example/creatable.tsx +36 -0
  231. package/select/_example/custom-content.tsx +26 -0
  232. package/select/_example/default.tsx +29 -0
  233. package/select/_example/disabled.tsx +20 -0
  234. package/select/_example/filterable.tsx +27 -0
  235. package/select/_example/group-options.tsx +44 -0
  236. package/select/_example/label-suffix.tsx +24 -0
  237. package/select/_example/loading.tsx +19 -0
  238. package/select/_example/multiple.tsx +31 -0
  239. package/select/_example/sizes.tsx +20 -0
  240. package/select/_example/status.tsx +27 -0
  241. package/select/type.ts +382 -382
  242. package/select-input/type.ts +280 -280
  243. package/slider/Slider.tsx +13 -5
  244. package/slider/SliderHandleButton.tsx +50 -50
  245. package/slider/_example/custom-label.tsx +19 -0
  246. package/slider/_example/default.tsx +14 -0
  247. package/slider/_example/disabled.tsx +17 -0
  248. package/slider/_example/marks.tsx +31 -0
  249. package/slider/_example/range.tsx +16 -0
  250. package/slider/_example/step.tsx +14 -0
  251. package/slider/_example/vertical.tsx +26 -0
  252. package/slider/_example/with-input-number.tsx +21 -0
  253. package/slider/defaultProps.ts +15 -15
  254. package/slider/style/css.js +1 -1
  255. package/slider/style/index.js +1 -1
  256. package/slider/type.ts +1 -1
  257. package/styles/_global.scss +40 -40
  258. package/styles/_vars.scss +374 -358
  259. package/styles/components/alert/_index.scss +175 -175
  260. package/styles/components/alert/_vars.scss +41 -41
  261. package/styles/components/badge/_index.scss +71 -71
  262. package/styles/components/badge/_vars.scss +26 -26
  263. package/styles/components/button/_index.scss +499 -499
  264. package/styles/components/button/_mixins.scss +40 -40
  265. package/styles/components/button/_vars.scss +121 -121
  266. package/styles/components/checkbox/_index.scss +158 -158
  267. package/styles/components/checkbox/_var.scss +59 -59
  268. package/styles/components/color-picker/_index.scss +586 -586
  269. package/styles/components/color-picker/_vars.scss +79 -79
  270. package/styles/components/dialog/_animate.scss +133 -133
  271. package/styles/components/dialog/_index.scss +310 -312
  272. package/styles/components/dialog/_vars.scss +60 -60
  273. package/styles/components/drawer/_index.scss +206 -205
  274. package/styles/components/drawer/_var.scss +55 -55
  275. package/styles/components/fireworks/_index.scss +86 -86
  276. package/styles/components/fireworks/_vars.scss +5 -5
  277. package/styles/components/form/_index.scss +175 -174
  278. package/styles/components/form/_mixins.scss +74 -74
  279. package/styles/components/form/_vars.scss +101 -101
  280. package/styles/components/input/_index.scss +350 -350
  281. package/styles/components/input/_mixins.scss +120 -118
  282. package/styles/components/input/_vars.scss +130 -130
  283. package/styles/components/input-number/_index.scss +340 -339
  284. package/styles/components/input-number/_vars.scss +56 -56
  285. package/styles/components/ip-input/_index.scss +277 -277
  286. package/styles/components/layout/_index.scss +47 -47
  287. package/styles/components/layout/_vars.scss +19 -19
  288. package/styles/components/layout/doc.scss +74 -74
  289. package/styles/components/list/_index.scss +172 -172
  290. package/styles/components/list/_vars.scss +42 -42
  291. package/styles/components/loading/_index.scss +113 -113
  292. package/styles/components/loading/_vars.scss +40 -40
  293. package/styles/components/notification/_index.scss +144 -144
  294. package/styles/components/notification/_mixins.scss +13 -13
  295. package/styles/components/notification/_vars.scss +60 -60
  296. package/styles/components/popup/_index.scss +78 -78
  297. package/styles/components/popup/_mixin.scss +149 -149
  298. package/styles/components/popup/_vars.scss +33 -33
  299. package/styles/components/radio/_index.scss +376 -376
  300. package/styles/components/radio/_vars.scss +89 -89
  301. package/styles/components/select/_index.scss +291 -291
  302. package/styles/components/select/_var.scss +64 -64
  303. package/styles/components/select-input/_index.scss +5 -5
  304. package/styles/components/select-input/_var.scss +4 -4
  305. package/styles/components/slider/_index.scss +241 -241
  306. package/styles/components/slider/_vars.scss +51 -51
  307. package/styles/components/switch/_index.scss +248 -165
  308. package/styles/components/switch/_vars.scss +63 -63
  309. package/styles/components/table/_index.scss +194 -186
  310. package/styles/components/table/_var.scss +52 -52
  311. package/styles/components/tabs/_index.scss +165 -166
  312. package/styles/components/tabs/_mixins.scss +11 -11
  313. package/styles/components/tabs/_vars.scss +72 -72
  314. package/styles/components/tag/_index.scss +317 -317
  315. package/styles/components/tag/_var.scss +86 -86
  316. package/styles/components/tag-input/_index.scss +164 -164
  317. package/styles/components/tag-input/_vars.scss +17 -17
  318. package/styles/components/tooltip/_index.scss +104 -0
  319. package/styles/components/tooltip/_vars.scss +23 -0
  320. package/styles/mixins/_focus.scss +8 -8
  321. package/styles/mixins/_layout.scss +32 -32
  322. package/styles/mixins/_reset.scss +11 -11
  323. package/styles/mixins/_scrollbar.scss +32 -32
  324. package/styles/mixins/_text.scss +50 -50
  325. package/styles/themes/_dark.scss +169 -169
  326. package/styles/themes/_font.scss +69 -69
  327. package/styles/themes/_index.scss +5 -5
  328. package/styles/themes/_light.scss +170 -170
  329. package/styles/themes/_radius.scss +9 -9
  330. package/styles/themes/_size.scss +68 -68
  331. package/styles/utilities/_animation.scss +58 -58
  332. package/styles/utilities/_tips.scss +10 -10
  333. package/switch/_example/async-change.tsx +25 -0
  334. package/switch/_example/before-change.tsx +22 -0
  335. package/switch/_example/controlled.tsx +14 -0
  336. package/switch/_example/custom-value.tsx +21 -0
  337. package/switch/_example/default.tsx +6 -0
  338. package/switch/_example/disabled.tsx +25 -0
  339. package/switch/_example/loading.tsx +17 -0
  340. package/switch/_example/sizes.tsx +21 -0
  341. package/switch/_example/with-label.tsx +21 -0
  342. package/tab/TabPanel.tsx +9 -6
  343. package/tab/_example/addable.tsx +45 -0
  344. package/tab/_example/card-theme.tsx +22 -0
  345. package/tab/_example/default.tsx +22 -0
  346. package/tab/_example/disabled.tsx +38 -0
  347. package/tab/_example/lazy.tsx +25 -0
  348. package/tab/_example/placement.tsx +36 -0
  349. package/tab/_example/removable.tsx +31 -0
  350. package/tab/_example/sizes.tsx +31 -0
  351. package/tab/_example/with-action.tsx +26 -0
  352. package/table/Cell.tsx +3 -6
  353. package/table/Ellipsis.tsx +73 -0
  354. package/table/_example/alignment.tsx +46 -0
  355. package/table/_example/auto-width.tsx +47 -0
  356. package/table/_example/bordered-stripe-hover.tsx +42 -0
  357. package/table/_example/bordered.tsx +42 -0
  358. package/table/_example/cell-click.tsx +52 -0
  359. package/table/_example/complex.tsx +82 -0
  360. package/table/_example/custom-cell.tsx +68 -0
  361. package/table/_example/custom-empty.tsx +37 -0
  362. package/table/_example/custom-row-class-name.tsx +57 -0
  363. package/table/_example/default.tsx +42 -0
  364. package/table/_example/ellipsis.tsx +56 -0
  365. package/table/_example/empty.tsx +28 -0
  366. package/table/_example/fixed-width.tsx +48 -0
  367. package/table/_example/hover.tsx +42 -0
  368. package/table/_example/row-click.tsx +52 -0
  369. package/table/_example/sizes.tsx +57 -0
  370. package/table/_example/stripe.tsx +42 -0
  371. package/table/_example/vertical-align.tsx +110 -0
  372. package/table/hooks/useTableClassName.ts +3 -3
  373. package/table/index.ts +2 -0
  374. package/table/type.ts +1 -0
  375. package/tag/Tag.tsx +1 -1
  376. package/tag/_example/closable.tsx +44 -0
  377. package/tag/_example/default.tsx +17 -0
  378. package/tag/_example/disabled.tsx +19 -0
  379. package/tag/_example/sizes.tsx +18 -0
  380. package/tag/_example/variants.tsx +37 -0
  381. package/tag-input/_example/collapsed.tsx +27 -0
  382. package/tag-input/_example/controlled-uncontrolled.tsx +26 -0
  383. package/tag-input/_example/default.tsx +15 -0
  384. package/tag-input/_example/disabled-readonly.tsx +21 -0
  385. package/tag-input/_example/events.tsx +64 -0
  386. package/tag-input/_example/excess-display.tsx +27 -0
  387. package/tag-input/_example/max-tags.tsx +22 -0
  388. package/tag-input/_example/sizes.tsx +21 -0
  389. package/tag-input/_example/status.tsx +37 -0
  390. package/tag-input/_example/with-label.tsx +23 -0
  391. package/tag-input/hooks/useTagList.tsx +1 -1
  392. package/tooltip/Tooltip.tsx +76 -0
  393. package/tooltip/_example/base.tsx +26 -0
  394. package/tooltip/_example/custom-content.tsx +47 -0
  395. package/tooltip/_example/placement.tsx +33 -0
  396. package/tooltip/_example/theme.tsx +34 -0
  397. package/tooltip/defaultProps.ts +14 -0
  398. package/tooltip/index.ts +7 -0
  399. package/tooltip/style/index.js +1 -0
  400. package/tooltip/type.ts +99 -0
  401. package/utils/input-number/large-number.ts +423 -423
  402. package/utils/input-number/number.ts +257 -257
  403. package/utils/log/index.ts +3 -3
  404. package/utils/log/log.ts +29 -30
  405. package/utils/log/types.ts +9 -12
  406. package/utils/style.ts +58 -58
@@ -1,243 +1,237 @@
1
- import { isString, isNull } from 'lodash-es';
2
- /* eslint-disable no-param-reassign */
3
- /**
4
- * 用于反解析渐变字符串为对象
5
- * https://stackoverflow.com/questions/20215440/parse-css-gradient-rule-with-javascript-regex
6
- */
7
- import tinyColor from 'tinycolor2';
8
-
9
- /**
10
- * Utility combine multiple regular expressions.
11
- *
12
- * @param {RegExp[]|string[]} regexpList List of regular expressions or strings.
13
- * @param {string} flags Normal RegExp flags.
14
- */
15
- const combineRegExp = (regexpList: (string | RegExp)[], flags: string): RegExp => {
16
- let source = '';
17
- for (let i = 0; i < regexpList.length; i++) {
18
- if (isString(regexpList[i])) {
19
- source += regexpList[i];
20
- } else {
21
- source += (regexpList[i] as RegExp).source;
22
- }
23
- }
24
- return new RegExp(source, flags);
25
- };
26
-
27
- interface RegExpLib {
28
- gradientSearch: RegExp;
29
- colorStopSearch: RegExp;
30
- }
31
-
32
- interface ColorStop {
33
- color: string;
34
- position?: string;
35
- }
36
-
37
- interface ParseGradientResult {
38
- original: string;
39
- colorStopList?: ColorStop[];
40
- line?: string;
41
- angle?: string;
42
- sideCorner?: string;
43
- }
44
-
45
- /**
46
- * Generate the required regular expressions once.
47
- *
48
- * Regular Expressions are easier to manage this way and can be well described.
49
- *
50
- * @result {object} Object containing regular expressions.
51
- */
52
- const generateRegExp = (): RegExpLib => {
53
- // Note any variables with "Capture" in name include capturing bracket set(s).
54
- const searchFlags = 'gi'; // ignore case for angles, "rgb" etc
55
- const rAngle = /(?:[+-]?\d*\.?\d+)(?:deg|grad|rad|turn)/; // Angle +ive, -ive and angle types
56
- // optional 2nd part
57
- const rSideCornerCapture = /to\s+((?:(?:left|right|top|bottom)(?:\s+(?:top|bottom|left|right))?))/;
58
- const rComma = /\s*,\s*/; // Allow space around comma.
59
- const rColorHex = /#(?:[a-f0-9]{6}|[a-f0-9]{3})/; // 3 or 6 character form
60
- const rDigits3 = /\(\s*(?:\d{1,3}\s*,\s*){2}\d{1,3}\s*\)/;
61
- const // "(1, 2, 3)"
62
- rDigits4 = /\(\s*(?:\d{1,3}\s*,\s*){2}\d{1,3}\s*,\s*\d*\.?\d+\)/;
63
- const // "(1, 2, 3, 4)"
64
- rValue = /(?:[+-]?\d*\.?\d+)(?:%|[a-z]+)?/;
65
- const // ".9", "-5px", "100%".
66
- rKeyword = /[_a-z-][_a-z0-9-]*/;
67
- const // "red", "transparent".
68
- rColor = combineRegExp(
69
- ['(?:', rColorHex, '|', '(?:rgb|hsl)', rDigits3, '|', '(?:rgba|hsla)', rDigits4, '|', rKeyword, ')'],
70
- '',
71
- );
72
- const rColorStop = combineRegExp([rColor, '(?:\\s+', rValue, '(?:\\s+', rValue, ')?)?'], '');
73
- const // Single Color Stop, optional %, optional length.
74
- rColorStopList = combineRegExp(['(?:', rColorStop, rComma, ')*', rColorStop], '');
75
- const // List of color stops min 1.
76
- rLineCapture = combineRegExp(['(?:(', rAngle, ')|', rSideCornerCapture, ')'], '');
77
- const // Angle or SideCorner
78
- rGradientSearch = combineRegExp(['(?:(', rLineCapture, ')', rComma, ')?(', rColorStopList, ')'], searchFlags);
79
- const // Capture 1:"line", 2:"angle" (optional), 3:"side corner" (optional) and 4:"stop list".
80
- rColorStopSearch = combineRegExp(
81
- ['\\s*(', rColor, ')', '(?:\\s+', '(', rValue, '))?', '(?:', rComma, '\\s*)?'],
82
- searchFlags,
83
- ); // Capture 1:"color" and 2:"position" (optional).
84
-
85
- return {
86
- gradientSearch: rGradientSearch,
87
- colorStopSearch: rColorStopSearch,
88
- };
89
- };
90
-
91
- /**
92
- * Actually parse the input gradient parameters string into an object for reusability.
93
- *
94
- *
95
- * @note Really this only supports the standard syntax not historical versions, see MDN for details
96
- * https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient
97
- *
98
- * @param regExpLib
99
- * @param {string} input
100
- * @returns {object|undefined}
101
- */
102
- const parseGradient = (regExpLib: RegExpLib, input: string) => {
103
- let result: ParseGradientResult;
104
- let matchColorStop: any;
105
- let stopResult: ColorStop;
106
-
107
- // reset search position, because we reuse regex.
108
- regExpLib.gradientSearch.lastIndex = 0;
109
-
110
- const matchGradient = regExpLib.gradientSearch.exec(input);
111
- if (!isNull(matchGradient)) {
112
- result = {
113
- original: matchGradient[0],
114
- colorStopList: [],
115
- };
116
-
117
- // Line (Angle or Side-Corner).
118
- if (matchGradient[1]) {
119
- // eslint-disable-next-line prefer-destructuring
120
- result.line = matchGradient[1];
121
- }
122
- // Angle or undefined if side-corner.
123
- if (matchGradient[2]) {
124
- // eslint-disable-next-line prefer-destructuring
125
- result.angle = matchGradient[2];
126
- }
127
- // Side-corner or undefined if angle.
128
- if (matchGradient[3]) {
129
- // eslint-disable-next-line prefer-destructuring
130
- result.sideCorner = matchGradient[3];
131
- }
132
-
133
- // reset search position, because we reuse regex.
134
- regExpLib.colorStopSearch.lastIndex = 0;
135
-
136
- // Loop though all the color-stops.
137
- matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[4]);
138
- while (!isNull(matchColorStop)) {
139
- stopResult = {
140
- color: matchColorStop[1],
141
- };
142
-
143
- // Position (optional).
144
- if (matchColorStop[2]) {
145
- // eslint-disable-next-line prefer-destructuring
146
- stopResult.position = matchColorStop[2];
147
- }
148
- result.colorStopList.push(stopResult);
149
-
150
- // Continue searching from previous position.
151
- matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[4]);
152
- }
153
- }
154
-
155
- // Can be undefined if match not found.
156
- return result;
157
- };
158
-
159
- export interface GradientColorPoint {
160
- id?: string;
161
- color?: string;
162
- left?: number;
163
- }
164
-
165
- export interface GradientColors {
166
- points: GradientColorPoint[];
167
- degree: number;
168
- }
169
-
170
- const REGEXP_LIB = generateRegExp();
171
- const REG_GRADIENT = /.*gradient\s*\(((?:\([^)]*\)|[^)(]*)*)\)/gim;
172
-
173
- /**
174
- * 验证是否是渐变字符串
175
- * @param input
176
- * @returns
177
- */
178
- export const isGradientColor = (input: string): null | RegExpExecArray => {
179
- REG_GRADIENT.lastIndex = 0;
180
- return REG_GRADIENT.exec(input);
181
- };
182
-
183
- // 边界字符串和角度关系
184
- const sideCornerDegreeMap = {
185
- top: 0,
186
- right: 90,
187
- bottom: 180,
188
- left: 270,
189
- 'top left': 315,
190
- 'left top': 315,
191
- 'top right': 45,
192
- 'right top': 45,
193
- 'bottom left': 225,
194
- 'left bottom': 225,
195
- 'bottom right': 135,
196
- 'right bottom': 135,
197
- };
198
-
199
- /**
200
- * 解析渐变字符串为 GradientColors 对象
201
- * @param input
202
- * @returns
203
- */
204
- export const parseGradientString = (input: string): GradientColors | false => {
205
- const match = isGradientColor(input);
206
- if (!match) return false;
207
-
208
- const gradientColors: GradientColors = {
209
- points: [],
210
- degree: 0,
211
- };
212
-
213
- const result: ParseGradientResult = parseGradient(REGEXP_LIB, match[1]);
214
- if (result.original.trim() !== match[1].trim()) return false;
215
-
216
- const points: GradientColorPoint[] = result.colorStopList.map(
217
- ({ color, position }, index, array) => {
218
- const point = Object.create(null);
219
- point.color = tinyColor(color).toRgbString();
220
-
221
- let left = parseFloat(position);
222
- if (Number.isNaN(left)) {
223
- left = (index / (array.length - 1)) * 100;
224
- }
225
-
226
- point.left = left;
227
- return point;
228
- }
229
- );
230
- gradientColors.points = points;
231
-
232
- let degree = parseInt(result.angle, 10);
233
- if (Number.isNaN(degree)) {
234
- /* 如果角度不存在,使用 CSS 渐变的默认逻辑(180 deg)
235
- https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_images/Using_CSS_gradients */
236
- degree = sideCornerDegreeMap[result.sideCorner as keyof typeof sideCornerDegreeMap] || 180;
237
- }
238
- gradientColors.degree = degree;
239
-
240
- return gradientColors;
241
- };
242
-
243
- export default parseGradientString;
1
+ import { isString, isNull } from "lodash-es";
2
+
3
+ /**
4
+ * 用于反解析渐变字符串为对象
5
+ * https://stackoverflow.com/questions/20215440/parse-css-gradient-rule-with-javascript-regex
6
+ */
7
+ import tinyColor from "tinycolor2";
8
+
9
+ /**
10
+ * Utility combine multiple regular expressions.
11
+ *
12
+ * @param {RegExp[]|string[]} regexpList List of regular expressions or strings.
13
+ * @param {string} flags Normal RegExp flags.
14
+ */
15
+ const combineRegExp = (regexpList: (string | RegExp)[], flags: string): RegExp => {
16
+ let source = "";
17
+ for (let i = 0; i < regexpList.length; i++) {
18
+ if (isString(regexpList[i])) {
19
+ source += regexpList[i];
20
+ } else {
21
+ source += (regexpList[i] as RegExp).source;
22
+ }
23
+ }
24
+ return new RegExp(source, flags);
25
+ };
26
+
27
+ interface RegExpLib {
28
+ gradientSearch: RegExp;
29
+ colorStopSearch: RegExp;
30
+ }
31
+
32
+ interface ColorStop {
33
+ color: string;
34
+ position?: string;
35
+ }
36
+
37
+ interface ParseGradientResult {
38
+ original: string;
39
+ colorStopList?: ColorStop[];
40
+ line?: string;
41
+ angle?: string;
42
+ sideCorner?: string;
43
+ }
44
+
45
+ /**
46
+ * Generate the required regular expressions once.
47
+ *
48
+ * Regular Expressions are easier to manage this way and can be well described.
49
+ *
50
+ * @result {object} Object containing regular expressions.
51
+ */
52
+ const generateRegExp = (): RegExpLib => {
53
+ // Note any variables with "Capture" in name include capturing bracket set(s).
54
+ const searchFlags = "gi"; // ignore case for angles, "rgb" etc
55
+ const rAngle = /(?:[+-]?\d*\.?\d+)(?:deg|grad|rad|turn)/; // Angle +ive, -ive and angle types
56
+ // optional 2nd part
57
+ const rSideCornerCapture = /to\s+((?:(?:left|right|top|bottom)(?:\s+(?:top|bottom|left|right))?))/;
58
+ const rComma = /\s*,\s*/; // Allow space around comma.
59
+ const rColorHex = /#(?:[a-f0-9]{6}|[a-f0-9]{3})/; // 3 or 6 character form
60
+ const rDigits3 = /\(\s*(?:\d{1,3}\s*,\s*){2}\d{1,3}\s*\)/;
61
+ const // "(1, 2, 3)"
62
+ rDigits4 = /\(\s*(?:\d{1,3}\s*,\s*){2}\d{1,3}\s*,\s*\d*\.?\d+\)/;
63
+ const // "(1, 2, 3, 4)"
64
+ rValue = /(?:[+-]?\d*\.?\d+)(?:%|[a-z]+)?/;
65
+ const // ".9", "-5px", "100%".
66
+ rKeyword = /[_a-z-][_a-z0-9-]*/;
67
+ const // "red", "transparent".
68
+ rColor = combineRegExp(
69
+ ["(?:", rColorHex, "|", "(?:rgb|hsl)", rDigits3, "|", "(?:rgba|hsla)", rDigits4, "|", rKeyword, ")"],
70
+ ""
71
+ );
72
+ const rColorStop = combineRegExp([rColor, "(?:\\s+", rValue, "(?:\\s+", rValue, ")?)?"], "");
73
+ const // Single Color Stop, optional %, optional length.
74
+ rColorStopList = combineRegExp(["(?:", rColorStop, rComma, ")*", rColorStop], "");
75
+ const // List of color stops min 1.
76
+ rLineCapture = combineRegExp(["(?:(", rAngle, ")|", rSideCornerCapture, ")"], "");
77
+ const // Angle or SideCorner
78
+ rGradientSearch = combineRegExp(["(?:(", rLineCapture, ")", rComma, ")?(", rColorStopList, ")"], searchFlags);
79
+ const // Capture 1:"line", 2:"angle" (optional), 3:"side corner" (optional) and 4:"stop list".
80
+ rColorStopSearch = combineRegExp(
81
+ ["\\s*(", rColor, ")", "(?:\\s+", "(", rValue, "))?", "(?:", rComma, "\\s*)?"],
82
+ searchFlags
83
+ ); // Capture 1:"color" and 2:"position" (optional).
84
+
85
+ return {
86
+ gradientSearch: rGradientSearch,
87
+ colorStopSearch: rColorStopSearch
88
+ };
89
+ };
90
+
91
+ /**
92
+ * Actually parse the input gradient parameters string into an object for reusability.
93
+ *
94
+ *
95
+ * @note Really this only supports the standard syntax not historical versions, see MDN for details
96
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient
97
+ *
98
+ * @param regExpLib
99
+ * @param {string} input
100
+ * @returns {object|undefined}
101
+ */
102
+ const parseGradient = (regExpLib: RegExpLib, input: string) => {
103
+ let result: ParseGradientResult;
104
+ let matchColorStop: any;
105
+ let stopResult: ColorStop;
106
+
107
+ // reset search position, because we reuse regex.
108
+ regExpLib.gradientSearch.lastIndex = 0;
109
+
110
+ const matchGradient = regExpLib.gradientSearch.exec(input);
111
+ if (!isNull(matchGradient)) {
112
+ result = {
113
+ original: matchGradient[0],
114
+ colorStopList: []
115
+ };
116
+
117
+ // Line (Angle or Side-Corner).
118
+ if (matchGradient[1]) {
119
+ result.line = matchGradient[1];
120
+ }
121
+ // Angle or undefined if side-corner.
122
+ if (matchGradient[2]) {
123
+ result.angle = matchGradient[2];
124
+ }
125
+ // Side-corner or undefined if angle.
126
+ if (matchGradient[3]) {
127
+ result.sideCorner = matchGradient[3];
128
+ }
129
+
130
+ // reset search position, because we reuse regex.
131
+ regExpLib.colorStopSearch.lastIndex = 0;
132
+
133
+ // Loop though all the color-stops.
134
+ matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[4]);
135
+ while (!isNull(matchColorStop)) {
136
+ stopResult = {
137
+ color: matchColorStop[1]
138
+ };
139
+
140
+ // Position (optional).
141
+ if (matchColorStop[2]) {
142
+ stopResult.position = matchColorStop[2];
143
+ }
144
+ result.colorStopList.push(stopResult);
145
+
146
+ // Continue searching from previous position.
147
+ matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[4]);
148
+ }
149
+ }
150
+
151
+ // Can be undefined if match not found.
152
+ return result;
153
+ };
154
+
155
+ export interface GradientColorPoint {
156
+ id?: string;
157
+ color?: string;
158
+ left?: number;
159
+ }
160
+
161
+ export interface GradientColors {
162
+ points: GradientColorPoint[];
163
+ degree: number;
164
+ }
165
+
166
+ const REGEXP_LIB = generateRegExp();
167
+ const REG_GRADIENT = /.*gradient\s*\(((?:\([^)]*\)|[^)(]*)*)\)/gim;
168
+
169
+ /**
170
+ * 验证是否是渐变字符串
171
+ * @param input
172
+ * @returns
173
+ */
174
+ export const isGradientColor = (input: string): null | RegExpExecArray => {
175
+ REG_GRADIENT.lastIndex = 0;
176
+ return REG_GRADIENT.exec(input);
177
+ };
178
+
179
+ // 边界字符串和角度关系
180
+ const sideCornerDegreeMap = {
181
+ top: 0,
182
+ right: 90,
183
+ bottom: 180,
184
+ left: 270,
185
+ "top left": 315,
186
+ "left top": 315,
187
+ "top right": 45,
188
+ "right top": 45,
189
+ "bottom left": 225,
190
+ "left bottom": 225,
191
+ "bottom right": 135,
192
+ "right bottom": 135
193
+ };
194
+
195
+ /**
196
+ * 解析渐变字符串为 GradientColors 对象
197
+ * @param input
198
+ * @returns
199
+ */
200
+ export const parseGradientString = (input: string): GradientColors | false => {
201
+ const match = isGradientColor(input);
202
+ if (!match) return false;
203
+
204
+ const gradientColors: GradientColors = {
205
+ points: [],
206
+ degree: 0
207
+ };
208
+
209
+ const result: ParseGradientResult = parseGradient(REGEXP_LIB, match[1]);
210
+ if (result.original.trim() !== match[1].trim()) return false;
211
+
212
+ const points: GradientColorPoint[] = result.colorStopList.map(({ color, position }, index, array) => {
213
+ const point = Object.create(null);
214
+ point.color = tinyColor(color).toRgbString();
215
+
216
+ let left = parseFloat(position);
217
+ if (Number.isNaN(left)) {
218
+ left = (index / (array.length - 1)) * 100;
219
+ }
220
+
221
+ point.left = left;
222
+ return point;
223
+ });
224
+ gradientColors.points = points;
225
+
226
+ let degree = parseInt(result.angle, 10);
227
+ if (Number.isNaN(degree)) {
228
+ /* 如果角度不存在,使用 CSS 渐变的默认逻辑(180 deg)
229
+ https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_images/Using_CSS_gradients */
230
+ degree = sideCornerDegreeMap[result.sideCorner as keyof typeof sideCornerDegreeMap] || 180;
231
+ }
232
+ gradientColors.degree = degree;
233
+
234
+ return gradientColors;
235
+ };
236
+
237
+ export default parseGradientString;
@@ -1,7 +1,7 @@
1
- export * from "./cmyk";
2
- export * from "./color";
3
- export * from "./constants";
4
- export * from "./draggable";
5
- export * from "./format";
6
- export * from "./gradient";
7
- export * from "./types";
1
+ export * from "./cmyk";
2
+ export * from "./color";
3
+ export * from "./constants";
4
+ export * from "./draggable";
5
+ export * from "./format";
6
+ export * from "./gradient";
7
+ export * from "./types";
@@ -1,33 +1,33 @@
1
- import { ALPHA_FORMAT_MAP, FORMATS } from './constants';
2
-
3
- /**
4
- * 非透明色类型
5
- */
6
- export type BasicColorFormat = typeof FORMATS[number];
7
-
8
- /**
9
- * 支持转为透明格式的非透明色类型
10
- */
11
- export type AlphaConvertibleFormat = keyof typeof ALPHA_FORMAT_MAP;
12
-
13
- /**
14
- * 透明色类型
15
- */
16
- export type AlphaColorFormat = typeof ALPHA_FORMAT_MAP[AlphaConvertibleFormat];
17
-
18
- /**
19
- * 完整的颜色格式类型
20
- */
21
- export type ColorFormat = BasicColorFormat | AlphaColorFormat;
22
-
23
- /**
24
- * 不同颜色格式对应的输入框配置
25
- */
26
- export interface ColorInputProp {
27
- key: string;
28
- min?: number;
29
- max?: number;
30
- type: 'input' | 'inputNumber';
31
- flex?: number;
32
- format?: Function;
33
- }
1
+ import { ALPHA_FORMAT_MAP, FORMATS } from "./constants";
2
+
3
+ /**
4
+ * 非透明色类型
5
+ */
6
+ export type BasicColorFormat = (typeof FORMATS)[number];
7
+
8
+ /**
9
+ * 支持转为透明格式的非透明色类型
10
+ */
11
+ export type AlphaConvertibleFormat = keyof typeof ALPHA_FORMAT_MAP;
12
+
13
+ /**
14
+ * 透明色类型
15
+ */
16
+ export type AlphaColorFormat = (typeof ALPHA_FORMAT_MAP)[AlphaConvertibleFormat];
17
+
18
+ /**
19
+ * 完整的颜色格式类型
20
+ */
21
+ export type ColorFormat = BasicColorFormat | AlphaColorFormat;
22
+
23
+ /**
24
+ * 不同颜色格式对应的输入框配置
25
+ */
26
+ export interface ColorInputProp {
27
+ key: string;
28
+ min?: number;
29
+ max?: number;
30
+ type: "input" | "inputNumber";
31
+ flex?: number;
32
+ format?: Function;
33
+ }
@@ -6,6 +6,7 @@ import defaultLocale from "../locale/zh_CN";
6
6
 
7
7
  export const defaultGlobalConfig: GlobalConfigProvider = {
8
8
  classPrefix: defaultClassPrefix,
9
+ direction: "ltr",
9
10
  attach: null,
10
11
  form: {},
11
12
  icon: {} as Record<string, typeof Icon>,
@@ -36,6 +36,7 @@ export const setGlobalConfig = (configInfo?: GlobalConfigProvider) => {
36
36
  export default function ConfigProvider({ children, globalConfig, notSet }: ConfigProviderProps) {
37
37
  const defaultData = cloneDeep(defaultGlobalConfig);
38
38
  const mergedGlobalConfig = merge(defaultData, globalConfig);
39
+ const direction = mergedGlobalConfig.direction || "ltr";
39
40
 
40
41
  useEffect(() => {
41
42
  if (!notSet) {
@@ -44,7 +45,23 @@ export default function ConfigProvider({ children, globalConfig, notSet }: Confi
44
45
  }
45
46
  }, [mergedGlobalConfig, notSet]);
46
47
 
47
- return <ConfigContext.Provider value={{ globalConfig: mergedGlobalConfig }}>{children}</ConfigContext.Provider>;
48
+ useEffect(() => {
49
+ if (notSet || typeof document === "undefined") return;
50
+ document.documentElement.setAttribute("dir", direction);
51
+ document.body.setAttribute("dir", direction);
52
+ }, [direction, notSet]);
53
+
54
+ return (
55
+ <ConfigContext.Provider value={{ globalConfig: mergedGlobalConfig }}>
56
+ <div
57
+ className={`${mergedGlobalConfig.classPrefix}-config-provider`}
58
+ dir={direction}
59
+ style={{ display: "contents" }}
60
+ >
61
+ {children}
62
+ </div>
63
+ </ConfigContext.Provider>
64
+ );
48
65
  }
49
66
 
50
67
  ConfigProvider.getGlobalConfig = getGlobalConfig;
@@ -9,6 +9,11 @@ export interface TdConfigProviderProps {
9
9
  }
10
10
 
11
11
  export interface GlobalConfigProvider {
12
+ /**
13
+ * 文本方向,'rtl' 表示从右往左
14
+ * @default 'ltr'
15
+ */
16
+ direction?: "ltr" | "rtl";
12
17
  /**
13
18
  * 警告全局配置
14
19
  */
@@ -0,0 +1,27 @@
1
+ import React, { useState } from "react";
2
+ import { Button, Dialog } from "@tendaui/react";
3
+
4
+ export default function Base() {
5
+ const [visible, setVisible] = useState(false);
6
+
7
+ const onConfirm = (context) => {
8
+ console.log("点击了确认按钮", context);
9
+ setVisible(false);
10
+ };
11
+
12
+ const onClose = (context) => {
13
+ console.log("关闭弹窗", context);
14
+ setVisible(false);
15
+ };
16
+
17
+ return (
18
+ <>
19
+ <Button theme="primary" onClick={() => setVisible(true)}>
20
+ 打开对话框
21
+ </Button>
22
+ <Dialog header="基础对话框" visible={visible} onClose={onClose} onConfirm={onConfirm}>
23
+ <p>这是一个基础对话框示例。</p>
24
+ </Dialog>
25
+ </>
26
+ );
27
+ }