@lokvis/ui-react 0.2.1 → 0.4.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/dist/components/AssetPanel.d.ts.map +1 -1
- package/dist/components/AssetPanel.js +18 -62
- package/dist/components/AssetPanel.js.map +1 -1
- package/dist/components/Canvas.d.ts +4 -4
- package/dist/components/Canvas.d.ts.map +1 -1
- package/dist/components/Canvas.js +9 -9
- package/dist/components/Canvas.js.map +1 -1
- package/dist/components/CommandPalette.d.ts +7 -7
- package/dist/components/CommandPalette.d.ts.map +1 -1
- package/dist/components/CommandPalette.js +10 -10
- package/dist/components/CommandPalette.js.map +1 -1
- package/dist/components/CompareSlider.d.ts +9 -8
- package/dist/components/CompareSlider.d.ts.map +1 -1
- package/dist/components/CompareSlider.js +10 -9
- package/dist/components/CompareSlider.js.map +1 -1
- package/dist/components/DownloadPanel.d.ts +3 -3
- package/dist/components/DownloadPanel.d.ts.map +1 -1
- package/dist/components/DownloadPanel.js +10 -17
- package/dist/components/DownloadPanel.js.map +1 -1
- package/dist/components/ErrorBanner.d.ts +2 -2
- package/dist/components/ErrorBanner.d.ts.map +1 -1
- package/dist/components/ErrorBanner.js +3 -3
- package/dist/components/ErrorBanner.js.map +1 -1
- package/dist/components/ErrorBoundary.d.ts +40 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +52 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/ExifPanel.d.ts +1 -1
- package/dist/components/ExifPanel.d.ts.map +1 -1
- package/dist/components/ExifPanel.js +2 -2
- package/dist/components/ExifPanel.js.map +1 -1
- package/dist/components/GlobalDropzone.d.ts +5 -5
- package/dist/components/GlobalDropzone.d.ts.map +1 -1
- package/dist/components/GlobalDropzone.js +15 -8
- package/dist/components/GlobalDropzone.js.map +1 -1
- package/dist/components/HistoryPanel.d.ts +2 -2
- package/dist/components/HistoryPanel.d.ts.map +1 -1
- package/dist/components/HistoryPanel.js +23 -23
- package/dist/components/HistoryPanel.js.map +1 -1
- package/dist/components/Inspector.d.ts.map +1 -1
- package/dist/components/Inspector.js +13 -10
- package/dist/components/Inspector.js.map +1 -1
- package/dist/components/ParamForm.d.ts.map +1 -1
- package/dist/components/ParamForm.js +10 -7
- package/dist/components/ParamForm.js.map +1 -1
- package/dist/components/PipelineBar.d.ts.map +1 -1
- package/dist/components/PipelineBar.js +19 -28
- package/dist/components/PipelineBar.js.map +1 -1
- package/dist/components/ProgressBar.d.ts +4 -4
- package/dist/components/ProgressBar.d.ts.map +1 -1
- package/dist/components/ProgressBar.js +8 -8
- package/dist/components/ProgressBar.js.map +1 -1
- package/dist/components/StatusBar.d.ts +3 -3
- package/dist/components/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar.js +12 -21
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/components/StatusDot.d.ts +12 -0
- package/dist/components/StatusDot.d.ts.map +1 -0
- package/dist/components/StatusDot.js +15 -0
- package/dist/components/StatusDot.js.map +1 -0
- package/dist/components/ThemeToggle.d.ts +4 -4
- package/dist/components/ThemeToggle.d.ts.map +1 -1
- package/dist/components/ThemeToggle.js +7 -7
- package/dist/components/ThemeToggle.js.map +1 -1
- package/dist/components/ToolRunner.d.ts +53 -0
- package/dist/components/ToolRunner.d.ts.map +1 -0
- package/dist/components/ToolRunner.js +142 -0
- package/dist/components/ToolRunner.js.map +1 -0
- package/dist/components/Toolbar.d.ts.map +1 -1
- package/dist/components/Toolbar.js +3 -3
- package/dist/components/Toolbar.js.map +1 -1
- package/dist/components/WorkflowEditor.d.ts +6 -6
- package/dist/components/WorkflowEditor.d.ts.map +1 -1
- package/dist/components/WorkflowEditor.js +40 -49
- package/dist/components/WorkflowEditor.js.map +1 -1
- package/dist/components/WorkflowTemplates.d.ts +2 -2
- package/dist/components/WorkflowTemplates.d.ts.map +1 -1
- package/dist/components/WorkflowTemplates.js +17 -7
- package/dist/components/WorkflowTemplates.js.map +1 -1
- package/dist/components/Workspace.d.ts +45 -23
- package/dist/components/Workspace.d.ts.map +1 -1
- package/dist/components/Workspace.js +87 -40
- package/dist/components/Workspace.js.map +1 -1
- package/dist/hooks/useCustomPresets.d.ts +98 -0
- package/dist/hooks/useCustomPresets.d.ts.map +1 -0
- package/dist/hooks/useCustomPresets.js +210 -0
- package/dist/hooks/useCustomPresets.js.map +1 -0
- package/dist/hooks/useLokvis.d.ts +19 -1
- package/dist/hooks/useLokvis.d.ts.map +1 -1
- package/dist/hooks/useLokvis.js +30 -9
- package/dist/hooks/useLokvis.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/store/assets-slice.d.ts +8 -1
- package/dist/store/assets-slice.d.ts.map +1 -1
- package/dist/store/assets-slice.js +101 -54
- package/dist/store/assets-slice.js.map +1 -1
- package/dist/store/capabilities-slice.d.ts +1 -1
- package/dist/store/capabilities-slice.d.ts.map +1 -1
- package/dist/store/capabilities-slice.js +8 -1
- package/dist/store/capabilities-slice.js.map +1 -1
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/runtime-slice.d.ts.map +1 -1
- package/dist/store/runtime-slice.js +22 -16
- package/dist/store/runtime-slice.js.map +1 -1
- package/dist/store/subscribe-utils.d.ts +45 -0
- package/dist/store/subscribe-utils.d.ts.map +1 -0
- package/dist/store/subscribe-utils.js +69 -0
- package/dist/store/subscribe-utils.js.map +1 -0
- package/dist/store/types.d.ts +19 -11
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/types.js +0 -10
- 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 +19 -51
- package/dist/store/workflow-slice.js.map +1 -1
- package/dist/utils.d.ts +24 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +31 -0
- package/dist/utils.js.map +1 -0
- package/package.json +7 -6
- package/src/components/AssetPanel.tsx +224 -264
- package/src/components/Canvas.tsx +178 -174
- package/src/components/CommandPalette.tsx +242 -242
- package/src/components/CompareSlider.tsx +168 -165
- package/src/components/DownloadPanel.tsx +201 -207
- package/src/components/ErrorBanner.tsx +64 -64
- package/src/components/ErrorBoundary.tsx +101 -0
- package/src/components/ExifPanel.tsx +154 -154
- package/src/components/GlobalDropzone.tsx +175 -170
- package/src/components/HistoryPanel.tsx +219 -219
- package/src/components/Inspector.tsx +145 -137
- package/src/components/ParamForm.tsx +140 -137
- package/src/components/PipelineBar.tsx +97 -104
- package/src/components/ProgressBar.tsx +78 -78
- package/src/components/StatusBar.tsx +145 -152
- package/src/components/StatusDot.tsx +27 -0
- package/src/components/ThemeToggle.tsx +98 -98
- package/src/components/ToolRunner.tsx +352 -0
- package/src/components/Toolbar.tsx +65 -65
- package/src/components/WorkflowEditor.tsx +333 -326
- package/src/components/WorkflowTemplates.tsx +101 -78
- package/src/components/Workspace.tsx +310 -223
- package/src/css-modules.d.ts +3 -0
- package/src/hooks/useCustomPresets.ts +284 -0
- package/src/hooks/useLokvis.ts +43 -10
- package/src/index.ts +7 -0
- package/src/store/assets-slice.ts +106 -52
- package/src/store/capabilities-slice.ts +10 -2
- package/src/store/index.ts +1 -1
- package/src/store/runtime-slice.ts +20 -15
- package/src/store/subscribe-utils.ts +82 -0
- package/src/store/types.ts +19 -12
- package/src/store/workflow-slice.ts +19 -53
- package/src/utils.ts +41 -0
- package/dist/store.d.ts +0 -76
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -217
- package/dist/store.js.map +0 -1
|
@@ -3,9 +3,9 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
* DownloadPanel - 工作流输出下载面板(W9.5)
|
|
4
4
|
*
|
|
5
5
|
* 展示上次工作流执行的输出资产,提供:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* - 单项下载(从 runtime.exportAsset 取 blob,触发浏览器下载)
|
|
7
|
+
* - 全部下载(逐项触发,BATCH_DOWNLOAD_DELAY_MS 间隔,避免浏览器拦截;长期方案见该常量注释)
|
|
8
|
+
* - 清空输出列表
|
|
9
9
|
*
|
|
10
10
|
* 与 apps/playground 的 DownloadManager(独立工具页)不同:本组件是 Workspace
|
|
11
11
|
* 内嵌的轻量面板,数据来自 store.lastOutputIds(由 workflow-slice.run 写入)。
|
|
@@ -16,14 +16,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
16
16
|
import * as React from 'react';
|
|
17
17
|
import { Icon } from '@lokvis/ui-core';
|
|
18
18
|
import { useWorkspaceStore } from '../store/index.js';
|
|
19
|
-
|
|
20
|
-
function formatBytes(bytes) {
|
|
21
|
-
if (bytes < 1024)
|
|
22
|
-
return `${bytes} B`;
|
|
23
|
-
if (bytes < 1024 * 1024)
|
|
24
|
-
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
25
|
-
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
26
|
-
}
|
|
19
|
+
import { formatBytes } from '../utils.js';
|
|
27
20
|
/**
|
|
28
21
|
* 批量下载时每项之间的延迟毫秒数。
|
|
29
22
|
*
|
|
@@ -115,7 +108,7 @@ export function DownloadPanel({ className = '' }) {
|
|
|
115
108
|
setStatus('Downloading outputs...');
|
|
116
109
|
// 用本地 Set 跟踪本次循环已下载 id,避免 downloaded 闭包快照与 state 不同步
|
|
117
110
|
// (review 反馈:循环中 setDownloaded 更新 state 但闭包 downloaded 不变,
|
|
118
|
-
//
|
|
111
|
+
// 虽有 batchDownloading guard 阻止并发,逻辑上仍应读取最新已下载集合)
|
|
119
112
|
const localDownloaded = new Set(downloaded);
|
|
120
113
|
try {
|
|
121
114
|
for (const asset of outputAssets) {
|
|
@@ -158,12 +151,12 @@ export function DownloadPanel({ className = '' }) {
|
|
|
158
151
|
}
|
|
159
152
|
if (outputAssets.length === 0)
|
|
160
153
|
return null;
|
|
161
|
-
return (_jsxs("div", { className: `flex flex-col border-t border-
|
|
154
|
+
return (_jsxs("div", { className: `flex flex-col border-t border-[var(--lokvis-border)] bg-[var(--lokvis-surface)] ${className}`, "aria-label": "Outputs panel", children: [_jsxs("div", { className: "flex items-center justify-between px-3 h-9 shrink-0 border-b border-[var(--lokvis-border)]", children: [_jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-[var(--lokvis-fg-subtle)]", children: "Outputs" }), _jsxs("span", { className: "text-[11px] tabular-nums text-[var(--lokvis-fg-subtle)]", children: [downloadedCount, "/", outputAssets.length, " \u00B7 ", formatBytes(totalSize)] })] }), _jsxs("div", { className: "flex items-center gap-2 px-3 py-2 overflow-x-auto", children: [outputAssets.map((asset) => {
|
|
162
155
|
const isDownloaded = downloaded.has(asset.id);
|
|
163
156
|
const dims = asset.metadata.dimensions;
|
|
164
|
-
return (_jsxs("div", { className: "flex shrink-0 flex-col gap-1 rounded-md border border-
|
|
165
|
-
? 'bg-
|
|
166
|
-
: 'bg-
|
|
167
|
-
}), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [_jsx("button", { type: "button", onClick: () => void handleDownloadAll(), disabled: batchDownloading || allDownloaded, className: "rounded-md bg-
|
|
157
|
+
return (_jsxs("div", { className: "flex shrink-0 flex-col gap-1 rounded-md border border-[var(--lokvis-border)] p-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "rounded bg-[var(--lokvis-surface-muted)] px-1 py-0.5 text-[9px] font-medium text-[var(--lokvis-fg-muted)]", children: asset.metadata.format.toUpperCase() }), dims && (_jsxs("span", { className: "text-[10px] text-[var(--lokvis-fg-muted)] tabular-nums", children: [dims.width, "\u00D7", dims.height] })), _jsx("span", { className: "text-[10px] text-[var(--lokvis-fg-subtle)] tabular-nums", children: formatBytes(asset.metadata.size) })] }), _jsx("div", { className: "flex items-center gap-1", children: _jsxs("button", { type: "button", onClick: () => void handleDownloadOne(asset.id), className: `flex items-center gap-1 rounded px-2 py-0.5 text-[10px] font-medium transition-colors ${isDownloaded
|
|
158
|
+
? 'bg-[var(--lokvis-success)]/15 text-[var(--lokvis-success)]'
|
|
159
|
+
: 'bg-[var(--lokvis-primary)]/15 text-[var(--lokvis-primary)] hover:bg-[var(--lokvis-primary)]/25'}`, children: [_jsx(Icon, { size: 10, strokeWidth: 2, children: _jsx("path", { d: "M12 3v12m0 0l-4-4m4 4l4-4M3 17v2a2 2 0 002 2h14a2 2 0 002-2v-2" }) }), isDownloaded ? 'Downloaded' : 'Download'] }) })] }, asset.id));
|
|
160
|
+
}), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [_jsx("button", { type: "button", onClick: () => void handleDownloadAll(), disabled: batchDownloading || allDownloaded, className: "rounded-md bg-[var(--lokvis-primary-hover)] px-2.5 py-1 text-[10px] font-medium text-[var(--lokvis-primary-fg)] hover:bg-[var(--lokvis-primary)] disabled:cursor-not-allowed disabled:opacity-50", children: batchDownloading ? 'Downloading...' : 'Download All' }), _jsx("button", { type: "button", onClick: handleClear, className: "rounded-md px-2 py-1 text-[10px] text-[var(--lokvis-fg-muted)] hover:bg-[var(--lokvis-surface-muted)] hover:text-[var(--lokvis-fg-muted)]", children: "Clear" })] })] }), error && (_jsx("p", { className: "px-3 pb-2 text-[10px] text-[var(--lokvis-danger)]", role: "alert", children: error }))] }));
|
|
168
161
|
}
|
|
169
162
|
//# sourceMappingURL=DownloadPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloadPanel.js","sourceRoot":"","sources":["../../src/components/DownloadPanel.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"DownloadPanel.js","sourceRoot":"","sources":["../../src/components/DownloadPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBanner.d.ts","sourceRoot":"","sources":["../../src/components/ErrorBanner.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,gBAAgB;
|
|
1
|
+
{"version":3,"file":"ErrorBanner.d.ts","sourceRoot":"","sources":["../../src/components/ErrorBanner.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,gBAAgB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAc,EAAE,EAAE,gBAAgB,4BAqE/D"}
|
|
@@ -3,8 +3,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
* ErrorBanner - 错误信息横幅(W11.3)
|
|
4
4
|
*
|
|
5
5
|
* 当 store.error 非空时显示,展示错误信息并提供:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* - 关闭按钮(清除 error)
|
|
7
|
+
* - 重试按钮(重新执行工作流)
|
|
8
8
|
*
|
|
9
9
|
* 节点失败高亮由 WorkflowEditor 的节点状态颜色处理(已实现);
|
|
10
10
|
* 本组件负责全局错误信息的可见性。
|
|
@@ -42,6 +42,6 @@ export function ErrorBanner({ className = '' }) {
|
|
|
42
42
|
if (!visible || !error)
|
|
43
43
|
return null;
|
|
44
44
|
const canRetry = nodes.length > 0 && !running;
|
|
45
|
-
return (_jsxs("div", { className: `flex items-start gap-2 border-b border-
|
|
45
|
+
return (_jsxs("div", { className: `flex items-start gap-2 border-b border-[var(--lokvis-danger)]/30 bg-[var(--lokvis-danger)]/10 px-3 py-2 ${className}`, role: "alert", children: [_jsxs(Icon, { size: 14, className: "mt-0.5 shrink-0 text-[var(--lokvis-danger)]", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "12", y1: "8", x2: "12", y2: "12" }), _jsx("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })] }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("p", { className: "text-[11px] font-medium text-[var(--lokvis-danger)]", children: "\u6267\u884C\u51FA\u9519" }), _jsx("p", { className: "mt-0.5 break-words text-[10px] text-[var(--lokvis-danger)]/80", children: error })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [canRetry && (_jsx("button", { type: "button", onClick: handleRetry, className: "rounded bg-[var(--lokvis-danger)]/15 px-2 py-0.5 text-[10px] font-medium text-[var(--lokvis-danger)] transition-colors hover:bg-[var(--lokvis-danger)]/30", children: "\u91CD\u8BD5" })), _jsx("button", { type: "button", onClick: handleDismiss, "aria-label": "\u5173\u95ED\u9519\u8BEF\u4FE1\u606F", className: "rounded p-0.5 text-[var(--lokvis-danger)] transition-colors hover:bg-[var(--lokvis-danger)]/15 hover:text-[var(--lokvis-danger)]", children: _jsx(Icon, { size: 12, strokeWidth: 3, children: _jsx("path", { d: "M6 18L18 6M6 6l12 12" }) }) })] })] }));
|
|
46
46
|
}
|
|
47
47
|
//# sourceMappingURL=ErrorBanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBanner.js","sourceRoot":"","sources":["../../src/components/ErrorBanner.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,GAAG,EAAE,EAAoB;
|
|
1
|
+
{"version":3,"file":"ErrorBanner.js","sourceRoot":"","sources":["../../src/components/ErrorBanner.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ErrorBoundary - React 错误边界(D6)
|
|
3
|
+
*
|
|
4
|
+
* 捕获子组件树渲染期间的运行时异常,避免整个 Workspace 白屏。
|
|
5
|
+
* 必须是 class 组件(React 错误边界 API 仅支持 class)。
|
|
6
|
+
*
|
|
7
|
+
* 设计:
|
|
8
|
+
* - 默认 fallback 使用 lokvis token,与 Workspace 错误态视觉一致
|
|
9
|
+
* - 可选 fallback 渲染 prop(消费方自定义 UI)
|
|
10
|
+
* - 可选 onError 回调(上报等);默认 console.error,不引入 sentry 等
|
|
11
|
+
* app 层依赖,保持 ui-react 包架构纯净(不反向依赖消费方)
|
|
12
|
+
* - reset() 清空 error 状态,尝试重新渲染子树
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <ErrorBoundary>
|
|
17
|
+
* <Workspace plugins={[...]} />
|
|
18
|
+
* </ErrorBoundary>
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import * as React from 'react';
|
|
22
|
+
export interface ErrorBoundaryProps {
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
/** 自定义 fallback;不传则用默认 UI */
|
|
25
|
+
fallback?: (error: Error, reset: () => void) => React.ReactNode;
|
|
26
|
+
/** 错误回调(上报等),不传则 console.error */
|
|
27
|
+
onError?: (error: Error, info: React.ErrorInfo) => void;
|
|
28
|
+
}
|
|
29
|
+
interface State {
|
|
30
|
+
error: Error | null;
|
|
31
|
+
}
|
|
32
|
+
export declare class ErrorBoundary extends React.Component<ErrorBoundaryProps, State> {
|
|
33
|
+
state: State;
|
|
34
|
+
static getDerivedStateFromError(error: Error): State;
|
|
35
|
+
componentDidCatch(error: Error, info: React.ErrorInfo): void;
|
|
36
|
+
reset: () => void;
|
|
37
|
+
render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=ErrorBoundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/components/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC;IAChE,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;CACxD;AAED,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACpB;AAED,qBAAa,aAAc,SAAQ,KAAK,CAAC,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC;IAC5E,KAAK,EAAE,KAAK,CAAmB;IAE/B,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAIpD,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS;IAQrD,KAAK,aAEH;IAEF,MAAM;CASN"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ErrorBoundary - React 错误边界(D6)
|
|
4
|
+
*
|
|
5
|
+
* 捕获子组件树渲染期间的运行时异常,避免整个 Workspace 白屏。
|
|
6
|
+
* 必须是 class 组件(React 错误边界 API 仅支持 class)。
|
|
7
|
+
*
|
|
8
|
+
* 设计:
|
|
9
|
+
* - 默认 fallback 使用 lokvis token,与 Workspace 错误态视觉一致
|
|
10
|
+
* - 可选 fallback 渲染 prop(消费方自定义 UI)
|
|
11
|
+
* - 可选 onError 回调(上报等);默认 console.error,不引入 sentry 等
|
|
12
|
+
* app 层依赖,保持 ui-react 包架构纯净(不反向依赖消费方)
|
|
13
|
+
* - reset() 清空 error 状态,尝试重新渲染子树
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <ErrorBoundary>
|
|
18
|
+
* <Workspace plugins={[...]} />
|
|
19
|
+
* </ErrorBoundary>
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import * as React from 'react';
|
|
23
|
+
export class ErrorBoundary extends React.Component {
|
|
24
|
+
state = { error: null };
|
|
25
|
+
static getDerivedStateFromError(error) {
|
|
26
|
+
return { error };
|
|
27
|
+
}
|
|
28
|
+
componentDidCatch(error, info) {
|
|
29
|
+
if (this.props.onError) {
|
|
30
|
+
this.props.onError(error, info);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.error('[lokvis ErrorBoundary]', error, info.componentStack);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
reset = () => {
|
|
37
|
+
this.setState({ error: null });
|
|
38
|
+
};
|
|
39
|
+
render() {
|
|
40
|
+
if (this.state.error) {
|
|
41
|
+
if (this.props.fallback) {
|
|
42
|
+
return this.props.fallback(this.state.error, this.reset);
|
|
43
|
+
}
|
|
44
|
+
return _jsx(DefaultFallback, { error: this.state.error, onReset: this.reset });
|
|
45
|
+
}
|
|
46
|
+
return this.props.children;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function DefaultFallback({ error, onReset }) {
|
|
50
|
+
return (_jsx("div", { className: "flex h-full w-full items-center justify-center p-6", role: "alert", children: _jsxs("div", { className: "max-w-md rounded-xl border border-[var(--lokvis-danger)]/30 bg-[var(--lokvis-surface)] p-6 text-center shadow-[var(--lokvis-elevation-2)]", children: [_jsx("div", { className: "mx-auto mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-[var(--lokvis-danger)]/15", children: _jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-[var(--lokvis-danger)]", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "12", y1: "8", x2: "12", y2: "12" }), _jsx("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })] }) }), _jsx("p", { className: "font-semibold text-[var(--lokvis-fg)]", children: "Something went wrong" }), _jsx("p", { className: "mt-1.5 break-words text-sm text-[var(--lokvis-fg-muted)]", children: error.message || 'An unexpected error occurred while rendering this panel.' }), _jsx("button", { type: "button", onClick: onReset, className: "mt-4 inline-flex items-center justify-center rounded-lg bg-[var(--lokvis-primary)] px-4 py-2 text-sm font-medium text-[var(--lokvis-primary-fg)] transition-colors hover:bg-[var(--lokvis-primary-hover)]", children: "Try again" })] }) }));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=ErrorBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/components/ErrorBoundary.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,MAAM,OAAO,aAAc,SAAQ,KAAK,CAAC,SAAoC;IAC5E,KAAK,GAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAE/B,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC5C,OAAO,EAAE,KAAK,EAAE,CAAC;IACjB,CAAC;IAED,iBAAiB,CAAC,KAAY,EAAE,IAAqB;QACrD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACpE,CAAC;IACD,CAAC;IAED,KAAK,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM;QACN,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,KAAC,eAAe,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,GAAI,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC3B,CAAC;CACD;AAED,SAAS,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,EAAyC;IACjF,OAAO,CACP,cAAK,SAAS,EAAC,oDAAoD,EAAC,IAAI,EAAC,OAAO,YAChF,eAAK,SAAS,EAAC,2IAA2I,aAC1J,cAAK,SAAS,EAAC,mGAAmG,YAClH,eACA,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,SAAS,EAAC,6BAA6B,aAEvC,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,GAAG,EACjC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACvC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,GAAG,IACrC,GACA,EACN,YAAG,SAAS,EAAC,uCAAuC,qCAAyB,EAC7E,YAAG,SAAS,EAAC,0DAA0D,YACtE,KAAK,CAAC,OAAO,IAAI,0DAA0D,GACxE,EACJ,iBACA,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,2MAA2M,0BAG5M,IACH,GACA,CACL,CAAC;AACH,CAAC"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* - 仅 image 类型 asset 显示;非 image 隐藏整个面板
|
|
15
15
|
* - 缓存:按 assetId 缓存(LRU 上限 16),切换 asset 不重复解析
|
|
16
16
|
* - effect 依赖 selectedAssetId(而非 asset 对象引用),避免 assets 数组
|
|
17
|
-
*
|
|
17
|
+
* 重渲染时触发重复 effect
|
|
18
18
|
* - 取消:effect 重跑/卸载时不更新 state(避免 stale update)
|
|
19
19
|
* - 加载/空态/错误三态明确
|
|
20
20
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExifPanel.d.ts","sourceRoot":"","sources":["../../src/components/ExifPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,cAAc;
|
|
1
|
+
{"version":3,"file":"ExifPanel.d.ts","sourceRoot":"","sources":["../../src/components/ExifPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,cAAc;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD,wBAAgB,SAAS,CAAC,EAAE,SAAc,EAAE,EAAE,cAAc,4BAyJ3D"}
|
|
@@ -15,7 +15,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
15
15
|
* - 仅 image 类型 asset 显示;非 image 隐藏整个面板
|
|
16
16
|
* - 缓存:按 assetId 缓存(LRU 上限 16),切换 asset 不重复解析
|
|
17
17
|
* - effect 依赖 selectedAssetId(而非 asset 对象引用),避免 assets 数组
|
|
18
|
-
*
|
|
18
|
+
* 重渲染时触发重复 effect
|
|
19
19
|
* - 取消:effect 重跑/卸载时不更新 state(避免 stale update)
|
|
20
20
|
* - 加载/空态/错误三态明确
|
|
21
21
|
*/
|
|
@@ -99,6 +99,6 @@ export function ExifPanel({ className = '' }) {
|
|
|
99
99
|
if (!isImage || !selectedAsset)
|
|
100
100
|
return null;
|
|
101
101
|
const rows = exif ? formatExifRows(exif) : [];
|
|
102
|
-
return (_jsxs("div", { className: `shrink-0 border-b border-
|
|
102
|
+
return (_jsxs("div", { className: `shrink-0 border-b border-[var(--lokvis-border)] ${className}`, children: [_jsxs("button", { type: "button", onClick: () => setOpen(!open), className: "flex w-full items-center justify-between px-3 h-[var(--lokvis-panel-header-h)] text-left transition-colors hover:bg-[var(--lokvis-surface)]", "aria-expanded": open, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Icon, { size: 12, className: `text-[var(--lokvis-fg-subtle)] transition-transform ${open ? 'rotate-90' : ''}`, children: _jsx("path", { d: "m9 5 7 7-7 7" }) }), _jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-[var(--lokvis-fg-subtle)]", children: "EXIF" })] }), loading ? (_jsx("span", { className: "text-[10px] text-[var(--lokvis-fg-subtle)]", children: "loading\u2026" })) : exif ? (_jsxs("span", { className: "font-mono text-[10px] text-[var(--lokvis-success)] bg-[var(--lokvis-success)]/10 px-1.5 py-0.5 rounded", children: [rows.length, " fields"] })) : error ? (_jsx("span", { className: "text-[10px] text-[var(--lokvis-danger)]", children: "error" })) : (_jsx("span", { className: "text-[10px] text-[var(--lokvis-fg-subtle)]", children: "none" }))] }), open && (_jsx("div", { className: "px-3 pb-3 max-h-60 overflow-y-auto", children: loading ? (_jsx("div", { className: "py-4 text-center text-[11px] text-[var(--lokvis-fg-subtle)]", children: "Reading EXIF\u2026" })) : error ? (_jsx("div", { className: "py-3 text-center", children: _jsx("p", { className: "text-[11px] text-[var(--lokvis-danger)]", children: error }) })) : rows.length === 0 ? (_jsxs("div", { className: "py-4 text-center", children: [_jsx("p", { className: "text-[11px] text-[var(--lokvis-fg-subtle)]", children: "No EXIF data" }), _jsx("p", { className: "mt-1 text-[10px] text-[var(--lokvis-fg-muted)]", children: "This image has no embedded metadata" })] })) : (_jsx("dl", { className: "space-y-1", children: rows.map((row) => (_jsxs("div", { className: "flex items-baseline justify-between gap-3 text-[11px]", children: [_jsx("dt", { className: "shrink-0 text-[var(--lokvis-fg-subtle)]", children: row.label }), _jsx("dd", { className: "truncate text-right font-mono text-[var(--lokvis-fg-muted)]", children: row.value })] }, row.label))) })) }))] }));
|
|
103
103
|
}
|
|
104
104
|
//# sourceMappingURL=ExifPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExifPanel.js","sourceRoot":"","sources":["../../src/components/ExifPanel.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD,yCAAyC;AACzC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,GAAG,EAAE,EAAkB;
|
|
1
|
+
{"version":3,"file":"ExifPanel.js","sourceRoot":"","sources":["../../src/components/ExifPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
* 通过 `accept` 白名单做 MIME 类型校验,拒绝类型时给出视觉反馈 + 警告。
|
|
6
6
|
*
|
|
7
7
|
* 工作机制:
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* 1. 监听 window dragenter / dragover / dragleave / drop 事件
|
|
9
|
+
* 2. dragenter 显示遮罩,dragleave(离开 window)隐藏
|
|
10
|
+
* 3. drop 时校验文件类型 → 合法则 importFiles,非法则提示拒绝原因
|
|
11
11
|
*
|
|
12
12
|
* MIME 校验:
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* - 默认接受所有 image/* 类型(以及 video/audio/pdf 等,与 workspace 多媒体定位对齐)
|
|
14
|
+
* - 拒绝类型在遮罩中央显示红色提示,并阻止导入
|
|
15
15
|
*
|
|
16
16
|
* 与 AssetPanel / Canvas 内置的局部 dropzone 互不冲突:它们各自处理自己的
|
|
17
17
|
* drop 事件并 `stopPropagation()`,本组件的 window drop 监听不会触发。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalDropzone.d.ts","sourceRoot":"","sources":["../../src/components/GlobalDropzone.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,mBAAmB;
|
|
1
|
+
{"version":3,"file":"GlobalDropzone.d.ts","sourceRoot":"","sources":["../../src/components/GlobalDropzone.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,mBAAmB;IACnC,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA6BD,wBAAgB,cAAc,CAAC,EAC9B,MAAuB,EACvB,SAAc,GACd,EAAE,mBAAmB,4BA0JrB"}
|
|
@@ -6,13 +6,13 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
6
6
|
* 通过 `accept` 白名单做 MIME 类型校验,拒绝类型时给出视觉反馈 + 警告。
|
|
7
7
|
*
|
|
8
8
|
* 工作机制:
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* 1. 监听 window dragenter / dragover / dragleave / drop 事件
|
|
10
|
+
* 2. dragenter 显示遮罩,dragleave(离开 window)隐藏
|
|
11
|
+
* 3. drop 时校验文件类型 → 合法则 importFiles,非法则提示拒绝原因
|
|
12
12
|
*
|
|
13
13
|
* MIME 校验:
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* - 默认接受所有 image/* 类型(以及 video/audio/pdf 等,与 workspace 多媒体定位对齐)
|
|
15
|
+
* - 拒绝类型在遮罩中央显示红色提示,并阻止导入
|
|
16
16
|
*
|
|
17
17
|
* 与 AssetPanel / Canvas 内置的局部 dropzone 互不冲突:它们各自处理自己的
|
|
18
18
|
* drop 事件并 `stopPropagation()`,本组件的 window drop 监听不会触发。
|
|
@@ -65,6 +65,8 @@ export function GlobalDropzone({ accept = DEFAULT_ACCEPT, className = '', }) {
|
|
|
65
65
|
// dragCounter:用计数器而非布尔,避免子元素 dragenter/dragleave 触发抖动
|
|
66
66
|
const [dragCounter, setDragCounter] = React.useState(0);
|
|
67
67
|
const [rejectedFiles, setRejectedFiles] = React.useState([]);
|
|
68
|
+
// W21.6: 持有 rejectedFiles 自动清除定时器,unmount 时 cleanup
|
|
69
|
+
const rejectTimerRef = React.useRef(null);
|
|
68
70
|
React.useEffect(() => {
|
|
69
71
|
// 阻止浏览器默认行为(打开文件 / 下载),否则 drop 不会触发
|
|
70
72
|
const preventDefault = (e) => {
|
|
@@ -123,8 +125,10 @@ export function GlobalDropzone({ accept = DEFAULT_ACCEPT, className = '', }) {
|
|
|
123
125
|
}
|
|
124
126
|
if (rejected.length > 0) {
|
|
125
127
|
setRejectedFiles(rejected);
|
|
126
|
-
// 5
|
|
127
|
-
|
|
128
|
+
// W21.6: 5 秒后自动清空拒绝提示,clear 旧 timer 避免重叠
|
|
129
|
+
if (rejectTimerRef.current)
|
|
130
|
+
clearTimeout(rejectTimerRef.current);
|
|
131
|
+
rejectTimerRef.current = setTimeout(() => setRejectedFiles([]), 5000);
|
|
128
132
|
}
|
|
129
133
|
if (accepted.length > 0) {
|
|
130
134
|
void importFiles(accepted);
|
|
@@ -143,12 +147,15 @@ export function GlobalDropzone({ accept = DEFAULT_ACCEPT, className = '', }) {
|
|
|
143
147
|
window.removeEventListener('dragover', onDragOver);
|
|
144
148
|
window.removeEventListener('dragleave', onDragLeave);
|
|
145
149
|
window.removeEventListener('drop', onDrop);
|
|
150
|
+
// W21.6: 清理 rejectedFiles 自动清除定时器
|
|
151
|
+
if (rejectTimerRef.current)
|
|
152
|
+
clearTimeout(rejectTimerRef.current);
|
|
146
153
|
};
|
|
147
154
|
}, [accept, importFiles, setStatus, setError]);
|
|
148
155
|
const isDragging = dragCounter > 0;
|
|
149
156
|
const hasRejections = rejectedFiles.length > 0;
|
|
150
157
|
if (!isDragging && !hasRejections)
|
|
151
158
|
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-
|
|
159
|
+
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-[var(--lokvis-primary)]/10/80 backdrop-blur-sm" }), _jsx("div", { className: `relative w-full max-w-md rounded-2xl border-2 border-dashed p-8 text-center bg-[var(--lokvis-surface)] shadow-[var(--lokvis-elevation-overlay)] ${hasRejections ? 'border-[var(--lokvis-danger)]' : 'border-[var(--lokvis-primary)]'}`, children: hasRejections ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-[var(--lokvis-danger)]/15", children: _jsxs(Icon, { size: 24, className: "text-[var(--lokvis-danger)]", 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-[var(--lokvis-danger)]", children: "Unsupported file type" }), _jsx("p", { className: "mt-1.5 text-xs text-[var(--lokvis-danger)]/80", children: rejectedFiles.join(', ') }), _jsxs("p", { className: "mt-2 text-[10px] text-[var(--lokvis-fg-muted)]", 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-[var(--lokvis-primary)]/15", children: _jsx(Icon, { size: 24, className: "text-[var(--lokvis-primary)]", 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-[var(--lokvis-primary)]", children: "Drop files to import" }), _jsx("p", { className: "mt-1 text-xs text-[var(--lokvis-fg-muted)]", children: "Files are processed locally in your browser" }), _jsxs("p", { className: "mt-2 text-[10px] text-[var(--lokvis-fg-subtle)]", children: ["Accepted: ", accept || 'all files'] })] })) })] }));
|
|
153
160
|
}
|
|
154
161
|
//# sourceMappingURL=GlobalDropzone.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalDropzone.js","sourceRoot":"","sources":["../../src/components/GlobalDropzone.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAQtD,kCAAkC;AAClC,MAAM,cAAc,GAAG,yCAAyC,CAAC;AAEjE,4BAA4B;AAC5B,SAAS,cAAc,CAAC,IAAU,EAAE,MAAc;
|
|
1
|
+
{"version":3,"file":"GlobalDropzone.js","sourceRoot":"","sources":["../../src/components/GlobalDropzone.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* - cursor 当前位置高亮,cursor 之后的条目标灰(redo 分支)
|
|
8
8
|
*
|
|
9
9
|
* W9.1: 支持 `variant` 切换布局方向
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* - `vertical`(默认):侧栏垂直布局,适合嵌入左/右栏
|
|
11
|
+
* - `horizontal`:底部横条布局,作为底部 history bar 使用
|
|
12
12
|
*
|
|
13
13
|
* 数据来自 history-slice(store 单一来源),由 runtime-slice 的
|
|
14
14
|
* history:changed 订阅自动更新,组件无需自行订阅事件。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryPanel.d.ts","sourceRoot":"","sources":["../../src/components/HistoryPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,iBAAiB;
|
|
1
|
+
{"version":3,"file":"HistoryPanel.d.ts","sourceRoot":"","sources":["../../src/components/HistoryPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,iBAAiB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;CACpC;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAc,EAAE,OAAoB,EAAE,EAAE,iBAAiB,+BA0MvF"}
|
|
@@ -11,48 +11,48 @@ export function HistoryPanel({ className = '', variant = 'vertical' }) {
|
|
|
11
11
|
const canUndo = cursor >= 0;
|
|
12
12
|
const canRedo = cursor < entries.length - 1;
|
|
13
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-
|
|
15
|
-
const redoBtn = (_jsx("button", { type: "button", onClick: () => void redo(), disabled: !canRedo, "aria-label": "Redo", className: "rounded p-1 text-
|
|
16
|
-
const headerEl = (_jsxs("div", { className: `flex shrink-0 items-center justify-between px-3 ${horizontal ? 'h-full border-r border-
|
|
14
|
+
const undoBtn = (_jsx("button", { type: "button", onClick: () => void undo(), disabled: !canUndo, "aria-label": "Undo", className: "rounded p-1 text-[var(--lokvis-fg-muted)] transition-colors hover:bg-[var(--lokvis-surface-muted)] hover:text-[var(--lokvis-fg-muted)] disabled:cursor-not-allowed disabled:opacity-30", 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-[var(--lokvis-fg-muted)] transition-colors hover:bg-[var(--lokvis-surface-muted)] hover:text-[var(--lokvis-fg-muted)] disabled:cursor-not-allowed disabled:opacity-30", 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-[var(--lokvis-border)]' : 'h-10 border-b border-[var(--lokvis-border)]'}`, children: [_jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-[var(--lokvis-fg-subtle)]", children: "History" }), _jsxs("div", { className: "flex items-center gap-0.5", children: [undoBtn, redoBtn] })] }));
|
|
17
17
|
// 空状态
|
|
18
18
|
if (!workflowId || entries.length === 0) {
|
|
19
19
|
return (_jsxs("aside", { className: `flex shrink-0 ${horizontal
|
|
20
|
-
? 'h-12 flex-row items-center border-t border-
|
|
21
|
-
: 'w-48 flex-col border-r border-
|
|
20
|
+
? 'h-12 flex-row items-center border-t border-[var(--lokvis-border)]'
|
|
21
|
+
: 'w-48 flex-col border-r border-[var(--lokvis-border)]'} ${className}`, "aria-label": "History panel", children: [headerEl, _jsx("p", { className: "px-3 text-[10px] text-[var(--lokvis-fg-subtle)]", children: "No history yet" })] }));
|
|
22
22
|
}
|
|
23
23
|
if (horizontal) {
|
|
24
24
|
// 横向布局:header | entries(横向滚动)
|
|
25
|
-
return (_jsxs("aside", { className: `flex h-12 shrink-0 items-stretch border-t border-
|
|
26
|
-
? 'bg-
|
|
27
|
-
: 'text-
|
|
25
|
+
return (_jsxs("aside", { className: `flex h-12 shrink-0 items-stretch border-t border-[var(--lokvis-border)] ${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-[var(--lokvis-primary)]/10 text-[var(--lokvis-primary)] ring-1 ring-[var(--lokvis-primary)]/40'
|
|
27
|
+
: 'text-[var(--lokvis-fg-muted)] hover:bg-[var(--lokvis-surface)]'}`, children: [_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-[var(--lokvis-fg-subtle)]", "aria-hidden": "true" }), _jsx("span", { className: "truncate", children: "Initial" })] }) }), entries.map((entry, i) => {
|
|
28
28
|
const isCurrent = i === cursor;
|
|
29
29
|
const isRedoBranch = i > cursor;
|
|
30
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-
|
|
31
|
+
? 'bg-[var(--lokvis-primary)]/10 text-[var(--lokvis-primary)] ring-1 ring-[var(--lokvis-primary)]/40'
|
|
32
32
|
: isRedoBranch
|
|
33
|
-
? 'text-
|
|
34
|
-
: 'text-
|
|
35
|
-
? 'bg-
|
|
33
|
+
? 'text-[var(--lokvis-fg-subtle)] hover:bg-[var(--lokvis-surface)]'
|
|
34
|
+
: 'text-[var(--lokvis-fg-muted)] hover:bg-[var(--lokvis-surface)]'}`, children: [_jsx("span", { className: `h-1.5 w-1.5 shrink-0 rounded-full ${isCurrent
|
|
35
|
+
? 'bg-[var(--lokvis-primary)]'
|
|
36
36
|
: isRedoBranch
|
|
37
|
-
? 'bg-
|
|
38
|
-
: 'bg-
|
|
37
|
+
? 'bg-[var(--lokvis-border)]'
|
|
38
|
+
: 'bg-[var(--lokvis-fg-subtle)]'}`, "aria-hidden": "true" }), _jsx("span", { className: "truncate font-medium", children: describeHistoryEntry(entry) })] }) }, entry.id));
|
|
39
39
|
})] })] }));
|
|
40
40
|
}
|
|
41
41
|
// 垂直布局(原实现)
|
|
42
|
-
return (_jsxs("aside", { className: `flex w-48 shrink-0 flex-col border-r border-
|
|
43
|
-
? 'bg-
|
|
44
|
-
: 'text-
|
|
42
|
+
return (_jsxs("aside", { className: `flex w-48 shrink-0 flex-col border-r border-[var(--lokvis-border)] ${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-[var(--lokvis-primary)]/10 text-[var(--lokvis-primary)] ring-1 ring-[var(--lokvis-primary)]/40'
|
|
44
|
+
: 'text-[var(--lokvis-fg-muted)] hover:bg-[var(--lokvis-surface)]'}`, children: [_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-[var(--lokvis-fg-subtle)]", "aria-hidden": "true" }), _jsx("span", { className: "truncate", children: "Initial" })] }) }), entries.map((entry, i) => {
|
|
45
45
|
const isCurrent = i === cursor;
|
|
46
46
|
const isRedoBranch = i > cursor;
|
|
47
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-
|
|
48
|
+
? 'bg-[var(--lokvis-primary)]/10 text-[var(--lokvis-primary)] ring-1 ring-[var(--lokvis-primary)]/40'
|
|
49
49
|
: isRedoBranch
|
|
50
|
-
? 'text-
|
|
51
|
-
: 'text-
|
|
52
|
-
? 'bg-
|
|
50
|
+
? 'text-[var(--lokvis-fg-subtle)] hover:bg-[var(--lokvis-surface)]'
|
|
51
|
+
: 'text-[var(--lokvis-fg-muted)] hover:bg-[var(--lokvis-surface)]'}`, children: [_jsx("span", { className: `mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full ${isCurrent
|
|
52
|
+
? 'bg-[var(--lokvis-primary)]'
|
|
53
53
|
: isRedoBranch
|
|
54
|
-
? 'bg-
|
|
55
|
-
: 'bg-
|
|
54
|
+
? 'bg-[var(--lokvis-border)]'
|
|
55
|
+
: 'bg-[var(--lokvis-fg-subtle)]'}`, "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-[var(--lokvis-fg-subtle)]", children: new Date(entry.timestamp).toLocaleTimeString() })] })] }) }, entry.id));
|
|
56
56
|
})] }) })] }));
|
|
57
57
|
}
|
|
58
58
|
/** 把 HistoryEntry 摘要为可读标签(capability 简称 + 关键参数) */
|