@lokvis/ui-react 0.1.0 → 0.2.0
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 +80 -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 +41 -3
- 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 +3 -1
- package/dist/components/Inspector.js.map +1 -1
- package/dist/components/PipelineBar.d.ts.map +1 -1
- package/dist/components/PipelineBar.js +4 -3
- package/dist/components/PipelineBar.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 +80 -5
- 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 +19 -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 +167 -20
- package/dist/store/workflow-slice.js.map +1 -1
- package/dist/store.d.ts +76 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +217 -0
- package/dist/store.js.map +1 -0
- package/package.json +9 -6
- package/src/components/AssetPanel.tsx +154 -12
- package/src/components/Canvas.tsx +85 -7
- 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 +7 -2
- package/src/components/PipelineBar.tsx +13 -12
- 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 +207 -9
- 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 +19 -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 +178 -20
|
@@ -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"}
|
|
@@ -1,10 +1,42 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* StatusBar - 底部状态栏
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* 紧凑单行:左侧状态指示 + 当前工具 + 进度,右侧在线状态 + 资源统计 + 存储配额。
|
|
6
|
+
*
|
|
7
|
+
* W9.6 新增:
|
|
8
|
+
* - 当前选中工具名(从 selectedNode 取)
|
|
9
|
+
* - 执行进度(已完成节点数 / 总节点数)
|
|
10
|
+
* - 在线状态(navigator.onLine + 事件监听)
|
|
6
11
|
*/
|
|
12
|
+
import * as React from 'react';
|
|
7
13
|
import { useWorkspaceStore } from '../store/index.js';
|
|
14
|
+
import { useWorkflowProgress } from '../hooks/useWorkflowProgress.js';
|
|
15
|
+
/** 格式化字节数为人类可读(KB/MB/GB) */
|
|
16
|
+
function formatBytes(bytes) {
|
|
17
|
+
if (bytes < 1024)
|
|
18
|
+
return `${bytes} B`;
|
|
19
|
+
if (bytes < 1024 * 1024)
|
|
20
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
21
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
22
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
23
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
|
|
24
|
+
}
|
|
25
|
+
/** useOnlineStatus - 监听 navigator.onLine + online/offline 事件(W9.6) */
|
|
26
|
+
function useOnlineStatus() {
|
|
27
|
+
const [online, setOnline] = React.useState(() => typeof navigator !== 'undefined' ? navigator.onLine : true);
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
const onOnline = () => setOnline(true);
|
|
30
|
+
const onOffline = () => setOnline(false);
|
|
31
|
+
window.addEventListener('online', onOnline);
|
|
32
|
+
window.addEventListener('offline', onOffline);
|
|
33
|
+
return () => {
|
|
34
|
+
window.removeEventListener('online', onOnline);
|
|
35
|
+
window.removeEventListener('offline', onOffline);
|
|
36
|
+
};
|
|
37
|
+
}, []);
|
|
38
|
+
return online;
|
|
39
|
+
}
|
|
8
40
|
export function StatusBar({ className = '' }) {
|
|
9
41
|
const statusMessage = useWorkspaceStore((s) => s.statusMessage);
|
|
10
42
|
const error = useWorkspaceStore((s) => s.error);
|
|
@@ -12,11 +44,34 @@ export function StatusBar({ className = '' }) {
|
|
|
12
44
|
const assets = useWorkspaceStore((s) => s.assets);
|
|
13
45
|
const capabilities = useWorkspaceStore((s) => s.capabilities);
|
|
14
46
|
const nodes = useWorkspaceStore((s) => s.nodes);
|
|
47
|
+
const selectedNodeId = useWorkspaceStore((s) => s.selectedNodeId);
|
|
48
|
+
const storageUsage = useWorkspaceStore((s) => s.storageUsage);
|
|
15
49
|
const setError = useWorkspaceStore((s) => s.setError);
|
|
16
|
-
|
|
50
|
+
const online = useOnlineStatus();
|
|
51
|
+
// W9.6 当前选中工具名
|
|
52
|
+
const selectedNode = nodes.find((n) => n.id === selectedNodeId);
|
|
53
|
+
// W9.6 执行进度(抽取到共享 hook,与 ProgressBar 共用,避免重复逻辑)
|
|
54
|
+
const { total: totalNodes, done: doneNodes, pct: progressPct } = useWorkflowProgress();
|
|
55
|
+
// W6.7 存储配额压力:>=95% 红(临界),>=80% 琥珀(警告),其余正常
|
|
56
|
+
const ratio = storageUsage ? storageUsage.usage / storageUsage.quota : 0;
|
|
57
|
+
const storageCritical = ratio >= 0.95;
|
|
58
|
+
const storageWarning = ratio >= 0.8 && !storageCritical;
|
|
59
|
+
return (_jsxs("footer", { className: `flex h-7 shrink-0 items-center justify-between border-t border-zinc-200 bg-zinc-50 px-3 dark:border-zinc-800 dark:bg-zinc-950 ${className}`, children: [_jsxs("div", { className: "flex items-center gap-2 min-w-0", role: "status", "aria-live": "polite", children: [_jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: `h-1.5 w-1.5 rounded-full shrink-0 ${error
|
|
17
60
|
? 'bg-red-500'
|
|
18
61
|
: running
|
|
19
62
|
? 'bg-amber-500 animate-pulse'
|
|
20
|
-
: 'bg-emerald-500'}
|
|
63
|
+
: 'bg-emerald-500'}`, "aria-hidden": "true" }), _jsx("span", { className: `truncate text-[10px] ${error ? 'text-red-500' : 'text-zinc-500'}`, children: statusMessage })] }), selectedNode && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-zinc-300 dark:text-zinc-700", "aria-hidden": "true", children: "\u00B7" }), _jsx("span", { className: "shrink-0 font-mono text-[10px] text-indigo-500 dark:text-indigo-400 truncate max-w-[120px]", children: selectedNode.capability })] })), running && totalNodes > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-zinc-300 dark:text-zinc-700", "aria-hidden": "true", children: "\u00B7" }), _jsxs("span", { className: "shrink-0 tabular-nums text-[10px] text-amber-600 dark:text-amber-400", children: [doneNodes, "/", totalNodes, " (", progressPct, "%)"] })] })), error && (_jsx("button", { type: "button", onClick: () => setError(null), className: "shrink-0 text-[10px] text-red-500 underline decoration-red-300 hover:text-red-600 dark:decoration-red-800", children: "dismiss" }))] }), _jsxs("div", { className: "flex items-center gap-3 shrink-0 text-[10px] text-zinc-400 tabular-nums", children: [_jsxs("span", { className: `flex items-center gap-1 ${online ? 'text-emerald-500' : 'text-amber-500'}`, title: online ? 'Online' : 'Offline — running locally, no upload needed', "aria-label": online ? 'Online' : 'Offline — files still processed locally', children: [_jsx("span", { className: `h-1.5 w-1.5 rounded-full ${online ? 'bg-emerald-500' : 'bg-amber-500'}`, "aria-hidden": "true" }), online ? 'Online' : 'Offline'] }), _jsx("span", { className: "text-zinc-300 dark:text-zinc-700", "aria-hidden": "true", children: "|" }), storageUsage && (_jsxs(_Fragment, { children: [_jsxs("span", { className: `flex items-center gap-1 ${storageCritical
|
|
64
|
+
? 'text-red-500 font-semibold'
|
|
65
|
+
: storageWarning
|
|
66
|
+
? 'text-amber-500'
|
|
67
|
+
: 'text-zinc-400'}`, title: storageCritical
|
|
68
|
+
? `Storage almost full (${Math.round(ratio * 100)}%) — clean up to free space`
|
|
69
|
+
: storageWarning
|
|
70
|
+
? `Storage nearing limit (${Math.round(ratio * 100)}%)`
|
|
71
|
+
: `Storage: ${formatBytes(storageUsage.usage)} of ${formatBytes(storageUsage.quota)}`, "aria-label": storageCritical
|
|
72
|
+
? `Storage critical: ${formatBytes(storageUsage.usage)} of ${formatBytes(storageUsage.quota)} used, ${Math.round(ratio * 100)} percent. Clean up to free space.`
|
|
73
|
+
: storageWarning
|
|
74
|
+
? `Storage warning: ${formatBytes(storageUsage.usage)} of ${formatBytes(storageUsage.quota)} used, ${Math.round(ratio * 100)} percent.`
|
|
75
|
+
: `Storage: ${formatBytes(storageUsage.usage)} of ${formatBytes(storageUsage.quota)} used.`, "aria-live": storageCritical ? 'assertive' : 'polite', children: [(storageCritical || storageWarning) && (_jsx("span", { className: "text-[9px]", "aria-hidden": "true", children: "\u26A0" })), formatBytes(storageUsage.usage), " / ", formatBytes(storageUsage.quota)] }), _jsx("span", { className: "text-zinc-300 dark:text-zinc-700", "aria-hidden": "true", children: "|" })] })), _jsxs("span", { children: [assets.length, " asset", assets.length !== 1 ? 's' : ''] }), _jsx("span", { className: "text-zinc-300 dark:text-zinc-700", "aria-hidden": "true", children: "|" }), _jsxs("span", { children: [capabilities.length, " cap", capabilities.length !== 1 ? 's' : ''] }), _jsx("span", { className: "text-zinc-300 dark:text-zinc-700", "aria-hidden": "true", children: "|" }), _jsxs("span", { children: [nodes.length, " step", nodes.length !== 1 ? 's' : ''] })] })] }));
|
|
21
76
|
}
|
|
22
77
|
//# sourceMappingURL=StatusBar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../src/components/StatusBar.tsx"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../src/components/StatusBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThemeToggle - 暗色模式切换按钮(W9.7)
|
|
3
|
+
*
|
|
4
|
+
* 使用 `useTheme()` hook 读写 localStorage + 跟随系统偏好。
|
|
5
|
+
* 与 `tokens.css` 的 `.dark` / `.light` 类双触发机制对齐。
|
|
6
|
+
*
|
|
7
|
+
* 交互:
|
|
8
|
+
* - 左键单击:在 light / dark 之间切换(基于当前 resolvedTheme 决定下一态)
|
|
9
|
+
* - 右键单击:弹出菜单(light / dark / system 三态)
|
|
10
|
+
* - ESC:关闭菜单
|
|
11
|
+
* - 点击菜单外部:关闭菜单
|
|
12
|
+
*/
|
|
13
|
+
import * as React from 'react';
|
|
14
|
+
export interface ThemeToggleProps {
|
|
15
|
+
className?: string;
|
|
16
|
+
/** 是否显示文字标签(默认仅图标) */
|
|
17
|
+
showLabel?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function ThemeToggle({ className, showLabel }: ThemeToggleProps): React.JSX.Element;
|
|
20
|
+
//# sourceMappingURL=ThemeToggle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeToggle.d.ts","sourceRoot":"","sources":["../../src/components/ThemeToggle.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAc,EAAE,SAAiB,EAAE,EAAE,gBAAgB,qBAkGlF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ThemeToggle - 暗色模式切换按钮(W9.7)
|
|
4
|
+
*
|
|
5
|
+
* 使用 `useTheme()` hook 读写 localStorage + 跟随系统偏好。
|
|
6
|
+
* 与 `tokens.css` 的 `.dark` / `.light` 类双触发机制对齐。
|
|
7
|
+
*
|
|
8
|
+
* 交互:
|
|
9
|
+
* - 左键单击:在 light / dark 之间切换(基于当前 resolvedTheme 决定下一态)
|
|
10
|
+
* - 右键单击:弹出菜单(light / dark / system 三态)
|
|
11
|
+
* - ESC:关闭菜单
|
|
12
|
+
* - 点击菜单外部:关闭菜单
|
|
13
|
+
*/
|
|
14
|
+
import * as React from 'react';
|
|
15
|
+
import { Icon } from '@lokvis/ui-core';
|
|
16
|
+
import { useTheme } from '../hooks/useTheme.js';
|
|
17
|
+
export function ThemeToggle({ className = '', showLabel = false }) {
|
|
18
|
+
const { theme, resolvedTheme, toggleTheme, setTheme } = useTheme();
|
|
19
|
+
const [menuOpen, setMenuOpen] = React.useState(false);
|
|
20
|
+
const btnRef = React.useRef(null);
|
|
21
|
+
// 点击外部关闭菜单 + ESC 关闭
|
|
22
|
+
React.useEffect(() => {
|
|
23
|
+
if (!menuOpen)
|
|
24
|
+
return;
|
|
25
|
+
const onDown = (e) => {
|
|
26
|
+
// e.target 可能是任意 EventTarget;用 instanceof Node 类型守卫收窄,
|
|
27
|
+
// 避免 as 断言(与 WorkflowEditor 等处统一)
|
|
28
|
+
if (e.target instanceof Node && btnRef.current && !btnRef.current.contains(e.target)) {
|
|
29
|
+
setMenuOpen(false);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const onKey = (e) => {
|
|
33
|
+
if (e.key === 'Escape')
|
|
34
|
+
setMenuOpen(false);
|
|
35
|
+
};
|
|
36
|
+
document.addEventListener('mousedown', onDown);
|
|
37
|
+
document.addEventListener('keydown', onKey);
|
|
38
|
+
return () => {
|
|
39
|
+
document.removeEventListener('mousedown', onDown);
|
|
40
|
+
document.removeEventListener('keydown', onKey);
|
|
41
|
+
};
|
|
42
|
+
}, [menuOpen]);
|
|
43
|
+
const isDark = resolvedTheme === 'dark';
|
|
44
|
+
const icon = isDark ? (_jsx(Icon, { size: 14, strokeWidth: 2, children: _jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) })) : (_jsxs(Icon, { size: 14, strokeWidth: 2, children: [_jsx("circle", { cx: "12", cy: "12", r: "4" }), _jsx("path", { d: "M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41" })] }));
|
|
45
|
+
const label = theme === null ? 'System' : theme === 'dark' ? 'Dark' : 'Light';
|
|
46
|
+
return (_jsxs("div", { className: `relative ${className}`, children: [_jsxs("button", { ref: btnRef, type: "button", "aria-haspopup": "menu", "aria-expanded": menuOpen, onClick: () => toggleTheme(), onContextMenu: (e) => {
|
|
47
|
+
e.preventDefault();
|
|
48
|
+
setMenuOpen((v) => !v);
|
|
49
|
+
}, "aria-label": `Theme: ${label}. Click to toggle, right-click for options.`, title: `Theme: ${label} (right-click for options)`, className: "flex h-8 w-8 items-center justify-center rounded-md text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-700 dark:hover:bg-zinc-800 dark:hover:text-zinc-200", children: [icon, showLabel && _jsx("span", { className: "ml-1 text-xs", children: label })] }), menuOpen && (_jsx("div", { role: "menu", className: "absolute right-0 top-full z-50 mt-1 w-32 overflow-hidden rounded-md border border-zinc-200 bg-white py-1 shadow-lg dark:border-zinc-800 dark:bg-zinc-900", children: ['light', 'dark', null].map((mode) => {
|
|
50
|
+
const isActive = theme === mode;
|
|
51
|
+
const text = mode === null ? 'System' : mode === 'dark' ? 'Dark' : 'Light';
|
|
52
|
+
return (_jsxs("button", { type: "button", role: "menuitemradio", "aria-checked": isActive, onClick: () => {
|
|
53
|
+
setTheme(mode);
|
|
54
|
+
setMenuOpen(false);
|
|
55
|
+
}, className: `flex w-full items-center justify-between px-3 py-1.5 text-left text-xs transition-colors ${isActive
|
|
56
|
+
? 'bg-indigo-50 text-indigo-700 dark:bg-indigo-950/30 dark:text-indigo-300'
|
|
57
|
+
: 'text-zinc-700 hover:bg-zinc-100 dark:text-zinc-200 dark:hover:bg-zinc-800'}`, children: [_jsx("span", { children: text }), isActive && (_jsx(Icon, { size: 12, strokeWidth: 3, children: _jsx("path", { d: "M5 13l4 4L19 7" }) }))] }, mode ?? 'system'));
|
|
58
|
+
}) }))] }));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=ThemeToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeToggle.js","sourceRoot":"","sources":["../../src/components/ThemeToggle.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowEditor - 拖拽式工作流编辑器(W10.4)
|
|
3
|
+
*
|
|
4
|
+
* 增强 PipelineBar,提供节点拖拽重排能力:
|
|
5
|
+
* - 拖拽节点到任意位置重排线性链
|
|
6
|
+
* - 拖拽时显示插入指示器
|
|
7
|
+
* - 键盘支持:选中节点后 ← → 移动(无障碍)
|
|
8
|
+
* - 节点数上限 MAX_WORKFLOW_STEPS=5(M1 MVP 约束,UI 层常量)
|
|
9
|
+
*
|
|
10
|
+
* 与 PipelineBar 区别:
|
|
11
|
+
* - PipelineBar:只读 + 选中/删除(快速预览)
|
|
12
|
+
* - WorkflowEditor:可编辑 + 拖拽重排(编辑模式)
|
|
13
|
+
*
|
|
14
|
+
* 使用原生 HTML5 Drag and Drop API,无额外依赖。
|
|
15
|
+
* 触摸设备降级为按钮上下移动(HTML5 DnD 在移动端支持不佳)。
|
|
16
|
+
*
|
|
17
|
+
* @module WorkflowEditor
|
|
18
|
+
*/
|
|
19
|
+
import * as React from 'react';
|
|
20
|
+
export interface WorkflowEditorProps {
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function WorkflowEditor({ className }: WorkflowEditorProps): React.JSX.Element;
|
|
24
|
+
//# sourceMappingURL=WorkflowEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowEditor.d.ts","sourceRoot":"","sources":["../../src/components/WorkflowEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAAE,SAAc,EAAE,EAAE,mBAAmB,qBAsNrE"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* WorkflowEditor - 拖拽式工作流编辑器(W10.4)
|
|
4
|
+
*
|
|
5
|
+
* 增强 PipelineBar,提供节点拖拽重排能力:
|
|
6
|
+
* - 拖拽节点到任意位置重排线性链
|
|
7
|
+
* - 拖拽时显示插入指示器
|
|
8
|
+
* - 键盘支持:选中节点后 ← → 移动(无障碍)
|
|
9
|
+
* - 节点数上限 MAX_WORKFLOW_STEPS=5(M1 MVP 约束,UI 层常量)
|
|
10
|
+
*
|
|
11
|
+
* 与 PipelineBar 区别:
|
|
12
|
+
* - PipelineBar:只读 + 选中/删除(快速预览)
|
|
13
|
+
* - WorkflowEditor:可编辑 + 拖拽重排(编辑模式)
|
|
14
|
+
*
|
|
15
|
+
* 使用原生 HTML5 Drag and Drop API,无额外依赖。
|
|
16
|
+
* 触摸设备降级为按钮上下移动(HTML5 DnD 在移动端支持不佳)。
|
|
17
|
+
*
|
|
18
|
+
* @module WorkflowEditor
|
|
19
|
+
*/
|
|
20
|
+
import * as React from 'react';
|
|
21
|
+
import { Icon } from '@lokvis/ui-core';
|
|
22
|
+
import { useWorkspaceStore, MAX_WORKFLOW_STEPS } from '../store/index.js';
|
|
23
|
+
export function WorkflowEditor({ className = '' }) {
|
|
24
|
+
const nodes = useWorkspaceStore((s) => s.nodes);
|
|
25
|
+
const selectedNodeId = useWorkspaceStore((s) => s.selectedNodeId);
|
|
26
|
+
const selectNode = useWorkspaceStore((s) => s.selectNode);
|
|
27
|
+
const removeNode = useWorkspaceStore((s) => s.removeNode);
|
|
28
|
+
const moveNode = useWorkspaceStore((s) => s.moveNode);
|
|
29
|
+
const insertNodeAt = useWorkspaceStore((s) => s.insertNodeAt);
|
|
30
|
+
const capabilities = useWorkspaceStore((s) => s.capabilities);
|
|
31
|
+
const clearWorkflow = useWorkspaceStore((s) => s.clearWorkflow);
|
|
32
|
+
// 拖拽状态:被拖拽的节点索引 + 当前 hover 的插入位置
|
|
33
|
+
const [dragIndex, setDragIndex] = React.useState(null);
|
|
34
|
+
const [hoverIndex, setHoverIndex] = React.useState(null);
|
|
35
|
+
const handleDragStart = (e, index) => {
|
|
36
|
+
setDragIndex(index);
|
|
37
|
+
e.dataTransfer.effectAllowed = 'move';
|
|
38
|
+
// Firefox 需要设置 data 才能触发 dragstart
|
|
39
|
+
e.dataTransfer.setData('text/plain', String(index));
|
|
40
|
+
};
|
|
41
|
+
const handleDragOver = (e, index) => {
|
|
42
|
+
e.preventDefault();
|
|
43
|
+
e.dataTransfer.dropEffect = 'move';
|
|
44
|
+
if (dragIndex !== null && dragIndex !== index) {
|
|
45
|
+
setHoverIndex(index);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const handleDragLeave = () => {
|
|
49
|
+
// 不立即清空 hoverIndex,因为 dragleave 在子元素间会误触发
|
|
50
|
+
// 由 handleDrop / handleDragEnd 统一清空
|
|
51
|
+
};
|
|
52
|
+
const handleDrop = (e, index) => {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
if (dragIndex !== null && dragIndex !== index) {
|
|
55
|
+
moveNode(dragIndex, index);
|
|
56
|
+
}
|
|
57
|
+
setDragIndex(null);
|
|
58
|
+
setHoverIndex(null);
|
|
59
|
+
};
|
|
60
|
+
const handleDragEnd = () => {
|
|
61
|
+
setDragIndex(null);
|
|
62
|
+
setHoverIndex(null);
|
|
63
|
+
};
|
|
64
|
+
// 键盘支持:选中节点后用 ← → 移动。传 node.id 而非 index 避免异步操作后 stale index
|
|
65
|
+
const handleKeyDown = (e, nodeId, index) => {
|
|
66
|
+
if (e.key === 'ArrowLeft' && index > 0) {
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
moveNode(index, index - 1);
|
|
69
|
+
}
|
|
70
|
+
else if (e.key === 'ArrowRight' && index < nodes.length - 1) {
|
|
71
|
+
e.preventDefault();
|
|
72
|
+
moveNode(index, index + 1);
|
|
73
|
+
}
|
|
74
|
+
else if (e.key === 'Delete' || e.key === 'Backspace') {
|
|
75
|
+
e.preventDefault();
|
|
76
|
+
removeNode(nodeId);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const canAddMore = nodes.length < MAX_WORKFLOW_STEPS;
|
|
80
|
+
return (_jsxs("div", { className: `flex flex-col border-b border-zinc-200 bg-white dark:border-zinc-800 dark:bg-zinc-900 ${className}`, role: "region", "aria-label": "\u5DE5\u4F5C\u6D41\u7F16\u8F91\u5668", children: [_jsxs("div", { className: "flex h-9 shrink-0 items-center justify-between border-b border-zinc-100 px-3 dark:border-zinc-800/50", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-zinc-400", children: "Workflow Editor" }), _jsxs("span", { className: `rounded px-1.5 py-0.5 text-[10px] tabular-nums ${canAddMore
|
|
81
|
+
? 'bg-zinc-100 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400'
|
|
82
|
+
: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400'}`, children: [nodes.length, "/", MAX_WORKFLOW_STEPS] })] }), nodes.length > 0 && (_jsx("button", { type: "button", onClick: () => {
|
|
83
|
+
if (window.confirm('清空当前工作流?所有节点将被移除。')) {
|
|
84
|
+
clearWorkflow();
|
|
85
|
+
}
|
|
86
|
+
}, className: "text-[10px] text-zinc-400 transition-colors hover:text-red-500", "aria-label": "\u6E05\u7A7A\u5DE5\u4F5C\u6D41", children: "Clear" }))] }), _jsx("div", { className: "flex min-h-[3rem] items-center gap-1 overflow-x-auto px-3 py-2", children: nodes.length === 0 ? (_jsx("div", { className: "flex flex-1 items-center justify-center py-2 text-center", children: _jsxs("p", { className: "text-[11px] text-zinc-400", children: ["\u7A7A\u5DE5\u4F5C\u6D41 \u2014 \u4ECE\u53F3\u4FA7 ", _jsx("span", { className: "font-mono", children: "Capabilities" }), " \u9762\u677F\u70B9\u51FB\u6DFB\u52A0\u8282\u70B9"] }) })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex shrink-0 items-center gap-1 rounded-md bg-zinc-100 px-2 py-1 text-[10px] font-medium text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400", children: [_jsx(Icon, { size: 12, children: _jsx("path", { d: "M12 4.5v15m7.5-7.5h-15" }) }), "Source"] }), _jsx(InsertConnector, { index: 0, capabilities: capabilities, onInsert: insertNodeAt, disabled: nodes.length >= MAX_WORKFLOW_STEPS }), nodes.map((node, i) => {
|
|
87
|
+
const selected = node.id === selectedNodeId;
|
|
88
|
+
const isDragging = dragIndex === i;
|
|
89
|
+
const isHoverTarget = hoverIndex === i && dragIndex !== null && dragIndex !== i;
|
|
90
|
+
return (_jsxs(React.Fragment, { children: [_jsxs("button", { type: "button", draggable: true, onDragStart: (e) => handleDragStart(e, i), onDragOver: (e) => handleDragOver(e, i), onDragLeave: handleDragLeave, onDrop: (e) => handleDrop(e, i), onDragEnd: handleDragEnd, onClick: () => selectNode(node.id), onKeyDown: (e) => handleKeyDown(e, node.id, i), "aria-label": `节点 ${node.capability},位置 ${i + 1},拖拽或方向键重排,Delete 删除`, className: `group relative flex shrink-0 items-center gap-1.5 rounded-md px-2.5 py-1.5 text-[11px] font-medium transition-all ${isDragging
|
|
91
|
+
? 'opacity-40'
|
|
92
|
+
: isHoverTarget
|
|
93
|
+
? 'ring-2 ring-indigo-400 ring-offset-1 dark:ring-offset-zinc-900'
|
|
94
|
+
: selected
|
|
95
|
+
? 'bg-indigo-100 text-indigo-700 ring-1 ring-indigo-300 dark:bg-indigo-950/50 dark:text-indigo-300 dark:ring-indigo-700'
|
|
96
|
+
: node.status === 'running'
|
|
97
|
+
? 'bg-amber-100 text-amber-700 dark:bg-amber-950/30 dark:text-amber-400'
|
|
98
|
+
: node.status === 'success'
|
|
99
|
+
? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-950/30 dark:text-emerald-400'
|
|
100
|
+
: node.status === 'failed'
|
|
101
|
+
? 'bg-red-100 text-red-700 dark:bg-red-950/30 dark:text-red-400'
|
|
102
|
+
: 'bg-zinc-100 text-zinc-700 hover:bg-zinc-200 dark:bg-zinc-800 dark:text-zinc-300 dark:hover:bg-zinc-700'} cursor-grab active:cursor-grabbing`, children: [_jsx("span", { className: "flex h-4 w-4 items-center justify-center rounded-full bg-black/5 text-[9px] tabular-nums dark:bg-white/10", children: i + 1 }), _jsx("span", { className: "font-mono", children: node.capability }), _jsx(StatusDot, { status: node.status }), _jsx("button", { type: "button", onClick: (e) => {
|
|
103
|
+
e.stopPropagation();
|
|
104
|
+
removeNode(node.id);
|
|
105
|
+
}, "aria-label": "\u5220\u9664\u8282\u70B9", tabIndex: -1, className: "absolute -right-1 -top-1 rounded p-0.5 opacity-0 transition-opacity group-hover:opacity-100 hover:bg-red-100 hover:text-red-600 dark:hover:bg-red-900/40", children: _jsx(Icon, { size: 10, strokeWidth: 3, children: _jsx("path", { d: "M6 18L18 6M6 6l12 12" }) }) })] }), _jsx(InsertConnector, { index: i + 1, capabilities: capabilities, onInsert: insertNodeAt, disabled: nodes.length >= MAX_WORKFLOW_STEPS })] }, node.id));
|
|
106
|
+
}), nodes.length > 0 && (_jsxs("div", { className: "flex shrink-0 items-center gap-1 rounded-md bg-zinc-100 px-2 py-1 text-[10px] font-medium text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400", children: [_jsx(Icon, { size: 12, 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.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3" }) }), "Output"] }))] })) }), nodes.length > 0 && (_jsxs("div", { className: "flex shrink-0 items-center gap-2 border-t border-zinc-100 px-3 py-1 text-[10px] text-zinc-400 dark:border-zinc-800/50", children: [_jsx(Icon, { size: 10, children: _jsx("path", { d: "M13 5.5a1 1 0 1 1 2 0 1-1 0 0 0-.5.86L16.5 9l1.5-.5a1 1 0 1 1 0 2l-1.5-.5-1 1.5a1 1 0 1 1-2 0l1-1.5-1-1.5a1 1 0 0 1 0-2z" }) }), _jsx("span", { children: "\u62D6\u62FD\u91CD\u6392 \u00B7 \u65B9\u5411\u952E\u79FB\u52A8 \u00B7 Delete \u5220\u9664 \u00B7 hover \u7BAD\u5934\u5904\u63D2\u5165\u8282\u70B9" })] }))] }));
|
|
107
|
+
}
|
|
108
|
+
function StatusDot({ status }) {
|
|
109
|
+
const color = status === 'running'
|
|
110
|
+
? 'bg-amber-500'
|
|
111
|
+
: status === 'success'
|
|
112
|
+
? 'bg-emerald-500'
|
|
113
|
+
: status === 'failed'
|
|
114
|
+
? 'bg-red-500'
|
|
115
|
+
: status === 'pending'
|
|
116
|
+
? 'bg-zinc-400 dark:bg-zinc-500'
|
|
117
|
+
: 'bg-zinc-300 dark:bg-zinc-600';
|
|
118
|
+
const animate = status === 'running' ? 'animate-pulse' : '';
|
|
119
|
+
return _jsx("span", { className: `h-1.5 w-1.5 rounded-full shrink-0 ${color} ${animate}` });
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* InsertConnector - 节点之间的连接器 + 插入按钮(W11.1)
|
|
123
|
+
*
|
|
124
|
+
* 默认显示箭头;hover 时变为 + 按钮,点击弹出 capability 选择菜单。
|
|
125
|
+
* 选择后调用 onInsert(index, capability)。
|
|
126
|
+
*/
|
|
127
|
+
function InsertConnector({ index, capabilities, onInsert, disabled, }) {
|
|
128
|
+
const [open, setOpen] = React.useState(false);
|
|
129
|
+
const [filter, setFilter] = React.useState('');
|
|
130
|
+
const ref = React.useRef(null);
|
|
131
|
+
// 点击外部关闭菜单
|
|
132
|
+
React.useEffect(() => {
|
|
133
|
+
if (!open)
|
|
134
|
+
return;
|
|
135
|
+
const handler = (e) => {
|
|
136
|
+
// 用 instanceof guard 替代 as Node 断言:运行时安全 + 类型安全
|
|
137
|
+
if (!(e.target instanceof Node))
|
|
138
|
+
return;
|
|
139
|
+
if (ref.current && !ref.current.contains(e.target)) {
|
|
140
|
+
setOpen(false);
|
|
141
|
+
setFilter('');
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
document.addEventListener('mousedown', handler);
|
|
145
|
+
return () => document.removeEventListener('mousedown', handler);
|
|
146
|
+
}, [open]);
|
|
147
|
+
const filtered = React.useMemo(() => capabilities.filter((c) => c.name.toLowerCase().includes(filter.toLowerCase()) ||
|
|
148
|
+
c.description.toLowerCase().includes(filter.toLowerCase())), [capabilities, filter]);
|
|
149
|
+
const handleSelect = (capName) => {
|
|
150
|
+
onInsert(index, capName);
|
|
151
|
+
setOpen(false);
|
|
152
|
+
setFilter('');
|
|
153
|
+
};
|
|
154
|
+
if (disabled) {
|
|
155
|
+
// 5 步上限时只显示箭头,不显示 +
|
|
156
|
+
return (_jsx(Icon, { size: 12, className: "shrink-0 text-zinc-300 dark:text-zinc-600", children: _jsx("path", { d: "m9 5 7 7-7 7" }) }));
|
|
157
|
+
}
|
|
158
|
+
return (_jsxs("div", { ref: ref, className: "relative flex shrink-0 items-center", children: [_jsxs("button", { type: "button", onClick: () => setOpen(!open), "aria-label": `在位置 ${index + 1} 插入节点`, title: "\u63D2\u5165\u8282\u70B9", className: "group flex h-5 w-5 items-center justify-center rounded text-zinc-300 transition-colors hover:bg-indigo-100 hover:text-indigo-500 dark:text-zinc-600 dark:hover:bg-indigo-950/40", children: [_jsx(Icon, { size: 12, className: "group-hover:hidden", children: _jsx("path", { d: "m9 5 7 7-7 7" }) }), _jsx(Icon, { size: 12, className: "hidden group-hover:block", strokeWidth: 2.5, children: _jsx("path", { d: "M12 5v14M5 12h14" }) })] }), open && (_jsxs("div", { className: "absolute top-full left-1/2 z-50 mt-1 w-56 -translate-x-1/2 rounded-lg border border-zinc-200 bg-white shadow-lg dark:border-zinc-700 dark:bg-zinc-900", children: [_jsx("div", { className: "border-b border-zinc-100 p-1.5 dark:border-zinc-800", children: _jsx("input", { type: "text", autoFocus: true, placeholder: "\u641C\u7D22 capability...", value: filter, onChange: (e) => setFilter(e.target.value), className: "w-full rounded border border-zinc-200 bg-white px-2 py-1 text-[11px] placeholder-zinc-400 focus:border-indigo-400 focus:outline-none dark:border-zinc-700 dark:bg-zinc-900" }) }), _jsx("div", { className: "max-h-48 overflow-y-auto p-1", children: filtered.length === 0 ? (_jsx("p", { className: "px-2 py-2 text-center text-[10px] text-zinc-400", children: "\u65E0\u5339\u914D capability" })) : (filtered.map((cap) => (_jsxs("button", { type: "button", onClick: () => handleSelect(cap.name), className: "block w-full rounded px-2 py-1 text-left transition-colors hover:bg-indigo-50 dark:hover:bg-indigo-950/30", children: [_jsx("span", { className: "block font-mono text-[10px] font-medium text-zinc-700 dark:text-zinc-300", children: cap.name }), _jsx("span", { className: "block truncate text-[9px] text-zinc-500 dark:text-zinc-400", children: cap.description })] }, cap.name)))) })] }))] }));
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=WorkflowEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowEditor.js","sourceRoot":"","sources":["../../src/components/WorkflowEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowTemplates - 工作流模板选择器(W11.4)
|
|
3
|
+
*
|
|
4
|
+
* 展示 5 个内置模板,点击即应用到当前工作流(替换现有 nodes)。
|
|
5
|
+
* 适合新用户快速上手,无需从零编排。
|
|
6
|
+
*
|
|
7
|
+
* 集成位置:
|
|
8
|
+
* - 可作为独立组件渲染(如在 Inspector 底部或 Command Palette 中)
|
|
9
|
+
* - Workspace 默认不渲染;由消费方按需挂载
|
|
10
|
+
*
|
|
11
|
+
* @module WorkflowTemplates
|
|
12
|
+
*/
|
|
13
|
+
import * as React from 'react';
|
|
14
|
+
import { type WorkflowTemplate } from '../data/workflow-templates.js';
|
|
15
|
+
export interface WorkflowTemplatesProps {
|
|
16
|
+
className?: string;
|
|
17
|
+
/** 应用模板前是否需要确认(当前有节点时默认 true) */
|
|
18
|
+
confirmIfNotEmpty?: boolean;
|
|
19
|
+
/** 模板应用后的回调 */
|
|
20
|
+
onApply?: (template: WorkflowTemplate) => void;
|
|
21
|
+
}
|
|
22
|
+
export declare function WorkflowTemplates({ className, confirmIfNotEmpty, onApply, }: WorkflowTemplatesProps): React.JSX.Element;
|
|
23
|
+
//# sourceMappingURL=WorkflowTemplates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowTemplates.d.ts","sourceRoot":"","sources":["../../src/components/WorkflowTemplates.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAE1F,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe;IACf,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAChD;AAED,wBAAgB,iBAAiB,CAAC,EAChC,SAAc,EACd,iBAAwB,EACxB,OAAO,GACR,EAAE,sBAAsB,qBAsExB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* WorkflowTemplates - 工作流模板选择器(W11.4)
|
|
4
|
+
*
|
|
5
|
+
* 展示 5 个内置模板,点击即应用到当前工作流(替换现有 nodes)。
|
|
6
|
+
* 适合新用户快速上手,无需从零编排。
|
|
7
|
+
*
|
|
8
|
+
* 集成位置:
|
|
9
|
+
* - 可作为独立组件渲染(如在 Inspector 底部或 Command Palette 中)
|
|
10
|
+
* - Workspace 默认不渲染;由消费方按需挂载
|
|
11
|
+
*
|
|
12
|
+
* @module WorkflowTemplates
|
|
13
|
+
*/
|
|
14
|
+
import * as React from 'react';
|
|
15
|
+
import { Icon } from '@lokvis/ui-core';
|
|
16
|
+
import { useWorkspaceStore } from '../store/index.js';
|
|
17
|
+
import { WORKFLOW_TEMPLATES } from '../data/workflow-templates.js';
|
|
18
|
+
export function WorkflowTemplates({ className = '', confirmIfNotEmpty = true, onApply, }) {
|
|
19
|
+
const loadWorkflowTemplate = useWorkspaceStore((s) => s.loadWorkflowTemplate);
|
|
20
|
+
const nodes = useWorkspaceStore((s) => s.nodes);
|
|
21
|
+
const handleApply = (tpl) => {
|
|
22
|
+
if (confirmIfNotEmpty && nodes.length > 0) {
|
|
23
|
+
if (!window.confirm(`应用模板「${tpl.name}」将替换当前 ${nodes.length} 个节点,继续?`)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
loadWorkflowTemplate(tpl.nodes.map((n) => ({ capability: n.capability, params: n.params })));
|
|
28
|
+
onApply?.(tpl);
|
|
29
|
+
};
|
|
30
|
+
return (_jsxs("div", { className: `flex flex-col ${className}`, role: "region", "aria-label": "\u5DE5\u4F5C\u6D41\u6A21\u677F", children: [_jsxs("div", { className: "flex items-center justify-between px-3 py-2 border-b border-zinc-200 dark:border-zinc-800", children: [_jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-zinc-400", children: "Templates" }), _jsxs("span", { className: "text-[10px] text-zinc-400", children: [WORKFLOW_TEMPLATES.length, " \u5185\u7F6E"] })] }), _jsx("div", { className: "grid grid-cols-1 gap-1.5 p-2", children: WORKFLOW_TEMPLATES.map((tpl) => (_jsxs("button", { type: "button", onClick: () => handleApply(tpl), className: "group flex items-start gap-2 rounded-md border border-zinc-200 bg-white px-2.5 py-2 text-left transition-all hover:border-indigo-300 hover:bg-indigo-50/50 dark:border-zinc-700 dark:bg-zinc-900 dark:hover:border-indigo-700 dark:hover:bg-indigo-950/30", children: [_jsx("span", { className: "mt-0.5 text-base leading-none", children: tpl.icon }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center justify-between gap-1", children: [_jsx("span", { className: "truncate text-[11px] font-medium text-zinc-700 dark:text-zinc-300", children: tpl.name }), _jsxs("span", { className: "shrink-0 rounded bg-zinc-100 px-1 py-0.5 text-[9px] font-medium uppercase text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400", children: [tpl.nodes.length, " \u6B65"] })] }), _jsx("p", { className: "mt-0.5 truncate text-[10px] text-zinc-500 dark:text-zinc-400", children: tpl.description }), _jsx("div", { className: "mt-1 flex flex-wrap items-center gap-0.5", children: tpl.nodes.map((n, i) => (_jsxs(React.Fragment, { children: [i > 0 && (_jsx(Icon, { size: 8, className: "text-zinc-300 dark:text-zinc-600", children: _jsx("path", { d: "m5 5 5 5-5 5" }) })), _jsx("code", { className: "rounded bg-zinc-100 px-1 py-0.5 text-[9px] text-zinc-600 dark:bg-zinc-800 dark:text-zinc-400", children: n.capability })] }, i))) })] })] }, tpl.id))) })] }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=WorkflowTemplates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowTemplates.js","sourceRoot":"","sources":["../../src/components/WorkflowTemplates.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;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,kBAAkB,EAAyB,MAAM,+BAA+B,CAAC;AAU1F,MAAM,UAAU,iBAAiB,CAAC,EAChC,SAAS,GAAG,EAAE,EACd,iBAAiB,GAAG,IAAI,EACxB,OAAO,GACgB;IACvB,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,WAAW,GAAG,CAAC,GAAqB,EAAE,EAAE;QAC5C,IAAI,iBAAiB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,IAAI,UAAU,KAAK,CAAC,MAAM,UAAU,CAAC,EAAE,CAAC;gBACtE,OAAO;YACT,CAAC;QACH,CAAC;QACD,oBAAoB,CAClB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CACvE,CAAC;QACF,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,iBAAiB,SAAS,EAAE,EACvC,IAAI,EAAC,QAAQ,gBACF,gCAAO,aAElB,eAAK,SAAS,EAAC,2FAA2F,aACxG,eAAM,SAAS,EAAC,kEAAkE,0BAE3E,EACP,gBAAM,SAAS,EAAC,2BAA2B,aAAE,kBAAkB,CAAC,MAAM,qBAAW,IAC7E,EACN,cAAK,SAAS,EAAC,8BAA8B,YAC1C,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAC/B,kBAEE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAC/B,SAAS,EAAC,2PAA2P,aAErQ,eAAM,SAAS,EAAC,+BAA+B,YAAE,GAAG,CAAC,IAAI,GAAQ,EACjE,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,yCAAyC,aACtD,eAAM,SAAS,EAAC,mEAAmE,YAChF,GAAG,CAAC,IAAI,GACJ,EACP,gBAAM,SAAS,EAAC,6HAA6H,aAC1I,GAAG,CAAC,KAAK,CAAC,MAAM,eACZ,IACH,EACN,YAAG,SAAS,EAAC,8DAA8D,YACxE,GAAG,CAAC,WAAW,GACd,EAEJ,cAAK,SAAS,EAAC,0CAA0C,YACtD,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACvB,MAAC,KAAK,CAAC,QAAQ,eACZ,CAAC,GAAG,CAAC,IAAI,CACR,KAAC,IAAI,IAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAC,kCAAkC,YACzD,eAAM,CAAC,EAAC,cAAc,GAAG,GACpB,CACR,EACD,eAAM,SAAS,EAAC,8FAA8F,YAC3G,CAAC,CAAC,UAAU,GACR,KARY,CAAC,CASL,CAClB,CAAC,GACE,IACF,KAjCD,GAAG,CAAC,EAAE,CAkCJ,CACV,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Workspace - 完整工作台组件
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* W9 布局:
|
|
5
|
+
* ┌──────────────────────────────────────────────┐
|
|
6
|
+
* │ Toolbar │
|
|
7
|
+
* ├──────┬──────────────┬───────────────────────┤
|
|
8
|
+
* │Asset │ Canvas │ Inspector │
|
|
9
|
+
* │Panel │ (center) │ (right) │
|
|
10
|
+
* ├──────┴──────────────┴───────────────────────┤
|
|
11
|
+
* │ PipelineBar │
|
|
12
|
+
* ├──────────────────────────────────────────────┤
|
|
13
|
+
* │ HistoryPanel (horizontal, W9.1) │
|
|
14
|
+
* ├──────────────────────────────────────────────┤
|
|
15
|
+
* │ DownloadPanel (W9.5,条件渲染) │
|
|
16
|
+
* ├──────────────────────────────────────────────┤
|
|
17
|
+
* │ StatusBar │
|
|
18
|
+
* └──────────────────────────────────────────────┘
|
|
19
|
+
*
|
|
20
|
+
* W9 集成:
|
|
21
|
+
* - 9.1 HistoryPanel 移到底部(horizontal variant)
|
|
22
|
+
* - 9.2 CommandPalette(⌘K)挂载在 Workspace 内
|
|
23
|
+
* - 9.3 GlobalDropzone 全屏拖拽 + MIME 校验
|
|
24
|
+
* - 9.4 Canvas 内置 CompareSlider(before/after)
|
|
25
|
+
* - 9.5 DownloadPanel 在 HistoryPanel 下方,有 outputs 时显示
|
|
26
|
+
* - 9.6 StatusBar 已增强(当前工具/进度/在线)
|
|
27
|
+
* - 9.7 ThemeToggle 通过 Toolbar rightExtra 挂载
|
|
28
|
+
* - 9.8 响应式:移动端折叠为 drawer 模式
|
|
29
|
+
*
|
|
5
30
|
* 通过 useLokvis 自动初始化 Runtime 与插件。
|
|
6
31
|
*
|
|
7
32
|
* @example
|
|
@@ -12,13 +37,34 @@
|
|
|
12
37
|
* <Workspace plugins={[imageToolsPlugin()]} />
|
|
13
38
|
* ```
|
|
14
39
|
*/
|
|
40
|
+
import * as React from 'react';
|
|
15
41
|
import { type UseLokvisOptions } from '../hooks/useLokvis.js';
|
|
16
42
|
export interface WorkspaceProps extends UseLokvisOptions {
|
|
17
43
|
/** 顶部标题 */
|
|
18
44
|
title?: string;
|
|
19
45
|
/** 是否显示状态栏(默认 true) */
|
|
20
46
|
showStatusBar?: boolean;
|
|
47
|
+
/** 是否显示历史面板(默认 true,W7.1) */
|
|
48
|
+
showHistoryPanel?: boolean;
|
|
49
|
+
/** 是否启用全屏拖拽导入(默认 true,W9.3) */
|
|
50
|
+
enableGlobalDropzone?: boolean;
|
|
51
|
+
/** 是否启用 Command Palette ⌘K(默认 true,W9.2) */
|
|
52
|
+
enableCommandPalette?: boolean;
|
|
53
|
+
/** 是否启用 ThemeToggle(默认 true,W9.7) */
|
|
54
|
+
enableThemeToggle?: boolean;
|
|
55
|
+
/** 是否启用 CompareSlider(默认 true,W9.4) */
|
|
56
|
+
enableCompare?: boolean;
|
|
57
|
+
/** 是否启用 DownloadPanel(默认 true,W9.5) */
|
|
58
|
+
enableDownloadPanel?: boolean;
|
|
59
|
+
/** 是否启用拖拽式 WorkflowEditor(默认 false,W10.4;关闭则用只读 PipelineBar) */
|
|
60
|
+
enableWorkflowEditor?: boolean;
|
|
61
|
+
/** 是否启用 ProgressBar + Cancel 按钮(默认 true,W11.6) */
|
|
62
|
+
enableProgressBar?: boolean;
|
|
63
|
+
/** 是否启用 ErrorBanner 错误信息横幅(默认 true,W11.3) */
|
|
64
|
+
enableErrorBanner?: boolean;
|
|
65
|
+
/** 是否从 URL ?workflow= 参数加载分享工作流(默认 true,W11.5) */
|
|
66
|
+
enableShareLink?: boolean;
|
|
21
67
|
className?: string;
|
|
22
68
|
}
|
|
23
|
-
export declare function Workspace({ title, showStatusBar, className, ...lokvisOptions }: WorkspaceProps):
|
|
69
|
+
export declare function Workspace({ title, showStatusBar, showHistoryPanel, enableGlobalDropzone, enableCommandPalette, enableThemeToggle, enableCompare, enableDownloadPanel, enableWorkflowEditor, enableProgressBar, enableErrorBanner, enableShareLink, className, ...lokvisOptions }: WorkspaceProps): React.JSX.Element;
|
|
24
70
|
//# sourceMappingURL=Workspace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../src/components/Workspace.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../src/components/Workspace.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAmBzE,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6BAA6B;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,+BAA+B;IAC/B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,4CAA4C;IAC5C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uCAAuC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uCAAuC;IACvC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gEAAgE;IAChE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kDAAkD;IAClD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAoB,EACpB,gBAAuB,EACvB,oBAA2B,EAC3B,oBAA2B,EAC3B,iBAAwB,EACxB,aAAoB,EACpB,mBAA0B,EAC1B,oBAA4B,EAC5B,iBAAwB,EACxB,iBAAwB,EACxB,eAAsB,EACtB,SAAc,EACd,GAAG,aAAa,EACjB,EAAE,cAAc,qBAoLhB"}
|