deepsea-components 5.11.6 → 5.12.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.
- package/dist/components/AutoFit.cjs +116 -0
- package/dist/components/AutoFit.js +82 -0
- package/dist/components/AutoScroll.cjs +125 -0
- package/dist/components/AutoScroll.js +91 -0
- package/dist/components/AutoSizeTextarea.cjs +73 -0
- package/dist/components/AutoSizeTextarea.js +39 -0
- package/dist/components/CircleText.cjs +68 -0
- package/dist/components/CircleText.js +34 -0
- package/dist/components/CopyButton.cjs +73 -0
- package/dist/{cjs/components → components}/CopyButton.d.ts +3 -3
- package/dist/components/CopyButton.js +27 -0
- package/dist/components/Echart.cjs +74 -0
- package/dist/components/Echart.js +34 -0
- package/dist/components/Flow.cjs +211 -0
- package/dist/components/Flow.js +168 -0
- package/dist/components/FormLabel.cjs +77 -0
- package/dist/components/FormLabel.js +37 -0
- package/dist/components/HlsPlayer.cjs +76 -0
- package/dist/components/HlsPlayer.js +32 -0
- package/dist/components/InfiniteScroll.cjs +135 -0
- package/dist/{cjs/components → components}/InfiniteScroll.d.ts +7 -7
- package/dist/components/InfiniteScroll.js +101 -0
- package/dist/components/InputFile.cjs +102 -0
- package/dist/components/InputFile.js +65 -0
- package/dist/components/InputFileButton.cjs +109 -0
- package/dist/components/InputFileButton.js +75 -0
- package/dist/components/LoopSwiper.cjs +147 -0
- package/dist/components/LoopSwiper.js +113 -0
- package/dist/components/ReadExcel.cjs +48 -0
- package/dist/components/ReadExcel.js +14 -0
- package/dist/components/Ring.cjs +53 -0
- package/dist/components/Ring.js +19 -0
- package/dist/components/Scroll.cjs +143 -0
- package/dist/components/Scroll.js +54 -0
- package/dist/components/SectionRing.cjs +59 -0
- package/dist/components/SectionRing.js +25 -0
- package/dist/components/Skeleton.cjs +66 -0
- package/dist/components/Skeleton.js +32 -0
- package/dist/components/Title.cjs +61 -0
- package/dist/components/Title.js +27 -0
- package/dist/components/TransitionBox.cjs +79 -0
- package/dist/components/TransitionBox.js +45 -0
- package/dist/components/TransitionNum.cjs +83 -0
- package/dist/components/TransitionNum.js +49 -0
- package/dist/components/Trapezium.cjs +67 -0
- package/dist/components/Trapezium.js +33 -0
- package/dist/components/Unify.cjs +68 -0
- package/dist/components/Unify.js +31 -0
- package/dist/components/WriteExcel.cjs +50 -0
- package/dist/components/WriteExcel.js +16 -0
- package/dist/index.cjs +285 -0
- package/dist/index.js +26 -0
- package/dist/utils/getReactVersion.cjs +40 -0
- package/dist/utils/getReactVersion.js +6 -0
- package/dist/utils/index.cjs +57 -0
- package/dist/utils/index.js +17 -0
- package/package.json +26 -17
- package/src/components/WriteExcel.tsx +25 -25
- package/tsconfig.json +16 -0
- package/dist/cjs/components/AutoFit.js +0 -106
- package/dist/cjs/components/AutoFit.js.map +0 -7
- package/dist/cjs/components/AutoScroll.js +0 -127
- package/dist/cjs/components/AutoScroll.js.map +0 -7
- package/dist/cjs/components/AutoSizeTextarea.js +0 -70
- package/dist/cjs/components/AutoSizeTextarea.js.map +0 -7
- package/dist/cjs/components/CircleText.js +0 -77
- package/dist/cjs/components/CircleText.js.map +0 -7
- package/dist/cjs/components/CopyButton.js +0 -60
- package/dist/cjs/components/CopyButton.js.map +0 -7
- package/dist/cjs/components/Echart.js +0 -56
- package/dist/cjs/components/Echart.js.map +0 -7
- package/dist/cjs/components/Flow.js +0 -220
- package/dist/cjs/components/Flow.js.map +0 -7
- package/dist/cjs/components/FormLabel.js +0 -42
- package/dist/cjs/components/FormLabel.js.map +0 -7
- package/dist/cjs/components/HlsPlayer.js +0 -65
- package/dist/cjs/components/HlsPlayer.js.map +0 -7
- package/dist/cjs/components/InfiniteScroll.js +0 -148
- package/dist/cjs/components/InfiniteScroll.js.map +0 -7
- package/dist/cjs/components/InputFile.js +0 -90
- package/dist/cjs/components/InputFile.js.map +0 -7
- package/dist/cjs/components/InputFileButton.js +0 -113
- package/dist/cjs/components/InputFileButton.js.map +0 -7
- package/dist/cjs/components/LoopSwiper.js +0 -137
- package/dist/cjs/components/LoopSwiper.js.map +0 -7
- package/dist/cjs/components/ReadExcel.js +0 -36
- package/dist/cjs/components/ReadExcel.js.map +0 -7
- package/dist/cjs/components/Ring.js +0 -49
- package/dist/cjs/components/Ring.js.map +0 -7
- package/dist/cjs/components/Scroll.js +0 -103
- package/dist/cjs/components/Scroll.js.map +0 -7
- package/dist/cjs/components/SectionRing.js +0 -54
- package/dist/cjs/components/SectionRing.js.map +0 -7
- package/dist/cjs/components/Skeleton.js +0 -66
- package/dist/cjs/components/Skeleton.js.map +0 -7
- package/dist/cjs/components/Title.js +0 -48
- package/dist/cjs/components/Title.js.map +0 -7
- package/dist/cjs/components/TransitionBox.js +0 -53
- package/dist/cjs/components/TransitionBox.js.map +0 -7
- package/dist/cjs/components/TransitionNum.js +0 -62
- package/dist/cjs/components/TransitionNum.js.map +0 -7
- package/dist/cjs/components/Trapezium.js +0 -69
- package/dist/cjs/components/Trapezium.js.map +0 -7
- package/dist/cjs/components/Unify.js +0 -48
- package/dist/cjs/components/Unify.js.map +0 -7
- package/dist/cjs/components/WriteExcel.js +0 -45
- package/dist/cjs/components/WriteExcel.js.map +0 -7
- package/dist/cjs/index.js +0 -74
- package/dist/cjs/index.js.map +0 -7
- package/dist/cjs/utils/getReactVersion.js +0 -34
- package/dist/cjs/utils/getReactVersion.js.map +0 -7
- package/dist/cjs/utils/index.js +0 -52
- package/dist/cjs/utils/index.js.map +0 -7
- package/dist/esm/components/AutoFit.d.ts +0 -25
- package/dist/esm/components/AutoFit.js +0 -97
- package/dist/esm/components/AutoFit.js.map +0 -1
- package/dist/esm/components/AutoScroll.d.ts +0 -38
- package/dist/esm/components/AutoScroll.js +0 -102
- package/dist/esm/components/AutoScroll.js.map +0 -1
- package/dist/esm/components/AutoSizeTextarea.d.ts +0 -5
- package/dist/esm/components/AutoSizeTextarea.js +0 -48
- package/dist/esm/components/AutoSizeTextarea.js.map +0 -1
- package/dist/esm/components/CircleText.d.ts +0 -25
- package/dist/esm/components/CircleText.js +0 -49
- package/dist/esm/components/CircleText.js.map +0 -1
- package/dist/esm/components/CopyButton.d.ts +0 -13
- package/dist/esm/components/CopyButton.js +0 -31
- package/dist/esm/components/CopyButton.js.map +0 -1
- package/dist/esm/components/Echart.d.ts +0 -15
- package/dist/esm/components/Echart.js +0 -41
- package/dist/esm/components/Echart.js.map +0 -1
- package/dist/esm/components/Flow.d.ts +0 -86
- package/dist/esm/components/Flow.js +0 -186
- package/dist/esm/components/Flow.js.map +0 -1
- package/dist/esm/components/FormLabel.d.ts +0 -22
- package/dist/esm/components/FormLabel.js +0 -52
- package/dist/esm/components/FormLabel.js.map +0 -1
- package/dist/esm/components/HlsPlayer.d.ts +0 -5
- package/dist/esm/components/HlsPlayer.js +0 -36
- package/dist/esm/components/HlsPlayer.js.map +0 -1
- package/dist/esm/components/InfiniteScroll.d.ts +0 -54
- package/dist/esm/components/InfiniteScroll.js +0 -102
- package/dist/esm/components/InfiniteScroll.js.map +0 -1
- package/dist/esm/components/InputFile.d.ts +0 -26
- package/dist/esm/components/InputFile.js +0 -78
- package/dist/esm/components/InputFile.js.map +0 -1
- package/dist/esm/components/InputFileButton.d.ts +0 -11
- package/dist/esm/components/InputFileButton.js +0 -95
- package/dist/esm/components/InputFileButton.js.map +0 -1
- package/dist/esm/components/LoopSwiper.d.ts +0 -9
- package/dist/esm/components/LoopSwiper.js +0 -122
- package/dist/esm/components/LoopSwiper.js.map +0 -1
- package/dist/esm/components/ReadExcel.d.ts +0 -8
- package/dist/esm/components/ReadExcel.js +0 -19
- package/dist/esm/components/ReadExcel.js.map +0 -1
- package/dist/esm/components/Ring.d.ts +0 -7
- package/dist/esm/components/Ring.js +0 -26
- package/dist/esm/components/Ring.js.map +0 -1
- package/dist/esm/components/Scroll.d.ts +0 -24
- package/dist/esm/components/Scroll.js +0 -67
- package/dist/esm/components/Scroll.js.map +0 -1
- package/dist/esm/components/SectionRing.d.ts +0 -8
- package/dist/esm/components/SectionRing.js +0 -33
- package/dist/esm/components/SectionRing.js.map +0 -1
- package/dist/esm/components/Skeleton.d.ts +0 -5
- package/dist/esm/components/Skeleton.js +0 -38
- package/dist/esm/components/Skeleton.js.map +0 -1
- package/dist/esm/components/Title.d.ts +0 -3
- package/dist/esm/components/Title.js +0 -26
- package/dist/esm/components/Title.js.map +0 -1
- package/dist/esm/components/TransitionBox.d.ts +0 -10
- package/dist/esm/components/TransitionBox.js +0 -50
- package/dist/esm/components/TransitionBox.js.map +0 -1
- package/dist/esm/components/TransitionNum.d.ts +0 -16
- package/dist/esm/components/TransitionNum.js +0 -65
- package/dist/esm/components/TransitionNum.js.map +0 -1
- package/dist/esm/components/Trapezium.d.ts +0 -9
- package/dist/esm/components/Trapezium.js +0 -43
- package/dist/esm/components/Trapezium.js.map +0 -1
- package/dist/esm/components/Unify.d.ts +0 -13
- package/dist/esm/components/Unify.js +0 -47
- package/dist/esm/components/Unify.js.map +0 -1
- package/dist/esm/components/WriteExcel.d.ts +0 -8
- package/dist/esm/components/WriteExcel.js +0 -23
- package/dist/esm/components/WriteExcel.js.map +0 -1
- package/dist/esm/index.d.ts +0 -26
- package/dist/esm/index.js +0 -27
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/utils/getReactVersion.d.ts +0 -1
- package/dist/esm/utils/getReactVersion.js +0 -6
- package/dist/esm/utils/getReactVersion.js.map +0 -1
- package/dist/esm/utils/index.d.ts +0 -9
- package/dist/esm/utils/index.js +0 -17
- package/dist/esm/utils/index.js.map +0 -1
- /package/dist/{cjs/components → components}/AutoFit.d.ts +0 -0
- /package/dist/{cjs/components → components}/AutoScroll.d.ts +0 -0
- /package/dist/{cjs/components → components}/AutoSizeTextarea.d.ts +0 -0
- /package/dist/{cjs/components → components}/CircleText.d.ts +0 -0
- /package/dist/{cjs/components → components}/Echart.d.ts +0 -0
- /package/dist/{cjs/components → components}/Flow.d.ts +0 -0
- /package/dist/{cjs/components → components}/FormLabel.d.ts +0 -0
- /package/dist/{cjs/components → components}/HlsPlayer.d.ts +0 -0
- /package/dist/{cjs/components → components}/InputFile.d.ts +0 -0
- /package/dist/{cjs/components → components}/InputFileButton.d.ts +0 -0
- /package/dist/{cjs/components → components}/LoopSwiper.d.ts +0 -0
- /package/dist/{cjs/components → components}/ReadExcel.d.ts +0 -0
- /package/dist/{cjs/components → components}/Ring.d.ts +0 -0
- /package/dist/{cjs/components → components}/Scroll.d.ts +0 -0
- /package/dist/{cjs/components → components}/SectionRing.d.ts +0 -0
- /package/dist/{cjs/components → components}/Skeleton.d.ts +0 -0
- /package/dist/{cjs/components → components}/Title.d.ts +0 -0
- /package/dist/{cjs/components → components}/TransitionBox.d.ts +0 -0
- /package/dist/{cjs/components → components}/TransitionNum.d.ts +0 -0
- /package/dist/{cjs/components → components}/Trapezium.d.ts +0 -0
- /package/dist/{cjs/components → components}/Unify.d.ts +0 -0
- /package/dist/{cjs/components → components}/WriteExcel.d.ts +0 -0
- /package/dist/{cjs/index.d.ts → index.d.ts} +0 -0
- /package/dist/{cjs/utils → utils}/getReactVersion.d.ts +0 -0
- /package/dist/{cjs/utils → utils}/index.d.ts +0 -0
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useEffect, useImperativeHandle, useRef, useState } from "react";
|
|
4
|
-
import { css } from "@emotion/css";
|
|
5
|
-
import { clsx } from "deepsea-tools";
|
|
6
|
-
import { useSize } from "soda-hooks";
|
|
7
|
-
import { px, transformCSSVariable } from "../utils";
|
|
8
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
-
export function getGapRange(gap) {
|
|
10
|
-
if (typeof gap === "number") return [gap, gap];
|
|
11
|
-
if (Array.isArray(gap)) return [typeof gap[0] === "number" ? gap[0] : 0, gap[1]];
|
|
12
|
-
return [0, "auto"];
|
|
13
|
-
}
|
|
14
|
-
export function getGapCountAndSize(width, itemWidth, minGap, maxGap) {
|
|
15
|
-
const count = Math.floor((width + minGap) / (itemWidth + minGap)) || 1;
|
|
16
|
-
if (count === 1) return {
|
|
17
|
-
count,
|
|
18
|
-
gap: 0
|
|
19
|
-
};
|
|
20
|
-
const averageGap = (width - itemWidth * count) / (count - 1);
|
|
21
|
-
if (averageGap < minGap) return {
|
|
22
|
-
count,
|
|
23
|
-
gap: minGap
|
|
24
|
-
};
|
|
25
|
-
if (maxGap !== "auto" && averageGap > maxGap) return {
|
|
26
|
-
count,
|
|
27
|
-
gap: maxGap
|
|
28
|
-
};
|
|
29
|
-
return {
|
|
30
|
-
count,
|
|
31
|
-
gap: averageGap
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
/** 手动组件,由外界指定宽度,性能更好 */
|
|
35
|
-
export function ManualFlow(props) {
|
|
36
|
-
let {
|
|
37
|
-
itemWidth,
|
|
38
|
-
itemHeight,
|
|
39
|
-
columnGap,
|
|
40
|
-
rowGap,
|
|
41
|
-
maxRows,
|
|
42
|
-
data = [],
|
|
43
|
-
render,
|
|
44
|
-
keyExactor,
|
|
45
|
-
className,
|
|
46
|
-
style,
|
|
47
|
-
wrapperClassName,
|
|
48
|
-
wrapperStyle,
|
|
49
|
-
throttle,
|
|
50
|
-
transitionDuration,
|
|
51
|
-
onSizeChange,
|
|
52
|
-
containerClassName,
|
|
53
|
-
containerStyle,
|
|
54
|
-
gap = 0,
|
|
55
|
-
width,
|
|
56
|
-
element,
|
|
57
|
-
...rest
|
|
58
|
-
} = props;
|
|
59
|
-
rowGap ??= gap;
|
|
60
|
-
columnGap ??= gap;
|
|
61
|
-
const [minColumnGap, maxColumnGap] = getGapRange(columnGap);
|
|
62
|
-
const [{
|
|
63
|
-
count: columnCount,
|
|
64
|
-
gap: columnGapSize
|
|
65
|
-
}, setGapAndCount] = useState(() => getGapCountAndSize(width, itemWidth, minColumnGap, maxColumnGap));
|
|
66
|
-
const ele = useRef(null);
|
|
67
|
-
const contentRows = Math.ceil(data.length / columnCount);
|
|
68
|
-
const contentShownRows = typeof maxRows === "number" ? Math.min(contentRows, maxRows) : contentRows;
|
|
69
|
-
const height = contentShownRows > 0 ? contentShownRows * (itemHeight + rowGap) - rowGap : 0;
|
|
70
|
-
function getPosition(index) {
|
|
71
|
-
const y = Math.floor(index / columnCount);
|
|
72
|
-
const x = index - y * columnCount;
|
|
73
|
-
return {
|
|
74
|
-
left: x * (itemWidth + columnGapSize),
|
|
75
|
-
top: y * (itemHeight + rowGap)
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
function getHidden(index) {
|
|
79
|
-
if (typeof maxRows !== "number") return false;
|
|
80
|
-
return index >= maxRows * columnCount;
|
|
81
|
-
}
|
|
82
|
-
useImperativeHandle(element, () => ele.current, [ele.current]);
|
|
83
|
-
useEffect(() => {
|
|
84
|
-
function task() {
|
|
85
|
-
setGapAndCount(getGapCountAndSize(width, itemWidth, minColumnGap, maxColumnGap));
|
|
86
|
-
}
|
|
87
|
-
if (throttle === 0) return task();
|
|
88
|
-
const timeout = setTimeout(task, throttle || 200);
|
|
89
|
-
return () => clearTimeout(timeout);
|
|
90
|
-
}, [width, itemWidth, throttle, minColumnGap, maxColumnGap]);
|
|
91
|
-
useEffect(() => {
|
|
92
|
-
onSizeChange?.({
|
|
93
|
-
width,
|
|
94
|
-
height,
|
|
95
|
-
itemWidth,
|
|
96
|
-
itemHeight,
|
|
97
|
-
columnGap: columnGapSize,
|
|
98
|
-
columnCount,
|
|
99
|
-
rowGap: rowGap,
|
|
100
|
-
rowCount: contentShownRows,
|
|
101
|
-
overflow: data.length > contentShownRows * columnCount,
|
|
102
|
-
itemCount: data.length,
|
|
103
|
-
maxRows: maxRows ?? null
|
|
104
|
-
});
|
|
105
|
-
}, [width, height, columnGapSize, columnCount, rowGap, contentShownRows, data.length, itemWidth, itemHeight, maxRows]);
|
|
106
|
-
return /*#__PURE__*/_jsx("div", {
|
|
107
|
-
ref: ele,
|
|
108
|
-
className: clsx(css`
|
|
109
|
-
position: relative;
|
|
110
|
-
height: var(--height);
|
|
111
|
-
overflow: hidden;
|
|
112
|
-
`, className),
|
|
113
|
-
style: transformCSSVariable({
|
|
114
|
-
height: px(height)
|
|
115
|
-
}, style),
|
|
116
|
-
...rest,
|
|
117
|
-
children: data.map((item, index, arr) => /*#__PURE__*/_jsx("div", {
|
|
118
|
-
className: clsx(css`
|
|
119
|
-
position: absolute;
|
|
120
|
-
width: var(--width);
|
|
121
|
-
height: var(--height);
|
|
122
|
-
transition: var(--transition);
|
|
123
|
-
left: 0;
|
|
124
|
-
top: 0;
|
|
125
|
-
transform: translate(var(--left), var(--top));
|
|
126
|
-
`, wrapperClassName),
|
|
127
|
-
style: transformCSSVariable({
|
|
128
|
-
width: px(itemWidth),
|
|
129
|
-
height: px(itemHeight),
|
|
130
|
-
transition: transitionDuration === 0 ? "none" : `all ${transitionDuration || 400}ms`,
|
|
131
|
-
left: px(getPosition(index).left),
|
|
132
|
-
top: px(getPosition(index).top)
|
|
133
|
-
}, wrapperStyle),
|
|
134
|
-
children: /*#__PURE__*/_jsx("div", {
|
|
135
|
-
className: clsx(css`
|
|
136
|
-
width: 100%;
|
|
137
|
-
height: 100%;
|
|
138
|
-
display: var(--display);
|
|
139
|
-
`, containerClassName),
|
|
140
|
-
style: transformCSSVariable({
|
|
141
|
-
display: getHidden(index) ? "none" : "block"
|
|
142
|
-
}, containerStyle),
|
|
143
|
-
children: render(item, index, arr)
|
|
144
|
-
})
|
|
145
|
-
}, keyExactor ? keyExactor(item, index, arr) : index))
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/** 自适应浮动组件 */
|
|
150
|
-
export function Flow(props) {
|
|
151
|
-
const {
|
|
152
|
-
itemWidth,
|
|
153
|
-
itemHeight,
|
|
154
|
-
columnGap,
|
|
155
|
-
rowGap,
|
|
156
|
-
gap,
|
|
157
|
-
maxRows,
|
|
158
|
-
data,
|
|
159
|
-
render,
|
|
160
|
-
keyExactor,
|
|
161
|
-
wrapperClassName,
|
|
162
|
-
wrapperStyle,
|
|
163
|
-
containerClassName,
|
|
164
|
-
containerStyle,
|
|
165
|
-
throttle,
|
|
166
|
-
transitionDuration,
|
|
167
|
-
onSizeChange,
|
|
168
|
-
element,
|
|
169
|
-
...rest
|
|
170
|
-
} = props;
|
|
171
|
-
const ele = useRef(null);
|
|
172
|
-
const size = useSize(ele);
|
|
173
|
-
const width = useRef(size?.width || 0);
|
|
174
|
-
if (size && size.width !== 0) width.current = size.width;
|
|
175
|
-
useImperativeHandle(element, () => ele.current, [ele.current]);
|
|
176
|
-
if (width.current === 0) return /*#__PURE__*/_jsx("div", {
|
|
177
|
-
ref: ele,
|
|
178
|
-
...rest
|
|
179
|
-
});
|
|
180
|
-
return /*#__PURE__*/_jsx(ManualFlow, {
|
|
181
|
-
element: ele,
|
|
182
|
-
...props,
|
|
183
|
-
width: width.current
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=Flow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useImperativeHandle","useRef","useState","css","clsx","useSize","px","transformCSSVariable","jsx","_jsx","getGapRange","gap","Array","isArray","getGapCountAndSize","width","itemWidth","minGap","maxGap","count","Math","floor","averageGap","ManualFlow","props","itemHeight","columnGap","rowGap","maxRows","data","render","keyExactor","className","style","wrapperClassName","wrapperStyle","throttle","transitionDuration","onSizeChange","containerClassName","containerStyle","element","rest","minColumnGap","maxColumnGap","columnCount","columnGapSize","setGapAndCount","ele","contentRows","ceil","length","contentShownRows","min","height","getPosition","index","y","x","left","top","getHidden","current","task","timeout","setTimeout","clearTimeout","rowCount","overflow","itemCount","ref","children","map","item","arr","transition","display","Flow","size"],"sources":["../../../src/components/Flow.tsx"],"sourcesContent":["\"use client\"\n\nimport { CSSProperties, HTMLAttributes, Key, ReactNode, Ref, useEffect, useImperativeHandle, useRef, useState } from \"react\"\nimport { css } from \"@emotion/css\"\nimport { clsx } from \"deepsea-tools\"\nimport { useSize } from \"soda-hooks\"\n\nimport { px, transformCSSVariable } from \"@/utils\"\n\nexport interface FlowSizeData {\n /** 容器宽度 */\n width: number\n /** 容器高度 */\n height: number\n /** 元素宽度 */\n itemWidth: number\n /** 元素高度 */\n itemHeight: number\n /** 列间距 */\n columnGap: number\n /** 列数 */\n columnCount: number\n /** 行间距 */\n rowGap: number\n /** 行数 */\n rowCount: number\n /** 元素格数 */\n itemCount: number\n /** 最大行数 */\n maxRows: number | null\n /** 是否有元素被隐藏 */\n overflow: boolean\n}\n\nexport interface FlowProps<T> extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** 元素宽度 */\n itemWidth: number\n /** 元素高度 */\n itemHeight: number\n /**\n * 列间距\n * 1. 如果是数字,表示列间距是固定的\n * 2. 如果是 auto,表示会在尽可能放进更多列的情况下,列间距是平均的\n * 2. 如果是数组,表示列间距是区间的,第一个元素是最小值,第二个元素是最大值\n */\n columnGap?: number | \"auto\" | [number | \"auto\", number | \"auto\"]\n /** 行间距 */\n rowGap?: number\n gap?: number\n /** 最大行数 */\n maxRows?: number | null\n /** 源数据 */\n data?: T[]\n /** 渲染 */\n render: (item: T, index: number, arr: T[]) => ReactNode\n /** key释放器,默认为 index */\n keyExactor?: (item: T, index: number, arr: T[]) => Key\n /**\n * 渲染的元素由两层容器包裹,外层容器类名\n */\n wrapperClassName?: string\n /**\n * 渲染的元素由两层容器包裹,外层容器样式\n */\n wrapperStyle?: CSSProperties\n /**\n * 渲染的元素由两层容器包裹,内层容器类名\n */\n containerClassName?: string\n /**\n * 渲染的元素由两层容器包裹,内层容器样式\n */\n containerStyle?: CSSProperties\n /** 节流时间,单位毫秒,默认200ms,传入 0 不节流 */\n throttle?: number\n /** 动画时间,单位毫秒,默认400ms,传入 0 不展示动画 */\n transitionDuration?: number\n /** 变化的回调函数 */\n onSizeChange?: (sizeData: FlowSizeData) => void\n element?: Ref<HTMLDivElement>\n}\n\nexport function getGapRange(gap?: undefined | number | \"auto\" | (number | \"auto\")[]): [number, number | \"auto\"] {\n if (typeof gap === \"number\") return [gap, gap]\n if (Array.isArray(gap)) return [typeof gap[0] === \"number\" ? gap[0] : 0, gap[1]]\n return [0, \"auto\"]\n}\n\nexport interface GapAndCount {\n count: number\n gap: number\n}\n\nexport function getGapCountAndSize(width: number, itemWidth: number, minGap: number, maxGap: number | \"auto\"): GapAndCount {\n const count = Math.floor((width + minGap) / (itemWidth + minGap)) || 1\n if (count === 1) return { count, gap: 0 }\n const averageGap = (width - itemWidth * count) / (count - 1)\n if (averageGap < minGap) return { count, gap: minGap }\n if (maxGap !== \"auto\" && averageGap > maxGap) return { count, gap: maxGap }\n return { count, gap: averageGap }\n}\n\nexport interface ManualFlowProps<T> extends FlowProps<T> {\n /** 组件宽度,必须指定 */\n width: number\n}\n\n/** 手动组件,由外界指定宽度,性能更好 */\nexport function ManualFlow<T>(props: ManualFlowProps<T>) {\n let {\n itemWidth,\n itemHeight,\n columnGap,\n rowGap,\n maxRows,\n data = [],\n render,\n keyExactor,\n className,\n style,\n wrapperClassName,\n wrapperStyle,\n throttle,\n transitionDuration,\n onSizeChange,\n containerClassName,\n containerStyle,\n gap = 0,\n width,\n element,\n ...rest\n } = props\n rowGap ??= gap\n columnGap ??= gap\n const [minColumnGap, maxColumnGap] = getGapRange(columnGap)\n const [{ count: columnCount, gap: columnGapSize }, setGapAndCount] = useState(() => getGapCountAndSize(width, itemWidth, minColumnGap, maxColumnGap))\n const ele = useRef<HTMLDivElement>(null)\n const contentRows = Math.ceil(data.length / columnCount)\n const contentShownRows = typeof maxRows === \"number\" ? Math.min(contentRows, maxRows) : contentRows\n const height = contentShownRows > 0 ? contentShownRows * (itemHeight + rowGap) - rowGap : 0\n\n function getPosition(index: number) {\n const y = Math.floor(index / columnCount)\n const x = index - y * columnCount\n return {\n left: x * (itemWidth + columnGapSize),\n top: y * (itemHeight + rowGap!),\n }\n }\n\n function getHidden(index: number) {\n if (typeof maxRows !== \"number\") return false\n return index >= maxRows * columnCount\n }\n\n useImperativeHandle(element, () => ele.current!, [ele.current])\n\n useEffect(() => {\n function task() {\n setGapAndCount(getGapCountAndSize(width, itemWidth, minColumnGap, maxColumnGap))\n }\n if (throttle === 0) return task()\n const timeout = setTimeout(task, throttle || 200)\n return () => clearTimeout(timeout)\n }, [width, itemWidth, throttle, minColumnGap, maxColumnGap])\n\n useEffect(() => {\n onSizeChange?.({\n width,\n height,\n itemWidth,\n itemHeight,\n columnGap: columnGapSize,\n columnCount,\n rowGap: rowGap!,\n rowCount: contentShownRows,\n overflow: data.length > contentShownRows * columnCount,\n itemCount: data.length,\n maxRows: maxRows ?? null,\n })\n }, [width, height, columnGapSize, columnCount, rowGap, contentShownRows, data.length, itemWidth, itemHeight, maxRows])\n\n return (\n <div\n ref={ele}\n className={clsx(\n css`\n position: relative;\n height: var(--height);\n overflow: hidden;\n `,\n className,\n )}\n style={transformCSSVariable({ height: px(height) }, style)}\n {...rest}\n >\n {data.map((item, index, arr) => (\n <div\n key={keyExactor ? keyExactor(item, index, arr) : index}\n className={clsx(\n css`\n position: absolute;\n width: var(--width);\n height: var(--height);\n transition: var(--transition);\n left: 0;\n top: 0;\n transform: translate(var(--left), var(--top));\n `,\n wrapperClassName,\n )}\n style={transformCSSVariable(\n {\n width: px(itemWidth),\n height: px(itemHeight),\n transition: transitionDuration === 0 ? \"none\" : `all ${transitionDuration || 400}ms`,\n left: px(getPosition(index).left),\n top: px(getPosition(index).top),\n },\n wrapperStyle,\n )}\n >\n <div\n className={clsx(\n css`\n width: 100%;\n height: 100%;\n display: var(--display);\n `,\n containerClassName,\n )}\n style={transformCSSVariable({ display: getHidden(index) ? \"none\" : \"block\" }, containerStyle)}\n >\n {render(item, index, arr)}\n </div>\n </div>\n ))}\n </div>\n )\n}\n\n/** 自适应浮动组件 */\nexport function Flow<T>(props: FlowProps<T>): ReactNode {\n const {\n itemWidth,\n itemHeight,\n columnGap,\n rowGap,\n gap,\n maxRows,\n data,\n render,\n keyExactor,\n wrapperClassName,\n wrapperStyle,\n containerClassName,\n containerStyle,\n throttle,\n transitionDuration,\n onSizeChange,\n element,\n ...rest\n } = props\n const ele = useRef<HTMLDivElement>(null)\n const size = useSize(ele)\n const width = useRef(size?.width || 0)\n if (size && size.width !== 0) width.current = size.width\n useImperativeHandle(element, () => ele.current!, [ele.current])\n if (width.current === 0) return <div ref={ele} {...rest} />\n return <ManualFlow element={ele} {...props} width={width.current} />\n}\n"],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { ComponentPropsWithoutRef, FC, ReactNode } from "react";
|
|
2
|
-
export interface FormLabelConfig {
|
|
3
|
-
/**
|
|
4
|
-
* Label 的宽度.
|
|
5
|
-
*/
|
|
6
|
-
width?: number;
|
|
7
|
-
/**
|
|
8
|
-
* 是否在 Label 前面添加一个空白区域,只有当前 Label 为非必选,而存在其他 Label 为必选的时候开启
|
|
9
|
-
*/
|
|
10
|
-
before?: boolean | number;
|
|
11
|
-
}
|
|
12
|
-
export interface FormLabelProps extends ComponentPropsWithoutRef<"div">, FormLabelConfig {
|
|
13
|
-
}
|
|
14
|
-
export declare const FormLabelConfigContext: import("react").Context<Partial<FormLabelConfig>>;
|
|
15
|
-
export interface FormLabelConfigProviderProps extends FormLabelConfig {
|
|
16
|
-
children?: ReactNode;
|
|
17
|
-
}
|
|
18
|
-
export declare const FormLabelConfigProvider: FC<FormLabelConfigProviderProps>;
|
|
19
|
-
/**
|
|
20
|
-
* 为 Ant Design 的 FormItem 设计的 Label 组件
|
|
21
|
-
*/
|
|
22
|
-
export declare const FormLabel: FC<FormLabelProps>;
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { Fragment, createContext, useContext } from "react";
|
|
4
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
|
-
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
|
-
export const FormLabelConfigContext = /*#__PURE__*/createContext({});
|
|
7
|
-
export const FormLabelConfigProvider = ({
|
|
8
|
-
width,
|
|
9
|
-
before,
|
|
10
|
-
children
|
|
11
|
-
}) => /*#__PURE__*/_jsx(FormLabelConfigContext.Provider, {
|
|
12
|
-
value: {
|
|
13
|
-
width,
|
|
14
|
-
before
|
|
15
|
-
},
|
|
16
|
-
children: children
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* 为 Ant Design 的 FormItem 设计的 Label 组件
|
|
21
|
-
*/
|
|
22
|
-
export const FormLabel = props => {
|
|
23
|
-
const {
|
|
24
|
-
width: _width,
|
|
25
|
-
before: _before
|
|
26
|
-
} = useContext(FormLabelConfigContext);
|
|
27
|
-
const {
|
|
28
|
-
style,
|
|
29
|
-
width = _width,
|
|
30
|
-
before = _before,
|
|
31
|
-
...rest
|
|
32
|
-
} = props;
|
|
33
|
-
return /*#__PURE__*/_jsxs(Fragment, {
|
|
34
|
-
children: [!!before && /*#__PURE__*/_jsx("div", {
|
|
35
|
-
style: {
|
|
36
|
-
width: 11,
|
|
37
|
-
color: "transparent",
|
|
38
|
-
userSelect: "none"
|
|
39
|
-
},
|
|
40
|
-
children: "\u2002"
|
|
41
|
-
}), /*#__PURE__*/_jsx("div", {
|
|
42
|
-
style: {
|
|
43
|
-
width,
|
|
44
|
-
textAlign: "justify",
|
|
45
|
-
textAlignLast: "justify",
|
|
46
|
-
...style
|
|
47
|
-
},
|
|
48
|
-
...rest
|
|
49
|
-
})]
|
|
50
|
-
});
|
|
51
|
-
};
|
|
52
|
-
//# sourceMappingURL=FormLabel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["Fragment","createContext","useContext","jsx","_jsx","jsxs","_jsxs","FormLabelConfigContext","FormLabelConfigProvider","width","before","children","Provider","value","FormLabel","props","_width","_before","style","rest","color","userSelect","textAlign","textAlignLast"],"sources":["../../../src/components/FormLabel.tsx"],"sourcesContent":["\"use client\"\n\nimport { ComponentPropsWithoutRef, FC, Fragment, ReactNode, createContext, useContext } from \"react\"\n\nexport interface FormLabelConfig {\n /**\n * Label 的宽度.\n */\n width?: number\n /**\n * 是否在 Label 前面添加一个空白区域,只有当前 Label 为非必选,而存在其他 Label 为必选的时候开启\n */\n before?: boolean | number\n}\n\nexport interface FormLabelProps extends ComponentPropsWithoutRef<\"div\">, FormLabelConfig {}\n\nexport const FormLabelConfigContext = createContext<Partial<FormLabelConfig>>({})\n\nexport interface FormLabelConfigProviderProps extends FormLabelConfig {\n children?: ReactNode\n}\n\nexport const FormLabelConfigProvider: FC<FormLabelConfigProviderProps> = ({ width, before, children }) => (\n <FormLabelConfigContext.Provider value={{ width, before }}>{children}</FormLabelConfigContext.Provider>\n)\n\n/**\n * 为 Ant Design 的 FormItem 设计的 Label 组件\n */\nexport const FormLabel: FC<FormLabelProps> = props => {\n const { width: _width, before: _before } = useContext(FormLabelConfigContext)\n const { style, width = _width, before = _before, ...rest } = props\n\n return (\n <Fragment>\n {!!before && <div style={{ width: 11, color: \"transparent\", userSelect: \"none\" }}> </div>}\n <div style={{ width, textAlign: \"justify\", textAlignLast: \"justify\", ...style }} {...rest} />\n </Fragment>\n )\n}\n"],"mappings":"AAAA,YAAY;;AAEZ,SAAuCA,QAAQ,EAAaC,aAAa,EAAEC,UAAU,QAAQ,OAAO;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAepG,OAAO,MAAMC,sBAAsB,gBAAGN,aAAa,CAA2B,CAAC,CAAC,CAAC;AAMjF,OAAO,MAAMO,uBAAyD,GAAGA,CAAC;EAAEC,KAAK;EAAEC,MAAM;EAAEC;AAAS,CAAC,kBACjGP,IAAA,CAACG,sBAAsB,CAACK,QAAQ;EAACC,KAAK,EAAE;IAAEJ,KAAK;IAAEC;EAAO,CAAE;EAAAC,QAAA,EAAEA;AAAQ,CAAkC,CACzG;;AAED;AACA;AACA;AACA,OAAO,MAAMG,SAA6B,GAAGC,KAAK,IAAI;EAClD,MAAM;IAAEN,KAAK,EAAEO,MAAM;IAAEN,MAAM,EAAEO;EAAQ,CAAC,GAAGf,UAAU,CAACK,sBAAsB,CAAC;EAC7E,MAAM;IAAEW,KAAK;IAAET,KAAK,GAAGO,MAAM;IAAEN,MAAM,GAAGO,OAAO;IAAE,GAAGE;EAAK,CAAC,GAAGJ,KAAK;EAElE,oBACIT,KAAA,CAACN,QAAQ;IAAAW,QAAA,GACJ,CAAC,CAACD,MAAM,iBAAIN,IAAA;MAAKc,KAAK,EAAE;QAAET,KAAK,EAAE,EAAE;QAAEW,KAAK,EAAE,aAAa;QAAEC,UAAU,EAAE;MAAO,CAAE;MAAAV,QAAA,EAAC;IAAM,CAAK,CAAC,eAC9FP,IAAA;MAAKc,KAAK,EAAE;QAAET,KAAK;QAAEa,SAAS,EAAE,SAAS;QAAEC,aAAa,EAAE,SAAS;QAAE,GAAGL;MAAM,CAAE;MAAA,GAAKC;IAAI,CAAG,CAAC;EAAA,CACvF,CAAC;AAEnB,CAAC"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { MediaHTMLAttributes } from "react";
|
|
2
|
-
export interface HlsPlayerProps extends Omit<MediaHTMLAttributes<HTMLVideoElement>, "src"> {
|
|
3
|
-
src: string;
|
|
4
|
-
}
|
|
5
|
-
export declare const HlsPlayer: import("react").ForwardRefExoticComponent<HlsPlayerProps & import("react").RefAttributes<HTMLVideoElement>>;
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { forwardRef, useEffect, useImperativeHandle, useRef } from "react";
|
|
4
|
-
import Hls from "hls.js";
|
|
5
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
-
export const HlsPlayer = /*#__PURE__*/forwardRef((props, ref) => {
|
|
7
|
-
const {
|
|
8
|
-
src,
|
|
9
|
-
...rest
|
|
10
|
-
} = props;
|
|
11
|
-
const video = useRef(null);
|
|
12
|
-
useImperativeHandle(ref, () => video.current, []);
|
|
13
|
-
useEffect(() => {
|
|
14
|
-
const {
|
|
15
|
-
current: player
|
|
16
|
-
} = video;
|
|
17
|
-
if (!player || !src) return;
|
|
18
|
-
if (player.canPlayType("application/vnd.apple.mpegurl")) {
|
|
19
|
-
player.src = src;
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
if (Hls.isSupported()) {
|
|
23
|
-
const hls = new Hls();
|
|
24
|
-
hls.loadSource(src);
|
|
25
|
-
hls.attachMedia(player);
|
|
26
|
-
return () => {
|
|
27
|
-
hls.destroy();
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
}, [src]);
|
|
31
|
-
return /*#__PURE__*/_jsx("video", {
|
|
32
|
-
ref: video,
|
|
33
|
-
...rest
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
//# sourceMappingURL=HlsPlayer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["forwardRef","useEffect","useImperativeHandle","useRef","Hls","jsx","_jsx","HlsPlayer","props","ref","src","rest","video","current","player","canPlayType","isSupported","hls","loadSource","attachMedia","destroy"],"sources":["../../../src/components/HlsPlayer.tsx"],"sourcesContent":["\"use client\"\n\nimport { MediaHTMLAttributes, forwardRef, useEffect, useImperativeHandle, useRef } from \"react\"\nimport Hls from \"hls.js\"\n\nexport interface HlsPlayerProps extends Omit<MediaHTMLAttributes<HTMLVideoElement>, \"src\"> {\n src: string\n}\n\nexport const HlsPlayer = forwardRef<HTMLVideoElement, HlsPlayerProps>((props, ref) => {\n const { src, ...rest } = props\n const video = useRef<HTMLVideoElement>(null)\n\n useImperativeHandle(ref, () => video.current!, [])\n\n useEffect(() => {\n const { current: player } = video\n if (!player || !src) return\n if (player.canPlayType(\"application/vnd.apple.mpegurl\")) {\n player.src = src\n return\n }\n if (Hls.isSupported()) {\n const hls = new Hls()\n hls.loadSource(src)\n hls.attachMedia(player)\n return () => {\n hls.destroy()\n }\n }\n }, [src])\n\n return <video ref={video} {...rest} />\n})\n"],"mappings":"AAAA,YAAY;;AAEZ,SAA8BA,UAAU,EAAEC,SAAS,EAAEC,mBAAmB,EAAEC,MAAM,QAAQ,OAAO;AAC/F,OAAOC,GAAG,MAAM,QAAQ;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAMxB,OAAO,MAAMC,SAAS,gBAAGP,UAAU,CAAmC,CAACQ,KAAK,EAAEC,GAAG,KAAK;EAClF,MAAM;IAAEC,GAAG;IAAE,GAAGC;EAAK,CAAC,GAAGH,KAAK;EAC9B,MAAMI,KAAK,GAAGT,MAAM,CAAmB,IAAI,CAAC;EAE5CD,mBAAmB,CAACO,GAAG,EAAE,MAAMG,KAAK,CAACC,OAAQ,EAAE,EAAE,CAAC;EAElDZ,SAAS,CAAC,MAAM;IACZ,MAAM;MAAEY,OAAO,EAAEC;IAAO,CAAC,GAAGF,KAAK;IACjC,IAAI,CAACE,MAAM,IAAI,CAACJ,GAAG,EAAE;IACrB,IAAII,MAAM,CAACC,WAAW,CAAC,+BAA+B,CAAC,EAAE;MACrDD,MAAM,CAACJ,GAAG,GAAGA,GAAG;MAChB;IACJ;IACA,IAAIN,GAAG,CAACY,WAAW,CAAC,CAAC,EAAE;MACnB,MAAMC,GAAG,GAAG,IAAIb,GAAG,CAAC,CAAC;MACrBa,GAAG,CAACC,UAAU,CAACR,GAAG,CAAC;MACnBO,GAAG,CAACE,WAAW,CAACL,MAAM,CAAC;MACvB,OAAO,MAAM;QACTG,GAAG,CAACG,OAAO,CAAC,CAAC;MACjB,CAAC;IACL;EACJ,CAAC,EAAE,CAACV,GAAG,CAAC,CAAC;EAET,oBAAOJ,IAAA;IAAOG,GAAG,EAAEG,KAAM;IAAA,GAAKD;EAAI,CAAG,CAAC;AAC1C,CAAC,CAAC"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { CSSProperties, ComponentPropsWithoutRef } from "react";
|
|
2
|
-
export type InfiniteScrollProps = ComponentPropsWithoutRef<"div"> & {
|
|
3
|
-
/**
|
|
4
|
-
* 滚动的方向
|
|
5
|
-
* @default "vertical"
|
|
6
|
-
*/
|
|
7
|
-
direction?: "vertical" | "horizontal";
|
|
8
|
-
/** 渲染 children 的容器的类名 */
|
|
9
|
-
containerClassName?: string;
|
|
10
|
-
/** 渲染 children 的容器的样式 */
|
|
11
|
-
containerStyle?: CSSProperties;
|
|
12
|
-
/**
|
|
13
|
-
* 两个 children 容器之间的间距
|
|
14
|
-
* @default 0
|
|
15
|
-
*/
|
|
16
|
-
gap?: number;
|
|
17
|
-
/** 一个周期的时间,单位:毫秒 */
|
|
18
|
-
duration: number;
|
|
19
|
-
/** 是否将 gap 的距离也加入 overflow 的计算 */
|
|
20
|
-
withGap?: boolean;
|
|
21
|
-
/** 尺寸刚好相同时,是否视为溢出 */
|
|
22
|
-
withEqual?: boolean;
|
|
23
|
-
/** 鼠标移入时,是否停止动画 */
|
|
24
|
-
pauseOnHover?: boolean;
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* 无限滚动的组件
|
|
28
|
-
* 子元素会内置的容器中被渲染两次,首尾相连,形成无限滚动的效果
|
|
29
|
-
* 但是,如果内部检测到并没有溢出,那么不会渲染两次,并且没有动画
|
|
30
|
-
*/
|
|
31
|
-
export declare const InfiniteScroll: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
32
|
-
/**
|
|
33
|
-
* 滚动的方向
|
|
34
|
-
* @default "vertical"
|
|
35
|
-
*/
|
|
36
|
-
direction?: "horizontal" | "vertical" | undefined;
|
|
37
|
-
/** 渲染 children 的容器的类名 */
|
|
38
|
-
containerClassName?: string | undefined;
|
|
39
|
-
/** 渲染 children 的容器的样式 */
|
|
40
|
-
containerStyle?: CSSProperties | undefined;
|
|
41
|
-
/**
|
|
42
|
-
* 两个 children 容器之间的间距
|
|
43
|
-
* @default 0
|
|
44
|
-
*/
|
|
45
|
-
gap?: number | undefined;
|
|
46
|
-
/** 一个周期的时间,单位:毫秒 */
|
|
47
|
-
duration: number;
|
|
48
|
-
/** 是否将 gap 的距离也加入 overflow 的计算 */
|
|
49
|
-
withGap?: boolean | undefined;
|
|
50
|
-
/** 尺寸刚好相同时,是否视为溢出 */
|
|
51
|
-
withEqual?: boolean | undefined;
|
|
52
|
-
/** 鼠标移入时,是否停止动画 */
|
|
53
|
-
pauseOnHover?: boolean | undefined;
|
|
54
|
-
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { forwardRef, useEffect, useImperativeHandle, useRef } from "react";
|
|
4
|
-
import { css } from "@emotion/css";
|
|
5
|
-
import { clsx } from "deepsea-tools";
|
|
6
|
-
import { useSize } from "soda-hooks";
|
|
7
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
-
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
-
/**
|
|
10
|
-
* 无限滚动的组件
|
|
11
|
-
* 子元素会内置的容器中被渲染两次,首尾相连,形成无限滚动的效果
|
|
12
|
-
* 但是,如果内部检测到并没有溢出,那么不会渲染两次,并且没有动画
|
|
13
|
-
*/
|
|
14
|
-
export const InfiniteScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
15
|
-
const {
|
|
16
|
-
className,
|
|
17
|
-
direction = "vertical",
|
|
18
|
-
children,
|
|
19
|
-
containerClassName,
|
|
20
|
-
containerStyle,
|
|
21
|
-
gap = 0,
|
|
22
|
-
duration,
|
|
23
|
-
withGap,
|
|
24
|
-
withEqual,
|
|
25
|
-
pauseOnHover,
|
|
26
|
-
onMouseEnter,
|
|
27
|
-
onMouseLeave,
|
|
28
|
-
...rest
|
|
29
|
-
} = props;
|
|
30
|
-
const wrapper = useRef(null);
|
|
31
|
-
const wrapperSize = useSize(wrapper);
|
|
32
|
-
const ele = useRef(null);
|
|
33
|
-
useImperativeHandle(ref, () => wrapper.current, [wrapper.current]);
|
|
34
|
-
const container = useRef(null);
|
|
35
|
-
const containerSize = useSize(container);
|
|
36
|
-
function bigger(containerSize, wrapperSize) {
|
|
37
|
-
return withEqual ? containerSize + (withGap ? gap : 0) >= wrapperSize : containerSize + (withGap ? gap : 0) > wrapperSize;
|
|
38
|
-
}
|
|
39
|
-
const overflow = wrapperSize && containerSize ? direction === "vertical" ? bigger(containerSize.height, wrapperSize.height) : bigger(containerSize.width, wrapperSize.width) : false;
|
|
40
|
-
const animation = useRef(undefined);
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
if (!wrapperSize || !containerSize || !overflow) return;
|
|
43
|
-
animation.current = ele.current?.animate({
|
|
44
|
-
transform: direction === "vertical" ? [`translateY(0)`, `translateY(-${containerSize.height + gap}px)`] : [`translateX(0)`, `translateX(-${containerSize.width + gap}px)`]
|
|
45
|
-
}, {
|
|
46
|
-
duration,
|
|
47
|
-
iterations: Infinity
|
|
48
|
-
});
|
|
49
|
-
return () => animation.current?.cancel();
|
|
50
|
-
}, [wrapperSize, containerSize, overflow, direction, duration]);
|
|
51
|
-
function enter(e) {
|
|
52
|
-
if (pauseOnHover) animation.current?.pause();
|
|
53
|
-
onMouseEnter?.(e);
|
|
54
|
-
}
|
|
55
|
-
function leave(e) {
|
|
56
|
-
if (pauseOnHover) animation.current?.play();
|
|
57
|
-
onMouseLeave?.(e);
|
|
58
|
-
}
|
|
59
|
-
useEffect(() => {
|
|
60
|
-
if (!pauseOnHover && animation.current?.playState === "paused") animation.current?.play();
|
|
61
|
-
}, [animation.current, pauseOnHover]);
|
|
62
|
-
return /*#__PURE__*/_jsx("div", {
|
|
63
|
-
ref: wrapper,
|
|
64
|
-
className: clsx(css`
|
|
65
|
-
position: relative;
|
|
66
|
-
${direction === "vertical" ? "overflow-y: hidden;" : "overflow-x: hidden;"}
|
|
67
|
-
`, className),
|
|
68
|
-
onMouseEnter: enter,
|
|
69
|
-
onMouseLeave: leave,
|
|
70
|
-
...rest,
|
|
71
|
-
children: /*#__PURE__*/_jsxs("div", {
|
|
72
|
-
ref: ele,
|
|
73
|
-
style: {
|
|
74
|
-
position: "absolute",
|
|
75
|
-
width: direction === "vertical" ? "100%" : containerSize && (overflow ? containerSize.width * 2 + gap : containerSize.width),
|
|
76
|
-
height: direction === "horizontal" ? "100%" : containerSize && (overflow ? containerSize.height * 2 + gap : containerSize.width)
|
|
77
|
-
},
|
|
78
|
-
children: [/*#__PURE__*/_jsx("div", {
|
|
79
|
-
ref: container,
|
|
80
|
-
className: clsx(css`
|
|
81
|
-
position: absolute;
|
|
82
|
-
left: 0;
|
|
83
|
-
top: 0;
|
|
84
|
-
${direction === "vertical" ? "width: 100%;" : "height: 100%;"}
|
|
85
|
-
`, containerClassName),
|
|
86
|
-
style: containerStyle,
|
|
87
|
-
children: children
|
|
88
|
-
}), overflow && /*#__PURE__*/_jsx("div", {
|
|
89
|
-
ref: container,
|
|
90
|
-
className: clsx(css`
|
|
91
|
-
position: absolute;
|
|
92
|
-
right: 0;
|
|
93
|
-
bottom: 0;
|
|
94
|
-
${direction === "vertical" ? "width: 100%;" : "height: 100%;"}
|
|
95
|
-
`, containerClassName),
|
|
96
|
-
style: containerStyle,
|
|
97
|
-
children: children
|
|
98
|
-
})]
|
|
99
|
-
})
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
//# sourceMappingURL=InfiniteScroll.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["forwardRef","useEffect","useImperativeHandle","useRef","css","clsx","useSize","jsx","_jsx","jsxs","_jsxs","InfiniteScroll","props","ref","className","direction","children","containerClassName","containerStyle","gap","duration","withGap","withEqual","pauseOnHover","onMouseEnter","onMouseLeave","rest","wrapper","wrapperSize","ele","current","container","containerSize","bigger","overflow","height","width","animation","undefined","animate","transform","iterations","Infinity","cancel","enter","e","pause","leave","play","playState","style","position"],"sources":["../../../src/components/InfiniteScroll.tsx"],"sourcesContent":["\"use client\"\n\nimport { CSSProperties, ComponentPropsWithoutRef, MouseEvent as ReactMouseEvent, forwardRef, useEffect, useImperativeHandle, useRef } from \"react\"\nimport { css } from \"@emotion/css\"\nimport { clsx } from \"deepsea-tools\"\nimport { useSize } from \"soda-hooks\"\n\nexport type InfiniteScrollProps = ComponentPropsWithoutRef<\"div\"> & {\n /**\n * 滚动的方向\n * @default \"vertical\"\n */\n direction?: \"vertical\" | \"horizontal\"\n /** 渲染 children 的容器的类名 */\n containerClassName?: string\n /** 渲染 children 的容器的样式 */\n containerStyle?: CSSProperties\n /**\n * 两个 children 容器之间的间距\n * @default 0\n */\n gap?: number\n /** 一个周期的时间,单位:毫秒 */\n duration: number\n /** 是否将 gap 的距离也加入 overflow 的计算 */\n withGap?: boolean\n /** 尺寸刚好相同时,是否视为溢出 */\n withEqual?: boolean\n /** 鼠标移入时,是否停止动画 */\n pauseOnHover?: boolean\n}\n\n/**\n * 无限滚动的组件\n * 子元素会内置的容器中被渲染两次,首尾相连,形成无限滚动的效果\n * 但是,如果内部检测到并没有溢出,那么不会渲染两次,并且没有动画\n */\nexport const InfiniteScroll = forwardRef<HTMLDivElement, InfiniteScrollProps>((props, ref) => {\n const {\n className,\n direction = \"vertical\",\n children,\n containerClassName,\n containerStyle,\n gap = 0,\n duration,\n withGap,\n withEqual,\n pauseOnHover,\n onMouseEnter,\n onMouseLeave,\n ...rest\n } = props\n\n const wrapper = useRef<HTMLDivElement>(null)\n const wrapperSize = useSize(wrapper)\n\n const ele = useRef<HTMLDivElement>(null)\n\n useImperativeHandle(ref, () => wrapper.current as HTMLDivElement, [wrapper.current])\n\n const container = useRef<HTMLDivElement>(null)\n const containerSize = useSize(container)\n\n function bigger(containerSize: number, wrapperSize: number) {\n return withEqual ? containerSize + (withGap ? gap : 0) >= wrapperSize : containerSize + (withGap ? gap : 0) > wrapperSize\n }\n\n const overflow =\n wrapperSize && containerSize\n ? direction === \"vertical\"\n ? bigger(containerSize.height, wrapperSize.height)\n : bigger(containerSize.width, wrapperSize.width)\n : false\n\n const animation = useRef<Animation | undefined>(undefined)\n\n useEffect(() => {\n if (!wrapperSize || !containerSize || !overflow) return\n animation.current = ele.current?.animate(\n {\n transform:\n direction === \"vertical\"\n ? [`translateY(0)`, `translateY(-${containerSize.height + gap}px)`]\n : [`translateX(0)`, `translateX(-${containerSize.width + gap}px)`],\n },\n { duration, iterations: Infinity },\n )\n return () => animation.current?.cancel()\n }, [wrapperSize, containerSize, overflow, direction, duration])\n\n function enter(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\n if (pauseOnHover) animation.current?.pause()\n onMouseEnter?.(e)\n }\n\n function leave(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\n if (pauseOnHover) animation.current?.play()\n onMouseLeave?.(e)\n }\n\n useEffect(() => {\n if (!pauseOnHover && animation.current?.playState === \"paused\") animation.current?.play()\n }, [animation.current, pauseOnHover])\n\n return (\n <div\n ref={wrapper}\n className={clsx(\n css`\n position: relative;\n ${direction === \"vertical\" ? \"overflow-y: hidden;\" : \"overflow-x: hidden;\"}\n `,\n className,\n )}\n onMouseEnter={enter}\n onMouseLeave={leave}\n {...rest}\n >\n <div\n ref={ele}\n style={{\n position: \"absolute\",\n width: direction === \"vertical\" ? \"100%\" : containerSize && (overflow ? containerSize.width * 2 + gap : containerSize.width),\n height: direction === \"horizontal\" ? \"100%\" : containerSize && (overflow ? containerSize.height * 2 + gap : containerSize.width),\n }}\n >\n <div\n ref={container}\n className={clsx(\n css`\n position: absolute;\n left: 0;\n top: 0;\n ${direction === \"vertical\" ? \"width: 100%;\" : \"height: 100%;\"}\n `,\n containerClassName,\n )}\n style={containerStyle}\n >\n {children}\n </div>\n {overflow && (\n <div\n ref={container}\n className={clsx(\n css`\n position: absolute;\n right: 0;\n bottom: 0;\n ${direction === \"vertical\" ? \"width: 100%;\" : \"height: 100%;\"}\n `,\n containerClassName,\n )}\n style={containerStyle}\n >\n {children}\n </div>\n )}\n </div>\n </div>\n )\n})\n"],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { ComponentProps, ReactNode } from "react";
|
|
2
|
-
export interface InputFileDataTypeMap {
|
|
3
|
-
base64: string;
|
|
4
|
-
text: string;
|
|
5
|
-
arrayBuffer: ArrayBuffer;
|
|
6
|
-
binary: string;
|
|
7
|
-
file: File;
|
|
8
|
-
}
|
|
9
|
-
export type InputFileDataType = keyof InputFileDataTypeMap;
|
|
10
|
-
export declare function getFileData<T extends InputFileDataType>(file: File, type: T): Promise<InputFileDataTypeMap[T]>;
|
|
11
|
-
export interface InputFileBaseProps extends Omit<ComponentProps<"input">, "multiple" | "type"> {
|
|
12
|
-
}
|
|
13
|
-
export type FileType<Multiple extends boolean> = Multiple extends true ? File[] : File;
|
|
14
|
-
export type ValueType<Multiple extends boolean, Type extends InputFileDataType> = Multiple extends true ? InputFileDataTypeMap[Type][] : InputFileDataTypeMap[Type];
|
|
15
|
-
export interface InputFileExtraProps<Multiple extends boolean = false, Type extends InputFileDataType = "file"> {
|
|
16
|
-
multiple?: Multiple;
|
|
17
|
-
type?: Type;
|
|
18
|
-
onValueChange?: (data: ValueType<Multiple, Type>) => void;
|
|
19
|
-
onFileChange?: (data: FileType<Multiple>) => void;
|
|
20
|
-
/** 是否在捕获文件后清除 input 上的文件,默认为 false,主要区别在于如果不清除,连续两次选择同样的文件不会触发 onChange 事件,如果用于 form 表单,请设置为 flase */
|
|
21
|
-
clearAfterChange?: boolean;
|
|
22
|
-
}
|
|
23
|
-
export interface InputFileProps<Multiple extends boolean = false, Type extends InputFileDataType = "file"> extends InputFileBaseProps, InputFileExtraProps<Multiple, Type> {
|
|
24
|
-
}
|
|
25
|
-
/** 专用于读取文件的组件 */
|
|
26
|
-
export declare function InputFile<Multiple extends boolean = false, Type extends InputFileDataType = "file">(props: InputFileProps<Multiple, Type>): ReactNode;
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useState } from "react";
|
|
4
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
|
-
export async function getFileData(file, type) {
|
|
6
|
-
const fileReader = new FileReader();
|
|
7
|
-
switch (type) {
|
|
8
|
-
case "arrayBuffer":
|
|
9
|
-
fileReader.readAsArrayBuffer(file);
|
|
10
|
-
break;
|
|
11
|
-
case "binary":
|
|
12
|
-
fileReader.readAsBinaryString(file);
|
|
13
|
-
break;
|
|
14
|
-
case "base64":
|
|
15
|
-
fileReader.readAsDataURL(file);
|
|
16
|
-
break;
|
|
17
|
-
case "text":
|
|
18
|
-
fileReader.readAsText(file);
|
|
19
|
-
break;
|
|
20
|
-
default:
|
|
21
|
-
return file;
|
|
22
|
-
}
|
|
23
|
-
return new Promise(resolve => {
|
|
24
|
-
fileReader.addEventListener("load", () => {
|
|
25
|
-
resolve(fileReader.result);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
/** 专用于读取文件的组件 */
|
|
30
|
-
export function InputFile(props) {
|
|
31
|
-
const {
|
|
32
|
-
multiple = false,
|
|
33
|
-
type = "file",
|
|
34
|
-
onChange: _onChange,
|
|
35
|
-
disabled: _disabled,
|
|
36
|
-
clearAfterChange,
|
|
37
|
-
onValueChange,
|
|
38
|
-
onFileChange,
|
|
39
|
-
...rest
|
|
40
|
-
} = props;
|
|
41
|
-
const [disabled, setDisabled] = useState(false);
|
|
42
|
-
async function onChange(e) {
|
|
43
|
-
_onChange?.(e);
|
|
44
|
-
const input = e.target;
|
|
45
|
-
const {
|
|
46
|
-
files
|
|
47
|
-
} = input;
|
|
48
|
-
if (!files || files.length === 0) return;
|
|
49
|
-
setDisabled(true);
|
|
50
|
-
try {
|
|
51
|
-
if (multiple) {
|
|
52
|
-
const files2 = Array.from(files);
|
|
53
|
-
const values = [];
|
|
54
|
-
for (const file of files2) {
|
|
55
|
-
const value = await getFileData(file, type);
|
|
56
|
-
values.push(value);
|
|
57
|
-
}
|
|
58
|
-
onFileChange?.(files2);
|
|
59
|
-
onValueChange?.(values);
|
|
60
|
-
} else {
|
|
61
|
-
const file = files[0];
|
|
62
|
-
onFileChange?.(file);
|
|
63
|
-
onValueChange?.(await getFileData(file, type));
|
|
64
|
-
}
|
|
65
|
-
} finally {
|
|
66
|
-
if (clearAfterChange) input.value = "";
|
|
67
|
-
setDisabled(false);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return /*#__PURE__*/_jsx("input", {
|
|
71
|
-
disabled: disabled || _disabled,
|
|
72
|
-
type: "file",
|
|
73
|
-
multiple: multiple,
|
|
74
|
-
onChange: onChange,
|
|
75
|
-
...rest
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=InputFile.js.map
|