@lokvis/ui-react 0.1.1-beta.0 → 0.2.1
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/LICENSE +21 -0
- package/dist/components/AssetPanel.d.ts +2 -2
- package/dist/components/AssetPanel.d.ts.map +1 -1
- package/dist/components/AssetPanel.js +79 -7
- package/dist/components/AssetPanel.js.map +1 -1
- package/dist/components/Canvas.d.ts +9 -1
- package/dist/components/Canvas.d.ts.map +1 -1
- package/dist/components/Canvas.js +39 -2
- package/dist/components/Canvas.js.map +1 -1
- package/dist/components/CommandPalette.d.ts +48 -0
- package/dist/components/CommandPalette.d.ts.map +1 -0
- package/dist/components/CommandPalette.js +154 -0
- package/dist/components/CommandPalette.js.map +1 -0
- package/dist/components/CompareSlider.d.ts +25 -0
- package/dist/components/CompareSlider.d.ts.map +1 -0
- package/dist/components/CompareSlider.js +106 -0
- package/dist/components/CompareSlider.js.map +1 -0
- package/dist/components/DownloadPanel.d.ts +20 -0
- package/dist/components/DownloadPanel.d.ts.map +1 -0
- package/dist/components/DownloadPanel.js +169 -0
- package/dist/components/DownloadPanel.js.map +1 -0
- package/dist/components/ErrorBanner.d.ts +22 -0
- package/dist/components/ErrorBanner.d.ts.map +1 -0
- package/dist/components/ErrorBanner.js +47 -0
- package/dist/components/ErrorBanner.js.map +1 -0
- package/dist/components/ExifPanel.d.ts +26 -0
- package/dist/components/ExifPanel.d.ts.map +1 -0
- package/dist/components/ExifPanel.js +104 -0
- package/dist/components/ExifPanel.js.map +1 -0
- package/dist/components/GlobalDropzone.d.ts +37 -0
- package/dist/components/GlobalDropzone.d.ts.map +1 -0
- package/dist/components/GlobalDropzone.js +154 -0
- package/dist/components/GlobalDropzone.js.map +1 -0
- package/dist/components/HistoryPanel.d.ts +17 -7
- package/dist/components/HistoryPanel.d.ts.map +1 -1
- package/dist/components/HistoryPanel.js +74 -62
- package/dist/components/HistoryPanel.js.map +1 -1
- package/dist/components/Inspector.d.ts.map +1 -1
- package/dist/components/Inspector.js +2 -1
- package/dist/components/Inspector.js.map +1 -1
- package/dist/components/ProgressBar.d.ts +18 -0
- package/dist/components/ProgressBar.d.ts.map +1 -0
- package/dist/components/ProgressBar.js +35 -0
- package/dist/components/ProgressBar.js.map +1 -0
- package/dist/components/StatusBar.d.ts +8 -2
- package/dist/components/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar.js +59 -4
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/components/ThemeToggle.d.ts +20 -0
- package/dist/components/ThemeToggle.d.ts.map +1 -0
- package/dist/components/ThemeToggle.js +60 -0
- package/dist/components/ThemeToggle.js.map +1 -0
- package/dist/components/WorkflowEditor.d.ts +24 -0
- package/dist/components/WorkflowEditor.d.ts.map +1 -0
- package/dist/components/WorkflowEditor.js +160 -0
- package/dist/components/WorkflowEditor.js.map +1 -0
- package/dist/components/WorkflowTemplates.d.ts +23 -0
- package/dist/components/WorkflowTemplates.d.ts.map +1 -0
- package/dist/components/WorkflowTemplates.js +32 -0
- package/dist/components/WorkflowTemplates.js.map +1 -0
- package/dist/components/Workspace.d.ts +48 -2
- package/dist/components/Workspace.d.ts.map +1 -1
- package/dist/components/Workspace.js +78 -4
- package/dist/components/Workspace.js.map +1 -1
- package/dist/data/workflow-templates.d.ts +42 -0
- package/dist/data/workflow-templates.d.ts.map +1 -0
- package/dist/data/workflow-templates.js +112 -0
- package/dist/data/workflow-templates.js.map +1 -0
- package/dist/hooks/useDebouncedRun.d.ts +49 -0
- package/dist/hooks/useDebouncedRun.d.ts.map +1 -0
- package/dist/hooks/useDebouncedRun.js +117 -0
- package/dist/hooks/useDebouncedRun.js.map +1 -0
- package/dist/hooks/useLokvis.js +1 -1
- package/dist/hooks/useMediaQuery.d.ts +27 -0
- package/dist/hooks/useMediaQuery.d.ts.map +1 -0
- package/dist/hooks/useMediaQuery.js +41 -0
- package/dist/hooks/useMediaQuery.js.map +1 -0
- package/dist/hooks/useShareLink.d.ts +58 -0
- package/dist/hooks/useShareLink.d.ts.map +1 -0
- package/dist/hooks/useShareLink.js +120 -0
- package/dist/hooks/useShareLink.js.map +1 -0
- package/dist/hooks/useTheme.d.ts +30 -0
- package/dist/hooks/useTheme.d.ts.map +1 -0
- package/dist/hooks/useTheme.js +105 -0
- package/dist/hooks/useTheme.js.map +1 -0
- package/dist/hooks/useWorkflowProgress.d.ts +28 -0
- package/dist/hooks/useWorkflowProgress.d.ts.map +1 -0
- package/dist/hooks/useWorkflowProgress.js +25 -0
- package/dist/hooks/useWorkflowProgress.js.map +1 -0
- package/dist/hooks/useWorkflows.d.ts +86 -0
- package/dist/hooks/useWorkflows.d.ts.map +1 -0
- package/dist/hooks/useWorkflows.js +247 -0
- package/dist/hooks/useWorkflows.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -1
- package/dist/store/assets-slice.d.ts.map +1 -1
- package/dist/store/assets-slice.js +2 -0
- package/dist/store/assets-slice.js.map +1 -1
- package/dist/store/history-slice.d.ts +18 -0
- package/dist/store/history-slice.d.ts.map +1 -0
- package/dist/store/history-slice.js +42 -0
- package/dist/store/history-slice.js.map +1 -0
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +3 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/runtime-slice.d.ts +10 -2
- package/dist/store/runtime-slice.d.ts.map +1 -1
- package/dist/store/runtime-slice.js +77 -28
- package/dist/store/runtime-slice.js.map +1 -1
- package/dist/store/types.d.ts +70 -1
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/types.js +10 -0
- package/dist/store/types.js.map +1 -1
- package/dist/store/workflow-slice.d.ts +1 -1
- package/dist/store/workflow-slice.d.ts.map +1 -1
- package/dist/store/workflow-slice.js +128 -9
- package/dist/store/workflow-slice.js.map +1 -1
- package/package.json +9 -6
- package/src/components/AssetPanel.tsx +149 -8
- package/src/components/Canvas.tsx +79 -2
- package/src/components/CommandPalette.tsx +300 -0
- package/src/components/CompareSlider.tsx +186 -0
- package/src/components/DownloadPanel.tsx +252 -0
- package/src/components/ErrorBanner.tsx +95 -0
- package/src/components/ExifPanel.tsx +187 -0
- package/src/components/GlobalDropzone.tsx +220 -0
- package/src/components/HistoryPanel.tsx +231 -104
- package/src/components/Inspector.tsx +4 -0
- package/src/components/ProgressBar.tsx +104 -0
- package/src/components/StatusBar.tsx +124 -5
- package/src/components/ThemeToggle.tsx +122 -0
- package/src/components/WorkflowEditor.tsx +382 -0
- package/src/components/WorkflowTemplates.tsx +101 -0
- package/src/components/Workspace.tsx +205 -8
- package/src/data/workflow-templates.ts +137 -0
- package/src/hooks/useDebouncedRun.ts +151 -0
- package/src/hooks/useLokvis.ts +1 -1
- package/src/hooks/useMediaQuery.ts +53 -0
- package/src/hooks/useShareLink.ts +158 -0
- package/src/hooks/useTheme.ts +116 -0
- package/src/hooks/useWorkflowProgress.ts +41 -0
- package/src/hooks/useWorkflows.ts +326 -0
- package/src/index.ts +32 -0
- package/src/store/assets-slice.ts +2 -0
- package/src/store/history-slice.ts +65 -0
- package/src/store/index.ts +3 -0
- package/src/store/runtime-slice.ts +89 -32
- package/src/store/types.ts +71 -1
- package/src/store/workflow-slice.ts +139 -10
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* GlobalDropzone - 全屏拖拽导入区 + MIME 类型校验(W9.3)
|
|
4
|
+
*
|
|
5
|
+
* 当用户拖拽文件进入窗口时,显示全屏遮罩引导用户拖到任意位置即可导入。
|
|
6
|
+
* 通过 `accept` 白名单做 MIME 类型校验,拒绝类型时给出视觉反馈 + 警告。
|
|
7
|
+
*
|
|
8
|
+
* 工作机制:
|
|
9
|
+
* 1. 监听 window dragenter / dragover / dragleave / drop 事件
|
|
10
|
+
* 2. dragenter 显示遮罩,dragleave(离开 window)隐藏
|
|
11
|
+
* 3. drop 时校验文件类型 → 合法则 importFiles,非法则提示拒绝原因
|
|
12
|
+
*
|
|
13
|
+
* MIME 校验:
|
|
14
|
+
* - 默认接受所有 image/* 类型(以及 video/audio/pdf 等,与 workspace 多媒体定位对齐)
|
|
15
|
+
* - 拒绝类型在遮罩中央显示红色提示,并阻止导入
|
|
16
|
+
*
|
|
17
|
+
* 与 AssetPanel / Canvas 内置的局部 dropzone 互不冲突:它们各自处理自己的
|
|
18
|
+
* drop 事件并 `stopPropagation()`,本组件的 window drop 监听不会触发。
|
|
19
|
+
*
|
|
20
|
+
* 防御性兜底:即便子组件忘了 `stopPropagation`,本组件也会再次处理 drop 事件,
|
|
21
|
+
* 但通过 `importFiles` 的幂等性(以 File 引用去重)— 不,File 引用并不去重,
|
|
22
|
+
* 所以子组件**必须** `stopPropagation()`。本组件在 drop 事件触发时,先检查
|
|
23
|
+
* `e.defaultPrevented`(子组件会 `preventDefault()` 表明已处理),若已处理
|
|
24
|
+
* 则直接 return,避免双重导入。
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* <GlobalDropzone accept="image/*" />
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
import * as React from 'react';
|
|
32
|
+
import { Icon } from '@lokvis/ui-core';
|
|
33
|
+
import { useWorkspaceStore } from '../store/index.js';
|
|
34
|
+
/** 默认接受的类型:与 Workspace 多媒体定位对齐 */
|
|
35
|
+
const DEFAULT_ACCEPT = 'image/*,video/*,audio/*,application/pdf';
|
|
36
|
+
/** 检查单个文件是否符合 accept 白名单 */
|
|
37
|
+
function isFileAccepted(file, accept) {
|
|
38
|
+
if (!accept)
|
|
39
|
+
return true;
|
|
40
|
+
const patterns = accept.split(',').map((p) => p.trim().toLowerCase()).filter(Boolean);
|
|
41
|
+
if (patterns.length === 0)
|
|
42
|
+
return true;
|
|
43
|
+
const mime = file.type.toLowerCase();
|
|
44
|
+
const name = file.name.toLowerCase();
|
|
45
|
+
return patterns.some((p) => {
|
|
46
|
+
// image/* → image/(prefix match)
|
|
47
|
+
if (p.endsWith('/*')) {
|
|
48
|
+
return mime.startsWith(p.slice(0, -1));
|
|
49
|
+
}
|
|
50
|
+
// image/jpeg → exact mime match
|
|
51
|
+
if (p.includes('/')) {
|
|
52
|
+
return mime === p;
|
|
53
|
+
}
|
|
54
|
+
// .png → extension match
|
|
55
|
+
if (p.startsWith('.')) {
|
|
56
|
+
return name.endsWith(p);
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
export function GlobalDropzone({ accept = DEFAULT_ACCEPT, className = '', }) {
|
|
62
|
+
const importFiles = useWorkspaceStore((s) => s.importFiles);
|
|
63
|
+
const setStatus = useWorkspaceStore((s) => s.setStatus);
|
|
64
|
+
const setError = useWorkspaceStore((s) => s.setError);
|
|
65
|
+
// dragCounter:用计数器而非布尔,避免子元素 dragenter/dragleave 触发抖动
|
|
66
|
+
const [dragCounter, setDragCounter] = React.useState(0);
|
|
67
|
+
const [rejectedFiles, setRejectedFiles] = React.useState([]);
|
|
68
|
+
React.useEffect(() => {
|
|
69
|
+
// 阻止浏览器默认行为(打开文件 / 下载),否则 drop 不会触发
|
|
70
|
+
const preventDefault = (e) => {
|
|
71
|
+
e.preventDefault();
|
|
72
|
+
e.stopPropagation();
|
|
73
|
+
};
|
|
74
|
+
// dragenter:进入窗口,计数 +1
|
|
75
|
+
const onDragEnter = (e) => {
|
|
76
|
+
preventDefault(e);
|
|
77
|
+
if (e.dataTransfer?.types?.includes('Files')) {
|
|
78
|
+
setDragCounter((c) => c + 1);
|
|
79
|
+
setRejectedFiles([]);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
// dragover:必须 preventDefault 才能触发 drop
|
|
83
|
+
const onDragOver = (e) => {
|
|
84
|
+
preventDefault(e);
|
|
85
|
+
if (e.dataTransfer) {
|
|
86
|
+
// 显示 drop 效果
|
|
87
|
+
e.dataTransfer.dropEffect = 'copy';
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
// dragleave:离开窗口,计数 -1
|
|
91
|
+
const onDragLeave = (e) => {
|
|
92
|
+
preventDefault(e);
|
|
93
|
+
// 只在离开 window 时(relatedTarget 为 null 或 document.documentElement)减计数
|
|
94
|
+
// relatedTarget 为 null 表示离开文档边界
|
|
95
|
+
if (e.relatedTarget === null) {
|
|
96
|
+
setDragCounter(0);
|
|
97
|
+
setRejectedFiles([]);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
// drop:校验 + 导入
|
|
101
|
+
const onDrop = (e) => {
|
|
102
|
+
// 兜底:子组件(Canvas / AssetPanel)若已处理 drop 并 preventDefault(),
|
|
103
|
+
// 表明文件已导入,本组件跳过避免双重导入。子组件仍需 stopPropagation()
|
|
104
|
+
// 防止事件冒泡到 window,这里 defaultPrevented 是双保险。
|
|
105
|
+
if (e.defaultPrevented) {
|
|
106
|
+
setDragCounter(0);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
preventDefault(e);
|
|
110
|
+
setDragCounter(0);
|
|
111
|
+
const files = e.dataTransfer?.files ? Array.from(e.dataTransfer.files) : [];
|
|
112
|
+
if (files.length === 0)
|
|
113
|
+
return;
|
|
114
|
+
const accepted = [];
|
|
115
|
+
const rejected = [];
|
|
116
|
+
for (const file of files) {
|
|
117
|
+
if (isFileAccepted(file, accept)) {
|
|
118
|
+
accepted.push(file);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
rejected.push(`${file.name} (${file.type || 'unknown'})`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (rejected.length > 0) {
|
|
125
|
+
setRejectedFiles(rejected);
|
|
126
|
+
// 5 秒后自动清空拒绝提示
|
|
127
|
+
setTimeout(() => setRejectedFiles([]), 5000);
|
|
128
|
+
}
|
|
129
|
+
if (accepted.length > 0) {
|
|
130
|
+
void importFiles(accepted);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
setStatus(`Rejected ${rejected.length} file(s) — unsupported type`);
|
|
134
|
+
setError(null);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
window.addEventListener('dragenter', onDragEnter);
|
|
138
|
+
window.addEventListener('dragover', onDragOver);
|
|
139
|
+
window.addEventListener('dragleave', onDragLeave);
|
|
140
|
+
window.addEventListener('drop', onDrop);
|
|
141
|
+
return () => {
|
|
142
|
+
window.removeEventListener('dragenter', onDragEnter);
|
|
143
|
+
window.removeEventListener('dragover', onDragOver);
|
|
144
|
+
window.removeEventListener('dragleave', onDragLeave);
|
|
145
|
+
window.removeEventListener('drop', onDrop);
|
|
146
|
+
};
|
|
147
|
+
}, [accept, importFiles, setStatus, setError]);
|
|
148
|
+
const isDragging = dragCounter > 0;
|
|
149
|
+
const hasRejections = rejectedFiles.length > 0;
|
|
150
|
+
if (!isDragging && !hasRejections)
|
|
151
|
+
return null;
|
|
152
|
+
return (_jsxs("div", { className: `pointer-events-none fixed inset-0 z-40 flex items-center justify-center p-8 ${className}`, role: "alertdialog", "aria-live": "polite", children: [_jsx("div", { className: "absolute inset-0 bg-indigo-50/80 backdrop-blur-sm dark:bg-indigo-950/60" }), _jsx("div", { className: `relative w-full max-w-md rounded-2xl border-2 border-dashed p-8 text-center bg-white shadow-2xl dark:bg-zinc-900 ${hasRejections ? 'border-red-400 dark:border-red-600' : 'border-indigo-500 dark:border-indigo-400'}`, children: hasRejections ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/40", children: _jsxs(Icon, { size: 24, className: "text-red-500", strokeWidth: 2, children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "15", y1: "9", x2: "9", y2: "15" }), _jsx("line", { x1: "9", y1: "9", x2: "15", y2: "15" })] }) }), _jsx("p", { className: "mt-3 text-sm font-semibold text-red-700 dark:text-red-400", children: "Unsupported file type" }), _jsx("p", { className: "mt-1.5 text-xs text-red-600/80 dark:text-red-400/70", children: rejectedFiles.join(', ') }), _jsxs("p", { className: "mt-2 text-[10px] text-zinc-500", children: ["Accepted: ", accept || 'all files'] })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-indigo-100 dark:bg-indigo-900/40", children: _jsx(Icon, { size: 24, className: "text-indigo-500", strokeWidth: 1.5, children: _jsx("path", { d: "M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5m-13.5-9L12 3m0 0 4.5 4.5M12 3v13.5" }) }) }), _jsx("p", { className: "mt-3 text-sm font-semibold text-indigo-700 dark:text-indigo-300", children: "Drop files to import" }), _jsx("p", { className: "mt-1 text-xs text-zinc-500 dark:text-zinc-400", children: "Files are processed locally in your browser" }), _jsxs("p", { className: "mt-2 text-[10px] text-zinc-400", children: ["Accepted: ", accept || 'all files'] })] })) })] }));
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=GlobalDropzone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlobalDropzone.js","sourceRoot":"","sources":["../../src/components/GlobalDropzone.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HistoryPanel -
|
|
2
|
+
* HistoryPanel - 历史栈面板(W7.1 / W9.1)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 展示当前工作流的执行历史,支持:
|
|
5
|
+
* - Undo / Redo 按钮(根据 cursor 禁用)
|
|
6
|
+
* - 点击条目直接跳转(jumpTo)
|
|
7
|
+
* - cursor 当前位置高亮,cursor 之后的条目标灰(redo 分支)
|
|
8
|
+
*
|
|
9
|
+
* W9.1: 支持 `variant` 切换布局方向
|
|
10
|
+
* - `vertical`(默认):侧栏垂直布局,适合嵌入左/右栏
|
|
11
|
+
* - `horizontal`:底部横条布局,作为底部 history bar 使用
|
|
12
|
+
*
|
|
13
|
+
* 数据来自 history-slice(store 单一来源),由 runtime-slice 的
|
|
14
|
+
* history:changed 订阅自动更新,组件无需自行订阅事件。
|
|
15
|
+
*
|
|
16
|
+
* 历史条目渲染:把 HistoryEntry 的 capability + params 摘要为可读标签。
|
|
6
17
|
*/
|
|
7
|
-
import * as React from 'react';
|
|
8
18
|
export interface HistoryPanelProps {
|
|
9
19
|
className?: string;
|
|
10
|
-
/**
|
|
11
|
-
|
|
20
|
+
/** 布局方向(W9.1):vertical 侧栏,horizontal 底部横条 */
|
|
21
|
+
variant?: 'vertical' | 'horizontal';
|
|
12
22
|
}
|
|
13
|
-
export declare function HistoryPanel({ className,
|
|
23
|
+
export declare function HistoryPanel({ className, variant }: HistoryPanelProps): import("react").JSX.Element;
|
|
14
24
|
//# sourceMappingURL=HistoryPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryPanel.d.ts","sourceRoot":"","sources":["../../src/components/HistoryPanel.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"HistoryPanel.d.ts","sourceRoot":"","sources":["../../src/components/HistoryPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;CACrC;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAc,EAAE,OAAoB,EAAE,EAAE,iBAAiB,+BA0MvF"}
|
|
@@ -1,68 +1,80 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
|
|
3
|
-
* HistoryPanel - 处理历史面板
|
|
4
|
-
*
|
|
5
|
-
* 监听 Runtime 事件,记录最近处理过的资产与工作流执行。
|
|
6
|
-
* MVP 仅做只读展示,撤销/重做通过 Runtime API(已留接口)。
|
|
7
|
-
*/
|
|
8
|
-
import * as React from 'react';
|
|
2
|
+
import { Icon } from '@lokvis/ui-core';
|
|
9
3
|
import { useWorkspaceStore } from '../store/index.js';
|
|
10
|
-
export function HistoryPanel({ className = '',
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
4
|
+
export function HistoryPanel({ className = '', variant = 'vertical' }) {
|
|
5
|
+
const entries = useWorkspaceStore((s) => s.historyEntries);
|
|
6
|
+
const cursor = useWorkspaceStore((s) => s.historyCursor);
|
|
7
|
+
const workflowId = useWorkspaceStore((s) => s.historyWorkflowId);
|
|
8
|
+
const undo = useWorkspaceStore((s) => s.undo);
|
|
9
|
+
const redo = useWorkspaceStore((s) => s.redo);
|
|
10
|
+
const jumpTo = useWorkspaceStore((s) => s.jumpToHistory);
|
|
11
|
+
const canUndo = cursor >= 0;
|
|
12
|
+
const canRedo = cursor < entries.length - 1;
|
|
13
|
+
const horizontal = variant === 'horizontal';
|
|
14
|
+
const undoBtn = (_jsx("button", { type: "button", onClick: () => void undo(), disabled: !canUndo, "aria-label": "Undo", className: "rounded p-1 text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-700 disabled:cursor-not-allowed disabled:opacity-30 dark:hover:bg-zinc-800 dark:hover:text-zinc-300", children: _jsxs(Icon, { size: 13, children: [_jsx("path", { d: "M9 14L4 9l5-5" }), _jsx("path", { d: "M4 9h11a4 4 0 0 1 0 8h-3" })] }) }));
|
|
15
|
+
const redoBtn = (_jsx("button", { type: "button", onClick: () => void redo(), disabled: !canRedo, "aria-label": "Redo", className: "rounded p-1 text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-700 disabled:cursor-not-allowed disabled:opacity-30 dark:hover:bg-zinc-800 dark:hover:text-zinc-300", children: _jsxs(Icon, { size: 13, children: [_jsx("path", { d: "M15 14l5-5-5-5" }), _jsx("path", { d: "M20 9H9a4 4 0 0 0 0 8h3" })] }) }));
|
|
16
|
+
const headerEl = (_jsxs("div", { className: `flex shrink-0 items-center justify-between px-3 ${horizontal ? 'h-full border-r border-zinc-200 dark:border-zinc-800' : 'h-10 border-b border-zinc-200 dark:border-zinc-800'}`, children: [_jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-zinc-400", children: "History" }), _jsxs("div", { className: "flex items-center gap-0.5", children: [undoBtn, redoBtn] })] }));
|
|
17
|
+
// 空状态
|
|
18
|
+
if (!workflowId || entries.length === 0) {
|
|
19
|
+
return (_jsxs("aside", { className: `flex shrink-0 ${horizontal
|
|
20
|
+
? 'h-12 flex-row items-center border-t border-zinc-200 dark:border-zinc-800'
|
|
21
|
+
: 'w-48 flex-col border-r border-zinc-200 dark:border-zinc-800'} ${className}`, "aria-label": "History panel", children: [headerEl, _jsx("p", { className: "px-3 text-[10px] text-zinc-400", children: "No history yet" })] }));
|
|
22
|
+
}
|
|
23
|
+
if (horizontal) {
|
|
24
|
+
// 横向布局:header | entries(横向滚动)
|
|
25
|
+
return (_jsxs("aside", { className: `flex h-12 shrink-0 items-stretch border-t border-zinc-200 dark:border-zinc-800 ${className}`, "aria-label": "History panel", children: [headerEl, _jsxs("ol", { className: "flex flex-1 items-center gap-1 overflow-x-auto px-2", children: [_jsx("li", { className: "shrink-0", children: _jsxs("button", { type: "button", onClick: () => void jumpTo(-1), className: `flex items-center gap-1.5 rounded px-2 py-1 text-[10px] transition-colors ${cursor === -1
|
|
26
|
+
? 'bg-indigo-50 text-indigo-700 ring-1 ring-indigo-200 dark:bg-indigo-950/30 dark:text-indigo-300 dark:ring-indigo-800'
|
|
27
|
+
: 'text-zinc-500 hover:bg-zinc-50 dark:hover:bg-zinc-800'}`, children: [_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-zinc-300 dark:bg-zinc-600", "aria-hidden": "true" }), _jsx("span", { className: "truncate", children: "Initial" })] }) }), entries.map((entry, i) => {
|
|
28
|
+
const isCurrent = i === cursor;
|
|
29
|
+
const isRedoBranch = i > cursor;
|
|
30
|
+
return (_jsx("li", { className: "shrink-0", children: _jsxs("button", { type: "button", onClick: () => void jumpTo(i), "aria-current": isCurrent ? 'step' : undefined, className: `flex items-center gap-1.5 rounded px-2 py-1 text-[10px] transition-colors ${isCurrent
|
|
31
|
+
? 'bg-indigo-50 text-indigo-700 ring-1 ring-indigo-200 dark:bg-indigo-950/30 dark:text-indigo-300 dark:ring-indigo-800'
|
|
32
|
+
: isRedoBranch
|
|
33
|
+
? 'text-zinc-300 hover:bg-zinc-50 dark:text-zinc-600 dark:hover:bg-zinc-800/50'
|
|
34
|
+
: 'text-zinc-600 hover:bg-zinc-50 dark:text-zinc-300 dark:hover:bg-zinc-800'}`, children: [_jsx("span", { className: `h-1.5 w-1.5 shrink-0 rounded-full ${isCurrent
|
|
35
|
+
? 'bg-indigo-500'
|
|
36
|
+
: isRedoBranch
|
|
37
|
+
? 'bg-zinc-200 dark:bg-zinc-700'
|
|
38
|
+
: 'bg-zinc-400 dark:bg-zinc-500'}`, "aria-hidden": "true" }), _jsx("span", { className: "truncate font-medium", children: describeHistoryEntry(entry) })] }) }, entry.id));
|
|
39
|
+
})] })] }));
|
|
40
|
+
}
|
|
41
|
+
// 垂直布局(原实现)
|
|
42
|
+
return (_jsxs("aside", { className: `flex w-48 shrink-0 flex-col border-r border-zinc-200 dark:border-zinc-800 ${className}`, "aria-label": "History panel", children: [headerEl, _jsx("div", { className: "flex-1 overflow-y-auto px-2 py-2", children: _jsxs("ol", { className: "space-y-0.5", children: [_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => void jumpTo(-1), className: `flex w-full items-center gap-1.5 rounded px-2 py-1 text-left text-[10px] transition-colors ${cursor === -1
|
|
43
|
+
? 'bg-indigo-50 text-indigo-700 ring-1 ring-indigo-200 dark:bg-indigo-950/30 dark:text-indigo-300 dark:ring-indigo-800'
|
|
44
|
+
: 'text-zinc-500 hover:bg-zinc-50 dark:hover:bg-zinc-800'}`, children: [_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-zinc-300 dark:bg-zinc-600", "aria-hidden": "true" }), _jsx("span", { className: "truncate", children: "Initial" })] }) }), entries.map((entry, i) => {
|
|
45
|
+
const isCurrent = i === cursor;
|
|
46
|
+
const isRedoBranch = i > cursor;
|
|
47
|
+
return (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => void jumpTo(i), "aria-current": isCurrent ? 'step' : undefined, className: `flex w-full items-start gap-1.5 rounded px-2 py-1 text-left text-[10px] transition-colors ${isCurrent
|
|
48
|
+
? 'bg-indigo-50 text-indigo-700 ring-1 ring-indigo-200 dark:bg-indigo-950/30 dark:text-indigo-300 dark:ring-indigo-800'
|
|
49
|
+
: isRedoBranch
|
|
50
|
+
? 'text-zinc-300 hover:bg-zinc-50 dark:text-zinc-600 dark:hover:bg-zinc-800/50'
|
|
51
|
+
: 'text-zinc-600 hover:bg-zinc-50 dark:text-zinc-300 dark:hover:bg-zinc-800'}`, children: [_jsx("span", { className: `mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full ${isCurrent
|
|
52
|
+
? 'bg-indigo-500'
|
|
53
|
+
: isRedoBranch
|
|
54
|
+
? 'bg-zinc-200 dark:bg-zinc-700'
|
|
55
|
+
: 'bg-zinc-400 dark:bg-zinc-500'}`, "aria-hidden": "true" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate font-medium", children: describeHistoryEntry(entry) }), _jsx("div", { className: "text-[9px] text-zinc-400", children: new Date(entry.timestamp).toLocaleTimeString() })] })] }) }, entry.id));
|
|
56
|
+
})] }) })] }));
|
|
33
57
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return `Node finished: ${e.nodeId.slice(0, 8)} (${e.duration}ms)`;
|
|
54
|
-
case 'node:failed':
|
|
55
|
-
return `Node failed: ${e.error.message}`;
|
|
56
|
-
case 'plugin:loaded':
|
|
57
|
-
return `Plugin loaded: ${e.name}@${e.version}`;
|
|
58
|
-
case 'export:completed':
|
|
59
|
-
return `Exported ${e.format} (${(e.size / 1024).toFixed(1)} KB)`;
|
|
60
|
-
case 'capability:registered':
|
|
61
|
-
return `Capability registered: ${e.capability} (${e.engine})`;
|
|
62
|
-
case 'history:changed':
|
|
63
|
-
return `History changed (${e.entries.length} entries)`;
|
|
64
|
-
default:
|
|
65
|
-
return e.type;
|
|
58
|
+
/** 把 HistoryEntry 摘要为可读标签(capability 简称 + 关键参数) */
|
|
59
|
+
function describeHistoryEntry(entry) {
|
|
60
|
+
// image.resize → Resize;image.watermark → Watermark
|
|
61
|
+
const short = entry.capability.replace(/^image\./, '');
|
|
62
|
+
const cap = short.charAt(0).toUpperCase() + short.slice(1);
|
|
63
|
+
const params = entry.params ?? {};
|
|
64
|
+
// 摘取 1-2 个关键参数作为提示
|
|
65
|
+
const hints = [];
|
|
66
|
+
if (typeof params.width === 'number' || typeof params.width === 'string') {
|
|
67
|
+
hints.push(`${params.width}w`);
|
|
68
|
+
}
|
|
69
|
+
if (typeof params.quality === 'number') {
|
|
70
|
+
hints.push(`q${params.quality}`);
|
|
71
|
+
}
|
|
72
|
+
if (typeof params.format === 'string') {
|
|
73
|
+
hints.push(String(params.format));
|
|
74
|
+
}
|
|
75
|
+
if (typeof params.text === 'string' && params.text) {
|
|
76
|
+
hints.push(`"${String(params.text).slice(0, 8)}"`);
|
|
66
77
|
}
|
|
78
|
+
return hints.length > 0 ? `${cap} (${hints.join(' ')})` : cap;
|
|
67
79
|
}
|
|
68
80
|
//# sourceMappingURL=HistoryPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryPanel.js","sourceRoot":"","sources":["../../src/components/HistoryPanel.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"HistoryPanel.js","sourceRoot":"","sources":["../../src/components/HistoryPanel.tsx"],"names":[],"mappings":";AAmBA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAQtD,MAAM,UAAU,YAAY,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,GAAG,UAAU,EAAqB;IACtF,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,OAAO,KAAK,YAAY,CAAC;IAE5C,MAAM,OAAO,GAAG,CACd,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAC1B,QAAQ,EAAE,CAAC,OAAO,gBACP,MAAM,EACjB,SAAS,EAAC,mLAAmL,YAE7L,MAAC,IAAI,IAAC,IAAI,EAAE,EAAE,aACZ,eAAM,CAAC,EAAC,eAAe,GAAG,EAC1B,eAAM,CAAC,EAAC,0BAA0B,GAAG,IAChC,GACA,CACV,CAAC;IACF,MAAM,OAAO,GAAG,CACd,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAC1B,QAAQ,EAAE,CAAC,OAAO,gBACP,MAAM,EACjB,SAAS,EAAC,mLAAmL,YAE7L,MAAC,IAAI,IAAC,IAAI,EAAE,EAAE,aACZ,eAAM,CAAC,EAAC,gBAAgB,GAAG,EAC3B,eAAM,CAAC,EAAC,yBAAyB,GAAG,IAC/B,GACA,CACV,CAAC;IAEF,MAAM,QAAQ,GAAG,CACf,eACE,SAAS,EAAE,mDACT,UAAU,CAAC,CAAC,CAAC,sDAAsD,CAAC,CAAC,CAAC,oDACxE,EAAE,aAEF,eAAM,SAAS,EAAC,kEAAkE,wBAE3E,EACP,eAAK,SAAS,EAAC,2BAA2B,aACvC,OAAO,EACP,OAAO,IACJ,IACF,CACP,CAAC;IAEF,MAAM;IACN,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,CACL,iBACE,SAAS,EAAE,iBACT,UAAU;gBACR,CAAC,CAAC,0EAA0E;gBAC5E,CAAC,CAAC,6DACN,IAAI,SAAS,EAAE,gBACJ,eAAe,aAEzB,QAAQ,EACT,YAAG,SAAS,EAAC,gCAAgC,+BAAmB,IAC1D,CACT,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,8BAA8B;QAC9B,OAAO,CACL,iBACE,SAAS,EAAE,kFAAkF,SAAS,EAAE,gBAC7F,eAAe,aAEzB,QAAQ,EACT,cAAI,SAAS,EAAC,qDAAqD,aAEjE,aAAI,SAAS,EAAC,UAAU,YACtB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,EAC9B,SAAS,EAAE,6EACT,MAAM,KAAK,CAAC,CAAC;oCACX,CAAC,CAAC,qHAAqH;oCACvH,CAAC,CAAC,uDACN,EAAE,aAEF,eAAM,SAAS,EAAC,gEAAgE,iBAAa,MAAM,GAAG,EACtG,eAAM,SAAS,EAAC,UAAU,wBAAe,IAClC,GACN,EACJ,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;4BACxB,MAAM,SAAS,GAAG,CAAC,KAAK,MAAM,CAAC;4BAC/B,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC;4BAChC,OAAO,CACL,aAAmB,SAAS,EAAC,UAAU,YACrC,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,kBACf,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC5C,SAAS,EAAE,6EACT,SAAS;wCACP,CAAC,CAAC,qHAAqH;wCACvH,CAAC,CAAC,YAAY;4CACd,CAAC,CAAC,6EAA6E;4CAC/E,CAAC,CAAC,0EACN,EAAE,aAEF,eACE,SAAS,EAAE,qCACT,SAAS;gDACP,CAAC,CAAC,eAAe;gDACjB,CAAC,CAAC,YAAY;oDACd,CAAC,CAAC,8BAA8B;oDAChC,CAAC,CAAC,8BACN,EAAE,iBACU,MAAM,GAClB,EACF,eAAM,SAAS,EAAC,sBAAsB,YAAE,oBAAoB,CAAC,KAAK,CAAC,GAAQ,IACpE,IAxBF,KAAK,CAAC,EAAE,CAyBZ,CACN,CAAC;wBACJ,CAAC,CAAC,IACC,IACC,CACT,CAAC;IACJ,CAAC;IAED,YAAY;IACZ,OAAO,CACL,iBACE,SAAS,EAAE,6EAA6E,SAAS,EAAE,gBACxF,eAAe,aAEzB,QAAQ,EACT,cAAK,SAAS,EAAC,kCAAkC,YAC/C,cAAI,SAAS,EAAC,aAAa,aAEzB,uBACE,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,EAC9B,SAAS,EAAE,8FACT,MAAM,KAAK,CAAC,CAAC;oCACX,CAAC,CAAC,qHAAqH;oCACvH,CAAC,CAAC,uDACN,EAAE,aAEF,eAAM,SAAS,EAAC,gEAAgE,iBAAa,MAAM,GAAG,EACtG,eAAM,SAAS,EAAC,UAAU,wBAAe,IAClC,GACN,EACJ,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;4BACxB,MAAM,SAAS,GAAG,CAAC,KAAK,MAAM,CAAC;4BAC/B,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC;4BAChC,OAAO,CACL,uBACE,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,kBACf,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC5C,SAAS,EAAE,6FACT,SAAS;wCACP,CAAC,CAAC,qHAAqH;wCACvH,CAAC,CAAC,YAAY;4CACd,CAAC,CAAC,6EAA6E;4CAC/E,CAAC,CAAC,0EACN,EAAE,aAEF,eACE,SAAS,EAAE,4CACT,SAAS;gDACP,CAAC,CAAC,eAAe;gDACjB,CAAC,CAAC,YAAY;oDACd,CAAC,CAAC,8BAA8B;oDAChC,CAAC,CAAC,8BACN,EAAE,iBACU,MAAM,GAClB,EACF,eAAK,SAAS,EAAC,gBAAgB,aAC7B,cAAK,SAAS,EAAC,sBAAsB,YAClC,oBAAoB,CAAC,KAAK,CAAC,GACxB,EACN,cAAK,SAAS,EAAC,0BAA0B,YACtC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,GAC3C,IACF,IACC,IA/BF,KAAK,CAAC,EAAE,CAgCZ,CACN,CAAC;wBACJ,CAAC,CAAC,IACC,GACD,IACA,CACT,CAAC;AACJ,CAAC;AAED,mDAAmD;AACnD,SAAS,oBAAoB,CAAC,KAAmB;IAC/C,oDAAoD;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,mBAAmB;IACnB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAChE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Inspector.d.ts","sourceRoot":"","sources":["../../src/components/Inspector.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Inspector.d.ts","sourceRoot":"","sources":["../../src/components/Inspector.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAc,EAAE,EAAE,cAAc,qBAiJ3D"}
|
|
@@ -9,6 +9,7 @@ import * as React from 'react';
|
|
|
9
9
|
import { Icon } from '@lokvis/ui-core';
|
|
10
10
|
import { useWorkspaceStore } from '../store/index.js';
|
|
11
11
|
import { ParamForm } from './ParamForm.js';
|
|
12
|
+
import { ExifPanel } from './ExifPanel.js';
|
|
12
13
|
export function Inspector({ className = '' }) {
|
|
13
14
|
const capabilities = useWorkspaceStore((s) => s.capabilities);
|
|
14
15
|
const nodes = useWorkspaceStore((s) => s.nodes);
|
|
@@ -33,7 +34,7 @@ export function Inspector({ className = '' }) {
|
|
|
33
34
|
return map;
|
|
34
35
|
}, [filtered]);
|
|
35
36
|
const showConfigure = selectedNode && capabilityMap[selectedNode.capability];
|
|
36
|
-
return (_jsxs("aside", { className: `flex w-72 shrink-0 flex-col border-l border-zinc-200 dark:border-zinc-800 ${className}`, children: [showConfigure && (_jsxs("div", { className: "shrink-0 border-b border-zinc-200 dark:border-zinc-800", children: [_jsxs("button", { type: "button", onClick: () => setConfigureOpen(!configureOpen), className: "flex w-full items-center justify-between px-3 h-10 text-left transition-colors hover:bg-zinc-50 dark:hover:bg-zinc-800/50", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Icon, { size: 12, className: `text-zinc-400 transition-transform ${configureOpen ? 'rotate-90' : ''}`, children: _jsx("path", { d: "m9 5 7 7-7 7" }) }), _jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-zinc-400", children: "Configure" })] }), _jsx("span", { className: "font-mono text-[10px] text-indigo-500 bg-indigo-50 dark:bg-indigo-950/30 px-1.5 py-0.5 rounded", children: selectedNode.capability })] }), configureOpen && (_jsx("div", { className: "px-3 pb-3 max-h-60 overflow-y-auto", children: _jsx(ParamForm, { capability: capabilityMap[selectedNode.capability], values: selectedNode.params, onChange: (params) => updateNodeParams(selectedNode.id, params) }) }))] })), _jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [_jsxs("div", { className: "flex items-center justify-between px-3 h-10 shrink-0 border-b border-zinc-200 dark:border-zinc-800", children: [_jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-zinc-400", children: "Capabilities" }), _jsx("span", { className: "text-[11px] tabular-nums text-zinc-400", children: filtered.length })] }), _jsx("div", { className: "px-2 py-2 border-b border-zinc-100 dark:border-zinc-800/50", children: _jsxs("div", { className: "relative", children: [_jsxs(Icon, { size: 12, className: "absolute left-2 top-1/2 -translate-y-1/2 text-zinc-400", children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "m21 21-4.3-4.3" })] }), _jsx("input", { type: "text", placeholder: "Search capabilities...", value: filter, onChange: (e) => setFilter(e.target.value), className: "w-full rounded-md border border-zinc-200 bg-white py-1 pl-7 pr-2 text-[11px] placeholder-zinc-400 focus:border-indigo-400 focus:outline-none focus:ring-1 focus:ring-indigo-400 dark:border-zinc-700 dark:bg-zinc-900" })] }) }), _jsx("div", { className: "flex-1 overflow-y-auto p-2", children: capabilities.length === 0 ? (_jsxs("div", { className: "px-2 py-8 text-center", children: [_jsx("p", { className: "text-[11px] text-zinc-400", children: "No capabilities loaded" }), _jsx("p", { className: "mt-1 text-[10px] text-zinc-500", children: "Load a plugin to get started" })] })) : filtered.length === 0 ? (_jsx("p", { className: "px-2 py-4 text-[11px] text-zinc-400", children: "No matching capabilities" })) : (_jsx("div", { className: "space-y-3", children: Array.from(grouped.entries()).map(([domain, caps]) => (_jsxs("div", { children: [_jsx("div", { className: "px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-zinc-400", children: domain }), _jsx("ul", { className: "space-y-0.5", children: caps.map((cap) => {
|
|
37
|
+
return (_jsxs("aside", { className: `flex w-72 shrink-0 flex-col border-l border-zinc-200 dark:border-zinc-800 ${className}`, children: [_jsx(ExifPanel, {}), showConfigure && (_jsxs("div", { className: "shrink-0 border-b border-zinc-200 dark:border-zinc-800", children: [_jsxs("button", { type: "button", onClick: () => setConfigureOpen(!configureOpen), className: "flex w-full items-center justify-between px-3 h-10 text-left transition-colors hover:bg-zinc-50 dark:hover:bg-zinc-800/50", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Icon, { size: 12, className: `text-zinc-400 transition-transform ${configureOpen ? 'rotate-90' : ''}`, children: _jsx("path", { d: "m9 5 7 7-7 7" }) }), _jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-zinc-400", children: "Configure" })] }), _jsx("span", { className: "font-mono text-[10px] text-indigo-500 bg-indigo-50 dark:bg-indigo-950/30 px-1.5 py-0.5 rounded", children: selectedNode.capability })] }), configureOpen && (_jsx("div", { className: "px-3 pb-3 max-h-60 overflow-y-auto", children: _jsx(ParamForm, { capability: capabilityMap[selectedNode.capability], values: selectedNode.params, onChange: (params) => updateNodeParams(selectedNode.id, params) }) }))] })), _jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [_jsxs("div", { className: "flex items-center justify-between px-3 h-10 shrink-0 border-b border-zinc-200 dark:border-zinc-800", children: [_jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-zinc-400", children: "Capabilities" }), _jsx("span", { className: "text-[11px] tabular-nums text-zinc-400", children: filtered.length })] }), _jsx("div", { className: "px-2 py-2 border-b border-zinc-100 dark:border-zinc-800/50", children: _jsxs("div", { className: "relative", children: [_jsxs(Icon, { size: 12, className: "absolute left-2 top-1/2 -translate-y-1/2 text-zinc-400", children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "m21 21-4.3-4.3" })] }), _jsx("input", { type: "text", placeholder: "Search capabilities...", value: filter, onChange: (e) => setFilter(e.target.value), className: "w-full rounded-md border border-zinc-200 bg-white py-1 pl-7 pr-2 text-[11px] placeholder-zinc-400 focus:border-indigo-400 focus:outline-none focus:ring-1 focus:ring-indigo-400 dark:border-zinc-700 dark:bg-zinc-900" })] }) }), _jsx("div", { className: "flex-1 overflow-y-auto p-2", children: capabilities.length === 0 ? (_jsxs("div", { className: "px-2 py-8 text-center", children: [_jsx("p", { className: "text-[11px] text-zinc-400", children: "No capabilities loaded" }), _jsx("p", { className: "mt-1 text-[10px] text-zinc-500", children: "Load a plugin to get started" })] })) : filtered.length === 0 ? (_jsx("p", { className: "px-2 py-4 text-[11px] text-zinc-400", children: "No matching capabilities" })) : (_jsx("div", { className: "space-y-3", children: Array.from(grouped.entries()).map(([domain, caps]) => (_jsxs("div", { children: [_jsx("div", { className: "px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-zinc-400", children: domain }), _jsx("ul", { className: "space-y-0.5", children: caps.map((cap) => {
|
|
37
38
|
const isInPipeline = nodes.some((n) => n.capability === cap.name);
|
|
38
39
|
return (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => addNode(cap.name), className: `group w-full rounded-md px-2 py-1.5 text-left transition-all ${isInPipeline
|
|
39
40
|
? 'bg-indigo-50/50 ring-1 ring-indigo-200 dark:bg-indigo-950/20 dark:ring-indigo-800'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Inspector.js","sourceRoot":"","sources":["../../src/components/Inspector.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAM3C,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,GAAG,EAAE,EAAkB;IAC1D,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAEtE,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACnD,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAC7D,CAAC;IAEF,OAAO;IACP,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACjC,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAC;QAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;YACjD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1C,GAAG,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,aAAa,GAAG,YAAY,IAAI,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAE7E,OAAO,CACL,iBACE,SAAS,EAAE,6EAA6E,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"Inspector.js","sourceRoot":"","sources":["../../src/components/Inspector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProgressBar - 工作流执行进度条 + 取消按钮(W11.6)
|
|
3
|
+
*
|
|
4
|
+
* 展示:
|
|
5
|
+
* - 节点完成进度(成功数 / 总数)
|
|
6
|
+
* - 横向进度条(running 时动画)
|
|
7
|
+
* - Cancel 按钮(调用 cancelRun)
|
|
8
|
+
* - 状态消息(statusMessage)
|
|
9
|
+
*
|
|
10
|
+
* 仅在 running 或最近一次执行有结果时显示。
|
|
11
|
+
*
|
|
12
|
+
* @module ProgressBar
|
|
13
|
+
*/
|
|
14
|
+
export interface ProgressBarProps {
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function ProgressBar({ className }: ProgressBarProps): import("react").JSX.Element | null;
|
|
18
|
+
//# sourceMappingURL=ProgressBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../src/components/ProgressBar.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAc,EAAE,EAAE,gBAAgB,sCAiF/D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ProgressBar - 工作流执行进度条 + 取消按钮(W11.6)
|
|
4
|
+
*
|
|
5
|
+
* 展示:
|
|
6
|
+
* - 节点完成进度(成功数 / 总数)
|
|
7
|
+
* - 横向进度条(running 时动画)
|
|
8
|
+
* - Cancel 按钮(调用 cancelRun)
|
|
9
|
+
* - 状态消息(statusMessage)
|
|
10
|
+
*
|
|
11
|
+
* 仅在 running 或最近一次执行有结果时显示。
|
|
12
|
+
*
|
|
13
|
+
* @module ProgressBar
|
|
14
|
+
*/
|
|
15
|
+
import { Icon } from '@lokvis/ui-core';
|
|
16
|
+
import { useWorkspaceStore } from '../store/index.js';
|
|
17
|
+
import { useWorkflowProgress } from '../hooks/useWorkflowProgress.js';
|
|
18
|
+
export function ProgressBar({ className = '' }) {
|
|
19
|
+
const running = useWorkspaceStore((s) => s.running);
|
|
20
|
+
const statusMessage = useWorkspaceStore((s) => s.statusMessage);
|
|
21
|
+
const cancelRun = useWorkspaceStore((s) => s.cancelRun);
|
|
22
|
+
// 进度计算抽取到共享 hook(与 StatusBar 共用,避免重复逻辑)
|
|
23
|
+
const { total, done, failedCount, pct, hasFailure } = useWorkflowProgress();
|
|
24
|
+
// 没有节点或未运行且无最近结果时不渲染
|
|
25
|
+
if (total === 0)
|
|
26
|
+
return null;
|
|
27
|
+
if (!running && done === 0)
|
|
28
|
+
return null;
|
|
29
|
+
return (_jsxs("div", { className: `flex items-center gap-2 border-b border-zinc-200 bg-white px-3 py-1.5 dark:border-zinc-800 dark:bg-zinc-900 ${className}`, role: "status", "aria-live": "polite", "aria-label": `工作流进度:${done} / ${total}`, children: [_jsx("div", { className: "relative h-1.5 flex-1 overflow-hidden rounded-full bg-zinc-200 dark:bg-zinc-800", children: _jsx("div", { className: `absolute inset-y-0 left-0 transition-all duration-300 ${hasFailure
|
|
30
|
+
? 'bg-red-500'
|
|
31
|
+
: running
|
|
32
|
+
? 'bg-indigo-500'
|
|
33
|
+
: 'bg-emerald-500'} ${running ? 'animate-pulse' : ''}`, style: { width: `${pct}%` } }) }), _jsxs("span", { className: "shrink-0 text-[10px] font-medium tabular-nums text-zinc-500 dark:text-zinc-400", children: [done, "/", total, failedCount > 0 && (_jsxs("span", { className: "ml-1 text-red-500", children: ["(", failedCount, " failed)"] }))] }), running && statusMessage && (_jsx("span", { className: "hidden shrink-0 truncate text-[10px] text-zinc-400 sm:inline", children: statusMessage })), running && (_jsxs("button", { type: "button", onClick: () => void cancelRun(), "aria-label": "\u53D6\u6D88\u8FD0\u884C", title: "\u53D6\u6D88\u8FD0\u884C", className: "flex shrink-0 items-center gap-1 rounded-md bg-red-50 px-2 py-0.5 text-[10px] font-medium text-red-600 transition-colors hover:bg-red-100 dark:bg-red-950/30 dark:text-red-400 dark:hover:bg-red-900/40", children: [_jsx(Icon, { size: 10, strokeWidth: 3, children: _jsx("path", { d: "M6 6l12 12M6 18L18 6" }) }), "Cancel"] })), !running && done === total && (_jsxs("span", { className: `flex shrink-0 items-center gap-1 text-[10px] font-medium ${hasFailure ? 'text-red-500' : 'text-emerald-500'}`, children: [_jsx(Icon, { size: 10, strokeWidth: 3, children: hasFailure ? (_jsx("path", { d: "M12 2L2 22h20L12 2zM12 9v5M12 17v.01" })) : (_jsx("path", { d: "M20 6L9 17l-5-5" })) }), hasFailure ? 'Failed' : 'Done'] }))] }));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=ProgressBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../src/components/ProgressBar.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAMtE,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,GAAG,EAAE,EAAoB;IAC9D,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAExD,wCAAwC;IACxC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAE5E,qBAAqB;IACrB,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,OAAO,CACL,eACE,SAAS,EAAE,+GAA+G,SAAS,EAAE,EACrI,IAAI,EAAC,QAAQ,eACH,QAAQ,gBACN,SAAS,IAAI,MAAM,KAAK,EAAE,aAGtC,cAAK,SAAS,EAAC,iFAAiF,YAC9F,cACE,SAAS,EAAE,yDACT,UAAU;wBACR,CAAC,CAAC,YAAY;wBACd,CAAC,CAAC,OAAO;4BACT,CAAC,CAAC,eAAe;4BACjB,CAAC,CAAC,gBACN,IAAI,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,EACpC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,GAC3B,GACE,EAGN,gBAAM,SAAS,EAAC,gFAAgF,aAC7F,IAAI,OAAG,KAAK,EACZ,WAAW,GAAG,CAAC,IAAI,CAClB,gBAAM,SAAS,EAAC,mBAAmB,kBAAG,WAAW,gBAAgB,CAClE,IACI,EAGN,OAAO,IAAI,aAAa,IAAI,CAC3B,eAAM,SAAS,EAAC,8DAA8D,YAC3E,aAAa,GACT,CACR,EAGA,OAAO,IAAI,CACV,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,SAAS,EAAE,gBACpB,0BAAM,EACjB,KAAK,EAAC,0BAAM,EACZ,SAAS,EAAC,yMAAyM,aAEnN,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,YAAE,eAAM,CAAC,EAAC,sBAAsB,GAAG,GAAO,cAEjE,CACV,EAGA,CAAC,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,CAC7B,gBACE,SAAS,EAAE,4DACT,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,kBAChC,EAAE,aAEF,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,YAC3B,UAAU,CAAC,CAAC,CAAC,CACZ,eAAM,CAAC,EAAC,sCAAsC,GAAG,CAClD,CAAC,CAAC,CAAC,CACF,eAAM,CAAC,EAAC,iBAAiB,GAAG,CAC7B,GACI,EACN,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,IAC1B,CACR,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* StatusBar - 底部状态栏
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 紧凑单行:左侧状态指示 + 当前工具 + 进度,右侧在线状态 + 资源统计 + 存储配额。
|
|
5
|
+
*
|
|
6
|
+
* W9.6 新增:
|
|
7
|
+
* - 当前选中工具名(从 selectedNode 取)
|
|
8
|
+
* - 执行进度(已完成节点数 / 总节点数)
|
|
9
|
+
* - 在线状态(navigator.onLine + 事件监听)
|
|
5
10
|
*/
|
|
11
|
+
import * as React from 'react';
|
|
6
12
|
export interface StatusBarProps {
|
|
7
13
|
className?: string;
|
|
8
14
|
}
|
|
9
|
-
export declare function StatusBar({ className }: StatusBarProps):
|
|
15
|
+
export declare function StatusBar({ className }: StatusBarProps): React.JSX.Element;
|
|
10
16
|
//# sourceMappingURL=StatusBar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../src/components/StatusBar.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../src/components/StatusBar.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD,wBAAgB,SAAS,CAAC,EAAE,SAAc,EAAE,EAAE,cAAc,qBAwI3D"}
|