From 3f585f9f323ae270980cae78e71a3d07cee019ae Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 8 Sep 2026 10:48:09 +0200 Subject: [PATCH 1/9] fix(centerOnClick): Wait for distant camera to synchronize before picking --- internal/stores/hybrid_viewer/camera.js | 4 ++-- internal/stores/hybrid_viewer/viewport.js | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/stores/hybrid_viewer/camera.js b/internal/stores/hybrid_viewer/camera.js index 10eb771cb..5cb51880e 100644 --- a/internal/stores/hybrid_viewer/camera.js +++ b/internal/stores/hybrid_viewer/camera.js @@ -73,7 +73,7 @@ function performSyncRemoteCamera() { const params = { camera_options: options_camera, }; - viewerStore.request( + return viewerStore.request( { schema, params, @@ -203,7 +203,7 @@ function performCameraOrientation(orientation) { function useHybridViewerCamera() { const camera_options = reactive({}); function syncRemoteCamera() { - performSyncRemoteCamera(); + return performSyncRemoteCamera(); } function setCamera(targetCameraOptions) { performSetCamera(targetCameraOptions); diff --git a/internal/stores/hybrid_viewer/viewport.js b/internal/stores/hybrid_viewer/viewport.js index 536980b9e..2b6b82e26 100644 --- a/internal/stores/hybrid_viewer/viewport.js +++ b/internal/stores/hybrid_viewer/viewport.js @@ -26,9 +26,10 @@ async function performResize(width, height) { renderWindow.render(); await remoteRender(); } -function performClickPicking(event, containerElement) { +async function performClickPicking(event, containerElement) { const { genericRenderWindow, syncRemoteCamera } = useHybridViewerStore(); const viewerStore = useViewerStore(); + await syncRemoteCamera(); const rect = containerElement.getBoundingClientRect(); const schema = viewer_schemas.opengeodeweb_viewer.viewer.get_point_position; const params = { From 238a50a4d67e375072e1400240261fa3e874a2f9 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Mon, 21 Sep 2026 11:55:50 +0200 Subject: [PATCH 2/9] await Proomise to synchronize state of camera before center on click --- internal/stores/hybrid_viewer/camera.ts | 4 ++-- internal/stores/hybrid_viewer/viewport.ts | 3 ++- internal/stores/hybrid_viewer/vtk_types.ts | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/internal/stores/hybrid_viewer/camera.ts b/internal/stores/hybrid_viewer/camera.ts index bca3b5fbb..e71894df1 100644 --- a/internal/stores/hybrid_viewer/camera.ts +++ b/internal/stores/hybrid_viewer/camera.ts @@ -79,7 +79,7 @@ function getCameraOptions(camera: vtkCamera | undefined): CameraOptions | undefi }; } -function performSyncRemoteCamera(): void { +function performSyncRemoteCamera(): Promise { const { genericRenderWindow, camera_options, remoteRender } = useHybridViewerStore() as unknown as HybridViewerStorePublic; const viewerStore = useViewerStore(); @@ -231,7 +231,7 @@ function performCameraOrientation(orientation: string): void { function useHybridViewerCamera() { const camera_options = reactive>({}); - function syncRemoteCamera(): void { + function syncRemoteCamera(): Promise { return performSyncRemoteCamera(); } function setCamera(targetCameraOptions: CameraOptions): void { diff --git a/internal/stores/hybrid_viewer/viewport.ts b/internal/stores/hybrid_viewer/viewport.ts index 795597aa4..9c2fcbe08 100644 --- a/internal/stores/hybrid_viewer/viewport.ts +++ b/internal/stores/hybrid_viewer/viewport.ts @@ -43,10 +43,11 @@ async function performResize(width: number, height: number): Promise { await remoteRender(); } -function performClickPicking(event: MouseEvent, containerElement: HTMLElement): void { +async function performClickPicking(event: MouseEvent, containerElement: HTMLElement): Promise { const { genericRenderWindow, syncRemoteCamera } = useHybridViewerStore() as unknown as HybridViewerStorePublic; const viewerStore = useViewerStore(); + await syncRemoteCamera(); const rect = containerElement.getBoundingClientRect(); const schema = viewer_schemas.opengeodeweb_viewer.viewer.get_point_position; const params = { diff --git a/internal/stores/hybrid_viewer/vtk_types.ts b/internal/stores/hybrid_viewer/vtk_types.ts index 44047c935..41b37d8be 100644 --- a/internal/stores/hybrid_viewer/vtk_types.ts +++ b/internal/stores/hybrid_viewer/vtk_types.ts @@ -51,7 +51,7 @@ interface HybridViewerStorePublic { camera_options: Record; remoteRender: () => Promise | void; clearHoverHighlight: () => void; - syncRemoteCamera: () => void; + syncRemoteCamera: () => Promise; hoverHighlight: (event: MouseEvent) => void; setZScaling: (value: number) => Promise; setCamera: (options: CameraOptions) => void; From 04e54a2a0d83f9aedaffabc41e4dec305cffd346 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Mon, 21 Sep 2026 09:56:39 +0000 Subject: [PATCH 3/9] Apply prepare changes --- internal/stores/hybrid_viewer/viewport.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/stores/hybrid_viewer/viewport.ts b/internal/stores/hybrid_viewer/viewport.ts index 9c2fcbe08..bbca826dc 100644 --- a/internal/stores/hybrid_viewer/viewport.ts +++ b/internal/stores/hybrid_viewer/viewport.ts @@ -43,7 +43,10 @@ async function performResize(width: number, height: number): Promise { await remoteRender(); } -async function performClickPicking(event: MouseEvent, containerElement: HTMLElement): Promise { +async function performClickPicking( + event: MouseEvent, + containerElement: HTMLElement, +): Promise { const { genericRenderWindow, syncRemoteCamera } = useHybridViewerStore() as unknown as HybridViewerStorePublic; const viewerStore = useViewerStore(); From 8236e3c285ca0560bc62989b1b3d762a2d5f4d4c Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Mon, 21 Sep 2026 13:26:40 +0200 Subject: [PATCH 4/9] Refacto camera synchronization & update centerCameraOnPosition logic & add unit tests for camera centering functionality --- internal/stores/hybrid_viewer/camera.ts | 24 ++++++++---- internal/stores/hybrid_viewer/viewport.ts | 6 +-- internal/stores/hybrid_viewer/vtk_types.ts | 2 +- .../stores/hybrid_viewer_camera.nuxt.test.ts | 38 +++++++++++++++++++ 4 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 tests/unit/stores/hybrid_viewer_camera.nuxt.test.ts diff --git a/internal/stores/hybrid_viewer/camera.ts b/internal/stores/hybrid_viewer/camera.ts index e71894df1..aaef19857 100644 --- a/internal/stores/hybrid_viewer/camera.ts +++ b/internal/stores/hybrid_viewer/camera.ts @@ -79,7 +79,7 @@ function getCameraOptions(camera: vtkCamera | undefined): CameraOptions | undefi }; } -function performSyncRemoteCamera(): Promise { +function performSyncRemoteCamera(): void { const { genericRenderWindow, camera_options, remoteRender } = useHybridViewerStore() as unknown as HybridViewerStorePublic; const viewerStore = useViewerStore(); @@ -90,7 +90,7 @@ function performSyncRemoteCamera(): Promise { const params = { camera_options: options_camera, }; - return viewerStore.request( + viewerStore.request( { schema, params, @@ -231,8 +231,8 @@ function performCameraOrientation(orientation: string): void { function useHybridViewerCamera() { const camera_options = reactive>({}); - function syncRemoteCamera(): Promise { - return performSyncRemoteCamera(); + function syncRemoteCamera(): void { + performSyncRemoteCamera(); } function setCamera(targetCameraOptions: CameraOptions): void { performSetCamera(targetCameraOptions); @@ -268,13 +268,21 @@ function centerCameraOnPosition( if (!camera || !pickedPosition) { return; } - const focalPoint = camera.getFocalPoint(); const position = camera.getPosition(); + const directionOfProjection = camera.getDirectionOfProjection(); + const distance = dot( + [ + pickedPosition[0] - position[0], + pickedPosition[1] - position[1], + pickedPosition[2] - position[2], + ], + directionOfProjection, + ); camera.setFocalPoint(...pickedPosition); camera.setPosition( - position[0] + pickedPosition[0] - focalPoint[0], - position[1] + pickedPosition[1] - focalPoint[1], - position[2] + pickedPosition[2] - focalPoint[2], + pickedPosition[0] - distance * directionOfProjection[0], + pickedPosition[1] - distance * directionOfProjection[1], + pickedPosition[2] - distance * directionOfProjection[2], ); } diff --git a/internal/stores/hybrid_viewer/viewport.ts b/internal/stores/hybrid_viewer/viewport.ts index bbca826dc..795597aa4 100644 --- a/internal/stores/hybrid_viewer/viewport.ts +++ b/internal/stores/hybrid_viewer/viewport.ts @@ -43,14 +43,10 @@ async function performResize(width: number, height: number): Promise { await remoteRender(); } -async function performClickPicking( - event: MouseEvent, - containerElement: HTMLElement, -): Promise { +function performClickPicking(event: MouseEvent, containerElement: HTMLElement): void { const { genericRenderWindow, syncRemoteCamera } = useHybridViewerStore() as unknown as HybridViewerStorePublic; const viewerStore = useViewerStore(); - await syncRemoteCamera(); const rect = containerElement.getBoundingClientRect(); const schema = viewer_schemas.opengeodeweb_viewer.viewer.get_point_position; const params = { diff --git a/internal/stores/hybrid_viewer/vtk_types.ts b/internal/stores/hybrid_viewer/vtk_types.ts index 41b37d8be..44047c935 100644 --- a/internal/stores/hybrid_viewer/vtk_types.ts +++ b/internal/stores/hybrid_viewer/vtk_types.ts @@ -51,7 +51,7 @@ interface HybridViewerStorePublic { camera_options: Record; remoteRender: () => Promise | void; clearHoverHighlight: () => void; - syncRemoteCamera: () => Promise; + syncRemoteCamera: () => void; hoverHighlight: (event: MouseEvent) => void; setZScaling: (value: number) => Promise; setCamera: (options: CameraOptions) => void; diff --git a/tests/unit/stores/hybrid_viewer_camera.nuxt.test.ts b/tests/unit/stores/hybrid_viewer_camera.nuxt.test.ts new file mode 100644 index 000000000..bfe4149c5 --- /dev/null +++ b/tests/unit/stores/hybrid_viewer_camera.nuxt.test.ts @@ -0,0 +1,38 @@ +// oxlint-disable eslint/sort-imports +import { describe, expect, test } from "vitest"; + +import { newInstance as vtkCamera } from "@kitware/vtk.js/Rendering/Core/Camera"; +import { centerCameraOnPosition } from "@ogw_internal/stores/hybrid_viewer/camera"; +import type { Vector3 } from "@ogw_internal/stores/hybrid_viewer/vtk_types"; + +const INITIAL_CAMERA_Z = 100; +const PICKED_X = 20; +const PICKED_Y = 30; +const PICKED_Z = 80; + +describe("centerCameraOnPosition helper", () => { + test("preserves distance along view direction and centers on picked position", () => { + const camera = vtkCamera(); + camera.setPosition(0, 0, INITIAL_CAMERA_Z); + camera.setFocalPoint(0, 0, 0); + + const pickedPosition: Vector3 = [PICKED_X, PICKED_Y, PICKED_Z]; + centerCameraOnPosition(camera, pickedPosition); + + expect(camera.getFocalPoint()).toStrictEqual(pickedPosition); + expect(camera.getPosition()).toStrictEqual([PICKED_X, PICKED_Y, INITIAL_CAMERA_Z]); + expect(camera.getDirectionOfProjection()).toStrictEqual([0, 0, -1]); + }); + + test("handles undefined inputs gracefully", () => { + const camera = vtkCamera(); + camera.setPosition(0, 0, INITIAL_CAMERA_Z); + camera.setFocalPoint(0, 0, 0); + + centerCameraOnPosition(undefined, [1, 2, 3]); + centerCameraOnPosition(camera, undefined); + + expect(camera.getPosition()).toStrictEqual([0, 0, INITIAL_CAMERA_Z]); + expect(camera.getFocalPoint()).toStrictEqual([0, 0, 0]); + }); +}); From f472681fe452ed862b82b5be2bf0fe11d481a07c Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Mon, 21 Sep 2026 13:27:53 +0200 Subject: [PATCH 5/9] oxlint --- tests/unit/stores/hybrid_viewer_camera.nuxt.test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/unit/stores/hybrid_viewer_camera.nuxt.test.ts b/tests/unit/stores/hybrid_viewer_camera.nuxt.test.ts index bfe4149c5..e7490fbf3 100644 --- a/tests/unit/stores/hybrid_viewer_camera.nuxt.test.ts +++ b/tests/unit/stores/hybrid_viewer_camera.nuxt.test.ts @@ -1,9 +1,8 @@ -// oxlint-disable eslint/sort-imports import { describe, expect, test } from "vitest"; -import { newInstance as vtkCamera } from "@kitware/vtk.js/Rendering/Core/Camera"; -import { centerCameraOnPosition } from "@ogw_internal/stores/hybrid_viewer/camera"; import type { Vector3 } from "@ogw_internal/stores/hybrid_viewer/vtk_types"; +import { centerCameraOnPosition } from "@ogw_internal/stores/hybrid_viewer/camera"; +import { newInstance as vtkCamera } from "@kitware/vtk.js/Rendering/Core/Camera"; const INITIAL_CAMERA_Z = 100; const PICKED_X = 20; From bdb36ff37c43fef1bb02c524b8cde059333ae722 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 22 Sep 2026 14:00:57 +0200 Subject: [PATCH 6/9] fix oxlint --- app/components/csv-preview/CsvPreviewer.vue | 15 +++++++-------- app/stores/app.ts | 2 ++ app/stores/viewer.ts | 1 + internal/stores/hybrid_viewer/filters.ts | 10 ++-------- internal/stores/hybrid_viewer/viewport.ts | 10 ++-------- 5 files changed, 14 insertions(+), 24 deletions(-) diff --git a/app/components/csv-preview/CsvPreviewer.vue b/app/components/csv-preview/CsvPreviewer.vue index c62b6fd15..e797c87f4 100644 --- a/app/components/csv-preview/CsvPreviewer.vue +++ b/app/components/csv-preview/CsvPreviewer.vue @@ -77,14 +77,7 @@ function autoDetectSeparator(content: string): string { return best; } -function parseContent(): string[] { - if (!rawContent.value) { - return []; - } - - const allLines = rawContent.value.split(/\r?\n/u).filter((line) => line.trim() !== ""); - - function splitLine(line: string): string[] { +function splitLine(line: string): string[] { if (!separator.value) { return [line]; } @@ -105,6 +98,12 @@ function parseContent(): string[] { return result; } +function parseContent(): string[] { + if (!rawContent.value) { + return []; + } + + const allLines = rawContent.value.split(/\r?\n/u).filter((line) => line.trim() !== ""); const headerLine = allLines[headerRow.value]; const rawHeaders = headerLine ? splitLine(headerLine) : []; diff --git a/app/stores/app.ts b/app/stores/app.ts index 910d06b8b..12bde2496 100644 --- a/app/stores/app.ts +++ b/app/stores/app.ts @@ -142,6 +142,7 @@ export const useAppStore = defineStore("app", () => { getExtensionEnabled, } = useAppExtensions(); +// oxlint-disable-next-line unicorn/consistent-function-scoping async function upload(file: Readonly, callbacks: RequestHandlers = {}): Promise { const store = useAppStore(); const schema = opengeodeweb_front_schemas.api.local.extensions.upload; @@ -163,6 +164,7 @@ export const useAppStore = defineStore("app", () => { } // `TResult` is asserted, not verified, at the single `return result as TResult` boundary below: the backend response is only checked against `schema` at runtime, so callers' `TResult` is a contract with the schema, not something this function can prove. + // oxlint-disable-next-line unicorn/consistent-function-scoping async function request( { schema, diff --git a/app/stores/viewer.ts b/app/stores/viewer.ts index 51dcbf734..52f82a7b0 100644 --- a/app/stores/viewer.ts +++ b/app/stores/viewer.ts @@ -62,6 +62,7 @@ export const useViewerStore = defineStore( function toggle_picking_mode(value: boolean): void { picking_mode.value = value; } + // oxlint-disable-next-line unicorn/consistent-function-scoping async function request( { schema, diff --git a/internal/stores/hybrid_viewer/filters.ts b/internal/stores/hybrid_viewer/filters.ts index d820ef692..6933dd919 100644 --- a/internal/stores/hybrid_viewer/filters.ts +++ b/internal/stores/hybrid_viewer/filters.ts @@ -34,15 +34,9 @@ function useHybridViewerFilters(): { setClippingPlanes: (ids: string[], planes: unknown) => Promise; setShrink: (ids: string[], shrink_factor: number) => Promise; } { - async function setClippingPlanes(ids: string[], planes: unknown): Promise { - await performSetClippingPlanes(ids, planes); - } - async function setShrink(ids: string[], shrink_factor: number): Promise { - await performSetShrink(ids, shrink_factor); - } return { - setClippingPlanes, - setShrink, + setClippingPlanes: performSetClippingPlanes, + setShrink: performSetShrink, }; } export { performSetClippingPlanes, performSetShrink, useHybridViewerFilters }; diff --git a/internal/stores/hybrid_viewer/viewport.ts b/internal/stores/hybrid_viewer/viewport.ts index e02e44a04..38ab6778e 100644 --- a/internal/stores/hybrid_viewer/viewport.ts +++ b/internal/stores/hybrid_viewer/viewport.ts @@ -167,15 +167,9 @@ function performSetContainer(container: ContainerRef | undefined): void { } function useHybridViewerViewport(): HybridViewerViewport { const { viewStream } = useHybridViewerCore(); - function setContainer(container: ContainerRef | undefined): void { - performSetContainer(container); - } - async function resize(width: number, height: number): Promise { - await performResize(width, height); - } return { - setContainer, - resize, + setContainer: performSetContainer, + resize: performResize, viewStream, }; } From aee8543ba9fb6e53b1e39ad97a82b0c8717ca6fa Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Tue, 22 Sep 2026 12:01:39 +0000 Subject: [PATCH 7/9] Apply prepare changes --- app/components/csv-preview/CsvPreviewer.vue | 34 ++++++++++----------- app/stores/app.ts | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/components/csv-preview/CsvPreviewer.vue b/app/components/csv-preview/CsvPreviewer.vue index e797c87f4..34e644e6e 100644 --- a/app/components/csv-preview/CsvPreviewer.vue +++ b/app/components/csv-preview/CsvPreviewer.vue @@ -78,25 +78,25 @@ function autoDetectSeparator(content: string): string { } function splitLine(line: string): string[] { - if (!separator.value) { - return [line]; - } - const result = []; - let current = ""; - let inQuotes = false; - for (const char of line) { - if (char === '"') { - inQuotes = !inQuotes; - } else if (char === separator.value && !inQuotes) { - result.push(current.trim()); - current = ""; - } else { - current += char; - } + if (!separator.value) { + return [line]; + } + const result = []; + let current = ""; + let inQuotes = false; + for (const char of line) { + if (char === '"') { + inQuotes = !inQuotes; + } else if (char === separator.value && !inQuotes) { + result.push(current.trim()); + current = ""; + } else { + current += char; } - result.push(current.trim()); - return result; } + result.push(current.trim()); + return result; +} function parseContent(): string[] { if (!rawContent.value) { diff --git a/app/stores/app.ts b/app/stores/app.ts index 12bde2496..7c686abc3 100644 --- a/app/stores/app.ts +++ b/app/stores/app.ts @@ -142,7 +142,7 @@ export const useAppStore = defineStore("app", () => { getExtensionEnabled, } = useAppExtensions(); -// oxlint-disable-next-line unicorn/consistent-function-scoping + // oxlint-disable-next-line unicorn/consistent-function-scoping async function upload(file: Readonly, callbacks: RequestHandlers = {}): Promise { const store = useAppStore(); const schema = opengeodeweb_front_schemas.api.local.extensions.upload; From 397fd999788c659b25f363c84162bd92402cea43 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 22 Sep 2026 14:05:30 +0200 Subject: [PATCH 8/9] trigger From f037a9c09d8b69003d4cc6aa6d1760a2e9bc969c Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 22 Sep 2026 17:00:17 +0200 Subject: [PATCH 9/9] revert some --- internal/stores/hybrid_viewer/filters.ts | 10 +++++----- internal/stores/hybrid_viewer/viewport.ts | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/internal/stores/hybrid_viewer/filters.ts b/internal/stores/hybrid_viewer/filters.ts index 6933dd919..4683d013a 100644 --- a/internal/stores/hybrid_viewer/filters.ts +++ b/internal/stores/hybrid_viewer/filters.ts @@ -2,7 +2,7 @@ import { useHybridViewerCore } from "./core"; import { useViewerStore } from "@ogw_front/stores/viewer"; import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json"; -async function performSetClippingPlanes(ids: string[], planes: unknown): Promise { +async function setClippingPlanes(ids: string[], planes: unknown): Promise { const viewerStore = useViewerStore(); const { remoteRender } = useHybridViewerCore(); const schema = viewer_schemas.opengeodeweb_viewer.viewer.clipping_planes; @@ -16,7 +16,7 @@ async function performSetClippingPlanes(ids: string[], planes: unknown): Promise }); await remoteRender(); } -async function performSetShrink(ids: string[], shrink_factor: number): Promise { +async function setShrink(ids: string[], shrink_factor: number): Promise { const viewerStore = useViewerStore(); const { remoteRender } = useHybridViewerCore(); const schema = viewer_schemas.opengeodeweb_viewer.viewer.shrink; @@ -35,8 +35,8 @@ function useHybridViewerFilters(): { setShrink: (ids: string[], shrink_factor: number) => Promise; } { return { - setClippingPlanes: performSetClippingPlanes, - setShrink: performSetShrink, + setClippingPlanes, + setShrink, }; } -export { performSetClippingPlanes, performSetShrink, useHybridViewerFilters }; +export { useHybridViewerFilters }; diff --git a/internal/stores/hybrid_viewer/viewport.ts b/internal/stores/hybrid_viewer/viewport.ts index 38ab6778e..696f84d4a 100644 --- a/internal/stores/hybrid_viewer/viewport.ts +++ b/internal/stores/hybrid_viewer/viewport.ts @@ -15,7 +15,7 @@ interface HybridViewerViewport { viewStream: Ref; } -async function performResize(width: number, height: number): Promise { +async function resize(width: number, height: number): Promise { const { genericRenderWindow, remoteRender, status, viewStream } = useHybridViewerCore(); const viewerStore = useViewerStore(); if (viewerStore.status !== Status.CONNECTED || status.value !== Status.CREATED) { @@ -77,7 +77,7 @@ function performClickPicking(event: MouseEvent, containerElement: HTMLElement): ); } -function performSetContainer(container: ContainerRef | undefined): void { +function setContainer(container: ContainerRef | undefined): void { if (!container || !container.value) { return; } @@ -102,7 +102,7 @@ function performSetContainer(container: ContainerRef | undefined): void { transition: "opacity 0.1s ease-in", zIndex: 1, }); - void performResize(containerElement.offsetWidth, containerElement.offsetHeight); + void resize(containerElement.offsetWidth, containerElement.offsetHeight); let has_dragged = false; useMousePressed({ target: containerElement, @@ -168,10 +168,10 @@ function performSetContainer(container: ContainerRef | undefined): void { function useHybridViewerViewport(): HybridViewerViewport { const { viewStream } = useHybridViewerCore(); return { - setContainer: performSetContainer, - resize: performResize, + setContainer, + resize, viewStream, }; } -export { performClickPicking, performResize, performSetContainer, useHybridViewerViewport }; +export { performClickPicking, useHybridViewerViewport }; export type { ViewStreamLike } from "./vtk_types";