@pointcloud/pcloud-components 0.1.21 → 0.1.23

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 (60) hide show
  1. package/README.md +1 -1
  2. package/dist/esm/AdvancedFilter/FormFilter.js +3 -3
  3. package/dist/esm/AdvancedFilter/interface.d.ts +3 -3
  4. package/dist/esm/AdvancedFilter/styles/index.less +146 -146
  5. package/dist/esm/ColorPicker/index.js +1 -1
  6. package/dist/esm/ColorPicker/index.less +18 -18
  7. package/dist/esm/ColorPicker/interface.d.ts +3 -3
  8. package/dist/esm/ConfigProvider/interface.d.ts +1 -1
  9. package/dist/esm/DCascader/index.js +6 -6
  10. package/dist/esm/DCascader/index.less +24 -24
  11. package/dist/esm/DForm/DItem/itemsRender.js +2 -0
  12. package/dist/esm/DForm/helper.js +6 -6
  13. package/dist/esm/DForm/index.js +1 -1
  14. package/dist/esm/DForm/index.less +45 -45
  15. package/dist/esm/DInput/index.js +14 -14
  16. package/dist/esm/DModal/interface.d.ts +2 -2
  17. package/dist/esm/DModal/styles/index.less +27 -27
  18. package/dist/esm/DSelect/index.js +39 -45
  19. package/dist/esm/DTable/index.js +6 -6
  20. package/dist/esm/DTable/index.less +71 -71
  21. package/dist/esm/DTreeSelect/index.less +11 -11
  22. package/dist/esm/DUpload/helper.js +47 -47
  23. package/dist/esm/DUpload/index.d.ts +1 -1
  24. package/dist/esm/DUpload/index.js +6 -6
  25. package/dist/esm/DUpload/index.less +19 -19
  26. package/dist/esm/ErrorBoundary/index.less +44 -44
  27. package/dist/esm/IPAddress/index.d.ts +23 -0
  28. package/dist/esm/IPAddress/index.js +243 -0
  29. package/dist/esm/IPAddress/index.less +63 -0
  30. package/dist/esm/IconFont/index.d.ts +17 -0
  31. package/dist/esm/IconFont/index.js +27 -0
  32. package/dist/esm/InfiniteScrollList/styles/index.less +22 -22
  33. package/dist/esm/LabelValue/interface.d.ts +1 -1
  34. package/dist/esm/LabelValue/styles/index.less +23 -23
  35. package/dist/esm/Loading/hooks/useLoading.d.ts +6 -0
  36. package/dist/esm/Loading/hooks/useLoading.js +35 -0
  37. package/dist/esm/Loading/index.d.ts +5 -4
  38. package/dist/esm/Loading/index.js +9 -9
  39. package/dist/esm/Loading/interface.d.ts +6 -3
  40. package/dist/esm/Loading/loading.d.ts +2 -4
  41. package/dist/esm/Loading/loading.js +5 -3
  42. package/dist/esm/Loading/styles/index.less +25 -25
  43. package/dist/esm/NoData/styles/index.less +24 -24
  44. package/dist/esm/PictureCard/index.d.ts +1 -1
  45. package/dist/esm/PictureCard/index.less +28 -28
  46. package/dist/esm/RCropper/handler.d.ts +16 -0
  47. package/dist/esm/RCropper/handler.js +146 -0
  48. package/dist/esm/RCropper/index.d.ts +4 -0
  49. package/dist/esm/RCropper/index.js +183 -0
  50. package/dist/esm/RCropper/interface.d.ts +70 -0
  51. package/dist/esm/RCropper/interface.js +1 -0
  52. package/dist/esm/RCropper/styles/toolbar.less +25 -0
  53. package/dist/esm/RCropper/toolbar.d.ts +5 -0
  54. package/dist/esm/RCropper/toolbar.js +74 -0
  55. package/dist/esm/commonStyle/index.less +1 -1
  56. package/dist/esm/index.d.ts +7 -1
  57. package/dist/esm/index.js +5 -2
  58. package/dist/umd/pcloud-components.min.css +1 -1
  59. package/dist/umd/pcloud-components.min.js +1 -1
  60. package/package.json +108 -106
@@ -1,9 +1,7 @@
1
- import { LoadingInstanceProps } from './interface';
1
+ import { ILoadingInstance, LoadingInstanceProps } from './interface';
2
2
  import './styles/index.less';
3
3
  declare function Loading(props: LoadingInstanceProps): import("react/jsx-runtime").JSX.Element;
