dishui 0.0.46 → 0.0.48

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 (115) hide show
  1. package/dist/chart.js +35 -33
  2. package/dist/components/Chart/index.d.ts +1 -1
  3. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +1 -2
  4. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  5. package/dist/components/pro/CodeEditor/themes.js +0 -25
  6. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  7. package/dist/components/pro/CodeEditor/types.d.ts +1 -1
  8. package/dist/components/pro/DataTable/pivotExtension.d.ts +6 -0
  9. package/dist/components/pro/DataTable/pivotExtension.js +31 -30
  10. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  11. package/dist/components/pro/Flow/Flow.js +500 -459
  12. package/dist/components/pro/Flow/Flow.js.map +1 -1
  13. package/dist/components/pro/Flow/FlowCanvas.js +526 -524
  14. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  15. package/dist/components/pro/Flow/canvas/GridRenderer.d.ts +3 -0
  16. package/dist/components/pro/Flow/canvas/GridRenderer.js +28 -23
  17. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  18. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js +18 -17
  19. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  20. package/dist/components/pro/Flow/canvas/PixiApp.d.ts +24 -0
  21. package/dist/components/pro/Flow/canvas/PixiApp.js +60 -15
  22. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  23. package/dist/components/pro/Flow/constants.js +7 -7
  24. package/dist/components/pro/Flow/constants.js.map +1 -1
  25. package/dist/components/pro/Flow/context/FlowAIContext.d.ts +15 -0
  26. package/dist/components/pro/Flow/context/FlowAIContext.js +32 -0
  27. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -0
  28. package/dist/components/pro/Flow/context/FlowUIContext.d.ts +4 -1
  29. package/dist/components/pro/Flow/context/FlowUIContext.js +58 -55
  30. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  31. package/dist/components/pro/Flow/edges/EdgeRenderer.js +22 -21
  32. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  33. package/dist/components/pro/Flow/hooks/useFlowImportExport.d.ts +6 -0
  34. package/dist/components/pro/Flow/hooks/useFlowImportExport.js +146 -89
  35. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  36. package/dist/components/pro/Flow/hooks/useLayoutActions.d.ts +2 -0
  37. package/dist/components/pro/Flow/hooks/useLayoutActions.js +94 -65
  38. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  39. package/dist/components/pro/Flow/hooks/usePdfExport.d.ts +10 -0
  40. package/dist/components/pro/Flow/hooks/usePdfExport.js +60 -0
  41. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -0
  42. package/dist/components/pro/Flow/hooks/usePixiApp.d.ts +6 -1
  43. package/dist/components/pro/Flow/hooks/usePixiApp.js +49 -30
  44. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  45. package/dist/components/pro/Flow/index.d.ts +5 -2
  46. package/dist/components/pro/Flow/lines/FreehandTool.js +21 -20
  47. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  48. package/dist/components/pro/Flow/lines/GeometricLineTool.js +22 -18
  49. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  50. package/dist/components/pro/Flow/lines/LineRenderer.js +19 -18
  51. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  52. package/dist/components/pro/Flow/nodes/DataNodeView.d.ts +7 -0
  53. package/dist/components/pro/Flow/nodes/DataNodeView.js +217 -0
  54. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -0
  55. package/dist/components/pro/Flow/nodes/MediaContent.js +149 -120
  56. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  57. package/dist/components/pro/Flow/nodes/MediaOverlay.js +22 -17
  58. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  59. package/dist/components/pro/Flow/nodes/NodeRenderer.js +77 -76
  60. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  61. package/dist/components/pro/Flow/nodes/aiClient.d.ts +22 -0
  62. package/dist/components/pro/Flow/nodes/aiClient.js +107 -54
  63. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  64. package/dist/components/pro/Flow/nodes/dataUtils.d.ts +52 -0
  65. package/dist/components/pro/Flow/nodes/dataUtils.js +270 -0
  66. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -0
  67. package/dist/components/pro/Flow/nodes/svgIcons.js +59 -27
  68. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  69. package/dist/components/pro/Flow/panels/AIPanel.d.ts +2 -0
  70. package/dist/components/pro/Flow/panels/AIPanel.js +498 -0
  71. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -0
  72. package/dist/components/pro/Flow/panels/DataInspectorSection.d.ts +11 -0
  73. package/dist/components/pro/Flow/panels/DataInspectorSection.js +436 -0
  74. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -0
  75. package/dist/components/pro/Flow/panels/ExpandableTextarea.d.ts +16 -0
  76. package/dist/components/pro/Flow/panels/ExpandableTextarea.js +65 -0
  77. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -0
  78. package/dist/components/pro/Flow/panels/FlowPanelGroup.js +51 -39
  79. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  80. package/dist/components/pro/Flow/panels/FlowToolbar.d.ts +5 -1
  81. package/dist/components/pro/Flow/panels/FlowToolbar.js +310 -233
  82. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  83. package/dist/components/pro/Flow/panels/InspectorPanel.js +358 -363
  84. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  85. package/dist/components/pro/Flow/panels/OutlinePanel.js +63 -62
  86. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  87. package/dist/components/pro/Flow/panels/ProjectTitle.d.ts +8 -0
  88. package/dist/components/pro/Flow/panels/ProjectTitle.js +49 -0
  89. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -0
  90. package/dist/components/pro/Flow/panels/ShapePalette.js +128 -115
  91. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  92. package/dist/components/pro/Flow/panels/toolbarIcons.d.ts +13 -0
  93. package/dist/components/pro/Flow/panels/toolbarIcons.js +241 -87
  94. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  95. package/dist/components/pro/Flow/types.d.ts +77 -1
  96. package/dist/components/pro/Flow/types.js.map +1 -1
  97. package/dist/components/pro/Flow/utils/pdfExport.d.ts +20 -0
  98. package/dist/components/pro/Flow/utils/pdfExport.js +95 -0
  99. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -0
  100. package/dist/components/pro/Flow/utils/themeColor.d.ts +86 -0
  101. package/dist/components/pro/Flow/utils/themeColor.js +190 -0
  102. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -0
  103. package/dist/contexts/AppContext.d.ts +1 -1
  104. package/dist/contexts/AppContext.js +28 -29
  105. package/dist/contexts/AppContext.js.map +1 -1
  106. package/dist/dishui.css +1 -1
  107. package/dist/favicon.svg +10 -0
  108. package/dist/flow.js +59 -51
  109. package/dist/index-nostyled.d.ts +1 -1
  110. package/dist/index.d.ts +1 -1
  111. package/dist/styles/themeStyles.js +6 -11
  112. package/dist/styles/themeStyles.js.map +1 -1
  113. package/dist/utils/themes.js +3 -23
  114. package/dist/utils/themes.js.map +1 -1
  115. package/package.json +17 -18
package/dist/chart.js CHANGED
@@ -1,46 +1,48 @@
1
1
  import o from "./components/Chart/Chart.js";
2
- import { areaX as e, areaY as i, barY as t, cell as m, colorGradientLegend as p, colorLegend as l, defineChart as n, dot as f, group as d, lineY as c, linearRegressionY as s, link as g, rect as L, stack as k, text as Y } from "@tanstack/charts";
3
- import { scaleBand as u } from "@tanstack/charts/scales/band";
2
+ import { areaX as e, areaY as i, barX as t, barY as m, cell as l, colorGradientLegend as p, colorLegend as n, defineChart as f, dot as d, group as c, lineX as s, lineY as g, linearRegressionY as L, link as k, rect as Y, stack as h, text as u } from "@tanstack/charts";
3
+ import { scaleBand as X } from "@tanstack/charts/scales/band";
4
4
  import { scaleLinear as y } from "@tanstack/charts/scales/linear";
5
5
  import { scalePoint as D } from "@tanstack/charts/scales/point";
6
- import { scaleOrdinal as A } from "@tanstack/charts/scales/ordinal";
7
- import { geoShape as G } from "@tanstack/charts/geo";
8
- import { treemap as P } from "@tanstack/charts/hierarchy/treemap";
9
- import { delaunayLink as S } from "@tanstack/charts/spatial/delaunay";
10
- import { pie as j, polar as q, radialArc as v, radialDot as w, radialLine as z } from "@tanstack/charts/polar";
11
- import { sankeyDiagram as F } from "@tanstack/charts/network/sankey";
12
- import { tooltip as I } from "@tanstack/charts/tooltip";
6
+ import { scaleOrdinal as B } from "@tanstack/charts/scales/ordinal";
7
+ import { geoShape as O } from "@tanstack/charts/geo";
8
+ import { treemap as R } from "@tanstack/charts/hierarchy/treemap";
9
+ import { delaunayLink as j } from "@tanstack/charts/spatial/delaunay";
10
+ import { pie as v, polar as w, radialArc as z, radialDot as E, radialLine as F } from "@tanstack/charts/polar";
11
+ import { sankeyDiagram as I } from "@tanstack/charts/network/sankey";
12
+ import { tooltip as K } from "@tanstack/charts/tooltip";
13
13
  export * from "@tanstack/react-charts";
14
14
  export {
15
15
  o as Chart,
16
16
  e as areaX,
17
17
  i as areaY,
18
- t as barY,
19
- m as cell,
18
+ t as barX,
19
+ m as barY,
20
+ l as cell,
20
21
  p as colorGradientLegend,
21
- l as colorLegend,
22
+ n as colorLegend,
22
23
  o as default,
23
- n as defineChart,
24
- S as delaunayLink,
25
- f as dot,
26
- G as geoShape,
27
- d as group,
28
- c as lineY,
29
- s as linearRegressionY,
30
- g as link,
31
- j as pie,
32
- q as polar,
33
- v as radialArc,
34
- w as radialDot,
35
- z as radialLine,
36
- L as rect,
37
- F as sankeyDiagram,
38
- u as scaleBand,
24
+ f as defineChart,
25
+ j as delaunayLink,
26
+ d as dot,
27
+ O as geoShape,
28
+ c as group,
29
+ s as lineX,
30
+ g as lineY,
31
+ L as linearRegressionY,
32
+ k as link,
33
+ v as pie,
34
+ w as polar,
35
+ z as radialArc,
36
+ E as radialDot,
37
+ F as radialLine,
38
+ Y as rect,
39
+ I as sankeyDiagram,
40
+ X as scaleBand,
39
41
  y as scaleLinear,
40
- A as scaleOrdinal,
42
+ B as scaleOrdinal,
41
43
  D as scalePoint,
42
- k as stack,
43
- Y as text,
44
- I as tooltip,
45
- P as treemap
44
+ h as stack,
45
+ u as text,
46
+ K as tooltip,
47
+ R as treemap
46
48
  };
@@ -2,7 +2,7 @@ export { default } from './Chart';
2
2
  export { default as Chart } from './Chart';
3
3
  export type { ChartProps } from './Chart';
4
4
  export * from '@tanstack/react-charts';
