deepsea-components 5.11.6 → 5.12.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 (219) hide show
  1. package/dist/components/AutoFit.cjs +116 -0
  2. package/dist/components/AutoFit.js +82 -0
  3. package/dist/components/AutoScroll.cjs +125 -0
  4. package/dist/components/AutoScroll.js +91 -0
  5. package/dist/components/AutoSizeTextarea.cjs +73 -0
  6. package/dist/components/AutoSizeTextarea.js +39 -0
  7. package/dist/components/CircleText.cjs +68 -0
  8. package/dist/components/CircleText.js +34 -0
  9. package/dist/components/CopyButton.cjs +73 -0
  10. package/dist/{cjs/components → components}/CopyButton.d.ts +3 -3
  11. package/dist/components/CopyButton.js +27 -0
  12. package/dist/components/Echart.cjs +74 -0
  13. package/dist/components/Echart.js +34 -0
  14. package/dist/components/Flow.cjs +211 -0
  15. package/dist/components/Flow.js +168 -0
  16. package/dist/components/FormLabel.cjs +77 -0
  17. package/dist/components/FormLabel.js +37 -0
  18. package/dist/components/HlsPlayer.cjs +76 -0
  19. package/dist/components/HlsPlayer.js +32 -0
  20. package/dist/components/InfiniteScroll.cjs +135 -0
  21. package/dist/{cjs/components → components}/InfiniteScroll.d.ts +7 -7
  22. package/dist/components/InfiniteScroll.js +101 -0
  23. package/dist/components/InputFile.cjs +102 -0
  24. package/dist/components/InputFile.js +65 -0
  25. package/dist/components/InputFileButton.cjs +109 -0
  26. package/dist/components/InputFileButton.js +75 -0
  27. package/dist/components/LoopSwiper.cjs +147 -0
  28. package/dist/components/LoopSwiper.js +113 -0
  29. package/dist/components/ReadExcel.cjs +48 -0
  30. package/dist/components/ReadExcel.js +14 -0
  31. package/dist/components/Ring.cjs +53 -0
  32. package/dist/components/Ring.js +19 -0
  33. package/dist/components/Scroll.cjs +143 -0
  34. package/dist/components/Scroll.js +54 -0
  35. package/dist/components/SectionRing.cjs +59 -0
  36. package/dist/components/SectionRing.js +25 -0
  37. package/dist/components/Skeleton.cjs +66 -0
  38. package/dist/components/Skeleton.js +32 -0
  39. package/dist/components/Title.cjs +61 -0
  40. package/dist/components/Title.js +27 -0
  41. package/dist/components/TransitionBox.cjs +79 -0
  42. package/dist/components/TransitionBox.js +45 -0
  43. package/dist/components/TransitionNum.cjs +83 -0
  44. package/dist/components/TransitionNum.js +49 -0
  45. package/dist/components/Trapezium.cjs +67 -0
  46. package/dist/components/Trapezium.js +33 -0
  47. package/dist/components/Unify.cjs +68 -0
  48. package/dist/components/Unify.js +31 -0
  49. package/dist/components/WriteExcel.cjs +50 -0
  50. package/dist/components/WriteExcel.js +16 -0
  51. package/dist/index.cjs +285 -0
  52. package/dist/index.js +26 -0
  53. package/dist/utils/getReactVersion.cjs +40 -0
  54. package/dist/utils/getReactVersion.js +6 -0
  55. package/dist/utils/index.cjs +57 -0
  56. package/dist/utils/index.js +17 -0
  57. package/package.json +26 -17
  58. package/src/components/WriteExcel.tsx +25 -25
  59. package/tsconfig.json +16 -0
  60. package/dist/cjs/components/AutoFit.js +0 -106
  61. package/dist/cjs/components/AutoFit.js.map +0 -7
  62. package/dist/cjs/components/AutoScroll.js +0 -127
  63. package/dist/cjs/components/AutoScroll.js.map +0 -7
  64. package/dist/cjs/components/AutoSizeTextarea.js +0 -70
  65. package/dist/cjs/components/AutoSizeTextarea.js.map +0 -7
  66. package/dist/cjs/components/CircleText.js +0 -77
  67. package/dist/cjs/components/CircleText.js.map +0 -7
  68. package/dist/cjs/components/CopyButton.js +0 -60
  69. package/dist/cjs/components/CopyButton.js.map +0 -7
  70. package/dist/cjs/components/Echart.js +0 -56
  71. package/dist/cjs/components/Echart.js.map +0 -7
  72. package/dist/cjs/components/Flow.js +0 -220
  73. package/dist/cjs/components/Flow.js.map +0 -7
  74. package/dist/cjs/components/FormLabel.js +0 -42
  75. package/dist/cjs/components/FormLabel.js.map +0 -7
  76. package/dist/cjs/components/HlsPlayer.js +0 -65
  77. package/dist/cjs/components/HlsPlayer.js.map +0 -7
  78. package/dist/cjs/components/InfiniteScroll.js +0 -148
  79. package/dist/cjs/components/InfiniteScroll.js.map +0 -7
  80. package/dist/cjs/components/InputFile.js +0 -90
  81. package/dist/cjs/components/InputFile.js.map +0 -7
  82. package/dist/cjs/components/InputFileButton.js +0 -113
  83. package/dist/cjs/components/InputFileButton.js.map +0 -7
  84. package/dist/cjs/components/LoopSwiper.js +0 -137
  85. package/dist/cjs/components/LoopSwiper.js.map +0 -7
  86. package/dist/cjs/components/ReadExcel.js +0 -36
  87. package/dist/cjs/components/ReadExcel.js.map +0 -7
  88. package/dist/cjs/components/Ring.js +0 -49
  89. package/dist/cjs/components/Ring.js.map +0 -7
  90. package/dist/cjs/components/Scroll.js +0 -103
  91. package/dist/cjs/components/Scroll.js.map +0 -7
  92. package/dist/cjs/components/SectionRing.js +0 -54
  93. package/dist/cjs/components/SectionRing.js.map +0 -7
  94. package/dist/cjs/components/Skeleton.js +0 -66
  95. package/dist/cjs/components/Skeleton.js.map +0 -7
  96. package/dist/cjs/components/Title.js +0 -48
  97. package/dist/cjs/components/Title.js.map +0 -7
  98. package/dist/cjs/components/TransitionBox.js +0 -53
  99. package/dist/cjs/components/TransitionBox.js.map +0 -7
  100. package/dist/cjs/components/TransitionNum.js +0 -62
  101. package/dist/cjs/components/TransitionNum.js.map +0 -7
  102. package/dist/cjs/components/Trapezium.js +0 -69
  103. package/dist/cjs/components/Trapezium.js.map +0 -7
  104. package/dist/cjs/components/Unify.js +0 -48
  105. package/dist/cjs/components/Unify.js.map +0 -7
  106. package/dist/cjs/components/WriteExcel.js +0 -45
  107. package/dist/cjs/components/WriteExcel.js.map +0 -7
  108. package/dist/cjs/index.js +0 -74
  109. package/dist/cjs/index.js.map +0 -7
  110. package/dist/cjs/utils/getReactVersion.js +0 -34
  111. package/dist/cjs/utils/getReactVersion.js.map +0 -7
  112. package/dist/cjs/utils/index.js +0 -52
  113. package/dist/cjs/utils/index.js.map +0 -7
  114. package/dist/esm/components/AutoFit.d.ts +0 -25
  115. package/dist/esm/components/AutoFit.js +0 -97
  116. package/dist/esm/components/AutoFit.js.map +0 -1
  117. package/dist/esm/components/AutoScroll.d.ts +0 -38
  118. package/dist/esm/components/AutoScroll.js +0 -102
  119. package/dist/esm/components/AutoScroll.js.map +0 -1
  120. package/dist/esm/components/AutoSizeTextarea.d.ts +0 -5
  121. package/dist/esm/components/AutoSizeTextarea.js +0 -48
  122. package/dist/esm/components/AutoSizeTextarea.js.map +0 -1
  123. package/dist/esm/components/CircleText.d.ts +0 -25
  124. package/dist/esm/components/CircleText.js +0 -49
  125. package/dist/esm/components/CircleText.js.map +0 -1
  126. package/dist/esm/components/CopyButton.d.ts +0 -13
  127. package/dist/esm/components/CopyButton.js +0 -31
  128. package/dist/esm/components/CopyButton.js.map +0 -1
  129. package/dist/esm/components/Echart.d.ts +0 -15
  130. package/dist/esm/components/Echart.js +0 -41
  131. package/dist/esm/components/Echart.js.map +0 -1
  132. package/dist/esm/components/Flow.d.ts +0 -86
  133. package/dist/esm/components/Flow.js +0 -186
  134. package/dist/esm/components/Flow.js.map +0 -1
  135. package/dist/esm/components/FormLabel.d.ts +0 -22
  136. package/dist/esm/components/FormLabel.js +0 -52
  137. package/dist/esm/components/FormLabel.js.map +0 -1
  138. package/dist/esm/components/HlsPlayer.d.ts +0 -5
  139. package/dist/esm/components/HlsPlayer.js +0 -36
  140. package/dist/esm/components/HlsPlayer.js.map +0 -1
  141. package/dist/esm/components/InfiniteScroll.d.ts +0 -54
  142. package/dist/esm/components/InfiniteScroll.js +0 -102
  143. package/dist/esm/components/InfiniteScroll.js.map +0 -1
  144. package/dist/esm/components/InputFile.d.ts +0 -26
  145. package/dist/esm/components/InputFile.js +0 -78
  146. package/dist/esm/components/InputFile.js.map +0 -1
  147. package/dist/esm/components/InputFileButton.d.ts +0 -11
  148. package/dist/esm/components/InputFileButton.js +0 -95
  149. package/dist/esm/components/InputFileButton.js.map +0 -1
  150. package/dist/esm/components/LoopSwiper.d.ts +0 -9
  151. package/dist/esm/components/LoopSwiper.js +0 -122
  152. package/dist/esm/components/LoopSwiper.js.map +0 -1
  153. package/dist/esm/components/ReadExcel.d.ts +0 -8
  154. package/dist/esm/components/ReadExcel.js +0 -19
  155. package/dist/esm/components/ReadExcel.js.map +0 -1
  156. package/dist/esm/components/Ring.d.ts +0 -7
  157. package/dist/esm/components/Ring.js +0 -26
  158. package/dist/esm/components/Ring.js.map +0 -1
  159. package/dist/esm/components/Scroll.d.ts +0 -24
  160. package/dist/esm/components/Scroll.js +0 -67
  161. package/dist/esm/components/Scroll.js.map +0 -1
  162. package/dist/esm/components/SectionRing.d.ts +0 -8
  163. package/dist/esm/components/SectionRing.js +0 -33
  164. package/dist/esm/components/SectionRing.js.map +0 -1
  165. package/dist/esm/components/Skeleton.d.ts +0 -5
  166. package/dist/esm/components/Skeleton.js +0 -38
  167. package/dist/esm/components/Skeleton.js.map +0 -1
  168. package/dist/esm/components/Title.d.ts +0 -3
  169. package/dist/esm/components/Title.js +0 -26
  170. package/dist/esm/components/Title.js.map +0 -1
  171. package/dist/esm/components/TransitionBox.d.ts +0 -10
  172. package/dist/esm/components/TransitionBox.js +0 -50
  173. package/dist/esm/components/TransitionBox.js.map +0 -1
  174. package/dist/esm/components/TransitionNum.d.ts +0 -16
  175. package/dist/esm/components/TransitionNum.js +0 -65
  176. package/dist/esm/components/TransitionNum.js.map +0 -1
  177. package/dist/esm/components/Trapezium.d.ts +0 -9
  178. package/dist/esm/components/Trapezium.js +0 -43
  179. package/dist/esm/components/Trapezium.js.map +0 -1
  180. package/dist/esm/components/Unify.d.ts +0 -13
  181. package/dist/esm/components/Unify.js +0 -47
  182. package/dist/esm/components/Unify.js.map +0 -1
  183. package/dist/esm/components/WriteExcel.d.ts +0 -8
  184. package/dist/esm/components/WriteExcel.js +0 -23
  185. package/dist/esm/components/WriteExcel.js.map +0 -1
  186. package/dist/esm/index.d.ts +0 -26
  187. package/dist/esm/index.js +0 -27
  188. package/dist/esm/index.js.map +0 -1
  189. package/dist/esm/utils/getReactVersion.d.ts +0 -1
  190. package/dist/esm/utils/getReactVersion.js +0 -6
  191. package/dist/esm/utils/getReactVersion.js.map +0 -1
  192. package/dist/esm/utils/index.d.ts +0 -9
  193. package/dist/esm/utils/index.js +0 -17
  194. package/dist/esm/utils/index.js.map +0 -1
  195. /package/dist/{cjs/components → components}/AutoFit.d.ts +0 -0
  196. /package/dist/{cjs/components → components}/AutoScroll.d.ts +0 -0
  197. /package/dist/{cjs/components → components}/AutoSizeTextarea.d.ts +0 -0
  198. /package/dist/{cjs/components → components}/CircleText.d.ts +0 -0
  199. /package/dist/{cjs/components → components}/Echart.d.ts +0 -0
  200. /package/dist/{cjs/components → components}/Flow.d.ts +0 -0
  201. /package/dist/{cjs/components → components}/FormLabel.d.ts +0 -0
  202. /package/dist/{cjs/components → components}/HlsPlayer.d.ts +0 -0
  203. /package/dist/{cjs/components → components}/InputFile.d.ts +0 -0
  204. /package/dist/{cjs/components → components}/InputFileButton.d.ts +0 -0
  205. /package/dist/{cjs/components → components}/LoopSwiper.d.ts +0 -0
  206. /package/dist/{cjs/components → components}/ReadExcel.d.ts +0 -0
  207. /package/dist/{cjs/components → components}/Ring.d.ts +0 -0
  208. /package/dist/{cjs/components → components}/Scroll.d.ts +0 -0
  209. /package/dist/{cjs/components → components}/SectionRing.d.ts +0 -0
  210. /package/dist/{cjs/components → components}/Skeleton.d.ts +0 -0
  211. /package/dist/{cjs/components → components}/Title.d.ts +0 -0
  212. /package/dist/{cjs/components → components}/TransitionBox.d.ts +0 -0
  213. /package/dist/{cjs/components → components}/TransitionNum.d.ts +0 -0
  214. /package/dist/{cjs/components → components}/Trapezium.d.ts +0 -0
  215. /package/dist/{cjs/components → components}/Unify.d.ts +0 -0
  216. /package/dist/{cjs/components → components}/WriteExcel.d.ts +0 -0
  217. /package/dist/{cjs/index.d.ts → index.d.ts} +0 -0
  218. /package/dist/{cjs/utils → utils}/getReactVersion.d.ts +0 -0
  219. /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\" }}>&ensp;</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