deepsea-components 2.8.5 → 3.0.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.
Files changed (101) hide show
  1. package/dist/cjs/components/AutoFit.d.ts +25 -0
  2. package/dist/cjs/components/AutoFit.js +99 -0
  3. package/dist/cjs/components/AutoFit.js.map +7 -0
  4. package/dist/cjs/components/AutoScroll.js.map +2 -2
  5. package/dist/cjs/components/AutoSizeTextarea.d.ts +5 -0
  6. package/dist/cjs/components/AutoSizeTextarea.js +51 -0
  7. package/dist/cjs/components/AutoSizeTextarea.js.map +7 -0
  8. package/dist/cjs/components/CircleText.d.ts +25 -0
  9. package/dist/cjs/components/CircleText.js +48 -0
  10. package/dist/cjs/components/CircleText.js.map +7 -0
  11. package/dist/cjs/components/Flow.d.ts +57 -0
  12. package/dist/cjs/components/Flow.js +119 -0
  13. package/dist/cjs/components/Flow.js.map +7 -0
  14. package/dist/cjs/components/InputFile.d.ts +64 -0
  15. package/dist/cjs/components/InputFile.js +143 -0
  16. package/dist/cjs/components/InputFile.js.map +7 -0
  17. package/dist/cjs/components/LoopSwiper.d.ts +9 -0
  18. package/dist/cjs/components/LoopSwiper.js +116 -0
  19. package/dist/cjs/components/LoopSwiper.js.map +7 -0
  20. package/dist/cjs/components/Ring.d.ts +7 -0
  21. package/dist/cjs/components/Ring.js +37 -0
  22. package/dist/cjs/components/Ring.js.map +7 -0
  23. package/dist/cjs/components/Scroll.js.map +2 -2
  24. package/dist/cjs/components/SectionRing.d.ts +8 -0
  25. package/dist/cjs/components/SectionRing.js +50 -0
  26. package/dist/cjs/components/SectionRing.js.map +7 -0
  27. package/dist/cjs/components/Skeleton.d.ts +3 -0
  28. package/dist/cjs/components/Skeleton.js +60 -0
  29. package/dist/cjs/components/Skeleton.js.map +7 -0
  30. package/dist/cjs/components/TransitionBox.d.ts +10 -0
  31. package/dist/cjs/components/TransitionBox.js +45 -0
  32. package/dist/cjs/components/TransitionBox.js.map +7 -0
  33. package/dist/cjs/components/TransitionNum.d.ts +16 -0
  34. package/dist/cjs/components/TransitionNum.js +62 -0
  35. package/dist/cjs/components/TransitionNum.js.map +7 -0
  36. package/dist/cjs/components/Trapezium.d.ts +9 -0
  37. package/dist/cjs/components/Trapezium.js +44 -0
  38. package/dist/cjs/components/Trapezium.js.map +7 -0
  39. package/dist/cjs/index.d.ts +13 -265
  40. package/dist/cjs/index.js +26 -505
  41. package/dist/cjs/index.js.map +3 -3
  42. package/dist/esm/components/AutoFit.d.ts +25 -0
  43. package/dist/esm/components/AutoFit.js +87 -0
  44. package/dist/esm/components/AutoFit.js.map +1 -0
  45. package/dist/esm/components/AutoScroll.js.map +1 -1
  46. package/dist/esm/components/AutoSizeTextarea.d.ts +5 -0
  47. package/dist/esm/components/AutoSizeTextarea.js +45 -0
  48. package/dist/esm/components/AutoSizeTextarea.js.map +1 -0
  49. package/dist/esm/components/CircleText.d.ts +25 -0
  50. package/dist/esm/components/CircleText.js +49 -0
  51. package/dist/esm/components/CircleText.js.map +1 -0
  52. package/dist/esm/components/Flow.d.ts +57 -0
  53. package/dist/esm/components/Flow.js +130 -0
  54. package/dist/esm/components/Flow.js.map +1 -0
  55. package/dist/esm/components/InputFile.d.ts +64 -0
  56. package/dist/esm/components/InputFile.js +167 -0
  57. package/dist/esm/components/InputFile.js.map +1 -0
  58. package/dist/esm/components/LoopSwiper.d.ts +9 -0
  59. package/dist/esm/components/LoopSwiper.js +122 -0
  60. package/dist/esm/components/LoopSwiper.js.map +1 -0
  61. package/dist/esm/components/Ring.d.ts +7 -0
  62. package/dist/esm/components/Ring.js +26 -0
  63. package/dist/esm/components/Ring.js.map +1 -0
  64. package/dist/esm/components/Scroll.js.map +1 -1
  65. package/dist/esm/components/SectionRing.d.ts +8 -0
  66. package/dist/esm/components/SectionRing.js +31 -0
  67. package/dist/esm/components/SectionRing.js.map +1 -0
  68. package/dist/esm/components/Skeleton.d.ts +3 -0
  69. package/dist/esm/components/Skeleton.js +35 -0
  70. package/dist/esm/components/Skeleton.js.map +1 -0
  71. package/dist/esm/components/TransitionBox.d.ts +10 -0
  72. package/dist/esm/components/TransitionBox.js +50 -0
  73. package/dist/esm/components/TransitionBox.js.map +1 -0
  74. package/dist/esm/components/TransitionNum.d.ts +16 -0
  75. package/dist/esm/components/TransitionNum.js +65 -0
  76. package/dist/esm/components/TransitionNum.js.map +1 -0
  77. package/dist/esm/components/Trapezium.d.ts +9 -0
  78. package/dist/esm/components/Trapezium.js +35 -0
  79. package/dist/esm/components/Trapezium.js.map +1 -0
  80. package/dist/esm/index.d.ts +13 -265
  81. package/dist/esm/index.js +13 -843
  82. package/dist/esm/index.js.map +1 -1
  83. package/package.json +3 -3
  84. package/src/components/AutoFit.tsx +95 -0
  85. package/src/components/AutoScroll.tsx +1 -0
  86. package/src/components/AutoSizeTextarea.tsx +31 -0
  87. package/src/components/CircleText.tsx +56 -0
  88. package/src/components/Flow.tsx +154 -0
  89. package/src/components/InputFile.tsx +193 -0
  90. package/src/components/LoopSwiper.tsx +101 -0
  91. package/src/components/Ring.tsx +19 -0
  92. package/src/components/Scroll.tsx +1 -0
  93. package/src/components/SectionRing.tsx +36 -0
  94. package/src/components/Skeleton.tsx +38 -0
  95. package/src/components/TransitionBox.tsx +36 -0
  96. package/src/components/TransitionNum.tsx +54 -0
  97. package/src/components/Trapezium.tsx +35 -0
  98. package/src/index.tsx +13 -862
  99. package/dist/cjs/skeleton.css +0 -18
  100. package/dist/esm/skeleton.css +0 -18
  101. package/src/skeleton.css +0 -18
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.tsx"],
4
- "sourcesContent": ["\"use client\"\r\nimport { 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, useLayoutEffect, useRef, useState } from \"react\"\r\nimport { read, utils, writeFile } from \"xlsx\"\r\n\r\nexport * from \"./components/Scroll\"\r\nexport * from \"./components/AutoScroll\"\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 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 textarea.addEventListener(\"change\", resizeTextarea)\r\n\r\n return () => {\r\n textarea.removeEventListener(\"input\", resizeTextarea)\r\n textarea.removeEventListener(\"change\", resizeTextarea)\r\n }\r\n }, [])\r\n\r\n return <textarea ref={ele} style={{ ...otherStyle, resize: \"none\", overflowY: \"hidden\" }} {...others} />\r\n})\r\n\r\nexport interface AutoFitProps extends HTMLAttributes<HTMLDivElement> {\r\n /** 设计稿宽度,默认 1920 */\r\n width?: number\r\n /** 设计稿高度,默认 1080 */\r\n height?: number\r\n /**\r\n * 在哪些方向进行缩放,默认缩放所有方向\r\n * 1. 水平方向是指,宽度按照设计稿进行占满,高度反向缩放\r\n * 2. 垂直方向是指,高度按照设计稿进行占满,宽度反向缩放\r\n * 3. 默认是水平和垂直方向都进行缩放,类似于 background-size: contain 的效果\r\n */\r\n direction?: \"horizontal\" | \"vertical\" | \"both\"\r\n}\r\n\r\n/**\r\n * 自适应缩放组件\r\n *\r\n * 注意:\r\n * 1. 父元素必须设置非 static 定位方式\r\n * 2. 父元素只能有且仅有一个子元素,那就是 AutoFit\r\n * 3. 不要设置 AutoFit 的 position、left、top、transform、width、height 属性\r\n * 4. 在第一次完成缩放前,无论 props 是什么,返回的都是 <div style={{ display: \"none\" }} />\r\n * 5. 元素的属性、事件、资源并不是立即加载的,会有一帧的延迟,在第一次完成缩放后才会显示\r\n */\r\nexport const AutoFit = forwardRef<HTMLDivElement, AutoFitProps>((props, ref) => {\r\n const { width = 1920, height = 1080, direction, className, ...rest } = props\r\n const ele = useRef<HTMLDivElement>(null)\r\n const [show, setShow] = useState(false)\r\n useImperativeHandle(ref, () => ele.current!, [ele.current])\r\n useLayoutEffect(() => {\r\n const element = ele.current\r\n const parent = element?.parentElement\r\n if (!element || !parent) return\r\n function listener(entries: ResizeObserverEntry[]) {\r\n const entry = entries[0]\r\n const { contentRect } = entry\r\n if (direction === \"horizontal\") {\r\n const scale = contentRect.width / width\r\n element?.style.setProperty(\"--transform\", `scale(${scale})`)\r\n element?.style.setProperty(\"--width\", `${width}px`)\r\n element?.style.setProperty(\"--height\", `${contentRect.height / scale}px`)\r\n } else if (direction === \"vertical\") {\r\n const scale = contentRect.height / height\r\n element?.style.setProperty(\"--transform\", `scale(${scale})`)\r\n element?.style.setProperty(\"--width\", `${contentRect.width / scale}px`)\r\n element?.style.setProperty(\"--height\", `${height}px`)\r\n } else {\r\n const scale = Math.min(contentRect.width / width, contentRect.height / height)\r\n element?.style.setProperty(\"--transform\", `translateX(${(contentRect.width - width * scale) / 2}px) translateY(${(contentRect.height - height * scale) / 2}px) scale(${scale})`)\r\n element?.style.setProperty(\"--width\", `${width}px`)\r\n element?.style.setProperty(\"--height\", `${height}px`)\r\n }\r\n setShow(true)\r\n }\r\n const observer = new ResizeObserver(listener)\r\n observer.observe(parent)\r\n return () => observer.disconnect()\r\n }, [ele.current?.parentElement, width, height, direction])\r\n\r\n if (process.env.NODE_ENV === \"development\") {\r\n useEffect(() => {\r\n const parent = ele.current?.parentElement\r\n if (!parent) return\r\n const style = getComputedStyle(parent)\r\n if (style.position === \"static\") {\r\n console.warn(\"AutoFit 组件的父元素的 position 属性不应该是 static\")\r\n }\r\n }, [ele.current?.parentElement])\r\n }\r\n\r\n if (!show) return <div ref={ele} style={{ display: \"none\" }} />\r\n\r\n return (\r\n <div\r\n ref={ele}\r\n className={clsx(\r\n css`\r\n position: absolute;\r\n transform: var(--transform);\r\n transform-origin: top left;\r\n width: var(--width);\r\n height: var(--height);\r\n `,\r\n className\r\n )}\r\n {...rest}\r\n />\r\n )\r\n})\r\n"],
5
- "mappings": "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",
6
- "names": ["count", "width", "num", "period", "numToStr"]
4
+ "sourcesContent": ["export * from \"./components/AutoFit\"\r\nexport * from \"./components/AutoScroll\"\r\nexport * from \"./components/AutoSizeTextarea\"\r\nexport * from \"./components/CircleText\"\r\nexport * from \"./components/Flow\"\r\nexport * from \"./components/InputFile\"\r\nexport * from \"./components/LoopSwiper\"\r\nexport * from \"./components/Ring\"\r\nexport * from \"./components/Scroll\"\r\nexport * from \"./components/SectionRing\"\r\nexport * from \"./components/Skeleton\"\r\nexport * from \"./components/TransitionBox\"\r\nexport * from \"./components/TransitionNum\"\r\nexport * from \"./components/Trapezium\"\r\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,wBAAc,iCAAd;AACA,wBAAc,oCADd;AAEA,wBAAc,0CAFd;AAGA,wBAAc,oCAHd;AAIA,wBAAc,8BAJd;AAKA,wBAAc,mCALd;AAMA,wBAAc,oCANd;AAOA,wBAAc,8BAPd;AAQA,wBAAc,gCARd;AASA,wBAAc,qCATd;AAUA,wBAAc,kCAVd;AAWA,wBAAc,uCAXd;AAYA,wBAAc,uCAZd;AAaA,wBAAc,mCAbd;",
6
+ "names": []
7
7
  }
