dishui 0.0.83 → 0.0.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Demo/index.js +2 -2
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/Input/index.js +52 -62
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/LayoutSuite/index.d.ts +10 -0
- package/dist/components/LayoutSuite/index.js +27 -18
- package/dist/components/LayoutSuite/index.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js +1 -0
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Markdown/useMarkdownSource.js +46 -31
- package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
- package/dist/components/Markdown/useMarkmapRenderer.js +44 -31
- package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
- package/dist/components/Markdown/useMermaidRenderer.js +49 -31
- package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
- package/dist/components/Page/index.d.ts +18 -4
- package/dist/components/Page/index.js +47 -35
- package/dist/components/Page/index.js.map +1 -1
- package/dist/components/ProtectedRoute/index.d.ts +2 -1
- package/dist/components/ProtectedRoute/index.js +16 -6
- package/dist/components/ProtectedRoute/index.js.map +1 -1
- package/dist/components/Select/index.d.ts +6 -0
- package/dist/components/Select/index.js +166 -136
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/Tabs/index.d.ts +12 -1
- package/dist/components/Tabs/index.js +42 -17
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Text/index.d.ts +1 -1
- package/dist/components/Text/index.js +2 -2
- package/dist/components/Text/index.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js +7 -7
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js +200 -189
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/types.d.ts +3 -0
- package/dist/components/pro/DataTable/DataTable.d.ts +1 -1
- package/dist/components/pro/DataTable/DataTable.js +98 -240
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js +14 -16
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.d.ts +3 -9
- package/dist/components/pro/DataTable/components/TablePagination.js +29 -25
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.d.ts +2 -2
- package/dist/components/pro/DataTable/tanstack-table.js +29 -21
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/DataTable/treeDataUtils.d.ts +2 -0
- package/dist/components/pro/DataTable/treeDataUtils.js +18 -19
- package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
- package/dist/components/pro/DataTable/types.d.ts +24 -0
- package/dist/components/pro/DataTable/useDataTableModel.d.ts +16 -0
- package/dist/components/pro/DataTable/useDataTableModel.js +148 -0
- package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -0
- package/dist/components/pro/FileExplorer/Breadcrumb.js +12 -12
- package/dist/components/pro/Flow/nodes/DataNodeView.js +87 -82
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js +69 -63
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.d.ts +14 -0
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js +76 -0
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -0
- package/dist/components/pro/Flow/nodes/demandRender.d.ts +11 -0
- package/dist/components/pro/Flow/nodes/demandRender.js +26 -0
- package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -0
- package/dist/components/pro/RichTextEditor/SlashMenu.js +68 -58
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/contexts/AppContext.d.ts +1 -0
- package/dist/contexts/AppContext.js +144 -145
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/contexts/authentication.d.ts +7 -0
- package/dist/contexts/authentication.js +22 -0
- package/dist/contexts/authentication.js.map +1 -0
- package/dist/dishui.css +1 -1
- package/dist/hooks/useControllableState.d.ts +6 -14
- package/dist/hooks/useControllableState.js +21 -15
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useTableColumns.d.ts +3 -3
- package/dist/hooks/useTableColumns.js +2 -2
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/hooks/useTableData.d.ts +11 -4
- package/dist/hooks/useTableData.js +44 -26
- package/dist/hooks/useTableData.js.map +1 -1
- package/dist/index-nostyled.d.ts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +97 -97
- package/dist/layouts/Sidebar.d.ts +3 -1
- package/dist/layouts/Sidebar.js +131 -122
- package/dist/layouts/Sidebar.js.map +1 -1
- package/dist/utils/i18n.js +1 -1
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/routerBuilder.d.ts +7 -5
- package/dist/utils/routerBuilder.js +11 -15
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/safeStorage.d.ts +8 -0
- package/dist/utils/safeStorage.js +45 -0
- package/dist/utils/safeStorage.js.map +1 -0
- package/package.json +22 -5
|
@@ -1,50 +1,65 @@
|
|
|
1
|
-
import { useEffect as e,
|
|
1
|
+
import { useEffect as e, useRef as t, useState as n } from "react";
|
|
2
2
|
//#region src/components/Markdown/useMarkdownSource.ts
|
|
3
|
-
async function
|
|
4
|
-
let
|
|
5
|
-
if (!
|
|
6
|
-
let [,
|
|
7
|
-
if (!
|
|
8
|
-
return
|
|
3
|
+
async function r(e, t, n) {
|
|
4
|
+
let r = /^s3:\/\/([^/]+)\/(.+)$/.exec(e);
|
|
5
|
+
if (!r) throw Error("Invalid S3 URL format. Expected: s3://bucket/key");
|
|
6
|
+
let [, i, a] = r, o = t?.region || "us-east-1", s = `${t?.endpoint || `https://${i}.s3.${o}.amazonaws.com`}/${a}`, c = await fetch(s, { signal: n });
|
|
7
|
+
if (!c.ok) throw Error(`S3 fetch failed: ${c.status} ${c.statusText}`);
|
|
8
|
+
return c.text();
|
|
9
9
|
}
|
|
10
|
-
function
|
|
11
|
-
let [
|
|
10
|
+
function i(i, a, o, s, c) {
|
|
11
|
+
let [l, u] = n(""), [d, f] = n(!1), [p, m] = n(null), h = t({
|
|
12
|
+
onLoad: s,
|
|
13
|
+
onError: c
|
|
14
|
+
});
|
|
15
|
+
e(() => {
|
|
16
|
+
h.current = {
|
|
17
|
+
onLoad: s,
|
|
18
|
+
onError: c
|
|
19
|
+
};
|
|
20
|
+
}, [s, c]);
|
|
21
|
+
let g = o?.region, _ = o?.endpoint;
|
|
12
22
|
return e(() => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
23
|
+
let e = new AbortController(), { signal: t } = e;
|
|
24
|
+
return (async () => {
|
|
25
|
+
if (m(null), i === "text") {
|
|
26
|
+
u(a), f(!1), h.current.onLoad?.(a);
|
|
16
27
|
return;
|
|
17
28
|
}
|
|
18
|
-
|
|
29
|
+
f(!0), u("");
|
|
19
30
|
try {
|
|
20
31
|
let e;
|
|
21
|
-
if (
|
|
22
|
-
let
|
|
23
|
-
if (!
|
|
24
|
-
e = await
|
|
25
|
-
} else if (
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
if (i === "url") {
|
|
33
|
+
let n = await fetch(a, { signal: t });
|
|
34
|
+
if (!n.ok) throw Error(`HTTP error! status: ${n.status}`);
|
|
35
|
+
e = await n.text();
|
|
36
|
+
} else if (i === "s3") e = await r(a, {
|
|
37
|
+
region: g,
|
|
38
|
+
endpoint: _
|
|
39
|
+
}, t);
|
|
40
|
+
else throw Error(`Unsupported source type: ${i}`);
|
|
41
|
+
if (t.aborted) return;
|
|
42
|
+
u(e), h.current.onLoad?.(e);
|
|
28
43
|
} catch (e) {
|
|
29
|
-
|
|
30
|
-
|
|
44
|
+
if (t.aborted) return;
|
|
45
|
+
let n = e instanceof Error ? e : Error(String(e));
|
|
46
|
+
m(n), h.current.onError?.(n);
|
|
31
47
|
} finally {
|
|
32
|
-
|
|
48
|
+
t.aborted || f(!1);
|
|
33
49
|
}
|
|
34
|
-
})();
|
|
50
|
+
})(), () => e.abort();
|
|
35
51
|
}, [
|
|
36
|
-
r,
|
|
37
52
|
i,
|
|
38
53
|
a,
|
|
39
|
-
|
|
40
|
-
|
|
54
|
+
g,
|
|
55
|
+
_
|
|
41
56
|
]), {
|
|
42
|
-
markdown:
|
|
43
|
-
loading:
|
|
44
|
-
error:
|
|
57
|
+
markdown: l,
|
|
58
|
+
loading: d,
|
|
59
|
+
error: p
|
|
45
60
|
};
|
|
46
61
|
}
|
|
47
62
|
//#endregion
|
|
48
|
-
export {
|
|
63
|
+
export { i as useMarkdownSource };
|
|
49
64
|
|
|
50
65
|
//# sourceMappingURL=useMarkdownSource.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMarkdownSource.js","names":[],"sources":["../../../src/components/Markdown/useMarkdownSource.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport type { MarkdownSource, MarkdownProps } from './Markdown';\n\nasync function fetchFromS3(\n s3Url: string,\n config?: MarkdownProps['s3Config']
|
|
1
|
+
{"version":3,"file":"useMarkdownSource.js","names":[],"sources":["../../../src/components/Markdown/useMarkdownSource.ts"],"sourcesContent":["import { useState, useEffect, useRef } from 'react';\nimport type { MarkdownSource, MarkdownProps } from './Markdown';\n\nasync function fetchFromS3(\n s3Url: string,\n config?: MarkdownProps['s3Config'],\n signal?: AbortSignal,\n): Promise<string> {\n const match = /^s3:\\/\\/([^/]+)\\/(.+)$/.exec(s3Url);\n if (!match) {\n throw new Error('Invalid S3 URL format. Expected: s3://bucket/key');\n }\n\n const [, bucket, key] = match;\n const region = config?.region || 'us-east-1';\n const endpoint = config?.endpoint || `https://${bucket}.s3.${region}.amazonaws.com`;\n const url = `${endpoint}/${key}`;\n\n const response = await fetch(url, { signal });\n if (!response.ok) {\n throw new Error(`S3 fetch failed: ${response.status} ${response.statusText}`);\n }\n\n return response.text();\n}\n\nexport function useMarkdownSource(\n source: MarkdownSource,\n content: string,\n s3Config?: MarkdownProps['s3Config'],\n onLoad?: (content: string) => void,\n onError?: (error: Error) => void,\n) {\n const [markdown, setMarkdown] = useState<string>('');\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Callback identity is not a source change; notify the latest committed callbacks.\n const callbacks = useRef({ onLoad, onError });\n useEffect(() => {\n callbacks.current = { onLoad, onError };\n }, [onLoad, onError]);\n\n const region = s3Config?.region;\n const endpoint = s3Config?.endpoint;\n\n useEffect(() => {\n const controller = new AbortController();\n const { signal } = controller;\n\n const fetchContent = async () => {\n setError(null);\n if (source === 'text') {\n setMarkdown(content);\n setLoading(false);\n callbacks.current.onLoad?.(content);\n return;\n }\n\n setLoading(true);\n setMarkdown('');\n\n try {\n let text: string;\n\n if (source === 'url') {\n const response = await fetch(content, { signal });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n text = await response.text();\n } else if (source === 's3') {\n text = await fetchFromS3(content, { region, endpoint }, signal);\n } else {\n throw new Error(`Unsupported source type: ${source}`);\n }\n\n if (signal.aborted) return;\n setMarkdown(text);\n callbacks.current.onLoad?.(text);\n } catch (err) {\n if (signal.aborted) return;\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n callbacks.current.onError?.(error);\n } finally {\n if (!signal.aborted) setLoading(false);\n }\n };\n\n fetchContent();\n return () => controller.abort();\n }, [source, content, region, endpoint]);\n\n return { markdown, loading, error };\n}\n"],"mappings":";;AAGA,eAAe,EACb,GACA,GACA,GACiB;CACjB,IAAM,IAAQ,yBAAyB,KAAK,CAAK;CACjD,IAAI,CAAC,GACH,MAAU,MAAM,kDAAkD;CAGpE,IAAM,GAAG,GAAQ,KAAO,GAClB,IAAS,GAAQ,UAAU,aAE3B,IAAM,GADK,GAAQ,YAAY,WAAW,EAAO,MAAM,EAAO,gBAC5C,GAAG,KAErB,IAAW,MAAM,MAAM,GAAK,EAAE,UAAO,CAAC;CAC5C,IAAI,CAAC,EAAS,IACZ,MAAU,MAAM,oBAAoB,EAAS,OAAO,GAAG,EAAS,YAAY;CAG9E,OAAO,EAAS,KAAK;AACvB;AAEA,SAAgB,EACd,GACA,GACA,GACA,GACA,GACA;CACA,IAAM,CAAC,GAAU,KAAe,EAAiB,EAAE,GAC7C,CAAC,GAAS,KAAc,EAAkB,EAAK,GAC/C,CAAC,GAAO,KAAY,EAAuB,IAAI,GAG/C,IAAY,EAAO;EAAE;EAAQ;CAAQ,CAAC;CAC5C,QAAgB;EACd,EAAU,UAAU;GAAE;GAAQ;EAAQ;CACxC,GAAG,CAAC,GAAQ,CAAO,CAAC;CAEpB,IAAM,IAAS,GAAU,QACnB,IAAW,GAAU;CAkD3B,OAhDA,QAAgB;EACd,IAAM,IAAa,IAAI,gBAAgB,GACjC,EAAE,cAAW;EA2CnB,QADA,YAxCiC;GAE/B,IADA,EAAS,IAAI,GACT,MAAW,QAAQ;IAGrB,AAFA,EAAY,CAAO,GACnB,EAAW,EAAK,GAChB,EAAU,QAAQ,SAAS,CAAO;IAClC;GACF;GAGA,AADA,EAAW,EAAI,GACf,EAAY,EAAE;GAEd,IAAI;IACF,IAAI;IAEJ,IAAI,MAAW,OAAO;KACpB,IAAM,IAAW,MAAM,MAAM,GAAS,EAAE,UAAO,CAAC;KAChD,IAAI,CAAC,EAAS,IACZ,MAAU,MAAM,uBAAuB,EAAS,QAAQ;KAE1D,IAAO,MAAM,EAAS,KAAK;IAC7B,OAAO,IAAI,MAAW,MACpB,IAAO,MAAM,EAAY,GAAS;KAAE;KAAQ;IAAS,GAAG,CAAM;SAE9D,MAAU,MAAM,4BAA4B,GAAQ;IAGtD,IAAI,EAAO,SAAS;IAEpB,AADA,EAAY,CAAI,GAChB,EAAU,QAAQ,SAAS,CAAI;GACjC,SAAS,GAAK;IACZ,IAAI,EAAO,SAAS;IACpB,IAAM,IAAQ,aAAe,QAAQ,IAAU,MAAM,OAAO,CAAG,CAAC;IAEhE,AADA,EAAS,CAAK,GACd,EAAU,QAAQ,UAAU,CAAK;GACnC,UAAU;IACR,AAAK,EAAO,WAAS,EAAW,EAAK;GACvC;EACF,EAEA,CAAa,SACA,EAAW,MAAM;CAChC,GAAG;EAAC;EAAQ;EAAS;EAAQ;CAAQ,CAAC,GAE/B;EAAE;EAAU;EAAS;CAAM;AACpC"}
|
|
@@ -1,38 +1,51 @@
|
|
|
1
|
-
import { useEffect as e } from "react";
|
|
2
|
-
import { Transformer as
|
|
3
|
-
import { Markmap as
|
|
1
|
+
import { useEffect as e, useRef as t } from "react";
|
|
2
|
+
import { Transformer as n } from "markmap-lib";
|
|
3
|
+
import { Markmap as r } from "markmap-view";
|
|
4
4
|
//#region src/components/Markdown/useMarkmapRenderer.ts
|
|
5
|
-
function
|
|
5
|
+
function i(e, t) {
|
|
6
|
+
clearTimeout(t.timer);
|
|
7
|
+
let n = t.instance;
|
|
8
|
+
t.instance = void 0, n && (n.svg.interrupt(), n.svg.selectAll("*").interrupt(), n.svg.on("wheel", null), n.destroy()), t.output && e.firstChild === t.output && e.replaceChildren();
|
|
9
|
+
}
|
|
10
|
+
function a(a, o, s) {
|
|
11
|
+
let c = t(/* @__PURE__ */ new Map()), l = t(null);
|
|
6
12
|
e(() => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
let e = c.current;
|
|
14
|
+
return () => {
|
|
15
|
+
e.forEach((e, t) => i(t, e)), e.clear();
|
|
16
|
+
};
|
|
17
|
+
}, []), e(() => {
|
|
18
|
+
let e = c.current, t = a.current, u = new Set(s && o && t ? t.querySelectorAll(".markmap-diagram") : []);
|
|
19
|
+
e.forEach((t, n) => {
|
|
20
|
+
(!u.has(n) || n.getAttribute("data-markmap-content") !== t.code || t.output && n.firstChild !== t.output) && (e.delete(n), i(n, t));
|
|
21
|
+
}), u.forEach((o) => {
|
|
22
|
+
if (e.has(o)) return;
|
|
23
|
+
let s = o.getAttribute("data-markmap-content") || "";
|
|
24
|
+
if (!s.trim()) return;
|
|
25
|
+
let c = {
|
|
26
|
+
code: s,
|
|
27
|
+
output: null
|
|
28
|
+
};
|
|
29
|
+
e.set(o, c);
|
|
30
|
+
let u = () => e.get(o) === c && a.current === t && t?.contains(o) && o.getAttribute("data-markmap-content") === s && (!c.output || o.firstChild === c.output);
|
|
31
|
+
c.timer = setTimeout(async () => {
|
|
32
|
+
if (u()) try {
|
|
33
|
+
l.current ??= new n();
|
|
34
|
+
let { root: e } = l.current.transform(s), t = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
35
|
+
t.style.width = "100%", t.style.height = "500px", o.replaceChildren(t), c.output = t;
|
|
36
|
+
let i = r.create(t, {});
|
|
37
|
+
c.instance = i, await i.setData(e), u() && await i.fit();
|
|
38
|
+
} catch (e) {
|
|
39
|
+
if (!u()) return;
|
|
40
|
+
i(o, c), console.error("Markmap render error:", e);
|
|
41
|
+
let t = document.createElement("pre");
|
|
42
|
+
t.className = "text-error", t.textContent = `Markmap 渲染失败: ${e}`, o.replaceChildren(t), c.output = t;
|
|
24
43
|
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}, 100);
|
|
29
|
-
}, [
|
|
30
|
-
i,
|
|
31
|
-
a,
|
|
32
|
-
r
|
|
33
|
-
]);
|
|
44
|
+
}, 100);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
34
47
|
}
|
|
35
48
|
//#endregion
|
|
36
|
-
export {
|
|
49
|
+
export { a as useMarkmapRenderer };
|
|
37
50
|
|
|
38
51
|
//# sourceMappingURL=useMarkmapRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMarkmapRenderer.js","names":[],"sources":["../../../src/components/Markdown/useMarkmapRenderer.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { Transformer } from 'markmap-lib';\nimport { Markmap } from 'markmap-view';\n\nexport function useMarkmapRenderer(\n containerRef: React.RefObject<HTMLDivElement | null>,\n markdown: string,\n enabled: boolean,\n) {\n useEffect(() => {\n
|
|
1
|
+
{"version":3,"file":"useMarkmapRenderer.js","names":[],"sources":["../../../src/components/Markdown/useMarkmapRenderer.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { Transformer } from 'markmap-lib';\nimport { Markmap } from 'markmap-view';\n\ninterface Diagram {\n code: string;\n output: ChildNode | null;\n instance?: Markmap;\n timer?: ReturnType<typeof setTimeout>;\n}\n\nfunction dispose(element: HTMLElement, diagram: Diagram) {\n clearTimeout(diagram.timer);\n const instance = diagram.instance;\n diagram.instance = undefined;\n if (instance) {\n // destroy disconnects Markmap's observer/refresh subscription. Stop D3's\n // transitions and pan listener too, before removing the owned SVG.\n instance.svg.interrupt();\n instance.svg.selectAll('*').interrupt();\n instance.svg.on('wheel', null);\n instance.destroy();\n }\n if (diagram.output && element.firstChild === diagram.output) {\n element.replaceChildren();\n }\n}\n\nexport function useMarkmapRenderer(\n containerRef: React.RefObject<HTMLDivElement | null>,\n markdown: string,\n enabled: boolean,\n) {\n const diagrams = useRef(new Map<HTMLElement, Diagram>());\n const transformer = useRef<Transformer | null>(null);\n\n useEffect(() => {\n const entries = diagrams.current;\n return () => {\n entries.forEach((diagram, element) => dispose(element, diagram));\n entries.clear();\n };\n }, []);\n\n useEffect(() => {\n const entries = diagrams.current;\n const container = containerRef.current;\n const elements = new Set(enabled && markdown && container\n ? container.querySelectorAll<HTMLElement>('.markmap-diagram') : []);\n\n entries.forEach((diagram, element) => {\n if (!elements.has(element) || element.getAttribute('data-markmap-content') !== diagram.code ||\n (diagram.output && element.firstChild !== diagram.output)) {\n entries.delete(element);\n dispose(element, diagram);\n }\n });\n\n elements.forEach(element => {\n if (entries.has(element)) return;\n const code = element.getAttribute('data-markmap-content') || '';\n if (!code.trim()) return;\n const diagram: Diagram = { code, output: null };\n entries.set(element, diagram);\n const canCommit = () => entries.get(element) === diagram &&\n containerRef.current === container && container?.contains(element) &&\n element.getAttribute('data-markmap-content') === code &&\n (!diagram.output || element.firstChild === diagram.output);\n\n diagram.timer = setTimeout(async () => {\n if (!canCommit()) return;\n try {\n transformer.current ??= new Transformer();\n const { root } = transformer.current.transform(code);\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.style.width = '100%';\n svg.style.height = '500px';\n element.replaceChildren(svg);\n diagram.output = svg;\n // Keep the instance before starting asynchronous layout, so cleanup\n // can destroy it and a superseded layout never starts a late fit.\n const instance = Markmap.create(svg, {});\n diagram.instance = instance;\n await instance.setData(root);\n if (canCommit()) await instance.fit();\n } catch (err) {\n if (!canCommit()) return;\n dispose(element, diagram);\n console.error('Markmap render error:', err);\n const fallback = document.createElement('pre');\n fallback.className = 'text-error';\n fallback.textContent = `Markmap 渲染失败: ${err}`;\n element.replaceChildren(fallback);\n diagram.output = fallback;\n }\n }, 100);\n });\n });\n}\n"],"mappings":";;;;AAWA,SAAS,EAAQ,GAAsB,GAAkB;CACvD,aAAa,EAAQ,KAAK;CAC1B,IAAM,IAAW,EAAQ;CAUzB,AATA,EAAQ,WAAW,KAAA,GACf,MAGF,EAAS,IAAI,UAAU,GACvB,EAAS,IAAI,UAAU,GAAG,CAAC,CAAC,UAAU,GACtC,EAAS,IAAI,GAAG,SAAS,IAAI,GAC7B,EAAS,QAAQ,IAEf,EAAQ,UAAU,EAAQ,eAAe,EAAQ,UACnD,EAAQ,gBAAgB;AAE5B;AAEA,SAAgB,EACd,GACA,GACA,GACA;CACA,IAAM,IAAW,kBAAO,IAAI,IAA0B,CAAC,GACjD,IAAc,EAA2B,IAAI;CAUnD,AARA,QAAgB;EACd,IAAM,IAAU,EAAS;EACzB,aAAa;GAEX,AADA,EAAQ,SAAS,GAAS,MAAY,EAAQ,GAAS,CAAO,CAAC,GAC/D,EAAQ,MAAM;EAChB;CACF,GAAG,CAAC,CAAC,GAEL,QAAgB;EACd,IAAM,IAAU,EAAS,SACnB,IAAY,EAAa,SACzB,IAAW,IAAI,IAAI,KAAW,KAAY,IAC5C,EAAU,iBAA8B,kBAAkB,IAAI,CAAC,CAAC;EAUpE,AARA,EAAQ,SAAS,GAAS,MAAY;GACpC,CAAI,CAAC,EAAS,IAAI,CAAO,KAAK,EAAQ,aAAa,sBAAsB,MAAM,EAAQ,QAClF,EAAQ,UAAU,EAAQ,eAAe,EAAQ,YACpD,EAAQ,OAAO,CAAO,GACtB,EAAQ,GAAS,CAAO;EAE5B,CAAC,GAED,EAAS,SAAQ,MAAW;GAC1B,IAAI,EAAQ,IAAI,CAAO,GAAG;GAC1B,IAAM,IAAO,EAAQ,aAAa,sBAAsB,KAAK;GAC7D,IAAI,CAAC,EAAK,KAAK,GAAG;GAClB,IAAM,IAAmB;IAAE;IAAM,QAAQ;GAAK;GAC9C,EAAQ,IAAI,GAAS,CAAO;GAC5B,IAAM,UAAkB,EAAQ,IAAI,CAAO,MAAM,KAC/C,EAAa,YAAY,KAAa,GAAW,SAAS,CAAO,KACjE,EAAQ,aAAa,sBAAsB,MAAM,MAChD,CAAC,EAAQ,UAAU,EAAQ,eAAe,EAAQ;GAErD,EAAQ,QAAQ,WAAW,YAAY;IAChC,MAAU,GACf,IAAI;KACF,EAAY,YAAY,IAAI,EAAY;KACxC,IAAM,EAAE,YAAS,EAAY,QAAQ,UAAU,CAAI,GAC7C,IAAM,SAAS,gBAAgB,8BAA8B,KAAK;KAIxE,AAHA,EAAI,MAAM,QAAQ,QAClB,EAAI,MAAM,SAAS,SACnB,EAAQ,gBAAgB,CAAG,GAC3B,EAAQ,SAAS;KAGjB,IAAM,IAAW,EAAQ,OAAO,GAAK,CAAC,CAAC;KAGvC,AAFA,EAAQ,WAAW,GACnB,MAAM,EAAS,QAAQ,CAAI,GACvB,EAAU,KAAG,MAAM,EAAS,IAAI;IACtC,SAAS,GAAK;KACZ,IAAI,CAAC,EAAU,GAAG;KAElB,AADA,EAAQ,GAAS,CAAO,GACxB,QAAQ,MAAM,yBAAyB,CAAG;KAC1C,IAAM,IAAW,SAAS,cAAc,KAAK;KAI7C,AAHA,EAAS,YAAY,cACrB,EAAS,cAAc,iBAAiB,KACxC,EAAQ,gBAAgB,CAAQ,GAChC,EAAQ,SAAS;IACnB;GACF,GAAG,GAAG;EACR,CAAC;CACH,CAAC;AACH"}
|
|
@@ -1,44 +1,62 @@
|
|
|
1
|
-
import { useEffect as e, useRef as t
|
|
2
|
-
import
|
|
1
|
+
import { useEffect as e, useRef as t } from "react";
|
|
2
|
+
import n from "mermaid";
|
|
3
3
|
//#region src/components/Markdown/useMermaidRenderer.ts
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
var r = 0;
|
|
5
|
+
function i(e, t) {
|
|
6
|
+
let n = e.getAttribute("data-mermaid-content");
|
|
7
|
+
return n === null ? t?.output && e.firstChild === t.output ? t.code : e.querySelector("svg") ? "" : e.textContent || "" : n;
|
|
8
|
+
}
|
|
9
|
+
function a(e, t) {
|
|
10
|
+
clearTimeout(t.timer), t.output && e.firstChild === t.output && (e.textContent = i(e, t));
|
|
11
|
+
}
|
|
12
|
+
function o(o, s, c) {
|
|
13
|
+
let l = t(!1), u = t(/* @__PURE__ */ new Map());
|
|
6
14
|
e(() => {
|
|
7
|
-
|
|
15
|
+
let e = u.current;
|
|
16
|
+
return () => {
|
|
17
|
+
e.forEach((e, t) => a(t, e)), e.clear();
|
|
18
|
+
};
|
|
19
|
+
}, []), e(() => {
|
|
20
|
+
c && !l.current && (n.initialize({
|
|
8
21
|
startOnLoad: !1,
|
|
9
22
|
theme: "default",
|
|
10
|
-
securityLevel: "
|
|
23
|
+
securityLevel: "strict",
|
|
24
|
+
htmlLabels: !1,
|
|
11
25
|
fontFamily: "inherit",
|
|
12
26
|
flowchart: {
|
|
13
27
|
useMaxWidth: !0,
|
|
14
|
-
htmlLabels: !
|
|
28
|
+
htmlLabels: !1
|
|
15
29
|
}
|
|
16
|
-
}), l.current = !0
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
30
|
+
}), l.current = !0);
|
|
31
|
+
let e = u.current, t = o.current, d = new Set(c && s && t ? t.querySelectorAll(".mermaid-diagram") : []);
|
|
32
|
+
e.forEach((t, n) => {
|
|
33
|
+
(!d.has(n) || i(n, t) !== t.code || t.output && n.firstChild !== t.output) && (e.delete(n), a(n, t));
|
|
34
|
+
}), d.forEach((a) => {
|
|
35
|
+
if (e.has(a)) return;
|
|
36
|
+
let s = i(a);
|
|
37
|
+
if (!s.trim()) return;
|
|
38
|
+
let c = {
|
|
39
|
+
code: s,
|
|
40
|
+
output: null
|
|
41
|
+
};
|
|
42
|
+
e.set(a, c);
|
|
43
|
+
let l = () => e.get(a) === c && o.current === t && t?.contains(a) && i(a, c) === s;
|
|
44
|
+
c.timer = setTimeout(async () => {
|
|
45
|
+
if (l()) try {
|
|
46
|
+
let { svg: e } = await n.render(`dishui-mermaid-${++r}`, s);
|
|
47
|
+
if (!l()) return;
|
|
48
|
+
a.innerHTML = e, c.output = a.firstChild;
|
|
49
|
+
} catch (e) {
|
|
50
|
+
if (!l()) return;
|
|
51
|
+
console.error("Mermaid render error:", e);
|
|
52
|
+
let t = document.createElement("pre");
|
|
53
|
+
t.className = "text-error", t.textContent = s, a.replaceChildren(t), c.output = t;
|
|
29
54
|
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}, 100);
|
|
34
|
-
}, [
|
|
35
|
-
a,
|
|
36
|
-
o,
|
|
37
|
-
s,
|
|
38
|
-
i
|
|
39
|
-
]);
|
|
55
|
+
}, 100);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
40
58
|
}
|
|
41
59
|
//#endregion
|
|
42
|
-
export {
|
|
60
|
+
export { o as useMermaidRenderer };
|
|
43
61
|
|
|
44
62
|
//# sourceMappingURL=useMermaidRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMermaidRenderer.js","names":[],"sources":["../../../src/components/Markdown/useMermaidRenderer.ts"],"sourcesContent":["import { useEffect, useRef
|
|
1
|
+
{"version":3,"file":"useMermaidRenderer.js","names":[],"sources":["../../../src/components/Markdown/useMermaidRenderer.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport mermaid from 'mermaid';\n\ninterface Diagram {\n code: string;\n output: ChildNode | null;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n// Shared across hook instances, including renders started in the same millisecond.\nlet nextRenderId = 0;\n\nfunction readSource(element: HTMLElement, diagram?: Diagram): string {\n const source = element.getAttribute('data-mermaid-content');\n if (source !== null) return source;\n // Retain compatibility with text-only hook consumers without parsing our SVG.\n if (diagram?.output && element.firstChild === diagram.output) return diagram.code;\n return element.querySelector('svg') ? '' : element.textContent || '';\n}\n\nfunction dispose(element: HTMLElement, diagram: Diagram) {\n clearTimeout(diagram.timer);\n if (diagram.output && element.firstChild === diagram.output) {\n // An attribute-only consumer may already have supplied a new (or empty) source.\n element.textContent = readSource(element, diagram);\n }\n}\n\nexport function useMermaidRenderer(\n containerRef: React.RefObject<HTMLDivElement | null>,\n markdown: string,\n enabled: boolean,\n) {\n const initialized = useRef(false);\n const diagrams = useRef(new Map<HTMLElement, Diagram>());\n\n useEffect(() => {\n const entries = diagrams.current;\n return () => {\n entries.forEach((diagram, element) => dispose(element, diagram));\n entries.clear();\n };\n }, []);\n\n // Reconcile every commit: loading/visibility may replace the container even\n // when the markdown string is unchanged. Only changed blocks schedule work.\n useEffect(() => {\n if (enabled && !initialized.current) {\n mermaid.initialize({\n startOnLoad: false,\n theme: 'default',\n securityLevel: 'strict',\n htmlLabels: false,\n fontFamily: 'inherit',\n flowchart: { useMaxWidth: true, htmlLabels: false },\n });\n initialized.current = true;\n }\n\n const entries = diagrams.current;\n const container = containerRef.current;\n const elements = new Set(enabled && markdown && container\n ? container.querySelectorAll<HTMLElement>('.mermaid-diagram') : []);\n\n entries.forEach((diagram, element) => {\n if (!elements.has(element) || readSource(element, diagram) !== diagram.code ||\n (diagram.output && element.firstChild !== diagram.output)) {\n entries.delete(element);\n dispose(element, diagram);\n }\n });\n\n elements.forEach(element => {\n if (entries.has(element)) return;\n const code = readSource(element);\n if (!code.trim()) return;\n const diagram: Diagram = { code, output: null };\n entries.set(element, diagram);\n const canCommit = () => entries.get(element) === diagram &&\n containerRef.current === container && container?.contains(element) &&\n readSource(element, diagram) === code;\n\n diagram.timer = setTimeout(async () => {\n if (!canCommit()) return;\n try {\n const { svg } = await mermaid.render(`dishui-mermaid-${++nextRenderId}`, code);\n if (!canCommit()) return;\n element.innerHTML = svg;\n diagram.output = element.firstChild;\n } catch (err) {\n if (!canCommit()) return;\n console.error('Mermaid render error:', err);\n const fallback = document.createElement('pre');\n fallback.className = 'text-error';\n fallback.textContent = code;\n element.replaceChildren(fallback);\n diagram.output = fallback;\n }\n }, 100);\n });\n });\n}\n"],"mappings":";;;AAUA,IAAI,IAAe;AAEnB,SAAS,EAAW,GAAsB,GAA2B;CACnE,IAAM,IAAS,EAAQ,aAAa,sBAAsB;CAI1D,OAHI,MAAW,OAEX,GAAS,UAAU,EAAQ,eAAe,EAAQ,SAAe,EAAQ,OACtE,EAAQ,cAAc,KAAK,IAAI,KAAK,EAAQ,eAAe,KAHtC;AAI9B;AAEA,SAAS,EAAQ,GAAsB,GAAkB;CAEvD,AADA,aAAa,EAAQ,KAAK,GACtB,EAAQ,UAAU,EAAQ,eAAe,EAAQ,WAEnD,EAAQ,cAAc,EAAW,GAAS,CAAO;AAErD;AAEA,SAAgB,EACd,GACA,GACA,GACA;CACA,IAAM,IAAc,EAAO,EAAK,GAC1B,IAAW,kBAAO,IAAI,IAA0B,CAAC;CAYvD,AAVA,QAAgB;EACd,IAAM,IAAU,EAAS;EACzB,aAAa;GAEX,AADA,EAAQ,SAAS,GAAS,MAAY,EAAQ,GAAS,CAAO,CAAC,GAC/D,EAAQ,MAAM;EAChB;CACF,GAAG,CAAC,CAAC,GAIL,QAAgB;EACd,AAAI,KAAW,CAAC,EAAY,YAC1B,EAAQ,WAAW;GACjB,aAAa;GACb,OAAO;GACP,eAAe;GACf,YAAY;GACZ,YAAY;GACZ,WAAW;IAAE,aAAa;IAAM,YAAY;GAAM;EACpD,CAAC,GACD,EAAY,UAAU;EAGxB,IAAM,IAAU,EAAS,SACnB,IAAY,EAAa,SACzB,IAAW,IAAI,IAAI,KAAW,KAAY,IAC5C,EAAU,iBAA8B,kBAAkB,IAAI,CAAC,CAAC;EAUpE,AARA,EAAQ,SAAS,GAAS,MAAY;GACpC,CAAI,CAAC,EAAS,IAAI,CAAO,KAAK,EAAW,GAAS,CAAO,MAAM,EAAQ,QAClE,EAAQ,UAAU,EAAQ,eAAe,EAAQ,YACpD,EAAQ,OAAO,CAAO,GACtB,EAAQ,GAAS,CAAO;EAE5B,CAAC,GAED,EAAS,SAAQ,MAAW;GAC1B,IAAI,EAAQ,IAAI,CAAO,GAAG;GAC1B,IAAM,IAAO,EAAW,CAAO;GAC/B,IAAI,CAAC,EAAK,KAAK,GAAG;GAClB,IAAM,IAAmB;IAAE;IAAM,QAAQ;GAAK;GAC9C,EAAQ,IAAI,GAAS,CAAO;GAC5B,IAAM,UAAkB,EAAQ,IAAI,CAAO,MAAM,KAC/C,EAAa,YAAY,KAAa,GAAW,SAAS,CAAO,KACjE,EAAW,GAAS,CAAO,MAAM;GAEnC,EAAQ,QAAQ,WAAW,YAAY;IAChC,MAAU,GACf,IAAI;KACF,IAAM,EAAE,WAAQ,MAAM,EAAQ,OAAO,kBAAkB,EAAE,KAAgB,CAAI;KAC7E,IAAI,CAAC,EAAU,GAAG;KAElB,AADA,EAAQ,YAAY,GACpB,EAAQ,SAAS,EAAQ;IAC3B,SAAS,GAAK;KACZ,IAAI,CAAC,EAAU,GAAG;KAClB,QAAQ,MAAM,yBAAyB,CAAG;KAC1C,IAAM,IAAW,SAAS,cAAc,KAAK;KAI7C,AAHA,EAAS,YAAY,cACrB,EAAS,cAAc,GACvB,EAAQ,gBAAgB,CAAQ,GAChC,EAAQ,SAAS;IACnB;GACF,GAAG,GAAG;EACR,CAAC;CACH,CAAC;AACH"}
|
|
@@ -31,6 +31,20 @@ export type PageBodyProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
|
31
31
|
/** 是否让主体区在剩余空间内滚动(配合 Page fullHeight 使用) */
|
|
32
32
|
scroll?: boolean;
|
|
33
33
|
};
|
|
34
|
+
export type PageHeaderLevel = PageHeaderProps & {
|
|
35
|
+
key: React.Key;
|
|
36
|
+
};
|
|
37
|
+
export type PageHeaderSlotProps = PageHeaderProps & {
|
|
38
|
+
/** 按顺序从上到下渲染;每级覆盖公共属性。空数组不渲染页头。 */
|
|
39
|
+
levels?: readonly PageHeaderLevel[];
|
|
40
|
+
};
|
|
41
|
+
export type PageAsideLevel = PageAsideProps & {
|
|
42
|
+
key: React.Key;
|
|
43
|
+
};
|
|
44
|
+
export type PageAsideSlotProps = PageAsideProps & {
|
|
45
|
+
/** 按 DOM 顺序从左到右渲染(小屏纵向堆叠);每级覆盖公共属性。 */
|
|
46
|
+
levels?: readonly PageAsideLevel[];
|
|
47
|
+
};
|
|
34
48
|
export type PageAsideProps = React.HTMLAttributes<HTMLDivElement> & PagePanelProps & PageResizeProps & {
|
|
35
49
|
/** 侧栏宽度,数字按 px 处理;Left 默认 260,Right 默认 320。外部变化会同步到拖动宽度。 */
|
|
36
50
|
width?: number | string;
|
|
@@ -45,11 +59,11 @@ export type PageMainProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
|
45
59
|
/** 主内容区是否在剩余空间内纵向滚动 */
|
|
46
60
|
scroll?: boolean;
|
|
47
61
|
};
|
|
48
|
-
/**
|
|
49
|
-
declare const PageHeaderSlot: (props:
|
|
62
|
+
/** 不增加包装节点,保持 Page / Body 的布局、间距及面板开关语义。 */
|
|
63
|
+
declare const PageHeaderSlot: ({ levels, ...props }: PageHeaderSlotProps) => React.JSX.Element;
|
|
50
64
|
declare const PageBody: ({ gap, scroll, className, style, children, ...rest }: PageBodyProps) => React.JSX.Element;
|
|
51
|
-
declare const PageLeft: ({
|
|
52
|
-
declare const PageRight: ({
|
|
65
|
+
declare const PageLeft: ({ levels, ...props }: PageAsideSlotProps) => React.ReactElement;
|
|
66
|
+
declare const PageRight: ({ levels, ...props }: PageAsideSlotProps) => React.ReactElement;
|
|
53
67
|
export type PageFooterProps = React.HTMLAttributes<HTMLElement> & PagePanelProps & PageAutoHideProps & {
|
|
54
68
|
left?: React.ReactNode;
|
|
55
69
|
center?: React.ReactNode;
|
|
@@ -3,24 +3,32 @@ import t from "../PagePanel/index.js";
|
|
|
3
3
|
import n from "../PageHeader/index.js";
|
|
4
4
|
import r from "./Float2.js";
|
|
5
5
|
import i from "./resize2.js";
|
|
6
|
-
import "react";
|
|
7
|
-
import { jsx as
|
|
6
|
+
import { createElement as a } from "react";
|
|
7
|
+
import { Fragment as o, jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
8
8
|
//#region src/components/Page/index.tsx
|
|
9
|
-
var
|
|
9
|
+
var l = (e) => typeof e == "number" ? `${e}px` : e, u = ({ fullHeight: t = !1, className: n = "", children: r, ...i }) => /* @__PURE__ */ s("div", {
|
|
10
10
|
className: e("dishui-page flex w-full min-w-0 flex-col text-body leading-5 text-base-content", t && "h-full min-h-0", n),
|
|
11
11
|
...i,
|
|
12
12
|
children: r
|
|
13
|
-
}),
|
|
13
|
+
}), d = ({ levels: e, ...t }) => e === void 0 ? /* @__PURE__ */ s(n, { ...t }) : /* @__PURE__ */ s(o, { children: e.map(({ key: e, ...r }) => /* @__PURE__ */ a(n, {
|
|
14
|
+
...t,
|
|
15
|
+
...r,
|
|
16
|
+
key: e
|
|
17
|
+
})) }), f = ({ gap: t = 16, scroll: n = !1, className: r = "", style: i, children: a, ...o }) => /* @__PURE__ */ s("div", {
|
|
14
18
|
className: e("dishui-page-body flex w-full flex-col md:flex-row", n && "min-h-0 flex-1", r),
|
|
15
19
|
style: {
|
|
16
20
|
...i,
|
|
17
21
|
gap: 0,
|
|
18
|
-
"--dishui-page-gap":
|
|
22
|
+
"--dishui-page-gap": l(i?.gap ?? t)
|
|
19
23
|
},
|
|
20
|
-
...
|
|
21
|
-
children:
|
|
22
|
-
}),
|
|
23
|
-
|
|
24
|
+
...o,
|
|
25
|
+
children: a
|
|
26
|
+
}), p = ({ levels: e, ...t }) => e === void 0 ? m(t) : /* @__PURE__ */ s(o, { children: e.map(({ key: e, ...n }) => /* @__PURE__ */ a(m, {
|
|
27
|
+
...t,
|
|
28
|
+
...n,
|
|
29
|
+
key: e
|
|
30
|
+
})) }), m = ({ resizeVariant: n = "pill", resizable: r = !1, minWidth: a = 160, maxWidth: o = 600, onWidthChange: c, open: u, mode: d, animated: f, duration: p, width: m = 260, bordered: h = !0, scroll: g = !0, hideOnMobile: _ = !1, className: v = "", style: y, children: b, ...x }) => {
|
|
31
|
+
let S = /* @__PURE__ */ s(t, {
|
|
24
32
|
edge: "left",
|
|
25
33
|
width: y?.width ?? m,
|
|
26
34
|
hideOnMobile: _,
|
|
@@ -28,25 +36,29 @@ var s = (e) => typeof e == "number" ? `${e}px` : e, c = ({ fullHeight: t = !1, c
|
|
|
28
36
|
mode: d,
|
|
29
37
|
animated: f,
|
|
30
38
|
duration: p,
|
|
31
|
-
children: /* @__PURE__ */
|
|
39
|
+
children: /* @__PURE__ */ s("aside", {
|
|
32
40
|
className: e("dishui-page-left w-full shrink-0 md:w-(--dishui-aside-w)", h && "md:border-r md:border-base-300 md:pr-4", g && "md:min-h-0 md:overflow-y-auto", _ && "hidden md:block", v),
|
|
33
41
|
style: {
|
|
34
|
-
"--dishui-aside-w":
|
|
42
|
+
"--dishui-aside-w": l(m),
|
|
35
43
|
...y
|
|
36
44
|
},
|
|
37
45
|
...x,
|
|
38
46
|
children: b
|
|
39
47
|
})
|
|
40
48
|
});
|
|
41
|
-
return r ? /* @__PURE__ */
|
|
49
|
+
return r ? /* @__PURE__ */ s(i, {
|
|
42
50
|
panel: S,
|
|
43
51
|
resizeVariant: n,
|
|
44
|
-
minWidth:
|
|
45
|
-
maxWidth:
|
|
46
|
-
onWidthChange:
|
|
52
|
+
minWidth: a,
|
|
53
|
+
maxWidth: o,
|
|
54
|
+
onWidthChange: c
|
|
47
55
|
}) : S;
|
|
48
|
-
},
|
|
49
|
-
|
|
56
|
+
}, h = ({ levels: e, ...t }) => e === void 0 ? g(t) : /* @__PURE__ */ s(o, { children: e.map(({ key: e, ...n }) => /* @__PURE__ */ a(g, {
|
|
57
|
+
...t,
|
|
58
|
+
...n,
|
|
59
|
+
key: e
|
|
60
|
+
})) }), g = ({ resizeVariant: n = "pill", resizable: r = !1, minWidth: a = 160, maxWidth: o = 600, onWidthChange: c, open: u, mode: d, animated: f, duration: p, width: m = 320, bordered: h = !0, scroll: g = !0, hideOnMobile: _ = !1, className: v = "", style: y, children: b, ...x }) => {
|
|
61
|
+
let S = /* @__PURE__ */ s(t, {
|
|
50
62
|
edge: "right",
|
|
51
63
|
width: y?.width ?? m,
|
|
52
64
|
hideOnMobile: _,
|
|
@@ -54,59 +66,59 @@ var s = (e) => typeof e == "number" ? `${e}px` : e, c = ({ fullHeight: t = !1, c
|
|
|
54
66
|
mode: d,
|
|
55
67
|
animated: f,
|
|
56
68
|
duration: p,
|
|
57
|
-
children: /* @__PURE__ */
|
|
69
|
+
children: /* @__PURE__ */ s("aside", {
|
|
58
70
|
className: e("dishui-page-right w-full shrink-0 md:w-(--dishui-aside-w)", h && "md:border-l md:border-base-300 md:pl-4", g && "md:min-h-0 md:overflow-y-auto", _ && "hidden md:block", v),
|
|
59
71
|
style: {
|
|
60
|
-
"--dishui-aside-w":
|
|
72
|
+
"--dishui-aside-w": l(m),
|
|
61
73
|
...y
|
|
62
74
|
},
|
|
63
75
|
...x,
|
|
64
76
|
children: b
|
|
65
77
|
})
|
|
66
78
|
});
|
|
67
|
-
return r ? /* @__PURE__ */
|
|
79
|
+
return r ? /* @__PURE__ */ s(i, {
|
|
68
80
|
panel: S,
|
|
69
81
|
resizeVariant: n,
|
|
70
|
-
minWidth:
|
|
71
|
-
maxWidth:
|
|
72
|
-
onWidthChange:
|
|
82
|
+
minWidth: a,
|
|
83
|
+
maxWidth: o,
|
|
84
|
+
onWidthChange: c
|
|
73
85
|
}) : S;
|
|
74
|
-
},
|
|
86
|
+
}, _ = ({ open: n, mode: r, animated: i, duration: a, autoHide: o, className: l, children: u, left: d, center: f, right: p, ...m }) => /* @__PURE__ */ s(t, {
|
|
75
87
|
edge: "footer",
|
|
76
|
-
autoHide:
|
|
88
|
+
autoHide: o,
|
|
77
89
|
open: n,
|
|
78
90
|
mode: r,
|
|
79
91
|
animated: i,
|
|
80
|
-
duration:
|
|
81
|
-
children: /* @__PURE__ */
|
|
92
|
+
duration: a,
|
|
93
|
+
children: /* @__PURE__ */ s("footer", {
|
|
82
94
|
className: e("dishui-page-footer", l),
|
|
83
95
|
...m,
|
|
84
|
-
children: u === void 0 ? /* @__PURE__ */
|
|
96
|
+
children: u === void 0 ? /* @__PURE__ */ c("div", {
|
|
85
97
|
className: "dishui-page-header-layout",
|
|
86
98
|
"data-centered": f != null && f !== !1 || void 0,
|
|
87
99
|
children: [
|
|
88
|
-
d != null && /* @__PURE__ */
|
|
100
|
+
d != null && /* @__PURE__ */ s("div", {
|
|
89
101
|
className: "dishui-page-header-left",
|
|
90
102
|
children: d
|
|
91
103
|
}),
|
|
92
|
-
f != null && /* @__PURE__ */
|
|
104
|
+
f != null && /* @__PURE__ */ s("div", {
|
|
93
105
|
className: "dishui-page-header-center",
|
|
94
106
|
children: f
|
|
95
107
|
}),
|
|
96
|
-
p != null && /* @__PURE__ */
|
|
108
|
+
p != null && /* @__PURE__ */ s("div", {
|
|
97
109
|
className: "dishui-page-header-right",
|
|
98
110
|
children: p
|
|
99
111
|
})
|
|
100
112
|
]
|
|
101
113
|
}) : u
|
|
102
114
|
})
|
|
103
|
-
}),
|
|
115
|
+
}), v = ({ scroll: t = !1, className: n = "", children: r, ...i }) => /* @__PURE__ */ s("main", {
|
|
104
116
|
className: e("dishui-page-main min-w-0 flex-1", t && "min-h-0 overflow-y-auto", n),
|
|
105
117
|
...i,
|
|
106
118
|
children: r
|
|
107
|
-
}),
|
|
108
|
-
|
|
119
|
+
}), y = u;
|
|
120
|
+
y.Header = d, y.Footer = _, y.Float = r, y.Body = f, y.Left = p, y.Right = h, y.Main = v;
|
|
109
121
|
//#endregion
|
|
110
|
-
export {
|
|
122
|
+
export { f as PageBody, r as PageFloat, _ as PageFooter, p as PageLeft, v as PageMain, h as PageRight, y as default };
|
|
111
123
|
|
|
112
124
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Page/index.tsx"],"sourcesContent":["import React from 'react';\nimport PageFloat from './Float';\nimport ResizableAside, { type PageResizeProps } from './resize';\nexport type { PageFloatProps } from './Float';\nimport PageHeader, { PageHeaderProps } from '../PageHeader';\nimport { cn } from '../../utils/cn';\nimport PagePanel, { type PagePanelProps, type PageAutoHideProps } from '../PagePanel';\n\nexport type { PagePanelProps } from '../PagePanel';\n\n/**\n * Page 布局脚手架\n * ----------------------------------------------------------------------------\n * 为管理后台等页面提供统一的「页头 + 主体 + 左右侧栏」骨架,配合 PageHeader、\n * Card.Info 等组件使用。所有区域都是可选的,可按需组合。\n *\n * 典型结构:\n * <Page fullHeight>\n * <Page.Header title=\"用户管理\" actions={<Button>新建</Button>} />\n * <Page.Body scroll>\n * <Page.Left width={240}>筛选器</Page.Left>\n * <Page.Main scroll>主内容</Page.Main>\n * <Page.Right width={320}>详情</Page.Right>\n * </Page.Body>\n * </Page>\n */\n\nexport type PageProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 是否占满父容器高度并启用内部滚动(主体区滚动,页头固定) */\n fullHeight?: boolean;\n};\n\nexport type PageBodyProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 主体内的间距(left/main/right 之间),数字按 px 处理,默认 16 */\n gap?: number | string;\n /** 是否让主体区在剩余空间内滚动(配合 Page fullHeight 使用) */\n scroll?: boolean;\n};\n\nexport type PageAsideProps = React.HTMLAttributes<HTMLDivElement> & PagePanelProps & PageResizeProps & {\n /** 侧栏宽度,数字按 px 处理;Left 默认 260,Right 默认 320。外部变化会同步到拖动宽度。 */\n width?: number | string;\n /** 是否显示分隔边框 */\n bordered?: boolean;\n /** 侧栏内部纵向滚动自适应 */\n scroll?: boolean;\n /** 小屏(<768px)下是否隐藏(侧栏通常在移动端折叠) */\n hideOnMobile?: boolean;\n};\n\nexport type PageMainProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 主内容区是否在剩余空间内纵向滚动 */\n scroll?: boolean;\n};\n\nconst toCssSize = (value: number | string | undefined): string | undefined =>\n typeof value === 'number' ? `${value}px` : value;\n\nconst Page = ({ fullHeight = false, className = '', children, ...rest }: PageProps) => (\n <div\n className={cn(\n 'dishui-page flex w-full min-w-0 flex-col text-body leading-5 text-base-content',\n fullHeight && 'h-full min-h-0',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n);\n\n/** 页头:直接复用 PageHeader,作为 Page.Header 使用 */\nconst PageHeaderSlot = (props: PageHeaderProps) => <PageHeader {...props} />;\n\nconst PageBody = ({ gap = 16, scroll = false, className = '', style, children, ...rest }: PageBodyProps) => (\n <div\n className={cn(\n 'dishui-page-body flex w-full flex-col md:flex-row',\n scroll && 'min-h-0 flex-1',\n className,\n )}\n style={{ ...style, gap: 0, ['--dishui-page-gap' as string]: toCssSize(style?.gap ?? gap) }}\n {...rest}\n >\n {children}\n </div>\n);\n\nconst PageLeft = ({\n resizeVariant = 'pill', resizable = false, minWidth = 160, maxWidth = 600, onWidthChange,\n open, mode, animated, duration,\n width = 260,\n bordered = true,\n scroll = true,\n hideOnMobile = false,\n className = '',\n style,\n children,\n ...rest\n}: PageAsideProps) => {\n const panel = <PagePanel edge=\"left\" width={style?.width ?? width} hideOnMobile={hideOnMobile} open={open} mode={mode} animated={animated} duration={duration}>\n <aside\n className={cn(\n 'dishui-page-left w-full shrink-0 md:w-(--dishui-aside-w)',\n bordered && 'md:border-r md:border-base-300 md:pr-4',\n scroll && 'md:min-h-0 md:overflow-y-auto',\n hideOnMobile && 'hidden md:block',\n className,\n )}\n style={{ ['--dishui-aside-w' as string]: toCssSize(width), ...style }}\n {...rest}\n >\n {children}\n </aside>\n </PagePanel>;\n return resizable ? <ResizableAside panel={panel} resizeVariant={resizeVariant} minWidth={minWidth} maxWidth={maxWidth} onWidthChange={onWidthChange} /> : panel;\n};\n\nconst PageRight = ({\n resizeVariant = 'pill', resizable = false, minWidth = 160, maxWidth = 600, onWidthChange,\n open, mode, animated, duration,\n width = 320,\n bordered = true,\n scroll = true,\n hideOnMobile = false,\n className = '',\n style,\n children,\n ...rest\n}: PageAsideProps) => {\n const panel = <PagePanel edge=\"right\" width={style?.width ?? width} hideOnMobile={hideOnMobile} open={open} mode={mode} animated={animated} duration={duration}>\n <aside\n className={cn(\n 'dishui-page-right w-full shrink-0 md:w-(--dishui-aside-w)',\n bordered && 'md:border-l md:border-base-300 md:pl-4',\n scroll && 'md:min-h-0 md:overflow-y-auto',\n hideOnMobile && 'hidden md:block',\n className,\n )}\n style={{ ['--dishui-aside-w' as string]: toCssSize(width), ...style }}\n {...rest}\n >\n {children}\n </aside>\n </PagePanel>;\n return resizable ? <ResizableAside panel={panel} resizeVariant={resizeVariant} minWidth={minWidth} maxWidth={maxWidth} onWidthChange={onWidthChange} /> : panel;\n};\n\nexport type PageFooterProps = React.HTMLAttributes<HTMLElement> & PagePanelProps & PageAutoHideProps & {\n left?: React.ReactNode;\n center?: React.ReactNode;\n right?: React.ReactNode;\n};\n\nconst PageFooter = ({\n open, mode, animated, duration, autoHide, className, children, left, center, right, ...rest\n}: PageFooterProps) => (\n <PagePanel edge=\"footer\" autoHide={autoHide} open={open} mode={mode} animated={animated} duration={duration}>\n <footer className={cn('dishui-page-footer', className)} {...rest}>\n {children !== undefined ? children : (\n <div className=\"dishui-page-header-layout\" data-centered={center != null && center !== false || undefined}>\n {left != null && <div className=\"dishui-page-header-left\">{left}</div>}\n {center != null && <div className=\"dishui-page-header-center\">{center}</div>}\n {right != null && <div className=\"dishui-page-header-right\">{right}</div>}\n </div>\n )}\n </footer>\n </PagePanel>\n);\n\nconst PageMain = ({ scroll = false, className = '', children, ...rest }: PageMainProps) => (\n <main\n className={cn(\n 'dishui-page-main min-w-0 flex-1',\n scroll && 'min-h-0 overflow-y-auto',\n className,\n )}\n {...rest}\n >\n {children}\n </main>\n);\n\ninterface PageCompound extends React.FC<PageProps> {\n Header: typeof PageHeaderSlot;\n Footer: typeof PageFooter;\n Float: typeof PageFloat;\n Body: typeof PageBody;\n Left: typeof PageLeft;\n Right: typeof PageRight;\n Main: typeof PageMain;\n}\n\nconst PageWithCompounds = Page as PageCompound;\nPageWithCompounds.Header = PageHeaderSlot;\nPageWithCompounds.Footer = PageFooter;\nPageWithCompounds.Float = PageFloat;\nPageWithCompounds.Body = PageBody;\nPageWithCompounds.Left = PageLeft;\nPageWithCompounds.Right = PageRight;\nPageWithCompounds.Main = PageMain;\n\nexport { PageBody, PageLeft, PageRight, PageMain, PageFooter, PageFloat };\nexport default PageWithCompounds;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Page/index.tsx"],"sourcesContent":["import React from 'react';\nimport PageFloat from './Float';\nimport ResizableAside, { type PageResizeProps } from './resize';\nexport type { PageFloatProps } from './Float';\nimport PageHeader, { PageHeaderProps } from '../PageHeader';\nimport { cn } from '../../utils/cn';\nimport PagePanel, { type PagePanelProps, type PageAutoHideProps } from '../PagePanel';\n\nexport type { PagePanelProps } from '../PagePanel';\n\n/**\n * Page 布局脚手架\n * ----------------------------------------------------------------------------\n * 为管理后台等页面提供统一的「页头 + 主体 + 左右侧栏」骨架,配合 PageHeader、\n * Card.Info 等组件使用。所有区域都是可选的,可按需组合。\n *\n * 典型结构:\n * <Page fullHeight>\n * <Page.Header title=\"用户管理\" actions={<Button>新建</Button>} />\n * <Page.Body scroll>\n * <Page.Left width={240}>筛选器</Page.Left>\n * <Page.Main scroll>主内容</Page.Main>\n * <Page.Right width={320}>详情</Page.Right>\n * </Page.Body>\n * </Page>\n */\n\nexport type PageProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 是否占满父容器高度并启用内部滚动(主体区滚动,页头固定) */\n fullHeight?: boolean;\n};\n\nexport type PageBodyProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 主体内的间距(left/main/right 之间),数字按 px 处理,默认 16 */\n gap?: number | string;\n /** 是否让主体区在剩余空间内滚动(配合 Page fullHeight 使用) */\n scroll?: boolean;\n};\n\nexport type PageHeaderLevel = PageHeaderProps & { key: React.Key };\nexport type PageHeaderSlotProps = PageHeaderProps & {\n /** 按顺序从上到下渲染;每级覆盖公共属性。空数组不渲染页头。 */\n levels?: readonly PageHeaderLevel[];\n};\n\nexport type PageAsideLevel = PageAsideProps & { key: React.Key };\nexport type PageAsideSlotProps = PageAsideProps & {\n /** 按 DOM 顺序从左到右渲染(小屏纵向堆叠);每级覆盖公共属性。 */\n levels?: readonly PageAsideLevel[];\n};\n\nexport type PageAsideProps = React.HTMLAttributes<HTMLDivElement> & PagePanelProps & PageResizeProps & {\n /** 侧栏宽度,数字按 px 处理;Left 默认 260,Right 默认 320。外部变化会同步到拖动宽度。 */\n width?: number | string;\n /** 是否显示分隔边框 */\n bordered?: boolean;\n /** 侧栏内部纵向滚动自适应 */\n scroll?: boolean;\n /** 小屏(<768px)下是否隐藏(侧栏通常在移动端折叠) */\n hideOnMobile?: boolean;\n};\n\nexport type PageMainProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 主内容区是否在剩余空间内纵向滚动 */\n scroll?: boolean;\n};\n\nconst toCssSize = (value: number | string | undefined): string | undefined =>\n typeof value === 'number' ? `${value}px` : value;\n\nconst Page = ({ fullHeight = false, className = '', children, ...rest }: PageProps) => (\n <div\n className={cn(\n 'dishui-page flex w-full min-w-0 flex-col text-body leading-5 text-base-content',\n fullHeight && 'h-full min-h-0',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n);\n\n/** 不增加包装节点,保持 Page / Body 的布局、间距及面板开关语义。 */\nconst PageHeaderSlot = ({ levels, ...props }: PageHeaderSlotProps) => levels === undefined\n ? <PageHeader {...props} />\n : <>{levels.map(({ key, ...level }) => <PageHeader {...props} {...level} key={key} />)}</>;\n\nconst PageBody = ({ gap = 16, scroll = false, className = '', style, children, ...rest }: PageBodyProps) => (\n <div\n className={cn(\n 'dishui-page-body flex w-full flex-col md:flex-row',\n scroll && 'min-h-0 flex-1',\n className,\n )}\n style={{ ...style, gap: 0, ['--dishui-page-gap' as string]: toCssSize(style?.gap ?? gap) }}\n {...rest}\n >\n {children}\n </div>\n);\n\nconst PageLeft = ({ levels, ...props }: PageAsideSlotProps): React.ReactElement => levels === undefined\n ? PageLeftPanel(props)\n : <>{levels.map(({ key, ...level }) => <PageLeftPanel {...props} {...level} key={key} />)}</>;\n\nconst PageLeftPanel = ({\n resizeVariant = 'pill', resizable = false, minWidth = 160, maxWidth = 600, onWidthChange,\n open, mode, animated, duration,\n width = 260,\n bordered = true,\n scroll = true,\n hideOnMobile = false,\n className = '',\n style,\n children,\n ...rest\n}: PageAsideProps) => {\n const panel = <PagePanel edge=\"left\" width={style?.width ?? width} hideOnMobile={hideOnMobile} open={open} mode={mode} animated={animated} duration={duration}>\n <aside\n className={cn(\n 'dishui-page-left w-full shrink-0 md:w-(--dishui-aside-w)',\n bordered && 'md:border-r md:border-base-300 md:pr-4',\n scroll && 'md:min-h-0 md:overflow-y-auto',\n hideOnMobile && 'hidden md:block',\n className,\n )}\n style={{ ['--dishui-aside-w' as string]: toCssSize(width), ...style }}\n {...rest}\n >\n {children}\n </aside>\n </PagePanel>;\n return resizable ? <ResizableAside panel={panel} resizeVariant={resizeVariant} minWidth={minWidth} maxWidth={maxWidth} onWidthChange={onWidthChange} /> : panel;\n};\n\nconst PageRight = ({ levels, ...props }: PageAsideSlotProps): React.ReactElement => levels === undefined\n ? PageRightPanel(props)\n : <>{levels.map(({ key, ...level }) => <PageRightPanel {...props} {...level} key={key} />)}</>;\n\nconst PageRightPanel = ({\n resizeVariant = 'pill', resizable = false, minWidth = 160, maxWidth = 600, onWidthChange,\n open, mode, animated, duration,\n width = 320,\n bordered = true,\n scroll = true,\n hideOnMobile = false,\n className = '',\n style,\n children,\n ...rest\n}: PageAsideProps) => {\n const panel = <PagePanel edge=\"right\" width={style?.width ?? width} hideOnMobile={hideOnMobile} open={open} mode={mode} animated={animated} duration={duration}>\n <aside\n className={cn(\n 'dishui-page-right w-full shrink-0 md:w-(--dishui-aside-w)',\n bordered && 'md:border-l md:border-base-300 md:pl-4',\n scroll && 'md:min-h-0 md:overflow-y-auto',\n hideOnMobile && 'hidden md:block',\n className,\n )}\n style={{ ['--dishui-aside-w' as string]: toCssSize(width), ...style }}\n {...rest}\n >\n {children}\n </aside>\n </PagePanel>;\n return resizable ? <ResizableAside panel={panel} resizeVariant={resizeVariant} minWidth={minWidth} maxWidth={maxWidth} onWidthChange={onWidthChange} /> : panel;\n};\n\nexport type PageFooterProps = React.HTMLAttributes<HTMLElement> & PagePanelProps & PageAutoHideProps & {\n left?: React.ReactNode;\n center?: React.ReactNode;\n right?: React.ReactNode;\n};\n\nconst PageFooter = ({\n open, mode, animated, duration, autoHide, className, children, left, center, right, ...rest\n}: PageFooterProps) => (\n <PagePanel edge=\"footer\" autoHide={autoHide} open={open} mode={mode} animated={animated} duration={duration}>\n <footer className={cn('dishui-page-footer', className)} {...rest}>\n {children !== undefined ? children : (\n <div className=\"dishui-page-header-layout\" data-centered={center != null && center !== false || undefined}>\n {left != null && <div className=\"dishui-page-header-left\">{left}</div>}\n {center != null && <div className=\"dishui-page-header-center\">{center}</div>}\n {right != null && <div className=\"dishui-page-header-right\">{right}</div>}\n </div>\n )}\n </footer>\n </PagePanel>\n);\n\nconst PageMain = ({ scroll = false, className = '', children, ...rest }: PageMainProps) => (\n <main\n className={cn(\n 'dishui-page-main min-w-0 flex-1',\n scroll && 'min-h-0 overflow-y-auto',\n className,\n )}\n {...rest}\n >\n {children}\n </main>\n);\n\ninterface PageCompound extends React.FC<PageProps> {\n Header: typeof PageHeaderSlot;\n Footer: typeof PageFooter;\n Float: typeof PageFloat;\n Body: typeof PageBody;\n Left: typeof PageLeft;\n Right: typeof PageRight;\n Main: typeof PageMain;\n}\n\nconst PageWithCompounds = Page as PageCompound;\nPageWithCompounds.Header = PageHeaderSlot;\nPageWithCompounds.Footer = PageFooter;\nPageWithCompounds.Float = PageFloat;\nPageWithCompounds.Body = PageBody;\nPageWithCompounds.Left = PageLeft;\nPageWithCompounds.Right = PageRight;\nPageWithCompounds.Main = PageMain;\n\nexport { PageBody, PageLeft, PageRight, PageMain, PageFooter, PageFloat };\nexport default PageWithCompounds;\n"],"mappings":"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"}
|