deepsea-components 2.3.3 → 2.5.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.
@@ -47,6 +47,13 @@ export declare const InputFile: import("react").ForwardRefExoticComponent<InputF
47
47
  export interface ImportExcelProps extends Omit<InputFileProps, "multiple" | "onChange" | "accept" | "type"> {
48
48
  onChange?: (data: Record<string, string>[]) => void;
49
49
  }
50
+ export type InputFileButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {
51
+ input: InputFileProps;
52
+ };
53
+ /** 专用于读取文件的 button 组件 */
54
+ export declare const InputFileButton: import("react").ForwardRefExoticComponent<ButtonHTMLAttributes<HTMLButtonElement> & {
55
+ input: InputFileProps;
56
+ } & import("react").RefAttributes<HTMLButtonElement>>;
50
57
  /** 专门用于读取 excel 的组件 */
51
58
  export declare const ImportExcel: import("react").ForwardRefExoticComponent<ImportExcelProps & import("react").RefAttributes<HTMLInputElement>>;
52
59
  /** 手动导出 excel */
@@ -180,35 +187,14 @@ export interface TrapeziumProps extends HTMLAttributes<HTMLDivElement> {
180
187
  }
181
188
  /** 梯形组件 */
182
189
  export declare const Trapezium: import("react").ForwardRefExoticComponent<TrapeziumProps & import("react").RefAttributes<HTMLDivElement>>;