5
- export { areaX, areaY, barY, cell, colorGradientLegend, colorLegend, defineChart, dot, group, linearRegressionY, lineY, link, rect, stack, text, } from '@tanstack/charts';
5
+ export { areaX, areaY, barX, barY, cell, colorGradientLegend, colorLegend, defineChart, dot, group, linearRegressionY, lineX, lineY, link, rect, stack, text, } from '@tanstack/charts';
6
6
  export { scaleBand } from '@tanstack/charts/scales/band';
7
7
  export { scaleLinear } from '@tanstack/charts/scales/linear';
8
8
  export { scalePoint } from '@tanstack/charts/scales/point';
@@ -125,8 +125,7 @@ var I = (o) => {
125
125
  "dark",
126
126
  "retro",
127
127
  "cyberpunk",
128
- "matrix",
129
- "shadcn-dark"
128
+ "matrix"
130
129
  ].includes(m.theme || "light") ? "markdown-sidebar-dark" : "markdown-sidebar-light"}`,
131
130
  style: { width: "320px" },
132
131
  children: [i && /* @__PURE__ */ p(S, {
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEditor.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/editors/MarkdownEditor.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport CodeEditor, { CodeEditorProps, ContextMenuItem } from './CodeEditor';\nimport TableOfContentsPanel from '../panels/TableOfContentsPanel';\nimport FootnotePanel from '../panels/FootnotePanel';\nimport {\n markdownExtensions,\n extractMarkdownSections,\n extractFootnotes,\n MarkdownSection,\n FootnoteInfo,\n} from './markdownExtensions';\nimport { EditorView } from '@codemirror/view';\n\nexport interface MarkdownEditorProps extends Omit<CodeEditorProps, 'language' | 'extensions' | 'autocompletion' | 'contextMenu'> {\n showTableOfContents?: boolean;\n showFootnotes?: boolean;\n onSectionsChange?: (sections: MarkdownSection[]) => void;\n onFootnotesChange?: (footnotes: FootnoteInfo[]) => void;\n tableOfContentsPosition?: 'left' | 'right';\n customExtensions?: CodeEditorProps['extensions'];\n customContextMenu?: ContextMenuItem[];\n}\n\n// 表格格式化函数\nconst formatMarkdownTable = (tableText: string): string => {\n const lines = tableText.split('\\n').filter(line => line.trim());\n if (lines.length < 2) return tableText;\n\n // 解析表格\n const rows = lines.map(line => {\n return line.split('|')\n .map(cell => cell.trim())\n .filter((_, i, arr) => i > 0 && i < arr.length - 1); // 移除首尾空元素\n });\n\n // 计算每列的最大宽度\n const colWidths: number[] = [];\n rows.forEach(row => {\n row.forEach((cell, i) => {\n colWidths[i] = Math.max(colWidths[i] || 0, cell.length);\n });\n });\n\n // 格式化每一行\n const formattedRows = rows.map((row, rowIndex) => {\n const cells = row.map((cell, colIndex) => {\n // 对于分隔行,保持对齐标记\n if (rowIndex === 1 && cell.match(/^:?-+:?$/)) {\n const hasLeft = cell.startsWith(':');\n const hasRight = cell.endsWith(':');\n const width = colWidths[colIndex];\n\n if (hasLeft && hasRight) {\n return ':' + '-'.repeat(width - 2) + ':';\n } else if (hasLeft) {\n return ':' + '-'.repeat(width - 1);\n } else if (hasRight) {\n return '-'.repeat(width - 1) + ':';\n } else {\n return '-'.repeat(width);\n }\n }\n\n return cell.padEnd(colWidths[colIndex], ' ');\n });\n\n return '| ' + cells.join(' | ') + ' |';\n });\n\n return formattedRows.join('\\n');\n};\n\n// 检测是否在表格中\nconst isInTable = (view: EditorView, pos: number): { start: number; end: number; text: string } | null => {\n const line = view.state.doc.lineAt(pos);\n const lineText = line.text;\n\n if (!lineText.includes('|')) return null;\n\n // 向上查找表格开始\n let startLine = line.number;\n let currentLine = line.number - 1;\n while (currentLine >= 1) {\n const l = view.state.doc.line(currentLine);\n if (!l.text.includes('|')) break;\n startLine = currentLine;\n currentLine--;\n }\n\n // 向下查找表格结束\n let endLine = line.number;\n currentLine = line.number + 1;\n const totalLines = view.state.doc.lines;\n while (currentLine <= totalLines) {\n const l = view.state.doc.line(currentLine);\n if (!l.text.includes('|')) break;\n endLine = currentLine;\n currentLine++;\n }\n\n const startLineObj = view.state.doc.line(startLine);\n const endLineObj = view.state.doc.line(endLine);\n\n return {\n start: startLineObj.from,\n end: endLineObj.to,\n text: view.state.doc.sliceString(startLineObj.from, endLineObj.to),\n };\n};\n\nconst MarkdownEditor: React.FC<MarkdownEditorProps> = ({\n value = '',\n onChange,\n showTableOfContents = true,\n showFootnotes = true,\n onSectionsChange,\n onFootnotesChange,\n tableOfContentsPosition = 'right',\n customExtensions = [],\n customContextMenu = [],\n ...codeEditorProps\n}) => {\n const [sections, setSections] = useState<MarkdownSection[]>([]);\n const [footnotes, setFootnotes] = useState<FootnoteInfo[]>([]);\n const [currentLine, setCurrentLine] = useState(1);\n const editorViewRef = useRef<EditorView | null>(null);\n\n // 提取章节和脚注\n useEffect(() => {\n const newSections = extractMarkdownSections(value);\n const newFootnotes = extractFootnotes(value);\n\n setSections(newSections);\n setFootnotes(newFootnotes);\n\n if (onSectionsChange) {\n onSectionsChange(newSections);\n }\n\n if (onFootnotesChange) {\n onFootnotesChange(newFootnotes);\n }\n }, [value, onSectionsChange, onFootnotesChange]);\n\n // 跳转到指定行\n const jumpToLine = useCallback((line: number) => {\n const lineElement = document.querySelector(`.cm-line:nth-child(${line})`);\n if (lineElement) {\n lineElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }, []);\n\n // Markdown 专属上下文菜单\n const markdownContextMenu: ContextMenuItem[] = [\n {\n label: '格式化表格',\n action: (view) => {\n const selection = view.state.selection.main;\n const tableInfo = isInTable(view, selection.from);\n\n if (tableInfo) {\n const formatted = formatMarkdownTable(tableInfo.text);\n view.dispatch({\n changes: {\n from: tableInfo.start,\n to: tableInfo.end,\n insert: formatted,\n },\n });\n } else {\n alert('请将光标放在表格中');\n }\n },\n },\n { label: '', action: () => { }, separator: true },\n {\n label: '剪切',\n action: (view) => {\n const selection = view.state.selection.main;\n const text = view.state.sliceDoc(selection.from, selection.to);\n navigator.clipboard.writeText(text);\n view.dispatch({\n changes: { from: selection.from, to: selection.to, insert: '' },\n });\n },\n },\n {\n label: '复制',\n action: (view) => {\n const selection = view.state.selection.main;\n const text = view.state.sliceDoc(selection.from, selection.to);\n navigator.clipboard.writeText(text);\n },\n },\n {\n label: '粘贴',\n action: async (view) => {\n const text = await navigator.clipboard.readText();\n const selection = view.state.selection.main;\n view.dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n });\n },\n },\n { label: '', action: () => { }, separator: true },\n {\n label: '全选',\n action: (view) => {\n view.dispatch({\n selection: { anchor: 0, head: view.state.doc.length },\n });\n },\n },\n ...customContextMenu,\n ];\n\n // 合并扩展\n const allExtensions = [...markdownExtensions(), ...customExtensions];\n\n // 侧边栏内容\n const renderSidebar = () => {\n // 根据主题决定侧边栏的样式类\n const darkThemes = ['dark', 'retro', 'cyberpunk', 'matrix', 'shadcn-dark'];\n const sidebarThemeClass =\n darkThemes.includes(codeEditorProps.theme || 'light')\n ? 'markdown-sidebar-dark'\n : 'markdown-sidebar-light';\n\n return (\n <div className={`markdown-sidebar space-y-4 ${sidebarThemeClass}`} style={{ width: '320px' }}>\n {showTableOfContents && (\n <TableOfContentsPanel\n sections={sections}\n onSectionClick={jumpToLine}\n currentLine={currentLine}\n theme={codeEditorProps.theme}\n />\n )}\n {showFootnotes && footnotes.length > 0 && (\n <FootnotePanel\n footnotes={footnotes}\n onFootnoteClick={jumpToLine}\n onJumpToDefinition={(id, line) => {\n console.log(`Jumping to definition of footnote ${id} at line ${line}`);\n jumpToLine(line);\n }}\n onJumpToReference={(id, line) => {\n console.log(`Jumping to reference of footnote ${id} at line ${line}`);\n jumpToLine(line);\n }}\n theme={codeEditorProps.theme}\n />\n )}\n </div>\n );\n };\n\n return (\n <div className=\"markdown-editor-wrapper flex gap-4\">\n {/* 左侧边栏 */}\n {tableOfContentsPosition === 'left' && (showTableOfContents || showFootnotes) && renderSidebar()}\n\n {/* 编辑器 */}\n <div className=\"markdown-editor-main flex-1\">\n <CodeEditor\n {...codeEditorProps}\n value={value}\n onChange={onChange}\n language=\"markdown\"\n autocompletion={false}\n extensions={allExtensions}\n contextMenu={markdownContextMenu}\n />\n </div>\n\n {/* 右侧边栏 */}\n {tableOfContentsPosition === 'right' && (showTableOfContents || showFootnotes) && renderSidebar()}\n\n {/* 侧边栏主题样式 */}\n <style>{`\n .markdown-sidebar-light {\n color: #000000;\n }\n .markdown-sidebar-dark {\n color: #d4d4d4;\n }\n .markdown-sidebar-dark .card,\n .markdown-sidebar-dark .toc-panel,\n .markdown-sidebar-dark .footnote-panel,\n .markdown-sidebar-dark .outline-panel,\n .markdown-sidebar-dark .variable-panel {\n background-color: #1e1e1e !important;\n border-color: #3e3e42 !important;\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark .border-base-300 {\n border-color: #3e3e42 !important;\n }\n .markdown-sidebar-dark input,\n .markdown-sidebar-dark .input {\n background-color: #2d2d2d !important;\n border-color: #3e3e42 !important;\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark button,\n .markdown-sidebar-dark .btn {\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark .hover\\\\:bg-base-200:hover,\n .markdown-sidebar-dark .toc-item:hover,\n .markdown-sidebar-dark .outline-item:hover,\n .markdown-sidebar-dark .variable-item:hover,\n .markdown-sidebar-dark .footnote-item:hover {\n background-color: #2d2d2d !important;\n }\n .markdown-sidebar-dark .bg-primary\\\\/20 {\n background-color: rgba(96, 165, 250, 0.2) !important;\n }\n .markdown-sidebar-dark .bg-base-200 {\n background-color: #2d2d2d !important;\n }\n .markdown-sidebar-dark .bg-warning\\\\/10 {\n background-color: rgba(251, 191, 36, 0.1) !important;\n }\n .markdown-sidebar-dark .border-warning\\\\/30 {\n border-color: rgba(251, 191, 36, 0.3) !important;\n }\n .markdown-sidebar-dark .text-warning {\n color: #fbbf24 !important;\n }\n `}</style>\n </div>\n );\n};\n\nexport default MarkdownEditor;\n"],"mappings":"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"}
1
+ {"version":3,"file":"MarkdownEditor.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/editors/MarkdownEditor.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport CodeEditor, { CodeEditorProps, ContextMenuItem } from './CodeEditor';\nimport TableOfContentsPanel from '../panels/TableOfContentsPanel';\nimport FootnotePanel from '../panels/FootnotePanel';\nimport {\n markdownExtensions,\n extractMarkdownSections,\n extractFootnotes,\n MarkdownSection,\n FootnoteInfo,\n} from './markdownExtensions';\nimport { EditorView } from '@codemirror/view';\n\nexport interface MarkdownEditorProps extends Omit<CodeEditorProps, 'language' | 'extensions' | 'autocompletion' | 'contextMenu'> {\n showTableOfContents?: boolean;\n showFootnotes?: boolean;\n onSectionsChange?: (sections: MarkdownSection[]) => void;\n onFootnotesChange?: (footnotes: FootnoteInfo[]) => void;\n tableOfContentsPosition?: 'left' | 'right';\n customExtensions?: CodeEditorProps['extensions'];\n customContextMenu?: ContextMenuItem[];\n}\n\n// 表格格式化函数\nconst formatMarkdownTable = (tableText: string): string => {\n const lines = tableText.split('\\n').filter(line => line.trim());\n if (lines.length < 2) return tableText;\n\n // 解析表格\n const rows = lines.map(line => {\n return line.split('|')\n .map(cell => cell.trim())\n .filter((_, i, arr) => i > 0 && i < arr.length - 1); // 移除首尾空元素\n });\n\n // 计算每列的最大宽度\n const colWidths: number[] = [];\n rows.forEach(row => {\n row.forEach((cell, i) => {\n colWidths[i] = Math.max(colWidths[i] || 0, cell.length);\n });\n });\n\n // 格式化每一行\n const formattedRows = rows.map((row, rowIndex) => {\n const cells = row.map((cell, colIndex) => {\n // 对于分隔行,保持对齐标记\n if (rowIndex === 1 && cell.match(/^:?-+:?$/)) {\n const hasLeft = cell.startsWith(':');\n const hasRight = cell.endsWith(':');\n const width = colWidths[colIndex];\n\n if (hasLeft && hasRight) {\n return ':' + '-'.repeat(width - 2) + ':';\n } else if (hasLeft) {\n return ':' + '-'.repeat(width - 1);\n } else if (hasRight) {\n return '-'.repeat(width - 1) + ':';\n } else {\n return '-'.repeat(width);\n }\n }\n\n return cell.padEnd(colWidths[colIndex], ' ');\n });\n\n return '| ' + cells.join(' | ') + ' |';\n });\n\n return formattedRows.join('\\n');\n};\n\n// 检测是否在表格中\nconst isInTable = (view: EditorView, pos: number): { start: number; end: number; text: string } | null => {\n const line = view.state.doc.lineAt(pos);\n const lineText = line.text;\n\n if (!lineText.includes('|')) return null;\n\n // 向上查找表格开始\n let startLine = line.number;\n let currentLine = line.number - 1;\n while (currentLine >= 1) {\n const l = view.state.doc.line(currentLine);\n if (!l.text.includes('|')) break;\n startLine = currentLine;\n currentLine--;\n }\n\n // 向下查找表格结束\n let endLine = line.number;\n currentLine = line.number + 1;\n const totalLines = view.state.doc.lines;\n while (currentLine <= totalLines) {\n const l = view.state.doc.line(currentLine);\n if (!l.text.includes('|')) break;\n endLine = currentLine;\n currentLine++;\n }\n\n const startLineObj = view.state.doc.line(startLine);\n const endLineObj = view.state.doc.line(endLine);\n\n return {\n start: startLineObj.from,\n end: endLineObj.to,\n text: view.state.doc.sliceString(startLineObj.from, endLineObj.to),\n };\n};\n\nconst MarkdownEditor: React.FC<MarkdownEditorProps> = ({\n value = '',\n onChange,\n showTableOfContents = true,\n showFootnotes = true,\n onSectionsChange,\n onFootnotesChange,\n tableOfContentsPosition = 'right',\n customExtensions = [],\n customContextMenu = [],\n ...codeEditorProps\n}) => {\n const [sections, setSections] = useState<MarkdownSection[]>([]);\n const [footnotes, setFootnotes] = useState<FootnoteInfo[]>([]);\n const [currentLine, setCurrentLine] = useState(1);\n const editorViewRef = useRef<EditorView | null>(null);\n\n // 提取章节和脚注\n useEffect(() => {\n const newSections = extractMarkdownSections(value);\n const newFootnotes = extractFootnotes(value);\n\n setSections(newSections);\n setFootnotes(newFootnotes);\n\n if (onSectionsChange) {\n onSectionsChange(newSections);\n }\n\n if (onFootnotesChange) {\n onFootnotesChange(newFootnotes);\n }\n }, [value, onSectionsChange, onFootnotesChange]);\n\n // 跳转到指定行\n const jumpToLine = useCallback((line: number) => {\n const lineElement = document.querySelector(`.cm-line:nth-child(${line})`);\n if (lineElement) {\n lineElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }, []);\n\n // Markdown 专属上下文菜单\n const markdownContextMenu: ContextMenuItem[] = [\n {\n label: '格式化表格',\n action: (view) => {\n const selection = view.state.selection.main;\n const tableInfo = isInTable(view, selection.from);\n\n if (tableInfo) {\n const formatted = formatMarkdownTable(tableInfo.text);\n view.dispatch({\n changes: {\n from: tableInfo.start,\n to: tableInfo.end,\n insert: formatted,\n },\n });\n } else {\n alert('请将光标放在表格中');\n }\n },\n },\n { label: '', action: () => { }, separator: true },\n {\n label: '剪切',\n action: (view) => {\n const selection = view.state.selection.main;\n const text = view.state.sliceDoc(selection.from, selection.to);\n navigator.clipboard.writeText(text);\n view.dispatch({\n changes: { from: selection.from, to: selection.to, insert: '' },\n });\n },\n },\n {\n label: '复制',\n action: (view) => {\n const selection = view.state.selection.main;\n const text = view.state.sliceDoc(selection.from, selection.to);\n navigator.clipboard.writeText(text);\n },\n },\n {\n label: '粘贴',\n action: async (view) => {\n const text = await navigator.clipboard.readText();\n const selection = view.state.selection.main;\n view.dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n });\n },\n },\n { label: '', action: () => { }, separator: true },\n {\n label: '全选',\n action: (view) => {\n view.dispatch({\n selection: { anchor: 0, head: view.state.doc.length },\n });\n },\n },\n ...customContextMenu,\n ];\n\n // 合并扩展\n const allExtensions = [...markdownExtensions(), ...customExtensions];\n\n // 侧边栏内容\n const renderSidebar = () => {\n // 根据主题决定侧边栏的样式类\n const darkThemes = ['dark', 'retro', 'cyberpunk', 'matrix'];\n const sidebarThemeClass =\n darkThemes.includes(codeEditorProps.theme || 'light')\n ? 'markdown-sidebar-dark'\n : 'markdown-sidebar-light';\n\n return (\n <div className={`markdown-sidebar space-y-4 ${sidebarThemeClass}`} style={{ width: '320px' }}>\n {showTableOfContents && (\n <TableOfContentsPanel\n sections={sections}\n onSectionClick={jumpToLine}\n currentLine={currentLine}\n theme={codeEditorProps.theme}\n />\n )}\n {showFootnotes && footnotes.length > 0 && (\n <FootnotePanel\n footnotes={footnotes}\n onFootnoteClick={jumpToLine}\n onJumpToDefinition={(id, line) => {\n console.log(`Jumping to definition of footnote ${id} at line ${line}`);\n jumpToLine(line);\n }}\n onJumpToReference={(id, line) => {\n console.log(`Jumping to reference of footnote ${id} at line ${line}`);\n jumpToLine(line);\n }}\n theme={codeEditorProps.theme}\n />\n )}\n </div>\n );\n };\n\n return (\n <div className=\"markdown-editor-wrapper flex gap-4\">\n {/* 左侧边栏 */}\n {tableOfContentsPosition === 'left' && (showTableOfContents || showFootnotes) && renderSidebar()}\n\n {/* 编辑器 */}\n <div className=\"markdown-editor-main flex-1\">\n <CodeEditor\n {...codeEditorProps}\n value={value}\n onChange={onChange}\n language=\"markdown\"\n autocompletion={false}\n extensions={allExtensions}\n contextMenu={markdownContextMenu}\n />\n </div>\n\n {/* 右侧边栏 */}\n {tableOfContentsPosition === 'right' && (showTableOfContents || showFootnotes) && renderSidebar()}\n\n {/* 侧边栏主题样式 */}\n <style>{`\n .markdown-sidebar-light {\n color: #000000;\n }\n .markdown-sidebar-dark {\n color: #d4d4d4;\n }\n .markdown-sidebar-dark .card,\n .markdown-sidebar-dark .toc-panel,\n .markdown-sidebar-dark .footnote-panel,\n .markdown-sidebar-dark .outline-panel,\n .markdown-sidebar-dark .variable-panel {\n background-color: #1e1e1e !important;\n border-color: #3e3e42 !important;\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark .border-base-300 {\n border-color: #3e3e42 !important;\n }\n .markdown-sidebar-dark input,\n .markdown-sidebar-dark .input {\n background-color: #2d2d2d !important;\n border-color: #3e3e42 !important;\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark button,\n .markdown-sidebar-dark .btn {\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark .hover\\\\:bg-base-200:hover,\n .markdown-sidebar-dark .toc-item:hover,\n .markdown-sidebar-dark .outline-item:hover,\n .markdown-sidebar-dark .variable-item:hover,\n .markdown-sidebar-dark .footnote-item:hover {\n background-color: #2d2d2d !important;\n }\n .markdown-sidebar-dark .bg-primary\\\\/20 {\n background-color: rgba(96, 165, 250, 0.2) !important;\n }\n .markdown-sidebar-dark .bg-base-200 {\n background-color: #2d2d2d !important;\n }\n .markdown-sidebar-dark .bg-warning\\\\/10 {\n background-color: rgba(251, 191, 36, 0.1) !important;\n }\n .markdown-sidebar-dark .border-warning\\\\/30 {\n border-color: rgba(251, 191, 36, 0.3) !important;\n }\n .markdown-sidebar-dark .text-warning {\n color: #fbbf24 !important;\n }\n `}</style>\n </div>\n );\n};\n\nexport default MarkdownEditor;\n"],"mappings":"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"}
@@ -267,31 +267,6 @@ var o = {
267
267
  attribute: "#10b981",
268
268
  link: "#059669"
269
269
  } },
