@arcblock/ux 2.6.9 → 2.7.1

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 (164) hide show
  1. package/babel.config.es.js +12 -0
  2. package/es/ActionButton/index.js +99 -0
  3. package/es/ActivityIndicator/index.js +180 -0
  4. package/es/Address/compact-text.js +105 -0
  5. package/es/Address/did-address.js +211 -0
  6. package/es/Address/index.js +23 -0
  7. package/es/Address/responsive-did-address.js +88 -0
  8. package/es/Alert/index.js +134 -0
  9. package/es/AnimationWaiter/default-animation.json +1 -0
  10. package/es/AnimationWaiter/index.js +239 -0
  11. package/es/Async/index.js +38 -0
  12. package/es/Avatar/did-motif.js +64 -0
  13. package/es/Avatar/etherscan-blockies.js +83 -0
  14. package/es/Avatar/index.js +176 -0
  15. package/es/Badge/index.js +98 -0
  16. package/es/Blocklet/blocklet.js +298 -0
  17. package/es/Blocklet/index.js +4 -0
  18. package/es/Blocklet/utils.js +52 -0
  19. package/es/BlockletNFT/index.js +412 -0
  20. package/es/Button/index.js +8 -0
  21. package/es/Button/wrap.js +140 -0
  22. package/es/ButtonGroup/index.js +6 -0
  23. package/es/CardSelector/index.js +131 -0
  24. package/es/Center/index.js +41 -0
  25. package/es/ClickToCopy/copy-button.js +72 -0
  26. package/es/ClickToCopy/hook.js +39 -0
  27. package/es/ClickToCopy/index.js +93 -0
  28. package/es/CodeBlock/LightBox.js +85 -0
  29. package/es/CodeBlock/index.js +226 -0
  30. package/es/Colors/index.js +2 -0
  31. package/es/Colors/themes/default.js +78 -0
  32. package/es/ContactForm/index.js +230 -0
  33. package/es/CookieConsent/index.js +113 -0
  34. package/es/CountDown/index.js +178 -0
  35. package/es/DID/index.js +105 -0
  36. package/es/Datatable/CustomToolbar.js +396 -0
  37. package/es/Datatable/DatatableContext.js +34 -0
  38. package/es/Datatable/TableSearch.js +165 -0
  39. package/es/Datatable/index.js +627 -0
  40. package/es/Datatable/utils.js +132 -0
  41. package/es/Dialog/confirm.js +90 -0
  42. package/es/Dialog/dialog.js +192 -0
  43. package/es/Dialog/index.js +3 -0
  44. package/es/DidLogo/index.js +31 -0
  45. package/es/DriftBot/index.js +70 -0
  46. package/es/Earth/countries.json +8057 -0
  47. package/es/Earth/index.js +521 -0
  48. package/es/Earth/util.js +51 -0
  49. package/es/Empty/index.js +64 -0
  50. package/es/ErrorBoundary/fallback.js +73 -0
  51. package/es/ErrorBoundary/index.js +1 -0
  52. package/es/Footer/index.js +172 -0
  53. package/es/Header/auto-hidden.js +35 -0
  54. package/es/Header/header.js +211 -0
  55. package/es/Header/index.js +2 -0
  56. package/es/Header/responsive-header.js +111 -0
  57. package/es/Icon/image.js +65 -0
  58. package/es/Icon/index.js +84 -0
  59. package/es/Img/index.js +217 -0
  60. package/es/InfoRow/index.js +87 -0
  61. package/es/Layout/dashboard/external-link.js +58 -0
  62. package/es/Layout/dashboard/full-page.js +53 -0
  63. package/es/Layout/dashboard/index.js +275 -0
  64. package/es/Layout/dashboard/sidebar.js +209 -0
  65. package/es/Layout/dashboard-legacy/header.js +174 -0
  66. package/es/Layout/dashboard-legacy/index.js +149 -0
  67. package/es/Layout/dashboard-legacy/sidebar.js +129 -0
  68. package/es/Layout/index.js +335 -0
  69. package/es/Locale/browser-lang.js +52 -0
  70. package/es/Locale/context.js +114 -0
  71. package/es/Locale/languages.js +60 -0
  72. package/es/Locale/selector.js +180 -0
  73. package/es/Locale/util.js +13 -0
  74. package/es/Logo/images/logo-dark-text.svg +3 -0
  75. package/es/Logo/images/logo-dark-top.svg +6 -0
  76. package/es/Logo/images/logo-light-text.svg +3 -0
  77. package/es/Logo/images/logo-light-top.svg +6 -0
  78. package/es/Logo/index.js +136 -0
  79. package/es/Metric/index.js +132 -0
  80. package/es/NFTDisplay/README.md +59 -0
  81. package/es/NFTDisplay/aspect-ratio-container.js +39 -0
  82. package/es/NFTDisplay/broken.js +18 -0
  83. package/es/NFTDisplay/demo/data/asset-state-display-url.json +7 -0
  84. package/es/NFTDisplay/demo/data/asset-state-gzipped-svg-1-1.json +10 -0
  85. package/es/NFTDisplay/demo/data/asset-state-gzipped-svg-374-130.json +10 -0
  86. package/es/NFTDisplay/demo/data/asset-state-gzipped-svg-with-foreign-object.json +20 -0
  87. package/es/NFTDisplay/demo/data/asset-state-svg.json +29 -0
  88. package/es/NFTDisplay/demo/data/asset-state-url.json +10 -0
  89. package/es/NFTDisplay/index.js +323 -0
  90. package/es/NFTDisplay/loading.js +18 -0
  91. package/es/NFTDisplay/svg-embedder/img.js +45 -0
  92. package/es/NFTDisplay/svg-embedder/inline-svg.js +39 -0
  93. package/es/NavMenu/index.js +2 -0
  94. package/es/NavMenu/nav-menu.js +286 -0
  95. package/es/NavMenu/style.js +176 -0
  96. package/es/PageScroller/index.js +286 -0
  97. package/es/PageScroller/story/FifthComponent.js +9 -0
  98. package/es/PageScroller/story/FirstComponent.js +9 -0
  99. package/es/PageScroller/story/FourthComponent.js +12 -0
  100. package/es/PageScroller/story/FullPage.js +47 -0
  101. package/es/PageScroller/story/PageContain.js +59 -0
  102. package/es/PageScroller/story/SecondComponent.js +9 -0
  103. package/es/PageScroller/story/ThirdComponent.js +9 -0
  104. package/es/PageScroller/story/index.css +115 -0
  105. package/es/PageScroller/usePrevValue.js +9 -0
  106. package/es/PricingTable/PricingPlan.js +124 -0
  107. package/es/PricingTable/index.js +53 -0
  108. package/es/QRCode/index.js +72 -0
  109. package/es/RelativeTime/index.js +98 -0
  110. package/es/Result/common.js +140 -0
  111. package/es/Result/demo/fixtures/result-image-404.svg +1 -0
  112. package/es/Result/index.js +33 -0
  113. package/es/Result/result.js +59 -0
  114. package/es/Result/translations.js +54 -0
  115. package/es/Screenshot/BaseScreenshot/index.js +91 -0
  116. package/es/Screenshot/BaseScreenshot/shells/Macbook.js +51 -0
  117. package/es/Screenshot/BaseScreenshot/shells/Phone.js +36 -0
  118. package/es/Screenshot/demo/images/bg-00.jpg +0 -0
  119. package/es/Screenshot/demo/images/bg-01.jpg +0 -0
  120. package/es/Screenshot/demo/images/bg-02.jpg +0 -0
  121. package/es/Screenshot/demo/images/bg-03.jpg +0 -0
  122. package/es/Screenshot/demo/images/bg-04.jpg +0 -0
  123. package/es/Screenshot/demo/images/bg-05.jpg +0 -0
  124. package/es/Screenshot/demo/images/bg-06.jpg +0 -0
  125. package/es/Screenshot/demo/images/bg-07.jpg +0 -0
  126. package/es/Screenshot/demo/images/bg-08.jpg +0 -0
  127. package/es/Screenshot/demo/images/bg-09.jpg +0 -0
  128. package/es/Screenshot/devices.css +1366 -0
  129. package/es/Screenshot/index.js +299 -0
  130. package/es/SessionManager/federated-login-detecter.js +166 -0
  131. package/es/SessionManager/index.js +468 -0
  132. package/es/SessionManager/user-popper.js +132 -0
  133. package/es/Sparkline/index.js +193 -0
  134. package/es/Spinner/index.js +28 -0
  135. package/es/SplitButton/index.js +144 -0
  136. package/es/Switch/index.js +96 -0
  137. package/es/Tabs/index.js +48 -0
  138. package/es/Tag/index.js +108 -0
  139. package/es/TextCollapse/index.js +92 -0
  140. package/es/Theme/index.js +16 -0
  141. package/es/Theme/theme-provider.js +39 -0
  142. package/es/Theme/theme.js +133 -0
  143. package/es/Toast/index.js +95 -0
  144. package/es/Util/deprecate.js +28 -0
  145. package/es/Util/index.js +298 -0
  146. package/es/Util/wallet.js +32 -0
  147. package/es/Video/index.js +89 -0
  148. package/es/Wallet/Action.js +119 -0
  149. package/es/Wallet/Download.js +331 -0
  150. package/es/Wallet/Open.js +45 -0
  151. package/es/Wallet/images/abtwallet.png +0 -0
  152. package/es/Wallet/images/android_download.svg +23 -0
  153. package/es/Wallet/images/app-store.svg +20 -0
  154. package/es/Wallet/images/google-play.svg +70 -0
  155. package/es/WebWalletSWKeeper/index.js +115 -0
  156. package/es/WechatPrompt/images/android.png +0 -0
  157. package/es/WechatPrompt/images/ios.png +0 -0
  158. package/es/WechatPrompt/index.js +88 -0
  159. package/es/index.js +38 -0
  160. package/es/withTheme/index.js +69 -0
  161. package/es/withTracker/README.md +34 -0
  162. package/es/withTracker/error_boundary.js +34 -0
  163. package/es/withTracker/index.js +56 -0
  164. package/package.json +272 -5
