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.
Files changed (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +753 -0
  3. package/README.md +1760 -0
  4. package/lib/types/components/PluginToolbar.vue.d.ts +7 -0
  5. package/lib/types/components/ToolbarExtension.vue.d.ts +9 -0
  6. package/lib/types/components/ToolbarInfoPanel.vue.d.ts +10 -0
  7. package/lib/types/components/VtkViewer.vue.d.ts +32 -0
  8. package/lib/types/components/index.d.ts +4 -0
  9. package/lib/types/composables/index.d.ts +7 -0
  10. package/lib/types/composables/useFormatLoader.d.ts +33 -0
  11. package/lib/types/composables/useResponsiveLayout.d.ts +46 -0
  12. package/lib/types/composables/useUIPlugins.d.ts +57 -0
  13. package/lib/types/composables/useViewer.d.ts +47 -0
  14. package/lib/types/configs/index.d.ts +76 -0
  15. package/lib/types/core/CommandRegistrar.d.ts +12 -0
  16. package/lib/types/core/CommandRegistry.d.ts +34 -0
  17. package/lib/types/core/ConfigAccessor.d.ts +33 -0
  18. package/lib/types/core/DisposalRegistry.d.ts +32 -0
  19. package/lib/types/core/EventBus.d.ts +79 -0
  20. package/lib/types/core/FormatDetector.d.ts +59 -0
  21. package/lib/types/core/I18nManager.d.ts +135 -0
  22. package/lib/types/core/InteractionSubContext.d.ts +73 -0
  23. package/lib/types/core/RenderSubContext.d.ts +74 -0
  24. package/lib/types/core/ResetManager.d.ts +122 -0
  25. package/lib/types/core/ResetRegistry.d.ts +170 -0
  26. package/lib/types/core/SceneSubContext.d.ts +25 -0
  27. package/lib/types/core/StateManager.d.ts +104 -0
  28. package/lib/types/core/ThemeContext.d.ts +37 -0
  29. package/lib/types/core/ToolbarExtensionRegistry.d.ts +105 -0
  30. package/lib/types/core/ToolbarInfoRegistry.d.ts +77 -0
  31. package/lib/types/core/UISubContext.d.ts +32 -0
  32. package/lib/types/core/ViewerContext.d.ts +101 -0
  33. package/lib/types/core/ViewerContextBuilder.d.ts +57 -0
  34. package/lib/types/core/createViewerContext.d.ts +26 -0
  35. package/lib/types/core/index.d.ts +23 -0
  36. package/lib/types/icons/index.d.ts +47 -0
  37. package/lib/types/index.d.ts +7 -0
  38. package/lib/types/plugins/PluginBase.d.ts +131 -0
  39. package/lib/types/plugins/PluginRegistry.d.ts +67 -0
  40. package/lib/types/plugins/defaults.d.ts +3 -0
  41. package/lib/types/plugins/format/DrcPlugin.d.ts +30 -0
  42. package/lib/types/plugins/format/GlbPlugin.d.ts +23 -0
  43. package/lib/types/plugins/format/ObjPlugin.d.ts +23 -0
  44. package/lib/types/plugins/format/PdbPlugin.d.ts +33 -0
  45. package/lib/types/plugins/format/PlyPlugin.d.ts +24 -0
  46. package/lib/types/plugins/format/StlPlugin.d.ts +25 -0
  47. package/lib/types/plugins/format/VtiPlugin.d.ts +60 -0
  48. package/lib/types/plugins/format/VtpPlugin.d.ts +24 -0
  49. package/lib/types/plugins/format/VtuPlugin.d.ts +25 -0
  50. package/lib/types/plugins/format/ZipPlugin.d.ts +38 -0
  51. package/lib/types/plugins/format/index.d.ts +13 -0
  52. package/lib/types/plugins/index.d.ts +13 -0
  53. package/lib/types/plugins/injectionKeys.d.ts +22 -0
  54. package/lib/types/plugins/pluginUtils.d.ts +61 -0
  55. package/lib/types/plugins/service/DragDropPlugin.d.ts +94 -0
  56. package/lib/types/plugins/service/KeyBindingPlugin.d.ts +83 -0
  57. package/lib/types/plugins/service/MemoryPressurePlugin.d.ts +68 -0
  58. package/lib/types/plugins/service/index.d.ts +6 -0
  59. package/lib/types/plugins/toolbar/animation/AnimationPlugin.d.ts +34 -0
  60. package/lib/types/plugins/toolbar/animation/index.d.ts +1 -0
  61. package/lib/types/plugins/toolbar/index.d.ts +9 -0
  62. package/lib/types/plugins/toolbar/interaction/CenterModelPlugin.d.ts +21 -0
  63. package/lib/types/plugins/toolbar/interaction/FullscreenPlugin.d.ts +27 -0
  64. package/lib/types/plugins/toolbar/interaction/PanPlugin.d.ts +24 -0
  65. package/lib/types/plugins/toolbar/interaction/ResetAllPlugin.d.ts +25 -0
  66. package/lib/types/plugins/toolbar/interaction/RotatePlugin.d.ts +24 -0
  67. package/lib/types/plugins/toolbar/interaction/ViewSelectPlugin.d.ts +26 -0
  68. package/lib/types/plugins/toolbar/interaction/ZoomPlugin.d.ts +24 -0
  69. package/lib/types/plugins/toolbar/interaction/index.d.ts +7 -0
  70. package/lib/types/plugins/toolbar/model/ClippingPlugin.d.ts +87 -0
  71. package/lib/types/plugins/toolbar/model/ColorByPlugin.d.ts +113 -0
  72. package/lib/types/plugins/toolbar/model/LoadModelPlugin.d.ts +93 -0
  73. package/lib/types/plugins/toolbar/model/RenderPrecisionPlugin.d.ts +68 -0
  74. package/lib/types/plugins/toolbar/model/RenderStylePlugin.d.ts +88 -0
  75. package/lib/types/plugins/toolbar/model/UnloadModelPlugin.d.ts +25 -0
  76. package/lib/types/plugins/toolbar/model/index.d.ts +6 -0
  77. package/lib/types/plugins/toolbar/scene/AxesPlugin.d.ts +96 -0
  78. package/lib/types/plugins/toolbar/scene/BackgroundColorPlugin.d.ts +25 -0
  79. package/lib/types/plugins/toolbar/scene/LanguageSwitchPlugin.d.ts +45 -0
  80. package/lib/types/plugins/toolbar/scene/LightIntensityPlugin.d.ts +42 -0
  81. package/lib/types/plugins/toolbar/scene/RenderGridPlugin.d.ts +98 -0
  82. package/lib/types/plugins/toolbar/scene/ThemeSwitchPlugin.d.ts +49 -0
  83. package/lib/types/plugins/toolbar/scene/index.d.ts +6 -0
  84. package/lib/types/plugins/toolbar/tools/BookmarkPlugin.d.ts +70 -0
  85. package/lib/types/plugins/toolbar/tools/MeasurementPlugin.d.ts +112 -0
  86. package/lib/types/plugins/toolbar/tools/PerformancePlugin.d.ts +55 -0
  87. package/lib/types/plugins/toolbar/tools/ScreenshotPlugin.d.ts +58 -0
  88. package/lib/types/plugins/toolbar/tools/index.d.ts +4 -0
  89. package/lib/types/plugins/toolbar/utils.d.ts +67 -0
  90. package/lib/types/plugins/types/index.d.ts +250 -0
  91. package/lib/types/plugins/ui/ErrorPlugin.d.ts +30 -0
  92. package/lib/types/plugins/ui/FilenameInfoPlugin.d.ts +40 -0
  93. package/lib/types/plugins/ui/LoadingPlugin.d.ts +28 -0
  94. package/lib/types/plugins/ui/SceneTreePlugin.d.ts +60 -0
  95. package/lib/types/plugins/ui/WebGLContextLostPlugin.d.ts +33 -0
  96. package/lib/types/plugins/ui/index.d.ts +8 -0
  97. package/lib/types/polyfills.d.ts +1 -0
  98. package/lib/types/types/index.d.ts +187 -0
  99. package/lib/types/types/vtk-modules.d.ts +80 -0
  100. package/lib/types/utils/asyncUtils.d.ts +8 -0
  101. package/lib/types/utils/colorByUtils.d.ts +55 -0
  102. package/lib/types/utils/debugLog.d.ts +13 -0
  103. package/lib/types/utils/errorHandler.d.ts +28 -0
  104. package/lib/types/utils/index.d.ts +10 -0
  105. package/lib/types/utils/sceneUtils.d.ts +11 -0
  106. package/lib/types/utils/themeManager.d.ts +78 -0
  107. package/lib/types/utils/volumeUtils.d.ts +14 -0
  108. package/lib/types/utils/vtkHelpers.d.ts +46 -0
  109. package/lib/types/utils/vtuLoader.d.ts +26 -0
  110. package/lib/types/utils/zipReader.d.ts +71 -0
  111. package/lib/vtkviewer.css +2 -0
  112. package/lib/vtkviewer.js +54714 -0
  113. package/lib/vtkviewer.umd.cjs +4560 -0
  114. 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,8 @@
1
+ /**
2
+ * 让出执行权给浏览器,确保 Vue DOM 更新已提交。
3
+ *
4
+ * 分两步:
5
+ * 1. nextTick — 等待 Vue 响应式 DOM 更新完成
6
+ * 2. setTimeout(fn, 0) — 将控制权交还给浏览器事件循环,确保本轮绘制完成
7
+ */
8
+ export declare function yieldToBrowser(): Promise<void>;
@@ -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*/