270
- shadcn: { colors: {
271
- background: "#ffffff",
272
- foreground: "#09090b",
273
- caret: "#18181b",
274
- activeLine: "rgba(24, 24, 27, 0.03)",
275
- selectionBackground: "#e4e4e7",
276
- selectionOpacity: 0.9,
277
- gutterBackground: "#fafafa",
278
- gutterForeground: "#71717a",
279
- keyword: "#18181b",
280
- atom: "#52525b",
281
- number: "#71717a",
282
- def: "#18181b",
283
- variable: "#09090b",
284
- property: "#09090b",
285
- operator: "#18181b",
286
- comment: "#a1a1aa",
287
- string: "#52525b",
288
- meta: "#71717a",
289
- builtin: "#18181b",
290
- bracket: "#71717a",
291
- tag: "#18181b",
292
- attribute: "#52525b",
293
- link: "#18181b"
294
- } },
295
270
  wuxing: { colors: {
296
271
  background: "#f5f0e6",
297
272
  foreground: "#4a3728",
@@ -1 +1 @@
1
- {"version":3,"file":"themes.js","names":[],"sources":["../../../../src/components/pro/CodeEditor/themes.ts"],"sourcesContent":["import { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { tags } from '@lezer/highlight';\nimport type { EditorTheme } from './types';\n\n// ============= 主题配置类型 =============\n\ninterface ThemeColors {\n background: string;\n foreground: string;\n caret: string;\n activeLine: string;\n selectionBackground: string;\n selectionOpacity: number;\n gutterBackground: string;\n gutterForeground: string;\n // 语法高亮\n keyword: string;\n atom: string;\n number: string;\n def: string;\n variable: string;\n variable2?: string;\n type?: string;\n property: string;\n operator: string;\n comment: string;\n string: string;\n meta: string;\n builtin: string;\n bracket: string;\n tag: string;\n attribute: string;\n link: string;\n error?: string;\n}\n\n// ============= 主题配置 =============\n\nconst themeConfigs: Record<string, { colors: ThemeColors; dark?: boolean }> = {\n light: {\n colors: {\n background: '#ffffff',\n foreground: '#000000',\n caret: '#000000',\n activeLine: 'rgba(0, 0, 0, 0.03)',\n selectionBackground: '#add6ff',\n selectionOpacity: 0.9,\n gutterBackground: '#f8f8f8',\n gutterForeground: '#999',\n keyword: '#0000ff',\n atom: '#219',\n number: '#164',\n def: '#00f',\n variable: '#05a',\n property: '#05a',\n operator: '#000',\n comment: '#708090',\n string: '#a11',\n meta: '#555',\n builtin: '#30a',\n bracket: '#997',\n tag: '#170',\n attribute: '#00c',\n link: '#00e',\n },\n },\n dark: {\n colors: {\n background: '#1e1e1e',\n foreground: '#e0e0e0',\n caret: '#ffffff',\n activeLine: 'rgba(255, 255, 255, 0.08)',\n selectionBackground: '#555555',\n selectionOpacity: 0.85,\n gutterBackground: '#252526',\n gutterForeground: '#858585',\n keyword: '#ff79c6',\n atom: '#bd93f9',\n number: '#ffb86c',\n def: '#50fa7b',\n variable: '#f8f8f2',\n variable2: '#f1fa8c',\n type: '#bd93f9',\n property: '#ffd580',\n operator: '#ff79c6',\n comment: '#6a9955',\n string: '#f1fa8c',\n meta: '#f8f8f2',\n builtin: '#bd93f9',\n bracket: '#f8f8f2',\n tag: '#ff79c6',\n attribute: '#50fa7b',\n link: '#ff79c6',\n error: '#ff5555',\n },\n dark: true,\n },\n retro: {\n colors: {\n background: '#2d1b00',\n foreground: '#f5deb3',\n caret: '#ffcc66',\n activeLine: 'rgba(255, 204, 102, 0.1)',\n selectionBackground: '#663300',\n selectionOpacity: 0.8,\n gutterBackground: '#1a0f00',\n gutterForeground: '#997755',\n keyword: '#ff9966',\n atom: '#ffcc99',\n number: '#cc9966',\n def: '#ffaa55',\n variable: '#f5deb3',\n property: '#f5deb3',\n operator: '#ff9966',\n comment: '#8b7355',\n string: '#ffcc66',\n meta: '#cc9966',\n builtin: '#ff9966',\n bracket: '#cc9966',\n tag: '#ff9966',\n attribute: '#ffcc66',\n link: '#ffcc99',\n },\n dark: true,\n },\n cyberpunk: {\n colors: {\n background: '#0d0221',\n foreground: '#f72585',\n caret: '#7209b7',\n activeLine: 'rgba(114, 9, 183, 0.15)',\n selectionBackground: '#3c096c',\n selectionOpacity: 0.8,\n gutterBackground: '#0a0118',\n gutterForeground: '#7209b7',\n keyword: '#f72585',\n atom: '#b5179e',\n number: '#7209b7',\n def: '#f72585',\n variable: '#ffffff',\n property: '#ffffff',\n operator: '#f72585',\n comment: '#560bad',\n string: '#b5179e',\n meta: '#7209b7',\n builtin: '#f72585',\n bracket: '#b5179e',\n tag: '#f72585',\n attribute: '#b5179e',\n link: '#b5179e',\n },\n dark: true,\n },\n matrix: {\n colors: {\n background: '#0d1117',\n foreground: '#00ff00',\n caret: '#00ff00',\n activeLine: 'rgba(0, 255, 0, 0.08)',\n selectionBackground: '#003300',\n selectionOpacity: 0.8,\n gutterBackground: '#0a0e11',\n gutterForeground: '#00aa00',\n keyword: '#00ff00',\n atom: '#00cc00',\n number: '#00ff00',\n def: '#00ff00',\n variable: '#00ee00',\n property: '#00ee00',\n operator: '#00ff00',\n comment: '#008800',\n string: '#00cc00',\n meta: '#00ff00',\n builtin: '#00ff00',\n bracket: '#00dd00',\n tag: '#00ff00',\n attribute: '#00cc00',\n link: '#00ff00',\n },\n dark: true,\n },\n oceanblue: {\n colors: {\n background: '#f0f9ff',\n foreground: '#0c4a6e',\n caret: '#0369a1',\n activeLine: 'rgba(3, 105, 161, 0.05)',\n selectionBackground: '#bae6fd',\n selectionOpacity: 0.9,\n gutterBackground: '#e0f2fe',\n gutterForeground: '#075985',\n keyword: '#0369a1',\n atom: '#0891b2',\n number: '#0e7490',\n def: '#0369a1',\n variable: '#0c4a6e',\n property: '#0c4a6e',\n operator: '#0369a1',\n comment: '#64748b',\n string: '#0891b2',\n meta: '#475569',\n builtin: '#0369a1',\n bracket: '#334155',\n tag: '#0369a1',\n attribute: '#0891b2',\n link: '#0284c7',\n },\n },\n eyecare: {\n colors: {\n background: '#f5f8e8',\n foreground: '#2d4a2b',\n caret: '#4a7c59',\n activeLine: 'rgba(74, 124, 89, 0.06)',\n selectionBackground: '#d4e5d4',\n selectionOpacity: 0.9,\n gutterBackground: '#eef3dc',\n gutterForeground: '#5a8a5f',\n keyword: '#4a7c59',\n atom: '#5a8a5f',\n number: '#6b9b6f',\n def: '#4a7c59',\n variable: '#2d4a2b',\n property: '#2d4a2b',\n operator: '#4a7c59',\n comment: '#7a9d7e',\n string: '#5a8a5f',\n meta: '#5a7a5a',\n builtin: '#4a7c59',\n bracket: '#5a7a5a',\n tag: '#4a7c59',\n attribute: '#5a8a5f',\n link: '#4a7c59',\n },\n },\n ghibli: {\n colors: {\n background: '#fdfbf7',\n foreground: '#5c4a3c',\n caret: '#8b6f4e',\n activeLine: 'rgba(139, 111, 78, 0.05)',\n selectionBackground: '#f0e5d8',\n selectionOpacity: 0.9,\n gutterBackground: '#f7f2ea',\n gutterForeground: '#9b8b78',\n keyword: '#8b6f4e',\n atom: '#a67c52',\n number: '#7ea8a0',\n def: '#8b6f4e',\n variable: '#5c4a3c',\n property: '#5c4a3c',\n operator: '#8b6f4e',\n comment: '#9b8b78',\n string: '#a67c52',\n meta: '#7a6a58',\n builtin: '#8b6f4e',\n bracket: '#7a6a58',\n tag: '#8b6f4e',\n attribute: '#a67c52',\n link: '#7ea8a0',\n },\n },\n pinkgirl: {\n colors: {\n background: '#fff5f7',\n foreground: '#be185d',\n caret: '#db2777',\n activeLine: 'rgba(219, 39, 119, 0.05)',\n selectionBackground: '#fce7f3',\n selectionOpacity: 0.9,\n gutterBackground: '#fef1f5',\n gutterForeground: '#db2777',\n keyword: '#db2777',\n atom: '#ec4899',\n number: '#f472b6',\n def: '#db2777',\n variable: '#be185d',\n property: '#be185d',\n operator: '#db2777',\n comment: '#f9a8d4',\n string: '#ec4899',\n meta: '#be185d',\n builtin: '#db2777',\n bracket: '#be185d',\n tag: '#db2777',\n attribute: '#ec4899',\n link: '#db2777',\n },\n },\n mintgirl: {\n colors: {\n background: '#f0fdf4',\n foreground: '#065f46',\n caret: '#059669',\n activeLine: 'rgba(5, 150, 105, 0.05)',\n selectionBackground: '#d1fae5',\n selectionOpacity: 0.9,\n gutterBackground: '#ecfdf5',\n gutterForeground: '#059669',\n keyword: '#059669',\n atom: '#10b981',\n number: '#34d399',\n def: '#059669',\n variable: '#065f46',\n property: '#065f46',\n operator: '#059669',\n comment: '#6ee7b7',\n string: '#10b981',\n meta: '#047857',\n builtin: '#059669',\n bracket: '#047857',\n tag: '#059669',\n attribute: '#10b981',\n link: '#059669',\n },\n },\n shadcn: {\n colors: {\n background: '#ffffff',\n foreground: '#09090b',\n caret: '#18181b',\n activeLine: 'rgba(24, 24, 27, 0.03)',\n selectionBackground: '#e4e4e7',\n selectionOpacity: 0.9,\n gutterBackground: '#fafafa',\n gutterForeground: '#71717a',\n keyword: '#18181b',\n atom: '#52525b',\n number: '#71717a',\n def: '#18181b',\n variable: '#09090b',\n property: '#09090b',\n operator: '#18181b',\n comment: '#a1a1aa',\n string: '#52525b',\n meta: '#71717a',\n builtin: '#18181b',\n bracket: '#71717a',\n tag: '#18181b',\n attribute: '#52525b',\n link: '#18181b',\n },\n },\n // 五行主题 - 中国传统五行配色\n // 金(白/金) 木(青/绿) 水(黑/蓝) 火(赤/红) 土(黄/棕)\n wuxing: {\n colors: {\n // 背景:米黄色纸张质感(土)\n background: '#f5f0e6',\n // 前景:深棕色(土)\n foreground: '#4a3728',\n // 光标:赤红色(火)\n caret: '#c94c4c',\n // 活跃行:淡黄(土生金)\n activeLine: 'rgba(200, 170, 100, 0.12)',\n // 选中背景:淡青色(木)\n selectionBackground: '#d4e5d8',\n selectionOpacity: 0.85,\n // 行号背景:浅米黄\n gutterBackground: '#ebe5d8',\n gutterForeground: '#8b7355',\n // 关键字:赤红色(火)\n keyword: '#c94c4c',\n // 原子:金色(金)\n atom: '#b8860b',\n // 数字:深蓝(水)\n number: '#2f5496',\n // 定义:青绿色(木)\n def: '#2e7d32',\n // 变量:深棕(土)\n variable: '#5c4033',\n // 属性:棕黄(土)\n property: '#8b6914',\n // 运算符:赤色(火)\n operator: '#b5533c',\n // 注释:灰蓝(水生木)\n comment: '#6b8e8e',\n // 字符串:青绿(木)\n string: '#3d7a5a',\n // 元信息:深棕\n meta: '#6b5344',\n // 内置:金橙(金生水)\n builtin: '#cd853f',\n // 括号:深灰蓝(水)\n bracket: '#4a6670',\n // 标签:赤色(火)\n tag: '#c94c4c',\n // 属性名:青色(木)\n attribute: '#2e8b57',\n // 链接:深蓝(水)\n link: '#2f5496',\n },\n },\n};\n\n// ============= 语法高亮样式创建器 =============\n\nconst createHighlightStyle = (colors: ThemeColors): HighlightStyle => {\n const specs: { tag: any; color?: string; fontStyle?: string; fontWeight?: string; textDecoration?: string }[] = [\n { tag: tags.keyword, color: colors.keyword },\n { tag: [tags.atom, tags.bool, tags.url, tags.contentSeparator, tags.labelName], color: colors.atom },\n { tag: [tags.literal, tags.inserted], color: colors.number },\n { tag: tags.number, color: colors.number },\n { tag: [tags.string, tags.deleted], color: colors.string },\n { tag: [tags.regexp, tags.escape, tags.special(tags.string)], color: colors.string },\n { tag: tags.definition(tags.variableName), color: colors.def },\n { tag: tags.local(tags.variableName), color: colors.variable },\n { tag: tags.variableName, color: colors.variable },\n { tag: [tags.typeName, tags.namespace], color: colors.type || colors.builtin },\n { tag: tags.className, color: colors.type || colors.def },\n { tag: [tags.special(tags.variableName), tags.macroName], color: colors.builtin },\n { tag: tags.definition(tags.propertyName), color: colors.property },\n { tag: tags.propertyName, color: colors.property },\n { tag: tags.comment, color: colors.comment, fontStyle: 'italic' },\n { tag: tags.meta, color: colors.meta },\n { tag: tags.operatorKeyword, color: colors.operator },\n { tag: tags.operator, color: colors.operator },\n { tag: tags.bracket, color: colors.bracket },\n { tag: tags.angleBracket, color: colors.bracket },\n { tag: tags.squareBracket, color: colors.bracket },\n { tag: tags.paren, color: colors.bracket },\n { tag: tags.brace, color: colors.bracket },\n { tag: tags.tagName, color: colors.tag },\n { tag: tags.attributeName, color: colors.attribute },\n { tag: tags.attributeValue, color: colors.string },\n { tag: tags.link, color: colors.link, textDecoration: 'underline' },\n { tag: tags.heading, color: colors.keyword, fontWeight: 'bold' },\n { tag: tags.emphasis, fontStyle: 'italic' },\n { tag: tags.strong, fontWeight: 'bold' },\n { tag: tags.strikethrough, textDecoration: 'line-through' },\n ];\n\n if (colors.error) {\n specs.push({ tag: tags.invalid, color: colors.error });\n }\n\n if (colors.variable2) {\n specs.push({ tag: tags.special(tags.variableName), color: colors.variable2 });\n }\n\n return HighlightStyle.define(specs);\n};\n\n// ============= 编辑器外观主题创建器 =============\n\nconst createEditorTheme = (config: { colors: ThemeColors; dark?: boolean }): Extension => {\n const { colors, dark } = config;\n\n const baseStyles: Record<string, any> = {\n '&': {\n backgroundColor: colors.background,\n color: colors.foreground,\n },\n '.cm-content': {\n caretColor: colors.caret,\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: colors.caret,\n },\n '.cm-activeLine': {\n backgroundColor: colors.activeLine,\n },\n '.cm-selectionLayer': {\n mixBlendMode: 'normal',\n pointerEvents: 'none',\n zIndex: 10,\n },\n '.cm-selectionLayer .cm-selectionBackground': {\n backgroundColor: colors.selectionBackground,\n opacity: colors.selectionOpacity,\n },\n '.cm-selectionBackground': {\n backgroundColor: colors.selectionBackground,\n opacity: colors.selectionOpacity,\n },\n '&.cm-focused .cm-selectionBackground': {\n backgroundColor: colors.selectionBackground,\n },\n '.cm-gutters': {\n backgroundColor: colors.gutterBackground,\n color: colors.gutterForeground,\n border: 'none',\n },\n };\n\n if (dark) {\n baseStyles['.cm-lineNumbers .cm-gutterElement'] = { color: colors.gutterForeground };\n }\n\n return EditorView.theme(baseStyles, { dark });\n};\n\n// ============= 缓存 =============\n\nconst editorThemeCache = new Map<EditorTheme, Extension>();\nconst highlightCache = new Map<EditorTheme, Extension>();\n\n/**\n * 创建编辑器外观主题(背景色、光标色等)\n * 放入 themeCompartment\n */\nexport const createThemeExtension = (theme: EditorTheme): Extension => {\n if (editorThemeCache.has(theme)) {\n return editorThemeCache.get(theme)!;\n }\n\n const config = themeConfigs[theme] || themeConfigs.light;\n const ext = createEditorTheme(config);\n editorThemeCache.set(theme, ext);\n return ext;\n};\n\n/**\n * 创建语法高亮扩展\n * 放入 highlightCompartment\n */\nexport const createHighlightExtension = (theme: EditorTheme): Extension => {\n if (highlightCache.has(theme)) {\n return highlightCache.get(theme)!;\n }\n\n const config = themeConfigs[theme] || themeConfigs.light;\n const hl = createHighlightStyle(config.colors);\n const ext = syntaxHighlighting(hl);\n highlightCache.set(theme, ext);\n return ext;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"themes.js","names":[],"sources":["../../../../src/components/pro/CodeEditor/themes.ts"],"sourcesContent":["import { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { tags } from '@lezer/highlight';\nimport type { EditorTheme } from './types';\n\n// ============= 主题配置类型 =============\n\ninterface ThemeColors {\n background: string;\n foreground: string;\n caret: string;\n activeLine: string;\n selectionBackground: string;\n selectionOpacity: number;\n gutterBackground: string;\n gutterForeground: string;\n // 语法高亮\n keyword: string;\n atom: string;\n number: string;\n def: string;\n variable: string;\n variable2?: string;\n type?: string;\n property: string;\n operator: string;\n comment: string;\n string: string;\n meta: string;\n builtin: string;\n bracket: string;\n tag: string;\n attribute: string;\n link: string;\n error?: string;\n}\n\n// ============= 主题配置 =============\n\nconst themeConfigs: Record<string, { colors: ThemeColors; dark?: boolean }> = {\n light: {\n colors: {\n background: '#ffffff',\n foreground: '#000000',\n caret: '#000000',\n activeLine: 'rgba(0, 0, 0, 0.03)',\n selectionBackground: '#add6ff',\n selectionOpacity: 0.9,\n gutterBackground: '#f8f8f8',\n gutterForeground: '#999',\n keyword: '#0000ff',\n atom: '#219',\n number: '#164',\n def: '#00f',\n variable: '#05a',\n property: '#05a',\n operator: '#000',\n comment: '#708090',\n string: '#a11',\n meta: '#555',\n builtin: '#30a',\n bracket: '#997',\n tag: '#170',\n attribute: '#00c',\n link: '#00e',\n },\n },\n dark: {\n colors: {\n background: '#1e1e1e',\n foreground: '#e0e0e0',\n caret: '#ffffff',\n activeLine: 'rgba(255, 255, 255, 0.08)',\n selectionBackground: '#555555',\n selectionOpacity: 0.85,\n gutterBackground: '#252526',\n gutterForeground: '#858585',\n keyword: '#ff79c6',\n atom: '#bd93f9',\n number: '#ffb86c',\n def: '#50fa7b',\n variable: '#f8f8f2',\n variable2: '#f1fa8c',\n type: '#bd93f9',\n property: '#ffd580',\n operator: '#ff79c6',\n comment: '#6a9955',\n string: '#f1fa8c',\n meta: '#f8f8f2',\n builtin: '#bd93f9',\n bracket: '#f8f8f2',\n tag: '#ff79c6',\n attribute: '#50fa7b',\n link: '#ff79c6',\n error: '#ff5555',\n },\n dark: true,\n },\n retro: {\n colors: {\n background: '#2d1b00',\n foreground: '#f5deb3',\n caret: '#ffcc66',\n activeLine: 'rgba(255, 204, 102, 0.1)',\n selectionBackground: '#663300',\n selectionOpacity: 0.8,\n gutterBackground: '#1a0f00',\n gutterForeground: '#997755',\n keyword: '#ff9966',\n atom: '#ffcc99',\n number: '#cc9966',\n def: '#ffaa55',\n variable: '#f5deb3',\n property: '#f5deb3',\n operator: '#ff9966',\n comment: '#8b7355',\n string: '#ffcc66',\n meta: '#cc9966',\n builtin: '#ff9966',\n bracket: '#cc9966',\n tag: '#ff9966',\n attribute: '#ffcc66',\n link: '#ffcc99',\n },\n dark: true,\n },\n cyberpunk: {\n colors: {\n background: '#0d0221',\n foreground: '#f72585',\n caret: '#7209b7',\n activeLine: 'rgba(114, 9, 183, 0.15)',\n selectionBackground: '#3c096c',\n selectionOpacity: 0.8,\n gutterBackground: '#0a0118',\n gutterForeground: '#7209b7',\n keyword: '#f72585',\n atom: '#b5179e',\n number: '#7209b7',\n def: '#f72585',\n variable: '#ffffff',\n property: '#ffffff',\n operator: '#f72585',\n comment: '#560bad',\n string: '#b5179e',\n meta: '#7209b7',\n builtin: '#f72585',\n bracket: '#b5179e',\n tag: '#f72585',\n attribute: '#b5179e',\n link: '#b5179e',\n },\n dark: true,\n },\n matrix: {\n colors: {\n background: '#0d1117',\n foreground: '#00ff00',\n caret: '#00ff00',\n activeLine: 'rgba(0, 255, 0, 0.08)',\n selectionBackground: '#003300',\n selectionOpacity: 0.8,\n gutterBackground: '#0a0e11',\n gutterForeground: '#00aa00',\n keyword: '#00ff00',\n atom: '#00cc00',\n number: '#00ff00',\n def: '#00ff00',\n variable: '#00ee00',\n property: '#00ee00',\n operator: '#00ff00',\n comment: '#008800',\n string: '#00cc00',\n meta: '#00ff00',\n builtin: '#00ff00',\n bracket: '#00dd00',\n tag: '#00ff00',\n attribute: '#00cc00',\n link: '#00ff00',\n },\n dark: true,\n },\n oceanblue: {\n colors: {\n background: '#f0f9ff',\n foreground: '#0c4a6e',\n caret: '#0369a1',\n activeLine: 'rgba(3, 105, 161, 0.05)',\n selectionBackground: '#bae6fd',\n selectionOpacity: 0.9,\n gutterBackground: '#e0f2fe',\n gutterForeground: '#075985',\n keyword: '#0369a1',\n atom: '#0891b2',\n number: '#0e7490',\n def: '#0369a1',\n variable: '#0c4a6e',\n property: '#0c4a6e',\n operator: '#0369a1',\n comment: '#64748b',\n string: '#0891b2',\n meta: '#475569',\n builtin: '#0369a1',\n bracket: '#334155',\n tag: '#0369a1',\n attribute: '#0891b2',\n link: '#0284c7',\n },\n },\n eyecare: {\n colors: {\n background: '#f5f8e8',\n foreground: '#2d4a2b',\n caret: '#4a7c59',\n activeLine: 'rgba(74, 124, 89, 0.06)',\n selectionBackground: '#d4e5d4',\n selectionOpacity: 0.9,\n gutterBackground: '#eef3dc',\n gutterForeground: '#5a8a5f',\n keyword: '#4a7c59',\n atom: '#5a8a5f',\n number: '#6b9b6f',\n def: '#4a7c59',\n variable: '#2d4a2b',\n property: '#2d4a2b',\n operator: '#4a7c59',\n comment: '#7a9d7e',\n string: '#5a8a5f',\n meta: '#5a7a5a',\n builtin: '#4a7c59',\n bracket: '#5a7a5a',\n tag: '#4a7c59',\n attribute: '#5a8a5f',\n link: '#4a7c59',\n },\n },\n ghibli: {\n colors: {\n background: '#fdfbf7',\n foreground: '#5c4a3c',\n caret: '#8b6f4e',\n activeLine: 'rgba(139, 111, 78, 0.05)',\n selectionBackground: '#f0e5d8',\n selectionOpacity: 0.9,\n gutterBackground: '#f7f2ea',\n gutterForeground: '#9b8b78',\n keyword: '#8b6f4e',\n atom: '#a67c52',\n number: '#7ea8a0',\n def: '#8b6f4e',\n variable: '#5c4a3c',\n property: '#5c4a3c',\n operator: '#8b6f4e',\n comment: '#9b8b78',\n string: '#a67c52',\n meta: '#7a6a58',\n builtin: '#8b6f4e',\n bracket: '#7a6a58',\n tag: '#8b6f4e',\n attribute: '#a67c52',\n link: '#7ea8a0',\n },\n },\n pinkgirl: {\n colors: {\n background: '#fff5f7',\n foreground: '#be185d',\n caret: '#db2777',\n activeLine: 'rgba(219, 39, 119, 0.05)',\n selectionBackground: '#fce7f3',\n selectionOpacity: 0.9,\n gutterBackground: '#fef1f5',\n gutterForeground: '#db2777',\n keyword: '#db2777',\n atom: '#ec4899',\n number: '#f472b6',\n def: '#db2777',\n variable: '#be185d',\n property: '#be185d',\n operator: '#db2777',\n comment: '#f9a8d4',\n string: '#ec4899',\n meta: '#be185d',\n builtin: '#db2777',\n bracket: '#be185d',\n tag: '#db2777',\n attribute: '#ec4899',\n link: '#db2777',\n },\n },\n mintgirl: {\n colors: {\n background: '#f0fdf4',\n foreground: '#065f46',\n caret: '#059669',\n activeLine: 'rgba(5, 150, 105, 0.05)',\n selectionBackground: '#d1fae5',\n selectionOpacity: 0.9,\n gutterBackground: '#ecfdf5',\n gutterForeground: '#059669',\n keyword: '#059669',\n atom: '#10b981',\n number: '#34d399',\n def: '#059669',\n variable: '#065f46',\n property: '#065f46',\n operator: '#059669',\n comment: '#6ee7b7',\n string: '#10b981',\n meta: '#047857',\n builtin: '#059669',\n bracket: '#047857',\n tag: '#059669',\n attribute: '#10b981',\n link: '#059669',\n },\n },\n // 五行主题 - 中国传统五行配色\n // 金(白/金) 木(青/绿) 水(黑/蓝) 火(赤/红) 土(黄/棕)\n wuxing: {\n colors: {\n // 背景:米黄色纸张质感(土)\n background: '#f5f0e6',\n // 前景:深棕色(土)\n foreground: '#4a3728',\n // 光标:赤红色(火)\n caret: '#c94c4c',\n // 活跃行:淡黄(土生金)\n activeLine: 'rgba(200, 170, 100, 0.12)',\n // 选中背景:淡青色(木)\n selectionBackground: '#d4e5d8',\n selectionOpacity: 0.85,\n // 行号背景:浅米黄\n gutterBackground: '#ebe5d8',\n gutterForeground: '#8b7355',\n // 关键字:赤红色(火)\n keyword: '#c94c4c',\n // 原子:金色(金)\n atom: '#b8860b',\n // 数字:深蓝(水)\n number: '#2f5496',\n // 定义:青绿色(木)\n def: '#2e7d32',\n // 变量:深棕(土)\n variable: '#5c4033',\n // 属性:棕黄(土)\n property: '#8b6914',\n // 运算符:赤色(火)\n operator: '#b5533c',\n // 注释:灰蓝(水生木)\n comment: '#6b8e8e',\n // 字符串:青绿(木)\n string: '#3d7a5a',\n // 元信息:深棕\n meta: '#6b5344',\n // 内置:金橙(金生水)\n builtin: '#cd853f',\n // 括号:深灰蓝(水)\n bracket: '#4a6670',\n // 标签:赤色(火)\n tag: '#c94c4c',\n // 属性名:青色(木)\n attribute: '#2e8b57',\n // 链接:深蓝(水)\n link: '#2f5496',\n },\n },\n};\n\n// ============= 语法高亮样式创建器 =============\n\nconst createHighlightStyle = (colors: ThemeColors): HighlightStyle => {\n const specs: { tag: any; color?: string; fontStyle?: string; fontWeight?: string; textDecoration?: string }[] = [\n { tag: tags.keyword, color: colors.keyword },\n { tag: [tags.atom, tags.bool, tags.url, tags.contentSeparator, tags.labelName], color: colors.atom },\n { tag: [tags.literal, tags.inserted], color: colors.number },\n { tag: tags.number, color: colors.number },\n { tag: [tags.string, tags.deleted], color: colors.string },\n { tag: [tags.regexp, tags.escape, tags.special(tags.string)], color: colors.string },\n { tag: tags.definition(tags.variableName), color: colors.def },\n { tag: tags.local(tags.variableName), color: colors.variable },\n { tag: tags.variableName, color: colors.variable },\n { tag: [tags.typeName, tags.namespace], color: colors.type || colors.builtin },\n { tag: tags.className, color: colors.type || colors.def },\n { tag: [tags.special(tags.variableName), tags.macroName], color: colors.builtin },\n { tag: tags.definition(tags.propertyName), color: colors.property },\n { tag: tags.propertyName, color: colors.property },\n { tag: tags.comment, color: colors.comment, fontStyle: 'italic' },\n { tag: tags.meta, color: colors.meta },\n { tag: tags.operatorKeyword, color: colors.operator },\n { tag: tags.operator, color: colors.operator },\n { tag: tags.bracket, color: colors.bracket },\n { tag: tags.angleBracket, color: colors.bracket },\n { tag: tags.squareBracket, color: colors.bracket },\n { tag: tags.paren, color: colors.bracket },\n { tag: tags.brace, color: colors.bracket },\n { tag: tags.tagName, color: colors.tag },\n { tag: tags.attributeName, color: colors.attribute },\n { tag: tags.attributeValue, color: colors.string },\n { tag: tags.link, color: colors.link, textDecoration: 'underline' },\n { tag: tags.heading, color: colors.keyword, fontWeight: 'bold' },\n { tag: tags.emphasis, fontStyle: 'italic' },\n { tag: tags.strong, fontWeight: 'bold' },\n { tag: tags.strikethrough, textDecoration: 'line-through' },\n ];\n\n if (colors.error) {\n specs.push({ tag: tags.invalid, color: colors.error });\n }\n\n if (colors.variable2) {\n specs.push({ tag: tags.special(tags.variableName), color: colors.variable2 });\n }\n\n return HighlightStyle.define(specs);\n};\n\n// ============= 编辑器外观主题创建器 =============\n\nconst createEditorTheme = (config: { colors: ThemeColors; dark?: boolean }): Extension => {\n const { colors, dark } = config;\n\n const baseStyles: Record<string, any> = {\n '&': {\n backgroundColor: colors.background,\n color: colors.foreground,\n },\n '.cm-content': {\n caretColor: colors.caret,\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: colors.caret,\n },\n '.cm-activeLine': {\n backgroundColor: colors.activeLine,\n },\n '.cm-selectionLayer': {\n mixBlendMode: 'normal',\n pointerEvents: 'none',\n zIndex: 10,\n },\n '.cm-selectionLayer .cm-selectionBackground': {\n backgroundColor: colors.selectionBackground,\n opacity: colors.selectionOpacity,\n },\n '.cm-selectionBackground': {\n backgroundColor: colors.selectionBackground,\n opacity: colors.selectionOpacity,\n },\n '&.cm-focused .cm-selectionBackground': {\n backgroundColor: colors.selectionBackground,\n },\n '.cm-gutters': {\n backgroundColor: colors.gutterBackground,\n color: colors.gutterForeground,\n border: 'none',\n },\n };\n\n if (dark) {\n baseStyles['.cm-lineNumbers .cm-gutterElement'] = { color: colors.gutterForeground };\n }\n\n return EditorView.theme(baseStyles, { dark });\n};\n\n// ============= 缓存 =============\n\nconst editorThemeCache = new Map<EditorTheme, Extension>();\nconst highlightCache = new Map<EditorTheme, Extension>();\n\n/**\n * 创建编辑器外观主题(背景色、光标色等)\n * 放入 themeCompartment\n */\nexport const createThemeExtension = (theme: EditorTheme): Extension => {\n if (editorThemeCache.has(theme)) {\n return editorThemeCache.get(theme)!;\n }\n\n const config = themeConfigs[theme] || themeConfigs.light;\n const ext = createEditorTheme(config);\n editorThemeCache.set(theme, ext);\n return ext;\n};\n\n/**\n * 创建语法高亮扩展\n * 放入 highlightCompartment\n */\nexport const createHighlightExtension = (theme: EditorTheme): Extension => {\n if (highlightCache.has(theme)) {\n return highlightCache.get(theme)!;\n }\n\n const config = themeConfigs[theme] || themeConfigs.light;\n const hl = createHighlightStyle(config.colors);\n const ext = syntaxHighlighting(hl);\n highlightCache.set(theme, ext);\n return ext;\n};\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { EditorView } from '@codemirror/view';
2
2
  import { CompletionContext, CompletionResult, Completion } from '@codemirror/autocomplete';
3
3
  export type LanguageType = 'javascript' | 'typescript' | 'python' | 'html' | 'css' | 'json' | 'markdown' | 'jsx' | 'tsx';
4
- export type EditorTheme = 'light' | 'dark' | 'retro' | 'cyberpunk' | 'matrix' | 'oceanblue' | 'eyecare' | 'ghibli' | 'pinkgirl' | 'mintgirl' | 'shadcn' | 'wuxing' | 'jukebox';
4
+ export type EditorTheme = 'light' | 'dark' | 'retro' | 'cyberpunk' | 'matrix' | 'oceanblue' | 'eyecare' | 'ghibli' | 'pinkgirl' | 'mintgirl' | 'wuxing' | 'jukebox';
5
5
  export interface ContextMenuItem {
6
6
  label: string;
7
7
  action: (view: EditorView) => void;
@@ -39,6 +39,12 @@ export interface PivotExtensionOptions {
39
39
  * 默认 224px。
40
40
  */
41
41
  panelWidth?: number | string;
42
+ /**
43
+ * 隐藏工具栏中的「透视模式」开关。默认 false。
44
+ * 适用于由外部(如宿主 Inspector)控制透视开关的场景:此时模式仅能通过
45
+ * `initialActive` 设定,工具栏不再渲染开关;未激活时不占用任何工具栏空间。
46
+ */
47
+ hideModeToggle?: boolean;
42
48
  }
43
49
  /**
44
50
  * 透视(Pivot)扩展。
@@ -1,61 +1,61 @@
1
- import { PivotView as R } from "./PivotView.js";
1
+ import { PivotView as T } from "./PivotView.js";
2
2
  import { PivotPanel as j } from "./PivotPanel.js";
3
- import { useMemo as a, useState as r } from "react";
3
+ import { useMemo as s, useState as a } from "react";
4
4
  import { jsx as o, jsxs as c } from "react/jsx-runtime";
5
5
  var y = {
6
6
  zh: { pivotMode: "透视模式" },
7
7
  en: { pivotMode: "Pivot Mode" }
8
8
  };
9
- function W(F) {
10
- const { fields: i, initialRowFields: N = [], initialColFields: b = [], initialValues: P = [], initialActive: M = !1, treeView: v = !0, lang: n = "zh", panelPlacement: l = "top", panelWidth: h = 224 } = F, [s, z] = r(M), [d, C] = r(N), [m, V] = r(b), [f, k] = r(P), g = y[n], p = a(() => {
9
+ function X(N) {
10
+ const { fields: l, initialRowFields: b = [], initialColFields: M = [], initialValues: P = [], initialActive: z = !1, treeView: v = !0, lang: r = "zh", panelPlacement: i = "top", panelWidth: h = 224, hideModeToggle: g = !1 } = N, [n, C] = a(z), [d, V] = a(b), [m, k] = a(M), [f, R] = a(P), x = y[r], p = s(() => {
11
11
  const e = {};
12
- for (const t of i) e[t.field] = t.label ?? t.field;
12
+ for (const t of l) e[t.field] = t.label ?? t.field;
13
13
  return e;
14
- }, [i]), x = a(() => i.filter((e) => !e.numeric), [i]), w = a(() => i.filter((e) => e.numeric), [i]);
15
- return a(() => {
14
+ }, [l]), w = s(() => l.filter((e) => !e.numeric), [l]), F = s(() => l.filter((e) => e.numeric), [l]);
15
+ return s(() => {
16
16
  const e = (t) => /* @__PURE__ */ o(j, {
17
17
  orientation: t,
18
- lang: n,
18
+ lang: r,
19
19
  fieldLabels: p,
20
- dimensionFields: x,
21
- numericFields: w,
20
+ dimensionFields: w,
21
+ numericFields: F,
22
22
  rowFields: d,
23
23
  colFields: m,
24
24
  values: f,
25
- setRowFields: C,
26
- setColFields: V,
27
- setValues: k,
25
+ setRowFields: V,
26
+ setColFields: k,
27
+ setValues: R,
28
28
  panelWidth: h
29
29
  });
30
30
  return {
31
31
  name: "pivot",
32
- toolbar: () => /* @__PURE__ */ c("div", {
32
+ toolbar: () => g ? !n || i !== "top" ? null : e("horizontal") : /* @__PURE__ */ c("div", {
33
33
  className: "w-full flex flex-col gap-2",
34
34
  children: [/* @__PURE__ */ c("label", {
35
35
  className: "flex items-center gap-2 cursor-pointer w-fit",
36
36
  children: [/* @__PURE__ */ o("input", {
37
37
  type: "checkbox",
38
38
  className: "toggle toggle-sm toggle-primary",
39
- checked: s,
40
- onChange: (t) => z(t.target.checked)
39
+ checked: n,
40
+ onChange: (t) => C(t.target.checked)
41
41
  }), /* @__PURE__ */ o("span", {
42
42
  className: "text-sm font-medium",
43
- children: g.pivotMode
43
+ children: x.pivotMode
44
44
  })]
45
- }), s && l === "top" && e("horizontal")]
45
+ }), n && i === "top" && e("horizontal")]
46
46
  }),
47
47
  renderContent: (t) => {
48
- if (!s) return;
49
- const u = /* @__PURE__ */ o(R, {
48
+ if (!n) return;
49
+ const u = /* @__PURE__ */ o(T, {
50
50
  data: t.data,
51
51
  rowFields: d,
52
52
  colFields: m,
53
53
  values: f,
54
54
  fieldLabels: p,
55
- lang: n,
55
+ lang: r,
56
56
  treeView: v
57
57
  });
58
- return l === "top" ? u : l === "bottom" ? /* @__PURE__ */ c("div", {
58
+ return i === "top" ? u : i === "bottom" ? /* @__PURE__ */ c("div", {
59
59
  className: "flex flex-col gap-3",
60
60
  children: [/* @__PURE__ */ o("div", {
61
61
  className: "flex-1 min-w-0",
@@ -64,33 +64,34 @@ function W(F) {
64
64
  }) : /* @__PURE__ */ c("div", {
65
65
  className: "flex gap-3 items-stretch",
66
66
  children: [
67
- l === "left" && e("vertical"),
67
+ i === "left" && e("vertical"),
68
68
  /* @__PURE__ */ o("div", {
69
69
  className: "flex-1 min-w-0",
70
70
  children: u
71
71
  }),
72
- l === "right" && e("vertical")
72
+ i === "right" && e("vertical")
73
73
  ]
74
74
  });
75
75
  }
76
76
  };
77
77
  }, [
78
- s,
78
+ n,
79
79
  d,
80
80
  m,
81
81
  f,
82
82
  p,
83
- x,
84
83
  w,
84
+ F,
85
85
  v,
86
- n,
87
- l,
86
+ r,
87
+ i,
88
88
  h,
89
- g
89
+ g,
90
+ x
90
91
  ]);
91
92
  }
92
93
  export {
93
- W as usePivotExtension
94
+ X as usePivotExtension
94
95
  };
95
96
 
96
97
  //# sourceMappingURL=pivotExtension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pivotExtension.js","names":[],"sources":["../../../../src/components/pro/DataTable/pivotExtension.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport {\n PivotView,\n type PivotValue,\n type PivotFieldLabels,\n} from './PivotView';\nimport { PivotPanel } from './PivotPanel';\nimport type { DataTableExtension } from './extension';\n\n/** 可参与透视的字段描述。 */\nexport interface PivotField {\n /** 字段 key(对应数据对象的属性名)。 */\n field: string;\n /** 展示标签。 */\n label?: string;\n /** 是否为可聚合的数值字段。默认 false(维度字段)。 */\n numeric?: boolean;\n}\n\n/** 配置面板的排布位置。 */\nexport type PivotPanelPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface PivotExtensionOptions {\n /** 可用于透视的字段列表。 */\n fields: PivotField[];\n /** 初始行分组字段。 */\n initialRowFields?: string[];\n /** 初始列分组字段。 */\n initialColFields?: string[];\n /** 初始数值度量。 */\n initialValues?: PivotValue[];\n /** 初始是否启用透视模式。默认 false。 */\n initialActive?: boolean;\n /** 是否以树形(可展开分组)展示多级行分组。默认 true。 */\n treeView?: boolean;\n /** 语言。默认 'zh'。 */\n lang?: 'zh' | 'en';\n /**\n * 配置面板的排布位置:\n * - `'top'`(默认)水平排布在工具栏下方;\n * - `'bottom'` 水平排布在透视表格下方;\n * - `'left'` / `'right'` 纵向排布在透视表格的左/右侧。\n */\n panelPlacement?: PivotPanelPlacement;\n /**\n * 垂直(`'left'`/`'right'`)面板的宽度。数字视为 px,字符串直接\n * 作为 CSS 宽度(如 `'20%'` / `'16rem'`)。仅对左/右侧纵向面板生效,\n * 默认 224px。\n */\n panelWidth?: number | string;\n}\n\nconst TEXT = {\n zh: { pivotMode: '透视模式' },\n en: { pivotMode: 'Pivot Mode' },\n} as const;\n\n/**\n * 透视(Pivot)扩展。\n *\n * 使用方式(在组件内调用该 hook,因为它持有 React 状态):\n * ```tsx\n * const pivot = usePivotExtension<Row>({\n * fields: [\n * { field: 'region', label: '地区' },\n * { field: 'category', label: '品类' },\n * { field: 'amount', label: '金额', numeric: true },\n * ],\n * initialRowFields: ['region'],\n * initialValues: [{ field: 'amount', aggFn: 'sum' }],\n * panelPlacement: 'left', // 面板纵向排布在左侧\n * });\n * <DataTable data={data} columns={columns} extensions={[pivot]} />\n * ```\n *\n * 扩展会:\n * - 在工具栏放一个「透视模式」开关;\n * - 开启后通过 `renderContent` 接管表格主体,渲染 ag-grid 风格的交叉表 +\n * 可拖拽配置面板(支持顶部水平 / 左右纵向排布,拖拽时带跟随光标的拖拽引用)。\n */\nexport function usePivotExtension<T extends object>(\n options: PivotExtensionOptions,\n): DataTableExtension<T> {\n const {\n fields,\n initialRowFields = [],\n initialColFields = [],\n initialValues = [],\n initialActive = false,\n treeView = true,\n lang = 'zh',\n panelPlacement = 'top',\n panelWidth = 224,\n } = options;\n\n const [active, setActive] = useState(initialActive);\n const [rowFields, setRowFields] = useState<string[]>(initialRowFields);\n const [colFields, setColFields] = useState<string[]>(initialColFields);\n const [values, setValues] = useState<PivotValue[]>(initialValues);\n\n const t = TEXT[lang];\n\n const fieldLabels: PivotFieldLabels = useMemo(() => {\n const map: PivotFieldLabels = {};\n for (const f of fields) map[f.field] = f.label ?? f.field;\n return map;\n }, [fields]);\n\n const dimensionFields = useMemo(\n () => fields.filter((f) => !f.numeric),\n [fields],\n );\n const numericFields = useMemo(\n () => fields.filter((f) => f.numeric),\n [fields],\n );\n\n return useMemo<DataTableExtension<T>>(() => {\n const panel = (orientation: 'horizontal' | 'vertical') => (\n <PivotPanel\n orientation={orientation}\n lang={lang}\n fieldLabels={fieldLabels}\n dimensionFields={dimensionFields}\n numericFields={numericFields}\n rowFields={rowFields}\n colFields={colFields}\n values={values}\n setRowFields={setRowFields}\n setColFields={setColFields}\n setValues={setValues}\n panelWidth={panelWidth}\n />\n );\n\n return {\n name: 'pivot',\n toolbar: () => (\n <div className=\"w-full flex flex-col gap-2\">\n <label className=\"flex items-center gap-2 cursor-pointer w-fit\">\n <input\n type=\"checkbox\"\n className=\"toggle toggle-sm toggle-primary\"\n checked={active}\n onChange={(e) => setActive(e.target.checked)}\n />\n <span className=\"text-sm font-medium\">{t.pivotMode}</span>\n </label>\n {/* 顶部(水平)面板放在工具栏内。 */}\n {active && panelPlacement === 'top' && panel('horizontal')}\n </div>\n ),\n renderContent: (api) => {\n if (!active) return undefined;\n const content = (\n <PivotView<T>\n data={api.data}\n rowFields={rowFields}\n colFields={colFields}\n values={values}\n fieldLabels={fieldLabels}\n lang={lang}\n treeView={treeView}\n />\n );\n // 顶部面板已在工具栏内渲染,这里只渲染表格主体。\n if (panelPlacement === 'top') return content;\n // 底部面板:水平排布在透视表格下方。\n if (panelPlacement === 'bottom') {\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex-1 min-w-0\">{content}</div>\n {panel('horizontal')}\n </div>\n );\n }\n // 左/右侧纵向面板:与透视表格并排,默认与表格同高。\n return (\n <div className=\"flex gap-3 items-stretch\">\n {panelPlacement === 'left' && panel('vertical')}\n <div className=\"flex-1 min-w-0\">{content}</div>\n {panelPlacement === 'right' && panel('vertical')}\n </div>\n );\n },\n };\n }, [\n active,\n rowFields,\n colFields,\n values,\n fieldLabels,\n dimensionFields,\n numericFields,\n treeView,\n lang,\n panelPlacement,\n panelWidth,\n t,\n ]);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pivotExtension.js","names":[],"sources":["../../../../src/components/pro/DataTable/pivotExtension.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport {\n PivotView,\n type PivotValue,\n type PivotFieldLabels,\n} from './PivotView';\nimport { PivotPanel } from './PivotPanel';\nimport type { DataTableExtension } from './extension';\n\n/** 可参与透视的字段描述。 */\nexport interface PivotField {\n /** 字段 key(对应数据对象的属性名)。 */\n field: string;\n /** 展示标签。 */\n label?: string;\n /** 是否为可聚合的数值字段。默认 false(维度字段)。 */\n numeric?: boolean;\n}\n\n/** 配置面板的排布位置。 */\nexport type PivotPanelPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface PivotExtensionOptions {\n /** 可用于透视的字段列表。 */\n fields: PivotField[];\n /** 初始行分组字段。 */\n initialRowFields?: string[];\n /** 初始列分组字段。 */\n initialColFields?: string[];\n /** 初始数值度量。 */\n initialValues?: PivotValue[];\n /** 初始是否启用透视模式。默认 false。 */\n initialActive?: boolean;\n /** 是否以树形(可展开分组)展示多级行分组。默认 true。 */\n treeView?: boolean;\n /** 语言。默认 'zh'。 */\n lang?: 'zh' | 'en';\n /**\n * 配置面板的排布位置:\n * - `'top'`(默认)水平排布在工具栏下方;\n * - `'bottom'` 水平排布在透视表格下方;\n * - `'left'` / `'right'` 纵向排布在透视表格的左/右侧。\n */\n panelPlacement?: PivotPanelPlacement;\n /**\n * 垂直(`'left'`/`'right'`)面板的宽度。数字视为 px,字符串直接\n * 作为 CSS 宽度(如 `'20%'` / `'16rem'`)。仅对左/右侧纵向面板生效,\n * 默认 224px。\n */\n panelWidth?: number | string;\n /**\n * 隐藏工具栏中的「透视模式」开关。默认 false。\n * 适用于由外部(如宿主 Inspector)控制透视开关的场景:此时模式仅能通过\n * `initialActive` 设定,工具栏不再渲染开关;未激活时不占用任何工具栏空间。\n */\n hideModeToggle?: boolean;\n}\n\nconst TEXT = {\n zh: { pivotMode: '透视模式' },\n en: { pivotMode: 'Pivot Mode' },\n} as const;\n\n/**\n * 透视(Pivot)扩展。\n *\n * 使用方式(在组件内调用该 hook,因为它持有 React 状态):\n * ```tsx\n * const pivot = usePivotExtension<Row>({\n * fields: [\n * { field: 'region', label: '地区' },\n * { field: 'category', label: '品类' },\n * { field: 'amount', label: '金额', numeric: true },\n * ],\n * initialRowFields: ['region'],\n * initialValues: [{ field: 'amount', aggFn: 'sum' }],\n * panelPlacement: 'left', // 面板纵向排布在左侧\n * });\n * <DataTable data={data} columns={columns} extensions={[pivot]} />\n * ```\n *\n * 扩展会:\n * - 在工具栏放一个「透视模式」开关;\n * - 开启后通过 `renderContent` 接管表格主体,渲染 ag-grid 风格的交叉表 +\n * 可拖拽配置面板(支持顶部水平 / 左右纵向排布,拖拽时带跟随光标的拖拽引用)。\n */\nexport function usePivotExtension<T extends object>(\n options: PivotExtensionOptions,\n): DataTableExtension<T> {\n const {\n fields,\n initialRowFields = [],\n initialColFields = [],\n initialValues = [],\n initialActive = false,\n treeView = true,\n lang = 'zh',\n panelPlacement = 'top',\n panelWidth = 224,\n hideModeToggle = false,\n } = options;\n\n const [active, setActive] = useState(initialActive);\n const [rowFields, setRowFields] = useState<string[]>(initialRowFields);\n const [colFields, setColFields] = useState<string[]>(initialColFields);\n const [values, setValues] = useState<PivotValue[]>(initialValues);\n\n const t = TEXT[lang];\n\n const fieldLabels: PivotFieldLabels = useMemo(() => {\n const map: PivotFieldLabels = {};\n for (const f of fields) map[f.field] = f.label ?? f.field;\n return map;\n }, [fields]);\n\n const dimensionFields = useMemo(\n () => fields.filter((f) => !f.numeric),\n [fields],\n );\n const numericFields = useMemo(\n () => fields.filter((f) => f.numeric),\n [fields],\n );\n\n return useMemo<DataTableExtension<T>>(() => {\n const panel = (orientation: 'horizontal' | 'vertical') => (\n <PivotPanel\n orientation={orientation}\n lang={lang}\n fieldLabels={fieldLabels}\n dimensionFields={dimensionFields}\n numericFields={numericFields}\n rowFields={rowFields}\n colFields={colFields}\n values={values}\n setRowFields={setRowFields}\n setColFields={setColFields}\n setValues={setValues}\n panelWidth={panelWidth}\n />\n );\n\n return {\n name: 'pivot',\n toolbar: () => {\n // 隐藏开关时:未激活不渲染任何内容(不占空间);激活且面板在顶部\n // 时仅渲染面板本身。\n if (hideModeToggle) {\n if (!active || panelPlacement !== 'top') return null;\n return panel('horizontal');\n }\n return (\n <div className=\"w-full flex flex-col gap-2\">\n <label className=\"flex items-center gap-2 cursor-pointer w-fit\">\n <input\n type=\"checkbox\"\n className=\"toggle toggle-sm toggle-primary\"\n checked={active}\n onChange={(e) => setActive(e.target.checked)}\n />\n <span className=\"text-sm font-medium\">{t.pivotMode}</span>\n </label>\n {/* 顶部(水平)面板放在工具栏内。 */}\n {active && panelPlacement === 'top' && panel('horizontal')}\n </div>\n );\n },\n renderContent: (api) => {\n if (!active) return undefined;\n const content = (\n <PivotView<T>\n data={api.data}\n rowFields={rowFields}\n colFields={colFields}\n values={values}\n fieldLabels={fieldLabels}\n lang={lang}\n treeView={treeView}\n />\n );\n // 顶部面板已在工具栏内渲染,这里只渲染表格主体。\n if (panelPlacement === 'top') return content;\n // 底部面板:水平排布在透视表格下方。\n if (panelPlacement === 'bottom') {\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex-1 min-w-0\">{content}</div>\n {panel('horizontal')}\n </div>\n );\n }\n // 左/右侧纵向面板:与透视表格并排,默认与表格同高。\n return (\n <div className=\"flex gap-3 items-stretch\">\n {panelPlacement === 'left' && panel('vertical')}\n <div className=\"flex-1 min-w-0\">{content}</div>\n {panelPlacement === 'right' && panel('vertical')}\n </div>\n );\n },\n };\n }, [\n active,\n rowFields,\n colFields,\n values,\n fieldLabels,\n dimensionFields,\n numericFields,\n treeView,\n lang,\n panelPlacement,\n panelWidth,\n hideModeToggle,\n t,\n ]);\n}\n"],"mappings":"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"}