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.
- package/dist/components/Badge/index.js +12 -9
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.js +43 -40
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/Card/index.d.ts +11 -0
- package/dist/components/Card/index.js +62 -37
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Chart/Chart.js.map +1 -1
- package/dist/components/Checkbox/index.js +32 -30
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/EmptyState/index.d.ts +4 -1
- package/dist/components/EmptyState/index.js +3 -3
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/FileUploader/DropZone.js.map +1 -1
- package/dist/components/FileUploader/FileItem.js.map +1 -1
- package/dist/components/FileUploader/FileUploader.js.map +1 -1
- package/dist/components/FileUploader/UploadQueue.js.map +1 -1
- package/dist/components/Input/index.js +30 -30
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Label/index.js +41 -40
- package/dist/components/Label/index.js.map +1 -1
- package/dist/components/List/index.js +47 -32
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.js +61 -57
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js +49 -49
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Modal/index.d.ts +7 -3
- package/dist/components/Modal/index.js +77 -65
- package/dist/components/Modal/index.js.map +1 -1
- package/dist/components/Page/index.d.ts +58 -0
- package/dist/components/Page/index.js +74 -0
- package/dist/components/Page/index.js.map +1 -0
- package/dist/components/PageHeader/index.js.map +1 -1
- package/dist/components/Select/index.js +0 -3
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/SidebarToggleButton/index.js.map +1 -1
- package/dist/components/StatCard/index.d.ts +3 -1
- package/dist/components/StatCard/index.js +39 -11
- package/dist/components/StatCard/index.js.map +1 -1
- package/dist/components/Table/index.js +103 -85
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Tabs/index.d.ts +19 -5
- package/dist/components/Tabs/index.js +32 -13
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Tree/Tree.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
- package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js +141 -134
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +81 -78
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/themes.js +59 -59
- package/dist/components/pro/CodeEditor/themes.js.map +1 -1
- package/dist/components/pro/DataTable/DataTable.js +49 -48
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/Filters.js +42 -42
- package/dist/components/pro/DataTable/Filters.js.map +1 -1
- package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
- package/dist/components/pro/DataTable/PivotView.js +35 -32
- package/dist/components/pro/DataTable/PivotView.js.map +1 -1
- package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
- package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
- package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
- package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
- package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.js +37 -37
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/FileExplorer/Breadcrumb.js +53 -53
- package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
- package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileIcon.js +22 -22
- package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
- package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
- package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
- package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
- package/dist/components/pro/Flow/Flow.js +496 -494
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js +916 -917
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js +59 -59
- package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLayoutActions.js +9 -11
- package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
- package/dist/components/pro/Flow/lines/FreehandTool.js +9 -9
- package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js +5 -5
- package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/DataNodeView.js +113 -93
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.js +118 -118
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/shapes.js +1 -3
- package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
- package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
- package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
- package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
- package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.js +97 -97
- package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js +57 -57
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/OutlinePanel.js +26 -22
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/PresentationMode.js +18 -16
- package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
- package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
- package/dist/components/pro/Flow/panels/ShapePalette.js +109 -104
- package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
- package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/hooks/useTableColumns.js +7 -8
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +227 -221
- package/dist/layouts/MainLayout.js +22 -22
- package/dist/layouts/MainLayout.js.map +1 -1
- package/dist/layouts/Navbar.js.map +1 -1
- package/dist/layouts/Sidebar.js +94 -73
- package/dist/layouts/Sidebar.js.map +1 -1
- package/dist/layouts/headbar/Headbar.js.map +1 -1
- package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js +11 -11
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
- package/dist/utils/i18n.js +10 -10
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/menu.js.map +1 -1
- package/dist/utils/routerBuilder.js +17 -15
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/themes.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { PALETTE_ITEMS as
|
|
2
|
-
import { useFlowUI as
|
|
3
|
-
import { resolveThemeColor as
|
|
4
|
-
import { SVG_ICON_CATEGORIES as
|
|
5
|
-
import { useDraggablePanel as
|
|
6
|
-
import { useResizablePanel as
|
|
7
|
-
import { makeStarterDataConfig as
|
|
8
|
-
import { useCallback as
|
|
9
|
-
import { Fragment as
|
|
10
|
-
var
|
|
1
|
+
import { PALETTE_ITEMS as v } from "../constants.js";
|
|
2
|
+
import { useFlowUI as u } from "../context/FlowUIContext.js";
|
|
3
|
+
import { resolveThemeColor as M } from "../utils/themeColor.js";
|
|
4
|
+
import { SVG_ICON_CATEGORIES as S, buildSvgMarkup as C, getSvgIcon as b, getSvgIconsByCategory as P } from "../nodes/svgIcons.js";
|
|
5
|
+
import { useDraggablePanel as W } from "../hooks/useDraggablePanel.js";
|
|
6
|
+
import { useResizablePanel as I } from "../hooks/useResizablePanel.js";
|
|
7
|
+
import { makeStarterDataConfig as $ } from "../nodes/dataUtils.js";
|
|
8
|
+
import { useCallback as x, useState as T } from "react";
|
|
9
|
+
import { Fragment as k, jsx as e, jsxs as d } from "react/jsx-runtime";
|
|
10
|
+
var N = [
|
|
11
11
|
{
|
|
12
12
|
mode: "freehand",
|
|
13
13
|
label: "Freehand"
|
|
@@ -25,13 +25,13 @@ var T = [
|
|
|
25
25
|
label: "Arrow"
|
|
26
26
|
}
|
|
27
27
|
];
|
|
28
|
-
function
|
|
29
|
-
const { showPalette: l } =
|
|
30
|
-
return l ? /* @__PURE__ */
|
|
28
|
+
function Z() {
|
|
29
|
+
const { showPalette: l } = u(), { panelStyle: c, handleProps: a } = W(), { panelWidth: t, resizeHandleProps: o } = I("right", 180);
|
|
30
|
+
return l ? /* @__PURE__ */ d("div", {
|
|
31
31
|
className: "flow-palette",
|
|
32
32
|
"data-flow-panel": !0,
|
|
33
33
|
style: {
|
|
34
|
-
...
|
|
34
|
+
...c,
|
|
35
35
|
width: t
|
|
36
36
|
},
|
|
37
37
|
children: [
|
|
@@ -55,45 +55,45 @@ function V() {
|
|
|
55
55
|
}),
|
|
56
56
|
/* @__PURE__ */ e("div", {
|
|
57
57
|
className: "flow-palette-content",
|
|
58
|
-
children: /* @__PURE__ */ e(
|
|
58
|
+
children: /* @__PURE__ */ e(A, {})
|
|
59
59
|
})
|
|
60
60
|
]
|
|
61
61
|
}) : null;
|
|
62
62
|
}
|
|
63
|
-
function
|
|
64
|
-
const { toolMode: l, setToolMode:
|
|
63
|
+
function A() {
|
|
64
|
+
const { toolMode: l, setToolMode: c, setPendingPlacement: a, pendingPlacement: t } = u(), o = x((n, i, p, s) => {
|
|
65
65
|
t?.type === n ? a(null) : (a({
|
|
66
66
|
type: n,
|
|
67
|
-
width:
|
|
67
|
+
width: i,
|
|
68
68
|
height: p,
|
|
69
|
-
data: { ...
|
|
70
|
-
}),
|
|
69
|
+
data: { ...s }
|
|
70
|
+
}), c("select"));
|
|
71
71
|
}, [
|
|
72
72
|
a,
|
|
73
|
-
|
|
73
|
+
c,
|
|
74
74
|
t
|
|
75
75
|
]);
|
|
76
|
-
return /* @__PURE__ */
|
|
76
|
+
return /* @__PURE__ */ d(k, { children: [
|
|
77
77
|
/* @__PURE__ */ e("div", {
|
|
78
78
|
className: "flow-palette-grid",
|
|
79
|
-
children:
|
|
79
|
+
children: v.map((n) => /* @__PURE__ */ d("div", {
|
|
80
80
|
className: `flow-palette-item${t?.type === n.type ? " flow-palette-item--active" : ""}`,
|
|
81
81
|
onClick: () => o(n.type, n.width, n.height, n.data),
|
|
82
|
-
children: [/* @__PURE__ */ e(
|
|
82
|
+
children: [/* @__PURE__ */ e(E, { type: n.type }), /* @__PURE__ */ e("span", {
|
|
83
83
|
className: "flow-palette-item-label",
|
|
84
84
|
children: n.data.label
|
|
85
85
|
})]
|
|
86
86
|
}, n.type))
|
|
87
87
|
}),
|
|
88
|
-
/* @__PURE__ */ e(
|
|
88
|
+
/* @__PURE__ */ e(z, { children: "Lines" }),
|
|
89
89
|
/* @__PURE__ */ e("div", {
|
|
90
90
|
className: "flow-palette-grid",
|
|
91
|
-
children:
|
|
91
|
+
children: N.map((n) => /* @__PURE__ */ d("div", {
|
|
92
92
|
className: `flow-palette-item${l === n.mode ? " flow-palette-item--active" : ""}`,
|
|
93
93
|
onClick: () => {
|
|
94
|
-
a(null),
|
|
94
|
+
a(null), c(l === n.mode ? "select" : n.mode);
|
|
95
95
|
},
|
|
96
|
-
children: [/* @__PURE__ */ e(
|
|
96
|
+
children: [/* @__PURE__ */ e(B, { mode: n.mode }), /* @__PURE__ */ e("span", {
|
|
97
97
|
className: "flow-palette-item-label",
|
|
98
98
|
children: n.label
|
|
99
99
|
})]
|
|
@@ -101,10 +101,10 @@ function N() {
|
|
|
101
101
|
})
|
|
102
102
|
] });
|
|
103
103
|
}
|
|
104
|
-
function
|
|
105
|
-
const { setPendingPlacement: l, setToolMode:
|
|
106
|
-
const
|
|
107
|
-
if (a?.type === "shapeSvg" &&
|
|
104
|
+
function q() {
|
|
105
|
+
const { setPendingPlacement: l, setToolMode: c, pendingPlacement: a } = u(), [t, o] = T({ lang: !0 }), n = x((i, p) => {
|
|
106
|
+
const s = a?.data.svgId;
|
|
107
|
+
if (a?.type === "shapeSvg" && s === i) {
|
|
108
108
|
l(null);
|
|
109
109
|
return;
|
|
110
110
|
}
|
|
@@ -113,10 +113,10 @@ function Z() {
|
|
|
113
113
|
fill: "transparent",
|
|
114
114
|
stroke: "theme:base-content",
|
|
115
115
|
strokeWidth: 1.5,
|
|
116
|
-
color:
|
|
116
|
+
color: b(i)?.brandColor ?? "theme:base-content",
|
|
117
117
|
labelColor: "theme:base-content",
|
|
118
118
|
fontSize: 12,
|
|
119
|
-
svgId:
|
|
119
|
+
svgId: i,
|
|
120
120
|
iconBox: !1,
|
|
121
121
|
labelPlacement: "bottom",
|
|
122
122
|
borderStyle: "none"
|
|
@@ -126,53 +126,55 @@ function Z() {
|
|
|
126
126
|
width: 56,
|
|
127
127
|
height: 56,
|
|
128
128
|
data: r
|
|
129
|
-
}),
|
|
129
|
+
}), c("select");
|
|
130
130
|
}, [
|
|
131
131
|
a,
|
|
132
132
|
l,
|
|
133
|
-
|
|
133
|
+
c
|
|
134
134
|
]);
|
|
135
|
-
return /* @__PURE__ */ e(
|
|
136
|
-
const p =
|
|
137
|
-
return /* @__PURE__ */
|
|
135
|
+
return /* @__PURE__ */ e(k, { children: S.map((i) => {
|
|
136
|
+
const p = P(i.id), s = t[i.id];
|
|
137
|
+
return /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("button", {
|
|
138
138
|
type: "button",
|
|
139
139
|
className: "flow-palette-section-toggle",
|
|
140
140
|
onClick: () => o((r) => ({
|
|
141
141
|
...r,
|
|
142
|
-
[
|
|
142
|
+
[i.id]: !r[i.id]
|
|
143
143
|
})),
|
|
144
144
|
children: [/* @__PURE__ */ e("span", {
|
|
145
145
|
style: {
|
|
146
|
-
transform:
|
|
146
|
+
transform: s ? "rotate(90deg)" : "none",
|
|
147
147
|
transition: "transform .15s"
|
|
148
148
|
},
|
|
149
149
|
children: "▸"
|
|
150
|
-
}),
|
|
151
|
-
}),
|
|
150
|
+
}), i.label]
|
|
151
|
+
}), s && /* @__PURE__ */ e("div", {
|
|
152
152
|
className: "flow-palette-grid",
|
|
153
|
-
children: p.map((r) => /* @__PURE__ */
|
|
153
|
+
children: p.map((r) => /* @__PURE__ */ d("div", {
|
|
154
154
|
className: `flow-palette-item${a?.type === "shapeSvg" && a.data.svgId === r.id ? " flow-palette-item--active" : ""}`,
|
|
155
155
|
onClick: () => n(r.id, r.label),
|
|
156
156
|
title: r.label,
|
|
157
|
-
children: [/* @__PURE__ */ e(
|
|
157
|
+
children: [/* @__PURE__ */ e(D, { id: r.id }), /* @__PURE__ */ e("span", {
|
|
158
158
|
className: "flow-palette-item-label",
|
|
159
159
|
children: r.label
|
|
160
160
|
})]
|
|
161
161
|
}, r.id))
|
|
162
|
-
})] },
|
|
162
|
+
})] }, i.id);
|
|
163
163
|
}) });
|
|
164
164
|
}
|
|
165
|
-
function
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
165
|
+
function D({ id: l }) {
|
|
166
|
+
const c = b(l), a = M(c?.brandColor, "") || "#475569", t = C(l, a);
|
|
167
|
+
if (!t) return null;
|
|
168
|
+
const o = `data:image/svg+xml;utf8,${encodeURIComponent(t)}`;
|
|
169
|
+
return /* @__PURE__ */ e("img", {
|
|
170
|
+
src: o,
|
|
169
171
|
width: 20,
|
|
170
172
|
height: 16,
|
|
171
173
|
alt: "",
|
|
172
174
|
style: { objectFit: "contain" }
|
|
173
|
-
})
|
|
175
|
+
});
|
|
174
176
|
}
|
|
175
|
-
var
|
|
177
|
+
var L = [
|
|
176
178
|
{
|
|
177
179
|
kind: "markdown",
|
|
178
180
|
label: "Markdown",
|
|
@@ -184,7 +186,7 @@ var D = [
|
|
|
184
186
|
- 支持 \`代码\`
|
|
185
187
|
|
|
186
188
|
> 引用文本`,
|
|
187
|
-
icon: /* @__PURE__ */ e(
|
|
189
|
+
icon: /* @__PURE__ */ e(f, { text: "M↓" })
|
|
188
190
|
},
|
|
189
191
|
{
|
|
190
192
|
kind: "html",
|
|
@@ -195,7 +197,7 @@ var D = [
|
|
|
195
197
|
<h3>Hello</h3>
|
|
196
198
|
<p>可编辑的 HTML 片段</p>
|
|
197
199
|
</div>`,
|
|
198
|
-
icon: /* @__PURE__ */ e(
|
|
200
|
+
icon: /* @__PURE__ */ e(f, { text: "</>" })
|
|
199
201
|
},
|
|
200
202
|
{
|
|
201
203
|
kind: "mermaid",
|
|
@@ -206,7 +208,7 @@ var D = [
|
|
|
206
208
|
A[开始] --> B{判断}
|
|
207
209
|
B -->|是| C[处理]
|
|
208
210
|
B -->|否| D[结束]`,
|
|
209
|
-
icon: /* @__PURE__ */ e(
|
|
211
|
+
icon: /* @__PURE__ */ e(f, { text: "⎇" })
|
|
210
212
|
},
|
|
211
213
|
{
|
|
212
214
|
kind: "math",
|
|
@@ -214,7 +216,7 @@ var D = [
|
|
|
214
216
|
width: 240,
|
|
215
217
|
height: 120,
|
|
216
218
|
content: "E = mc^2",
|
|
217
|
-
icon: /* @__PURE__ */ e(
|
|
219
|
+
icon: /* @__PURE__ */ e(f, { text: "√x" })
|
|
218
220
|
},
|
|
219
221
|
{
|
|
220
222
|
kind: "image",
|
|
@@ -222,7 +224,7 @@ var D = [
|
|
|
222
224
|
width: 320,
|
|
223
225
|
height: 220,
|
|
224
226
|
content: "",
|
|
225
|
-
icon: /* @__PURE__ */ e(
|
|
227
|
+
icon: /* @__PURE__ */ e(f, { text: "IMG" })
|
|
226
228
|
},
|
|
227
229
|
{
|
|
228
230
|
kind: "model3d",
|
|
@@ -230,7 +232,7 @@ var D = [
|
|
|
230
232
|
width: 360,
|
|
231
233
|
height: 280,
|
|
232
234
|
content: "",
|
|
233
|
-
icon: /* @__PURE__ */ e(
|
|
235
|
+
icon: /* @__PURE__ */ e(f, { text: "3D" })
|
|
234
236
|
},
|
|
235
237
|
{
|
|
236
238
|
kind: "ai",
|
|
@@ -238,7 +240,7 @@ var D = [
|
|
|
238
240
|
width: 300,
|
|
239
241
|
height: 340,
|
|
240
242
|
content: "",
|
|
241
|
-
icon: /* @__PURE__ */ e(
|
|
243
|
+
icon: /* @__PURE__ */ e(f, { text: "AI" })
|
|
242
244
|
},
|
|
243
245
|
{
|
|
244
246
|
kind: "data",
|
|
@@ -246,10 +248,10 @@ var D = [
|
|
|
246
248
|
width: 420,
|
|
247
249
|
height: 300,
|
|
248
250
|
content: "",
|
|
249
|
-
icon: /* @__PURE__ */ e(
|
|
251
|
+
icon: /* @__PURE__ */ e(f, { text: "⊞" })
|
|
250
252
|
}
|
|
251
253
|
];
|
|
252
|
-
function
|
|
254
|
+
function f({ text: l }) {
|
|
253
255
|
return /* @__PURE__ */ e("div", {
|
|
254
256
|
style: {
|
|
255
257
|
width: 20,
|
|
@@ -267,8 +269,8 @@ function m({ text: l }) {
|
|
|
267
269
|
children: l
|
|
268
270
|
});
|
|
269
271
|
}
|
|
270
|
-
function
|
|
271
|
-
const { setPendingPlacement: l, setToolMode:
|
|
272
|
+
function J() {
|
|
273
|
+
const { setPendingPlacement: l, setToolMode: c, pendingPlacement: a } = u(), t = x((o) => {
|
|
272
274
|
if (a?.type === "mediaNode" && a.data.mediaKind === o.kind) {
|
|
273
275
|
l(null);
|
|
274
276
|
return;
|
|
@@ -287,22 +289,22 @@ function q() {
|
|
|
287
289
|
gateway: "",
|
|
288
290
|
protocol: "openai",
|
|
289
291
|
model: ""
|
|
290
|
-
} } : o.kind === "model3d" ? { modelFormat: "stl" } : o.kind === "data" ? { dataConfig:
|
|
292
|
+
} } : o.kind === "model3d" ? { modelFormat: "stl" } : o.kind === "data" ? { dataConfig: $() } : {}
|
|
291
293
|
};
|
|
292
294
|
l({
|
|
293
295
|
type: "mediaNode",
|
|
294
296
|
width: o.width,
|
|
295
297
|
height: o.height,
|
|
296
298
|
data: n
|
|
297
|
-
}),
|
|
299
|
+
}), c("select");
|
|
298
300
|
}, [
|
|
299
301
|
a,
|
|
300
302
|
l,
|
|
301
|
-
|
|
303
|
+
c
|
|
302
304
|
]);
|
|
303
305
|
return /* @__PURE__ */ e("div", {
|
|
304
306
|
className: "flow-palette-grid",
|
|
305
|
-
children:
|
|
307
|
+
children: L.map((o) => /* @__PURE__ */ d("div", {
|
|
306
308
|
className: `flow-palette-item${a?.type === "mediaNode" && a.data.mediaKind === o.kind ? " flow-palette-item--active" : ""}`,
|
|
307
309
|
onClick: () => t(o),
|
|
308
310
|
title: o.label,
|
|
@@ -313,7 +315,7 @@ function q() {
|
|
|
313
315
|
}, o.kind))
|
|
314
316
|
});
|
|
315
317
|
}
|
|
316
|
-
function
|
|
318
|
+
function z({ children: l }) {
|
|
317
319
|
return /* @__PURE__ */ e("div", {
|
|
318
320
|
style: {
|
|
319
321
|
fontSize: 11,
|
|
@@ -326,7 +328,7 @@ function L({ children: l }) {
|
|
|
326
328
|
children: l
|
|
327
329
|
});
|
|
328
330
|
}
|
|
329
|
-
function
|
|
331
|
+
function E({ type: l }) {
|
|
330
332
|
const t = "currentColor", n = {
|
|
331
333
|
shapeRect: /* @__PURE__ */ e("rect", {
|
|
332
334
|
x: "3",
|
|
@@ -370,7 +372,7 @@ function z({ type: l }) {
|
|
|
370
372
|
strokeWidth: 1.5
|
|
371
373
|
}),
|
|
372
374
|
shapeParallelogram: /* @__PURE__ */ e("polygon", {
|
|
373
|
-
points:
|
|
375
|
+
points: "9.600000000000001,4 32,4 26.4,24 4,24",
|
|
374
376
|
fill: "none",
|
|
375
377
|
stroke: t,
|
|
376
378
|
strokeWidth: 1.5
|
|
@@ -382,51 +384,54 @@ function z({ type: l }) {
|
|
|
382
384
|
strokeWidth: 1.5
|
|
383
385
|
}),
|
|
384
386
|
shapeTrapezoid: /* @__PURE__ */ e("polygon", {
|
|
385
|
-
points:
|
|
387
|
+
points: "8.2,4 27.8,4 32,24 4,24",
|
|
386
388
|
fill: "none",
|
|
387
389
|
stroke: t,
|
|
388
390
|
strokeWidth: 1.5
|
|
389
391
|
}),
|
|
390
392
|
shapePentagon: (() => {
|
|
391
|
-
const
|
|
393
|
+
const s = Math.min(18, 14) - 4, r = Array.from({ length: 5 }, (w, y) => {
|
|
394
|
+
const h = Math.PI * 2 * y / 5 - Math.PI / 2;
|
|
395
|
+
return `${18 + s * Math.cos(h)},${14 + s * Math.sin(h)}`;
|
|
396
|
+
}).join(" ");
|
|
392
397
|
return /* @__PURE__ */ e("polygon", {
|
|
393
|
-
points:
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
398
|
+
points: r,
|
|
399
|
+
fill: "none",
|
|
400
|
+
stroke: t,
|
|
401
|
+
strokeWidth: 1.5
|
|
402
|
+
});
|
|
403
|
+
})(),
|
|
404
|
+
shapeHexagon: (() => {
|
|
405
|
+
const w = Array.from({ length: 6 }, (y, h) => {
|
|
406
|
+
const m = Math.PI * 2 * h / 6 - Math.PI / 6;
|
|
407
|
+
return `${18 + 14 * Math.cos(m)},${14 + 10 * Math.sin(m)}`;
|
|
408
|
+
}).join(" ");
|
|
409
|
+
return /* @__PURE__ */ e("polygon", {
|
|
410
|
+
points: w,
|
|
397
411
|
fill: "none",
|
|
398
412
|
stroke: t,
|
|
399
413
|
strokeWidth: 1.5
|
|
400
414
|
});
|
|
401
415
|
})(),
|
|
402
|
-
shapeHexagon: /* @__PURE__ */ e("polygon", {
|
|
403
|
-
points: Array.from({ length: 6 }, (k, d) => {
|
|
404
|
-
const w = Math.PI * 2 * d / 6 - Math.PI / 6;
|
|
405
|
-
return `${18 + 14 * Math.cos(w)},${14 + 10 * Math.sin(w)}`;
|
|
406
|
-
}).join(" "),
|
|
407
|
-
fill: "none",
|
|
408
|
-
stroke: t,
|
|
409
|
-
strokeWidth: 1.5
|
|
410
|
-
}),
|
|
411
416
|
shapeStar: (() => {
|
|
412
|
-
const
|
|
417
|
+
const s = Math.min(18, 14) - 3, r = s * 0.4, w = Array.from({ length: 10 }, (y, h) => {
|
|
418
|
+
const m = Math.PI * h / 5 - Math.PI / 2, g = h % 2 === 0 ? s : r;
|
|
419
|
+
return `${18 + g * Math.cos(m)},${14 + g * Math.sin(m)}`;
|
|
420
|
+
}).join(" ");
|
|
413
421
|
return /* @__PURE__ */ e("polygon", {
|
|
414
|
-
points:
|
|
415
|
-
const w = Math.PI * d / 5 - Math.PI / 2, f = d % 2 === 0 ? h : r;
|
|
416
|
-
return `${18 + f * Math.cos(w)},${14 + f * Math.sin(w)}`;
|
|
417
|
-
}).join(" "),
|
|
422
|
+
points: w,
|
|
418
423
|
fill: "none",
|
|
419
424
|
stroke: t,
|
|
420
425
|
strokeWidth: 1.5
|
|
421
426
|
});
|
|
422
427
|
})(),
|
|
423
428
|
shapeHexagram: (() => {
|
|
424
|
-
const
|
|
429
|
+
const s = Math.min(18, 14) - 3, r = s * 0.55, w = Array.from({ length: 12 }, (y, h) => {
|
|
430
|
+
const m = Math.PI * h / 6 - Math.PI / 2, g = h % 2 === 0 ? s : r;
|
|
431
|
+
return `${18 + g * Math.cos(m)},${14 + g * Math.sin(m)}`;
|
|
432
|
+
}).join(" ");
|
|
425
433
|
return /* @__PURE__ */ e("polygon", {
|
|
426
|
-
points:
|
|
427
|
-
const w = Math.PI * d / 6 - Math.PI / 2, f = d % 2 === 0 ? h : r;
|
|
428
|
-
return `${18 + f * Math.cos(w)},${14 + f * Math.sin(w)}`;
|
|
429
|
-
}).join(" "),
|
|
434
|
+
points: w,
|
|
430
435
|
fill: "none",
|
|
431
436
|
stroke: t,
|
|
432
437
|
strokeWidth: 1.5
|
|
@@ -453,7 +458,7 @@ function z({ type: l }) {
|
|
|
453
458
|
fill: "currentColor",
|
|
454
459
|
children: "Aa"
|
|
455
460
|
}),
|
|
456
|
-
animAnchor: /* @__PURE__ */
|
|
461
|
+
animAnchor: /* @__PURE__ */ d(k, { children: [
|
|
457
462
|
/* @__PURE__ */ e("rect", {
|
|
458
463
|
x: "3",
|
|
459
464
|
y: "4",
|
|
@@ -514,9 +519,9 @@ function z({ type: l }) {
|
|
|
514
519
|
children: n[l] ?? n.shapeRect
|
|
515
520
|
});
|
|
516
521
|
}
|
|
517
|
-
function
|
|
522
|
+
function B({ mode: l }) {
|
|
518
523
|
const t = "currentColor", n = {
|
|
519
|
-
connect: /* @__PURE__ */
|
|
524
|
+
connect: /* @__PURE__ */ d(k, { children: [/* @__PURE__ */ e("line", {
|
|
520
525
|
x1: "6",
|
|
521
526
|
y1: 22,
|
|
522
527
|
x2: 30,
|
|
@@ -549,7 +554,7 @@ function E({ mode: l }) {
|
|
|
549
554
|
strokeWidth: 1.5,
|
|
550
555
|
strokeLinejoin: "round"
|
|
551
556
|
}),
|
|
552
|
-
arrow: /* @__PURE__ */
|
|
557
|
+
arrow: /* @__PURE__ */ d(k, { children: [/* @__PURE__ */ e("line", {
|
|
553
558
|
x1: "6",
|
|
554
559
|
y1: 22,
|
|
555
560
|
x2: 30,
|
|
@@ -570,11 +575,11 @@ function E({ mode: l }) {
|
|
|
570
575
|
});
|
|
571
576
|
}
|
|
572
577
|
export {
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
+
J as MediaStampContent,
|
|
579
|
+
E as PaletteThumbnail,
|
|
580
|
+
A as ShapePaletteContent,
|
|
581
|
+
q as SvgStampContent,
|
|
582
|
+
Z as default
|
|
578
583
|
};
|
|
579
584
|
|
|
580
585
|
//# sourceMappingURL=ShapePalette.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShapePalette.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ShapePalette.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { PALETTE_ITEMS } from '../constants';\nimport type { FlowShapeType, FlowNodeData, FlowToolMode } from '../types';\nimport { SVG_ICON_CATEGORIES, getSvgIconsByCategory, getSvgIcon, buildSvgMarkup, type SvgIconCategory } from '../nodes/svgIcons';\nimport type { FlowMediaKind } from '../types';\nimport { makeStarterDataConfig } from '../nodes/dataUtils';\nimport { resolveThemeColor } from '../utils/themeColor';\n\nconst LINE_TOOL_ITEMS: Array<{ mode: FlowToolMode; label: string }> = [\n { mode: 'freehand', label: 'Freehand' },\n { mode: 'line', label: 'Line' },\n { mode: 'polyline', label: 'Polyline' },\n { mode: 'arrow', label: 'Arrow' },\n];\n\n/**\n * Standalone panel (legacy). Prefer using ShapePaletteContent inside a FlowPanelGroup.\n */\nexport default function ShapePalette() {\n const { showPalette } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('right', 180);\n\n if (!showPalette) return null;\n\n return (\n <div className=\"flow-palette\" data-flow-panel style={{ ...panelStyle, width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--right\" {...resizeHandleProps} />\n <div\n className=\"flow-panel-drag-handle\"\n {...handleProps}\n style={{ fontSize: 11, fontWeight: 600, marginBottom: 6, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em', cursor: 'grab' }}\n >\n Shapes\n </div>\n <div className=\"flow-palette-content\">\n <ShapePaletteContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function ShapePaletteContent() {\n const { toolMode, setToolMode, setPendingPlacement, pendingPlacement } = useFlowUI();\n\n const handleAddShape = useCallback(\n (type: FlowShapeType, width: number, height: number, data: FlowNodeData) => {\n if (pendingPlacement?.type === type) {\n setPendingPlacement(null);\n } else {\n setPendingPlacement({ type, width, height, data: { ...data } });\n setToolMode('select');\n }\n },\n [setPendingPlacement, setToolMode, pendingPlacement],\n );\n\n return (\n <>\n <div className=\"flow-palette-grid\">\n {PALETTE_ITEMS.map((item) => (\n <div\n key={item.type}\n className={`flow-palette-item${pendingPlacement?.type === item.type ? ' flow-palette-item--active' : ''}`}\n onClick={() => handleAddShape(item.type, item.width, item.height, item.data)}\n >\n <PaletteThumbnail type={item.type} />\n <span className=\"flow-palette-item-label\">{item.data.label}</span>\n </div>\n ))}\n </div>\n\n <SectionHeader>Lines</SectionHeader>\n <div className=\"flow-palette-grid\">\n {LINE_TOOL_ITEMS.map((item) => (\n <div\n key={item.mode}\n className={`flow-palette-item${toolMode === item.mode ? ' flow-palette-item--active' : ''}`}\n onClick={() => { setPendingPlacement(null); setToolMode(toolMode === item.mode ? 'select' : item.mode); }}\n >\n <LineToolThumbnail mode={item.mode} />\n <span className=\"flow-palette-item-label\">{item.label}</span>\n </div>\n ))}\n </div>\n </>\n );\n}\n\n/** SVG icon stamps, grouped by category with a collapsible header per group. */\nexport function SvgStampContent() {\n const { setPendingPlacement, setToolMode, pendingPlacement } = useFlowUI();\n const [open, setOpen] = useState<Record<string, boolean>>({ lang: true });\n\n const stampIcon = useCallback((svgId: string, label: string) => {\n const activeId = pendingPlacement?.data.svgId;\n if (pendingPlacement?.type === 'shapeSvg' && activeId === svgId) {\n setPendingPlacement(null);\n return;\n }\n // Brand icons (e.g. language logos) keep their authentic brand color; generic\n // outline icons follow the theme font color so they stay visible on any theme.\n const iconDef = getSvgIcon(svgId);\n const iconColor = iconDef?.brandColor ?? 'theme:base-content';\n const data: FlowNodeData = {\n label,\n fill: 'transparent',\n stroke: 'theme:base-content',\n strokeWidth: 1.5,\n color: iconColor,\n labelColor: 'theme:base-content',\n fontSize: 12,\n svgId,\n iconBox: false,\n labelPlacement: 'bottom',\n borderStyle: 'none',\n };\n setPendingPlacement({ type: 'shapeSvg', width: 56, height: 56, data });\n setToolMode('select');\n }, [pendingPlacement, setPendingPlacement, setToolMode]);\n\n return (\n <>\n {SVG_ICON_CATEGORIES.map((cat) => {\n const icons = getSvgIconsByCategory(cat.id as SvgIconCategory);\n const isOpen = open[cat.id];\n return (\n <div key={cat.id}>\n <button\n type=\"button\"\n className=\"flow-palette-section-toggle\"\n onClick={() => setOpen((o) => ({ ...o, [cat.id]: !o[cat.id] }))}\n >\n <span style={{ transform: isOpen ? 'rotate(90deg)' : 'none', transition: 'transform .15s' }}>▸</span>\n {cat.label}\n </button>\n {isOpen && (\n <div className=\"flow-palette-grid\">\n {icons.map((ic) => (\n <div\n key={ic.id}\n className={`flow-palette-item${pendingPlacement?.type === 'shapeSvg' && pendingPlacement.data.svgId === ic.id ? ' flow-palette-item--active' : ''}`}\n onClick={() => stampIcon(ic.id, ic.label)}\n title={ic.label}\n >\n <SvgThumbnail id={ic.id} />\n <span className=\"flow-palette-item-label\">{ic.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </>\n );\n}\n\n/** Renders an SVG icon as an <img> (data URL) so it displays in the correct\n * SVG namespace, unlike dangerouslySetInnerHTML on an <svg> element. Brand icons\n * use their authentic brand color; generic outline icons fall back to a neutral\n * gray so the thumbnail matches how the icon looks once placed. */\nfunction SvgThumbnail({ id }: { id: string }) {\n const def = getSvgIcon(id);\n // brandColor may be a `theme:*` token (icons that follow the theme); resolve\n // it to a concrete color for the rasterized data URL.\n const brand = resolveThemeColor(def?.brandColor, '') || '#475569';\n const markup = buildSvgMarkup(id, brand);\n if (!markup) return null;\n const url = `data:image/svg+xml;utf8,${encodeURIComponent(markup)}`;\n return <img src={url} width={20} height={16} alt=\"\" style={{ objectFit: 'contain' }} />;\n}\n\n/** Multimedia stamps: rich DOM-rendered nodes (markdown/html/mermaid/math/image/3D/AI). */\nconst MEDIA_ITEMS: Array<{\n kind: FlowMediaKind;\n label: string;\n width: number;\n height: number;\n content: string;\n icon: React.ReactNode;\n}> = [\n {\n kind: 'markdown', label: 'Markdown', width: 260, height: 180,\n content: '# 标题\\n\\n- 支持 **GFM**\\n- 支持 `代码`\\n\\n> 引用文本',\n icon: <MediaGlyph text={'M↓'} />,\n },\n {\n kind: 'html', label: 'HTML', width: 260, height: 180,\n content: '<div style=\"font-family:sans-serif;padding:12px\">\\n <h3>Hello</h3>\\n <p>可编辑的 HTML 片段</p>\\n</div>',\n icon: <MediaGlyph text={'</>'} />,\n },\n {\n kind: 'mermaid', label: 'Mermaid', width: 280, height: 200,\n content: 'graph TD\\n A[开始] --> B{判断}\\n B -->|是| C[处理]\\n B -->|否| D[结束]',\n icon: <MediaGlyph text={'⎇'} />,\n },\n {\n kind: 'math', label: 'Math', width: 240, height: 120,\n content: 'E = mc^2',\n icon: <MediaGlyph text={'√x'} />,\n },\n {\n kind: 'image', label: 'Image', width: 320, height: 220,\n content: '',\n icon: <MediaGlyph text={'IMG'} />,\n },\n {\n kind: 'model3d', label: '3D', width: 360, height: 280,\n content: '',\n icon: <MediaGlyph text={'3D'} />,\n },\n {\n kind: 'ai', label: 'AI', width: 300, height: 340,\n content: '',\n icon: <MediaGlyph text={'AI'} />,\n },\n {\n kind: 'data', label: 'Data', width: 420, height: 300,\n content: '',\n icon: <MediaGlyph text={'⊞'} />,\n },\n];\n\nfunction MediaGlyph({ text }: { text: string }) {\n return (\n <div\n style={{\n width: 20, height: 16, display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontSize: 9, fontWeight: 700, color: 'color-mix(in oklch, var(--color-base-content) 60%, transparent)',\n border: '1px solid color-mix(in oklch, var(--color-base-content) 20%, transparent)', borderRadius: 3, flexShrink: 0,\n }}\n >\n {text}\n </div>\n );\n}\n\nexport function MediaStampContent() {\n const { setPendingPlacement, setToolMode, pendingPlacement } = useFlowUI();\n\n const stampMedia = useCallback((item: (typeof MEDIA_ITEMS)[number]) => {\n if (pendingPlacement?.type === 'mediaNode' && pendingPlacement.data.mediaKind === item.kind) {\n setPendingPlacement(null);\n return;\n }\n const data: FlowNodeData = {\n label: item.label,\n fill: 'theme:base-100',\n stroke: 'theme:base-content',\n strokeWidth: 1.5,\n color: 'theme:base-content',\n fontSize: 13,\n borderStyle: 'solid',\n mediaKind: item.kind,\n mediaContent: item.content,\n ...(item.kind === 'ai'\n ? { aiConfig: { gateway: '', protocol: 'openai' as const, model: '' } }\n : item.kind === 'model3d'\n ? { modelFormat: 'stl' as const }\n : item.kind === 'data'\n ? { dataConfig: makeStarterDataConfig() }\n : {}),\n };\n setPendingPlacement({ type: 'mediaNode', width: item.width, height: item.height, data });\n setToolMode('select');\n }, [pendingPlacement, setPendingPlacement, setToolMode]);\n\n return (\n <div className=\"flow-palette-grid\">\n {MEDIA_ITEMS.map((item) => (\n <div\n key={item.kind}\n className={`flow-palette-item${pendingPlacement?.type === 'mediaNode' && pendingPlacement.data.mediaKind === item.kind ? ' flow-palette-item--active' : ''}`}\n onClick={() => stampMedia(item)}\n title={item.label}\n >\n {item.icon}\n <span className=\"flow-palette-item-label\">{item.label}</span>\n </div>\n ))}\n </div>\n );\n}\n\nfunction SectionHeader({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ fontSize: 11, fontWeight: 600, margin: '10px 0 6px', color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>\n {children}\n </div>\n );\n}\n\nexport function PaletteThumbnail({ type }: { type: FlowShapeType }) {\n const w = 36, h = 28;\n const s = 'currentColor';\n const sw = 1.5;\n\n const shapeMap: Record<string, React.ReactNode> = {\n shapeRect: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"1\" fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeRoundRect: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"5\" fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeEllipse: (\n <ellipse cx={w / 2} cy={h / 2} rx={w / 2 - 4} ry={h / 2 - 4} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeDiamond: (\n <polygon points={`${w / 2},3 ${w - 4},${h / 2} ${w / 2},${h - 3} 4,${h / 2}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeDocument: (\n <path d={`M4,4 L${w - 4},4 L${w - 4},${h - 8} C${w * 0.7},${h - 12} ${w * 0.3},${h - 2} 4,${h - 8} Z`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeParallelogram: (() => {\n const skew = (w - 8) * 0.2;\n return <polygon points={`${4 + skew},4 ${w - 4},4 ${w - 4 - skew},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeTriangle: (\n <polygon points={`${w / 2},4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeTrapezoid: (() => {\n const inset = (w - 8) * 0.15;\n return <polygon points={`${4 + inset},4 ${w - 4 - inset},4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapePentagon: (() => {\n const cx = w / 2, cy = h / 2, r = Math.min(cx, cy) - 4;\n const pts = Array.from({ length: 5 }, (_, i) => {\n const a = (Math.PI * 2 * i) / 5 - Math.PI / 2;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeHexagon: (() => {\n const cx = w / 2, cy = h / 2, rx = cx - 4, ry = cy - 4;\n const pts = Array.from({ length: 6 }, (_, i) => {\n const a = (Math.PI * 2 * i) / 6 - Math.PI / 6;\n return `${cx + rx * Math.cos(a)},${cy + ry * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeStar: (() => {\n const cx = w / 2, cy = h / 2, outer = Math.min(cx, cy) - 3, inner = outer * 0.4;\n const pts = Array.from({ length: 10 }, (_, i) => {\n const a = (Math.PI * i) / 5 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeHexagram: (() => {\n const cx = w / 2, cy = h / 2, outer = Math.min(cx, cy) - 3, inner = outer * 0.55;\n const pts = Array.from({ length: 12 }, (_, i) => {\n const a = (Math.PI * i) / 6 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeRightTriangle: (\n <polygon points={`4,4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeCorner: (() => {\n const hf = Math.min(w - 8, h - 8) * 0.4;\n return <polygon points={`4,4 ${w - 4},4 ${w - 4},${4 + hf} ${4 + hf},${4 + hf} ${4 + hf},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n textLabel: (\n <text x={w / 2} y={h / 2 + 1} textAnchor=\"middle\" dominantBaseline=\"middle\" fontSize=\"10\" fill=\"currentColor\">Aa</text>\n ),\n animAnchor: (\n <>\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"2\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"4 3\" />\n <circle cx=\"8\" cy=\"9\" r=\"4\" fill=\"none\" stroke={s} strokeWidth={sw} />\n <text x=\"8\" y=\"10.5\" textAnchor=\"middle\" dominantBaseline=\"middle\" fontSize=\"7\" fill=\"currentColor\">1</text>\n </>\n ),\n geometryGroup: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"3\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"6 3\" />\n ),\n flowGroup: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"3\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"2 3\" />\n ),\n };\n\n return (\n <svg width={w} height={h} viewBox={`0 0 ${w} ${h}`} style={{ color: 'color-mix(in oklch, var(--color-base-content) 55%, transparent)' }}>\n {shapeMap[type] ?? shapeMap.shapeRect}\n </svg>\n );\n}\n\nfunction LineToolThumbnail({ mode }: { mode: FlowToolMode }) {\n const w = 36, h = 28;\n const s = 'currentColor';\n const sw = 1.5;\n\n const thumbMap: Record<string, React.ReactNode> = {\n connect: (\n <>\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n <polygon points={`${w - 6},6 ${w - 11},4 ${w - 9},9`} fill={s} />\n </>\n ),\n freehand: (\n <path d={`M6,${h - 8} C10,${h - 14} 14,10 ${w / 2},${h / 2} S${w - 10},6 ${w - 6},8`} fill=\"none\" stroke={s} strokeWidth={sw} strokeLinecap=\"round\" />\n ),\n line: (\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n ),\n polyline: (\n <polyline points={`6,${h - 6} 14,8 ${w / 2 + 2},${h - 10} ${w - 6},6`} fill=\"none\" stroke={s} strokeWidth={sw} strokeLinejoin=\"round\" />\n ),\n arrow: (\n <>\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n <polygon points={`${w - 6},6 ${w - 12},6 ${w - 8},12`} fill={s} />\n </>\n ),\n };\n\n return (\n <svg width={w} height={h} viewBox={`0 0 ${w} ${h}`} style={{ color: 'color-mix(in oklch, var(--color-base-content) 55%, transparent)' }}>\n {thumbMap[mode] ?? thumbMap.line}\n </svg>\n );\n}\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ShapePalette.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ShapePalette.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { PALETTE_ITEMS } from '../constants';\nimport type { FlowShapeType, FlowNodeData, FlowToolMode } from '../types';\nimport { SVG_ICON_CATEGORIES, getSvgIconsByCategory, getSvgIcon, buildSvgMarkup, type SvgIconCategory } from '../nodes/svgIcons';\nimport type { FlowMediaKind } from '../types';\nimport { makeStarterDataConfig } from '../nodes/dataUtils';\nimport { resolveThemeColor } from '../utils/themeColor';\n\nconst LINE_TOOL_ITEMS: Array<{ mode: FlowToolMode; label: string }> = [\n { mode: 'freehand', label: 'Freehand' },\n { mode: 'line', label: 'Line' },\n { mode: 'polyline', label: 'Polyline' },\n { mode: 'arrow', label: 'Arrow' },\n];\n\n/**\n * Standalone panel (legacy). Prefer using ShapePaletteContent inside a FlowPanelGroup.\n */\nexport default function ShapePalette() {\n const { showPalette } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('right', 180);\n\n if (!showPalette) return null;\n\n return (\n <div className=\"flow-palette\" data-flow-panel style={{ ...panelStyle, width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--right\" {...resizeHandleProps} />\n <div\n className=\"flow-panel-drag-handle\"\n {...handleProps}\n style={{ fontSize: 11, fontWeight: 600, marginBottom: 6, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em', cursor: 'grab' }}\n >\n Shapes\n </div>\n <div className=\"flow-palette-content\">\n <ShapePaletteContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function ShapePaletteContent() {\n const { toolMode, setToolMode, setPendingPlacement, pendingPlacement } = useFlowUI();\n\n const handleAddShape = useCallback(\n (type: FlowShapeType, width: number, height: number, data: FlowNodeData) => {\n if (pendingPlacement?.type === type) {\n setPendingPlacement(null);\n } else {\n setPendingPlacement({ type, width, height, data: { ...data } });\n setToolMode('select');\n }\n },\n [setPendingPlacement, setToolMode, pendingPlacement],\n );\n\n return (\n <>\n <div className=\"flow-palette-grid\">\n {PALETTE_ITEMS.map((item) => (\n <div\n key={item.type}\n className={`flow-palette-item${pendingPlacement?.type === item.type ? ' flow-palette-item--active' : ''}`}\n onClick={() => handleAddShape(item.type, item.width, item.height, item.data)}\n >\n <PaletteThumbnail type={item.type} />\n <span className=\"flow-palette-item-label\">{item.data.label}</span>\n </div>\n ))}\n </div>\n\n <SectionHeader>Lines</SectionHeader>\n <div className=\"flow-palette-grid\">\n {LINE_TOOL_ITEMS.map((item) => (\n <div\n key={item.mode}\n className={`flow-palette-item${toolMode === item.mode ? ' flow-palette-item--active' : ''}`}\n onClick={() => { setPendingPlacement(null); setToolMode(toolMode === item.mode ? 'select' : item.mode); }}\n >\n <LineToolThumbnail mode={item.mode} />\n <span className=\"flow-palette-item-label\">{item.label}</span>\n </div>\n ))}\n </div>\n </>\n );\n}\n\n/** SVG icon stamps, grouped by category with a collapsible header per group. */\nexport function SvgStampContent() {\n const { setPendingPlacement, setToolMode, pendingPlacement } = useFlowUI();\n const [open, setOpen] = useState<Record<string, boolean>>({ lang: true });\n\n const stampIcon = useCallback((svgId: string, label: string) => {\n const activeId = pendingPlacement?.data.svgId;\n if (pendingPlacement?.type === 'shapeSvg' && activeId === svgId) {\n setPendingPlacement(null);\n return;\n }\n // Brand icons (e.g. language logos) keep their authentic brand color; generic\n // outline icons follow the theme font color so they stay visible on any theme.\n const iconDef = getSvgIcon(svgId);\n const iconColor = iconDef?.brandColor ?? 'theme:base-content';\n const data: FlowNodeData = {\n label,\n fill: 'transparent',\n stroke: 'theme:base-content',\n strokeWidth: 1.5,\n color: iconColor,\n labelColor: 'theme:base-content',\n fontSize: 12,\n svgId,\n iconBox: false,\n labelPlacement: 'bottom',\n borderStyle: 'none',\n };\n setPendingPlacement({ type: 'shapeSvg', width: 56, height: 56, data });\n setToolMode('select');\n }, [pendingPlacement, setPendingPlacement, setToolMode]);\n\n return (\n <>\n {SVG_ICON_CATEGORIES.map((cat) => {\n const icons = getSvgIconsByCategory(cat.id as SvgIconCategory);\n const isOpen = open[cat.id];\n return (\n <div key={cat.id}>\n <button\n type=\"button\"\n className=\"flow-palette-section-toggle\"\n onClick={() => setOpen((o) => ({ ...o, [cat.id]: !o[cat.id] }))}\n >\n <span style={{ transform: isOpen ? 'rotate(90deg)' : 'none', transition: 'transform .15s' }}>▸</span>\n {cat.label}\n </button>\n {isOpen && (\n <div className=\"flow-palette-grid\">\n {icons.map((ic) => (\n <div\n key={ic.id}\n className={`flow-palette-item${pendingPlacement?.type === 'shapeSvg' && pendingPlacement.data.svgId === ic.id ? ' flow-palette-item--active' : ''}`}\n onClick={() => stampIcon(ic.id, ic.label)}\n title={ic.label}\n >\n <SvgThumbnail id={ic.id} />\n <span className=\"flow-palette-item-label\">{ic.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </>\n );\n}\n\n/** Renders an SVG icon as an <img> (data URL) so it displays in the correct\n * SVG namespace, unlike dangerouslySetInnerHTML on an <svg> element. Brand icons\n * use their authentic brand color; generic outline icons fall back to a neutral\n * gray so the thumbnail matches how the icon looks once placed. */\nfunction SvgThumbnail({ id }: { id: string }) {\n const def = getSvgIcon(id);\n // brandColor may be a `theme:*` token (icons that follow the theme); resolve\n // it to a concrete color for the rasterized data URL.\n const brand = resolveThemeColor(def?.brandColor, '') || '#475569';\n const markup = buildSvgMarkup(id, brand);\n if (!markup) return null;\n const url = `data:image/svg+xml;utf8,${encodeURIComponent(markup)}`;\n return <img src={url} width={20} height={16} alt=\"\" style={{ objectFit: 'contain' }} />;\n}\n\n/** Multimedia stamps: rich DOM-rendered nodes (markdown/html/mermaid/math/image/3D/AI). */\nconst MEDIA_ITEMS: Array<{\n kind: FlowMediaKind;\n label: string;\n width: number;\n height: number;\n content: string;\n icon: React.ReactNode;\n}> = [\n {\n kind: 'markdown', label: 'Markdown', width: 260, height: 180,\n content: '# 标题\\n\\n- 支持 **GFM**\\n- 支持 `代码`\\n\\n> 引用文本',\n icon: <MediaGlyph text={'M↓'} />,\n },\n {\n kind: 'html', label: 'HTML', width: 260, height: 180,\n content: '<div style=\"font-family:sans-serif;padding:12px\">\\n <h3>Hello</h3>\\n <p>可编辑的 HTML 片段</p>\\n</div>',\n icon: <MediaGlyph text={'</>'} />,\n },\n {\n kind: 'mermaid', label: 'Mermaid', width: 280, height: 200,\n content: 'graph TD\\n A[开始] --> B{判断}\\n B -->|是| C[处理]\\n B -->|否| D[结束]',\n icon: <MediaGlyph text={'⎇'} />,\n },\n {\n kind: 'math', label: 'Math', width: 240, height: 120,\n content: 'E = mc^2',\n icon: <MediaGlyph text={'√x'} />,\n },\n {\n kind: 'image', label: 'Image', width: 320, height: 220,\n content: '',\n icon: <MediaGlyph text={'IMG'} />,\n },\n {\n kind: 'model3d', label: '3D', width: 360, height: 280,\n content: '',\n icon: <MediaGlyph text={'3D'} />,\n },\n {\n kind: 'ai', label: 'AI', width: 300, height: 340,\n content: '',\n icon: <MediaGlyph text={'AI'} />,\n },\n {\n kind: 'data', label: 'Data', width: 420, height: 300,\n content: '',\n icon: <MediaGlyph text={'⊞'} />,\n },\n];\n\nfunction MediaGlyph({ text }: { text: string }) {\n return (\n <div\n style={{\n width: 20, height: 16, display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontSize: 9, fontWeight: 700, color: 'color-mix(in oklch, var(--color-base-content) 60%, transparent)',\n border: '1px solid color-mix(in oklch, var(--color-base-content) 20%, transparent)', borderRadius: 3, flexShrink: 0,\n }}\n >\n {text}\n </div>\n );\n}\n\nexport function MediaStampContent() {\n const { setPendingPlacement, setToolMode, pendingPlacement } = useFlowUI();\n\n const stampMedia = useCallback((item: (typeof MEDIA_ITEMS)[number]) => {\n if (pendingPlacement?.type === 'mediaNode' && pendingPlacement.data.mediaKind === item.kind) {\n setPendingPlacement(null);\n return;\n }\n const data: FlowNodeData = {\n label: item.label,\n fill: 'theme:base-100',\n stroke: 'theme:base-content',\n strokeWidth: 1.5,\n color: 'theme:base-content',\n fontSize: 13,\n borderStyle: 'solid',\n mediaKind: item.kind,\n mediaContent: item.content,\n ...(item.kind === 'ai'\n ? { aiConfig: { gateway: '', protocol: 'openai' as const, model: '' } }\n : item.kind === 'model3d'\n ? { modelFormat: 'stl' as const }\n : item.kind === 'data'\n ? { dataConfig: makeStarterDataConfig() }\n : {}),\n };\n setPendingPlacement({ type: 'mediaNode', width: item.width, height: item.height, data });\n setToolMode('select');\n }, [pendingPlacement, setPendingPlacement, setToolMode]);\n\n return (\n <div className=\"flow-palette-grid\">\n {MEDIA_ITEMS.map((item) => (\n <div\n key={item.kind}\n className={`flow-palette-item${pendingPlacement?.type === 'mediaNode' && pendingPlacement.data.mediaKind === item.kind ? ' flow-palette-item--active' : ''}`}\n onClick={() => stampMedia(item)}\n title={item.label}\n >\n {item.icon}\n <span className=\"flow-palette-item-label\">{item.label}</span>\n </div>\n ))}\n </div>\n );\n}\n\nfunction SectionHeader({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ fontSize: 11, fontWeight: 600, margin: '10px 0 6px', color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>\n {children}\n </div>\n );\n}\n\nexport function PaletteThumbnail({ type }: { type: FlowShapeType }) {\n const w = 36, h = 28;\n const s = 'currentColor';\n const sw = 1.5;\n\n const shapeMap: Record<string, React.ReactNode> = {\n shapeRect: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"1\" fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeRoundRect: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"5\" fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeEllipse: (\n <ellipse cx={w / 2} cy={h / 2} rx={w / 2 - 4} ry={h / 2 - 4} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeDiamond: (\n <polygon points={`${w / 2},3 ${w - 4},${h / 2} ${w / 2},${h - 3} 4,${h / 2}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeDocument: (\n <path d={`M4,4 L${w - 4},4 L${w - 4},${h - 8} C${w * 0.7},${h - 12} ${w * 0.3},${h - 2} 4,${h - 8} Z`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeParallelogram: (() => {\n const skew = (w - 8) * 0.2;\n return <polygon points={`${4 + skew},4 ${w - 4},4 ${w - 4 - skew},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeTriangle: (\n <polygon points={`${w / 2},4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeTrapezoid: (() => {\n const inset = (w - 8) * 0.15;\n return <polygon points={`${4 + inset},4 ${w - 4 - inset},4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapePentagon: (() => {\n const cx = w / 2, cy = h / 2, r = Math.min(cx, cy) - 4;\n const pts = Array.from({ length: 5 }, (_, i) => {\n const a = (Math.PI * 2 * i) / 5 - Math.PI / 2;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeHexagon: (() => {\n const cx = w / 2, cy = h / 2, rx = cx - 4, ry = cy - 4;\n const pts = Array.from({ length: 6 }, (_, i) => {\n const a = (Math.PI * 2 * i) / 6 - Math.PI / 6;\n return `${cx + rx * Math.cos(a)},${cy + ry * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeStar: (() => {\n const cx = w / 2, cy = h / 2, outer = Math.min(cx, cy) - 3, inner = outer * 0.4;\n const pts = Array.from({ length: 10 }, (_, i) => {\n const a = (Math.PI * i) / 5 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeHexagram: (() => {\n const cx = w / 2, cy = h / 2, outer = Math.min(cx, cy) - 3, inner = outer * 0.55;\n const pts = Array.from({ length: 12 }, (_, i) => {\n const a = (Math.PI * i) / 6 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeRightTriangle: (\n <polygon points={`4,4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeCorner: (() => {\n const hf = Math.min(w - 8, h - 8) * 0.4;\n return <polygon points={`4,4 ${w - 4},4 ${w - 4},${4 + hf} ${4 + hf},${4 + hf} ${4 + hf},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n textLabel: (\n <text x={w / 2} y={h / 2 + 1} textAnchor=\"middle\" dominantBaseline=\"middle\" fontSize=\"10\" fill=\"currentColor\">Aa</text>\n ),\n animAnchor: (\n <>\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"2\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"4 3\" />\n <circle cx=\"8\" cy=\"9\" r=\"4\" fill=\"none\" stroke={s} strokeWidth={sw} />\n <text x=\"8\" y=\"10.5\" textAnchor=\"middle\" dominantBaseline=\"middle\" fontSize=\"7\" fill=\"currentColor\">1</text>\n </>\n ),\n geometryGroup: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"3\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"6 3\" />\n ),\n flowGroup: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"3\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"2 3\" />\n ),\n };\n\n return (\n <svg width={w} height={h} viewBox={`0 0 ${w} ${h}`} style={{ color: 'color-mix(in oklch, var(--color-base-content) 55%, transparent)' }}>\n {shapeMap[type] ?? shapeMap.shapeRect}\n </svg>\n );\n}\n\nfunction LineToolThumbnail({ mode }: { mode: FlowToolMode }) {\n const w = 36, h = 28;\n const s = 'currentColor';\n const sw = 1.5;\n\n const thumbMap: Record<string, React.ReactNode> = {\n connect: (\n <>\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n <polygon points={`${w - 6},6 ${w - 11},4 ${w - 9},9`} fill={s} />\n </>\n ),\n freehand: (\n <path d={`M6,${h - 8} C10,${h - 14} 14,10 ${w / 2},${h / 2} S${w - 10},6 ${w - 6},8`} fill=\"none\" stroke={s} strokeWidth={sw} strokeLinecap=\"round\" />\n ),\n line: (\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n ),\n polyline: (\n <polyline points={`6,${h - 6} 14,8 ${w / 2 + 2},${h - 10} ${w - 6},6`} fill=\"none\" stroke={s} strokeWidth={sw} strokeLinejoin=\"round\" />\n ),\n arrow: (\n <>\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n <polygon points={`${w - 6},6 ${w - 12},6 ${w - 8},12`} fill={s} />\n </>\n ),\n };\n\n return (\n <svg width={w} height={h} viewBox={`0 0 ${w} ${h}`} style={{ color: 'color-mix(in oklch, var(--color-base-content) 55%, transparent)' }}>\n {thumbMap[mode] ?? thumbMap.line}\n </svg>\n );\n}\n\n"],"mappings":"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"}
|