dishui 0.0.64 → 0.0.65

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 (177) hide show
  1. package/dist/components/Badge/index.js +12 -9
  2. package/dist/components/Badge/index.js.map +1 -1
  3. package/dist/components/Button/index.js +43 -40
  4. package/dist/components/Button/index.js.map +1 -1
  5. package/dist/components/Card/index.d.ts +11 -0
  6. package/dist/components/Card/index.js +62 -37
  7. package/dist/components/Card/index.js.map +1 -1
  8. package/dist/components/Chart/Chart.js.map +1 -1
  9. package/dist/components/Checkbox/index.js +32 -30
  10. package/dist/components/Checkbox/index.js.map +1 -1
  11. package/dist/components/Demo/index.js.map +1 -1
  12. package/dist/components/EmptyState/index.d.ts +4 -1
  13. package/dist/components/EmptyState/index.js +3 -3
  14. package/dist/components/EmptyState/index.js.map +1 -1
  15. package/dist/components/FileUploader/DropZone.js.map +1 -1
  16. package/dist/components/FileUploader/FileItem.js.map +1 -1
  17. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  18. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  19. package/dist/components/Input/index.js +30 -30
  20. package/dist/components/Input/index.js.map +1 -1
  21. package/dist/components/Label/index.js +41 -40
  22. package/dist/components/Label/index.js.map +1 -1
  23. package/dist/components/List/index.js +47 -32
  24. package/dist/components/List/index.js.map +1 -1
  25. package/dist/components/Markdown/Markdown.js +61 -57
  26. package/dist/components/Markdown/Markdown.js.map +1 -1
  27. package/dist/components/Markdown/markdownComponents.js +49 -49
  28. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  29. package/dist/components/Modal/index.d.ts +7 -3
  30. package/dist/components/Modal/index.js +77 -65
  31. package/dist/components/Modal/index.js.map +1 -1
  32. package/dist/components/Page/index.d.ts +58 -0
  33. package/dist/components/Page/index.js +74 -0
  34. package/dist/components/Page/index.js.map +1 -0
  35. package/dist/components/PageHeader/index.js.map +1 -1
  36. package/dist/components/Select/index.js +0 -3
  37. package/dist/components/Select/index.js.map +1 -1
  38. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  39. package/dist/components/StatCard/index.d.ts +3 -1
  40. package/dist/components/StatCard/index.js +39 -11
  41. package/dist/components/StatCard/index.js.map +1 -1
  42. package/dist/components/Table/index.js +103 -85
  43. package/dist/components/Table/index.js.map +1 -1
  44. package/dist/components/Tabs/index.d.ts +19 -5
  45. package/dist/components/Tabs/index.js +32 -13
  46. package/dist/components/Tabs/index.js.map +1 -1
  47. package/dist/components/Tree/Tree.js.map +1 -1
  48. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  49. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  50. package/dist/components/pro/CodeEditor/editors/CodeEditor.js +141 -134
  51. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  52. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +81 -78
  53. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  54. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  55. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  56. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  57. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  58. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  59. package/dist/components/pro/CodeEditor/themes.js +59 -59
  60. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  61. package/dist/components/pro/DataTable/DataTable.js +49 -48
  62. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  63. package/dist/components/pro/DataTable/Filters.js +42 -42
  64. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  65. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  66. package/dist/components/pro/DataTable/PivotView.js +35 -32
  67. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  68. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  69. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  70. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  71. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  72. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  73. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  74. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  75. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  76. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  77. package/dist/components/pro/DataTable/tanstack-table.js +37 -37
  78. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  79. package/dist/components/pro/FileExplorer/Breadcrumb.js +53 -53
  80. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  81. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  82. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  83. package/dist/components/pro/FileExplorer/FileIcon.js +22 -22
  84. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  85. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  86. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  87. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  88. package/dist/components/pro/Flow/Flow.js +496 -494
  89. package/dist/components/pro/Flow/Flow.js.map +1 -1
  90. package/dist/components/pro/Flow/FlowCanvas.js +916 -917
  91. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  92. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  93. package/dist/components/pro/Flow/edges/EdgeRenderer.js +59 -59
  94. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  95. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  96. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  97. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  98. package/dist/components/pro/Flow/hooks/useLayoutActions.js +9 -11
  99. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  100. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  101. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  102. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  103. package/dist/components/pro/Flow/lines/FreehandTool.js +9 -9
  104. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  105. package/dist/components/pro/Flow/lines/LineRenderer.js +5 -5
  106. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  107. package/dist/components/pro/Flow/nodes/DataNodeView.js +113 -93
  108. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  109. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  110. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  111. package/dist/components/pro/Flow/nodes/Model3DView.js +1 -1
  112. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  113. package/dist/components/pro/Flow/nodes/NodeRenderer.js +118 -118
  114. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  115. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  116. package/dist/components/pro/Flow/nodes/shapes.js +1 -3
  117. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  118. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  119. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  120. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  121. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  122. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  123. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  124. package/dist/components/pro/Flow/panels/FlowToolbar.js +97 -97
  125. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  126. package/dist/components/pro/Flow/panels/InspectorPanel.js +57 -57
  127. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  128. package/dist/components/pro/Flow/panels/OutlinePanel.js +26 -22
  129. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  130. package/dist/components/pro/Flow/panels/PresentationMode.js +18 -16
  131. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  132. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  133. package/dist/components/pro/Flow/panels/ShapePalette.js +109 -104
  134. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  135. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  136. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  137. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  138. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  139. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  140. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  141. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  142. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  143. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  144. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  145. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  146. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  147. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  148. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  149. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  150. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  151. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  152. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  153. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  154. package/dist/contexts/AppContext.js.map +1 -1
  155. package/dist/dishui.css +1 -1
  156. package/dist/hooks/useTableColumns.js +7 -8
  157. package/dist/hooks/useTableColumns.js.map +1 -1
  158. package/dist/index.d.ts +2 -0
  159. package/dist/index.js +227 -221
  160. package/dist/layouts/MainLayout.js +22 -22
  161. package/dist/layouts/MainLayout.js.map +1 -1
  162. package/dist/layouts/Navbar.js.map +1 -1
  163. package/dist/layouts/Sidebar.js +94 -73
  164. package/dist/layouts/Sidebar.js.map +1 -1
  165. package/dist/layouts/headbar/Headbar.js.map +1 -1
  166. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  167. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  168. package/dist/layouts/headbar/HeadbarThemeSwitcher.js +11 -11
  169. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  170. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  171. package/dist/utils/i18n.js +10 -10
  172. package/dist/utils/i18n.js.map +1 -1
  173. package/dist/utils/menu.js.map +1 -1
  174. package/dist/utils/routerBuilder.js +17 -15
  175. package/dist/utils/routerBuilder.js.map +1 -1
  176. package/dist/utils/themes.js.map +1 -1
  177. package/package.json +7 -7
@@ -1,20 +1,20 @@
1
- import fo from "../../../Button/index.js";
2
- import { useFlowContext as ko } from "../context/FlowContext.js";
1
+ import ko from "../../../Button/index.js";
2
+ import { useFlowContext as wo } from "../context/FlowContext.js";
3
3
  import { useFlowUI as Y } from "../context/FlowUIContext.js";
