react-public-components 1.2.3 → 1.2.5
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/README.md +5 -2
- package/dist/AnnouncementBar/index.cjs +3 -2
- package/dist/AnnouncementBar/index.css +102 -11
- package/dist/AnnouncementBar/index.css.map +1 -1
- package/dist/AnnouncementBar/index.d.ts +22 -3
- package/dist/AnnouncementBar/index.js +2 -1
- package/dist/AudioPlayer/index.cjs +3 -3
- package/dist/AudioPlayer/index.js +2 -2
- package/dist/CeilingBox/index.cjs +9 -0
- package/dist/CeilingBox/index.cjs.map +1 -0
- package/dist/CeilingBox/index.css +25 -0
- package/dist/CeilingBox/index.css.map +1 -0
- package/dist/CeilingBox/index.d.ts +28 -0
- package/dist/CeilingBox/index.js +3 -0
- package/dist/CeilingBox/index.js.map +1 -0
- package/dist/CodeSnippet/index.cjs +3 -2
- package/dist/CodeSnippet/index.css +157 -0
- package/dist/CodeSnippet/index.css.map +1 -1
- package/dist/CodeSnippet/index.d.ts +40 -4
- package/dist/CodeSnippet/index.js +2 -1
- package/dist/CodeSnippet/sandbox.d.ts +26 -0
- package/dist/CollapseBox/index.cjs +3 -3
- package/dist/CollapseBox/index.js +2 -2
- package/dist/ColorPicker/index.cjs +5 -5
- package/dist/ColorPicker/index.js +2 -2
- package/dist/ContextMenu/index.cjs +3 -3
- package/dist/ContextMenu/index.js +2 -2
- package/dist/CopyButton/index.cjs +3 -3
- package/dist/CopyButton/index.js +2 -2
- package/dist/CronPicker/index.cjs +4 -4
- package/dist/CronPicker/index.js +3 -3
- package/dist/DebounceSelect/index.cjs +3 -3
- package/dist/DebounceSelect/index.js +2 -2
- package/dist/DisabledBox/index.cjs +3 -3
- package/dist/DisabledBox/index.js +2 -2
- package/dist/DragSortList/index.cjs +3 -2
- package/dist/DragSortList/index.css +82 -13
- package/dist/DragSortList/index.css.map +1 -1
- package/dist/DragSortList/index.d.ts +8 -2
- package/dist/DragSortList/index.js +2 -1
- package/dist/FilePreviewer/index.cjs +4 -4
- package/dist/FilePreviewer/index.js +2 -2
- package/dist/Fullscreen/index.cjs +3 -3
- package/dist/Fullscreen/index.js +2 -2
- package/dist/GuidedTour/index.cjs +3 -3
- package/dist/GuidedTour/index.js +2 -2
- package/dist/ImageCropper/index.cjs +3 -3
- package/dist/ImageCropper/index.js +2 -2
- package/dist/InfiniteScrollList/index.cjs +3 -3
- package/dist/InfiniteScrollList/index.js +2 -2
- package/dist/JsonEditor/index.cjs +4 -4
- package/dist/JsonEditor/index.js +3 -3
- package/dist/KeyValEditor/index.cjs +3 -3
- package/dist/KeyValEditor/index.js +2 -2
- package/dist/LazyLoadBox/index.cjs +18 -0
- package/dist/LazyLoadBox/index.cjs.map +1 -0
- package/dist/LazyLoadBox/index.css +57 -0
- package/dist/LazyLoadBox/index.css.map +1 -0
- package/dist/LazyLoadBox/index.d.ts +104 -0
- package/dist/LazyLoadBox/index.js +3 -0
- package/dist/LazyLoadBox/index.js.map +1 -0
- package/dist/PasswordStrength/index.cjs +4 -4
- package/dist/PasswordStrength/index.js +2 -2
- package/dist/PdfViewer/index.cjs +3 -3
- package/dist/PdfViewer/index.js +2 -2
- package/dist/PeriodSelect/index.cjs +22 -0
- package/dist/PeriodSelect/index.cjs.map +1 -0
- package/dist/PeriodSelect/index.css +88 -0
- package/dist/PeriodSelect/index.css.map +1 -0
- package/dist/PeriodSelect/index.d.ts +36 -0
- package/dist/PeriodSelect/index.js +3 -0
- package/dist/PeriodSelect/index.js.map +1 -0
- package/dist/QrCodeCard/index.cjs +3 -3
- package/dist/QrCodeCard/index.css +122 -32
- package/dist/QrCodeCard/index.css.map +1 -1
- package/dist/QrCodeCard/index.d.ts +10 -2
- package/dist/QrCodeCard/index.js +2 -2
- package/dist/SensitiveMask/index.cjs +5 -5
- package/dist/SensitiveMask/index.js +3 -3
- package/dist/Splitter/index.cjs +3 -3
- package/dist/Splitter/index.js +2 -2
- package/dist/TagInput/index.cjs +3 -3
- package/dist/TagInput/index.js +2 -2
- package/dist/TextEllipsis/index.cjs +4 -4
- package/dist/TextEllipsis/index.js +3 -3
- package/dist/TreeTransfer/index.cjs +3 -3
- package/dist/TreeTransfer/index.js +2 -2
- package/dist/VideoPlayer/index.cjs +3 -3
- package/dist/VideoPlayer/index.js +2 -2
- package/dist/{chunk-GV2RRQ2S.cjs → chunk-2EIAWXFA.cjs} +5 -5
- package/dist/{chunk-GV2RRQ2S.cjs.map → chunk-2EIAWXFA.cjs.map} +1 -1
- package/dist/{chunk-ISUXPTLV.js → chunk-2IDVNTKR.js} +93 -3
- package/dist/chunk-2IDVNTKR.js.map +1 -0
- package/dist/{chunk-6FVAQECF.js → chunk-2INP6NM4.js} +3 -3
- package/dist/{chunk-6FVAQECF.js.map → chunk-2INP6NM4.js.map} +1 -1
- package/dist/chunk-4KMVABTM.js +419 -0
- package/dist/chunk-4KMVABTM.js.map +1 -0
- package/dist/{chunk-VS2YVJOB.cjs → chunk-4TMBGQQE.cjs} +5 -5
- package/dist/{chunk-VS2YVJOB.cjs.map → chunk-4TMBGQQE.cjs.map} +1 -1
- package/dist/{chunk-PJB7ADK6.js → chunk-56VELHCH.js} +3 -3
- package/dist/{chunk-PJB7ADK6.js.map → chunk-56VELHCH.js.map} +1 -1
- package/dist/chunk-5Q7THN6M.js +115 -0
- package/dist/chunk-5Q7THN6M.js.map +1 -0
- package/dist/{chunk-4BDO5TJH.cjs → chunk-77ANKL4K.cjs} +8 -8
- package/dist/{chunk-4BDO5TJH.cjs.map → chunk-77ANKL4K.cjs.map} +1 -1
- package/dist/{chunk-OCN7L2ID.cjs → chunk-7ZBA4NHH.cjs} +4 -4
- package/dist/{chunk-OCN7L2ID.cjs.map → chunk-7ZBA4NHH.cjs.map} +1 -1
- package/dist/{chunk-MY4M7HVW.cjs → chunk-AHTRLNYK.cjs} +5 -5
- package/dist/{chunk-MY4M7HVW.cjs.map → chunk-AHTRLNYK.cjs.map} +1 -1
- package/dist/{chunk-WEOMKZC6.js → chunk-ANTFNDH4.js} +3 -3
- package/dist/{chunk-WEOMKZC6.js.map → chunk-ANTFNDH4.js.map} +1 -1
- package/dist/{chunk-EGZSSZBX.js → chunk-AXPVN2OO.js} +3 -3
- package/dist/{chunk-EGZSSZBX.js.map → chunk-AXPVN2OO.js.map} +1 -1
- package/dist/{chunk-LLWK5VKA.js → chunk-CURWX7OY.js} +3 -3
- package/dist/{chunk-LLWK5VKA.js.map → chunk-CURWX7OY.js.map} +1 -1
- package/dist/{chunk-WZRUBHS3.cjs → chunk-ED3ZG2VX.cjs} +5 -5
- package/dist/{chunk-WZRUBHS3.cjs.map → chunk-ED3ZG2VX.cjs.map} +1 -1
- package/dist/{chunk-BZXMWKD2.js → chunk-EDNBPLUS.js} +3 -3
- package/dist/{chunk-BZXMWKD2.js.map → chunk-EDNBPLUS.js.map} +1 -1
- package/dist/{chunk-MC3NERDH.js → chunk-EJYTTSW6.js} +3 -3
- package/dist/{chunk-MC3NERDH.js.map → chunk-EJYTTSW6.js.map} +1 -1
- package/dist/{chunk-3UNZXPOT.cjs → chunk-EKDJPOA3.cjs} +5 -5
- package/dist/{chunk-3UNZXPOT.cjs.map → chunk-EKDJPOA3.cjs.map} +1 -1
- package/dist/{chunk-XWXFENGT.js → chunk-EMT4NUI5.js} +3 -3
- package/dist/{chunk-XWXFENGT.js.map → chunk-EMT4NUI5.js.map} +1 -1
- package/dist/{chunk-HFPWBZID.js → chunk-ETFLLRTO.js} +3 -3
- package/dist/{chunk-HFPWBZID.js.map → chunk-ETFLLRTO.js.map} +1 -1
- package/dist/chunk-FZH5FL7X.cjs +167 -0
- package/dist/chunk-FZH5FL7X.cjs.map +1 -0
- package/dist/{chunk-6UKUAYN3.cjs → chunk-HKALWFWZ.cjs} +5 -5
- package/dist/{chunk-6UKUAYN3.cjs.map → chunk-HKALWFWZ.cjs.map} +1 -1
- package/dist/{chunk-IBOCJ2ZS.js → chunk-IF4XAUV3.js} +3 -3
- package/dist/{chunk-IBOCJ2ZS.js.map → chunk-IF4XAUV3.js.map} +1 -1
- package/dist/{chunk-MNY5P5EG.cjs → chunk-IPS7PC3M.cjs} +13 -13
- package/dist/{chunk-MNY5P5EG.cjs.map → chunk-IPS7PC3M.cjs.map} +1 -1
- package/dist/{chunk-V4O325BX.cjs → chunk-JHVPDKBM.cjs} +6 -6
- package/dist/{chunk-V4O325BX.cjs.map → chunk-JHVPDKBM.cjs.map} +1 -1
- package/dist/{chunk-6IXVUD2M.js → chunk-JNA5AQ2K.js} +3 -3
- package/dist/{chunk-6IXVUD2M.js.map → chunk-JNA5AQ2K.js.map} +1 -1
- package/dist/{chunk-NJIYP6SC.cjs → chunk-LFGBZXQH.cjs} +4 -4
- package/dist/{chunk-NJIYP6SC.cjs.map → chunk-LFGBZXQH.cjs.map} +1 -1
- package/dist/{chunk-ZLWY7QS2.cjs → chunk-M3GQ7RCV.cjs} +4 -4
- package/dist/{chunk-ZLWY7QS2.cjs.map → chunk-M3GQ7RCV.cjs.map} +1 -1
- package/dist/{chunk-AFR7V4A4.js → chunk-M4FZJALR.js} +4 -4
- package/dist/{chunk-AFR7V4A4.js.map → chunk-M4FZJALR.js.map} +1 -1
- package/dist/{chunk-CT66HLZ5.js → chunk-MQJBUHDB.js} +3 -3
- package/dist/{chunk-CT66HLZ5.js.map → chunk-MQJBUHDB.js.map} +1 -1
- package/dist/chunk-O4EABET3.js +89 -0
- package/dist/chunk-O4EABET3.js.map +1 -0
- package/dist/{chunk-V7IUSCQS.js → chunk-OLLVIQPL.js} +3 -3
- package/dist/{chunk-V7IUSCQS.js.map → chunk-OLLVIQPL.js.map} +1 -1
- package/dist/{chunk-2DIU347W.cjs → chunk-OONBZRPV.cjs} +4 -4
- package/dist/{chunk-2DIU347W.cjs.map → chunk-OONBZRPV.cjs.map} +1 -1
- package/dist/{chunk-56TD4LDC.js → chunk-P5CS7V4W.js} +3 -3
- package/dist/{chunk-56TD4LDC.js.map → chunk-P5CS7V4W.js.map} +1 -1
- package/dist/{chunk-HUXPCMNP.js → chunk-PTFKE67K.js} +3 -3
- package/dist/{chunk-HUXPCMNP.js.map → chunk-PTFKE67K.js.map} +1 -1
- package/dist/{chunk-PUTAVQJZ.js → chunk-PUMVD7CP.js} +3 -3
- package/dist/{chunk-PUTAVQJZ.js.map → chunk-PUMVD7CP.js.map} +1 -1
- package/dist/{chunk-KXZM322K.cjs → chunk-PYCSRJSF.cjs} +7 -7
- package/dist/{chunk-KXZM322K.cjs.map → chunk-PYCSRJSF.cjs.map} +1 -1
- package/dist/{chunk-PUJJHD22.js → chunk-Q7OVUH5K.js} +3 -3
- package/dist/{chunk-PUJJHD22.js.map → chunk-Q7OVUH5K.js.map} +1 -1
- package/dist/{chunk-2UCTE6YN.cjs → chunk-QP3RKA4J.cjs} +4 -4
- package/dist/{chunk-2UCTE6YN.cjs.map → chunk-QP3RKA4J.cjs.map} +1 -1
- package/dist/{chunk-OKCQZO5E.js → chunk-QRZ2GVVJ.js} +3 -3
- package/dist/{chunk-OKCQZO5E.js.map → chunk-QRZ2GVVJ.js.map} +1 -1
- package/dist/chunk-QU33CY3M.cjs +83 -0
- package/dist/chunk-QU33CY3M.cjs.map +1 -0
- package/dist/{chunk-MBOWSS4B.cjs → chunk-R4V3EJVP.cjs} +98 -2
- package/dist/chunk-R4V3EJVP.cjs.map +1 -0
- package/dist/chunk-RFTYEXKU.js +79 -0
- package/dist/chunk-RFTYEXKU.js.map +1 -0
- package/dist/{chunk-4OXVTRYV.cjs → chunk-RN5WU7KA.cjs} +7 -7
- package/dist/{chunk-4OXVTRYV.cjs.map → chunk-RN5WU7KA.cjs.map} +1 -1
- package/dist/{chunk-WWXBH57R.cjs → chunk-TNZ2OLGW.cjs} +4 -4
- package/dist/{chunk-WWXBH57R.cjs.map → chunk-TNZ2OLGW.cjs.map} +1 -1
- package/dist/chunk-TUDLE3RT.cjs +429 -0
- package/dist/chunk-TUDLE3RT.cjs.map +1 -0
- package/dist/{chunk-B7NN6SZD.cjs → chunk-TUEVILTA.cjs} +5 -5
- package/dist/{chunk-B7NN6SZD.cjs.map → chunk-TUEVILTA.cjs.map} +1 -1
- package/dist/{chunk-ZUW3XLZQ.cjs → chunk-U2EBNBGK.cjs} +4 -4
- package/dist/{chunk-ZUW3XLZQ.cjs.map → chunk-U2EBNBGK.cjs.map} +1 -1
- package/dist/{chunk-JAW7Q2YC.cjs → chunk-UAUP5TJK.cjs} +5 -5
- package/dist/{chunk-JAW7Q2YC.cjs.map → chunk-UAUP5TJK.cjs.map} +1 -1
- package/dist/chunk-UIU6VCEQ.cjs +117 -0
- package/dist/chunk-UIU6VCEQ.cjs.map +1 -0
- package/dist/{chunk-2MDYHFLH.cjs → chunk-UZB7GOEI.cjs} +4 -4
- package/dist/{chunk-2MDYHFLH.cjs.map → chunk-UZB7GOEI.cjs.map} +1 -1
- package/dist/chunk-V55FEQYU.cjs +196 -0
- package/dist/chunk-V55FEQYU.cjs.map +1 -0
- package/dist/{chunk-ZNFW6L3E.cjs → chunk-VJOO2DG3.cjs} +8 -8
- package/dist/{chunk-ZNFW6L3E.cjs.map → chunk-VJOO2DG3.cjs.map} +1 -1
- package/dist/chunk-VYPIRVL4.js +193 -0
- package/dist/chunk-VYPIRVL4.js.map +1 -0
- package/dist/{chunk-JECYRODB.js → chunk-W5JA3YTT.js} +3 -3
- package/dist/{chunk-JECYRODB.js.map → chunk-W5JA3YTT.js.map} +1 -1
- package/dist/{chunk-QZZGBUW4.js → chunk-WKF4C6TJ.js} +3 -3
- package/dist/{chunk-QZZGBUW4.js.map → chunk-WKF4C6TJ.js.map} +1 -1
- package/dist/{chunk-64LBDDZU.js → chunk-XLOGMDAQ.js} +3 -3
- package/dist/{chunk-64LBDDZU.js.map → chunk-XLOGMDAQ.js.map} +1 -1
- package/dist/chunk-XUAHWX6B.js +153 -0
- package/dist/chunk-XUAHWX6B.js.map +1 -0
- package/dist/chunk-Y54KVULF.js +161 -0
- package/dist/chunk-Y54KVULF.js.map +1 -0
- package/dist/{chunk-NUTVJGVT.cjs → chunk-YP4XTMK3.cjs} +4 -4
- package/dist/{chunk-NUTVJGVT.cjs.map → chunk-YP4XTMK3.cjs.map} +1 -1
- package/dist/{chunk-MGUNFP6P.js → chunk-ZCBT56AG.js} +3 -3
- package/dist/{chunk-MGUNFP6P.js.map → chunk-ZCBT56AG.js.map} +1 -1
- package/dist/chunk-ZWKUHYTV.cjs +155 -0
- package/dist/chunk-ZWKUHYTV.cjs.map +1 -0
- package/dist/chunk-ZXMFWVE4.cjs +91 -0
- package/dist/chunk-ZXMFWVE4.cjs.map +1 -0
- package/dist/index.cjs +139 -104
- package/dist/index.css +633 -56
- package/dist/index.css.map +1 -1
- package/dist/index.js +40 -37
- package/dist/src/icons.d.ts +18 -0
- package/dist/src/index.d.ts +10 -2
- package/package.json +1 -1
- package/dist/chunk-5VSEUDVY.js +0 -45
- package/dist/chunk-5VSEUDVY.js.map +0 -1
- package/dist/chunk-5YQVSOHK.js +0 -44
- package/dist/chunk-5YQVSOHK.js.map +0 -1
- package/dist/chunk-B3HZIYQQ.cjs +0 -46
- package/dist/chunk-B3HZIYQQ.cjs.map +0 -1
- package/dist/chunk-EOGYWPX7.cjs +0 -47
- package/dist/chunk-EOGYWPX7.cjs.map +0 -1
- package/dist/chunk-EQ7S5SYM.js +0 -67
- package/dist/chunk-EQ7S5SYM.js.map +0 -1
- package/dist/chunk-FYFL4PFD.cjs +0 -69
- package/dist/chunk-FYFL4PFD.cjs.map +0 -1
- package/dist/chunk-ISUXPTLV.js.map +0 -1
- package/dist/chunk-JEDW76LI.cjs +0 -107
- package/dist/chunk-JEDW76LI.cjs.map +0 -1
- package/dist/chunk-MBOWSS4B.cjs.map +0 -1
- package/dist/chunk-XOMV26WS.js +0 -105
- package/dist/chunk-XOMV26WS.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../ContextMenu/index.tsx"],"names":["useState","useRef","useEffect","jsx","jsxs","RightOutlined","ReactDOM"],"mappings":"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","file":"chunk-ZUW3XLZQ.cjs","sourcesContent":["import React, { useState, useRef, useEffect, ReactNode, CSSProperties } from 'react';\nimport ReactDOM from 'react-dom';\nimport { RightOutlined } from '../src/icons';\nimport './index.less';\n\nexport interface ContextMenuItem {\n\t/** 菜单项唯一标识 */\n\tkey: string;\n\t/** 菜单项展示文本或节点 */\n\tlabel?: ReactNode;\n\t/** 菜单项前置图标 */\n\ticon?: ReactNode;\n\t/** 是否为分割线 */\n\ttype?: 'divider';\n\t/** 是否禁用 */\n\tdisabled?: boolean;\n\t/** 是否为警示/危险操作(红色显示) */\n\tdanger?: boolean;\n\t/** 快捷键提示(如 '⌘ C' / 'Ctrl+C') */\n\tshortcut?: string;\n\t/** 二级子菜单项列表 */\n\tchildren?: ContextMenuItem[];\n\t/** 点击菜单项回调 */\n\tonClick?: (item: ContextMenuItem, e: React.MouseEvent) => void;\n}\n\nexport interface ContextMenuProps {\n\t/** 菜单项列表配置 */\n\titems: ContextMenuItem[];\n\t/** 被右键激活的目标子组件/容器 */\n\tchildren: ReactNode;\n\t/** 是否禁用右键上下文菜单 */\n\tdisabled?: boolean;\n\t/** 菜单显隐状态改变回调 */\n\tonOpenChange?: (open: boolean) => void;\n\t/** 自定义菜单类名 */\n\tmenuClassName?: string;\n\t/** 自定义菜单样式 */\n\tmenuStyle?: CSSProperties;\n\t/** 自定义外层包裹类名 */\n\tclassName?: string;\n\t/** 自定义外层包裹样式 */\n\tstyle?: CSSProperties;\n}\n\ninterface Position {\n\tx: number;\n\ty: number;\n}\n\nconst ContextMenu: React.FC<ContextMenuProps> = ({\n\titems,\n\tchildren,\n\tdisabled = false,\n\tonOpenChange,\n\tmenuClassName = '',\n\tmenuStyle,\n\tclassName = '',\n\tstyle,\n}) => {\n\tconst [visible, setVisible] = useState<boolean>(false);\n\tconst [position, setPosition] = useState<Position>({ x: 0, y: 0 });\n\tconst menuRef = useRef<HTMLDivElement>(null);\n\n\tconst handleContextMenu = (e: React.MouseEvent) => {\n\t\tif (disabled) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst mouseX = e.clientX;\n\t\tconst mouseY = e.clientY;\n\n\t\t// 初始设置位置\n\t\tsetPosition({ x: mouseX, y: mouseY });\n\t\tsetVisible(true);\n\t\tonOpenChange?.(true);\n\t};\n\n\t// 菜单渲染后自适应调整边界,防止溢出视口\n\tuseEffect(() => {\n\t\tif (!visible || !menuRef.current) return;\n\t\tconst menuEl = menuRef.current;\n\t\tconst rect = menuEl.getBoundingClientRect();\n\n\t\tlet adjustedX = position.x;\n\t\tlet adjustedY = position.y;\n\n\t\t// 水平防溢出\n\t\tif (position.x + rect.width > window.innerWidth) {\n\t\t\tadjustedX = window.innerWidth - rect.width - 8;\n\t\t}\n\n\t\t// 垂直防溢出\n\t\tif (position.y + rect.height > window.innerHeight) {\n\t\t\tadjustedY = window.innerHeight - rect.height - 8;\n\t\t}\n\n\t\tif (adjustedX !== position.x || adjustedY !== position.y) {\n\t\t\tsetPosition({ x: Math.max(8, adjustedX), y: Math.max(8, adjustedY) });\n\t\t}\n\t}, [visible]);\n\n\t// 点击外部、按 ESC、页面滚动时关闭菜单\n\tuseEffect(() => {\n\t\tif (!visible) return;\n\n\t\tconst handleClose = (e: MouseEvent | KeyboardEvent) => {\n\t\t\tif (e instanceof KeyboardEvent && e.key !== 'Escape') return;\n\t\t\tsetVisible(false);\n\t\t\tonOpenChange?.(false);\n\t\t};\n\n\t\tconst handleScroll = () => {\n\t\t\tsetVisible(false);\n\t\t\tonOpenChange?.(false);\n\t\t};\n\n\t\tdocument.addEventListener('mousedown', handleClose);\n\t\tdocument.addEventListener('keydown', handleClose);\n\t\twindow.addEventListener('scroll', handleScroll, true);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousedown', handleClose);\n\t\t\tdocument.removeEventListener('keydown', handleClose);\n\t\t\twindow.removeEventListener('scroll', handleScroll, true);\n\t\t};\n\t}, [visible, onOpenChange]);\n\n\t// 渲染菜单项(递归支持二级子菜单)\n\tconst renderMenuItem = (item: ContextMenuItem) => {\n\t\tif (item.type === 'divider') {\n\t\t\treturn <div key={item.key} className=\"rpc_context_menu_divider\" />;\n\t\t}\n\n\t\tconst hasSub = item.children && item.children.length > 0;\n\n\t\tconst handleItemClick = (e: React.MouseEvent) => {\n\t\t\tif (item.disabled || hasSub) return;\n\t\t\te.stopPropagation();\n\t\t\titem.onClick?.(item, e);\n\t\t\tsetVisible(false);\n\t\t\tonOpenChange?.(false);\n\t\t};\n\n\t\tconst itemClassNames = [\n\t\t\t'rpc_context_menu_item',\n\t\t\titem.danger ? 'rpc_context_menu_item_danger' : '',\n\t\t\titem.disabled ? 'rpc_context_menu_item_disabled' : '',\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\n\t\treturn (\n\t\t\t<div key={item.key} className={itemClassNames} onClick={handleItemClick}>\n\t\t\t\t{item.icon && <span className=\"rpc_context_menu_item_icon\">{item.icon}</span>}\n\t\t\t\t<span className=\"rpc_context_menu_item_label\">{item.label}</span>\n\t\t\t\t{item.shortcut && <span className=\"rpc_context_menu_item_shortcut\">{item.shortcut}</span>}\n\t\t\t\t{hasSub && <RightOutlined className=\"rpc_context_menu_item_arrow\" />}\n\n\t\t\t\t{/* 二级子菜单 */}\n\t\t\t\t{hasSub && (\n\t\t\t\t\t<div className=\"rpc_context_menu_submenu\">\n\t\t\t\t\t\t{item.children!.map((sub) => renderMenuItem(sub))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst menuContent =\n\t\tvisible && typeof document !== 'undefined'\n\t\t\t? ReactDOM.createPortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={menuRef}\n\t\t\t\t\t\tclassName={`rpc_context_menu_panel ${menuClassName}`}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tleft: `${position.x}px`,\n\t\t\t\t\t\t\ttop: `${position.y}px`,\n\t\t\t\t\t\t\t...menuStyle,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonContextMenu={(e) => e.preventDefault()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{items.map((item) => renderMenuItem(item))}\n\t\t\t\t\t</div>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)\n\t\t\t: null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`rpc_context_menu ${className}`}\n\t\t\tstyle={style}\n\t\t\tonContextMenu={handleContextMenu}\n\t\t>\n\t\t\t{children}\n\t\t\t{menuContent}\n\t\t</div>\n\t);\n};\n\nexport default ContextMenu;\n"]}
|
|
1
|
+
{"version":3,"sources":["../ContextMenu/index.tsx"],"names":["useState","useRef","useEffect","jsx","jsxs","RightOutlined","ReactDOM"],"mappings":"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","file":"chunk-U2EBNBGK.cjs","sourcesContent":["import React, { useState, useRef, useEffect, ReactNode, CSSProperties } from 'react';\nimport ReactDOM from 'react-dom';\nimport { RightOutlined } from '../src/icons';\nimport './index.less';\n\nexport interface ContextMenuItem {\n\t/** 菜单项唯一标识 */\n\tkey: string;\n\t/** 菜单项展示文本或节点 */\n\tlabel?: ReactNode;\n\t/** 菜单项前置图标 */\n\ticon?: ReactNode;\n\t/** 是否为分割线 */\n\ttype?: 'divider';\n\t/** 是否禁用 */\n\tdisabled?: boolean;\n\t/** 是否为警示/危险操作(红色显示) */\n\tdanger?: boolean;\n\t/** 快捷键提示(如 '⌘ C' / 'Ctrl+C') */\n\tshortcut?: string;\n\t/** 二级子菜单项列表 */\n\tchildren?: ContextMenuItem[];\n\t/** 点击菜单项回调 */\n\tonClick?: (item: ContextMenuItem, e: React.MouseEvent) => void;\n}\n\nexport interface ContextMenuProps {\n\t/** 菜单项列表配置 */\n\titems: ContextMenuItem[];\n\t/** 被右键激活的目标子组件/容器 */\n\tchildren: ReactNode;\n\t/** 是否禁用右键上下文菜单 */\n\tdisabled?: boolean;\n\t/** 菜单显隐状态改变回调 */\n\tonOpenChange?: (open: boolean) => void;\n\t/** 自定义菜单类名 */\n\tmenuClassName?: string;\n\t/** 自定义菜单样式 */\n\tmenuStyle?: CSSProperties;\n\t/** 自定义外层包裹类名 */\n\tclassName?: string;\n\t/** 自定义外层包裹样式 */\n\tstyle?: CSSProperties;\n}\n\ninterface Position {\n\tx: number;\n\ty: number;\n}\n\nconst ContextMenu: React.FC<ContextMenuProps> = ({\n\titems,\n\tchildren,\n\tdisabled = false,\n\tonOpenChange,\n\tmenuClassName = '',\n\tmenuStyle,\n\tclassName = '',\n\tstyle,\n}) => {\n\tconst [visible, setVisible] = useState<boolean>(false);\n\tconst [position, setPosition] = useState<Position>({ x: 0, y: 0 });\n\tconst menuRef = useRef<HTMLDivElement>(null);\n\n\tconst handleContextMenu = (e: React.MouseEvent) => {\n\t\tif (disabled) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst mouseX = e.clientX;\n\t\tconst mouseY = e.clientY;\n\n\t\t// 初始设置位置\n\t\tsetPosition({ x: mouseX, y: mouseY });\n\t\tsetVisible(true);\n\t\tonOpenChange?.(true);\n\t};\n\n\t// 菜单渲染后自适应调整边界,防止溢出视口\n\tuseEffect(() => {\n\t\tif (!visible || !menuRef.current) return;\n\t\tconst menuEl = menuRef.current;\n\t\tconst rect = menuEl.getBoundingClientRect();\n\n\t\tlet adjustedX = position.x;\n\t\tlet adjustedY = position.y;\n\n\t\t// 水平防溢出\n\t\tif (position.x + rect.width > window.innerWidth) {\n\t\t\tadjustedX = window.innerWidth - rect.width - 8;\n\t\t}\n\n\t\t// 垂直防溢出\n\t\tif (position.y + rect.height > window.innerHeight) {\n\t\t\tadjustedY = window.innerHeight - rect.height - 8;\n\t\t}\n\n\t\tif (adjustedX !== position.x || adjustedY !== position.y) {\n\t\t\tsetPosition({ x: Math.max(8, adjustedX), y: Math.max(8, adjustedY) });\n\t\t}\n\t}, [visible]);\n\n\t// 点击外部、按 ESC、页面滚动时关闭菜单\n\tuseEffect(() => {\n\t\tif (!visible) return;\n\n\t\tconst handleClose = (e: MouseEvent | KeyboardEvent) => {\n\t\t\tif (e instanceof KeyboardEvent && e.key !== 'Escape') return;\n\t\t\tsetVisible(false);\n\t\t\tonOpenChange?.(false);\n\t\t};\n\n\t\tconst handleScroll = () => {\n\t\t\tsetVisible(false);\n\t\t\tonOpenChange?.(false);\n\t\t};\n\n\t\tdocument.addEventListener('mousedown', handleClose);\n\t\tdocument.addEventListener('keydown', handleClose);\n\t\twindow.addEventListener('scroll', handleScroll, true);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousedown', handleClose);\n\t\t\tdocument.removeEventListener('keydown', handleClose);\n\t\t\twindow.removeEventListener('scroll', handleScroll, true);\n\t\t};\n\t}, [visible, onOpenChange]);\n\n\t// 渲染菜单项(递归支持二级子菜单)\n\tconst renderMenuItem = (item: ContextMenuItem) => {\n\t\tif (item.type === 'divider') {\n\t\t\treturn <div key={item.key} className=\"rpc_context_menu_divider\" />;\n\t\t}\n\n\t\tconst hasSub = item.children && item.children.length > 0;\n\n\t\tconst handleItemClick = (e: React.MouseEvent) => {\n\t\t\tif (item.disabled || hasSub) return;\n\t\t\te.stopPropagation();\n\t\t\titem.onClick?.(item, e);\n\t\t\tsetVisible(false);\n\t\t\tonOpenChange?.(false);\n\t\t};\n\n\t\tconst itemClassNames = [\n\t\t\t'rpc_context_menu_item',\n\t\t\titem.danger ? 'rpc_context_menu_item_danger' : '',\n\t\t\titem.disabled ? 'rpc_context_menu_item_disabled' : '',\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\n\t\treturn (\n\t\t\t<div key={item.key} className={itemClassNames} onClick={handleItemClick}>\n\t\t\t\t{item.icon && <span className=\"rpc_context_menu_item_icon\">{item.icon}</span>}\n\t\t\t\t<span className=\"rpc_context_menu_item_label\">{item.label}</span>\n\t\t\t\t{item.shortcut && <span className=\"rpc_context_menu_item_shortcut\">{item.shortcut}</span>}\n\t\t\t\t{hasSub && <RightOutlined className=\"rpc_context_menu_item_arrow\" />}\n\n\t\t\t\t{/* 二级子菜单 */}\n\t\t\t\t{hasSub && (\n\t\t\t\t\t<div className=\"rpc_context_menu_submenu\">\n\t\t\t\t\t\t{item.children!.map((sub) => renderMenuItem(sub))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst menuContent =\n\t\tvisible && typeof document !== 'undefined'\n\t\t\t? ReactDOM.createPortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={menuRef}\n\t\t\t\t\t\tclassName={`rpc_context_menu_panel ${menuClassName}`}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tleft: `${position.x}px`,\n\t\t\t\t\t\t\ttop: `${position.y}px`,\n\t\t\t\t\t\t\t...menuStyle,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonContextMenu={(e) => e.preventDefault()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{items.map((item) => renderMenuItem(item))}\n\t\t\t\t\t</div>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)\n\t\t\t: null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`rpc_context_menu ${className}`}\n\t\t\tstyle={style}\n\t\t\tonContextMenu={handleContextMenu}\n\t\t>\n\t\t\t{children}\n\t\t\t{menuContent}\n\t\t</div>\n\t);\n};\n\nexport default ContextMenu;\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkR4V3EJVP_cjs = require('./chunk-R4V3EJVP.cjs');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
|
|
@@ -76,8 +76,8 @@ var CopyButton = ({
|
|
|
76
76
|
onError == null ? void 0 : onError(err);
|
|
77
77
|
}
|
|
78
78
|
};
|
|
79
|
-
const defaultIcon = icon != null ? icon : /* @__PURE__ */ jsxRuntime.jsx(
|
|
80
|
-
const defaultCopiedIcon = copiedIcon != null ? copiedIcon : /* @__PURE__ */ jsxRuntime.jsx(
|
|
79
|
+
const defaultIcon = icon != null ? icon : /* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.CopyOutlined, {});
|
|
80
|
+
const defaultCopiedIcon = copiedIcon != null ? copiedIcon : /* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.CheckOutlined, { style: { color: "#52c41a" } });
|
|
81
81
|
const currentIcon = isCopied ? defaultCopiedIcon : defaultIcon;
|
|
82
82
|
const currentText = isCopied ? (_a = copiedText != null ? copiedText : children) != null ? _a : "\u5DF2\u590D\u5236" : children != null ? children : mode === "button" ? "\u590D\u5236" : null;
|
|
83
83
|
let tooltipContent = null;
|
|
@@ -123,5 +123,5 @@ var CopyButton = ({
|
|
|
123
123
|
var CopyButton_default = CopyButton;
|
|
124
124
|
|
|
125
125
|
exports.CopyButton_default = CopyButton_default;
|
|
126
|
-
//# sourceMappingURL=chunk-
|
|
127
|
-
//# sourceMappingURL=chunk-
|
|
126
|
+
//# sourceMappingURL=chunk-UAUP5TJK.cjs.map
|
|
127
|
+
//# sourceMappingURL=chunk-UAUP5TJK.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../CopyButton/index.tsx"],"names":["useState","useRef","useEffect","jsx","CopyOutlined","CheckOutlined","jsxs"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../CopyButton/index.tsx"],"names":["useState","useRef","useEffect","jsx","CopyOutlined","CheckOutlined","jsxs"],"mappings":"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","file":"chunk-UAUP5TJK.cjs","sourcesContent":["import React, { useState, useRef, useEffect, ReactNode, CSSProperties } from 'react';\nimport { CopyOutlined, CheckOutlined } from '../src/icons';\nimport './index.less';\n\nexport interface CopyButtonProps {\n\t/** 要复制的目标文本 */\n\ttext?: string;\n\t/** 动态获取要复制的目标文本(支持异步) */\n\tgetText?: () => string | Promise<string>;\n\t/** 复制按钮的展示形态:button 按钮形态、icon 纯图标、inline 行内文本 */\n\tmode?: 'button' | 'icon' | 'inline';\n\t/** 按钮类型(仅在 mode='button' 时有效) */\n\ttype?: 'default' | 'primary';\n\t/** 默认图标 */\n\ticon?: ReactNode;\n\t/** 复制成功后的图标 */\n\tcopiedIcon?: ReactNode;\n\t/** 复制成功后展示的文本 */\n\tcopiedText?: ReactNode;\n\t/** 默认展示的子内容/按钮文案 */\n\tchildren?: ReactNode;\n\t/** 复制成功提示的 Tooltip 配置(传 false 禁用,传字符串/ReactNode 自定义文案,传 true 使用默认'复制成功') */\n\ttooltip?: boolean | ReactNode;\n\t/** 复制成功后的高亮展示持续时间(毫秒),默认 2000ms */\n\tduration?: number;\n\t/** 是否禁用 */\n\tdisabled?: boolean;\n\t/** 成功复制回调 */\n\tonCopy?: (text: string) => void;\n\t/** 复制失败回调 */\n\tonError?: (error: unknown) => void;\n\t/** 自定义类名 */\n\tclassName?: string;\n\t/** 自定义样式 */\n\tstyle?: CSSProperties;\n}\n\n/** 浏览器剪贴板复制降级方案 */\nasync function copyToClipboard(content: string): Promise<void> {\n\tif (navigator.clipboard && window.isSecureContext) {\n\t\tawait navigator.clipboard.writeText(content);\n\t\treturn;\n\t}\n\n\tconst textArea = document.createElement('textarea');\n\ttextArea.value = content;\n\ttextArea.style.position = 'fixed';\n\ttextArea.style.left = '-999999px';\n\ttextArea.style.top = '-999999px';\n\tdocument.body.appendChild(textArea);\n\ttextArea.focus();\n\ttextArea.select();\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst successful = document.execCommand('copy');\n\t\ttextArea.remove();\n\t\tif (successful) {\n\t\t\tresolve();\n\t\t} else {\n\t\t\treject(new Error('复制失败'));\n\t\t}\n\t});\n}\n\nconst CopyButton: React.FC<CopyButtonProps> = ({\n\ttext,\n\tgetText,\n\tmode = 'button',\n\ttype = 'default',\n\ticon,\n\tcopiedIcon,\n\tcopiedText,\n\tchildren,\n\ttooltip = true,\n\tduration = 2000,\n\tdisabled = false,\n\tonCopy,\n\tonError,\n\tclassName = '',\n\tstyle,\n}) => {\n\tconst [isCopied, setIsCopied] = useState<boolean>(false);\n\tconst [isHovered, setIsHovered] = useState<boolean>(false);\n\tconst timerRef = useRef<number | null>(null);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (timerRef.current) {\n\t\t\t\twindow.clearTimeout(timerRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst handleCopy = async (e: React.MouseEvent) => {\n\t\te.stopPropagation();\n\t\tif (disabled) return;\n\n\t\ttry {\n\t\t\tlet targetText = text || '';\n\t\t\tif (getText) {\n\t\t\t\ttargetText = await getText();\n\t\t\t}\n\n\t\t\tawait copyToClipboard(targetText);\n\t\t\tsetIsCopied(true);\n\t\t\tonCopy?.(targetText);\n\n\t\t\tif (timerRef.current) {\n\t\t\t\twindow.clearTimeout(timerRef.current);\n\t\t\t}\n\t\t\ttimerRef.current = window.setTimeout(() => {\n\t\t\t\tsetIsCopied(false);\n\t\t\t}, duration);\n\t\t} catch (err) {\n\t\t\tonError?.(err);\n\t\t}\n\t};\n\n\tconst defaultIcon = icon ?? <CopyOutlined />;\n\tconst defaultCopiedIcon = copiedIcon ?? <CheckOutlined style={{ color: '#52c41a' }} />;\n\n\t// 计算展示的图标与文案\n\tconst currentIcon = isCopied ? defaultCopiedIcon : defaultIcon;\n\tconst currentText = isCopied\n\t\t? (copiedText ?? children ?? '已复制')\n\t\t: (children ?? (mode === 'button' ? '复制' : null));\n\n\t// Tooltip 提示文本计算\n\tlet tooltipContent: ReactNode = null;\n\tif (tooltip) {\n\t\tif (isCopied) {\n\t\t\ttooltipContent = typeof tooltip === 'boolean' ? '复制成功!' : tooltip;\n\t\t} else if (mode === 'icon') {\n\t\t\ttooltipContent = '点击复制';\n\t\t}\n\t}\n\n\tconst classNames = [\n\t\t'rpc_copy_button',\n\t\t`rpc_copy_button_${mode}`,\n\t\ttype === 'primary' && mode === 'button' ? 'rpc_copy_button_primary' : '',\n\t\tisCopied ? 'rpc_copy_button_copied' : '',\n\t\tdisabled ? 'rpc_copy_button_disabled' : '',\n\t\tclassName,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(' ');\n\n\treturn (\n\t\t<div\n\t\t\tclassName={classNames}\n\t\t\tstyle={style}\n\t\t\tonClick={handleCopy}\n\t\t\tonMouseEnter={() => setIsHovered(true)}\n\t\t\tonMouseLeave={() => setIsHovered(false)}\n\t\t\trole=\"button\"\n\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t>\n\t\t\t<span className=\"rpc_copy_button_icon_wrap\">{currentIcon}</span>\n\t\t\t{currentText && <span>{currentText}</span>}\n\n\t\t\t{tooltip && tooltipContent && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={`rpc_copy_button_tooltip ${\n\t\t\t\t\t\tisCopied\n\t\t\t\t\t\t\t? 'rpc_copy_button_tooltip_visible'\n\t\t\t\t\t\t\t: isHovered\n\t\t\t\t\t\t\t\t? 'rpc_copy_button_tooltip_hover'\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}`}\n\t\t\t\t>\n\t\t\t\t\t{tooltipContent}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nexport default CopyButton;\n"]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// CeilingBox/index.tsx
|
|
7
|
+
var CeilingBox = ({
|
|
8
|
+
children,
|
|
9
|
+
offsetTop = 0,
|
|
10
|
+
offsetBottom,
|
|
11
|
+
target,
|
|
12
|
+
onChange,
|
|
13
|
+
blur = true,
|
|
14
|
+
zIndex = 1e3,
|
|
15
|
+
className = "",
|
|
16
|
+
style,
|
|
17
|
+
affixedClassName = "",
|
|
18
|
+
affixedStyle
|
|
19
|
+
}) => {
|
|
20
|
+
const [isAffixed, setIsAffixed] = react.useState(false);
|
|
21
|
+
const [boxRect, setBoxRect] = react.useState({ width: 0, height: 0 });
|
|
22
|
+
const placeholderRef = react.useRef(null);
|
|
23
|
+
const contentRef = react.useRef(null);
|
|
24
|
+
const isAffixedRef = react.useRef(false);
|
|
25
|
+
isAffixedRef.current = isAffixed;
|
|
26
|
+
react.useEffect(() => {
|
|
27
|
+
const getTargetElement = () => {
|
|
28
|
+
if (target) {
|
|
29
|
+
const el = target();
|
|
30
|
+
if (el) return el;
|
|
31
|
+
}
|
|
32
|
+
return window;
|
|
33
|
+
};
|
|
34
|
+
const handleScroll = () => {
|
|
35
|
+
if (!placeholderRef.current) return;
|
|
36
|
+
const targetEl = getTargetElement();
|
|
37
|
+
const placeholderRect = placeholderRef.current.getBoundingClientRect();
|
|
38
|
+
let targetTop = 0;
|
|
39
|
+
let targetBottom = window.innerHeight;
|
|
40
|
+
if (targetEl !== window && targetEl instanceof HTMLElement) {
|
|
41
|
+
const containerRect = targetEl.getBoundingClientRect();
|
|
42
|
+
targetTop = containerRect.top;
|
|
43
|
+
targetBottom = containerRect.bottom;
|
|
44
|
+
}
|
|
45
|
+
let shouldAffix = false;
|
|
46
|
+
if (offsetBottom !== void 0) {
|
|
47
|
+
shouldAffix = placeholderRect.bottom >= targetBottom - offsetBottom;
|
|
48
|
+
} else {
|
|
49
|
+
shouldAffix = placeholderRect.top <= targetTop + offsetTop;
|
|
50
|
+
}
|
|
51
|
+
if (shouldAffix !== isAffixedRef.current) {
|
|
52
|
+
if (shouldAffix && contentRef.current) {
|
|
53
|
+
const rect = contentRef.current.getBoundingClientRect();
|
|
54
|
+
setBoxRect({ width: rect.width, height: rect.height });
|
|
55
|
+
}
|
|
56
|
+
setIsAffixed(shouldAffix);
|
|
57
|
+
onChange == null ? void 0 : onChange(shouldAffix);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const targetNode = getTargetElement();
|
|
61
|
+
targetNode.addEventListener("scroll", handleScroll, { passive: true });
|
|
62
|
+
window.addEventListener("resize", handleScroll, { passive: true });
|
|
63
|
+
handleScroll();
|
|
64
|
+
return () => {
|
|
65
|
+
targetNode.removeEventListener("scroll", handleScroll);
|
|
66
|
+
window.removeEventListener("resize", handleScroll);
|
|
67
|
+
};
|
|
68
|
+
}, [offsetTop, offsetBottom, target, onChange]);
|
|
69
|
+
const computeFixedStyle = () => {
|
|
70
|
+
if (!isAffixed) return {};
|
|
71
|
+
const fixedStyle = {
|
|
72
|
+
position: "fixed",
|
|
73
|
+
zIndex,
|
|
74
|
+
width: boxRect.width ? `${boxRect.width}px` : "100%",
|
|
75
|
+
boxSizing: "border-box"
|
|
76
|
+
};
|
|
77
|
+
if (offsetBottom !== void 0) {
|
|
78
|
+
fixedStyle.bottom = `${offsetBottom}px`;
|
|
79
|
+
} else {
|
|
80
|
+
fixedStyle.top = `${offsetTop}px`;
|
|
81
|
+
}
|
|
82
|
+
if (placeholderRef.current) {
|
|
83
|
+
const rect = placeholderRef.current.getBoundingClientRect();
|
|
84
|
+
fixedStyle.left = `${rect.left}px`;
|
|
85
|
+
}
|
|
86
|
+
return fixedStyle;
|
|
87
|
+
};
|
|
88
|
+
const renderedContent = typeof children === "function" ? children(isAffixed) : children;
|
|
89
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
90
|
+
"div",
|
|
91
|
+
{
|
|
92
|
+
ref: placeholderRef,
|
|
93
|
+
className: `rpc_ceiling_box_wrapper ${className}`,
|
|
94
|
+
style: {
|
|
95
|
+
...style,
|
|
96
|
+
height: isAffixed && boxRect.height ? `${boxRect.height}px` : void 0
|
|
97
|
+
},
|
|
98
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
99
|
+
"div",
|
|
100
|
+
{
|
|
101
|
+
ref: contentRef,
|
|
102
|
+
className: `rpc_ceiling_box ${isAffixed ? "rpc_ceiling_box_affixed" : ""} ${isAffixed && blur ? "rpc_ceiling_box_blur" : ""} ${isAffixed ? affixedClassName : ""}`,
|
|
103
|
+
style: {
|
|
104
|
+
...computeFixedStyle(),
|
|
105
|
+
...isAffixed ? affixedStyle : {}
|
|
106
|
+
},
|
|
107
|
+
children: renderedContent
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
};
|
|
113
|
+
var CeilingBox_default = CeilingBox;
|
|
114
|
+
|
|
115
|
+
exports.CeilingBox_default = CeilingBox_default;
|
|
116
|
+
//# sourceMappingURL=chunk-UIU6VCEQ.cjs.map
|
|
117
|
+
//# sourceMappingURL=chunk-UIU6VCEQ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../CeilingBox/index.tsx"],"names":["useState","useRef","useEffect","jsx"],"mappings":"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","file":"chunk-UIU6VCEQ.cjs","sourcesContent":["import React, {\n\tuseState,\n\tuseEffect,\n\tuseRef,\n\tReactNode,\n\tCSSProperties,\n} from 'react';\nimport './index.less';\n\nexport interface CeilingBoxProps {\n\t/** 子元素内容,支持普通 ReactNode 或 Render Props 函数接收 isAffixed 状态 */\n\tchildren: ReactNode | ((isAffixed: boolean) => ReactNode);\n\t/** 距离视口/容器顶部的吸顶偏移距离(像素),默认为 0 */\n\toffsetTop?: number;\n\t/** 距离视口/容器底部的吸底偏移距离(像素,传值时开启吸底模式) */\n\toffsetBottom?: number;\n\t/** 监听滚动的目标 DOM 容器,不传时默认监听 window 全局滚动 */\n\ttarget?: () => HTMLElement | Window | null;\n\t/** 吸顶/吸底状态改变时的回调函数 */\n\tonChange?: (isAffixed: boolean) => void;\n\t/** 吸顶时是否自动启用毛玻璃磨砂与精致阴影滤镜,默认为 true */\n\tblur?: boolean;\n\t/** 吸顶/吸底状态下的图层层级 z-index,默认为 1000 */\n\tzIndex?: number;\n\t/** 自定义类名 */\n\tclassName?: string;\n\t/** 自定义行内样式 */\n\tstyle?: CSSProperties;\n\t/** 吸顶激活状态下追加的自定义类名 */\n\taffixedClassName?: string;\n\t/** 吸顶激活状态下追加的自定义行内样式 */\n\taffixedStyle?: CSSProperties;\n}\n\nconst CeilingBox: React.FC<CeilingBoxProps> = ({\n\tchildren,\n\toffsetTop = 0,\n\toffsetBottom,\n\ttarget,\n\tonChange,\n\tblur = true,\n\tzIndex = 1000,\n\tclassName = '',\n\tstyle,\n\taffixedClassName = '',\n\taffixedStyle,\n}) => {\n\tconst [isAffixed, setIsAffixed] = useState<boolean>(false);\n\tconst [boxRect, setBoxRect] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n\n\tconst placeholderRef = useRef<HTMLDivElement>(null);\n\tconst contentRef = useRef<HTMLDivElement>(null);\n\tconst isAffixedRef = useRef<boolean>(false);\n\n\tisAffixedRef.current = isAffixed;\n\n\tuseEffect(() => {\n\t\tconst getTargetElement = (): HTMLElement | Window => {\n\t\t\tif (target) {\n\t\t\t\tconst el = target();\n\t\t\t\tif (el) return el;\n\t\t\t}\n\t\t\treturn window;\n\t\t};\n\n\t\tconst handleScroll = () => {\n\t\t\tif (!placeholderRef.current) return;\n\n\t\t\tconst targetEl = getTargetElement();\n\t\t\tconst placeholderRect = placeholderRef.current.getBoundingClientRect();\n\n\t\t\tlet targetTop = 0;\n\t\t\tlet targetBottom = window.innerHeight;\n\n\t\t\tif (targetEl !== window && targetEl instanceof HTMLElement) {\n\t\t\t\tconst containerRect = targetEl.getBoundingClientRect();\n\t\t\t\ttargetTop = containerRect.top;\n\t\t\t\ttargetBottom = containerRect.bottom;\n\t\t\t}\n\n\t\t\tlet shouldAffix = false;\n\n\t\t\tif (offsetBottom !== undefined) {\n\t\t\t\t// 吸底模式\n\t\t\t\tshouldAffix = placeholderRect.bottom >= targetBottom - offsetBottom;\n\t\t\t} else {\n\t\t\t\t// 吸顶模式 (默认)\n\t\t\t\tshouldAffix = placeholderRect.top <= targetTop + offsetTop;\n\t\t\t}\n\n\t\t\tif (shouldAffix !== isAffixedRef.current) {\n\t\t\t\t// 触发吸顶切换前记录原本的宽高\n\t\t\t\tif (shouldAffix && contentRef.current) {\n\t\t\t\t\tconst rect = contentRef.current.getBoundingClientRect();\n\t\t\t\t\tsetBoxRect({ width: rect.width, height: rect.height });\n\t\t\t\t}\n\n\t\t\t\tsetIsAffixed(shouldAffix);\n\t\t\t\tonChange?.(shouldAffix);\n\t\t\t}\n\t\t};\n\n\t\tconst targetNode = getTargetElement();\n\t\ttargetNode.addEventListener('scroll', handleScroll, { passive: true });\n\t\twindow.addEventListener('resize', handleScroll, { passive: true });\n\n\t\t// 初始检查一次\n\t\thandleScroll();\n\n\t\treturn () => {\n\t\t\ttargetNode.removeEventListener('scroll', handleScroll);\n\t\t\twindow.removeEventListener('resize', handleScroll);\n\t\t};\n\t}, [offsetTop, offsetBottom, target, onChange]);\n\n\t// 计算吸顶定位样式\n\tconst computeFixedStyle = (): CSSProperties => {\n\t\tif (!isAffixed) return {};\n\n\t\tconst fixedStyle: CSSProperties = {\n\t\t\tposition: 'fixed',\n\t\t\tzIndex,\n\t\t\twidth: boxRect.width ? `${boxRect.width}px` : '100%',\n\t\t\tboxSizing: 'border-box',\n\t\t};\n\n\t\tif (offsetBottom !== undefined) {\n\t\t\tfixedStyle.bottom = `${offsetBottom}px`;\n\t\t} else {\n\t\t\tfixedStyle.top = `${offsetTop}px`;\n\t\t}\n\n\t\tif (placeholderRef.current) {\n\t\t\tconst rect = placeholderRef.current.getBoundingClientRect();\n\t\t\tfixedStyle.left = `${rect.left}px`;\n\t\t}\n\n\t\treturn fixedStyle;\n\t};\n\n\tconst renderedContent =\n\t\ttypeof children === 'function' ? children(isAffixed) : children;\n\n\treturn (\n\t\t<div\n\t\t\tref={placeholderRef}\n\t\t\tclassName={`rpc_ceiling_box_wrapper ${className}`}\n\t\t\tstyle={{\n\t\t\t\t...style,\n\t\t\t\theight: isAffixed && boxRect.height ? `${boxRect.height}px` : undefined,\n\t\t\t}}\n\t\t>\n\t\t\t<div\n\t\t\t\tref={contentRef}\n\t\t\t\tclassName={`rpc_ceiling_box ${\n\t\t\t\t\tisAffixed ? 'rpc_ceiling_box_affixed' : ''\n\t\t\t\t} ${isAffixed && blur ? 'rpc_ceiling_box_blur' : ''} ${\n\t\t\t\t\tisAffixed ? affixedClassName : ''\n\t\t\t\t}`}\n\t\t\t\tstyle={{\n\t\t\t\t\t...computeFixedStyle(),\n\t\t\t\t\t...(isAffixed ? affixedStyle : {}),\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{renderedContent}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default CeilingBox;\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkR4V3EJVP_cjs = require('./chunk-R4V3EJVP.cjs');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
|
|
@@ -44,7 +44,7 @@ var InfiniteScrollList = ({
|
|
|
44
44
|
return () => observer.disconnect();
|
|
45
45
|
}, [height, scrollableTarget, threshold, handleLoadMore]);
|
|
46
46
|
const defaultLoadingIndicator = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rpc_infinite_scroll_list_footer", children: [
|
|
47
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
47
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.LoadingOutlined, { style: { fontSize: 16, color: "#1677ff" } }),
|
|
48
48
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u6B63\u5728\u52A0\u8F7D\u66F4\u591A\u6570\u636E..." })
|
|
49
49
|
] });
|
|
50
50
|
const isLocalScroll = Boolean(height);
|
|
@@ -69,5 +69,5 @@ var InfiniteScrollList = ({
|
|
|
69
69
|
var InfiniteScrollList_default = InfiniteScrollList;
|
|
70
70
|
|
|
71
71
|
exports.InfiniteScrollList_default = InfiniteScrollList_default;
|
|
72
|
-
//# sourceMappingURL=chunk-
|
|
73
|
-
//# sourceMappingURL=chunk-
|
|
72
|
+
//# sourceMappingURL=chunk-UZB7GOEI.cjs.map
|
|
73
|
+
//# sourceMappingURL=chunk-UZB7GOEI.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../InfiniteScrollList/index.tsx"],"names":["useRef","useCallback","useEffect","jsxs","jsx","LoadingOutlined"],"mappings":";;;;;;AA6BA,IAAM,qBAAwD,CAAC;AAAA,EAC9D,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,UAAA,GAAa,kCAAA;AAAA,EACb,gBAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ;AACD,CAAA,KAAM;AACL,EAAA,MAAM,YAAA,GAAeA,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,WAAA,GAAcA,aAAuB,IAAI,CAAA;AAE/C,EAAA,MAAM,cAAA,GAAiBC,kBAAY,MAAM;AACxC,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACxB,MAAA,UAAA,EAAW;AAAA,IACZ;AAAA,EACD,CAAA,EAAG,CAAC,OAAA,EAAS,OAAA,EAAS,UAAU,CAAC,CAAA;AAGjC,EAAAC,eAAA,CAAU,MAAM;AACf,IAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,QAAA,GACL,OAAO,gBAAA,KAAqB,UAAA,GACzB,kBAAiB,GACjB,gBAAA,KAAqB,MAAA,GAAS,YAAA,CAAa,OAAA,GAAU,IAAA,CAAA;AAEzD,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACpB,CAAC,CAAC,KAAK,CAAA,KAAM;AACZ,QAAA,IAAI,MAAM,cAAA,EAAgB;AACzB,UAAA,cAAA,EAAe;AAAA,QAChB;AAAA,MACD,CAAA;AAAA,MACA;AAAA,QACC,MAAM,QAAA,IAAY,IAAA;AAAA,QAClB,UAAA,EAAY,WAAW,SAAS,CAAA,MAAA,CAAA;AAAA,QAChC,SAAA,EAAW;AAAA;AACZ,KACD;AAEA,IAAA,QAAA,CAAS,QAAQ,QAAQ,CAAA;AACzB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EAClC,GAAG,CAAC,MAAA,EAAQ,gBAAA,EAAkB,SAAA,EAAW,cAAc,CAAC,CAAA;AAExD,EAAA,MAAM,uBAAA,mBACLC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACd,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,qCAAgB,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,KAAA,EAAO,WAAU,EAAG,CAAA;AAAA,oBAC5DD,cAAA,CAAC,UAAK,QAAA,EAAA,qDAAA,EAAW;AAAA,GAAA,EAClB,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAM,CAAA;AAEpC,EAAA,uBACCD,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,YAAA;AAAA,MACL,WAAW,CAAA,yBAAA,EACV,aAAA,GAAgB,oCAAA,GAAuC,EACxD,IAAI,SAAS,CAAA,CAAA;AAAA,MACb,KAAA,EAAO;AAAA,QACN,MAAA;AAAA,QACA,GAAG;AAAA,OACJ;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBAGDC,cAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE,EAAG,CAAA;AAAA,QAGnE,YAAY,gBAAA,IAAoB,uBAAA,CAAA;AAAA,QAChC,CAAC,OAAA,IAAW,UAAA,mCACX,KAAA,EAAA,EAAI,SAAA,EAAU,gEACb,QAAA,EAAA,UAAA,EACF;AAAA;AAAA;AAAA,GAEF;AAEF,CAAA;AAEA,IAAO,0BAAA,GAAQ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../InfiniteScrollList/index.tsx"],"names":["useRef","useCallback","useEffect","jsxs","jsx","LoadingOutlined"],"mappings":";;;;;;AA6BA,IAAM,qBAAwD,CAAC;AAAA,EAC9D,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,UAAA,GAAa,kCAAA;AAAA,EACb,gBAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ;AACD,CAAA,KAAM;AACL,EAAA,MAAM,YAAA,GAAeA,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,WAAA,GAAcA,aAAuB,IAAI,CAAA;AAE/C,EAAA,MAAM,cAAA,GAAiBC,kBAAY,MAAM;AACxC,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACxB,MAAA,UAAA,EAAW;AAAA,IACZ;AAAA,EACD,CAAA,EAAG,CAAC,OAAA,EAAS,OAAA,EAAS,UAAU,CAAC,CAAA;AAGjC,EAAAC,eAAA,CAAU,MAAM;AACf,IAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,QAAA,GACL,OAAO,gBAAA,KAAqB,UAAA,GACzB,kBAAiB,GACjB,gBAAA,KAAqB,MAAA,GAAS,YAAA,CAAa,OAAA,GAAU,IAAA,CAAA;AAEzD,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACpB,CAAC,CAAC,KAAK,CAAA,KAAM;AACZ,QAAA,IAAI,MAAM,cAAA,EAAgB;AACzB,UAAA,cAAA,EAAe;AAAA,QAChB;AAAA,MACD,CAAA;AAAA,MACA;AAAA,QACC,MAAM,QAAA,IAAY,IAAA;AAAA,QAClB,UAAA,EAAY,WAAW,SAAS,CAAA,MAAA,CAAA;AAAA,QAChC,SAAA,EAAW;AAAA;AACZ,KACD;AAEA,IAAA,QAAA,CAAS,QAAQ,QAAQ,CAAA;AACzB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EAClC,GAAG,CAAC,MAAA,EAAQ,gBAAA,EAAkB,SAAA,EAAW,cAAc,CAAC,CAAA;AAExD,EAAA,MAAM,uBAAA,mBACLC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACd,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,qCAAgB,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,KAAA,EAAO,WAAU,EAAG,CAAA;AAAA,oBAC5DD,cAAA,CAAC,UAAK,QAAA,EAAA,qDAAA,EAAW;AAAA,GAAA,EAClB,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAM,CAAA;AAEpC,EAAA,uBACCD,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,YAAA;AAAA,MACL,WAAW,CAAA,yBAAA,EACV,aAAA,GAAgB,oCAAA,GAAuC,EACxD,IAAI,SAAS,CAAA,CAAA;AAAA,MACb,KAAA,EAAO;AAAA,QACN,MAAA;AAAA,QACA,GAAG;AAAA,OACJ;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBAGDC,cAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE,EAAG,CAAA;AAAA,QAGnE,YAAY,gBAAA,IAAoB,uBAAA,CAAA;AAAA,QAChC,CAAC,OAAA,IAAW,UAAA,mCACX,KAAA,EAAA,EAAI,SAAA,EAAU,gEACb,QAAA,EAAA,UAAA,EACF;AAAA;AAAA;AAAA,GAEF;AAEF,CAAA;AAEA,IAAO,0BAAA,GAAQ","file":"chunk-UZB7GOEI.cjs","sourcesContent":["import React, { useRef, useEffect, useCallback, ReactNode, CSSProperties } from 'react';\nimport { LoadingOutlined } from '../src/icons';\nimport './index.less';\n\nexport interface InfiniteScrollListProps {\n\t/** 列表项子内容 */\n\tchildren: ReactNode;\n\t/** 是否还有更多数据可供加载 */\n\thasMore: boolean;\n\t/** 当前是否正在加载下一页 */\n\tloading: boolean;\n\t/** 触底加载下一页回调 */\n\tonLoadMore: () => void | Promise<void>;\n\t/** 触发加载的触底距离阈值(像素),默认为 40 */\n\tthreshold?: number;\n\t/** 没有更多数据时的底部提示内容,默认为 '已经到底啦 ~' */\n\tendMessage?: ReactNode;\n\t/** 加载中指示器组件,默认为 Spin 图标与 '正在加载更多...' */\n\tloadingIndicator?: ReactNode;\n\t/** 容器固定高度(传值时为局部滚动容器,不传时监听 window 全局滚动) */\n\theight?: number | string;\n\t/** 滚动容器 ref 或自定义对象 */\n\tscrollableTarget?: HTMLElement | (() => HTMLElement | null) | null;\n\t/** 自定义类名 */\n\tclassName?: string;\n\t/** 自定义样式 */\n\tstyle?: CSSProperties;\n}\n\nconst InfiniteScrollList: React.FC<InfiniteScrollListProps> = ({\n\tchildren,\n\thasMore,\n\tloading,\n\tonLoadMore,\n\tthreshold = 40,\n\tendMessage = '已经到底啦 ~',\n\tloadingIndicator,\n\theight,\n\tscrollableTarget,\n\tclassName = '',\n\tstyle,\n}) => {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst sentinelRef = useRef<HTMLDivElement>(null);\n\n\tconst handleLoadMore = useCallback(() => {\n\t\tif (!loading && hasMore) {\n\t\t\tonLoadMore();\n\t\t}\n\t}, [loading, hasMore, onLoadMore]);\n\n\t// 使用 IntersectionObserver 监听底部哨兵元素\n\tuseEffect(() => {\n\t\tconst sentinel = sentinelRef.current;\n\t\tif (!sentinel) return;\n\n\t\tconst targetEl =\n\t\t\ttypeof scrollableTarget === 'function'\n\t\t\t\t? scrollableTarget()\n\t\t\t\t: scrollableTarget || (height ? containerRef.current : null);\n\n\t\tconst observer = new IntersectionObserver(\n\t\t\t([entry]) => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\thandleLoadMore();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\troot: targetEl || null,\n\t\t\t\trootMargin: `0px 0px ${threshold}px 0px`,\n\t\t\t\tthreshold: 0,\n\t\t\t},\n\t\t);\n\n\t\tobserver.observe(sentinel);\n\t\treturn () => observer.disconnect();\n\t}, [height, scrollableTarget, threshold, handleLoadMore]);\n\n\tconst defaultLoadingIndicator = (\n\t\t<div className=\"rpc_infinite_scroll_list_footer\">\n\t\t\t<LoadingOutlined style={{ fontSize: 16, color: '#1677ff' }} />\n\t\t\t<span>正在加载更多数据...</span>\n\t\t</div>\n\t);\n\n\tconst isLocalScroll = Boolean(height);\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={`rpc_infinite_scroll_list ${\n\t\t\t\tisLocalScroll ? 'rpc_infinite_scroll_list_container' : ''\n\t\t\t} ${className}`}\n\t\t\tstyle={{\n\t\t\t\theight: height,\n\t\t\t\t...style,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\n\t\t\t{/* 底部哨兵元素 */}\n\t\t\t<div ref={sentinelRef} style={{ height: 1, margin: 0, padding: 0 }} />\n\n\t\t\t{/* 底部状态提示 */}\n\t\t\t{loading && (loadingIndicator || defaultLoadingIndicator)}\n\t\t\t{!hasMore && endMessage && (\n\t\t\t\t<div className=\"rpc_infinite_scroll_list_footer rpc_infinite_scroll_list_end\">\n\t\t\t\t\t{endMessage}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nexport default InfiniteScrollList;\n"]}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// LazyLoadBox/index.tsx
|
|
7
|
+
function parseRootMargin(offset) {
|
|
8
|
+
if (typeof offset === "number") {
|
|
9
|
+
return `${offset}px 0px ${offset}px 0px`;
|
|
10
|
+
}
|
|
11
|
+
if (typeof offset === "string") {
|
|
12
|
+
return offset;
|
|
13
|
+
}
|
|
14
|
+
if (Array.isArray(offset)) {
|
|
15
|
+
if (offset.length === 2) {
|
|
16
|
+
const [v, h] = offset.map((item) => typeof item === "number" ? `${item}px` : item);
|
|
17
|
+
return `${v} ${h} ${v} ${h}`;
|
|
18
|
+
}
|
|
19
|
+
if (offset.length === 4) {
|
|
20
|
+
return offset.map((item) => typeof item === "number" ? `${item}px` : item).join(" ");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return "150px 0px 150px 0px";
|
|
24
|
+
}
|
|
25
|
+
var LazyLoadBox = react.forwardRef(
|
|
26
|
+
({
|
|
27
|
+
children,
|
|
28
|
+
offset = 150,
|
|
29
|
+
height = 180,
|
|
30
|
+
width,
|
|
31
|
+
placeholder,
|
|
32
|
+
skeleton = true,
|
|
33
|
+
bordered = false,
|
|
34
|
+
once = true,
|
|
35
|
+
forceRender = false,
|
|
36
|
+
scrollContainer,
|
|
37
|
+
threshold = 0,
|
|
38
|
+
animate = true,
|
|
39
|
+
ssr = false,
|
|
40
|
+
onVisible,
|
|
41
|
+
onInViewChange,
|
|
42
|
+
className = "",
|
|
43
|
+
style
|
|
44
|
+
}, ref) => {
|
|
45
|
+
const containerRef = react.useRef(null);
|
|
46
|
+
const [isInView, setIsInView] = react.useState(Boolean(ssr || forceRender));
|
|
47
|
+
const [hasLoaded, setHasLoaded] = react.useState(Boolean(ssr || forceRender));
|
|
48
|
+
const hasLoadedRef = react.useRef(hasLoaded);
|
|
49
|
+
const onVisibleRef = react.useRef(onVisible);
|
|
50
|
+
const onInViewChangeRef = react.useRef(onInViewChange);
|
|
51
|
+
onVisibleRef.current = onVisible;
|
|
52
|
+
onInViewChangeRef.current = onInViewChange;
|
|
53
|
+
const rootMargin = parseRootMargin(offset);
|
|
54
|
+
const triggerLoad = () => {
|
|
55
|
+
var _a;
|
|
56
|
+
if (!hasLoadedRef.current) {
|
|
57
|
+
setHasLoaded(true);
|
|
58
|
+
setIsInView(true);
|
|
59
|
+
hasLoadedRef.current = true;
|
|
60
|
+
(_a = onVisibleRef.current) == null ? void 0 : _a.call(onVisibleRef);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
react.useImperativeHandle(ref, () => ({
|
|
64
|
+
load: triggerLoad,
|
|
65
|
+
reset: () => {
|
|
66
|
+
setHasLoaded(false);
|
|
67
|
+
setIsInView(false);
|
|
68
|
+
hasLoadedRef.current = false;
|
|
69
|
+
},
|
|
70
|
+
getInView: () => isInView,
|
|
71
|
+
getHasLoaded: () => hasLoadedRef.current,
|
|
72
|
+
getDOMNode: () => containerRef.current
|
|
73
|
+
}));
|
|
74
|
+
react.useEffect(() => {
|
|
75
|
+
if (forceRender && !hasLoadedRef.current) {
|
|
76
|
+
triggerLoad();
|
|
77
|
+
}
|
|
78
|
+
}, [forceRender]);
|
|
79
|
+
react.useEffect(() => {
|
|
80
|
+
if (hasLoaded && once) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const target = containerRef.current;
|
|
84
|
+
if (!target) return;
|
|
85
|
+
if (typeof window === "undefined" || !("IntersectionObserver" in window)) {
|
|
86
|
+
triggerLoad();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
let rootElement = null;
|
|
90
|
+
if (typeof scrollContainer === "string") {
|
|
91
|
+
rootElement = document.querySelector(scrollContainer);
|
|
92
|
+
} else if (typeof scrollContainer === "function") {
|
|
93
|
+
rootElement = scrollContainer();
|
|
94
|
+
} else if (scrollContainer && "current" in scrollContainer) {
|
|
95
|
+
rootElement = scrollContainer.current;
|
|
96
|
+
} else if (scrollContainer instanceof HTMLElement) {
|
|
97
|
+
rootElement = scrollContainer;
|
|
98
|
+
}
|
|
99
|
+
let observer = null;
|
|
100
|
+
try {
|
|
101
|
+
observer = new IntersectionObserver(
|
|
102
|
+
(entries) => {
|
|
103
|
+
entries.forEach((entry) => {
|
|
104
|
+
var _a, _b;
|
|
105
|
+
const inView = entry.isIntersecting;
|
|
106
|
+
setIsInView(inView);
|
|
107
|
+
(_a = onInViewChangeRef.current) == null ? void 0 : _a.call(onInViewChangeRef, inView);
|
|
108
|
+
if (inView) {
|
|
109
|
+
if (!hasLoadedRef.current) {
|
|
110
|
+
setHasLoaded(true);
|
|
111
|
+
hasLoadedRef.current = true;
|
|
112
|
+
(_b = onVisibleRef.current) == null ? void 0 : _b.call(onVisibleRef);
|
|
113
|
+
}
|
|
114
|
+
if (once) {
|
|
115
|
+
observer == null ? void 0 : observer.unobserve(target);
|
|
116
|
+
observer == null ? void 0 : observer.disconnect();
|
|
117
|
+
}
|
|
118
|
+
} else {
|
|
119
|
+
if (!once) {
|
|
120
|
+
setHasLoaded(false);
|
|
121
|
+
hasLoadedRef.current = false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
root: rootElement,
|
|
128
|
+
rootMargin,
|
|
129
|
+
threshold
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
observer.observe(target);
|
|
133
|
+
} catch (e) {
|
|
134
|
+
triggerLoad();
|
|
135
|
+
}
|
|
136
|
+
return () => {
|
|
137
|
+
if (observer) {
|
|
138
|
+
observer.unobserve(target);
|
|
139
|
+
observer.disconnect();
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}, [rootMargin, threshold, once, hasLoaded, scrollContainer]);
|
|
143
|
+
const formattedHeight = typeof height === "number" ? `${height}px` : height;
|
|
144
|
+
const formattedWidth = typeof width === "number" ? `${width}px` : width;
|
|
145
|
+
const defaultPlaceholder = skeleton ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
146
|
+
"div",
|
|
147
|
+
{
|
|
148
|
+
className: `rpc_lazy_load_placeholder ${bordered ? "rpc_lazy_load_placeholder_bordered" : ""}`,
|
|
149
|
+
style: {
|
|
150
|
+
minHeight: formattedHeight,
|
|
151
|
+
width: formattedWidth
|
|
152
|
+
},
|
|
153
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rpc_lazy_load_skeleton" })
|
|
154
|
+
}
|
|
155
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
156
|
+
"div",
|
|
157
|
+
{
|
|
158
|
+
style: {
|
|
159
|
+
minHeight: formattedHeight,
|
|
160
|
+
width: formattedWidth
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
);
|
|
164
|
+
const shouldRenderContent = hasLoaded || (once ? hasLoaded : isInView);
|
|
165
|
+
const containerClass = [
|
|
166
|
+
"rpc_lazy_load_box",
|
|
167
|
+
shouldRenderContent ? "rpc_lazy_load_loaded" : "rpc_lazy_load_pending",
|
|
168
|
+
animate && shouldRenderContent ? "rpc_lazy_load_fade_in" : "",
|
|
169
|
+
className
|
|
170
|
+
].filter(Boolean).join(" ");
|
|
171
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
172
|
+
"div",
|
|
173
|
+
{
|
|
174
|
+
ref: containerRef,
|
|
175
|
+
className: containerClass,
|
|
176
|
+
style: {
|
|
177
|
+
minHeight: shouldRenderContent ? void 0 : formattedHeight,
|
|
178
|
+
width: formattedWidth,
|
|
179
|
+
...style
|
|
180
|
+
},
|
|
181
|
+
children: shouldRenderContent ? typeof children === "function" ? children({
|
|
182
|
+
isInView,
|
|
183
|
+
hasLoaded,
|
|
184
|
+
load: triggerLoad
|
|
185
|
+
}) : children : placeholder !== void 0 ? placeholder : defaultPlaceholder
|
|
186
|
+
}
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
LazyLoadBox.displayName = "LazyLoadBox";
|
|
191
|
+
var LazyLoadBox_default = LazyLoadBox;
|
|
192
|
+
|
|
193
|
+
exports.LazyLoadBox = LazyLoadBox;
|
|
194
|
+
exports.LazyLoadBox_default = LazyLoadBox_default;
|
|
195
|
+
//# sourceMappingURL=chunk-V55FEQYU.cjs.map
|
|
196
|
+
//# sourceMappingURL=chunk-V55FEQYU.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../LazyLoadBox/index.tsx"],"names":["forwardRef","useRef","useState","useImperativeHandle","useEffect","jsx"],"mappings":"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","file":"chunk-V55FEQYU.cjs","sourcesContent":["import React, {\n\tuseState,\n\tuseEffect,\n\tuseRef,\n\tuseImperativeHandle,\n\tforwardRef,\n\tCSSProperties,\n\tReactNode,\n\tRefObject,\n} from 'react';\nimport './index.less';\n\nexport interface LazyLoadBoxRef {\n\t/** 立即强制触发加载真实内容 */\n\tload: () => void;\n\t/** 重置加载状态(仅在 once=false 或需要重新触发时可用) */\n\treset: () => void;\n\t/** 获取当前元素是否在可视/预加载区域内 */\n\tgetInView: () => boolean;\n\t/** 获取当前是否已经完成过加载 */\n\tgetHasLoaded: () => boolean;\n\t/** 获取容器原生 DOM 节点 */\n\tgetDOMNode: () => HTMLDivElement | null;\n}\n\nexport interface LazyRenderProps {\n\t/** 当前是否在视口范围内 */\n\tisInView: boolean;\n\t/** 是否已经触发过加载并完成挂载 */\n\thasLoaded: boolean;\n\t/** 重新触发加载函数 */\n\tload: () => void;\n}\n\nexport type LazyOffset = number | string | [number | string, number | string] | [number | string, number | string, number | string, number | string];\n\nexport interface LazyLoadBoxProps {\n\t/**\n\t * 子组件或 Render Props\n\t * 当为普通组件时:未进入视口时不渲染,进入视口预加载范围后挂载并触发其内部网络请求与渲染;\n\t * 当为函数时:接收 ({ isInView, hasLoaded, load }) 回传参数\n\t */\n\tchildren?: ReactNode | ((props: LazyRenderProps) => ReactNode);\n\t/**\n\t * 距离视口/滚动条多远时提前触发加载(单位 px,或标准 rootMargin 字符串/数组)\n\t * 例如:\n\t * - 纯数字:offset={200} (表示上下预加载 200px)\n\t * - 字符串:offset=\"200px 0px\"\n\t * - 数组:offset={[100, 200]} (表示上下预加载距离)\n\t * 默认:150\n\t */\n\toffset?: LazyOffset;\n\t/**\n\t * 未加载前的预估高度/最小高度,防止页面未渲染时高度坍塌导致滚动条剧烈跳动(CLS)\n\t * 默认:180\n\t */\n\theight?: number | string;\n\t/**\n\t * 预估宽度/最小宽度(可选)\n\t */\n\twidth?: number | string;\n\t/**\n\t * 未加载时显示的占位内容(如骨架屏或加载动画)\n\t * 默认提供内置的高品质流光呼吸骨架屏\n\t */\n\tplaceholder?: ReactNode;\n\t/**\n\t * 是否显示默认占位骨架屏(当 placeholder 未指定时生效)\n\t * 默认:true\n\t */\n\tskeleton?: boolean;\n\t/**\n\t * 骨架屏是否显示微边框\n\t * 默认:false\n\t */\n\tbordered?: boolean;\n\t/**\n\t * 是否只加载一次(默认 true:进入视口后保持挂载,移出不会销毁与重复请求)\n\t * 若设为 false,则移出视口时会自动卸载,再次移入时重新挂载\n\t */\n\tonce?: boolean;\n\t/**\n\t * 强制立即渲染(忽略视口距离,用于一键展开、批量导出、页面打印等场景)\n\t */\n\tforceRender?: boolean;\n\t/**\n\t * 指定局部滚动容器(支持 DOM 节点、RefObject、选择器字符串或 getter 函数),默认监听 window 视口\n\t */\n\tscrollContainer?:\n\t\t| HTMLElement\n\t\t| null\n\t\t| string\n\t\t| RefObject<HTMLElement | null>\n\t\t| (() => HTMLElement | null);\n\t/**\n\t * 交叉比例阈值(0 ~ 1),默认 0\n\t */\n\tthreshold?: number | number[];\n\t/**\n\t * 是否在加载完成后启用平滑淡入动效\n\t * 默认:true\n\t */\n\tanimate?: boolean;\n\t/**\n\t * 服务端渲染(SSR)时是否直接渲染内容(默认为 false)\n\t */\n\tssr?: boolean;\n\t/**\n\t * 首次进入可视/预加载区域触发加载时的回调\n\t */\n\tonVisible?: () => void;\n\t/**\n\t * 可见性变化时的实时回调\n\t */\n\tonInViewChange?: (inView: boolean) => void;\n\t/** 自定义类名 */\n\tclassName?: string;\n\t/** 自定义样式 */\n\tstyle?: CSSProperties;\n}\n\n/** 规范化 offset 为标准 CSS 4 方向 rootMargin 字符串 */\nfunction parseRootMargin(offset: LazyOffset): string {\n\tif (typeof offset === 'number') {\n\t\treturn `${offset}px 0px ${offset}px 0px`;\n\t}\n\tif (typeof offset === 'string') {\n\t\treturn offset;\n\t}\n\tif (Array.isArray(offset)) {\n\t\tif (offset.length === 2) {\n\t\t\tconst [v, h] = offset.map((item) => (typeof item === 'number' ? `${item}px` : item));\n\t\t\treturn `${v} ${h} ${v} ${h}`;\n\t\t}\n\t\tif (offset.length === 4) {\n\t\t\treturn offset.map((item) => (typeof item === 'number' ? `${item}px` : item)).join(' ');\n\t\t}\n\t}\n\treturn '150px 0px 150px 0px';\n}\n\nexport const LazyLoadBox = forwardRef<LazyLoadBoxRef, LazyLoadBoxProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\toffset = 150,\n\t\t\theight = 180,\n\t\t\twidth,\n\t\t\tplaceholder,\n\t\t\tskeleton = true,\n\t\t\tbordered = false,\n\t\t\tonce = true,\n\t\t\tforceRender = false,\n\t\t\tscrollContainer,\n\t\t\tthreshold = 0,\n\t\t\tanimate = true,\n\t\t\tssr = false,\n\t\t\tonVisible,\n\t\t\tonInViewChange,\n\t\t\tclassName = '',\n\t\t\tstyle,\n\t\t},\n\t\tref\n\t) => {\n\t\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\t\tconst [isInView, setIsInView] = useState<boolean>(Boolean(ssr || forceRender));\n\t\tconst [hasLoaded, setHasLoaded] = useState<boolean>(Boolean(ssr || forceRender));\n\t\tconst hasLoadedRef = useRef<boolean>(hasLoaded);\n\t\tconst onVisibleRef = useRef(onVisible);\n\t\tconst onInViewChangeRef = useRef(onInViewChange);\n\n\t\tonVisibleRef.current = onVisible;\n\t\tonInViewChangeRef.current = onInViewChange;\n\n\t\tconst rootMargin = parseRootMargin(offset);\n\n\t\tconst triggerLoad = () => {\n\t\t\tif (!hasLoadedRef.current) {\n\t\t\t\tsetHasLoaded(true);\n\t\t\t\tsetIsInView(true);\n\t\t\t\thasLoadedRef.current = true;\n\t\t\t\tonVisibleRef.current?.();\n\t\t\t}\n\t\t};\n\n\t\t// 暴露命令式操作方法\n\t\tuseImperativeHandle(ref, () => ({\n\t\t\tload: triggerLoad,\n\t\t\treset: () => {\n\t\t\t\tsetHasLoaded(false);\n\t\t\t\tsetIsInView(false);\n\t\t\t\thasLoadedRef.current = false;\n\t\t\t},\n\t\t\tgetInView: () => isInView,\n\t\t\tgetHasLoaded: () => hasLoadedRef.current,\n\t\t\tgetDOMNode: () => containerRef.current,\n\t\t}));\n\n\t\t// 响应 forceRender 受控属性变化\n\t\tuseEffect(() => {\n\t\t\tif (forceRender && !hasLoadedRef.current) {\n\t\t\t\ttriggerLoad();\n\t\t\t}\n\t\t}, [forceRender]);\n\n\t\tuseEffect(() => {\n\t\t\t// 如果已经加载且 once 为 true,则无需挂载 Observer\n\t\t\tif (hasLoaded && once) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst target = containerRef.current;\n\t\t\tif (!target) return;\n\n\t\t\t// 环境不支持 IntersectionObserver,降级为立即加载\n\t\t\tif (typeof window === 'undefined' || !('IntersectionObserver' in window)) {\n\t\t\t\ttriggerLoad();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// 解析 scrollContainer 根节点\n\t\t\tlet rootElement: HTMLElement | null = null;\n\t\t\tif (typeof scrollContainer === 'string') {\n\t\t\t\trootElement = document.querySelector(scrollContainer);\n\t\t\t} else if (typeof scrollContainer === 'function') {\n\t\t\t\trootElement = scrollContainer();\n\t\t\t} else if (scrollContainer && 'current' in scrollContainer) {\n\t\t\t\trootElement = (scrollContainer as RefObject<HTMLElement | null>).current;\n\t\t\t} else if (scrollContainer instanceof HTMLElement) {\n\t\t\t\trootElement = scrollContainer;\n\t\t\t}\n\n\t\t\tlet observer: IntersectionObserver | null = null;\n\n\t\t\ttry {\n\t\t\t\tobserver = new IntersectionObserver(\n\t\t\t\t\t(entries) => {\n\t\t\t\t\t\tentries.forEach((entry) => {\n\t\t\t\t\t\t\tconst inView = entry.isIntersecting;\n\t\t\t\t\t\t\tsetIsInView(inView);\n\t\t\t\t\t\t\tonInViewChangeRef.current?.(inView);\n\n\t\t\t\t\t\t\tif (inView) {\n\t\t\t\t\t\t\t\tif (!hasLoadedRef.current) {\n\t\t\t\t\t\t\t\t\tsetHasLoaded(true);\n\t\t\t\t\t\t\t\t\thasLoadedRef.current = true;\n\t\t\t\t\t\t\t\t\tonVisibleRef.current?.();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (once) {\n\t\t\t\t\t\t\t\t\tobserver?.unobserve(target);\n\t\t\t\t\t\t\t\t\tobserver?.disconnect();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (!once) {\n\t\t\t\t\t\t\t\t\tsetHasLoaded(false);\n\t\t\t\t\t\t\t\t\thasLoadedRef.current = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\troot: rootElement,\n\t\t\t\t\t\trootMargin,\n\t\t\t\t\t\tthreshold,\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tobserver.observe(target);\n\t\t\t} catch {\n\t\t\t\t// 如果传参格式或环境发生意外,安全降级立即触发\n\t\t\t\ttriggerLoad();\n\t\t\t}\n\n\t\t\treturn () => {\n\t\t\t\tif (observer) {\n\t\t\t\t\tobserver.unobserve(target);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t};\n\t\t}, [rootMargin, threshold, once, hasLoaded, scrollContainer]);\n\n\t\tconst formattedHeight = typeof height === 'number' ? `${height}px` : height;\n\t\tconst formattedWidth = typeof width === 'number' ? `${width}px` : width;\n\n\t\t// 默认骨架占位\n\t\tconst defaultPlaceholder = skeleton ? (\n\t\t\t<div\n\t\t\t\tclassName={`rpc_lazy_load_placeholder ${bordered ? 'rpc_lazy_load_placeholder_bordered' : ''}`}\n\t\t\t\tstyle={{\n\t\t\t\t\tminHeight: formattedHeight,\n\t\t\t\t\twidth: formattedWidth,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div className=\"rpc_lazy_load_skeleton\" />\n\t\t\t</div>\n\t\t) : (\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tminHeight: formattedHeight,\n\t\t\t\t\twidth: formattedWidth,\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\n\t\tconst shouldRenderContent = hasLoaded || (once ? hasLoaded : isInView);\n\n\t\tconst containerClass = [\n\t\t\t'rpc_lazy_load_box',\n\t\t\tshouldRenderContent ? 'rpc_lazy_load_loaded' : 'rpc_lazy_load_pending',\n\t\t\tanimate && shouldRenderContent ? 'rpc_lazy_load_fade_in' : '',\n\t\t\tclassName,\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName={containerClass}\n\t\t\t\tstyle={{\n\t\t\t\t\tminHeight: shouldRenderContent ? undefined : formattedHeight,\n\t\t\t\t\twidth: formattedWidth,\n\t\t\t\t\t...style,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{shouldRenderContent ? (\n\t\t\t\t\ttypeof children === 'function' ? (\n\t\t\t\t\t\t(children as (props: LazyRenderProps) => ReactNode)({\n\t\t\t\t\t\t\tisInView,\n\t\t\t\t\t\t\thasLoaded,\n\t\t\t\t\t\t\tload: triggerLoad,\n\t\t\t\t\t\t})\n\t\t\t\t\t) : (\n\t\t\t\t\t\tchildren\n\t\t\t\t\t)\n\t\t\t\t) : placeholder !== undefined ? (\n\t\t\t\t\tplaceholder\n\t\t\t\t) : (\n\t\t\t\t\tdefaultPlaceholder\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n);\n\nLazyLoadBox.displayName = 'LazyLoadBox';\n\nexport default LazyLoadBox;\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkR4V3EJVP_cjs = require('./chunk-R4V3EJVP.cjs');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
var ReactDOM = require('react-dom');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -230,7 +230,7 @@ var ImageCropper = react.forwardRef(
|
|
|
230
230
|
onClick: () => handleZoom(0.1),
|
|
231
231
|
title: "\u653E\u5927",
|
|
232
232
|
children: [
|
|
233
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
233
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.ZoomInOutlined, {}),
|
|
234
234
|
" \u653E\u5927"
|
|
235
235
|
]
|
|
236
236
|
}
|
|
@@ -243,7 +243,7 @@ var ImageCropper = react.forwardRef(
|
|
|
243
243
|
onClick: () => handleZoom(-0.1),
|
|
244
244
|
title: "\u7F29\u5C0F",
|
|
245
245
|
children: [
|
|
246
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
246
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.ZoomOutOutlined, {}),
|
|
247
247
|
" \u7F29\u5C0F"
|
|
248
248
|
]
|
|
249
249
|
}
|
|
@@ -256,7 +256,7 @@ var ImageCropper = react.forwardRef(
|
|
|
256
256
|
onClick: () => handleRotate(90),
|
|
257
257
|
title: "\u987A\u65F6\u9488\u65CB\u8F6C90\xB0",
|
|
258
258
|
children: [
|
|
259
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
259
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.RotateRightOutlined, {}),
|
|
260
260
|
" \u65CB\u8F6C"
|
|
261
261
|
]
|
|
262
262
|
}
|
|
@@ -279,7 +279,7 @@ var ImageCropper = react.forwardRef(
|
|
|
279
279
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rpc_cropper_modal", onClick: onCancel, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rpc_cropper_modal_card", onClick: (e) => e.stopPropagation(), children: [
|
|
280
280
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rpc_cropper_modal_header", children: [
|
|
281
281
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: title }),
|
|
282
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
282
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.CloseOutlined, { className: "rpc_cropper_modal_close", onClick: onCancel })
|
|
283
283
|
] }),
|
|
284
284
|
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: 16, background: "#141414" }, children: coreContent }),
|
|
285
285
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rpc_cropper_modal_footer", children: [
|
|
@@ -300,7 +300,7 @@ var ImageCropper = react.forwardRef(
|
|
|
300
300
|
className: "rpc_image_cropper_btn rpc_image_cropper_btn_primary",
|
|
301
301
|
onClick: handleConfirm,
|
|
302
302
|
children: [
|
|
303
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
303
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.CheckOutlined, {}),
|
|
304
304
|
" \u786E\u5B9A\u88C1\u526A"
|
|
305
305
|
]
|
|
306
306
|
}
|
|
@@ -317,5 +317,5 @@ ImageCropper.displayName = "ImageCropper";
|
|
|
317
317
|
var ImageCropper_default = ImageCropper;
|
|
318
318
|
|
|
319
319
|
exports.ImageCropper_default = ImageCropper_default;
|
|
320
|
-
//# sourceMappingURL=chunk-
|
|
321
|
-
//# sourceMappingURL=chunk-
|
|
320
|
+
//# sourceMappingURL=chunk-VJOO2DG3.cjs.map
|
|
321
|
+
//# sourceMappingURL=chunk-VJOO2DG3.cjs.map
|