@hkyhy/marsun-components-core 0.1.5 → 0.1.10

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 (28) hide show
  1. package/dist/components/File/FilePreview/FilePreviewContent.d.ts +9 -0
  2. package/dist/components/File/FilePreview/FilePreviewContent.js +83 -0
  3. package/dist/components/File/FilePreview/FilePreviewContent.js.map +1 -0
  4. package/dist/components/File/FilePreview/index.d.ts +2 -0
  5. package/dist/components/File/FilePreview/index.js +46 -39
  6. package/dist/components/File/FilePreview/index.js.map +1 -1
  7. package/dist/components/File/FilePreview/style.module.scss.js +19 -2
  8. package/dist/components/File/FilePreview/style.module.scss.js.map +1 -1
  9. package/dist/components/File/FilePreviewLink/index.d.ts +13 -0
  10. package/dist/components/File/FilePreviewLink/index.js +61 -0
  11. package/dist/components/File/FilePreviewLink/index.js.map +1 -0
  12. package/dist/components/File/FilePreviewLink/style.module.scss.js +11 -0
  13. package/dist/components/File/FilePreviewLink/style.module.scss.js.map +1 -0
  14. package/dist/components/File/FilePreviewModal/index.d.ts +3 -0
  15. package/dist/components/File/FilePreviewModal/index.js +37 -8
  16. package/dist/components/File/FilePreviewModal/index.js.map +1 -1
  17. package/dist/components/File/fileDisplay.d.ts +2 -0
  18. package/dist/components/File/fileDisplay.js +25 -21
  19. package/dist/components/File/fileDisplay.js.map +1 -1
  20. package/dist/components/File/index.d.ts +3 -1
  21. package/dist/components/File/previewKind.d.ts +6 -0
  22. package/dist/components/File/previewKind.js +42 -0
  23. package/dist/components/File/previewKind.js.map +1 -0
  24. package/dist/index.js +98 -95
  25. package/dist/index.js.map +1 -1
  26. package/dist/marsun-components-core.css +1 -1
  27. package/dist/styles/global.css +1 -1
  28. package/package.json +4 -1
