@roomle/web-sdk 3.7.0-alpha.2 → 3.7.0-alpha.3

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 (59) hide show
  1. package/lib/ConfiguratorKernel.wasm +0 -0
  2. package/lib/RoomleCore.js +2 -2
  3. package/lib/RoomleCore.wasm +0 -0
  4. package/lib/RoomleToolsCore.wasm +0 -0
  5. package/lib/{api-oYzhcs_W.mjs → api-DgXsyN04.mjs} +2 -2
  6. package/lib/{api-oYzhcs_W.mjs.map → api-DgXsyN04.mjs.map} +1 -1
  7. package/lib/asset-loader.worker-A7nEeQB4.mjs.map +1 -1
  8. package/lib/banana-for-scale-D8t2dmc7.mjs.map +1 -1
  9. package/lib/budgeteer.sw-CQWYbQSc.mjs.map +1 -1
  10. package/lib/{configurator-CRMunIq7.mjs → configurator-CmMBHkyd.mjs} +3 -3
  11. package/lib/{configurator-CRMunIq7.mjs.map → configurator-CmMBHkyd.mjs.map} +1 -1
  12. package/lib/configurator-DtvX4JqP.mjs +2 -0
  13. package/lib/{glb-viewer-CXEoIw1b.mjs → glb-viewer-Cs3i0yb8.mjs} +3 -3
  14. package/lib/{glb-viewer-CXEoIw1b.mjs.map → glb-viewer-Cs3i0yb8.mjs.map} +1 -1
  15. package/lib/glb-viewer-Dcllu_oG.mjs +2 -0
  16. package/lib/{homag-intelligence-gb9MqBrz.mjs → homag-intelligence-CBZujG1I.mjs} +3 -3
  17. package/lib/{homag-intelligence-gb9MqBrz.mjs.map → homag-intelligence-CBZujG1I.mjs.map} +1 -1
  18. package/lib/kernel-C7YDLxq8.mjs.map +1 -1
  19. package/lib/{main-BJZ9-cDk.mjs → main-_HtiLIhS.mjs} +52 -39
  20. package/lib/main-_HtiLIhS.mjs.map +1 -0
  21. package/lib/{material-viewer-D8Nmpwg0.mjs → material-viewer-BCjg687R.mjs} +3 -3
  22. package/lib/{material-viewer-D8Nmpwg0.mjs.map → material-viewer-BCjg687R.mjs.map} +1 -1
  23. package/lib/packages-BhrPUb9k.mjs +4 -0
  24. package/lib/planner-CDJtTG3g.mjs +2 -0
  25. package/lib/{planner-5VarJrpy.mjs → planner-OYwMFSWo.mjs} +3 -3
  26. package/lib/{planner-5VarJrpy.mjs.map → planner-OYwMFSWo.mjs.map} +1 -1
  27. package/lib/roomle-headless.d.ts +67 -43
  28. package/lib/roomle-headless.js +18 -15
  29. package/lib/roomle-headless.js.map +1 -1
  30. package/lib/roomle-sdk.d.ts +67 -43
  31. package/lib/roomle-sdk.js +6 -6
  32. package/lib/{script-loader-gpkcl1h-.mjs → script-loader-X4I-gQl2.mjs} +2 -2
  33. package/lib/{script-loader-gpkcl1h-.mjs.map → script-loader-X4I-gQl2.mjs.map} +1 -1
  34. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/package.json +1 -1
  35. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.d.ts +3 -3
  36. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.js +6 -6
  37. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.js.map +1 -1
  38. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCoreInterface.d.ts +10 -2
  39. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorUtils.js +12 -0
  40. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorUtils.js.map +1 -1
  41. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreInterface.d.ts +27 -1
  42. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreInterface.js +6 -1
  43. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreInterface.js.map +1 -1
  44. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.d.ts +4 -0
  45. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.js +15 -0
  46. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.js.map +1 -1
  47. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
  48. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.js +2 -2
  49. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
  50. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
  51. package/lib/threejs-utils-Bq4pVWBA.mjs.map +1 -1
  52. package/lib/{tools-core-DqnhFefF.mjs → tools-core-BRzDdhLJ.mjs} +3 -3
  53. package/lib/{tools-core-DqnhFefF.mjs.map → tools-core-BRzDdhLJ.mjs.map} +1 -1
  54. package/package.json +1 -1
  55. package/lib/configurator-DqiW717d.mjs +0 -2
  56. package/lib/glb-viewer-IDXgmONx.mjs +0 -2
  57. package/lib/main-BJZ9-cDk.mjs.map +0 -1
  58. package/lib/packages-Uv53SHfb.mjs +0 -4
  59. package/lib/planner-DJcn-iih.mjs +0 -2
@@ -1,12 +1,12 @@
1
1
  import { i as e, t } from "./kernel-C7YDLxq8.mjs";
2
2
  import { bi as n } from "./three.core-mM-jZdgg.mjs";
3
- import { $ as r, A as i, B as a, D as o, E as s, G as c, H as l, M as u, N as d, P as f, R as p, U as m, V as h, _ as g, a as _, at as v, c as y, ct as b, et as x, g as S, i as C, j as w, n as T, ot as E, rt as D, s as O, tt as k, v as A, y as j, z as M } from "./main-BJZ9-cDk.mjs";
4
- import { n as N } from "./script-loader-gpkcl1h-.mjs";
5
- import { t as P } from "./configurator-CRMunIq7.mjs";
6
- import { t as F } from "./planner-5VarJrpy.mjs";
7
- import { n as I, t as L } from "./glb-viewer-CXEoIw1b.mjs";
8
- import { t as R } from "./api-oYzhcs_W.mjs";
9
- import "./packages-Uv53SHfb.mjs";
3
+ import { $ as r, A as i, B as a, D as o, E as s, G as c, H as l, M as u, N as d, P as f, R as p, U as m, V as h, _ as g, a as _, at as v, c as y, ct as b, et as x, g as S, i as C, j as w, n as T, ot as E, rt as D, s as O, tt as k, v as A, y as j, z as M } from "./main-_HtiLIhS.mjs";
4
+ import { n as N } from "./script-loader-X4I-gQl2.mjs";
5
+ import { t as P } from "./configurator-CmMBHkyd.mjs";
6
+ import { t as F } from "./planner-OYwMFSWo.mjs";
7
+ import { n as I, t as L } from "./glb-viewer-Cs3i0yb8.mjs";
8
+ import { t as R } from "./api-DgXsyN04.mjs";
9
+ import "./packages-BhrPUb9k.mjs";
10
10
  import "./roomle-headless-setup-LoBO7UJe.mjs";
11
11
  import { createRequire as z } from "module";
12
12
  //#region packages/headless-core/src/headless-script-loader.ts
@@ -245,21 +245,24 @@ var B = z(import.meta.url), V = {}, H = [
245
245
  this._ensureInitialized();
246
246
  let n = this._configurator.getSceneManager(), r = t === "glb" ? await n.createExportGLB() : await n.createUSDZExport();
247
247
  if (!r) throw Error(`${t.toUpperCase()} export produced no data`);
248
- return e && (await import("fs")).writeFileSync(e, Buffer.from(r)), { buffer: r instanceof ArrayBuffer ? r : r.buffer };
248
+ let i = r instanceof ArrayBuffer ? r : r.buffer;
249
+ return e && (await import("fs")).writeFileSync(e, Buffer.from(i)), { buffer: i };
249
250
  }
