dishui 0.0.62 → 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 +79 -79
  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 +1 @@
1
- {"version":3,"file":"DataInspectorSection.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/DataInspectorSection.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\nimport { ExpandableTextarea } from './ExpandableTextarea';\nimport type {\n FlowNode,\n FlowDataConfig,\n FlowDataColumn,\n FlowDataColumnType,\n FlowDataChartType,\n FlowDataView,\n FlowDataPivotPanelPlacement,\n} from '../types';\nimport {\n parseDataFile,\n parseCsv,\n matrixToTable,\n makeDefaultDataConfig,\n applyCsvText,\n toCsv,\n numericFields,\n labelFor,\n DATA_CHART_PALETTE,\n} from '../nodes/dataUtils';\n\nconst COLUMN_TYPE_OPTIONS: Array<{ value: FlowDataColumnType; label: string }> = [\n { value: 'string', label: '文本' },\n { value: 'number', label: '数值' },\n { value: 'date', label: '日期' },\n { value: 'boolean', label: '布尔' },\n];\n\nconst CHART_TYPE_OPTIONS: Array<{ value: FlowDataChartType; label: string }> = [\n { value: 'bar', label: '柱状图' },\n { value: 'barHorizontal', label: '横向柱状图' },\n { value: 'line', label: '折线图' },\n { value: 'area', label: '面积图' },\n { value: 'scatter', label: '散点图' },\n { value: 'pie', label: '饼图' },\n];\n\nconst PIVOT_PLACEMENT_OPTIONS: Array<{ value: FlowDataPivotPanelPlacement; label: string }> = [\n { value: 'top', label: '上方' },\n { value: 'bottom', label: '下方' },\n { value: 'left', label: '左侧' },\n { value: 'right', label: '右侧' },\n];\n\nconst EMPTY_CONFIG: FlowDataConfig = { columns: [], rows: [], view: 'table' };\n\n/**\n * Inspector controls for a Data node: upload CSV/Excel, edit columns, edit rows\n * as CSV text (with fullscreen), and configure the table (pivot) or chart view.\n */\nexport function DataInspectorSection({\n node,\n onUpdateData,\n}: {\n node: FlowNode;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n const config = node.data.dataConfig ?? EMPTY_CONFIG;\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const update = (patch: Partial<FlowDataConfig>) => {\n onUpdateData(node.id, 'dataConfig', { ...config, ...patch });\n };\n\n // ── CSV text editing (local draft, committed on blur) ────────────────────\n // The textarea edits a CSV serialization of columns+rows. We keep a local\n // draft so typing isn't interrupted by re-parsing; the parse (which re-infers\n // nothing for known columns and preserves chart/pivot field refs) runs once\n // on blur / fullscreen close. When the config changes externally (upload,\n // paste), the draft is re-synced.\n const csvText = useMemo(() => toCsv(config.columns, config.rows), [config.columns, config.rows]);\n const [csvDraft, setCsvDraft] = useState(csvText);\n const lastCommitted = useRef(csvText);\n useEffect(() => {\n if (csvText !== lastCommitted.current) {\n lastCommitted.current = csvText;\n setCsvDraft(csvText);\n }\n }, [csvText]);\n\n const commitCsv = (text: string) => {\n if (text === lastCommitted.current) return;\n lastCommitted.current = text;\n onUpdateData(node.id, 'dataConfig', applyCsvText(config, text));\n };\n\n // ── File upload ────────────────────────────────────────────────────────\n const handleFile = async (file: File) => {\n try {\n const parsed = await parseDataFile(file);\n if (parsed.columns.length === 0) {\n window.alert('未能从文件中解析出任何数据。');\n return;\n }\n onUpdateData(node.id, 'dataConfig', makeDefaultDataConfig(parsed, file.name));\n } catch (e: any) {\n window.alert(`解析失败:${e?.message ?? e}`);\n }\n };\n\n // ── Column editing ─────────────────────────────────────────────────────\n const setColumn = (index: number, patch: Partial<FlowDataColumn>) => {\n const columns = config.columns.map((c, i) => (i === index ? { ...c, ...patch } : c));\n update({ columns });\n };\n\n const addColumn = () => {\n const used = new Set(config.columns.map((c) => c.key));\n let key = 'col';\n let n = 1;\n while (used.has(key)) key = `col_${n++}`;\n const columns: FlowDataColumn[] = [...config.columns, { key, label: key, type: 'string' }];\n // pad existing rows with an empty value for the new column\n const rows = config.rows.map((r) => ({ ...r, [key]: '' }));\n update({ columns, rows });\n };\n\n const removeColumn = (index: number) => {\n const col = config.columns[index];\n const columns = config.columns.filter((_, i) => i !== index);\n const rows = config.rows.map((r) => {\n const { [col.key]: _drop, ...rest } = r;\n return rest;\n });\n // prune chart/pivot references to the removed column\n const chart = config.chart\n ? {\n ...config.chart,\n xField: config.chart.xField === col.key ? columns.find((c) => c.type !== 'number')?.key ?? columns[0]?.key : config.chart.xField,\n yFields: (config.chart.yFields ?? []).filter((f) => f !== col.key),\n }\n : config.chart;\n const pivot = config.pivot\n ? {\n ...config.pivot,\n rowFields: config.pivot.rowFields.filter((f) => f !== col.key),\n colFields: config.pivot.colFields.filter((f) => f !== col.key),\n values: config.pivot.values.filter((v) => v.field !== col.key),\n }\n : config.pivot;\n update({ columns, rows, chart, pivot });\n };\n\n // ── Paste CSV (replace whole table) ─────────────────────────────────────\n const pasteCsv = () => {\n const text = window.prompt('粘贴 CSV 文本(第一行为表头):');\n if (!text) return;\n const parsed = matrixToTable(parseCsv(text));\n if (parsed.columns.length === 0) {\n window.alert('未能解析出数据。');\n return;\n }\n onUpdateData(node.id, 'dataConfig', makeDefaultDataConfig(parsed));\n };\n\n const nums = numericFields(config.columns);\n const chart = config.chart ?? { type: 'bar' as FlowDataChartType };\n const setChart = (patch: Partial<typeof chart>) => update({ chart: { ...chart, ...patch } });\n\n const setSeriesColor = (field: string, color: string) => {\n setChart({ seriesColors: { ...(chart.seriesColors ?? {}), [field]: color } });\n };\n const resetSeriesColor = (field: string) => {\n const next = { ...(chart.seriesColors ?? {}) };\n delete next[field];\n setChart({ seriesColors: Object.keys(next).length ? next : undefined });\n };\n\n const palette = chart.palette?.length ? chart.palette : DATA_CHART_PALETTE;\n const setPaletteColor = (i: number, color: string) => {\n const next = DATA_CHART_PALETTE.map((c, j) => (j === i ? color : (chart.palette?.[j] ?? c)));\n setChart({ palette: next });\n };\n\n const pivot = config.pivot ?? { enabled: false, rowFields: [], colFields: [], values: [] };\n const setPivot = (patch: Partial<typeof pivot>) => update({ pivot: { ...pivot, ...patch } });\n\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Data</div>\n\n {/* Import controls */}\n <div className=\"flow-inspector-row\">\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".csv,.tsv,.txt,.xlsx,.xlsm,text/csv\"\n hidden\n onChange={(e) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (file) void handleFile(file);\n }}\n />\n <Button size=\"xs\" variant=\"neutral\" onClick={() => fileInputRef.current?.click()}>\n 上传 CSV / Excel\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={pasteCsv}>\n 粘贴 CSV\n </Button>\n </div>\n {config.sourceName && (\n <div className=\"flow-inspector-help\">来源:{config.sourceName}</div>\n )}\n\n {/* View toggle */}\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">视图</Label>\n <Select\n options={[\n { value: 'table', label: '表格 / 透视' },\n { value: 'chart', label: '图表' },\n ]}\n value={config.view}\n onChange={(v) => update({ view: v as FlowDataView })}\n />\n </div>\n\n {/* Columns editor */}\n <div className=\"flow-inspector-subtitle\">列配置({config.columns.length})</div>\n {config.columns.map((col, i) => (\n <div key={i} className=\"flow-data-col-row\">\n <Input\n size=\"xs\"\n value={col.label ?? col.key}\n placeholder=\"列名\"\n onChange={(e) => setColumn(i, { label: e.target.value })}\n className=\"flex-1\"\n />\n <Select\n options={COLUMN_TYPE_OPTIONS}\n value={col.type}\n onChange={(v) => setColumn(i, { type: v as FlowDataColumnType })}\n />\n <Button size=\"xs\" variant=\"ghost\" onClick={() => removeColumn(i)}>\n ✕\n </Button>\n </div>\n ))}\n <div className=\"flow-inspector-row\">\n <Button size=\"xs\" variant=\"ghost\" onClick={addColumn}>+ 添加列</Button>\n </div>\n\n {/* Rows editor: CSV text with fullscreen */}\n <div className=\"flow-inspector-subtitle\">数据(CSV · {config.rows.length} 行)</div>\n <ExpandableTextarea\n label=\"CSV 数据(首行为表头)\"\n value={csvDraft}\n onChange={setCsvDraft}\n onBlur={commitCsv}\n rows={8}\n placeholder=\"类别,数值&#10;A,30&#10;B,45\"\n />\n <div className=\"flow-inspector-help\">\n 直接编辑 CSV 文本,失焦或关闭全屏后生效。已有列的类型会保留。\n </div>\n\n {/* Chart config */}\n {config.view === 'chart' && (\n <>\n <div className=\"flow-inspector-subtitle\">图表配置</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">类型</Label>\n <Select\n options={CHART_TYPE_OPTIONS}\n value={chart.type}\n onChange={(v) => setChart({ type: v as FlowDataChartType })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">\n {chart.type === 'scatter' ? 'X 字段' : '类别轴'}\n </Label>\n <Select\n options={config.columns.map((c) => ({ value: c.key, label: c.label ?? c.key }))}\n value={chart.xField ?? ''}\n onChange={(v) => setChart({ xField: typeof v === 'string' ? v : String(v) })}\n />\n </div>\n <div className=\"flow-inspector-subtitle-sm\">\n {chart.type === 'scatter' || chart.type === 'pie' ? '数值字段' : '数值字段(可多选,多系列)'}\n </div>\n {nums.length === 0 && (\n <div className=\"flow-inspector-help\">没有数值列,请先将某列类型设为「数值」。</div>\n )}\n {nums.map((f) => {\n const selected = (chart.yFields ?? []).includes(f);\n const single = chart.type === 'scatter' || chart.type === 'pie';\n return (\n <label key={f} className=\"flow-data-field-toggle\">\n <input\n type={single ? 'radio' : 'checkbox'}\n className={single ? 'radio radio-xs radio-primary' : 'checkbox checkbox-xs checkbox-primary'}\n checked={selected}\n onChange={(e) => {\n if (single) {\n setChart({ yFields: [f] });\n return;\n }\n const current = new Set(chart.yFields ?? []);\n if (e.target.checked) current.add(f);\n else current.delete(f);\n setChart({ yFields: Array.from(current) });\n }}\n />\n <span>{labelFor(config.columns, f)}</span>\n </label>\n );\n })}\n\n {/* Chart colors */}\n {(chart.yFields ?? []).length > 0 && chart.type !== 'pie' && (\n <>\n <div className=\"flow-inspector-subtitle-sm\">系列颜色</div>\n {(chart.yFields ?? []).map((f, i) => {\n const color = chart.seriesColors?.[f] ?? DATA_CHART_PALETTE[i % DATA_CHART_PALETTE.length];\n const overridden = !!chart.seriesColors?.[f];\n return (\n <div key={f} className=\"flow-data-color-row\">\n <input\n type=\"color\"\n value={color}\n onChange={(e) => setSeriesColor(f, e.target.value)}\n />\n <span className=\"flow-data-color-label\">{labelFor(config.columns, f)}</span>\n {overridden && (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => resetSeriesColor(f)}>\n 重置\n </Button>\n )}\n </div>\n );\n })}\n </>\n )}\n {chart.type === 'pie' && (\n <>\n <div className=\"flow-inspector-subtitle-sm\">饼图配色</div>\n <div className=\"flow-data-palette\">\n {DATA_CHART_PALETTE.map((_, i) => (\n <input\n key={i}\n type=\"color\"\n value={palette[i % palette.length]}\n onChange={(e) => setPaletteColor(i, e.target.value)}\n />\n ))}\n </div>\n {chart.palette && (\n <div className=\"flow-inspector-row\">\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setChart({ palette: undefined })}>\n 重置为默认配色\n </Button>\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {/* Pivot config */}\n {config.view === 'table' && (\n <>\n <div className=\"flow-inspector-subtitle\">透视(Pivot)</div>\n <label className=\"flow-data-field-toggle\">\n <input\n type=\"checkbox\"\n className=\"toggle toggle-xs toggle-primary\"\n checked={pivot.enabled}\n onChange={(e) => setPivot({ enabled: e.target.checked })}\n />\n <span>开启透视模式</span>\n </label>\n {pivot.enabled && (\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">面板位置</Label>\n <Select\n options={PIVOT_PLACEMENT_OPTIONS}\n value={pivot.panelPlacement ?? 'top'}\n onChange={(v) => setPivot({ panelPlacement: v as FlowDataPivotPanelPlacement })}\n />\n </div>\n )}\n <div className=\"flow-inspector-help\">\n 透视的行/列/度量可在画布节点内的透视面板上交互拖拽调整。\n </div>\n </>\n )}\n </div>\n );\n}\n\nexport default DataInspectorSection;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataInspectorSection.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/DataInspectorSection.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\nimport { ExpandableTextarea } from './ExpandableTextarea';\nimport type {\n FlowNode,\n FlowDataConfig,\n FlowDataColumn,\n FlowDataColumnType,\n FlowDataChartType,\n FlowDataView,\n FlowDataPivotPanelPlacement,\n} from '../types';\nimport {\n parseDataFile,\n parseCsv,\n matrixToTable,\n makeDefaultDataConfig,\n applyCsvText,\n toCsv,\n numericFields,\n labelFor,\n DATA_CHART_PALETTE,\n} from '../nodes/dataUtils';\n\nconst COLUMN_TYPE_OPTIONS: Array<{ value: FlowDataColumnType; label: string }> = [\n { value: 'string', label: '文本' },\n { value: 'number', label: '数值' },\n { value: 'date', label: '日期' },\n { value: 'boolean', label: '布尔' },\n];\n\nconst CHART_TYPE_OPTIONS: Array<{ value: FlowDataChartType; label: string }> = [\n { value: 'bar', label: '柱状图' },\n { value: 'barHorizontal', label: '横向柱状图' },\n { value: 'line', label: '折线图' },\n { value: 'area', label: '面积图' },\n { value: 'scatter', label: '散点图' },\n { value: 'pie', label: '饼图' },\n];\n\nconst PIVOT_PLACEMENT_OPTIONS: Array<{ value: FlowDataPivotPanelPlacement; label: string }> = [\n { value: 'top', label: '上方' },\n { value: 'bottom', label: '下方' },\n { value: 'left', label: '左侧' },\n { value: 'right', label: '右侧' },\n];\n\nconst EMPTY_CONFIG: FlowDataConfig = { columns: [], rows: [], view: 'table' };\n\n/**\n * Inspector controls for a Data node: upload CSV/Excel, edit columns, edit rows\n * as CSV text (with fullscreen), and configure the table (pivot) or chart view.\n */\nexport function DataInspectorSection({\n node,\n onUpdateData,\n}: {\n node: FlowNode;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n const config = node.data.dataConfig ?? EMPTY_CONFIG;\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const update = (patch: Partial<FlowDataConfig>) => {\n onUpdateData(node.id, 'dataConfig', { ...config, ...patch });\n };\n\n // ── CSV text editing (local draft, committed on blur) ────────────────────\n // The textarea edits a CSV serialization of columns+rows. We keep a local\n // draft so typing isn't interrupted by re-parsing; the parse (which re-infers\n // nothing for known columns and preserves chart/pivot field refs) runs once\n // on blur / fullscreen close. When the config changes externally (upload,\n // paste), the draft is re-synced.\n const csvText = useMemo(() => toCsv(config.columns, config.rows), [config.columns, config.rows]);\n const [csvDraft, setCsvDraft] = useState(csvText);\n const lastCommitted = useRef(csvText);\n useEffect(() => {\n if (csvText !== lastCommitted.current) {\n lastCommitted.current = csvText;\n setCsvDraft(csvText);\n }\n }, [csvText]);\n\n const commitCsv = (text: string) => {\n if (text === lastCommitted.current) return;\n lastCommitted.current = text;\n onUpdateData(node.id, 'dataConfig', applyCsvText(config, text));\n };\n\n // ── File upload ────────────────────────────────────────────────────────\n const handleFile = async (file: File) => {\n try {\n const parsed = await parseDataFile(file);\n if (parsed.columns.length === 0) {\n window.alert('未能从文件中解析出任何数据。');\n return;\n }\n onUpdateData(node.id, 'dataConfig', makeDefaultDataConfig(parsed, file.name));\n } catch (e: any) {\n window.alert(`解析失败:${e?.message ?? e}`);\n }\n };\n\n // ── Column editing ─────────────────────────────────────────────────────\n const setColumn = (index: number, patch: Partial<FlowDataColumn>) => {\n const columns = config.columns.map((c, i) => (i === index ? { ...c, ...patch } : c));\n update({ columns });\n };\n\n const addColumn = () => {\n const used = new Set(config.columns.map((c) => c.key));\n let key = 'col';\n let n = 1;\n while (used.has(key)) key = `col_${n++}`;\n const columns: FlowDataColumn[] = [...config.columns, { key, label: key, type: 'string' }];\n // pad existing rows with an empty value for the new column\n const rows = config.rows.map((r) => ({ ...r, [key]: '' }));\n update({ columns, rows });\n };\n\n const removeColumn = (index: number) => {\n const col = config.columns[index];\n const columns = config.columns.filter((_, i) => i !== index);\n const rows = config.rows.map((r) => {\n const { [col.key]: _drop, ...rest } = r;\n return rest;\n });\n // prune chart/pivot references to the removed column\n const chart = config.chart\n ? {\n ...config.chart,\n xField: config.chart.xField === col.key ? columns.find((c) => c.type !== 'number')?.key ?? columns[0]?.key : config.chart.xField,\n yFields: (config.chart.yFields ?? []).filter((f) => f !== col.key),\n }\n : config.chart;\n const pivot = config.pivot\n ? {\n ...config.pivot,\n rowFields: config.pivot.rowFields.filter((f) => f !== col.key),\n colFields: config.pivot.colFields.filter((f) => f !== col.key),\n values: config.pivot.values.filter((v) => v.field !== col.key),\n }\n : config.pivot;\n update({ columns, rows, chart, pivot });\n };\n\n // ── Paste CSV (replace whole table) ─────────────────────────────────────\n const pasteCsv = () => {\n const text = window.prompt('粘贴 CSV 文本(第一行为表头):');\n if (!text) return;\n const parsed = matrixToTable(parseCsv(text));\n if (parsed.columns.length === 0) {\n window.alert('未能解析出数据。');\n return;\n }\n onUpdateData(node.id, 'dataConfig', makeDefaultDataConfig(parsed));\n };\n\n const nums = numericFields(config.columns);\n const chart = config.chart ?? { type: 'bar' as FlowDataChartType };\n const setChart = (patch: Partial<typeof chart>) => update({ chart: { ...chart, ...patch } });\n\n const setSeriesColor = (field: string, color: string) => {\n setChart({ seriesColors: { ...(chart.seriesColors ?? {}), [field]: color } });\n };\n const resetSeriesColor = (field: string) => {\n const next = { ...(chart.seriesColors ?? {}) };\n delete next[field];\n setChart({ seriesColors: Object.keys(next).length ? next : undefined });\n };\n\n const palette = chart.palette?.length ? chart.palette : DATA_CHART_PALETTE;\n const setPaletteColor = (i: number, color: string) => {\n const next = DATA_CHART_PALETTE.map((c, j) => (j === i ? color : (chart.palette?.[j] ?? c)));\n setChart({ palette: next });\n };\n\n const pivot = config.pivot ?? { enabled: false, rowFields: [], colFields: [], values: [] };\n const setPivot = (patch: Partial<typeof pivot>) => update({ pivot: { ...pivot, ...patch } });\n\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Data</div>\n\n {/* Import controls */}\n <div className=\"flow-inspector-row\">\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".csv,.tsv,.txt,.xlsx,.xlsm,text/csv\"\n hidden\n onChange={(e) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (file) void handleFile(file);\n }}\n />\n <Button size=\"xs\" variant=\"neutral\" onClick={() => fileInputRef.current?.click()}>\n 上传 CSV / Excel\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={pasteCsv}>\n 粘贴 CSV\n </Button>\n </div>\n {config.sourceName && (\n <div className=\"flow-inspector-help\">来源:{config.sourceName}</div>\n )}\n\n {/* View toggle */}\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">视图</Label>\n <Select\n options={[\n { value: 'table', label: '表格 / 透视' },\n { value: 'chart', label: '图表' },\n ]}\n value={config.view}\n onChange={(v) => update({ view: v as FlowDataView })}\n />\n </div>\n\n {/* Columns editor */}\n <div className=\"flow-inspector-subtitle\">列配置({config.columns.length})</div>\n {config.columns.map((col, i) => (\n <div key={i} className=\"flow-data-col-row\">\n <Input\n size=\"xs\"\n value={col.label ?? col.key}\n placeholder=\"列名\"\n onChange={(e) => setColumn(i, { label: e.target.value })}\n className=\"flex-1\"\n />\n <Select\n options={COLUMN_TYPE_OPTIONS}\n value={col.type}\n onChange={(v) => setColumn(i, { type: v as FlowDataColumnType })}\n />\n <Button size=\"xs\" variant=\"ghost\" onClick={() => removeColumn(i)}>\n ✕\n </Button>\n </div>\n ))}\n <div className=\"flow-inspector-row\">\n <Button size=\"xs\" variant=\"ghost\" onClick={addColumn}>+ 添加列</Button>\n </div>\n\n {/* Rows editor: CSV text with fullscreen */}\n <div className=\"flow-inspector-subtitle\">数据(CSV · {config.rows.length} 行)</div>\n <ExpandableTextarea\n label=\"CSV 数据(首行为表头)\"\n value={csvDraft}\n onChange={setCsvDraft}\n onBlur={commitCsv}\n rows={8}\n placeholder=\"类别,数值&#10;A,30&#10;B,45\"\n />\n <div className=\"flow-inspector-help\">\n 直接编辑 CSV 文本,失焦或关闭全屏后生效。已有列的类型会保留。\n </div>\n\n {/* Chart config */}\n {config.view === 'chart' && (\n <>\n <div className=\"flow-inspector-subtitle\">图表配置</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">类型</Label>\n <Select\n options={CHART_TYPE_OPTIONS}\n value={chart.type}\n onChange={(v) => setChart({ type: v as FlowDataChartType })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">\n {chart.type === 'scatter' ? 'X 字段' : '类别轴'}\n </Label>\n <Select\n options={config.columns.map((c) => ({ value: c.key, label: c.label ?? c.key }))}\n value={chart.xField ?? ''}\n onChange={(v) => setChart({ xField: typeof v === 'string' ? v : String(v) })}\n />\n </div>\n <div className=\"flow-inspector-subtitle-sm\">\n {chart.type === 'scatter' || chart.type === 'pie' ? '数值字段' : '数值字段(可多选,多系列)'}\n </div>\n {nums.length === 0 && (\n <div className=\"flow-inspector-help\">没有数值列,请先将某列类型设为「数值」。</div>\n )}\n {nums.map((f) => {\n const selected = (chart.yFields ?? []).includes(f);\n const single = chart.type === 'scatter' || chart.type === 'pie';\n return (\n <label key={f} className=\"flow-data-field-toggle\">\n <input\n type={single ? 'radio' : 'checkbox'}\n className={single ? 'radio radio-xs radio-primary' : 'checkbox checkbox-xs checkbox-primary'}\n checked={selected}\n onChange={(e) => {\n if (single) {\n setChart({ yFields: [f] });\n return;\n }\n const current = new Set(chart.yFields ?? []);\n if (e.target.checked) current.add(f);\n else current.delete(f);\n setChart({ yFields: Array.from(current) });\n }}\n />\n <span>{labelFor(config.columns, f)}</span>\n </label>\n );\n })}\n\n {/* Chart colors */}\n {(chart.yFields ?? []).length > 0 && chart.type !== 'pie' && (\n <>\n <div className=\"flow-inspector-subtitle-sm\">系列颜色</div>\n {(chart.yFields ?? []).map((f, i) => {\n const color = chart.seriesColors?.[f] ?? DATA_CHART_PALETTE[i % DATA_CHART_PALETTE.length];\n const overridden = !!chart.seriesColors?.[f];\n return (\n <div key={f} className=\"flow-data-color-row\">\n <input\n type=\"color\"\n value={color}\n onChange={(e) => setSeriesColor(f, e.target.value)}\n />\n <span className=\"flow-data-color-label\">{labelFor(config.columns, f)}</span>\n {overridden && (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => resetSeriesColor(f)}>\n 重置\n </Button>\n )}\n </div>\n );\n })}\n </>\n )}\n {chart.type === 'pie' && (\n <>\n <div className=\"flow-inspector-subtitle-sm\">饼图配色</div>\n <div className=\"flow-data-palette\">\n {DATA_CHART_PALETTE.map((_, i) => (\n <input\n key={i}\n type=\"color\"\n value={palette[i % palette.length]}\n onChange={(e) => setPaletteColor(i, e.target.value)}\n />\n ))}\n </div>\n {chart.palette && (\n <div className=\"flow-inspector-row\">\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setChart({ palette: undefined })}>\n 重置为默认配色\n </Button>\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {/* Pivot config */}\n {config.view === 'table' && (\n <>\n <div className=\"flow-inspector-subtitle\">透视(Pivot)</div>\n <label className=\"flow-data-field-toggle\">\n <input\n type=\"checkbox\"\n className=\"toggle toggle-xs toggle-primary\"\n checked={pivot.enabled}\n onChange={(e) => setPivot({ enabled: e.target.checked })}\n />\n <span>开启透视模式</span>\n </label>\n {pivot.enabled && (\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">面板位置</Label>\n <Select\n options={PIVOT_PLACEMENT_OPTIONS}\n value={pivot.panelPlacement ?? 'top'}\n onChange={(v) => setPivot({ panelPlacement: v as FlowDataPivotPanelPlacement })}\n />\n </div>\n )}\n <div className=\"flow-inspector-help\">\n 透视的行/列/度量可在画布节点内的透视面板上交互拖拽调整。\n </div>\n </>\n )}\n </div>\n );\n}\n\nexport default DataInspectorSection;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExpandableTextarea.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ExpandableTextarea.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\n\n/**\n * Textarea with a \"fullscreen\" expand button. The fullscreen overlay edits the\n * same value; `onBlur`/`onDone` let callers commit expensive parses only when\n * editing finishes instead of on every keystroke.\n */\nexport function ExpandableTextarea({\n label,\n value,\n onChange,\n onBlur,\n rows,\n placeholder,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n /** Called when the inline textarea loses focus or fullscreen is closed. */\n onBlur?: (value: string) => void;\n rows: number;\n placeholder?: string;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n const closeFullscreen = () => {\n setExpanded(false);\n onBlur?.(value);\n };\n\n return (\n <>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <div className=\"flow-inspector-field-heading\">\n <Label size=\"xs\" className=\"flow-inspector-label\">{label}</Label>\n <Button size=\"xs\" variant=\"ghost\" square onClick={() => setExpanded(true)}>\n <span aria-label=\"全屏编辑\" title=\"全屏编辑\">↗</span>\n </Button>\n </div>\n <textarea\n className=\"flow-inspector-textarea\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n onBlur={() => onBlur?.(value)}\n rows={rows}\n spellCheck={false}\n />\n </div>\n {expanded && (\n <div className=\"flow-editor-fullscreen\" role=\"dialog\" aria-modal=\"true\" aria-label={`${label} 全屏编辑`}>\n <div className=\"flow-editor-fullscreen-header\">\n <strong>{label}</strong>\n <Button size=\"sm\" variant=\"ghost\" onClick={closeFullscreen}>完成</Button>\n </div>\n <textarea\n className=\"flow-inspector-textarea flow-editor-fullscreen-input\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n spellCheck={false}\n autoFocus\n />\n </div>\n )}\n </>\n );\n}\n\nexport default ExpandableTextarea;\n"],"mappings":";;;;AASA,SAAgB,EAAmB,EACjC,OAAA,GACA,OAAA,GACA,UAAA,GACA,QAAA,GACA,MAAA,GACA,aAAA,EAAA,GASC;AACD,QAAM,CAAC,GAAU,CAAA,IAAe,EAAS,EAAK,GAExC,IAAA,MAAwB;AAC5B,IAAA,EAAY,EAAK,GACjB,IAAS,CAAK;AAAA,EAChB;AAEA,SACE,gBAAA,EAAA,GAAA,EAAA,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,cAAf,CACE,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACE,gBAAA,EAAC,GAAD;AAAA,QAAO,MAAK;AAAA,QAAK,WAAU;AAAA,kBAAwB;AAAA,MAAa,CAAA,GAChE,gBAAA,EAAC,GAAD;AAAA,QAAQ,MAAK;AAAA,QAAK,SAAQ;AAAA,QAAQ,QAAA;AAAA,QAAO,SAAA,MAAe,EAAY,EAAI;AAAA,kBACtE,gBAAA,EAAC,QAAD;AAAA,UAAM,cAAW;AAAA,UAAO,OAAM;AAAA,oBAAO;AAAA,QAAO,CAAA;AAAA,MACtC,CAAA,CACL;AAAA,QACL,gBAAA,EAAC,YAAD;AAAA,MACE,WAAU;AAAA,MACH,OAAA;AAAA,MACM,aAAA;AAAA,MACb,UAAA,CAAW,MAAU,EAAS,EAAM,OAAO,KAAK;AAAA,MAChD,QAAA,MAAc,IAAS,CAAK;AAAA,MACtB,MAAA;AAAA,MACN,YAAY;AAAA,IACb,CAAA,CACE;AAAA,MACJ,KACC,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,IAAyB,MAAK;AAAA,IAAS,cAAW;AAAA,IAAO,cAAY,GAAG,CAAA;AAAA,cAAvF,CACE,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACE,gBAAA,EAAC,UAAD,EAAA,UAAS,EAAc,CAAA,GACvB,gBAAA,EAAC,GAAD;AAAA,QAAQ,MAAK;AAAA,QAAK,SAAQ;AAAA,QAAQ,SAAS;AAAA,kBAAiB;AAAA,MAAU,CAAA,CACnE;AAAA,QACL,gBAAA,EAAC,YAAD;AAAA,MACE,WAAU;AAAA,MACH,OAAA;AAAA,MACM,aAAA;AAAA,MACb,UAAA,CAAW,MAAU,EAAS,EAAM,OAAO,KAAK;AAAA,MAChD,YAAY;AAAA,MACZ,WAAA;AAAA,IACD,CAAA,CACE;AAAA,IAEP,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"ExpandableTextarea.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ExpandableTextarea.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\n\n/**\n * Textarea with a \"fullscreen\" expand button. The fullscreen overlay edits the\n * same value; `onBlur`/`onDone` let callers commit expensive parses only when\n * editing finishes instead of on every keystroke.\n */\nexport function ExpandableTextarea({\n label,\n value,\n onChange,\n onBlur,\n rows,\n placeholder,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n /** Called when the inline textarea loses focus or fullscreen is closed. */\n onBlur?: (value: string) => void;\n rows: number;\n placeholder?: string;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n const closeFullscreen = () => {\n setExpanded(false);\n onBlur?.(value);\n };\n\n return (\n <>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <div className=\"flow-inspector-field-heading\">\n <Label size=\"xs\" className=\"flow-inspector-label\">{label}</Label>\n <Button size=\"xs\" variant=\"ghost\" square onClick={() => setExpanded(true)}>\n <span aria-label=\"全屏编辑\" title=\"全屏编辑\">↗</span>\n </Button>\n </div>\n <textarea\n className=\"flow-inspector-textarea\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n onBlur={() => onBlur?.(value)}\n rows={rows}\n spellCheck={false}\n />\n </div>\n {expanded && (\n <div className=\"flow-editor-fullscreen\" role=\"dialog\" aria-modal=\"true\" aria-label={`${label} 全屏编辑`}>\n <div className=\"flow-editor-fullscreen-header\">\n <strong>{label}</strong>\n <Button size=\"sm\" variant=\"ghost\" onClick={closeFullscreen}>完成</Button>\n </div>\n <textarea\n className=\"flow-inspector-textarea flow-editor-fullscreen-input\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n spellCheck={false}\n autoFocus\n />\n </div>\n )}\n </>\n );\n}\n\nexport default ExpandableTextarea;\n"],"mappings":";;;;AASA,SAAgB,EAAmB,EACjC,OAAA,GACA,OAAA,GACA,UAAA,GACA,QAAA,GACA,MAAA,GACA,aAAA,EAAA,GASC;AACD,QAAM,CAAC,GAAU,CAAA,IAAe,EAAS,EAAK,GAExC,IAAA,MAAwB;AAC5B,IAAA,EAAY,EAAK,GACjB,IAAS,CAAK;AAAA,EAChB;AAEA,SACE,gBAAA,EAAA,GAAA,EAAA,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,IAAf,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,MAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,QAAO,MAAK;AAAA,QAAK,WAAU;AAAA,QAAwB,UAAA;AAAA,MAAa,CAAA,GAChE,gBAAA,EAAC,GAAD;AAAA,QAAQ,MAAK;AAAA,QAAK,SAAQ;AAAA,QAAQ,QAAA;AAAA,QAAO,SAAA,MAAe,EAAY,EAAI;AAAA,QACtE,UAAA,gBAAA,EAAC,QAAD;AAAA,UAAM,cAAW;AAAA,UAAO,OAAM;AAAA,UAAO,UAAA;AAAA,QAAO,CAAA;AAAA,MACtC,CAAA,CACL;AAAA,IACL,CAAA,GAAA,gBAAA,EAAC,YAAD;AAAA,MACE,WAAU;AAAA,MACH,OAAA;AAAA,MACM,aAAA;AAAA,MACb,UAAA,CAAW,MAAU,EAAS,EAAM,OAAO,KAAK;AAAA,MAChD,QAAA,MAAc,IAAS,CAAK;AAAA,MACtB,MAAA;AAAA,MACN,YAAY;AAAA,IACb,CAAA,CACE;AAAA,EACJ,CAAA,GAAA,KACC,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,IAAyB,MAAK;AAAA,IAAS,cAAW;AAAA,IAAO,cAAY,GAAG,CAAA;AAAA,IAAvF,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,MAAf,UAAA,CACE,gBAAA,EAAC,UAAD,EAAA,UAAS,EAAc,CAAA,GACvB,gBAAA,EAAC,GAAD;AAAA,QAAQ,MAAK;AAAA,QAAK,SAAQ;AAAA,QAAQ,SAAS;AAAA,QAAiB,UAAA;AAAA,MAAU,CAAA,CACnE;AAAA,IACL,CAAA,GAAA,gBAAA,EAAC,YAAD;AAAA,MACE,WAAU;AAAA,MACH,OAAA;AAAA,MACM,aAAA;AAAA,MACb,UAAA,CAAW,MAAU,EAAS,EAAM,OAAO,KAAK;AAAA,MAChD,YAAY;AAAA,MACZ,WAAA;AAAA,IACD,CAAA,CACE;AAAA,EAEP,CAAA,CAAA,EAAA,CAAA;AAEN"}
@@ -1 +1 @@
1
- {"version":3,"file":"FlowPanelGroup.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/FlowPanelGroup.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport Select from '../../../Select';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel, type ResizeEdge } from '../hooks/useResizablePanel';\nimport type { FlowPanelDock } from '../context/FlowUIContext';\n\nexport interface PanelTab {\n id: string;\n label: string;\n icon?: React.ReactNode;\n content: React.ReactNode;\n}\n\ninterface FlowPanelGroupProps {\n tabs: PanelTab[];\n defaultTab?: string;\n className?: string;\n resizeEdge: ResizeEdge;\n defaultWidth: number;\n style?: React.CSSProperties;\n /** Which dock this group occupies ('float' = draggable overlay). */\n dock?: FlowPanelDock;\n /** Request moving the current tab to another dock (left/right/float). */\n onDock?: (tabId: string, dock: FlowPanelDock) => void;\n /** Floating panels report the dock edge they hover while dragging. */\n onDragHintChange?: (side: 'left' | 'right' | null) => void;\n /** Close (hide) the current panel; it can be reopened via the toolbar. */\n onClose?: (tabId: string) => void;\n}\n\n/** Header buttons offered per current dock, in display order. */\nconst DOCK_ACTIONS: Record<FlowPanelDock, Array<{ target: FlowPanelDock; glyph: string; title: string }>> = {\n left: [\n { target: 'float', glyph: '⬈', title: '浮动面板' },\n { target: 'right', glyph: '⇥', title: '停靠到右侧' },\n ],\n right: [\n { target: 'left', glyph: '⇤', title: '停靠到左侧' },\n { target: 'float', glyph: '⬈', title: '浮动面板' },\n ],\n float: [\n { target: 'left', glyph: '⇤', title: '停靠到左侧' },\n { target: 'right', glyph: '⇥', title: '停靠到右侧' },\n ],\n};\n\nexport default function FlowPanelGroup({\n tabs,\n defaultTab,\n className,\n resizeEdge,\n defaultWidth,\n style,\n dock,\n onDock,\n onDragHintChange,\n onClose,\n}: FlowPanelGroupProps) {\n const [activeTab, setActiveTab] = useState(defaultTab ?? tabs[0]?.id);\n const isFloating = dock === 'float';\n const currentId = tabs.find(t => t.id === activeTab)?.id ?? tabs[0]?.id;\n const { panelStyle, handleProps } = useDraggablePanel(\n isFloating\n ? {\n onDropDock: (side) => { if (currentId) onDock?.(currentId, side); },\n onDragHintChange,\n }\n : undefined,\n );\n const { panelWidth, resizeHandleProps } = useResizablePanel(resizeEdge, defaultWidth);\n\n useEffect(() => {\n if (tabs.length > 0 && !tabs.find(t => t.id === activeTab)) {\n setActiveTab(tabs[0].id);\n }\n }, [tabs, activeTab]);\n\n const handleDock = useCallback((target: FlowPanelDock) => {\n if (currentId) onDock?.(currentId, target);\n }, [currentId, onDock]);\n\n if (tabs.length === 0) return null;\n\n const current = tabs.find(t => t.id === activeTab) ?? tabs[0];\n const showSwitcher = tabs.length > 1;\n const actions = DOCK_ACTIONS[dock ?? 'left'];\n\n return (\n <div\n className={`${className ?? 'flow-palette'}${isFloating ? ' flow-panel--detached' : ' flow-panel--docked'}`}\n data-flow-panel\n style={{ ...style, ...(isFloating ? panelStyle : undefined), width: panelWidth }}\n >\n <div\n className={`flow-panel-resize-handle flow-panel-resize-handle--${resizeEdge}`}\n {...resizeHandleProps}\n />\n <div className=\"flow-panel-header\">\n {isFloating && (\n <span className=\"flow-panel-grip\" title=\"拖动移动面板\" {...handleProps}>⠿</span>\n )}\n {showSwitcher ? (\n <Select\n className=\"flow-panel-select\"\n options={tabs.map(t => ({\n value: t.id,\n label: typeof t.icon === 'string' && t.icon ? `${t.icon} ${t.label}` : t.label,\n }))}\n value={current.id}\n onChange={(v) => setActiveTab(String(v))}\n />\n ) : (\n <span className=\"flow-panel-header-label\">\n {current.icon && <span className=\"flow-panel-tab-icon\">{current.icon}</span>}\n {current.label}\n </span>\n )}\n <span className=\"flow-panel-header-actions\">\n {actions.map(a => (\n <button\n key={a.target}\n type=\"button\"\n className=\"flow-panel-dock-btn\"\n title={a.title}\n onClick={() => handleDock(a.target)}\n >{a.glyph}</button>\n ))}\n {onClose && (\n <button\n type=\"button\"\n className=\"flow-panel-dock-btn flow-panel-close-btn\"\n title=\"关闭面板(可从工具栏重新打开)\"\n onClick={() => { if (currentId) onClose(currentId); }}\n >✕</button>\n )}\n </span>\n </div>\n <div className=\"flow-palette-content\">\n {current.content}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FlowPanelGroup.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/FlowPanelGroup.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport Select from '../../../Select';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel, type ResizeEdge } from '../hooks/useResizablePanel';\nimport type { FlowPanelDock } from '../context/FlowUIContext';\n\nexport interface PanelTab {\n id: string;\n label: string;\n icon?: React.ReactNode;\n content: React.ReactNode;\n}\n\ninterface FlowPanelGroupProps {\n tabs: PanelTab[];\n defaultTab?: string;\n className?: string;\n resizeEdge: ResizeEdge;\n defaultWidth: number;\n style?: React.CSSProperties;\n /** Which dock this group occupies ('float' = draggable overlay). */\n dock?: FlowPanelDock;\n /** Request moving the current tab to another dock (left/right/float). */\n onDock?: (tabId: string, dock: FlowPanelDock) => void;\n /** Floating panels report the dock edge they hover while dragging. */\n onDragHintChange?: (side: 'left' | 'right' | null) => void;\n /** Close (hide) the current panel; it can be reopened via the toolbar. */\n onClose?: (tabId: string) => void;\n}\n\n/** Header buttons offered per current dock, in display order. */\nconst DOCK_ACTIONS: Record<FlowPanelDock, Array<{ target: FlowPanelDock; glyph: string; title: string }>> = {\n left: [\n { target: 'float', glyph: '⬈', title: '浮动面板' },\n { target: 'right', glyph: '⇥', title: '停靠到右侧' },\n ],\n right: [\n { target: 'left', glyph: '⇤', title: '停靠到左侧' },\n { target: 'float', glyph: '⬈', title: '浮动面板' },\n ],\n float: [\n { target: 'left', glyph: '⇤', title: '停靠到左侧' },\n { target: 'right', glyph: '⇥', title: '停靠到右侧' },\n ],\n};\n\nexport default function FlowPanelGroup({\n tabs,\n defaultTab,\n className,\n resizeEdge,\n defaultWidth,\n style,\n dock,\n onDock,\n onDragHintChange,\n onClose,\n}: FlowPanelGroupProps) {\n const [activeTab, setActiveTab] = useState(defaultTab ?? tabs[0]?.id);\n const isFloating = dock === 'float';\n const currentId = tabs.find(t => t.id === activeTab)?.id ?? tabs[0]?.id;\n const { panelStyle, handleProps } = useDraggablePanel(\n isFloating\n ? {\n onDropDock: (side) => { if (currentId) onDock?.(currentId, side); },\n onDragHintChange,\n }\n : undefined,\n );\n const { panelWidth, resizeHandleProps } = useResizablePanel(resizeEdge, defaultWidth);\n\n useEffect(() => {\n if (tabs.length > 0 && !tabs.find(t => t.id === activeTab)) {\n setActiveTab(tabs[0].id);\n }\n }, [tabs, activeTab]);\n\n const handleDock = useCallback((target: FlowPanelDock) => {\n if (currentId) onDock?.(currentId, target);\n }, [currentId, onDock]);\n\n if (tabs.length === 0) return null;\n\n const current = tabs.find(t => t.id === activeTab) ?? tabs[0];\n const showSwitcher = tabs.length > 1;\n const actions = DOCK_ACTIONS[dock ?? 'left'];\n\n return (\n <div\n className={`${className ?? 'flow-palette'}${isFloating ? ' flow-panel--detached' : ' flow-panel--docked'}`}\n data-flow-panel\n style={{ ...style, ...(isFloating ? panelStyle : undefined), width: panelWidth }}\n >\n <div\n className={`flow-panel-resize-handle flow-panel-resize-handle--${resizeEdge}`}\n {...resizeHandleProps}\n />\n <div className=\"flow-panel-header\">\n {isFloating && (\n <span className=\"flow-panel-grip\" title=\"拖动移动面板\" {...handleProps}>⠿</span>\n )}\n {showSwitcher ? (\n <Select\n className=\"flow-panel-select\"\n options={tabs.map(t => ({\n value: t.id,\n label: typeof t.icon === 'string' && t.icon ? `${t.icon} ${t.label}` : t.label,\n }))}\n value={current.id}\n onChange={(v) => setActiveTab(String(v))}\n />\n ) : (\n <span className=\"flow-panel-header-label\">\n {current.icon && <span className=\"flow-panel-tab-icon\">{current.icon}</span>}\n {current.label}\n </span>\n )}\n <span className=\"flow-panel-header-actions\">\n {actions.map(a => (\n <button\n key={a.target}\n type=\"button\"\n className=\"flow-panel-dock-btn\"\n title={a.title}\n onClick={() => handleDock(a.target)}\n >{a.glyph}</button>\n ))}\n {onClose && (\n <button\n type=\"button\"\n className=\"flow-panel-dock-btn flow-panel-close-btn\"\n title=\"关闭面板(可从工具栏重新打开)\"\n onClick={() => { if (currentId) onClose(currentId); }}\n >✕</button>\n )}\n </span>\n </div>\n <div className=\"flow-palette-content\">\n {current.content}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,16 +1,16 @@
1
- import fo from "../../../Button/index.js";
2
- import { useFlowContext as ko } from "../context/FlowContext.js";
3
- import { useFlowUI as H } 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 D, safeFileBaseName as q, 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";
1
+ import ko from "../../../Button/index.js";
2
+ import { useFlowContext as wo } from "../context/FlowContext.js";
3
+ import { useFlowUI as Y } from "../context/FlowUIContext.js";
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 dt() {
13
- const { viewport: r, setViewport: s, autoFocus: a, setAutoFocus: f } = H(), k = Math.round(r.zoom * 100);
12
+ function ht() {
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: [
@@ -22,7 +22,7 @@ function dt() {
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",
@@ -36,7 +36,7 @@ function dt() {
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
41
  /* @__PURE__ */ o(t, {
42
42
  tip: "适应视图",
@@ -47,13 +47,13 @@ function dt() {
47
47
  zoom: 1
48
48
  });
49
49
  },
50
- children: /* @__PURE__ */ o(Mo, {})
50
+ children: /* @__PURE__ */ o(jo, {})
51
51
  }),
52
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
  });
@@ -62,7 +62,7 @@ function t({ tip: r, shortcut: s, onClick: a, active: f, disabled: k, children:
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,32 +80,32 @@ function t({ tip: r, shortcut: s, onClick: a, active: f, disabled: k, children:
80
80
  })]
81
81
  });
82
82
  }
83
- function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup: m, onGeoGroup: h, onUngroup: v, onExportPNG: x, onExportPDF: F, onPublish: z, compact: Y }) {
84
- const { showGrid: R, setShowGrid: _, showPalette: M, setShowPalette: K, showInspector: j, setShowInspector: Q, showOutline: J, setShowOutline: X, showJson: L, setShowJson: oo, showAI: G, setShowAI: to, showMiniMap: P, setShowMiniMap: eo, showAnchors: I, setShowAnchors: io, presentation: Z, setPresentation: no, placementSnap: g, setPlacementSnap: lo } = H(), { doc: w, selection: p, currentCanvas: co, setDoc: U, currentCanvasId: A } = ko(), { exportJSON: E, importJSON: T, exportMarkdown: B } = bo(), { align: u, distribute: V, changeZIndex: b } = yo(), $ = _o(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 = E(), l = new Blob([e], { type: "application/json" }), c = URL.createObjectURL(l);
86
- D(c, `${q(w.title)}.json`), URL.revokeObjectURL(c);
87
- }, [E, w.title]), ao = C(() => {
88
- const e = B(), l = new Blob([e], { type: "text/markdown" }), c = URL.createObjectURL(l);
89
- D(c, `${q(w.title)}.md`), URL.revokeObjectURL(c);
90
- }, [B, w.title]), ho = C(() => {
91
- $.current?.click();
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
+ q(c, `${H(w.title)}.json`), URL.revokeObjectURL(c);
87
+ }, [T, w.title]), ao = C(() => {
88
+ const e = V(), l = new Blob([e], { type: "text/markdown" }), c = URL.createObjectURL(l);
89
+ q(c, `${H(w.title)}.md`), URL.revokeObjectURL(c);
90
+ }, [V, w.title]), ho = C(() => {
91
+ W.current?.click();
92
92
  }, []), po = C(() => {
93
- U((e) => {
93
+ E((e) => {
94
94
  const l = e.canvases[A];
95
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 W = 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: {
107
107
  ...i.data,
108
- strokeColor: i.data.strokeColor && i.data.strokeColor.startsWith("theme:") ? W.color : i.data.strokeColor ?? W.color
108
+ strokeColor: i.data.strokeColor && i.data.strokeColor.startsWith("theme:") ? D.color : i.data.strokeColor ?? D.color
109
109
  }
110
110
  };
111
111
  });
@@ -121,31 +121,31 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
121
121
  }
122
122
  };
123
123
  });