4
- import wo from "./ProjectTitle.js";
5
- import { variantEdgeStyle as Co } from "../archify/palette.js";
6
- import { archifyStylePatch as vo, inferComponentType as Io } from "../archify/presets.js";
7
- import { downloadDataURL as q, safeFileBaseName as H, useFlowImportExport as bo } from "../hooks/useFlowImportExport.js";
8
- import { useLayoutActions as yo } from "../hooks/useLayoutActions.js";
9
- import { IconAI as No, IconAlign as d, IconAnchorVisible as go, IconArchify as Ao, IconAutoFocus as So, IconBack as Oo, IconExportJson as xo, IconExportMarkdown as Fo, IconExportPdf as zo, IconExportPng as Ro, IconFitView as Mo, IconGeoGroup as jo, IconGrid as Jo, IconGroup as Lo, IconImport as Go, IconInspector as Po, IconJson as Zo, IconLayer as y, IconMagnet as Uo, IconMiniMap as Eo, IconOutline as To, IconPresent as Bo, IconPublish as Vo, IconRedo as $o, IconShapes as Wo, IconUndo as Do, IconUngroup as qo, IconZoomIn as Ho, IconZoomOut as Yo } from "./toolbarIcons.js";
10
- import { useCallback as C, useRef as _o } from "react";
4
+ import Co from "./ProjectTitle.js";
5
+ import { variantEdgeStyle as vo } from "../archify/palette.js";
6
+ import { archifyStylePatch as Io, inferComponentType as bo } from "../archify/presets.js";
7
+ import { downloadDataURL as q, safeFileBaseName as H, useFlowImportExport as yo } from "../hooks/useFlowImportExport.js";
8
+ import { useLayoutActions as No } from "../hooks/useLayoutActions.js";
9
+ import { IconAI as go, IconAlign as d, IconAnchorVisible as Ao, IconArchify as So, IconAutoFocus as Oo, IconBack as xo, IconExportJson as Fo, IconExportMarkdown as zo, IconExportPdf as Ro, IconExportPng as Mo, IconFitView as jo, IconGeoGroup as Jo, IconGrid as Lo, IconGroup as Go, IconImport as Po, IconInspector as Zo, IconJson as Uo, IconLayer as y, IconMagnet as Eo, IconMiniMap as To, IconOutline as Bo, IconPresent as Vo, IconPublish as $o, IconRedo as Wo, IconShapes as Do, IconUndo as qo, IconUngroup as Ho, IconZoomIn as Yo, IconZoomOut as _o } from "./toolbarIcons.js";
10
+ import { useCallback as C, useRef as Ko } from "react";
11
11
  import { Fragment as N, jsx as o, jsxs as n } from "react/jsx-runtime";
