deepsea-components 2.1.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -49,7 +49,6 @@ __export(src_exports, {
49
49
  });
50
50
  module.exports = __toCommonJS(src_exports);
51
51
  var import_css = require("@emotion/css");
52
- var import_clsx = __toESM(require("clsx"));
53
52
  var import_deepsea_tools = require("deepsea-tools");
54
53
  var import_react = require("react");
55
54
  var import_smooth_scrollbar = __toESM(require("smooth-scrollbar"));
@@ -415,7 +414,7 @@ var Scroll = (0, import_react.forwardRef)((props, ref) => {
415
414
  "div",
416
415
  {
417
416
  ref,
418
- className: (0, import_clsx.default)(
417
+ className: (0, import_deepsea_tools.clsx)(
419
418
  !!thumbWidth && import_css.css`
420
419
  .scrollbar-track.scrollbar-track-x {
421
420
  height: ${thumbWidth}px;
@@ -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 clsx from \"clsx\"\r\nimport { DrawArcOptions, drawArc, setFrameInterval } from \"deepsea-tools\"\r\nimport { ButtonHTMLAttributes, CSSProperties, ChangeEvent, FC, Fragment, HTMLAttributes, InputHTMLAttributes, MouseEvent as ReactMouseEvent, ReactNode, forwardRef, useEffect, useId, 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 id = useId()\r\n\r\n useEffect(() => {\r\n SmoothScrollBar.init(document.querySelector(`[data-scroll-id=\"${id}\"]`)!, scrollbarOptions)\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={ref}\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 data-scroll-id={id}\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"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAoB;AACpB,kBAAiB;AACjB,2BAA0D;AAC1D,mBAAmO;AACnO,8BAA4B;AAE5B,kBAAuC;AAwDvC,eAAsB,YAAyC,MAAY,MAAyC;AAChH,QAAM,aAAa,IAAI,WAAW;AAClC,UAAQ,MAAM;AAAA,IACV,KAAK;AACD,iBAAW,kBAAkB,IAAI;AACjC;AAAA,IACJ,KAAK;AACD,iBAAW,mBAAmB,IAAI;AAClC;AAAA,IACJ,KAAK;AACD,iBAAW,cAAc,IAAI;AAC7B;AAAA,IACJ,KAAK;AACD,iBAAW,WAAW,IAAI;AAC1B;AAAA,IACJ;AACI,aAAO;AAAA,EACf;AACA,SAAO,IAAI,QAAQ,aAAW;AAC1B,eAAW,iBAAiB,QAAQ,MAAM;AACtC,cAAQ,WAAW,MAAa;AAAA,IACpC,CAAC;AAAA,EACL,CAAC;AACL;AAGO,IAAM,gBAAY,yBAA6C,CAAC,OAAO,QAAQ;AAClF,QAAM,EAAE,WAAW,OAAO,OAAO,QAAQ,UAAU,UAAU,eAAe,kBAAkB,GAAG,OAAO,IAAI;AAC5G,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAE9C,iBAAe,cAAc,GAAkC;AAC3D,UAAM,QAAQ,EAAE;AAChB,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,CAAC,SAAS,MAAM,WAAW;AAAG;AAClC,gBAAY,IAAI;AAChB,QAAI;AACA,UAAI,UAAU;AACV,cAAM,SAAgB,CAAC;AACvB,mBAAW,QAAQ,MAAM,KAAK,KAAK,GAAG;AAClC,iBAAO,KAAK;AAAA,YACR,QAAQ,MAAM,YAAY,MAAM,IAAI;AAAA,YACpC;AAAA,UACJ,CAAC;AAAA,QACL;AACA,6CAAW;AAAA,MACf,OAAO;AACH,6CAAW;AAAA,UACP,QAAQ,MAAM,YAAY,MAAM,CAAC,GAAG,IAAI;AAAA,UACxC,MAAM,MAAM,CAAC;AAAA,QACjB;AAAA,MACJ;AACA,kBAAY,KAAK;AACjB,UAAI;AAAkB,cAAM,QAAQ;AAAA,IACxC,SAAS,OAAP;AACE,kBAAY,KAAK;AACjB,UAAI;AAAkB,cAAM,QAAQ;AACpC,YAAM;AAAA,IACV;AAAA,EACJ;AAEA,SAAO,oCAAC,WAAM,UAAU,YAAY,eAAe,KAAU,MAAK,QAAO,UAAoB,UAAU,eAAgB,GAAG,QAAQ;AACtI,CAAC;AAOM,IAAM,kBAAc,yBAA+C,CAAC,OAAO,QAAQ;AACtF,QAAM,EAAE,UAAU,GAAG,OAAO,IAAI;AAEhC,WAAS,cAAc,MAAkC;AACrD,UAAM,SAAK,kBAAK,KAAK,MAAM;AAC3B,UAAM,SAAS,kBAAM,cAAmB,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;AACnE,QAAI,OAAO,WAAW,UAAU;AAC5B,YAAM,IAAI,OAAO,IAAI,QAAM;AACvB,cAAM,IAA4B,CAAC;AACnC,eAAO,KAAK,EAAE,EACT,OAAO,SAAO,QAAQ,YAAY,EAClC,QAAQ,SAAQ,EAAE,GAAG,IAAI,OAAO,GAAG,GAAG,CAAC,CAAE;AAC9C,eAAO;AAAA,MACX,CAAC;AACD,2CAAW;AAAA,IACf;AAAA,EACJ;AAEA,SAAO,oCAAC,aAAU,KAAU,QAAO,SAAQ,MAAK,eAAc,UAAU,eAAgB,GAAG,QAAQ;AACvG,CAAC;AAGM,SAAS,YAAY,MAAgC,MAAc;AACtE,QAAM,YAAY,kBAAM,cAAc,IAAI;AAC1C,QAAM,WAAW,kBAAM,SAAS;AAChC,oBAAM,kBAAkB,UAAU,SAAS;AAC3C,6BAAU,UAAU,GAAG,OAAO,KAAK,SAAS,OAAO,IAAI,KAAK,SAAS;AACzE;AAQO,IAAM,kBAAc,yBAAgD,CAAC,OAAO,QAAQ;AACvF,QAAM,EAAE,MAAM,UAAU,SAAS,GAAG,OAAO,IAAI;AAE/C,WAAS,cAAc,GAAmD;AACtE,gBAAY,MAAM,QAAQ;AAC1B,uCAAU;AAAA,EACd;AAEA,SAAO,oCAAC,YAAO,KAAU,SAAS,eAAgB,GAAG,QAAQ;AACjE,CAAC;AAWM,IAAM,gBAAwC,WAAS;AAC1D,QAAM,EAAE,OAAO,oBAAoB,gBAAgB,UAAU,WAAW,MAAM,aAAa,MAAM,OAAO,KAAM,GAAG,OAAO,IAAI;AAC5H,QAAM,UAAM,qBAAuB,IAAI;AACvC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,CAAC;AACpC,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,CAAC;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,CAAC;AAEpC,8BAAU,MAAM;AACZ,UAAM,WAAW,IAAI,eAAe,aAAW;AAC3C,YAAM,EAAE,OAAO,cAAc,QAAQ,cAAc,IAAI,QAAQ,CAAC,EAAE;AAClE,eAAS,YAAY;AACrB,gBAAU,aAAa;AAAA,IAC3B,CAAC;AAED,aAAS,QAAQ,IAAI,OAAQ;AAE7B,WAAO,MAAM;AACT,eAAS,WAAW;AAAA,IACxB;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACZ,aAAS,CAAAA,WAAS,KAAK,IAAIA,SAAQ,GAAG,CAAC,CAAC;AAAA,EAC5C,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,QAAM,aAA4B,EAAE,oBAAoB,UAAU,IAAI,CAAC,cAAc,SAAS,YAAY,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,IAAI,QAAW,oBAAoB,UAAU,IAAI,GAAG,WAAW,QAAW,OAAO,QAAQ,UAAU,UAAU,UAAU,YAAY,GAAG,MAAM;AAEzR,SACI,oCAAC,SAAI,OAAO,YAAa,GAAG,UACxB,oCAAC,SAAI,WAAW,oBAAoB,OAAO,EAAE,UAAU,YAAY,GAAG,eAAe,GAAG,KAAK,OACxF,QACL,CACJ;AAER;AA+CO,IAAM,WAA8B,WAAS;AAChD,QAAM,EAAE,aAAa,IAAI,cAAc,GAAG,cAAc,GAAG,aAAa,iBAAiB,IAAI,iBAAiB,GAAG,gBAAgB,iBAAiB,WAAW,YAAY,KAAK,KAAK,GAAG,SAAS,GAAG,SAAS,oBAAoB,oBAAoB,YAAY,cAAc,IAAI;AACjR,QAAM,QAAQ,EAAE,iBAAiB,GAAG,gBAAgB,kBAAkB,aAAa,kBAAkB,GAAG,iBAAiB,kBAAkB,aAAa,qBAAqB,gBAAgB,qBAAqB,GAAG,oBAAoB,qBAAqB,gBAAgB,sBAAsB,iBAAiB,gBAAgB,WAAW,YAAY,GAAG,UAAU;AACzW,SACI,oCAAC,SAAI,WAAU,qBAAoB,SAC9B,MAAM,GAAG,EACL,KAAK,CAAC,EACN,IAAI,CAAC,GAAG,UACL,oCAAC,SAAI,WAAU,+BAA8B,OAAO,EAAE,WAAW,WAAW,IAAI,aAAa,SAAS,qBAAqB,UAAU,OAAO,GAAG,CAClJ,GACJ,MAAM,EAAE,EACJ,KAAK,CAAC,EACN,IAAI,CAAC,GAAG,UACL,oCAAC,SAAI,WAAU,wBAAuB,OAAO,EAAE,WAAW,WAAW,KAAK,aAAa,SAAS,qBAAqB,UAAU,OAAO,KAClI,oCAAC,UAAK,WAAU,6BAA4B,OAAO,EAAE,SAAS,qBAAqB,UAAU,OAAO,KAC/F,OAAO,QAAQ,EAAE,EAAE,SAAS,GAAG,GAAG,CACvC,CACJ,CACH,GACL,oCAAC,SAAI,WAAU,eACX,oCAAC,SAAI,WAAU,kBAAiB,OAAO,EAAE,QAAQ,GAAG,aAAa,cAAc,KAAK,IAAI,SAAS,OAAO,UAAU,kCAAkC,GAAG,GACtJ,cACG,MAAM,WAAW,EACZ,KAAK,CAAC,EACN,IAAI,CAAC,GAAG,UAAU,oCAAC,SAAI,WAAU,oBAAmB,OAAO,EAAE,OAAO,GAAG,aAAa,KAAK,QAAQ,QAAQ,QAAQ,GAAG,aAAa,KAAK,QAAQ,OAAO,GAAG,CAAM,GACtK,iBACG,MAAM,cAAc,EACf,KAAK,CAAC,EACN,IAAI,CAAC,GAAG,UAAU,oCAAC,SAAI,WAAU,uBAAsB,OAAO,EAAE,WAAW,WAAY,MAAM,iBAAkB,YAAY,GAAG,CAAM,GAC5I,mCAAS,IAAI,QACV,oCAAC,SAAI,WAAU,oBAAmB,OAAO,EAAE,MAAM,GAAG,aAAa,cAAc,GAAG,SAAS,KAAK,IAAI,GAAG,KAAK,OAAO,QAAQ,GAAG,aAAa,cAAc,GAAG,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KACvL,GAAG,OACR,EAER,CACJ;AAER;AAQO,IAAM,OAAsB,WAAS;AACxC,QAAM,EAAE,YAAY,YAAY,OAAO,GAAG,UAAU,IAAI;AAExD,QAAM,cAAc,aAAa;AAEjC,QAAM,cAAc,aAAa;AAEjC,SAAO,oCAAC,SAAI,OAAO,EAAE,GAAG,OAAO,OAAO,GAAG,gBAAgB,QAAQ,GAAG,gBAAgB,UAAU,YAAY,gBAAgB,eAAe,qBAAqB,iBAAiB,eAAe,sBAAsB,iBAAiB,cAAc,kBAAkB,eAAe,qBAAqB,cAAc,QAAQ,eAAe,sBAAsB,cAAc,UAAU,GAAI,GAAG,WAAW;AAClZ;AAwDO,SAAS,YAAY,KAA8E;AACtG,MAAI,OAAO,QAAQ;AAAU,WAAO,CAAC,KAAK,GAAG;AAC7C,MAAI,MAAM,QAAQ,GAAG;AAAG,WAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;AACnD,SAAO,CAAC,GAAG,IAAI;AACnB;AAEO,SAAS,mBAAmB,OAAe,WAAmB,QAAgB,QAAyC;AAC1H,QAAM,QAAQ,KAAK,OAAO,QAAQ,WAAW,YAAY,OAAO,KAAK;AACrE,MAAI,UAAU;AAAG,WAAO,CAAC,OAAO,CAAC;AACjC,QAAM,cAAc,QAAQ,YAAY,UAAU,QAAQ;AAC1D,MAAI,aAAa;AAAQ,WAAO,CAAC,OAAO,MAAM;AAC9C,MAAI,WAAW,QAAQ,aAAa;AAAQ,WAAO,CAAC,OAAO,MAAM;AACjE,SAAO,CAAC,OAAO,UAAU;AAC7B;AAGO,SAAS,KAAQ,OAAqB;AACzC,QAAM,EAAE,WAAW,YAAY,WAAW,SAAS,GAAG,SAAS,MAAM,QAAQ,YAAY,WAAW,OAAO,oBAAoB,gBAAgB,UAAU,oBAAoB,cAAc,GAAG,OAAO,IAAI;AACzM,QAAM,CAAC,cAAc,YAAY,IAAI,YAAY,SAAS;AAC1D,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,CAAC;AACpC,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,CAAC;AAChD,QAAM,CAAC,eAAe,gBAAgB,QAAI,uBAAS,YAAY;AAC/D,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAChD,QAAM,UAAM,qBAAuB,IAAI;AACvC,QAAM,cAAc,KAAK,KAAK,KAAK,SAAS,WAAW;AACvD,QAAM,mBAAmB,OAAO,YAAY,WAAW,KAAK,IAAI,aAAa,OAAO,IAAI;AACxF,QAAM,SAAS,mBAAmB,IAAI,oBAAoB,aAAa,UAAU,SAAS;AAO1F,WAAS,YAAY,OAAyB;AAC1C,UAAM,IAAI,KAAK,MAAM,QAAQ,WAAW;AACxC,UAAM,IAAI,QAAQ,IAAI;AACtB,WAAO;AAAA,MACH,MAAM,KAAK,YAAY;AAAA,MACvB,KAAK,KAAK,aAAa;AAAA,IAC3B;AAAA,EACJ;AAEA,WAAS,UAAU,OAAe;AAC9B,QAAI,OAAO,YAAY;AAAU,aAAO;AACxC,WAAO,SAAS,UAAU;AAAA,EAC9B;AAEA,8BAAU,MAAM;AACZ,QAAI;AACJ,UAAM,WAAW,IAAI,eAAe,aAAW;AAC3C,mBAAa,OAAO;AACpB,eAAS,OAAO;AACZ,cAAM,EAAE,YAAYC,OAAM,IAAI,QAAQ,CAAC,EAAE,cAAc,CAAC;AACxD,cAAM,CAAC,gBAAgB,gBAAgB,IAAI,mBAAmBA,QAAO,WAAW,cAAc,YAAY;AAC1G,qBAAa,IAAI;AACjB,iBAASA,MAAK;AACd,uBAAe,cAAc;AAC7B,yBAAiB,gBAAgB;AAAA,MACrC;AACA,UAAI,aAAa,MAAM;AACnB,aAAK;AAAA,MACT,OAAO;AACH,kBAAU,OAAO,WAAW,MAAM,YAAY,GAAG;AAAA,MACrD;AAAA,IACJ,CAAC;AACD,aAAS,QAAQ,IAAI,OAAQ;AAE7B,WAAO,MAAM;AACT,eAAS,WAAW;AAAA,IACxB;AAAA,EACJ,GAAG,CAAC,WAAW,UAAU,SAAS,CAAC;AAEnC,8BAAU,MAAM;AACZ,iDAAe,EAAE,OAAO,QAAQ,WAAW,YAAY,WAAW,eAAe,aAAa,QAAQ,UAAU,kBAAkB,UAAU,KAAK,SAAS,mBAAmB,aAAa,WAAW,KAAK,QAAQ,SAAS,WAAW,KAAK;AAAA,EAC/O,GAAG,CAAC,OAAO,QAAQ,eAAe,aAAa,QAAQ,kBAAkB,KAAK,QAAQ,WAAW,YAAY,OAAO,CAAC;AAErH,SACI,oCAAC,SAAI,KAAK,KAAK,WAAsB,OAAO,EAAE,UAAU,YAAY,WAAW,cAAc,QAAQ,GAAG,MAAM,GAAI,GAAG,UAChH,aACG,KAAK,IAAI,CAAC,IAAI,QACV;AAAA,IAAC;AAAA;AAAA,MACG,MAAK,yCAAa,IAAI,SAAQ;AAAA,MAC9B,WAAW;AAAA,MACX,OAAO;AAAA,QACH,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY,uBAAuB,OAAO,OAAO,sBAAsB,UAAU;AAAA,QACjF,GAAG,YAAY,GAAG;AAAA,MACtB;AAAA;AAAA,IACA,oCAAC,SAAI,OAAO,EAAE,OAAO,WAAW,QAAQ,YAAY,SAAS,WAAW,OAAO,UAAU,cAAc,SAAS,SAAS,GAAG,eAAe,KAAI,OAAO,IAAI,KAAK,UAAU,GAAG,CAAC,CAAE;AAAA,EACnL,CACH,CACT;AAER;AAUO,IAAM,gBAAY,yBAA2C,CAAC,OAAO,QAAQ;AAChF,QAAM,EAAE,KAAK,QAAQ,QAAQ,cAAc,OAAO,GAAG,MAAM,IAAI;AAE/D,QAAM,QAAQ,SAAS,OAAO;AAE9B,QAAM,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI;AAErC,QAAM,IAAI,eAAe,KAAK,IAAI,CAAC;AAEnC,QAAM,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AAE5B,QAAM,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AAE5B,QAAM,IAAI,KAAK,KAAK,IAAI;AAExB,QAAM,IAAI,eAAe,KAAK,IAAI,CAAC;AAEnC,QAAM,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AAE5B,QAAM,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AAE5B,SAAO,oCAAC,SAAI,KAAU,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,WAAW,OAAO,KAAK,QAAQ,gBAAgB,sBAAsB,OAAO,KAAK,OAAO,KAAK,SAAS,OAAO,gBAAgB,sBAAsB,KAAK,YAAY,SAAS,KAAK,YAAY,gBAAgB,sBAAsB,SAAS,KAAK,SAAS,OAAO,MAAM,OAAO,KAAK,OAAO,gBAAgB,sBAAsB,MAAM,OAAO,KAAK,SAAS,GAAG,MAAM,GAAI,GAAG,OAAO;AACvb,CAAC;AAgCM,SAAS,WAAc,OAA2B;AACrD,QAAM,EAAE,MAAM,QAAQ,YAAY,MAAM,MAAM,GAAG,QAAQ,GAAG,OAAO,SAAS,OAAO,YAAY,IAAI,YAAY,IAAI,IAAI;AACvH,MAAI,EAAE,OAAO,MAAM,QAAQ,KAAK,QAAQ,KAAK;AACzC,UAAM,IAAI,WAAW,uBAAuB;AAAA,EAChD;AACA,QAAM,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,QAAS,aAAa,WAAW,IAAI,KAAK,GAAG,IAAI,OAAO,GAAG,CAAE;AAC7F,QAAM,cAAU,qBAAO,IAAI;AAC3B,QAAM,YAAQ,qBAAO,EAAE,MAAM,KAAK,OAAO,MAAM,QAAQ,WAAW,UAAU,CAAC;AAC7E,QAAM,UAAU,EAAE,MAAM,KAAK,OAAO,MAAM,QAAQ,WAAW,UAAU;AACvE,QAAM,WAAO,qBAAyB,KAAK,IAAI,CAAC,KAAK,SAAS,EAAE,KAAK,KAAK,MAAM,QAAQ,OAAO,OAAO,OAAO,MAAM,EAAE,CAAC;AAEtH,MAAI,QAAQ,QAAQ,WAAW,KAAK,UAAU,QAAQ,QAAQ,KAAK,CAAC,IAAI,QAAQ,OAAO,KAAK,GAAG,CAAC,GAAG;AAC/F,YAAQ,UAAU;AAClB,SAAK,UAAU,KAAK,IAAI,CAAC,KAAK,SAAS,EAAE,KAAK,KAAK,MAAM,QAAQ,OAAO,OAAO,OAAO,MAAM,EAAE;AAAA,EAClG;AAEA,WAAS,YAAY;AACjB,UAAM,EAAE,MAAAC,OAAM,OAAAC,QAAO,WAAAC,YAAW,WAAAC,WAAU,IAAI,MAAM;AACpD,SAAK,QAAQ,QAAQ,QAAM;AACvB,SAAG,IAAK,YAAYD;AACpB,SAAG,IAAK,MAAM,YAAY,YAAY,UAAU;AAChD,SAAG,IAAK,MAAM,YAAY,SAAS,GAAGF,SAAQ;AAC9C,MAAAG,eAAc,OAAOF,SAAQ,IAAI,GAAG,IAAK,MAAM,YAAY,SAAS,GAAG,IAAI,GAAG,IAAK,MAAM,YAAY,QAAQ,GAAG;AAChH,MAAAE,eAAc,OAAOF,SAAQ,IAAI,GAAG,IAAK,MAAM,YAAY,UAAU,GAAG,IAAI,GAAG,IAAK,MAAM,YAAY,OAAO,GAAG;AAChH,SAAG,IAAK,MAAM,YAAY,aAAa,YAAYE,WAAU,YAAY,KAAK,GAAG,UAAUF,SAAQ,IAAI,IAAI,QAAQ;AAAA,IACvH,CAAC;AAAA,EACL;AAEA,8BAAU,MAAM;AACZ,cAAU;AAAA,EACd,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACZ,UAAM,WAAO,uCAAiB,MAAM;AAChC,YAAM,EAAE,MAAAD,OAAM,KAAAI,MAAK,OAAAH,QAAO,MAAAI,OAAM,QAAAC,QAAO,IAAI,MAAM;AACjD,UAAIA;AAAQ;AACZ,WAAK,QAAQ,SAASD,MAAK;AAC3B,UAAI,WAAW;AACf,WAAK,QAAQ,QAAQ,CAAC,IAAI,QAAQ;AAC9B,YAAI,GAAG,SAAS,KAAK,QAAQ,QAAQ,EAAE,QAAQ;AAC3C,qBAAW;AAAA,QACf;AAAA,MACJ,CAAC;AACD,YAAM,YAAY,KAAK,QAAQ,QAAQ,EAAE;AACzC,WAAK,QAAQ,QAAQ,CAAC,IAAI,QAAQ;AAC9B,YAAI,QAAQ;AACZ,YAAI,MAAM;AAAU,kBAAQ,KAAK,QAAQ,SAAS;AAClD,WAAG,SAAS,aAAa,QAAQ,aAAaL,QAAOI;AACrD,YAAI,YAAY,GAAG,SAAS,KAAK,IAAIH,MAAK;AAC1C,YAAI,YAAYD,QAAOI,QAAO,GAAG;AAC7B,uBAAa,KAAK,QAAQ,UAAUJ,QAAOI;AAAA,QAC/C;AACA,WAAG,SAAS;AAAA,MAChB,CAAC;AACD,gBAAU;AAAA,IACd,GAAG,CAAC;AAEJ,WAAO;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,WAAS,IAAI,KAA4B,OAAe;AACpD,QAAI,CAAC,KAAK,QAAQ,KAAK;AAAG;AAC1B,SAAK,QAAQ,KAAK,EAAE,MAAM;AAAA,EAC9B;AAEA,SACI,oCAAC,6BACI,KAAK,IAAI,CAAC,IAAI,KAAK,QAChB,oCAAC,SAAI,KAAK,KAAK,GAAG,GAAG,KAAK,SAAO,IAAI,KAAK,GAAG,KACxC,OAAO,IAAI,KAAK,GAAG,CACxB,CACH,CACL;AAER;AASO,IAAM,cAAoC,WAAS;AACtD,QAAM,EAAE,aAAa,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,IAAI;AAEjF,QAAM,IAAK,KAAK,KAAK,IAAK,IAAI;AAE9B,WAAS,IAAI,QAAgB,YAAoB,UAAkB,UAA0B,CAAC,GAAG;AAC7F,eAAO,8BAAQ,GAAG,GAAG,QAAQ,YAAY,UAAU,OAAO;AAAA,EAC9D;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,OAAO;AAAA,QACH,GAAG;AAAA,QACH,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,QACZ,UAAU,SAAS,MAAM,CAAC,EACrB,KAAK,CAAC,EACN,IAAI,CAAC,IAAI,QAAQ,GAAG,IAAI,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,OAAO,IAAI,KAAK,GAAG,OAAO,IAAI,IAAI,EAAE,MAAM,MAAM,eAAe,KAAK,CAAC,GAAG,EAC/I,KAAK,GAAG;AAAA,MACjB;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;AAgBO,IAAM,oBAAgB,yBAAiD,CAAC,OAAO,QAAQ;AAC1F,QAAM,EAAE,UAAU,KAAK,QAAQ,UAAU,GAAG,OAAO,IAAI;AACvD,MAAI,CAAC,OAAO,UAAU,GAAG,KAAK,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;AACpE,UAAM,IAAI,WAAW,oBAAoB;AAAA,EAC7C;AACA,QAAM,UAAM,qBAAuB,IAAI;AACvC,QAAM,YAAQ,qBAAO,EAAE,KAAK,QAAQ,UAAU,MAAM,IAAI,CAAC;AACzD,QAAM,UAAU,EAAE,GAAG,MAAM,SAAS,KAAK,QAAQ,SAAS;AAE1D,wCAAoB,KAAK,OAAO,EAAE,KAAK,MAAM,MAAM,QAAQ,KAAK,IAAI,CAAC,CAAC;AAEtE,8BAAU,MAAM;AACZ,UAAM,EAAE,KAAAG,MAAK,QAAAC,SAAQ,MAAM,UAAAC,UAAS,IAAI,MAAM;AAC9C,QAAI,QAAS,aAAaA,aAAY,QAAQ,IAAI;AAClD,QAAIF,SAAQ;AAAM;AAClB,UAAM,MAAM,IAAI;AAChB,UAAM,SAASA,OAAM,QAAQC;AAC7B,UAAM,aAAS,uCAAiB,MAAM;AAClC,YAAM,EAAE,KAAAD,MAAK,UAAAE,UAAS,IAAI,MAAM;AAChC,YAAM,QAAQ,QAAQ;AACtB,UAAK,QAAQ,KAAK,MAAM,QAAQ,OAAOF,QAAS,QAAQ,KAAK,MAAM,QAAQ,OAAOA,MAAM;AACpF,eAAO;AACP,cAAM,QAAQ,OAAOA;AAAA,MACzB;AACA,UAAI,aAAaE,aAAY,QAAQ,QAAQ,IAAI,KAAK,MAAM,MAAM,QAAQ,IAAI,IAAI,KAAK,KAAK,MAAM,QAAQ,IAAI,CAAC;AAAA,IACnH,GAAG,CAAC;AAEJ,WAAO;AAAA,EACX,GAAG,CAAC,GAAG,CAAC;AAER,SAAO,oCAAC,SAAI,KAAK,KAAM,GAAG,QAAQ;AACtC,CAAC;AA0BM,IAAM,aAAkC,WAAS;AACpD,QAAM,EAAE,OAAO,QAAQ,QAAQ,aAAa,GAAG,WAAW,GAAG,QAAQ,UAAU,OAAO,YAAY,SAAS,UAAU,OAAO,WAAW,UAAU,GAAG,OAAO,IAAI;AAC/J,QAAM,YAAY,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI;AAClD,QAAM,cAAc,YAAY,YAAY,SAAS,SAAS;AAC9D,QAAM,cAAc,UAAU,SAAS,IAAI,UAAU,UAAU,aAAa,aAAa;AAEzF,WAAS,aAAa,KAAa;AAC/B,UAAM,QAAQ,aAAa,OAAO,YAAY,YAAY,cAAc,YAAY;AACpF,UAAM,KAAK,SAAS,SAAS,KAAK,KAAK,IAAI,KAAK,IAAI,QAAQ;AAC5D,UAAM,KAAK,SAAS,SAAS,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,SAAS;AAClE,UAAM,IAAI,KAAK,KAAK,IAAI,SAAS,cAAc,UAAU,KAAK,KAAK;AACnE,WAAO,cAAc,mBAAmB,gBAAiB,IAAI,KAAK,KAAM;AAAA,EAC5E;AAEA,QAAM,QAAQ,OAAO,cAAc,aAAa,UAAU,QAAQ,IAAI,SAAS,MAAM,aAAa,EAAE;AAEpG,MAAI;AAAS,UAAM,QAAQ;AAE3B,SACI,oCAAC,6BACI,MAAM,IAAI,CAAC,GAAG,QACX,oCAAC,UAAK,KAAK,KAAK,OAAO,EAAE,UAAU,YAAY,GAAG,OAAO,WAAW,aAAa,GAAG,GAAG,WAAW,UAAU,OAAO,YAAY,GAAG,YAAY,OAAe,GAAI,GAAG,UAC/J,CACL,CACH,CACL;AAER;AAoBO,IAAM,aAAS,yBAAwC,CAAC,OAAO,QAAQ;AAC1E,QAAM,EAAE,UAAU,oBAAoB,gBAAgB,SAAS,WAAW,GAAG,OAAO,IAAI;AACxF,QAAM,EAAE,YAAY,GAAG,iBAAiB,IAAI,WAAW,CAAC;AACxD,QAAM,SAAK,oBAAM;AAEjB,8BAAU,MAAM;AACZ,4BAAAC,QAAgB,KAAK,SAAS,cAAc,oBAAoB,MAAM,GAAI,gBAAgB;AAAA,EAC9F,GAAG,CAAC,CAAC;AAEL,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,eAAW,YAAAC;AAAA,QACP,CAAC,CAAC,cACE;AAAA;AAAA,sCAEkB;AAAA;AAAA;AAAA;AAAA,sCAIA;AAAA;AAAA;AAAA;AAAA,qCAID;AAAA;AAAA;AAAA;AAAA,qCAIA;AAAA;AAAA;AAAA,QAGrB;AAAA,MACJ;AAAA,MACA,kBAAgB;AAAA,MACf,GAAG;AAAA;AAAA,IACJ,oCAAC,SAAI,WAAW,oBAAoB,OAAO,kBACtC,QACL;AAAA,EACJ;AAER,CAAC;",
6
- "names": ["count", "width", "size", "speed", "className", "direction", "gap", "keys", "paused", "num", "period", "numToStr", "SmoothScrollBar", "clsx"]
4
+ "sourcesContent": ["import { css } from \"@emotion/css\"\r\nimport { DrawArcOptions, drawArc, setFrameInterval, clsx } from \"deepsea-tools\"\r\nimport { ButtonHTMLAttributes, CSSProperties, ChangeEvent, FC, Fragment, HTMLAttributes, InputHTMLAttributes, MouseEvent as ReactMouseEvent, ReactNode, forwardRef, useEffect, useId, 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 id = useId()\r\n\r\n useEffect(() => {\r\n SmoothScrollBar.init(document.querySelector(`[data-scroll-id=\"${id}\"]`)!, scrollbarOptions)\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={ref}\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 data-scroll-id={id}\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"],
5
+ "mappings": "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",
6
+ "names": ["count", "width", "size", "speed", "className", "direction", "gap", "keys", "paused", "num", "period", "numToStr", "SmoothScrollBar"]
7
7
  }
@@ -0,0 +1,18 @@
1
+ @keyframes deepsea-shimmer {
2
+ 0% {
3
+ background-position: -400px 0px;
4
+ }
5
+ 100% {
6
+ background-position: 400px 0px;
7
+ }
8
+ }
9
+
10
+ .deepsea-skeleton {
11
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.067) 8%, rgba(0, 0, 0, 0.133) 18%, rgba(0, 0, 0, 0.067) 33%);
12
+ animation-duration: 1s;
13
+ animation-fill-mode: forwards;
14
+ animation-iteration-count: infinite;
15
+ animation-name: deepsea-shimmer;
16
+ animation-timing-function: linear;
17
+ background-size: 800px 104px;
18
+ }