124
- }, [U, A]), mo = C((e) => {
124
+ }, [E, A]), mo = C((e) => {
125
125
  const l = e.target.files?.[0];
126
126
  if (!l) return;
127
127
  const c = new FileReader();
128
128
  c.onload = () => {
129
- typeof c.result == "string" && T(c.result);
129
+ typeof c.result == "string" && B(c.result);
130
130
  }, c.readAsText(l), e.target.value = "";
131
- }, [T]);
131
+ }, [B]);
132
132
  return /* @__PURE__ */ n("div", {
133
- className: `flow-toolbar${Y ? " flow-toolbar--compact" : ""}`,
133
+ className: `flow-toolbar${R ? " flow-toolbar--compact" : ""}`,
134
134
  children: [
135
135
  /* @__PURE__ */ o("input", {
136
- ref: $,
136
+ ref: W,
137
137
  type: "file",
138
138
  accept: ".json",
139
139
  style: { display: "none" },
140
140
  onChange: mo
141
141
  }),
142
- /* @__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
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", {
@@ -155,13 +155,13 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
155
155
  shortcut: "Ctrl+Z",
156
156
  onClick: s,
157
157
  disabled: !f,
158
- children: /* @__PURE__ */ o(Do, {})
158
+ children: /* @__PURE__ */ o(qo, {})
159
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", {
@@ -199,13 +199,13 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
199
199
  }),
200
200
  /* @__PURE__ */ o(t, {
201
201
  tip: "水平平分",
202
- onClick: () => V("horizontal"),
202
+ onClick: () => $("horizontal"),
203
203
  disabled: p.nodeIds.size < 3,
204
204
  children: /* @__PURE__ */ o(d, { kind: "distribute-h" })
205
205
  }),
206
206
  /* @__PURE__ */ o(t, {
207
207
  tip: "垂直平分",
208
- onClick: () => V("vertical"),
208
+ onClick: () => $("vertical"),
209
209
  disabled: p.nodeIds.size < 3,
210
210
  children: /* @__PURE__ */ o(d, { kind: "distribute-v" })
211
211
  })
@@ -244,21 +244,21 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
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
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
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
  })] }),
