@graphvideo/workbench 1.0.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/dist/commands/commandRegistry.d.ts +15 -0
- package/dist/context/WorkbenchHostContext.d.ts +26 -0
- package/dist/context/types.d.ts +26 -0
- package/dist/context/workbenchContextStore.d.ts +26 -0
- package/dist/dock/AreaShell.d.ts +9 -0
- package/dist/dock/Workspace.d.ts +5 -0
- package/dist/dock/floatingWindow.d.ts +7 -0
- package/dist/dock/layout.d.ts +14 -0
- package/dist/dock/splitResizeGesture.d.ts +23 -0
- package/dist/dock/workspaceTypes.d.ts +28 -0
- package/dist/elements/ExtensionSlot.d.ts +5 -0
- package/dist/elements/dispose.d.ts +3 -0
- package/dist/elements/elementLoader.d.ts +45 -0
- package/dist/elements/manifest.d.ts +2 -0
- package/dist/elements/runtimeManager.d.ts +28 -0
- package/dist/elements/sourceCatalog.d.ts +24 -0
- package/dist/elements/types.d.ts +133 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.mjs +1809 -0
- package/dist/plugins/pluginManager.d.ts +20 -0
- package/dist/preferences/themePreferences.d.ts +9 -0
- package/dist/preferences/typographyPreferences.d.ts +16 -0
- package/dist/registry/eventRegistry.d.ts +29 -0
- package/dist/registry/extensionRegistry.d.ts +11 -0
- package/dist/registry/ownedRegistry.d.ts +21 -0
- package/dist/registry/panelRegistry.d.ts +13 -0
- package/dist/registry/serviceRegistry.d.ts +28 -0
- package/dist/registry/stateRegistry.d.ts +16 -0
- package/dist/ui/AudioPlayer.d.ts +5 -0
- package/dist/ui/FloatingScrollbars.d.ts +9 -0
- package/dist/ui/InlineSelect.d.ts +16 -0
- package/dist/ui/LargeTextEditorDialog.d.ts +14 -0
- package/dist/workbench.css +2 -0
- package/dist/workspaces/WorkspacePages.d.ts +5 -0
- package/dist/workspaces/WorkspaceTabs.d.ts +2 -0
- package/dist/workspaces/layoutPreferences.d.ts +10 -0
- package/dist/workspaces/manifest.d.ts +25 -0
- package/dist/workspaces/workspaceCommands.d.ts +16 -0
- package/package.json +35 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { StudioPluginManifest } from '@graphvideo/backend-sdk';
|
|
2
|
+
import type { WorkbenchContextStore } from '../context/workbenchContextStore';
|
|
3
|
+
import type { ElementLoader } from '../elements/elementLoader';
|
|
4
|
+
export interface PluginRuntimeManagerOptions {
|
|
5
|
+
contextStore: WorkbenchContextStore;
|
|
6
|
+
elementLoader: ElementLoader;
|
|
7
|
+
}
|
|
8
|
+
/** Renderer lifecycle only. Backend plugins are composed once in Electron main and require restart. */
|
|
9
|
+
export declare class PluginRuntimeManager {
|
|
10
|
+
private readonly options;
|
|
11
|
+
constructor(options: PluginRuntimeManagerOptions);
|
|
12
|
+
uninstall(manifest: StudioPluginManifest | {
|
|
13
|
+
id: string;
|
|
14
|
+
contributes?: {
|
|
15
|
+
backend?: string;
|
|
16
|
+
elements?: readonly string[];
|
|
17
|
+
workspaces?: readonly string[];
|
|
18
|
+
};
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** 工作台主题与根元素应用:四套内置主题,产品默认可配,用户保存值优先。 */
|
|
2
|
+
export type ThemeName = 'dark' | 'light' | 'xueqing' | 'shiliuqun';
|
|
3
|
+
export declare const themeNames: readonly ThemeName[];
|
|
4
|
+
export declare const defaultTheme: ThemeName;
|
|
5
|
+
export declare function isThemeName(value: unknown): value is ThemeName;
|
|
6
|
+
/** 用户保存值优先;缺失或失效回退到产品默认。 */
|
|
7
|
+
export declare function readThemePreference(productDefault?: ThemeName, storage?: Pick<Storage, 'getItem'>): ThemeName;
|
|
8
|
+
/** 应用到根元素并持久化;浮动窗口经属性同步跟随。 */
|
|
9
|
+
export declare function applyThemePreference(theme: ThemeName, root?: HTMLElement, storage?: Pick<Storage, 'setItem'>): void;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type InterfaceFont = 'default' | 'system' | 'mono';
|
|
2
|
+
export type InterfaceFontSize = 'compact' | 'standard' | 'comfortable';
|
|
3
|
+
export interface TypographyPreferences {
|
|
4
|
+
font: InterfaceFont;
|
|
5
|
+
size: InterfaceFontSize;
|
|
6
|
+
}
|
|
7
|
+
export declare const interfaceFontOptions: Array<{
|
|
8
|
+
value: InterfaceFont;
|
|
9
|
+
label: string;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const interfaceFontSizeOptions: Array<{
|
|
12
|
+
value: InterfaceFontSize;
|
|
13
|
+
label: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function readTypographyPreferences(storage?: Pick<Storage, 'getItem'>): TypographyPreferences;
|
|
16
|
+
export declare function applyTypographyPreferences(preferences: TypographyPreferences, root?: HTMLElement, storage?: Pick<Storage, 'setItem'>): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
declare const eventPayload: unique symbol;
|
|
2
|
+
export interface EventToken<T> {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly [eventPayload]?: (payload: T) => T;
|
|
5
|
+
}
|
|
6
|
+
export type EventListener<T> = (payload: Readonly<T>) => void | Promise<void>;
|
|
7
|
+
export interface EventListenerDefinition<T = unknown> {
|
|
8
|
+
event: EventToken<T>;
|
|
9
|
+
listener: EventListener<T>;
|
|
10
|
+
}
|
|
11
|
+
export interface EventListenerFailure {
|
|
12
|
+
eventId: string;
|
|
13
|
+
owner: string;
|
|
14
|
+
error: unknown;
|
|
15
|
+
}
|
|
16
|
+
export declare function defineEvent<T>(id: string): EventToken<T>;
|
|
17
|
+
export declare class EventRegistry {
|
|
18
|
+
private readonly listeners;
|
|
19
|
+
private reportFailure;
|
|
20
|
+
constructor(reportFailure?: (failure: EventListenerFailure) => void);
|
|
21
|
+
setFailureReporter(reportFailure: (failure: EventListenerFailure) => void): void;
|
|
22
|
+
replaceOwner(owner: string, definitions: EventListenerDefinition<any>[]): void;
|
|
23
|
+
listen<T>(owner: string, event: EventToken<T>, listener: EventListener<T>): () => void;
|
|
24
|
+
unregisterOwner(owner: string): void;
|
|
25
|
+
emit<T>(event: EventToken<T>, payload: Readonly<T>): void;
|
|
26
|
+
listenerCount<T>(event: EventToken<T>): number;
|
|
27
|
+
private assertDefinitions;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExtensionDefinition } from '../elements/types';
|
|
2
|
+
export declare class ExtensionRegistry {
|
|
3
|
+
private readonly registry;
|
|
4
|
+
readonly subscribe: (listener: () => void) => () => boolean;
|
|
5
|
+
readonly getSnapshot: () => number;
|
|
6
|
+
register(owner: string, extension: ExtensionDefinition): void;
|
|
7
|
+
assertCanReplace(owner: string, values: ExtensionDefinition[]): void;
|
|
8
|
+
replaceOwner(owner: string, values: ExtensionDefinition[]): void;
|
|
9
|
+
unregisterOwner(owner: string): void;
|
|
10
|
+
list(point?: string): ExtensionDefinition[];
|
|
11
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface OwnedEntry<T> {
|
|
2
|
+
owner: string;
|
|
3
|
+
value: T;
|
|
4
|
+
}
|
|
5
|
+
export declare class OwnedRegistry<T extends {
|
|
6
|
+
id: string;
|
|
7
|
+
}> {
|
|
8
|
+
private readonly entries;
|
|
9
|
+
private readonly listeners;
|
|
10
|
+
private version;
|
|
11
|
+
readonly subscribe: (listener: () => void) => () => boolean;
|
|
12
|
+
readonly getSnapshot: () => number;
|
|
13
|
+
register(owner: string, value: T): void;
|
|
14
|
+
assertCanReplace(owner: string, values: T[]): void;
|
|
15
|
+
replaceOwner(owner: string, values: T[]): void;
|
|
16
|
+
unregisterOwner(owner: string): void;
|
|
17
|
+
get(id: string): T | undefined;
|
|
18
|
+
list(): T[];
|
|
19
|
+
ownerOf(id: string): string | undefined;
|
|
20
|
+
private emit;
|
|
21
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PanelDefinition } from '../elements/types';
|
|
2
|
+
export declare class PanelRegistry {
|
|
3
|
+
private readonly registry;
|
|
4
|
+
readonly subscribe: (listener: () => void) => () => boolean;
|
|
5
|
+
readonly getSnapshot: () => number;
|
|
6
|
+
register(owner: string, panel: PanelDefinition): void;
|
|
7
|
+
assertCanReplace(owner: string, panels: PanelDefinition[]): void;
|
|
8
|
+
replaceOwner(owner: string, panels: PanelDefinition[]): void;
|
|
9
|
+
unregisterOwner(owner: string): void;
|
|
10
|
+
get(id: string): PanelDefinition | undefined;
|
|
11
|
+
list(): PanelDefinition[];
|
|
12
|
+
ownerOf(id: string): string | undefined;
|
|
13
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
declare const serviceValue: unique symbol;
|
|
2
|
+
export interface ServiceToken<T> {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly [serviceValue]?: (value: T) => T;
|
|
5
|
+
}
|
|
6
|
+
export interface ServiceProviderDefinition<T = unknown> {
|
|
7
|
+
id: string;
|
|
8
|
+
token: ServiceToken<T>;
|
|
9
|
+
value: T;
|
|
10
|
+
}
|
|
11
|
+
export declare function defineService<T>(id: string): ServiceToken<T>;
|
|
12
|
+
export declare class ServiceRegistry {
|
|
13
|
+
private readonly providers;
|
|
14
|
+
private readonly listeners;
|
|
15
|
+
private version;
|
|
16
|
+
readonly subscribe: (listener: () => void) => () => boolean;
|
|
17
|
+
readonly getSnapshot: () => number;
|
|
18
|
+
assertCanReplace(owner: string, definitions: ServiceProviderDefinition<any>[]): void;
|
|
19
|
+
replaceOwner(owner: string, definitions: ServiceProviderDefinition<any>[]): void;
|
|
20
|
+
unregisterOwner(owner: string): void;
|
|
21
|
+
get<T>(token: ServiceToken<T>): T | undefined;
|
|
22
|
+
require<T>(token: ServiceToken<T>): T;
|
|
23
|
+
has<T>(token: ServiceToken<T>): boolean;
|
|
24
|
+
getOwnerDefinitions(owner: string): ServiceProviderDefinition<any>[];
|
|
25
|
+
ownerOf<T>(token: ServiceToken<T>): string | undefined;
|
|
26
|
+
private emit;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ElementStateBinding, ElementStateDefinition, ElementStateHandle } from '../elements/types';
|
|
2
|
+
export declare class ElementStateRegistry {
|
|
3
|
+
private readonly definitions;
|
|
4
|
+
private readonly cells;
|
|
5
|
+
assertCanReplace(owner: string, definitions: ElementStateDefinition[]): void;
|
|
6
|
+
replaceOwner(owner: string, definitions: ElementStateDefinition[]): void;
|
|
7
|
+
unregisterOwner(owner: string): void;
|
|
8
|
+
bind<T>(owner: string, stateId: string, binding: ElementStateBinding): ElementStateHandle<T>;
|
|
9
|
+
listDefinitions(): {
|
|
10
|
+
owner: string;
|
|
11
|
+
definition: ElementStateDefinition<unknown>;
|
|
12
|
+
}[];
|
|
13
|
+
getOwnerDefinitions(owner: string): ElementStateDefinition<unknown>[];
|
|
14
|
+
private definitionKey;
|
|
15
|
+
private cellKey;
|
|
16
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function calculateFloatingThumb(trackSize: number, viewportSize: number, contentSize: number, scrollOffset: number): {
|
|
2
|
+
offset: number;
|
|
3
|
+
size: number;
|
|
4
|
+
scrollRange: number;
|
|
5
|
+
thumbRange: number;
|
|
6
|
+
} | null;
|
|
7
|
+
export declare function FloatingScrollbars({ ownerDocument }: {
|
|
8
|
+
ownerDocument?: Document;
|
|
9
|
+
}): import("react").ReactPortal | null;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface InlineSelectOption {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
}
|
|
5
|
+
interface InlineSelectProps {
|
|
6
|
+
align?: 'start' | 'end';
|
|
7
|
+
ariaLabel: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
menuClassName?: string;
|
|
11
|
+
onChange(value: string): void;
|
|
12
|
+
options: InlineSelectOption[];
|
|
13
|
+
value: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function InlineSelect({ align, ariaLabel, className, disabled, menuClassName, onChange, options, value }: InlineSelectProps): import("react").JSX.Element | null;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface LargeTextEditorDialogProps {
|
|
2
|
+
busy?: boolean;
|
|
3
|
+
label?: string;
|
|
4
|
+
onChange(value: string): void;
|
|
5
|
+
onClose(): void;
|
|
6
|
+
onSave?: () => void | Promise<void>;
|
|
7
|
+
placeholder?: string;
|
|
8
|
+
readOnly?: boolean;
|
|
9
|
+
saveDisabled?: boolean;
|
|
10
|
+
saveLabel?: string;
|
|
11
|
+
title: string;
|
|
12
|
+
value: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function LargeTextEditorDialog({ busy, label, onChange, onClose, onSave, placeholder, readOnly, saveDisabled, saveLabel, title, value, }: LargeTextEditorDialogProps): import("react").ReactPortal | null;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
:root{--font-family-ui:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;--font-family-mono:"SF Mono", Monaco, Menlo, Consolas, "Cascadia Code", "Courier New", monospace;--font-size-xs:9px;--font-size-sm:10px;--font-size-md:11px;--font-size-base:12px;--font-size-lg:13px;--font-size-xl:16px;--font-weight-regular:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--line-height-tight:1.45;--line-height-body:1.5;--line-height-comfortable:1.55;--line-height-relaxed:1.6;--line-height-prose:1.65;--line-height-editor:20px}:root[data-font-family=system]{--font-family-ui:system-ui, "Microsoft YaHei", sans-serif}:root[data-font-family=mono]{--font-family-ui:var(--font-family-mono)}:root[data-font-size=compact]{--font-size-xs:8px;--font-size-sm:9px;--font-size-md:10px;--font-size-base:11px;--font-size-lg:12px;--font-size-xl:14px}:root[data-font-size=comfortable]{--font-size-xs:10px;--font-size-sm:11px;--font-size-md:12px;--font-size-base:13px;--font-size-lg:14px;--font-size-xl:18px}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--palette-neutral-1000:#080a0d;--palette-neutral-950:#111318;--palette-neutral-925:#14171c;--palette-neutral-900:#17191e;--palette-neutral-875:#191c21;--palette-neutral-850:#1c1f25;--palette-neutral-825:#202329;--palette-neutral-800:#22252c;--palette-neutral-750:#292d35;--palette-neutral-700:#30343c;--palette-neutral-650:#343842;--palette-neutral-600:#454b57;--palette-neutral-500:#656b75;--palette-neutral-400:#8b919c;--palette-neutral-300:#aeb3bc;--palette-neutral-200:#d6d9df;--palette-neutral-100:#eef2ff;--palette-white:#fff;--palette-black:#000;--palette-blue-500:#6b8cff;--palette-blue-400:#7e9aff;--palette-green-500:#6fcf97;--palette-yellow-500:#e8bd68;--palette-red-500:#ed7474;--palette-cyan-500:#67c8d8;--palette-purple-500:#b88ae8;--palette-orange-500:#e89a62;--palette-xueqing:#bdb5d7;--palette-ziluolan:#7356b1;--palette-mingyuedang:#d6d4cd;--palette-shiliuqun:#b3392f;--surface-canvas:var(--palette-neutral-950);--surface-header:#111318;--surface-panel:var(--palette-neutral-850);--surface-hover:color-mix(in srgb, var(--palette-neutral-750), var(--palette-white) 6%);--border-subtle:color-mix(in srgb, var(--palette-neutral-650), transparent 35%);--border-strong:var(--palette-neutral-600);--accent-primary:#38bdf8;--status-success:#10b981;--status-warning:#f59e0b;--status-danger:#ef4444;--text-primary:#f8fafc;--text-secondary:#94a3b8;--text-tertiary:#64748b;--canvas-grid-dot:#94a3b814;--edge-conduit:#64748b73;--port-idle:#64748b;--surface-app:var(--palette-neutral-900);--surface-panel-subtle:var(--palette-neutral-800);--surface-raised:var(--palette-neutral-750);--surface-input:var(--palette-neutral-925);--surface-document:var(--palette-neutral-875);--surface-selected:color-mix(in srgb, var(--palette-blue-500), transparent 72%);--selection-indicator:var(--palette-blue-400);--surface-backdrop:color-mix(in srgb, var(--palette-neutral-1000), transparent 18%);--content-primary:var(--palette-neutral-200);--content-secondary:var(--palette-neutral-400);--content-tertiary:var(--palette-neutral-500);--content-on-action:var(--palette-neutral-100);--border-default:var(--palette-neutral-650);--focus-ring:var(--palette-blue-500);--action-primary-bg:var(--palette-blue-500);--action-primary-bg-hover:color-mix(in srgb, var(--palette-blue-500), var(--palette-white) 12%);--action-primary-border:color-mix(in srgb, var(--palette-blue-500), var(--palette-white) 28%);--action-primary-fg:var(--content-on-action);--state-success-fg:var(--palette-green-500);--state-success-bg:color-mix(in srgb, var(--palette-green-500), transparent 86%);--state-success-border:color-mix(in srgb, var(--palette-green-500), transparent 66%);--state-warning-fg:var(--palette-yellow-500);--state-warning-bg:color-mix(in srgb, var(--palette-yellow-500), transparent 90%);--state-warning-border:color-mix(in srgb, var(--palette-yellow-500), transparent 76%);--state-danger-fg:var(--palette-red-500);--state-danger-bg:color-mix(in srgb, var(--palette-red-500), transparent 87%);--state-danger-border:color-mix(in srgb, var(--palette-red-500), transparent 68%);--icon-brand-fg:var(--palette-neutral-100);--icon-brand-bg-start:var(--palette-blue-400);--icon-brand-bg-end:#506bd6;--icon-brand-shadow:#2945aa59;--icon-node-text:#77b8ef;--icon-node-image:var(--palette-orange-500);--icon-node-video:var(--palette-purple-500);--icon-node-audio:var(--palette-green-500);--icon-node-style:var(--palette-yellow-500);--scrollbar-thumb:#8b919c7a;--scrollbar-thumb-hover:#aeb3bcad;--shadow-floating:0 14px 48px color-mix(in srgb, var(--palette-black), transparent 38%);--overlay-scrim:color-mix(in srgb, var(--palette-neutral-1000), transparent 24%);--button-bg:var(--surface-raised);--button-bg-hover:var(--surface-hover);--button-border:var(--border-strong);--button-fg:var(--content-primary);--field-bg:var(--surface-input);--field-border:var(--border-default);--field-fg:var(--content-primary);--generation-border:color-mix(in srgb, var(--content-tertiary), transparent 68%);--terminal-background:var(--surface-document);--terminal-foreground:var(--content-primary);--terminal-cursor:var(--focus-ring);--terminal-selection:var(--surface-selected);--terminal-black:var(--content-tertiary);--terminal-red:var(--state-danger-fg);--terminal-green:var(--state-success-fg);--terminal-yellow:var(--state-warning-fg);--terminal-blue:var(--action-primary-bg);--terminal-magenta:var(--icon-node-video);--terminal-cyan:var(--icon-node-text);--terminal-white:var(--content-secondary);--terminal-bright-black:var(--content-secondary);--terminal-bright-red:var(--terminal-red);--terminal-bright-green:var(--terminal-green);--terminal-bright-yellow:var(--terminal-yellow);--terminal-bright-blue:var(--focus-ring);--terminal-bright-magenta:var(--terminal-magenta);--terminal-bright-cyan:var(--terminal-cyan);--terminal-bright-white:var(--content-primary);--header-height:27px;--topbar-height:38px;--footer-height:23px}[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--surface-canvas:#f8fafc;--surface-header:#fff;--surface-panel:#fff;--surface-hover:#0000000d;--border-subtle:#e2e8f0;--border-strong:#cbd5e1;--accent-primary:#0284c7;--status-success:#059669;--status-warning:#d97706;--status-danger:#dc2626;--text-primary:#0f172a;--text-secondary:#475569;--text-tertiary:#64748b;--canvas-grid-dot:#0f172a17;--edge-conduit:#94a3b8b3;--port-idle:#94a3b8}:root[data-theme=light],:root[data-theme=xueqing],:root[data-theme=shiliuqun]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--surface-canvas:#f8fafc;--surface-app:#f1f5f9;--surface-header:#fff;--surface-panel:#fff;--surface-panel-subtle:#f8fafc;--surface-raised:#fff;--surface-document:#fff;--surface-input:#f8fafc;--surface-hover:#0000000d;--surface-selected:#e2e8f0;--selection-indicator:#0284c7;--surface-backdrop:#0f172a59;--text-primary:#0f172a;--text-secondary:#475569;--text-tertiary:#94a3b8;--content-primary:#0f172a;--content-secondary:#475569;--content-tertiary:#94a3b8;--content-on-action:#fff;--border-default:#e2e8f0;--border-strong:#cbd5e1;--border-subtle:#e2e8f0;--focus-ring:#0284c7;--accent-primary:#0284c7;--status-success:#059669;--status-warning:#d97706;--status-danger:#dc2626;--canvas-grid-dot:#0f172a14;--edge-conduit:#0284c759;--port-idle:#94a3b8;--palette-neutral-1000:#fff;--palette-neutral-950:#f8fafc;--palette-neutral-925:#f1f5f9;--palette-neutral-900:#e2e8f0;--palette-neutral-850:#cbd5e1;--palette-neutral-800:#94a3b8;--palette-neutral-700:#64748b;--palette-neutral-600:#475569;--palette-neutral-500:#334155;--palette-neutral-400:#1e293b;--palette-neutral-300:#0f172a;--palette-neutral-200:#0f172a;--palette-neutral-100:#0f172a;--palette-blue-500:#0284c7;--palette-blue-400:#0369a1;--palette-green-500:#059669;--palette-yellow-500:#d97706;--palette-red-500:#dc2626;--action-primary-bg:#0284c7;--action-primary-bg-hover:#0369a1;--action-primary-border:#0284c7;--state-success-fg:#059669;--state-warning-fg:#d97706;--state-danger-fg:#dc2626;--icon-brand-fg:#fff;--icon-brand-bg-start:#0284c7;--icon-brand-bg-end:#0369a1;--icon-brand-shadow:#0284c73d;--icon-node-text:#0284c7;--icon-node-image:#d97706;--icon-node-video:#7c3aed;--icon-node-audio:#059669;--icon-node-style:#ca8a04;--scrollbar-thumb:#64748b4d;--scrollbar-thumb-hover:#64748b80;--shadow-floating:0 14px 48px #0f172a1f;--overlay-scrim:#0f172a59;--terminal-background:#fff;--terminal-foreground:#0f172a;--terminal-cursor:#0284c7;--terminal-selection:#cbd5e1;--terminal-black:#0f172a;--terminal-red:#b91c1c;--terminal-green:#15803d;--terminal-yellow:#b45309;--terminal-blue:#1d4ed8;--terminal-magenta:#7e22ce;--terminal-cyan:#0e7490;--terminal-white:#334155;--terminal-bright-black:#475569;--terminal-bright-red:#dc2626;--terminal-bright-green:#16a34a;--terminal-bright-yellow:#d97706;--terminal-bright-blue:#2563eb;--terminal-bright-magenta:#9333ea;--terminal-bright-cyan:#0284c7;--terminal-bright-white:#020617}:root[data-theme=xueqing]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--surface-canvas:#f7f6fa;--surface-app:#f2f0f7;--surface-header:#fff;--surface-panel:#fff;--surface-panel-subtle:#fbfbfe;--surface-raised:#fff;--surface-document:#fff;--surface-input:#fbfbfe;--surface-hover:#7356b10d;--surface-selected:#bdb5d738;--selection-indicator:#7356b1;--surface-backdrop:#1f163347;--text-primary:#1e172e;--text-secondary:#5a4f70;--text-tertiary:#9286a6;--content-primary:#1e172e;--content-secondary:#5a4f70;--content-tertiary:#9286a6;--content-on-action:#fff;--border-default:#e9e5f2;--border-strong:#d7d0e5;--border-subtle:#f2eef8;--focus-ring:#7356b1;--accent-primary:#7356b1;--action-primary-bg:#7356b1;--action-primary-bg-hover:#5e429b;--action-primary-border:#7356b1;--action-primary-fg:#fff;--status-success:#059669;--status-warning:#d97706;--status-danger:#dc2626;--state-success-fg:#059669;--state-warning-fg:#d97706;--state-danger-fg:#dc2626;--icon-brand-fg:#fff;--icon-brand-bg-start:#7356b1;--icon-brand-bg-end:#5e429b;--icon-brand-shadow:#7356b133;--icon-node-text:#7356b1;--icon-node-image:#d97706;--icon-node-video:#7c3aed;--icon-node-audio:#059669;--icon-node-style:#ca8a04;--canvas-grid-dot:#7356b114;--edge-conduit:#7356b159;--port-idle:#9286a6;--scrollbar-thumb:#7356b133;--scrollbar-thumb-hover:#7356b166;--shadow-floating:0 14px 48px #1f16331a;--overlay-scrim:#1f163340;--terminal-background:#fff;--terminal-foreground:#1e172e;--terminal-cursor:#7356b1;--terminal-selection:#ebe6f5;--terminal-black:#1e172e;--terminal-red:#b91c1c;--terminal-green:#15803d;--terminal-yellow:#b45309;--terminal-blue:#5243aa;--terminal-magenta:#7356b1;--terminal-cyan:#0e7490;--terminal-white:#5a4f70;--terminal-bright-black:#5a4f70;--terminal-bright-red:#dc2626;--terminal-bright-green:#16a34a;--terminal-bright-yellow:#d97706;--terminal-bright-blue:#7356b1;--terminal-bright-magenta:#8e6dd1;--terminal-bright-cyan:#0284c7;--terminal-bright-white:#0f0a1c}:root[data-theme=shiliuqun]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--surface-canvas:#f7f6f3;--surface-app:#f0eeea;--surface-header:#fff;--surface-panel:#fff;--surface-panel-subtle:#fcfbfa;--surface-raised:#fff;--surface-document:#fff;--surface-input:#fcfbfa;--surface-hover:#b3392f0d;--surface-selected:#d6d4cd59;--selection-indicator:#b3392f;--surface-backdrop:#2a1d1b47;--text-primary:#241918;--text-secondary:#63504d;--text-tertiary:#968582;--content-primary:#241918;--content-secondary:#63504d;--content-tertiary:#968582;--content-on-action:#fff;--border-default:#e8e6e0;--border-strong:#d5d1c8;--border-subtle:#f1efe9;--focus-ring:#b3392f;--accent-primary:#b3392f;--action-primary-bg:#b3392f;--action-primary-bg-hover:#962c23;--action-primary-border:#b3392f;--action-primary-fg:#fff;--status-success:#059669;--status-warning:#d97706;--status-danger:#b3392f;--state-success-fg:#059669;--state-warning-fg:#d97706;--state-danger-fg:#b3392f;--icon-brand-fg:#fff;--icon-brand-bg-start:#b3392f;--icon-brand-bg-end:#962c23;--icon-brand-shadow:#b3392f33;--icon-node-text:#b3392f;--icon-node-image:#d97706;--icon-node-video:#7c3aed;--icon-node-audio:#059669;--icon-node-style:#ca8a04;--canvas-grid-dot:#b3392f14;--edge-conduit:#b3392f59;--port-idle:#968582;--scrollbar-thumb:#b3392f33;--scrollbar-thumb-hover:#b3392f66;--shadow-floating:0 14px 48px #2a1d1b1a;--overlay-scrim:#2a1d1b40;--terminal-background:#fff;--terminal-foreground:#241918;--terminal-cursor:#b3392f;--terminal-selection:#edeae4;--terminal-black:#241918;--terminal-red:#b3392f;--terminal-green:#15803d;--terminal-yellow:#b45309;--terminal-blue:#1d4ed8;--terminal-magenta:#86198f;--terminal-cyan:#0e7490;--terminal-white:#63504d;--terminal-bright-black:#63504d;--terminal-bright-red:#d32f2f;--terminal-bright-green:#16a34a;--terminal-bright-yellow:#d97706;--terminal-bright-blue:#2563eb;--terminal-bright-magenta:#b3392f;--terminal-bright-cyan:#0284c7;--terminal-bright-white:#170d0c}.workspace{background:var(--surface-app);min-width:0;min-height:0;padding:3px;overflow:hidden}.workspace-pages{min-width:0;min-height:0;position:relative;overflow:hidden}.workspace-page{position:absolute;inset:0}.workspace-page.is-inactive{pointer-events:none;display:none}.element-page-host{inset:var(--topbar-height) 0 var(--footer-height);z-index:30;grid-template-rows:var(--header-height) minmax(0, 1fr);background:var(--surface-panel);display:grid;position:absolute}.element-page-host>header{color:var(--content-secondary);background:var(--surface-header);border-bottom:1px solid var(--border-default);align-items:center;gap:6px;padding:0 7px;display:flex}.element-page-host>header strong{color:var(--content-primary);flex:1}.element-page-host>header button{width:22px;height:21px;color:var(--content-secondary);cursor:pointer;background:0 0;border-radius:3px;place-items:center;padding:0;display:grid}.element-page-host>header button:hover{color:var(--content-primary);background:var(--surface-hover)}.element-page-content{min-width:0;min-height:0;overflow:hidden}.area-slot{width:100%;min-width:0;height:100%;min-height:0}.dock-split{width:100%;min-width:0;height:100%;min-height:0;display:grid;overflow:hidden}.dock-split.is-horizontal{grid-template-rows:minmax(0,1fr)}.dock-split.is-vertical{grid-template-columns:minmax(0,1fr)}.dock-pane{min-width:0;min-height:0;overflow:hidden}.area-shell{grid-template-rows:var(--header-height) minmax(0, 1fr);background:var(--surface-panel);border:1px solid var(--border-subtle);border-radius:3px;width:100%;min-width:0;height:100%;display:grid;overflow:hidden}.area-shell.is-focused{border-color:var(--border-strong);box-shadow:inset 2px 0 0 var(--selection-indicator)}.area-header{min-width:0;color:var(--content-secondary);background:var(--surface-panel-subtle);border-bottom:1px solid var(--border-default);-webkit-user-select:none;user-select:none;align-items:center;gap:3px;padding:0 4px 0 6px;display:flex}.area-header>svg{color:var(--content-tertiary)}.area-panel-select{max-width:160px;color:var(--content-primary);font-weight:var(--font-weight-semibold)}.area-panel-select .inline-select-trigger{width:100%;height:21px;padding:0 4px}.area-header-spacer{flex:1}.area-header-button{width:21px;height:21px;color:var(--content-secondary);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:3px;place-items:center;padding:0;display:grid}.area-header-button:hover{color:var(--content-primary);background:var(--surface-hover)}.area-header-button:active{background:var(--surface-selected)}.area-header-button:focus-visible{outline:1px solid var(--focus-ring);outline-offset:-1px}.area-header-button:disabled{opacity:.28;cursor:default}.area-content{min-width:0;min-height:0;overflow:hidden}.panel-instance{width:100%;height:100%;display:none;position:relative}.panel-instance.is-active{display:block}.extension-slot-header{display:contents}.extension-slot-overlay{pointer-events:none;position:absolute;inset:0}.extension-slot-overlay>*{pointer-events:auto}.missing-element-panel{width:100%;height:100%;color:var(--content-tertiary);background:var(--surface-panel);place-content:center;justify-items:center;gap:7px;display:grid}.missing-element-panel strong{color:var(--content-secondary);font-weight:var(--font-weight-medium)}.missing-element-panel span{font:var(--font-size-sm) var(--font-family-mono)}.dock-resizer{z-index:10;background:var(--surface-app);touch-action:none;border-radius:0;padding:0}.dock-split.is-horizontal>.dock-resizer{cursor:col-resize}.dock-split.is-vertical>.dock-resizer{cursor:row-resize}.dock-resizer:hover,.is-resizing .dock-resizer{background:var(--surface-selected)}body.is-resizing{-webkit-user-select:none;user-select:none}.floating-area-placeholder{width:100%;height:100%;color:var(--content-tertiary);background:var(--surface-panel);border:1px dashed var(--border-strong);place-content:center;justify-items:center;gap:7px;display:grid}.floating-area-placeholder button{height:24px;color:var(--content-secondary);background:var(--surface-raised);border:1px solid var(--border-strong);cursor:pointer;border-radius:3px;padding:0 8px}.floating-area-placeholder button:hover{color:var(--content-primary);background:var(--surface-hover)}.floating-panel-body,.floating-panel-root,.floating-area-content,.area-render-root{background:var(--surface-canvas);width:100%;height:100%;margin:0;overflow:hidden}.floating-area-content{padding:1px}.area-render-root .area-shell{height:100%}.workspace-tabs{flex:auto;align-self:stretch;align-items:center;gap:3px;min-width:0;margin-left:8px;display:flex;overflow:hidden}.workspace-tabs button{min-width:0;max-width:130px;height:100%;color:var(--content-secondary);text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border-bottom:2px solid #0000;border-radius:0;padding:0 12px;overflow:hidden}.workspace-tabs button:hover{color:var(--content-primary);background:var(--surface-hover)}.workspace-tabs button.is-active{color:var(--content-primary);background:var(--surface-selected);border-bottom-color:var(--selection-indicator)}.workspace-tabs button:focus-visible{outline-color:var(--focus-ring)}@media (width<=1180px){.workspace-tabs button{max-width:88px;padding:0 8px}}@media (width<=920px){.workspace-tabs button{max-width:64px;padding:0 6px}}.inline-select{min-width:0;position:relative}.inline-select-trigger{min-width:0;height:22px;color:inherit;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:3px;align-items:center;gap:4px;padding:0 5px;display:inline-flex}.inline-select-trigger>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.inline-select-trigger>svg{color:var(--content-tertiary);flex:none}.inline-select-trigger:hover,.inline-select:focus-within .inline-select-trigger{color:var(--content-primary);background:var(--surface-hover)}.inline-select:focus-within .inline-select-trigger{outline:1px solid var(--focus-ring);outline-offset:-1px}.inline-select-menu{z-index:10000;min-width:max-content;max-width:min(280px,80vw);color:var(--content-primary);background:var(--surface-raised);border:1px solid var(--border-strong);box-shadow:var(--shadow-floating);border-radius:4px;padding:3px;display:grid;position:fixed;overflow:auto}.inline-select-menu button{min-width:0;color:inherit;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:2px;padding:5px 7px;overflow:hidden}.inline-select-menu button:hover,.inline-select-menu button.is-selected{background:var(--surface-selected)}.inline-select-menu button.is-selected{color:var(--content-primary);box-shadow:inset 2px 0 0 var(--selection-indicator)}.large-text-dialog-backdrop{z-index:10000;background:var(--overlay-scrim);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);place-items:center;padding:24px;display:grid;position:fixed;inset:0}.large-text-dialog{width:min(1040px,100vw - 48px);min-width:0;height:min(760px,100vh - 48px);min-height:360px;color:var(--content-primary);background:var(--surface-raised);border:1px solid var(--border-strong);box-shadow:var(--shadow-floating);border-radius:7px;grid-template-rows:46px minmax(0,1fr) 50px;display:grid;overflow:hidden}.large-text-dialog>header,.large-text-dialog>footer{background:var(--surface-panel-subtle);align-items:center;gap:8px;padding:0 12px;display:flex}.large-text-dialog>header{border-bottom:1px solid var(--border-subtle)}.large-text-dialog>header strong{min-width:0;font-size:var(--font-size-lg);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.large-text-dialog>header button{width:28px;height:28px;color:var(--content-secondary);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:3px;place-items:center;padding:0;display:grid}.large-text-dialog>header button:hover:not(:disabled){color:var(--content-primary);background:var(--surface-hover)}.large-text-dialog>label{min-height:0;color:var(--content-secondary);font-size:var(--font-size-base);grid-template-rows:auto minmax(0,1fr);gap:7px;padding:14px;display:grid}.large-text-dialog textarea{resize:none;width:100%;min-width:0;height:100%;min-height:0;color:var(--content-primary);background:var(--surface-input);border:1px solid var(--field-border);font:var(--font-size-xl)/var(--line-height-prose) var(--font-family-mono);border-radius:4px;padding:14px}.large-text-dialog textarea:focus{border-color:var(--focus-ring);outline:1px solid var(--focus-ring);outline-offset:-1px}.large-text-dialog textarea[readonly]{color:var(--content-secondary)}.large-text-dialog>footer{border-top:1px solid var(--border-subtle);justify-content:flex-end}.large-text-dialog>footer>span{color:var(--content-tertiary);font-size:var(--font-size-md);margin-right:auto}.large-text-dialog>footer button{min-width:68px;height:30px;color:var(--button-fg);background:var(--button-bg);border:1px solid var(--button-border);font-size:var(--font-size-base);cursor:pointer;border-radius:3px;padding:0 10px}.large-text-dialog>footer button:hover:not(:disabled){background:var(--button-bg-hover)}.large-text-dialog>footer button.is-primary{color:var(--action-primary-fg);background:var(--action-primary-bg);border-color:var(--action-primary-border)}.large-text-dialog>footer button.is-primary:hover:not(:disabled){background:var(--action-primary-bg-hover)}.large-text-dialog button:disabled{cursor:default;opacity:.5}@media (width<=640px),(height<=480px){.large-text-dialog-backdrop{padding:10px}.large-text-dialog{width:calc(100vw - 20px);height:calc(100vh - 20px);min-height:0}.large-text-dialog>label{padding:10px}.large-text-dialog>footer>span{display:none}}.panel{background:var(--surface-panel);width:100%;min-width:0;height:100%;min-height:0}.panel-toolbar,.panel-statusbar{color:var(--content-secondary);background:var(--surface-panel-subtle);-webkit-user-select:none;user-select:none;align-items:center;display:flex}.panel-toolbar{border-bottom:1px solid var(--border-default);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:0 6px;display:grid;overflow:hidden}.toolbar-group{align-items:center;gap:4px;min-width:0;display:flex}.toolbar-primary{overflow:hidden}.toolbar-actions{flex:none}.tool-button,.icon-button{height:22px;color:var(--content-secondary);cursor:pointer;background:0 0;border-radius:3px;justify-content:center;align-items:center;display:inline-flex}.tool-button{white-space:nowrap;gap:5px;padding:0 7px}.tool-button:hover,.icon-button:hover{color:var(--content-primary);background:var(--surface-hover)}.tool-button.is-active{color:var(--content-primary);background:var(--surface-selected)}.icon-button{width:22px;padding:0}.toolbar-divider{background:var(--border-default);width:1px;height:15px;margin:0 3px}.floating-scrollbars{z-index:5000;pointer-events:none;position:fixed;inset:0;overflow:hidden}.floating-scrollbar-thumb{background:var(--scrollbar-thumb);pointer-events:auto;touch-action:none;background-clip:padding-box;border:1px solid #0000;border-radius:999px;min-width:5px;min-height:5px;transition:background .1s;position:fixed}.floating-scrollbar-thumb.is-vertical{width:6px}.floating-scrollbar-thumb.is-horizontal{height:6px}.floating-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover);background-clip:padding-box}
|
|
2
|
+
/*$vite$:1*/
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DockNode, WorkspaceRuntimeState } from '../dock/workspaceTypes';
|
|
2
|
+
interface StoredWorkspaceLayout {
|
|
3
|
+
layout: DockNode;
|
|
4
|
+
focusedAreaId: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function loadWorkspaceDefault(workspaceId: string): StoredWorkspaceLayout | null;
|
|
7
|
+
export declare function saveWorkspaceDefault(workspace: WorkspaceRuntimeState): void;
|
|
8
|
+
export declare function loadActiveWorkspacePreference(): string | null;
|
|
9
|
+
export declare function saveActiveWorkspacePreference(workspaceId: string): void;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { WorkspaceRuntimeState } from '../dock/workspaceTypes';
|
|
2
|
+
interface SourceArea {
|
|
3
|
+
kind: 'area';
|
|
4
|
+
id: string;
|
|
5
|
+
panelId: string;
|
|
6
|
+
instanceId: string;
|
|
7
|
+
}
|
|
8
|
+
interface SourceSplit {
|
|
9
|
+
kind: 'split';
|
|
10
|
+
id: string;
|
|
11
|
+
direction: 'horizontal' | 'vertical';
|
|
12
|
+
ratio: number;
|
|
13
|
+
first: SourceDockNode;
|
|
14
|
+
second: SourceDockNode;
|
|
15
|
+
}
|
|
16
|
+
type SourceDockNode = SourceArea | SourceSplit;
|
|
17
|
+
export interface WorkspaceDefinition {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
order: number;
|
|
21
|
+
layout: SourceDockNode;
|
|
22
|
+
}
|
|
23
|
+
export declare function parseWorkspaceDefinition(folderId: string, text: string): WorkspaceDefinition;
|
|
24
|
+
export declare function createWorkspaceRuntime(definition: WorkspaceDefinition): WorkspaceRuntimeState;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CommandRegistry } from '../commands/commandRegistry';
|
|
2
|
+
import type { WorkspaceRuntimeState } from '../dock/workspaceTypes';
|
|
3
|
+
/** 工作区命令的目标:宿主提供工作区存储,工作台提供命令装配。 */
|
|
4
|
+
export interface WorkspaceCommandTarget {
|
|
5
|
+
activate(workspaceId: string): void;
|
|
6
|
+
focus(workspaceId: string, areaId: string): void;
|
|
7
|
+
switchPanel(workspaceId: string, areaId: string, panelId: string): void;
|
|
8
|
+
splitArea(workspaceId: string, areaId: string, direction: 'horizontal' | 'vertical'): void;
|
|
9
|
+
closeArea(workspaceId: string, areaId: string): void;
|
|
10
|
+
resizeSplit(workspaceId: string, splitId: string, ratio: number, historyGroupId?: string): void;
|
|
11
|
+
swapAreas(workspaceId: string, sourceAreaId: string, targetAreaId: string): void;
|
|
12
|
+
toggleMaximize(workspaceId: string, areaId: string): void;
|
|
13
|
+
readWorkspace(workspaceId: string): WorkspaceRuntimeState | undefined;
|
|
14
|
+
}
|
|
15
|
+
/** 注册工作区与 Dock 命令;布局偏好读写由工作台统一管理。 */
|
|
16
|
+
export declare function registerWorkspaceCommands(commands: CommandRegistry, target: WorkspaceCommandTarget, owner?: string): void;
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@graphvideo/workbench",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Zero-business-semantics UI workbench for GraphFramework",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git@github.com:vd249175-cpu/GSDK.git",
|
|
13
|
+
"directory": "workbench"
|
|
14
|
+
},
|
|
15
|
+
"main": "./dist/index.mjs",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.mjs"
|
|
21
|
+
},
|
|
22
|
+
"./styles.css": "./dist/workbench.css"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@graphvideo/backend-sdk": "^1.0.0"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"react": "^19.0.0",
|
|
32
|
+
"react-dom": "^19.0.0",
|
|
33
|
+
"lucide-react": "^1.30.0"
|
|
34
|
+
}
|
|
35
|
+
}
|