12
- function de() {
12
+ function ht() {
13
13
  const { viewport: r, setViewport: s, autoFocus: a, setAutoFocus: f } = Y(), k = Math.round(r.zoom * 100);
14
14
  return /* @__PURE__ */ n("div", {
15
15
  className: "flow-zoom-controls",
16
16
  children: [
17
- /* @__PURE__ */ o(e, {
17
+ /* @__PURE__ */ o(t, {
18
18
  tip: "缩小",
19
19
  onClick: () => {
20
20
  s({
@@ -22,13 +22,13 @@ function de() {
22
22
  zoom: Math.max(0.1, r.zoom / 1.2)
23
23
  });
24
24
  },
25
- children: /* @__PURE__ */ o(Yo, {})
25
+ children: /* @__PURE__ */ o(_o, {})
26
26
  }),
27
27
  /* @__PURE__ */ n("span", {
28
28
  className: "flow-zoom-info",
29
29
  children: [k, "%"]
30
30
  }),
31
- /* @__PURE__ */ o(e, {
31
+ /* @__PURE__ */ o(t, {
32
32
  tip: "放大",
33
33
  onClick: () => {
34
34
  s({
@@ -36,9 +36,9 @@ function de() {
36
36
  zoom: Math.min(4, r.zoom * 1.2)
37
37
  });
38
38
  },
39
- children: /* @__PURE__ */ o(Ho, {})
39
+ children: /* @__PURE__ */ o(Yo, {})
40
40
  }),
41
- /* @__PURE__ */ o(e, {
41
+ /* @__PURE__ */ o(t, {
42
42
  tip: "适应视图",
43
43
  onClick: () => {
44
44
  s({
@@ -47,22 +47,22 @@ function de() {
47
47
  zoom: 1
48
48
  });
49
49
  },
50
- children: /* @__PURE__ */ o(Mo, {})
50
+ children: /* @__PURE__ */ o(jo, {})
51
51
  }),
52
- /* @__PURE__ */ o(e, {
52
+ /* @__PURE__ */ o(t, {
53
53
  tip: a ? "关闭 Auto Focus" : "开启 Auto Focus",
54
54
  active: a,
55
55
  onClick: () => f(!a),
56
- children: /* @__PURE__ */ o(So, {})
56
+ children: /* @__PURE__ */ o(Oo, {})
57
57
  })
58
58
  ]
59
59
  });
60
60
  }
61
- function e({ tip: r, shortcut: s, onClick: a, active: f, disabled: k, children: m }) {
61
+ function t({ tip: r, shortcut: s, onClick: a, active: f, disabled: k, children: m }) {
62
62
  const h = s ? `${r} (${s})` : r;
63
63
  return /* @__PURE__ */ n("span", {
64
64
  className: "flow-tip",
65
- children: [/* @__PURE__ */ o(fo, {
65
+ children: [/* @__PURE__ */ o(ko, {
66
66
  size: "xs",
67
67
  variant: f ? "primary" : "ghost",
68
68
  onClick: a,
@@ -80,27 +80,27 @@ function e({ tip: r, shortcut: s, onClick: a, active: f, disabled: k, children:
80
80
  })]
81
81
  });
82
82
  }
83
- function he({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup: m, onGeoGroup: h, onUngroup: v, onExportPNG: x, onExportPDF: F, onPublish: z, compact: R }) {
84
- const { showGrid: M, setShowGrid: _, showPalette: j, setShowPalette: K, showInspector: J, setShowInspector: Q, showOutline: L, setShowOutline: X, showJson: G, setShowJson: oo, showAI: P, setShowAI: eo, showMiniMap: Z, setShowMiniMap: to, showAnchors: I, setShowAnchors: io, presentation: U, setPresentation: no, placementSnap: g, setPlacementSnap: lo } = Y(), { doc: w, selection: p, currentCanvas: co, setDoc: E, currentCanvasId: A } = ko(), { exportJSON: T, importJSON: B, exportMarkdown: V } = bo(), { align: u, distribute: $, changeZIndex: b } = yo(), W = _o(null), S = p.nodeIds.size + p.lineIds.size, ro = p.nodeIds.size > 0 && co.nodes.some((t) => p.nodeIds.has(t.id) && (t.type === "flowGroup" || t.type === "geometryGroup" || t.data.isGroup)), O = Object.values(w.canvases).some((t) => t.nodes.some((l) => l.type === "animAnchor")), so = C(() => {
85
- const t = T(), l = new Blob([t], { type: "application/json" }), c = URL.createObjectURL(l);
83
+ function pt({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup: m, onGeoGroup: h, onUngroup: v, onExportPNG: x, onExportPDF: F, onPublish: z, compact: R }) {
84
+ const { showGrid: M, setShowGrid: _, showPalette: j, setShowPalette: K, showInspector: J, setShowInspector: Q, showOutline: L, setShowOutline: X, showJson: G, setShowJson: oo, showAI: P, setShowAI: to, showMiniMap: Z, setShowMiniMap: eo, showAnchors: I, setShowAnchors: io, presentation: U, setPresentation: no, placementSnap: g, setPlacementSnap: lo } = Y(), { doc: w, selection: p, currentCanvas: co, setDoc: E, currentCanvasId: A } = wo(), { exportJSON: T, importJSON: B, exportMarkdown: V } = yo(), { align: u, distribute: $, changeZIndex: b } = No(), W = Ko(null), S = p.nodeIds.size + p.lineIds.size, ro = p.nodeIds.size > 0 && co.nodes.some((e) => p.nodeIds.has(e.id) && (e.type === "flowGroup" || e.type === "geometryGroup" || e.data.isGroup)), O = Object.values(w.canvases).some((e) => e.nodes.some((l) => l.type === "animAnchor")), so = C(() => {
85
+ const e = T(), l = new Blob([e], { type: "application/json" }), c = URL.createObjectURL(l);
86
86
  q(c, `${H(w.title)}.json`), URL.revokeObjectURL(c);
87
87
  }, [T, w.title]), ao = C(() => {
88
- const t = V(), l = new Blob([t], { type: "text/markdown" }), c = URL.createObjectURL(l);
88
+ const e = V(), l = new Blob([e], { type: "text/markdown" }), c = URL.createObjectURL(l);
89
89
  q(c, `${H(w.title)}.md`), URL.revokeObjectURL(c);
90
90
  }, [V, w.title]), ho = C(() => {
91
91
  W.current?.click();
92
92
  }, []), po = C(() => {
93
- E((t) => {
94
- const l = t.canvases[A];
95
- if (!l) return t;
93
+ E((e) => {
94
+ const l = e.canvases[A];
95
+ if (!l) return e;
96
96
  const c = l.nodes.map((i) => i.type === "animAnchor" || i.type === "shapeSvg" || i.data.isGroup || i.type === "flowGroup" || i.type === "geometryGroup" ? i : {
97
97
  ...i,
98
98
  data: {
99
99
  ...i.data,
100
- ...vo(Io(i.data))
100
+ ...Io(bo(i.data))
101
101
  }
102
102
  }), uo = l.edges.map((i) => {
103
- const D = Co(i.data.strokeColor && i.data.strokeColor !== "#64748b" ? "emphasis" : "default");
103
+ const fo = i.data.strokeColor && i.data.strokeColor !== "#64748b", D = vo(fo ? "emphasis" : "default");
104
104
  return {
105
105
  ...i,
106
106
  data: {
@@ -110,9 +110,9 @@ function he({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
110
110
  };
111
111
  });
112
112
  return {
113
- ...t,
113
+ ...e,
114
114
  canvases: {
115
- ...t.canvases,
115
+ ...e.canvases,
116
116
  [A]: {
117
117
  ...l,
118
118
  nodes: c,
@@ -121,13 +121,13 @@ function he({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
121
121
  }
122
122
  };
123
123
  });
124
- }, [E, A]), mo = C((t) => {
125
- const l = t.target.files?.[0];
124
+ }, [E, A]), mo = C((e) => {
125
+ const l = e.target.files?.[0];
126
126
  if (!l) return;
127
127
  const c = new FileReader();
128
128
  c.onload = () => {
129
129
  typeof c.result == "string" && B(c.result);
130
- }, c.readAsText(l), t.target.value = "";
130
+ }, c.readAsText(l), e.target.value = "";
131
131
  }, [B]);
132
132
  return /* @__PURE__ */ n("div", {
133
133
  className: `flow-toolbar${R ? " flow-toolbar--compact" : ""}`,
@@ -139,71 +139,71 @@ function he({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
139
139
  style: { display: "none" },
140
140
  onChange: mo
141
141
  }),
142
- !R && /* @__PURE__ */ o(wo, {}),
142
+ !R && /* @__PURE__ */ o(Co, {}),
143
143
  r && /* @__PURE__ */ n(N, { children: [/* @__PURE__ */ o("div", {
144
144
  className: "flow-toolbar-group",
145
- children: /* @__PURE__ */ o(e, {
145
+ children: /* @__PURE__ */ o(t, {
146
146
  tip: "返回列表",
147
147
  onClick: r,
148
- children: /* @__PURE__ */ o(Oo, {})
148
+ children: /* @__PURE__ */ o(xo, {})
149
149
  })
150
150
  }), /* @__PURE__ */ o("div", { className: "flow-toolbar-divider" })] }),
151
151
  (s || a) && /* @__PURE__ */ n("div", {
152
152
  className: "flow-toolbar-group",
153
- children: [s && /* @__PURE__ */ o(e, {
153
+ children: [s && /* @__PURE__ */ o(t, {
154
154
  tip: "撤销",
155
155
  shortcut: "Ctrl+Z",
156
156
  onClick: s,
157
157
  disabled: !f,
158
- children: /* @__PURE__ */ o(Do, {})
159
- }), a && /* @__PURE__ */ o(e, {
158
+ children: /* @__PURE__ */ o(qo, {})
159
+ }), a && /* @__PURE__ */ o(t, {
160
160
  tip: "重做",
161
161
  shortcut: "Ctrl+Shift+Z",
162
162
  onClick: a,
163
163
  disabled: !k,
164
- children: /* @__PURE__ */ o($o, {})
164
+ children: /* @__PURE__ */ o(Wo, {})
165
165
  })]
166
166
  }),
167
167
  p.nodeIds.size >= 2 && /* @__PURE__ */ n(N, { children: [/* @__PURE__ */ o("div", { className: "flow-toolbar-divider" }), /* @__PURE__ */ n("div", {
168
168
  className: "flow-toolbar-group",
169
169
  children: [
170
- /* @__PURE__ */ o(e, {
170
+ /* @__PURE__ */ o(t, {
171
171
  tip: "居左",
172
172
  onClick: () => u("left"),
173
173
  children: /* @__PURE__ */ o(d, { kind: "left" })
174
174
  }),
175
- /* @__PURE__ */ o(e, {
175
+ /* @__PURE__ */ o(t, {
176
176
  tip: "水平居中",
177
177
  onClick: () => u("center-h"),
178
178
  children: /* @__PURE__ */ o(d, { kind: "center-h" })
179
179
  }),
180
- /* @__PURE__ */ o(e, {
180
+ /* @__PURE__ */ o(t, {
181
181
  tip: "居右",
182
182
  onClick: () => u("right"),
183
183
  children: /* @__PURE__ */ o(d, { kind: "right" })
184
184
  }),
185
- /* @__PURE__ */ o(e, {
185
+ /* @__PURE__ */ o(t, {
186
186
  tip: "居上",
187
187
  onClick: () => u("top"),
188
188
  children: /* @__PURE__ */ o(d, { kind: "top" })
189
189
  }),
190
- /* @__PURE__ */ o(e, {
190
+ /* @__PURE__ */ o(t, {
191
191
  tip: "垂直居中",
192
192
  onClick: () => u("center-v"),
193
193
  children: /* @__PURE__ */ o(d, { kind: "center-v" })
194
194
  }),
195
- /* @__PURE__ */ o(e, {
195
+ /* @__PURE__ */ o(t, {
196
196
  tip: "居下",
197
197
  onClick: () => u("bottom"),
198
198
  children: /* @__PURE__ */ o(d, { kind: "bottom" })
199
199
  }),
200
- /* @__PURE__ */ o(e, {
200
+ /* @__PURE__ */ o(t, {
201
201
  tip: "水平平分",
202
202
  onClick: () => $("horizontal"),
203
203
  disabled: p.nodeIds.size < 3,
204
204
  children: /* @__PURE__ */ o(d, { kind: "distribute-h" })
205
205
  }),
206
- /* @__PURE__ */ o(e, {
206
+ /* @__PURE__ */ o(t, {
207
207
  tip: "垂直平分",
208
208
  onClick: () => $("vertical"),
209
209
  disabled: p.nodeIds.size < 3,
@@ -214,22 +214,22 @@ function he({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
214
214
  S >= 1 && /* @__PURE__ */ n(N, { children: [/* @__PURE__ */ o("div", { className: "flow-toolbar-divider" }), /* @__PURE__ */ n("div", {
215
215
  className: "flow-toolbar-group",
216
216
  children: [
217
- /* @__PURE__ */ o(e, {
217
+ /* @__PURE__ */ o(t, {
218
218
  tip: "置于顶层",
219
219
  onClick: () => b("front"),
220
220
  children: /* @__PURE__ */ o(y, { kind: "front" })
221
221
  }),
222
- /* @__PURE__ */ o(e, {
222
+ /* @__PURE__ */ o(t, {
223
223
  tip: "上移一层",
224
224
  onClick: () => b("up"),
225
225
  children: /* @__PURE__ */ o(y, { kind: "up" })
226
226
  }),
227
- /* @__PURE__ */ o(e, {
227
+ /* @__PURE__ */ o(t, {
228
228
  tip: "下移一层",
229
229
  onClick: () => b("down"),
230
230
  children: /* @__PURE__ */ o(y, { kind: "down" })
231
231
  }),
232
- /* @__PURE__ */ o(e, {
232
+ /* @__PURE__ */ o(t, {
233
233
  tip: "置于底层",
234
234
  onClick: () => b("back"),
235
235
  children: /* @__PURE__ */ o(y, { kind: "back" })
@@ -239,26 +239,26 @@ function he({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
239
239
  (m || h || v) && /* @__PURE__ */ n(N, { children: [/* @__PURE__ */ o("div", { className: "flow-toolbar-divider" }), /* @__PURE__ */ n("div", {
240
240
  className: "flow-toolbar-group",
241
241
  children: [
242
- m && /* @__PURE__ */ o(e, {
242
+ m && /* @__PURE__ */ o(t, {
243
243
  tip: "成组",
244
244
  shortcut: "⌘G",
245
245
  onClick: m,
246
246
  disabled: S < 2,
247
- children: /* @__PURE__ */ o(Lo, {})
247
+ children: /* @__PURE__ */ o(Go, {})
248
248
  }),
249
- h && /* @__PURE__ */ o(e, {
249
+ h && /* @__PURE__ */ o(t, {
250
250
  tip: "几何分组",
251
251
  shortcut: "⌘⌥G",
252
252
  onClick: h,
253
253
  disabled: S < 2,
254
- children: /* @__PURE__ */ o(jo, {})
254
+ children: /* @__PURE__ */ o(Jo, {})
255
255
  }),
256
- v && /* @__PURE__ */ o(e, {
256
+ v && /* @__PURE__ */ o(t, {
257
257
  tip: "取消成组",
258
258
  shortcut: "⌘⇧G",
259
259
  onClick: v,
260
260
  disabled: !ro,
261
- children: /* @__PURE__ */ o(qo, {})
261
+ children: /* @__PURE__ */ o(Ho, {})
262
262
  })
263
263
  ]
264
264
  })] }),
@@ -266,46 +266,46 @@ function he({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
266
266
  /* @__PURE__ */ n("div", {
267
267
  className: "flow-toolbar-group",
268
268
  children: [
269
- /* @__PURE__ */ o(e, {
269
+ /* @__PURE__ */ o(t, {
270
270
  tip: "网格",
271
271
  active: M,
272
272
  onClick: () => _(!M),
273
- children: /* @__PURE__ */ o(Jo, {})
273
+ children: /* @__PURE__ */ o(Lo, {})
274
274
  }),
275
- /* @__PURE__ */ o(e, {
275
+ /* @__PURE__ */ o(t, {
276
276
  tip: g ? "放置吸附网格:开(盖章自动贴近网格)" : "放置吸附网格:关(自由放置)",
277
277
  active: g,
278
278
  onClick: () => lo(!g),
279
- children: /* @__PURE__ */ o(Uo, {})
279
+ children: /* @__PURE__ */ o(Eo, {})
280
280
  }),
281
- /* @__PURE__ */ o(e, {
281
+ /* @__PURE__ */ o(t, {
282
282
  tip: "缩略图",
283
283
  active: Z,
284
- onClick: () => to(!Z),
285
- children: /* @__PURE__ */ o(Eo, {})
284
+ onClick: () => eo(!Z),
285
+ children: /* @__PURE__ */ o(To, {})
286
286
  }),
287
- /* @__PURE__ */ o(e, {
287
+ /* @__PURE__ */ o(t, {
288
288
  tip: I ? "隐藏所有 Anchor 对象" : "显示所有 Anchor 对象",
289
289
  active: I,
290
290
  disabled: !O,
291
291
  onClick: () => {
292
292
  O && io(!I);
293
293
  },
294
- children: /* @__PURE__ */ o(go, { visible: I })
294
+ children: /* @__PURE__ */ o(Ao, { visible: I })
295
295
  }),
296
- /* @__PURE__ */ o(e, {
296
+ /* @__PURE__ */ o(t, {
297
297
  tip: "动画预览",
298
298
  active: U !== null,
299
299
  onClick: () => no(U ? null : {
300
300
  current: 0,
301
301
  showAnchor: !1
302
302
  }),
303
- children: /* @__PURE__ */ o(Bo, {})
303
+ children: /* @__PURE__ */ o(Vo, {})
304
304
  }),
305
- /* @__PURE__ */ o(e, {
305
+ /* @__PURE__ */ o(t, {
306
306
  tip: "应用 Archify 风格(当前画布)",
307
307
  onClick: po,
308
- children: /* @__PURE__ */ o(Ao, {})
308
+ children: /* @__PURE__ */ o(So, {})
309
309
  })
310
310
  ]
311
311
  }),
@@ -313,35 +313,35 @@ function he({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
313
313
  /* @__PURE__ */ n("div", {
314
314
  className: "flow-toolbar-group",
315
315
  children: [
316
- /* @__PURE__ */ o(e, {
316
+ /* @__PURE__ */ o(t, {
317
317
  tip: "形状面板",
318
318
  active: j,
319
319
  onClick: () => K(!j),
320
- children: /* @__PURE__ */ o(Wo, {})
320
+ children: /* @__PURE__ */ o(Do, {})
321
321
  }),
322
- /* @__PURE__ */ o(e, {
322
+ /* @__PURE__ */ o(t, {
323
323
  tip: "属性面板",
324
324
  active: J,
325
325
  onClick: () => Q(!J),
326
- children: /* @__PURE__ */ o(Po, {})
326
+ children: /* @__PURE__ */ o(Zo, {})
327
327
  }),
328
- /* @__PURE__ */ o(e, {
328
+ /* @__PURE__ */ o(t, {
329
329
  tip: "大纲",
330
330
  active: L,
331
331
  onClick: () => X(!L),
332
- children: /* @__PURE__ */ o(To, {})
332
+ children: /* @__PURE__ */ o(Bo, {})
333
333
  }),
334
- /* @__PURE__ */ o(e, {
334
+ /* @__PURE__ */ o(t, {
335
335
  tip: "JSON",
336
336
  active: G,
337
337
  onClick: () => oo(!G),
338
- children: /* @__PURE__ */ o(Zo, {})
338
+ children: /* @__PURE__ */ o(Uo, {})
339
339
  }),
340
- /* @__PURE__ */ o(e, {
340
+ /* @__PURE__ */ o(t, {
341
341
  tip: "AI 助手",
342
342
  active: P,
343
- onClick: () => eo(!P),
344
- children: /* @__PURE__ */ o(No, {})
343
+ onClick: () => to(!P),
344
+ children: /* @__PURE__ */ o(go, {})
345
345
  })
346
346
  ]
347
347
  }),
@@ -349,39 +349,39 @@ function he({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
349
349
  /* @__PURE__ */ n("div", {
350
350
  className: "flow-toolbar-group",
351
351
  children: [
352
- /* @__PURE__ */ o(e, {
352
+ /* @__PURE__ */ o(t, {
353
353
  tip: "导入 JSON",
354
354
  onClick: ho,
355
- children: /* @__PURE__ */ o(Go, {})
355
+ children: /* @__PURE__ */ o(Po, {})
356
356
  }),
357
- /* @__PURE__ */ o(e, {
357
+ /* @__PURE__ */ o(t, {
358
358
  tip: "导出 JSON",
359
359
  onClick: so,
360
- children: /* @__PURE__ */ o(xo, {})
360
+ children: /* @__PURE__ */ o(Fo, {})
361
361
  }),
362
- /* @__PURE__ */ o(e, {
362
+ /* @__PURE__ */ o(t, {
363
363
  tip: "导出 Markdown",
364
364
  onClick: ao,
365
- children: /* @__PURE__ */ o(Fo, {})
365
+ children: /* @__PURE__ */ o(zo, {})
366
366
  }),
367
- x && /* @__PURE__ */ o(e, {
367
+ x && /* @__PURE__ */ o(t, {
368
368
  tip: "导出 PNG",
369
369
  onClick: () => {
370
370
  x();
371
371
  },
372
- children: /* @__PURE__ */ o(Ro, {})
372
+ children: /* @__PURE__ */ o(Mo, {})
373
373
  }),
374
- F && O && /* @__PURE__ */ o(e, {
374
+ F && O && /* @__PURE__ */ o(t, {
375
375
  tip: "导出 PDF(按锦点顺序)",
376
376
  onClick: () => {
377
377
  F();
378
378
  },
379
- children: /* @__PURE__ */ o(zo, {})
379
+ children: /* @__PURE__ */ o(Ro, {})
380
380
  }),
381
- z && /* @__PURE__ */ o(e, {
381
+ z && /* @__PURE__ */ o(t, {
382
382
  tip: "发布与共享",
383
383
  onClick: z,
384
- children: /* @__PURE__ */ o(Vo, {})
384
+ children: /* @__PURE__ */ o($o, {})
385
385
  })
386
386
  ]
387
387
  })
@@ -389,8 +389,8 @@ function he({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
389
389
  });
390
390
  }
391
391
  export {
392
- de as FlowZoomControls,
393
- he as default
392
+ ht as FlowZoomControls,
393
+ pt as default
394
394
  };
395
395
 
396
396
  //# sourceMappingURL=FlowToolbar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FlowToolbar.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/FlowToolbar.tsx"],"sourcesContent":["import React, { useRef, useCallback } from 'react';\nimport Button from '../../../Button';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport ProjectTitle from './ProjectTitle';\nimport { useFlowImportExport, downloadDataURL, safeFileBaseName } from '../hooks/useFlowImportExport';\nimport { useLayoutActions } from '../hooks/useLayoutActions';\nimport { archifyStylePatch, inferComponentType, ARCHIFY_ARROW, variantEdgeStyle } from '../archify';\n\nimport {\n IconBack,\n IconUndo,\n IconRedo,\n IconGroup,\n IconGeoGroup,\n IconUngroup,\n IconAlign,\n IconZoomIn,\n IconZoomOut,\n IconFitView,\n IconAutoFocus,\n IconShapes,\n IconInspector,\n IconOutline,\n IconJson,\n IconAI,\n IconGrid,\n IconMagnet,\n IconMiniMap,\n IconImport,\n IconExportJson,\n IconExportPng,\n IconExportPdf,\n IconExportMarkdown,\n IconLayer,\n IconPublish,\n IconAnchorVisible,\n IconPresent,\n IconArchify,\n} from './toolbarIcons';\n\n/** Compact zoom / view controls floated over the bottom-left of the canvas. */\nexport function FlowZoomControls() {\n const { viewport, setViewport, autoFocus, setAutoFocus } = useFlowUI();\n const zoomPercent = Math.round(viewport.zoom * 100);\n\n const handleZoomIn = () => {\n setViewport({ ...viewport, zoom: Math.min(4, viewport.zoom * 1.2) });\n };\n const handleZoomOut = () => {\n setViewport({ ...viewport, zoom: Math.max(0.1, viewport.zoom / 1.2) });\n };\n const handleFitView = () => {\n setViewport({ x: 0, y: 0, zoom: 1 });\n };\n\n return (\n <div className=\"flow-zoom-controls\">\n <ToolButton tip=\"缩小\" onClick={handleZoomOut}>\n <IconZoomOut />\n </ToolButton>\n <span className=\"flow-zoom-info\">{zoomPercent}%</span>\n <ToolButton tip=\"放大\" onClick={handleZoomIn}>\n <IconZoomIn />\n </ToolButton>\n <ToolButton tip=\"适应视图\" onClick={handleFitView}>\n <IconFitView />\n </ToolButton>\n <ToolButton\n tip={autoFocus ? '关闭 Auto Focus' : '开启 Auto Focus'}\n active={autoFocus}\n onClick={() => setAutoFocus(!autoFocus)}\n >\n <IconAutoFocus />\n </ToolButton>\n </div>\n );\n}\n\n\n/** A toolbar button with an accessible, hover-revealed tooltip below it. */\ninterface ToolButtonProps {\n tip: string;\n shortcut?: string;\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nfunction ToolButton({ tip, shortcut, onClick, active, disabled, children }: ToolButtonProps) {\n const label = shortcut ? `${tip} (${shortcut})` : tip;\n return (\n <span className=\"flow-tip\">\n <Button\n size=\"xs\"\n variant={active ? 'primary' : 'ghost'}\n onClick={onClick}\n disabled={disabled}\n square\n >\n <span aria-label={label} style={{ display: 'inline-flex' }}>{children}</span>\n </Button>\n <span className=\"flow-tip-label\" role=\"tooltip\">{label}</span>\n </span>\n );\n}\n\nexport interface FlowToolbarProps {\n onBack?: () => void;\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n onGroup?: () => void;\n onGeoGroup?: () => void;\n onUngroup?: () => void;\n onExportPNG?: () => void | Promise<void>;\n /** Export anchors as a PDF slideshow from the built-in toolbar. */\n onExportPDF?: () => void | Promise<void>;\n onPublish?: () => void;\n /** Small-screen (container-width) layout: the title gets its own row and\n * button groups wrap below instead of sliding under the absolute title. */\n compact?: boolean;\n}\n\nexport default function FlowToolbar({ onBack, onUndo, onRedo, canUndo, canRedo, onGroup, onGeoGroup, onUngroup, onExportPNG, onExportPDF, onPublish, compact }: FlowToolbarProps) {\n const {\n showGrid, setShowGrid,\n showPalette, setShowPalette,\n showInspector, setShowInspector,\n showOutline, setShowOutline,\n showJson, setShowJson,\n showAI, setShowAI,\n showMiniMap, setShowMiniMap,\n showAnchors, setShowAnchors,\n presentation, setPresentation,\n placementSnap, setPlacementSnap,\n } = useFlowUI();\n const { doc, selection, currentCanvas, setDoc, currentCanvasId } = useFlowContext();\n const { exportJSON, importJSON, exportMarkdown } = useFlowImportExport();\n const { align, distribute, changeZIndex } = useLayoutActions();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const selTotalCount = selection.nodeIds.size + selection.lineIds.size;\n const hasGroupSelected = selection.nodeIds.size > 0 && currentCanvas.nodes.some(\n n => selection.nodeIds.has(n.id) && (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup),\n );\n const hasAnchors = Object.values(doc.canvases).some(canvas =>\n canvas.nodes.some(node => node.type === 'animAnchor'),\n );\n\n\n const handleExportJSON = useCallback(() => {\n const json = exportJSON();\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n downloadDataURL(url, `${safeFileBaseName(doc.title)}.json`);\n URL.revokeObjectURL(url);\n }, [exportJSON, doc.title]);\n\n const handleExportMarkdown = useCallback(() => {\n const md = exportMarkdown();\n const blob = new Blob([md], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n downloadDataURL(url, `${safeFileBaseName(doc.title)}.md`);\n URL.revokeObjectURL(url);\n }, [exportMarkdown, doc.title]);\n\n const handleImportJSON = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n /**\n * Recolor the current canvas to the unified Archify style: every plain shape\n * node adopts its inferred semantic card colors, and every edge is restyled\n * by its arrow color. Content, geometry, and any sub-labels/tags are kept.\n */\n const handleApplyArchifyStyle = useCallback(() => {\n setDoc((prev) => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const nodes = canvas.nodes.map((n) => {\n if (n.type === 'animAnchor' || n.type === 'shapeSvg') return n;\n if (n.data.isGroup || n.type === 'flowGroup' || n.type === 'geometryGroup') return n;\n // Media nodes (including data charts) adopt the semantic card colors; the\n // chart's primary series color follows the node `color` at render time.\n return { ...n, data: { ...n.data, ...archifyStylePatch(inferComponentType(n.data)) } };\n });\n const edges = canvas.edges.map((e) => {\n const isEmphasis = e.data.strokeColor && e.data.strokeColor !== ARCHIFY_ARROW;\n const style = variantEdgeStyle(isEmphasis ? 'emphasis' : 'default');\n return {\n ...e,\n data: {\n ...e.data,\n strokeColor: e.data.strokeColor && e.data.strokeColor.startsWith('theme:')\n ? style.color\n : (e.data.strokeColor ?? style.color),\n },\n };\n });\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, nodes, edges } },\n };\n });\n }, [setDoc, currentCanvasId]);\n\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === 'string') importJSON(reader.result);\n };\n reader.readAsText(file);\n e.target.value = '';\n }, [importJSON]);\n\n return (\n <div className={`flow-toolbar${compact ? ' flow-toolbar--compact' : ''}`}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json\"\n style={{ display: 'none' }}\n onChange={handleFileChange}\n />\n\n {/* Editable project title, anchored to the toolbar's left edge. Hidden\n in compact mode: the host app's header already shows the name, and\n the narrow toolbar needs the row for buttons. */}\n {!compact && <ProjectTitle />}\n\n {onBack && (\n <>\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"返回列表\" onClick={onBack}>\n <IconBack />\n </ToolButton>\n </div>\n <div className=\"flow-toolbar-divider\" />\n </>\n )}\n\n {/* 历史:撤销 / 重做 */}\n {(onUndo || onRedo) && (\n <div className=\"flow-toolbar-group\">\n {onUndo && (\n <ToolButton tip=\"撤销\" shortcut=\"Ctrl+Z\" onClick={onUndo} disabled={!canUndo}>\n <IconUndo />\n </ToolButton>\n )}\n {onRedo && (\n <ToolButton tip=\"重做\" shortcut=\"Ctrl+Shift+Z\" onClick={onRedo} disabled={!canRedo}>\n <IconRedo />\n </ToolButton>\n )}\n </div>\n )}\n\n {/* 排列:对齐 / 平分 */}\n {selection.nodeIds.size >= 2 && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"居左\" onClick={() => align('left')}><IconAlign kind=\"left\" /></ToolButton>\n <ToolButton tip=\"水平居中\" onClick={() => align('center-h')}><IconAlign kind=\"center-h\" /></ToolButton>\n <ToolButton tip=\"居右\" onClick={() => align('right')}><IconAlign kind=\"right\" /></ToolButton>\n <ToolButton tip=\"居上\" onClick={() => align('top')}><IconAlign kind=\"top\" /></ToolButton>\n <ToolButton tip=\"垂直居中\" onClick={() => align('center-v')}><IconAlign kind=\"center-v\" /></ToolButton>\n <ToolButton tip=\"居下\" onClick={() => align('bottom')}><IconAlign kind=\"bottom\" /></ToolButton>\n <ToolButton tip=\"水平平分\" onClick={() => distribute('horizontal')} disabled={selection.nodeIds.size < 3}>\n <IconAlign kind=\"distribute-h\" />\n </ToolButton>\n <ToolButton tip=\"垂直平分\" onClick={() => distribute('vertical')} disabled={selection.nodeIds.size < 3}>\n <IconAlign kind=\"distribute-v\" />\n </ToolButton>\n </div>\n </>\n )}\n\n {/* 图层:置顶 / 上移 / 下移 / 置底 */}\n {selTotalCount >= 1 && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"置于顶层\" onClick={() => changeZIndex('front')}><IconLayer kind=\"front\" /></ToolButton>\n <ToolButton tip=\"上移一层\" onClick={() => changeZIndex('up')}><IconLayer kind=\"up\" /></ToolButton>\n <ToolButton tip=\"下移一层\" onClick={() => changeZIndex('down')}><IconLayer kind=\"down\" /></ToolButton>\n <ToolButton tip=\"置于底层\" onClick={() => changeZIndex('back')}><IconLayer kind=\"back\" /></ToolButton>\n </div>\n </>\n )}\n\n {/* 组合:成组 / 几何分组 / 取消成组 */}\n {(onGroup || onGeoGroup || onUngroup) && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n {onGroup && (\n <ToolButton tip=\"成组\" shortcut=\"⌘G\" onClick={onGroup} disabled={selTotalCount < 2}>\n <IconGroup />\n </ToolButton>\n )}\n {onGeoGroup && (\n <ToolButton tip=\"几何分组\" shortcut=\"⌘⌥G\" onClick={onGeoGroup} disabled={selTotalCount < 2}>\n <IconGeoGroup />\n </ToolButton>\n )}\n {onUngroup && (\n <ToolButton tip=\"取消成组\" shortcut=\"⌘⇧G\" onClick={onUngroup} disabled={!hasGroupSelected}>\n <IconUngroup />\n </ToolButton>\n )}\n </div>\n </>\n )}\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 视图:网格 / 缩略图 / Anchor / 动画预览 */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"网格\" active={showGrid} onClick={() => setShowGrid(!showGrid)}>\n <IconGrid />\n </ToolButton>\n <ToolButton\n tip={placementSnap ? '放置吸附网格:开(盖章自动贴近网格)' : '放置吸附网格:关(自由放置)'}\n active={placementSnap}\n onClick={() => setPlacementSnap(!placementSnap)}\n >\n <IconMagnet />\n </ToolButton>\n <ToolButton tip=\"缩略图\" active={showMiniMap} onClick={() => setShowMiniMap(!showMiniMap)}>\n <IconMiniMap />\n </ToolButton>\n <ToolButton\n tip={showAnchors ? '隐藏所有 Anchor 对象' : '显示所有 Anchor 对象'}\n active={showAnchors}\n disabled={!hasAnchors}\n onClick={() => {\n if (hasAnchors) setShowAnchors(!showAnchors);\n }}\n >\n <IconAnchorVisible visible={showAnchors} />\n </ToolButton>\n <ToolButton\n tip=\"动画预览\"\n active={presentation !== null}\n onClick={() => setPresentation(presentation ? null : { current: 0, showAnchor: false })}\n >\n <IconPresent />\n </ToolButton>\n <ToolButton\n tip=\"应用 Archify 风格(当前画布)\"\n onClick={handleApplyArchifyStyle}\n >\n <IconArchify />\n </ToolButton>\n </div>\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 面板:形状 / 属性 / 大纲 / JSON */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"形状面板\" active={showPalette} onClick={() => setShowPalette(!showPalette)}>\n <IconShapes />\n </ToolButton>\n <ToolButton tip=\"属性面板\" active={showInspector} onClick={() => setShowInspector(!showInspector)}>\n <IconInspector />\n </ToolButton>\n <ToolButton tip=\"大纲\" active={showOutline} onClick={() => setShowOutline(!showOutline)}>\n <IconOutline />\n </ToolButton>\n <ToolButton tip=\"JSON\" active={showJson} onClick={() => setShowJson(!showJson)}>\n <IconJson />\n </ToolButton>\n <ToolButton tip=\"AI 助手\" active={showAI} onClick={() => setShowAI(!showAI)}>\n <IconAI />\n </ToolButton>\n </div>\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 文件:导入 / 导出 / 发布 */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"导入 JSON\" onClick={handleImportJSON}>\n <IconImport />\n </ToolButton>\n <ToolButton tip=\"导出 JSON\" onClick={handleExportJSON}>\n <IconExportJson />\n </ToolButton>\n <ToolButton tip=\"导出 Markdown\" onClick={handleExportMarkdown}>\n <IconExportMarkdown />\n </ToolButton>\n {onExportPNG && (\n <ToolButton tip=\"导出 PNG\" onClick={() => void onExportPNG()}>\n <IconExportPng />\n </ToolButton>\n )}\n {onExportPDF && hasAnchors && (\n <ToolButton tip=\"导出 PDF(按锦点顺序)\" onClick={() => void onExportPDF()}>\n <IconExportPdf />\n </ToolButton>\n )}\n {onPublish && (\n <ToolButton tip=\"发布与共享\" onClick={onPublish}>\n <IconPublish />\n </ToolButton>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FlowToolbar.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/FlowToolbar.tsx"],"sourcesContent":["import React, { useRef, useCallback } from 'react';\nimport Button from '../../../Button';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport ProjectTitle from './ProjectTitle';\nimport { useFlowImportExport, downloadDataURL, safeFileBaseName } from '../hooks/useFlowImportExport';\nimport { useLayoutActions } from '../hooks/useLayoutActions';\nimport { archifyStylePatch, inferComponentType, ARCHIFY_ARROW, variantEdgeStyle } from '../archify';\n\nimport {\n IconBack,\n IconUndo,\n IconRedo,\n IconGroup,\n IconGeoGroup,\n IconUngroup,\n IconAlign,\n IconZoomIn,\n IconZoomOut,\n IconFitView,\n IconAutoFocus,\n IconShapes,\n IconInspector,\n IconOutline,\n IconJson,\n IconAI,\n IconGrid,\n IconMagnet,\n IconMiniMap,\n IconImport,\n IconExportJson,\n IconExportPng,\n IconExportPdf,\n IconExportMarkdown,\n IconLayer,\n IconPublish,\n IconAnchorVisible,\n IconPresent,\n IconArchify,\n} from './toolbarIcons';\n\n/** Compact zoom / view controls floated over the bottom-left of the canvas. */\nexport function FlowZoomControls() {\n const { viewport, setViewport, autoFocus, setAutoFocus } = useFlowUI();\n const zoomPercent = Math.round(viewport.zoom * 100);\n\n const handleZoomIn = () => {\n setViewport({ ...viewport, zoom: Math.min(4, viewport.zoom * 1.2) });\n };\n const handleZoomOut = () => {\n setViewport({ ...viewport, zoom: Math.max(0.1, viewport.zoom / 1.2) });\n };\n const handleFitView = () => {\n setViewport({ x: 0, y: 0, zoom: 1 });\n };\n\n return (\n <div className=\"flow-zoom-controls\">\n <ToolButton tip=\"缩小\" onClick={handleZoomOut}>\n <IconZoomOut />\n </ToolButton>\n <span className=\"flow-zoom-info\">{zoomPercent}%</span>\n <ToolButton tip=\"放大\" onClick={handleZoomIn}>\n <IconZoomIn />\n </ToolButton>\n <ToolButton tip=\"适应视图\" onClick={handleFitView}>\n <IconFitView />\n </ToolButton>\n <ToolButton\n tip={autoFocus ? '关闭 Auto Focus' : '开启 Auto Focus'}\n active={autoFocus}\n onClick={() => setAutoFocus(!autoFocus)}\n >\n <IconAutoFocus />\n </ToolButton>\n </div>\n );\n}\n\n\n/** A toolbar button with an accessible, hover-revealed tooltip below it. */\ninterface ToolButtonProps {\n tip: string;\n shortcut?: string;\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nfunction ToolButton({ tip, shortcut, onClick, active, disabled, children }: ToolButtonProps) {\n const label = shortcut ? `${tip} (${shortcut})` : tip;\n return (\n <span className=\"flow-tip\">\n <Button\n size=\"xs\"\n variant={active ? 'primary' : 'ghost'}\n onClick={onClick}\n disabled={disabled}\n square\n >\n <span aria-label={label} style={{ display: 'inline-flex' }}>{children}</span>\n </Button>\n <span className=\"flow-tip-label\" role=\"tooltip\">{label}</span>\n </span>\n );\n}\n\nexport interface FlowToolbarProps {\n onBack?: () => void;\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n onGroup?: () => void;\n onGeoGroup?: () => void;\n onUngroup?: () => void;\n onExportPNG?: () => void | Promise<void>;\n /** Export anchors as a PDF slideshow from the built-in toolbar. */\n onExportPDF?: () => void | Promise<void>;\n onPublish?: () => void;\n /** Small-screen (container-width) layout: the title gets its own row and\n * button groups wrap below instead of sliding under the absolute title. */\n compact?: boolean;\n}\n\nexport default function FlowToolbar({ onBack, onUndo, onRedo, canUndo, canRedo, onGroup, onGeoGroup, onUngroup, onExportPNG, onExportPDF, onPublish, compact }: FlowToolbarProps) {\n const {\n showGrid, setShowGrid,\n showPalette, setShowPalette,\n showInspector, setShowInspector,\n showOutline, setShowOutline,\n showJson, setShowJson,\n showAI, setShowAI,\n showMiniMap, setShowMiniMap,\n showAnchors, setShowAnchors,\n presentation, setPresentation,\n placementSnap, setPlacementSnap,\n } = useFlowUI();\n const { doc, selection, currentCanvas, setDoc, currentCanvasId } = useFlowContext();\n const { exportJSON, importJSON, exportMarkdown } = useFlowImportExport();\n const { align, distribute, changeZIndex } = useLayoutActions();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const selTotalCount = selection.nodeIds.size + selection.lineIds.size;\n const hasGroupSelected = selection.nodeIds.size > 0 && currentCanvas.nodes.some(\n n => selection.nodeIds.has(n.id) && (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup),\n );\n const hasAnchors = Object.values(doc.canvases).some(canvas =>\n canvas.nodes.some(node => node.type === 'animAnchor'),\n );\n\n\n const handleExportJSON = useCallback(() => {\n const json = exportJSON();\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n downloadDataURL(url, `${safeFileBaseName(doc.title)}.json`);\n URL.revokeObjectURL(url);\n }, [exportJSON, doc.title]);\n\n const handleExportMarkdown = useCallback(() => {\n const md = exportMarkdown();\n const blob = new Blob([md], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n downloadDataURL(url, `${safeFileBaseName(doc.title)}.md`);\n URL.revokeObjectURL(url);\n }, [exportMarkdown, doc.title]);\n\n const handleImportJSON = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n /**\n * Recolor the current canvas to the unified Archify style: every plain shape\n * node adopts its inferred semantic card colors, and every edge is restyled\n * by its arrow color. Content, geometry, and any sub-labels/tags are kept.\n */\n const handleApplyArchifyStyle = useCallback(() => {\n setDoc((prev) => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const nodes = canvas.nodes.map((n) => {\n if (n.type === 'animAnchor' || n.type === 'shapeSvg') return n;\n if (n.data.isGroup || n.type === 'flowGroup' || n.type === 'geometryGroup') return n;\n // Media nodes (including data charts) adopt the semantic card colors; the\n // chart's primary series color follows the node `color` at render time.\n return { ...n, data: { ...n.data, ...archifyStylePatch(inferComponentType(n.data)) } };\n });\n const edges = canvas.edges.map((e) => {\n const isEmphasis = e.data.strokeColor && e.data.strokeColor !== ARCHIFY_ARROW;\n const style = variantEdgeStyle(isEmphasis ? 'emphasis' : 'default');\n return {\n ...e,\n data: {\n ...e.data,\n strokeColor: e.data.strokeColor && e.data.strokeColor.startsWith('theme:')\n ? style.color\n : (e.data.strokeColor ?? style.color),\n },\n };\n });\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, nodes, edges } },\n };\n });\n }, [setDoc, currentCanvasId]);\n\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === 'string') importJSON(reader.result);\n };\n reader.readAsText(file);\n e.target.value = '';\n }, [importJSON]);\n\n return (\n <div className={`flow-toolbar${compact ? ' flow-toolbar--compact' : ''}`}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json\"\n style={{ display: 'none' }}\n onChange={handleFileChange}\n />\n\n {/* Editable project title, anchored to the toolbar's left edge. Hidden\n in compact mode: the host app's header already shows the name, and\n the narrow toolbar needs the row for buttons. */}\n {!compact && <ProjectTitle />}\n\n {onBack && (\n <>\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"返回列表\" onClick={onBack}>\n <IconBack />\n </ToolButton>\n </div>\n <div className=\"flow-toolbar-divider\" />\n </>\n )}\n\n {/* 历史:撤销 / 重做 */}\n {(onUndo || onRedo) && (\n <div className=\"flow-toolbar-group\">\n {onUndo && (\n <ToolButton tip=\"撤销\" shortcut=\"Ctrl+Z\" onClick={onUndo} disabled={!canUndo}>\n <IconUndo />\n </ToolButton>\n )}\n {onRedo && (\n <ToolButton tip=\"重做\" shortcut=\"Ctrl+Shift+Z\" onClick={onRedo} disabled={!canRedo}>\n <IconRedo />\n </ToolButton>\n )}\n </div>\n )}\n\n {/* 排列:对齐 / 平分 */}\n {selection.nodeIds.size >= 2 && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"居左\" onClick={() => align('left')}><IconAlign kind=\"left\" /></ToolButton>\n <ToolButton tip=\"水平居中\" onClick={() => align('center-h')}><IconAlign kind=\"center-h\" /></ToolButton>\n <ToolButton tip=\"居右\" onClick={() => align('right')}><IconAlign kind=\"right\" /></ToolButton>\n <ToolButton tip=\"居上\" onClick={() => align('top')}><IconAlign kind=\"top\" /></ToolButton>\n <ToolButton tip=\"垂直居中\" onClick={() => align('center-v')}><IconAlign kind=\"center-v\" /></ToolButton>\n <ToolButton tip=\"居下\" onClick={() => align('bottom')}><IconAlign kind=\"bottom\" /></ToolButton>\n <ToolButton tip=\"水平平分\" onClick={() => distribute('horizontal')} disabled={selection.nodeIds.size < 3}>\n <IconAlign kind=\"distribute-h\" />\n </ToolButton>\n <ToolButton tip=\"垂直平分\" onClick={() => distribute('vertical')} disabled={selection.nodeIds.size < 3}>\n <IconAlign kind=\"distribute-v\" />\n </ToolButton>\n </div>\n </>\n )}\n\n {/* 图层:置顶 / 上移 / 下移 / 置底 */}\n {selTotalCount >= 1 && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"置于顶层\" onClick={() => changeZIndex('front')}><IconLayer kind=\"front\" /></ToolButton>\n <ToolButton tip=\"上移一层\" onClick={() => changeZIndex('up')}><IconLayer kind=\"up\" /></ToolButton>\n <ToolButton tip=\"下移一层\" onClick={() => changeZIndex('down')}><IconLayer kind=\"down\" /></ToolButton>\n <ToolButton tip=\"置于底层\" onClick={() => changeZIndex('back')}><IconLayer kind=\"back\" /></ToolButton>\n </div>\n </>\n )}\n\n {/* 组合:成组 / 几何分组 / 取消成组 */}\n {(onGroup || onGeoGroup || onUngroup) && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n {onGroup && (\n <ToolButton tip=\"成组\" shortcut=\"⌘G\" onClick={onGroup} disabled={selTotalCount < 2}>\n <IconGroup />\n </ToolButton>\n )}\n {onGeoGroup && (\n <ToolButton tip=\"几何分组\" shortcut=\"⌘⌥G\" onClick={onGeoGroup} disabled={selTotalCount < 2}>\n <IconGeoGroup />\n </ToolButton>\n )}\n {onUngroup && (\n <ToolButton tip=\"取消成组\" shortcut=\"⌘⇧G\" onClick={onUngroup} disabled={!hasGroupSelected}>\n <IconUngroup />\n </ToolButton>\n )}\n </div>\n </>\n )}\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 视图:网格 / 缩略图 / Anchor / 动画预览 */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"网格\" active={showGrid} onClick={() => setShowGrid(!showGrid)}>\n <IconGrid />\n </ToolButton>\n <ToolButton\n tip={placementSnap ? '放置吸附网格:开(盖章自动贴近网格)' : '放置吸附网格:关(自由放置)'}\n active={placementSnap}\n onClick={() => setPlacementSnap(!placementSnap)}\n >\n <IconMagnet />\n </ToolButton>\n <ToolButton tip=\"缩略图\" active={showMiniMap} onClick={() => setShowMiniMap(!showMiniMap)}>\n <IconMiniMap />\n </ToolButton>\n <ToolButton\n tip={showAnchors ? '隐藏所有 Anchor 对象' : '显示所有 Anchor 对象'}\n active={showAnchors}\n disabled={!hasAnchors}\n onClick={() => {\n if (hasAnchors) setShowAnchors(!showAnchors);\n }}\n >\n <IconAnchorVisible visible={showAnchors} />\n </ToolButton>\n <ToolButton\n tip=\"动画预览\"\n active={presentation !== null}\n onClick={() => setPresentation(presentation ? null : { current: 0, showAnchor: false })}\n >\n <IconPresent />\n </ToolButton>\n <ToolButton\n tip=\"应用 Archify 风格(当前画布)\"\n onClick={handleApplyArchifyStyle}\n >\n <IconArchify />\n </ToolButton>\n </div>\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 面板:形状 / 属性 / 大纲 / JSON */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"形状面板\" active={showPalette} onClick={() => setShowPalette(!showPalette)}>\n <IconShapes />\n </ToolButton>\n <ToolButton tip=\"属性面板\" active={showInspector} onClick={() => setShowInspector(!showInspector)}>\n <IconInspector />\n </ToolButton>\n <ToolButton tip=\"大纲\" active={showOutline} onClick={() => setShowOutline(!showOutline)}>\n <IconOutline />\n </ToolButton>\n <ToolButton tip=\"JSON\" active={showJson} onClick={() => setShowJson(!showJson)}>\n <IconJson />\n </ToolButton>\n <ToolButton tip=\"AI 助手\" active={showAI} onClick={() => setShowAI(!showAI)}>\n <IconAI />\n </ToolButton>\n </div>\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 文件:导入 / 导出 / 发布 */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"导入 JSON\" onClick={handleImportJSON}>\n <IconImport />\n </ToolButton>\n <ToolButton tip=\"导出 JSON\" onClick={handleExportJSON}>\n <IconExportJson />\n </ToolButton>\n <ToolButton tip=\"导出 Markdown\" onClick={handleExportMarkdown}>\n <IconExportMarkdown />\n </ToolButton>\n {onExportPNG && (\n <ToolButton tip=\"导出 PNG\" onClick={() => void onExportPNG()}>\n <IconExportPng />\n </ToolButton>\n )}\n {onExportPDF && hasAnchors && (\n <ToolButton tip=\"导出 PDF(按锦点顺序)\" onClick={() => void onExportPDF()}>\n <IconExportPdf />\n </ToolButton>\n )}\n {onPublish && (\n <ToolButton tip=\"发布与共享\" onClick={onPublish}>\n <IconPublish />\n </ToolButton>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}