@hkyhy/marsun-components-core 0.1.2

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 (139) hide show
  1. package/README.md +99 -0
  2. package/dist/components/AgentHub/AgentHubAccessGuard.js +12 -0
  3. package/dist/components/AgentHub/AgentHubAccessGuard.js.map +1 -0
  4. package/dist/components/AgentHub/AgentHubIndexRedirect.js +11 -0
  5. package/dist/components/AgentHub/AgentHubIndexRedirect.js.map +1 -0
  6. package/dist/components/AgentHub/ChatSessionAccessGuard.js +11 -0
  7. package/dist/components/AgentHub/ChatSessionAccessGuard.js.map +1 -0
  8. package/dist/components/Auth/PermissionGuard.js +18 -0
  9. package/dist/components/Auth/PermissionGuard.js.map +1 -0
  10. package/dist/components/Auth/ProtectedRoute.js +21 -0
  11. package/dist/components/Auth/ProtectedRoute.js.map +1 -0
  12. package/dist/components/Auth/hasPermission.js +7 -0
  13. package/dist/components/Auth/hasPermission.js.map +1 -0
  14. package/dist/components/Descriptions/CommonDescriptions.js +14 -0
  15. package/dist/components/Descriptions/CommonDescriptions.js.map +1 -0
  16. package/dist/components/File/FileItem/index.js +82 -0
  17. package/dist/components/File/FileItem/index.js.map +1 -0
  18. package/dist/components/File/FileItem/style.module.scss.js +18 -0
  19. package/dist/components/File/FileItem/style.module.scss.js.map +1 -0
  20. package/dist/components/File/FileLink/index.js +27 -0
  21. package/dist/components/File/FileLink/index.js.map +1 -0
  22. package/dist/components/File/FileLink/style.module.scss.js +10 -0
  23. package/dist/components/File/FileLink/style.module.scss.js.map +1 -0
  24. package/dist/components/File/FilePreview/index.js +49 -0
  25. package/dist/components/File/FilePreview/index.js.map +1 -0
  26. package/dist/components/File/FilePreview/style.module.scss.js +5 -0
  27. package/dist/components/File/FilePreview/style.module.scss.js.map +1 -0
  28. package/dist/components/File/FilePreviewModal/index.js +12 -0
  29. package/dist/components/File/FilePreviewModal/index.js.map +1 -0
  30. package/dist/components/File/fileDisplay.js +67 -0
  31. package/dist/components/File/fileDisplay.js.map +1 -0
  32. package/dist/components/Filter/CommonFilter/index.js +81 -0
  33. package/dist/components/Filter/CommonFilter/index.js.map +1 -0
  34. package/dist/components/Filter/CommonFilter/style.module.scss.js +20 -0
  35. package/dist/components/Filter/CommonFilter/style.module.scss.js.map +1 -0
  36. package/dist/components/Filter/FilterDateRange/index.js +97 -0
  37. package/dist/components/Filter/FilterDateRange/index.js.map +1 -0
  38. package/dist/components/Filter/FilterDateRange/style.module.scss.js +10 -0
  39. package/dist/components/Filter/FilterDateRange/style.module.scss.js.map +1 -0
  40. package/dist/components/Filter/FilterInput/index.js +56 -0
  41. package/dist/components/Filter/FilterInput/index.js.map +1 -0
  42. package/dist/components/Filter/FilterNumberRange/index.js +81 -0
  43. package/dist/components/Filter/FilterNumberRange/index.js.map +1 -0
  44. package/dist/components/Filter/FilterNumberRange/style.module.scss.js +9 -0
  45. package/dist/components/Filter/FilterNumberRange/style.module.scss.js.map +1 -0
  46. package/dist/components/Filter/FilterPanel/index.js +21 -0
  47. package/dist/components/Filter/FilterPanel/index.js.map +1 -0
  48. package/dist/components/Filter/FilterPanel/style.module.scss.js +8 -0
  49. package/dist/components/Filter/FilterPanel/style.module.scss.js.map +1 -0
  50. package/dist/components/Filter/FilterPopover/index.js +52 -0
  51. package/dist/components/Filter/FilterPopover/index.js.map +1 -0
  52. package/dist/components/Filter/FilterSelect/index.js +160 -0
  53. package/dist/components/Filter/FilterSelect/index.js.map +1 -0
  54. package/dist/components/Filter/FilterSelect/style.module.scss.js +16 -0
  55. package/dist/components/Filter/FilterSelect/style.module.scss.js.map +1 -0
  56. package/dist/components/Filter/FilterTreeSelect/index.js +249 -0
  57. package/dist/components/Filter/FilterTreeSelect/index.js.map +1 -0
  58. package/dist/components/Filter/FilterTreeSelect/style.module.scss.js +19 -0
  59. package/dist/components/Filter/FilterTreeSelect/style.module.scss.js.map +1 -0
  60. package/dist/components/Filter/FilterTrigger/index.js +31 -0
  61. package/dist/components/Filter/FilterTrigger/index.js.map +1 -0
  62. package/dist/components/Filter/FilterTrigger/style.module.scss.js +10 -0
  63. package/dist/components/Filter/FilterTrigger/style.module.scss.js.map +1 -0
  64. package/dist/components/Filter/types.js +12 -0
  65. package/dist/components/Filter/types.js.map +1 -0
  66. package/dist/components/Filter/useFilterState.js +35 -0
  67. package/dist/components/Filter/useFilterState.js.map +1 -0
  68. package/dist/components/Form/FetchSelect.js +37 -0
  69. package/dist/components/Form/FetchSelect.js.map +1 -0
  70. package/dist/components/Form/FetchTreeSelect.js +28 -0
  71. package/dist/components/Form/FetchTreeSelect.js.map +1 -0
  72. package/dist/components/Form/PersonOptionRow/index.js +37 -0
  73. package/dist/components/Form/PersonOptionRow/index.js.map +1 -0
  74. package/dist/components/Form/PersonOptionRow/style.module.scss.js +11 -0
  75. package/dist/components/Form/PersonOptionRow/style.module.scss.js.map +1 -0
  76. package/dist/components/Form/StepForm.js +34 -0
  77. package/dist/components/Form/StepForm.js.map +1 -0
  78. package/dist/components/Icons/index.js +245 -0
  79. package/dist/components/Icons/index.js.map +1 -0
  80. package/dist/components/Layout/PageHeaderLayout/index.js +41 -0
  81. package/dist/components/Layout/PageHeaderLayout/index.js.map +1 -0
  82. package/dist/components/Layout/PageHeaderLayout/style.module.scss.js +10 -0
  83. package/dist/components/Layout/PageHeaderLayout/style.module.scss.js.map +1 -0
  84. package/dist/components/Modal/StepModal/index.js +64 -0
  85. package/dist/components/Modal/StepModal/index.js.map +1 -0
  86. package/dist/components/Modal/StepModal/style.module.scss.js +9 -0
  87. package/dist/components/Modal/StepModal/style.module.scss.js.map +1 -0
  88. package/dist/components/Stat/StatCard/index.js +34 -0
  89. package/dist/components/Stat/StatCard/index.js.map +1 -0
  90. package/dist/components/Stat/StatCard/style.module.scss.js +7 -0
  91. package/dist/components/Stat/StatCard/style.module.scss.js.map +1 -0
  92. package/dist/components/Stat/StatCardList.js +20 -0
  93. package/dist/components/Stat/StatCardList.js.map +1 -0
  94. package/dist/components/Stat/StatPendingBreakdown/index.js +38 -0
  95. package/dist/components/Stat/StatPendingBreakdown/index.js.map +1 -0
  96. package/dist/components/Stat/StatPendingBreakdown/style.module.scss.js +9 -0
  97. package/dist/components/Stat/StatPendingBreakdown/style.module.scss.js.map +1 -0
  98. package/dist/components/Tag/FileTags.js +8 -0
  99. package/dist/components/Tag/FileTags.js.map +1 -0
  100. package/dist/components/Tag/SemanticTag.js +92 -0
  101. package/dist/components/Tag/SemanticTag.js.map +1 -0
  102. package/dist/components/Tag/Tags/index.js +32 -0
  103. package/dist/components/Tag/Tags/index.js.map +1 -0
  104. package/dist/components/Tag/Tags/style.module.scss.js +9 -0
  105. package/dist/components/Tag/Tags/style.module.scss.js.map +1 -0
  106. package/dist/components/TooltipInfo/TooltipInfo.js +31 -0
  107. package/dist/components/TooltipInfo/TooltipInfo.js.map +1 -0
  108. package/dist/components/Tour/AppTour/index.js +40 -0
  109. package/dist/components/Tour/AppTour/index.js.map +1 -0
  110. package/dist/components/Tour/AppTour/style.module.scss.js +7 -0
  111. package/dist/components/Tour/AppTour/style.module.scss.js.map +1 -0
  112. package/dist/components/VirtualScrollbar/VirtualScrollbar/index.js +97 -0
  113. package/dist/components/VirtualScrollbar/VirtualScrollbar/index.js.map +1 -0
  114. package/dist/components/VirtualScrollbar/VirtualScrollbar/style.module.scss.js +12 -0
  115. package/dist/components/VirtualScrollbar/VirtualScrollbar/style.module.scss.js.map +1 -0
  116. package/dist/components/VirtualScrollbar/useVirtualScrollbar.js +97 -0
  117. package/dist/components/VirtualScrollbar/useVirtualScrollbar.js.map +1 -0
  118. package/dist/hooks/useFetchData.js +69 -0
  119. package/dist/hooks/useFetchData.js.map +1 -0
  120. package/dist/index.d.ts +28 -0
  121. package/dist/index.js +182 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/marsun-components-core.css +1 -0
  124. package/dist/provider/MarsunCoreProvider.js +51 -0
  125. package/dist/provider/MarsunCoreProvider.js.map +1 -0
  126. package/dist/provider/context.js +27 -0
  127. package/dist/provider/context.js.map +1 -0
  128. package/dist/theme/constants.js +15 -0
  129. package/dist/theme/constants.js.map +1 -0
  130. package/dist/theme/index.d.ts +2 -0
  131. package/dist/theme/index.js +9 -0
  132. package/dist/theme/index.js.map +1 -0
  133. package/dist/theme/theme.js +286 -0
  134. package/dist/theme/theme.js.map +1 -0
  135. package/dist/utils/format.js +9 -0
  136. package/dist/utils/format.js.map +1 -0
  137. package/dist/utils/resolveMaybeFn.js +11 -0
  138. package/dist/utils/resolveMaybeFn.js.map +1 -0
  139. package/package.json +83 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Modal/StepModal/index.tsx"],"sourcesContent":["import { ChevronLeft } from '@/components/Icons';\nimport { Button, Modal, Steps } from 'antd';\nimport React, { useCallback, useMemo } from 'react';\nimport type { StepModalProps } from '../StepModalTypes';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\n/** 解析可能是函数的 content / footer */\nconst resolve = (val: React.ReactNode | (() => React.ReactNode) | undefined) => {\n if (val === undefined) return undefined;\n return typeof val === 'function' ? val() : val;\n};\n\n/**\n * 步骤式弹窗\n *\n * 将多步骤流程封装在同一个 Modal 中,自动管理步骤导航、标题切换和底部按钮。\n *\n * 用法:\n * ```tsx\n * const [current, setCurrent] = useState('select');\n * <StepModal\n * open={open}\n * current={current}\n * onCancel={onCancel}\n * steps={[\n * { key: 'select', title: '选择文件', content: <SelectStep /> },\n * { key: 'uploading', title: '上传文件', content: <UploadingStep /> },\n * { key: 'result', title: '上传结果', content: <ResultStep /> },\n * ]}\n * onStepChange={setCurrent}\n * />\n * ```\n */\nconst StepModal: React.FC<StepModalProps> = ({\n title,\n steps,\n current,\n open,\n onCancel,\n width = 600,\n showSteps = true,\n maskClosable = false,\n className,\n onStepChange,\n}) => {\n const currentIndex = useMemo(() => steps.findIndex((s) => s.key === current), [steps, current]);\n const currentStep = steps[currentIndex];\n\n const goBack = useCallback(() => {\n if (currentIndex > 0) {\n onStepChange?.(steps[currentIndex - 1]!.key);\n }\n }, [currentIndex, steps, onStepChange]);\n\n const goNext = useCallback(async () => {\n if (!currentStep?.beforeEnter) {\n if (currentIndex < steps.length - 1) {\n onStepChange?.(steps[currentIndex + 1]!.key);\n }\n return;\n }\n const canEnter = await currentStep.beforeEnter();\n if (canEnter && currentIndex < steps.length - 1) {\n onStepChange?.(steps[currentIndex + 1]!.key);\n }\n }, [currentStep, currentIndex, steps, onStepChange]);\n\n // 自动从标题推导\n const modalTitle = title ?? currentStep?.title ?? '';\n\n // 底部按钮:优先使用步骤自定义 footer,否则自动渲染\"取消/上一步/下一步\"\n const renderFooter = () => {\n if (currentStep?.footer !== undefined) return resolve(currentStep.footer);\n\n return (\n <div className={classNames('step-modal-root', styles['step-modal-root'])}>\n {currentIndex > 0 && currentStep?.allowBack !== false && (\n <Button icon={<ChevronLeft />} onClick={goBack}>\n 上一步\n </Button>\n )}\n <div className={classNames('step-modal-container', styles['step-modal-container'])} />\n <Button onClick={onCancel}>取消</Button>\n {currentIndex < steps.length - 1 && (\n <Button type=\"primary\" onClick={goNext}>\n 下一步\n </Button>\n )}\n </div>\n );\n };\n\n return (\n <Modal\n title={modalTitle}\n open={open}\n onCancel={onCancel}\n width={width}\n footer={renderFooter()}\n maskClosable={maskClosable}\n className={className}\n >\n {showSteps && steps.length > 1 && (\n <Steps\n current={currentIndex}\n size=\"small\"\n className={classNames('step-modal-wrapper', styles['step-modal-wrapper'])}\n items={steps.map((s) => ({ title: s.title, description: s.description }))}\n />\n )}\n {resolve(currentStep?.content)}\n </Modal>\n );\n};\n\nexport default StepModal;\n"],"names":["resolve","val","StepModal","title","steps","current","open","onCancel","width","showSteps","maskClosable","className","onStepChange","currentIndex","useMemo","s","currentStep","goBack","useCallback","goNext","modalTitle","jsxs","Modal","classNames","styles","jsx","Button","ChevronLeft","Steps"],"mappings":";;;;;;AAQA,MAAMA,IAAU,CAACC,MAA+D;AAC9E,MAAIA,MAAQ;AACZ,WAAO,OAAOA,KAAQ,aAAaA,EAAA,IAAQA;AAC7C,GAuBMC,IAAsC,CAAC;AAAA,EAC3C,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,cAAAC,IAAe;AAAA,EACf,WAAAC;AAAA,EACA,cAAAC;AACF,MAAM;AACJ,QAAMC,IAAeC,EAAQ,MAAMV,EAAM,UAAU,CAACW,MAAMA,EAAE,QAAQV,CAAO,GAAG,CAACD,GAAOC,CAAO,CAAC,GACxFW,IAAcZ,EAAMS,CAAY,GAEhCI,IAASC,EAAY,MAAM;AAC/B,IAAIL,IAAe,MACjBD,KAAA,QAAAA,EAAeR,EAAMS,IAAe,CAAC,EAAG;AAAA,EAE5C,GAAG,CAACA,GAAcT,GAAOQ,CAAY,CAAC,GAEhCO,IAASD,EAAY,YAAY;AACrC,QAAI,EAACF,KAAA,QAAAA,EAAa,cAAa;AAC7B,MAAIH,IAAeT,EAAM,SAAS,MAChCQ,KAAA,QAAAA,EAAeR,EAAMS,IAAe,CAAC,EAAG;AAE1C;AAAA,IACF;AAEA,IADiB,MAAMG,EAAY,YAAA,KACnBH,IAAeT,EAAM,SAAS,MAC5CQ,KAAA,QAAAA,EAAeR,EAAMS,IAAe,CAAC,EAAG;AAAA,EAE5C,GAAG,CAACG,GAAaH,GAAcT,GAAOQ,CAAY,CAAC,GAG7CQ,IAAajB,MAASa,KAAA,gBAAAA,EAAa,UAAS;AAwBlD,SACE,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAOF;AAAA,MACP,MAAAd;AAAA,MACA,UAAAC;AAAA,MACA,OAAAC;AAAA,MACA,SA1BEQ,KAAA,gBAAAA,EAAa,YAAW,SAAkBhB,EAAQgB,EAAY,MAAM,IAGtE,gBAAAK,EAAC,SAAI,WAAWE,EAAW,mBAAmBC,EAAO,iBAAiB,CAAC,GACpE,UAAA;AAAA,QAAAX,IAAe,MAAKG,KAAA,gBAAAA,EAAa,eAAc,MAC9C,gBAAAS,EAACC,GAAA,EAAO,MAAM,gBAAAD,EAACE,GAAA,CAAA,CAAY,GAAI,SAASV,GAAQ,UAAA,OAEhD;AAAA,QAEF,gBAAAQ,EAAC,SAAI,WAAWF,EAAW,wBAAwBC,EAAO,sBAAsB,CAAC,GAAG;AAAA,QACpF,gBAAAC,EAACC,GAAA,EAAO,SAASnB,GAAU,UAAA,MAAE;AAAA,QAC5BM,IAAeT,EAAM,SAAS,KAC7B,gBAAAqB,EAACC,KAAO,MAAK,WAAU,SAASP,GAAQ,UAAA,MAAA,CAExC;AAAA,MAAA,GAEJ;AAAA,MAWA,cAAAT;AAAA,MACA,WAAAC;AAAA,MAEC,UAAA;AAAA,QAAAF,KAAaL,EAAM,SAAS,KAC3B,gBAAAqB;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,SAASf;AAAA,YACT,MAAK;AAAA,YACL,WAAWU,EAAW,sBAAsBC,EAAO,oBAAoB,CAAC;AAAA,YACxE,OAAOpB,EAAM,IAAI,CAACW,OAAO,EAAE,OAAOA,EAAE,OAAO,aAAaA,EAAE,YAAA,EAAc;AAAA,UAAA;AAAA,QAAA;AAAA,QAG3Ef,EAAQgB,KAAA,gBAAAA,EAAa,OAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGnC;"}
@@ -0,0 +1,9 @@
1
+ const o = {
2
+ "step-modal-root": "_step-modal-root_1ccyj_1",
3
+ "step-modal-container": "_step-modal-container_1ccyj_7",
4
+ "step-modal-wrapper": "_step-modal-wrapper_1ccyj_11"
5
+ };
6
+ export {
7
+ o as default
8
+ };
9
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,34 @@
1
+ import { jsx as t } from "react/jsx-runtime";
2
+ import { Statistic as d, Card as b } from "antd";
3
+ import m from "./style.module.scss.js";
4
+ import i from "classnames";
5
+ const y = ({
6
+ title: r,
7
+ value: s,
8
+ prefix: e,
9
+ color: c = "#1677ff",
10
+ onClick: a,
11
+ inline: f = !1,
12
+ fontSize: l,
13
+ style: o
14
+ }) => f ? /* @__PURE__ */ t("div", { className: a ? i("stat-card-clickable", m["stat-card-clickable"]) : void 0, onClick: a, style: o, children: /* @__PURE__ */ t(
15
+ d,
16
+ {
17
+ title: r,
18
+ value: s,
19
+ prefix: e,
20
+ valueStyle: { color: c, ...l ? { fontSize: l } : {} }
21
+ }
22
+ ) }) : /* @__PURE__ */ t(
23
+ b,
24
+ {
25
+ hoverable: !!a,
26
+ onClick: a,
27
+ className: a ? i("stat-card-clickable", m["stat-card-clickable"]) : void 0,
28
+ children: /* @__PURE__ */ t(d, { title: r, value: s, prefix: e, valueStyle: { color: c } })
29
+ }
30
+ );
31
+ export {
32
+ y as default
33
+ };
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Stat/StatCard/index.tsx"],"sourcesContent":["import { Card, Statistic } from 'antd';\nimport React from 'react';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nexport interface StatCardProps {\n /** 标题 */\n title: string;\n /** 数值 */\n value: number;\n /** 前缀图标 */\n prefix?: React.ReactNode;\n /** 数值颜色 */\n color?: string;\n /** 点击回调 */\n onClick?: () => void;\n /** 是否内联模式(不使用 Card 包裹) */\n inline?: boolean;\n /** 内联模式下的字体大小 */\n fontSize?: number;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\n/** 可点击的统计卡片 */\nconst StatCard: React.FC<StatCardProps> = ({\n title,\n value,\n prefix,\n color = '#1677ff',\n onClick,\n inline = false,\n fontSize,\n style,\n}) => {\n if (inline) {\n return (\n <div className={onClick ? classNames('stat-card-clickable', styles['stat-card-clickable']) : undefined} onClick={onClick} style={style}>\n <Statistic\n title={title}\n value={value}\n prefix={prefix}\n valueStyle={{ color, ...(fontSize ? { fontSize } : {}) }}\n />\n </div>\n );\n }\n\n return (\n <Card\n hoverable={!!onClick}\n onClick={onClick}\n className={onClick ? classNames('stat-card-clickable', styles['stat-card-clickable']) : undefined}\n >\n <Statistic title={title} value={value} prefix={prefix} valueStyle={{ color }} />\n </Card>\n );\n};\n\nexport default StatCard;\n"],"names":["StatCard","title","value","prefix","color","onClick","inline","fontSize","style","jsx","classNames","styles","Statistic","Card"],"mappings":";;;;AAyBA,MAAMA,IAAoC,CAAC;AAAA,EACzC,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,SAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,OAAAC;AACF,MACMF,IAEA,gBAAAG,EAAC,OAAA,EAAI,WAAWJ,IAAUK,EAAW,uBAAuBC,EAAO,qBAAqB,CAAC,IAAI,QAAW,SAAAN,GAAkB,OAAAG,GACxH,UAAA,gBAAAC;AAAA,EAACG;AAAA,EAAA;AAAA,IACC,OAAAX;AAAA,IACA,OAAAC;AAAA,IACA,QAAAC;AAAA,IACA,YAAY,EAAE,OAAAC,GAAO,GAAIG,IAAW,EAAE,UAAAA,EAAA,IAAa,CAAA,EAAC;AAAA,EAAG;AAAA,GAE3D,IAKF,gBAAAE;AAAA,EAACI;AAAA,EAAA;AAAA,IACC,WAAW,CAAC,CAACR;AAAA,IACb,SAAAA;AAAA,IACA,WAAWA,IAAUK,EAAW,uBAAuBC,EAAO,qBAAqB,CAAC,IAAI;AAAA,IAExF,UAAA,gBAAAF,EAACG,KAAU,OAAAX,GAAc,OAAAC,GAAc,QAAAC,GAAgB,YAAY,EAAE,OAAAC,IAAM,CAAG;AAAA,EAAA;AAAA;"}
@@ -0,0 +1,7 @@
1
+ const a = {
2
+ "stat-card-clickable": "_stat-card-clickable_xovsh_1"
3
+ };
4
+ export {
5
+ a as default
6
+ };
7
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,20 @@
1
+ import { jsx as s } from "react/jsx-runtime";
2
+ import { Row as c, Col as u } from "antd";
3
+ import p from "./StatCard/index.js";
4
+ const g = (r) => r <= 2 ? { xs: 12, sm: 12, lg: 12 } : r <= 3 ? { xs: 12, sm: 8, lg: 8 } : r <= 4 ? { xs: 12, sm: 12, lg: 6 } : { xs: 12, sm: 8, lg: 4 }, S = ({
5
+ items: r,
6
+ gutter: o = [16, 16],
7
+ className: n,
8
+ inline: l = !1,
9
+ fontSize: i
10
+ }) => {
11
+ const e = r.filter((t) => !t.hidden), m = g(e.length);
12
+ return /* @__PURE__ */ s(c, { gutter: o, className: n, children: e.map((t, d) => {
13
+ const { colProps: f, hidden: x, ...a } = t;
14
+ return /* @__PURE__ */ s(u, { ...f ?? m, children: /* @__PURE__ */ s(p, { ...a, inline: l, fontSize: i }) }, d);
15
+ }) });
16
+ };
17
+ export {
18
+ S as default
19
+ };
20
+ //# sourceMappingURL=StatCardList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatCardList.js","sources":["../../../src/components/Stat/StatCardList.tsx"],"sourcesContent":["import { Col, Row } from 'antd';\nimport type { ColProps } from 'antd/es/grid';\nimport React from 'react';\nimport type { StatCardProps } from './StatCard';\nimport StatCard from './StatCard';\n\nexport interface StatItem extends Omit<StatCardProps, 'inline' | 'fontSize'> {\n /** 卡片占列配置,不传则根据总 items 数自动计算 */\n colProps?: ColProps;\n /** 是否隐藏,为 true 时不渲染 */\n hidden?: boolean;\n /** 后缀 */\n suffix?: React.ReactNode;\n}\n\nexport interface StatCardListProps {\n /** 统计项列表 */\n items: StatItem[];\n /** 行间距 */\n gutter?: [number, number];\n /** 容器 className */\n className?: string;\n /** 是否内联模式 */\n inline?: boolean;\n /** 内联模式字体大小 */\n fontSize?: number;\n}\n\n/** 根据项数自动计算默认列宽 */\nconst getDefaultCol = (total: number): ColProps => {\n if (total <= 2) return { xs: 12, sm: 12, lg: 12 };\n if (total <= 3) return { xs: 12, sm: 8, lg: 8 };\n if (total <= 4) return { xs: 12, sm: 12, lg: 6 };\n return { xs: 12, sm: 8, lg: 4 };\n};\n\n/** 统计卡片列表 */\nconst StatCardList: React.FC<StatCardListProps> = ({\n items,\n gutter = [16, 16],\n className,\n inline = false,\n fontSize,\n}) => {\n const visibleItems = items.filter((item) => !item.hidden);\n const defaultCol = getDefaultCol(visibleItems.length);\n\n return (\n <Row gutter={gutter} className={className}>\n {visibleItems.map((item, idx) => {\n const { colProps, hidden, ...cardProps } = item;\n return (\n <Col key={idx} {...(colProps ?? defaultCol)}>\n <StatCard {...cardProps} inline={inline} fontSize={fontSize} />\n </Col>\n );\n })}\n </Row>\n );\n};\n\nexport default StatCardList;\n"],"names":["getDefaultCol","total","StatCardList","items","gutter","className","inline","fontSize","visibleItems","item","defaultCol","jsx","Row","idx","colProps","hidden","cardProps","Col","StatCard"],"mappings":";;;AA6BA,MAAMA,IAAgB,CAACC,MACjBA,KAAS,IAAU,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAA,IACzCA,KAAS,IAAU,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,EAAA,IACxCA,KAAS,IAAU,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,EAAA,IACtC,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,EAAA,GAIxBC,IAA4C,CAAC;AAAA,EACjD,OAAAC;AAAA,EACA,QAAAC,IAAS,CAAC,IAAI,EAAE;AAAA,EAChB,WAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,UAAAC;AACF,MAAM;AACJ,QAAMC,IAAeL,EAAM,OAAO,CAACM,MAAS,CAACA,EAAK,MAAM,GAClDC,IAAaV,EAAcQ,EAAa,MAAM;AAEpD,SACE,gBAAAG,EAACC,KAAI,QAAAR,GAAgB,WAAAC,GAClB,YAAa,IAAI,CAACI,GAAMI,MAAQ;AAC/B,UAAM,EAAE,UAAAC,GAAU,QAAAC,GAAQ,GAAGC,MAAcP;AAC3C,WACE,gBAAAE,EAACM,GAAA,EAAe,GAAIH,KAAYJ,GAC9B,UAAA,gBAAAC,EAACO,GAAA,EAAU,GAAGF,GAAW,QAAAV,GAAgB,UAAAC,EAAA,CAAoB,EAAA,GADrDM,CAEV;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
@@ -0,0 +1,38 @@
1
+ import { jsxs as t, Fragment as S, jsx as n } from "react/jsx-runtime";
2
+ import { Card as x } from "antd";
3
+ import f from "../StatCardList.js";
4
+ import r from "./style.module.scss.js";
5
+ import o from "classnames";
6
+ const u = ({
7
+ title: a = "待审核",
8
+ subtitle: c,
9
+ summaryItems: i,
10
+ detailItems: l,
11
+ summaryFontSize: v = 20,
12
+ detailFontSize: g = 18,
13
+ detailLabel: k = "待审核明细",
14
+ className: s,
15
+ plain: w = !1
16
+ }) => {
17
+ const e = i == null ? void 0 : i.some((d) => !d.hidden), h = l.some((d) => !d.hidden);
18
+ if (!e && !h)
19
+ return null;
20
+ const p = /* @__PURE__ */ t(S, { children: [
21
+ e && i && /* @__PURE__ */ n(f, { items: i, inline: !0, fontSize: v }),
22
+ h && /* @__PURE__ */ t("div", { className: e ? o("stat-pending-breakdown-detail-divider", r["stat-pending-breakdown-detail-divider"]) : void 0, children: [
23
+ /* @__PURE__ */ n("div", { className: o("stat-pending-breakdown-root", r["stat-pending-breakdown-root"]), children: k }),
24
+ /* @__PURE__ */ n(f, { items: l, inline: !0, fontSize: g })
25
+ ] })
26
+ ] });
27
+ if (w)
28
+ return /* @__PURE__ */ n("div", { className: s, children: p });
29
+ const b = c ? /* @__PURE__ */ t("div", { children: [
30
+ /* @__PURE__ */ n("div", { children: a }),
31
+ /* @__PURE__ */ n("div", { className: o("stat-pending-breakdown-container", r["stat-pending-breakdown-container"]), children: c })
32
+ ] }) : a;
33
+ return /* @__PURE__ */ n(x, { title: b, className: s, children: p });
34
+ };
35
+ export {
36
+ u as default
37
+ };
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Stat/StatPendingBreakdown/index.tsx"],"sourcesContent":["import { Card } from 'antd';\nimport React from 'react';\nimport type { StatItem } from '../StatCardList';\nimport StatCardList from '../StatCardList';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nexport interface StatPendingBreakdownProps {\n /** 卡片标题 */\n title?: string;\n /** 数据可见范围说明,显示在标题下方 */\n subtitle?: React.ReactNode;\n /** 汇总统计项 */\n summaryItems?: StatItem[];\n /** 待审核明细统计项 */\n detailItems: StatItem[];\n /** 汇总区字体大小 */\n summaryFontSize?: number;\n /** 明细区字体大小 */\n detailFontSize?: number;\n /** 明细区标题 */\n detailLabel?: string;\n /** 容器 className */\n className?: string;\n /** 无 Card 包裹,仅展示统计内容(用于外层已有 Card 的场景) */\n plain?: boolean;\n}\n\n/** 待审核汇总 + 明细独立展示区块 */\nconst StatPendingBreakdown: React.FC<StatPendingBreakdownProps> = ({\n title = '待审核',\n subtitle,\n summaryItems,\n detailItems,\n summaryFontSize = 20,\n detailFontSize = 18,\n detailLabel = '待审核明细',\n className,\n plain = false,\n}) => {\n const hasSummary = summaryItems?.some((item) => !item.hidden);\n const hasDetail = detailItems.some((item) => !item.hidden);\n\n if (!hasSummary && !hasDetail) {\n return null;\n }\n\n const content = (\n <>\n {hasSummary && summaryItems && (\n <StatCardList items={summaryItems} inline fontSize={summaryFontSize} />\n )}\n {hasDetail && (\n <div className={hasSummary ? classNames('stat-pending-breakdown-detail-divider', styles['stat-pending-breakdown-detail-divider']) : undefined}>\n <div className={classNames('stat-pending-breakdown-root', styles['stat-pending-breakdown-root'])}>{detailLabel}</div>\n <StatCardList items={detailItems} inline fontSize={detailFontSize} />\n </div>\n )}\n </>\n );\n\n if (plain) {\n return <div className={className}>{content}</div>;\n }\n\n const cardTitle = subtitle ? (\n <div>\n <div>{title}</div>\n <div className={classNames('stat-pending-breakdown-container', styles['stat-pending-breakdown-container'])}>{subtitle}</div>\n </div>\n ) : (\n title\n );\n\n return (\n <Card title={cardTitle} className={className}>\n {content}\n </Card>\n );\n};\n\nexport default StatPendingBreakdown;\n"],"names":["StatPendingBreakdown","title","subtitle","summaryItems","detailItems","summaryFontSize","detailFontSize","detailLabel","className","plain","hasSummary","item","hasDetail","content","jsxs","Fragment","StatCardList","classNames","styles","jsx","cardTitle","Card"],"mappings":";;;;;AA6BA,MAAMA,IAA4D,CAAC;AAAA,EACjE,OAAAC,IAAQ;AAAA,EACR,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,gBAAAC,IAAiB;AAAA,EACjB,aAAAC,IAAc;AAAA,EACd,WAAAC;AAAA,EACA,OAAAC,IAAQ;AACV,MAAM;AACJ,QAAMC,IAAaP,KAAA,gBAAAA,EAAc,KAAK,CAACQ,MAAS,CAACA,EAAK,SAChDC,IAAYR,EAAY,KAAK,CAACO,MAAS,CAACA,EAAK,MAAM;AAEzD,MAAI,CAACD,KAAc,CAACE;AAClB,WAAO;AAGT,QAAMC,IACJ,gBAAAC,EAAAC,GAAA,EACG,UAAA;AAAA,IAAAL,KAAcP,uBACZa,GAAA,EAAa,OAAOb,GAAc,QAAM,IAAC,UAAUE,EAAA,CAAiB;AAAA,IAEtEO,KACC,gBAAAE,EAAC,OAAA,EAAI,WAAWJ,IAAaO,EAAW,yCAAyCC,EAAO,uCAAuC,CAAC,IAAI,QAClI,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWF,EAAW,+BAA+BC,EAAO,6BAA6B,CAAC,GAAI,UAAAX,EAAA,CAAY;AAAA,wBAC9GS,GAAA,EAAa,OAAOZ,GAAa,QAAM,IAAC,UAAUE,EAAA,CAAgB;AAAA,IAAA,EAAA,CACrE;AAAA,EAAA,GAEJ;AAGF,MAAIG;AACF,WAAO,gBAAAU,EAAC,OAAA,EAAI,WAAAX,GAAuB,UAAAK,EAAA,CAAQ;AAG7C,QAAMO,IAAYlB,IAChB,gBAAAY,EAAC,OAAA,EACC,UAAA;AAAA,IAAA,gBAAAK,EAAC,SAAK,UAAAlB,EAAA,CAAM;AAAA,IACZ,gBAAAkB,EAAC,SAAI,WAAWF,EAAW,oCAAoCC,EAAO,kCAAkC,CAAC,GAAI,UAAAhB,EAAA,CAAS;AAAA,EAAA,EAAA,CACxH,IAEAD;AAGF,SACE,gBAAAkB,EAACE,GAAA,EAAK,OAAOD,GAAW,WAAAZ,GACrB,UAAAK,GACH;AAEJ;"}
@@ -0,0 +1,9 @@
1
+ const n = {
2
+ "stat-pending-breakdown-root": "_stat-pending-breakdown-root_85di3_1",
3
+ "stat-pending-breakdown-container": "_stat-pending-breakdown-container_85di3_7",
4
+ "stat-pending-breakdown-detail-divider": "_stat-pending-breakdown-detail-divider_85di3_15"
5
+ };
6
+ export {
7
+ n as default
8
+ };
9
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,8 @@
1
+ import { jsx as r } from "react/jsx-runtime";
2
+ import { SEMANTIC_COLORS as m } from "./SemanticTag.js";
3
+ import t from "./Tags/index.js";
4
+ const i = (o) => /* @__PURE__ */ r(t, { color: m.INFO, ...o });
5
+ export {
6
+ i as default
7
+ };
8
+ //# sourceMappingURL=FileTags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileTags.js","sources":["../../../src/components/Tag/FileTags.tsx"],"sourcesContent":["import React from 'react';\nimport { SEMANTIC_COLORS } from './SemanticTag';\nimport Tags, { type TagsProps } from './Tags';\n\nexport type FileTagsProps = Omit<TagsProps, 'color'>;\n\n/** 文件标签统一样式(Tags + INFO 色) */\nconst FileTags: React.FC<FileTagsProps> = (props) => (\n <Tags color={SEMANTIC_COLORS.INFO} {...props} />\n);\n\nexport default FileTags;\n"],"names":["FileTags","props","jsx","Tags","SEMANTIC_COLORS"],"mappings":";;;AAOA,MAAMA,IAAoC,CAACC,MACzC,gBAAAC,EAACC,KAAK,OAAOC,EAAgB,MAAO,GAAGH,EAAA,CAAO;"}
@@ -0,0 +1,92 @@
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import { Tag as c } from "antd";
3
+ const g = {
4
+ /** 主题色(跟随系统主题色动态变化) */
5
+ PRIMARY: "primary",
6
+ /** 默认/中性 */
7
+ DEFAULT: "default",
8
+ /** 信息/提示 */
9
+ INFO: "info",
10
+ /** 进行中/处理中 */
11
+ PROCESSING: "processing",
12
+ /** 成功/已完成/已通过 */
13
+ SUCCESS: "success",
14
+ /** 警告/待处理 */
15
+ WARNING: "warning",
16
+ /** 危险/紧急/已驳回 */
17
+ DANGER: "danger",
18
+ /** 其他/特殊 */
19
+ OTHER: "other",
20
+ /** 火山/待领导审批 */
21
+ VOLCANO: "volcano",
22
+ /** 青色/辅助 */
23
+ CYAN: "cyan",
24
+ /** 金色/高优先级 */
25
+ GOLD: "gold",
26
+ /** 石灰/低优先级 */
27
+ LIME: "lime"
28
+ }, l = {
29
+ primary: { text: "var(--primary-color)", bg: "var(--primary-color-bg)" },
30
+ success: { text: "var(--success-color)", bg: "var(--success-color-bg)" },
31
+ info: { text: "var(--info-color)", bg: "var(--info-color-bg)" },
32
+ warning: { text: "var(--warning-color)", bg: "var(--warning-color-bg)" },
33
+ danger: { text: "var(--error-color)", bg: "var(--error-color-bg)" }
34
+ }, s = {
35
+ default: "#666666",
36
+ processing: "#F09700",
37
+ other: "#6740C3",
38
+ volcano: "#fa541c",
39
+ cyan: "#13c2c2",
40
+ gold: "#faad14",
41
+ lime: "#a0d911"
42
+ };
43
+ function b(r, n) {
44
+ const t = parseInt(r.slice(1, 3), 16), o = parseInt(r.slice(3, 5), 16), e = parseInt(r.slice(5, 7), 16);
45
+ return `rgba(${t}, ${o}, ${e}, ${n})`;
46
+ }
47
+ function u(r) {
48
+ return s[r] ? s[r] : (r.startsWith("#"), r);
49
+ }
50
+ const i = {
51
+ border: "none",
52
+ height: 24,
53
+ lineHeight: "22px",
54
+ padding: "0 8px"
55
+ }, d = ({
56
+ children: r,
57
+ color: n = g.DEFAULT,
58
+ ...t
59
+ }) => {
60
+ const o = l[n];
61
+ if (o)
62
+ return /* @__PURE__ */ a(
63
+ c,
64
+ {
65
+ style: {
66
+ ...i,
67
+ color: o.text,
68
+ backgroundColor: o.bg
69
+ },
70
+ ...t,
71
+ children: r
72
+ }
73
+ );
74
+ const e = u(n);
75
+ return /* @__PURE__ */ a(
76
+ c,
77
+ {
78
+ style: {
79
+ ...i,
80
+ color: e,
81
+ backgroundColor: b(e, 0.06)
82
+ },
83
+ ...t,
84
+ children: r
85
+ }
86
+ );
87
+ };
88
+ export {
89
+ g as SEMANTIC_COLORS,
90
+ d as default
91
+ };
92
+ //# sourceMappingURL=SemanticTag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticTag.js","sources":["../../../src/components/Tag/SemanticTag.tsx"],"sourcesContent":["import { Tag } from 'antd';\nimport React from 'react';\n\n/**\n * 语义化颜色常量\n * 统一管理所有 Tag 的颜色,避免各处硬编码不一致\n *\n * 主题色(primary/success/info/warning/danger)使用 CSS 变量,跟随系统主题色动态变化\n * 固定色(default/processing/other/volcano/cyan/gold/lime)集中管理,不随主题变化\n */\nexport const SEMANTIC_COLORS = {\n /** 主题色(跟随系统主题色动态变化) */\n PRIMARY: 'primary',\n /** 默认/中性 */\n DEFAULT: 'default',\n /** 信息/提示 */\n INFO: 'info',\n /** 进行中/处理中 */\n PROCESSING: 'processing',\n /** 成功/已完成/已通过 */\n SUCCESS: 'success',\n /** 警告/待处理 */\n WARNING: 'warning',\n /** 危险/紧急/已驳回 */\n DANGER: 'danger',\n /** 其他/特殊 */\n OTHER: 'other',\n /** 火山/待领导审批 */\n VOLCANO: 'volcano',\n /** 青色/辅助 */\n CYAN: 'cyan',\n /** 金色/高优先级 */\n GOLD: 'gold',\n /** 石灰/低优先级 */\n LIME: 'lime',\n} as const;\n\nexport type SemanticColor = (typeof SEMANTIC_COLORS)[keyof typeof SEMANTIC_COLORS];\n\n/**\n * 主题色映射:使用 CSS 变量,跟随系统主题色动态变化\n * 文字色 = --{prefix}-color,背景色 = --{prefix}-color-bg(6% 透明度)\n */\nconst THEME_COLOR_MAP: Record<string, { text: string; bg: string }> = {\n primary: { text: 'var(--primary-color)', bg: 'var(--primary-color-bg)' },\n success: { text: 'var(--success-color)', bg: 'var(--success-color-bg)' },\n info: { text: 'var(--info-color)', bg: 'var(--info-color-bg)' },\n warning: { text: 'var(--warning-color)', bg: 'var(--warning-color-bg)' },\n danger: { text: 'var(--error-color)', bg: 'var(--error-color-bg)' },\n};\n\n/**\n * 固定色映射:不随主题变化,集中管理避免硬编码\n * 仅用于非主题色场景(processing/other/volcano/cyan/gold/lime 等)\n */\nconst FIXED_COLOR_MAP: Record<string, string> = {\n default: '#666666',\n processing: '#F09700',\n other: '#6740C3',\n volcano: '#fa541c',\n cyan: '#13c2c2',\n gold: '#faad14',\n lime: '#a0d911',\n};\n\n/** 将 hex 颜色转换为 rgba */\nfunction hexToRgba(hex: string, alpha: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/** 解析颜色键为 hex 值(仅用于固定色) */\nfunction resolveFixedColor(color: string): string {\n if (FIXED_COLOR_MAP[color]) return FIXED_COLOR_MAP[color];\n if (color.startsWith('#')) return color;\n return color;\n}\n\ninterface SemanticTagProps {\n /** 标签文本 */\n children: React.ReactNode;\n /** 语义化颜色,优先使用 SEMANTIC_COLORS 中的值 */\n color?: SemanticColor | string;\n /** antd Tag 其余属性 */\n [key: string]: unknown;\n}\n\n/** 公共样式 */\nconst TAG_BASE_STYLE: React.CSSProperties = {\n border: 'none',\n height: 24,\n lineHeight: '22px',\n padding: '0 8px',\n};\n\n/**\n * 统一 Tag 组件\n * - 主题色(primary/success/info/warning/danger)使用 CSS 变量,跟随系统主题色动态变化\n * - 固定色集中管理,避免硬编码\n * - 文字颜色 = 语义色,背景色 = 语义色 6% 透明度\n * - 统一尺寸:height 24px, line-height 24px, padding 0 8px\n */\nconst SemanticTag: React.FC<SemanticTagProps> = ({\n children,\n color = SEMANTIC_COLORS.DEFAULT,\n ...rest\n}) => {\n // 优先匹配主题色(CSS 变量)\n const themeColor = THEME_COLOR_MAP[color];\n if (themeColor) {\n return (\n <Tag\n style={{\n ...TAG_BASE_STYLE,\n color: themeColor.text,\n backgroundColor: themeColor.bg,\n }}\n {...rest}\n >\n {children}\n </Tag>\n );\n }\n\n // 固定色 / 自定义 hex\n const hex = resolveFixedColor(color);\n return (\n <Tag\n style={{\n ...TAG_BASE_STYLE,\n color: hex,\n backgroundColor: hexToRgba(hex, 0.06),\n }}\n {...rest}\n >\n {children}\n </Tag>\n );\n};\n\nexport default SemanticTag;\n"],"names":["SEMANTIC_COLORS","THEME_COLOR_MAP","FIXED_COLOR_MAP","hexToRgba","hex","alpha","r","g","b","resolveFixedColor","color","TAG_BASE_STYLE","SemanticTag","children","rest","themeColor","jsx","Tag"],"mappings":";;AAUO,MAAMA,IAAkB;AAAA;AAAA,EAE7B,SAAS;AAAA;AAAA,EAET,SAAS;AAAA;AAAA,EAET,MAAM;AAAA;AAAA,EAEN,YAAY;AAAA;AAAA,EAEZ,SAAS;AAAA;AAAA,EAET,SAAS;AAAA;AAAA,EAET,QAAQ;AAAA;AAAA,EAER,OAAO;AAAA;AAAA,EAEP,SAAS;AAAA;AAAA,EAET,MAAM;AAAA;AAAA,EAEN,MAAM;AAAA;AAAA,EAEN,MAAM;AACR,GAQMC,IAAgE;AAAA,EACpE,SAAS,EAAE,MAAM,wBAAwB,IAAI,0BAAA;AAAA,EAC7C,SAAS,EAAE,MAAM,wBAAwB,IAAI,0BAAA;AAAA,EAC7C,MAAM,EAAE,MAAM,qBAAqB,IAAI,uBAAA;AAAA,EACvC,SAAS,EAAE,MAAM,wBAAwB,IAAI,0BAAA;AAAA,EAC7C,QAAQ,EAAE,MAAM,sBAAsB,IAAI,wBAAA;AAC5C,GAMMC,IAA0C;AAAA,EAC9C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAGA,SAASC,EAAUC,GAAaC,GAAuB;AACrD,QAAMC,IAAI,SAASF,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,GAChCG,IAAI,SAASH,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,GAChCI,IAAI,SAASJ,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,SAAO,QAAQE,CAAC,KAAKC,CAAC,KAAKC,CAAC,KAAKH,CAAK;AACxC;AAGA,SAASI,EAAkBC,GAAuB;AAChD,SAAIR,EAAgBQ,CAAK,IAAUR,EAAgBQ,CAAK,KACpDA,EAAM,WAAW,GAAG,GAAUA;AAEpC;AAYA,MAAMC,IAAsC;AAAA,EAC1C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,SAAS;AACX,GASMC,IAA0C,CAAC;AAAA,EAC/C,UAAAC;AAAA,EACA,OAAAH,IAAQV,EAAgB;AAAA,EACxB,GAAGc;AACL,MAAM;AAEJ,QAAMC,IAAad,EAAgBS,CAAK;AACxC,MAAIK;AACF,WACE,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,GAAGN;AAAA,UACH,OAAOI,EAAW;AAAA,UAClB,iBAAiBA,EAAW;AAAA,QAAA;AAAA,QAE7B,GAAGD;AAAA,QAEH,UAAAD;AAAA,MAAA;AAAA,IAAA;AAMP,QAAMT,IAAMK,EAAkBC,CAAK;AACnC,SACE,gBAAAM;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,GAAGN;AAAA,QACH,OAAOP;AAAA,QACP,iBAAiBD,EAAUC,GAAK,IAAI;AAAA,MAAA;AAAA,MAErC,GAAGU;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,32 @@
1
+ import { jsx as c, Fragment as f, jsxs as p } from "react/jsx-runtime";
2
+ import { Tooltip as T } from "antd";
3
+ import d, { SEMANTIC_COLORS as g } from "../SemanticTag.js";
4
+ import u from "./style.module.scss.js";
5
+ import m from "classnames";
6
+ const e = (t, l) => {
7
+ const { otherCount: r = 0, nowrap: n = !1, className: o, color: i } = l, a = n ? m("tags-tag-list-nowrap", u["tags-tag-list-nowrap"]) : void 0;
8
+ return /* @__PURE__ */ p("div", { className: m("tags-tag-list", u["tags-tag-list"], a, o), children: [
9
+ t.map((s) => /* @__PURE__ */ c(d, { color: i, children: s }, s)),
10
+ r > 0 && /* @__PURE__ */ p(d, { color: i, children: [
11
+ "+",
12
+ r
13
+ ] })
14
+ ] });
15
+ }, O = ({
16
+ tags: t,
17
+ showLength: l,
18
+ empty: r = "-",
19
+ className: n,
20
+ color: o = g.INFO
21
+ }) => {
22
+ if (!(t != null && t.length))
23
+ return r != null ? /* @__PURE__ */ c(f, { children: r }) : null;
24
+ if (!(l != null && l > 0 && t.length > l))
25
+ return e(t, { className: n, color: o });
26
+ const a = t.slice(0, l), s = t.length - l;
27
+ return /* @__PURE__ */ c(T, { title: e(t, { className: m("tags-tag-list-tooltip", u["tags-tag-list-tooltip"]), color: o }), children: e(a, { otherCount: s, nowrap: !0, className: n, color: o }) });
28
+ };
29
+ export {
30
+ O as default
31
+ };
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Tag/Tags/index.tsx"],"sourcesContent":["import { Tooltip } from 'antd';\nimport React from 'react';\nimport SemanticTag, { SEMANTIC_COLORS, type SemanticColor } from '../SemanticTag';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nexport interface TagsProps {\n /** 标签列表 */\n tags?: string[];\n /** 最多展示的标签数量;未传或 tags 数量未超出时展示全部 */\n showLength?: number;\n /** 无标签时的占位,传 null 则不渲染 */\n empty?: React.ReactNode;\n className?: string;\n /** 标签颜色,默认 INFO */\n color?: SemanticColor | string;\n}\n\nconst renderTags = (\n tagList: string[],\n options: {\n otherCount?: number;\n nowrap?: boolean;\n className?: string;\n color: SemanticColor | string;\n },\n) => {\n const { otherCount = 0, nowrap = false, className, color } = options;\n const layoutClass = nowrap ? classNames('tags-tag-list-nowrap', styles['tags-tag-list-nowrap']) : undefined;\n\n return (\n <div className={classNames('tags-tag-list', styles['tags-tag-list'], layoutClass, className)}>\n {tagList.map((tag) => (\n <SemanticTag key={tag} color={color}>\n {tag}\n </SemanticTag>\n ))}\n {otherCount > 0 && <SemanticTag color={color}>+{otherCount}</SemanticTag>}\n </div>\n );\n};\n\n/** 通用标签列表(SemanticTag + showLength 截断) */\nconst Tags: React.FC<TagsProps> = ({\n tags,\n showLength,\n empty = '-',\n className,\n color = SEMANTIC_COLORS.INFO,\n}) => {\n if (!tags?.length) {\n return empty != null ? <>{empty}</> : null;\n }\n\n const shouldTruncate = showLength != null && showLength > 0 && tags.length > showLength;\n\n if (!shouldTruncate) {\n return renderTags(tags, { className, color });\n }\n\n const visibleTags = tags.slice(0, showLength);\n const otherCount = tags.length - showLength;\n\n return (\n <Tooltip title={renderTags(tags, { className: classNames('tags-tag-list-tooltip', styles['tags-tag-list-tooltip']), color })}>\n {renderTags(visibleTags, { otherCount, nowrap: true, className, color })}\n </Tooltip>\n );\n};\n\nexport default Tags;\n"],"names":["renderTags","tagList","options","otherCount","nowrap","className","color","layoutClass","classNames","styles","jsxs","tag","jsx","SemanticTag","Tags","tags","showLength","empty","SEMANTIC_COLORS","Fragment","visibleTags","Tooltip"],"mappings":";;;;;AAkBA,MAAMA,IAAa,CACjBC,GACAC,MAMG;AACH,QAAM,EAAE,YAAAC,IAAa,GAAG,QAAAC,IAAS,IAAO,WAAAC,GAAW,OAAAC,MAAUJ,GACvDK,IAAcH,IAASI,EAAW,wBAAwBC,EAAO,sBAAsB,CAAC,IAAI;AAElG,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAWF,EAAW,iBAAiBC,EAAO,eAAe,GAAGF,GAAaF,CAAS,GACxF,UAAA;AAAA,IAAAJ,EAAQ,IAAI,CAACU,MACZ,gBAAAC,EAACC,KAAsB,OAAAP,GACpB,UAAAK,EAAA,GADeA,CAElB,CACD;AAAA,IACAR,IAAa,KAAK,gBAAAO,EAACG,GAAA,EAAY,OAAAP,GAAc,UAAA;AAAA,MAAA;AAAA,MAAEH;AAAA,IAAA,EAAA,CAAW;AAAA,EAAA,GAC7D;AAEJ,GAGMW,IAA4B,CAAC;AAAA,EACjC,MAAAC;AAAA,EACA,YAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,WAAAZ;AAAA,EACA,OAAAC,IAAQY,EAAgB;AAC1B,MAAM;AACJ,MAAI,EAACH,KAAA,QAAAA,EAAM;AACT,WAAOE,KAAS,OAAO,gBAAAL,EAAAO,GAAA,EAAG,UAAAF,EAAA,CAAM,IAAM;AAKxC,MAAI,EAFmBD,KAAc,QAAQA,IAAa,KAAKD,EAAK,SAASC;AAG3E,WAAOhB,EAAWe,GAAM,EAAE,WAAAV,GAAW,OAAAC,GAAO;AAG9C,QAAMc,IAAcL,EAAK,MAAM,GAAGC,CAAU,GACtCb,IAAaY,EAAK,SAASC;AAEjC,SACE,gBAAAJ,EAACS,GAAA,EAAQ,OAAOrB,EAAWe,GAAM,EAAE,WAAWP,EAAW,yBAAyBC,EAAO,uBAAuB,CAAC,GAAG,OAAAH,EAAA,CAAO,GACxH,UAAAN,EAAWoB,GAAa,EAAE,YAAAjB,GAAY,QAAQ,IAAM,WAAAE,GAAW,OAAAC,EAAA,CAAO,EAAA,CACzE;AAEJ;"}
@@ -0,0 +1,9 @@
1
+ const t = {
2
+ "tags-tag-list": "_tags-tag-list_d5l57_1",
3
+ "tags-tag-list-nowrap": "_tags-tag-list-nowrap_d5l57_8",
4
+ "tags-tag-list-tooltip": "_tags-tag-list-tooltip_d5l57_12"
5
+ };
6
+ export {
7
+ t as default
8
+ };
9
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,31 @@
1
+ import { jsx as o, Fragment as m } from "react/jsx-runtime";
2
+ import { Tooltip as f } from "antd";
3
+ import d from "../Descriptions/CommonDescriptions.js";
4
+ const y = ({
5
+ content: t,
6
+ children: e,
7
+ column: r = 1,
8
+ hidden: i = !1,
9
+ placement: n = "top",
10
+ overlayClassName: p,
11
+ overlayStyle: s,
12
+ mouseEnterDelay: a = 0.3,
13
+ ...l
14
+ }) => i || t.length === 0 ? /* @__PURE__ */ o(m, { children: e }) : /* @__PURE__ */ o(
15
+ f,
16
+ {
17
+ placement: n,
18
+ mouseEnterDelay: a,
19
+ destroyOnHidden: !0,
20
+ classNames: { root: ["tooltip-info-overlay", p].filter(Boolean).join(" ") },
21
+ styles: { container: { maxWidth: 360, padding: "8px 12px", ...s } },
22
+ getPopupContainer: () => document.body,
23
+ title: /* @__PURE__ */ o(d, { content: t, column: r, size: "small" }),
24
+ ...l,
25
+ children: e
26
+ }
27
+ );
28
+ export {
29
+ y as default
30
+ };
31
+ //# sourceMappingURL=TooltipInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TooltipInfo.js","sources":["../../../src/components/TooltipInfo/TooltipInfo.tsx"],"sourcesContent":["import type { TooltipProps } from 'antd';\nimport { Tooltip } from 'antd';\nimport React from 'react';\nimport type { DescriptionItem } from '../Descriptions/CommonDescriptions';\nimport CommonDescriptions from '../Descriptions/CommonDescriptions';\nimport './style.module.scss';\n\nexport interface TooltipInfoProps extends Pick<\n TooltipProps,\n 'placement' | 'mouseEnterDelay' | 'mouseLeaveDelay'\n> {\n /** 详情描述项,内部使用 CommonDescriptions 渲染 */\n content: DescriptionItem[];\n children: React.ReactNode;\n /** CommonDescriptions 列数,默认 1 */\n column?: number;\n /** 为 true 或 content 为空时不展示 Tooltip */\n hidden?: boolean;\n /** @deprecated 使用 classNames.root */\n overlayClassName?: string;\n /** @deprecated 使用 styles.root */\n overlayStyle?: React.CSSProperties;\n}\n\n/** Tooltip 详情展示,内部统一使用 CommonDescriptions */\nconst TooltipInfo: React.FC<TooltipInfoProps> = ({\n content,\n children,\n column = 1,\n hidden = false,\n placement = 'top',\n overlayClassName,\n overlayStyle,\n mouseEnterDelay = 0.3,\n ...rest\n}) => {\n if (hidden || content.length === 0) {\n return <>{children}</>;\n }\n\n return (\n <Tooltip\n placement={placement}\n mouseEnterDelay={mouseEnterDelay}\n destroyOnHidden\n classNames={{ root: ['tooltip-info-overlay', overlayClassName].filter(Boolean).join(' ') }}\n styles={{ container: { maxWidth: 360, padding: '8px 12px', ...overlayStyle } }}\n getPopupContainer={() => document.body}\n title={<CommonDescriptions content={content} column={column} size=\"small\" />}\n {...rest}\n >\n {children}\n </Tooltip>\n );\n};\n\nexport default TooltipInfo;\n"],"names":["TooltipInfo","content","children","column","hidden","placement","overlayClassName","overlayStyle","mouseEnterDelay","rest","jsx","Tooltip","CommonDescriptions"],"mappings":";;;AAyBA,MAAMA,IAA0C,CAAC;AAAA,EAC/C,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AAAA,EACZ,kBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,GAAGC;AACL,MACML,KAAUH,EAAQ,WAAW,2BACrB,UAAAC,GAAS,IAInB,gBAAAQ;AAAA,EAACC;AAAA,EAAA;AAAA,IACC,WAAAN;AAAA,IACA,iBAAAG;AAAA,IACA,iBAAe;AAAA,IACf,YAAY,EAAE,MAAM,CAAC,wBAAwBF,CAAgB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAA;AAAA,IACvF,QAAQ,EAAE,WAAW,EAAE,UAAU,KAAK,SAAS,YAAY,GAAGC,IAAa;AAAA,IAC3E,mBAAmB,MAAM,SAAS;AAAA,IAClC,OAAO,gBAAAG,EAACE,GAAA,EAAmB,SAAAX,GAAkB,QAAAE,GAAgB,MAAK,SAAQ;AAAA,IACzE,GAAGM;AAAA,IAEH,UAAAP;AAAA,EAAA;AAAA;"}
@@ -0,0 +1,40 @@
1
+ import { jsxs as s, Fragment as p, jsx as r } from "react/jsx-runtime";
2
+ import { CircleHelp as u } from "../../Icons/index.js";
3
+ import { Button as a, Tour as f } from "antd";
4
+ import d from "classnames";
5
+ import h, { useState as x } from "react";
6
+ import C from "./style.module.scss.js";
7
+ const R = ({ steps: l, storageKey: t, autoOpen: n = !0 }) => {
8
+ const [c, e] = x(!1);
9
+ h.useEffect(() => {
10
+ if (!n || !t) return;
11
+ if (!localStorage.getItem(t)) {
12
+ const o = setTimeout(() => e(!0), 800);
13
+ return () => clearTimeout(o);
14
+ }
15
+ }, [n, t]);
16
+ const i = () => {
17
+ e(!1), t && localStorage.setItem(t, "true");
18
+ };
19
+ return l.length ? /* @__PURE__ */ s(p, { children: [
20
+ /* @__PURE__ */ r(a, { type: "text", icon: /* @__PURE__ */ r(u, {}), onClick: () => e(!0), title: "导览" }),
21
+ /* @__PURE__ */ r(
22
+ f,
23
+ {
24
+ open: c,
25
+ onClose: i,
26
+ onFinish: i,
27
+ steps: l,
28
+ indicatorsRender: (m, o) => /* @__PURE__ */ s("span", { className: d("app-tour-root", C["app-tour-root"]), children: [
29
+ m + 1,
30
+ " / ",
31
+ o
32
+ ] })
33
+ }
34
+ )
35
+ ] }) : null;
36
+ };
37
+ export {
38
+ R as default
39
+ };
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Tour/AppTour/index.tsx"],"sourcesContent":["import { CircleHelp } from '@/components/Icons';\nimport type { TourProps } from 'antd';\nimport { Button, Tour } from 'antd';\nimport classNames from 'classnames';\nimport React, { useState } from 'react';\nimport styles from './style.module.scss';\n\nexport interface AppTourStep {\n title: string;\n description: React.ReactNode;\n target?: () => HTMLElement;\n placement?: TourProps['steps'] extends (infer S)[] | undefined ? S extends { placement?: infer P } ? P : never : never;\n}\n\nexport interface AppTourProps {\n steps: AppTourStep[];\n /** localStorage key,用于记录是否已完成导览 */\n storageKey?: string;\n /** 是否自动打开(首次) */\n autoOpen?: boolean;\n}\n\nconst AppTour: React.FC<AppTourProps> = ({ steps, storageKey, autoOpen = true }) => {\n const [open, setOpen] = useState(false);\n\n React.useEffect(() => {\n if (!autoOpen || !storageKey) return;\n const completed = localStorage.getItem(storageKey);\n if (!completed) {\n const timer = setTimeout(() => setOpen(true), 800);\n return () => clearTimeout(timer);\n }\n }, [autoOpen, storageKey]);\n\n const handleClose = () => {\n setOpen(false);\n if (storageKey) localStorage.setItem(storageKey, 'true');\n };\n\n if (!steps.length) return null;\n\n return (\n <>\n <Button type=\"text\" icon={<CircleHelp />} onClick={() => setOpen(true)} title=\"导览\" />\n <Tour\n open={open}\n onClose={handleClose}\n onFinish={handleClose}\n steps={steps}\n indicatorsRender={(current, total) => (\n <span className={classNames('app-tour-root', styles['app-tour-root'])}>\n {current + 1} / {total}\n </span>\n )}\n />\n </>\n );\n};\n\nexport default AppTour;\n"],"names":["AppTour","steps","storageKey","autoOpen","open","setOpen","useState","React","timer","handleClose","jsxs","Fragment","jsx","Button","CircleHelp","Tour","current","total","classNames","styles"],"mappings":";;;;;;AAsBA,MAAMA,IAAkC,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,UAAAC,IAAW,SAAW;AAClF,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK;AAEtC,EAAAC,EAAM,UAAU,MAAM;AACpB,QAAI,CAACJ,KAAY,CAACD,EAAY;AAE9B,QAAI,CADc,aAAa,QAAQA,CAAU,GACjC;AACd,YAAMM,IAAQ,WAAW,MAAMH,EAAQ,EAAI,GAAG,GAAG;AACjD,aAAO,MAAM,aAAaG,CAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAACL,GAAUD,CAAU,CAAC;AAEzB,QAAMO,IAAc,MAAM;AACxB,IAAAJ,EAAQ,EAAK,GACTH,KAAY,aAAa,QAAQA,GAAY,MAAM;AAAA,EACzD;AAEA,SAAKD,EAAM,SAGT,gBAAAS,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAO,MAAK,QAAO,MAAM,gBAAAD,EAACE,GAAA,CAAA,CAAW,GAAI,SAAS,MAAMT,EAAQ,EAAI,GAAG,OAAM,MAAK;AAAA,IACnF,gBAAAO;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAAX;AAAA,QACA,SAASK;AAAA,QACT,UAAUA;AAAA,QACV,OAAAR;AAAA,QACA,kBAAkB,CAACe,GAASC,MAC1B,gBAAAP,EAAC,QAAA,EAAK,WAAWQ,EAAW,iBAAiBC,EAAO,eAAe,CAAC,GACjE,UAAA;AAAA,UAAAH,IAAU;AAAA,UAAE;AAAA,UAAIC;AAAA,QAAA,EAAA,CACnB;AAAA,MAAA;AAAA,IAAA;AAAA,EAEJ,GACF,IAhBwB;AAkB5B;"}
@@ -0,0 +1,7 @@
1
+ const o = {
2
+ "app-tour-root": "_app-tour-root_ybirw_1"
3
+ };
4
+ export {
5
+ o as default
6
+ };
7
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,97 @@
1
+ import { jsxs as V, jsx as s } from "react/jsx-runtime";
2
+ import { forwardRef as y, useRef as R, useImperativeHandle as g } from "react";
3
+ import { useVirtualScrollbar as j } from "../useVirtualScrollbar.js";
4
+ import l from "./style.module.scss.js";
5
+ import a from "classnames";
6
+ const C = y(
7
+ ({
8
+ children: n,
9
+ direction: o = "vertical",
10
+ autoHide: u = !0,
11
+ className: h,
12
+ wrapperClassName: m,
13
+ style: b,
14
+ onScroll: e,
15
+ ...f
16
+ }, d) => {
17
+ const i = R(null);
18
+ g(d, () => i.current);
19
+ const {
20
+ metrics: t,
21
+ active: p,
22
+ handleScroll: w,
23
+ handleMouseEnter: z,
24
+ handleMouseLeave: M,
25
+ startDrag: c,
26
+ handleTrackClick: v
27
+ } = j(i, o, u), N = o === "vertical" || o === "both", k = o === "horizontal" || o === "both", x = (r) => {
28
+ w(), e == null || e(r);
29
+ }, D = a(
30
+ a("virtual-scrollbar-root", l["virtual-scrollbar-root"]),
31
+ p && a("virtual-scrollbar-root-active", l["virtual-scrollbar-root-active"]),
32
+ m
33
+ );
34
+ return /* @__PURE__ */ V(
35
+ "div",
36
+ {
37
+ className: D,
38
+ style: b,
39
+ onMouseEnter: z,
40
+ onMouseLeave: M,
41
+ children: [
42
+ /* @__PURE__ */ s(
43
+ "div",
44
+ {
45
+ ref: i,
46
+ className: a("virtual-scrollbar-viewport", l["virtual-scrollbar-viewport"], h),
47
+ onScroll: x,
48
+ ...f,
49
+ children: n
50
+ }
51
+ ),
52
+ N && t.vertical.visible && /* @__PURE__ */ s(
53
+ "div",
54
+ {
55
+ className: a("virtual-scrollbar-track-vertical", l["virtual-scrollbar-track-vertical"]),
56
+ onMouseDown: (r) => v("vertical", r),
57
+ children: /* @__PURE__ */ s(
58
+ "div",
59
+ {
60
+ className: a("virtual-scrollbar-thumb", l["virtual-scrollbar-thumb"]),
61
+ style: {
62
+ height: t.vertical.size,
63
+ transform: `translateY(${t.vertical.offset}px)`
64
+ },
65
+ onMouseDown: (r) => c("vertical", r)
66
+ }
67
+ )
68
+ }
69
+ ),
70
+ k && t.horizontal.visible && /* @__PURE__ */ s(
71
+ "div",
72
+ {
73
+ className: a("virtual-scrollbar-track-horizontal", l["virtual-scrollbar-track-horizontal"]),
74
+ onMouseDown: (r) => v("horizontal", r),
75
+ children: /* @__PURE__ */ s(
76
+ "div",
77
+ {
78
+ className: a("virtual-scrollbar-thumb", l["virtual-scrollbar-thumb"]),
79
+ style: {
80
+ width: t.horizontal.size,
81
+ transform: `translateX(${t.horizontal.offset}px)`
82
+ },
83
+ onMouseDown: (r) => c("horizontal", r)
84
+ }
85
+ )
86
+ }
87
+ )
88
+ ]
89
+ }
90
+ );
91
+ }
92
+ );
93
+ C.displayName = "VirtualScrollbar";
94
+ export {
95
+ C as default
96
+ };
97
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/VirtualScrollbar/VirtualScrollbar/index.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useRef } from 'react';\nimport { useVirtualScrollbar, type ScrollDirection } from '../useVirtualScrollbar';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nexport interface VirtualScrollbarProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** 滚动方向,默认 vertical */\n direction?: ScrollDirection;\n /** 滚动/悬停后自动隐藏 thumb,默认 true */\n autoHide?: boolean;\n /** 外层容器 className */\n wrapperClassName?: string;\n}\n\n/** 覆盖式虚拟滚动条:隐藏原生滚动条,thumb 悬浮不占布局宽度 */\nconst VirtualScrollbar = forwardRef<HTMLDivElement, VirtualScrollbarProps>(\n (\n {\n children,\n direction = 'vertical',\n autoHide = true,\n className,\n wrapperClassName,\n style,\n onScroll,\n ...rest\n },\n ref,\n ) => {\n const viewportRef = useRef<HTMLDivElement>(null);\n\n useImperativeHandle(ref, () => viewportRef.current as HTMLDivElement);\n\n const {\n metrics,\n active,\n handleScroll,\n handleMouseEnter,\n handleMouseLeave,\n startDrag,\n handleTrackClick,\n } = useVirtualScrollbar(viewportRef, direction, autoHide);\n\n const showVertical = direction === 'vertical' || direction === 'both';\n const showHorizontal = direction === 'horizontal' || direction === 'both';\n\n const handleViewportScroll = (event: React.UIEvent<HTMLDivElement>) => {\n handleScroll();\n onScroll?.(event);\n };\n\n const rootClass = classNames(\n classNames('virtual-scrollbar-root', styles['virtual-scrollbar-root']),\n active && classNames('virtual-scrollbar-root-active', styles['virtual-scrollbar-root-active']),\n wrapperClassName,\n );\n\n return (\n <div\n className={rootClass}\n style={style}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <div\n ref={viewportRef}\n className={classNames('virtual-scrollbar-viewport', styles['virtual-scrollbar-viewport'], className)}\n onScroll={handleViewportScroll}\n {...rest}\n >\n {children}\n </div>\n\n {showVertical && metrics.vertical.visible && (\n <div\n className={classNames('virtual-scrollbar-track-vertical', styles['virtual-scrollbar-track-vertical'])}\n onMouseDown={(event) => handleTrackClick('vertical', event)}\n >\n <div\n className={classNames('virtual-scrollbar-thumb', styles['virtual-scrollbar-thumb'])}\n style={{\n height: metrics.vertical.size,\n transform: `translateY(${metrics.vertical.offset}px)`,\n }}\n onMouseDown={(event) => startDrag('vertical', event)}\n />\n </div>\n )}\n\n {showHorizontal && metrics.horizontal.visible && (\n <div\n className={classNames('virtual-scrollbar-track-horizontal', styles['virtual-scrollbar-track-horizontal'])}\n onMouseDown={(event) => handleTrackClick('horizontal', event)}\n >\n <div\n className={classNames('virtual-scrollbar-thumb', styles['virtual-scrollbar-thumb'])}\n style={{\n width: metrics.horizontal.size,\n transform: `translateX(${metrics.horizontal.offset}px)`,\n }}\n onMouseDown={(event) => startDrag('horizontal', event)}\n />\n </div>\n )}\n </div>\n );\n },\n);\n\nVirtualScrollbar.displayName = 'VirtualScrollbar';\n\nexport default VirtualScrollbar;\n"],"names":["VirtualScrollbar","forwardRef","children","direction","autoHide","className","wrapperClassName","style","onScroll","rest","ref","viewportRef","useRef","useImperativeHandle","metrics","active","handleScroll","handleMouseEnter","handleMouseLeave","startDrag","handleTrackClick","useVirtualScrollbar","showVertical","showHorizontal","handleViewportScroll","event","rootClass","classNames","styles","jsxs","jsx"],"mappings":";;;;;AAgBA,MAAMA,IAAmBC;AAAA,EACvB,CACE;AAAA,IACE,UAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,UAAAC,IAAW;AAAA,IACX,WAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,OAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAAcC,EAAuB,IAAI;AAE/C,IAAAC,EAAoBH,GAAK,MAAMC,EAAY,OAAyB;AAEpE,UAAM;AAAA,MACJ,SAAAG;AAAA,MACA,QAAAC;AAAA,MACA,cAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,WAAAC;AAAA,MACA,kBAAAC;AAAA,IAAA,IACEC,EAAoBV,GAAaR,GAAWC,CAAQ,GAElDkB,IAAenB,MAAc,cAAcA,MAAc,QACzDoB,IAAiBpB,MAAc,gBAAgBA,MAAc,QAE7DqB,IAAuB,CAACC,MAAyC;AACrE,MAAAT,EAAA,GACAR,KAAA,QAAAA,EAAWiB;AAAA,IACb,GAEMC,IAAYC;AAAA,MAChBA,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC;AAAA,MACrEb,KAAUY,EAAW,iCAAiCC,EAAO,+BAA+B,CAAC;AAAA,MAC7FtB;AAAA,IAAA;AAGF,WACE,gBAAAuB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWH;AAAA,QACX,OAAAnB;AAAA,QACA,cAAcU;AAAA,QACd,cAAcC;AAAA,QAEd,UAAA;AAAA,UAAA,gBAAAY;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKnB;AAAA,cACL,WAAWgB,EAAW,8BAA8BC,EAAO,4BAA4B,GAAGvB,CAAS;AAAA,cACnG,UAAUmB;AAAA,cACT,GAAGf;AAAA,cAEH,UAAAP;AAAA,YAAA;AAAA,UAAA;AAAA,UAGFoB,KAAgBR,EAAQ,SAAS,WAChC,gBAAAgB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWH,EAAW,oCAAoCC,EAAO,kCAAkC,CAAC;AAAA,cACpG,aAAa,CAACH,MAAUL,EAAiB,YAAYK,CAAK;AAAA,cAE1D,UAAA,gBAAAK;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAWH,EAAW,2BAA2BC,EAAO,yBAAyB,CAAC;AAAA,kBAClF,OAAO;AAAA,oBACL,QAAQd,EAAQ,SAAS;AAAA,oBACzB,WAAW,cAAcA,EAAQ,SAAS,MAAM;AAAA,kBAAA;AAAA,kBAElD,aAAa,CAACW,MAAUN,EAAU,YAAYM,CAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YACrD;AAAA,UAAA;AAAA,UAIHF,KAAkBT,EAAQ,WAAW,WACpC,gBAAAgB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWH,EAAW,sCAAsCC,EAAO,oCAAoC,CAAC;AAAA,cACxG,aAAa,CAACH,MAAUL,EAAiB,cAAcK,CAAK;AAAA,cAE5D,UAAA,gBAAAK;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAWH,EAAW,2BAA2BC,EAAO,yBAAyB,CAAC;AAAA,kBAClF,OAAO;AAAA,oBACL,OAAOd,EAAQ,WAAW;AAAA,oBAC1B,WAAW,cAAcA,EAAQ,WAAW,MAAM;AAAA,kBAAA;AAAA,kBAEpD,aAAa,CAACW,MAAUN,EAAU,cAAcM,CAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YACvD;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEAzB,EAAiB,cAAc;"}
@@ -0,0 +1,12 @@
1
+ const r = {
2
+ "virtual-scrollbar-root": "_virtual-scrollbar-root_hy6p8_1",
3
+ "virtual-scrollbar-root-active": "_virtual-scrollbar-root-active_hy6p8_10",
4
+ "virtual-scrollbar-viewport": "_virtual-scrollbar-viewport_hy6p8_14",
5
+ "virtual-scrollbar-track-vertical": "_virtual-scrollbar-track-vertical_hy6p8_32",
6
+ "virtual-scrollbar-track-horizontal": "_virtual-scrollbar-track-horizontal_hy6p8_44",
7
+ "virtual-scrollbar-thumb": "_virtual-scrollbar-thumb_hy6p8_49"
8
+ };
9
+ export {
10
+ r as default
11
+ };
12
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}