250
251
  async exportScreenshot(e, t = {}) {
251
252
  this._ensureInitialized();
252
- let n = t.quality ?? 1, r = t.ssaa ?? 2, i = this._configurator.getSceneManager(), a, o;
253
+ let n = t.quality ?? 1, r = t.ssaa ?? 2, i = this._configurator.getSceneManager(), a = i.getRenderer();
254
+ if (!a) throw Error("HeadlessRoomleSdk: renderer is not available");
255
+ let o, s;
253
256
  if (r > 1) {
254
- let e = i.getRenderer(), t = i.getRoomleRenderer(), n = e.domElement;
255
- a = n.width, o = n.height, t?.setSize(a * r, o * r);
257
+ let e = i.getRoomleRenderer(), t = a.domElement;
258
+ o = t.width, s = t.height, e?.setSize(o * r, s * r);
256
259
  }
257
- let s = await i.exportCanvasScreenshot(n);
258
- if (r > 1 && a && o && (i.getRoomleRenderer()?.setSize(a, o), s = await this._ssaaDownscale(s, a, o)), e) {
259
- let t = await import("fs"), n = s.replace(/^data:image\/\w+;base64,/, "");
260
+ let c = await i.exportCanvasScreenshot(n);
261
+ if (r > 1 && o && s && (i.getRoomleRenderer()?.setSize(o, s), c = await this._ssaaDownscale(c, o, s)), e) {
262
+ let t = await import("fs"), n = c.replace(/^data:image\/\w+;base64,/, "");
260
263
  t.writeFileSync(e, Buffer.from(n, "base64"));
261
264
  }
262
- return { dataUrl: s };
265
+ return { dataUrl: c };
263
266
  }
264
267
  async exportPerspectiveImage(e, t = {}) {
265
268
  this._ensureInitialized();
@@ -1 +1 @@
1
- {"version":3,"file":"roomle-headless.js","names":[],"sources":["../../packages/headless-core/src/headless-script-loader.ts","../../packages/headless-core/src/stubs.ts","../../packages/headless-core/src/headless-dom-helper.ts","../../packages/headless-core/src/headless-data-syncer.ts","../../packages/headless-core/src/headless-sdk.ts"],"sourcesContent":["/**\n * Replaces the browser ScriptLoader for headless mode.\n * Instead of injecting <script> tags, directly imports the Emscripten JS modules.\n */\nimport { createRequire } from 'module';\nimport type { Context } from '../../common-core/src/di/context';\nimport { getHeadlessWasmPath } from '../../common-core/src/static-files/roomle-core';\n\n// createRequire is needed because the Emscripten kernel files are CommonJS\n// and must be loaded synchronously\nconst _require = createRequire(import.meta.url);\n\nlet _idCache: { [key: string]: boolean } = {};\n\n// Maps a .wasm filename found in the Emscripten factory's source to its global name.\n// Each Emscripten factory references its own .wasm file (e.g. ConfiguratorKernel.wasm).\nconst WASM_TO_GLOBAL: Array<\n [wasmFile: string, globalName: string, modulePath: string]\n> = [\n [\n 'ConfiguratorKernel.wasm',\n 'ConfiguratorKernel',\n 'roomle-core-hsc/wasm_modern/ConfiguratorKernel.js',\n ],\n [\n 'RoomleCore.wasm',\n 'RoomleCore',\n 'roomle-core-hsc/wasm_modern/RoomleCore.js',\n ],\n [\n 'RoomleToolsCore.wasm',\n 'RoomleToolsCore',\n 'roomle-core-hsc/wasm_modern/RoomleToolsCore.js',\n ],\n];\n\nexport default class HeadlessScriptLoader implements Context {\n public _creator_: string;\n\n constructor(creator: string) {\n this._creator_ = creator;\n }\n\n public async fetch(url: string, options: { id: string }) {\n if (_idCache[options.id]) {\n return;\n }\n\n // In Bun, Vite's ?no-inline?url imports resolve to the module's default\n // export (a function) rather than a URL string. Handle both cases.\n if (typeof url === 'function') {\n this._registerFactory(url);\n _idCache[options.id] = true;\n return;\n }\n\n const entry = this._resolveEntry(url);\n if (entry) {\n const [, globalName, modulePath] = entry;\n // If url is an absolute filesystem path (from getHeadlessWasmPath),\n // require it directly. Otherwise fall back to the module specifier\n // (works from source where roomle-core-hsc is in node_modules).\n const pathToLoad = url.startsWith('/') ? url : modulePath;\n const mod = _require(pathToLoad);\n (globalThis as any)[globalName] = mod.default || mod;\n _idCache[options.id] = true;\n }\n }\n\n // Identify an Emscripten factory function by checking its source for the\n // unique .wasm filename it references, then register it on globalThis\n // under the name the kernel-access classes expect (e.g. window.ConfiguratorKernel).\n private _registerFactory(factory: () => void) {\n const source = factory.toString();\n for (const [wasmFile, globalName] of WASM_TO_GLOBAL) {\n if (source.includes(wasmFile)) {\n (globalThis as any)[globalName] = factory;\n return;\n }\n }\n console.warn(\n 'HeadlessScriptLoader: Could not identify Emscripten factory function',\n );\n }\n\n private _resolveEntry(url: string) {\n for (const entry of WASM_TO_GLOBAL) {\n const [wasmFile, globalName] = entry;\n const baseName = globalName; // e.g. \"ConfiguratorKernel\"\n if (url.includes(baseName) || url.includes(wasmFile)) {\n return entry;\n }\n }\n // Fallback: looser matching for generic URLs\n if (url.includes('configurator')) {\n return WASM_TO_GLOBAL[0];\n }\n if (url.includes('planner')) {\n return WASM_TO_GLOBAL[1];\n }\n if (url.includes('tools')) {\n return WASM_TO_GLOBAL[2];\n }\n console.warn(\n `HeadlessScriptLoader: Could not resolve module for URL: ${url}`,\n );\n return null;\n }\n\n public loadScripts(scripts: Array<{ id: string; name: string }>) {\n const promises = scripts.map((script) =>\n this.fetch(script.name, { id: script.id }),\n );\n return Promise.all(promises);\n }\n\n public resolveKernelPaths(type: 'configurator' | 'planner' | 'tools'): {\n wasm: string;\n loader: string;\n } {\n return getHeadlessWasmPath(type);\n }\n\n public cleanUp() {\n _idCache = {};\n }\n}\n","export const noop = () => {};\n","/**\n * Stub DomHelper for headless mode.\n * Returns fixed dimensions since we don't render to a real canvas.\n */\nimport { Vector2 } from 'three';\nimport { noop } from './stubs';\nimport type {\n LifeCycleCallbacks,\n LifeCycleManager,\n} from '../../common-core/src/life-cycle-manager';\nimport type { Context } from '../../common-core/src/di/context';\n\nexport default class HeadlessDomHelper implements LifeCycleCallbacks, Context {\n public _creator_: string;\n\n // Manual DI lookup instead of @inject decorator (avoids legacy/TC39 decorator mismatch)\n private get _lifeCycleManager(): LifeCycleManager | undefined {\n return (globalThis as any).__RML__DI__?.lookup(\n 'life-cycle-manager',\n this._creator_,\n );\n }\n\n private _width: number;\n private _height: number;\n private _stubElement: any;\n\n get element(): any {\n return this._stubElement;\n }\n\n constructor(creator: string, width = 1024, height = 768) {\n this._creator_ = creator;\n this._width = width;\n this._height = height;\n\n const w = this._width;\n const h = this._height;\n this._stubElement = {\n clientWidth: w,\n clientHeight: h,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: {\n add() {},\n remove() {},\n contains() {\n return false;\n },\n },\n setAttribute() {},\n getAttribute(): string | null {\n return null;\n },\n children: [] as any[],\n getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: w,\n height: h,\n top: 0,\n left: 0,\n bottom: h,\n right: w,\n };\n },\n addEventListener() {},\n removeEventListener() {},\n dispatchEvent() {\n return true;\n },\n offsetWidth: w,\n offsetHeight: h,\n scrollWidth: w,\n scrollHeight: h,\n contains() {\n return false;\n },\n };\n }\n\n public setDomElement(_element: any) {\n noop();\n }\n\n public getClientDimensions() {\n return new Vector2(this._width, this._height);\n }\n\n public getAspectRatio() {\n return this._width / this._height;\n }\n\n public ensureCanvasFocus() {}\n public reset() {}\n public pause() {}\n public resume() {}\n public destroy() {}\n}\n","/**\n * Replaces the Worker-based DataSyncer with a no-op for headless mode.\n * In headless mode, assets are loaded on-demand via RapiAccess rather than\n * being pre-synced with a Web Worker.\n */\nimport type { RapiId } from '@roomle/web-sdk';\nimport { noop } from './stubs';\nimport type { Context } from '../../common-core/src/di/context';\n\nexport default class HeadlessDataSyncer implements Context {\n public _creator_: string;\n\n constructor(creator: string) {\n this._creator_ = creator;\n }\n\n public start(_catalogId: RapiId) {\n return Promise.resolve();\n }\n\n public syncCatalog(_catalogId: RapiId): Promise<void> {\n return Promise.resolve();\n }\n\n public syncFloorTag(_tagId: RapiId) {\n return Promise.resolve();\n }\n\n public syncTypeChangeTag(_tagId: RapiId) {\n return Promise.resolve();\n }\n\n public _syncTypeChangeTag(_tagId: RapiId): Promise<any> {\n return Promise.resolve();\n }\n\n public getIsCatalogSynced(_catalogId: RapiId) {\n return false;\n }\n\n public onCommand(_command: number, _conversationId: number, _data: any) {\n noop();\n }\n\n public requestAsset(url: string, _urlAsFallback: boolean = false): string {\n return url;\n }\n\n public setAlwaysUseCache(_alwaysUseCache: boolean): void {\n noop();\n }\n\n public preFillAssetCache(_key: string, _url: string) {\n noop();\n }\n}\n","/**\n * Main entry point for the headless Roomle SDK.\n * Provides the ability to run the Roomle web-sdk in Node.js/Bun\n * for loading configurations/plans and exporting them to GLB/USDZ.\n */\nimport HeadlessScriptLoader from './headless-script-loader';\nimport HeadlessDomHelper from './headless-dom-helper';\nimport HeadlessDataSyncer from './headless-data-syncer';\nimport CommonKernelAccess from '../../common-core/src/services/common-kernel-access';\nimport type {\n RoomlePlanner,\n Planner,\n RoomleConfigurator,\n Configurator,\n InitDataDefinition,\n GlobalInitDataDefinition,\n RapiId,\n} from '../../index';\nimport { RoomleSdk } from '../../index';\nimport {\n Container,\n DependencyInjectionAssignment,\n DI_TYPE,\n} from '../../common-core/src/di/container';\nimport { INJECTABLES } from '../../common-core/src/di/injectables';\n\nexport interface HeadlessInitData\n extends Partial<InitDataDefinition>,\n Partial<GlobalInitDataDefinition> {\n configuratorId: string;\n /** Canvas width in pixels. Defaults to 1024. */\n width?: number;\n /** Canvas height in pixels. Defaults to 768. */\n height?: number;\n}\n\nexport interface ExportResult {\n buffer: ArrayBuffer;\n}\n\nexport interface ImageExportOptions {\n /** Supersampling anti-aliasing factor. Defaults to 2. */\n ssaa?: number;\n}\n\nexport interface ScreenshotExportOptions extends ImageExportOptions {\n /** JPEG quality (0–1). Defaults to 1. */\n quality?: number;\n}\n\nexport interface PerspectiveImageExportOptions extends ImageExportOptions {\n /** Output image size in pixels. Defaults to 1024. */\n size?: number;\n showDimensions?: boolean;\n rotationY?: number;\n}\n\nexport interface TopImageExportOptions extends ImageExportOptions {\n /** Output image size in pixels. Defaults to 1024. */\n size?: number;\n showDimensions?: boolean;\n}\n\nexport class HeadlessRoomleSdk {\n private _planner: RoomlePlanner;\n private _plannerMain: Planner;\n private _configurator: RoomleConfigurator;\n private _configuratorMain: Configurator;\n private _initialized = false;\n private _width = 1024;\n private _height = 768;\n\n static async create(initData: HeadlessInitData): Promise<HeadlessRoomleSdk> {\n const instance = new HeadlessRoomleSdk();\n await instance._init(initData);\n return instance;\n }\n\n private async _init(initData: HeadlessInitData) {\n this._width = initData.width ?? 1024;\n this._height = initData.height ?? 768;\n\n // Register headless service overrides BEFORE the DI container initializes.\n // This monkey-patches Container so that headless overrides always win,\n // even after boot() re-registers the default INJECTABLES.\n this._registerHeadlessServices(this._width, this._height);\n\n await RoomleSdk.setGlobalInitData({\n configuratorId: initData.configuratorId,\n locale: initData.locale,\n // @ts-ignore -- tenant is untyped, but we still need it.\n tenant: initData.tenant,\n overrideCountry: initData.overrideCountry,\n animateCamera: false,\n });\n\n this._initialized = true;\n }\n\n private _registerHeadlessServices(width: number, height: number) {\n // Create the DI container early. When roomle-dependency-injection.ts is\n // later loaded transitively, its _ensureContainer() checks if __RML__DI__\n // already exists and skips creating a new one — so we must register the\n // full INJECTABLES here ourselves.\n const container = new Container();\n (globalThis as any).__RML__DI__ = container;\n\n // Capture width/height in a subclass so the DI container instantiates\n // HeadlessDomHelper with the correct dimensions (DI only passes `creator`).\n class SizedHeadlessDomHelper extends HeadlessDomHelper {\n constructor(creator: string) {\n super(creator, width, height);\n }\n }\n\n const headlessOverrides = [\n new DependencyInjectionAssignment(\n 'script-loader',\n HeadlessScriptLoader,\n DI_TYPE.CONTEXT,\n ),\n new DependencyInjectionAssignment(\n 'dom-helper',\n SizedHeadlessDomHelper,\n DI_TYPE.CONTEXT,\n ),\n new DependencyInjectionAssignment('data-syncer', HeadlessDataSyncer),\n ];\n\n // Monkey-patch addDependencyInjectionAssignments so that every time\n // the SDK registers its default INJECTABLES (during boot()), our headless\n // overrides are re-applied on top. This ensures headless services always win.\n const originalAdd = Container.prototype.addDependencyInjectionAssignments;\n Container.prototype.addDependencyInjectionAssignments = function (\n injections: DependencyInjectionAssignment[],\n ) {\n originalAdd.call(this, injections);\n originalAdd.call(this, headlessOverrides);\n };\n\n // Wrap kernel callbacks with a safety Proxy so that exceptions thrown\n // from JS callbacks invoked by C++ (via Embind) are caught and logged\n // rather than propagating into C++ which would call std::terminate → abort().\n (CommonKernelAccess.prototype as any)._buildCallbackTarget = function () {\n const target = this;\n return new Proxy(target, {\n get(_, prop) {\n const val = (target as any)[prop];\n if (typeof val === 'function') {\n return function (...args: any[]) {\n try {\n return val.apply(target, args);\n } catch (e) {\n console.error(\n `[Headless] Kernel callback '${String(prop)}' threw:`,\n e,\n );\n }\n };\n }\n return val;\n },\n });\n };\n\n // Register all default INJECTABLES + headless overrides.\n // The monkey-patch ensures headless overrides are applied on top.\n container.addDependencyInjectionAssignments(INJECTABLES);\n }\n\n async loadConfiguration(\n configurationId: RapiId,\n initData?: Partial<InitDataDefinition>,\n ): Promise<void> {\n this._ensureInitialized();\n\n const configuratorModule = await RoomleSdk.getConfigurator(initData);\n await configuratorModule.boot();\n this._configuratorMain = configuratorModule;\n this._configurator = configuratorModule.getApi();\n\n const stubElement = {\n clientWidth: this._width,\n clientHeight: this._height,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: { add() {} },\n };\n await this._configurator.init(stubElement as any);\n\n await this._configurator.loadConfigurableItemById(configurationId);\n }\n\n async loadPlan(\n planId: string,\n initData?: Partial<InitDataDefinition>,\n ): Promise<void> {\n this._ensureInitialized();\n\n const plannerModule = await RoomleSdk.getPlanner(initData);\n await plannerModule.boot();\n this._plannerMain = plannerModule;\n this._planner = plannerModule.getApi();\n\n const stubElement = {\n clientWidth: this._width,\n clientHeight: this._height,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: { add() {} },\n };\n await this._planner.init(stubElement as any);\n\n await this._planner.loadPlan(planId);\n }\n\n async exportGLB(outputPath?: string): Promise<ExportResult> {\n return this._export(outputPath, 'glb');\n }\n\n async exportUSDZ(outputPath?: string): Promise<ExportResult> {\n return this._export(outputPath, 'usdz');\n }\n\n private async _export(\n outputPath: string | undefined,\n type: 'glb' | 'usdz',\n ): Promise<ExportResult> {\n this._ensureInitialized();\n\n const sm = this._configurator.getSceneManager();\n const buffer =\n type === 'glb' ? await sm.createExportGLB() : await sm.createUSDZExport();\n\n if (!buffer) {\n throw new Error(`${type.toUpperCase()} export produced no data`);\n }\n\n if (outputPath) {\n const fs = await import('fs');\n // @ts-ignore -- ts thinks this is a different type of buffer\n fs.writeFileSync(outputPath, Buffer.from(buffer));\n }\n\n return { buffer: buffer instanceof ArrayBuffer ? buffer : buffer.buffer };\n }\n\n async exportScreenshot(\n outputPath?: string,\n options: ScreenshotExportOptions = {},\n ): Promise<{ dataUrl: string }> {\n this._ensureInitialized();\n\n const quality = options.quality ?? 1;\n const ssaa = options.ssaa ?? 2;\n const sm = this._configurator.getSceneManager();\n\n let originalWidth: number | undefined;\n let originalHeight: number | undefined;\n\n // Temporarily resize renderer for SSAA supersampling\n if (ssaa > 1) {\n const renderer = sm.getRenderer();\n const roomleRenderer = sm.getRoomleRenderer();\n const canvas = renderer.domElement;\n originalWidth = canvas.width;\n originalHeight = canvas.height;\n roomleRenderer?.setSize(originalWidth! * ssaa, originalHeight! * ssaa);\n }\n\n let dataUrl: string = await sm.exportCanvasScreenshot(quality);\n\n // Restore original size and downscale\n if (ssaa > 1 && originalWidth && originalHeight) {\n sm.getRoomleRenderer()?.setSize(originalWidth, originalHeight);\n dataUrl = await this._ssaaDownscale(\n dataUrl,\n originalWidth,\n originalHeight,\n );\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = dataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl };\n }\n\n async exportPerspectiveImage(\n outputPath?: string,\n options: PerspectiveImageExportOptions = {},\n ): Promise<{ dataUrl: string; width: number; height: number }> {\n this._ensureInitialized();\n\n const ssaa = options.ssaa ?? 2;\n const targetSize = options.size ?? 1024;\n const renderSize = targetSize * ssaa;\n\n const result = await this._configurator.preparePerspectiveImage({\n ...options,\n size: renderSize,\n });\n\n let finalDataUrl = result.image;\n let finalWidth = result.width;\n let finalHeight = result.height;\n\n // Downscale with SSAA if rendering at higher resolution, achieves antialiasing effect.\n if (ssaa > 1) {\n finalDataUrl = await this._ssaaDownscale(\n finalDataUrl,\n targetSize,\n targetSize,\n );\n finalWidth = targetSize;\n finalHeight = targetSize;\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = finalDataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl: finalDataUrl, width: finalWidth, height: finalHeight };\n }\n\n async exportTopImage(\n outputPath?: string,\n options: TopImageExportOptions = {},\n ): Promise<{ dataUrl: string; width: number; height: number }> {\n this._ensureInitialized();\n\n const ssaa = options.ssaa ?? 2;\n const result = await this._configurator.prepareTopImage({\n ...options,\n size: (options.size ?? 1024) * ssaa,\n showDimensions: options.showDimensions ?? false,\n });\n\n let finalDataUrl = result.image;\n let finalWidth = result.width;\n let finalHeight = result.height;\n\n if (ssaa > 1) {\n const targetWidth = Math.round(finalWidth / ssaa);\n const targetHeight = Math.round(finalHeight / ssaa);\n finalDataUrl = await this._ssaaDownscale(\n finalDataUrl,\n targetWidth,\n targetHeight,\n );\n finalWidth = targetWidth;\n finalHeight = targetHeight;\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = finalDataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl: finalDataUrl, width: finalWidth, height: finalHeight };\n }\n\n /** Downscale a data URL image to target dimensions using high-quality filtering. */\n private async _ssaaDownscale(\n dataUrl: string,\n targetWidth: number,\n targetHeight: number,\n ): Promise<string> {\n const { createCanvas, loadImage } = await import('@napi-rs/canvas');\n const imgBuffer = Buffer.from(\n dataUrl.replace(/^data:image\\/\\w+;base64,/, ''),\n 'base64',\n );\n const img = await loadImage(imgBuffer);\n const outCanvas = createCanvas(targetWidth, targetHeight);\n const ctx = outCanvas.getContext('2d');\n (ctx as any).imageSmoothingEnabled = true;\n (ctx as any).imageSmoothingQuality = 'high';\n ctx.drawImage(img, 0, 0, targetWidth, targetHeight);\n return outCanvas.toDataURL('image/png');\n }\n\n getConfiguratorApi() {\n return this._configurator;\n }\n\n getPlannerApi() {\n return this._planner;\n }\n\n async destroy() {\n if (this._configuratorMain) {\n this._configuratorMain.destroy();\n }\n if (this._plannerMain) {\n this._plannerMain.destroy();\n }\n }\n\n private _ensureInitialized() {\n if (!this._initialized) {\n throw new Error(\n 'HeadlessRoomleSdk not initialized. Call HeadlessRoomleSdk.create() first.',\n );\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"roomle-headless.js","names":[],"sources":["../../packages/headless-core/src/headless-script-loader.ts","../../packages/headless-core/src/stubs.ts","../../packages/headless-core/src/headless-dom-helper.ts","../../packages/headless-core/src/headless-data-syncer.ts","../../packages/headless-core/src/headless-sdk.ts"],"sourcesContent":["/**\n * Replaces the browser ScriptLoader for headless mode.\n * Instead of injecting <script> tags, directly imports the Emscripten JS modules.\n */\nimport { createRequire } from 'module';\nimport type { Context } from '../../common-core/src/di/context';\nimport { getHeadlessWasmPath } from '../../common-core/src/static-files/roomle-core';\n\n// createRequire is needed because the Emscripten kernel files are CommonJS\n// and must be loaded synchronously\nconst _require = createRequire(import.meta.url);\n\nlet _idCache: { [key: string]: boolean } = {};\n\n// Maps a .wasm filename found in the Emscripten factory's source to its global name.\n// Each Emscripten factory references its own .wasm file (e.g. ConfiguratorKernel.wasm).\nconst WASM_TO_GLOBAL: Array<\n [wasmFile: string, globalName: string, modulePath: string]\n> = [\n [\n 'ConfiguratorKernel.wasm',\n 'ConfiguratorKernel',\n 'roomle-core-hsc/wasm_modern/ConfiguratorKernel.js',\n ],\n [\n 'RoomleCore.wasm',\n 'RoomleCore',\n 'roomle-core-hsc/wasm_modern/RoomleCore.js',\n ],\n [\n 'RoomleToolsCore.wasm',\n 'RoomleToolsCore',\n 'roomle-core-hsc/wasm_modern/RoomleToolsCore.js',\n ],\n];\n\nexport default class HeadlessScriptLoader implements Context {\n public _creator_: string;\n\n constructor(creator: string) {\n this._creator_ = creator;\n }\n\n public async fetch(url: string, options: { id: string }) {\n if (_idCache[options.id]) {\n return;\n }\n\n // In Bun, Vite's ?no-inline?url imports resolve to the module's default\n // export (a function) rather than a URL string. Handle both cases.\n if (typeof url === 'function') {\n this._registerFactory(url);\n _idCache[options.id] = true;\n return;\n }\n\n const entry = this._resolveEntry(url);\n if (entry) {\n const [, globalName, modulePath] = entry;\n // If url is an absolute filesystem path (from getHeadlessWasmPath),\n // require it directly. Otherwise fall back to the module specifier\n // (works from source where roomle-core-hsc is in node_modules).\n const pathToLoad = url.startsWith('/') ? url : modulePath;\n const mod = _require(pathToLoad);\n (globalThis as any)[globalName] = mod.default || mod;\n _idCache[options.id] = true;\n }\n }\n\n // Identify an Emscripten factory function by checking its source for the\n // unique .wasm filename it references, then register it on globalThis\n // under the name the kernel-access classes expect (e.g. window.ConfiguratorKernel).\n private _registerFactory(factory: () => void) {\n const source = factory.toString();\n for (const [wasmFile, globalName] of WASM_TO_GLOBAL) {\n if (source.includes(wasmFile)) {\n (globalThis as any)[globalName] = factory;\n return;\n }\n }\n console.warn(\n 'HeadlessScriptLoader: Could not identify Emscripten factory function',\n );\n }\n\n private _resolveEntry(url: string) {\n for (const entry of WASM_TO_GLOBAL) {\n const [wasmFile, globalName] = entry;\n const baseName = globalName; // e.g. \"ConfiguratorKernel\"\n if (url.includes(baseName) || url.includes(wasmFile)) {\n return entry;\n }\n }\n // Fallback: looser matching for generic URLs\n if (url.includes('configurator')) {\n return WASM_TO_GLOBAL[0];\n }\n if (url.includes('planner')) {\n return WASM_TO_GLOBAL[1];\n }\n if (url.includes('tools')) {\n return WASM_TO_GLOBAL[2];\n }\n console.warn(\n `HeadlessScriptLoader: Could not resolve module for URL: ${url}`,\n );\n return null;\n }\n\n public loadScripts(scripts: Array<{ id: string; name: string }>) {\n const promises = scripts.map((script) =>\n this.fetch(script.name, { id: script.id }),\n );\n return Promise.all(promises);\n }\n\n public resolveKernelPaths(type: 'configurator' | 'planner' | 'tools'): {\n wasm: string;\n loader: string;\n } {\n return getHeadlessWasmPath(type);\n }\n\n public cleanUp() {\n _idCache = {};\n }\n}\n","export const noop = () => {};\n","/**\n * Stub DomHelper for headless mode.\n * Returns fixed dimensions since we don't render to a real canvas.\n */\nimport { Vector2 } from 'three';\nimport { noop } from './stubs';\nimport type {\n LifeCycleCallbacks,\n LifeCycleManager,\n} from '../../common-core/src/life-cycle-manager';\nimport type { Context } from '../../common-core/src/di/context';\n\nexport default class HeadlessDomHelper implements LifeCycleCallbacks, Context {\n public _creator_: string;\n\n // Manual DI lookup instead of @inject decorator (avoids legacy/TC39 decorator mismatch)\n private get _lifeCycleManager(): LifeCycleManager | undefined {\n return (globalThis as any).__RML__DI__?.lookup(\n 'life-cycle-manager',\n this._creator_,\n );\n }\n\n private _width: number;\n private _height: number;\n private _stubElement: any;\n\n get element(): any {\n return this._stubElement;\n }\n\n constructor(creator: string, width = 1024, height = 768) {\n this._creator_ = creator;\n this._width = width;\n this._height = height;\n\n const w = this._width;\n const h = this._height;\n this._stubElement = {\n clientWidth: w,\n clientHeight: h,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: {\n add() {},\n remove() {},\n contains() {\n return false;\n },\n },\n setAttribute() {},\n getAttribute(): string | null {\n return null;\n },\n children: [] as any[],\n getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: w,\n height: h,\n top: 0,\n left: 0,\n bottom: h,\n right: w,\n };\n },\n addEventListener() {},\n removeEventListener() {},\n dispatchEvent() {\n return true;\n },\n offsetWidth: w,\n offsetHeight: h,\n scrollWidth: w,\n scrollHeight: h,\n contains() {\n return false;\n },\n };\n }\n\n public setDomElement(_element: any) {\n noop();\n }\n\n public getClientDimensions() {\n return new Vector2(this._width, this._height);\n }\n\n public getAspectRatio() {\n return this._width / this._height;\n }\n\n public ensureCanvasFocus() {}\n public reset() {}\n public pause() {}\n public resume() {}\n public destroy() {}\n}\n","/**\n * Replaces the Worker-based DataSyncer with a no-op for headless mode.\n * In headless mode, assets are loaded on-demand via RapiAccess rather than\n * being pre-synced with a Web Worker.\n */\nimport type { RapiId } from '@roomle/web-sdk';\nimport { noop } from './stubs';\nimport type { Context } from '../../common-core/src/di/context';\n\nexport default class HeadlessDataSyncer implements Context {\n public _creator_: string;\n\n constructor(creator: string) {\n this._creator_ = creator;\n }\n\n public start(_catalogId: RapiId) {\n return Promise.resolve();\n }\n\n public syncCatalog(_catalogId: RapiId): Promise<void> {\n return Promise.resolve();\n }\n\n public syncFloorTag(_tagId: RapiId) {\n return Promise.resolve();\n }\n\n public syncTypeChangeTag(_tagId: RapiId) {\n return Promise.resolve();\n }\n\n public _syncTypeChangeTag(_tagId: RapiId): Promise<any> {\n return Promise.resolve();\n }\n\n public getIsCatalogSynced(_catalogId: RapiId) {\n return false;\n }\n\n public onCommand(_command: number, _conversationId: number, _data: any) {\n noop();\n }\n\n public requestAsset(url: string, _urlAsFallback: boolean = false): string {\n return url;\n }\n\n public setAlwaysUseCache(_alwaysUseCache: boolean): void {\n noop();\n }\n\n public preFillAssetCache(_key: string, _url: string) {\n noop();\n }\n}\n","/**\n * Main entry point for the headless Roomle SDK.\n * Provides the ability to run the Roomle web-sdk in Node.js/Bun\n * for loading configurations/plans and exporting them to GLB/USDZ.\n */\nimport HeadlessScriptLoader from './headless-script-loader';\nimport HeadlessDomHelper from './headless-dom-helper';\nimport HeadlessDataSyncer from './headless-data-syncer';\nimport CommonKernelAccess from '../../common-core/src/services/common-kernel-access';\nimport type {\n RoomlePlanner,\n Planner,\n RoomleConfigurator,\n Configurator,\n InitDataDefinition,\n GlobalInitDataDefinition,\n RapiId,\n} from '../../index';\nimport { RoomleSdk } from '../../index';\nimport {\n Container,\n DependencyInjectionAssignment,\n DI_TYPE,\n} from '../../common-core/src/di/container';\nimport { INJECTABLES } from '../../common-core/src/di/injectables';\n\nexport interface HeadlessInitData\n extends Partial<InitDataDefinition>,\n Partial<GlobalInitDataDefinition> {\n configuratorId: string;\n /** Canvas width in pixels. Defaults to 1024. */\n width?: number;\n /** Canvas height in pixels. Defaults to 768. */\n height?: number;\n}\n\nexport interface ExportResult {\n buffer: ArrayBuffer;\n}\n\nexport interface ImageExportOptions {\n /** Supersampling anti-aliasing factor. Defaults to 2. */\n ssaa?: number;\n}\n\nexport interface ScreenshotExportOptions extends ImageExportOptions {\n /** JPEG quality (0–1). Defaults to 1. */\n quality?: number;\n}\n\nexport interface PerspectiveImageExportOptions extends ImageExportOptions {\n /** Output image size in pixels. Defaults to 1024. */\n size?: number;\n showDimensions?: boolean;\n rotationY?: number;\n}\n\nexport interface TopImageExportOptions extends ImageExportOptions {\n /** Output image size in pixels. Defaults to 1024. */\n size?: number;\n showDimensions?: boolean;\n}\n\nexport class HeadlessRoomleSdk {\n private _planner: RoomlePlanner;\n private _plannerMain: Planner;\n private _configurator: RoomleConfigurator;\n private _configuratorMain: Configurator;\n private _initialized = false;\n private _width = 1024;\n private _height = 768;\n\n static async create(initData: HeadlessInitData): Promise<HeadlessRoomleSdk> {\n const instance = new HeadlessRoomleSdk();\n await instance._init(initData);\n return instance;\n }\n\n private async _init(initData: HeadlessInitData) {\n this._width = initData.width ?? 1024;\n this._height = initData.height ?? 768;\n\n // Register headless service overrides BEFORE the DI container initializes.\n // This monkey-patches Container so that headless overrides always win,\n // even after boot() re-registers the default INJECTABLES.\n this._registerHeadlessServices(this._width, this._height);\n\n await RoomleSdk.setGlobalInitData({\n configuratorId: initData.configuratorId,\n locale: initData.locale,\n // @ts-ignore -- tenant is untyped, but we still need it.\n tenant: initData.tenant,\n overrideCountry: initData.overrideCountry,\n animateCamera: false,\n });\n\n this._initialized = true;\n }\n\n private _registerHeadlessServices(width: number, height: number) {\n // Create the DI container early. When roomle-dependency-injection.ts is\n // later loaded transitively, its _ensureContainer() checks if __RML__DI__\n // already exists and skips creating a new one — so we must register the\n // full INJECTABLES here ourselves.\n const container = new Container();\n (globalThis as any).__RML__DI__ = container;\n\n // Capture width/height in a subclass so the DI container instantiates\n // HeadlessDomHelper with the correct dimensions (DI only passes `creator`).\n class SizedHeadlessDomHelper extends HeadlessDomHelper {\n constructor(creator: string) {\n super(creator, width, height);\n }\n }\n\n const headlessOverrides = [\n new DependencyInjectionAssignment(\n 'script-loader',\n HeadlessScriptLoader,\n DI_TYPE.CONTEXT,\n ),\n new DependencyInjectionAssignment(\n 'dom-helper',\n SizedHeadlessDomHelper,\n DI_TYPE.CONTEXT,\n ),\n new DependencyInjectionAssignment('data-syncer', HeadlessDataSyncer),\n ];\n\n // Monkey-patch addDependencyInjectionAssignments so that every time\n // the SDK registers its default INJECTABLES (during boot()), our headless\n // overrides are re-applied on top. This ensures headless services always win.\n const originalAdd = Container.prototype.addDependencyInjectionAssignments;\n Container.prototype.addDependencyInjectionAssignments = function (\n injections: DependencyInjectionAssignment[],\n ) {\n originalAdd.call(this, injections);\n originalAdd.call(this, headlessOverrides);\n };\n\n // Wrap kernel callbacks with a safety Proxy so that exceptions thrown\n // from JS callbacks invoked by C++ (via Embind) are caught and logged\n // rather than propagating into C++ which would call std::terminate → abort().\n (CommonKernelAccess.prototype as any)._buildCallbackTarget = function () {\n const target = this;\n return new Proxy(target, {\n get(_, prop) {\n const val = (target as any)[prop];\n if (typeof val === 'function') {\n return function (...args: any[]) {\n try {\n return val.apply(target, args);\n } catch (e) {\n console.error(\n `[Headless] Kernel callback '${String(prop)}' threw:`,\n e,\n );\n }\n };\n }\n return val;\n },\n });\n };\n\n // Register all default INJECTABLES + headless overrides.\n // The monkey-patch ensures headless overrides are applied on top.\n container.addDependencyInjectionAssignments(INJECTABLES);\n }\n\n async loadConfiguration(\n configurationId: RapiId,\n initData?: Partial<InitDataDefinition>,\n ): Promise<void> {\n this._ensureInitialized();\n\n const configuratorModule = await RoomleSdk.getConfigurator(initData);\n await configuratorModule.boot();\n this._configuratorMain = configuratorModule;\n this._configurator = configuratorModule.getApi();\n\n const stubElement = {\n clientWidth: this._width,\n clientHeight: this._height,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: { add() {} },\n };\n await this._configurator.init(stubElement as any);\n\n await this._configurator.loadConfigurableItemById(configurationId);\n }\n\n async loadPlan(\n planId: string,\n initData?: Partial<InitDataDefinition>,\n ): Promise<void> {\n this._ensureInitialized();\n\n const plannerModule = await RoomleSdk.getPlanner(initData);\n await plannerModule.boot();\n this._plannerMain = plannerModule;\n this._planner = plannerModule.getApi();\n\n const stubElement = {\n clientWidth: this._width,\n clientHeight: this._height,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: { add() {} },\n };\n await this._planner.init(stubElement as any);\n\n await this._planner.loadPlan(planId);\n }\n\n async exportGLB(outputPath?: string): Promise<ExportResult> {\n return this._export(outputPath, 'glb');\n }\n\n async exportUSDZ(outputPath?: string): Promise<ExportResult> {\n return this._export(outputPath, 'usdz');\n }\n\n private async _export(\n outputPath: string | undefined,\n type: 'glb' | 'usdz',\n ): Promise<ExportResult> {\n this._ensureInitialized();\n\n const sm = this._configurator.getSceneManager();\n const buffer =\n type === 'glb' ? await sm.createExportGLB() : await sm.createUSDZExport();\n\n if (!buffer) {\n throw new Error(`${type.toUpperCase()} export produced no data`);\n }\n\n // The buffer is either ArrayBuffer (GLB) or Uint8Array (USDZ).\n // Extract the underlying ArrayBuffer in both cases.\n const arrayBuffer =\n buffer instanceof ArrayBuffer\n ? buffer\n : ((buffer as Uint8Array).buffer as ArrayBuffer);\n\n if (outputPath) {\n const fs = await import('fs');\n fs.writeFileSync(outputPath, Buffer.from(arrayBuffer));\n }\n\n return { buffer: arrayBuffer };\n }\n\n async exportScreenshot(\n outputPath?: string,\n options: ScreenshotExportOptions = {},\n ): Promise<{ dataUrl: string }> {\n this._ensureInitialized();\n\n const quality = options.quality ?? 1;\n const ssaa = options.ssaa ?? 2;\n const sm = this._configurator.getSceneManager();\n const renderer = sm.getRenderer();\n if (!renderer) {\n throw new Error('HeadlessRoomleSdk: renderer is not available');\n }\n\n let originalWidth: number | undefined;\n let originalHeight: number | undefined;\n\n // Temporarily resize renderer for SSAA supersampling\n if (ssaa > 1) {\n const roomleRenderer = sm.getRoomleRenderer();\n const canvas = renderer.domElement;\n originalWidth = canvas.width;\n originalHeight = canvas.height;\n roomleRenderer?.setSize(originalWidth! * ssaa, originalHeight! * ssaa);\n }\n\n let dataUrl: string = await sm.exportCanvasScreenshot(quality);\n\n // Restore original size and downscale\n if (ssaa > 1 && originalWidth && originalHeight) {\n sm.getRoomleRenderer()?.setSize(originalWidth, originalHeight);\n dataUrl = await this._ssaaDownscale(\n dataUrl,\n originalWidth,\n originalHeight,\n );\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = dataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl };\n }\n\n async exportPerspectiveImage(\n outputPath?: string,\n options: PerspectiveImageExportOptions = {},\n ): Promise<{ dataUrl: string; width: number; height: number }> {\n this._ensureInitialized();\n\n const ssaa = options.ssaa ?? 2;\n const targetSize = options.size ?? 1024;\n const renderSize = targetSize * ssaa;\n\n const result = await this._configurator.preparePerspectiveImage({\n ...options,\n size: renderSize,\n });\n\n let finalDataUrl = result.image;\n let finalWidth = result.width;\n let finalHeight = result.height;\n\n // Downscale with SSAA if rendering at higher resolution, achieves antialiasing effect.\n if (ssaa > 1) {\n finalDataUrl = await this._ssaaDownscale(\n finalDataUrl,\n targetSize,\n targetSize,\n );\n finalWidth = targetSize;\n finalHeight = targetSize;\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = finalDataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl: finalDataUrl, width: finalWidth, height: finalHeight };\n }\n\n async exportTopImage(\n outputPath?: string,\n options: TopImageExportOptions = {},\n ): Promise<{ dataUrl: string; width: number; height: number }> {\n this._ensureInitialized();\n\n const ssaa = options.ssaa ?? 2;\n const result = await this._configurator.prepareTopImage({\n ...options,\n size: (options.size ?? 1024) * ssaa,\n showDimensions: options.showDimensions ?? false,\n });\n\n let finalDataUrl = result.image;\n let finalWidth = result.width;\n let finalHeight = result.height;\n\n if (ssaa > 1) {\n const targetWidth = Math.round(finalWidth / ssaa);\n const targetHeight = Math.round(finalHeight / ssaa);\n finalDataUrl = await this._ssaaDownscale(\n finalDataUrl,\n targetWidth,\n targetHeight,\n );\n finalWidth = targetWidth;\n finalHeight = targetHeight;\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = finalDataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl: finalDataUrl, width: finalWidth, height: finalHeight };\n }\n\n /** Downscale a data URL image to target dimensions using high-quality filtering. */\n private async _ssaaDownscale(\n dataUrl: string,\n targetWidth: number,\n targetHeight: number,\n ): Promise<string> {\n const { createCanvas, loadImage } = await import('@napi-rs/canvas');\n const imgBuffer = Buffer.from(\n dataUrl.replace(/^data:image\\/\\w+;base64,/, ''),\n 'base64',\n );\n const img = await loadImage(imgBuffer);\n const outCanvas = createCanvas(targetWidth, targetHeight);\n const ctx = outCanvas.getContext('2d');\n (ctx as any).imageSmoothingEnabled = true;\n (ctx as any).imageSmoothingQuality = 'high';\n ctx.drawImage(img, 0, 0, targetWidth, targetHeight);\n return outCanvas.toDataURL('image/png');\n }\n\n getConfiguratorApi() {\n return this._configurator;\n }\n\n getPlannerApi() {\n return this._planner;\n }\n\n async destroy() {\n if (this._configuratorMain) {\n this._configuratorMain.destroy();\n }\n if (this._plannerMain) {\n this._plannerMain.destroy();\n }\n }\n\n private _ensureInitialized() {\n if (!this._initialized) {\n throw new Error(\n 'HeadlessRoomleSdk not initialized. Call HeadlessRoomleSdk.create() first.',\n );\n }\n }\n}\n"],"mappings":"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"}
@@ -308,7 +308,7 @@ export declare abstract class CameraBehaviour {
308
308
  private _cameraChangeListener;
309
309
  constructor(cameraControl: CameraControl, state: CameraBehaviourState);
310
310
  abstract get cameraControl(): CameraControl;
311
- protected get state(): CameraBehaviourState;
311
+ protected get state(): CameraBehaviourState | null;
312
312
  setCameraChangeListener(callback: () => void): void;
313
313
  removeCameraChangeListener(): void;
314
314
  protected _onCameraChanged(): void;
@@ -671,7 +671,7 @@ export declare interface CleanupOptions {
671
671
  export declare type ColorsIn3dScene = Record<RoomleColors, HexColorString | HexColorNumber>;
672
672
 
673
673
  export declare interface CommonConfiguratorKernelCallbackI {
674
- Editor3dComponentCreated(id: number, position: KernelVector3, eulerAngles: KernelVector3, isRootComponent: boolean, parentObjectRuntimeId: number): void;
674
+ Editor3dComponentCreated(componentDocking: KernelComponentDocking): void;
675
675
  Editor3dAddMesh(runtimeComponentId: number, meshId: number, geometryName: string, environmentGeometry: boolean, meshAttributes: KernelMeshAttributes, meshBuffer: KernelMeshBuffer): void;
676
676
  Editor3ChangedMesh(runtimeComponentId: number, meshId: number, geometryName: string, meshAttributes: KernelMeshAttributes): void;
677
677
  Editor3dRemoveMesh(runtimeComponentId: number, meshId: number): void;
@@ -679,7 +679,7 @@ export declare interface CommonConfiguratorKernelCallbackI {
679
679
  componentConfigurationUpdated(runtimeComponentId: number, geometryChanged: boolean): void;
680
680
  Editor3dBeginConstruction(componentId: number, isDeltaUpdate: boolean): void;
681
681
  Editor3dEndConstruction(id: number): void;
682
- Editor3dComponentDocked(componentId: number, isRootComponent: boolean, parentId: number, componentPosition: KernelVector3, componentRotation: KernelVector3): void;
682
+ Editor3dComponentDocked(componentDocking: KernelComponentDocking): void;
683
683
  Editor3dGeometryReady(id: number): void;
684
684
  Editor3dGeometryNotReady(id: number): void;
685
685
  componentDeleted(componentId: number): void;
@@ -952,8 +952,8 @@ export declare abstract class CommonKernelAccess implements LifeCycleCallbacks,
952
952
  Editor3dChangedLightSource(runtimeComponentId: number, lightSourceId: number, lightSourceAttributes: KernelLightSourceAttributes): void;
953
953
  Editor3dBeginConstruction(id: number, isDeltaUpdate: boolean): void;
954
954
  Editor3dEndConstruction(id: number): void;
955
- Editor3dComponentCreated(id: number, position: KernelVector3, eulerAngles: KernelVector3, isRootComponent: boolean, parentObjectRuntimeId: number): void;
956
- Editor3dComponentDocked(componentId: number, isRootComponent: boolean, parentId: number, componentPosition: KernelVector3, componentRotation: KernelVector3): void;
955
+ Editor3dComponentCreated(componentDocking: KernelComponentDocking): void;
956
+ Editor3dComponentDocked(componentDocking: KernelComponentDocking): void;
957
957
  Editor3dGeometryReady(id: number): void;
958
958
  Editor3dGeometryNotReady(id: number): void;
959
959
  componentDeleted(componentId: number): void;
@@ -1329,7 +1329,7 @@ export declare class ConfiguratorKernelAccess extends CommonKernelAccess {
1329
1329
  meshId: string;
1330
1330
  quality: number;
1331
1331
  }>): Promise<void>;
1332
- Editor3dComponentCreated(id: number, position: KernelVector3, eulerAngles: KernelVector3, isRootComponent: boolean, parentId: number): void;
1332
+ Editor3dComponentCreated(componentDocking: KernelComponentDocking): void;
1333
1333
  Editor3dPlanObjectConstructionDone(planObjectId: number): void;
1334
1334
  Editor3dBeginGroup(): void;
1335
1335
  Editor3dEndGroup(): void;
@@ -1392,7 +1392,7 @@ export declare interface ConfiguratorKernelCallbackI extends CommonConfiguratorK
1392
1392
  Editor3dSetPreviewAssociations(dockPairs: KernelDockPairPreview[], previewId: number): void;
1393
1393
  Editor3dPreviewConstructionDone(componentId: number, objectId: number): void;
1394
1394
  Editor3dPlanObjectConstructionDone(planObjectId: number): void;
1395
- Editor3dComponentDocked(componentId: number, isRootComponent: boolean, parentObjectRuntimeId: number, componentPosition: KernelVector3, componentRotation: KernelVector3): void;
1395
+ Editor3dComponentDocked(componentDocking: KernelComponentDocking): void;
1396
1396
  finishParameterChange(resolve: () => void, reject: () => void): void;
1397
1397
  updateAnimationParameters(elementId: number | number[], parameters: KernelParameter[]): void;
1398
1398
  changeAnimationValue(elementId: number, parameterKey: string, value: string, level: number, animationLevel: AnimationLevelType, animate: boolean): void;
@@ -1571,7 +1571,7 @@ export declare class ConfiguratorSceneEventHandler extends SceneEventHandler<Sce
1571
1571
  setCamera(camera: Camera): void;
1572
1572
  setObject(object: Object3D): void;
1573
1573
  private _findComponentToBeSelected;
1574
- private isSiblingSelected;
1574
+ private getRootComponent;
1575
1575
  }
1576
1576
 
1577
1577
  export declare class ConfiguratorSceneManager extends SceneManager implements ConfiguratorViewModelCallbackI {
@@ -2059,8 +2059,8 @@ export declare class ConfiguratorViewModel implements ConfiguratorKernelCallback
2059
2059
  private _removeLightSourceFromComponent;
2060
2060
  private _addLightSourceToComponent;
2061
2061
  private _changeLightSourceOfComponent;
2062
- getComponent(componentId: number): RoomleComponent;
2063
- getNumberOfPossibleChildrenForComponent(componentId: number): number;
2062
+ getComponent(componentId: number): RoomleComponent | null;
2063
+ getNumberOfPossibleChildrenForComponent(componentId: number): number | undefined;
2064
2064
  tryToMergeComponents(): void;
2065
2065
  private _requestMergeComponents;
2066
2066
  private _mergeNextComponent;
@@ -2079,8 +2079,8 @@ export declare class ConfiguratorViewModel implements ConfiguratorKernelCallback
2079
2079
  Editor3dAddLightSource(runtimeComponentId: number, lightSourceId: number, lightSourceAttributes: KernelLightSourceAttributes): void;
2080
2080
  Editor3dChangedLightSource(runtimeComponentId: number, lightSourceId: number, lightSourceAttributes: KernelLightSourceAttributes): void;
2081
2081
  Editor3dBeginConstruction(componentId: number, isDeltaUpdate: boolean): void;
2082
- Editor3dComponentCreated(id: number, position: KernelVector3, eulerAngles: KernelVector3, isRootComponent: boolean, parentObjectRuntimeId: number): void;
2083
- Editor3dComponentDocked(componentId: number, isRootComponent: boolean, parentId: number, componentPosition: KernelVector3, componentRotation: KernelVector3): void;
2082
+ Editor3dComponentCreated(componentDocking: KernelComponentDocking): void;
2083
+ Editor3dComponentDocked(componentDocking: KernelComponentDocking): void;
2084
2084
  Editor3dEndConstruction(id: number): void;
2085
2085
  Editor3dGeometryReady(id: number): void;
2086
2086
  Editor3dGeometryNotReady(id: number): void;
@@ -2114,7 +2114,7 @@ export declare class ConfiguratorViewModel implements ConfiguratorKernelCallback
2114
2114
  setGeometriesMergedListener(fun: () => void): void;
2115
2115
  removeGeometriesMergedListener(): void;
2116
2116
  setMergeThreshold(threshold: number): void;
2117
- protected _generateMesh(runtimeComponentId: number, geometryId: string | null, materialId: string | null, vertices: Float32Array, indices: Int32Array, uvCoords: Float32Array, normals: Float32Array, _type?: KernelEnum, _newGeometryInstance?: boolean, materialAttributes?: Record<string, string>): Mesh;
2117
+ protected _generateMesh(runtimeComponentId: number | undefined, geometryId: string | null | undefined, materialId: string | null, vertices: Float32Array, indices: Int32Array, uvCoords: Float32Array, normals: Float32Array, _type?: KernelEnum, _newGeometryInstance?: boolean, materialAttributes?: Record<string, string>): Mesh;
2118
2118
  protected _setMaterial(mesh: Mesh, material: any, _type?: KernelEnum): void;
2119
2119
  constructComponents(planObjectId: number): void;
2120
2120
  requestSubPartConstruction(partId: number): Promise<Mesh>;
@@ -2259,6 +2259,12 @@ export declare const CORE_PLAN_COMPONENT_TYPE: {
2259
2259
  readonly SUB_ARTICLE: 4;
2260
2260
  };
2261
2261
 
2262
+ export declare const CORE_SNAP_STATE: {
2263
+ readonly DEFAULT: 0;
2264
+ readonly DOCKING: 1;
2265
+ readonly COLLISION: 2;
2266
+ };
2267
+
2262
2268
  export declare const CORE_TYPE_OF_CORE_ID: {
2263
2269
  readonly CONFIGURATOR: 0;
2264
2270
  readonly PLANNER: 1;
@@ -3614,7 +3620,7 @@ export declare class ImageRenderer implements Context {
3614
3620
  */
3615
3621
  private _renderImageFrameWithCleanScene;
3616
3622
  private _compositeWithDimensions;
3617
- prepareThumbnailImage(scene: Scene, viewModel: PlanViewModel, cameraBehaviour: CameraBehaviour, perspectiveOffsetCamera: PerspectiveCamera, options: PrepareImageOptionsPlanner, onAfterRender: () => void): Promise<Base64Image>;
3623
+ prepareThumbnailImage(scene: Scene, viewModel: PlanViewModel, cameraBehaviour: CameraBehaviour, perspectiveOffsetCamera: PerspectiveCamera, options: PrepareImageOptionsPlanner | undefined, onAfterRender: () => void): Promise<Base64Image>;
3618
3624
  private _renderImageFrame;
3619
3625
  }
3620
3626
 
@@ -3963,6 +3969,15 @@ export declare interface KernelComponent {
3963
3969
  childAnimationTransformations: ComponentAnimationTransformation[];
3964
3970
  }
3965
3971
 
3972
+ export declare interface KernelComponentDocking {
3973
+ componentId: number;
3974
+ isRootComponent: boolean;
3975
+ parentId: number;
3976
+ position: KernelVector3;
3977
+ rotation: KernelVector3;
3978
+ type: KernelComponentType;
3979
+ }
3980
+
3966
3981
  export declare interface KernelComponentType {
3967
3982
  value: Enumify<typeof CORE_PLAN_COMPONENT_TYPE>;
3968
3983
  }
@@ -4310,7 +4325,7 @@ export declare class KernelViewModel {
4310
4325
  protected _coreReference: KernelObject | null;
4311
4326
  constructor(reference: KernelObject);
4312
4327
  clearReference(): void;
4313
- getKernelObject(): KernelObject;
4328
+ getKernelObject(): KernelObject | null;
4314
4329
  }
4315
4330
 
4316
4331
  export declare interface KernelViewType {
@@ -4385,7 +4400,7 @@ export declare class LightCache {
4385
4400
  allowedToSpawnMoreLights(): boolean;
4386
4401
  addActiveLight(light: Light): void;
4387
4402
  cacheLight(light: Light): void;
4388
- getLightFromCache(type: KernelLightSourceType): Light;
4403
+ getLightFromCache(type: KernelLightSourceType): Light | null;
4389
4404
  clear(): void;
4390
4405
  private _setMaximumLights;
4391
4406
  }
@@ -4867,6 +4882,11 @@ export declare interface ObjectMeasurementsTransferable {
4867
4882
  objectToWallsMeasurements: ObjectToWallDimensionTransferable[];
4868
4883
  }
4869
4884
 
4885
+ export declare interface ObjectSnapInformation {
4886
+ geometryHelpLines: GeometryHelpLineArray;
4887
+ snapState: SnapState;
4888
+ }
4889
+
4870
4890
  export declare type ObjectToWallDimensionTransferable = DimensionDefinition<Position2, Position3>;
4871
4891
 
4872
4892
  export declare interface ObjectToWallLine {
@@ -5243,7 +5263,7 @@ export declare interface PlanModelViewHelper_2 {
5243
5263
  getExternalObjectGroups(plan: Plan_2): KernelObjectConfigurationArray;
5244
5264
  getExternalRoomInformation(plan: Plan_2): RoomInformation;
5245
5265
  calculateLightSourceDistribution(plan: Plan_2, lightSourceConfiguration: LightSourceConfiguration): RoomLightSourceDistributionArray;
5246
- getObjectGeometryHelpLines(anObject: PlanObject, debugHelpLines: boolean): GeometryHelpLineArray;
5266
+ getObjectSnapInformation(anObject: PlanObject, debugHelpLines: boolean): ObjectSnapInformation;
5247
5267
  }
5248
5268
 
5249
5269
  export declare class Planner<P extends readonly PluginName[] = readonly []> extends Main {
@@ -5352,7 +5372,7 @@ export declare class PlannerKernelAccess extends ConfiguratorKernelAccess {
5352
5372
  constructor(creator: string);
5353
5373
  protected _loadSuccess(): void;
5354
5374
  protected _loadError(): void;
5355
- get homagIntelligence(): HomagIntelligence;
5375
+ get homagIntelligence(): HomagIntelligence | null;
5356
5376
  setHomagIntelligence(homagIntelligence: HomagIntelligence | null): void;
5357
5377
  private _createPlanInteractionHandler;
5358
5378
  addPlannerListener(listener: PlannerKernelCallbackI): void;
@@ -5563,7 +5583,7 @@ export declare class PlannerSceneEventHandler extends SceneEventHandler<SceneEve
5563
5583
  disable(): void;
5564
5584
  get planInteractionHandler(): PlanInteractionHandler;
5565
5585
  get planModelViewHelper(): PlanModelViewHelper_2;
5566
- get hoveredObjectId(): number;
5586
+ get hoveredObjectId(): number | null;
5567
5587
  get isCurrentlyDrawing(): boolean;
5568
5588
  enable(): void;
5569
5589
  enableConstructionEvents(enable: boolean): void;
@@ -5809,8 +5829,8 @@ export declare class PlannerSceneManager extends ConfiguratorSceneManager implem
5809
5829
  enableAdvancedDocking(): void;
5810
5830
  disableAdvancedDocking(): void;
5811
5831
  isEnabledChildObjectMode(planElementViewModel: PlanElementViewModel): boolean;
5812
- enableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject;
5813
- disableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject;
5832
+ enableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject | null;
5833
+ disableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject | null;
5814
5834
  dragIn(dragEvent: DragEvent): void;
5815
5835
  getPositionForDragEvent(dragEvent: DragEvent | TouchEvent): Vector3 | null;
5816
5836
  getPlannerSceneEventHandler(): PlannerSceneEventHandler;
@@ -6113,9 +6133,9 @@ export declare class PlanViewModel extends ConfiguratorViewModel implements Plan
6113
6133
  getFloorPlanObjectViewModels(): FloorPlanElementViewModel[];
6114
6134
  getMeasurementLineObjectViewModels(): MeasurementLinePlanElementViewModel[];
6115
6135
  getWallAtticsObjectViewModels(): WallAtticPlanElementViewModel[];
6116
- protected _generateMesh(runtimeComponentId: number, geometryId: string | null, material: any, vertices: Float32Array, indices: Int32Array, uvCoords: Float32Array, normals: Float32Array, type?: KernelEnum, newGeometryInstance?: boolean, materialAttributes?: Record<string, string>): Mesh;
6136
+ protected _generateMesh(runtimeComponentId: number | undefined, geometryId: string | null | undefined, material: any, vertices: Float32Array, indices: Int32Array, uvCoords: Float32Array, normals: Float32Array, type?: KernelEnum, newGeometryInstance?: boolean, materialAttributes?: Record<string, string>): Mesh;
6117
6137
  protected _setMaterial(mesh: Mesh, material: any, _type?: KernelEnum, materialAttributes?: Record<string, string>): void;
6118
- Editor3dComponentCreated(id: number, position: KernelVector3, eulerAngles: KernelVector3, isRootComponent: boolean, parentObjectRuntimeId: number): void;
6138
+ Editor3dComponentCreated(componentDocking: KernelComponentDocking): void;
6119
6139
  addPlanObjectToScene(_planViewModel: PlanObjectViewModel | null): void;
6120
6140
  handlerSwitchedPlans(_fromPlan: Plan_2, _toPlan: Plan_2): void;
6121
6141
  planCompletelyLoaded(_plan: Plan_2): void;
@@ -6725,7 +6745,7 @@ export declare class RapiAccess implements Context {
6725
6745
  updateCache(rapiPath: RAPI_PATHS, data: RapiJson & {
6726
6746
  id: RapiId;
6727
6747
  }): void;
6728
- getExternalObjects(externalObjectIds: Array<`__ext__obj__#${string}`>): Promise<any[]>;
6748
+ getExternalObjects(externalObjectIds: Array<`__ext__obj__#${string}`>): Promise<ExternalDataResponse<ExternalConfiguration>[] | undefined>;
6729
6749
  }
6730
6750
 
6731
6751
  export declare interface RapiAdditionalContent extends RapiJson {
@@ -7235,7 +7255,7 @@ export declare class RaycastHelper extends EventDispatcher<Record<RAYCAST_EVENT,
7235
7255
  setCamera(camera: Camera): void;
7236
7256
  setObject(object: Object3D): void;
7237
7257
  setMode(mode: INTERSECTION_MODE): void;
7238
- intersectMouseOnScene(event: Pick<PointerInputEvent, 'positionRelative'>): KernelVector3;
7258
+ intersectMouseOnScene(event: Pick<PointerInputEvent, 'positionRelative'>): KernelVector3 | null;
7239
7259
  enableOnWallSnapping(): void;
7240
7260
  disableOnWallSnapping(): void;
7241
7261
  getCameraPosition(): Vector3;
@@ -7291,7 +7311,7 @@ export declare class RoomDesignerApi implements RoomDesignerRequests {
7291
7311
  deleteRootModule(rootModuleId: string): void;
7292
7312
  getPosDataOfAllGroups(): Promise<PosGroup[]>;
7293
7313
  getRoomInformation(): Promise<ExternalRoomInformation>;
7294
- saveExternalObjectSnapshot(): Promise<ExternalObjectSnapshotSaveResult>;
7314
+ saveExternalObjectSnapshot(): Promise<ExternalObjectSnapshotSaveResult | null>;
7295
7315
  saveCurrentPlanSnapshot(): Promise<RapiPlanSnapshotGetData>;
7296
7316
  renderPosDataImage(posDataJson: object): Promise<void>;
7297
7317
  }
@@ -7654,7 +7674,7 @@ export declare class RoomleConfigurator<P extends readonly PluginName[] = readon
7654
7674
  * @param value
7655
7675
  * @param parameter
7656
7676
  */
7657
- formatValueToUnitString(value: number, parameter: KernelParameter): string | number;
7677
+ formatValueToUnitString(value: number, parameter: KernelParameter): string | number | null;
7658
7678
  /**
7659
7679
  * Get tag for a given tag id
7660
7680
  *
@@ -7999,8 +8019,8 @@ export declare class RoomleConfigurator<P extends readonly PluginName[] = readon
7999
8019
  */
8000
8020
  getChildrenOfPlanComponent(componentRuntimeId: number, onlyPossible?: boolean, onlyVisible?: boolean): Promise<{
8001
8021
  tags: UiPossibleChildTag[];
8002
- defaultChild: UiPossibleChild;
8003
- }>;
8022
+ defaultChild: UiPossibleChild | undefined;
8023
+ } | null>;
8004
8024
  /**
8005
8025
  * Returns all possible children and the default child for the plan object
8006
8026
  * @param onlyPossible: boolean true if you only want possibleChildren
@@ -8008,8 +8028,8 @@ export declare class RoomleConfigurator<P extends readonly PluginName[] = readon
8008
8028
  */
8009
8029
  getChildrenOfPlanObject(onlyPossible?: boolean, onlyVisible?: boolean): Promise<{
8010
8030
  tags: UiPossibleChildTag[];
8011
- defaultChild: UiPossibleChild;
8012
- }>;
8031
+ defaultChild: UiPossibleChild | undefined;
8032
+ } | null>;
8013
8033
  private _addAdditionalInfoToPossibleChildren;
8014
8034
  private _getPossibleChildrenForKernelPossibleChildren;
8015
8035
  private _addPossibleChildren;
@@ -8547,11 +8567,11 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
8547
8567
  /**
8548
8568
  * enable interaction with child components of configurable objects in the plan
8549
8569
  */
8550
- enableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject;
8570
+ enableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject | null;
8551
8571
  /**
8552
8572
  * disable interaction with child components of configurable objects in the plan
8553
8573
  */
8554
- disableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject;
8574
+ disableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject | null;
8555
8575
  /**
8556
8576
  * get the Partlist of certain runtimeID
8557
8577
  * can be used if partlist of a selected Item is needed
@@ -8565,7 +8585,7 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
8565
8585
  * @param value
8566
8586
  * @param parameter
8567
8587
  */
8568
- formatValueToUnitString(value: number, parameter: KernelParameter): string | number;
8588
+ formatValueToUnitString(value: number, parameter: KernelParameter): string | number | null;
8569
8589
  /**
8570
8590
  * Draws walls according to the wall definitions
8571
8591
  * this can be used to create a room on the fly
@@ -8801,24 +8821,24 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
8801
8821
  redo(): Promise<void>;
8802
8822
  setHomagIntelligence(homagIntelligence: HomagIntelligence): void;
8803
8823
  private _getSubArticleId;
8804
- newPosDataFromId(id: string): Promise<PosGroup>;
8824
+ newPosDataFromId(id: string): Promise<PosGroup | undefined> | undefined;
8805
8825
  /**
8806
8826
  * deprecated, use placeOrder() instead
8807
8827
  */
8808
- sendToOM(withPrice?: boolean): Promise<void>;
8828
+ sendToOM(withPrice?: boolean): Promise<void> | undefined;
8809
8829
  /**
8810
8830
  * Places an order via Homag Intelligence module
8811
8831
  * @param withPrice whether to include price information in the order
8812
8832
  * @param orderHeader optional order header information
8813
8833
  */
8814
- placeOrder(withPrice?: boolean, orderHeader?: HiOrderHeader): Promise<void>;
8834
+ placeOrder(withPrice?: boolean, orderHeader?: HiOrderHeader): Promise<void> | undefined;
8815
8835
  /**
8816
8836
  * Fetches the price for the current plan via Homag Intelligence module
8817
8837
  * @param planId optional plan ID to fetch the price for
8818
8838
  * @param orderHeader optional order header information
8819
8839
  */
8820
8840
  fetchPrice(planId?: string, orderHeader?: HiOrderHeader): Promise<any>;
8821
- getOrderManagerGroupData(planId?: string): Promise<HiOrderData>;
8841
+ getOrderManagerGroupData(planId?: string): Promise<HiOrderData | null | undefined>;
8822
8842
  getRapiAccess(): RapiAccess;
8823
8843
  getElementOpenCloseAnimation(planElement: PlanElementViewModel, componentIds?: number[]): AnimationKeyAndValue | null;
8824
8844
  /**
@@ -9256,7 +9276,7 @@ export declare abstract class SceneManager implements Context, LifeCycleCallback
9256
9276
  addEventListener(_listener: LifeCycleCallbacks): void;
9257
9277
  removeEventListener(_listener: LifeCycleCallbacks): void;
9258
9278
  get lightCache(): LightCache | null;
9259
- getRoomleRenderer(): GenericRoomleRenderer;
9279
+ getRoomleRenderer(): GenericRoomleRenderer | null;
9260
9280
  getRenderer(): WebGLRenderer | WebGPURenderer | null;
9261
9281
  protected _changeCameraBehaviour(cameraBehaviour: CameraBehaviour): void;
9262
9282
  protected onCameraChanged(): void;
@@ -9330,7 +9350,7 @@ export declare abstract class SceneManager implements Context, LifeCycleCallback
9330
9350
  protected _hasCameraControl2D(): boolean;
9331
9351
  protected _getCameraControl2D(): CameraControl2D;
9332
9352
  protected _getCameraControlFirstPerson(): CameraControlFirstPerson;
9333
- createUSDZExport(): Promise<Uint8Array<ArrayBuffer>>;
9353
+ createUSDZExport(): Promise<Uint8Array<ArrayBuffer> | undefined>;
9334
9354
  exportUSDZ(): Promise<void>;
9335
9355
  createExportGLB(objectFilter?: (object: Object3D) => boolean): Promise<ArrayBuffer | null>;
9336
9356
  exportGLB(): Promise<void>;
@@ -9424,6 +9444,10 @@ export declare const enum SnapMode {
9424
9444
  WITHIN_SNAP_DISTANCE = 3
9425
9445
  }
9426
9446
 
9447
+ export declare interface SnapState {
9448
+ value: Enumify<typeof CORE_SNAP_STATE>;
9449
+ }
9450
+
9427
9451
  export declare interface StaticComponent extends RoomleComponent {
9428
9452
  glbUrl: string;
9429
9453
  }
@@ -9436,7 +9460,7 @@ export declare class StaticPlanObjectViewModel extends PlanObjectViewModel {
9436
9460
  constructor(planObject: PlanObject);
9437
9461
  setRapiItem(rapiItem: RapiItem): Promise<void>;
9438
9462
  private _addStaticItem;
9439
- getRapiItem(): RapiItem;
9463
+ getRapiItem(): RapiItem | null;
9440
9464
  needsRapiItem(): boolean;
9441
9465
  getGLBUrl(): string | null;
9442
9466
  update(): void;
@@ -9592,8 +9616,8 @@ export declare class UnitFormatter implements Context {
9592
9616
  private _initActualUnitStringType;
9593
9617
  formatAngleValueToUnitString(value: number, parameter: KernelParameter): string;
9594
9618
  parseAngleValueFromUnitString(rotation: string): string;
9595
- parseValue(value: string, parameter: KernelParameter): string | number;
9596
- formatValueToUnitString(value: number, parameter: KernelParameter): string | number;
9619
+ parseValue(value: string, parameter: KernelParameter): string | number | null;
9620
+ formatValueToUnitString(value: number, parameter: KernelParameter): string | number | null;
9597
9621
  isParseableNumber(aString: string): boolean | null;
9598
9622
  isParseableUnitString(aString: string, parameter: KernelParameter): boolean | null;
9599
9623
  parseMMValueFromUnitString(aString: string, unitType: string): number | null;
package/lib/roomle-sdk.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { i as e, t } from "./kernel-C7YDLxq8.mjs";
2
- import { A as n, B as r, E as i, G as a, H as o, M as s, N as c, P as l, R as u, U as d, V as f, _ as p, a as m, at as h, c as g, ct as _, g as v, j as y, n as b, ot as x, rt as S, s as C, v as w, y as T, z as E } from "./main-BJZ9-cDk.mjs";
3
- import { t as D } from "./configurator-CRMunIq7.mjs";
4
- import { t as O } from "./planner-5VarJrpy.mjs";
5
- import { n as k, t as A } from "./glb-viewer-CXEoIw1b.mjs";
6
- import { t as j } from "./api-oYzhcs_W.mjs";
7
- import "./packages-Uv53SHfb.mjs";
2
+ import { A as n, B as r, E as i, G as a, H as o, M as s, N as c, P as l, R as u, U as d, V as f, _ as p, a as m, at as h, c as g, ct as _, g as v, j as y, n as b, ot as x, rt as S, s as C, v as w, y as T, z as E } from "./main-_HtiLIhS.mjs";
3
+ import { t as D } from "./configurator-CmMBHkyd.mjs";
4
+ import { t as O } from "./planner-OYwMFSWo.mjs";
5
+ import { n as k, t as A } from "./glb-viewer-Cs3i0yb8.mjs";
6
+ import { t as j } from "./api-DgXsyN04.mjs";
7
+ import "./packages-BhrPUb9k.mjs";
8
8
  export { t as CONFIGURATION_TYPE, e as CORE_PERMISSION_TO_DELETE, D as Configurator, m as ConfiguratorUiCallbacks, n as FloorPlanElementViewModel, A as GlbViewer, a as GlobalCallback, u as HI_CONTEXT_ACTION, h as IdbManager, b as Main, T as MeasurementLinePlanElementViewModel, v as PLAN_ELEMENT_CHANGE_TYPES, l as PlanElementViewModel, c as PlanObjectViewModel, O as Planner, S as RapiAccess, j as RoomDesignerApi, i as RoomleConfigurator, k as RoomleGLBViewer, _ as RoomleLightSource, C as RoomlePlanner, p as RoomlePlannerUiCallback, g as RoomleSdk, s as StaticPlanObjectViewModel, y as WallPlanElementViewModel, E as createExtObj, d as createExtObjId, x as getCatalogIdFromConfigurationHash, r as isExtObjId, f as isExternalObject, w as isSafari, o as removeExtObjIdPrefix };
@@ -1,5 +1,5 @@
1
1
  import { n as e, r as t, t as n } from "./decorate-BAtqSPNS.mjs";
2
- import { Q as r, k as i } from "./main-BJZ9-cDk.mjs";
2
+ import { Q as r, k as i } from "./main-_HtiLIhS.mjs";
3
3
  //#region ../../node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm?no-inline?url
4
4
  var a = "" + new URL("ConfiguratorKernel.wasm", import.meta.url).href, o = "" + new URL("ConfiguratorKernel.js", import.meta.url).href, s = "" + new URL("RoomleCore.wasm", import.meta.url).href, c = "" + new URL("RoomleCore.js", import.meta.url).href, l = "" + new URL("RoomleToolsCore.wasm", import.meta.url).href, u = "" + new URL("RoomleToolsCore.js", import.meta.url).href, d = {
5
5
  configurator: {
@@ -83,4 +83,4 @@ n([t, e("design:type", Object)], _.prototype, "_singlePromiseFactory", void 0);
83
83
  //#endregion
84
84
  export { p as n, _ as t };
85
85
 
86
- //# sourceMappingURL=script-loader-gpkcl1h-.mjs.map
86
+ //# sourceMappingURL=script-loader-X4I-gQl2.mjs.map