@@ -268,21 +268,21 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
268
268
  children: [
269
269
  /* @__PURE__ */ o(t, {
270
270
  tip: "网格",
271
- active: R,
272
- onClick: () => _(!R),
273
- children: /* @__PURE__ */ o(Jo, {})
271
+ active: M,
272
+ onClick: () => _(!M),
273
+ children: /* @__PURE__ */ o(Lo, {})
274
274
  }),
275
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
281
  /* @__PURE__ */ o(t, {
282
282
  tip: "缩略图",
283
- active: P,
284
- onClick: () => eo(!P),
285
- children: /* @__PURE__ */ o(Eo, {})
283
+ active: Z,
284
+ onClick: () => eo(!Z),
285
+ children: /* @__PURE__ */ o(To, {})
286
286
  }),
287
287
  /* @__PURE__ */ o(t, {
288
288
  tip: I ? "隐藏所有 Anchor 对象" : "显示所有 Anchor 对象",
@@ -291,21 +291,21 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
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
296
  /* @__PURE__ */ o(t, {
297
297
  tip: "动画预览",
298
- active: Z !== null,
299
- onClick: () => no(Z ? null : {
298
+ active: U !== null,
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
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
  }),
@@ -315,33 +315,33 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
315
315
  children: [
316
316
  /* @__PURE__ */ o(t, {
317
317
  tip: "形状面板",
318
- active: M,
319
- onClick: () => K(!M),
320
- children: /* @__PURE__ */ o(Wo, {})
318
+ active: j,
319
+ onClick: () => K(!j),
320
+ children: /* @__PURE__ */ o(Do, {})
321
321
  }),
322
322
  /* @__PURE__ */ o(t, {
323
323
  tip: "属性面板",
324
- active: j,
325
- onClick: () => Q(!j),
326
- children: /* @__PURE__ */ o(Po, {})
324
+ active: J,
325
+ onClick: () => Q(!J),
326
+ children: /* @__PURE__ */ o(Zo, {})
327
327
  }),
328
328
  /* @__PURE__ */ o(t, {
329
329
  tip: "大纲",
330
- active: J,
331
- onClick: () => X(!J),
332
- children: /* @__PURE__ */ o(To, {})
330
+ active: L,
331
+ onClick: () => X(!L),
332
+ children: /* @__PURE__ */ o(Bo, {})
333
333
  }),
334
334
  /* @__PURE__ */ o(t, {
335
335
  tip: "JSON",
336
- active: L,
337
- onClick: () => oo(!L),
338
- children: /* @__PURE__ */ o(Zo, {})
336
+ active: G,
337
+ onClick: () => oo(!G),
338
+ children: /* @__PURE__ */ o(Uo, {})
339
339
  }),
340
340
  /* @__PURE__ */ o(t, {
341
341
  tip: "AI 助手",
342
- active: G,
343
- onClick: () => to(!G),
344
- children: /* @__PURE__ */ o(No, {})
342
+ active: P,
343
+ onClick: () => to(!P),
344
+ children: /* @__PURE__ */ o(go, {})
345
345
  })
346
346
  ]
347
347
  }),
@@ -352,36 +352,36 @@ function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
352
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
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
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
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
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
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 ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
389
389
  });
390
390
  }
391
391
  export {
392
- dt as FlowZoomControls,
393
- ht as default
392
+ ht as FlowZoomControls,
393
+ pt as default
394
394
  };
395
395
 
396
396
  //# sourceMappingURL=FlowToolbar.js.map