@@ -0,0 +1,412 @@
1
+ import { useRef } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import Portal from '@mui/material/Portal';
4
+ import Typography from '@mui/material/Typography';
5
+ import CircularProgress from '@mui/material/CircularProgress';
6
+ import useMediaQuery from '@mui/material/useMediaQuery';
7
+ import Avatar from '../Avatar';
8
+ import Icon from '../Icon';
9
+ import Button from '../Button';
10
+ import Img from '../Img';
11
+ import { useTheme, styled } from '../Theme';
12
+
13
+ /**
14
+ * 美化数字 1000-->1k
15
+ * @param {*} _size
16
+ * @param {*} digits
17
+ * @returns
18
+ */
19
+ import { jsx as _jsx } from "react/jsx-runtime";
20
+ import { jsxs as _jsxs } from "react/jsx-runtime";
21
+ import { Fragment as _Fragment } from "react/jsx-runtime";
22
+ function prettySize(_size, digits = 1) {
23
+ let size = _size;
24
+ const list = ['', 'k', 'm', 'b'];
25
+ let index = 0;
26
+ while (size > 1000 && index < list.length - 1) {
27
+ size = (size / 1000).toFixed(digits);
28
+ index += 1;
29
+ }
30
+ return _size && `${size}${list[index]}`;
31
+ }
32
+ const Div = styled('div')`
33
+ &.arcblock-blocklet {
34
+ padding: 0 16px;
35
+ background: ${props => props.theme.palette.common.white};
36
+ overflow: hidden;
37
+ box-shadow: 0px 0px 8px #f0f0f0;
38
+ &:hover {
39
+ box-shadow: 0px 2px 12px #f0f0f0;
40
+ }
41
+ }
42
+ .arcblock-blocklet__content {
43
+ padding: 16px 0 0 0;
44
+ }
45
+ .arcblock-blocklet__content--main {
46
+ display: flex;
47
+ align-items: center;
48
+ cursor: pointer;
49
+ }
50
+ .arcblock-blocklet__content--body {
51
+ overflow: hidden;
52
+ flex: 1;
53
+ display: flex;
54
+ align-items: flex-start;
55
+ }
56
+ .arcblock-blocklet__addons {
57
+ padding: 16px 0;
58
+ }
59
+ .arcblock-blocklet__cover {
60
+ width: 80px;
61
+ height: 80px;
62
+ margin-right: 12px;
63
+ overflow: hidden;
64
+ border-radius: 12px;
65
+ /* see: https://stackoverflow.com/questions/49066011/overflow-hidden-with-border-radius-not-working-on-safari */
66
+ transform: translateZ(0);
67
+ }
68
+ .arcblock-blocklet__button--hover {
69
+ &:not(.Mui-disabled) {
70
+ position: relative;
71
+ z-index: 1;
72
+ &::before {
73
+ content: '';
74
+ position: absolute;
75
+ height: 100%;
76
+ width: 100%;
77
+ left: 0;
78
+ top: 0;
79
+ transition: opacity 0.3s;
80
+ }
81
+ &:hover::before {
82
+ opacity: 0;
83
+ }
84
+ &::after {
85
+ content: '';
86
+ position: absolute;
87
+ height: 100%;
88
+ width: 100%;
89
+ top: 0;
90
+ left: 0;
91
+ background-color: ${props => props.theme.palette.primary.main};
92
+ transform: scale(0.1);
93
+ opacity: 0;
94
+ z-index: -1;
95
+ transition: transform 0.3s, opacity 0.3s, background-color 0.3s;
96
+ }
97
+ &:hover::after {
98
+ opacity: 1;
99
+ transform-origin: center;
100
+ transform: scale(1);
101
+ }
102
+ }
103
+
104
+ &:not(.Mui-disabled) {
105
+ background-color: transparent !important;
106
+ color: ${props => props.theme.palette.primary.main};
107
+ }
108
+ &:not(.Mui-disabled) {
109
+ &:hover {
110
+ color: ${props => props.theme.palette.common.white};
111
+ }
112
+ }
113
+ }
114
+ .arcblock-blocklet__info {
115
+ flex: 1;
116
+ overflow: hidden;
117
+ .arcblock-blocklet__button {
118
+ margin-top: 16px;
119
+ display: inline-block;
120
+ }
121
+ }
122
+ .arcblock-blocklet__title {
123
+ margin: 0;
124
+ font-size: 18px;
125
+ font-weight: 600;
126
+ overflow: hidden;
127
+ text-overflow: ellipsis;
128
+ white-space: nowrap;
129
+ }
130
+ .arcblock-blocklet__describe {
131
+ margin: 0 0 2px 0;
132
+ color: #999;
133
+ font-size: 14px;
134
+ overflow: hidden;
135
+ text-overflow: ellipsis;
136
+ white-space: nowrap;
137
+ }
138
+
139
+ .arcblock-blocklet__addons {
140
+ display: flex;
141
+ justify-content: space-between;
142
+ color: #999;
143
+ font-size: 14px;
144
+ position: relative;
145
+ }
146
+ .arcblock-blocklet__addons--item {
147
+ white-space: nowrap;
148
+ }
149
+ &.arcblock-blocklet--size-md {
150
+ &:hover {
151
+ position: relative;
152
+ }
153
+ .arcblock-blocklet__title {
154
+ height: 2.3em;
155
+ margin-bottom: 3px;
156
+ display: -webkit-box;
157
+ -webkit-box-orient: vertical;
158
+ -webkit-line-clamp: 2;
159
+ overflow: hidden;
160
+ text-overflow: initial;
161
+ white-space: initial;
162
+ word-break: break-all;
163
+ }
164
+ .arcblock-blocklet__describe {
165
+ white-space: normal;
166
+ height: 2.86em;
167
+ }
168
+ .arcblock-blocklet__button {
169
+ margin-top: 5px;
170
+ }
171
+ }
172
+ &.arcblock-blocklet--size-sm,
173
+ &.arcblock-blocklet--size-xs {
174
+ .arcblock-blocklet__cover {
175
+ width: 40px;
176
+ height: 40px;
177
+ border-radius: 6px;
178
+ }
179
+ .arcblock-blocklet__content {
180
+ padding: 16px 0;
181
+ }
182
+ .arcblock-blocklet__addons {
183
+ padding: 8px 0;
184
+ .arcblock-blocklet__addons--item {
185
+ font-size: 12px;
186
+ }
187
+ }
188
+ }
189
+ &.arcblock-blocklet--size-xs {
190
+ .arcblock-blocklet__addons {
191
+ display: none !important;
192
+ }
193
+ }
194
+ `;
195
+ function BlockletIcon({
196
+ name
197
+ }) {
198
+ return /*#__PURE__*/_jsx(Icon, {
199
+ name: name,
200
+ color: "inherit",
201
+ size: 15,
202
+ style: {
203
+ marginRight: 8
204
+ }
205
+ });
206
+ }
207
+ BlockletIcon.propTypes = {
208
+ name: PropTypes.string.isRequired
209
+ };
210
+
211
+ /**
212
+ * BlockletNFT 组件
213
+ * @typedef {{
214
+ * title: string;
215
+ * description?: string;
216
+ * cover?: string;
217
+ * did?: string;
218
+ * isStickyButton?: boolean;
219
+ * buttonText?: string;
220
+ * buttonDisabled?: boolean;
221
+ * buttonLoading?: boolean;
222
+ * button?: JSX.Element;
223
+ * addons?: Array<any>;
224
+ * size?: 'xs' | 'sm' | 'md' | 'auto';
225
+ * onButtonClick?: Function;
226
+ * onMainClick?: Function;
227
+ * onTagClick?: Function;
228
+ * className?: string;
229
+ * scaleClickZone?: number;
230
+ * } & import('react').ComponentPropsWithoutRef<"div"> } BlockletNFTProps
231
+ */
232
+
233
+ /**
234
+ * BlockletNFT 组件
235
+ * @param {BlockletNFTProps} props
236
+ * @returns {JSX.Element}
237
+ */
238
+ export default function BlockletNFT({
239
+ title,
240
+ did,
241
+ description,
242
+ cover,
243
+ size,
244
+ addons,
245
+ button,
246
+ buttonText,
247
+ buttonDisabled,
248
+ buttonLoading,
249
+ isStickyButton,
250
+ onButtonClick,
251
+ onMainClick,
252
+ onTagClick,
253
+ className,
254
+ scaleClickZone,
255
+ ...rest
256
+ }) {
257
+ const wrapHandler = (handler, stopFn = () => false) => (e, ...args) => {
258
+ if (stopFn()) {
259
+ e.preventDefault();
260
+ e.stopPropagation();
261
+ } else if (handler instanceof Function) {
262
+ e.preventDefault();
263
+ e.stopPropagation();
264
+ handler(...args);
265
+ }
266
+ };
267
+ const _onButtonClick = wrapHandler(onButtonClick, () => {
268
+ // stop click while custom button or buttonDisabled or buttondLoading
269
+ if (button || buttonDisabled || buttonLoading) {
270
+ return true;
271
+ }
272
+ return false;
273
+ });
274
+ const _onMainClick = wrapHandler(onMainClick);
275
+ const theme = useTheme();
276
+ const isDownSm = useMediaQuery(theme.breakpoints.down('md'));
277
+ const isDownMd = useMediaQuery(theme.breakpoints.down('lg'));
278
+ const isUpLg = useMediaQuery(theme.breakpoints.up('lg'));
279
+
280
+ // If size is auto, need calculate actual size according to screen size
281
+ // eslint-disable-next-line no-nested-ternary
282
+ const actualSize = size === 'auto' ? isDownSm ? 'xs' : isDownMd ? 'sm' : 'md' : size;
283
+ // eslint-disable-next-line no-nested-ternary
284
+ const didAvatarSize = size === 'auto' ? isUpLg ? 80 : 40 : size === 'md' ? 80 : 40;
285
+ const container = useRef(null);
286
+ return /*#__PURE__*/_jsxs(Div, {
287
+ ...rest,
288
+ scaleClickZone: scaleClickZone,
289
+ className: `${className} arcblock-blocklet arcblock-blocklet--size-${actualSize}`,
290
+ children: [/*#__PURE__*/_jsx("div", {
291
+ className: "arcblock-blocklet__content",
292
+ children: /*#__PURE__*/_jsx("div", {
293
+ className: "arcblock-blocklet__content--main",
294
+ onClick: _onMainClick,
295
+ ref: container,
296
+ children: /*#__PURE__*/_jsxs("div", {
297
+ className: "arcblock-blocklet__content--body",
298
+ children: [cover ? /*#__PURE__*/_jsx("div", {
299
+ className: "arcblock-blocklet__cover",
300
+ children: /*#__PURE__*/_jsx(Img, {
301
+ src: cover
302
+ })
303
+ }) : did && /*#__PURE__*/_jsx("div", {
304
+ className: "arcblock-blocklet__cover",
305
+ children: /*#__PURE__*/_jsx(Avatar, {
306
+ did: did,
307
+ size: didAvatarSize
308
+ })
309
+ }), /*#__PURE__*/_jsxs("div", {
310
+ className: "arcblock-blocklet__info",
311
+ children: [/*#__PURE__*/_jsx(Typography, {
312
+ component: "h3",
313
+ variant: "h3",
314
+ className: "arcblock-blocklet__title",
315
+ title: title,
316
+ children: title
317
+ }), description && /*#__PURE__*/_jsx(Typography, {
318
+ component: "div",
319
+ variant: "body2",
320
+ className: "arcblock-blocklet__describe",
321
+ title: description,
322
+ children: description
323
+ }), ['md', 'sm', 'xs'].includes(actualSize) && /*#__PURE__*/_jsx(Portal, {
324
+ container: container.current,
325
+ disablePortal: actualSize === 'md',
326
+ children: /*#__PURE__*/_jsx("div", {
327
+ className: "arcblock-blocklet__button",
328
+ onClick: _onButtonClick,
329
+ style: {
330
+ display: isStickyButton ? 'block' : ''
331
+ },
332
+ children: button || onButtonClick && /*#__PURE__*/_jsxs(Button, {
333
+ className: "arcblock-blocklet__button--hover",
334
+ variant: "outlined",
335
+ color: "primary",
336
+ size: "small",
337
+ disabled: buttonDisabled || buttonLoading,
338
+ style: actualSize === 'md' ? {
339
+ padding: '3px 20px',
340
+ fontSize: '14px'
341
+ } : {
342
+ padding: '3px 15px',
343
+ minWidth: '54px',
344
+ fontSize: '13px'
345
+ },
346
+ children: [buttonLoading && /*#__PURE__*/_jsx(CircularProgress, {
347
+ size: actualSize === 'md' ? 15 : 13,
348
+ style: {
349
+ marginRight: 3,
350
+ color: 'inherit'
351
+ }
352
+ }), buttonText]
353
+ })
354
+ })
355
+ })]
356
+ })]
357
+ })
358
+ })
359
+ }), /*#__PURE__*/_jsx("div", {
360
+ className: "arcblock-blocklet__addons",
361
+ children: addons.map((item, index) => /*#__PURE__*/_jsx(Typography, {
362
+ component: "span",
363
+ variant: "caption",
364
+ className: "arcblock-blocklet__addons--item"
365
+ // eslint-disable-next-line react/no-array-index-key
366
+ ,
367
+
368
+ title: item.title,
369
+ children: item.empty ? null : /*#__PURE__*/_jsxs(_Fragment, {
370
+ children: [/*#__PURE__*/_jsx(BlockletIcon, {
371
+ name: item.icon
372
+ }), item.pretty ? prettySize(item.value) : item.value]
373
+ })
374
+ }, index))
375
+ })]
376
+ });
377
+ }
378
+ BlockletNFT.propTypes = {
379
+ title: PropTypes.string.isRequired,
380
+ did: PropTypes.string,
381
+ isStickyButton: PropTypes.bool,
382
+ description: PropTypes.string,
383
+ cover: PropTypes.string,
384
+ buttonText: PropTypes.string,
385
+ buttonDisabled: PropTypes.bool,
386
+ buttonLoading: PropTypes.bool,
387
+ button: PropTypes.element,
388
+ addons: PropTypes.arrayOf(PropTypes.object),
389
+ size: PropTypes.oneOf(['xs', 'sm', 'md', 'auto']),
390
+ onButtonClick: PropTypes.func,
391
+ onMainClick: PropTypes.func,
392
+ onTagClick: PropTypes.func,
393
+ className: PropTypes.string,
394
+ scaleClickZone: PropTypes.number
395
+ };
396
+ BlockletNFT.defaultProps = {
397
+ description: null,
398
+ cover: null,
399
+ did: null,
400
+ isStickyButton: false,
401
+ buttonText: 'Install',
402
+ buttonDisabled: false,
403
+ buttonLoading: false,
404
+ button: null,
405
+ size: 'auto',
406
+ addons: [],
407
+ onButtonClick: null,
408
+ onMainClick: null,
409
+ onTagClick: null,
410
+ className: null,
411
+ scaleClickZone: 1.5
412
+ };
@@ -0,0 +1,8 @@
1
+ // @ts-check
2
+
3
+ import Button from '@mui/material/Button';
4
+ import wrap from './wrap';
5
+
6
+ /** @type {import('./wrap').ButtonComponent} */
7
+ const ButtonComponent = wrap(Button);
8
+ export default ButtonComponent;
@@ -0,0 +1,140 @@
1
+ /* eslint-disable prefer-destructuring */
2
+ /* eslint-disable func-names */
3
+ import { forwardRef } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import CircularProgress from '@mui/material/CircularProgress';
6
+ import colors from '../Colors';
7
+ import { mergeProps } from '../Util';
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ import { jsxs as _jsxs } from "react/jsx-runtime";
10
+ const extendedColors = {
11
+ did: {
12
+ contained: {
13
+ backgroundColor: colors.did.primary,
14
+ color: colors.common.white
15
+ },
16
+ outlined: {
17
+ borderColor: colors.did.primary,
18
+ color: colors.did.primary
19
+ }
20
+ },
21
+ reverse: {
22
+ contained: {
23
+ backgroundColor: 'rgba(255, 255, 255, 0.9)',
24
+ color: colors.grey[900]
25
+ },
26
+ outlined: {
27
+ borderColor: colors.grey[900],
28
+ color: colors.grey[900]
29
+ }
30
+ }
31
+ };
32
+
33
+ /**
34
+ * @typedef {{
35
+ * rounded?: boolean,
36
+ * loading?: boolean,
37
+ * forwardedRef: import('react').ForwardedRef<any>,
38
+ * color?: 'default' | 'inherit' | 'primary' | 'secondary' | 'danger' | 'warning' | 'reverse' | 'did'
39
+ * } & import('@mui/material').ButtonProps} ButtonProps
40
+ */
41
+
42
+ /**
43
+ * @typedef {React.ForwardRefExoticComponent<React.PropsWithoutRef<ButtonProps> & React.RefAttributes<HTMLButtonElement>>} ButtonComponent
44
+ */
45
+
46
+ /**
47
+ * @description
48
+ * @export
49
+ * @param {import('@mui/material').ExtendButtonBase<import('@mui/material').ButtonTypeMap<{}, "button">>} BaseComponent
50
+ * @return {ButtonComponent}
51
+ */
52
+ export default function (BaseComponent) {
53
+ /**
54
+ *
55
+ * @param {ButtonProps} props
56
+ * @returns
57
+ */
58
+ function WrappedComponent(props) {
59
+ /**
60
+ * @type {ButtonProps}
61
+ */
62
+ const newProps = mergeProps(props, WrappedComponent, ['style']);
63
+ const {
64
+ children,
65
+ rounded,
66
+ loading,
67
+ disabled,
68
+ style,
69
+ forwardedRef,
70
+ color,
71
+ ...rest
72
+ } = newProps;
73
+ const isDisabled = disabled || loading;
74
+ let loadingSize = 16;
75
+ switch (rest.size) {
76
+ case 'small':
77
+ loadingSize = 14;
78
+ break;
79
+ case 'large':
80
+ loadingSize = 18;
81
+ break;
82
+ default:
83
+ }
84
+
85
+ // mui v4 只支持 4 种 color 值: default/inherit/primary/secondary (传入这 4 种之外的值会报 warning),
86
+ // 这里扩展 danger/warning/reverse/did 四种 color
87
+ // !! 已升级到 mui v5, error/warning 等 color 已经默认支持, extendedColors 只扩展了 did/reverse
88
+ const matched = extendedColors[color] && extendedColors[color][rest.variant];
89
+
90
+ /**
91
+ * @type {import('react').CSSProperties}
92
+ */
93
+ const styles = Object.assign({}, style, {
94
+ boxShadow: 'none',
95
+ textTransform: 'capitalize',
96
+ ...matched
97
+ });
98
+ let _rest = rest;
99
+ if (!matched) {
100
+ // mui button 本身支持的 color 交由 mui 处理
101
+ _rest = {
102
+ ..._rest,
103
+ color
104
+ };
105
+ }
106
+ if (rounded) {
107
+ // styles.borderRadius = { small: 16, medium: 18, large: 20 }[rest.size];
108
+ styles.borderRadius = '100vw';
109
+ }
110
+ return /*#__PURE__*/_jsxs(BaseComponent, {
111
+ style: styles,
112
+ ref: forwardedRef,
113
+ disabled: isDisabled,
114
+ ..._rest,
115
+ children: [loading && /*#__PURE__*/_jsx(CircularProgress, {
116
+ size: loadingSize,
117
+ style: {
118
+ marginRight: 5
119
+ }
120
+ }), children]
121
+ });
122
+ }
123
+ WrappedComponent.propTypes = {
124
+ children: PropTypes.any.isRequired,
125
+ style: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
126
+ size: PropTypes.oneOf(['large', 'medium', 'small']),
127
+ forwardedRef: PropTypes.any,
128
+ rounded: PropTypes.bool
129
+ };
130
+ WrappedComponent.defaultProps = {
131
+ rounded: false,
132
+ size: 'medium',
133
+ forwardedRef: null,
134
+ style: {}
135
+ };
136
+ return /*#__PURE__*/forwardRef((props, ref) => /*#__PURE__*/_jsx(WrappedComponent, {
137
+ ...props,
138
+ forwardedRef: ref
139
+ }));
140
+ }
@@ -0,0 +1,6 @@
1
+ import ButtonGroup from '@mui/material/ButtonGroup';
2
+ import wrap from '../Button/wrap';
3
+
4
+ // deprecated, ux ButtonGroup 组件废弃, 建议直接使用 @mui/material/ButtonGroup
5
+ // (该定制组件原本目的是调整 ButtonGroup 的圆角, 但最新设计规范已经不再使用较大的圆角, 改为使用 mui button 默认的圆角)
6
+ export default wrap(ButtonGroup);
@@ -0,0 +1,131 @@
1
+ import { useState, useEffect, useRef } from 'react';
2
+ import styled from '@emotion/styled';
3
+ import PropTypes from 'prop-types';
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ export default function CardSelector({
6
+ list,
7
+ width,
8
+ height,
9
+ cardSpace,
10
+ onSelect,
11
+ defaultIndex
12
+ }) {
13
+ const [selectedId, setSelectedId] = useState(0);
14
+ const [translateX, setTranslateX] = useState(0);
15
+ const outterCon = useRef(null);
16
+
17
+ // 选择卡片
18
+ const selectedItem = i => {
19
+ if (i < 0 || i > list.length - 1) {
20
+ return;
21
+ }
22
+ setSelectedId(i);
23
+
24
+ // 外部容器大小
25
+ const outerWidth = outterCon.current.clientWidth;
26
+ setTranslateX(i * (width + cardSpace) - (outerWidth - width) / 2 + cardSpace * 0.5);
27
+ onSelect(i);
28
+ };
29
+ useEffect(() => {
30
+ selectedItem(defaultIndex);
31
+ const func = e => e.preventDefault();
32
+ outterCon.current.addEventListener('touchmove', func, {
33
+ passive: false
34
+ });
35
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36
+ }, []);
37
+ let startX;
38
+ const touchstart = e => {
39
+ const point = e.touches[0];
40
+ startX = point.clientX;
41
+ };
42
+ const touchend = e => {
43
+ const point = e.changedTouches[0];
44
+ const diffX = startX - point.clientX;
45
+ if (Math.abs(diffX) > 60) {
46
+ if (diffX > 0) {
47
+ selectedItem(selectedId + 1);
48
+ } else {
49
+ selectedItem(selectedId - 1);
50
+ }
51
+ }
52
+ };
53
+ return /*#__PURE__*/_jsx(Contianer, {
54
+ ref: outterCon,
55
+ onTouchStart: touchstart,
56
+ onTouchEnd: touchend,
57
+ children: /*#__PURE__*/_jsx("div", {
58
+ className: "card-container",
59
+ style: {
60
+ transform: `translate(${-translateX}px, 0)`
61
+ },
62
+ children: list.map((e, i) => {
63
+ return /*#__PURE__*/_jsx("div", {
64
+ className: `card-item ${i === selectedId ? 'selected' : ''}`,
65
+ style: {
66
+ width,
67
+ height,
68
+ margin: cardSpace / 2
69
+ }
70
+ // eslint-disable-next-line react/no-array-index-key
71
+ ,
72
+
73
+ onClick: () => selectedItem(i),
74
+ children: /*#__PURE__*/_jsx("img", {
75
+ src: e.src,
76
+ alt: e.name
77
+ })
78
+ }, i);
79
+ })
80
+ })
81
+ });
82
+ }
83
+ const Contianer = styled.div`
84
+ overflow: hidden;
85
+ mask-image: linear-gradient(to left, transparent, black 3%, black 97%, transparent);
86
+ overflow: hidden;
87
+ .card-container {
88
+ display: flex;
89
+ white-space: nowrap;
90
+ width: max-content;
91
+ transition: all ease 0.3s;
92
+ }
93
+ .card-item {
94
+ display: inline-flex;
95
+ justify-content: center;
96
+ align-items: center;
97
+ flex-shrink: 0;
98
+ cursor: pointer;
99
+ img {
100
+ max-width: 100%;
101
+ max-height: 100%;
102
+ width: auto;
103
+ height: auto;
104
+ outline: #526ded solid 0;
105
+ transition: all ease 0.2s;
106
+ box-shadow: rgba(0, 0, 0, 0.2) 0 0 10px;
107
+ }
108
+ &.selected {
109
+ cursor: default;
110
+ img {
111
+ outline: #526ded solid 5px;
112
+ }
113
+ }
114
+ }
115
+ `;
116
+ CardSelector.propTypes = {
117
+ list: PropTypes.array,
118
+ width: PropTypes.number,
119
+ height: PropTypes.number,
120
+ cardSpace: PropTypes.number,
121
+ onSelect: PropTypes.func,
122
+ defaultIndex: PropTypes.number
123
+ };
124
+ CardSelector.defaultProps = {
125
+ list: '',
126
+ width: 300,
127
+ height: 400,
128
+ cardSpace: 40,
129
+ onSelect: () => {},
130
+ defaultIndex: 0
131
+ };