4
4
  declare namespace Loading {
5
- var newInstance: (args: LoadingInstanceProps) => {
6
- destroy(): void;
7
- };
5
+ var newInstance: (args?: LoadingInstanceProps | undefined) => ILoadingInstance;
8
6
  }
9
7
  export default Loading;
@@ -6,7 +6,7 @@ var _excluded = ["delay"],
6
6
  _excluded2 = ["container"];
7
7
  import { Spin } from 'antd';
8
8
  import classNames from 'classnames';
9
- import { useContext, useEffect, useState } from 'react';
9
+ import { useContext, useEffect, useRef, useState } from 'react';
10
10
  import ReactDOM from 'react-dom';
11
11
  import { ConfigContext } from "../ConfigProvider";
12
12
  import "./styles/index.less";
@@ -25,6 +25,7 @@ function Loading(props) {
25
25
  _useState2 = _slicedToArray(_useState, 2),
26
26
  visible = _useState2[0],
27
27
  setVisible = _useState2[1];
28
+ var timer = useRef();
28
29
  useEffect(function () {
29
30
  document.body.style.overflow = 'hidden';
30
31
  return function () {
@@ -32,11 +33,11 @@ function Loading(props) {
32
33
  };
33
34
  }, []);
34
35
  useEffect(function () {
35
- var timer = setTimeout(function () {
36
+ timer.current = setTimeout(function () {
36
37
  return setVisible(true);
37
38
  }, delay || 0);
38
39
  return function () {
39
- clearTimeout(timer);
40
+ clearTimeout(timer.current);
40
41
  };
41
42
  }, [delay]);
42
43
  if (!visible) return /*#__PURE__*/_jsx(_Fragment, {});
@@ -62,6 +63,7 @@ Loading.newInstance = function newNotificationInstance(args) {
62
63
  container = _ref.container,
63
64
  otherProps = _objectWithoutProperties(_ref, _excluded2);
64
65
  var div = document.createElement('div');
66
+
65
67
  // eslint-disable-next-line react/no-find-dom-node
66
68
  var element = ReactDOM.findDOMNode(container);
67
69
  if (element) {
@@ -1,25 +1,25 @@
1
- @import '../../commonStyle/index.less';
2
-
3
- .@{prefix}-loading {
4
- .mask {
5
- position: fixed;
6
- top: 0;
7
- left: 0;
8
- z-index: 100000;
9
- width: 100%;
10
- height: 100%;
11
- overflow: hidden;
12
- }
13
-
14
- .loading {
15
- position: absolute;
16
- top: 50%;
17
- left: 50%;
18
- z-index: 100001;
19
- padding: 20px;
20
- background: #fff;
21
- border-radius: 10px;
22
- box-shadow: 3px 3px 3px rgba(0, 0, 0, 20%);
23
- transform: translate(-50%, -50%);
24
- }
25
- }
1
+ @import '../../commonStyle/index.less';
2
+
3
+ .@{prefix}-loading {
4
+ .mask {
5
+ position: fixed;
6
+ top: 0;
7
+ left: 0;
8
+ z-index: 100000;
9
+ width: 100%;
10
+ height: 100%;
11
+ overflow: hidden;
12
+ }
13
+
14
+ .loading {
15
+ position: absolute;
16
+ top: 50%;
17
+ left: 50%;
18
+ z-index: 100001;
19
+ padding: 20px;
20
+ background: #fff;
21
+ border-radius: 10px;
22
+ box-shadow: 3px 3px 3px rgba(0, 0, 0, 20%);
23
+ transform: translate(-50%, -50%);
24
+ }
25
+ }
@@ -1,24 +1,24 @@
1
- @import '../../commonStyle/index.less';
2
-
3
- .@{prefix}-nodata {
4
- position: absolute;
5
- top: 50%;
6
- left: 50%;
7
- transform: translate(-50%, -50%);
8
-
9
- .not-data-image {
10
- display: block;
11
- height: 100px;
12
- }
13
-
14
- .no-data-text {
15
- display: inline-block;
16
- width: 100%;
17
- margin-top: 5px;
18
- color: #000;
19
- font-weight: 400;
20
- font-size: 14px;
21
- text-align: center;
22
- opacity: 0.65;
23
- }
24
- }
1
+ @import '../../commonStyle/index.less';
2
+
3
+ .@{prefix}-nodata {
4
+ position: absolute;
5
+ top: 50%;
6
+ left: 50%;
7
+ transform: translate(-50%, -50%);
8
+
9
+ .not-data-image {
10
+ display: block;
11
+ height: 100px;
12
+ }
13
+
14
+ .no-data-text {
15
+ display: inline-block;
16
+ width: 100%;
17
+ margin-top: 5px;
18
+ color: #000;
19
+ font-weight: 400;
20
+ font-size: 14px;
21
+ text-align: center;
22
+ opacity: 0.65;
23
+ }
24
+ }
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { ImageProps } from 'antd';
3
3
  import './index.less';
4
- interface IPictureCardProps extends Omit<ImageProps, 'src' | 'width'> {
4
+ interface IPictureCardProps extends Omit<ImageProps, 'src' | 'width' | 'content'> {
5
5
  className?: string;
6
6
  layout?: 'vertical' | 'horizontal';
7
7
  src: ImageProps['src'] | ImageProps['src'][];
@@ -1,28 +1,28 @@
1
- @import '../commonStyle/index.less';
2
-
3
- .@{prefix}-picture-card {
4
- display: inline-block;
5
- padding: 10px;
6
- transition: box-shadow 0.3s linear;
7
-
8
- .info {
9
- margin-top: 10px;
10
- }
11
-
12
- &-bordered {
13
- border: 1px solid rgba(0, 0, 0, 6%);
14
- }
15
-
16
- &-hoverable {
17
- &:hover {
18
- cursor: pointer;
19
- border-color: transparent;
20
- box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 16%), 0 3px 6px rgba(0, 0, 0, 12%), 0 5px 12px 4px rgba(0, 0, 0, 9%);
21
- }
22
- }
23
-
24
- &.horizontal {
25
- display: flex;
26
- justify-content: space-around;
27
- }
28
- }
1
+ @import '../commonStyle/index.less';
2
+
3
+ .@{prefix}-picture-card {
4
+ display: inline-block;
5
+ padding: 10px;
6
+ transition: box-shadow 0.3s linear;
7
+
8
+ .info {
9
+ margin-top: 10px;
10
+ }
11
+
12
+ &-bordered {
13
+ border: 1px solid rgba(0, 0, 0, 6%);
14
+ }
15
+
16
+ &-hoverable {
17
+ &:hover {
18
+ cursor: pointer;
19
+ border-color: transparent;
20
+ box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 16%), 0 3px 6px rgba(0, 0, 0, 12%), 0 5px 12px 4px rgba(0, 0, 0, 9%);
21
+ }
22
+ }
23
+
24
+ &.horizontal {
25
+ display: flex;
26
+ justify-content: space-around;
27
+ }
28
+ }
@@ -0,0 +1,16 @@
1
+ /// <reference types="react" />
2
+ import type { RCropperActionHandlers } from './interface';
3
+ import type Cropper from 'cropperjs';
4
+ export declare function createCropperHandlers(cropperInstanceRef: React.RefObject<Cropper | null>, imgTransformRef: React.RefObject<number[] | undefined>, props: {
5
+ onCrop?: (base64: string, file?: File) => void;
6
+ onZoom?: (transform: number[] | undefined) => void;
7
+ onRotate?: (transform: number[] | undefined) => void;
8
+ onFlip?: (transform: number[] | undefined) => void;
9
+ onReset?: (transform: number[] | undefined) => void;
10
+ onCancelCrop?: (info: {
11
+ x: number;
12
+ y: number;
13
+ width: number;
14
+ height: number;
15
+ }) => void;
16
+ }): RCropperActionHandlers;
@@ -0,0 +1,146 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
+ var base64ToFile = function base64ToFile(base64) {
5
+ var _arr$;
6
+ var fileName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'file.png';
7
+ // 分割Base64字符串获取MIME类型和纯数据部分
8
+ var arr = base64.split(',');
9
+ var mime = arr === null || arr === void 0 || (_arr$ = arr[0]) === null || _arr$ === void 0 || (_arr$ = _arr$.match(/:(.*?);/)) === null || _arr$ === void 0 ? void 0 : _arr$[1];
10
+ var bstr = atob(arr[1]);
11
+ var n = bstr.length;
12
+ // 创建Uint8Array并填充数据
13
+ var u8arr = new Uint8Array(n);
14
+ while (n--) {
15
+ u8arr[n] = bstr.charCodeAt(n);
16
+ }
17
+ // 创建并返回File对象
18
+ return new File([u8arr], fileName, {
19
+ type: mime
20
+ });
21
+ };
22
+ export function createCropperHandlers(cropperInstanceRef, imgTransformRef, props) {
23
+ return {
24
+ handleCrop: function handleCrop() {
25
+ return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
26
+ var _props$onCrop, cropper, selection, canvasEl, img, _file;
27
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
28
+ while (1) switch (_context.prev = _context.next) {
29
+ case 0:
30
+ _context.prev = 0;
31
+ cropper = cropperInstanceRef.current;
32
+ if (cropper) {
33
+ _context.next = 4;
34
+ break;
35
+ }
36
+ return _context.abrupt("return");
37
+ case 4:
38
+ selection = cropper.getCropperSelection();
39
+ _context.next = 7;
40
+ return selection === null || selection === void 0 ? void 0 : selection.$toCanvas();
41
+ case 7:
42
+ canvasEl = _context.sent;
43
+ img = canvasEl === null || canvasEl === void 0 ? void 0 : canvasEl.toDataURL();
44
+ _file = base64ToFile(img);
45
+ (_props$onCrop = props.onCrop) === null || _props$onCrop === void 0 || _props$onCrop.call(props, img, _file);
46
+ _context.next = 15;
47
+ break;
48
+ case 13:
49
+ _context.prev = 13;
50
+ _context.t0 = _context["catch"](0);
51
+ case 15:
52
+ case "end":
53
+ return _context.stop();
54
+ }
55
+ }, _callee, null, [[0, 13]]);
56
+ }))();
57
+ },
58
+ handleZoomIn: function handleZoomIn() {
59
+ try {
60
+ var _cropperInstanceRef$c, _props$onZoom;
61
+ var img = (_cropperInstanceRef$c = cropperInstanceRef.current) === null || _cropperInstanceRef$c === void 0 ? void 0 : _cropperInstanceRef$c.getCropperImage();
62
+ img === null || img === void 0 || img.$zoom(0.1);
63
+ (_props$onZoom = props.onZoom) === null || _props$onZoom === void 0 || _props$onZoom.call(props, img === null || img === void 0 ? void 0 : img.$getTransform());
64
+ } catch (_unused2) {}
65
+ },
66
+ handleZoomOut: function handleZoomOut() {
67
+ try {
68
+ var _cropperInstanceRef$c2, _props$onZoom2;
69
+ var img = (_cropperInstanceRef$c2 = cropperInstanceRef.current) === null || _cropperInstanceRef$c2 === void 0 ? void 0 : _cropperInstanceRef$c2.getCropperImage();
70
+ img === null || img === void 0 || img.$zoom(-0.1);
71
+ (_props$onZoom2 = props.onZoom) === null || _props$onZoom2 === void 0 || _props$onZoom2.call(props, img === null || img === void 0 ? void 0 : img.$getTransform());
72
+ } catch (_unused3) {}
73
+ },
74
+ handleRotateLeft: function handleRotateLeft() {
75
+ try {
76
+ var _cropperInstanceRef$c3, _props$onRotate;
77
+ var img = (_cropperInstanceRef$c3 = cropperInstanceRef.current) === null || _cropperInstanceRef$c3 === void 0 ? void 0 : _cropperInstanceRef$c3.getCropperImage();
78
+ img === null || img === void 0 || img.$rotate('-45deg');
79
+ (_props$onRotate = props.onRotate) === null || _props$onRotate === void 0 || _props$onRotate.call(props, img === null || img === void 0 ? void 0 : img.$getTransform());
80
+ } catch (_unused4) {}
81
+ },
82
+ handleRotateRight: function handleRotateRight() {
83
+ try {
84
+ var _cropperInstanceRef$c4, _props$onRotate2;
85
+ var img = (_cropperInstanceRef$c4 = cropperInstanceRef.current) === null || _cropperInstanceRef$c4 === void 0 ? void 0 : _cropperInstanceRef$c4.getCropperImage();
86
+ img === null || img === void 0 || img.$rotate('45deg');
87
+ (_props$onRotate2 = props.onRotate) === null || _props$onRotate2 === void 0 || _props$onRotate2.call(props, img === null || img === void 0 ? void 0 : img.$getTransform());
88
+ } catch (_unused5) {}
89
+ },
90
+ handleFlipX: function handleFlipX() {
91
+ try {
92
+ var _cropperInstanceRef$c5, _props$onFlip;
93
+ var img = (_cropperInstanceRef$c5 = cropperInstanceRef.current) === null || _cropperInstanceRef$c5 === void 0 ? void 0 : _cropperInstanceRef$c5.getCropperImage();
94
+ img === null || img === void 0 || img.$scale(-1, 1);
95
+ (_props$onFlip = props.onFlip) === null || _props$onFlip === void 0 || _props$onFlip.call(props, img === null || img === void 0 ? void 0 : img.$getTransform());
96
+ } catch (_unused6) {}
97
+ },
98
+ handleFlipY: function handleFlipY() {
99
+ try {
100
+ var _cropperInstanceRef$c6, _props$onFlip2;
101
+ var img = (_cropperInstanceRef$c6 = cropperInstanceRef.current) === null || _cropperInstanceRef$c6 === void 0 ? void 0 : _cropperInstanceRef$c6.getCropperImage();
102
+ img === null || img === void 0 || img.$scale(1, -1);
103
+ (_props$onFlip2 = props.onFlip) === null || _props$onFlip2 === void 0 || _props$onFlip2.call(props, img === null || img === void 0 ? void 0 : img.$getTransform());
104
+ } catch (_unused7) {}
105
+ },
106
+ handleReset: function handleReset() {
107
+ try {
108
+ var _cropperInstanceRef$c7;
109
+ var img = (_cropperInstanceRef$c7 = cropperInstanceRef.current) === null || _cropperInstanceRef$c7 === void 0 ? void 0 : _cropperInstanceRef$c7.getCropperImage();
110
+ if (img && imgTransformRef.current) {
111
+ var _props$onReset;
112
+ var _imgTransformRef$curr = _slicedToArray(imgTransformRef.current, 6),
113
+ scaleX = _imgTransformRef$curr[0],
114
+ skewY = _imgTransformRef$curr[1],
115
+ skewX = _imgTransformRef$curr[2],
116
+ scaleY = _imgTransformRef$curr[3],
117
+ translateX = _imgTransformRef$curr[4],
118
+ translateY = _imgTransformRef$curr[5];
119
+ img === null || img === void 0 || img.$setTransform(scaleX, skewY, skewX, scaleY, translateX, translateY);
120
+ (_props$onReset = props.onReset) === null || _props$onReset === void 0 || _props$onReset.call(props, img === null || img === void 0 ? void 0 : img.$getTransform());
121
+ }
122
+ } catch (_unused8) {}
123
+ },
124
+ handleCancelCrop: function handleCancelCrop() {
125
+ try {
126
+ var _cropperInstanceRef$c8, _props$onCancelCrop;
127
+ var selection = (_cropperInstanceRef$c8 = cropperInstanceRef.current) === null || _cropperInstanceRef$c8 === void 0 ? void 0 : _cropperInstanceRef$c8.getCropperSelection();
128
+ var width = selection === null || selection === void 0 ? void 0 : selection.width;
129
+ var height = selection === null || selection === void 0 ? void 0 : selection.height;
130
+ var x = selection === null || selection === void 0 ? void 0 : selection.x;
131
+ var y = selection === null || selection === void 0 ? void 0 : selection.y;
132
+ if (width && height) {
133
+ selection === null || selection === void 0 || selection.$clear();
134
+ } else {
135
+ selection === null || selection === void 0 || selection.$reset();
136
+ }
137
+ (_props$onCancelCrop = props.onCancelCrop) === null || _props$onCancelCrop === void 0 || _props$onCancelCrop.call(props, {
138
+ x: x,
139
+ y: y,
140
+ width: width,
141
+ height: height
142
+ });
143
+ } catch (_unused9) {}
144
+ }
145
+ };
146
+ }
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { RCropperProps } from './interface';
3
+ declare const RCropper: React.ForwardRefExoticComponent<RCropperProps & React.RefAttributes<unknown>>;
4
+ export default RCropper;
@@ -0,0 +1,183 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import _typeof from "@babel/runtime/helpers/esm/typeof";
3
+ import React, { forwardRef, useContext, useEffect, useImperativeHandle, useRef, useCallback, useMemo } from 'react';
4
+ import Cropper, { toKebabCase } from 'cropperjs';
5
+ import classNames from 'classnames';
6
+ import { ConfigContext } from "../ConfigProvider";
7
+ import { createCropperHandlers } from "./handler";
8
+ import Toolbar from "./toolbar";
9
+ import { jsx as _jsx } from "react/jsx-runtime";
10
+ import { Fragment as _Fragment } from "react/jsx-runtime";
11
+ import { jsxs as _jsxs } from "react/jsx-runtime";
12
+ var isNonEmptyObject = function isNonEmptyObject(obj) {
13
+ return _typeof(obj) === 'object' && obj !== null && !Array.isArray(obj) && Object.keys(obj).length > 0;
14
+ };
15
+
16
+ /**
17
+ * 属性设置方法
18
+ * @param element DOM元素
19
+ * @param attrName 属性名(kebab-case)
20
+ * @param value 属性值
21
+ */
22
+ var setElementAttribute = function setElementAttribute(element, attrName, value) {
23
+ if (!element) return;
24
+ // 处理布尔值
25
+ if (typeof value === 'boolean') {
26
+ // eslint-disable-next-line no-unused-expressions, @typescript-eslint/no-unused-expressions
27
+ value ? element.setAttribute(attrName, '') : element.removeAttribute(attrName);
28
+ } else if (value === null || value === undefined) {
29
+ element.removeAttribute(attrName);
30
+ } else {
31
+ element.setAttribute(attrName, String(value));
32
+ }
33
+ };
34
+ var RCropper = /*#__PURE__*/forwardRef(function (props, ref) {
35
+ var src = props.src,
36
+ _props$alt = props.alt,
37
+ alt = _props$alt === void 0 ? 'image' : _props$alt,
38
+ className = props.className,
39
+ style = props.style,
40
+ grid = props.grid,
41
+ canvas = props.canvas,
42
+ selection = props.selection,
43
+ dragMode = props.dragMode,
44
+ onCrop = props.onCrop,
45
+ onZoom = props.onZoom,
46
+ onRotate = props.onRotate,
47
+ onFlip = props.onFlip,
48
+ onReset = props.onReset,
49
+ onCancelCrop = props.onCancelCrop;
50
+ var _useContext = useContext(ConfigContext),
51
+ prefixCls = _useContext.prefixCls,
52
+ getPrefixCls = _useContext.getPrefixCls;
53
+ var classname = getPrefixCls('rcropper');
54
+ var wrapperClass = classNames(_defineProperty({}, "".concat(prefixCls, "-rcropper"), !!prefixCls), classname, className);
55
+ var cropperRef = useRef(null);
56
+ var cropperInstanceRef = useRef(null);
57
+ var imgTransformRef = useRef();
58
+ var setCropperElementAttributes = useCallback(function (elementGetter, props) {
59
+ var nextTick = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
60
+ if (cropperInstanceRef.current && isNonEmptyObject(props)) {
61
+ var element = elementGetter(cropperInstanceRef.current);
62
+ Object.keys(props).forEach(function (key) {
63
+ var kebabKey = toKebabCase(key);
64
+ if (props[key] !== undefined) {
65
+ var setAttr = function setAttr() {
66
+ return setElementAttribute(element, kebabKey, props[key]);
67
+ };
68
+ if (nextTick) {
69
+ var _element$$nextTick;
70
+ element === null || element === void 0 || (_element$$nextTick = element.$nextTick) === null || _element$$nextTick === void 0 || _element$$nextTick.call(element, setAttr);
71
+ } else {
72
+ setAttr();
73
+ }
74
+ }
75
+ });
76
+ }
77
+ }, []);
78
+ var setGrid = useCallback(function (_grid) {
79
+ setCropperElementAttributes(function (cropper) {
80
+ var _cropper$getCropperSe;
81
+ return (_cropper$getCropperSe = cropper.getCropperSelection()) === null || _cropper$getCropperSe === void 0 ? void 0 : _cropper$getCropperSe.querySelector('cropper-grid');
82
+ }, _grid);
83
+ }, []);
84
+ var setSelection = useCallback(function (_selection) {
85
+ setCropperElementAttributes(function (cropper) {
86
+ return cropper.getCropperSelection();
87
+ }, _selection, true);
88
+ }, []);
89
+ var setCanvas = useCallback(function (_canvas) {
90
+ setCropperElementAttributes(function (cropper) {
91
+ return cropper.getCropperCanvas();
92
+ }, _canvas, true);
93
+ }, []);
94
+ var setDragMode = function setDragMode(_dragMode) {
95
+ if (cropperInstanceRef.current) {
96
+ var selectionDom = cropperInstanceRef.current.getCropperSelection();
97
+ var handleDom = selectionDom === null || selectionDom === void 0 ? void 0 : selectionDom.querySelector('cropper-handle');
98
+ handleDom === null || handleDom === void 0 || handleDom.setAttribute('action', _dragMode || 'crop');
99
+ }
100
+ };
101
+ // initialize cropper options
102
+ var initializeOptions = useCallback(function () {
103
+ if (isNonEmptyObject(grid)) setGrid(grid);
104
+ if (isNonEmptyObject(canvas)) setCanvas(canvas);
105
+ if (isNonEmptyObject(selection)) setSelection(selection);
106
+ if (dragMode) setDragMode(dragMode);
107
+ }, [dragMode, grid, canvas, selection]);
108
+ var handleAction = useMemo(function () {
109
+ return createCropperHandlers(cropperInstanceRef, imgTransformRef, {
110
+ onCrop: onCrop,
111
+ onZoom: onZoom,
112
+ onRotate: onRotate,
113
+ onFlip: onFlip,
114
+ onReset: onReset,
115
+ onCancelCrop: onCancelCrop
116
+ });
117
+ }, [onCrop, onZoom, onRotate, onFlip, onReset, onCancelCrop]);
118
+ useImperativeHandle(ref, function () {
119
+ var _cropperInstanceRef$c, _cropperInstanceRef$c2, _cropperInstanceRef$c3, _cropperInstanceRef$c4, _cropperInstanceRef$c5, _cropperInstanceRef$c6;
120
+ return {
121
+ cropper: cropperInstanceRef.current,
122
+ image: (_cropperInstanceRef$c = (_cropperInstanceRef$c2 = cropperInstanceRef.current) === null || _cropperInstanceRef$c2 === void 0 ? void 0 : _cropperInstanceRef$c2.getCropperImage()) !== null && _cropperInstanceRef$c !== void 0 ? _cropperInstanceRef$c : null,
123
+ canvas: (_cropperInstanceRef$c3 = (_cropperInstanceRef$c4 = cropperInstanceRef.current) === null || _cropperInstanceRef$c4 === void 0 ? void 0 : _cropperInstanceRef$c4.getCropperCanvas()) !== null && _cropperInstanceRef$c3 !== void 0 ? _cropperInstanceRef$c3 : null,
124
+ selection: (_cropperInstanceRef$c5 = (_cropperInstanceRef$c6 = cropperInstanceRef.current) === null || _cropperInstanceRef$c6 === void 0 ? void 0 : _cropperInstanceRef$c6.getCropperSelection()) !== null && _cropperInstanceRef$c5 !== void 0 ? _cropperInstanceRef$c5 : null
125
+ };
126
+ });
127
+ // handle dragMode
128
+ useEffect(function () {
129
+ if (dragMode) {
130
+ setDragMode(dragMode);
131
+ }
132
+ }, [dragMode]);
133
+ useEffect(function () {
134
+ if (canvas) {
135
+ setCanvas(canvas);
136
+ }
137
+ }, [canvas]);
138
+ useEffect(function () {
139
+ if (selection) {
140
+ setSelection(selection);
141
+ }
142
+ }, [selection]);
143
+ useEffect(function () {
144
+ if (cropperInstanceRef.current) {
145
+ var imgDom = cropperInstanceRef.current.getCropperImage();
146
+ var selectionDom = cropperInstanceRef.current.getCropperSelection();
147
+ if (!src) {
148
+ imgDom === null || imgDom === void 0 || imgDom.setAttribute('src', src);
149
+ } else {
150
+ selectionDom === null || selectionDom === void 0 || selectionDom.$reset();
151
+ selectionDom === null || selectionDom === void 0 || selectionDom.setAttribute('hidden', 'true');
152
+ }
153
+ }
154
+ }, [src]);
155
+ useEffect(function () {
156
+ if (cropperRef.current && !cropperInstanceRef.current) {
157
+ cropperInstanceRef.current = new Cropper(cropperRef.current);
158
+ var img = cropperInstanceRef.current.getCropperImage();
159
+ var cropperCanvas = cropperInstanceRef.current.getCropperCanvas();
160
+ cropperCanvas === null || cropperCanvas === void 0 || cropperCanvas.$addStyles(":host { height: 100%; }");
161
+ img === null || img === void 0 || img.$ready(function () {
162
+ img.setAttribute('crossOrigin', 'Anonymous');
163
+ // 缓存图片初始transform
164
+ imgTransformRef.current = img.$getTransform();
165
+ initializeOptions();
166
+ });
167
+ }
168
+ }, []);
169
+ return /*#__PURE__*/_jsxs(_Fragment, {
170
+ children: [/*#__PURE__*/_jsx("div", {
171
+ className: wrapperClass,
172
+ style: style,
173
+ children: /*#__PURE__*/_jsx("img", {
174
+ ref: cropperRef,
175
+ src: src,
176
+ alt: alt
177
+ })
178
+ }), /*#__PURE__*/_jsx(Toolbar, {
179
+ onAction: handleAction
180
+ })]
181
+ });
182
+ });
183
+ export default RCropper;
@@ -0,0 +1,70 @@
1
+ /// <reference types="react" />
2
+ import type Cropper from 'cropperjs';
3
+ import type { CropperGrid, CropperSelection, CropperImage, CropperCanvas, CropperHandle } from 'cropperjs';
4
+ export declare type RCropperGrid = Partial<Pick<CropperGrid, 'rows' | 'columns'>>;
5
+ export declare type RCropperSelection = Partial<Pick<CropperSelection, 'x' | 'y' | 'width' | 'height' | 'aspectRatio' | 'initialAspectRatio' | 'zoomable' | 'resizable'>>;
6
+ export declare type RCropperImage = Partial<Pick<CropperImage, 'rotatable' | 'scalable' | 'skewable' | 'translatable'>>;
7
+ export declare type RCropperCanvas = Partial<Pick<CropperCanvas, 'scaleStep' | 'disabled'>>;
8
+ export interface RCropperEvents {
9
+ onCrop?(_src: string | undefined, _file?: File): void;
10
+ onZoom?(imgData: number[] | undefined): void;
11
+ onRotate?(imgData: number[] | undefined): void;
12
+ onFlip?(imgData: number[] | undefined): void;
13
+ onReset?(imgData: number[] | undefined): void;
14
+ onCancelCrop?(selectionData: {
15
+ x: number;
16
+ y: number;
17
+ width: number;
18
+ height: number;
19
+ }): void;
20
+ }
21
+ export interface RCropperActionHandlers {
22
+ handleCrop: () => Promise<void>;
23
+ handleZoomIn: () => void;
24
+ handleZoomOut: () => void;
25
+ handleRotateLeft: () => void;
26
+ handleRotateRight: () => void;
27
+ handleFlipX: () => void;
28
+ handleFlipY: () => void;
29
+ handleReset: () => void;
30
+ handleCancelCrop: () => void;
31
+ }
32
+ export interface RCropperRef {
33
+ cropper: Cropper | null;
34
+ image: CropperImage | null;
35
+ canvas: CropperCanvas | null;
36
+ selection: CropperSelection | null;
37
+ }
38
+ export interface RCropperProps extends RCropperEvents {
39
+ /**
40
+ * 图片的源地址
41
+ * @description 可以是本地图片路径或网络图片URL
42
+ */
43
+ src: string;
44
+ alt?: string;
45
+ className?: string;
46
+ style?: React.CSSProperties;
47
+ /**
48
+ * 拖拽模式
49
+ * @default 'crop'
50
+ * @description 'crop' - 裁剪模式, 'move' - 移动模式, 'none' - 禁用拖拽
51
+ */
52
+ dragMode?: 'crop' | 'move' | 'none';
53
+ grid?: RCropperGrid;
54
+ /**
55
+ * 裁剪区域的配置
56
+ * @description 可以设置裁剪区域的宽度、高度、纵横比等属性
57
+ */
58
+ selection?: RCropperSelection;
59
+ /**
60
+ * 图片的配置
61
+ * @description 可以设置图片的旋转、缩放、倾斜、平移等属性
62
+ */
63
+ image?: RCropperImage;
64
+ /**
65
+ * 画布的配置
66
+ * @description 可以设置画布的缩放步长、禁用状态等属性
67
+ */
68
+ canvas?: RCropperCanvas;
69
+ }
70
+ export declare type RCropperElement = CropperCanvas | CropperGrid | CropperSelection | CropperImage | CropperHandle | null;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ .toolbar {
2
+ display: flex;
3
+ background-color: rgba(0, 0, 0, 50%);
4
+ justify-content: center;
5
+ align-items: center;
6
+ color: #fff;
7
+
8
+ button {
9
+ background-color: transparent;
10
+ border-width: 0;
11
+ cursor: pointer;
12
+ display: flex;
13
+ align-items: center;
14
+ // width: 32px;
15
+ // height: 32px;
16
+
17
+ &:hover {
18
+ background-color: #0074d9;
19
+ }
20
+ }
21
+
22
+ .icon > path {
23
+ fill: #fff;
24
+ }
25
+ }