vtkviewer-vue 0.1.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/README.en.md +753 -0
- package/README.md +1760 -0
- package/lib/types/components/PluginToolbar.vue.d.ts +7 -0
- package/lib/types/components/ToolbarExtension.vue.d.ts +9 -0
- package/lib/types/components/ToolbarInfoPanel.vue.d.ts +10 -0
- package/lib/types/components/VtkViewer.vue.d.ts +32 -0
- package/lib/types/components/index.d.ts +4 -0
- package/lib/types/composables/index.d.ts +7 -0
- package/lib/types/composables/useFormatLoader.d.ts +33 -0
- package/lib/types/composables/useResponsiveLayout.d.ts +46 -0
- package/lib/types/composables/useUIPlugins.d.ts +57 -0
- package/lib/types/composables/useViewer.d.ts +47 -0
- package/lib/types/configs/index.d.ts +76 -0
- package/lib/types/core/CommandRegistrar.d.ts +12 -0
- package/lib/types/core/CommandRegistry.d.ts +34 -0
- package/lib/types/core/ConfigAccessor.d.ts +33 -0
- package/lib/types/core/DisposalRegistry.d.ts +32 -0
- package/lib/types/core/EventBus.d.ts +79 -0
- package/lib/types/core/FormatDetector.d.ts +59 -0
- package/lib/types/core/I18nManager.d.ts +135 -0
- package/lib/types/core/InteractionSubContext.d.ts +73 -0
- package/lib/types/core/RenderSubContext.d.ts +74 -0
- package/lib/types/core/ResetManager.d.ts +122 -0
- package/lib/types/core/ResetRegistry.d.ts +170 -0
- package/lib/types/core/SceneSubContext.d.ts +25 -0
- package/lib/types/core/StateManager.d.ts +104 -0
- package/lib/types/core/ThemeContext.d.ts +37 -0
- package/lib/types/core/ToolbarExtensionRegistry.d.ts +105 -0
- package/lib/types/core/ToolbarInfoRegistry.d.ts +77 -0
- package/lib/types/core/UISubContext.d.ts +32 -0
- package/lib/types/core/ViewerContext.d.ts +101 -0
- package/lib/types/core/ViewerContextBuilder.d.ts +57 -0
- package/lib/types/core/createViewerContext.d.ts +26 -0
- package/lib/types/core/index.d.ts +23 -0
- package/lib/types/icons/index.d.ts +47 -0
- package/lib/types/index.d.ts +7 -0
- package/lib/types/plugins/PluginBase.d.ts +131 -0
- package/lib/types/plugins/PluginRegistry.d.ts +67 -0
- package/lib/types/plugins/defaults.d.ts +3 -0
- package/lib/types/plugins/format/DrcPlugin.d.ts +30 -0
- package/lib/types/plugins/format/GlbPlugin.d.ts +23 -0
- package/lib/types/plugins/format/ObjPlugin.d.ts +23 -0
- package/lib/types/plugins/format/PdbPlugin.d.ts +33 -0
- package/lib/types/plugins/format/PlyPlugin.d.ts +24 -0
- package/lib/types/plugins/format/StlPlugin.d.ts +25 -0
- package/lib/types/plugins/format/VtiPlugin.d.ts +60 -0
- package/lib/types/plugins/format/VtpPlugin.d.ts +24 -0
- package/lib/types/plugins/format/VtuPlugin.d.ts +25 -0
- package/lib/types/plugins/format/ZipPlugin.d.ts +38 -0
- package/lib/types/plugins/format/index.d.ts +13 -0
- package/lib/types/plugins/index.d.ts +13 -0
- package/lib/types/plugins/injectionKeys.d.ts +22 -0
- package/lib/types/plugins/pluginUtils.d.ts +61 -0
- package/lib/types/plugins/service/DragDropPlugin.d.ts +94 -0
- package/lib/types/plugins/service/KeyBindingPlugin.d.ts +83 -0
- package/lib/types/plugins/service/MemoryPressurePlugin.d.ts +68 -0
- package/lib/types/plugins/service/index.d.ts +6 -0
- package/lib/types/plugins/toolbar/animation/AnimationPlugin.d.ts +34 -0
- package/lib/types/plugins/toolbar/animation/index.d.ts +1 -0
- package/lib/types/plugins/toolbar/index.d.ts +9 -0
- package/lib/types/plugins/toolbar/interaction/CenterModelPlugin.d.ts +21 -0
- package/lib/types/plugins/toolbar/interaction/FullscreenPlugin.d.ts +27 -0
- package/lib/types/plugins/toolbar/interaction/PanPlugin.d.ts +24 -0
- package/lib/types/plugins/toolbar/interaction/ResetAllPlugin.d.ts +25 -0
- package/lib/types/plugins/toolbar/interaction/RotatePlugin.d.ts +24 -0
- package/lib/types/plugins/toolbar/interaction/ViewSelectPlugin.d.ts +26 -0
- package/lib/types/plugins/toolbar/interaction/ZoomPlugin.d.ts +24 -0
- package/lib/types/plugins/toolbar/interaction/index.d.ts +7 -0
- package/lib/types/plugins/toolbar/model/ClippingPlugin.d.ts +87 -0
- package/lib/types/plugins/toolbar/model/ColorByPlugin.d.ts +113 -0
- package/lib/types/plugins/toolbar/model/LoadModelPlugin.d.ts +93 -0
- package/lib/types/plugins/toolbar/model/RenderPrecisionPlugin.d.ts +68 -0
- package/lib/types/plugins/toolbar/model/RenderStylePlugin.d.ts +88 -0
- package/lib/types/plugins/toolbar/model/UnloadModelPlugin.d.ts +25 -0
- package/lib/types/plugins/toolbar/model/index.d.ts +6 -0
- package/lib/types/plugins/toolbar/scene/AxesPlugin.d.ts +96 -0
- package/lib/types/plugins/toolbar/scene/BackgroundColorPlugin.d.ts +25 -0
- package/lib/types/plugins/toolbar/scene/LanguageSwitchPlugin.d.ts +45 -0
- package/lib/types/plugins/toolbar/scene/LightIntensityPlugin.d.ts +42 -0
- package/lib/types/plugins/toolbar/scene/RenderGridPlugin.d.ts +98 -0
- package/lib/types/plugins/toolbar/scene/ThemeSwitchPlugin.d.ts +49 -0
- package/lib/types/plugins/toolbar/scene/index.d.ts +6 -0
- package/lib/types/plugins/toolbar/tools/BookmarkPlugin.d.ts +70 -0
- package/lib/types/plugins/toolbar/tools/MeasurementPlugin.d.ts +112 -0
- package/lib/types/plugins/toolbar/tools/PerformancePlugin.d.ts +55 -0
- package/lib/types/plugins/toolbar/tools/ScreenshotPlugin.d.ts +58 -0
- package/lib/types/plugins/toolbar/tools/index.d.ts +4 -0
- package/lib/types/plugins/toolbar/utils.d.ts +67 -0
- package/lib/types/plugins/types/index.d.ts +250 -0
- package/lib/types/plugins/ui/ErrorPlugin.d.ts +30 -0
- package/lib/types/plugins/ui/FilenameInfoPlugin.d.ts +40 -0
- package/lib/types/plugins/ui/LoadingPlugin.d.ts +28 -0
- package/lib/types/plugins/ui/SceneTreePlugin.d.ts +60 -0
- package/lib/types/plugins/ui/WebGLContextLostPlugin.d.ts +33 -0
- package/lib/types/plugins/ui/index.d.ts +8 -0
- package/lib/types/polyfills.d.ts +1 -0
- package/lib/types/types/index.d.ts +187 -0
- package/lib/types/types/vtk-modules.d.ts +80 -0
- package/lib/types/utils/asyncUtils.d.ts +8 -0
- package/lib/types/utils/colorByUtils.d.ts +55 -0
- package/lib/types/utils/debugLog.d.ts +13 -0
- package/lib/types/utils/errorHandler.d.ts +28 -0
- package/lib/types/utils/index.d.ts +10 -0
- package/lib/types/utils/sceneUtils.d.ts +11 -0
- package/lib/types/utils/themeManager.d.ts +78 -0
- package/lib/types/utils/volumeUtils.d.ts +14 -0
- package/lib/types/utils/vtkHelpers.d.ts +46 -0
- package/lib/types/utils/vtuLoader.d.ts +26 -0
- package/lib/types/utils/zipReader.d.ts +71 -0
- package/lib/vtkviewer.css +2 -0
- package/lib/vtkviewer.js +54714 -0
- package/lib/vtkviewer.umd.cjs +4560 -0
- package/package.json +89 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VTK.js 缺失模块的类型声明
|
|
3
|
+
*
|
|
4
|
+
* 本文件为 @kitware/vtk.js 中缺少 .d.ts 类型声明的模块提供类型定义。
|
|
5
|
+
* 基于源码分析生成,确保类型安全。
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
declare module '@kitware/vtk.js/Filters/General/MoleculeToRepresentation' {
|
|
9
|
+
import { vtkObject, vtkAlgorithm } from '@kitware/vtk.js/interfaces'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* MoleculeToRepresentation 初始值配置
|
|
13
|
+
*/
|
|
14
|
+
export interface IMoleculeToRepresentationInitialValues {
|
|
15
|
+
/** 原子半径缩放因子,默认 0.3 */
|
|
16
|
+
atomicRadiusScaleFactor?: number
|
|
17
|
+
/** 化学键半径,默认 0.075 */
|
|
18
|
+
bondRadius?: number
|
|
19
|
+
/** 化学键增量因子,默认 0.6 */
|
|
20
|
+
deltaBondFactor?: number
|
|
21
|
+
/** 隐藏的元素(逗号分隔的元素符号),默认 "" */
|
|
22
|
+
hideElements?: string
|
|
23
|
+
/** 半径类型,默认 "radiusVDW" */
|
|
24
|
+
radiusType?: string
|
|
25
|
+
/** 球体缩放数组名称,默认 "radius" */
|
|
26
|
+
sphereScaleArrayName?: string
|
|
27
|
+
/** 容差,默认 0.45 */
|
|
28
|
+
tolerance?: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type vtkMoleculeToRepresentationBase = vtkObject & vtkAlgorithm
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* vtkMoleculeToRepresentation - 将分子数据转换为可渲染的几何表示
|
|
35
|
+
*
|
|
36
|
+
* 该过滤器接受 vtkMolecule 作为输入,输出两个端口:
|
|
37
|
+
* - 端口 0:原子球体 PolyData(包含 radius scale array)
|
|
38
|
+
* - 端口 1:化学键棍棒 PolyData(包含 stickScales 和 orientation arrays)
|
|
39
|
+
*/
|
|
40
|
+
export interface vtkMoleculeToRepresentation extends vtkMoleculeToRepresentationBase {
|
|
41
|
+
getAtomicRadiusScaleFactor(): number
|
|
42
|
+
getBondRadius(): number
|
|
43
|
+
getDeltaBondFactor(): number
|
|
44
|
+
getHideElements(): string
|
|
45
|
+
getRadiusType(): string
|
|
46
|
+
getSphereScaleArrayName(): string
|
|
47
|
+
getTolerance(): number
|
|
48
|
+
setAtomicRadiusScaleFactor(atomicRadiusScaleFactor: number): boolean
|
|
49
|
+
setBondRadius(bondRadius: number): boolean
|
|
50
|
+
setDeltaBondFactor(deltaBondFactor: number): boolean
|
|
51
|
+
setHideElements(hideElements: string): boolean
|
|
52
|
+
setRadiusType(radiusType: string): boolean
|
|
53
|
+
setSphereScaleArrayName(sphereScaleArrayName: string): boolean
|
|
54
|
+
setTolerance(tolerance: number): boolean
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function extend(
|
|
58
|
+
publicAPI: object,
|
|
59
|
+
model: object,
|
|
60
|
+
initialValues?: IMoleculeToRepresentationInitialValues
|
|
61
|
+
): void
|
|
62
|
+
|
|
63
|
+
export function newInstance(
|
|
64
|
+
initialValues?: IMoleculeToRepresentationInitialValues
|
|
65
|
+
): vtkMoleculeToRepresentation
|
|
66
|
+
|
|
67
|
+
const vtkMoleculeToRepresentation: {
|
|
68
|
+
newInstance: typeof newInstance
|
|
69
|
+
extend: typeof extend
|
|
70
|
+
}
|
|
71
|
+
export default vtkMoleculeToRepresentation
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** draco3d 浏览器版类型声明 */
|
|
75
|
+
declare module 'draco3d' {
|
|
76
|
+
/** 创建 Draco 解码器模块的工厂函数 */
|
|
77
|
+
export function createDecoderModule(): Promise<{
|
|
78
|
+
Decoder: new () => any
|
|
79
|
+
}>
|
|
80
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ColorBy 智能选择工具
|
|
3
|
+
*
|
|
4
|
+
* 提供自动识别和选择最佳颜色映射数组的功能,
|
|
5
|
+
* 根据数组名称、分量数、数据位置等特征进行智能匹配。
|
|
6
|
+
*/
|
|
7
|
+
/** 颜色选项数据结构 */
|
|
8
|
+
export interface ColorByOption {
|
|
9
|
+
label: string;
|
|
10
|
+
value: string;
|
|
11
|
+
}
|
|
12
|
+
/** 数组特征信息 */
|
|
13
|
+
export interface ArrayFeature {
|
|
14
|
+
name: string;
|
|
15
|
+
location: 'PointData' | 'CellData';
|
|
16
|
+
numberOfComponents: number;
|
|
17
|
+
dataRange?: [number, number];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 智能选择最佳颜色映射数组
|
|
21
|
+
*
|
|
22
|
+
* @param options 颜色选项列表(不包含 Solid Color)
|
|
23
|
+
* @param arrayFeatures 数组特征信息(可选,用于更精确的匹配)
|
|
24
|
+
* @returns 最佳选项的 value,如果没有合适选项返回 ':'
|
|
25
|
+
*/
|
|
26
|
+
export declare function selectBestColorArray(options: ColorByOption[], arrayFeatures?: ArrayFeature[]): string;
|
|
27
|
+
/**
|
|
28
|
+
* 解析 ColorBy 选项的 value
|
|
29
|
+
* @param value 格式:'PointData:arrayName' 或 'CellData:arrayName' 或 ':'
|
|
30
|
+
* @returns [location, arrayName] 或 [null, null]
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseColorByValue(value: string): ['PointData' | 'CellData' | null, string | null];
|
|
33
|
+
/**
|
|
34
|
+
* 创建颜色选项(与官网 Geometry Viewer 标签格式一致)
|
|
35
|
+
* @param arrayName 数组名称
|
|
36
|
+
* @param location 数据位置
|
|
37
|
+
* @returns 颜色选项对象
|
|
38
|
+
*/
|
|
39
|
+
export declare function createColorByOption(arrayName: string, location: 'PointData' | 'CellData'): ColorByOption;
|
|
40
|
+
/**
|
|
41
|
+
* 创建 Solid Color 选项
|
|
42
|
+
* @returns Solid Color 选项对象
|
|
43
|
+
*/
|
|
44
|
+
export declare function createSolidColorOption(): ColorByOption;
|
|
45
|
+
/**
|
|
46
|
+
* 从 PolyData 中收集颜色可用的数组
|
|
47
|
+
*
|
|
48
|
+
* @param pointData 点数据
|
|
49
|
+
* @param cellData 单元数据
|
|
50
|
+
* @returns 颜色选项列表和数组特征信息
|
|
51
|
+
*/
|
|
52
|
+
export declare function collectColorableArrays(pointData: any, cellData: any): {
|
|
53
|
+
options: ColorByOption[];
|
|
54
|
+
features: ArrayFeature[];
|
|
55
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ConfigAccessor, ViewerContext } from '../core';
|
|
2
|
+
/**
|
|
3
|
+
* 调试日志(仅当 debug=true 时输出)
|
|
4
|
+
* @param ctxOrConfig ViewerContext 或 ConfigAccessor
|
|
5
|
+
* @param args 日志参数(同 console.log)
|
|
6
|
+
*/
|
|
7
|
+
export declare function debugLog(ctxOrConfig: ViewerContext | ConfigAccessor | null | undefined, ...args: any[]): void;
|
|
8
|
+
/**
|
|
9
|
+
* 调试警告(仅当 debug=true 时输出)
|
|
10
|
+
* @param ctxOrConfig ViewerContext 或 ConfigAccessor
|
|
11
|
+
* @param args 警告参数(同 console.warn)
|
|
12
|
+
*/
|
|
13
|
+
export declare function debugWarn(ctxOrConfig: ViewerContext | ConfigAccessor | null | undefined, ...args: any[]): void;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 错误处理工具函数
|
|
3
|
+
* 提供统一的错误捕获、分类和上报机制
|
|
4
|
+
*/
|
|
5
|
+
/** VTK 标准化错误对象 */
|
|
6
|
+
export interface VtkError {
|
|
7
|
+
type: string;
|
|
8
|
+
message: string;
|
|
9
|
+
severity: string;
|
|
10
|
+
recoverable: boolean;
|
|
11
|
+
details?: any;
|
|
12
|
+
code?: string;
|
|
13
|
+
[key: string]: any;
|
|
14
|
+
}
|
|
15
|
+
/** 错误严重级别 */
|
|
16
|
+
export type ErrorSeverity = 'info' | 'warning' | 'error' | 'fatal';
|
|
17
|
+
/** 标准化错误对象 */
|
|
18
|
+
export declare function normalizeError(error: unknown): VtkError;
|
|
19
|
+
/** 包装异步函数,捕获错误 */
|
|
20
|
+
export declare function withErrorHandling<T extends (...args: any[]) => Promise<any>>(fn: T, onError?: (error: VtkError) => void): T;
|
|
21
|
+
/** 安全执行函数,不抛出错误 */
|
|
22
|
+
export declare function safeExecute<T>(fn: () => T, fallback: T): T;
|
|
23
|
+
/** 格式化错误消息 */
|
|
24
|
+
export declare function formatErrorMessage(error: VtkError): string;
|
|
25
|
+
/** 判断错误是否可恢复 */
|
|
26
|
+
export declare function isRecoverable(error: VtkError): boolean;
|
|
27
|
+
/** 创建带上下文的错误 */
|
|
28
|
+
export declare function createError(type: string, message: string, options?: Partial<VtkError>): VtkError;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './asyncUtils';
|
|
2
|
+
export * from './colorByUtils';
|
|
3
|
+
export * from './debugLog';
|
|
4
|
+
export * from './errorHandler';
|
|
5
|
+
export * from './sceneUtils';
|
|
6
|
+
export * from './themeManager';
|
|
7
|
+
export * from './volumeUtils';
|
|
8
|
+
export * from './vtkHelpers';
|
|
9
|
+
export * from './vtuLoader';
|
|
10
|
+
export * from './zipReader';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EventBus, RenderSubContext, ResetManager, SceneSubContext } from '../core';
|
|
2
|
+
/**
|
|
3
|
+
* 完全卸载当前场景中的所有模型。
|
|
4
|
+
* 流程:清除场景 → 重置相机 → 重置独立插件 → 发事件 → 渲染 → GC 提示
|
|
5
|
+
*
|
|
6
|
+
* @param scene 场景子上下文
|
|
7
|
+
* @param render 渲染器子上下文
|
|
8
|
+
* @param resetManager 重置管理器
|
|
9
|
+
* @param events 事件总线
|
|
10
|
+
*/
|
|
11
|
+
export declare function unloadAllModels(scene: SceneSubContext, render: RenderSubContext, resetManager: ResetManager, events: EventBus): void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ThemeConfig } from '../core';
|
|
2
|
+
/**
|
|
3
|
+
* 主题管理器类
|
|
4
|
+
* 负责合并、查询和应用主题
|
|
5
|
+
*/
|
|
6
|
+
export declare class ThemeManager {
|
|
7
|
+
/** 内置主题 */
|
|
8
|
+
private builtinThemes;
|
|
9
|
+
/** 自定义主题(优先级高于内置主题) */
|
|
10
|
+
private customThemes;
|
|
11
|
+
/**
|
|
12
|
+
* 注册内置主题
|
|
13
|
+
* @param themes 内置主题配置映射
|
|
14
|
+
*/
|
|
15
|
+
registerBuiltinThemes(themes: Record<string, ThemeConfig>): void;
|
|
16
|
+
/**
|
|
17
|
+
* 设置自定义主题
|
|
18
|
+
* @param themes 自定义主题配置映射(会与内置主题合并,同名覆盖)
|
|
19
|
+
*/
|
|
20
|
+
setCustomThemes(themes: Record<string, ThemeConfig>): void;
|
|
21
|
+
/**
|
|
22
|
+
* 添加单个自定义主题
|
|
23
|
+
* @param id 主题ID
|
|
24
|
+
* @param theme 主题配置
|
|
25
|
+
*/
|
|
26
|
+
addCustomTheme(id: string, theme: ThemeConfig): void;
|
|
27
|
+
/**
|
|
28
|
+
* 移除自定义主题
|
|
29
|
+
* @param id 主题ID
|
|
30
|
+
*/
|
|
31
|
+
removeCustomTheme(id: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* 获取最终生效的主题(合并内置和自定义,自定义优先)
|
|
34
|
+
* @param id 主题ID
|
|
35
|
+
* @returns 主题配置,不存在返回 undefined
|
|
36
|
+
*/
|
|
37
|
+
getTheme(id: string): ThemeConfig | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* 获取所有生效的主题列表(合并后)
|
|
40
|
+
* @returns 主题配置映射
|
|
41
|
+
*/
|
|
42
|
+
getAllThemes(): Record<string, ThemeConfig>;
|
|
43
|
+
/**
|
|
44
|
+
* 获取所有生效的主题ID列表
|
|
45
|
+
* @returns 主题ID数组
|
|
46
|
+
*/
|
|
47
|
+
getThemeIds(): string[];
|
|
48
|
+
/**
|
|
49
|
+
* 应用主题到 DOM 容器
|
|
50
|
+
* @param container 目标容器元素
|
|
51
|
+
* @param themeId 主题ID
|
|
52
|
+
* @returns 是否应用成功
|
|
53
|
+
*/
|
|
54
|
+
applyTheme(container: HTMLElement | null, themeId: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* 应用主题颜色到 CSS 变量
|
|
57
|
+
* @param container 目标容器元素
|
|
58
|
+
* @param colors 主题颜色配置
|
|
59
|
+
*/
|
|
60
|
+
private applyThemeColors;
|
|
61
|
+
/**
|
|
62
|
+
* 清空自定义主题
|
|
63
|
+
*/
|
|
64
|
+
clearCustomThemes(): void;
|
|
65
|
+
/**
|
|
66
|
+
* 重置为主题管理器的初始状态
|
|
67
|
+
*/
|
|
68
|
+
reset(): void;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 获取全局主题管理器实例(单例)
|
|
72
|
+
* @returns 主题管理器实例
|
|
73
|
+
*/
|
|
74
|
+
export declare function getThemeManager(): ThemeManager;
|
|
75
|
+
/**
|
|
76
|
+
* 重置全局主题管理器(主要用于测试)
|
|
77
|
+
*/
|
|
78
|
+
export declare function resetThemeManager(): void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { VolumeRenderingConfig } from '../plugins';
|
|
2
|
+
/**
|
|
3
|
+
* 为给定的 ImageData 创建默认体渲染属性。
|
|
4
|
+
* 所有控制点位置按数据范围归一化(0=min, 1=max),与具体数据值解耦。
|
|
5
|
+
*
|
|
6
|
+
* @param source VTK ImageData 对象
|
|
7
|
+
* @param cfg 可选的体渲染配置覆盖
|
|
8
|
+
* @returns 配置好的 vtkVolumeProperty
|
|
9
|
+
*/
|
|
10
|
+
export declare function createDefaultVolumeProperty(source: any, cfg?: VolumeRenderingConfig): any;
|
|
11
|
+
/**
|
|
12
|
+
* 计算采样距离(基于 spacing)
|
|
13
|
+
*/
|
|
14
|
+
export declare function calcSampleDistance(source: any, scale?: number): number;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VTK.js 辅助工具函数
|
|
3
|
+
* 提供 VTK.js 常用操作的封装和类型安全工具
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 安全获取 VTK 对象(延迟加载兼容)
|
|
7
|
+
* VTK.js 的动态 import 返回的模块可能需要 .default 取值
|
|
8
|
+
*/
|
|
9
|
+
export declare function getVtkModule(modulePath: string): Promise<any>;
|
|
10
|
+
/**
|
|
11
|
+
* 从 ArrayBuffer 创建 VTK PolyData 的通用模式
|
|
12
|
+
* 大部分格式插件都需要执行此流程
|
|
13
|
+
*/
|
|
14
|
+
export declare function createActorFromPolyData(vtk: any, polyData: any): any;
|
|
15
|
+
/**
|
|
16
|
+
* 创建 Volume(体渲染)
|
|
17
|
+
*/
|
|
18
|
+
export declare function createVolumeFromImageData(vtk: any, imageData: any, volumeProperty?: any): any;
|
|
19
|
+
/**
|
|
20
|
+
* 计算 PolyData 的边界信息
|
|
21
|
+
*/
|
|
22
|
+
export declare function getPolyDataBounds(polyData: any): {
|
|
23
|
+
bounds: number[];
|
|
24
|
+
center: number[];
|
|
25
|
+
diagonal: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* 将十六进制颜色转换为 [r, g, b] 归一化数组
|
|
29
|
+
*/
|
|
30
|
+
export declare function hexToRgbNormalized(hex: string): [number, number, number];
|
|
31
|
+
/**
|
|
32
|
+
* 创建默认的标量映射(ColorBy)
|
|
33
|
+
*/
|
|
34
|
+
export declare function setupScalarMapping(actor: any, arrayName: string, componentIndex?: number): void;
|
|
35
|
+
/**
|
|
36
|
+
* 释放 VTK.js 对象(安全销毁)
|
|
37
|
+
*/
|
|
38
|
+
export declare function safeDeleteVtkObject(obj: any): void;
|
|
39
|
+
/**
|
|
40
|
+
* 判断浏览器是否支持 WebGL 2.0
|
|
41
|
+
*/
|
|
42
|
+
export declare function isWebGL2Supported(): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* 获取设备像素比(用于高DPI渲染)
|
|
45
|
+
*/
|
|
46
|
+
export declare function getDevicePixelRatio(): number;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VTU (VTK UnstructuredGrid) 文件加载器
|
|
3
|
+
*
|
|
4
|
+
* 解析 VTU 格式的 ArrayBuffer,提取几何数据并转换为 vtkPolyData 用于渲染。
|
|
5
|
+
* 支持 raw 和 base64 编码的附加数据,以及 zlib 压缩。
|
|
6
|
+
*
|
|
7
|
+
* 参考实现:https://github.com/SilentCodeSamurai/vtk-renderer-js
|
|
8
|
+
*/
|
|
9
|
+
/** 点数据数组信息 */
|
|
10
|
+
interface PointArrayInfo {
|
|
11
|
+
name: string;
|
|
12
|
+
components: number;
|
|
13
|
+
}
|
|
14
|
+
/** VTU 加载结果 */
|
|
15
|
+
export interface LoadedVtuModel {
|
|
16
|
+
polyData: any;
|
|
17
|
+
pointArrays: PointArrayInfo[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 从 ArrayBuffer 加载 VTU 文件
|
|
21
|
+
*
|
|
22
|
+
* @param fileBuffer VTU 文件的 ArrayBuffer
|
|
23
|
+
* @returns 包含 vtkPolyData 和点数据数组信息的结果
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadVtuFromArrayBuffer(fileBuffer: ArrayBuffer): LoadedVtuModel;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZIP 文件读取器工具
|
|
3
|
+
* 支持两种 ZIP 格式:
|
|
4
|
+
* 1. VTK.js 原生 ZIP (.vtkjs) - 包含 index.json 场景描述
|
|
5
|
+
* 2. 通用 ZIP 包 - 包含 OBJ/MTL/贴图等文件
|
|
6
|
+
*/
|
|
7
|
+
/** ZIP 解压后的文件映射 */
|
|
8
|
+
interface ZipFiles {
|
|
9
|
+
[path: string]: Uint8Array;
|
|
10
|
+
}
|
|
11
|
+
/** OBJ+MTL 单个材质组的输出 */
|
|
12
|
+
interface ObjOutput {
|
|
13
|
+
/** PolyData 数据 */
|
|
14
|
+
polyData: any;
|
|
15
|
+
/** 材质组名称(来自 OBJ usemtl 指令) */
|
|
16
|
+
name: string;
|
|
17
|
+
}
|
|
18
|
+
/** OBJ+MTL 解析结果 */
|
|
19
|
+
interface ObjParseResult {
|
|
20
|
+
/** 多个材质组的输出(splitMode: 'usemtl') */
|
|
21
|
+
outputs: ObjOutput[];
|
|
22
|
+
/** MTL Reader 实例(已解析材质和纹理) */
|
|
23
|
+
mtlReader?: any;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 解压 ZIP 文件
|
|
27
|
+
* @param arrayBuffer ZIP 文件的 ArrayBuffer 数据
|
|
28
|
+
* @returns 解压后的文件映射
|
|
29
|
+
*/
|
|
30
|
+
export declare function decompressZip(arrayBuffer: ArrayBuffer): ZipFiles;
|
|
31
|
+
/**
|
|
32
|
+
* 检测是否为 VTK.js 原生 ZIP 格式(.vtkjs)
|
|
33
|
+
* 判断依据:解压后包含 index.json 文件
|
|
34
|
+
* @param files 解压后的文件映射
|
|
35
|
+
* @returns 是否为 vtkjs 格式
|
|
36
|
+
*/
|
|
37
|
+
export declare function isVtkJsZip(files: ZipFiles): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* 解析 VTK.js 原生 ZIP 场景
|
|
40
|
+
* 从 index.json 中提取场景信息和数据
|
|
41
|
+
* @param files 解压后的文件映射
|
|
42
|
+
* @returns 解析结果
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseVtkJsScene(files: ZipFiles): {
|
|
45
|
+
scene: any;
|
|
46
|
+
dataMap: Map<string, Uint8Array>;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* 从 VTK.js 场景中提取主数据
|
|
50
|
+
* 使用 HttpDataSetReader + JSZipDataAccessHelper 加载数据
|
|
51
|
+
* @param scene 场景描述对象
|
|
52
|
+
* @param arrayBuffer 原始 ZIP ArrayBuffer 数据
|
|
53
|
+
* @returns PolyData 或其他 VTK 数据对象
|
|
54
|
+
*/
|
|
55
|
+
export declare function extractVtkJsData(scene: any, arrayBuffer: ArrayBuffer): Promise<any>;
|
|
56
|
+
/**
|
|
57
|
+
* 解析通用 ZIP 包中的 OBJ 模型
|
|
58
|
+
* 支持 OBJ + MTL + 贴图的组合
|
|
59
|
+
* 注意:此函数为异步,因为 MTLReader.setImageSrc() 返回 Promise
|
|
60
|
+
* @param files 解压后的文件映射
|
|
61
|
+
* @returns 解析结果(Promise)
|
|
62
|
+
*/
|
|
63
|
+
export declare function parseObjFromZip(files: ZipFiles): Promise<ObjParseResult>;
|
|
64
|
+
/**
|
|
65
|
+
* 解析通用 ZIP 包
|
|
66
|
+
* 自动检测内部文件格式并解析
|
|
67
|
+
* @param files 解压后的文件映射
|
|
68
|
+
* @returns 解析后的数据对象(如果是 OBJ+MTL,会包含 mtlReader)
|
|
69
|
+
*/
|
|
70
|
+
export declare function parseGenericZip(files: ZipFiles): Promise<any>;
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
:root{--iimm-vtk-text-xs:9px;--iimm-vtk-text-sm:11px;--iimm-vtk-text-base:12px;--iimm-vtk-text-lg:13px;--iimm-vtk-text-xl:16px;--iimm-vtk-text-xxs:10px;--iimm-vtk-font-normal:400;--iimm-vtk-font-medium:500;--iimm-vtk-font-semibold:600;--iimm-vtk-font-bold:700;--iimm-vtk-leading-tight:1.2;--iimm-vtk-leading-normal:1.4;--iimm-vtk-leading-relaxed:1.6;--iimm-vtk-tracking-normal:0;--iimm-vtk-tracking-tight:.3px;--iimm-vtk-tracking-wide:.5px;--iimm-vtk-font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--iimm-vtk-font-mono:"Fira Code", "SF Mono", "Cascadia Code", monospace;--iimm-vtk-spacing-xs:4px;--iimm-vtk-spacing-sm:6px;--iimm-vtk-spacing-base:8px;--iimm-vtk-spacing-lg:12px;--iimm-vtk-spacing-xl:16px;--iimm-vtk-radius-sm:4px;--iimm-vtk-radius-base:6px;--iimm-vtk-radius-lg:8px;--iimm-vtk-radius-xl:10px;--iimm-vtk-radius-full:50%;--iimm-vtk-color-text-primary:#e0e0e0;--iimm-vtk-color-text-secondary:#fff9;--iimm-vtk-color-text-disabled:#ffffff59;--iimm-vtk-color-text-inverse:#1a1a2e;--iimm-vtk-color-text-accent:#64ffda;--iimm-vtk-color-surface:#2a2a3e;--iimm-vtk-color-surface-raised:#1e1e30;--iimm-vtk-color-overlay:#0000008c;--iimm-vtk-color-border:#ffffff1f;--iimm-vtk-color-border-light:#ffffff14;--iimm-vtk-color-interactive-hover:#ffffff1f;--iimm-vtk-color-interactive-active:#64ffda2e;--iimm-vtk-color-accent:#64ffda;--iimm-vtk-color-accent-muted:#64ffda40;--iimm-vtk-color-input-bg:#00000040;--iimm-vtk-color-input-border:#ffffff1f;--iimm-vtk-color-input-focus:#64ffda;--iimm-vtk-color-slider-track:#ffffff1a;--iimm-vtk-color-slider-thumb:#64ffda;--iimm-vtk-color-info:#60a5fa;--iimm-vtk-color-success:#4ade80;--iimm-vtk-color-error:#ef4444;--iimm-vtk-color-error-text:#fca5a5;--iimm-vtk-color-warning:#f59e0b;--iimm-vtk-color-toggle-off:#ffffff26;--iimm-vtk-color-toggle-on:#64ffda;--iimm-vtk-color-toggle-knob:#fff;--iimm-vtk-color-divider:#ffffff1f;--iimm-vtk-width:100%;--iimm-vtk-height:100%;--iimm-vtk-min-width:0;--iimm-vtk-toolbar-bg:var(--iimm-vtk-color-surface,#a7a5a599);--iimm-vtk-toolbar-radius:var(--iimm-vtk-radius-lg,8px);--iimm-vtk-toolbar-padding:var(--iimm-vtk-spacing-base,8px);--iimm-vtk-toolbar-gap:var(--iimm-vtk-spacing-xs,4px);--iimm-vtk-toolbar-border-color:var(--iimm-vtk-color-border,#ffffff1a);--iimm-vtk-toolbar-backdrop-blur:8px;--iimm-vtk-btn-size:32px;--iimm-vtk-btn-bg:#ffffff0f;--iimm-vtk-btn-bg-hover:var(--iimm-vtk-color-interactive-hover,#ffffff26);--iimm-vtk-btn-bg-active:var(--iimm-vtk-color-interactive-active,#64ffda33);--iimm-vtk-btn-radius:var(--iimm-vtk-radius-base,6px);--iimm-vtk-btn-border-color:transparent;--iimm-vtk-btn-border-color-hover:#fff3;--iimm-vtk-btn-color:var(--iimm-vtk-color-text-primary,#e0e0e0);--iimm-vtk-btn-color-hover:#fff;--iimm-vtk-btn-color-active:var(--iimm-vtk-color-accent,#64ffda);--iimm-vtk-btn-transition:all .2s ease;--iimm-vtk-icon-size:20px;--iimm-vtk-toolbar-separator-color:#fff3;--iimm-vtk-toolbar-separator-size:1px;--iimm-vtk-toolbar-separator-height:20px;--iimm-vtk-toolbar-separator-margin:0 4px;--iimm-vtk-extension-bg:#a7a5a599;--iimm-vtk-extension-radius:var(--iimm-vtk-radius-lg,8px);--iimm-vtk-extension-padding:var(--iimm-vtk-spacing-xs,4px) var(--iimm-vtk-spacing-base,8px);--iimm-vtk-extension-gap:2px;--iimm-vtk-extension-min-height:28px;--iimm-vtk-extension-separator-color:#fff3;--iimm-vtk-extension-separator-height:16px;--iimm-vtk-extension-separator-margin:0 4px;--iimm-vtk-extension-font-size:var(--iimm-vtk-text-sm,11px);--iimm-vtk-extension-btn-size:28px;--iimm-vtk-extension-icon-size:16px;--iimm-vtk-info-panel-bg:#a7a5a599;--iimm-vtk-info-panel-radius:var(--iimm-vtk-radius-lg,8px);--iimm-vtk-info-panel-padding:var(--iimm-vtk-spacing-xs,4px) var(--iimm-vtk-spacing-base,8px);--iimm-vtk-info-panel-font-size:var(--iimm-vtk-text-base,12px);--iimm-vtk-info-panel-max-height:120px;--iimm-vtk-info-panel-gap-x:var(--iimm-vtk-spacing-lg,12px);--iimm-vtk-info-panel-gap-y:var(--iimm-vtk-spacing-xs,4px);--iimm-vtk-info-panel-label-color:var(--iimm-vtk-color-text-secondary,#fff9);--iimm-vtk-info-panel-value-color:#ffffffe6;--iimm-vtk-popup-bg:var(--iimm-vtk-color-surface,#2a2a3e);--iimm-vtk-popup-bg-secondary:var(--iimm-vtk-color-surface-raised,#1e1e30);--iimm-vtk-popup-border-color:var(--iimm-vtk-color-border,#ffffff1f);--iimm-vtk-popup-radius:var(--iimm-vtk-radius-lg,8px);--iimm-vtk-popup-padding:var(--iimm-vtk-spacing-xl,10px);--iimm-vtk-popup-shadow:0 4px 16px #00000059;--iimm-vtk-popup-font-size:var(--iimm-vtk-text-base,12px);--iimm-vtk-popup-color:var(--iimm-vtk-color-text-primary,#e0e0e0);--iimm-vtk-popup-label-color:var(--iimm-vtk-color-text-secondary,#fff9);--iimm-vtk-input-bg:var(--iimm-vtk-color-input-bg,#00000040);--iimm-vtk-input-border-color:var(--iimm-vtk-color-input-border,#ffffff1f);--iimm-vtk-input-border-color-focus:var(--iimm-vtk-color-input-focus,#64ffda);--iimm-vtk-input-radius:var(--iimm-vtk-radius-sm,4px);--iimm-vtk-input-padding:var(--iimm-vtk-spacing-xs,4px) var(--iimm-vtk-spacing-base,8px);--iimm-vtk-input-font-size:var(--iimm-vtk-text-base,12px);--iimm-vtk-input-color:var(--iimm-vtk-color-text-primary,#e0e0e0);--iimm-vtk-slider-track-bg:var(--iimm-vtk-color-slider-track,#ffffff1a);--iimm-vtk-slider-thumb-bg:var(--iimm-vtk-color-slider-thumb,#64ffda);--iimm-vtk-slider-thumb-size:12px;--iimm-vtk-transition-fast:.15s ease;--iimm-vtk-transition-normal:.25s ease;--iimm-vtk-transition-slow:.35s cubic-bezier(.4, 0, .2, 1);--iimm-vtk-z-panel:50;--iimm-vtk-z-toolbar:100;--iimm-vtk-z-toolbar-extra:110;--iimm-vtk-z-overlay:500;--iimm-vtk-z-popup:1000;--iimm-vtk-z-notification:5000;--iimm-vtk-z-max:9999;--iimm-vtk-loading-bg:var(--iimm-vtk-color-overlay,#0000008c);--iimm-vtk-loading-card-bg:#ffffff12;--iimm-vtk-loading-card-border-color:#ffffff1a;--iimm-vtk-loading-card-radius:20px;--iimm-vtk-loading-card-shadow:0 8px 32px #00000059;--iimm-vtk-loading-card-padding:32px 40px 28px;--iimm-vtk-loading-card-gap:var(--iimm-vtk-spacing-xl,20px);--iimm-vtk-loading-ring-size:88px;--iimm-vtk-loading-spinner-size:18px;--iimm-vtk-loading-bar-width:160px;--iimm-vtk-loading-bar-height:3px;--iimm-vtk-loading-info-font-size:var(--iimm-vtk-text-sm,11px);--iimm-vtk-loading-stage-font-size:var(--iimm-vtk-text-lg,13px);--iimm-vtk-loading-text-color:#ffffffeb;--iimm-vtk-loading-text-secondary:#ffffffbf;--iimm-vtk-loading-progress-gradient:linear-gradient(90deg, #60a5fa, #34d399);--iimm-vtk-error-bg:#dc262626;--iimm-vtk-error-border-color:#dc26264d;--iimm-vtk-error-overlay-bg:#00000073;--iimm-vtk-error-color:var(--iimm-vtk-color-error-text,#fca5a5);--iimm-vtk-error-card-padding:24px 32px;--iimm-vtk-error-card-gap:var(--iimm-vtk-spacing-lg,12px);--iimm-vtk-error-card-radius:12px;--iimm-vtk-error-card-max-width:400px;--iimm-vtk-error-icon-size:32px;--iimm-vtk-error-message-font-size:var(--iimm-vtk-text-lg,13px);--iimm-vtk-portal-panel-bg:var(--iimm-vtk-color-surface,#2a2a3e);--iimm-vtk-portal-panel-border-color:#ffffff1a;--iimm-vtk-portal-panel-radius:var(--iimm-vtk-radius-lg,8px);--iimm-vtk-portal-panel-shadow:0 4px 12px #0000004d;--iimm-vtk-portal-panel-padding:var(--iimm-vtk-spacing-lg,12px);--iimm-vtk-portal-panel-min-width:200px;--iimm-vtk-portal-notification-bg:var(--iimm-vtk-color-surface,#2a2a3e);--iimm-vtk-portal-notification-radius:var(--iimm-vtk-radius-lg,8px);--iimm-vtk-portal-notification-top:16px;--iimm-vtk-portal-notification-right:16px;--iimm-vtk-portal-notification-padding:var(--iimm-vtk-spacing-lg,12px) var(--iimm-vtk-spacing-xl,16px);--iimm-vtk-portal-notification-max-width:360px;--iimm-vtk-portal-notification-font-size:var(--iimm-vtk-text-lg,13px);--iimm-vtk-extra-toggle-bg:#ffffffe6;--iimm-vtk-extra-toggle-bg-hover:#fff;--iimm-vtk-extra-toggle-border-color:#0000001a;--iimm-vtk-extra-toggle-color:#00000080;--iimm-vtk-extra-toggle-color-hover:#000c;--iimm-vtk-extra-toggle-width:28px;--iimm-vtk-extra-toggle-height:16px;--iimm-vtk-extra-toggle-radius:0 0 6px 6px;--iimm-vtk-scene-tree-z:100;--iimm-vtk-scene-tree-toggle-top:50%;--iimm-vtk-scene-tree-toggle-z:101;--iimm-vtk-scene-tree-toggle-width:24px;--iimm-vtk-scene-tree-toggle-height:48px;--iimm-vtk-scene-tree-toggle-radius:var(--iimm-vtk-radius-base,6px);--iimm-vtk-scene-tree-toggle-font-size:var(--iimm-vtk-text-base,12px);--iimm-vtk-scene-tree-panel-blur:8px;--iimm-vtk-scene-tree-color-picker-z:200;--iimm-vtk-scene-tree-color-picker-width:160px;--iimm-vtk-scene-tree-header-padding:var(--iimm-vtk-spacing-base,8px) var(--iimm-vtk-spacing-lg,12px);--iimm-vtk-scene-tree-title-font-size:var(--iimm-vtk-text-lg,13px);--iimm-vtk-scene-tree-title-font-weight:var(--iimm-vtk-font-semibold,600);--iimm-vtk-scene-tree-close-size:22px;--iimm-vtk-scene-tree-list-padding:var(--iimm-vtk-spacing-xs,4px) 0;--iimm-vtk-scene-tree-empty-height:60px;--iimm-vtk-scene-tree-item-padding:var(--iimm-vtk-spacing-xs,4px) var(--iimm-vtk-spacing-base,8px);--iimm-vtk-scene-tree-item-margin:1px var(--iimm-vtk-spacing-xs,4px);--iimm-vtk-scene-tree-item-row-gap:var(--iimm-vtk-spacing-sm,6px);--iimm-vtk-scene-tree-item-checkbox-size:14px;--iimm-vtk-scene-tree-item-type-font-size:var(--iimm-vtk-text-xxs,10px);--iimm-vtk-scene-tree-item-type-width:16px;--iimm-vtk-scene-tree-item-name-font-size:var(--iimm-vtk-text-base,12px);--iimm-vtk-scene-tree-color-picker-padding:var(--iimm-vtk-spacing-base,8px);--iimm-vtk-scene-tree-color-preview-height:20px;--iimm-vtk-scene-tree-color-close-height:24px}.iimm-vtk-theme-dark{--iimm-vtk-toolbar-bg:#282837d9;--iimm-vtk-toolbar-border-color:#ffffff14;--iimm-vtk-btn-bg:#ffffff0f;--iimm-vtk-btn-bg-hover:#ffffff1f;--iimm-vtk-btn-bg-active:#64ffda2e;--iimm-vtk-btn-color:#c8c8d0;--iimm-vtk-btn-color-hover:#fff;--iimm-vtk-btn-color-active:#64ffda;--iimm-vtk-toolbar-separator-color:#ffffff1f;--iimm-vtk-extension-bg:#282837d9;--iimm-vtk-extension-separator-color:#ffffff1f;--iimm-vtk-info-panel-bg:#282837d9;--iimm-vtk-info-panel-label-color:#ffffff80;--iimm-vtk-info-panel-value-color:#ffffffe6;--iimm-vtk-popup-bg:#1e1e2e;--iimm-vtk-popup-bg-secondary:#16162a;--iimm-vtk-popup-border-color:#ffffff14;--iimm-vtk-popup-shadow:0 8px 24px #00000080;--iimm-vtk-popup-color:#c8c8d0;--iimm-vtk-popup-label-color:#ffffff80;--iimm-vtk-input-bg:#00000059;--iimm-vtk-input-border-color:#ffffff14;--iimm-vtk-input-color:#c8c8d0;--iimm-vtk-slider-track-bg:#ffffff14;--iimm-vtk-loading-bg:#000000a6;--iimm-vtk-loading-card-bg:#ffffff0d;--iimm-vtk-loading-card-border-color:#ffffff14;--iimm-vtk-error-overlay-bg:#0000008c;--iimm-vtk-extra-toggle-bg:#282837e6;--iimm-vtk-extra-toggle-bg-hover:#323246f2;--iimm-vtk-extra-toggle-border-color:#ffffff14;--iimm-vtk-extra-toggle-color:#ffffffb3;--iimm-vtk-extra-toggle-color-hover:#fffffff2;--iimm-vtk-portal-panel-bg:#1e1e2e;--iimm-vtk-portal-panel-border-color:#ffffff14;--iimm-vtk-portal-notification-bg:#1e1e2e}.iimm-vtk-theme-ocean{--iimm-vtk-toolbar-bg:#14283ce6;--iimm-vtk-toolbar-border-color:#64c8ff26;--iimm-vtk-btn-bg:#64c8ff14;--iimm-vtk-btn-bg-hover:#64c8ff26;--iimm-vtk-btn-bg-active:#64c8ff40;--iimm-vtk-btn-color:#8ec8e8;--iimm-vtk-btn-color-hover:#b0e0ff;--iimm-vtk-btn-color-active:#64c8ff;--iimm-vtk-btn-border-color-hover:#64c8ff40;--iimm-vtk-toolbar-separator-color:#64c8ff26;--iimm-vtk-extension-bg:#14283ce6;--iimm-vtk-extension-separator-color:#64c8ff26;--iimm-vtk-info-panel-bg:#14283ce6;--iimm-vtk-info-panel-label-color:#64c8ff80;--iimm-vtk-info-panel-value-color:#64c8ffe6;--iimm-vtk-popup-bg:#0a1929;--iimm-vtk-popup-bg-secondary:#0d2137;--iimm-vtk-popup-border-color:#64c8ff1f;--iimm-vtk-popup-shadow:0 8px 24px #00142880;--iimm-vtk-popup-color:#8ec8e8;--iimm-vtk-popup-label-color:#64c8ff80;--iimm-vtk-input-bg:#00142880;--iimm-vtk-input-border-color:#64c8ff1f;--iimm-vtk-input-border-color-focus:#64c8ff;--iimm-vtk-input-color:#8ec8e8;--iimm-vtk-slider-track-bg:#64c8ff1f;--iimm-vtk-slider-thumb-bg:#64c8ff;--iimm-vtk-loading-bg:#0a1929cc;--iimm-vtk-loading-card-bg:#14325099;--iimm-vtk-loading-card-border-color:#64c8ff1f;--iimm-vtk-loading-text-color:#b0e0ff;--iimm-vtk-loading-text-secondary:#64c8ff99;--iimm-vtk-loading-progress-gradient:linear-gradient(90deg, #0077b6, #48cae4);--iimm-vtk-error-bg:#ff646426;--iimm-vtk-error-border-color:#ff64644d;--iimm-vtk-error-color:#ff6b6b;--iimm-vtk-error-overlay-bg:#0a1929b3;--iimm-vtk-extra-toggle-bg:#14283cf2;--iimm-vtk-extra-toggle-bg-hover:#1e3750;--iimm-vtk-extra-toggle-border-color:#64c8ff26;--iimm-vtk-extra-toggle-color:#ffffffb3;--iimm-vtk-extra-toggle-color-hover:#fffffff2;--iimm-vtk-portal-panel-bg:#0a1929;--iimm-vtk-portal-panel-border-color:#64c8ff1f;--iimm-vtk-portal-notification-bg:#0a1929}.iimm-vtk-theme-forest{--iimm-vtk-toolbar-bg:#14281ee6;--iimm-vtk-toolbar-border-color:#64c89626;--iimm-vtk-btn-bg:#64c89614;--iimm-vtk-btn-bg-hover:#64c89626;--iimm-vtk-btn-bg-active:#64ffb440;--iimm-vtk-btn-color:#8ec8a8;--iimm-vtk-btn-color-hover:#b0e0c0;--iimm-vtk-btn-color-active:#64ff96;--iimm-vtk-btn-border-color-hover:#64c89640;--iimm-vtk-toolbar-separator-color:#64c89626;--iimm-vtk-extension-bg:#14281ee6;--iimm-vtk-extension-separator-color:#64c89626;--iimm-vtk-info-panel-bg:#14281ee6;--iimm-vtk-info-panel-label-color:#64c89680;--iimm-vtk-info-panel-value-color:#64c896e6;--iimm-vtk-popup-bg:#0a1910;--iimm-vtk-popup-bg-secondary:#0d2315;--iimm-vtk-popup-border-color:#64c8961f;--iimm-vtk-popup-shadow:0 8px 24px #00140f80;--iimm-vtk-popup-color:#8ec8a8;--iimm-vtk-popup-label-color:#64c89680;--iimm-vtk-input-bg:#00140f80;--iimm-vtk-input-border-color:#64c8961f;--iimm-vtk-input-border-color-focus:#64ff96;--iimm-vtk-input-color:#8ec8a8;--iimm-vtk-slider-track-bg:#64c8961f;--iimm-vtk-slider-thumb-bg:#64ff96;--iimm-vtk-loading-bg:#0a1910cc;--iimm-vtk-loading-card-bg:#14322399;--iimm-vtk-loading-card-border-color:#64c8961f;--iimm-vtk-loading-text-color:#b0e0c0;--iimm-vtk-loading-text-secondary:#64c89699;--iimm-vtk-loading-progress-gradient:linear-gradient(90deg, #2d6a4f, #52b788);--iimm-vtk-error-bg:#ff646426;--iimm-vtk-error-border-color:#ff64644d;--iimm-vtk-error-color:#ff6b6b;--iimm-vtk-error-overlay-bg:#0a1910b3;--iimm-vtk-extra-toggle-bg:#14281ef2;--iimm-vtk-extra-toggle-bg-hover:#1e3728;--iimm-vtk-extra-toggle-border-color:#64c89626;--iimm-vtk-extra-toggle-color:#ffffffb3;--iimm-vtk-extra-toggle-color-hover:#fffffff2;--iimm-vtk-portal-panel-bg:#0a1910;--iimm-vtk-portal-panel-border-color:#64c8961f;--iimm-vtk-portal-notification-bg:#0a1910}.iimm-vtk-theme-sunset{--iimm-vtk-toolbar-bg:#321e14e6;--iimm-vtk-toolbar-border-color:#ff966426;--iimm-vtk-btn-bg:#ff966414;--iimm-vtk-btn-bg-hover:#ff966426;--iimm-vtk-btn-bg-active:#ffb47840;--iimm-vtk-btn-color:#e8a888;--iimm-vtk-btn-color-hover:#ffc0a0;--iimm-vtk-btn-color-active:#ff9060;--iimm-vtk-btn-border-color-hover:#ff966440;--iimm-vtk-toolbar-separator-color:#ff966426;--iimm-vtk-extension-bg:#321e14e6;--iimm-vtk-extension-separator-color:#ff966426;--iimm-vtk-info-panel-bg:#321e14e6;--iimm-vtk-info-panel-label-color:#ff966480;--iimm-vtk-info-panel-value-color:#ff9664e6;--iimm-vtk-popup-bg:#1a0f0a;--iimm-vtk-popup-bg-secondary:#231410;--iimm-vtk-popup-border-color:#ff96641f;--iimm-vtk-popup-shadow:0 8px 24px #280f0580;--iimm-vtk-popup-color:#e8a888;--iimm-vtk-popup-label-color:#ff966480;--iimm-vtk-input-bg:#28140a80;--iimm-vtk-input-border-color:#ff96641f;--iimm-vtk-input-border-color-focus:#ff9060;--iimm-vtk-input-color:#e8a888;--iimm-vtk-slider-track-bg:#ff96641f;--iimm-vtk-slider-thumb-bg:#ff9060;--iimm-vtk-loading-bg:#1a0f0acc;--iimm-vtk-loading-card-bg:#321e1499;--iimm-vtk-loading-card-border-color:#ff96641f;--iimm-vtk-loading-text-color:#ffc0a0;--iimm-vtk-loading-text-secondary:#ff966499;--iimm-vtk-loading-progress-gradient:linear-gradient(90deg, #e85d04, #faa307);--iimm-vtk-error-bg:#ff646426;--iimm-vtk-error-border-color:#ff64644d;--iimm-vtk-error-color:#ff6b6b;--iimm-vtk-error-overlay-bg:#1a0f0ab3;--iimm-vtk-extra-toggle-bg:#321e14f2;--iimm-vtk-extra-toggle-bg-hover:#41281c;--iimm-vtk-extra-toggle-border-color:#ff966426;--iimm-vtk-extra-toggle-color:#ffffffb3;--iimm-vtk-extra-toggle-color-hover:#fffffff2;--iimm-vtk-portal-panel-bg:#1a0f0a;--iimm-vtk-portal-panel-border-color:#ff96641f;--iimm-vtk-portal-notification-bg:#1a0f0a}.iimm-vtk-theme-light{--iimm-vtk-toolbar-bg:#ffffffe0;--iimm-vtk-toolbar-border-color:#00000014;--iimm-vtk-btn-bg:#0000000a;--iimm-vtk-btn-bg-hover:#00000014;--iimm-vtk-btn-bg-active:#0064501f;--iimm-vtk-btn-color:#3a3a4a;--iimm-vtk-btn-color-hover:#1a1a2e;--iimm-vtk-btn-color-active:#00796b;--iimm-vtk-toolbar-separator-color:#0000001a;--iimm-vtk-extension-bg:#ffffffe0;--iimm-vtk-extension-separator-color:#0000001a;--iimm-vtk-info-panel-bg:#ffffffe0;--iimm-vtk-info-panel-label-color:#00000073;--iimm-vtk-info-panel-value-color:#000000d9;--iimm-vtk-popup-bg:#fff;--iimm-vtk-popup-bg-secondary:#f5f5f8;--iimm-vtk-popup-border-color:#0000001a;--iimm-vtk-popup-shadow:0 4px 16px #0000001f;--iimm-vtk-popup-color:#3a3a4a;--iimm-vtk-popup-label-color:#00000073;--iimm-vtk-input-bg:#0000000a;--iimm-vtk-input-border-color:#0000001f;--iimm-vtk-input-border-color-focus:#00796b;--iimm-vtk-input-color:#3a3a4a;--iimm-vtk-slider-track-bg:#0000001a;--iimm-vtk-slider-thumb-bg:#00796b;--iimm-vtk-loading-bg:#ffffffbf;--iimm-vtk-loading-card-bg:#ffffffe6;--iimm-vtk-loading-card-border-color:#00000014;--iimm-vtk-loading-card-shadow:0 8px 32px #0000001a;--iimm-vtk-loading-text-color:#000000d9;--iimm-vtk-loading-text-secondary:#0000008c;--iimm-vtk-loading-progress-gradient:linear-gradient(90deg, #3b82f6, #10b981);--iimm-vtk-error-bg:#dc262614;--iimm-vtk-error-border-color:#dc262633;--iimm-vtk-error-color:#dc2626;--iimm-vtk-error-overlay-bg:#ffffff8c;--iimm-vtk-extra-toggle-bg:#ffffffe6;--iimm-vtk-extra-toggle-bg-hover:#fff;--iimm-vtk-extra-toggle-border-color:#0000001a;--iimm-vtk-extra-toggle-color:#00000080;--iimm-vtk-extra-toggle-color-hover:#000c;--iimm-vtk-portal-panel-bg:#fff;--iimm-vtk-portal-panel-border-color:#0000001a;--iimm-vtk-portal-panel-shadow:0 4px 12px #00000014;--iimm-vtk-portal-notification-bg:#fff}.iimm-vtk-toolbar{align-items:center;gap:var(--iimm-vtk-toolbar-gap);padding:var(--iimm-vtk-toolbar-padding);background:var(--iimm-vtk-toolbar-bg);border-bottom:1px solid var(--iimm-vtk-toolbar-border-color);border-radius:var(--iimm-vtk-toolbar-radius);-webkit-backdrop-filter:blur(var(--iimm-vtk-toolbar-backdrop-blur));font-family:var(--iimm-vtk-font-family);z-index:var(--iimm-vtk-z-toolbar);-webkit-user-select:none;user-select:none;flex-wrap:wrap;display:flex;position:relative}@media (width<=479px){.iimm-vtk-toolbar{gap:2px;padding:4px}}@media (width>=480px) and (width<=767px){.iimm-vtk-toolbar{gap:2px;padding:4px}}@media (width>=768px) and (width<=1023px){.iimm-vtk-toolbar{gap:3px;padding:6px}}.iimm-vtk-toolbar-group{align-items:center;gap:2px;display:flex}.iimm-vtk-toolbar-item{align-items:center;gap:2px;display:inline-flex;position:relative}.iimm-vtk-toolbar-item select,.iimm-vtk-toolbar-item .iimm-vtk-view-select,.iimm-vtk-toolbar-item .iimm-vtk-popup-select{width:auto;min-width:80px}.iimm-vtk-toolbar-separator{width:var(--iimm-vtk-toolbar-separator-size);height:var(--iimm-vtk-toolbar-separator-height,20px);margin:var(--iimm-vtk-toolbar-separator-margin,0 4px);background:var(--iimm-vtk-toolbar-separator-color);border-radius:1px;flex-shrink:0}@media (width<=479px){.iimm-vtk-toolbar-separator{height:16px;margin:0 2px}}@media (width>=480px) and (width<=767px){.iimm-vtk-toolbar-separator{height:16px;margin:0 2px}}.iimm-vtk-toolbar-btn{cursor:pointer;font:inherit;color:var(--iimm-vtk-btn-color);-webkit-tap-highlight-color:transparent;width:var(--iimm-vtk-btn-size);height:var(--iimm-vtk-btn-size);border:none;border:1px solid var(--iimm-vtk-btn-border-color);border-radius:var(--iimm-vtk-btn-radius);background:0 0;background:var(--iimm-vtk-btn-bg);transition:var(--iimm-vtk-btn-transition);outline:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.iimm-vtk-toolbar-btn:hover{background:var(--iimm-vtk-btn-bg-hover);border-color:var(--iimm-vtk-btn-border-color-hover);color:var(--iimm-vtk-btn-color-hover)}.iimm-vtk-toolbar-btn:active{transform:scale(.92)}.iimm-vtk-toolbar-btn:focus-visible{outline:2px solid var(--iimm-vtk-btn-color-active);outline-offset:2px}.iimm-vtk-toolbar-btn.is-active{background:var(--iimm-vtk-btn-bg-active);border-color:var(--iimm-vtk-btn-color-active);color:var(--iimm-vtk-btn-color-active)}.iimm-vtk-toolbar-btn:disabled{opacity:.35;cursor:not-allowed;pointer-events:none}.iimm-vtk-toolbar-icon{width:var(--iimm-vtk-icon-size);height:var(--iimm-vtk-icon-size);flex-shrink:0;justify-content:center;align-items:center;display:flex}.iimm-vtk-toolbar-icon svg,.iimm-vtk-toolbar-icon [data-icon]{width:100%;height:100%}.iimm-vtk-toolbar-icon-text{font-size:var(--iimm-vtk-icon-size);line-height:1}.iimm-vtk-toolbar-btn--saved{color:var(--iimm-vtk-color-accent,#64ffda)!important;background:#64ffda26!important;border-color:#64ffda66!important}.iimm-vtk-toolbar-btn--restored{color:#60a5fa!important;background:#60a5fa26!important;border-color:#60a5fa66!important}.iimm-vtk-toolbar-btn--danger:hover{color:var(--iimm-vtk-color-error,#ef4444)!important;background:#ef444433!important;border-color:#ef444480!important}.iimm-vtk-toolbar-wrapper{flex-shrink:0;position:relative}.iimm-vtk-extension{z-index:var(--iimm-vtk-z-panel);align-items:center;gap:var(--iimm-vtk-extension-gap);padding:var(--iimm-vtk-extension-padding);background:var(--iimm-vtk-extension-bg);border-bottom:1px solid var(--iimm-vtk-toolbar-border-color);border-radius:var(--iimm-vtk-extension-radius);-webkit-backdrop-filter:blur(var(--iimm-vtk-toolbar-backdrop-blur));min-height:var(--iimm-vtk-extension-min-height,28px);font-family:var(--iimm-vtk-font-family);font-size:var(--iimm-vtk-extension-font-size);-webkit-user-select:none;user-select:none;flex-wrap:wrap;display:none;position:relative}.iimm-vtk-extension:has(.iimm-vtk-extension-item){display:flex}.iimm-vtk-extension-item{align-items:center;gap:var(--iimm-vtk-extension-item-gap,8px);flex-wrap:wrap;display:flex}.iimm-vtk-extension-item-with-label-wrapper{flex-direction:var(--iimm-vtk-extension-item-with-label-wrapper-flex-direction,row);align-items:var(--iimm-vtk-extension-item-with-label-wrapper-align-items,center);justify-content:var(--iimm-vtk-extension-item-with-label-wrapper-justify-content,flex-start);gap:var(--iimm-vtk-extension-item-with-label-wrapper-gap,4px);display:flex}.iimm-vtk-extension-separator{width:1px;height:var(--iimm-vtk-extension-separator-height,16px);margin:var(--iimm-vtk-extension-separator-margin,0 4px);background:var(--iimm-vtk-extension-separator-color);border-radius:1px;flex-shrink:0}.iimm-vtk-extension-btn{cursor:pointer;font:inherit;color:var(--iimm-vtk-btn-color);-webkit-tap-highlight-color:transparent;width:var(--iimm-vtk-extension-btn-size);height:var(--iimm-vtk-extension-btn-size);border-radius:var(--iimm-vtk-btn-radius);background:0 0;background:var(--iimm-vtk-btn-bg);transition:var(--iimm-vtk-btn-transition);font-size:var(--iimm-vtk-extension-font-size);border:1px solid #0000;outline:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.iimm-vtk-extension-btn:hover{background:var(--iimm-vtk-btn-bg-hover);color:var(--iimm-vtk-btn-color-hover)}.iimm-vtk-extension-btn:active{transform:scale(.92)}.iimm-vtk-extension-btn.is-active{background:var(--iimm-vtk-btn-bg-active);border-color:var(--iimm-vtk-btn-color-active);color:var(--iimm-vtk-btn-color-active)}.iimm-vtk-extension-icon{width:var(--iimm-vtk-extension-icon-size);height:var(--iimm-vtk-extension-icon-size);flex-shrink:0;justify-content:center;align-items:center;display:flex}.iimm-vtk-extension-icon svg,.iimm-vtk-extension-icon [data-icon]{width:100%;height:100%}.iimm-vtk-extension-label{font-size:var(--iimm-vtk-extension-font-size);color:var(--iimm-vtk-btn-color);white-space:nowrap}.iimm-vtk-info-panel{align-items:flex-start;gap:var(--iimm-vtk-info-panel-gap-y) var(--iimm-vtk-info-panel-gap-x);padding:var(--iimm-vtk-info-panel-padding);background:var(--iimm-vtk-info-panel-bg);border-bottom:1px solid var(--iimm-vtk-toolbar-border-color);border-radius:var(--iimm-vtk-info-panel-radius);-webkit-backdrop-filter:blur(var(--iimm-vtk-toolbar-backdrop-blur));max-height:var(--iimm-vtk-info-panel-max-height);font-family:var(--iimm-vtk-font-family);font-size:var(--iimm-vtk-info-panel-font-size);scrollbar-width:thin;scrollbar-color:var(--iimm-vtk-color-interactive-hover,#fff3) transparent;flex-wrap:wrap;display:none;position:relative;overflow-y:auto}.iimm-vtk-info-panel::-webkit-scrollbar{width:4px;height:4px}.iimm-vtk-info-panel::-webkit-scrollbar-track{background:0 0}.iimm-vtk-info-panel::-webkit-scrollbar-thumb{background:var(--iimm-vtk-color-interactive-hover,#fff3);border-radius:4px}.iimm-vtk-info-panel{-webkit-user-select:none;user-select:none}.iimm-vtk-info-panel:has(.iimm-vtk-info-item){flex-direction:var(--iimm-vtk-info-panel-flex-direction,row);display:flex}.iimm-vtk-info-item{align-items:center;gap:var(--iimm-vtk-info-panel-item-inner-gap,5px);line-height:var(--iimm-vtk-leading-normal,1.4);flex-flow:wrap;display:flex}.iimm-vtk-info-label{color:var(--iimm-vtk-info-panel-label-color);font-size:var(--iimm-vtk-info-panel-font-size);letter-spacing:var(--iimm-vtk-tracking-tight,.3px)}.iimm-vtk-info-value{color:var(--iimm-vtk-info-panel-value-color);font-size:var(--iimm-vtk-info-panel-font-size);font-family:var(--iimm-vtk-font-mono);font-weight:var(--iimm-vtk-font-medium,500)}.iimm-vtk-info-value--colored{font-weight:var(--iimm-vtk-font-semibold,600)}.iimm-vtk-dropdown{display:inline-flex;position:relative}.iimm-vtk-dropdown-content{z-index:var(--iimm-vtk-z-popup);z-index:var(--iimm-vtk-z-popup);background:var(--iimm-vtk-popup-bg);border:1px solid var(--iimm-vtk-popup-border-color);border-radius:var(--iimm-vtk-popup-radius);padding:var(--iimm-vtk-popup-padding);box-shadow:var(--iimm-vtk-popup-shadow);color:var(--iimm-vtk-popup-color);font-size:var(--iimm-vtk-popup-font-size);font-family:var(--iimm-vtk-font-family);-webkit-user-select:none;user-select:none;min-width:160px;animation:iimm-vtk-dropdown-enter var(--iimm-vtk-transition-normal) ease;position:absolute;top:calc(100% + 4px);left:50%;transform:translate(-50%)}.iimm-vtk-settings-panel{z-index:var(--iimm-vtk-z-popup);z-index:var(--iimm-vtk-z-popup);background:var(--iimm-vtk-popup-bg);border:1px solid var(--iimm-vtk-popup-border-color);border-radius:var(--iimm-vtk-popup-radius);padding:var(--iimm-vtk-popup-padding);box-shadow:var(--iimm-vtk-popup-shadow);color:var(--iimm-vtk-popup-color);font-size:var(--iimm-vtk-popup-font-size);font-family:var(--iimm-vtk-font-family);-webkit-user-select:none;user-select:none;min-width:180px;max-width:280px;animation:iimm-vtk-dropdown-enter var(--iimm-vtk-transition-normal) ease;position:absolute;top:calc(100% + 4px);left:0}.iimm-vtk-popup-section{gap:var(--iimm-vtk-spacing-base,8px);flex-direction:column;display:flex}.iimm-vtk-popup-row{align-items:center;gap:var(--iimm-vtk-spacing-base,8px);display:flex}.iimm-vtk-popup-label{font-size:var(--iimm-vtk-text-sm,11px);color:var(--iimm-vtk-popup-label-color);white-space:nowrap;letter-spacing:var(--iimm-vtk-tracking-tight,.3px);flex-shrink:0;min-width:50px}.iimm-vtk-popup-header{align-items:center;gap:var(--iimm-vtk-spacing-base,8px);padding-bottom:var(--iimm-vtk-spacing-base,8px);margin-bottom:var(--iimm-vtk-spacing-base,8px);border-bottom:1px solid var(--iimm-vtk-popup-border-color);display:flex}.iimm-vtk-popup-title{font-size:var(--iimm-vtk-text-lg,13px);font-weight:var(--iimm-vtk-font-semibold,600);color:var(--iimm-vtk-popup-color);white-space:nowrap;flex:1}.iimm-vtk-popup-value-accent{font-size:var(--iimm-vtk-text-sm,11px);font-weight:var(--iimm-vtk-font-semibold,600);color:var(--iimm-vtk-btn-color-active)}.iimm-vtk-popup-input{width:100%;padding:var(--iimm-vtk-input-padding);background:var(--iimm-vtk-input-bg);border:1px solid var(--iimm-vtk-input-border-color);border-radius:var(--iimm-vtk-input-radius);color:var(--iimm-vtk-input-color);font-size:var(--iimm-vtk-input-font-size);font-family:var(--iimm-vtk-font-mono);transition:border-color var(--iimm-vtk-transition-fast);outline:none}.iimm-vtk-popup-input:focus{border-color:var(--iimm-vtk-input-border-color-focus)}.iimm-vtk-popup-select{width:100%;padding:var(--iimm-vtk-input-padding);background:var(--iimm-vtk-input-bg);border:1px solid var(--iimm-vtk-input-border-color);border-radius:var(--iimm-vtk-input-radius);color:var(--iimm-vtk-input-color);font-size:var(--iimm-vtk-input-font-size);font-family:var(--iimm-vtk-font-mono);transition:border-color var(--iimm-vtk-transition-fast);outline:none}.iimm-vtk-popup-select:focus{border-color:var(--iimm-vtk-input-border-color-focus)}.iimm-vtk-popup-select{cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 5l3 3 3-3' stroke='%23888' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;padding-right:24px}.iimm-vtk-popup-select option{background:var(--iimm-vtk-popup-bg);color:var(--iimm-vtk-popup-color)}.iimm-vtk-popup-slider{appearance:none;background:var(--iimm-vtk-slider-track-bg);cursor:pointer;border-radius:2px;outline:none;width:100%;height:4px}.iimm-vtk-popup-slider::-webkit-slider-thumb{appearance:none;width:var(--iimm-vtk-slider-thumb-size);height:var(--iimm-vtk-slider-thumb-size);background:var(--iimm-vtk-slider-thumb-bg);border-radius:var(--iimm-vtk-radius-full,50%);cursor:pointer;transition:transform var(--iimm-vtk-transition-fast)}.iimm-vtk-popup-slider::-webkit-slider-thumb:hover{transform:scale(1.2)}.iimm-vtk-popup-slider::-moz-range-thumb{width:var(--iimm-vtk-slider-thumb-size);height:var(--iimm-vtk-slider-thumb-size);background:var(--iimm-vtk-slider-thumb-bg);border-radius:var(--iimm-vtk-radius-full,50%);cursor:pointer;border:none}.iimm-vtk-popup-slider{flex:1}.iimm-vtk-popup-toggle{background:var(--iimm-vtk-color-toggle-off,#ffffff26);cursor:pointer;width:36px;height:20px;transition:background var(--iimm-vtk-transition-fast);border-radius:10px;position:relative}.iimm-vtk-popup-toggle:after{content:"";background:var(--iimm-vtk-color-toggle-knob,#fff);border-radius:var(--iimm-vtk-radius-full,50%);width:16px;height:16px;transition:transform var(--iimm-vtk-transition-fast);position:absolute;top:2px;left:2px}.iimm-vtk-popup-toggle.is-active,.iimm-vtk-popup-toggle[aria-checked=true]{background:var(--iimm-vtk-btn-color-active)}.iimm-vtk-popup-toggle.is-active:after,.iimm-vtk-popup-toggle[aria-checked=true]:after{transform:translate(16px)}.iimm-vtk-popup-toggle{flex-shrink:0}.iimm-vtk-popup-checkbox{width:16px;height:16px;accent-color:var(--iimm-vtk-btn-color-active);cursor:pointer;flex-shrink:0}.iimm-vtk-popup-divider{background:var(--iimm-vtk-color-divider);height:1px;margin:var(--iimm-vtk-spacing-sm,6px) 0}.iimm-vtk-popup-btn{cursor:pointer;font:inherit;color:var(--iimm-vtk-popup-color);-webkit-tap-highlight-color:transparent;border:none;border:1px solid var(--iimm-vtk-popup-border-color);border-radius:var(--iimm-vtk-input-radius);background:0 0;background:var(--iimm-vtk-input-bg);font-size:var(--iimm-vtk-popup-font-size);cursor:pointer;transition:all var(--iimm-vtk-transition-fast);outline:none;justify-content:center;align-items:center;padding:4px 10px;display:inline-flex}.iimm-vtk-popup-btn:hover{background:var(--iimm-vtk-btn-bg-hover);border-color:var(--iimm-vtk-btn-border-color-hover)}.iimm-vtk-popup-btn.is-primary{background:var(--iimm-vtk-btn-bg-active);border-color:var(--iimm-vtk-btn-color-active);color:var(--iimm-vtk-btn-color-active)}.iimm-vtk-color-picker{cursor:pointer;align-items:center;display:inline-flex;position:relative}.iimm-vtk-color-picker input[type=color]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.iimm-vtk-color-indicator{border:1px solid var(--iimm-vtk-popup-border-color);border-radius:4px;flex-shrink:0;width:20px;height:20px}.iimm-vtk-view-select{width:100%;padding:var(--iimm-vtk-input-padding);background:var(--iimm-vtk-input-bg);border:1px solid var(--iimm-vtk-input-border-color);border-radius:var(--iimm-vtk-input-radius);color:var(--iimm-vtk-input-color);font-size:var(--iimm-vtk-input-font-size);font-family:var(--iimm-vtk-font-mono);transition:border-color var(--iimm-vtk-transition-fast);outline:none}.iimm-vtk-view-select:focus{border-color:var(--iimm-vtk-input-border-color-focus)}.iimm-vtk-view-select{cursor:pointer;min-width:80px}.iimm-vtk-view-select option{background:var(--iimm-vtk-popup-bg);color:var(--iimm-vtk-popup-color)}@keyframes iimm-vtk-dropdown-enter{0%{opacity:0;transform:translate(-50%)translateY(-4px)}to{opacity:1;transform:translate(-50%)translateY(0)}}.iimm-vtk-popup-slider-row{align-items:center;gap:var(--iimm-vtk-spacing-base,8px);gap:var(--iimm-vtk-spacing-sm,6px);display:flex}.iimm-vtk-popup-text{text-align:center;font-size:var(--iimm-vtk-popup-font-size);color:var(--iimm-vtk-popup-label-color)}@keyframes iimm-vtk-panel-enter{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.iimm-vtk-overlay{z-index:var(--iimm-vtk-z-overlay);pointer-events:none;flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.iimm-vtk-loading{background:var(--iimm-vtk-loading-bg);-webkit-backdrop-filter:blur(6px);pointer-events:auto;animation:.3s iimm-vtk-loading-fadein}@keyframes iimm-vtk-loading-fadein{0%{opacity:0}to{opacity:1}}.iimm-vtk-loading-card{align-items:center;gap:var(--iimm-vtk-loading-card-gap,var(--iimm-vtk-spacing-xl,20px));padding:var(--iimm-vtk-loading-card-padding,32px 40px 28px);background:var(--iimm-vtk-loading-card-bg);border:1px solid var(--iimm-vtk-loading-card-border-color);border-radius:var(--iimm-vtk-loading-card-radius);-webkit-backdrop-filter:blur(20px);box-shadow:var(--iimm-vtk-loading-card-shadow), inset 0 1px 0 #ffffff14;flex-direction:column;display:flex}.iimm-vtk-loading-ring-wrapper{width:var(--iimm-vtk-loading-ring-size,88px);height:var(--iimm-vtk-loading-ring-size,88px);position:relative}.iimm-vtk-loading-ring-orbit{border:2px solid #60a5fa40;border-color:#60a5fa40 #34d39926 #0000 #0000;border-radius:50%;animation:2.4s linear infinite iimm-vtk-ring-orbit;position:absolute;inset:-5px}@keyframes iimm-vtk-ring-orbit{to{transform:rotate(360deg)}}.iimm-vtk-loading-ring{width:100%;height:100%;transform:rotate(-90deg)}.iimm-vtk-loading-ring-bg{stroke:#ffffff14}.iimm-vtk-loading-ring-fg{transition:stroke-dashoffset .4s cubic-bezier(.4,0,.2,1)}.iimm-vtk-loading-center{justify-content:center;align-items:center;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.iimm-vtk-loading-spinner{width:var(--iimm-vtk-loading-spinner-size,18px);height:var(--iimm-vtk-loading-spinner-size,18px);border:2px solid #ffffff26;border-top-color:var(--iimm-vtk-loading-text-color,#fff);border-radius:var(--iimm-vtk-radius-full,50%);animation:.9s linear infinite iimm-vtk-spinner-rotate}@keyframes iimm-vtk-spinner-rotate{to{transform:rotate(360deg)}}.iimm-vtk-loading-info{justify-content:center;align-items:center;display:flex}.iimm-vtk-loading-info-text{color:var(--iimm-vtk-loading-text-secondary);font-size:var(--iimm-vtk-loading-info-font-size,var(--iimm-vtk-text-sm,11px));opacity:.7;letter-spacing:.1px}.iimm-vtk-loading-stage{color:var(--iimm-vtk-loading-text-secondary);font-size:var(--iimm-vtk-loading-stage-font-size,var(--iimm-vtk-text-lg,13px));letter-spacing:.2px;align-items:center;line-height:1;display:flex}.iimm-vtk-loading-stage-label{font-weight:var(--iimm-vtk-font-medium,500)}.iimm-vtk-loading-dots span{opacity:0;font-weight:var(--iimm-vtk-font-bold,700);margin-left:1px;animation:1.4s infinite iimm-vtk-dot-blink}.iimm-vtk-loading-dots span:nth-child(2){animation-delay:.2s}.iimm-vtk-loading-dots span:nth-child(3){animation-delay:.4s}@keyframes iimm-vtk-dot-blink{0%,20%{opacity:0}50%{opacity:1}to{opacity:0}}.iimm-vtk-loading-bar{width:var(--iimm-vtk-loading-bar-width,160px);height:var(--iimm-vtk-loading-bar-height,3px);background:#ffffff14;border-radius:2px;overflow:hidden}.iimm-vtk-loading-bar-fill{background:var(--iimm-vtk-loading-progress-gradient);border-radius:2px;height:100%;transition:width .4s cubic-bezier(.4,0,.2,1);box-shadow:0 0 10px #60a5fa59}.iimm-vtk-loading-bar--indeterminate{background:0 0;width:100%;position:relative;overflow:hidden}.iimm-vtk-loading-bar--indeterminate:after{content:"";background:var(--iimm-vtk-loading-progress-gradient);border-radius:2px;animation:1.8s ease-in-out infinite iimm-vtk-loading-indeterminate;position:absolute;inset:0;box-shadow:0 0 10px #60a5fa59}@keyframes iimm-vtk-loading-indeterminate{0%{width:50%;left:-50%}50%{width:60%}to{width:50%;left:100%}}.iimm-vtk-loading--busy .iimm-vtk-loading-ring-fg{animation:1.5s ease-in-out infinite iimm-vtk-ring-pulse}.iimm-vtk-loading--busy .iimm-vtk-loading-spinner{animation:1.5s ease-in-out infinite iimm-vtk-spinner-rotate-pulse}.iimm-vtk-loading--busy .iimm-vtk-loading-bar-fill{box-shadow:none;background:0 0;transition:none}.iimm-vtk-loading--busy .iimm-vtk-loading-bar--indeterminate{background:0 0}@keyframes iimm-vtk-ring-pulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes iimm-vtk-bar-pulse{0%,to{opacity:1;box-shadow:0 0 10px #60a5fa59}50%{opacity:.5;box-shadow:0 0 20px #60a5fa99}}@keyframes iimm-vtk-spinner-rotate-pulse{0%{opacity:1;transform:rotate(0)}50%{opacity:.4;transform:rotate(540deg)}to{opacity:1;transform:rotate(1080deg)}}.iimm-vtk-error,.iimm-vtk-error-overlay{background:var(--iimm-vtk-error-overlay-bg,#00000073);-webkit-backdrop-filter:blur(4px);pointer-events:auto}.iimm-vtk-error-card{align-items:center;gap:var(--iimm-vtk-error-card-gap,var(--iimm-vtk-spacing-lg,12px));padding:var(--iimm-vtk-error-card-padding,24px 32px);background:var(--iimm-vtk-error-bg);border:1px solid var(--iimm-vtk-error-border-color);border-radius:var(--iimm-vtk-error-card-radius,12px);-webkit-backdrop-filter:blur(12px);max-width:var(--iimm-vtk-error-card-max-width,400px);text-align:center;flex-direction:column;display:flex}.iimm-vtk-error-icon{width:var(--iimm-vtk-error-icon-size,32px);height:var(--iimm-vtk-error-icon-size,32px);color:var(--iimm-vtk-error-color)}.iimm-vtk-error-message{color:var(--iimm-vtk-error-color);font-size:var(--iimm-vtk-error-message-font-size,var(--iimm-vtk-text-lg,13px));line-height:var(--iimm-vtk-leading-normal,1.5);word-break:break-word}.iimm-vtk-error-actions{gap:var(--iimm-vtk-spacing-base,8px);margin-top:var(--iimm-vtk-spacing-xs,4px);display:flex}.iimm-vtk-portal{z-index:var(--iimm-vtk-z-panel);position:relative}.iimm-vtk-portal-overlay{pointer-events:none;flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.iimm-vtk-portal-panel{z-index:var(--iimm-vtk-z-popup);background:var(--iimm-vtk-portal-panel-bg);border:1px solid var(--iimm-vtk-portal-panel-border-color);border-radius:var(--iimm-vtk-portal-panel-radius);box-shadow:var(--iimm-vtk-portal-panel-shadow);padding:var(--iimm-vtk-portal-panel-padding,var(--iimm-vtk-spacing-lg,12px));min-width:var(--iimm-vtk-portal-panel-min-width,200px);font-family:var(--iimm-vtk-font-family);animation:iimm-vtk-panel-enter var(--iimm-vtk-transition-normal) ease;position:absolute}.iimm-vtk-portal-notification{top:var(--iimm-vtk-portal-notification-top,16px);right:var(--iimm-vtk-portal-notification-right,16px);z-index:var(--iimm-vtk-z-notification);background:var(--iimm-vtk-portal-notification-bg);border:1px solid var(--iimm-vtk-popup-border-color);border-radius:var(--iimm-vtk-portal-notification-radius);box-shadow:var(--iimm-vtk-popup-shadow);padding:var(--iimm-vtk-portal-notification-padding,var(--iimm-vtk-spacing-lg,12px) var(--iimm-vtk-spacing-xl,16px));max-width:var(--iimm-vtk-portal-notification-max-width,360px);font-family:var(--iimm-vtk-font-family);font-size:var(--iimm-vtk-portal-notification-font-size,var(--iimm-vtk-text-lg,13px));color:var(--iimm-vtk-popup-color);animation:.3s iimm-vtk-notification-enter;position:fixed}.iimm-vtk-portal-notification--info{border-left:3px solid var(--iimm-vtk-color-info,#60a5fa)}.iimm-vtk-portal-notification--success{border-left:3px solid var(--iimm-vtk-color-success,#34d399)}.iimm-vtk-portal-notification--warning{border-left:3px solid var(--iimm-vtk-color-warning,#fbbf24)}.iimm-vtk-portal-notification--error{border-left:3px solid var(--iimm-vtk-color-error,#ef4444)}@keyframes iimm-vtk-notification-enter{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}.iimm-vtk-extra-toggle{cursor:pointer;font:inherit;color:var(--iimm-vtk-extra-toggle-color);-webkit-tap-highlight-color:transparent;z-index:var(--iimm-vtk-z-toolbar-extra);width:var(--iimm-vtk-extra-toggle-width,28px);height:var(--iimm-vtk-extra-toggle-height,16px);border:none;border:1px solid var(--iimm-vtk-extra-toggle-border-color);border-radius:var(--iimm-vtk-extra-toggle-radius,0 0 6px 6px);background:0 0;background:var(--iimm-vtk-extra-toggle-bg);-webkit-backdrop-filter:blur(var(--iimm-vtk-toolbar-backdrop-blur));transition:all var(--iimm-vtk-transition-normal);outline:none;justify-content:center;align-items:center;padding:0;line-height:1;display:flex;position:absolute;bottom:-10px;left:50%;transform:translate(-50%)}.iimm-vtk-extra-toggle:hover{background:var(--iimm-vtk-extra-toggle-bg-hover);color:var(--iimm-vtk-extra-toggle-color-hover);border-color:var(--iimm-vtk-extra-toggle-border-color)}.iimm-vtk-extra-toggle:active{transform:translate(-50%)scale(.92)}.iimm-vtk-extra-toggle svg{transition:transform var(--iimm-vtk-transition-slow)}.iimm-vtk-extra-toggle.is-collapsed svg{transform:rotate(180deg)}.iimm-vtk-extra{width:100%;z-index:var(--iimm-vtk-z-panel);position:absolute}.iimm-vtk-extra-fade-enter-active,.iimm-vtk-extra-fade-leave-active{transition:opacity var(--iimm-vtk-transition-normal), transform var(--iimm-vtk-transition-normal);transform-origin:top}.iimm-vtk-extra-fade-enter-from,.iimm-vtk-extra-fade-leave-to{opacity:0;transform:scaleY(.85)}.iimm-vtk-theme-switch,.iimm-vtk-theme-switch-btn{position:relative}.iimm-vtk-theme-switch-btn:after{content:"";background:var(--iimm-vtk-btn-color-active);opacity:.8;border-radius:50%;width:4px;height:4px;position:absolute;bottom:2px;left:50%;transform:translate(-50%)}.iimm-vtk-theme-dropdown{z-index:var(--iimm-vtk-z-popup);background:var(--iimm-vtk-popup-bg);border:1px solid var(--iimm-vtk-popup-border-color);border-radius:var(--iimm-vtk-popup-radius);padding:var(--iimm-vtk-popup-padding);box-shadow:var(--iimm-vtk-popup-shadow);color:var(--iimm-vtk-popup-color);font-size:var(--iimm-vtk-popup-font-size);font-family:var(--iimm-vtk-font-family);-webkit-user-select:none;user-select:none;transform-origin:100% 0;min-width:160px;padding:4px;animation:.2s iimm-vtk-theme-dropdown-in;position:absolute;top:calc(100% + 6px);right:0}@keyframes iimm-vtk-theme-dropdown-in{0%{opacity:0;transform:scale(.9)translateY(-4px)}to{opacity:1;transform:scale(1)translateY(0)}}.iimm-vtk-theme-option{align-items:center;gap:var(--iimm-vtk-spacing-base,8px);padding:var(--iimm-vtk-spacing-sm,6px) var(--iimm-vtk-spacing-base,8px);border-radius:var(--iimm-vtk-input-radius);cursor:pointer;transition:background var(--iimm-vtk-transition-fast);display:flex}.iimm-vtk-theme-option:hover{background:var(--iimm-vtk-btn-bg-hover)}.iimm-vtk-theme-option.is-active{background:var(--iimm-vtk-btn-bg-active)}.iimm-vtk-theme-preview{background:var(--iimm-vtk-popup-border,#ffffff1f);border-radius:4px;flex-shrink:0;gap:2px;padding:1px;display:flex}.iimm-vtk-theme-preview-swatch{border-radius:2px;width:10px;height:14px;display:block}.iimm-vtk-theme-name{font-size:var(--iimm-vtk-text-base,12px);color:var(--iimm-vtk-popup-color);flex:1}.iimm-vtk-theme-check{font-size:var(--iimm-vtk-text-base,12px);color:var(--iimm-vtk-btn-color-active);font-weight:var(--iimm-vtk-font-semibold,600)}.iimm-vtk-language-switch{position:relative}.iimm-vtk-language-switch-btn{gap:var(--iimm-vtk-spacing-xs,2px);position:relative}.iimm-vtk-language-switch-btn .iimm-vtk-toolbar-icon{opacity:var(--iimm-vtk-language-icon-opacity,.6)}.iimm-vtk-language-current{font-size:var(--iimm-vtk-language-badge-font-size,var(--iimm-vtk-text-xxs,10px));font-weight:var(--iimm-vtk-font-bold,700);color:var(--iimm-vtk-btn-color-active);background:var(--iimm-vtk-language-badge-bg,var(--iimm-vtk-btn-bg-active));padding:var(--iimm-vtk-language-badge-padding,0 3px);border-radius:var(--iimm-vtk-language-badge-radius,3px);line-height:1;position:absolute;bottom:1px;left:50%;transform:translate(-50%)}.iimm-vtk-language-dropdown{z-index:var(--iimm-vtk-z-popup);background:var(--iimm-vtk-popup-bg);border:1px solid var(--iimm-vtk-popup-border-color);border-radius:var(--iimm-vtk-popup-radius);padding:var(--iimm-vtk-popup-padding);box-shadow:var(--iimm-vtk-popup-shadow);color:var(--iimm-vtk-popup-color);font-size:var(--iimm-vtk-popup-font-size);font-family:var(--iimm-vtk-font-family);-webkit-user-select:none;user-select:none;transform-origin:100% 0;min-width:130px;padding:4px;animation:.2s iimm-vtk-language-dropdown-in;position:absolute;top:calc(100% + 6px);right:0}@keyframes iimm-vtk-language-dropdown-in{0%{opacity:0;transform:scale(.9)translateY(-4px)}to{opacity:1;transform:scale(1)translateY(0)}}.iimm-vtk-language-option{align-items:center;gap:var(--iimm-vtk-spacing-base,8px);padding:var(--iimm-vtk-spacing-sm,6px) var(--iimm-vtk-spacing-base,8px);border-radius:var(--iimm-vtk-input-radius);cursor:pointer;transition:background var(--iimm-vtk-transition-fast);display:flex}.iimm-vtk-language-option:hover{background:var(--iimm-vtk-btn-bg-hover)}.iimm-vtk-language-option.is-active{background:var(--iimm-vtk-btn-bg-active)}.iimm-vtk-language-label{font-size:var(--iimm-vtk-text-base,12px);color:var(--iimm-vtk-popup-color);flex:1}.iimm-vtk-bookmark{position:relative}.iimm-vtk-bookmark-badge{min-width:15px;height:15px;padding:0 var(--iimm-vtk-spacing-xs,4px);background:linear-gradient(135deg, var(--iimm-vtk-color-accent,#64ffda), #00bfa5);color:var(--iimm-vtk-color-text-inverse,#1a1a2e);border-radius:var(--iimm-vtk-radius-lg,8px);font-size:var(--iimm-vtk-text-xs,9px);font-weight:var(--iimm-vtk-font-bold,700);text-align:center;pointer-events:none;line-height:15px;position:absolute;top:-3px;right:-3px;box-shadow:0 0 4px #64ffda80}.iimm-vtk-bookmark-dropdown{z-index:var(--iimm-vtk-z-popup);background:var(--iimm-vtk-popup-bg);border:1px solid var(--iimm-vtk-popup-border-color);min-width:260px;max-width:320px;box-shadow:var(--iimm-vtk-popup-shadow);color:var(--iimm-vtk-popup-color);font-size:var(--iimm-vtk-popup-font-size);font-family:var(--iimm-vtk-font-family);-webkit-user-select:none;user-select:none;transform-origin:100% 0;border-radius:10px;padding:8px;animation:.2s iimm-vtk-bookmark-in;position:absolute;top:calc(100% + 6px);right:0}@keyframes iimm-vtk-bookmark-in{0%{opacity:0;transform:scale(.92)translateY(-6px)}to{opacity:1;transform:scale(1)translateY(0)}}.iimm-vtk-bookmark-count{font-size:var(--iimm-vtk-text-xxs,10px);font-weight:var(--iimm-vtk-font-semibold,600);color:var(--iimm-vtk-btn-color-active);background:var(--iimm-vtk-btn-bg-active);padding:0 var(--iimm-vtk-spacing-sm,6px);text-align:center;border-radius:8px;min-width:16px;height:16px;line-height:16px}.iimm-vtk-bookmark-clear-btn{cursor:pointer;font:inherit;color:var(--iimm-vtk-popup-label-color);-webkit-tap-highlight-color:transparent;transition:all var(--iimm-vtk-transition-fast);white-space:nowrap;background:0 0;border:none;border-radius:4px;outline:none;justify-content:center;align-items:center;margin-left:auto;padding:2px 6px;font-size:10px;display:inline-flex}.iimm-vtk-bookmark-clear-btn:hover{color:var(--iimm-vtk-color-error,#ef4444);background:#ef44441f}.iimm-vtk-bookmark-add{gap:var(--iimm-vtk-spacing-sm,6px);margin-bottom:var(--iimm-vtk-spacing-sm,6px);align-items:center;display:flex}.iimm-vtk-bookmark-input{width:100%;padding:var(--iimm-vtk-input-padding);background:var(--iimm-vtk-input-bg);border:1px solid var(--iimm-vtk-input-border-color);border-radius:var(--iimm-vtk-input-radius);color:var(--iimm-vtk-input-color);font-size:var(--iimm-vtk-input-font-size);font-family:var(--iimm-vtk-font-mono);transition:border-color var(--iimm-vtk-transition-fast);outline:none;flex:1}.iimm-vtk-bookmark-input:focus{border-color:var(--iimm-vtk-input-border-color-focus)}.iimm-vtk-bookmark-input{height:30px;padding:0 var(--iimm-vtk-spacing-base,8px);font-size:var(--iimm-vtk-text-base,12px)}.iimm-vtk-bookmark-save-btn{cursor:pointer;font:inherit;color:var(--iimm-vtk-btn-color-active);-webkit-tap-highlight-color:transparent;justify-content:center;align-items:center;gap:var(--iimm-vtk-spacing-xs,4px);border:none;border:1px solid var(--iimm-vtk-btn-color-active);border-radius:var(--iimm-vtk-radius-base,6px);background:0 0;background:var(--iimm-vtk-btn-bg-active);height:30px;font-size:var(--iimm-vtk-text-base,12px);font-weight:var(--iimm-vtk-font-normal,400);white-space:nowrap;cursor:pointer;transition:all var(--iimm-vtk-transition-fast);outline:none;flex-shrink:0;padding:0 10px;display:flex}.iimm-vtk-bookmark-save-btn:hover{background:var(--iimm-vtk-btn-color-active);color:var(--iimm-vtk-popup-bg)}.iimm-vtk-bookmark-save-btn:active{transform:scale(.95)}.iimm-vtk-bookmark-save-btn:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.iimm-vtk-bookmark-save-icon{font-size:15px;font-weight:var(--iimm-vtk-font-bold,700);line-height:1}.iimm-vtk-bookmark-toast{border-radius:var(--iimm-vtk-radius-base,6px);font-size:var(--iimm-vtk-text-sm,11px);text-align:center;margin-bottom:var(--iimm-vtk-spacing-sm,6px);padding:5px 10px;animation:.15s iimm-vtk-bookmark-toast-in}.iimm-vtk-bookmark-toast.is-success{color:var(--iimm-vtk-color-accent,#64ffda);background:#64ffda1f;border:1px solid #64ffda33}.iimm-vtk-bookmark-toast.is-error{color:var(--iimm-vtk-color-error,#ef4444);background:#ef44441f;border:1px solid #ef444433}@keyframes iimm-vtk-bookmark-toast-in{0%{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:translateY(0)}}.iimm-vtk-bookmark-divider{background:var(--iimm-vtk-popup-border-color);height:1px;margin:4px 0}.iimm-vtk-bookmark-list{scrollbar-width:thin;scrollbar-color:#ffffff26 transparent;flex-direction:column;gap:2px;max-height:220px;display:flex;overflow-y:auto}.iimm-vtk-bookmark-list::-webkit-scrollbar{width:4px;height:4px}.iimm-vtk-bookmark-list::-webkit-scrollbar-track{background:0 0}.iimm-vtk-bookmark-list::-webkit-scrollbar-thumb{background:#ffffff26;border-radius:4px}.iimm-vtk-bookmark-empty{flex-direction:column;align-items:center;gap:4px;padding:16px 0;display:flex}.iimm-vtk-bookmark-empty-icon{opacity:.5;font-size:24px}.iimm-vtk-bookmark-empty-text{font-size:var(--iimm-vtk-text-sm,11px);color:var(--iimm-vtk-popup-label-color);text-align:center}.iimm-vtk-bookmark-item{align-items:center;gap:var(--iimm-vtk-spacing-base,8px);padding:7px var(--iimm-vtk-spacing-base,8px);border-radius:var(--iimm-vtk-radius-base,6px);cursor:pointer;transition:all var(--iimm-vtk-transition-fast);display:flex}.iimm-vtk-bookmark-item:hover{background:var(--iimm-vtk-btn-bg-hover)}.iimm-vtk-bookmark-item:hover .iimm-vtk-bookmark-item-delete{opacity:.5;pointer-events:auto}.iimm-vtk-bookmark-item:active{background:var(--iimm-vtk-btn-bg-active);transform:scale(.98)}.iimm-vtk-bookmark-item-icon{opacity:.7;flex-shrink:0;font-size:14px}.iimm-vtk-bookmark-item-name{font-size:var(--iimm-vtk-text-base,12px);text-overflow:ellipsis;white-space:nowrap;color:var(--iimm-vtk-popup-color);flex:1;overflow:hidden}.iimm-vtk-bookmark-item-delete{cursor:pointer;font:inherit;color:var(--iimm-vtk-btn-color);-webkit-tap-highlight-color:transparent;width:20px;height:20px;opacity:0;pointer-events:none;transition:all var(--iimm-vtk-transition-fast);background:0 0;border:none;border-radius:4px;outline:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;font-size:11px;display:inline-flex}.iimm-vtk-bookmark-item-delete:hover{color:var(--iimm-vtk-color-error,#ef4444);background:#ef444426;opacity:1!important}.iimm-vtk-screenshot{align-items:center;display:inline-flex;position:relative}.iimm-vtk-screenshot-dropdown{z-index:var(--iimm-vtk-z-popup);background:var(--iimm-vtk-popup-bg);border:1px solid var(--iimm-vtk-popup-border-color);min-width:240px;max-width:300px;box-shadow:var(--iimm-vtk-popup-shadow);color:var(--iimm-vtk-popup-color);font-size:var(--iimm-vtk-popup-font-size);font-family:var(--iimm-vtk-font-family);-webkit-user-select:none;user-select:none;transform-origin:100% 0;border-radius:10px;padding:8px 10px;animation:.2s iimm-vtk-screenshot-in;position:absolute;top:calc(100% + 6px);right:0}@media (width<=600px){.iimm-vtk-screenshot-dropdown{left:auto;right:0;transform:none}}@keyframes iimm-vtk-screenshot-in{0%{opacity:0;transform:scale(.92)translateY(-6px)}to{opacity:1;transform:scale(1)translateY(0)}}.iimm-vtk-screenshot-section{margin-bottom:var(--iimm-vtk-spacing-sm,6px)}.iimm-vtk-screenshot-label{font-size:var(--iimm-vtk-text-sm,11px);color:var(--iimm-vtk-popup-label-color);margin-bottom:var(--iimm-vtk-spacing-xs,4px);letter-spacing:.2px;justify-content:space-between;align-items:center;display:flex}.iimm-vtk-screenshot-value{font-family:var(--iimm-vtk-font-mono,"Consolas", monospace);font-size:var(--iimm-vtk-text-sm,11px);color:var(--iimm-vtk-popup-color);opacity:.75}.iimm-vtk-screenshot-options{gap:var(--iimm-vtk-spacing-xs,4px);display:flex}.iimm-vtk-screenshot-opt-btn{cursor:pointer;font:inherit;color:var(--iimm-vtk-popup-color);-webkit-tap-highlight-color:transparent;padding:0;padding:5px var(--iimm-vtk-spacing-base,8px);font-size:var(--iimm-vtk-text-sm,11px);border:none;border:1px solid var(--iimm-vtk-popup-border-color);border-radius:var(--iimm-vtk-radius-sm,5px);background:0 0;background:var(--iimm-vtk-input-bg,#00000026);cursor:pointer;transition:all var(--iimm-vtk-transition-fast,.15s ease);white-space:nowrap;opacity:.7;outline:none;flex:1;justify-content:center;align-items:center;display:inline-flex}.iimm-vtk-screenshot-opt-btn:hover{background:var(--iimm-vtk-btn-bg-hover);color:var(--iimm-vtk-btn-color-hover);opacity:1}.iimm-vtk-screenshot-opt-btn.is-selected{background:var(--iimm-vtk-btn-bg-active);border-color:var(--iimm-vtk-btn-color-active);color:var(--iimm-vtk-btn-color-active);opacity:1}.iimm-vtk-screenshot-slider{appearance:none;background:var(--iimm-vtk-slider-track-bg,#ffffff1a);cursor:pointer;border-radius:2px;outline:none;width:100%;height:4px}.iimm-vtk-screenshot-slider::-webkit-slider-thumb{-webkit-appearance:none;background:var(--iimm-vtk-slider-thumb-bg,#64ffda);cursor:pointer;border:2px solid #fff3;border-radius:50%;width:14px;height:14px;transition:border-color .15s}.iimm-vtk-screenshot-slider::-webkit-slider-thumb:hover{border-color:#ffffff80}.iimm-vtk-screenshot-slider::-moz-range-thumb{background:var(--iimm-vtk-slider-thumb-bg,#64ffda);cursor:pointer;border:2px solid #fff3;border-radius:50%;width:14px;height:14px}.iimm-vtk-screenshot-toggle-row{justify-content:space-between;align-items:center;margin-bottom:6px;display:flex}.iimm-vtk-screenshot-toggle-row .iimm-vtk-screenshot-label{margin-bottom:0}.iimm-vtk-screenshot-switch{width:36px;height:20px;display:inline-block;position:relative}.iimm-vtk-screenshot-switch input{opacity:0;width:0;height:0}.iimm-vtk-screenshot-switch input:checked+.iimm-vtk-screenshot-slider-round{background:var(--iimm-vtk-input-border-color-focus,#64ffda)}.iimm-vtk-screenshot-switch input:checked+.iimm-vtk-screenshot-slider-round:before{transform:translate(16px)}.iimm-vtk-screenshot-slider-round{cursor:pointer;background:var(--iimm-vtk-slider-track-bg,#ffffff1a);border-radius:20px;transition:background .2s;position:absolute;inset:0}.iimm-vtk-screenshot-slider-round:before{content:"";background:var(--iimm-vtk-color-toggle-knob,#fff);border-radius:50%;width:16px;height:16px;transition:transform .2s;position:absolute;bottom:2px;left:2px;box-shadow:0 1px 3px #0000004d}.iimm-vtk-screenshot-divider{background:var(--iimm-vtk-popup-border-color);height:1px;margin:6px 0}.iimm-vtk-screenshot-export-btn{cursor:pointer;font:inherit;color:var(--iimm-vtk-btn-color-active);-webkit-tap-highlight-color:transparent;width:100%;padding:0;padding:var(--iimm-vtk-spacing-base,8px) var(--iimm-vtk-spacing-lg,12px);font-size:var(--iimm-vtk-text-base,12px);font-weight:var(--iimm-vtk-font-semibold,600);border:none;border:1px solid var(--iimm-vtk-btn-color-active);border-radius:var(--iimm-vtk-radius-base,6px);background:0 0;background:var(--iimm-vtk-btn-bg-active);cursor:pointer;transition:all var(--iimm-vtk-transition-fast,.15s ease);letter-spacing:var(--iimm-vtk-tracking-tight,.3px);outline:none;justify-content:center;align-items:center;display:inline-flex}.iimm-vtk-screenshot-export-btn:hover:not(:disabled){background:var(--iimm-vtk-btn-color-active);color:var(--iimm-vtk-popup-bg)}.iimm-vtk-screenshot-export-btn:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.iimm-vtk-screenshot-export-btn.is-loading{animation:1.2s infinite iimm-vtk-screenshot-pulse}.iimm-vtk-screenshot-export-btn.is-done{color:var(--iimm-vtk-color-success,#34d399);background:#34d39933;border-color:#34d39966}.iimm-vtk-screenshot-export-btn.is-error{color:var(--iimm-vtk-color-error,#ef4444);background:#ef444426;border-color:#ef444466}@keyframes iimm-vtk-screenshot-pulse{0%,to{opacity:1}50%{opacity:.6}}.iimm-vtk-screenshot-toast{margin-top:var(--iimm-vtk-spacing-sm,6px);padding:5px var(--iimm-vtk-spacing-base,8px);font-size:var(--iimm-vtk-text-sm,11px);border-radius:var(--iimm-vtk-radius-sm,4px);text-align:center;animation:iimm-vtk-screenshot-toast-in var(--iimm-vtk-transition-fast,.15s) ease}.iimm-vtk-screenshot-toast.is-success{color:var(--iimm-vtk-color-accent,#64ffda);background:#64ffda1f;border:1px solid #64ffda33}.iimm-vtk-screenshot-toast.is-error{color:var(--iimm-vtk-color-error,#ef4444);background:#ef44441f;border:1px solid #ef444433}.iimm-vtk-screenshot-toast.is-info{color:var(--iimm-vtk-color-info,#60a5fa);background:#60a5fa1f;border:1px solid #60a5fa33}@keyframes iimm-vtk-screenshot-toast-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.iimm-vtk-load-model{align-items:center;display:inline-flex;position:relative}.iimm-vtk-load-model-dropdown{z-index:var(--iimm-vtk-z-popup);min-width:260px;max-width:360px;padding:var(--iimm-vtk-spacing-base,8px) var(--iimm-vtk-spacing-lg,10px);background:var(--iimm-vtk-popup-bg);border:1px solid var(--iimm-vtk-popup-border-color);border-radius:var(--iimm-vtk-radius-xl,10px);box-shadow:var(--iimm-vtk-popup-shadow);color:var(--iimm-vtk-popup-color);font-size:var(--iimm-vtk-popup-font-size);font-family:var(--iimm-vtk-font-family);-webkit-user-select:none;user-select:none;animation:iimm-vtk-load-model-in var(--iimm-vtk-transition-fast,.15s) ease;transform-origin:100% 0;position:absolute;top:calc(100% + 6px);left:0}@media (width<=600px){.iimm-vtk-load-model-dropdown{left:auto;right:0;transform:none}}@keyframes iimm-vtk-load-model-in{0%{opacity:0;transform:scale(.92)translateY(-6px)}to{opacity:1;transform:scale(1)translateY(0)}}.iimm-vtk-load-model-tabs{gap:var(--iimm-vtk-spacing-xs,4px);margin-bottom:var(--iimm-vtk-spacing-lg,10px);padding-bottom:var(--iimm-vtk-spacing-base,8px);border-bottom:1px solid var(--iimm-vtk-popup-border-color);display:flex}.iimm-vtk-load-model-tab{cursor:pointer;font:inherit;color:var(--iimm-vtk-popup-color);-webkit-tap-highlight-color:transparent;padding:0;padding:var(--iimm-vtk-spacing-xs,4px) var(--iimm-vtk-spacing-base,8px);font-size:var(--iimm-vtk-text-sm,11px);font-weight:var(--iimm-vtk-font-medium,500);border:none;border:1px solid var(--iimm-vtk-popup-border-color);border-radius:var(--iimm-vtk-radius-base,6px);background:0 0;background:var(--iimm-vtk-input-bg,#00000026);cursor:pointer;transition:all var(--iimm-vtk-transition-fast,.15s ease);opacity:.7;outline:none;flex:1;justify-content:center;align-items:center;display:inline-flex}.iimm-vtk-load-model-tab:hover:not(:disabled){background:var(--iimm-vtk-btn-bg-hover);opacity:1}.iimm-vtk-load-model-tab:disabled{opacity:.35;cursor:not-allowed}.iimm-vtk-load-model-tab.is-active{background:var(--iimm-vtk-btn-bg-active);border-color:var(--iimm-vtk-btn-color-active);color:var(--iimm-vtk-btn-color-active);opacity:1}.iimm-vtk-load-model-section{gap:var(--iimm-vtk-spacing-base,8px);flex-direction:column;display:flex}.iimm-vtk-load-model-label{font-size:var(--iimm-vtk-text-sm,11px);color:var(--iimm-vtk-popup-label-color);letter-spacing:var(--iimm-vtk-tracking-tight,.3px)}.iimm-vtk-load-model-action-btn{cursor:pointer;font:inherit;color:var(--iimm-vtk-btn-color-active);-webkit-tap-highlight-color:transparent;width:100%;padding:0;padding:var(--iimm-vtk-spacing-base,8px) var(--iimm-vtk-spacing-lg,12px);font-size:var(--iimm-vtk-text-base,12px);font-weight:var(--iimm-vtk-font-semibold,600);border:none;border:1px solid var(--iimm-vtk-btn-color-active);border-radius:var(--iimm-vtk-radius-base,6px);background:0 0;background:var(--iimm-vtk-btn-bg-active);cursor:pointer;transition:all var(--iimm-vtk-transition-fast,.15s ease);letter-spacing:var(--iimm-vtk-tracking-tight,.3px);outline:none;justify-content:center;align-items:center;display:inline-flex}.iimm-vtk-load-model-action-btn:hover:not(:disabled){background:var(--iimm-vtk-btn-color-active);color:var(--iimm-vtk-popup-bg)}.iimm-vtk-load-model-action-btn:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.iimm-vtk-load-model-url-input{cursor:pointer;font:inherit;color:var(--iimm-vtk-input-color);-webkit-tap-highlight-color:transparent;width:100%;padding:0;padding:var(--iimm-vtk-input-padding);font-size:var(--iimm-vtk-input-font-size);border:none;border:1px solid var(--iimm-vtk-input-border-color);border-radius:var(--iimm-vtk-input-radius);background:0 0;background:var(--iimm-vtk-input-bg);font-family:var(--iimm-vtk-font-mono);transition:border-color var(--iimm-vtk-transition-fast,.15s ease);text-align:left;box-sizing:border-box;outline:none;justify-content:center;align-items:center;display:inline-flex}.iimm-vtk-load-model-url-input:focus{border-color:var(--iimm-vtk-input-border-color-focus);outline:none}.iimm-vtk-load-model-url-input::placeholder{color:var(--iimm-vtk-color-text-disabled)}.iimm-vtk-load-model-url-input:disabled{opacity:.4;cursor:not-allowed}.iimm-vtk-load-model-hint{font-size:var(--iimm-vtk-text-xs,9px);color:var(--iimm-vtk-popup-label-color);opacity:.7;text-align:center;line-height:var(--iimm-vtk-leading-relaxed,1.6)}.iimm-vtk-load-model-toast{margin-top:var(--iimm-vtk-spacing-sm,6px);padding:var(--iimm-vtk-spacing-xs,4px) var(--iimm-vtk-spacing-base,8px);font-size:var(--iimm-vtk-text-sm,11px);border-radius:var(--iimm-vtk-radius-sm,4px);text-align:center;animation:iimm-vtk-load-model-toast-in var(--iimm-vtk-transition-fast,.15s) ease}.iimm-vtk-load-model-toast.is-success{color:var(--iimm-vtk-color-accent,#64ffda);background:#64ffda1f;border:1px solid #64ffda33}.iimm-vtk-load-model-toast.is-error{color:var(--iimm-vtk-color-error,#ef4444);background:#ef44441f;border:1px solid #ef444433}.iimm-vtk-load-model-toast.is-info{color:var(--iimm-vtk-color-info,#60a5fa);background:#60a5fa1f;border:1px solid #60a5fa33}@keyframes iimm-vtk-load-model-toast-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.iimm-vtk-scene-tree{z-index:var(--iimm-vtk-scene-tree-z,100);pointer-events:none;flex-direction:row;align-items:flex-start;display:flex;position:absolute;top:0;bottom:0}.iimm-vtk-scene-tree>*{pointer-events:auto}.iimm-vtk-scene-tree--right{flex-direction:row;left:auto;right:0}.iimm-vtk-scene-tree--left{flex-direction:row-reverse;left:0;right:auto}.iimm-vtk-scene-toggle{top:var(--iimm-vtk-scene-tree-toggle-top,50%);z-index:var(--iimm-vtk-scene-tree-toggle-z,101);width:var(--iimm-vtk-scene-tree-toggle-width,24px);height:var(--iimm-vtk-scene-tree-toggle-height,48px);font-size:var(--iimm-vtk-scene-tree-toggle-font-size,12px);border:1px solid var(--iimm-vtk-popup-border,#ffffff26);background:var(--iimm-vtk-popup-bg,#1e1e2eeb);color:var(--iimm-vtk-btn-color,#c9d1d9);cursor:pointer;-webkit-backdrop-filter:blur(var(--iimm-vtk-scene-tree-panel-blur,8px));backdrop-filter:blur(var(--iimm-vtk-scene-tree-panel-blur,8px));flex-shrink:0;justify-content:center;align-items:center;transition:all .2s;display:flex;position:relative;transform:translateY(-50%)}.iimm-vtk-scene-toggle:hover{background:var(--iimm-vtk-btn-bg-hover,#ffffff26);color:var(--iimm-vtk-btn-color-hover,#e6edf3)}.iimm-vtk-scene-toggle.is-expanded{display:none}.iimm-vtk-scene-tree--right .iimm-vtk-scene-toggle{border-radius:var(--iimm-vtk-scene-tree-toggle-radius,6px) 0 0 var(--iimm-vtk-scene-tree-toggle-radius,6px);border-right:none}.iimm-vtk-scene-tree--left .iimm-vtk-scene-toggle{border-radius:0 var(--iimm-vtk-scene-tree-toggle-radius,6px) var(--iimm-vtk-scene-tree-toggle-radius,6px) 0;border-left:none}.iimm-vtk-scene-panel{background:var(--iimm-vtk-popup-bg,#1e1e2eeb);height:100%;-webkit-backdrop-filter:blur(var(--iimm-vtk-scene-tree-panel-blur,8px));backdrop-filter:blur(var(--iimm-vtk-scene-tree-panel-blur,8px));transition:width var(--iimm-vtk-transition-normal,.25s ease);flex-direction:column;display:none;overflow:hidden}.iimm-vtk-scene-panel.is-expanded{display:flex}.iimm-vtk-scene-tree--right .iimm-vtk-scene-panel{border-left:1px solid var(--iimm-vtk-popup-border,#ffffff26)}.iimm-vtk-scene-tree--left .iimm-vtk-scene-panel{border-right:1px solid var(--iimm-vtk-popup-border,#ffffff26)}.iimm-vtk-scene-header{padding:var(--iimm-vtk-scene-tree-header-padding,var(--iimm-vtk-spacing-base,8px) var(--iimm-vtk-spacing-lg,12px));border-bottom:1px solid var(--iimm-vtk-popup-border,#ffffff1f);flex-shrink:0;justify-content:space-between;align-items:center;display:flex}.iimm-vtk-scene-title{font-size:var(--iimm-vtk-scene-tree-title-font-size,var(--iimm-vtk-text-lg,13px));font-weight:var(--iimm-vtk-scene-tree-title-font-weight,var(--iimm-vtk-font-semibold,600));color:var(--iimm-vtk-btn-color,#c9d1d9);-webkit-user-select:none;user-select:none}.iimm-vtk-scene-close{width:var(--iimm-vtk-scene-tree-close-size,22px);height:var(--iimm-vtk-scene-tree-close-size,22px);border-radius:var(--iimm-vtk-btn-radius,4px);color:var(--iimm-vtk-btn-color,#c9d1d9);font-size:var(--iimm-vtk-scene-tree-title-font-size,var(--iimm-vtk-text-lg,13px));cursor:pointer;opacity:.6;background:0 0;border:none;justify-content:center;align-items:center;display:flex}.iimm-vtk-scene-close:hover{opacity:1;background:var(--iimm-vtk-btn-bg-hover,#ffffff1a)}.iimm-vtk-scene-list{padding:var(--iimm-vtk-scene-tree-list-padding,var(--iimm-vtk-spacing-xs,4px) 0);flex:1;overflow-y:auto}.iimm-vtk-scene-list::-webkit-scrollbar{width:4px}.iimm-vtk-scene-list::-webkit-scrollbar-track{background:0 0}.iimm-vtk-scene-list::-webkit-scrollbar-thumb{background:var(--iimm-vtk-btn-bg-hover,#ffffff1f);border-radius:2px}.iimm-vtk-scene-empty{height:var(--iimm-vtk-scene-tree-empty-height,60px);font-size:var(--iimm-vtk-scene-tree-item-name-font-size,var(--iimm-vtk-text-base,12px));color:var(--iimm-vtk-popup-label-color,#c9d1d980);-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;display:flex}.iimm-vtk-scene-item{padding:var(--iimm-vtk-scene-tree-item-padding,var(--iimm-vtk-spacing-xs,4px) var(--iimm-vtk-spacing-base,8px));margin:var(--iimm-vtk-scene-tree-item-margin,1px var(--iimm-vtk-spacing-xs,4px));border-radius:var(--iimm-vtk-btn-radius,6px);transition:background var(--iimm-vtk-transition-fast,.15s ease)}.iimm-vtk-scene-item:hover{background:var(--iimm-vtk-btn-bg-hover,#ffffff0f)}.iimm-vtk-scene-item.is-hidden{opacity:.5}.iimm-vtk-scene-item-row{align-items:center;gap:var(--iimm-vtk-scene-tree-item-row-gap,var(--iimm-vtk-spacing-sm,6px));margin-top:2px;display:flex}.iimm-vtk-scene-item-row:first-child{margin-top:0}.iimm-vtk-scene-item-checkbox{width:var(--iimm-vtk-scene-tree-item-checkbox-size,14px);height:var(--iimm-vtk-scene-tree-item-checkbox-size,14px);cursor:pointer;accent-color:var(--iimm-vtk-btn-bg-active,#58a6ff);flex-shrink:0}.iimm-vtk-scene-item-type{font-size:var(--iimm-vtk-scene-tree-item-type-font-size,var(--iimm-vtk-text-xxs,10px));width:var(--iimm-vtk-scene-tree-item-type-width,16px);text-align:center;-webkit-user-select:none;user-select:none;flex-shrink:0}.iimm-vtk-scene-item-type.is-actor{color:var(--iimm-vtk-popup-label-color,#58a6ff)}.iimm-vtk-scene-item-type.is-volume{color:var(--iimm-vtk-popup-label-color,#a371f7)}.iimm-vtk-scene-item-name{font-size:var(--iimm-vtk-scene-tree-item-name-font-size,var(--iimm-vtk-text-base,12px));color:var(--iimm-vtk-btn-color,#c9d1d9);text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;user-select:none;flex:1;overflow:hidden}.iimm-vtk-scene-item-opacity{flex:1;align-items:center;gap:4px;display:flex}.iimm-vtk-scene-item-opacity-slider{appearance:none;background:var(--iimm-vtk-slider-track-bg,#ffffff26);cursor:pointer;border-radius:2px;outline:none;flex:1;height:3px}.iimm-vtk-scene-item-opacity-slider::-webkit-slider-thumb{appearance:none;background:var(--iimm-vtk-slider-thumb-bg,#58a6ff);cursor:pointer;border:none;border-radius:50%;width:10px;height:10px}.iimm-vtk-scene-item-opacity-slider::-moz-range-thumb{background:var(--iimm-vtk-slider-thumb-bg,#58a6ff);cursor:pointer;border:none;border-radius:50%;width:10px;height:10px}.iimm-vtk-scene-item-opacity-value{text-align:right;min-width:30px;color:var(--iimm-vtk-popup-label-color,#c9d1d9b3);flex-shrink:0;font-size:11px}.iimm-vtk-scene-item-color{border-radius:var(--iimm-vtk-btn-radius,4px);cursor:pointer;border:1px solid var(--iimm-vtk-popup-border,#ffffff26);width:18px;height:18px;transition:transform var(--iimm-vtk-transition-fast,.15s ease);flex-shrink:0;position:relative}.iimm-vtk-scene-item-color:hover{transform:scale(1.15)}.iimm-vtk-scene-item-color.is-picking{z-index:10;transform:scale(1.15)}.iimm-vtk-scene-color-picker{z-index:var(--iimm-vtk-scene-tree-color-picker-z,200);width:var(--iimm-vtk-scene-tree-color-picker-width,160px);padding:var(--iimm-vtk-scene-tree-color-picker-padding,var(--iimm-vtk-spacing-base,8px));background:var(--iimm-vtk-popup-bg,#2d2d3f);border:1px solid var(--iimm-vtk-popup-border,#ffffff26);border-radius:var(--iimm-vtk-popup-radius,8px);box-shadow:var(--iimm-vtk-popup-shadow,0 4px 16px #0000004d);position:absolute;top:22px;right:0}.iimm-vtk-scene-color-slider-group{align-items:center;gap:4px;margin-bottom:4px;display:flex}.iimm-vtk-scene-color-slider-group:last-of-type{margin-bottom:6px}.iimm-vtk-scene-color-slider-label{width:14px;color:var(--iimm-vtk-btn-color,#c9d1d9);-webkit-user-select:none;user-select:none;text-align:center;flex-shrink:0;font-size:11px;font-weight:600}.iimm-vtk-scene-color-slider{appearance:none;background:var(--iimm-vtk-slider-track-bg,#ffffff26);cursor:pointer;border-radius:2px;outline:none;flex:1;height:3px}.iimm-vtk-scene-color-slider::-webkit-slider-thumb{appearance:none;cursor:pointer;border:none;border-radius:50%;width:10px;height:10px}.iimm-vtk-scene-color-slider-value{text-align:right;width:26px;color:var(--iimm-vtk-popup-label-color,#c9d1d9b3);flex-shrink:0;font-size:10px}.iimm-vtk-scene-color-preview{width:100%;height:var(--iimm-vtk-scene-tree-color-preview-height,20px);border-radius:var(--iimm-vtk-btn-radius,4px);border:1px solid var(--iimm-vtk-popup-border,#ffffff26);margin-bottom:var(--iimm-vtk-spacing-xs,4px);display:block}.iimm-vtk-scene-color-close{width:100%;height:var(--iimm-vtk-scene-tree-color-close-height,24px);border:1px solid var(--iimm-vtk-popup-border,#ffffff26);border-radius:var(--iimm-vtk-btn-radius,4px);background:var(--iimm-vtk-btn-bg,#ffffff0f);color:var(--iimm-vtk-btn-color,#c9d1d9);font-size:var(--iimm-vtk-text-sm,11px);cursor:pointer;transition:background var(--iimm-vtk-transition-fast,.15s ease)}.iimm-vtk-scene-color-close:hover{background:var(--iimm-vtk-btn-bg-hover,#ffffff1f)}.iimm-vtk-filename-info{z-index:var(--iimm-vtk-z-overlay,500);align-items:center;gap:var(--iimm-vtk-spacing-sm,6px);padding:0 var(--iimm-vtk-spacing-lg,12px);background:var(--iimm-vtk-extension-bg,#a7a5a599);border-top:1px solid var(--iimm-vtk-popup-border-color,#ffffff1a);border-radius:var(--iimm-vtk-extension-radius,var(--iimm-vtk-radius-lg,8px)) var(--iimm-vtk-extension-radius,var(--iimm-vtk-radius-lg,8px)) 0 0;height:24px;font-family:var(--iimm-vtk-font-family);pointer-events:none;-webkit-user-select:none;user-select:none;display:flex;position:absolute;bottom:0;left:0;right:0}.iimm-vtk-filename-info-icon{opacity:.8;flex-shrink:0;font-size:13px;line-height:1}.iimm-vtk-filename-info-text{font-size:var(--iimm-vtk-text-sm,11px);color:var(--iimm-vtk-popup-color,#e0e0e0);white-space:nowrap;text-overflow:ellipsis;max-width:100%;line-height:var(--iimm-vtk-leading-tight,1.2);overflow:hidden}.iimm-vtk-container{width:var(--iimm-vtk-width,100%);height:var(--iimm-vtk-height,100%);min-width:var(--iimm-vtk-min-width,0);font-family:var(--iimm-vtk-font-family);flex-direction:column;display:flex;position:relative;overflow:hidden}.iimm-vtk-content{flex-direction:column;flex:1;width:100%;min-width:0;min-height:0;display:flex}.iimm-vtk-canvas{flex:1;width:100%;min-width:0;min-height:0}
|
|
2
|
+
/*$vite$:1*/
|