183
- export interface LoopSwiperProps<T> {
184
- /** 源数据 */
185
- data: T[];
186
- /** 渲染函数 */
187
- render: (item: T, index: number, array: T[]) => ReactNode;
188
- /** 每个元素的key */
189
- keyExactor?: (item: T, index: number, array: T[]) => string;
190
- /** 水平方向是宽度,垂直方向是高度 */
191
- size: number;
192
- /** 元素之间间隔 */
193
- gap?: number;
194
- /** 起始位置 */
195
- start?: number;
196
- /** 速度,水平方向正数为向左,水平方向负数为向右,垂直方向正数为向上,水平方向负数为向下 */
197
- speed: number;
198
- /** 是否暂停播放 */
199
- paused?: boolean;
200
- /** 容器的类名 */
201
- className?: string;
202
- /** x 水平方向,y 垂直方向 */
203
- direction?: "x" | "y";
204
- }
205
- export interface LoopSwiperItem {
206
- key: string;
207
- dom: HTMLDivElement | null;
208
- offset: number;
190
+ export interface LoopSwiperProps extends HTMLAttributes<HTMLDivElement> {
191
+ direction?: "horizontal" | "vertical";
192
+ reverse?: boolean;
193
+ period: number;
194
+ gap?: CSSProperties["gap"];
209
195
  }
210
196
  /** 循环播放组件 */
211
- export declare function LoopSwiper<T>(props: LoopSwiperProps<T>): import("react/jsx-runtime").JSX.Element;
197
+ export declare const LoopSwiper: import("react").ForwardRefExoticComponent<LoopSwiperProps & import("react").RefAttributes<HTMLDivElement>>;
212
198
  export interface SectionRingProps extends HTMLAttributes<HTMLDivElement> {
213
199
  outerRadius: number;
214
200
  innerRadius: number;
package/dist/cjs/index.js CHANGED
@@ -35,6 +35,7 @@ __export(src_exports, {
35
35
  Flow: () => Flow,
36
36
  ImportExcel: () => ImportExcel,
37
37
  InputFile: () => InputFile,
38
+ InputFileButton: () => InputFileButton,
38
39
  LoopSwiper: () => LoopSwiper,
39
40
  Ring: () => Ring,
40
41
  Scroll: () => Scroll,
@@ -96,9 +97,9 @@ var InputFile = (0, import_react.forwardRef)((props, ref) => {
96
97
  file
97
98
  });
98
99
  }
99
- onChange == null ? void 0 : onChange(result);
100
+ onChange?.(result);
100
101
  } else {
101
- onChange == null ? void 0 : onChange({
102
+ onChange?.({
102
103
  result: await getFileData(files[0], type),
103
104
  file: files[0]
104
105
  });
@@ -115,6 +116,16 @@ var InputFile = (0, import_react.forwardRef)((props, ref) => {
115
116
  }
116
117
  return /* @__PURE__ */ React.createElement("input", { disabled: disabled && inputDisabled, ref, type: "file", multiple, onChange: onInputChange, ...others });
117
118
  });
119
+ var InputFileButton = (0, import_react.forwardRef)((props, ref) => {
120
+ const { onClick, children, input: inputProps, ...others } = props;
121
+ const { style, ...otherInputProps } = inputProps;
122
+ const input = (0, import_react.useRef)(null);
123
+ function onBtnClick(e) {
124
+ input.current?.click();
125
+ onClick?.(e);
126
+ }
127
+ return /* @__PURE__ */ React.createElement("button", { ref, type: "button", onClick: onBtnClick, ...others }, /* @__PURE__ */ React.createElement(InputFile, { ref: input, style: { display: "none", ...style }, ...otherInputProps }), children);
128
+ });
118
129
  var ImportExcel = (0, import_react.forwardRef)((props, ref) => {
119
130
  const { onChange, ...others } = props;
120
131
  function onInputChange(data) {
@@ -126,7 +137,7 @@ var ImportExcel = (0, import_react.forwardRef)((props, ref) => {
126
137
  Object.keys(it).filter((key) => key !== "__rowNum__").forEach((key) => _[key] = String(it[key]));
127
138
  return _;
128
139
  });
129
- onChange == null ? void 0 : onChange($);
140
+ onChange?.($);
130
141
  }
131
142
  }
132
143
  return /* @__PURE__ */ React.createElement(InputFile, { ref, accept: ".xlsx", type: "arrayBuffer", onChange: onInputChange, ...others });
@@ -141,7 +152,7 @@ var ExportExcel = (0, import_react.forwardRef)((props, ref) => {
141
152
  const { data, fileName, onClick, ...others } = props;
142
153
  function onButtonClick(e) {
143
154
  exportExcel(data, fileName);
144
- onClick == null ? void 0 : onClick(e);
155
+ onClick?.(e);
145
156
  }
146
157
  return /* @__PURE__ */ React.createElement("button", { ref, onClick: onButtonClick, ...others });
147
158
  });
@@ -171,7 +182,7 @@ var TransitionBox = (props) => {
171
182
  var SeaRadar = (props) => {
172
183
  const { unitRadius = 50, circleCount = 4, circleWidth = 1, circleColor, directionCount = 36, directionWidth = 1, directionColor, backgroundColor, scanColor, scanAngle = Math.PI / 6, period = 8, targets, showGraduationLine, showGraduationText, showCircle, showDirection } = props;
173
184
  const style = { "--unit-radius": `${unitRadius}px`, "--circle-count": circleCount, "--circle-width": `${circleWidth}px`, "--circle-color": circleColor, "--direction-count": directionCount, "--direction-width": `${directionWidth}px`, "--direction-color": directionColor, "--background-color": backgroundColor, "--scan-color": scanColor, "--period": `${period}s` };
174
- return /* @__PURE__ */ React.createElement("div", { className: "sea-radar-wrapper", style }, Array(180).fill(0).map((_, index) => /* @__PURE__ */ React.createElement("div", { className: "sea-radar-little-graduation", style: { transform: `rotateZ(${2 * index}deg)`, display: showGraduationLine ? "block" : "none" } })), Array(36).fill(0).map((_, index) => /* @__PURE__ */ React.createElement("div", { className: "sea-radar-graduation", style: { transform: `rotateZ(${10 * index}deg)`, display: showGraduationLine ? "block" : "none" } }, /* @__PURE__ */ React.createElement("span", { className: "sea-radar-graduation-text", style: { display: showGraduationText ? "block" : "none" } }, String(index * 10).padStart(3, "0")))), /* @__PURE__ */ React.createElement("div", { className: "sea-radar" }, /* @__PURE__ */ React.createElement("div", { className: "sea-radar-scan", style: { height: `${unitRadius * circleCount * Math.tan(scanAngle)}px`, clipPath: `polygon(0 0, 0 100%, 100% 100%)` } }), showCircle && Array(circleCount).fill(0).map((_, index) => /* @__PURE__ */ React.createElement("div", { className: "sea-radar-circle", style: { width: `${unitRadius * 2 * (index + 1)}px`, height: `${unitRadius * 2 * (index + 1)}px` } })), showDirection && Array(directionCount).fill(0).map((_, index) => /* @__PURE__ */ React.createElement("div", { className: "sea-radar-direction", style: { transform: `rotateZ(${360 / directionCount * index}deg)` } })), targets == null ? void 0 : targets.map((it) => /* @__PURE__ */ React.createElement("div", { className: "sea-radar-target", style: { left: `${unitRadius * circleCount + it.radius * Math.cos(it.angle)}px`, bottom: `${unitRadius * circleCount + it.radius * Math.sin(it.angle)}px` } }, it.element))));
185
+ return /* @__PURE__ */ React.createElement("div", { className: "sea-radar-wrapper", style }, Array(180).fill(0).map((_, index) => /* @__PURE__ */ React.createElement("div", { className: "sea-radar-little-graduation", style: { transform: `rotateZ(${2 * index}deg)`, display: showGraduationLine ? "block" : "none" } })), Array(36).fill(0).map((_, index) => /* @__PURE__ */ React.createElement("div", { className: "sea-radar-graduation", style: { transform: `rotateZ(${10 * index}deg)`, display: showGraduationLine ? "block" : "none" } }, /* @__PURE__ */ React.createElement("span", { className: "sea-radar-graduation-text", style: { display: showGraduationText ? "block" : "none" } }, String(index * 10).padStart(3, "0")))), /* @__PURE__ */ React.createElement("div", { className: "sea-radar" }, /* @__PURE__ */ React.createElement("div", { className: "sea-radar-scan", style: { height: `${unitRadius * circleCount * Math.tan(scanAngle)}px`, clipPath: `polygon(0 0, 0 100%, 100% 100%)` } }), showCircle && Array(circleCount).fill(0).map((_, index) => /* @__PURE__ */ React.createElement("div", { className: "sea-radar-circle", style: { width: `${unitRadius * 2 * (index + 1)}px`, height: `${unitRadius * 2 * (index + 1)}px` } })), showDirection && Array(directionCount).fill(0).map((_, index) => /* @__PURE__ */ React.createElement("div", { className: "sea-radar-direction", style: { transform: `rotateZ(${360 / directionCount * index}deg)` } })), targets?.map((it) => /* @__PURE__ */ React.createElement("div", { className: "sea-radar-target", style: { left: `${unitRadius * circleCount + it.radius * Math.cos(it.angle)}px`, bottom: `${unitRadius * circleCount + it.radius * Math.sin(it.angle)}px` } }, it.element))));
175
186
  };
176
187
  var Ring = (props) => {
177
188
  const { outerWidth, innerWidth, style, ...leftProps } = props;
@@ -245,12 +256,12 @@ function Flow(props) {
245
256
  };
246
257
  }, [itemWidth, throttle, columnGap]);
247
258
  (0, import_react.useEffect)(() => {
248
- onSizeChange == null ? void 0 : onSizeChange({ width, height, itemWidth, itemHeight, columnGap: columnGapSize, columnCount, rowGap, rowCount: contentShownRows, overflow: data.length > contentShownRows * columnCount, itemCount: data.length, maxRows: maxRows ?? null });
259
+ onSizeChange?.({ width, height, itemWidth, itemHeight, columnGap: columnGapSize, columnCount, rowGap, rowCount: contentShownRows, overflow: data.length > contentShownRows * columnCount, itemCount: data.length, maxRows: maxRows ?? null });
249
260
  }, [width, height, columnGapSize, columnCount, rowGap, contentShownRows, data.length, itemWidth, itemHeight, maxRows]);
250
261
  return /* @__PURE__ */ React.createElement("div", { ref: ele, className, style: { position: "relative", boxSizing: "border-box", height, ...style }, ...others }, showItems && data.map((it, idx) => /* @__PURE__ */ React.createElement(
251
262
  "div",
252
263
  {
253
- key: (keyExactor == null ? void 0 : keyExactor(it, idx)) || idx,
264
+ key: keyExactor?.(it, idx) || idx,
254
265
  className: containerClassName,
255
266
  style: {
256
267
  position: "absolute",
@@ -276,69 +287,77 @@ var Trapezium = (0, import_react.forwardRef)((props, ref) => {
276
287
  const h = f * Math.sin(a * 2);
277
288
  return /* @__PURE__ */ React.createElement("div", { ref, style: { width: bottom, height, clipPath: `path("M ${diff + f} ${0} A ${borderRadius} ${borderRadius} 0 0 0 ${diff - g} ${h} L ${c} ${height - d} A ${borderRadius} ${borderRadius} 0 0 0 ${b} ${height} L ${bottom - b} ${height} A ${borderRadius} ${borderRadius} 0 0 0 ${bottom - c} ${height - d} L ${top + diff + g} ${h} A ${borderRadius} ${borderRadius} 0 0 0 ${top + diff - f} ${0} Z")`, ...style }, ...other });
278
289
  });
279
- function LoopSwiper(props) {
280
- const { data, render, keyExactor, size, gap = 0, start = 0, speed, paused = false, className = "", direction = "x" } = props;
281
- if (!(size > 0 && (speed > 0 || speed < 0))) {
282
- throw new RangeError("size 必须是正数,speed 必须非0");
283
- }
284
- const keys = data.map((it, idx, arr) => keyExactor ? keyExactor(it, idx, arr) : String(idx));
285
- const keysRef = (0, import_react.useRef)(keys);
286
- const cache = (0, import_react.useRef)({ size, gap, speed, keys, paused, className, direction });
287
- cache.current = { size, gap, speed, keys, paused, className, direction };
288
- const eles = (0, import_react.useRef)(keys.map((key, idx) => ({ key, dom: null, offset: idx * (size + gap) + start })));
289
- if (keysRef.current.length !== keys.length || keysRef.current.some((it, idx) => it !== keys[idx])) {
290
- keysRef.current = keys;
291
- eles.current = keys.map((key, idx) => ({ key, dom: null, offset: idx * (size + gap) + start }));
292
- }
293
- function setStyles() {
294
- const { size: size2, speed: speed2, className: className2, direction: direction2 } = cache.current;
295
- eles.current.forEach((it) => {
296
- it.dom.className = className2;
297
- it.dom.style.setProperty("position", `absolute`);
298
- it.dom.style.setProperty("width", `${size2}px`);
299
- direction2 === "x" && speed2 < 0 ? it.dom.style.setProperty("right", `0`) : it.dom.style.setProperty("left", `0`);
300
- direction2 === "y" && speed2 < 0 ? it.dom.style.setProperty("bottom", `0`) : it.dom.style.setProperty("top", `0`);
301
- it.dom.style.setProperty("transform", `translate${direction2.toUpperCase()}(${it.offset * (speed2 > 0 ? 1 : -1)}px)`);
302
- });
303
- }
304
- (0, import_react.useEffect)(() => {
305
- setStyles();
306
- }, []);
307
- (0, import_react.useEffect)(() => {
308
- const stop = (0, import_deepsea_tools.setFrameInterval)(() => {
309
- const { size: size2, gap: gap2, speed: speed2, keys: keys2, paused: paused2 } = cache.current;
310
- if (paused2)
311
- return;
312
- eles.current.length = keys2.length;
313
- let minIndex = 0;
314
- eles.current.forEach((it, idx) => {
315
- if (it.offset < eles.current[minIndex].offset) {
316
- minIndex = idx;
290
+ import_css.css`
291
+ @keyframes deepsea-horizontal-loop-swipe {
292
+ from {
293
+ transform: translateX(0);
317
294
  }
318
- });
319
- const minOffset = eles.current[minIndex].offset;
320
- eles.current.forEach((it, idx) => {
321
- let index = idx;
322
- if (idx < minIndex)
323
- index = eles.current.length + idx;
324
- it.offset = minOffset + (index - minIndex) * (size2 + gap2);
325
- let newOffset = it.offset - Math.abs(speed2);
326
- if (newOffset + size2 + gap2 <= 0) {
327
- newOffset += eles.current.length * (size2 + gap2);
295
+ to {
296
+ transform: translateX(-100%);
297
+ }
298
+ }
299
+ @keyframes deepsea-reverse-horizontal-loop-swipe {
300
+ from {
301
+ transform: translateX(0);
302
+ }
303
+ to {
304
+ transform: translateX(100%);
305
+ }
306
+ }
307
+ @keyframes deepsea-vertical-loop-swipe {
308
+ from {
309
+ transform: translateY(0);
310
+ }
311
+ to {
312
+ transform: translateY(-100%);
313
+ }
314
+ }
315
+ @keyframes deepsea-reverse-vertical-loop-swipe {
316
+ from {
317
+ transform: translateY(0);
318
+ }
319
+ to {
320
+ transform: translateY(100%);
321
+ }
322
+ }
323
+ `;
324
+ var LoopSwiper = (0, import_react.forwardRef)((props, ref) => {
325
+ const { style, children, direction, period, reverse, gap, ...others } = props;
326
+ const wrapper = (0, import_react.useRef)(null);
327
+ const container = (0, import_react.useRef)(null);
328
+ const [swiper, setSwiper] = (0, import_react.useState)(false);
329
+ const directionRef = (0, import_react.useRef)(direction);
330
+ directionRef.current = direction;
331
+ const flexDirection = direction === "vertical" ? reverse ? "column-reverse" : "column" : reverse ? "row-reverse" : "row";
332
+ const animationName = swiper ? direction === "vertical" ? reverse ? "deepsea-reverse-vertical-loop-swipe" : "deepsea-vertical-loop-swipe" : reverse ? "deepsea-reverse-horizontal-loop-swipe" : "deepsea-horizontal-loop-swipe" : "none";
333
+ const animationDuration = `${period}ms`;
334
+ const animationTimingFunction = "linear";
335
+ const animationIterationCount = "infinite";
336
+ (0, import_react.useImperativeHandle)(ref, () => wrapper.current);
337
+ (0, import_react.useEffect)(() => {
338
+ const wrapperEle = wrapper.current;
339
+ const containerEle = container.current;
340
+ let wrapperWidth = 0;
341
+ let wrapperHeight = 0;
342
+ let containerWidth = 0;
343
+ let containerHeight = 0;
344
+ const observer = new ResizeObserver((entries) => {
345
+ entries.forEach((entry) => {
346
+ if (entry.target === wrapperEle) {
347
+ wrapperWidth = entry.contentRect.width;
348
+ wrapperHeight = entry.contentRect.height;
349
+ } else if (entry.target === containerEle) {
350
+ containerWidth = entry.contentRect.width;
351
+ containerHeight = entry.contentRect.height;
328
352
  }
329
- it.offset = newOffset;
330
353
  });
331
- setStyles();
332
- }, 1);
333
- return stop;
354
+ setSwiper(directionRef.current === "vertical" ? containerHeight > wrapperHeight : containerWidth > wrapperWidth);
355
+ });
356
+ observer.observe(wrapperEle);
357
+ observer.observe(containerEle);
334
358
  }, []);
335
- function ref(dom, index) {
336
- if (!eles.current[index])
337
- return;
338
- eles.current[index].dom = dom;
339
- }
340
- return /* @__PURE__ */ React.createElement(import_react.Fragment, null, data.map((it, idx, arr) => /* @__PURE__ */ React.createElement("div", { key: keys[idx], ref: (dom) => ref(dom, idx) }, render(it, idx, arr))));
341
- }
359
+ return /* @__PURE__ */ React.createElement("div", { ref: wrapper, style: { display: "flex", flexDirection, gap, ...style }, ...others }, /* @__PURE__ */ React.createElement("div", { ref: container, style: { display: "flex", flexDirection, gap, animationName, animationTimingFunction, animationDuration, animationIterationCount } }, children), /* @__PURE__ */ React.createElement("div", { style: { display: swiper ? "flex" : "none", flexDirection, gap, animationName, animationTimingFunction, animationDuration, animationIterationCount } }, children));
360
+ });
342
361
  var SectionRing = (props) => {
343
362
  const { outerRadius: o, innerRadius: i, count: c, angel: a, style, ...others } = props;
344
363
  const s = Math.PI * 2 / c - a;
@@ -465,6 +484,7 @@ var AutoSizeTextArea = (0, import_react.forwardRef)((props, ref) => {
465
484
  Flow,
466
485
  ImportExcel,
467
486
  InputFile,
487
+ InputFileButton,
468
488
  LoopSwiper,
469
489
  Ring,
470
490
  Scroll,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.tsx"],
4
- "sourcesContent": ["import { css } from \"@emotion/css\"\r\nimport { DrawArcOptions, clsx, drawArc, setFrameInterval } from \"deepsea-tools\"\r\nimport { ButtonHTMLAttributes, CSSProperties, ChangeEvent, FC, Fragment, HTMLAttributes, InputHTMLAttributes, MouseEvent as ReactMouseEvent, ReactNode, TextareaHTMLAttributes, forwardRef, useEffect, useImperativeHandle, useRef, useState } from \"react\"\r\nimport SmoothScrollBar from \"smooth-scrollbar\"\r\nimport type { ScrollbarOptions } from \"smooth-scrollbar/interfaces\"\r\nimport { read, utils, writeFile } from \"xlsx\"\r\n\r\nexport type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false\r\n\r\nexport interface InputFileDataTypes {\r\n base64: string\r\n text: string\r\n arrayBuffer: ArrayBuffer\r\n binary: string\r\n file: File\r\n}\r\n\r\nexport type InputFileDataType = keyof InputFileDataTypes\r\n\r\nexport interface InputFileData<T> {\r\n result: T\r\n file: File\r\n}\r\n\r\nexport type InputFileProps = (\r\n | {\r\n multiple?: false\r\n type: \"base64\" | \"text\" | \"binary\"\r\n onChange?: (data: InputFileData<string>) => void\r\n }\r\n | {\r\n multiple?: false\r\n type: \"arrayBuffer\"\r\n onChange?: (data: InputFileData<ArrayBuffer>) => void\r\n }\r\n | {\r\n multiple?: false\r\n type?: \"file\"\r\n onChange?: (data: InputFileData<File>) => void\r\n }\r\n | {\r\n multiple: true\r\n type: \"base64\" | \"text\" | \"binary\"\r\n onChange?: (data: InputFileData<string>[]) => void\r\n }\r\n | {\r\n multiple: true\r\n type: \"arrayBuffer\"\r\n onChange?: (data: InputFileData<ArrayBuffer>[]) => void\r\n }\r\n | {\r\n multiple: true\r\n type?: \"file\"\r\n onChange?: (data: InputFileData<File>[]) => void\r\n }\r\n) &\r\n Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"multiple\" | \"type\"> & {\r\n /** 是否在捕获文件后清除 input 上的文件,默认为 false,主要区别在于如果不清除,连续两次选择同样的文件不会触发 onChange 事件,如果用于 form 表单,请设置为 flase */\r\n clearAfterChange?: boolean\r\n }\r\n\r\nexport async function getFileData<T extends InputFileDataType>(file: File, type: T): Promise<InputFileDataTypes[T]> {\r\n const fileReader = new FileReader()\r\n switch (type) {\r\n case \"arrayBuffer\":\r\n fileReader.readAsArrayBuffer(file)\r\n break\r\n case \"binary\":\r\n fileReader.readAsBinaryString(file)\r\n break\r\n case \"base64\":\r\n fileReader.readAsDataURL(file)\r\n break\r\n case \"text\":\r\n fileReader.readAsText(file)\r\n break\r\n default:\r\n return file as any\r\n }\r\n return new Promise(resolve => {\r\n fileReader.addEventListener(\"load\", () => {\r\n resolve(fileReader.result as any)\r\n })\r\n })\r\n}\r\n\r\n/** 专用于读取文件的组件 */\r\nexport const InputFile = forwardRef<HTMLInputElement, InputFileProps>((props, ref) => {\r\n const { multiple = false, type = \"file\", onChange, disabled: inputDisabled, clearAfterChange, ...others } = props\r\n const [disabled, setDisabled] = useState(false)\r\n\r\n async function onInputChange(e: ChangeEvent<HTMLInputElement>) {\r\n const input = e.target\r\n const { files } = input\r\n if (!files || files.length === 0) return\r\n setDisabled(true)\r\n try {\r\n if (multiple) {\r\n const result: any[] = []\r\n for (const file of Array.from(files)) {\r\n result.push({\r\n result: await getFileData(file, type),\r\n file\r\n })\r\n }\r\n onChange?.(result as any)\r\n } else {\r\n onChange?.({\r\n result: await getFileData(files[0], type),\r\n file: files[0]\r\n } as any)\r\n }\r\n setDisabled(false)\r\n if (clearAfterChange) input.value = \"\"\r\n } catch (error) {\r\n setDisabled(false)\r\n if (clearAfterChange) input.value = \"\"\r\n throw error\r\n }\r\n }\r\n\r\n return <input disabled={disabled && inputDisabled} ref={ref} type=\"file\" multiple={multiple} onChange={onInputChange} {...others} />\r\n})\r\n\r\nexport interface ImportExcelProps extends Omit<InputFileProps, \"multiple\" | \"onChange\" | \"accept\" | \"type\"> {\r\n onChange?: (data: Record<string, string>[]) => void\r\n}\r\n\r\n/** 专门用于读取 excel 的组件 */\r\nexport const ImportExcel = forwardRef<HTMLInputElement, ImportExcelProps>((props, ref) => {\r\n const { onChange, ...others } = props\r\n\r\n function onInputChange(data: InputFileData<ArrayBuffer>) {\r\n const wb = read(data.result)\r\n const result = utils.sheet_to_json<any>(wb.Sheets[wb.SheetNames[0]])\r\n if (typeof result === \"object\") {\r\n const $ = result.map(it => {\r\n const _: Record<string, string> = {}\r\n Object.keys(it)\r\n .filter(key => key !== \"__rowNum__\")\r\n .forEach(key => (_[key] = String(it[key])))\r\n return _\r\n })\r\n onChange?.($)\r\n }\r\n }\r\n\r\n return <InputFile ref={ref} accept=\".xlsx\" type=\"arrayBuffer\" onChange={onInputChange} {...others} />\r\n})\r\n\r\n/** 手动导出 excel */\r\nexport function exportExcel(data: Record<string, string>[], name: string) {\r\n const workSheet = utils.json_to_sheet(data)\r\n const workBook = utils.book_new()\r\n utils.book_append_sheet(workBook, workSheet)\r\n writeFile(workBook, `${name}${name.endsWith(\".xlsx\") ? \"\" : \".xlsx\"}`)\r\n}\r\n\r\nexport interface ExportExcelProps extends ButtonHTMLAttributes<HTMLButtonElement> {\r\n data: Record<string, string>[]\r\n fileName: string\r\n}\r\n\r\n/** 导出 excel 的 button 组件 */\r\nexport const ExportExcel = forwardRef<HTMLButtonElement, ExportExcelProps>((props, ref) => {\r\n const { data, fileName, onClick, ...others } = props\r\n\r\n function onButtonClick(e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) {\r\n exportExcel(data, fileName)\r\n onClick?.(e)\r\n }\r\n\r\n return <button ref={ref} onClick={onButtonClick} {...others} />\r\n})\r\n\r\nexport interface TransitionBoxProps extends HTMLAttributes<HTMLDivElement> {\r\n containerClassName?: string\r\n containerStyle?: CSSProperties\r\n vertical?: boolean\r\n horizontal?: boolean\r\n time?: number\r\n}\r\n\r\n/** 尺寸渐变的组件 */\r\nexport const TransitionBox: FC<TransitionBoxProps> = props => {\r\n const { style, containerClassName, containerStyle, children, vertical = true, horizontal = true, time = 3000, ...others } = props\r\n const box = useRef<HTMLDivElement>(null)\r\n const [width, setWidth] = useState(0)\r\n const [height, setHeight] = useState(0)\r\n const [count, setCount] = useState(0)\r\n\r\n useEffect(() => {\r\n const observer = new ResizeObserver(entries => {\r\n const { width: currentWidth, height: currentHeight } = entries[0].contentRect\r\n setWidth(currentWidth)\r\n setHeight(currentHeight)\r\n })\r\n\r\n observer.observe(box.current!)\r\n\r\n return () => {\r\n observer.disconnect()\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n setCount(count => Math.min(count + 1, 3))\r\n }, [width, height])\r\n\r\n const outerStyle: CSSProperties = { transitionProperty: count === 3 ? [horizontal && \"width\", vertical && \"height\"].filter(Boolean).join(\", \") : undefined, transitionDuration: count === 3 ? `${time}ms` : undefined, width, height, overflow: \"hidden\", position: \"relative\", ...style }\r\n\r\n return (\r\n <div style={outerStyle} {...others}>\r\n <div className={containerClassName} style={{ position: \"absolute\", ...containerStyle }} ref={box}>\r\n {children}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport interface SeaRadarTarget {\r\n /** 半径 */\r\n radius: number\r\n /** 弧度 */\r\n angle: number\r\n /** 元素 */\r\n element: ReactNode\r\n}\r\n\r\nexport interface SeaRadarProps {\r\n /** 最小圆的半径 */\r\n unitRadius?: number\r\n /** 一共的全数 */\r\n circleCount?: number\r\n /** 角度分成多少份 */\r\n directionCount?: number\r\n /** 圈的宽度 */\r\n circleWidth?: number\r\n /** 圈的颜色 */\r\n circleColor: string\r\n /** 角度的宽度 */\r\n directionWidth?: number\r\n /** 角度颜色 */\r\n directionColor: string\r\n /** 背景色 */\r\n backgroundColor: string\r\n /** 扫描的颜色 */\r\n scanColor: string\r\n /** 扫描的弧度 */\r\n scanAngle?: number\r\n /** 扫描一周的时间,单位秒 */\r\n period?: number\r\n /** 目标列表 */\r\n targets?: SeaRadarTarget[]\r\n /** 展示圈 */\r\n showCircle?: boolean\r\n /** 展示方位 */\r\n showDirection?: boolean\r\n /** 展示刻度线 */\r\n showGraduationLine?: boolean\r\n /** 展示刻度文字 */\r\n showGraduationText?: boolean\r\n}\r\n\r\n/** 雷达组件 */\r\nexport const SeaRadar: FC<SeaRadarProps> = props => {\r\n const { unitRadius = 50, circleCount = 4, circleWidth = 1, circleColor, directionCount = 36, directionWidth = 1, directionColor, backgroundColor, scanColor, scanAngle = Math.PI / 6, period = 8, targets, showGraduationLine, showGraduationText, showCircle, showDirection } = props\r\n const style = { \"--unit-radius\": `${unitRadius}px`, \"--circle-count\": circleCount, \"--circle-width\": `${circleWidth}px`, \"--circle-color\": circleColor, \"--direction-count\": directionCount, \"--direction-width\": `${directionWidth}px`, \"--direction-color\": directionColor, \"--background-color\": backgroundColor, \"--scan-color\": scanColor, \"--period\": `${period}s` } as CSSProperties\r\n return (\r\n <div className=\"sea-radar-wrapper\" style={style}>\r\n {Array(180)\r\n .fill(0)\r\n .map((_, index) => (\r\n <div className=\"sea-radar-little-graduation\" style={{ transform: `rotateZ(${2 * index}deg)`, display: showGraduationLine ? \"block\" : \"none\" }}></div>\r\n ))}\r\n {Array(36)\r\n .fill(0)\r\n .map((_, index) => (\r\n <div className=\"sea-radar-graduation\" style={{ transform: `rotateZ(${10 * index}deg)`, display: showGraduationLine ? \"block\" : \"none\" }}>\r\n <span className=\"sea-radar-graduation-text\" style={{ display: showGraduationText ? \"block\" : \"none\" }}>\r\n {String(index * 10).padStart(3, \"0\")}\r\n </span>\r\n </div>\r\n ))}\r\n <div className=\"sea-radar\">\r\n <div className=\"sea-radar-scan\" style={{ height: `${unitRadius * circleCount * Math.tan(scanAngle)}px`, clipPath: `polygon(0 0, 0 100%, 100% 100%)` }}></div>\r\n {showCircle &&\r\n Array(circleCount)\r\n .fill(0)\r\n .map((_, index) => <div className=\"sea-radar-circle\" style={{ width: `${unitRadius * 2 * (index + 1)}px`, height: `${unitRadius * 2 * (index + 1)}px` }}></div>)}\r\n {showDirection &&\r\n Array(directionCount)\r\n .fill(0)\r\n .map((_, index) => <div className=\"sea-radar-direction\" style={{ transform: `rotateZ(${(360 / directionCount) * index}deg)` }}></div>)}\r\n {targets?.map(it => (\r\n <div className=\"sea-radar-target\" style={{ left: `${unitRadius * circleCount + it.radius * Math.cos(it.angle)}px`, bottom: `${unitRadius * circleCount + it.radius * Math.sin(it.angle)}px` }}>\r\n {it.element}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport interface RingProps extends HTMLAttributes<HTMLDivElement> {\r\n outerWidth: number\r\n innerWidth: number\r\n}\r\n\r\n/** 忘了什么组件 */\r\nexport const Ring: FC<RingProps> = props => {\r\n const { outerWidth, innerWidth, style, ...leftProps } = props\r\n\r\n const outerRadius = outerWidth / 2\r\n\r\n const innerRadius = innerWidth / 2\r\n\r\n return <div style={{ ...style, width: `${outerWidth}px`, height: `${outerWidth}px`, clipPath: `path(\"M0,${outerRadius} a${outerRadius},${outerRadius},0,1,0,${outerWidth},0 a${outerRadius},${outerRadius},0,1,0,-${outerWidth},0 l${outerRadius - innerRadius},0 a${innerRadius},${innerRadius},0,0,1,${innerRadius * 2},0 a${innerRadius},${innerRadius},0,0,1,-${innerRadius * 2},0 Z\")` }} {...leftProps} />\r\n}\r\n\r\nexport interface FlowSizeData {\r\n /** 容器宽度 */\r\n width: number\r\n /** 容器高度 */\r\n height: number\r\n /** 元素宽度 */\r\n itemWidth: number\r\n /** 元素高度 */\r\n itemHeight: number\r\n /** 列间距 */\r\n columnGap: number\r\n /** 列数 */\r\n columnCount: number\r\n /** 行间距 */\r\n rowGap: number\r\n /** 行数 */\r\n rowCount: number\r\n /** 元素格数 */\r\n itemCount: number\r\n /** 最大行数 */\r\n maxRows: number | null\r\n /** 是否有元素被隐藏 */\r\n overflow: boolean\r\n}\r\n\r\nexport interface FlowProps<T> extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\r\n /** 元素宽度 */\r\n itemWidth: number\r\n /** 元素高度 */\r\n itemHeight: number\r\n /** 列间距 */\r\n columnGap?: number | null | (number | null)[]\r\n /** 行间距 */\r\n rowGap?: number\r\n /** 最大行数 */\r\n maxRows?: number | null\r\n /** 源数据 */\r\n data: T[]\r\n /** 渲染 */\r\n render: (item: T, index: number, hidden: boolean) => ReactNode\r\n /** key释放器,默认为 index */\r\n keyExactor?: (item: T, index: number) => string | number\r\n /** 容器类名 */\r\n containerClassName?: string\r\n /** 容器样式 */\r\n containerStyle?: CSSProperties\r\n /** 节流时间,单位毫秒,默认200ms,传入 null 不节流 */\r\n throttle?: number | null\r\n /** 动画时间,单位毫秒,默认400ms,传入 null 不展示动画 */\r\n transitionDuration?: number | null\r\n /** 变化的回调函数 */\r\n onSizeChange?: (sizeData: FlowSizeData) => void\r\n}\r\n\r\nexport function getGapRange(gap?: undefined | number | null | (number | null)[]): [number, number | null] {\r\n if (typeof gap === \"number\") return [gap, gap]\r\n if (Array.isArray(gap)) return [gap[0] || 0, gap[1]]\r\n return [0, null]\r\n}\r\n\r\nexport function getGapCountAndSize(width: number, itemWidth: number, minGap: number, maxGap: number | null): [number, number] {\r\n const count = Math.floor((width + minGap) / (itemWidth + minGap)) || 1\r\n if (count === 1) return [count, 0]\r\n const averageGap = (width - itemWidth * count) / (count - 1)\r\n if (averageGap < minGap) return [count, minGap]\r\n if (maxGap !== null && averageGap > maxGap) return [count, maxGap]\r\n return [count, averageGap]\r\n}\r\n\r\n/** 自适应浮动组件 */\r\nexport function Flow<T>(props: FlowProps<T>) {\r\n const { itemWidth, itemHeight, columnGap, rowGap = 0, maxRows, data, render, keyExactor, className, style, containerClassName, containerStyle, throttle, transitionDuration, onSizeChange, ...others } = props\r\n const [minColumnGap, maxColumnGap] = getGapRange(columnGap)\r\n const [width, setWidth] = useState(0)\r\n const [columnCount, setColumnCount] = useState(1)\r\n const [columnGapSize, setColumnGapSize] = useState(minColumnGap)\r\n const [showItems, setShowItems] = useState(false)\r\n const ele = useRef<HTMLDivElement>(null)\r\n const contentRows = Math.ceil(data.length / columnCount)\r\n const contentShownRows = typeof maxRows === \"number\" ? Math.min(contentRows, maxRows) : contentRows\r\n const height = contentShownRows > 0 ? contentShownRows * (itemHeight + rowGap) - rowGap : 0\r\n\r\n interface Position {\r\n left: number\r\n top: number\r\n }\r\n\r\n function getPosition(index: number): Position {\r\n const y = Math.floor(index / columnCount)\r\n const x = index - y * columnCount\r\n return {\r\n left: x * (itemWidth + columnGapSize),\r\n top: y * (itemHeight + rowGap)\r\n }\r\n }\r\n\r\n function getHidden(index: number) {\r\n if (typeof maxRows !== \"number\") return false\r\n return index >= maxRows * columnCount\r\n }\r\n\r\n useEffect(() => {\r\n let timeout: number\r\n const observer = new ResizeObserver(entries => {\r\n clearTimeout(timeout)\r\n function task() {\r\n const { inlineSize: width } = entries[0].borderBoxSize[0]\r\n const [newColumnCount, newColumnGapSize] = getGapCountAndSize(width, itemWidth, minColumnGap, maxColumnGap)\r\n setShowItems(true)\r\n setWidth(width)\r\n setColumnCount(newColumnCount)\r\n setColumnGapSize(newColumnGapSize)\r\n }\r\n if (throttle === null) {\r\n task()\r\n } else {\r\n timeout = window.setTimeout(task, throttle || 200)\r\n }\r\n })\r\n observer.observe(ele.current!)\r\n\r\n return () => {\r\n observer.disconnect()\r\n }\r\n }, [itemWidth, throttle, columnGap])\r\n\r\n useEffect(() => {\r\n onSizeChange?.({ width, height, itemWidth, itemHeight, columnGap: columnGapSize, columnCount, rowGap, rowCount: contentShownRows, overflow: data.length > contentShownRows * columnCount, itemCount: data.length, maxRows: maxRows ?? null })\r\n }, [width, height, columnGapSize, columnCount, rowGap, contentShownRows, data.length, itemWidth, itemHeight, maxRows])\r\n\r\n return (\r\n <div ref={ele} className={className} style={{ position: \"relative\", boxSizing: \"border-box\", height, ...style }} {...others}>\r\n {showItems &&\r\n data.map((it, idx) => (\r\n <div\r\n key={keyExactor?.(it, idx) || idx}\r\n className={containerClassName}\r\n style={{\r\n position: \"absolute\",\r\n width: itemWidth,\r\n height: itemHeight,\r\n transition: transitionDuration !== null ? `all ${transitionDuration ?? 400}ms` : undefined,\r\n ...getPosition(idx)\r\n }}>\r\n <div style={{ width: itemWidth, height: itemHeight, display: maxRows && idx >= maxRows * columnCount ? \"none\" : \"block\", ...containerStyle }}>{render(it, idx, getHidden(idx))}</div>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport interface TrapeziumProps extends HTMLAttributes<HTMLDivElement> {\r\n top: number\r\n bottom: number\r\n height: number\r\n borderRadius: number\r\n}\r\n\r\n/** 梯形组件 */\r\nexport const Trapezium = forwardRef<HTMLDivElement, TrapeziumProps>((props, ref) => {\r\n const { top, bottom, height, borderRadius, style, ...other } = props\r\n\r\n const diff = (bottom - top) / 2\r\n\r\n const a = Math.atan(height / diff) / 2\r\n\r\n const b = borderRadius / Math.tan(a)\r\n\r\n const c = b * Math.cos(a * 2)\r\n\r\n const d = b * Math.sin(a * 2)\r\n\r\n const e = Math.PI / 2 - a\r\n\r\n const f = borderRadius / Math.tan(e)\r\n\r\n const g = f * Math.cos(a * 2)\r\n\r\n const h = f * Math.sin(a * 2)\r\n\r\n return <div ref={ref} style={{ width: bottom, height, clipPath: `path(\"M ${diff + f} ${0} A ${borderRadius} ${borderRadius} 0 0 0 ${diff - g} ${h} L ${c} ${height - d} A ${borderRadius} ${borderRadius} 0 0 0 ${b} ${height} L ${bottom - b} ${height} A ${borderRadius} ${borderRadius} 0 0 0 ${bottom - c} ${height - d} L ${top + diff + g} ${h} A ${borderRadius} ${borderRadius} 0 0 0 ${top + diff - f} ${0} Z\")`, ...style }} {...other} />\r\n})\r\n\r\nexport interface LoopSwiperProps<T> {\r\n /** 源数据 */\r\n data: T[]\r\n /** 渲染函数 */\r\n render: (item: T, index: number, array: T[]) => ReactNode\r\n /** 每个元素的key */\r\n keyExactor?: (item: T, index: number, array: T[]) => string\r\n /** 水平方向是宽度,垂直方向是高度 */\r\n size: number\r\n /** 元素之间间隔 */\r\n gap?: number\r\n /** 起始位置 */\r\n start?: number\r\n /** 速度,水平方向正数为向左,水平方向负数为向右,垂直方向正数为向上,水平方向负数为向下 */\r\n speed: number\r\n /** 是否暂停播放 */\r\n paused?: boolean\r\n /** 容器的类名 */\r\n className?: string\r\n /** x 水平方向,y 垂直方向 */\r\n direction?: \"x\" | \"y\"\r\n}\r\n\r\nexport interface LoopSwiperItem {\r\n key: string\r\n dom: HTMLDivElement | null\r\n offset: number\r\n}\r\n\r\n/** 循环播放组件 */\r\nexport function LoopSwiper<T>(props: LoopSwiperProps<T>) {\r\n const { data, render, keyExactor, size, gap = 0, start = 0, speed, paused = false, className = \"\", direction = \"x\" } = props\r\n if (!(size > 0 && (speed > 0 || speed < 0))) {\r\n throw new RangeError(\"size 必须是正数,speed 必须非0\")\r\n }\r\n const keys = data.map((it, idx, arr) => (keyExactor ? keyExactor(it, idx, arr) : String(idx)))\r\n const keysRef = useRef(keys)\r\n const cache = useRef({ size, gap, speed, keys, paused, className, direction })\r\n cache.current = { size, gap, speed, keys, paused, className, direction }\r\n const eles = useRef<LoopSwiperItem[]>(keys.map((key, idx) => ({ key, dom: null, offset: idx * (size + gap) + start })))\r\n\r\n if (keysRef.current.length !== keys.length || keysRef.current.some((it, idx) => it !== keys[idx])) {\r\n keysRef.current = keys\r\n eles.current = keys.map((key, idx) => ({ key, dom: null, offset: idx * (size + gap) + start }))\r\n }\r\n\r\n function setStyles() {\r\n const { size, speed, className, direction } = cache.current\r\n eles.current.forEach(it => {\r\n it.dom!.className = className\r\n it.dom!.style.setProperty(\"position\", `absolute`)\r\n it.dom!.style.setProperty(\"width\", `${size}px`)\r\n direction === \"x\" && speed < 0 ? it.dom!.style.setProperty(\"right\", `0`) : it.dom!.style.setProperty(\"left\", `0`)\r\n direction === \"y\" && speed < 0 ? it.dom!.style.setProperty(\"bottom\", `0`) : it.dom!.style.setProperty(\"top\", `0`)\r\n it.dom!.style.setProperty(\"transform\", `translate${direction.toUpperCase()}(${it.offset * (speed > 0 ? 1 : -1)}px)`)\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n setStyles()\r\n }, [])\r\n\r\n useEffect(() => {\r\n const stop = setFrameInterval(() => {\r\n const { size, gap, speed, keys, paused } = cache.current\r\n if (paused) return\r\n eles.current.length = keys.length\r\n let minIndex = 0\r\n eles.current.forEach((it, idx) => {\r\n if (it.offset < eles.current[minIndex].offset) {\r\n minIndex = idx\r\n }\r\n })\r\n const minOffset = eles.current[minIndex].offset\r\n eles.current.forEach((it, idx) => {\r\n let index = idx\r\n if (idx < minIndex) index = eles.current.length + idx\r\n it.offset = minOffset + (index - minIndex) * (size + gap)\r\n let newOffset = it.offset - Math.abs(speed)\r\n if (newOffset + size + gap <= 0) {\r\n newOffset += eles.current.length * (size + gap)\r\n }\r\n it.offset = newOffset\r\n })\r\n setStyles()\r\n }, 1)\r\n\r\n return stop\r\n }, [])\r\n\r\n function ref(dom: HTMLDivElement | null, index: number) {\r\n if (!eles.current[index]) return\r\n eles.current[index].dom = dom\r\n }\r\n\r\n return (\r\n <Fragment>\r\n {data.map((it, idx, arr) => (\r\n <div key={keys[idx]} ref={dom => ref(dom, idx)}>\r\n {render(it, idx, arr)}\r\n </div>\r\n ))}\r\n </Fragment>\r\n )\r\n}\r\n\r\nexport interface SectionRingProps extends HTMLAttributes<HTMLDivElement> {\r\n outerRadius: number\r\n innerRadius: number\r\n count: number\r\n angel: number\r\n}\r\n\r\nexport const SectionRing: FC<SectionRingProps> = props => {\r\n const { outerRadius: o, innerRadius: i, count: c, angel: a, style, ...others } = props\r\n\r\n const s = (Math.PI * 2) / c - a\r\n\r\n function arc(radius: number, startAngle: number, endAngle: number, options: DrawArcOptions = {}) {\r\n return drawArc(o, o, radius, startAngle, endAngle, options)\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n ...style,\r\n width: o * 2,\r\n height: o * 2,\r\n clipPath: `path(\"${Array(c)\r\n .fill(0)\r\n .map((it, idx) => `${arc(o, idx * (a + s), idx * (a + s) + a)} ${arc(i, idx * (a + s) + a, idx * (a + s), { line: true, anticlockwise: true })}`)\r\n .join(\" \")} Z\")`\r\n }}\r\n {...others}\r\n />\r\n )\r\n}\r\n\r\nexport interface TransitionNumProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\r\n /** 当前数字 */\r\n children: number\r\n /** 变换周期,单位帧 */\r\n period: number\r\n /** 数字转换为字符串的方法 */\r\n numToStr?: (num: number) => string\r\n}\r\n\r\nexport interface TransitionNumIns {\r\n get(): number\r\n}\r\n\r\n/** 渐变数字组件 */\r\nexport const TransitionNum = forwardRef<TransitionNumIns, TransitionNumProps>((props, ref) => {\r\n const { children: num, period, numToStr, ...others } = props\r\n if (!Number.isInteger(num) || !Number.isInteger(period) || period <= 0) {\r\n throw new RangeError(\"目标数字必须是整数,周期必须是正整数\")\r\n }\r\n const ele = useRef<HTMLDivElement>(null)\r\n const cache = useRef({ num, period, numToStr, show: num })\r\n cache.current = { ...cache.current, num, period, numToStr }\r\n\r\n useImperativeHandle(ref, () => ({ get: () => cache.current.show }), [])\r\n\r\n useEffect(() => {\r\n const { num, period, show, numToStr } = cache.current\r\n ele.current!.innerText = (numToStr || String)(show)\r\n if (num === show) return\r\n const div = ele.current!\r\n const speed = (num - show) / period\r\n const cancel = setFrameInterval(() => {\r\n const { num, numToStr } = cache.current\r\n cache.current.show += speed\r\n if ((speed > 0 && cache.current.show > num) || (speed < 0 && cache.current.show < num)) {\r\n cancel()\r\n cache.current.show = num\r\n }\r\n div.innerText = (numToStr || String)(speed > 0 ? Math.floor(cache.current.show) : Math.ceil(cache.current.show))\r\n }, 1)\r\n\r\n return cancel\r\n }, [num])\r\n\r\n return <div ref={ele} {...others} />\r\n})\r\n\r\nexport interface CircleTextProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\r\n /** 每一个方块的宽度 */\r\n width: number\r\n /** 每一个方块的高度 */\r\n height: number\r\n /** 圆弧的半径,不包含方块的高度 */\r\n radius: number\r\n /** 开始旋转的弧度,逆时针增加,0 为 x 轴方向 */\r\n startAngel?: number\r\n /** 每一个方块之间间隔的弧度 */\r\n gapAngel?: number\r\n /** 文字对齐的方式,默认居中 */\r\n align?: \"left\" | \"center\" | \"right\"\r\n /** 文字朝向圆心还是外侧,默认外侧 */\r\n direction?: \"inner\" | \"outer\"\r\n /** 是否反转文字顺序 */\r\n reverse?: boolean\r\n /** 分割文字的方法 */\r\n separator?: string | RegExp | ((text: string) => string[])\r\n /** 显示的文字 */\r\n children: string\r\n}\r\n\r\n/** 环形文字 */\r\nexport const CircleText: FC<CircleTextProps> = props => {\r\n const { width, height, radius, startAngel = 0, gapAngel = 0, align = \"center\", style, direction = \"outer\", reverse = false, separator, children, ...others } = props\r\n const unitAngle = Math.atan(width / 2 / radius) * 2\r\n const totalAngle = (unitAngle + gapAngel) * children.length - gapAngel\r\n const offsetAngle = align === \"left\" ? 0 : align === \"right\" ? totalAngle : totalAngle / 2\r\n\r\n function getTransform(idx: number) {\r\n const angle = startAngel - idx * (unitAngle + gapAngel) + offsetAngle - unitAngle / 2\r\n const x = (radius + height / 2) * Math.cos(angle) - width / 2\r\n const y = (radius + height / 2) * Math.sin(angle) * -1 - height / 2\r\n const z = Math.PI / 2 - angle + (direction === \"inner\" ? Math.PI : 0)\r\n return `translateX(${x}px) translateY(${y}px) rotateZ(${(z / Math.PI) * 180}deg)`\r\n }\r\n\r\n const words = typeof separator === \"function\" ? separator(children) : children.split(separator ?? \"\")\r\n\r\n if (reverse) words.reverse()\r\n\r\n return (\r\n <Fragment>\r\n {words.map((w, idx) => (\r\n <span key={idx} style={{ position: \"absolute\", ...style, transform: getTransform(idx), textAlign: \"center\", width, lineHeight: `${height}px`, height: height }} {...others}>\r\n {w}\r\n </span>\r\n ))}\r\n </Fragment>\r\n )\r\n}\r\n\r\nexport interface ScrollOptions extends Partial<ScrollbarOptions> {\r\n /** 滑块宽度 */\r\n thumbWidth?: number\r\n}\r\n\r\nexport interface ScrollProps extends HTMLAttributes<HTMLDivElement> {\r\n /** 滚动的配置 */\r\n options?: ScrollOptions\r\n /** 容器宽度 */\r\n containerClassName?: string\r\n /** 容器样式 */\r\n containerStyle?: CSSProperties\r\n}\r\n\r\n/**\r\n * 滚动条组件\r\n * @description 注意 children 不是直接渲染在组件上的,而是渲染在内部的容器上\r\n */\r\nexport const Scroll = forwardRef<HTMLDivElement, ScrollProps>((props, ref) => {\r\n const { children, containerClassName, containerStyle, options, className, ...others } = props\r\n const { thumbWidth, ...scrollbarOptions } = options || {}\r\n const ele = useRef<HTMLDivElement>(null)\r\n\r\n useImperativeHandle(ref, () => ele.current!)\r\n\r\n useEffect(() => {\r\n SmoothScrollBar.init(ele.current!, scrollbarOptions)\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={ele}\r\n className={clsx(\r\n !!thumbWidth &&\r\n css`\r\n .scrollbar-track.scrollbar-track-x {\r\n height: ${thumbWidth}px;\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-x {\r\n height: ${thumbWidth}px;\r\n }\r\n\r\n .scrollbar-track.scrollbar-track-y {\r\n width: ${thumbWidth}px;\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-y {\r\n width: ${thumbWidth}px;\r\n }\r\n `,\r\n className\r\n )}\r\n {...others}>\r\n <div className={containerClassName} style={containerStyle}>\r\n {children}\r\n </div>\r\n </div>\r\n )\r\n})\r\n\r\nexport const AutoSizeTextArea = forwardRef<HTMLTextAreaElement, TextareaHTMLAttributes<HTMLTextAreaElement>>((props, ref) => {\r\n const { style = {}, ...others } = props\r\n const { height, resize, overflowY, ...otherStyle } = style\r\n const ele = useRef<HTMLTextAreaElement>(null)\r\n\r\n useImperativeHandle(ref, () => ele.current!)\r\n\r\n useEffect(() => {\r\n const textarea = ele.current!\r\n function resizeTextarea() {\r\n textarea.style.height = \"auto\"\r\n textarea.style.height = `${textarea.scrollHeight + textarea.offsetHeight - textarea.clientHeight}px`\r\n }\r\n textarea.addEventListener(\"input\", resizeTextarea)\r\n\r\n return () => textarea.removeEventListener(\"input\", resizeTextarea)\r\n }, [])\r\n\r\n return <textarea ref={ele} style={{ ...otherStyle, resize: \"none\", overflowY: \"hidden\" }} {...others} />\r\n})\r\n"],
5
- "mappings": "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",
6
- "names": ["count", "width", "size", "speed", "className", "direction", "gap", "keys", "paused", "num", "period", "numToStr", "SmoothScrollBar"]
4
+ "sourcesContent": ["import { css } from \"@emotion/css\"\r\nimport { DrawArcOptions, clsx, drawArc, setFrameInterval } from \"deepsea-tools\"\r\nimport { ButtonHTMLAttributes, CSSProperties, ChangeEvent, FC, Fragment, HTMLAttributes, InputHTMLAttributes, MouseEvent as ReactMouseEvent, ReactNode, TextareaHTMLAttributes, forwardRef, useEffect, useImperativeHandle, useRef, useState } from \"react\"\r\nimport SmoothScrollBar from \"smooth-scrollbar\"\r\nimport type { ScrollbarOptions } from \"smooth-scrollbar/interfaces\"\r\nimport { read, utils, writeFile } from \"xlsx\"\r\n\r\nexport type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false\r\n\r\nexport interface InputFileDataTypes {\r\n base64: string\r\n text: string\r\n arrayBuffer: ArrayBuffer\r\n binary: string\r\n file: File\r\n}\r\n\r\nexport type InputFileDataType = keyof InputFileDataTypes\r\n\r\nexport interface InputFileData<T> {\r\n result: T\r\n file: File\r\n}\r\n\r\nexport type InputFileProps = (\r\n | {\r\n multiple?: false\r\n type: \"base64\" | \"text\" | \"binary\"\r\n onChange?: (data: InputFileData<string>) => void\r\n }\r\n | {\r\n multiple?: false\r\n type: \"arrayBuffer\"\r\n onChange?: (data: InputFileData<ArrayBuffer>) => void\r\n }\r\n | {\r\n multiple?: false\r\n type?: \"file\"\r\n onChange?: (data: InputFileData<File>) => void\r\n }\r\n | {\r\n multiple: true\r\n type: \"base64\" | \"text\" | \"binary\"\r\n onChange?: (data: InputFileData<string>[]) => void\r\n }\r\n | {\r\n multiple: true\r\n type: \"arrayBuffer\"\r\n onChange?: (data: InputFileData<ArrayBuffer>[]) => void\r\n }\r\n | {\r\n multiple: true\r\n type?: \"file\"\r\n onChange?: (data: InputFileData<File>[]) => void\r\n }\r\n) &\r\n Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"multiple\" | \"type\"> & {\r\n /** 是否在捕获文件后清除 input 上的文件,默认为 false,主要区别在于如果不清除,连续两次选择同样的文件不会触发 onChange 事件,如果用于 form 表单,请设置为 flase */\r\n clearAfterChange?: boolean\r\n }\r\n\r\nexport async function getFileData<T extends InputFileDataType>(file: File, type: T): Promise<InputFileDataTypes[T]> {\r\n const fileReader = new FileReader()\r\n switch (type) {\r\n case \"arrayBuffer\":\r\n fileReader.readAsArrayBuffer(file)\r\n break\r\n case \"binary\":\r\n fileReader.readAsBinaryString(file)\r\n break\r\n case \"base64\":\r\n fileReader.readAsDataURL(file)\r\n break\r\n case \"text\":\r\n fileReader.readAsText(file)\r\n break\r\n default:\r\n return file as any\r\n }\r\n return new Promise(resolve => {\r\n fileReader.addEventListener(\"load\", () => {\r\n resolve(fileReader.result as any)\r\n })\r\n })\r\n}\r\n\r\n/** 专用于读取文件的组件 */\r\nexport const InputFile = forwardRef<HTMLInputElement, InputFileProps>((props, ref) => {\r\n const { multiple = false, type = \"file\", onChange, disabled: inputDisabled, clearAfterChange, ...others } = props\r\n const [disabled, setDisabled] = useState(false)\r\n\r\n async function onInputChange(e: ChangeEvent<HTMLInputElement>) {\r\n const input = e.target\r\n const { files } = input\r\n if (!files || files.length === 0) return\r\n setDisabled(true)\r\n try {\r\n if (multiple) {\r\n const result: any[] = []\r\n for (const file of Array.from(files)) {\r\n result.push({\r\n result: await getFileData(file, type),\r\n file\r\n })\r\n }\r\n onChange?.(result as any)\r\n } else {\r\n onChange?.({\r\n result: await getFileData(files[0], type),\r\n file: files[0]\r\n } as any)\r\n }\r\n setDisabled(false)\r\n if (clearAfterChange) input.value = \"\"\r\n } catch (error) {\r\n setDisabled(false)\r\n if (clearAfterChange) input.value = \"\"\r\n throw error\r\n }\r\n }\r\n\r\n return <input disabled={disabled && inputDisabled} ref={ref} type=\"file\" multiple={multiple} onChange={onInputChange} {...others} />\r\n})\r\n\r\nexport interface ImportExcelProps extends Omit<InputFileProps, \"multiple\" | \"onChange\" | \"accept\" | \"type\"> {\r\n onChange?: (data: Record<string, string>[]) => void\r\n}\r\n\r\nexport type InputFileButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\r\n input: InputFileProps\r\n}\r\n\r\n/** 专用于读取文件的 button 组件 */\r\nexport const InputFileButton = forwardRef<HTMLButtonElement, InputFileButtonProps>((props, ref) => {\r\n const { onClick, children, input: inputProps, ...others } = props\r\n const { style, ...otherInputProps } = inputProps\r\n const input = useRef<HTMLInputElement>(null)\r\n\r\n function onBtnClick(e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) {\r\n input.current?.click()\r\n onClick?.(e)\r\n }\r\n\r\n return (\r\n <button ref={ref} type=\"button\" onClick={onBtnClick} {...others}>\r\n <InputFile ref={input} style={{ display: \"none\", ...style }} {...otherInputProps} />\r\n {children}\r\n </button>\r\n )\r\n})\r\n\r\n/** 专门用于读取 excel 的组件 */\r\nexport const ImportExcel = forwardRef<HTMLInputElement, ImportExcelProps>((props, ref) => {\r\n const { onChange, ...others } = props\r\n\r\n function onInputChange(data: InputFileData<ArrayBuffer>) {\r\n const wb = read(data.result)\r\n const result = utils.sheet_to_json<any>(wb.Sheets[wb.SheetNames[0]])\r\n if (typeof result === \"object\") {\r\n const $ = result.map(it => {\r\n const _: Record<string, string> = {}\r\n Object.keys(it)\r\n .filter(key => key !== \"__rowNum__\")\r\n .forEach(key => (_[key] = String(it[key])))\r\n return _\r\n })\r\n onChange?.($)\r\n }\r\n }\r\n\r\n return <InputFile ref={ref} accept=\".xlsx\" type=\"arrayBuffer\" onChange={onInputChange} {...others} />\r\n})\r\n\r\n/** 手动导出 excel */\r\nexport function exportExcel(data: Record<string, string>[], name: string) {\r\n const workSheet = utils.json_to_sheet(data)\r\n const workBook = utils.book_new()\r\n utils.book_append_sheet(workBook, workSheet)\r\n writeFile(workBook, `${name}${name.endsWith(\".xlsx\") ? \"\" : \".xlsx\"}`)\r\n}\r\n\r\nexport interface ExportExcelProps extends ButtonHTMLAttributes<HTMLButtonElement> {\r\n data: Record<string, string>[]\r\n fileName: string\r\n}\r\n\r\n/** 导出 excel 的 button 组件 */\r\nexport const ExportExcel = forwardRef<HTMLButtonElement, ExportExcelProps>((props, ref) => {\r\n const { data, fileName, onClick, ...others } = props\r\n\r\n function onButtonClick(e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) {\r\n exportExcel(data, fileName)\r\n onClick?.(e)\r\n }\r\n\r\n return <button ref={ref} onClick={onButtonClick} {...others} />\r\n})\r\n\r\nexport interface TransitionBoxProps extends HTMLAttributes<HTMLDivElement> {\r\n containerClassName?: string\r\n containerStyle?: CSSProperties\r\n vertical?: boolean\r\n horizontal?: boolean\r\n time?: number\r\n}\r\n\r\n/** 尺寸渐变的组件 */\r\nexport const TransitionBox: FC<TransitionBoxProps> = props => {\r\n const { style, containerClassName, containerStyle, children, vertical = true, horizontal = true, time = 3000, ...others } = props\r\n const box = useRef<HTMLDivElement>(null)\r\n const [width, setWidth] = useState(0)\r\n const [height, setHeight] = useState(0)\r\n const [count, setCount] = useState(0)\r\n\r\n useEffect(() => {\r\n const observer = new ResizeObserver(entries => {\r\n const { width: currentWidth, height: currentHeight } = entries[0].contentRect\r\n setWidth(currentWidth)\r\n setHeight(currentHeight)\r\n })\r\n\r\n observer.observe(box.current!)\r\n\r\n return () => {\r\n observer.disconnect()\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n setCount(count => Math.min(count + 1, 3))\r\n }, [width, height])\r\n\r\n const outerStyle: CSSProperties = { transitionProperty: count === 3 ? [horizontal && \"width\", vertical && \"height\"].filter(Boolean).join(\", \") : undefined, transitionDuration: count === 3 ? `${time}ms` : undefined, width, height, overflow: \"hidden\", position: \"relative\", ...style }\r\n\r\n return (\r\n <div style={outerStyle} {...others}>\r\n <div className={containerClassName} style={{ position: \"absolute\", ...containerStyle }} ref={box}>\r\n {children}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport interface SeaRadarTarget {\r\n /** 半径 */\r\n radius: number\r\n /** 弧度 */\r\n angle: number\r\n /** 元素 */\r\n element: ReactNode\r\n}\r\n\r\nexport interface SeaRadarProps {\r\n /** 最小圆的半径 */\r\n unitRadius?: number\r\n /** 一共的全数 */\r\n circleCount?: number\r\n /** 角度分成多少份 */\r\n directionCount?: number\r\n /** 圈的宽度 */\r\n circleWidth?: number\r\n /** 圈的颜色 */\r\n circleColor: string\r\n /** 角度的宽度 */\r\n directionWidth?: number\r\n /** 角度颜色 */\r\n directionColor: string\r\n /** 背景色 */\r\n backgroundColor: string\r\n /** 扫描的颜色 */\r\n scanColor: string\r\n /** 扫描的弧度 */\r\n scanAngle?: number\r\n /** 扫描一周的时间,单位秒 */\r\n period?: number\r\n /** 目标列表 */\r\n targets?: SeaRadarTarget[]\r\n /** 展示圈 */\r\n showCircle?: boolean\r\n /** 展示方位 */\r\n showDirection?: boolean\r\n /** 展示刻度线 */\r\n showGraduationLine?: boolean\r\n /** 展示刻度文字 */\r\n showGraduationText?: boolean\r\n}\r\n\r\n/** 雷达组件 */\r\nexport const SeaRadar: FC<SeaRadarProps> = props => {\r\n const { unitRadius = 50, circleCount = 4, circleWidth = 1, circleColor, directionCount = 36, directionWidth = 1, directionColor, backgroundColor, scanColor, scanAngle = Math.PI / 6, period = 8, targets, showGraduationLine, showGraduationText, showCircle, showDirection } = props\r\n const style = { \"--unit-radius\": `${unitRadius}px`, \"--circle-count\": circleCount, \"--circle-width\": `${circleWidth}px`, \"--circle-color\": circleColor, \"--direction-count\": directionCount, \"--direction-width\": `${directionWidth}px`, \"--direction-color\": directionColor, \"--background-color\": backgroundColor, \"--scan-color\": scanColor, \"--period\": `${period}s` } as CSSProperties\r\n return (\r\n <div className=\"sea-radar-wrapper\" style={style}>\r\n {Array(180)\r\n .fill(0)\r\n .map((_, index) => (\r\n <div className=\"sea-radar-little-graduation\" style={{ transform: `rotateZ(${2 * index}deg)`, display: showGraduationLine ? \"block\" : \"none\" }}></div>\r\n ))}\r\n {Array(36)\r\n .fill(0)\r\n .map((_, index) => (\r\n <div className=\"sea-radar-graduation\" style={{ transform: `rotateZ(${10 * index}deg)`, display: showGraduationLine ? \"block\" : \"none\" }}>\r\n <span className=\"sea-radar-graduation-text\" style={{ display: showGraduationText ? \"block\" : \"none\" }}>\r\n {String(index * 10).padStart(3, \"0\")}\r\n </span>\r\n </div>\r\n ))}\r\n <div className=\"sea-radar\">\r\n <div className=\"sea-radar-scan\" style={{ height: `${unitRadius * circleCount * Math.tan(scanAngle)}px`, clipPath: `polygon(0 0, 0 100%, 100% 100%)` }}></div>\r\n {showCircle &&\r\n Array(circleCount)\r\n .fill(0)\r\n .map((_, index) => <div className=\"sea-radar-circle\" style={{ width: `${unitRadius * 2 * (index + 1)}px`, height: `${unitRadius * 2 * (index + 1)}px` }}></div>)}\r\n {showDirection &&\r\n Array(directionCount)\r\n .fill(0)\r\n .map((_, index) => <div className=\"sea-radar-direction\" style={{ transform: `rotateZ(${(360 / directionCount) * index}deg)` }}></div>)}\r\n {targets?.map(it => (\r\n <div className=\"sea-radar-target\" style={{ left: `${unitRadius * circleCount + it.radius * Math.cos(it.angle)}px`, bottom: `${unitRadius * circleCount + it.radius * Math.sin(it.angle)}px` }}>\r\n {it.element}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport interface RingProps extends HTMLAttributes<HTMLDivElement> {\r\n outerWidth: number\r\n innerWidth: number\r\n}\r\n\r\n/** 忘了什么组件 */\r\nexport const Ring: FC<RingProps> = props => {\r\n const { outerWidth, innerWidth, style, ...leftProps } = props\r\n\r\n const outerRadius = outerWidth / 2\r\n\r\n const innerRadius = innerWidth / 2\r\n\r\n return <div style={{ ...style, width: `${outerWidth}px`, height: `${outerWidth}px`, clipPath: `path(\"M0,${outerRadius} a${outerRadius},${outerRadius},0,1,0,${outerWidth},0 a${outerRadius},${outerRadius},0,1,0,-${outerWidth},0 l${outerRadius - innerRadius},0 a${innerRadius},${innerRadius},0,0,1,${innerRadius * 2},0 a${innerRadius},${innerRadius},0,0,1,-${innerRadius * 2},0 Z\")` }} {...leftProps} />\r\n}\r\n\r\nexport interface FlowSizeData {\r\n /** 容器宽度 */\r\n width: number\r\n /** 容器高度 */\r\n height: number\r\n /** 元素宽度 */\r\n itemWidth: number\r\n /** 元素高度 */\r\n itemHeight: number\r\n /** 列间距 */\r\n columnGap: number\r\n /** 列数 */\r\n columnCount: number\r\n /** 行间距 */\r\n rowGap: number\r\n /** 行数 */\r\n rowCount: number\r\n /** 元素格数 */\r\n itemCount: number\r\n /** 最大行数 */\r\n maxRows: number | null\r\n /** 是否有元素被隐藏 */\r\n overflow: boolean\r\n}\r\n\r\nexport interface FlowProps<T> extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\r\n /** 元素宽度 */\r\n itemWidth: number\r\n /** 元素高度 */\r\n itemHeight: number\r\n /** 列间距 */\r\n columnGap?: number | null | (number | null)[]\r\n /** 行间距 */\r\n rowGap?: number\r\n /** 最大行数 */\r\n maxRows?: number | null\r\n /** 源数据 */\r\n data: T[]\r\n /** 渲染 */\r\n render: (item: T, index: number, hidden: boolean) => ReactNode\r\n /** key释放器,默认为 index */\r\n keyExactor?: (item: T, index: number) => string | number\r\n /** 容器类名 */\r\n containerClassName?: string\r\n /** 容器样式 */\r\n containerStyle?: CSSProperties\r\n /** 节流时间,单位毫秒,默认200ms,传入 null 不节流 */\r\n throttle?: number | null\r\n /** 动画时间,单位毫秒,默认400ms,传入 null 不展示动画 */\r\n transitionDuration?: number | null\r\n /** 变化的回调函数 */\r\n onSizeChange?: (sizeData: FlowSizeData) => void\r\n}\r\n\r\nexport function getGapRange(gap?: undefined | number | null | (number | null)[]): [number, number | null] {\r\n if (typeof gap === \"number\") return [gap, gap]\r\n if (Array.isArray(gap)) return [gap[0] || 0, gap[1]]\r\n return [0, null]\r\n}\r\n\r\nexport function getGapCountAndSize(width: number, itemWidth: number, minGap: number, maxGap: number | null): [number, number] {\r\n const count = Math.floor((width + minGap) / (itemWidth + minGap)) || 1\r\n if (count === 1) return [count, 0]\r\n const averageGap = (width - itemWidth * count) / (count - 1)\r\n if (averageGap < minGap) return [count, minGap]\r\n if (maxGap !== null && averageGap > maxGap) return [count, maxGap]\r\n return [count, averageGap]\r\n}\r\n\r\n/** 自适应浮动组件 */\r\nexport function Flow<T>(props: FlowProps<T>) {\r\n const { itemWidth, itemHeight, columnGap, rowGap = 0, maxRows, data, render, keyExactor, className, style, containerClassName, containerStyle, throttle, transitionDuration, onSizeChange, ...others } = props\r\n const [minColumnGap, maxColumnGap] = getGapRange(columnGap)\r\n const [width, setWidth] = useState(0)\r\n const [columnCount, setColumnCount] = useState(1)\r\n const [columnGapSize, setColumnGapSize] = useState(minColumnGap)\r\n const [showItems, setShowItems] = useState(false)\r\n const ele = useRef<HTMLDivElement>(null)\r\n const contentRows = Math.ceil(data.length / columnCount)\r\n const contentShownRows = typeof maxRows === \"number\" ? Math.min(contentRows, maxRows) : contentRows\r\n const height = contentShownRows > 0 ? contentShownRows * (itemHeight + rowGap) - rowGap : 0\r\n\r\n interface Position {\r\n left: number\r\n top: number\r\n }\r\n\r\n function getPosition(index: number): Position {\r\n const y = Math.floor(index / columnCount)\r\n const x = index - y * columnCount\r\n return {\r\n left: x * (itemWidth + columnGapSize),\r\n top: y * (itemHeight + rowGap)\r\n }\r\n }\r\n\r\n function getHidden(index: number) {\r\n if (typeof maxRows !== \"number\") return false\r\n return index >= maxRows * columnCount\r\n }\r\n\r\n useEffect(() => {\r\n let timeout: number\r\n const observer = new ResizeObserver(entries => {\r\n clearTimeout(timeout)\r\n function task() {\r\n const { inlineSize: width } = entries[0].borderBoxSize[0]\r\n const [newColumnCount, newColumnGapSize] = getGapCountAndSize(width, itemWidth, minColumnGap, maxColumnGap)\r\n setShowItems(true)\r\n setWidth(width)\r\n setColumnCount(newColumnCount)\r\n setColumnGapSize(newColumnGapSize)\r\n }\r\n if (throttle === null) {\r\n task()\r\n } else {\r\n timeout = window.setTimeout(task, throttle || 200)\r\n }\r\n })\r\n observer.observe(ele.current!)\r\n\r\n return () => {\r\n observer.disconnect()\r\n }\r\n }, [itemWidth, throttle, columnGap])\r\n\r\n useEffect(() => {\r\n onSizeChange?.({ width, height, itemWidth, itemHeight, columnGap: columnGapSize, columnCount, rowGap, rowCount: contentShownRows, overflow: data.length > contentShownRows * columnCount, itemCount: data.length, maxRows: maxRows ?? null })\r\n }, [width, height, columnGapSize, columnCount, rowGap, contentShownRows, data.length, itemWidth, itemHeight, maxRows])\r\n\r\n return (\r\n <div ref={ele} className={className} style={{ position: \"relative\", boxSizing: \"border-box\", height, ...style }} {...others}>\r\n {showItems &&\r\n data.map((it, idx) => (\r\n <div\r\n key={keyExactor?.(it, idx) || idx}\r\n className={containerClassName}\r\n style={{\r\n position: \"absolute\",\r\n width: itemWidth,\r\n height: itemHeight,\r\n transition: transitionDuration !== null ? `all ${transitionDuration ?? 400}ms` : undefined,\r\n ...getPosition(idx)\r\n }}>\r\n <div style={{ width: itemWidth, height: itemHeight, display: maxRows && idx >= maxRows * columnCount ? \"none\" : \"block\", ...containerStyle }}>{render(it, idx, getHidden(idx))}</div>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport interface TrapeziumProps extends HTMLAttributes<HTMLDivElement> {\r\n top: number\r\n bottom: number\r\n height: number\r\n borderRadius: number\r\n}\r\n\r\n/** 梯形组件 */\r\nexport const Trapezium = forwardRef<HTMLDivElement, TrapeziumProps>((props, ref) => {\r\n const { top, bottom, height, borderRadius, style, ...other } = props\r\n\r\n const diff = (bottom - top) / 2\r\n\r\n const a = Math.atan(height / diff) / 2\r\n\r\n const b = borderRadius / Math.tan(a)\r\n\r\n const c = b * Math.cos(a * 2)\r\n\r\n const d = b * Math.sin(a * 2)\r\n\r\n const e = Math.PI / 2 - a\r\n\r\n const f = borderRadius / Math.tan(e)\r\n\r\n const g = f * Math.cos(a * 2)\r\n\r\n const h = f * Math.sin(a * 2)\r\n\r\n return <div ref={ref} style={{ width: bottom, height, clipPath: `path(\"M ${diff + f} ${0} A ${borderRadius} ${borderRadius} 0 0 0 ${diff - g} ${h} L ${c} ${height - d} A ${borderRadius} ${borderRadius} 0 0 0 ${b} ${height} L ${bottom - b} ${height} A ${borderRadius} ${borderRadius} 0 0 0 ${bottom - c} ${height - d} L ${top + diff + g} ${h} A ${borderRadius} ${borderRadius} 0 0 0 ${top + diff - f} ${0} Z\")`, ...style }} {...other} />\r\n})\r\n\r\nexport interface LoopSwiperProps extends HTMLAttributes<HTMLDivElement> {\r\n direction?: \"horizontal\" | \"vertical\"\r\n reverse?: boolean\r\n period: number\r\n gap?: CSSProperties[\"gap\"]\r\n}\r\n\r\ncss`\r\n @keyframes deepsea-horizontal-loop-swipe {\r\n from {\r\n transform: translateX(0);\r\n }\r\n to {\r\n transform: translateX(-100%);\r\n }\r\n }\r\n @keyframes deepsea-reverse-horizontal-loop-swipe {\r\n from {\r\n transform: translateX(0);\r\n }\r\n to {\r\n transform: translateX(100%);\r\n }\r\n }\r\n @keyframes deepsea-vertical-loop-swipe {\r\n from {\r\n transform: translateY(0);\r\n }\r\n to {\r\n transform: translateY(-100%);\r\n }\r\n }\r\n @keyframes deepsea-reverse-vertical-loop-swipe {\r\n from {\r\n transform: translateY(0);\r\n }\r\n to {\r\n transform: translateY(100%);\r\n }\r\n }\r\n`\r\n\r\n/** 循环播放组件 */\r\nexport const LoopSwiper = forwardRef<HTMLDivElement, LoopSwiperProps>((props, ref) => {\r\n const { style, children, direction, period, reverse, gap, ...others } = props\r\n const wrapper = useRef<HTMLDivElement>(null)\r\n const container = useRef<HTMLDivElement>(null)\r\n const [swiper, setSwiper] = useState(false)\r\n const directionRef = useRef(direction)\r\n directionRef.current = direction\r\n const flexDirection: CSSProperties[\"flexDirection\"] = direction === \"vertical\" ? (reverse ? \"column-reverse\" : \"column\") : reverse ? \"row-reverse\" : \"row\"\r\n const animationName = swiper ? (direction === \"vertical\" ? (reverse ? \"deepsea-reverse-vertical-loop-swipe\" : \"deepsea-vertical-loop-swipe\") : reverse ? \"deepsea-reverse-horizontal-loop-swipe\" : \"deepsea-horizontal-loop-swipe\") : \"none\"\r\n const animationDuration = `${period}ms`\r\n const animationTimingFunction = \"linear\"\r\n const animationIterationCount = \"infinite\"\r\n\r\n useImperativeHandle(ref, () => wrapper.current!)\r\n\r\n useEffect(() => {\r\n const wrapperEle = wrapper.current!\r\n const containerEle = container.current!\r\n let wrapperWidth = 0\r\n let wrapperHeight = 0\r\n let containerWidth = 0\r\n let containerHeight = 0\r\n const observer = new ResizeObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.target === wrapperEle) {\r\n wrapperWidth = entry.contentRect.width\r\n wrapperHeight = entry.contentRect.height\r\n } else if (entry.target === containerEle) {\r\n containerWidth = entry.contentRect.width\r\n containerHeight = entry.contentRect.height\r\n }\r\n })\r\n setSwiper(directionRef.current === \"vertical\" ? containerHeight > wrapperHeight : containerWidth > wrapperWidth)\r\n })\r\n observer.observe(wrapperEle)\r\n observer.observe(containerEle)\r\n }, [])\r\n\r\n return (\r\n <div ref={wrapper} style={{ display: \"flex\", flexDirection, gap, ...style }} {...others}>\r\n <div ref={container} style={{ display: \"flex\", flexDirection, gap, animationName, animationTimingFunction, animationDuration, animationIterationCount }}>\r\n {children}\r\n </div>\r\n <div style={{ display: swiper ? \"flex\" : \"none\", flexDirection, gap, animationName, animationTimingFunction, animationDuration, animationIterationCount }}>{children}</div>\r\n </div>\r\n )\r\n})\r\n\r\nexport interface SectionRingProps extends HTMLAttributes<HTMLDivElement> {\r\n outerRadius: number\r\n innerRadius: number\r\n count: number\r\n angel: number\r\n}\r\n\r\nexport const SectionRing: FC<SectionRingProps> = props => {\r\n const { outerRadius: o, innerRadius: i, count: c, angel: a, style, ...others } = props\r\n\r\n const s = (Math.PI * 2) / c - a\r\n\r\n function arc(radius: number, startAngle: number, endAngle: number, options: DrawArcOptions = {}) {\r\n return drawArc(o, o, radius, startAngle, endAngle, options)\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n ...style,\r\n width: o * 2,\r\n height: o * 2,\r\n clipPath: `path(\"${Array(c)\r\n .fill(0)\r\n .map((it, idx) => `${arc(o, idx * (a + s), idx * (a + s) + a)} ${arc(i, idx * (a + s) + a, idx * (a + s), { line: true, anticlockwise: true })}`)\r\n .join(\" \")} Z\")`\r\n }}\r\n {...others}\r\n />\r\n )\r\n}\r\n\r\nexport interface TransitionNumProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\r\n /** 当前数字 */\r\n children: number\r\n /** 变换周期,单位帧 */\r\n period: number\r\n /** 数字转换为字符串的方法 */\r\n numToStr?: (num: number) => string\r\n}\r\n\r\nexport interface TransitionNumIns {\r\n get(): number\r\n}\r\n\r\n/** 渐变数字组件 */\r\nexport const TransitionNum = forwardRef<TransitionNumIns, TransitionNumProps>((props, ref) => {\r\n const { children: num, period, numToStr, ...others } = props\r\n if (!Number.isInteger(num) || !Number.isInteger(period) || period <= 0) {\r\n throw new RangeError(\"目标数字必须是整数,周期必须是正整数\")\r\n }\r\n const ele = useRef<HTMLDivElement>(null)\r\n const cache = useRef({ num, period, numToStr, show: num })\r\n cache.current = { ...cache.current, num, period, numToStr }\r\n\r\n useImperativeHandle(ref, () => ({ get: () => cache.current.show }), [])\r\n\r\n useEffect(() => {\r\n const { num, period, show, numToStr } = cache.current\r\n ele.current!.innerText = (numToStr || String)(show)\r\n if (num === show) return\r\n const div = ele.current!\r\n const speed = (num - show) / period\r\n const cancel = setFrameInterval(() => {\r\n const { num, numToStr } = cache.current\r\n cache.current.show += speed\r\n if ((speed > 0 && cache.current.show > num) || (speed < 0 && cache.current.show < num)) {\r\n cancel()\r\n cache.current.show = num\r\n }\r\n div.innerText = (numToStr || String)(speed > 0 ? Math.floor(cache.current.show) : Math.ceil(cache.current.show))\r\n }, 1)\r\n\r\n return cancel\r\n }, [num])\r\n\r\n return <div ref={ele} {...others} />\r\n})\r\n\r\nexport interface CircleTextProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\r\n /** 每一个方块的宽度 */\r\n width: number\r\n /** 每一个方块的高度 */\r\n height: number\r\n /** 圆弧的半径,不包含方块的高度 */\r\n radius: number\r\n /** 开始旋转的弧度,逆时针增加,0 为 x 轴方向 */\r\n startAngel?: number\r\n /** 每一个方块之间间隔的弧度 */\r\n gapAngel?: number\r\n /** 文字对齐的方式,默认居中 */\r\n align?: \"left\" | \"center\" | \"right\"\r\n /** 文字朝向圆心还是外侧,默认外侧 */\r\n direction?: \"inner\" | \"outer\"\r\n /** 是否反转文字顺序 */\r\n reverse?: boolean\r\n /** 分割文字的方法 */\r\n separator?: string | RegExp | ((text: string) => string[])\r\n /** 显示的文字 */\r\n children: string\r\n}\r\n\r\n/** 环形文字 */\r\nexport const CircleText: FC<CircleTextProps> = props => {\r\n const { width, height, radius, startAngel = 0, gapAngel = 0, align = \"center\", style, direction = \"outer\", reverse = false, separator, children, ...others } = props\r\n const unitAngle = Math.atan(width / 2 / radius) * 2\r\n const totalAngle = (unitAngle + gapAngel) * children.length - gapAngel\r\n const offsetAngle = align === \"left\" ? 0 : align === \"right\" ? totalAngle : totalAngle / 2\r\n\r\n function getTransform(idx: number) {\r\n const angle = startAngel - idx * (unitAngle + gapAngel) + offsetAngle - unitAngle / 2\r\n const x = (radius + height / 2) * Math.cos(angle) - width / 2\r\n const y = (radius + height / 2) * Math.sin(angle) * -1 - height / 2\r\n const z = Math.PI / 2 - angle + (direction === \"inner\" ? Math.PI : 0)\r\n return `translateX(${x}px) translateY(${y}px) rotateZ(${(z / Math.PI) * 180}deg)`\r\n }\r\n\r\n const words = typeof separator === \"function\" ? separator(children) : children.split(separator ?? \"\")\r\n\r\n if (reverse) words.reverse()\r\n\r\n return (\r\n <Fragment>\r\n {words.map((w, idx) => (\r\n <span key={idx} style={{ position: \"absolute\", ...style, transform: getTransform(idx), textAlign: \"center\", width, lineHeight: `${height}px`, height: height }} {...others}>\r\n {w}\r\n </span>\r\n ))}\r\n </Fragment>\r\n )\r\n}\r\n\r\nexport interface ScrollOptions extends Partial<ScrollbarOptions> {\r\n /** 滑块宽度 */\r\n thumbWidth?: number\r\n}\r\n\r\nexport interface ScrollProps extends HTMLAttributes<HTMLDivElement> {\r\n /** 滚动的配置 */\r\n options?: ScrollOptions\r\n /** 容器宽度 */\r\n containerClassName?: string\r\n /** 容器样式 */\r\n containerStyle?: CSSProperties\r\n}\r\n\r\n/**\r\n * 滚动条组件\r\n * @description 注意 children 不是直接渲染在组件上的,而是渲染在内部的容器上\r\n */\r\nexport const Scroll = forwardRef<HTMLDivElement, ScrollProps>((props, ref) => {\r\n const { children, containerClassName, containerStyle, options, className, ...others } = props\r\n const { thumbWidth, ...scrollbarOptions } = options || {}\r\n const ele = useRef<HTMLDivElement>(null)\r\n\r\n useImperativeHandle(ref, () => ele.current!)\r\n\r\n useEffect(() => {\r\n SmoothScrollBar.init(ele.current!, scrollbarOptions)\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={ele}\r\n className={clsx(\r\n !!thumbWidth &&\r\n css`\r\n .scrollbar-track.scrollbar-track-x {\r\n height: ${thumbWidth}px;\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-x {\r\n height: ${thumbWidth}px;\r\n }\r\n\r\n .scrollbar-track.scrollbar-track-y {\r\n width: ${thumbWidth}px;\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-y {\r\n width: ${thumbWidth}px;\r\n }\r\n `,\r\n className\r\n )}\r\n {...others}>\r\n <div className={containerClassName} style={containerStyle}>\r\n {children}\r\n </div>\r\n </div>\r\n )\r\n})\r\n\r\nexport const AutoSizeTextArea = forwardRef<HTMLTextAreaElement, TextareaHTMLAttributes<HTMLTextAreaElement>>((props, ref) => {\r\n const { style = {}, ...others } = props\r\n const { height, resize, overflowY, ...otherStyle } = style\r\n const ele = useRef<HTMLTextAreaElement>(null)\r\n\r\n useImperativeHandle(ref, () => ele.current!)\r\n\r\n useEffect(() => {\r\n const textarea = ele.current!\r\n function resizeTextarea() {\r\n textarea.style.height = \"auto\"\r\n textarea.style.height = `${textarea.scrollHeight + textarea.offsetHeight - textarea.clientHeight}px`\r\n }\r\n textarea.addEventListener(\"input\", resizeTextarea)\r\n\r\n return () => textarea.removeEventListener(\"input\", resizeTextarea)\r\n }, [])\r\n\r\n return <textarea ref={ele} style={{ ...otherStyle, resize: \"none\", overflowY: \"hidden\" }} {...others} />\r\n})\r\n"],
5
+ "mappings": "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",
6
+ "names": ["count", "width", "num", "period", "numToStr", "SmoothScrollBar"]
7
7
  }
@@ -47,6 +47,13 @@ export declare const InputFile: import("react").ForwardRefExoticComponent<InputF
47
47
  export interface ImportExcelProps extends Omit<InputFileProps, "multiple" | "onChange" | "accept" | "type"> {
48
48
  onChange?: (data: Record<string, string>[]) => void;
49
49
  }
50
+ export type InputFileButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {
51
+ input: InputFileProps;
52
+ };
53
+ /** 专用于读取文件的 button 组件 */
54
+ export declare const InputFileButton: import("react").ForwardRefExoticComponent<ButtonHTMLAttributes<HTMLButtonElement> & {
55
+ input: InputFileProps;
56
+ } & import("react").RefAttributes<HTMLButtonElement>>;
50
57
  /** 专门用于读取 excel 的组件 */
51
58
  export declare const ImportExcel: import("react").ForwardRefExoticComponent<ImportExcelProps & import("react").RefAttributes<HTMLInputElement>>;
52
59
  /** 手动导出 excel */
@@ -180,35 +187,14 @@ export interface TrapeziumProps extends HTMLAttributes<HTMLDivElement> {
180
187
  }
181
188
  /** 梯形组件 */
182
189
  export declare const Trapezium: import("react").ForwardRefExoticComponent<TrapeziumProps & import("react").RefAttributes<HTMLDivElement>>;
183
- export interface LoopSwiperProps<T> {
184
- /** 源数据 */
185
- data: T[];
186
- /** 渲染函数 */
187
- render: (item: T, index: number, array: T[]) => ReactNode;
188
- /** 每个元素的key */
189
- keyExactor?: (item: T, index: number, array: T[]) => string;
190
- /** 水平方向是宽度,垂直方向是高度 */
191
- size: number;
192
- /** 元素之间间隔 */
193
- gap?: number;
194
- /** 起始位置 */
195
- start?: number;
196
- /** 速度,水平方向正数为向左,水平方向负数为向右,垂直方向正数为向上,水平方向负数为向下 */
197
- speed: number;
198
- /** 是否暂停播放 */
199
- paused?: boolean;
200
- /** 容器的类名 */
201
- className?: string;
202
- /** x 水平方向,y 垂直方向 */
203
- direction?: "x" | "y";
204
- }
205
- export interface LoopSwiperItem {
206
- key: string;
207
- dom: HTMLDivElement | null;
208
- offset: number;
190
+ export interface LoopSwiperProps extends HTMLAttributes<HTMLDivElement> {
191
+ direction?: "horizontal" | "vertical";
192
+ reverse?: boolean;
193
+ period: number;
194
+ gap?: CSSProperties["gap"];
209
195
  }
210
196
  /** 循环播放组件 */
211
- export declare function LoopSwiper<T>(props: LoopSwiperProps<T>): import("react/jsx-runtime").JSX.Element;
197
+ export declare const LoopSwiper: import("react").ForwardRefExoticComponent<LoopSwiperProps & import("react").RefAttributes<HTMLDivElement>>;
212
198
  export interface SectionRingProps extends HTMLAttributes<HTMLDivElement> {
213
199
  outerRadius: number;
214
200
  innerRadius: number;