@@ -0,0 +1,25 @@
1
+ import { HTMLAttributes } from "react";
2
+ export interface AutoFitProps extends HTMLAttributes<HTMLDivElement> {
3
+ /** 设计稿宽度,默认 1920 */
4
+ width?: number;
5
+ /** 设计稿高度,默认 1080 */
6
+ height?: number;
7
+ /**
8
+ * 在哪些方向进行缩放,默认缩放所有方向
9
+ * 1. 水平方向是指,宽度按照设计稿进行占满,高度反向缩放
10
+ * 2. 垂直方向是指,高度按照设计稿进行占满,宽度反向缩放
11
+ * 3. 默认是水平和垂直方向都进行缩放,类似于 background-size: contain 的效果
12
+ */
13
+ direction?: "horizontal" | "vertical" | "both";
14
+ }
15
+ /**
16
+ * 自适应缩放组件
17
+ *
18
+ * 注意:
19
+ * 1. 父元素必须设置非 static 定位方式
20
+ * 2. 父元素只能有且仅有一个子元素,那就是 AutoFit
21
+ * 3. 不要设置 AutoFit 的 position、left、top、transform、width、height 属性
22
+ * 4. 在第一次完成缩放前,无论 props 是什么,返回的都是 <div style={{ display: "none" }} />
23
+ * 5. 元素的属性、事件、资源并不是立即加载的,会有一帧的延迟,在第一次完成缩放后才会显示
24
+ */
25
+ export declare const AutoFit: import("react").ForwardRefExoticComponent<AutoFitProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,87 @@
1
+ "use client";
2
+
3
+ import { css } from "@emotion/css";
4
+ import { clsx } from "deepsea-tools";
5
+ import { forwardRef, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState } from "react";
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ /**
8
+ * 自适应缩放组件
9
+ *
10
+ * 注意:
11
+ * 1. 父元素必须设置非 static 定位方式
12
+ * 2. 父元素只能有且仅有一个子元素,那就是 AutoFit
13
+ * 3. 不要设置 AutoFit 的 position、left、top、transform、width、height 属性
14
+ * 4. 在第一次完成缩放前,无论 props 是什么,返回的都是 <div style={{ display: "none" }} />
15
+ * 5. 元素的属性、事件、资源并不是立即加载的,会有一帧的延迟,在第一次完成缩放后才会显示
16
+ */
17
+ export const AutoFit = /*#__PURE__*/forwardRef((props, ref) => {
18
+ const {
19
+ width = 1920,
20
+ height = 1080,
21
+ direction,
22
+ className,
23
+ ...rest
24
+ } = props;
25
+ const ele = useRef(null);
26
+ const [show, setShow] = useState(false);
27
+ useImperativeHandle(ref, () => ele.current, [ele.current]);
28
+ useLayoutEffect(() => {
29
+ const element = ele.current;
30
+ const parent = element?.parentElement;
31
+ if (!element || !parent) return;
32
+ function listener(entries) {
33
+ const entry = entries[0];
34
+ const {
35
+ contentRect
36
+ } = entry;
37
+ if (direction === "horizontal") {
38
+ const scale = contentRect.width / width;
39
+ element?.style.setProperty("--transform", `scale(${scale})`);
40
+ element?.style.setProperty("--width", `${width}px`);
41
+ element?.style.setProperty("--height", `${contentRect.height / scale}px`);
42
+ } else if (direction === "vertical") {
43
+ const scale = contentRect.height / height;
44
+ element?.style.setProperty("--transform", `scale(${scale})`);
45
+ element?.style.setProperty("--width", `${contentRect.width / scale}px`);
46
+ element?.style.setProperty("--height", `${height}px`);
47
+ } else {
48
+ const scale = Math.min(contentRect.width / width, contentRect.height / height);
49
+ element?.style.setProperty("--transform", `translateX(${(contentRect.width - width * scale) / 2}px) translateY(${(contentRect.height - height * scale) / 2}px) scale(${scale})`);
50
+ element?.style.setProperty("--width", `${width}px`);
51
+ element?.style.setProperty("--height", `${height}px`);
52
+ }
53
+ setShow(true);
54
+ }
55
+ const observer = new ResizeObserver(listener);
56
+ observer.observe(parent);
57
+ return () => observer.disconnect();
58
+ }, [ele.current?.parentElement, width, height, direction]);
59
+ if (process.env.NODE_ENV === "development") {
60
+ useEffect(() => {
61
+ const parent = ele.current?.parentElement;
62
+ if (!parent) return;
63
+ const style = getComputedStyle(parent);
64
+ if (style.position === "static") {
65
+ console.warn("AutoFit 组件的父元素的 position 属性不应该是 static");
66
+ }
67
+ }, [ele.current?.parentElement]);
68
+ }
69
+ if (!show) return /*#__PURE__*/_jsx("div", {
70
+ ref: ele,
71
+ style: {
72
+ display: "none"
73
+ }
74
+ });
75
+ return /*#__PURE__*/_jsx("div", {
76
+ ref: ele,
77
+ className: clsx(css`
78
+ position: absolute;
79
+ transform: var(--transform);
80
+ transform-origin: top left;
81
+ width: var(--width);
82
+ height: var(--height);
83
+ `, className),
84
+ ...rest
85
+ });
86
+ });
87
+ //# sourceMappingURL=AutoFit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["css","clsx","forwardRef","useEffect","useImperativeHandle","useLayoutEffect","useRef","useState","jsx","_jsx","AutoFit","props","ref","width","height","direction","className","rest","ele","show","setShow","current","element","parent","parentElement","listener","entries","entry","contentRect","scale","style","setProperty","Math","min","observer","ResizeObserver","observe","disconnect","process","env","NODE_ENV","getComputedStyle","position","console","warn","display"],"sources":["../../../src/components/AutoFit.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { css } from \"@emotion/css\"\r\nimport { clsx } from \"deepsea-tools\"\r\nimport { forwardRef, HTMLAttributes, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState } from \"react\"\r\n\r\nexport interface AutoFitProps extends HTMLAttributes<HTMLDivElement> {\r\n /** 设计稿宽度,默认 1920 */\r\n width?: number\r\n /** 设计稿高度,默认 1080 */\r\n height?: number\r\n /**\r\n * 在哪些方向进行缩放,默认缩放所有方向\r\n * 1. 水平方向是指,宽度按照设计稿进行占满,高度反向缩放\r\n * 2. 垂直方向是指,高度按照设计稿进行占满,宽度反向缩放\r\n * 3. 默认是水平和垂直方向都进行缩放,类似于 background-size: contain 的效果\r\n */\r\n direction?: \"horizontal\" | \"vertical\" | \"both\"\r\n}\r\n\r\n/**\r\n * 自适应缩放组件\r\n *\r\n * 注意:\r\n * 1. 父元素必须设置非 static 定位方式\r\n * 2. 父元素只能有且仅有一个子元素,那就是 AutoFit\r\n * 3. 不要设置 AutoFit 的 position、left、top、transform、width、height 属性\r\n * 4. 在第一次完成缩放前,无论 props 是什么,返回的都是 <div style={{ display: \"none\" }} />\r\n * 5. 元素的属性、事件、资源并不是立即加载的,会有一帧的延迟,在第一次完成缩放后才会显示\r\n */\r\nexport const AutoFit = forwardRef<HTMLDivElement, AutoFitProps>((props, ref) => {\r\n const { width = 1920, height = 1080, direction, className, ...rest } = props\r\n const ele = useRef<HTMLDivElement>(null)\r\n const [show, setShow] = useState(false)\r\n useImperativeHandle(ref, () => ele.current!, [ele.current])\r\n useLayoutEffect(() => {\r\n const element = ele.current\r\n const parent = element?.parentElement\r\n if (!element || !parent) return\r\n function listener(entries: ResizeObserverEntry[]) {\r\n const entry = entries[0]\r\n const { contentRect } = entry\r\n if (direction === \"horizontal\") {\r\n const scale = contentRect.width / width\r\n element?.style.setProperty(\"--transform\", `scale(${scale})`)\r\n element?.style.setProperty(\"--width\", `${width}px`)\r\n element?.style.setProperty(\"--height\", `${contentRect.height / scale}px`)\r\n } else if (direction === \"vertical\") {\r\n const scale = contentRect.height / height\r\n element?.style.setProperty(\"--transform\", `scale(${scale})`)\r\n element?.style.setProperty(\"--width\", `${contentRect.width / scale}px`)\r\n element?.style.setProperty(\"--height\", `${height}px`)\r\n } else {\r\n const scale = Math.min(contentRect.width / width, contentRect.height / height)\r\n element?.style.setProperty(\"--transform\", `translateX(${(contentRect.width - width * scale) / 2}px) translateY(${(contentRect.height - height * scale) / 2}px) scale(${scale})`)\r\n element?.style.setProperty(\"--width\", `${width}px`)\r\n element?.style.setProperty(\"--height\", `${height}px`)\r\n }\r\n setShow(true)\r\n }\r\n const observer = new ResizeObserver(listener)\r\n observer.observe(parent)\r\n return () => observer.disconnect()\r\n }, [ele.current?.parentElement, width, height, direction])\r\n\r\n if (process.env.NODE_ENV === \"development\") {\r\n useEffect(() => {\r\n const parent = ele.current?.parentElement\r\n if (!parent) return\r\n const style = getComputedStyle(parent)\r\n if (style.position === \"static\") {\r\n console.warn(\"AutoFit 组件的父元素的 position 属性不应该是 static\")\r\n }\r\n }, [ele.current?.parentElement])\r\n }\r\n\r\n if (!show) return <div ref={ele} style={{ display: \"none\" }} />\r\n\r\n return (\r\n <div\r\n ref={ele}\r\n className={clsx(\r\n css`\r\n position: absolute;\r\n transform: var(--transform);\r\n transform-origin: top left;\r\n width: var(--width);\r\n height: var(--height);\r\n `,\r\n className\r\n )}\r\n {...rest}\r\n />\r\n )\r\n})\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["css","useSize","clsx","getArray","forwardRef","useEffect","useImperativeHandle","useRef","Scroll","jsx","_jsx","AutoScroll","props","ref","count","itemHeight","animation","duration","onMouseEnter","onMouseLeave","gap","containerClassName","containerStyle","children","playOnMouseEnter","scrollbar","paused","rest","bar","timeout","undefined","ele","size","pausedRef","pausedProps","current","height","range","index","scrollHeight","length","scroll","target","clearTimeout","setTimeout","scrollTo","listener","status","y","offset","scrollToBottom","Math","abs","find","item","addListener","removeListener","onContainerMouseEnter","e","onContainerMouseLeave","className","style"],"sources":["../../../src/components/AutoScroll.tsx"],"sourcesContent":["\"use client\"\r\nimport { css } from \"@emotion/css\"\r\nimport { useSize } from \"ahooks\"\r\nimport { clsx, getArray } from \"deepsea-tools\"\r\nimport { CSSProperties, forwardRef, MouseEvent as ReactMouseEvent, useEffect, useImperativeHandle, useRef } from \"react\"\r\nimport Scrollbar from \"smooth-scrollbar\"\r\nimport { ScrollStatus } from \"smooth-scrollbar/interfaces/scrollbar\"\r\nimport { Scroll, ScrollProps } from \"./Scroll\"\r\n\r\nexport interface AutoScrollProps extends ScrollProps {\r\n /** 轮播元素的个数 */\r\n count: number\r\n\r\n /** 轮播元素的高度 */\r\n itemHeight: number\r\n\r\n /**\r\n * 轮播动画的时间,单位毫秒\r\n * @default 1000\r\n */\r\n animation?: number\r\n\r\n /**\r\n * 每个元素的停留时间,单位毫秒\r\n * @default 3000\r\n */\r\n duration?: number\r\n\r\n /**\r\n * 元素之间的间距\r\n * @default 0\r\n */\r\n gap?: number\r\n\r\n /** 容器类名 */\r\n containerClassName?: string\r\n\r\n /** 容器样式 */\r\n containerStyle?: CSSProperties\r\n\r\n /**\r\n * 在鼠标移入时是否继续播放\r\n * @default false\r\n */\r\n playOnMouseEnter?: boolean\r\n\r\n /**\r\n * 是否暂停\r\n * @default false\r\n */\r\n paused?: boolean\r\n}\r\n\r\nexport const AutoScroll = forwardRef<HTMLDivElement, AutoScrollProps>((props, ref) => {\r\n const { count, itemHeight, animation = 1000, duration = 3000, onMouseEnter, onMouseLeave, gap = 0, containerClassName, containerStyle, children, playOnMouseEnter, scrollbar, paused, ...rest } = props\r\n const bar = useRef<Scrollbar | null>(null)\r\n const timeout = useRef<NodeJS.Timeout | undefined>(undefined)\r\n const ele = useRef<HTMLDivElement>(null)\r\n const size = useSize(ele)\r\n const pausedRef = useRef(false)\r\n const pausedProps = useRef(paused)\r\n pausedProps.current = paused\r\n\r\n useImperativeHandle(ref, () => ele.current!, [])\r\n useImperativeHandle(scrollbar, () => bar.current!, [])\r\n\r\n useEffect(() => {\r\n if (playOnMouseEnter) pausedRef.current = false\r\n }, [playOnMouseEnter])\r\n\r\n useEffect(() => {\r\n if (!size || count === 0) return\r\n const { height } = size\r\n const range = getArray(count, index => (itemHeight + gap) * (index + 1) - (index === count - 1 ? gap : 0))\r\n const scrollHeight = range[range.length - 1]\r\n if (height >= scrollHeight) return\r\n function scroll(target: number) {\r\n clearTimeout(timeout.current)\r\n timeout.current = setTimeout(() => {\r\n if (pausedRef.current || pausedProps.current) return scroll(target)\r\n bar.current?.scrollTo(0, target, animation)\r\n }, duration)\r\n }\r\n scroll(range[0])\r\n function listener(status: ScrollStatus) {\r\n const { y } = status.offset\r\n const scrollToBottom = Math.abs(y + height - scrollHeight) / itemHeight <= 0.05\r\n const target = scrollToBottom ? 0 : range.find(item => item > y)!\r\n scroll(target)\r\n }\r\n bar.current?.addListener(listener)\r\n return () => {\r\n clearTimeout(timeout.current)\r\n bar.current?.removeListener(listener)\r\n bar.current?.scrollTo(0, 0)\r\n }\r\n }, [size, count, itemHeight, gap, duration, animation])\r\n\r\n function onContainerMouseEnter(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pausedRef.current = true\r\n onMouseEnter?.(e)\r\n }\r\n\r\n function onContainerMouseLeave(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pausedRef.current = false\r\n onMouseLeave?.(e)\r\n }\r\n\r\n return (\r\n <Scroll ref={ele} scrollbar={bar} onMouseEnter={onContainerMouseEnter} onMouseLeave={onContainerMouseLeave} {...rest}>\r\n <div\r\n className={clsx(\r\n css`\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--gap, 0);\r\n & > * {\r\n flex: none;\r\n }\r\n `,\r\n containerClassName\r\n )}\r\n style={{ \"--gap\": `${gap}px`, ...containerStyle } as CSSProperties}>\r\n {children}\r\n </div>\r\n </Scroll>\r\n )\r\n})\r\n"],"mappings":"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"}
1
+ {"version":3,"names":["css","useSize","clsx","getArray","forwardRef","useEffect","useImperativeHandle","useRef","Scroll","jsx","_jsx","AutoScroll","props","ref","count","itemHeight","animation","duration","onMouseEnter","onMouseLeave","gap","containerClassName","containerStyle","children","playOnMouseEnter","scrollbar","paused","rest","bar","timeout","undefined","ele","size","pausedRef","pausedProps","current","height","range","index","scrollHeight","length","scroll","target","clearTimeout","setTimeout","scrollTo","listener","status","y","offset","scrollToBottom","Math","abs","find","item","addListener","removeListener","onContainerMouseEnter","e","onContainerMouseLeave","className","style"],"sources":["../../../src/components/AutoScroll.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { css } from \"@emotion/css\"\r\nimport { useSize } from \"ahooks\"\r\nimport { clsx, getArray } from \"deepsea-tools\"\r\nimport { CSSProperties, forwardRef, MouseEvent as ReactMouseEvent, useEffect, useImperativeHandle, useRef } from \"react\"\r\nimport Scrollbar from \"smooth-scrollbar\"\r\nimport { ScrollStatus } from \"smooth-scrollbar/interfaces/scrollbar\"\r\nimport { Scroll, ScrollProps } from \"./Scroll\"\r\n\r\nexport interface AutoScrollProps extends ScrollProps {\r\n /** 轮播元素的个数 */\r\n count: number\r\n\r\n /** 轮播元素的高度 */\r\n itemHeight: number\r\n\r\n /**\r\n * 轮播动画的时间,单位毫秒\r\n * @default 1000\r\n */\r\n animation?: number\r\n\r\n /**\r\n * 每个元素的停留时间,单位毫秒\r\n * @default 3000\r\n */\r\n duration?: number\r\n\r\n /**\r\n * 元素之间的间距\r\n * @default 0\r\n */\r\n gap?: number\r\n\r\n /** 容器类名 */\r\n containerClassName?: string\r\n\r\n /** 容器样式 */\r\n containerStyle?: CSSProperties\r\n\r\n /**\r\n * 在鼠标移入时是否继续播放\r\n * @default false\r\n */\r\n playOnMouseEnter?: boolean\r\n\r\n /**\r\n * 是否暂停\r\n * @default false\r\n */\r\n paused?: boolean\r\n}\r\n\r\nexport const AutoScroll = forwardRef<HTMLDivElement, AutoScrollProps>((props, ref) => {\r\n const { count, itemHeight, animation = 1000, duration = 3000, onMouseEnter, onMouseLeave, gap = 0, containerClassName, containerStyle, children, playOnMouseEnter, scrollbar, paused, ...rest } = props\r\n const bar = useRef<Scrollbar | null>(null)\r\n const timeout = useRef<NodeJS.Timeout | undefined>(undefined)\r\n const ele = useRef<HTMLDivElement>(null)\r\n const size = useSize(ele)\r\n const pausedRef = useRef(false)\r\n const pausedProps = useRef(paused)\r\n pausedProps.current = paused\r\n\r\n useImperativeHandle(ref, () => ele.current!, [])\r\n useImperativeHandle(scrollbar, () => bar.current!, [])\r\n\r\n useEffect(() => {\r\n if (playOnMouseEnter) pausedRef.current = false\r\n }, [playOnMouseEnter])\r\n\r\n useEffect(() => {\r\n if (!size || count === 0) return\r\n const { height } = size\r\n const range = getArray(count, index => (itemHeight + gap) * (index + 1) - (index === count - 1 ? gap : 0))\r\n const scrollHeight = range[range.length - 1]\r\n if (height >= scrollHeight) return\r\n function scroll(target: number) {\r\n clearTimeout(timeout.current)\r\n timeout.current = setTimeout(() => {\r\n if (pausedRef.current || pausedProps.current) return scroll(target)\r\n bar.current?.scrollTo(0, target, animation)\r\n }, duration)\r\n }\r\n scroll(range[0])\r\n function listener(status: ScrollStatus) {\r\n const { y } = status.offset\r\n const scrollToBottom = Math.abs(y + height - scrollHeight) / itemHeight <= 0.05\r\n const target = scrollToBottom ? 0 : range.find(item => item > y)!\r\n scroll(target)\r\n }\r\n bar.current?.addListener(listener)\r\n return () => {\r\n clearTimeout(timeout.current)\r\n bar.current?.removeListener(listener)\r\n bar.current?.scrollTo(0, 0)\r\n }\r\n }, [size, count, itemHeight, gap, duration, animation])\r\n\r\n function onContainerMouseEnter(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pausedRef.current = true\r\n onMouseEnter?.(e)\r\n }\r\n\r\n function onContainerMouseLeave(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pausedRef.current = false\r\n onMouseLeave?.(e)\r\n }\r\n\r\n return (\r\n <Scroll ref={ele} scrollbar={bar} onMouseEnter={onContainerMouseEnter} onMouseLeave={onContainerMouseLeave} {...rest}>\r\n <div\r\n className={clsx(\r\n css`\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--gap, 0);\r\n & > * {\r\n flex: none;\r\n }\r\n `,\r\n containerClassName\r\n )}\r\n style={{ \"--gap\": `${gap}px`, ...containerStyle } as CSSProperties}>\r\n {children}\r\n </div>\r\n </Scroll>\r\n )\r\n})\r\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { TextareaHTMLAttributes } from "react";
2
+ /**
3
+ * 自适应高度的文本域
4
+ */
5
+ export declare const AutoSizeTextArea: import("react").ForwardRefExoticComponent<TextareaHTMLAttributes<HTMLTextAreaElement> & import("react").RefAttributes<HTMLTextAreaElement>>;
@@ -0,0 +1,45 @@
1
+ "use client";
2
+
3
+ import { forwardRef, useEffect, useImperativeHandle, useRef } from "react";
4
+
5
+ /**
6
+ * 自适应高度的文本域
7
+ */
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ export const AutoSizeTextArea = /*#__PURE__*/forwardRef((props, ref) => {
10
+ const {
11
+ style = {},
12
+ ...rest
13
+ } = props;
14
+ const {
15
+ height,
16
+ resize,
17
+ overflowY,
18
+ ...restStyle
19
+ } = style;
20
+ const ele = useRef(null);
21
+ useImperativeHandle(ref, () => ele.current, []);
22
+ useEffect(() => {
23
+ const textarea = ele.current;
24
+ function resizeTextarea() {
25
+ textarea.style.height = "auto";
26
+ textarea.style.height = `${textarea.scrollHeight + textarea.offsetHeight - textarea.clientHeight}px`;
27
+ }
28
+ textarea.addEventListener("input", resizeTextarea);
29
+ textarea.addEventListener("change", resizeTextarea);
30
+ return () => {
31
+ textarea.removeEventListener("input", resizeTextarea);
32
+ textarea.removeEventListener("change", resizeTextarea);
33
+ };
34
+ }, []);
35
+ return /*#__PURE__*/_jsx("textarea", {
36
+ ref: ele,
37
+ style: {
38
+ ...restStyle,
39
+ resize: "none",
40
+ overflowY: "hidden"
41
+ },
42
+ ...rest
43
+ });
44
+ });
45
+ //# sourceMappingURL=AutoSizeTextarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["forwardRef","useEffect","useImperativeHandle","useRef","jsx","_jsx","AutoSizeTextArea","props","ref","style","rest","height","resize","overflowY","restStyle","ele","current","textarea","resizeTextarea","scrollHeight","offsetHeight","clientHeight","addEventListener","removeEventListener"],"sources":["../../../src/components/AutoSizeTextarea.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { forwardRef, TextareaHTMLAttributes, useEffect, useImperativeHandle, useRef } from \"react\"\r\n\r\n/**\r\n * 自适应高度的文本域\r\n */\r\nexport const AutoSizeTextArea = forwardRef<HTMLTextAreaElement, TextareaHTMLAttributes<HTMLTextAreaElement>>((props, ref) => {\r\n const { style = {}, ...rest } = props\r\n const { height, resize, overflowY, ...restStyle } = 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 textarea.addEventListener(\"change\", resizeTextarea)\r\n\r\n return () => {\r\n textarea.removeEventListener(\"input\", resizeTextarea)\r\n textarea.removeEventListener(\"change\", resizeTextarea)\r\n }\r\n }, [])\r\n\r\n return <textarea ref={ele} style={{ ...restStyle, resize: \"none\", overflowY: \"hidden\" }} {...rest} />\r\n})\r\n"],"mappings":"AAAA,YAAY;;AAEZ,SAASA,UAAU,EAA0BC,SAAS,EAAEC,mBAAmB,EAAEC,MAAM,QAAQ,OAAO;;AAElG;AACA;AACA;AAFA,SAAAC,GAAA,IAAAC,IAAA;AAGA,OAAO,MAAMC,gBAAgB,gBAAGN,UAAU,CAAmE,CAACO,KAAK,EAAEC,GAAG,KAAK;EACzH,MAAM;IAAEC,KAAK,GAAG,CAAC,CAAC;IAAE,GAAGC;EAAK,CAAC,GAAGH,KAAK;EACrC,MAAM;IAAEI,MAAM;IAAEC,MAAM;IAAEC,SAAS;IAAE,GAAGC;EAAU,CAAC,GAAGL,KAAK;EACzD,MAAMM,GAAG,GAAGZ,MAAM,CAAsB,IAAI,CAAC;EAE7CD,mBAAmB,CAACM,GAAG,EAAE,MAAMO,GAAG,CAACC,OAAQ,EAAE,EAAE,CAAC;EAEhDf,SAAS,CAAC,MAAM;IACZ,MAAMgB,QAAQ,GAAGF,GAAG,CAACC,OAAQ;IAC7B,SAASE,cAAcA,CAAA,EAAG;MACtBD,QAAQ,CAACR,KAAK,CAACE,MAAM,GAAG,MAAM;MAC9BM,QAAQ,CAACR,KAAK,CAACE,MAAM,GAAI,GAAEM,QAAQ,CAACE,YAAY,GAAGF,QAAQ,CAACG,YAAY,GAAGH,QAAQ,CAACI,YAAa,IAAG;IACxG;IACAJ,QAAQ,CAACK,gBAAgB,CAAC,OAAO,EAAEJ,cAAc,CAAC;IAClDD,QAAQ,CAACK,gBAAgB,CAAC,QAAQ,EAAEJ,cAAc,CAAC;IAEnD,OAAO,MAAM;MACTD,QAAQ,CAACM,mBAAmB,CAAC,OAAO,EAAEL,cAAc,CAAC;MACrDD,QAAQ,CAACM,mBAAmB,CAAC,QAAQ,EAAEL,cAAc,CAAC;IAC1D,CAAC;EACL,CAAC,EAAE,EAAE,CAAC;EAEN,oBAAOb,IAAA;IAAUG,GAAG,EAAEO,GAAI;IAACN,KAAK,EAAE;MAAE,GAAGK,SAAS;MAAEF,MAAM,EAAE,MAAM;MAAEC,SAAS,EAAE;IAAS,CAAE;IAAA,GAAKH;EAAI,CAAG,CAAC;AACzG,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { FC, HTMLAttributes } from "react";
2
+ export interface CircleTextProps extends Omit<HTMLAttributes<HTMLSpanElement>, "children"> {
3
+ /** 每一个方块的宽度 */
4
+ width: number;
5
+ /** 每一个方块的高度 */
6
+ height: number;
7
+ /** 圆弧的半径,不包含方块的高度 */
8
+ radius: number;
9
+ /** 开始旋转的弧度,逆时针增加,0 为 x 轴方向 */
10
+ startAngel?: number;
11
+ /** 每一个方块之间间隔的弧度 */
12
+ gapAngel?: number;
13
+ /** 文字对齐的方式,默认居中 */
14
+ align?: "left" | "center" | "right";
15
+ /** 文字朝向圆心还是外侧,默认外侧 */
16
+ direction?: "inner" | "outer";
17
+ /** 是否反转文字顺序 */
18
+ reverse?: boolean;
19
+ /** 分割文字的方法 */
20
+ separator?: string | RegExp | ((text: string) => string[]);
21
+ /** 显示的文字 */
22
+ children: string;
23
+ }
24
+ /** 环形文字 */
25
+ export declare const CircleText: FC<CircleTextProps>;
@@ -0,0 +1,49 @@
1
+ "use client";
2
+
3
+ import { Fragment } from "react";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ /** 环形文字 */
6
+ export const CircleText = props => {
7
+ const {
8
+ width,
9
+ height,
10
+ radius,
11
+ startAngel = 0,
12
+ gapAngel = 0,
13
+ align = "center",
14
+ style,
15
+ direction = "outer",
16
+ reverse = false,
17
+ separator,
18
+ children,
19
+ ...rest
20
+ } = props;
21
+ const unitAngle = Math.atan(width / 2 / radius) * 2;
22
+ const totalAngle = (unitAngle + gapAngel) * children.length - gapAngel;
23
+ const offsetAngle = align === "left" ? 0 : align === "right" ? totalAngle : totalAngle / 2;
24
+ function getTransform(idx) {
25
+ const angle = startAngel - idx * (unitAngle + gapAngel) + offsetAngle - unitAngle / 2;
26
+ const x = (radius + height / 2) * Math.cos(angle) - width / 2;
27
+ const y = (radius + height / 2) * Math.sin(angle) * -1 - height / 2;
28
+ const z = Math.PI / 2 - angle + (direction === "inner" ? Math.PI : 0);
29
+ return `translateX(${x}px) translateY(${y}px) rotateZ(${z / Math.PI * 180}deg)`;
30
+ }
31
+ const words = typeof separator === "function" ? separator(children) : children.split(separator ?? "");
32
+ if (reverse) words.reverse();
33
+ return /*#__PURE__*/_jsx(Fragment, {
34
+ children: words.map((w, idx) => /*#__PURE__*/_jsx("span", {
35
+ style: {
36
+ position: "absolute",
37
+ ...style,
38
+ transform: getTransform(idx),
39
+ textAlign: "center",
40
+ width,
41
+ lineHeight: `${height}px`,
42
+ height: height
43
+ },
44
+ ...rest,
45
+ children: w
46
+ }, idx))
47
+ });
48
+ };
49
+ //# sourceMappingURL=CircleText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Fragment","jsx","_jsx","CircleText","props","width","height","radius","startAngel","gapAngel","align","style","direction","reverse","separator","children","rest","unitAngle","Math","atan","totalAngle","length","offsetAngle","getTransform","idx","angle","x","cos","y","sin","z","PI","words","split","map","w","position","transform","textAlign","lineHeight"],"sources":["../../../src/components/CircleText.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { FC, Fragment, HTMLAttributes } from \"react\"\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, ...rest } = 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 }} {...rest}>\r\n {w}\r\n </span>\r\n ))}\r\n </Fragment>\r\n )\r\n}\r\n"],"mappings":"AAAA,YAAY;;AAEZ,SAAaA,QAAQ,QAAwB,OAAO;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAyBpD;AACA,OAAO,MAAMC,UAA+B,GAAGC,KAAK,IAAI;EACpD,MAAM;IAAEC,KAAK;IAAEC,MAAM;IAAEC,MAAM;IAAEC,UAAU,GAAG,CAAC;IAAEC,QAAQ,GAAG,CAAC;IAAEC,KAAK,GAAG,QAAQ;IAAEC,KAAK;IAAEC,SAAS,GAAG,OAAO;IAAEC,OAAO,GAAG,KAAK;IAAEC,SAAS;IAAEC,QAAQ;IAAE,GAAGC;EAAK,CAAC,GAAGZ,KAAK;EAClK,MAAMa,SAAS,GAAGC,IAAI,CAACC,IAAI,CAACd,KAAK,GAAG,CAAC,GAAGE,MAAM,CAAC,GAAG,CAAC;EACnD,MAAMa,UAAU,GAAG,CAACH,SAAS,GAAGR,QAAQ,IAAIM,QAAQ,CAACM,MAAM,GAAGZ,QAAQ;EACtE,MAAMa,WAAW,GAAGZ,KAAK,KAAK,MAAM,GAAG,CAAC,GAAGA,KAAK,KAAK,OAAO,GAAGU,UAAU,GAAGA,UAAU,GAAG,CAAC;EAE1F,SAASG,YAAYA,CAACC,GAAW,EAAE;IAC/B,MAAMC,KAAK,GAAGjB,UAAU,GAAGgB,GAAG,IAAIP,SAAS,GAAGR,QAAQ,CAAC,GAAGa,WAAW,GAAGL,SAAS,GAAG,CAAC;IACrF,MAAMS,CAAC,GAAG,CAACnB,MAAM,GAAGD,MAAM,GAAG,CAAC,IAAIY,IAAI,CAACS,GAAG,CAACF,KAAK,CAAC,GAAGpB,KAAK,GAAG,CAAC;IAC7D,MAAMuB,CAAC,GAAG,CAACrB,MAAM,GAAGD,MAAM,GAAG,CAAC,IAAIY,IAAI,CAACW,GAAG,CAACJ,KAAK,CAAC,GAAG,CAAC,CAAC,GAAGnB,MAAM,GAAG,CAAC;IACnE,MAAMwB,CAAC,GAAGZ,IAAI,CAACa,EAAE,GAAG,CAAC,GAAGN,KAAK,IAAIb,SAAS,KAAK,OAAO,GAAGM,IAAI,CAACa,EAAE,GAAG,CAAC,CAAC;IACrE,OAAQ,cAAaL,CAAE,kBAAiBE,CAAE,eAAeE,CAAC,GAAGZ,IAAI,CAACa,EAAE,GAAI,GAAI,MAAK;EACrF;EAEA,MAAMC,KAAK,GAAG,OAAOlB,SAAS,KAAK,UAAU,GAAGA,SAAS,CAACC,QAAQ,CAAC,GAAGA,QAAQ,CAACkB,KAAK,CAACnB,SAAS,IAAI,EAAE,CAAC;EAErG,IAAID,OAAO,EAAEmB,KAAK,CAACnB,OAAO,CAAC,CAAC;EAE5B,oBACIX,IAAA,CAACF,QAAQ;IAAAe,QAAA,EACJiB,KAAK,CAACE,GAAG,CAAC,CAACC,CAAC,EAAEX,GAAG,kBACdtB,IAAA;MAAgBS,KAAK,EAAE;QAAEyB,QAAQ,EAAE,UAAU;QAAE,GAAGzB,KAAK;QAAE0B,SAAS,EAAEd,YAAY,CAACC,GAAG,CAAC;QAAEc,SAAS,EAAE,QAAQ;QAAEjC,KAAK;QAAEkC,UAAU,EAAG,GAAEjC,MAAO,IAAG;QAAEA,MAAM,EAAEA;MAAO,CAAE;MAAA,GAAKU,IAAI;MAAAD,QAAA,EACnKoB;IAAC,GADKX,GAEL,CACT;EAAC,CACI,CAAC;AAEnB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { CSSProperties, HTMLAttributes, ReactNode } from "react";
2
+ export interface FlowSizeData {
3
+ /** 容器宽度 */
4
+ width: number;
5
+ /** 容器高度 */
6
+ height: number;
7
+ /** 元素宽度 */
8
+ itemWidth: number;
9
+ /** 元素高度 */
10
+ itemHeight: number;
11
+ /** 列间距 */
12
+ columnGap: number;
13
+ /** 列数 */
14
+ columnCount: number;
15
+ /** 行间距 */
16
+ rowGap: number;
17
+ /** 行数 */
18
+ rowCount: number;
19
+ /** 元素格数 */
20
+ itemCount: number;
21
+ /** 最大行数 */
22
+ maxRows: number | null;
23
+ /** 是否有元素被隐藏 */
24
+ overflow: boolean;
25
+ }
26
+ export interface FlowProps<T> extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
27
+ /** 元素宽度 */
28
+ itemWidth: number;
29
+ /** 元素高度 */
30
+ itemHeight: number;
31
+ /** 列间距 */
32
+ columnGap?: number | null | (number | null)[];
33
+ /** 行间距 */
34
+ rowGap?: number;
35
+ /** 最大行数 */
36
+ maxRows?: number | null;
37
+ /** 源数据 */
38
+ data: T[];
39
+ /** 渲染 */
40
+ render: (item: T, index: number, hidden: boolean) => ReactNode;
41
+ /** key释放器,默认为 index */
42
+ keyExactor?: (item: T, index: number) => string | number;
43
+ /** 容器类名 */
44
+ containerClassName?: string;
45
+ /** 容器样式 */
46
+ containerStyle?: CSSProperties;
47
+ /** 节流时间,单位毫秒,默认200ms,传入 null 不节流 */
48
+ throttle?: number | null;
49
+ /** 动画时间,单位毫秒,默认400ms,传入 null 不展示动画 */
50
+ transitionDuration?: number | null;
51
+ /** 变化的回调函数 */
52
+ onSizeChange?: (sizeData: FlowSizeData) => void;
53
+ }
54
+ export declare function getGapRange(gap?: undefined | number | null | (number | null)[]): [number, number | null];
55
+ export declare function getGapCountAndSize(width: number, itemWidth: number, minGap: number, maxGap: number | null): [number, number];
56
+ /** 自适应浮动组件 */
57
+ export declare function Flow<T>(props: FlowProps<T>): import("react/jsx-runtime").JSX.Element;