@@ -0,0 +1,9 @@
1
+ import { default as React } from 'react';
2
+ import { FileDisplayItem } from '../types';
3
+ interface FilePreviewContentProps {
4
+ file: FileDisplayItem;
5
+ previewUrl?: string;
6
+ unsupportedMessage?: string;
7
+ }
8
+ declare const FilePreviewContent: React.FC<FilePreviewContentProps>;
9
+ export default FilePreviewContent;
@@ -0,0 +1,83 @@
1
+ import { jsx as t } from "react/jsx-runtime";
2
+ import { Empty as u, Spin as N } from "antd";
3
+ import { useRef as v, useState as h, useEffect as x } from "react";
4
+ import { getPreviewKind as E, needsBlobPreview as P } from "../previewKind.js";
5
+ import s from "./style.module.scss.js";
6
+ import b from "classnames";
7
+ async function B(i) {
8
+ const e = await fetch(i);
9
+ if (!e.ok) throw new Error(`预览加载失败 (${e.status})`);
10
+ return e.arrayBuffer();
11
+ }
12
+ async function T(i, e) {
13
+ const [{ default: o }] = await Promise.all([
14
+ import("@js-preview/excel"),
15
+ Promise.resolve({ })
16
+ ]), n = o.init(i);
17
+ return await n.preview(e), () => n.destroy();
18
+ }
19
+ async function W(i, e) {
20
+ const { renderAsync: o } = await import("docx-preview"), n = new Blob([e]);
21
+ await o(n, i, i, {
22
+ inWrapper: !0,
23
+ ignoreWidth: !1,
24
+ ignoreHeight: !1,
25
+ breakPages: !0
26
+ });
27
+ }
28
+ async function k(i, e, o) {
29
+ const { init: n } = await import("pptx-preview"), a = n(i, { width: o, height: Math.round(o * 0.5625), mode: "list" });
30
+ return await a.preview(e), () => a.destroy();
31
+ }
32
+ function C(i, e) {
33
+ const o = new TextDecoder("utf-8"), n = document.createElement("pre");
34
+ n.className = s["file-preview-text"], n.textContent = o.decode(e), i.appendChild(n);
35
+ }
36
+ const F = ({
37
+ file: i,
38
+ previewUrl: e,
39
+ unsupportedMessage: o = "暂不支持预览此文件类型"
40
+ }) => {
41
+ const n = v(null), a = v(void 0), [g, l] = h(!1), [m, p] = h(null), r = E(i);
42
+ return x(() => {
43
+ var w;
44
+ const f = n.current;
45
+ if (!f || !e) return;
46
+ let d = !1;
47
+ return (w = a.current) == null || w.call(a), a.current = void 0, f.innerHTML = "", p(null), (async () => {
48
+ if (r !== "image" && !(r === "pdf" || r === "iframe") && !(r === "video" || r === "audio") && r !== "unsupported") {
49
+ l(!0);
50
+ try {
51
+ const c = await B(e);
52
+ if (d) return;
53
+ if (r === "excel")
54
+ a.current = await T(f, c);
55
+ else if (r === "word")
56
+ await W(f, c);
57
+ else if (r === "ppt") {
58
+ const y = f.clientWidth || 852;
59
+ a.current = await k(f, c, y);
60
+ } else r === "text" && C(f, c);
61
+ } catch (c) {
62
+ d || p(c instanceof Error ? c.message : "预览加载失败");
63
+ } finally {
64
+ d || l(!1);
65
+ }
66
+ }
67
+ })(), () => {
68
+ var c;
69
+ d = !0, (c = a.current) == null || c.call(a), a.current = void 0, f.innerHTML = "";
70
+ };
71
+ }, [e, r, i.id, i.name]), e ? r === "image" ? /* @__PURE__ */ t("div", { className: s["file-preview-media-wrap"], children: /* @__PURE__ */ t("img", { src: e, alt: i.name, className: s["file-preview-image"] }) }) : r === "pdf" || r === "iframe" ? /* @__PURE__ */ t(
72
+ "iframe",
73
+ {
74
+ src: e,
75
+ title: i.name,
76
+ className: s["file-preview-iframe"]
77
+ }
78
+ ) : r === "video" ? /* @__PURE__ */ t("div", { className: s["file-preview-media-wrap"], children: /* @__PURE__ */ t("video", { src: e, controls: !0, className: s["file-preview-video"] }) }) : r === "audio" ? /* @__PURE__ */ t("div", { className: s["file-preview-audio-wrap"], children: /* @__PURE__ */ t("audio", { src: e, controls: !0, className: s["file-preview-audio"] }) }) : r === "unsupported" ? /* @__PURE__ */ t(u, { description: o }) : P(r) ? /* @__PURE__ */ t("div", { className: b(s["file-preview-office"], s["file-preview-office-wrap"]), children: /* @__PURE__ */ t(N, { spinning: g, children: m ? /* @__PURE__ */ t(u, { description: m }) : /* @__PURE__ */ t("div", { ref: n, className: s["file-preview-office-inner"] }) }) }) : /* @__PURE__ */ t(u, { description: o }) : /* @__PURE__ */ t(u, { description: "无可预览地址" });
79
+ };
80
+ export {
81
+ F as default
82
+ };
83
+ //# sourceMappingURL=FilePreviewContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePreviewContent.js","sources":["../../../../src/components/File/FilePreview/FilePreviewContent.tsx"],"sourcesContent":["import { Empty, Spin } from 'antd';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { getPreviewKind, needsBlobPreview } from '../previewKind';\nimport type { FileDisplayItem } from '../types';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\ninterface FilePreviewContentProps {\n file: FileDisplayItem;\n previewUrl?: string;\n unsupportedMessage?: string;\n}\n\nasync function fetchPreviewBlob(url: string): Promise<ArrayBuffer> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`预览加载失败 (${res.status})`);\n return res.arrayBuffer();\n}\n\nasync function renderExcel(container: HTMLElement, data: ArrayBuffer) {\n const [{ default: jsPreviewExcel }] = await Promise.all([\n import('@js-preview/excel'),\n import('@js-preview/excel/lib/index.css'),\n ]);\n const instance = jsPreviewExcel.init(container);\n await instance.preview(data);\n return () => instance.destroy();\n}\n\nasync function renderWord(container: HTMLElement, data: ArrayBuffer) {\n const { renderAsync } = await import('docx-preview');\n const blob = new Blob([data]);\n await renderAsync(blob, container, container, {\n inWrapper: true,\n ignoreWidth: false,\n ignoreHeight: false,\n breakPages: true,\n });\n}\n\nasync function renderPpt(container: HTMLElement, data: ArrayBuffer, width: number) {\n const { init } = await import('pptx-preview');\n const previewer = init(container, { width, height: Math.round(width * 0.5625), mode: 'list' });\n await previewer.preview(data);\n return () => previewer.destroy();\n}\n\nfunction renderText(container: HTMLElement, data: ArrayBuffer) {\n const decoder = new TextDecoder('utf-8');\n const pre = document.createElement('pre');\n pre.className = styles['file-preview-text'] ?? '';\n pre.textContent = decoder.decode(data);\n container.appendChild(pre);\n}\n\nconst FilePreviewContent: React.FC<FilePreviewContentProps> = ({\n file,\n previewUrl,\n unsupportedMessage = '暂不支持预览此文件类型',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const cleanupRef = useRef<(() => void) | void>(undefined);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const kind = getPreviewKind(file);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !previewUrl) return undefined;\n\n let cancelled = false;\n cleanupRef.current?.();\n cleanupRef.current = undefined;\n container.innerHTML = '';\n setError(null);\n\n const run = async () => {\n if (kind === 'image') return;\n if (kind === 'pdf' || kind === 'iframe') return;\n if (kind === 'video' || kind === 'audio') return;\n if (kind === 'unsupported') return;\n\n setLoading(true);\n try {\n const data = await fetchPreviewBlob(previewUrl);\n if (cancelled) return;\n\n if (kind === 'excel') {\n cleanupRef.current = await renderExcel(container, data);\n } else if (kind === 'word') {\n await renderWord(container, data);\n } else if (kind === 'ppt') {\n const width = container.clientWidth || 852;\n cleanupRef.current = await renderPpt(container, data, width);\n } else if (kind === 'text') {\n renderText(container, data);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : '预览加载失败');\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n\n void run();\n\n return () => {\n cancelled = true;\n cleanupRef.current?.();\n cleanupRef.current = undefined;\n container.innerHTML = '';\n };\n }, [previewUrl, kind, file.id, file.name]);\n\n if (!previewUrl) {\n return <Empty description=\"无可预览地址\" />;\n }\n\n if (kind === 'image') {\n return (\n <div className={styles['file-preview-media-wrap']}>\n <img src={previewUrl} alt={file.name} className={styles['file-preview-image']} />\n </div>\n );\n }\n\n if (kind === 'pdf' || kind === 'iframe') {\n return (\n <iframe\n src={previewUrl}\n title={file.name}\n className={styles['file-preview-iframe']}\n />\n );\n }\n\n if (kind === 'video') {\n return (\n <div className={styles['file-preview-media-wrap']}>\n <video src={previewUrl} controls className={styles['file-preview-video']} />\n </div>\n );\n }\n\n if (kind === 'audio') {\n return (\n <div className={styles['file-preview-audio-wrap']}>\n <audio src={previewUrl} controls className={styles['file-preview-audio']} />\n </div>\n );\n }\n\n if (kind === 'unsupported') {\n return <Empty description={unsupportedMessage} />;\n }\n\n if (needsBlobPreview(kind)) {\n return (\n <div className={classNames(styles['file-preview-office'], styles['file-preview-office-wrap'])}>\n <Spin spinning={loading}>\n {error ? <Empty description={error} /> : <div ref={containerRef} className={styles['file-preview-office-inner']} />}\n </Spin>\n </div>\n );\n }\n\n return <Empty description={unsupportedMessage} />;\n};\n\nexport default FilePreviewContent;\n"],"names":["fetchPreviewBlob","url","res","renderExcel","container","data","jsPreviewExcel","instance","renderWord","renderAsync","blob","renderPpt","width","init","previewer","renderText","decoder","pre","styles","FilePreviewContent","file","previewUrl","unsupportedMessage","containerRef","useRef","cleanupRef","loading","setLoading","useState","error","setError","kind","getPreviewKind","useEffect","cancelled","_a","err","jsx","Empty","needsBlobPreview","classNames","Spin"],"mappings":";;;;;;AAaA,eAAeA,EAAiBC,GAAmC;AACjE,QAAMC,IAAM,MAAM,MAAMD,CAAG;AAC3B,MAAI,CAACC,EAAI,GAAI,OAAM,IAAI,MAAM,WAAWA,EAAI,MAAM,GAAG;AACrD,SAAOA,EAAI,YAAA;AACb;AAEA,eAAeC,EAAYC,GAAwBC,GAAmB;AACpE,QAAM,CAAC,EAAE,SAASC,EAAA,CAAgB,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtD,OAAO,mBAAmB;AAAA,IAC1B,OAAO,0DAAiC;AAAA,EAAA,CACzC,GACKC,IAAWD,EAAe,KAAKF,CAAS;AAC9C,eAAMG,EAAS,QAAQF,CAAI,GACpB,MAAME,EAAS,QAAA;AACxB;AAEA,eAAeC,EAAWJ,GAAwBC,GAAmB;AACnE,QAAM,EAAE,aAAAI,EAAA,IAAgB,MAAM,OAAO,cAAc,GAC7CC,IAAO,IAAI,KAAK,CAACL,CAAI,CAAC;AAC5B,QAAMI,EAAYC,GAAMN,GAAWA,GAAW;AAAA,IAC5C,WAAW;AAAA,IACX,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,EAAA,CACb;AACH;AAEA,eAAeO,EAAUP,GAAwBC,GAAmBO,GAAe;AACjF,QAAM,EAAE,MAAAC,EAAA,IAAS,MAAM,OAAO,cAAc,GACtCC,IAAYD,EAAKT,GAAW,EAAE,OAAAQ,GAAO,QAAQ,KAAK,MAAMA,IAAQ,MAAM,GAAG,MAAM,QAAQ;AAC7F,eAAME,EAAU,QAAQT,CAAI,GACrB,MAAMS,EAAU,QAAA;AACzB;AAEA,SAASC,EAAWX,GAAwBC,GAAmB;AAC7D,QAAMW,IAAU,IAAI,YAAY,OAAO,GACjCC,IAAM,SAAS,cAAc,KAAK;AACxC,EAAAA,EAAI,YAAYC,EAAO,mBAAmB,GAC1CD,EAAI,cAAcD,EAAQ,OAAOX,CAAI,GACrCD,EAAU,YAAYa,CAAG;AAC3B;AAEA,MAAME,IAAwD,CAAC;AAAA,EAC7D,MAAAC;AAAA,EACA,YAAAC;AAAA,EACA,oBAAAC,IAAqB;AACvB,MAAM;AACJ,QAAMC,IAAeC,EAAuB,IAAI,GAC1CC,IAAaD,EAA4B,MAAS,GAClD,CAACE,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtC,CAACC,GAAOC,CAAQ,IAAIF,EAAwB,IAAI,GAChDG,IAAOC,EAAeZ,CAAI;AAoDhC,SAlDAa,EAAU,MAAM;;AACd,UAAM7B,IAAYmB,EAAa;AAC/B,QAAI,CAACnB,KAAa,CAACiB,EAAY;AAE/B,QAAIa,IAAY;AAChB,YAAAC,IAAAV,EAAW,YAAX,QAAAU,EAAA,KAAAV,IACAA,EAAW,UAAU,QACrBrB,EAAU,YAAY,IACtB0B,EAAS,IAAI,IAED,YAAY;AACtB,UAAIC,MAAS,WACT,EAAAA,MAAS,SAASA,MAAS,aAC3B,EAAAA,MAAS,WAAWA,MAAS,YAC7BA,MAAS,eAEb;AAAA,QAAAJ,EAAW,EAAI;AACf,YAAI;AACF,gBAAMtB,IAAO,MAAML,EAAiBqB,CAAU;AAC9C,cAAIa,EAAW;AAEf,cAAIH,MAAS;AACX,YAAAN,EAAW,UAAU,MAAMtB,EAAYC,GAAWC,CAAI;AAAA,mBAC7C0B,MAAS;AAClB,kBAAMvB,EAAWJ,GAAWC,CAAI;AAAA,mBACvB0B,MAAS,OAAO;AACzB,kBAAMnB,IAAQR,EAAU,eAAe;AACvC,YAAAqB,EAAW,UAAU,MAAMd,EAAUP,GAAWC,GAAMO,CAAK;AAAA,UAC7D,MAAA,CAAWmB,MAAS,UAClBhB,EAAWX,GAAWC,CAAI;AAAA,QAE9B,SAAS+B,GAAK;AACZ,UAAKF,KACHJ,EAASM,aAAe,QAAQA,EAAI,UAAU,QAAQ;AAAA,QAE1D,UAAA;AACE,UAAKF,KAAWP,EAAW,EAAK;AAAA,QAClC;AAAA;AAAA,IACF,GAEK,GAEE,MAAM;;AACX,MAAAO,IAAY,KACZC,IAAAV,EAAW,YAAX,QAAAU,EAAA,KAAAV,IACAA,EAAW,UAAU,QACrBrB,EAAU,YAAY;AAAA,IACxB;AAAA,EACF,GAAG,CAACiB,GAAYU,GAAMX,EAAK,IAAIA,EAAK,IAAI,CAAC,GAEpCC,IAIDU,MAAS,4BAER,OAAA,EAAI,WAAWb,EAAO,yBAAyB,GAC9C,UAAA,gBAAAmB,EAAC,OAAA,EAAI,KAAKhB,GAAY,KAAKD,EAAK,MAAM,WAAWF,EAAO,oBAAoB,GAAG,GACjF,IAIAa,MAAS,SAASA,MAAS,WAE3B,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKhB;AAAA,MACL,OAAOD,EAAK;AAAA,MACZ,WAAWF,EAAO,qBAAqB;AAAA,IAAA;AAAA,EAAA,IAKzCa,MAAS,4BAER,OAAA,EAAI,WAAWb,EAAO,yBAAyB,GAC9C,UAAA,gBAAAmB,EAAC,SAAA,EAAM,KAAKhB,GAAY,UAAQ,IAAC,WAAWH,EAAO,oBAAoB,GAAG,GAC5E,IAIAa,MAAS,4BAER,OAAA,EAAI,WAAWb,EAAO,yBAAyB,GAC9C,UAAA,gBAAAmB,EAAC,SAAA,EAAM,KAAKhB,GAAY,UAAQ,IAAC,WAAWH,EAAO,oBAAoB,GAAG,GAC5E,IAIAa,MAAS,gBACJ,gBAAAM,EAACC,GAAA,EAAM,aAAahB,EAAA,CAAoB,IAG7CiB,EAAiBR,CAAI,IAErB,gBAAAM,EAAC,OAAA,EAAI,WAAWG,EAAWtB,EAAO,qBAAqB,GAAGA,EAAO,0BAA0B,CAAC,GAC1F,UAAA,gBAAAmB,EAACI,KAAK,UAAUf,GACb,UAAAG,IAAQ,gBAAAQ,EAACC,GAAA,EAAM,aAAaT,EAAA,CAAO,IAAK,gBAAAQ,EAAC,OAAA,EAAI,KAAKd,GAAc,WAAWL,EAAO,2BAA2B,EAAA,CAAG,GACnH,GACF,IAIG,gBAAAmB,EAACC,GAAA,EAAM,aAAahB,EAAA,CAAoB,IAnDtC,gBAAAe,EAACC,GAAA,EAAM,aAAY,SAAA,CAAS;AAoDvC;"}
@@ -3,6 +3,8 @@ import { FileDisplayItem } from '../types';
3
3
  export interface FilePreviewProps {
4
4
  file: FileDisplayItem;
5
5
  url?: string;
6
+ downloadUrl?: string;
7
+ onDownload?: (file: FileDisplayItem) => void;
6
8
  unsupportedMessage?: string;
7
9
  title?: React.ReactNode;
8
10
  extra?: React.ReactNode;
@@ -1,49 +1,56 @@
1
- import { jsxs as a, jsx as i, Fragment as f } from "react/jsx-runtime";
2
- import { formatFileSize as d } from "../../../utils/format.js";
3
- import { CloudDownload as v } from "../../Icons/index.js";
4
- import { Button as w, Empty as h, Image as u } from "antd";
5
- import { normalizeFileDisplayItem as g, getFileIcon as N, getFileTypeName as y } from "../fileDisplay.js";
1
+ import { jsxs as o, Fragment as y, jsx as i } from "react/jsx-runtime";
2
+ import { formatFileSize as F } from "../../../utils/format.js";
3
+ import { CloudDownload as N } from "../../Icons/index.js";
4
+ import g from "../../Tag/SemanticTag.js";
5
+ import { Button as T } from "antd";
6
+ import { normalizeFileDisplayItem as b, getFileTypeName as z, getFileIcon as C } from "../fileDisplay.js";
7
+ import { getPreviewKind as P, getFileTypeTagColor as U } from "../previewKind.js";
8
+ import k from "./FilePreviewContent.js";
6
9
  import r from "./style.module.scss.js";
7
- import p from "classnames";
8
- function F(l, t) {
9
- return t ?? l.url ?? l.thumbnailUrl;
10
+ import t from "classnames";
11
+ function x(l, n) {
12
+ return n ?? l.url ?? l.thumbnailUrl;
10
13
  }
11
- function o(l) {
12
- var n;
13
- if ((l.mimeType ?? "").startsWith("image/")) return !0;
14
- const s = ((n = (l.name ?? "").split(".").pop()) == null ? void 0 : n.toLowerCase()) ?? "";
15
- return ["png", "jpg", "jpeg", "gif", "webp", "svg"].includes(s);
16
- }
17
- const k = ({
14
+ const E = ({
18
15
  file: l,
19
- url: t,
20
- unsupportedMessage: s = "暂不支持预览此文件类型",
21
- title: n,
22
- extra: c
16
+ url: n,
17
+ downloadUrl: p,
18
+ onDownload: a,
19
+ unsupportedMessage: c = "暂不支持预览此文件类型",
20
+ title: d,
21
+ extra: f
23
22
  }) => {
24
- const e = g(l), m = F(e, t);
25
- return /* @__PURE__ */ a("div", { className: p("file-preview", r["file-preview"]), children: [
26
- /* @__PURE__ */ a("div", { className: p("file-preview-header", r["file-preview-header"]), children: [
27
- /* @__PURE__ */ i("div", { className: p("file-preview-title", r["file-preview-title"]), children: n ?? /* @__PURE__ */ a(f, { children: [
28
- /* @__PURE__ */ i("span", { className: r["file-preview-icon"], children: N(e.name, e.mimeType) }),
29
- /* @__PURE__ */ i("span", { children: e.name }),
30
- /* @__PURE__ */ a("span", { className: r["file-preview-meta"], children: [
31
- y(e.name, e.mimeType),
32
- e.size != null && ` · ${d(e.size)}`
33
- ] })
34
- ] }) }),
35
- c,
36
- m && /* @__PURE__ */ i(w, { type: "link", icon: /* @__PURE__ */ i(v, {}), href: m, target: "_blank", rel: "noreferrer", children: "下载" })
23
+ const e = b(l), s = x(e, n), m = p ?? s, v = !!(a || m), w = P(e), h = z(e.name, e.mimeType), u = () => {
24
+ if (a) {
25
+ a(e);
26
+ return;
27
+ }
28
+ m && window.open(m, "_blank", "noopener,noreferrer");
29
+ };
30
+ return /* @__PURE__ */ o("div", { className: t("file-preview", r["file-preview"]), children: [
31
+ /* @__PURE__ */ o("div", { className: t("file-preview-header", r["file-preview-header"]), children: [
32
+ d ?? /* @__PURE__ */ o(y, { children: [
33
+ /* @__PURE__ */ o("div", { className: r["file-preview-info"], children: [
34
+ /* @__PURE__ */ i("span", { className: r["file-preview-icon"], children: C(e.name, e.mimeType) }),
35
+ /* @__PURE__ */ i("span", { className: r["file-preview-name"], title: e.name, children: e.name }),
36
+ /* @__PURE__ */ i(g, { color: U(w), children: h }),
37
+ e.size != null && /* @__PURE__ */ i("span", { className: r["file-preview-size"], children: F(e.size) })
38
+ ] }),
39
+ v && /* @__PURE__ */ i(T, { type: "link", icon: /* @__PURE__ */ i(N, {}), onClick: u, children: "下载" })
40
+ ] }),
41
+ f
37
42
  ] }),
38
- /* @__PURE__ */ a("div", { className: p("file-preview-body", r["file-preview-body"]), children: [
39
- !m && /* @__PURE__ */ i(h, { description: "无可预览地址" }),
40
- m && o(e) && /* @__PURE__ */ i(u, { src: m, alt: e.name, className: r["file-preview-image"] }),
41
- m && !o(e) && /* @__PURE__ */ i("iframe", { src: m, title: e.name, className: r["file-preview-iframe"] }),
42
- m && !o(l) && s && /* @__PURE__ */ i("p", { className: r["file-preview-unsupported"], children: s })
43
- ] })
43
+ /* @__PURE__ */ i("div", { className: t("file-preview-body", r["file-preview-body"]), children: /* @__PURE__ */ i(
44
+ k,
45
+ {
46
+ file: e,
47
+ previewUrl: s,
48
+ unsupportedMessage: c
49
+ }
50
+ ) })
44
51
  ] });
45
52
  };
46
53
  export {
47
- k as default
54
+ E as default
48
55
  };
49
56
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/File/FilePreview/index.tsx"],"sourcesContent":["import { formatFileSize } from '@/utils/format';\nimport { CloudDownload } from '@/components/Icons';\nimport { Button, Empty, Image } from 'antd';\nimport React from 'react';\nimport { getFileIcon, getFileTypeName, normalizeFileDisplayItem } from '../fileDisplay';\nimport type { FileDisplayItem } from '../types';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nexport interface FilePreviewProps {\n file: FileDisplayItem;\n url?: string;\n unsupportedMessage?: string;\n title?: React.ReactNode;\n extra?: React.ReactNode;\n}\n\nfunction resolvePreviewUrl(file: FileDisplayItem, url?: string): string | undefined {\n return url ?? file.url ?? file.thumbnailUrl;\n}\n\nfunction isImage(file: FileDisplayItem): boolean {\n const mime = file.mimeType ?? '';\n if (mime.startsWith('image/')) return true;\n const ext = (file.name ?? '').split('.').pop()?.toLowerCase() ?? '';\n return ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(ext);\n}\n\nconst FilePreview: React.FC<FilePreviewProps> = ({\n file,\n url,\n unsupportedMessage = '暂不支持预览此文件类型',\n title,\n extra,\n}) => {\n const resolvedFile = normalizeFileDisplayItem(file);\n const previewUrl = resolvePreviewUrl(resolvedFile, url);\n\n return (\n <div className={classNames('file-preview', styles['file-preview'])}>\n <div className={classNames('file-preview-header', styles['file-preview-header'])}>\n <div className={classNames('file-preview-title', styles['file-preview-title'])}>\n {title ?? (\n <>\n <span className={styles['file-preview-icon']}>{getFileIcon(resolvedFile.name, resolvedFile.mimeType)}</span>\n <span>{resolvedFile.name}</span>\n <span className={styles['file-preview-meta']}>\n {getFileTypeName(resolvedFile.name, resolvedFile.mimeType)}\n {resolvedFile.size != null && ` · ${formatFileSize(resolvedFile.size)}`}\n </span>\n </>\n )}\n </div>\n {extra}\n {previewUrl && (\n <Button type=\"link\" icon={<CloudDownload />} href={previewUrl} target=\"_blank\" rel=\"noreferrer\">\n 下载\n </Button>\n )}\n </div>\n <div className={classNames('file-preview-body', styles['file-preview-body'])}>\n {!previewUrl && <Empty description=\"无可预览地址\" />}\n {previewUrl && isImage(resolvedFile) && (\n <Image src={previewUrl} alt={resolvedFile.name} className={styles['file-preview-image']} />\n )}\n {previewUrl && !isImage(resolvedFile) && (\n <iframe src={previewUrl} title={resolvedFile.name} className={styles['file-preview-iframe']} />\n )}\n {previewUrl && !isImage(file) && unsupportedMessage && (\n <p className={styles['file-preview-unsupported']}>{unsupportedMessage}</p>\n )}\n </div>\n </div>\n );\n};\n\nexport default FilePreview;\n"],"names":["resolvePreviewUrl","file","url","isImage","ext","_a","FilePreview","unsupportedMessage","title","extra","resolvedFile","normalizeFileDisplayItem","previewUrl","jsxs","classNames","styles","jsx","Fragment","getFileTypeName","formatFileSize","Button","CloudDownload","Empty","Image"],"mappings":";;;;;;;AAiBA,SAASA,EAAkBC,GAAuBC,GAAkC;AAClF,SAAOA,KAAOD,EAAK,OAAOA,EAAK;AACjC;AAEA,SAASE,EAAQF,GAAgC;;AAE/C,OADaA,EAAK,YAAY,IACrB,WAAW,QAAQ,EAAG,QAAO;AACtC,QAAMG,MAAOC,KAAAJ,EAAK,QAAQ,IAAI,MAAM,GAAG,EAAE,UAA5B,gBAAAI,EAAmC,kBAAiB;AACjE,SAAO,CAAC,OAAO,OAAO,QAAQ,OAAO,QAAQ,KAAK,EAAE,SAASD,CAAG;AAClE;AAEA,MAAME,IAA0C,CAAC;AAAA,EAC/C,MAAAL;AAAA,EACA,KAAAC;AAAA,EACA,oBAAAK,IAAqB;AAAA,EACrB,OAAAC;AAAA,EACA,OAAAC;AACF,MAAM;AACJ,QAAMC,IAAeC,EAAyBV,CAAI,GAC5CW,IAAaZ,EAAkBU,GAAcR,CAAG;AAEtD,SACE,gBAAAW,EAAC,SAAI,WAAWC,EAAW,gBAAgBC,EAAO,cAAc,CAAC,GAC/D,UAAA;AAAA,IAAA,gBAAAF,EAAC,SAAI,WAAWC,EAAW,uBAAuBC,EAAO,qBAAqB,CAAC,GAC7E,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWF,EAAW,sBAAsBC,EAAO,oBAAoB,CAAC,GAC1E,UAAAP,KACC,gBAAAK,EAAAI,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAD,EAAC,QAAA,EAAK,WAAWD,EAAO,mBAAmB,GAAI,YAAYL,EAAa,MAAMA,EAAa,QAAQ,EAAA,CAAE;AAAA,QACrG,gBAAAM,EAAC,QAAA,EAAM,UAAAN,EAAa,KAAA,CAAK;AAAA,QACzB,gBAAAG,EAAC,QAAA,EAAK,WAAWE,EAAO,mBAAmB,GACxC,UAAA;AAAA,UAAAG,EAAgBR,EAAa,MAAMA,EAAa,QAAQ;AAAA,UACxDA,EAAa,QAAQ,QAAQ,MAAMS,EAAeT,EAAa,IAAI,CAAC;AAAA,QAAA,EAAA,CACvE;AAAA,MAAA,EAAA,CACF,EAAA,CAEJ;AAAA,MACCD;AAAA,MACAG,KACC,gBAAAI,EAACI,GAAA,EAAO,MAAK,QAAO,MAAM,gBAAAJ,EAACK,GAAA,CAAA,CAAc,GAAI,MAAMT,GAAY,QAAO,UAAS,KAAI,cAAa,UAAA,KAAA,CAEhG;AAAA,IAAA,GAEJ;AAAA,IACA,gBAAAC,EAAC,SAAI,WAAWC,EAAW,qBAAqBC,EAAO,mBAAmB,CAAC,GACxE,UAAA;AAAA,MAAA,CAACH,KAAc,gBAAAI,EAACM,GAAA,EAAM,aAAY,SAAA,CAAS;AAAA,MAC3CV,KAAcT,EAAQO,CAAY,uBAChCa,GAAA,EAAM,KAAKX,GAAY,KAAKF,EAAa,MAAM,WAAWK,EAAO,oBAAoB,GAAG;AAAA,MAE1FH,KAAc,CAACT,EAAQO,CAAY,KAClC,gBAAAM,EAAC,UAAA,EAAO,KAAKJ,GAAY,OAAOF,EAAa,MAAM,WAAWK,EAAO,qBAAqB,GAAG;AAAA,MAE9FH,KAAc,CAACT,EAAQF,CAAI,KAAKM,KAC/B,gBAAAS,EAAC,KAAA,EAAE,WAAWD,EAAO,0BAA0B,GAAI,UAAAR,EAAA,CAAmB;AAAA,IAAA,EAAA,CAE1E;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/File/FilePreview/index.tsx"],"sourcesContent":["import { formatFileSize } from '@/utils/format';\nimport { CloudDownload } from '@/components/Icons';\nimport SemanticTag from '@/components/Tag/SemanticTag';\nimport { Button } from 'antd';\nimport React from 'react';\nimport { getFileIcon, getFileTypeName, normalizeFileDisplayItem } from '../fileDisplay';\nimport { getFileTypeTagColor, getPreviewKind } from '../previewKind';\nimport type { FileDisplayItem } from '../types';\nimport FilePreviewContent from './FilePreviewContent';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nexport interface FilePreviewProps {\n file: FileDisplayItem;\n url?: string;\n downloadUrl?: string;\n onDownload?: (file: FileDisplayItem) => void;\n unsupportedMessage?: string;\n title?: React.ReactNode;\n extra?: React.ReactNode;\n}\n\nfunction resolvePreviewUrl(file: FileDisplayItem, url?: string): string | undefined {\n return url ?? file.url ?? file.thumbnailUrl;\n}\n\nconst FilePreview: React.FC<FilePreviewProps> = ({\n file,\n url,\n downloadUrl,\n onDownload,\n unsupportedMessage = '暂不支持预览此文件类型',\n title,\n extra,\n}) => {\n const resolvedFile = normalizeFileDisplayItem(file);\n const previewUrl = resolvePreviewUrl(resolvedFile, url);\n const resolvedDownloadUrl = downloadUrl ?? previewUrl;\n const canDownload = Boolean(onDownload || resolvedDownloadUrl);\n const previewKind = getPreviewKind(resolvedFile);\n const typeLabel = getFileTypeName(resolvedFile.name, resolvedFile.mimeType);\n\n const handleDownload = () => {\n if (onDownload) {\n onDownload(resolvedFile);\n return;\n }\n if (resolvedDownloadUrl) {\n window.open(resolvedDownloadUrl, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <div className={classNames('file-preview', styles['file-preview'])}>\n <div className={classNames('file-preview-header', styles['file-preview-header'])}>\n {title ?? (\n <>\n <div className={styles['file-preview-info']}>\n <span className={styles['file-preview-icon']}>\n {getFileIcon(resolvedFile.name, resolvedFile.mimeType)}\n </span>\n <span className={styles['file-preview-name']} title={resolvedFile.name}>\n {resolvedFile.name}\n </span>\n <SemanticTag color={getFileTypeTagColor(previewKind)}>{typeLabel}</SemanticTag>\n {resolvedFile.size != null && (\n <span className={styles['file-preview-size']}>{formatFileSize(resolvedFile.size)}</span>\n )}\n </div>\n {canDownload && (\n <Button type=\"link\" icon={<CloudDownload />} onClick={handleDownload}>\n 下载\n </Button>\n )}\n </>\n )}\n {extra}\n </div>\n <div className={classNames('file-preview-body', styles['file-preview-body'])}>\n <FilePreviewContent\n file={resolvedFile}\n previewUrl={previewUrl}\n unsupportedMessage={unsupportedMessage}\n />\n </div>\n </div>\n );\n};\n\nexport default FilePreview;\n"],"names":["resolvePreviewUrl","file","url","FilePreview","downloadUrl","onDownload","unsupportedMessage","title","extra","resolvedFile","normalizeFileDisplayItem","previewUrl","resolvedDownloadUrl","canDownload","previewKind","getPreviewKind","typeLabel","getFileTypeName","handleDownload","jsxs","classNames","styles","Fragment","jsx","SemanticTag","getFileTypeTagColor","formatFileSize","Button","CloudDownload","FilePreviewContent"],"mappings":";;;;;;;;;;AAsBA,SAASA,EAAkBC,GAAuBC,GAAkC;AAClF,SAAOA,KAAOD,EAAK,OAAOA,EAAK;AACjC;AAEA,MAAME,IAA0C,CAAC;AAAA,EAC/C,MAAAF;AAAA,EACA,KAAAC;AAAA,EACA,aAAAE;AAAA,EACA,YAAAC;AAAA,EACA,oBAAAC,IAAqB;AAAA,EACrB,OAAAC;AAAA,EACA,OAAAC;AACF,MAAM;AACJ,QAAMC,IAAeC,EAAyBT,CAAI,GAC5CU,IAAaX,EAAkBS,GAAcP,CAAG,GAChDU,IAAsBR,KAAeO,GACrCE,IAAc,GAAQR,KAAcO,IACpCE,IAAcC,EAAeN,CAAY,GACzCO,IAAYC,EAAgBR,EAAa,MAAMA,EAAa,QAAQ,GAEpES,IAAiB,MAAM;AAC3B,QAAIb,GAAY;AACd,MAAAA,EAAWI,CAAY;AACvB;AAAA,IACF;AACA,IAAIG,KACF,OAAO,KAAKA,GAAqB,UAAU,qBAAqB;AAAA,EAEpE;AAEA,SACE,gBAAAO,EAAC,SAAI,WAAWC,EAAW,gBAAgBC,EAAO,cAAc,CAAC,GAC/D,UAAA;AAAA,IAAA,gBAAAF,EAAC,SAAI,WAAWC,EAAW,uBAAuBC,EAAO,qBAAqB,CAAC,GAC5E,UAAA;AAAA,MAAAd,KACC,gBAAAY,EAAAG,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAH,EAAC,OAAA,EAAI,WAAWE,EAAO,mBAAmB,GACxC,UAAA;AAAA,UAAA,gBAAAE,EAAC,QAAA,EAAK,WAAWF,EAAO,mBAAmB,GACxC,YAAYZ,EAAa,MAAMA,EAAa,QAAQ,EAAA,CACvD;AAAA,UACA,gBAAAc,EAAC,QAAA,EAAK,WAAWF,EAAO,mBAAmB,GAAG,OAAOZ,EAAa,MAC/D,UAAAA,EAAa,KAAA,CAChB;AAAA,4BACCe,GAAA,EAAY,OAAOC,EAAoBX,CAAW,GAAI,UAAAE,GAAU;AAAA,UAChEP,EAAa,QAAQ,QACpB,gBAAAc,EAAC,QAAA,EAAK,WAAWF,EAAO,mBAAmB,GAAI,UAAAK,EAAejB,EAAa,IAAI,EAAA,CAAE;AAAA,QAAA,GAErF;AAAA,QACCI,KACC,gBAAAU,EAACI,GAAA,EAAO,MAAK,QAAO,MAAM,gBAAAJ,EAACK,GAAA,CAAA,CAAc,GAAI,SAASV,GAAgB,UAAA,KAAA,CAEtE;AAAA,MAAA,GAEJ;AAAA,MAEDV;AAAA,IAAA,GACH;AAAA,IACA,gBAAAe,EAAC,SAAI,WAAWH,EAAW,qBAAqBC,EAAO,mBAAmB,CAAC,GACzE,UAAA,gBAAAE;AAAA,MAACM;AAAA,MAAA;AAAA,QACC,MAAMpB;AAAA,QACN,YAAAE;AAAA,QACA,oBAAAL;AAAA,MAAA;AAAA,IAAA,EACF,CACF;AAAA,EAAA,GACF;AAEJ;"}
@@ -1,5 +1,22 @@
1
- const s = {};
1
+ const e = {
2
+ "file-preview": "_file-preview_irbqy_1",
3
+ "file-preview-header": "_file-preview-header_irbqy_139",
4
+ "file-preview-info": "_file-preview-info_irbqy_148",
5
+ "file-preview-icon": "_file-preview-icon_irbqy_156",
6
+ "file-preview-name": "_file-preview-name_irbqy_161",
7
+ "file-preview-size": "_file-preview-size_irbqy_168",
8
+ "file-preview-body": "_file-preview-body_irbqy_174",
9
+ "file-preview-iframe": "_file-preview-iframe_irbqy_178",
10
+ "file-preview-media-wrap": "_file-preview-media-wrap_irbqy_186",
11
+ "file-preview-image": "_file-preview-image_irbqy_192",
12
+ "file-preview-video": "_file-preview-video_irbqy_198",
13
+ "file-preview-audio-wrap": "_file-preview-audio-wrap_irbqy_204",
14
+ "file-preview-audio": "_file-preview-audio_irbqy_204",
15
+ "file-preview-office-wrap": "_file-preview-office-wrap_irbqy_216",
16
+ "file-preview-office-inner": "_file-preview-office-inner_irbqy_221",
17
+ "file-preview-text": "_file-preview-text_irbqy_228"
18
+ };
2
19
  export {
3
- s as default
20
+ e as default
4
21
  };
5
22
  //# sourceMappingURL=style.module.scss.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,13 @@
1
+ import { FileDisplayItem } from '../types';
2
+ import { default as React } from 'react';
3
+ export interface FilePreviewLinkProps {
4
+ file: FileDisplayItem;
5
+ url?: string;
6
+ downloadUrl?: string;
7
+ onDownload?: (file: FileDisplayItem) => void;
8
+ disabled?: boolean;
9
+ showType?: boolean;
10
+ className?: string;
11
+ }
12
+ declare const FilePreviewLink: React.FC<FilePreviewLinkProps>;
13
+ export default FilePreviewLink;
@@ -0,0 +1,61 @@
1
+ import { jsxs as n, jsx as l, Fragment as h } from "react/jsx-runtime";
2
+ import { normalizeFileDisplayItem as N, getFileIcon as p, getFileTypeName as t } from "../fileDisplay.js";
3
+ import y from "../FilePreviewModal/index.js";
4
+ import { useState as u } from "react";
5
+ import i from "./style.module.scss.js";
6
+ import f from "classnames";
7
+ const D = ({
8
+ file: o,
9
+ url: a,
10
+ downloadUrl: c,
11
+ onDownload: d,
12
+ disabled: v = !1,
13
+ showType: r = !0,
14
+ className: m
15
+ }) => {
16
+ const [k, s] = u(!1), e = N(o);
17
+ return v ? /* @__PURE__ */ n(
18
+ "span",
19
+ {
20
+ className: f(i["file-preview-link-disabled"], m),
21
+ title: e.name,
22
+ children: [
23
+ /* @__PURE__ */ l("span", { className: i["file-preview-link-inner"], children: p(e.name, e.mimeType) }),
24
+ /* @__PURE__ */ l("span", { className: i["file-preview-link-name"], children: e.name }),
25
+ r && /* @__PURE__ */ l("span", { className: i["file-preview-link-type"], children: t(e.name, e.mimeType) })
26
+ ]
27
+ }
28
+ ) : /* @__PURE__ */ n(h, { children: [
29
+ /* @__PURE__ */ n(
30
+ "a",
31
+ {
32
+ className: f("file-preview-link", i["file-preview-link"], m),
33
+ onClick: (w) => {
34
+ w.preventDefault(), s(!0);
35
+ },
36
+ href: a ?? e.url ?? "#",
37
+ title: e.name,
38
+ children: [
39
+ /* @__PURE__ */ l("span", { className: i["file-preview-link-inner"], children: p(e.name, e.mimeType) }),
40
+ /* @__PURE__ */ l("span", { className: i["file-preview-link-name"], children: e.name }),
41
+ r && /* @__PURE__ */ l("span", { className: i["file-preview-link-type"], children: t(e.name, e.mimeType) })
42
+ ]
43
+ }
44
+ ),
45
+ /* @__PURE__ */ l(
46
+ y,
47
+ {
48
+ open: k,
49
+ file: e,
50
+ url: a,
51
+ downloadUrl: c,
52
+ onDownload: d,
53
+ onClose: () => s(!1)
54
+ }
55
+ )
56
+ ] });
57
+ };
58
+ export {
59
+ D as default
60
+ };
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/File/FilePreviewLink/index.tsx"],"sourcesContent":["import type { FileDisplayItem } from '../types';\nimport { getFileIcon, getFileTypeName, normalizeFileDisplayItem } from '../fileDisplay';\nimport FilePreviewModal from '../FilePreviewModal';\nimport React, { useState } from 'react';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nexport interface FilePreviewLinkProps {\n file: FileDisplayItem;\n url?: string;\n downloadUrl?: string;\n onDownload?: (file: FileDisplayItem) => void;\n disabled?: boolean;\n showType?: boolean;\n className?: string;\n}\n\nconst FilePreviewLink: React.FC<FilePreviewLinkProps> = ({\n file,\n url,\n downloadUrl,\n onDownload,\n disabled = false,\n showType = true,\n className,\n}) => {\n const [open, setOpen] = useState(false);\n const resolvedFile = normalizeFileDisplayItem(file);\n\n if (disabled) {\n return (\n <span\n className={classNames(styles['file-preview-link-disabled'], className)}\n title={resolvedFile.name}\n >\n <span className={styles['file-preview-link-inner']}>\n {getFileIcon(resolvedFile.name, resolvedFile.mimeType)}\n </span>\n <span className={styles['file-preview-link-name']}>{resolvedFile.name}</span>\n {showType && (\n <span className={styles['file-preview-link-type']}>\n {getFileTypeName(resolvedFile.name, resolvedFile.mimeType)}\n </span>\n )}\n </span>\n );\n }\n\n return (\n <>\n <a\n className={classNames('file-preview-link', styles['file-preview-link'], className)}\n onClick={(e) => {\n e.preventDefault();\n setOpen(true);\n }}\n href={url ?? resolvedFile.url ?? '#'}\n title={resolvedFile.name}\n >\n <span className={styles['file-preview-link-inner']}>\n {getFileIcon(resolvedFile.name, resolvedFile.mimeType)}\n </span>\n <span className={styles['file-preview-link-name']}>{resolvedFile.name}</span>\n {showType && (\n <span className={styles['file-preview-link-type']}>\n {getFileTypeName(resolvedFile.name, resolvedFile.mimeType)}\n </span>\n )}\n </a>\n <FilePreviewModal\n open={open}\n file={resolvedFile}\n url={url}\n downloadUrl={downloadUrl}\n onDownload={onDownload}\n onClose={() => setOpen(false)}\n />\n </>\n );\n};\n\nexport default FilePreviewLink;\n"],"names":["FilePreviewLink","file","url","downloadUrl","onDownload","disabled","showType","className","open","setOpen","useState","resolvedFile","normalizeFileDisplayItem","jsxs","classNames","styles","jsx","getFileTypeName","Fragment","e","FilePreviewModal"],"mappings":";;;;;;AAiBA,MAAMA,IAAkD,CAAC;AAAA,EACvD,MAAAC;AAAA,EACA,KAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,WAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChCC,IAAeC,EAAyBX,CAAI;AAElD,SAAII,IAEA,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAWC,EAAO,4BAA4B,GAAGR,CAAS;AAAA,MACrE,OAAOI,EAAa;AAAA,MAEpB,UAAA;AAAA,QAAA,gBAAAK,EAAC,QAAA,EAAK,WAAWD,EAAO,yBAAyB,GAC9C,YAAYJ,EAAa,MAAMA,EAAa,QAAQ,EAAA,CACvD;AAAA,0BACC,QAAA,EAAK,WAAWI,EAAO,wBAAwB,GAAI,YAAa,MAAK;AAAA,QACrET,KACC,gBAAAU,EAAC,QAAA,EAAK,WAAWD,EAAO,wBAAwB,GAC7C,UAAAE,EAAgBN,EAAa,MAAMA,EAAa,QAAQ,EAAA,CAC3D;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IAON,gBAAAE,EAAAK,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAL;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC,EAAW,qBAAqBC,EAAO,mBAAmB,GAAGR,CAAS;AAAA,QACjF,SAAS,CAACY,MAAM;AACd,UAAAA,EAAE,eAAA,GACFV,EAAQ,EAAI;AAAA,QACd;AAAA,QACA,MAAMP,KAAOS,EAAa,OAAO;AAAA,QACjC,OAAOA,EAAa;AAAA,QAEpB,UAAA;AAAA,UAAA,gBAAAK,EAAC,QAAA,EAAK,WAAWD,EAAO,yBAAyB,GAC9C,YAAYJ,EAAa,MAAMA,EAAa,QAAQ,EAAA,CACvD;AAAA,4BACC,QAAA,EAAK,WAAWI,EAAO,wBAAwB,GAAI,YAAa,MAAK;AAAA,UACrET,KACC,gBAAAU,EAAC,QAAA,EAAK,WAAWD,EAAO,wBAAwB,GAC7C,UAAAE,EAAgBN,EAAa,MAAMA,EAAa,QAAQ,EAAA,CAC3D;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJ,gBAAAK;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,MAAAZ;AAAA,QACA,MAAMG;AAAA,QACN,KAAAT;AAAA,QACA,aAAAC;AAAA,QACA,YAAAC;AAAA,QACA,SAAS,MAAMK,EAAQ,EAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAC9B,GACF;AAEJ;"}
@@ -0,0 +1,11 @@
1
+ const e = {
2
+ "file-preview-link": "_file-preview-link_1rk52_1",
3
+ "file-preview-link-disabled": "_file-preview-link-disabled_1rk52_12",
4
+ "file-preview-link-inner": "_file-preview-link-inner_1rk52_21",
5
+ "file-preview-link-name": "_file-preview-link-name_1rk52_25",
6
+ "file-preview-link-type": "_file-preview-link-type_1rk52_31"
7
+ };
8
+ export {
9
+ e as default
10
+ };
11
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -4,6 +4,9 @@ export interface FilePreviewModalProps {
4
4
  open: boolean;
5
5
  file: FileDisplayItem;
6
6
  url?: string;
7
+ downloadUrl?: string;
8
+ onDownload?: (file: FileDisplayItem) => void;
9
+ unsupportedMessage?: string;
7
10
  onClose: () => void;
8
11
  }
9
12
  declare const FilePreviewModal: React.FC<FilePreviewModalProps>;
@@ -1,12 +1,41 @@
1
- import { jsx as o } from "react/jsx-runtime";
2
- import { Modal as m } from "antd";
3
- import n from "../FilePreview/index.js";
4
- import { normalizeFileDisplayItem as d } from "../fileDisplay.js";
5
- const c = ({ open: r, file: i, url: l, onClose: t }) => {
6
- const e = d(i);
7
- return /* @__PURE__ */ o(m, { open: r, onCancel: t, footer: null, width: 900, destroyOnHidden: !0, title: e.name, children: /* @__PURE__ */ o(n, { file: e, url: l }) });
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { Modal as s } from "antd";
3
+ import a from "../FilePreview/index.js";
4
+ import { normalizeFileDisplayItem as p } from "../fileDisplay.js";
5
+ const F = ({
6
+ open: o,
7
+ file: r,
8
+ url: i,
9
+ downloadUrl: l,
10
+ onDownload: t,
11
+ unsupportedMessage: d,
12
+ onClose: n
13
+ }) => {
14
+ const m = p(r);
15
+ return /* @__PURE__ */ e(
16
+ s,
17
+ {
18
+ open: o,
19
+ onCancel: n,
20
+ footer: null,
21
+ width: 900,
22
+ destroyOnHidden: !0,
23
+ title: "文件预览",
24
+ styles: { body: { paddingTop: 12 } },
25
+ children: /* @__PURE__ */ e(
26
+ a,
27
+ {
28
+ file: m,
29
+ url: i,
30
+ downloadUrl: l,
31
+ onDownload: t,
32
+ unsupportedMessage: d
33
+ }
34
+ )
35
+ }
36
+ );
8
37
  };
9
38
  export {
10
- c as default
39
+ F as default
11
40
  };
12
41
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/File/FilePreviewModal/index.tsx"],"sourcesContent":["import { Modal } from 'antd';\nimport React from 'react';\nimport FilePreview from '../FilePreview';\nimport { normalizeFileDisplayItem } from '../fileDisplay';\nimport type { FileDisplayItem } from '../types';\n\nexport interface FilePreviewModalProps {\n open: boolean;\n file: FileDisplayItem;\n url?: string;\n onClose: () => void;\n}\n\nconst FilePreviewModal: React.FC<FilePreviewModalProps> = ({ open, file, url, onClose }) => {\n const resolvedFile = normalizeFileDisplayItem(file);\n\n return (\n <Modal open={open} onCancel={onClose} footer={null} width={900} destroyOnHidden title={resolvedFile.name}>\n <FilePreview file={resolvedFile} url={url} />\n </Modal>\n );\n};\n\nexport default FilePreviewModal;\n"],"names":["FilePreviewModal","open","file","url","onClose","resolvedFile","normalizeFileDisplayItem","Modal","jsx","FilePreview"],"mappings":";;;;AAaA,MAAMA,IAAoD,CAAC,EAAE,MAAAC,GAAM,MAAAC,GAAM,KAAAC,GAAK,SAAAC,QAAc;AAC1F,QAAMC,IAAeC,EAAyBJ,CAAI;AAElD,2BACCK,GAAA,EAAM,MAAAN,GAAY,UAAUG,GAAS,QAAQ,MAAM,OAAO,KAAK,iBAAe,IAAC,OAAOC,EAAa,MAClG,UAAA,gBAAAG,EAACC,KAAY,MAAMJ,GAAc,KAAAF,GAAU,EAAA,CAC7C;AAEF;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/File/FilePreviewModal/index.tsx"],"sourcesContent":["import { Modal } from 'antd';\nimport React from 'react';\nimport FilePreview from '../FilePreview';\nimport { normalizeFileDisplayItem } from '../fileDisplay';\nimport type { FileDisplayItem } from '../types';\n\nexport interface FilePreviewModalProps {\n open: boolean;\n file: FileDisplayItem;\n url?: string;\n downloadUrl?: string;\n onDownload?: (file: FileDisplayItem) => void;\n unsupportedMessage?: string;\n onClose: () => void;\n}\n\nconst FilePreviewModal: React.FC<FilePreviewModalProps> = ({\n open,\n file,\n url,\n downloadUrl,\n onDownload,\n unsupportedMessage,\n onClose,\n}) => {\n const resolvedFile = normalizeFileDisplayItem(file);\n\n return (\n <Modal\n open={open}\n onCancel={onClose}\n footer={null}\n width={900}\n destroyOnHidden\n title=\"文件预览\"\n styles={{ body: { paddingTop: 12 } }}\n >\n <FilePreview\n file={resolvedFile}\n url={url}\n downloadUrl={downloadUrl}\n onDownload={onDownload}\n unsupportedMessage={unsupportedMessage}\n />\n </Modal>\n );\n};\n\nexport default FilePreviewModal;\n"],"names":["FilePreviewModal","open","file","url","downloadUrl","onDownload","unsupportedMessage","onClose","resolvedFile","normalizeFileDisplayItem","jsx","Modal","FilePreview"],"mappings":";;;;AAgBA,MAAMA,IAAoD,CAAC;AAAA,EACzD,MAAAC;AAAA,EACA,MAAAC;AAAA,EACA,KAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,SAAAC;AACF,MAAM;AACJ,QAAMC,IAAeC,EAAyBP,CAAI;AAElD,SACA,gBAAAQ;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAV;AAAA,MACA,UAAUM;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,iBAAe;AAAA,MACf,OAAM;AAAA,MACN,QAAQ,EAAE,MAAM,EAAE,YAAY,KAAG;AAAA,MAEjC,UAAA,gBAAAG;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,MAAMJ;AAAA,UACN,KAAAL;AAAA,UACA,aAAAC;AAAA,UACA,YAAAC;AAAA,UACA,oBAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGJ;"}
@@ -1,6 +1,8 @@
1
1
  import { default as React } from 'react';
2
2
  import { FileDisplayItem } from './types';
3
3
  export declare function getFileExtension(name: string): string;
4
+ /** 规范化扩展名:去除前导点并转小写(兼容 .xlsx 与 xlsx) */
5
+ export declare function normalizeExtension(extension?: string | null): string;
4
6
  /** 从 URL 路径解析文件名(decodeURIComponent,失败时回退为「未命名文件」) */
5
7
  export declare function parseFileNameFromUrl(url: string): string;
6
8
  /** 补全 name / extension:name 缺省时从 url 解析 */
@@ -1,16 +1,16 @@
1
1
  import { jsx as m } from "react/jsx-runtime";
2
- import { FileArchive as p, FileImage as r, Presentation as l, FileSpreadsheet as i, FileText as c, File as u } from "../Icons/index.js";
2
+ import { FileArchive as p, FileImage as r, Presentation as d, FileSpreadsheet as s, FileText as c, File as u } from "../Icons/index.js";
3
3
  const x = {
4
4
  pdf: c,
5
5
  doc: c,
6
6
  docx: c,
7
7
  txt: c,
8
8
  md: c,
9
- xls: i,
10
- xlsx: i,
11
- csv: i,
12
- ppt: l,
13
- pptx: l,
9
+ xls: s,
10
+ xlsx: s,
11
+ csv: s,
12
+ ppt: d,
13
+ pptx: d,
14
14
  png: r,
15
15
  jpg: r,
16
16
  jpeg: r,
@@ -20,16 +20,19 @@ const x = {
20
20
  rar: p,
21
21
  "7z": p
22
22
  };
23
- function s(e) {
23
+ function a(e) {
24
24
  const t = e.lastIndexOf(".");
25
25
  return t >= 0 ? e.slice(t + 1).toLowerCase() : "";
26
26
  }
27
+ function f(e) {
28
+ return e ? e.replace(/^\./, "").toLowerCase() : "";
29
+ }
27
30
  function F(e) {
28
31
  const t = e.trim();
29
32
  if (!t) return "未命名文件";
30
33
  try {
31
- const d = new URL(t, "http://placeholder.local").pathname.split("/").filter(Boolean).pop() ?? "", a = decodeURIComponent(d);
32
- if (a) return a;
34
+ const i = new URL(t, "http://placeholder.local").pathname.split("/").filter(Boolean).pop() ?? "", l = decodeURIComponent(i);
35
+ if (l) return l;
33
36
  } catch {
34
37
  }
35
38
  const n = t.split(/[/?#]/).filter(Boolean).pop() ?? "";
@@ -39,29 +42,30 @@ function F(e) {
39
42
  return n || "未命名文件";
40
43
  }
41
44
  }
42
- function g(e) {
43
- var o;
44
- const t = ((o = e.name) == null ? void 0 : o.trim()) || (e.url ? F(e.url) : "未命名文件"), n = e.extension ?? s(t);
45
+ function h(e) {
46
+ var i;
47
+ const t = ((i = e.name) == null ? void 0 : i.trim()) || (e.url ? F(e.url) : "未命名文件"), n = e.extension ?? a(t), o = f(n) || void 0;
45
48
  return {
46
49
  ...e,
47
50
  name: t,
48
- extension: n || e.extension
51
+ extension: o
49
52
  };
50
53
  }
51
- function h(e, t) {
52
- const n = s(e), o = x[n] ?? u;
54
+ function C(e, t) {
55
+ const n = a(e), o = x[n] ?? u;
53
56
  return /* @__PURE__ */ m(o, {});
54
57
  }
55
- function C(e, t) {
58
+ function E(e, t) {
56
59
  var o;
57
- const n = s(e);
60
+ const n = a(e);
58
61
  return n ? n.toUpperCase() : t ? ((o = t.split("/").pop()) == null ? void 0 : o.toUpperCase()) ?? "FILE" : "FILE";
59
62
  }
60
63
  export {
61
- s as getFileExtension,
62
- h as getFileIcon,
63
- C as getFileTypeName,
64
- g as normalizeFileDisplayItem,
64
+ a as getFileExtension,
65
+ C as getFileIcon,
66
+ E as getFileTypeName,
67
+ f as normalizeExtension,
68
+ h as normalizeFileDisplayItem,
65
69
  F as parseFileNameFromUrl
66
70
  };
67
71
  //# sourceMappingURL=fileDisplay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileDisplay.js","sources":["../../../src/components/File/fileDisplay.tsx"],"sourcesContent":["import React from 'react';\nimport {\n File,\n FileArchive,\n FileImage,\n FileSpreadsheet,\n FileText,\n Presentation,\n} from '@/components/Icons';\nimport type { FileDisplayItem } from './types';\n\nconst EXT_ICON_MAP: Record<string, React.FC<{ className?: string }>> = {\n pdf: FileText,\n doc: FileText,\n docx: FileText,\n txt: FileText,\n md: FileText,\n xls: FileSpreadsheet,\n xlsx: FileSpreadsheet,\n csv: FileSpreadsheet,\n ppt: Presentation,\n pptx: Presentation,\n png: FileImage,\n jpg: FileImage,\n jpeg: FileImage,\n gif: FileImage,\n webp: FileImage,\n zip: FileArchive,\n rar: FileArchive,\n '7z': FileArchive,\n};\n\nexport function getFileExtension(name: string): string {\n const dot = name.lastIndexOf('.');\n return dot >= 0 ? name.slice(dot + 1).toLowerCase() : '';\n}\n\n/** 从 URL 路径解析文件名(decodeURIComponent,失败时回退为「未命名文件」) */\nexport function parseFileNameFromUrl(url: string): string {\n const trimmed = url.trim();\n if (!trimmed) return '未命名文件';\n\n try {\n const pathname = new URL(trimmed, 'http://placeholder.local').pathname;\n const segment = pathname.split('/').filter(Boolean).pop() ?? '';\n const decoded = decodeURIComponent(segment);\n if (decoded) return decoded;\n } catch {\n // fall through\n }\n\n const fallback = trimmed.split(/[/?#]/).filter(Boolean).pop() ?? '';\n try {\n const decoded = decodeURIComponent(fallback);\n return decoded || '未命名文件';\n } catch {\n return fallback || '未命名文件';\n }\n}\n\n/** 补全 name / extension:name 缺省时从 url 解析 */\nexport function normalizeFileDisplayItem(file: FileDisplayItem): FileDisplayItem & { name: string } {\n const name = file.name?.trim() || (file.url ? parseFileNameFromUrl(file.url) : '未命名文件');\n const extension = file.extension ?? getFileExtension(name);\n\n return {\n ...file,\n name,\n extension: extension || file.extension,\n };\n}\n\nexport function getFileIcon(name: string, _mimeType?: string): React.ReactNode {\n const ext = getFileExtension(name);\n const Icon = EXT_ICON_MAP[ext] ?? File;\n return <Icon />;\n}\n\nexport function getFileTypeName(name: string, mimeType?: string): string {\n const ext = getFileExtension(name);\n if (ext) return ext.toUpperCase();\n if (mimeType) return mimeType.split('/').pop()?.toUpperCase() ?? 'FILE';\n return 'FILE';\n}\n"],"names":["EXT_ICON_MAP","FileText","FileSpreadsheet","Presentation","FileImage","FileArchive","getFileExtension","name","dot","parseFileNameFromUrl","url","trimmed","segment","decoded","fallback","normalizeFileDisplayItem","file","_a","extension","getFileIcon","_mimeType","ext","Icon","File","getFileTypeName","mimeType"],"mappings":";;AAWA,MAAMA,IAAiE;AAAA,EACrE,KAAKC;AAAA,EACL,KAAKA;AAAA,EACL,MAAMA;AAAA,EACN,KAAKA;AAAA,EACL,IAAIA;AAAA,EACJ,KAAKC;AAAA,EACL,MAAMA;AAAA,EACN,KAAKA;AAAA,EACL,KAAKC;AAAA,EACL,MAAMA;AAAA,EACN,KAAKC;AAAA,EACL,KAAKA;AAAA,EACL,MAAMA;AAAA,EACN,KAAKA;AAAA,EACL,MAAMA;AAAA,EACN,KAAKC;AAAA,EACL,KAAKA;AAAA,EACL,MAAMA;AACR;AAEO,SAASC,EAAiBC,GAAsB;AACrD,QAAMC,IAAMD,EAAK,YAAY,GAAG;AAChC,SAAOC,KAAO,IAAID,EAAK,MAAMC,IAAM,CAAC,EAAE,gBAAgB;AACxD;AAGO,SAASC,EAAqBC,GAAqB;AACxD,QAAMC,IAAUD,EAAI,KAAA;AACpB,MAAI,CAACC,EAAS,QAAO;AAErB,MAAI;AAEF,UAAMC,IADW,IAAI,IAAID,GAAS,0BAA0B,EAAE,SACrC,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAA,KAAS,IACvDE,IAAU,mBAAmBD,CAAO;AAC1C,QAAIC,EAAS,QAAOA;AAAA,EACtB,QAAQ;AAAA,EAER;AAEA,QAAMC,IAAWH,EAAQ,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,IAAA,KAAS;AACjE,MAAI;AAEF,WADgB,mBAAmBG,CAAQ,KACzB;AAAA,EACpB,QAAQ;AACN,WAAOA,KAAY;AAAA,EACrB;AACF;AAGO,SAASC,EAAyBC,GAA2D;;AAClG,QAAMT,MAAOU,IAAAD,EAAK,SAAL,gBAAAC,EAAW,YAAWD,EAAK,MAAMP,EAAqBO,EAAK,GAAG,IAAI,UACzEE,IAAYF,EAAK,aAAaV,EAAiBC,CAAI;AAEzD,SAAO;AAAA,IACL,GAAGS;AAAA,IACH,MAAAT;AAAA,IACA,WAAWW,KAAaF,EAAK;AAAA,EAAA;AAEjC;AAEO,SAASG,EAAYZ,GAAca,GAAqC;AAC7E,QAAMC,IAAMf,EAAiBC,CAAI,GAC3Be,IAAOtB,EAAaqB,CAAG,KAAKE;AAClC,2BAAQD,GAAA,EAAK;AACf;AAEO,SAASE,EAAgBjB,GAAckB,GAA2B;;AACvE,QAAMJ,IAAMf,EAAiBC,CAAI;AACjC,SAAIc,IAAYA,EAAI,YAAA,IAChBI,MAAiBR,IAAAQ,EAAS,MAAM,GAAG,EAAE,IAAA,MAApB,gBAAAR,EAA2B,kBAAiB,SAC1D;AACT;"}
1
+ {"version":3,"file":"fileDisplay.js","sources":["../../../src/components/File/fileDisplay.tsx"],"sourcesContent":["import React from 'react';\nimport {\n File,\n FileArchive,\n FileImage,\n FileSpreadsheet,\n FileText,\n Presentation,\n} from '@/components/Icons';\nimport type { FileDisplayItem } from './types';\n\nconst EXT_ICON_MAP: Record<string, React.FC<{ className?: string }>> = {\n pdf: FileText,\n doc: FileText,\n docx: FileText,\n txt: FileText,\n md: FileText,\n xls: FileSpreadsheet,\n xlsx: FileSpreadsheet,\n csv: FileSpreadsheet,\n ppt: Presentation,\n pptx: Presentation,\n png: FileImage,\n jpg: FileImage,\n jpeg: FileImage,\n gif: FileImage,\n webp: FileImage,\n zip: FileArchive,\n rar: FileArchive,\n '7z': FileArchive,\n};\n\nexport function getFileExtension(name: string): string {\n const dot = name.lastIndexOf('.');\n return dot >= 0 ? name.slice(dot + 1).toLowerCase() : '';\n}\n\n/** 规范化扩展名:去除前导点并转小写(兼容 .xlsx 与 xlsx) */\nexport function normalizeExtension(extension?: string | null): string {\n if (!extension) return '';\n return extension.replace(/^\\./, '').toLowerCase();\n}\n\n/** 从 URL 路径解析文件名(decodeURIComponent,失败时回退为「未命名文件」) */\nexport function parseFileNameFromUrl(url: string): string {\n const trimmed = url.trim();\n if (!trimmed) return '未命名文件';\n\n try {\n const pathname = new URL(trimmed, 'http://placeholder.local').pathname;\n const segment = pathname.split('/').filter(Boolean).pop() ?? '';\n const decoded = decodeURIComponent(segment);\n if (decoded) return decoded;\n } catch {\n // fall through\n }\n\n const fallback = trimmed.split(/[/?#]/).filter(Boolean).pop() ?? '';\n try {\n const decoded = decodeURIComponent(fallback);\n return decoded || '未命名文件';\n } catch {\n return fallback || '未命名文件';\n }\n}\n\n/** 补全 name / extension:name 缺省时从 url 解析 */\nexport function normalizeFileDisplayItem(file: FileDisplayItem): FileDisplayItem & { name: string } {\n const name = file.name?.trim() || (file.url ? parseFileNameFromUrl(file.url) : '未命名文件');\n const rawExtension = file.extension ?? getFileExtension(name);\n const extension = normalizeExtension(rawExtension) || undefined;\n\n return {\n ...file,\n name,\n extension,\n };\n}\n\nexport function getFileIcon(name: string, _mimeType?: string): React.ReactNode {\n const ext = getFileExtension(name);\n const Icon = EXT_ICON_MAP[ext] ?? File;\n return <Icon />;\n}\n\nexport function getFileTypeName(name: string, mimeType?: string): string {\n const ext = getFileExtension(name);\n if (ext) return ext.toUpperCase();\n if (mimeType) return mimeType.split('/').pop()?.toUpperCase() ?? 'FILE';\n return 'FILE';\n}\n"],"names":["EXT_ICON_MAP","FileText","FileSpreadsheet","Presentation","FileImage","FileArchive","getFileExtension","name","dot","normalizeExtension","extension","parseFileNameFromUrl","url","trimmed","segment","decoded","fallback","normalizeFileDisplayItem","file","_a","rawExtension","getFileIcon","_mimeType","ext","Icon","File","getFileTypeName","mimeType"],"mappings":";;AAWA,MAAMA,IAAiE;AAAA,EACrE,KAAKC;AAAA,EACL,KAAKA;AAAA,EACL,MAAMA;AAAA,EACN,KAAKA;AAAA,EACL,IAAIA;AAAA,EACJ,KAAKC;AAAA,EACL,MAAMA;AAAA,EACN,KAAKA;AAAA,EACL,KAAKC;AAAA,EACL,MAAMA;AAAA,EACN,KAAKC;AAAA,EACL,KAAKA;AAAA,EACL,MAAMA;AAAA,EACN,KAAKA;AAAA,EACL,MAAMA;AAAA,EACN,KAAKC;AAAA,EACL,KAAKA;AAAA,EACL,MAAMA;AACR;AAEO,SAASC,EAAiBC,GAAsB;AACrD,QAAMC,IAAMD,EAAK,YAAY,GAAG;AAChC,SAAOC,KAAO,IAAID,EAAK,MAAMC,IAAM,CAAC,EAAE,gBAAgB;AACxD;AAGO,SAASC,EAAmBC,GAAmC;AACpE,SAAKA,IACEA,EAAU,QAAQ,OAAO,EAAE,EAAE,YAAA,IADb;AAEzB;AAGO,SAASC,EAAqBC,GAAqB;AACxD,QAAMC,IAAUD,EAAI,KAAA;AACpB,MAAI,CAACC,EAAS,QAAO;AAErB,MAAI;AAEF,UAAMC,IADW,IAAI,IAAID,GAAS,0BAA0B,EAAE,SACrC,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAA,KAAS,IACvDE,IAAU,mBAAmBD,CAAO;AAC1C,QAAIC,EAAS,QAAOA;AAAA,EACtB,QAAQ;AAAA,EAER;AAEA,QAAMC,IAAWH,EAAQ,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,IAAA,KAAS;AACjE,MAAI;AAEF,WADgB,mBAAmBG,CAAQ,KACzB;AAAA,EACpB,QAAQ;AACN,WAAOA,KAAY;AAAA,EACrB;AACF;AAGO,SAASC,EAAyBC,GAA2D;;AAClG,QAAMX,MAAOY,IAAAD,EAAK,SAAL,gBAAAC,EAAW,YAAWD,EAAK,MAAMP,EAAqBO,EAAK,GAAG,IAAI,UACzEE,IAAeF,EAAK,aAAaZ,EAAiBC,CAAI,GACtDG,IAAYD,EAAmBW,CAAY,KAAK;AAEtD,SAAO;AAAA,IACL,GAAGF;AAAA,IACH,MAAAX;AAAA,IACA,WAAAG;AAAA,EAAA;AAEJ;AAEO,SAASW,EAAYd,GAAce,GAAqC;AAC7E,QAAMC,IAAMjB,EAAiBC,CAAI,GAC3BiB,IAAOxB,EAAauB,CAAG,KAAKE;AAClC,2BAAQD,GAAA,EAAK;AACf;AAEO,SAASE,EAAgBnB,GAAcoB,GAA2B;;AACvE,QAAMJ,IAAMjB,EAAiBC,CAAI;AACjC,SAAIgB,IAAYA,EAAI,YAAA,IAChBI,MAAiBR,IAAAQ,EAAS,MAAM,GAAG,EAAE,IAAA,MAApB,gBAAAR,EAA2B,kBAAiB,SAC1D;AACT;"}
@@ -1,5 +1,5 @@
1
1
  export type { FileDisplayItem, FileItemAction } from './types';
2
- export { getFileExtension, getFileIcon, getFileTypeName, normalizeFileDisplayItem, parseFileNameFromUrl, } from './fileDisplay';
2
+ export { getFileExtension, getFileIcon, getFileTypeName, normalizeExtension, normalizeFileDisplayItem, parseFileNameFromUrl, } from './fileDisplay';
3
3
  export { FileItem as FileItemView } from './FileItem';
4
4
  export type { FileItemProps } from './FileItem';
5
5
  export { default as FileLink } from './FileLink';
@@ -8,3 +8,5 @@ export { default as FilePreview } from './FilePreview';
8
8
  export type { FilePreviewProps } from './FilePreview';
9
9
  export { default as FilePreviewModal } from './FilePreviewModal';
10
10
  export type { FilePreviewModalProps } from './FilePreviewModal';
11
+ export { default as FilePreviewLink } from './FilePreviewLink';
12
+ export type { FilePreviewLinkProps } from './FilePreviewLink';
@@ -0,0 +1,6 @@
1
+ import { FileDisplayItem } from './types';
2
+ export type PreviewKind = 'image' | 'pdf' | 'excel' | 'word' | 'ppt' | 'video' | 'audio' | 'text' | 'iframe' | 'unsupported';
3
+ export declare function getPreviewKind(file: FileDisplayItem): PreviewKind;
4
+ export declare function getFileTypeTagColor(kind: PreviewKind): string;
5
+ /** Office / 文本类需 fetch blob 后客户端渲染,避免 iframe 触发下载 */
6
+ export declare function needsBlobPreview(kind: PreviewKind): boolean;
@@ -0,0 +1,42 @@
1
+ import { SEMANTIC_COLORS as t } from "../Tag/SemanticTag.js";
2
+ import { normalizeExtension as i, getFileExtension as o } from "./fileDisplay.js";
3
+ const s = ["png", "jpg", "jpeg", "gif", "webp", "svg", "bmp"], c = ["pdf"], u = ["xls", "xlsx", "csv"], a = ["doc", "docx"], d = ["ppt", "pptx"], p = ["mp4", "webm", "mov", "m4v"], m = ["mp3", "wav", "ogg", "aac", "flac"], l = ["txt", "md", "json", "xml", "html", "htm", "log", "yaml", "yml"];
4
+ function x(n) {
5
+ const r = n.mimeType ?? "";
6
+ if (r.startsWith("image/")) return "image";
7
+ if (r === "application/pdf") return "pdf";
8
+ if (r.startsWith("video/")) return "video";
9
+ if (r.startsWith("audio/")) return "audio";
10
+ const e = i(n.extension) || o(n.name ?? "");
11
+ return s.includes(e) ? "image" : c.includes(e) ? "pdf" : u.includes(e) ? "excel" : a.includes(e) ? "word" : d.includes(e) ? "ppt" : p.includes(e) ? "video" : m.includes(e) ? "audio" : l.includes(e) ? "text" : "iframe";
12
+ }
13
+ function T(n) {
14
+ switch (n) {
15
+ case "pdf":
16
+ return t.INFO;
17
+ case "word":
18
+ return t.PROCESSING;
19
+ case "excel":
20
+ return t.SUCCESS;
21
+ case "ppt":
22
+ return t.WARNING;
23
+ case "image":
24
+ return t.CYAN;
25
+ case "video":
26
+ case "audio":
27
+ return t.PRIMARY;
28
+ case "text":
29
+ return t.DEFAULT;
30
+ default:
31
+ return t.DEFAULT;
32
+ }
33
+ }
34
+ function g(n) {
35
+ return ["excel", "word", "ppt", "text"].includes(n);
36
+ }
37
+ export {
38
+ T as getFileTypeTagColor,
39
+ x as getPreviewKind,
40
+ g as needsBlobPreview
41
+ };
42
+ //# sourceMappingURL=previewKind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"previewKind.js","sources":["../../../src/components/File/previewKind.ts"],"sourcesContent":["import { SEMANTIC_COLORS } from '@/components/Tag/SemanticTag';\nimport { getFileExtension, normalizeExtension } from './fileDisplay';\nimport type { FileDisplayItem } from './types';\n\nexport type PreviewKind =\n | 'image'\n | 'pdf'\n | 'excel'\n | 'word'\n | 'ppt'\n | 'video'\n | 'audio'\n | 'text'\n | 'iframe'\n | 'unsupported';\n\nconst IMAGE_EXTS = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp'];\nconst PDF_EXTS = ['pdf'];\nconst EXCEL_EXTS = ['xls', 'xlsx', 'csv'];\nconst WORD_EXTS = ['doc', 'docx'];\nconst PPT_EXTS = ['ppt', 'pptx'];\nconst VIDEO_EXTS = ['mp4', 'webm', 'mov', 'm4v'];\nconst AUDIO_EXTS = ['mp3', 'wav', 'ogg', 'aac', 'flac'];\nconst TEXT_EXTS = ['txt', 'md', 'json', 'xml', 'html', 'htm', 'log', 'yaml', 'yml'];\n\nexport function getPreviewKind(file: FileDisplayItem): PreviewKind {\n const mime = file.mimeType ?? '';\n if (mime.startsWith('image/')) return 'image';\n if (mime === 'application/pdf') return 'pdf';\n if (mime.startsWith('video/')) return 'video';\n if (mime.startsWith('audio/')) return 'audio';\n\n const ext = normalizeExtension(file.extension) || getFileExtension(file.name ?? '');\n if (IMAGE_EXTS.includes(ext)) return 'image';\n if (PDF_EXTS.includes(ext)) return 'pdf';\n if (EXCEL_EXTS.includes(ext)) return 'excel';\n if (WORD_EXTS.includes(ext)) return 'word';\n if (PPT_EXTS.includes(ext)) return 'ppt';\n if (VIDEO_EXTS.includes(ext)) return 'video';\n if (AUDIO_EXTS.includes(ext)) return 'audio';\n if (TEXT_EXTS.includes(ext)) return 'text';\n return 'iframe';\n}\n\nexport function getFileTypeTagColor(kind: PreviewKind): string {\n switch (kind) {\n case 'pdf':\n return SEMANTIC_COLORS.INFO;\n case 'word':\n return SEMANTIC_COLORS.PROCESSING;\n case 'excel':\n return SEMANTIC_COLORS.SUCCESS;\n case 'ppt':\n return SEMANTIC_COLORS.WARNING;\n case 'image':\n return SEMANTIC_COLORS.CYAN;\n case 'video':\n case 'audio':\n return SEMANTIC_COLORS.PRIMARY;\n case 'text':\n return SEMANTIC_COLORS.DEFAULT;\n default:\n return SEMANTIC_COLORS.DEFAULT;\n }\n}\n\n/** Office / 文本类需 fetch blob 后客户端渲染,避免 iframe 触发下载 */\nexport function needsBlobPreview(kind: PreviewKind): boolean {\n return ['excel', 'word', 'ppt', 'text'].includes(kind);\n}\n"],"names":["IMAGE_EXTS","PDF_EXTS","EXCEL_EXTS","WORD_EXTS","PPT_EXTS","VIDEO_EXTS","AUDIO_EXTS","TEXT_EXTS","getPreviewKind","file","mime","ext","normalizeExtension","getFileExtension","getFileTypeTagColor","kind","SEMANTIC_COLORS","needsBlobPreview"],"mappings":";;AAgBA,MAAMA,IAAa,CAAC,OAAO,OAAO,QAAQ,OAAO,QAAQ,OAAO,KAAK,GAC/DC,IAAW,CAAC,KAAK,GACjBC,IAAa,CAAC,OAAO,QAAQ,KAAK,GAClCC,IAAY,CAAC,OAAO,MAAM,GAC1BC,IAAW,CAAC,OAAO,MAAM,GACzBC,IAAa,CAAC,OAAO,QAAQ,OAAO,KAAK,GACzCC,IAAa,CAAC,OAAO,OAAO,OAAO,OAAO,MAAM,GAChDC,IAAY,CAAC,OAAO,MAAM,QAAQ,OAAO,QAAQ,OAAO,OAAO,QAAQ,KAAK;AAE3E,SAASC,EAAeC,GAAoC;AACjE,QAAMC,IAAOD,EAAK,YAAY;AAC9B,MAAIC,EAAK,WAAW,QAAQ,EAAG,QAAO;AACtC,MAAIA,MAAS,kBAAmB,QAAO;AACvC,MAAIA,EAAK,WAAW,QAAQ,EAAG,QAAO;AACtC,MAAIA,EAAK,WAAW,QAAQ,EAAG,QAAO;AAEtC,QAAMC,IAAMC,EAAmBH,EAAK,SAAS,KAAKI,EAAiBJ,EAAK,QAAQ,EAAE;AAClF,SAAIT,EAAW,SAASW,CAAG,IAAU,UACjCV,EAAS,SAASU,CAAG,IAAU,QAC/BT,EAAW,SAASS,CAAG,IAAU,UACjCR,EAAU,SAASQ,CAAG,IAAU,SAChCP,EAAS,SAASO,CAAG,IAAU,QAC/BN,EAAW,SAASM,CAAG,IAAU,UACjCL,EAAW,SAASK,CAAG,IAAU,UACjCJ,EAAU,SAASI,CAAG,IAAU,SAC7B;AACT;AAEO,SAASG,EAAoBC,GAA2B;AAC7D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAOC,EAAgB;AAAA,IACzB,KAAK;AACH,aAAOA,EAAgB;AAAA,IACzB,KAAK;AACH,aAAOA,EAAgB;AAAA,IACzB,KAAK;AACH,aAAOA,EAAgB;AAAA,IACzB,KAAK;AACH,aAAOA,EAAgB;AAAA,IACzB,KAAK;AAAA,IACL,KAAK;AACH,aAAOA,EAAgB;AAAA,IACzB,KAAK;AACH,aAAOA,EAAgB;AAAA,IACzB;AACE,aAAOA,EAAgB;AAAA,EAAA;AAE7B;AAGO,SAASC,EAAiBF,GAA4B;AAC3D,SAAO,CAAC,SAAS,QAAQ,OAAO,MAAM,EAAE,SAASA,CAAI;AACvD;"}
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import { applyThemeToCssVariables as o, generateTheme as t } from "./theme/theme.js";
2
2
  import { DEFAULT_PRIMARY_COLOR as l, PALETTE as s } from "./theme/constants.js";
3
- import { fetchWithTimeout as i, useFetchData as p } from "./hooks/useFetchData.js";
3
+ import { fetchWithTimeout as i, useFetchData as m } from "./hooks/useFetchData.js";
4
4
  import { resolveMaybeFn as d, resolveVisible as u } from "./utils/resolveMaybeFn.js";
5
5
  import { formatFileSize as x } from "./utils/format.js";
6
6
  import { default as C } from "./components/Upload/index.js";
7
- import { ArrowLeft as h, ArrowLeftRight as S, BarChart3 as g, BookOpen as T, Bot as P, Check as I, ChevronDown as L, ChevronLeft as R, ChevronRight as A, ChevronUp as b, CircleAlert as w, CircleCheck as v, CircleHelp as M, CirclePlay as U, CircleX as y, ClipboardCheck as D, Clock as O, CloudDownload as k, CloudUpload as H, Code as E, Copy as N, Crown as G, Database as _, Download as B, Eye as V, File as z, FileArchive as q, FileImage as X, FileSpreadsheet as Y, FileText as W, Flag as j, Flame as J, Folder as K, FolderOpen as Q, Hash as Z, House as $, ICON_NAMES as ee, ICON_REGISTRY as re, Import as oe, Inbox as te, Info as ae, LayoutDashboard as le, LayoutGrid as se, Loader2 as fe, Lock as ie, LogOut as pe, MessageCircle as me, MessageSquare as de, PanelLeftClose as ue, PanelLeftOpen as ne, Pause as xe, Pencil as Fe, Plus as Ce, Presentation as ce, RefreshCw as he, RotateCw as Se, Send as ge, Settings as Te, Shield as Pe, ShieldCheck as Ie, SlidersHorizontal as Le, Square as Re, Star as Ae, ThumbsDown as be, ThumbsUp as we, Trash2 as ve, Trophy as Me, Undo2 as Ue, Upload as ye, User as De, UserPlus as Oe, UserRoundCog as ke, Users as He, X as Ee, createIcon as Ne } from "./components/Icons/index.js";
7
+ import { ArrowLeft as h, ArrowLeftRight as S, BarChart3 as g, BookOpen as P, Bot as T, Check as L, ChevronDown as I, ChevronLeft as R, ChevronRight as A, ChevronUp as w, CircleAlert as b, CircleCheck as v, CircleHelp as M, CirclePlay as U, CircleX as y, ClipboardCheck as D, Clock as O, CloudDownload as k, CloudUpload as E, Code as H, Copy as N, Crown as G, Database as _, Download as z, Eye as B, File as V, FileArchive as q, FileImage as X, FileSpreadsheet as Y, FileText as W, Flag as j, Flame as J, Folder as K, FolderOpen as Q, Hash as Z, House as $, ICON_NAMES as ee, ICON_REGISTRY as re, Import as oe, Inbox as te, Info as ae, LayoutDashboard as le, LayoutGrid as se, Loader2 as fe, Lock as ie, LogOut as me, MessageCircle as pe, MessageSquare as de, PanelLeftClose as ue, PanelLeftOpen as ne, Pause as xe, Pencil as Fe, Plus as Ce, Presentation as ce, RefreshCw as he, RotateCw as Se, Send as ge, Settings as Pe, Shield as Te, ShieldCheck as Le, SlidersHorizontal as Ie, Square as Re, Star as Ae, ThumbsDown as we, ThumbsUp as be, Trash2 as ve, Trophy as Me, Undo2 as Ue, Upload as ye, User as De, UserPlus as Oe, UserRoundCog as ke, Users as Ee, X as He, createIcon as Ne } from "./components/Icons/index.js";
8
8
  import { default as _e } from "./components/AgentHub/AgentHubAccessGuard.js";
9
- import { default as Ve } from "./components/AgentHub/AgentHubIndexRedirect.js";
9
+ import { default as Be } from "./components/AgentHub/AgentHubIndexRedirect.js";
10
10
  import { default as qe } from "./components/AgentHub/ChatSessionAccessGuard.js";
11
11
  import { default as Ye } from "./components/Tour/AppTour/index.js";
12
12
  import { default as je } from "./components/Descriptions/CommonDescriptions.js";
@@ -15,52 +15,53 @@ import { default as Ze } from "./components/Form/FetchSelect.js";
15
15
  import { default as er } from "./components/Form/FetchTreeSelect.js";
16
16
  import { default as or } from "./components/File/FileLink/index.js";
17
17
  import { default as ar } from "./components/File/FilePreview/index.js";
18
- import { default as sr } from "./components/File/FilePreviewModal/index.js";
19
- import { default as ir } from "./components/Tag/FileTags.js";
20
- import { default as mr } from "./components/Filter/FilterDateRange/index.js";
21
- import { default as ur } from "./components/Filter/FilterInput/index.js";
22
- import { default as xr } from "./components/Filter/FilterNumberRange/index.js";
23
- import { default as Cr } from "./components/Filter/FilterPanel/index.js";
24
- import { default as hr } from "./components/Filter/FilterPopover/index.js";
25
- import { default as gr } from "./components/Filter/FilterSelect/index.js";
26
- import { default as Pr } from "./components/Filter/FilterTreeSelect/index.js";
27
- import { default as Lr } from "./components/Filter/FilterTrigger/index.js";
28
- import { default as Ar } from "./provider/MarsunCoreProvider.js";
29
- import { default as wr } from "./components/Layout/PageHeaderLayout/index.js";
30
- import { default as Mr } from "./components/Auth/PermissionGuard.js";
31
- import { default as yr } from "./components/Form/PersonOptionRow/index.js";
32
- import { default as Or } from "./components/Auth/ProtectedRoute.js";
33
- import { SEMANTIC_COLORS as Hr, default as Er } from "./components/Tag/SemanticTag.js";
34
- import { default as Gr } from "./components/Stat/StatCard/index.js";
35
- import { default as Br } from "./components/Stat/StatCardList.js";
36
- import { default as zr } from "./components/Stat/StatPendingBreakdown/index.js";
37
- import { default as Xr } from "./components/Form/StepForm.js";
38
- import { default as Wr } from "./components/Modal/StepModal/index.js";
39
- import { default as Jr } from "./components/Tag/Tags/index.js";
40
- import { default as Qr } from "./components/TooltipInfo/TooltipInfo.js";
41
- import { default as $r } from "./components/VirtualScrollbar/VirtualScrollbar/index.js";
42
- import { FileItem as ro } from "./components/File/FileItem/index.js";
43
- import { FilterProvider as to, useFilterRegister as ao, useFilterState as lo } from "./components/Filter/useFilterState.js";
44
- import { getFileExtension as fo, getFileIcon as io, getFileTypeName as po, normalizeFileDisplayItem as mo, parseFileNameFromUrl as uo } from "./components/File/fileDisplay.js";
45
- import { hasPermission as xo } from "./components/Auth/hasPermission.js";
46
- import { resolveHidden as Co } from "./components/Filter/types.js";
47
- import { useMarsunAuth as ho, useMarsunCore as So, useMarsunFetch as go } from "./provider/context.js";
18
+ import { default as sr } from "./components/File/FilePreviewLink/index.js";
19
+ import { default as ir } from "./components/File/FilePreviewModal/index.js";
20
+ import { default as pr } from "./components/Tag/FileTags.js";
21
+ import { default as ur } from "./components/Filter/FilterDateRange/index.js";
22
+ import { default as xr } from "./components/Filter/FilterInput/index.js";
23
+ import { default as Cr } from "./components/Filter/FilterNumberRange/index.js";
24
+ import { default as hr } from "./components/Filter/FilterPanel/index.js";
25
+ import { default as gr } from "./components/Filter/FilterPopover/index.js";
26
+ import { default as Tr } from "./components/Filter/FilterSelect/index.js";
27
+ import { default as Ir } from "./components/Filter/FilterTreeSelect/index.js";
28
+ import { default as Ar } from "./components/Filter/FilterTrigger/index.js";
29
+ import { default as br } from "./provider/MarsunCoreProvider.js";
30
+ import { default as Mr } from "./components/Layout/PageHeaderLayout/index.js";
31
+ import { default as yr } from "./components/Auth/PermissionGuard.js";
32
+ import { default as Or } from "./components/Form/PersonOptionRow/index.js";
33
+ import { default as Er } from "./components/Auth/ProtectedRoute.js";
34
+ import { SEMANTIC_COLORS as Nr, default as Gr } from "./components/Tag/SemanticTag.js";
35
+ import { default as zr } from "./components/Stat/StatCard/index.js";
36
+ import { default as Vr } from "./components/Stat/StatCardList.js";
37
+ import { default as Xr } from "./components/Stat/StatPendingBreakdown/index.js";
38
+ import { default as Wr } from "./components/Form/StepForm.js";
39
+ import { default as Jr } from "./components/Modal/StepModal/index.js";
40
+ import { default as Qr } from "./components/Tag/Tags/index.js";
41
+ import { default as $r } from "./components/TooltipInfo/TooltipInfo.js";
42
+ import { default as ro } from "./components/VirtualScrollbar/VirtualScrollbar/index.js";
43
+ import { FileItem as to } from "./components/File/FileItem/index.js";
44
+ import { FilterProvider as lo, useFilterRegister as so, useFilterState as fo } from "./components/Filter/useFilterState.js";
45
+ import { getFileExtension as mo, getFileIcon as po, getFileTypeName as uo, normalizeExtension as no, normalizeFileDisplayItem as xo, parseFileNameFromUrl as Fo } from "./components/File/fileDisplay.js";
46
+ import { hasPermission as co } from "./components/Auth/hasPermission.js";
47
+ import { resolveHidden as So } from "./components/Filter/types.js";
48
+ import { useMarsunAuth as Po, useMarsunCore as To, useMarsunFetch as Lo } from "./provider/context.js";
48
49
  export {
49
50
  _e as AgentHubAccessGuard,
50
- Ve as AgentHubIndexRedirect,
51
+ Be as AgentHubIndexRedirect,
51
52
  qe as AgentHubSessionAccessGuard,
52
53
  Ye as AppTour,
53
54
  h as ArrowLeft,
54
55
  S as ArrowLeftRight,
55
56
  g as BarChart3,
56
- T as BookOpen,
57
- P as Bot,
58
- I as Check,
59
- L as ChevronDown,
57
+ P as BookOpen,
58
+ T as Bot,
59
+ L as Check,
60
+ I as ChevronDown,
60
61
  R as ChevronLeft,
61
62
  A as ChevronRight,
62
- b as ChevronUp,
63
- w as CircleAlert,
63
+ w as ChevronUp,
64
+ b as CircleAlert,
64
65
  v as CircleCheck,
65
66
  M as CircleHelp,
66
67
  U as CirclePlay,
@@ -68,8 +69,8 @@ export {
68
69
  D as ClipboardCheck,
69
70
  O as Clock,
70
71
  k as CloudDownload,
71
- H as CloudUpload,
72
- E as Code,
72
+ E as CloudUpload,
73
+ H as Code,
73
74
  je as CommonDescriptions,
74
75
  Ke as CommonFilter,
75
76
  C as CommonUpload,
@@ -77,29 +78,30 @@ export {
77
78
  G as Crown,
78
79
  l as DEFAULT_PRIMARY_COLOR,
79
80
  _ as Database,
80
- B as Download,
81
- V as Eye,
81
+ z as Download,
82
+ B as Eye,
82
83
  Ze as FetchSelect,
83
84
  er as FetchTreeSelect,
84
- z as File,
85
+ V as File,
85
86
  q as FileArchive,
86
87
  X as FileImage,
87
- ro as FileItemView,
88
+ to as FileItemView,
88
89
  or as FileLink,
89
90
  ar as FilePreview,
90
- sr as FilePreviewModal,
91
+ sr as FilePreviewLink,
92
+ ir as FilePreviewModal,
91
93
  Y as FileSpreadsheet,
92
- ir as FileTags,
94
+ pr as FileTags,
93
95
  W as FileText,
94
- mr as FilterDateRange,
95
- ur as FilterInput,
96
- xr as FilterNumberRange,
97
- Cr as FilterPanel,
98
- hr as FilterPopover,
99
- to as FilterProvider,
100
- gr as FilterSelect,
101
- Pr as FilterTreeSelect,
102
- Lr as FilterTrigger,
96
+ ur as FilterDateRange,
97
+ xr as FilterInput,
98
+ Cr as FilterNumberRange,
99
+ hr as FilterPanel,
100
+ gr as FilterPopover,
101
+ lo as FilterProvider,
102
+ Tr as FilterSelect,
103
+ Ir as FilterTreeSelect,
104
+ Ar as FilterTrigger,
103
105
  j as Flag,
104
106
  J as Flame,
105
107
  K as Folder,
@@ -115,41 +117,41 @@ export {
115
117
  se as LayoutGrid,
116
118
  fe as Loader2,
117
119
  ie as Lock,
118
- pe as LogOut,
119
- Ar as MarsunCoreProvider,
120
- me as MessageCircle,
120
+ me as LogOut,
121
+ br as MarsunCoreProvider,
122
+ pe as MessageCircle,
121
123
  de as MessageSquare,
122
124
  s as PALETTE,
123
- wr as PageHeaderLayout,
125
+ Mr as PageHeaderLayout,
124
126
  ue as PanelLeftClose,
125
127
  ne as PanelLeftOpen,
126
128
  xe as Pause,
127
129
  Fe as Pencil,
128
- Mr as PermissionGuard,
129
- yr as PersonOptionRow,
130
+ yr as PermissionGuard,
131
+ Or as PersonOptionRow,
130
132
  Ce as Plus,
131
133
  ce as Presentation,
132
- Or as ProtectedRoute,
134
+ Er as ProtectedRoute,
133
135
  he as RefreshCw,
134
136
  Se as RotateCw,
135
- Hr as SEMANTIC_COLORS,
136
- Er as SemanticTag,
137
+ Nr as SEMANTIC_COLORS,
138
+ Gr as SemanticTag,
137
139
  ge as Send,
138
- Te as Settings,
139
- Pe as Shield,
140
- Ie as ShieldCheck,
141
- Le as SlidersHorizontal,
140
+ Pe as Settings,
141
+ Te as Shield,
142
+ Le as ShieldCheck,
143
+ Ie as SlidersHorizontal,
142
144
  Re as Square,
143
145
  Ae as Star,
144
- Gr as StatCard,
145
- Br as StatCardList,
146
- zr as StatPendingBreakdown,
147
- Xr as StepForm,
148
- Wr as StepModal,
149
- Jr as Tags,
150
- be as ThumbsDown,
151
- we as ThumbsUp,
152
- Qr as TooltipInfo,
146
+ zr as StatCard,
147
+ Vr as StatCardList,
148
+ Xr as StatPendingBreakdown,
149
+ Wr as StepForm,
150
+ Jr as StepModal,
151
+ Qr as Tags,
152
+ we as ThumbsDown,
153
+ be as ThumbsUp,
154
+ $r as TooltipInfo,
153
155
  ve as Trash2,
154
156
  Me as Trophy,
155
157
  Ue as Undo2,
@@ -157,28 +159,29 @@ export {
157
159
  De as User,
158
160
  Oe as UserPlus,
159
161
  ke as UserRoundCog,
160
- He as Users,
161
- $r as VirtualScrollbar,
162
- Ee as X,
162
+ Ee as Users,
163
+ ro as VirtualScrollbar,
164
+ He as X,
163
165
  o as applyThemeToCssVariables,
164
166
  Ne as createIcon,
165
167
  i as fetchWithTimeout,
166
168
  x as formatFileSize,
167
169
  t as generateTheme,
168
- fo as getFileExtension,
169
- io as getFileIcon,
170
- po as getFileTypeName,
171
- xo as hasPermission,
172
- mo as normalizeFileDisplayItem,
173
- uo as parseFileNameFromUrl,
174
- Co as resolveHidden,
170
+ mo as getFileExtension,
171
+ po as getFileIcon,
172
+ uo as getFileTypeName,
173
+ co as hasPermission,
174
+ no as normalizeExtension,
175
+ xo as normalizeFileDisplayItem,
176
+ Fo as parseFileNameFromUrl,
177
+ So as resolveHidden,
175
178
  d as resolveMaybeFn,
176
179
  u as resolveVisible,
177
- p as useFetchData,
178
- ao as useFilterRegister,
179
- lo as useFilterState,
180
- ho as useMarsunAuth,
181
- So as useMarsunCore,
182
- go as useMarsunFetch
180
+ m as useFetchData,
181
+ so as useFilterRegister,
182
+ fo as useFilterState,
183
+ Po as useMarsunAuth,
184
+ To as useMarsunCore,
185
+ Lo as useMarsunFetch
183
186
  };
184
187
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- ._upload-root_xoraq_1{max-width:xl}._upload-container_xoraq_5{font-size:12px;color:var(--font-color-grey)}._upload-wrapper_xoraq_10{color:var(--primary-color);cursor:pointer}._upload-wrapper_xoraq_10:hover{text-decoration:underline}._upload-inner_xoraq_18{display:block}._upload-header_xoraq_22{font-size:var(--font-size-small);color:var(--font-color-grey)}._upload-body_xoraq_27{border-radius:8px;border-width:1px;border-style:solid;padding:16px}._upload-footer_xoraq_34{font-size:var(--font-size-small);font-weight:500;color:var(--font-color-grey)}._upload-row_xoraq_40{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;font-size:var(--font-size-small)}._upload-col_xoraq_47{display:flex;align-items:center;gap:8px;font-size:var(--font-size-small)}._upload-wrap_xoraq_10{display:block}._upload-panel_xoraq_58{font-size:12px}._upload-card_xoraq_62{padding:12px;font-size:var(--font-size-small)}._upload-item_xoraq_67{font-size:var(--font-size-small);margin-top:8px;display:block}._upload-link_xoraq_73{margin-top:12px}._upload-label_xoraq_77{display:flex;align-items:center;gap:8px;min-width:0}._upload-value_xoraq_84{color:var(--font-color-grey-1);flex-shrink:0}._upload-meta_xoraq_89{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._upload-icon_xoraq_95{margin:0!important;flex-shrink:0}._upload-title_xoraq_100{font-size:12px;margin-left:0!important;flex-shrink:0}._upload-desc_xoraq_106{flex-shrink:0}._upload-actions_xoraq_110{font-size:30px;margin-bottom:8px}._upload-toolbar_xoraq_115{color:var(--font-color-grey)}._upload-toolbar_xoraq_115:hover{border-color:var(--primary-color)}._upload-toolbar_xoraq_115:hover{color:var(--primary-color)}._upload-list_xoraq_125{margin-top:8px}._upload-file-row_xoraq_129{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 12px;border-radius:4px;background-color:var(--bg-color-grey);border:1px solid var(--font-color-grey-4)}._upload-file-row-error_xoraq_140{border-color:#f53f3f59;color:var(--error-color)}._upload-drag-icon_xoraq_145{font-size:30px;margin-bottom:8px;color:var(--primary-color)}._app-tour-root_ybirw_1{font-size:12px;color:var(--font-color-grey-1)}._common-filter-root_kdoz3_1{background-color:var(--bg-color-white);margin-bottom:16px}._common-filter-container_kdoz3_6{display:flex;align-items:center;gap:12px}._common-filter-label_kdoz3_12{flex-shrink:0;font-size:var(--font-size-default);font-weight:500;color:#374151}._common-filter-content_kdoz3_19{display:flex;flex:1;align-items:flex-start;justify-content:space-between}._common-filter-items_kdoz3_26{display:flex;flex-wrap:wrap;align-items:center;column-gap:6px;row-gap:8px}._common-filter-extra_kdoz3_34{flex-shrink:0;margin-left:16px}._common-filter-selected_kdoz3_39{display:flex;align-items:center;justify-content:space-between;padding-top:12px}._common-filter-selected-main_kdoz3_46{display:flex;align-items:baseline;gap:8px}._common-filter-selected-title_kdoz3_52{font-size:12px;font-weight:500;color:var(--font-color-grey)}._common-filter-selected-tags_kdoz3_58{flex:1}._common-filter-tag_kdoz3_62{display:flex;align-items:center;gap:4px}._common-filter-tag-label_kdoz3_68{font-size:12px}._common-filter-tag-close_kdoz3_72{font-size:12px;cursor:pointer;margin-left:2px;opacity:.6}._common-filter-tag-close_kdoz3_72:hover{opacity:1}._common-filter-clear-btn_kdoz3_82{padding:0!important;height:auto!important;font-size:12px}._file-link-inner_uetzp_1{flex-shrink:0}._file-link-row_uetzp_5{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._file-link-actions_uetzp_11{display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-small);transition:color .2s ease,background-color .2s ease}._file-link-actions_uetzp_11:hover{color:var(--primary-color)}._file-link-toolbar_uetzp_22{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._file-preview-list_1yfht_1{position:relative}._file-preview-empty_1yfht_5{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-white)}._file-preview-loading_1yfht_15{width:100%;padding-top:80px;padding-bottom:80px}._file-preview-content_1yfht_21{padding:16px;font-size:var(--font-size-small);white-space:pre-wrap;overflow:auto;max-height:70vh;background-color:var(--bg-color-grey)}._file-preview-aside_1yfht_30{padding:24px;overflow:auto;max-height:70vh;background-color:var(--bg-color-white)}._file-preview-main_1yfht_37{display:flex;align-items:center;justify-content:center;padding:16px;overflow:auto;max-height:70vh}._file-preview-section_1yfht_46{max-width:100%;max-height:65vh;object-fit:contain}._file-preview-group_1yfht_52{width:100%}._file-preview-cell_1yfht_56{overflow:auto;max-height:70vh;background-color:var(--bg-color-white)}._file-preview-overlay_1yfht_62{position:relative;display:flex;align-items:center;justify-content:center}._file-preview-badge_1yfht_69{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:48px;padding-bottom:48px;gap:16px}._file-preview-tag_1yfht_79{position:relative;display:flex;align-items:center;justify-content:center;padding:16px}._file-preview-hint_1yfht_87{max-width:100%;max-height:65vh}._file-preview-sider_1yfht_92{font-size:48px}._file-preview-nav_1yfht_96{text-align:center}._file-preview-menu_1yfht_100{color:var(--font-color-grey);margin-bottom:4px}._file-preview-user-menu_1yfht_105{font-size:12px;color:var(--font-color-grey-1)}._file-preview-avatar_1yfht_110{display:flex;align-items:center;justify-content:center;padding:32px}._file-preview-upload_1yfht_117{width:100%;max-width:1024px}._file-preview-filter_1yfht_122{display:flex;align-items:center;justify-content:space-between;padding-top:12px;padding-bottom:12px;border-bottom-width:1px;border-bottom-style:solid;border-color:var(--font-color-grey-4)}._file-preview-table_1yfht_133{font-weight:500}._tags-tag-list_d5l57_1{display:flex;align-items:center;gap:4px;flex-wrap:wrap}._tags-tag-list-nowrap_d5l57_8{flex-wrap:nowrap}._tags-tag-list-tooltip_d5l57_12{max-width:320px}._filter-panel-body_tjvgz_1{margin-bottom:12px}._filter-panel-actions_tjvgz_5{display:flex;justify-content:flex-end;gap:8px}._filter-trigger-root_115kh_1{display:inline-flex;align-items:center;gap:4px;cursor:pointer;border-radius:4px;padding:2px 6px;font-size:12px;transition:color .2s ease,background-color .2s ease}._filter-trigger-active_115kh_12{background-color:var(--primary-color);color:var(--bg-color-white)}._filter-trigger-inactive_115kh_17{color:#374151}._filter-trigger-inactive_115kh_17:hover{color:var(--primary-color);background-color:var(--primary-color-bg)}._filter-trigger-chevron_115kh_25{font-size:10px}._filter-date-range-quick-options_ctl7u_1{margin-bottom:12px;display:flex;flex-wrap:wrap;gap:8px}._filter-date-range-quick-option_ctl7u_1{cursor:pointer;border-radius:4px;padding:4px 8px;font-size:var(--font-size-small)}._filter-date-range-quick-option_ctl7u_1:hover{background-color:var(--primary-color-bg)}._filter-date-range-quick-option-active_ctl7u_18{background-color:var(--primary-color);color:var(--bg-color-white);font-weight:500}._filter-date-range-picker_ctl7u_24{width:100%}._filter-number-range-inputs_y3pfu_1{display:flex;align-items:center;gap:8px}._filter-number-range-separator_y3pfu_7{color:var(--font-color-grey-1)}._filter-number-range-unit_y3pfu_11{font-size:var(--font-size-small);color:var(--font-color-grey)}._person-option-row-root_lf6i9_1{font-size:var(--font-size-small)}._person-option-row-container_lf6i9_5{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._person-option-row-wrapper_lf6i9_11{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--font-color-grey-1);font-size:12px}._person-option-row-inner_lf6i9_19{margin-left:auto;flex-shrink:0;color:var(--font-color-grey-1)}._person-option-row-inner_lf6i9_19:hover{color:var(--primary-color)}._person-option-row-person-row_lf6i9_28{display:flex;align-items:center;gap:8px;min-width:0;flex:1}._filter-select-search_1esgk_1{margin-bottom:12px}._filter-select-options_1esgk_5{max-height:300px;overflow:auto}._filter-select-option_1esgk_5{display:flex;align-items:center;gap:8px;cursor:pointer;border-radius:4px;padding:6px 8px;font-size:var(--font-size-small)}._filter-select-option_1esgk_5:hover{background-color:var(--bg-color-grey)}._filter-select-option-selected_1esgk_23{color:var(--primary-color);font-weight:500}._filter-select-option-check_1esgk_28{margin-left:auto;font-size:12px;color:var(--primary-color)}._filter-select-empty_1esgk_34{padding-top:16px;padding-bottom:16px;text-align:center;font-size:var(--font-size-small);color:var(--font-color-grey-1)}._filter-select-selected-bar_1esgk_42{margin-top:8px;border-top-width:1px;border-top-style:solid;padding-top:8px}._filter-select-selected-label_1esgk_49{margin-bottom:4px;font-size:12px;color:var(--font-color-grey-1)}._filter-select-selected-tag_1esgk_55{display:inline-flex;cursor:pointer;align-items:center;gap:4px;background-color:var(--bg-color-grey-1);padding:2px 6px;font-size:12px}._filter-select-selected-remove_1esgk_68{font-size:10px}._filter-tree-select-search_he1ck_1{margin-bottom:12px}._filter-tree-select-options_he1ck_5{max-height:300px;overflow:auto}._filter-tree-select-option_he1ck_5{display:flex;align-items:center;gap:8px;cursor:pointer;border-radius:4px;padding:6px 8px;font-size:var(--font-size-small)}._filter-tree-select-option_he1ck_5:hover{background-color:var(--bg-color-grey)}._filter-tree-select-option-selected_he1ck_23{color:var(--primary-color);font-weight:500}._filter-tree-select-option-check_he1ck_28{margin-left:auto;font-size:12px;color:var(--primary-color)}._filter-tree-select-expand-icon_he1ck_34{display:inline-flex;width:16px;flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;color:var(--font-color-grey-1)}._filter-tree-select-expand-placeholder_he1ck_44{display:inline-flex;width:16px;flex-shrink:0}._filter-tree-select-node-label_he1ck_50{flex:1}._filter-tree-select-empty_he1ck_54{padding-top:16px;padding-bottom:16px;text-align:center;font-size:var(--font-size-small);color:var(--font-color-grey-1)}._filter-tree-select-selected-bar_he1ck_62{margin-top:8px;border-top-width:1px;border-top-style:solid;padding-top:8px}._filter-tree-select-selected-label_he1ck_69{margin-bottom:4px;font-size:12px;color:var(--font-color-grey-1)}._filter-tree-select-selected-tag_he1ck_75{display:inline-flex;cursor:pointer;align-items:center;gap:4px;background-color:var(--bg-color-grey-1);padding:2px 6px;font-size:12px}._filter-tree-select-selected-remove_he1ck_88{font-size:10px}._page-header-layout-root_13o9c_1{display:flex;align-items:center;justify-content:space-between}._page-header-layout-container_13o9c_7{display:flex;align-items:center}._page-header-layout-wrapper_13o9c_12{font-size:var(--font-size-18);font-weight:600}._page-header-layout-inner_13o9c_17{margin-bottom:16px;padding:8px 12px;background-color:var(--primary-color-bg);border:1px solid var(--primary-color-border);border-radius:4px;font-size:var(--font-size-small);color:var(--primary-color)}._stat-card-clickable_xovsh_1{cursor:pointer}._stat-card-clickable_xovsh_1 .ant-statistic-content,._stat-card-clickable_xovsh_1 .ant-statistic-content .ant-statistic-content-prefix{display:flex!important;align-items:center}._stat-pending-breakdown-root_85di3_1{font-size:12px;color:var(--font-color-grey-1);margin-bottom:8px}._stat-pending-breakdown-container_85di3_7{font-size:12px;font-weight:400;color:var(--font-color-grey-1);margin-top:4px;line-height:var(--line-height-default)}._stat-pending-breakdown-detail-divider_85di3_15{margin-top:12px;padding-top:12px;border-top:1px solid var(--font-color-grey-4)}._step-modal-root_1ccyj_1{display:flex;align-items:center;gap:8px}._step-modal-container_1ccyj_7{flex:1}._step-modal-wrapper_1ccyj_11{margin-bottom:24px}._virtual-scrollbar-root_hy6p8_1{position:relative;display:flex;flex-direction:column;overflow:hidden;min-height:0;min-width:0}._virtual-scrollbar-viewport_hy6p8_14{flex:1 1 auto;width:100%;height:100%;min-height:0;overflow:auto;scrollbar-width:none;-ms-overflow-style:none}._virtual-scrollbar-viewport_hy6p8_14::-webkit-scrollbar{display:none}._virtual-scrollbar-track_hy6p8_27{opacity:1;pointer-events:auto}._virtual-scrollbar-track-vertical_hy6p8_32{position:absolute;z-index:2;opacity:0;pointer-events:none;transition:opacity .2s ease;top:2px;right:2px;bottom:2px;width:6px}._virtual-scrollbar-track-horizontal_hy6p8_44{opacity:1;pointer-events:auto}._virtual-scrollbar-thumb_hy6p8_49{top:0;bottom:0;min-width:24px}._file-item-root_lmij6_1{transition:color .2s ease,background-color .2s ease}._file-item-root_lmij6_1:hover{background-color:var(--bg-color-grey)}._file-item-container_lmij6_8{display:flex;align-items:center;justify-content:space-between;padding:6px 8px}._file-item-wrapper_lmij6_18{display:flex;gap:8px;min-width:0;flex:1}._file-item-inner_lmij6_25{flex-shrink:0}._file-item-header_lmij6_29{min-width:0;flex:1}._file-item-body_lmij6_34{display:flex;align-items:center;gap:8px}._file-item-footer_lmij6_40{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-small)}._file-item-row_lmij6_47{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._file-item-col_lmij6_53{margin-top:2px;gap:2px}._file-item-wrap_lmij6_18{display:flex;align-items:center;gap:8px;flex-shrink:0;margin-left:8px}._file-item-panel_lmij6_66{display:flex;align-items:center}._file-item-action-group_lmij6_71{display:flex;align-items:center;gap:4px}._file-item-action-group-disabled_lmij6_77{opacity:.45;pointer-events:none}
1
+ ._upload-root_xoraq_1{max-width:xl}._upload-container_xoraq_5{font-size:12px;color:var(--font-color-grey)}._upload-wrapper_xoraq_10{color:var(--primary-color);cursor:pointer}._upload-wrapper_xoraq_10:hover{text-decoration:underline}._upload-inner_xoraq_18{display:block}._upload-header_xoraq_22{font-size:var(--font-size-small);color:var(--font-color-grey)}._upload-body_xoraq_27{border-radius:8px;border-width:1px;border-style:solid;padding:16px}._upload-footer_xoraq_34{font-size:var(--font-size-small);font-weight:500;color:var(--font-color-grey)}._upload-row_xoraq_40{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;font-size:var(--font-size-small)}._upload-col_xoraq_47{display:flex;align-items:center;gap:8px;font-size:var(--font-size-small)}._upload-wrap_xoraq_10{display:block}._upload-panel_xoraq_58{font-size:12px}._upload-card_xoraq_62{padding:12px;font-size:var(--font-size-small)}._upload-item_xoraq_67{font-size:var(--font-size-small);margin-top:8px;display:block}._upload-link_xoraq_73{margin-top:12px}._upload-label_xoraq_77{display:flex;align-items:center;gap:8px;min-width:0}._upload-value_xoraq_84{color:var(--font-color-grey-1);flex-shrink:0}._upload-meta_xoraq_89{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._upload-icon_xoraq_95{margin:0!important;flex-shrink:0}._upload-title_xoraq_100{font-size:12px;margin-left:0!important;flex-shrink:0}._upload-desc_xoraq_106{flex-shrink:0}._upload-actions_xoraq_110{font-size:30px;margin-bottom:8px}._upload-toolbar_xoraq_115{color:var(--font-color-grey)}._upload-toolbar_xoraq_115:hover{border-color:var(--primary-color)}._upload-toolbar_xoraq_115:hover{color:var(--primary-color)}._upload-list_xoraq_125{margin-top:8px}._upload-file-row_xoraq_129{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 12px;border-radius:4px;background-color:var(--bg-color-grey);border:1px solid var(--font-color-grey-4)}._upload-file-row-error_xoraq_140{border-color:#f53f3f59;color:var(--error-color)}._upload-drag-icon_xoraq_145{font-size:30px;margin-bottom:8px;color:var(--primary-color)}._app-tour-root_ybirw_1{font-size:12px;color:var(--font-color-grey-1)}._common-filter-root_kdoz3_1{background-color:var(--bg-color-white);margin-bottom:16px}._common-filter-container_kdoz3_6{display:flex;align-items:center;gap:12px}._common-filter-label_kdoz3_12{flex-shrink:0;font-size:var(--font-size-default);font-weight:500;color:#374151}._common-filter-content_kdoz3_19{display:flex;flex:1;align-items:flex-start;justify-content:space-between}._common-filter-items_kdoz3_26{display:flex;flex-wrap:wrap;align-items:center;column-gap:6px;row-gap:8px}._common-filter-extra_kdoz3_34{flex-shrink:0;margin-left:16px}._common-filter-selected_kdoz3_39{display:flex;align-items:center;justify-content:space-between;padding-top:12px}._common-filter-selected-main_kdoz3_46{display:flex;align-items:baseline;gap:8px}._common-filter-selected-title_kdoz3_52{font-size:12px;font-weight:500;color:var(--font-color-grey)}._common-filter-selected-tags_kdoz3_58{flex:1}._common-filter-tag_kdoz3_62{display:flex;align-items:center;gap:4px}._common-filter-tag-label_kdoz3_68{font-size:12px}._common-filter-tag-close_kdoz3_72{font-size:12px;cursor:pointer;margin-left:2px;opacity:.6}._common-filter-tag-close_kdoz3_72:hover{opacity:1}._common-filter-clear-btn_kdoz3_82{padding:0!important;height:auto!important;font-size:12px}._file-link-inner_uetzp_1{flex-shrink:0}._file-link-row_uetzp_5{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._file-link-actions_uetzp_11{display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-small);transition:color .2s ease,background-color .2s ease}._file-link-actions_uetzp_11:hover{color:var(--primary-color)}._file-link-toolbar_uetzp_22{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._file-preview-list_irbqy_1{position:relative}._file-preview-empty_irbqy_5{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-white)}._file-preview-loading_irbqy_15{width:100%;padding-top:80px;padding-bottom:80px}._file-preview-content_irbqy_21{padding:16px;font-size:var(--font-size-small);white-space:pre-wrap;overflow:auto;max-height:70vh;background-color:var(--bg-color-grey)}._file-preview-aside_irbqy_30{padding:24px;overflow:auto;max-height:70vh;background-color:var(--bg-color-white)}._file-preview-main_irbqy_37{display:flex;align-items:center;justify-content:center;padding:16px;overflow:auto;max-height:70vh}._file-preview-section_irbqy_46{max-width:100%;max-height:65vh;object-fit:contain}._file-preview-group_irbqy_52{width:100%}._file-preview-cell_irbqy_56{overflow:auto;max-height:70vh;background-color:var(--bg-color-white)}._file-preview-overlay_irbqy_62{position:relative;display:flex;align-items:center;justify-content:center}._file-preview-badge_irbqy_69{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:48px;padding-bottom:48px;gap:16px}._file-preview-tag_irbqy_79{position:relative;display:flex;align-items:center;justify-content:center;padding:16px}._file-preview-hint_irbqy_87{max-width:100%;max-height:65vh}._file-preview-sider_irbqy_92{font-size:48px}._file-preview-nav_irbqy_96{text-align:center}._file-preview-menu_irbqy_100{color:var(--font-color-grey);margin-bottom:4px}._file-preview-user-menu_irbqy_105{font-size:12px;color:var(--font-color-grey-1)}._file-preview-avatar_irbqy_110{display:flex;align-items:center;justify-content:center;padding:32px}._file-preview-upload_irbqy_117{width:100%;max-width:1024px}._file-preview-filter_irbqy_122{display:flex;align-items:center;justify-content:space-between;padding-top:12px;padding-bottom:12px;border-bottom-width:1px;border-bottom-style:solid;border-color:var(--font-color-grey-4)}._file-preview_irbqy_1{display:flex;flex-direction:column;width:100%}._file-preview-header_irbqy_139{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:12px;width:100%}._file-preview-info_irbqy_148{display:flex;align-items:center;gap:8px;min-width:0;flex:1}._file-preview-icon_irbqy_156{display:inline-flex;flex-shrink:0}._file-preview-name_irbqy_161{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}._file-preview-size_irbqy_168{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._file-preview-body_irbqy_174{width:100%}._file-preview-iframe_irbqy_178{display:block;width:100%;height:70vh;border:none;background:var(--bg-color-grey)}._file-preview-media-wrap_irbqy_186{display:flex;justify-content:center;width:100%}._file-preview-image_irbqy_192{width:100%;max-height:70vh;object-fit:contain}._file-preview-video_irbqy_198{width:100%;max-height:70vh;background:#000}._file-preview-audio-wrap_irbqy_204{display:flex;align-items:center;justify-content:center;width:100%;padding:48px 16px}._file-preview-audio_irbqy_204{width:100%}._file-preview-office-wrap_irbqy_216{width:100%;min-height:400px}._file-preview-office-inner_irbqy_221{width:100%;min-height:400px;overflow:auto;max-height:70vh}._file-preview-text_irbqy_228{margin:0;padding:16px;width:100%;max-height:70vh;overflow:auto;white-space:pre-wrap;word-break:break-word;font-size:var(--font-size-small);background:var(--bg-color-grey);box-sizing:border-box}._file-preview-table_irbqy_241{font-weight:500}._file-preview-link_1rk52_1{display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-small);transition:color .2s ease}._file-preview-link_1rk52_1:hover{color:var(--primary-color)}._file-preview-link-disabled_1rk52_12{display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-small);color:var(--font-color-grey-1);cursor:not-allowed}._file-preview-link-inner_1rk52_21{flex-shrink:0}._file-preview-link-name_1rk52_25{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._file-preview-link-type_1rk52_31{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._tags-tag-list_d5l57_1{display:flex;align-items:center;gap:4px;flex-wrap:wrap}._tags-tag-list-nowrap_d5l57_8{flex-wrap:nowrap}._tags-tag-list-tooltip_d5l57_12{max-width:320px}._filter-panel-body_tjvgz_1{margin-bottom:12px}._filter-panel-actions_tjvgz_5{display:flex;justify-content:flex-end;gap:8px}._filter-trigger-root_115kh_1{display:inline-flex;align-items:center;gap:4px;cursor:pointer;border-radius:4px;padding:2px 6px;font-size:12px;transition:color .2s ease,background-color .2s ease}._filter-trigger-active_115kh_12{background-color:var(--primary-color);color:var(--bg-color-white)}._filter-trigger-inactive_115kh_17{color:#374151}._filter-trigger-inactive_115kh_17:hover{color:var(--primary-color);background-color:var(--primary-color-bg)}._filter-trigger-chevron_115kh_25{font-size:10px}._filter-date-range-quick-options_ctl7u_1{margin-bottom:12px;display:flex;flex-wrap:wrap;gap:8px}._filter-date-range-quick-option_ctl7u_1{cursor:pointer;border-radius:4px;padding:4px 8px;font-size:var(--font-size-small)}._filter-date-range-quick-option_ctl7u_1:hover{background-color:var(--primary-color-bg)}._filter-date-range-quick-option-active_ctl7u_18{background-color:var(--primary-color);color:var(--bg-color-white);font-weight:500}._filter-date-range-picker_ctl7u_24{width:100%}._filter-number-range-inputs_y3pfu_1{display:flex;align-items:center;gap:8px}._filter-number-range-separator_y3pfu_7{color:var(--font-color-grey-1)}._filter-number-range-unit_y3pfu_11{font-size:var(--font-size-small);color:var(--font-color-grey)}._person-option-row-root_lf6i9_1{font-size:var(--font-size-small)}._person-option-row-container_lf6i9_5{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._person-option-row-wrapper_lf6i9_11{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--font-color-grey-1);font-size:12px}._person-option-row-inner_lf6i9_19{margin-left:auto;flex-shrink:0;color:var(--font-color-grey-1)}._person-option-row-inner_lf6i9_19:hover{color:var(--primary-color)}._person-option-row-person-row_lf6i9_28{display:flex;align-items:center;gap:8px;min-width:0;flex:1}._filter-select-search_1esgk_1{margin-bottom:12px}._filter-select-options_1esgk_5{max-height:300px;overflow:auto}._filter-select-option_1esgk_5{display:flex;align-items:center;gap:8px;cursor:pointer;border-radius:4px;padding:6px 8px;font-size:var(--font-size-small)}._filter-select-option_1esgk_5:hover{background-color:var(--bg-color-grey)}._filter-select-option-selected_1esgk_23{color:var(--primary-color);font-weight:500}._filter-select-option-check_1esgk_28{margin-left:auto;font-size:12px;color:var(--primary-color)}._filter-select-empty_1esgk_34{padding-top:16px;padding-bottom:16px;text-align:center;font-size:var(--font-size-small);color:var(--font-color-grey-1)}._filter-select-selected-bar_1esgk_42{margin-top:8px;border-top-width:1px;border-top-style:solid;padding-top:8px}._filter-select-selected-label_1esgk_49{margin-bottom:4px;font-size:12px;color:var(--font-color-grey-1)}._filter-select-selected-tag_1esgk_55{display:inline-flex;cursor:pointer;align-items:center;gap:4px;background-color:var(--bg-color-grey-1);padding:2px 6px;font-size:12px}._filter-select-selected-remove_1esgk_68{font-size:10px}._filter-tree-select-search_he1ck_1{margin-bottom:12px}._filter-tree-select-options_he1ck_5{max-height:300px;overflow:auto}._filter-tree-select-option_he1ck_5{display:flex;align-items:center;gap:8px;cursor:pointer;border-radius:4px;padding:6px 8px;font-size:var(--font-size-small)}._filter-tree-select-option_he1ck_5:hover{background-color:var(--bg-color-grey)}._filter-tree-select-option-selected_he1ck_23{color:var(--primary-color);font-weight:500}._filter-tree-select-option-check_he1ck_28{margin-left:auto;font-size:12px;color:var(--primary-color)}._filter-tree-select-expand-icon_he1ck_34{display:inline-flex;width:16px;flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;color:var(--font-color-grey-1)}._filter-tree-select-expand-placeholder_he1ck_44{display:inline-flex;width:16px;flex-shrink:0}._filter-tree-select-node-label_he1ck_50{flex:1}._filter-tree-select-empty_he1ck_54{padding-top:16px;padding-bottom:16px;text-align:center;font-size:var(--font-size-small);color:var(--font-color-grey-1)}._filter-tree-select-selected-bar_he1ck_62{margin-top:8px;border-top-width:1px;border-top-style:solid;padding-top:8px}._filter-tree-select-selected-label_he1ck_69{margin-bottom:4px;font-size:12px;color:var(--font-color-grey-1)}._filter-tree-select-selected-tag_he1ck_75{display:inline-flex;cursor:pointer;align-items:center;gap:4px;background-color:var(--bg-color-grey-1);padding:2px 6px;font-size:12px}._filter-tree-select-selected-remove_he1ck_88{font-size:10px}._page-header-layout-root_13o9c_1{display:flex;align-items:center;justify-content:space-between}._page-header-layout-container_13o9c_7{display:flex;align-items:center}._page-header-layout-wrapper_13o9c_12{font-size:var(--font-size-18);font-weight:600}._page-header-layout-inner_13o9c_17{margin-bottom:16px;padding:8px 12px;background-color:var(--primary-color-bg);border:1px solid var(--primary-color-border);border-radius:4px;font-size:var(--font-size-small);color:var(--primary-color)}._stat-card-clickable_xovsh_1{cursor:pointer}._stat-card-clickable_xovsh_1 .ant-statistic-content,._stat-card-clickable_xovsh_1 .ant-statistic-content .ant-statistic-content-prefix{display:flex!important;align-items:center}._stat-pending-breakdown-root_85di3_1{font-size:12px;color:var(--font-color-grey-1);margin-bottom:8px}._stat-pending-breakdown-container_85di3_7{font-size:12px;font-weight:400;color:var(--font-color-grey-1);margin-top:4px;line-height:var(--line-height-default)}._stat-pending-breakdown-detail-divider_85di3_15{margin-top:12px;padding-top:12px;border-top:1px solid var(--font-color-grey-4)}._step-modal-root_1ccyj_1{display:flex;align-items:center;gap:8px}._step-modal-container_1ccyj_7{flex:1}._step-modal-wrapper_1ccyj_11{margin-bottom:24px}._virtual-scrollbar-root_hy6p8_1{position:relative;display:flex;flex-direction:column;overflow:hidden;min-height:0;min-width:0}._virtual-scrollbar-viewport_hy6p8_14{flex:1 1 auto;width:100%;height:100%;min-height:0;overflow:auto;scrollbar-width:none;-ms-overflow-style:none}._virtual-scrollbar-viewport_hy6p8_14::-webkit-scrollbar{display:none}._virtual-scrollbar-track_hy6p8_27{opacity:1;pointer-events:auto}._virtual-scrollbar-track-vertical_hy6p8_32{position:absolute;z-index:2;opacity:0;pointer-events:none;transition:opacity .2s ease;top:2px;right:2px;bottom:2px;width:6px}._virtual-scrollbar-track-horizontal_hy6p8_44{opacity:1;pointer-events:auto}._virtual-scrollbar-thumb_hy6p8_49{top:0;bottom:0;min-width:24px}._file-item-root_lmij6_1{transition:color .2s ease,background-color .2s ease}._file-item-root_lmij6_1:hover{background-color:var(--bg-color-grey)}._file-item-container_lmij6_8{display:flex;align-items:center;justify-content:space-between;padding:6px 8px}._file-item-wrapper_lmij6_18{display:flex;gap:8px;min-width:0;flex:1}._file-item-inner_lmij6_25{flex-shrink:0}._file-item-header_lmij6_29{min-width:0;flex:1}._file-item-body_lmij6_34{display:flex;align-items:center;gap:8px}._file-item-footer_lmij6_40{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-small)}._file-item-row_lmij6_47{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._file-item-col_lmij6_53{margin-top:2px;gap:2px}._file-item-wrap_lmij6_18{display:flex;align-items:center;gap:8px;flex-shrink:0;margin-left:8px}._file-item-panel_lmij6_66{display:flex;align-items:center}._file-item-action-group_lmij6_71{display:flex;align-items:center;gap:4px}._file-item-action-group-disabled_lmij6_77{opacity:.45;pointer-events:none}.x-spreadsheet{font-size:13px;line-height:normal;-webkit-user-select:none;user-select:none;-moz-user-select:none;font-family:Lato,Source Sans Pro,Roboto,Helvetica,Arial,sans-serif;box-sizing:content-box;background:#fff;-webkit-font-smoothing:antialiased}.x-spreadsheet textarea{font:400 13px Arial,Lato,Source Sans Pro,Roboto,Helvetica,sans-serif}.x-spreadsheet-sheet{position:relative;overflow:hidden}.x-spreadsheet-table{vertical-align:bottom}.x-spreadsheet-tooltip{font-family:inherit;position:absolute;padding:5px 10px;color:#fff;border-radius:1px;background:#000;font-size:12px;z-index:201}.x-spreadsheet-tooltip:before{pointer-events:none;position:absolute;left:calc(50% - 4px);top:-4px;content:"";width:8px;height:8px;background:inherit;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:1;box-shadow:1px 1px 3px -1px #0000004d}.x-spreadsheet-color-palette{padding:5px}.x-spreadsheet-color-palette table{margin:0;padding:0;border-collapse:separate;border-spacing:2;background:#fff}.x-spreadsheet-color-palette table td{margin:0;cursor:pointer;border:1px solid transparent}.x-spreadsheet-color-palette table td:hover{border-color:#ddd}.x-spreadsheet-color-palette table td .x-spreadsheet-color-palette-cell{width:16px;height:16px}.x-spreadsheet-border-palette{padding:6px}.x-spreadsheet-border-palette table{margin:0;padding:0;border-collapse:separate;border-spacing:0;background:#fff;table-layout:fixed}.x-spreadsheet-border-palette table td{margin:0}.x-spreadsheet-border-palette .x-spreadsheet-border-palette-left{border-right:1px solid #eee;padding-right:6px}.x-spreadsheet-border-palette .x-spreadsheet-border-palette-left .x-spreadsheet-border-palette-cell{width:30px;height:30px;cursor:pointer;text-align:center}.x-spreadsheet-border-palette .x-spreadsheet-border-palette-left .x-spreadsheet-border-palette-cell:hover{background-color:#eee}.x-spreadsheet-border-palette .x-spreadsheet-border-palette-right{padding-left:6px}.x-spreadsheet-border-palette .x-spreadsheet-border-palette-right .x-spreadsheet-line-type{position:relative;left:0;top:-3px}.x-spreadsheet-dropdown{position:relative}.x-spreadsheet-dropdown .x-spreadsheet-dropdown-content{position:absolute;z-index:200;background:#fff;box-shadow:1px 2px 5px 2px #33333326}.x-spreadsheet-dropdown.bottom-left .x-spreadsheet-dropdown-content{top:calc(100% + 5px);left:0}.x-spreadsheet-dropdown.bottom-right .x-spreadsheet-dropdown-content{top:calc(100% + 5px);right:0}.x-spreadsheet-dropdown.top-left .x-spreadsheet-dropdown-content{bottom:calc(100% + 5px);left:0}.x-spreadsheet-dropdown.top-right .x-spreadsheet-dropdown-content{bottom:calc(100% + 5px);right:0}.x-spreadsheet-dropdown .x-spreadsheet-dropdown-title{padding:0 5px;display:inline-block}.x-spreadsheet-resizer{position:absolute;z-index:11}.x-spreadsheet-resizer .x-spreadsheet-resizer-hover{background-color:#4b89ff40}.x-spreadsheet-resizer .x-spreadsheet-resizer-line{position:absolute}.x-spreadsheet-resizer.horizontal{cursor:row-resize}.x-spreadsheet-resizer.horizontal .x-spreadsheet-resizer-line{border-bottom:2px dashed #4b89ff;left:0;bottom:0}.x-spreadsheet-resizer.vertical{cursor:col-resize}.x-spreadsheet-resizer.vertical .x-spreadsheet-resizer-line{border-right:2px dashed #4b89ff;top:0;right:0}.x-spreadsheet-scrollbar{position:absolute;bottom:0;right:0;background-color:#f4f5f8;opacity:.9;z-index:12}.x-spreadsheet-scrollbar.horizontal{right:15px;overflow-x:scroll;overflow-y:hidden}.x-spreadsheet-scrollbar.horizontal>div{height:1px;background:#ddd}.x-spreadsheet-scrollbar.vertical{bottom:15px;overflow-x:hidden;overflow-y:scroll}.x-spreadsheet-scrollbar.vertical>div{width:1px;background:#ddd}.x-spreadsheet-overlayer{position:absolute;left:0;top:0;z-index:10}.x-spreadsheet-overlayer .x-spreadsheet-overlayer-content{position:absolute;overflow:hidden;pointer-events:none;width:100%;height:100%}.x-spreadsheet-editor,.x-spreadsheet-selector{box-sizing:content-box;position:absolute;overflow:hidden;pointer-events:none;top:0;left:0;width:100%;height:100%}.x-spreadsheet-selector .hide-input{position:absolute;z-index:0}.x-spreadsheet-selector .hide-input input{padding:0;width:0;border:none!important}.x-spreadsheet-selector .x-spreadsheet-selector-area{position:absolute;border:2px solid #4b89ff;background:#4b89ff1a;z-index:5}.x-spreadsheet-selector .x-spreadsheet-selector-clipboard,.x-spreadsheet-selector .x-spreadsheet-selector-autofill{position:absolute;background:transparent;z-index:100}.x-spreadsheet-selector .x-spreadsheet-selector-clipboard{border:2px dashed #4b89ff}.x-spreadsheet-selector .x-spreadsheet-selector-autofill{border:1px dashed rgba(0,0,0,.45)}.x-spreadsheet-selector .x-spreadsheet-selector-corner{pointer-events:auto;position:absolute;cursor:crosshair;font-size:0;height:5px;width:5px;right:-5px;bottom:-5px;border:2px solid #ffffff;background:#4b89ff}.x-spreadsheet-editor{z-index:20}.x-spreadsheet-editor .x-spreadsheet-editor-area{position:absolute;text-align:left;border:2px solid #4b89ff;line-height:0;z-index:100;pointer-events:auto}.x-spreadsheet-editor .x-spreadsheet-editor-area textarea{box-sizing:content-box;border:none;padding:0 3px;outline:none;resize:none;text-align:start;overflow-y:hidden;font:400 13px Arial,Lato,Source Sans Pro,Roboto,Helvetica,sans-serif;color:inherit;white-space:normal;word-wrap:break-word;line-height:22px;margin:0}.x-spreadsheet-editor .x-spreadsheet-editor-area .textline{overflow:hidden;visibility:hidden;position:fixed;top:0;left:0}.x-spreadsheet-item{-webkit-user-select:none;user-select:none;background:0;border:1px solid transparent;outline:none;height:26px;color:#000000e6;line-height:26px;list-style:none;padding:2px 10px;cursor:default;text-align:left;overflow:hidden}.x-spreadsheet-item.disabled{pointer-events:none;opacity:.5}.x-spreadsheet-item:hover,.x-spreadsheet-item.active{background:#0000000d}.x-spreadsheet-item.divider{height:0;padding:0;margin:5px 0;border:none;border-bottom:1px solid rgba(0,0,0,.1)}.x-spreadsheet-item .label{float:right;opacity:.65;font-size:1em}.x-spreadsheet-item.state,.x-spreadsheet-header.state{padding-left:35px!important;position:relative}.x-spreadsheet-item.state:before,.x-spreadsheet-header.state:before{content:"";position:absolute;width:10px;height:10px;left:12px;top:calc(50% - 5px);background:#00000014;border-radius:2px}.x-spreadsheet-item.state.checked:before,.x-spreadsheet-header.state.checked:before{background:#4b89ff}.x-spreadsheet-checkbox{position:relative;display:inline-block;backface-visibility:hidden;outline:0;vertical-align:baseline;font-style:normal;font-size:1rem;line-height:1em}.x-spreadsheet-checkbox>input{position:absolute;top:0;left:0;opacity:0!important;outline:0;z-index:-1}.x-spreadsheet-suggest,.x-spreadsheet-contextmenu,.x-spreadsheet-sort-filter{position:absolute;box-shadow:1px 2px 5px 2px #33333326;background:#fff;z-index:100;width:260px;pointer-events:auto;overflow:auto}.x-spreadsheet-suggest{width:200px}.x-spreadsheet-filter{border:1px solid #e9e9e9;font-size:12px;margin:10px}.x-spreadsheet-filter .x-spreadsheet-header{padding:.5em .75em;background:#f8f8f9;border-bottom:1px solid #e9e9e9;border-left:1px solid transparent}.x-spreadsheet-filter .x-spreadsheet-body{height:200px;overflow-y:auto}.x-spreadsheet-filter .x-spreadsheet-body .x-spreadsheet-item{height:20px;line-height:20px}.x-spreadsheet-sort-filter .x-spreadsheet-buttons{margin:10px}.x-spreadsheet-bottombar{height:40px;padding:0 30px;text-align:left;background:#f5f6f7;display:flex}.x-spreadsheet-bottombar{position:relative;border-top:1px solid #e0e2e4}.x-spreadsheet-bottombar .x-spreadsheet-menu>li{line-height:40px;height:40px;padding-top:0;padding-bottom:0;vertical-align:middle;border-right:1px solid #e8eaed}.x-spreadsheet-menu{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.x-spreadsheet-menu>li{float:left;line-height:1.25em;padding:.785em 1em;margin:0;vertical-align:middle;text-align:left;font-weight:400;color:#80868b;white-space:nowrap;cursor:pointer;transition:all .3s;font-weight:700}.x-spreadsheet-menu>li.active{background-color:#fff;color:#000000a6}.x-spreadsheet-menu>li .x-spreadsheet-dropdown{display:inline-block}.x-spreadsheet-print{position:absolute;left:0;top:0;z-index:100;width:100%;height:100%;display:flex;flex-direction:column}.x-spreadsheet-print-bar{background:#424242;height:60px;line-height:60px;padding:0 30px}.x-spreadsheet-print-bar .-title{color:#fff;font-weight:700;font-size:1.2em;float:left}.x-spreadsheet-print-bar .-right{float:right;margin-top:12px}.x-spreadsheet-print-content{display:flex;flex:auto;flex-direction:row;background:#d0d0d0;height:calc(100% - 60px)}.x-spreadsheet-print-content .-sider{flex:0 0 300px;width:300px;border-left:2px solid #ccc;background:#fff}.x-spreadsheet-print-content .-content{flex:auto;overflow-x:auto;overflow-y:scroll;height:100%}.x-spreadsheet-canvas-card-wraper{margin:40px 20px}.x-spreadsheet-canvas-card{background:#fff;margin:auto;page-break-before:auto;page-break-after:always;box-shadow:0 8px 10px 1px #00000024,0 3px 14px 3px #0000001f,0 4px 5px #0003}.x-spreadsheet-calendar{color:#000000a6;background:#fff;-webkit-user-select:none;user-select:none}.x-spreadsheet-calendar .calendar-header{font-weight:700;line-height:30px;text-align:center;width:100%;float:left;background:#f9fafb}.x-spreadsheet-calendar .calendar-header .calendar-header-left{padding-left:5px;float:left}.x-spreadsheet-calendar .calendar-header .calendar-header-right{float:right}.x-spreadsheet-calendar .calendar-header .calendar-header-right a{padding:3px 0;margin-right:2px;border-radius:2px}.x-spreadsheet-calendar .calendar-header .calendar-header-right a:hover{background:#00000014}.x-spreadsheet-calendar .calendar-body{border-collapse:collapse;border-spacing:0}.x-spreadsheet-calendar .calendar-body th,.x-spreadsheet-calendar .calendar-body td{width:14.28571429%;min-width:32px;text-align:center;font-weight:700;line-height:30px;padding:0}.x-spreadsheet-calendar .calendar-body td>.cell:hover{background:#ecf6fd}.x-spreadsheet-calendar .calendar-body td>.cell.active,.x-spreadsheet-calendar .calendar-body td>.cell.active:hover{background:#ecf6fd;color:#2185d0}.x-spreadsheet-calendar .calendar-body td>.cell.disabled{pointer-events:none;opacity:.5}.x-spreadsheet-datepicker{box-shadow:2px 2px 5px #0003;position:absolute;left:0;top:calc(100% + 5px);z-index:10;width:auto}.x-spreadsheet-buttons{display:flex;justify-content:flex-end}.x-spreadsheet-buttons .x-spreadsheet-button{margin-left:8px}.x-spreadsheet-button{display:inline-block;border-radius:3px;line-height:1em;min-height:1em;white-space:nowrap;text-align:center;cursor:pointer;font-size:1em;font-weight:700;padding:.75em 1em;color:#0009;background:#e0e1e2;text-decoration:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;outline:none;vertical-align:baseline;zoom:1;-webkit-user-select:none;user-select:none;transition:all .1s linear}.x-spreadsheet-button.active,.x-spreadsheet-button:hover{background-color:#c0c1c2;color:#000c}.x-spreadsheet-button.primary{color:#fff;background-color:#2185d0}.x-spreadsheet-button.primary:hover,.x-spreadsheet-button.primary.active{color:#fff;background-color:#1678c2}.x-spreadsheet-form-input{font-size:1em;position:relative;font-weight:400;display:inline-flex;color:#000000de}.x-spreadsheet-form-input input{z-index:1;margin:0;max-width:100%;flex:1 0 auto;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);text-align:left;line-height:30px;height:30px;padding:0 8px;background:#fff;border:1px solid #e9e9e9;border-radius:3px;transition:box-shadow .1s ease,border-color .1s ease;box-shadow:inset 0 1px 2px #0a0a0a0f}.x-spreadsheet-form-input input:focus{border-color:#4b89ff;box-shadow:inset 0 1px 2px #4b89ff33}.x-spreadsheet-form-select{position:relative;display:inline-block;background:#fff;border:1px solid #e9e9e9;border-radius:2px;cursor:pointer;color:#000000de;-webkit-user-select:none;user-select:none;box-shadow:inset 0 1px 2px #0a0a0a0f}.x-spreadsheet-form-select .input-text{text-overflow:ellipsis;white-space:nowrap;min-width:60px;width:auto;height:30px;line-height:30px;padding:0 8px}.x-spreadsheet-form-fields{display:flex;flex-direction:row;flex-wrap:wrap}.x-spreadsheet-form-fields .x-spreadsheet-form-field{flex:0 1 auto}.x-spreadsheet-form-fields .x-spreadsheet-form-field .label{display:inline-block;margin:0 10px 0 0}.x-spreadsheet-form-field{display:block;vertical-align:middle;margin-left:10px;margin-bottom:10px}.x-spreadsheet-form-field:first-child{margin-left:0}.x-spreadsheet-form-field.error .x-spreadsheet-form-select,.x-spreadsheet-form-field.error input{border-color:#f04134}.x-spreadsheet-form-field .tip{color:#f04134;font-size:.9em}.x-spreadsheet-dimmer{display:none;position:absolute;top:0!important;left:0!important;width:100%;height:100%;text-align:center;vertical-align:middle;background-color:#0009;opacity:0;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.5s;animation-duration:.5s;transition:background-color .5s linear;-webkit-user-select:none;user-select:none;z-index:1000}.x-spreadsheet-dimmer.active{display:block;opacity:1}form fieldset{border:none}form fieldset label{display:block;margin-bottom:.5em;font-size:1em;color:#666}form fieldset select{font-size:1.1em;width:100%;background-color:#fff;border:none;border-bottom:2px solid #ddd;padding:.5em .85em;border-radius:2px}.x-spreadsheet-modal,.x-spreadsheet-toast{font-size:13px;position:fixed;z-index:1001;text-align:left;line-height:1.25em;min-width:360px;color:#000000de;font-family:Lato,Source Sans Pro,Roboto,Helvetica,Arial,sans-serif;border-radius:4px;border:1px solid rgba(0,0,0,.1);background-color:#fff;background-clip:padding-box;box-shadow:#0003 0 2px 8px}.x-spreadsheet-toast{background-color:#ffffffd9}.x-spreadsheet-modal-header,.x-spreadsheet-toast-header{font-weight:600;background-clip:padding-box;background-color:#ffffffd9;border-bottom:1px solid rgba(0,0,0,.05);border-radius:4px 4px 0 0}.x-spreadsheet-toast-header{color:#f2711c}.x-spreadsheet-modal-header{border-bottom:1px solid #e0e2e4;background:#00000014;font-size:1.0785em}.x-spreadsheet-modal-header,.x-spreadsheet-modal-content,.x-spreadsheet-toast-header,.x-spreadsheet-toast-content{padding:.75em 1em}.x-spreadsheet-menu li:first-child{display:none}.vue-office-excel{height:100%}
@@ -1 +1 @@
1
- ._upload-root_xoraq_1{max-width:xl}._upload-container_xoraq_5{font-size:12px;color:var(--font-color-grey)}._upload-wrapper_xoraq_10{color:var(--primary-color);cursor:pointer}._upload-wrapper_xoraq_10:hover{text-decoration:underline}._upload-inner_xoraq_18{display:block}._upload-header_xoraq_22{font-size:var(--font-size-small);color:var(--font-color-grey)}._upload-body_xoraq_27{border-radius:8px;border-width:1px;border-style:solid;padding:16px}._upload-footer_xoraq_34{font-size:var(--font-size-small);font-weight:500;color:var(--font-color-grey)}._upload-row_xoraq_40{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;font-size:var(--font-size-small)}._upload-col_xoraq_47{display:flex;align-items:center;gap:8px;font-size:var(--font-size-small)}._upload-wrap_xoraq_10{display:block}._upload-panel_xoraq_58{font-size:12px}._upload-card_xoraq_62{padding:12px;font-size:var(--font-size-small)}._upload-item_xoraq_67{font-size:var(--font-size-small);margin-top:8px;display:block}._upload-link_xoraq_73{margin-top:12px}._upload-label_xoraq_77{display:flex;align-items:center;gap:8px;min-width:0}._upload-value_xoraq_84{color:var(--font-color-grey-1);flex-shrink:0}._upload-meta_xoraq_89{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._upload-icon_xoraq_95{margin:0!important;flex-shrink:0}._upload-title_xoraq_100{font-size:12px;margin-left:0!important;flex-shrink:0}._upload-desc_xoraq_106{flex-shrink:0}._upload-actions_xoraq_110{font-size:30px;margin-bottom:8px}._upload-toolbar_xoraq_115{color:var(--font-color-grey)}._upload-toolbar_xoraq_115:hover{border-color:var(--primary-color)}._upload-toolbar_xoraq_115:hover{color:var(--primary-color)}._upload-list_xoraq_125{margin-top:8px}._upload-file-row_xoraq_129{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 12px;border-radius:4px;background-color:var(--bg-color-grey);border:1px solid var(--font-color-grey-4)}._upload-file-row-error_xoraq_140{border-color:#f53f3f59;color:var(--error-color)}._upload-drag-icon_xoraq_145{font-size:30px;margin-bottom:8px;color:var(--primary-color)}._app-tour-root_ybirw_1{font-size:12px;color:var(--font-color-grey-1)}._common-filter-root_kdoz3_1{background-color:var(--bg-color-white);margin-bottom:16px}._common-filter-container_kdoz3_6{display:flex;align-items:center;gap:12px}._common-filter-label_kdoz3_12{flex-shrink:0;font-size:var(--font-size-default);font-weight:500;color:#374151}._common-filter-content_kdoz3_19{display:flex;flex:1;align-items:flex-start;justify-content:space-between}._common-filter-items_kdoz3_26{display:flex;flex-wrap:wrap;align-items:center;column-gap:6px;row-gap:8px}._common-filter-extra_kdoz3_34{flex-shrink:0;margin-left:16px}._common-filter-selected_kdoz3_39{display:flex;align-items:center;justify-content:space-between;padding-top:12px}._common-filter-selected-main_kdoz3_46{display:flex;align-items:baseline;gap:8px}._common-filter-selected-title_kdoz3_52{font-size:12px;font-weight:500;color:var(--font-color-grey)}._common-filter-selected-tags_kdoz3_58{flex:1}._common-filter-tag_kdoz3_62{display:flex;align-items:center;gap:4px}._common-filter-tag-label_kdoz3_68{font-size:12px}._common-filter-tag-close_kdoz3_72{font-size:12px;cursor:pointer;margin-left:2px;opacity:.6}._common-filter-tag-close_kdoz3_72:hover{opacity:1}._common-filter-clear-btn_kdoz3_82{padding:0!important;height:auto!important;font-size:12px}._file-link-inner_uetzp_1{flex-shrink:0}._file-link-row_uetzp_5{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._file-link-actions_uetzp_11{display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-small);transition:color .2s ease,background-color .2s ease}._file-link-actions_uetzp_11:hover{color:var(--primary-color)}._file-link-toolbar_uetzp_22{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._file-preview-list_1yfht_1{position:relative}._file-preview-empty_1yfht_5{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-white)}._file-preview-loading_1yfht_15{width:100%;padding-top:80px;padding-bottom:80px}._file-preview-content_1yfht_21{padding:16px;font-size:var(--font-size-small);white-space:pre-wrap;overflow:auto;max-height:70vh;background-color:var(--bg-color-grey)}._file-preview-aside_1yfht_30{padding:24px;overflow:auto;max-height:70vh;background-color:var(--bg-color-white)}._file-preview-main_1yfht_37{display:flex;align-items:center;justify-content:center;padding:16px;overflow:auto;max-height:70vh}._file-preview-section_1yfht_46{max-width:100%;max-height:65vh;object-fit:contain}._file-preview-group_1yfht_52{width:100%}._file-preview-cell_1yfht_56{overflow:auto;max-height:70vh;background-color:var(--bg-color-white)}._file-preview-overlay_1yfht_62{position:relative;display:flex;align-items:center;justify-content:center}._file-preview-badge_1yfht_69{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:48px;padding-bottom:48px;gap:16px}._file-preview-tag_1yfht_79{position:relative;display:flex;align-items:center;justify-content:center;padding:16px}._file-preview-hint_1yfht_87{max-width:100%;max-height:65vh}._file-preview-sider_1yfht_92{font-size:48px}._file-preview-nav_1yfht_96{text-align:center}._file-preview-menu_1yfht_100{color:var(--font-color-grey);margin-bottom:4px}._file-preview-user-menu_1yfht_105{font-size:12px;color:var(--font-color-grey-1)}._file-preview-avatar_1yfht_110{display:flex;align-items:center;justify-content:center;padding:32px}._file-preview-upload_1yfht_117{width:100%;max-width:1024px}._file-preview-filter_1yfht_122{display:flex;align-items:center;justify-content:space-between;padding-top:12px;padding-bottom:12px;border-bottom-width:1px;border-bottom-style:solid;border-color:var(--font-color-grey-4)}._file-preview-table_1yfht_133{font-weight:500}._tags-tag-list_d5l57_1{display:flex;align-items:center;gap:4px;flex-wrap:wrap}._tags-tag-list-nowrap_d5l57_8{flex-wrap:nowrap}._tags-tag-list-tooltip_d5l57_12{max-width:320px}._filter-panel-body_tjvgz_1{margin-bottom:12px}._filter-panel-actions_tjvgz_5{display:flex;justify-content:flex-end;gap:8px}._filter-trigger-root_115kh_1{display:inline-flex;align-items:center;gap:4px;cursor:pointer;border-radius:4px;padding:2px 6px;font-size:12px;transition:color .2s ease,background-color .2s ease}._filter-trigger-active_115kh_12{background-color:var(--primary-color);color:var(--bg-color-white)}._filter-trigger-inactive_115kh_17{color:#374151}._filter-trigger-inactive_115kh_17:hover{color:var(--primary-color);background-color:var(--primary-color-bg)}._filter-trigger-chevron_115kh_25{font-size:10px}._filter-date-range-quick-options_ctl7u_1{margin-bottom:12px;display:flex;flex-wrap:wrap;gap:8px}._filter-date-range-quick-option_ctl7u_1{cursor:pointer;border-radius:4px;padding:4px 8px;font-size:var(--font-size-small)}._filter-date-range-quick-option_ctl7u_1:hover{background-color:var(--primary-color-bg)}._filter-date-range-quick-option-active_ctl7u_18{background-color:var(--primary-color);color:var(--bg-color-white);font-weight:500}._filter-date-range-picker_ctl7u_24{width:100%}._filter-number-range-inputs_y3pfu_1{display:flex;align-items:center;gap:8px}._filter-number-range-separator_y3pfu_7{color:var(--font-color-grey-1)}._filter-number-range-unit_y3pfu_11{font-size:var(--font-size-small);color:var(--font-color-grey)}._person-option-row-root_lf6i9_1{font-size:var(--font-size-small)}._person-option-row-container_lf6i9_5{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._person-option-row-wrapper_lf6i9_11{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--font-color-grey-1);font-size:12px}._person-option-row-inner_lf6i9_19{margin-left:auto;flex-shrink:0;color:var(--font-color-grey-1)}._person-option-row-inner_lf6i9_19:hover{color:var(--primary-color)}._person-option-row-person-row_lf6i9_28{display:flex;align-items:center;gap:8px;min-width:0;flex:1}._filter-select-search_1esgk_1{margin-bottom:12px}._filter-select-options_1esgk_5{max-height:300px;overflow:auto}._filter-select-option_1esgk_5{display:flex;align-items:center;gap:8px;cursor:pointer;border-radius:4px;padding:6px 8px;font-size:var(--font-size-small)}._filter-select-option_1esgk_5:hover{background-color:var(--bg-color-grey)}._filter-select-option-selected_1esgk_23{color:var(--primary-color);font-weight:500}._filter-select-option-check_1esgk_28{margin-left:auto;font-size:12px;color:var(--primary-color)}._filter-select-empty_1esgk_34{padding-top:16px;padding-bottom:16px;text-align:center;font-size:var(--font-size-small);color:var(--font-color-grey-1)}._filter-select-selected-bar_1esgk_42{margin-top:8px;border-top-width:1px;border-top-style:solid;padding-top:8px}._filter-select-selected-label_1esgk_49{margin-bottom:4px;font-size:12px;color:var(--font-color-grey-1)}._filter-select-selected-tag_1esgk_55{display:inline-flex;cursor:pointer;align-items:center;gap:4px;background-color:var(--bg-color-grey-1);padding:2px 6px;font-size:12px}._filter-select-selected-remove_1esgk_68{font-size:10px}._filter-tree-select-search_he1ck_1{margin-bottom:12px}._filter-tree-select-options_he1ck_5{max-height:300px;overflow:auto}._filter-tree-select-option_he1ck_5{display:flex;align-items:center;gap:8px;cursor:pointer;border-radius:4px;padding:6px 8px;font-size:var(--font-size-small)}._filter-tree-select-option_he1ck_5:hover{background-color:var(--bg-color-grey)}._filter-tree-select-option-selected_he1ck_23{color:var(--primary-color);font-weight:500}._filter-tree-select-option-check_he1ck_28{margin-left:auto;font-size:12px;color:var(--primary-color)}._filter-tree-select-expand-icon_he1ck_34{display:inline-flex;width:16px;flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;color:var(--font-color-grey-1)}._filter-tree-select-expand-placeholder_he1ck_44{display:inline-flex;width:16px;flex-shrink:0}._filter-tree-select-node-label_he1ck_50{flex:1}._filter-tree-select-empty_he1ck_54{padding-top:16px;padding-bottom:16px;text-align:center;font-size:var(--font-size-small);color:var(--font-color-grey-1)}._filter-tree-select-selected-bar_he1ck_62{margin-top:8px;border-top-width:1px;border-top-style:solid;padding-top:8px}._filter-tree-select-selected-label_he1ck_69{margin-bottom:4px;font-size:12px;color:var(--font-color-grey-1)}._filter-tree-select-selected-tag_he1ck_75{display:inline-flex;cursor:pointer;align-items:center;gap:4px;background-color:var(--bg-color-grey-1);padding:2px 6px;font-size:12px}._filter-tree-select-selected-remove_he1ck_88{font-size:10px}._page-header-layout-root_13o9c_1{display:flex;align-items:center;justify-content:space-between}._page-header-layout-container_13o9c_7{display:flex;align-items:center}._page-header-layout-wrapper_13o9c_12{font-size:var(--font-size-18);font-weight:600}._page-header-layout-inner_13o9c_17{margin-bottom:16px;padding:8px 12px;background-color:var(--primary-color-bg);border:1px solid var(--primary-color-border);border-radius:4px;font-size:var(--font-size-small);color:var(--primary-color)}._stat-card-clickable_xovsh_1{cursor:pointer}._stat-card-clickable_xovsh_1 .ant-statistic-content,._stat-card-clickable_xovsh_1 .ant-statistic-content .ant-statistic-content-prefix{display:flex!important;align-items:center}._stat-pending-breakdown-root_85di3_1{font-size:12px;color:var(--font-color-grey-1);margin-bottom:8px}._stat-pending-breakdown-container_85di3_7{font-size:12px;font-weight:400;color:var(--font-color-grey-1);margin-top:4px;line-height:var(--line-height-default)}._stat-pending-breakdown-detail-divider_85di3_15{margin-top:12px;padding-top:12px;border-top:1px solid var(--font-color-grey-4)}._step-modal-root_1ccyj_1{display:flex;align-items:center;gap:8px}._step-modal-container_1ccyj_7{flex:1}._step-modal-wrapper_1ccyj_11{margin-bottom:24px}._virtual-scrollbar-root_hy6p8_1{position:relative;display:flex;flex-direction:column;overflow:hidden;min-height:0;min-width:0}._virtual-scrollbar-viewport_hy6p8_14{flex:1 1 auto;width:100%;height:100%;min-height:0;overflow:auto;scrollbar-width:none;-ms-overflow-style:none}._virtual-scrollbar-viewport_hy6p8_14::-webkit-scrollbar{display:none}._virtual-scrollbar-track_hy6p8_27{opacity:1;pointer-events:auto}._virtual-scrollbar-track-vertical_hy6p8_32{position:absolute;z-index:2;opacity:0;pointer-events:none;transition:opacity .2s ease;top:2px;right:2px;bottom:2px;width:6px}._virtual-scrollbar-track-horizontal_hy6p8_44{opacity:1;pointer-events:auto}._virtual-scrollbar-thumb_hy6p8_49{top:0;bottom:0;min-width:24px}._file-item-root_lmij6_1{transition:color .2s ease,background-color .2s ease}._file-item-root_lmij6_1:hover{background-color:var(--bg-color-grey)}._file-item-container_lmij6_8{display:flex;align-items:center;justify-content:space-between;padding:6px 8px}._file-item-wrapper_lmij6_18{display:flex;gap:8px;min-width:0;flex:1}._file-item-inner_lmij6_25{flex-shrink:0}._file-item-header_lmij6_29{min-width:0;flex:1}._file-item-body_lmij6_34{display:flex;align-items:center;gap:8px}._file-item-footer_lmij6_40{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-small)}._file-item-row_lmij6_47{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._file-item-col_lmij6_53{margin-top:2px;gap:2px}._file-item-wrap_lmij6_18{display:flex;align-items:center;gap:8px;flex-shrink:0;margin-left:8px}._file-item-panel_lmij6_66{display:flex;align-items:center}._file-item-action-group_lmij6_71{display:flex;align-items:center;gap:4px}._file-item-action-group-disabled_lmij6_77{opacity:.45;pointer-events:none}
1
+ ._upload-root_xoraq_1{max-width:xl}._upload-container_xoraq_5{font-size:12px;color:var(--font-color-grey)}._upload-wrapper_xoraq_10{color:var(--primary-color);cursor:pointer}._upload-wrapper_xoraq_10:hover{text-decoration:underline}._upload-inner_xoraq_18{display:block}._upload-header_xoraq_22{font-size:var(--font-size-small);color:var(--font-color-grey)}._upload-body_xoraq_27{border-radius:8px;border-width:1px;border-style:solid;padding:16px}._upload-footer_xoraq_34{font-size:var(--font-size-small);font-weight:500;color:var(--font-color-grey)}._upload-row_xoraq_40{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;font-size:var(--font-size-small)}._upload-col_xoraq_47{display:flex;align-items:center;gap:8px;font-size:var(--font-size-small)}._upload-wrap_xoraq_10{display:block}._upload-panel_xoraq_58{font-size:12px}._upload-card_xoraq_62{padding:12px;font-size:var(--font-size-small)}._upload-item_xoraq_67{font-size:var(--font-size-small);margin-top:8px;display:block}._upload-link_xoraq_73{margin-top:12px}._upload-label_xoraq_77{display:flex;align-items:center;gap:8px;min-width:0}._upload-value_xoraq_84{color:var(--font-color-grey-1);flex-shrink:0}._upload-meta_xoraq_89{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._upload-icon_xoraq_95{margin:0!important;flex-shrink:0}._upload-title_xoraq_100{font-size:12px;margin-left:0!important;flex-shrink:0}._upload-desc_xoraq_106{flex-shrink:0}._upload-actions_xoraq_110{font-size:30px;margin-bottom:8px}._upload-toolbar_xoraq_115{color:var(--font-color-grey)}._upload-toolbar_xoraq_115:hover{border-color:var(--primary-color)}._upload-toolbar_xoraq_115:hover{color:var(--primary-color)}._upload-list_xoraq_125{margin-top:8px}._upload-file-row_xoraq_129{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 12px;border-radius:4px;background-color:var(--bg-color-grey);border:1px solid var(--font-color-grey-4)}._upload-file-row-error_xoraq_140{border-color:#f53f3f59;color:var(--error-color)}._upload-drag-icon_xoraq_145{font-size:30px;margin-bottom:8px;color:var(--primary-color)}._app-tour-root_ybirw_1{font-size:12px;color:var(--font-color-grey-1)}._common-filter-root_kdoz3_1{background-color:var(--bg-color-white);margin-bottom:16px}._common-filter-container_kdoz3_6{display:flex;align-items:center;gap:12px}._common-filter-label_kdoz3_12{flex-shrink:0;font-size:var(--font-size-default);font-weight:500;color:#374151}._common-filter-content_kdoz3_19{display:flex;flex:1;align-items:flex-start;justify-content:space-between}._common-filter-items_kdoz3_26{display:flex;flex-wrap:wrap;align-items:center;column-gap:6px;row-gap:8px}._common-filter-extra_kdoz3_34{flex-shrink:0;margin-left:16px}._common-filter-selected_kdoz3_39{display:flex;align-items:center;justify-content:space-between;padding-top:12px}._common-filter-selected-main_kdoz3_46{display:flex;align-items:baseline;gap:8px}._common-filter-selected-title_kdoz3_52{font-size:12px;font-weight:500;color:var(--font-color-grey)}._common-filter-selected-tags_kdoz3_58{flex:1}._common-filter-tag_kdoz3_62{display:flex;align-items:center;gap:4px}._common-filter-tag-label_kdoz3_68{font-size:12px}._common-filter-tag-close_kdoz3_72{font-size:12px;cursor:pointer;margin-left:2px;opacity:.6}._common-filter-tag-close_kdoz3_72:hover{opacity:1}._common-filter-clear-btn_kdoz3_82{padding:0!important;height:auto!important;font-size:12px}._file-link-inner_uetzp_1{flex-shrink:0}._file-link-row_uetzp_5{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._file-link-actions_uetzp_11{display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-small);transition:color .2s ease,background-color .2s ease}._file-link-actions_uetzp_11:hover{color:var(--primary-color)}._file-link-toolbar_uetzp_22{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._file-preview-list_irbqy_1{position:relative}._file-preview-empty_irbqy_5{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-white)}._file-preview-loading_irbqy_15{width:100%;padding-top:80px;padding-bottom:80px}._file-preview-content_irbqy_21{padding:16px;font-size:var(--font-size-small);white-space:pre-wrap;overflow:auto;max-height:70vh;background-color:var(--bg-color-grey)}._file-preview-aside_irbqy_30{padding:24px;overflow:auto;max-height:70vh;background-color:var(--bg-color-white)}._file-preview-main_irbqy_37{display:flex;align-items:center;justify-content:center;padding:16px;overflow:auto;max-height:70vh}._file-preview-section_irbqy_46{max-width:100%;max-height:65vh;object-fit:contain}._file-preview-group_irbqy_52{width:100%}._file-preview-cell_irbqy_56{overflow:auto;max-height:70vh;background-color:var(--bg-color-white)}._file-preview-overlay_irbqy_62{position:relative;display:flex;align-items:center;justify-content:center}._file-preview-badge_irbqy_69{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:48px;padding-bottom:48px;gap:16px}._file-preview-tag_irbqy_79{position:relative;display:flex;align-items:center;justify-content:center;padding:16px}._file-preview-hint_irbqy_87{max-width:100%;max-height:65vh}._file-preview-sider_irbqy_92{font-size:48px}._file-preview-nav_irbqy_96{text-align:center}._file-preview-menu_irbqy_100{color:var(--font-color-grey);margin-bottom:4px}._file-preview-user-menu_irbqy_105{font-size:12px;color:var(--font-color-grey-1)}._file-preview-avatar_irbqy_110{display:flex;align-items:center;justify-content:center;padding:32px}._file-preview-upload_irbqy_117{width:100%;max-width:1024px}._file-preview-filter_irbqy_122{display:flex;align-items:center;justify-content:space-between;padding-top:12px;padding-bottom:12px;border-bottom-width:1px;border-bottom-style:solid;border-color:var(--font-color-grey-4)}._file-preview_irbqy_1{display:flex;flex-direction:column;width:100%}._file-preview-header_irbqy_139{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:12px;width:100%}._file-preview-info_irbqy_148{display:flex;align-items:center;gap:8px;min-width:0;flex:1}._file-preview-icon_irbqy_156{display:inline-flex;flex-shrink:0}._file-preview-name_irbqy_161{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}._file-preview-size_irbqy_168{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._file-preview-body_irbqy_174{width:100%}._file-preview-iframe_irbqy_178{display:block;width:100%;height:70vh;border:none;background:var(--bg-color-grey)}._file-preview-media-wrap_irbqy_186{display:flex;justify-content:center;width:100%}._file-preview-image_irbqy_192{width:100%;max-height:70vh;object-fit:contain}._file-preview-video_irbqy_198{width:100%;max-height:70vh;background:#000}._file-preview-audio-wrap_irbqy_204{display:flex;align-items:center;justify-content:center;width:100%;padding:48px 16px}._file-preview-audio_irbqy_204{width:100%}._file-preview-office-wrap_irbqy_216{width:100%;min-height:400px}._file-preview-office-inner_irbqy_221{width:100%;min-height:400px;overflow:auto;max-height:70vh}._file-preview-text_irbqy_228{margin:0;padding:16px;width:100%;max-height:70vh;overflow:auto;white-space:pre-wrap;word-break:break-word;font-size:var(--font-size-small);background:var(--bg-color-grey);box-sizing:border-box}._file-preview-table_irbqy_241{font-weight:500}._file-preview-link_1rk52_1{display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-small);transition:color .2s ease}._file-preview-link_1rk52_1:hover{color:var(--primary-color)}._file-preview-link-disabled_1rk52_12{display:inline-flex;align-items:center;gap:6px;font-size:var(--font-size-small);color:var(--font-color-grey-1);cursor:not-allowed}._file-preview-link-inner_1rk52_21{flex-shrink:0}._file-preview-link-name_1rk52_25{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._file-preview-link-type_1rk52_31{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._tags-tag-list_d5l57_1{display:flex;align-items:center;gap:4px;flex-wrap:wrap}._tags-tag-list-nowrap_d5l57_8{flex-wrap:nowrap}._tags-tag-list-tooltip_d5l57_12{max-width:320px}._filter-panel-body_tjvgz_1{margin-bottom:12px}._filter-panel-actions_tjvgz_5{display:flex;justify-content:flex-end;gap:8px}._filter-trigger-root_115kh_1{display:inline-flex;align-items:center;gap:4px;cursor:pointer;border-radius:4px;padding:2px 6px;font-size:12px;transition:color .2s ease,background-color .2s ease}._filter-trigger-active_115kh_12{background-color:var(--primary-color);color:var(--bg-color-white)}._filter-trigger-inactive_115kh_17{color:#374151}._filter-trigger-inactive_115kh_17:hover{color:var(--primary-color);background-color:var(--primary-color-bg)}._filter-trigger-chevron_115kh_25{font-size:10px}._filter-date-range-quick-options_ctl7u_1{margin-bottom:12px;display:flex;flex-wrap:wrap;gap:8px}._filter-date-range-quick-option_ctl7u_1{cursor:pointer;border-radius:4px;padding:4px 8px;font-size:var(--font-size-small)}._filter-date-range-quick-option_ctl7u_1:hover{background-color:var(--primary-color-bg)}._filter-date-range-quick-option-active_ctl7u_18{background-color:var(--primary-color);color:var(--bg-color-white);font-weight:500}._filter-date-range-picker_ctl7u_24{width:100%}._filter-number-range-inputs_y3pfu_1{display:flex;align-items:center;gap:8px}._filter-number-range-separator_y3pfu_7{color:var(--font-color-grey-1)}._filter-number-range-unit_y3pfu_11{font-size:var(--font-size-small);color:var(--font-color-grey)}._person-option-row-root_lf6i9_1{font-size:var(--font-size-small)}._person-option-row-container_lf6i9_5{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._person-option-row-wrapper_lf6i9_11{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--font-color-grey-1);font-size:12px}._person-option-row-inner_lf6i9_19{margin-left:auto;flex-shrink:0;color:var(--font-color-grey-1)}._person-option-row-inner_lf6i9_19:hover{color:var(--primary-color)}._person-option-row-person-row_lf6i9_28{display:flex;align-items:center;gap:8px;min-width:0;flex:1}._filter-select-search_1esgk_1{margin-bottom:12px}._filter-select-options_1esgk_5{max-height:300px;overflow:auto}._filter-select-option_1esgk_5{display:flex;align-items:center;gap:8px;cursor:pointer;border-radius:4px;padding:6px 8px;font-size:var(--font-size-small)}._filter-select-option_1esgk_5:hover{background-color:var(--bg-color-grey)}._filter-select-option-selected_1esgk_23{color:var(--primary-color);font-weight:500}._filter-select-option-check_1esgk_28{margin-left:auto;font-size:12px;color:var(--primary-color)}._filter-select-empty_1esgk_34{padding-top:16px;padding-bottom:16px;text-align:center;font-size:var(--font-size-small);color:var(--font-color-grey-1)}._filter-select-selected-bar_1esgk_42{margin-top:8px;border-top-width:1px;border-top-style:solid;padding-top:8px}._filter-select-selected-label_1esgk_49{margin-bottom:4px;font-size:12px;color:var(--font-color-grey-1)}._filter-select-selected-tag_1esgk_55{display:inline-flex;cursor:pointer;align-items:center;gap:4px;background-color:var(--bg-color-grey-1);padding:2px 6px;font-size:12px}._filter-select-selected-remove_1esgk_68{font-size:10px}._filter-tree-select-search_he1ck_1{margin-bottom:12px}._filter-tree-select-options_he1ck_5{max-height:300px;overflow:auto}._filter-tree-select-option_he1ck_5{display:flex;align-items:center;gap:8px;cursor:pointer;border-radius:4px;padding:6px 8px;font-size:var(--font-size-small)}._filter-tree-select-option_he1ck_5:hover{background-color:var(--bg-color-grey)}._filter-tree-select-option-selected_he1ck_23{color:var(--primary-color);font-weight:500}._filter-tree-select-option-check_he1ck_28{margin-left:auto;font-size:12px;color:var(--primary-color)}._filter-tree-select-expand-icon_he1ck_34{display:inline-flex;width:16px;flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;color:var(--font-color-grey-1)}._filter-tree-select-expand-placeholder_he1ck_44{display:inline-flex;width:16px;flex-shrink:0}._filter-tree-select-node-label_he1ck_50{flex:1}._filter-tree-select-empty_he1ck_54{padding-top:16px;padding-bottom:16px;text-align:center;font-size:var(--font-size-small);color:var(--font-color-grey-1)}._filter-tree-select-selected-bar_he1ck_62{margin-top:8px;border-top-width:1px;border-top-style:solid;padding-top:8px}._filter-tree-select-selected-label_he1ck_69{margin-bottom:4px;font-size:12px;color:var(--font-color-grey-1)}._filter-tree-select-selected-tag_he1ck_75{display:inline-flex;cursor:pointer;align-items:center;gap:4px;background-color:var(--bg-color-grey-1);padding:2px 6px;font-size:12px}._filter-tree-select-selected-remove_he1ck_88{font-size:10px}._page-header-layout-root_13o9c_1{display:flex;align-items:center;justify-content:space-between}._page-header-layout-container_13o9c_7{display:flex;align-items:center}._page-header-layout-wrapper_13o9c_12{font-size:var(--font-size-18);font-weight:600}._page-header-layout-inner_13o9c_17{margin-bottom:16px;padding:8px 12px;background-color:var(--primary-color-bg);border:1px solid var(--primary-color-border);border-radius:4px;font-size:var(--font-size-small);color:var(--primary-color)}._stat-card-clickable_xovsh_1{cursor:pointer}._stat-card-clickable_xovsh_1 .ant-statistic-content,._stat-card-clickable_xovsh_1 .ant-statistic-content .ant-statistic-content-prefix{display:flex!important;align-items:center}._stat-pending-breakdown-root_85di3_1{font-size:12px;color:var(--font-color-grey-1);margin-bottom:8px}._stat-pending-breakdown-container_85di3_7{font-size:12px;font-weight:400;color:var(--font-color-grey-1);margin-top:4px;line-height:var(--line-height-default)}._stat-pending-breakdown-detail-divider_85di3_15{margin-top:12px;padding-top:12px;border-top:1px solid var(--font-color-grey-4)}._step-modal-root_1ccyj_1{display:flex;align-items:center;gap:8px}._step-modal-container_1ccyj_7{flex:1}._step-modal-wrapper_1ccyj_11{margin-bottom:24px}._virtual-scrollbar-root_hy6p8_1{position:relative;display:flex;flex-direction:column;overflow:hidden;min-height:0;min-width:0}._virtual-scrollbar-viewport_hy6p8_14{flex:1 1 auto;width:100%;height:100%;min-height:0;overflow:auto;scrollbar-width:none;-ms-overflow-style:none}._virtual-scrollbar-viewport_hy6p8_14::-webkit-scrollbar{display:none}._virtual-scrollbar-track_hy6p8_27{opacity:1;pointer-events:auto}._virtual-scrollbar-track-vertical_hy6p8_32{position:absolute;z-index:2;opacity:0;pointer-events:none;transition:opacity .2s ease;top:2px;right:2px;bottom:2px;width:6px}._virtual-scrollbar-track-horizontal_hy6p8_44{opacity:1;pointer-events:auto}._virtual-scrollbar-thumb_hy6p8_49{top:0;bottom:0;min-width:24px}._file-item-root_lmij6_1{transition:color .2s ease,background-color .2s ease}._file-item-root_lmij6_1:hover{background-color:var(--bg-color-grey)}._file-item-container_lmij6_8{display:flex;align-items:center;justify-content:space-between;padding:6px 8px}._file-item-wrapper_lmij6_18{display:flex;gap:8px;min-width:0;flex:1}._file-item-inner_lmij6_25{flex-shrink:0}._file-item-header_lmij6_29{min-width:0;flex:1}._file-item-body_lmij6_34{display:flex;align-items:center;gap:8px}._file-item-footer_lmij6_40{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-small)}._file-item-row_lmij6_47{flex-shrink:0;font-size:12px;color:var(--font-color-grey-1)}._file-item-col_lmij6_53{margin-top:2px;gap:2px}._file-item-wrap_lmij6_18{display:flex;align-items:center;gap:8px;flex-shrink:0;margin-left:8px}._file-item-panel_lmij6_66{display:flex;align-items:center}._file-item-action-group_lmij6_71{display:flex;align-items:center;gap:4px}._file-item-action-group-disabled_lmij6_77{opacity:.45;pointer-events:none}.x-spreadsheet{font-size:13px;line-height:normal;-webkit-user-select:none;user-select:none;-moz-user-select:none;font-family:Lato,Source Sans Pro,Roboto,Helvetica,Arial,sans-serif;box-sizing:content-box;background:#fff;-webkit-font-smoothing:antialiased}.x-spreadsheet textarea{font:400 13px Arial,Lato,Source Sans Pro,Roboto,Helvetica,sans-serif}.x-spreadsheet-sheet{position:relative;overflow:hidden}.x-spreadsheet-table{vertical-align:bottom}.x-spreadsheet-tooltip{font-family:inherit;position:absolute;padding:5px 10px;color:#fff;border-radius:1px;background:#000;font-size:12px;z-index:201}.x-spreadsheet-tooltip:before{pointer-events:none;position:absolute;left:calc(50% - 4px);top:-4px;content:"";width:8px;height:8px;background:inherit;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:1;box-shadow:1px 1px 3px -1px #0000004d}.x-spreadsheet-color-palette{padding:5px}.x-spreadsheet-color-palette table{margin:0;padding:0;border-collapse:separate;border-spacing:2;background:#fff}.x-spreadsheet-color-palette table td{margin:0;cursor:pointer;border:1px solid transparent}.x-spreadsheet-color-palette table td:hover{border-color:#ddd}.x-spreadsheet-color-palette table td .x-spreadsheet-color-palette-cell{width:16px;height:16px}.x-spreadsheet-border-palette{padding:6px}.x-spreadsheet-border-palette table{margin:0;padding:0;border-collapse:separate;border-spacing:0;background:#fff;table-layout:fixed}.x-spreadsheet-border-palette table td{margin:0}.x-spreadsheet-border-palette .x-spreadsheet-border-palette-left{border-right:1px solid #eee;padding-right:6px}.x-spreadsheet-border-palette .x-spreadsheet-border-palette-left .x-spreadsheet-border-palette-cell{width:30px;height:30px;cursor:pointer;text-align:center}.x-spreadsheet-border-palette .x-spreadsheet-border-palette-left .x-spreadsheet-border-palette-cell:hover{background-color:#eee}.x-spreadsheet-border-palette .x-spreadsheet-border-palette-right{padding-left:6px}.x-spreadsheet-border-palette .x-spreadsheet-border-palette-right .x-spreadsheet-line-type{position:relative;left:0;top:-3px}.x-spreadsheet-dropdown{position:relative}.x-spreadsheet-dropdown .x-spreadsheet-dropdown-content{position:absolute;z-index:200;background:#fff;box-shadow:1px 2px 5px 2px #33333326}.x-spreadsheet-dropdown.bottom-left .x-spreadsheet-dropdown-content{top:calc(100% + 5px);left:0}.x-spreadsheet-dropdown.bottom-right .x-spreadsheet-dropdown-content{top:calc(100% + 5px);right:0}.x-spreadsheet-dropdown.top-left .x-spreadsheet-dropdown-content{bottom:calc(100% + 5px);left:0}.x-spreadsheet-dropdown.top-right .x-spreadsheet-dropdown-content{bottom:calc(100% + 5px);right:0}.x-spreadsheet-dropdown .x-spreadsheet-dropdown-title{padding:0 5px;display:inline-block}.x-spreadsheet-resizer{position:absolute;z-index:11}.x-spreadsheet-resizer .x-spreadsheet-resizer-hover{background-color:#4b89ff40}.x-spreadsheet-resizer .x-spreadsheet-resizer-line{position:absolute}.x-spreadsheet-resizer.horizontal{cursor:row-resize}.x-spreadsheet-resizer.horizontal .x-spreadsheet-resizer-line{border-bottom:2px dashed #4b89ff;left:0;bottom:0}.x-spreadsheet-resizer.vertical{cursor:col-resize}.x-spreadsheet-resizer.vertical .x-spreadsheet-resizer-line{border-right:2px dashed #4b89ff;top:0;right:0}.x-spreadsheet-scrollbar{position:absolute;bottom:0;right:0;background-color:#f4f5f8;opacity:.9;z-index:12}.x-spreadsheet-scrollbar.horizontal{right:15px;overflow-x:scroll;overflow-y:hidden}.x-spreadsheet-scrollbar.horizontal>div{height:1px;background:#ddd}.x-spreadsheet-scrollbar.vertical{bottom:15px;overflow-x:hidden;overflow-y:scroll}.x-spreadsheet-scrollbar.vertical>div{width:1px;background:#ddd}.x-spreadsheet-overlayer{position:absolute;left:0;top:0;z-index:10}.x-spreadsheet-overlayer .x-spreadsheet-overlayer-content{position:absolute;overflow:hidden;pointer-events:none;width:100%;height:100%}.x-spreadsheet-editor,.x-spreadsheet-selector{box-sizing:content-box;position:absolute;overflow:hidden;pointer-events:none;top:0;left:0;width:100%;height:100%}.x-spreadsheet-selector .hide-input{position:absolute;z-index:0}.x-spreadsheet-selector .hide-input input{padding:0;width:0;border:none!important}.x-spreadsheet-selector .x-spreadsheet-selector-area{position:absolute;border:2px solid #4b89ff;background:#4b89ff1a;z-index:5}.x-spreadsheet-selector .x-spreadsheet-selector-clipboard,.x-spreadsheet-selector .x-spreadsheet-selector-autofill{position:absolute;background:transparent;z-index:100}.x-spreadsheet-selector .x-spreadsheet-selector-clipboard{border:2px dashed #4b89ff}.x-spreadsheet-selector .x-spreadsheet-selector-autofill{border:1px dashed rgba(0,0,0,.45)}.x-spreadsheet-selector .x-spreadsheet-selector-corner{pointer-events:auto;position:absolute;cursor:crosshair;font-size:0;height:5px;width:5px;right:-5px;bottom:-5px;border:2px solid #ffffff;background:#4b89ff}.x-spreadsheet-editor{z-index:20}.x-spreadsheet-editor .x-spreadsheet-editor-area{position:absolute;text-align:left;border:2px solid #4b89ff;line-height:0;z-index:100;pointer-events:auto}.x-spreadsheet-editor .x-spreadsheet-editor-area textarea{box-sizing:content-box;border:none;padding:0 3px;outline:none;resize:none;text-align:start;overflow-y:hidden;font:400 13px Arial,Lato,Source Sans Pro,Roboto,Helvetica,sans-serif;color:inherit;white-space:normal;word-wrap:break-word;line-height:22px;margin:0}.x-spreadsheet-editor .x-spreadsheet-editor-area .textline{overflow:hidden;visibility:hidden;position:fixed;top:0;left:0}.x-spreadsheet-item{-webkit-user-select:none;user-select:none;background:0;border:1px solid transparent;outline:none;height:26px;color:#000000e6;line-height:26px;list-style:none;padding:2px 10px;cursor:default;text-align:left;overflow:hidden}.x-spreadsheet-item.disabled{pointer-events:none;opacity:.5}.x-spreadsheet-item:hover,.x-spreadsheet-item.active{background:#0000000d}.x-spreadsheet-item.divider{height:0;padding:0;margin:5px 0;border:none;border-bottom:1px solid rgba(0,0,0,.1)}.x-spreadsheet-item .label{float:right;opacity:.65;font-size:1em}.x-spreadsheet-item.state,.x-spreadsheet-header.state{padding-left:35px!important;position:relative}.x-spreadsheet-item.state:before,.x-spreadsheet-header.state:before{content:"";position:absolute;width:10px;height:10px;left:12px;top:calc(50% - 5px);background:#00000014;border-radius:2px}.x-spreadsheet-item.state.checked:before,.x-spreadsheet-header.state.checked:before{background:#4b89ff}.x-spreadsheet-checkbox{position:relative;display:inline-block;backface-visibility:hidden;outline:0;vertical-align:baseline;font-style:normal;font-size:1rem;line-height:1em}.x-spreadsheet-checkbox>input{position:absolute;top:0;left:0;opacity:0!important;outline:0;z-index:-1}.x-spreadsheet-suggest,.x-spreadsheet-contextmenu,.x-spreadsheet-sort-filter{position:absolute;box-shadow:1px 2px 5px 2px #33333326;background:#fff;z-index:100;width:260px;pointer-events:auto;overflow:auto}.x-spreadsheet-suggest{width:200px}.x-spreadsheet-filter{border:1px solid #e9e9e9;font-size:12px;margin:10px}.x-spreadsheet-filter .x-spreadsheet-header{padding:.5em .75em;background:#f8f8f9;border-bottom:1px solid #e9e9e9;border-left:1px solid transparent}.x-spreadsheet-filter .x-spreadsheet-body{height:200px;overflow-y:auto}.x-spreadsheet-filter .x-spreadsheet-body .x-spreadsheet-item{height:20px;line-height:20px}.x-spreadsheet-sort-filter .x-spreadsheet-buttons{margin:10px}.x-spreadsheet-bottombar{height:40px;padding:0 30px;text-align:left;background:#f5f6f7;display:flex}.x-spreadsheet-bottombar{position:relative;border-top:1px solid #e0e2e4}.x-spreadsheet-bottombar .x-spreadsheet-menu>li{line-height:40px;height:40px;padding-top:0;padding-bottom:0;vertical-align:middle;border-right:1px solid #e8eaed}.x-spreadsheet-menu{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.x-spreadsheet-menu>li{float:left;line-height:1.25em;padding:.785em 1em;margin:0;vertical-align:middle;text-align:left;font-weight:400;color:#80868b;white-space:nowrap;cursor:pointer;transition:all .3s;font-weight:700}.x-spreadsheet-menu>li.active{background-color:#fff;color:#000000a6}.x-spreadsheet-menu>li .x-spreadsheet-dropdown{display:inline-block}.x-spreadsheet-print{position:absolute;left:0;top:0;z-index:100;width:100%;height:100%;display:flex;flex-direction:column}.x-spreadsheet-print-bar{background:#424242;height:60px;line-height:60px;padding:0 30px}.x-spreadsheet-print-bar .-title{color:#fff;font-weight:700;font-size:1.2em;float:left}.x-spreadsheet-print-bar .-right{float:right;margin-top:12px}.x-spreadsheet-print-content{display:flex;flex:auto;flex-direction:row;background:#d0d0d0;height:calc(100% - 60px)}.x-spreadsheet-print-content .-sider{flex:0 0 300px;width:300px;border-left:2px solid #ccc;background:#fff}.x-spreadsheet-print-content .-content{flex:auto;overflow-x:auto;overflow-y:scroll;height:100%}.x-spreadsheet-canvas-card-wraper{margin:40px 20px}.x-spreadsheet-canvas-card{background:#fff;margin:auto;page-break-before:auto;page-break-after:always;box-shadow:0 8px 10px 1px #00000024,0 3px 14px 3px #0000001f,0 4px 5px #0003}.x-spreadsheet-calendar{color:#000000a6;background:#fff;-webkit-user-select:none;user-select:none}.x-spreadsheet-calendar .calendar-header{font-weight:700;line-height:30px;text-align:center;width:100%;float:left;background:#f9fafb}.x-spreadsheet-calendar .calendar-header .calendar-header-left{padding-left:5px;float:left}.x-spreadsheet-calendar .calendar-header .calendar-header-right{float:right}.x-spreadsheet-calendar .calendar-header .calendar-header-right a{padding:3px 0;margin-right:2px;border-radius:2px}.x-spreadsheet-calendar .calendar-header .calendar-header-right a:hover{background:#00000014}.x-spreadsheet-calendar .calendar-body{border-collapse:collapse;border-spacing:0}.x-spreadsheet-calendar .calendar-body th,.x-spreadsheet-calendar .calendar-body td{width:14.28571429%;min-width:32px;text-align:center;font-weight:700;line-height:30px;padding:0}.x-spreadsheet-calendar .calendar-body td>.cell:hover{background:#ecf6fd}.x-spreadsheet-calendar .calendar-body td>.cell.active,.x-spreadsheet-calendar .calendar-body td>.cell.active:hover{background:#ecf6fd;color:#2185d0}.x-spreadsheet-calendar .calendar-body td>.cell.disabled{pointer-events:none;opacity:.5}.x-spreadsheet-datepicker{box-shadow:2px 2px 5px #0003;position:absolute;left:0;top:calc(100% + 5px);z-index:10;width:auto}.x-spreadsheet-buttons{display:flex;justify-content:flex-end}.x-spreadsheet-buttons .x-spreadsheet-button{margin-left:8px}.x-spreadsheet-button{display:inline-block;border-radius:3px;line-height:1em;min-height:1em;white-space:nowrap;text-align:center;cursor:pointer;font-size:1em;font-weight:700;padding:.75em 1em;color:#0009;background:#e0e1e2;text-decoration:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;outline:none;vertical-align:baseline;zoom:1;-webkit-user-select:none;user-select:none;transition:all .1s linear}.x-spreadsheet-button.active,.x-spreadsheet-button:hover{background-color:#c0c1c2;color:#000c}.x-spreadsheet-button.primary{color:#fff;background-color:#2185d0}.x-spreadsheet-button.primary:hover,.x-spreadsheet-button.primary.active{color:#fff;background-color:#1678c2}.x-spreadsheet-form-input{font-size:1em;position:relative;font-weight:400;display:inline-flex;color:#000000de}.x-spreadsheet-form-input input{z-index:1;margin:0;max-width:100%;flex:1 0 auto;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);text-align:left;line-height:30px;height:30px;padding:0 8px;background:#fff;border:1px solid #e9e9e9;border-radius:3px;transition:box-shadow .1s ease,border-color .1s ease;box-shadow:inset 0 1px 2px #0a0a0a0f}.x-spreadsheet-form-input input:focus{border-color:#4b89ff;box-shadow:inset 0 1px 2px #4b89ff33}.x-spreadsheet-form-select{position:relative;display:inline-block;background:#fff;border:1px solid #e9e9e9;border-radius:2px;cursor:pointer;color:#000000de;-webkit-user-select:none;user-select:none;box-shadow:inset 0 1px 2px #0a0a0a0f}.x-spreadsheet-form-select .input-text{text-overflow:ellipsis;white-space:nowrap;min-width:60px;width:auto;height:30px;line-height:30px;padding:0 8px}.x-spreadsheet-form-fields{display:flex;flex-direction:row;flex-wrap:wrap}.x-spreadsheet-form-fields .x-spreadsheet-form-field{flex:0 1 auto}.x-spreadsheet-form-fields .x-spreadsheet-form-field .label{display:inline-block;margin:0 10px 0 0}.x-spreadsheet-form-field{display:block;vertical-align:middle;margin-left:10px;margin-bottom:10px}.x-spreadsheet-form-field:first-child{margin-left:0}.x-spreadsheet-form-field.error .x-spreadsheet-form-select,.x-spreadsheet-form-field.error input{border-color:#f04134}.x-spreadsheet-form-field .tip{color:#f04134;font-size:.9em}.x-spreadsheet-dimmer{display:none;position:absolute;top:0!important;left:0!important;width:100%;height:100%;text-align:center;vertical-align:middle;background-color:#0009;opacity:0;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.5s;animation-duration:.5s;transition:background-color .5s linear;-webkit-user-select:none;user-select:none;z-index:1000}.x-spreadsheet-dimmer.active{display:block;opacity:1}form fieldset{border:none}form fieldset label{display:block;margin-bottom:.5em;font-size:1em;color:#666}form fieldset select{font-size:1.1em;width:100%;background-color:#fff;border:none;border-bottom:2px solid #ddd;padding:.5em .85em;border-radius:2px}.x-spreadsheet-modal,.x-spreadsheet-toast{font-size:13px;position:fixed;z-index:1001;text-align:left;line-height:1.25em;min-width:360px;color:#000000de;font-family:Lato,Source Sans Pro,Roboto,Helvetica,Arial,sans-serif;border-radius:4px;border:1px solid rgba(0,0,0,.1);background-color:#fff;background-clip:padding-box;box-shadow:#0003 0 2px 8px}.x-spreadsheet-toast{background-color:#ffffffd9}.x-spreadsheet-modal-header,.x-spreadsheet-toast-header{font-weight:600;background-clip:padding-box;background-color:#ffffffd9;border-bottom:1px solid rgba(0,0,0,.05);border-radius:4px 4px 0 0}.x-spreadsheet-toast-header{color:#f2711c}.x-spreadsheet-modal-header{border-bottom:1px solid #e0e2e4;background:#00000014;font-size:1.0785em}.x-spreadsheet-modal-header,.x-spreadsheet-modal-content,.x-spreadsheet-toast-header,.x-spreadsheet-toast-content{padding:.75em 1em}.x-spreadsheet-menu li:first-child{display:none}.vue-office-excel{height:100%}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hkyhy/marsun-components-core",
3
- "version": "0.1.5",
3
+ "version": "0.1.10",
4
4
  "description": "Marsun pure UI component library",
5
5
  "type": "module",
6
6
  "repository": {
@@ -58,12 +58,15 @@
58
58
  "react-router-dom": "^6.28.0 || ^7.0.0"
59
59
  },
60
60
  "dependencies": {
61
+ "@js-preview/excel": "^1.7.14",
61
62
  "@kne/button-group": "^0.1.24",
62
63
  "ahooks": "^3.8.1",
63
64
  "classnames": "^2.5.1",
64
65
  "dayjs": "^1.11.13",
66
+ "docx-preview": "^0.3.7",
65
67
  "lucide-react": "^1.18.0",
66
68
  "mermaid": "^11.15.0",
69
+ "pptx-preview": "^1.0.7",
67
70
  "prism-react-renderer": "^2.4.1",
68
71
  "react-markdown": "^10.1.0",
69
72
  "remark-gfm": "^4.0.1"