@mappedin/mappedin-js 6.0.1-beta.47 → 6.0.1-beta.49

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/THIRD_PARTY_LICENSES.txt +12048 -1731
  2. package/lib/esm/GLTFExporter-ESCDGZUC.js +2 -0
  3. package/lib/esm/GLTFExporter-ESCDGZUC.js.map +7 -0
  4. package/lib/esm/{GLTFLoader-YCEKYYW3.js → GLTFLoader-KRE6VVI2.js} +2 -1
  5. package/lib/esm/GLTFLoader-KRE6VVI2.js.map +7 -0
  6. package/lib/esm/{browser-6R2QCUOI.js → browser-BKM6BTVQ.js} +2 -1
  7. package/lib/esm/browser-BKM6BTVQ.js.map +7 -0
  8. package/lib/esm/{chunk-KR33DBLD.js → chunk-34JGYGBQ.js} +2 -1
  9. package/lib/esm/chunk-34JGYGBQ.js.map +7 -0
  10. package/lib/esm/chunk-5N73RBNE.js +2 -0
  11. package/lib/esm/chunk-5N73RBNE.js.map +7 -0
  12. package/lib/esm/chunk-AHC6OWNT.js +2 -0
  13. package/lib/esm/chunk-AHC6OWNT.js.map +7 -0
  14. package/lib/esm/chunk-BBNTGIFB.js +578 -0
  15. package/lib/esm/chunk-BBNTGIFB.js.map +7 -0
  16. package/lib/esm/chunk-EBEZBJTY.js +2 -0
  17. package/lib/esm/chunk-EBEZBJTY.js.map +7 -0
  18. package/lib/esm/chunk-QSDIHKLQ.js +3820 -0
  19. package/lib/esm/chunk-QSDIHKLQ.js.map +7 -0
  20. package/lib/esm/chunk-TQZZUEDW.js +2229 -0
  21. package/lib/esm/chunk-TQZZUEDW.js.map +7 -0
  22. package/lib/esm/fonts/roboto-regular.ttf +0 -0
  23. package/lib/esm/index.css +2 -1
  24. package/lib/esm/index.css.map +7 -0
  25. package/lib/esm/index.d.ts +235 -166
  26. package/lib/esm/index.js +2 -1
  27. package/lib/esm/index.js.map +7 -0
  28. package/lib/esm/inspector-S63NMDZZ.css +2 -0
  29. package/lib/esm/inspector-S63NMDZZ.css.map +7 -0
  30. package/lib/esm/inspector-UVCVD35T.js +483 -0
  31. package/lib/esm/inspector-UVCVD35T.js.map +7 -0
  32. package/lib/esm/internal-WH523TQS.css +2 -0
  33. package/lib/esm/internal-WH523TQS.css.map +7 -0
  34. package/lib/esm/internal-ZOHXUIA6.js +2 -0
  35. package/lib/esm/internal-ZOHXUIA6.js.map +7 -0
  36. package/lib/esm/outdoor-context-v4-B6ZFZFG7.js +2 -0
  37. package/lib/esm/outdoor-context-v4-B6ZFZFG7.js.map +7 -0
  38. package/lib/esm/{roboto-regular-JRVF4TIR.js → roboto-regular-25PMWR2T.js} +2 -1
  39. package/lib/esm/roboto-regular-25PMWR2T.js.map +7 -0
  40. package/lib/esm/text3d-ACVNKUMC.js +253 -0
  41. package/lib/esm/text3d-ACVNKUMC.js.map +7 -0
  42. package/lib/esm/workers/collision-worker.csp.js +1 -1
  43. package/lib/esm/workers/maplibre-worker.csp.js +2 -1
  44. package/lib/index-rn.js +649 -0
  45. package/lib/index.css +2 -1
  46. package/package.json +2 -2
  47. package/lib/esm/GLTFExporter-TZEIALSW.js +0 -1
  48. package/lib/esm/chunk-DNBHISVY.js +0 -1
  49. package/lib/esm/chunk-KVKD4E33.js +0 -1
  50. package/lib/esm/chunk-MENDLOSO.js +0 -1
  51. package/lib/esm/chunk-QRWMPXER.js +0 -1
  52. package/lib/esm/chunk-TVALVOG4.js +0 -1
  53. package/lib/esm/chunk-UIDBSU4C.js +0 -1
  54. package/lib/esm/inspector-CV34C4XG.js +0 -1
  55. package/lib/esm/inspector-WWR77OPX.css +0 -1
  56. package/lib/esm/internal-M7DPGYMI.css +0 -1
  57. package/lib/esm/internal-YXEVD377.js +0 -1
  58. package/lib/esm/outdoor-context-v4-IEFB4X2Q.js +0 -1
  59. package/lib/esm/text3d-RZEC5VQO.js +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/api-geojson/inspector/index.ts", "../../src/api-geojson/inspector/inspector.ts", "../../src/api-geojson/inspector/mapview-control.ts", "../../../../node_modules/.pnpm/lil-gui@0.19.2/node_modules/lil-gui/dist/lil-gui.esm.js", "../../src/api-geojson/inspector/labels-control.ts", "../../src/api-geojson/inspector/utils.ts", "../../src/api-geojson/inspector/interaction-control.ts", "../../src/api-geojson/inspector/highlight.ts", "../../src/api-geojson/inspector/search-control.ts", "../../src/api-geojson/inspector/style.scss", "../../src/api-geojson/inspector/camera-controls.ts", "../../src/api-geojson/inspector/markers-control.ts", "../../src/api-geojson/inspector/walls-control.ts", "../../src/api-geojson/inspector/misc-control.ts", "../../src/api-geojson/inspector/debug-control.ts", "../../src/api-geojson/inspector/text3d-control.ts", "../../src/api-geojson/inspector/stackedmaps-control.ts", "../../examples/src/utils/stackedmaps.ts", "../../examples/src/utils/gui.ts"],
4
+ "sourcesContent": ["export { Inspector } from './inspector';\n", "import { mountSceneGraphVisualizer } from '@mappedin/core-sdk';\nimport type MapData from '../../map-data';\nimport type { MapView } from '../../map-view';\nimport type { GeoJsonApi } from '../api';\nimport { createUi } from './mapview-control';\n\nexport class Inspector {\n\tprivate _enabled = false;\n\tprivate mv: MapView;\n\tprivate api: GeoJsonApi;\n\tprivate mapData?: MapData;\n\tprivate scenegraphVisualizerMounted = false;\n\tstoreStateToLocalStorageEnabled = false;\n\n\tconstructor(mv: MapView, api: GeoJsonApi) {\n\t\tthis.mv = mv;\n\t\tthis.api = api;\n\t\tthis.mapData = this.api.getMapData();\n\t}\n\tsetMapData(data: MapData) {\n\t\tthis.mapData = data;\n\t}\n\tasync enable(options: InspectorOption = {}) {\n\t\tif (this._enabled) return;\n\t\tthis._enabled = true;\n\t\tif (!this.mapData) {\n\t\t\tthrow new Error('Please set mapData before enable debug.');\n\t\t}\n\t\tconst { sceneFolder } = createUi(this.mapData, this.mv, options);\n\t\tsceneFolder.onOpenClose(v => {\n\t\t\tif (v === sceneFolder && !v._closed && !this.scenegraphVisualizerMounted) {\n\t\t\t\tthis.scenegraphVisualizerMounted = true;\n\t\t\t\t// this is very expensive. gets \"lazy\" mounted\n\t\t\t\tmountSceneGraphVisualizer(this.api.core, sceneFolder);\n\t\t\t}\n\t\t});\n\n\t\tthis.api.getMapDataInternal()?.spaces.forEach(f => {\n\t\t\tthis.mv.updateState(f.id, { interactive: true });\n\t\t});\n\t}\n\tget enabled() {\n\t\treturn this._enabled;\n\t}\n}\n\nexport type InspectorState = { camera: { focusOnClick: boolean; padding: [number, number, number, number] } };\nexport type InspectorOption = Partial<InspectorState>;\n", "import type { MapView } from '../../map-view';\nimport GUI from 'lil-gui';\nimport { createLabelControls } from './labels-control';\nimport { createInteractionControls } from './interaction-control';\nimport css from './style.scss';\nimport { createCameraControls } from './camera-controls';\nimport type MapData from '../../map-data';\nimport { createMarkerControls } from './markers-control';\nimport { createGeometryControl } from './walls-control';\nimport { createMiscControl } from './misc-control';\nimport type { InspectorOption } from './inspector';\nimport { createDebugControl } from './debug-control';\nimport { createText3DControl } from './text3d-control';\nimport { createStackmapsControl } from './stackedmaps-control';\n\nexport function createUi<T extends MapView>(mapData: MapData, mapView: T, options?: InspectorOption) {\n\tinjectCss();\n\tconst panel = new GUI({ title: 'SDK Controls' });\n\tpanel.domElement.classList.add('mappedin-js-inspector');\n\tcreateInteractionControls(mapView, mapData, panel);\n\tcreateCameraControls(panel, mapView, options?.camera);\n\tconst levelsFolder = panel.addFolder('Levels').close();\n\tconst sceneFolder = panel.addFolder('Scene Controls');\n\tsceneFolder.close();\n\tconst labelFolder = panel.addFolder('Labels');\n\tcreateText3DControl(panel, mapView, mapData);\n\tconst markerFolder = panel.addFolder('Markers');\n\tcreateGeometryControl(panel, mapView);\n\tcreateStackmapsControl(panel, mapView, mapData);\n\tconst miscFolder = panel.addFolder('misc');\n\tcreateDebugControl(panel, mapView, mapData);\n\tcreateMiscControl(miscFolder, mapView, mapData);\n\n\tconst state = {\n\t\tlevel: mapView.currentFloor.id,\n\t};\n\n\tconst { populatelabels } = createLabelControls(labelFolder, mapData, mapView);\n\tconst { populateMarkers } = createMarkerControls(markerFolder, mapData, mapView);\n\n\tconst levels = mapData.getByType('floor').reduce((acc, floor) => {\n\t\tacc[floor.name] = floor.id;\n\n\t\treturn acc;\n\t}, {});\n\tconst levelsControl = levelsFolder.add(state, 'level', levels).onChange(update => {\n\t\tmapView.setFloor(update);\n\t\tstate.level = mapView.currentFloor.id;\n\t\tlevelsControl.updateDisplay();\n\t});\n\n\tmapView.on('floor-change-start', event => {\n\t\tlevelsFolder.controllers[0].setValue(event.floor.id);\n\t});\n\n\tmapData.getByType('space').forEach(s => {\n\t\tmapView.updateState(s, { interactive: true });\n\t});\n\tmapData.getByType('object').forEach(s => {\n\t\tmapView.updateState(s, { interactive: true });\n\t});\n\n\tmapData.getByType('object').forEach(o => {\n\t\tmapView.updateState(o, { interactive: true });\n\t});\n\tmapView.setHoverColor('#a2b7e6');\n\tmapView.Camera.setMaxZoomLevel(20);\n\n\treturn { populatelabels, sceneFolder, populateMarkers };\n}\n\nconst STYLE_EL_ID = 'mappedin-sdk-debug-css';\nfunction injectCss() {\n\t// TODO: scope this css to the SDK\n\tif (document.getElementById(STYLE_EL_ID)) {\n\t\treturn;\n\t}\n\tconst style = document.createElement('style');\n\tstyle.id = STYLE_EL_ID;\n\tstyle.textContent = css;\n\tdocument.head.appendChild(style);\n}\n", "/**\n * lil-gui\n * https://lil-gui.georgealways.com\n * @version 0.19.2\n * @author George Michael Brower\n * @license MIT\n */\n\n/**\n * Base class for all controllers.\n */\nclass Controller {\n\n\tconstructor( parent, object, property, className, elementType = 'div' ) {\n\n\t\t/**\n\t\t * The GUI that contains this controller.\n\t\t * @type {GUI}\n\t\t */\n\t\tthis.parent = parent;\n\n\t\t/**\n\t\t * The object this controller will modify.\n\t\t * @type {object}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The name of the property to control.\n\t\t * @type {string}\n\t\t */\n\t\tthis.property = property;\n\n\t\t/**\n\t\t * Used to determine if the controller is disabled.\n\t\t * Use `controller.disable( true|false )` to modify this value.\n\t\t * @type {boolean}\n\t\t */\n\t\tthis._disabled = false;\n\n\t\t/**\n\t\t * Used to determine if the Controller is hidden.\n\t\t * Use `controller.show()` or `controller.hide()` to change this.\n\t\t * @type {boolean}\n\t\t */\n\t\tthis._hidden = false;\n\n\t\t/**\n\t\t * The value of `object[ property ]` when the controller was created.\n\t\t * @type {any}\n\t\t */\n\t\tthis.initialValue = this.getValue();\n\n\t\t/**\n\t\t * The outermost container DOM element for this controller.\n\t\t * @type {HTMLElement}\n\t\t */\n\t\tthis.domElement = document.createElement( elementType );\n\t\tthis.domElement.classList.add( 'controller' );\n\t\tthis.domElement.classList.add( className );\n\n\t\t/**\n\t\t * The DOM element that contains the controller's name.\n\t\t * @type {HTMLElement}\n\t\t */\n\t\tthis.$name = document.createElement( 'div' );\n\t\tthis.$name.classList.add( 'name' );\n\n\t\tController.nextNameID = Controller.nextNameID || 0;\n\t\tthis.$name.id = `lil-gui-name-${++Controller.nextNameID}`;\n\n\t\t/**\n\t\t * The DOM element that contains the controller's \"widget\" (which differs by controller type).\n\t\t * @type {HTMLElement}\n\t\t */\n\t\tthis.$widget = document.createElement( 'div' );\n\t\tthis.$widget.classList.add( 'widget' );\n\n\t\t/**\n\t\t * The DOM element that receives the disabled attribute when using disable().\n\t\t * @type {HTMLElement}\n\t\t */\n\t\tthis.$disable = this.$widget;\n\n\t\tthis.domElement.appendChild( this.$name );\n\t\tthis.domElement.appendChild( this.$widget );\n\n\t\t// Don't fire global key events while typing in a controller\n\t\tthis.domElement.addEventListener( 'keydown', e => e.stopPropagation() );\n\t\tthis.domElement.addEventListener( 'keyup', e => e.stopPropagation() );\n\n\t\tthis.parent.children.push( this );\n\t\tthis.parent.controllers.push( this );\n\n\t\tthis.parent.$children.appendChild( this.domElement );\n\n\t\tthis._listenCallback = this._listenCallback.bind( this );\n\n\t\tthis.name( property );\n\n\t}\n\n\t/**\n\t * Sets the name of the controller and its label in the GUI.\n\t * @param {string} name\n\t * @returns {this}\n\t */\n\tname( name ) {\n\t\t/**\n\t\t * The controller's name. Use `controller.name( 'Name' )` to modify this value.\n\t\t * @type {string}\n\t\t */\n\t\tthis._name = name;\n\t\tthis.$name.textContent = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pass a function to be called whenever the value is modified by this controller.\n\t * The function receives the new value as its first parameter. The value of `this` will be the\n\t * controller.\n\t *\n\t * For function controllers, the `onChange` callback will be fired on click, after the function\n\t * executes.\n\t * @param {Function} callback\n\t * @returns {this}\n\t * @example\n\t * const controller = gui.add( object, 'property' );\n\t *\n\t * controller.onChange( function( v ) {\n\t * \tconsole.log( 'The value is now ' + v );\n\t * \tconsole.assert( this === controller );\n\t * } );\n\t */\n\tonChange( callback ) {\n\t\t/**\n\t\t * Used to access the function bound to `onChange` events. Don't modify this value directly.\n\t\t * Use the `controller.onChange( callback )` method instead.\n\t\t * @type {Function}\n\t\t */\n\t\tthis._onChange = callback;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calls the onChange methods of this controller and its parent GUI.\n\t * @protected\n\t */\n\t_callOnChange() {\n\n\t\tthis.parent._callOnChange( this );\n\n\t\tif ( this._onChange !== undefined ) {\n\t\t\tthis._onChange.call( this, this.getValue() );\n\t\t}\n\n\t\tthis._changed = true;\n\n\t}\n\n\t/**\n\t * Pass a function to be called after this controller has been modified and loses focus.\n\t * @param {Function} callback\n\t * @returns {this}\n\t * @example\n\t * const controller = gui.add( object, 'property' );\n\t *\n\t * controller.onFinishChange( function( v ) {\n\t * \tconsole.log( 'Changes complete: ' + v );\n\t * \tconsole.assert( this === controller );\n\t * } );\n\t */\n\tonFinishChange( callback ) {\n\t\t/**\n\t\t * Used to access the function bound to `onFinishChange` events. Don't modify this value\n\t\t * directly. Use the `controller.onFinishChange( callback )` method instead.\n\t\t * @type {Function}\n\t\t */\n\t\tthis._onFinishChange = callback;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Should be called by Controller when its widgets lose focus.\n\t * @protected\n\t */\n\t_callOnFinishChange() {\n\n\t\tif ( this._changed ) {\n\n\t\t\tthis.parent._callOnFinishChange( this );\n\n\t\t\tif ( this._onFinishChange !== undefined ) {\n\t\t\t\tthis._onFinishChange.call( this, this.getValue() );\n\t\t\t}\n\n\t\t}\n\n\t\tthis._changed = false;\n\n\t}\n\n\t/**\n\t * Sets the controller back to its initial value.\n\t * @returns {this}\n\t */\n\treset() {\n\t\tthis.setValue( this.initialValue );\n\t\tthis._callOnFinishChange();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Enables this controller.\n\t * @param {boolean} enabled\n\t * @returns {this}\n\t * @example\n\t * controller.enable();\n\t * controller.enable( false ); // disable\n\t * controller.enable( controller._disabled ); // toggle\n\t */\n\tenable( enabled = true ) {\n\t\treturn this.disable( !enabled );\n\t}\n\n\t/**\n\t * Disables this controller.\n\t * @param {boolean} disabled\n\t * @returns {this}\n\t * @example\n\t * controller.disable();\n\t * controller.disable( false ); // enable\n\t * controller.disable( !controller._disabled ); // toggle\n\t */\n\tdisable( disabled = true ) {\n\n\t\tif ( disabled === this._disabled ) return this;\n\n\t\tthis._disabled = disabled;\n\n\t\tthis.domElement.classList.toggle( 'disabled', disabled );\n\t\tthis.$disable.toggleAttribute( 'disabled', disabled );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Shows the Controller after it's been hidden.\n\t * @param {boolean} show\n\t * @returns {this}\n\t * @example\n\t * controller.show();\n\t * controller.show( false ); // hide\n\t * controller.show( controller._hidden ); // toggle\n\t */\n\tshow( show = true ) {\n\n\t\tthis._hidden = !show;\n\n\t\tthis.domElement.style.display = this._hidden ? 'none' : '';\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Hides the Controller.\n\t * @returns {this}\n\t */\n\thide() {\n\t\treturn this.show( false );\n\t}\n\n\t/**\n\t * Changes this controller into a dropdown of options.\n\t *\n\t * Calling this method on an option controller will simply update the options. However, if this\n\t * controller was not already an option controller, old references to this controller are\n\t * destroyed, and a new controller is added to the end of the GUI.\n\t * @example\n\t * // safe usage\n\t *\n\t * gui.add( obj, 'prop1' ).options( [ 'a', 'b', 'c' ] );\n\t * gui.add( obj, 'prop2' ).options( { Big: 10, Small: 1 } );\n\t * gui.add( obj, 'prop3' );\n\t *\n\t * // danger\n\t *\n\t * const ctrl1 = gui.add( obj, 'prop1' );\n\t * gui.add( obj, 'prop2' );\n\t *\n\t * // calling options out of order adds a new controller to the end...\n\t * const ctrl2 = ctrl1.options( [ 'a', 'b', 'c' ] );\n\t *\n\t * // ...and ctrl1 now references a controller that doesn't exist\n\t * assert( ctrl2 !== ctrl1 )\n\t * @param {object|Array} options\n\t * @returns {Controller}\n\t */\n\toptions( options ) {\n\t\tconst controller = this.parent.add( this.object, this.property, options );\n\t\tcontroller.name( this._name );\n\t\tthis.destroy();\n\t\treturn controller;\n\t}\n\n\t/**\n\t * Sets the minimum value. Only works on number controllers.\n\t * @param {number} min\n\t * @returns {this}\n\t */\n\tmin( min ) {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum value. Only works on number controllers.\n\t * @param {number} max\n\t * @returns {this}\n\t */\n\tmax( max ) {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Values set by this controller will be rounded to multiples of `step`. Only works on number\n\t * controllers.\n\t * @param {number} step\n\t * @returns {this}\n\t */\n\tstep( step ) {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Rounds the displayed value to a fixed number of decimals, without affecting the actual value\n\t * like `step()`. Only works on number controllers.\n\t * @example\n\t * gui.add( object, 'property' ).listen().decimals( 4 );\n\t * @param {number} decimals\n\t * @returns {this}\n\t */\n\tdecimals( decimals ) {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calls `updateDisplay()` every animation frame. Pass `false` to stop listening.\n\t * @param {boolean} listen\n\t * @returns {this}\n\t */\n\tlisten( listen = true ) {\n\n\t\t/**\n\t\t * Used to determine if the controller is currently listening. Don't modify this value\n\t\t * directly. Use the `controller.listen( true|false )` method instead.\n\t\t * @type {boolean}\n\t\t */\n\t\tthis._listening = listen;\n\n\t\tif ( this._listenCallbackID !== undefined ) {\n\t\t\tcancelAnimationFrame( this._listenCallbackID );\n\t\t\tthis._listenCallbackID = undefined;\n\t\t}\n\n\t\tif ( this._listening ) {\n\t\t\tthis._listenCallback();\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t_listenCallback() {\n\n\t\tthis._listenCallbackID = requestAnimationFrame( this._listenCallback );\n\n\t\t// To prevent framerate loss, make sure the value has changed before updating the display.\n\t\t// Note: save() is used here instead of getValue() only because of ColorController. The !== operator\n\t\t// won't work for color objects or arrays, but ColorController.save() always returns a string.\n\n\t\tconst curValue = this.save();\n\n\t\tif ( curValue !== this._listenPrevValue ) {\n\t\t\tthis.updateDisplay();\n\t\t}\n\n\t\tthis._listenPrevValue = curValue;\n\n\t}\n\n\t/**\n\t * Returns `object[ property ]`.\n\t * @returns {any}\n\t */\n\tgetValue() {\n\t\treturn this.object[ this.property ];\n\t}\n\n\t/**\n\t * Sets the value of `object[ property ]`, invokes any `onChange` handlers and updates the display.\n\t * @param {any} value\n\t * @returns {this}\n\t */\n\tsetValue( value ) {\n\n\t\tif ( this.getValue() !== value ) {\n\n\t\t\tthis.object[ this.property ] = value;\n\t\t\tthis._callOnChange();\n\t\t\tthis.updateDisplay();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the display to keep it in sync with the current value. Useful for updating your\n\t * controllers when their values have been modified outside of the GUI.\n\t * @returns {this}\n\t */\n\tupdateDisplay() {\n\t\treturn this;\n\t}\n\n\tload( value ) {\n\t\tthis.setValue( value );\n\t\tthis._callOnFinishChange();\n\t\treturn this;\n\t}\n\n\tsave() {\n\t\treturn this.getValue();\n\t}\n\n\t/**\n\t * Destroys this controller and removes it from the parent GUI.\n\t */\n\tdestroy() {\n\t\tthis.listen( false );\n\t\tthis.parent.children.splice( this.parent.children.indexOf( this ), 1 );\n\t\tthis.parent.controllers.splice( this.parent.controllers.indexOf( this ), 1 );\n\t\tthis.parent.$children.removeChild( this.domElement );\n\t}\n\n}\n\nclass BooleanController extends Controller {\n\n\tconstructor( parent, object, property ) {\n\n\t\tsuper( parent, object, property, 'boolean', 'label' );\n\n\t\tthis.$input = document.createElement( 'input' );\n\t\tthis.$input.setAttribute( 'type', 'checkbox' );\n\t\tthis.$input.setAttribute( 'aria-labelledby', this.$name.id );\n\n\t\tthis.$widget.appendChild( this.$input );\n\n\t\tthis.$input.addEventListener( 'change', () => {\n\t\t\tthis.setValue( this.$input.checked );\n\t\t\tthis._callOnFinishChange();\n\t\t} );\n\n\t\tthis.$disable = this.$input;\n\n\t\tthis.updateDisplay();\n\n\t}\n\n\tupdateDisplay() {\n\t\tthis.$input.checked = this.getValue();\n\t\treturn this;\n\t}\n\n}\n\nfunction normalizeColorString( string ) {\n\n\tlet match, result;\n\n\tif ( match = string.match( /(#|0x)?([a-f0-9]{6})/i ) ) {\n\n\t\tresult = match[ 2 ];\n\n\t} else if ( match = string.match( /rgb\\(\\s*(\\d*)\\s*,\\s*(\\d*)\\s*,\\s*(\\d*)\\s*\\)/ ) ) {\n\n\t\tresult = parseInt( match[ 1 ] ).toString( 16 ).padStart( 2, 0 )\n\t\t\t+ parseInt( match[ 2 ] ).toString( 16 ).padStart( 2, 0 )\n\t\t\t+ parseInt( match[ 3 ] ).toString( 16 ).padStart( 2, 0 );\n\n\t} else if ( match = string.match( /^#?([a-f0-9])([a-f0-9])([a-f0-9])$/i ) ) {\n\n\t\tresult = match[ 1 ] + match[ 1 ] + match[ 2 ] + match[ 2 ] + match[ 3 ] + match[ 3 ];\n\n\t}\n\n\tif ( result ) {\n\t\treturn '#' + result;\n\t}\n\n\treturn false;\n\n}\n\nconst STRING = {\n\tisPrimitive: true,\n\tmatch: v => typeof v === 'string',\n\tfromHexString: normalizeColorString,\n\ttoHexString: normalizeColorString\n};\n\nconst INT = {\n\tisPrimitive: true,\n\tmatch: v => typeof v === 'number',\n\tfromHexString: string => parseInt( string.substring( 1 ), 16 ),\n\ttoHexString: value => '#' + value.toString( 16 ).padStart( 6, 0 )\n};\n\nconst ARRAY = {\n\tisPrimitive: false,\n\n\t// The arrow function is here to appease tree shakers like esbuild or webpack.\n\t// See https://esbuild.github.io/api/#tree-shaking\n\tmatch: v => Array.isArray( v ),\n\n\tfromHexString( string, target, rgbScale = 1 ) {\n\n\t\tconst int = INT.fromHexString( string );\n\n\t\ttarget[ 0 ] = ( int >> 16 & 255 ) / 255 * rgbScale;\n\t\ttarget[ 1 ] = ( int >> 8 & 255 ) / 255 * rgbScale;\n\t\ttarget[ 2 ] = ( int & 255 ) / 255 * rgbScale;\n\n\t},\n\ttoHexString( [ r, g, b ], rgbScale = 1 ) {\n\n\t\trgbScale = 255 / rgbScale;\n\n\t\tconst int = ( r * rgbScale ) << 16 ^\n\t\t\t( g * rgbScale ) << 8 ^\n\t\t\t( b * rgbScale ) << 0;\n\n\t\treturn INT.toHexString( int );\n\n\t}\n};\n\nconst OBJECT = {\n\tisPrimitive: false,\n\tmatch: v => Object( v ) === v,\n\tfromHexString( string, target, rgbScale = 1 ) {\n\n\t\tconst int = INT.fromHexString( string );\n\n\t\ttarget.r = ( int >> 16 & 255 ) / 255 * rgbScale;\n\t\ttarget.g = ( int >> 8 & 255 ) / 255 * rgbScale;\n\t\ttarget.b = ( int & 255 ) / 255 * rgbScale;\n\n\t},\n\ttoHexString( { r, g, b }, rgbScale = 1 ) {\n\n\t\trgbScale = 255 / rgbScale;\n\n\t\tconst int = ( r * rgbScale ) << 16 ^\n\t\t\t( g * rgbScale ) << 8 ^\n\t\t\t( b * rgbScale ) << 0;\n\n\t\treturn INT.toHexString( int );\n\n\t}\n};\n\nconst FORMATS = [ STRING, INT, ARRAY, OBJECT ];\n\nfunction getColorFormat( value ) {\n\treturn FORMATS.find( format => format.match( value ) );\n}\n\nclass ColorController extends Controller {\n\n\tconstructor( parent, object, property, rgbScale ) {\n\n\t\tsuper( parent, object, property, 'color' );\n\n\t\tthis.$input = document.createElement( 'input' );\n\t\tthis.$input.setAttribute( 'type', 'color' );\n\t\tthis.$input.setAttribute( 'tabindex', -1 );\n\t\tthis.$input.setAttribute( 'aria-labelledby', this.$name.id );\n\n\t\tthis.$text = document.createElement( 'input' );\n\t\tthis.$text.setAttribute( 'type', 'text' );\n\t\tthis.$text.setAttribute( 'spellcheck', 'false' );\n\t\tthis.$text.setAttribute( 'aria-labelledby', this.$name.id );\n\n\t\tthis.$display = document.createElement( 'div' );\n\t\tthis.$display.classList.add( 'display' );\n\n\t\tthis.$display.appendChild( this.$input );\n\t\tthis.$widget.appendChild( this.$display );\n\t\tthis.$widget.appendChild( this.$text );\n\n\t\tthis._format = getColorFormat( this.initialValue );\n\t\tthis._rgbScale = rgbScale;\n\n\t\tthis._initialValueHexString = this.save();\n\t\tthis._textFocused = false;\n\n\t\tthis.$input.addEventListener( 'input', () => {\n\t\t\tthis._setValueFromHexString( this.$input.value );\n\t\t} );\n\n\t\tthis.$input.addEventListener( 'blur', () => {\n\t\t\tthis._callOnFinishChange();\n\t\t} );\n\n\t\tthis.$text.addEventListener( 'input', () => {\n\t\t\tconst tryParse = normalizeColorString( this.$text.value );\n\t\t\tif ( tryParse ) {\n\t\t\t\tthis._setValueFromHexString( tryParse );\n\t\t\t}\n\t\t} );\n\n\t\tthis.$text.addEventListener( 'focus', () => {\n\t\t\tthis._textFocused = true;\n\t\t\tthis.$text.select();\n\t\t} );\n\n\t\tthis.$text.addEventListener( 'blur', () => {\n\t\t\tthis._textFocused = false;\n\t\t\tthis.updateDisplay();\n\t\t\tthis._callOnFinishChange();\n\t\t} );\n\n\t\tthis.$disable = this.$text;\n\n\t\tthis.updateDisplay();\n\n\t}\n\n\treset() {\n\t\tthis._setValueFromHexString( this._initialValueHexString );\n\t\treturn this;\n\t}\n\n\t_setValueFromHexString( value ) {\n\n\t\tif ( this._format.isPrimitive ) {\n\n\t\t\tconst newValue = this._format.fromHexString( value );\n\t\t\tthis.setValue( newValue );\n\n\t\t} else {\n\n\t\t\tthis._format.fromHexString( value, this.getValue(), this._rgbScale );\n\t\t\tthis._callOnChange();\n\t\t\tthis.updateDisplay();\n\n\t\t}\n\n\t}\n\n\tsave() {\n\t\treturn this._format.toHexString( this.getValue(), this._rgbScale );\n\t}\n\n\tload( value ) {\n\t\tthis._setValueFromHexString( value );\n\t\tthis._callOnFinishChange();\n\t\treturn this;\n\t}\n\n\tupdateDisplay() {\n\t\tthis.$input.value = this._format.toHexString( this.getValue(), this._rgbScale );\n\t\tif ( !this._textFocused ) {\n\t\t\tthis.$text.value = this.$input.value.substring( 1 );\n\t\t}\n\t\tthis.$display.style.backgroundColor = this.$input.value;\n\t\treturn this;\n\t}\n\n}\n\nclass FunctionController extends Controller {\n\n\tconstructor( parent, object, property ) {\n\n\t\tsuper( parent, object, property, 'function' );\n\n\t\t// Buttons are the only case where widget contains name\n\t\tthis.$button = document.createElement( 'button' );\n\t\tthis.$button.appendChild( this.$name );\n\t\tthis.$widget.appendChild( this.$button );\n\n\t\tthis.$button.addEventListener( 'click', e => {\n\t\t\te.preventDefault();\n\t\t\tthis.getValue().call( this.object );\n\t\t\tthis._callOnChange();\n\t\t} );\n\n\t\t// enables :active pseudo class on mobile\n\t\tthis.$button.addEventListener( 'touchstart', () => {}, { passive: true } );\n\n\t\tthis.$disable = this.$button;\n\n\t}\n\n}\n\nclass NumberController extends Controller {\n\n\tconstructor( parent, object, property, min, max, step ) {\n\n\t\tsuper( parent, object, property, 'number' );\n\n\t\tthis._initInput();\n\n\t\tthis.min( min );\n\t\tthis.max( max );\n\n\t\tconst stepExplicit = step !== undefined;\n\t\tthis.step( stepExplicit ? step : this._getImplicitStep(), stepExplicit );\n\n\t\tthis.updateDisplay();\n\n\t}\n\n\tdecimals( decimals ) {\n\t\tthis._decimals = decimals;\n\t\tthis.updateDisplay();\n\t\treturn this;\n\t}\n\n\tmin( min ) {\n\t\tthis._min = min;\n\t\tthis._onUpdateMinMax();\n\t\treturn this;\n\t}\n\n\tmax( max ) {\n\t\tthis._max = max;\n\t\tthis._onUpdateMinMax();\n\t\treturn this;\n\t}\n\n\tstep( step, explicit = true ) {\n\t\tthis._step = step;\n\t\tthis._stepExplicit = explicit;\n\t\treturn this;\n\t}\n\n\tupdateDisplay() {\n\n\t\tconst value = this.getValue();\n\n\t\tif ( this._hasSlider ) {\n\n\t\t\tlet percent = ( value - this._min ) / ( this._max - this._min );\n\t\t\tpercent = Math.max( 0, Math.min( percent, 1 ) );\n\n\t\t\tthis.$fill.style.width = percent * 100 + '%';\n\n\t\t}\n\n\t\tif ( !this._inputFocused ) {\n\t\t\tthis.$input.value = this._decimals === undefined ? value : value.toFixed( this._decimals );\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t_initInput() {\n\n\t\tthis.$input = document.createElement( 'input' );\n\t\tthis.$input.setAttribute( 'type', 'text' );\n\t\tthis.$input.setAttribute( 'aria-labelledby', this.$name.id );\n\n\t\t// On touch devices only, use input[type=number] to force a numeric keyboard.\n\t\t// Ideally we could use one input type everywhere, but [type=number] has quirks\n\t\t// on desktop, and [inputmode=decimal] has quirks on iOS.\n\t\t// See https://github.com/georgealways/lil-gui/pull/16\n\n\t\tconst isTouch = window.matchMedia( '(pointer: coarse)' ).matches;\n\n\t\tif ( isTouch ) {\n\t\t\tthis.$input.setAttribute( 'type', 'number' );\n\t\t\tthis.$input.setAttribute( 'step', 'any' );\n\t\t}\n\n\t\tthis.$widget.appendChild( this.$input );\n\n\t\tthis.$disable = this.$input;\n\n\t\tconst onInput = () => {\n\n\t\t\tlet value = parseFloat( this.$input.value );\n\n\t\t\tif ( isNaN( value ) ) return;\n\n\t\t\tif ( this._stepExplicit ) {\n\t\t\t\tvalue = this._snap( value );\n\t\t\t}\n\n\t\t\tthis.setValue( this._clamp( value ) );\n\n\t\t};\n\n\t\t// Keys & mouse wheel\n\t\t// ---------------------------------------------------------------------\n\n\t\tconst increment = delta => {\n\n\t\t\tconst value = parseFloat( this.$input.value );\n\n\t\t\tif ( isNaN( value ) ) return;\n\n\t\t\tthis._snapClampSetValue( value + delta );\n\n\t\t\t// Force the input to updateDisplay when it's focused\n\t\t\tthis.$input.value = this.getValue();\n\n\t\t};\n\n\t\tconst onKeyDown = e => {\n\t\t\t// Using `e.key` instead of `e.code` also catches NumpadEnter\n\t\t\tif ( e.key === 'Enter' ) {\n\t\t\t\tthis.$input.blur();\n\t\t\t}\n\t\t\tif ( e.code === 'ArrowUp' ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tincrement( this._step * this._arrowKeyMultiplier( e ) );\n\t\t\t}\n\t\t\tif ( e.code === 'ArrowDown' ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tincrement( this._step * this._arrowKeyMultiplier( e ) * -1 );\n\t\t\t}\n\t\t};\n\n\t\tconst onWheel = e => {\n\t\t\tif ( this._inputFocused ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tincrement( this._step * this._normalizeMouseWheel( e ) );\n\t\t\t}\n\t\t};\n\n\t\t// Vertical drag\n\t\t// ---------------------------------------------------------------------\n\n\t\tlet testingForVerticalDrag = false,\n\t\t\tinitClientX,\n\t\t\tinitClientY,\n\t\t\tprevClientY,\n\t\t\tinitValue,\n\t\t\tdragDelta;\n\n\t\t// Once the mouse is dragged more than DRAG_THRESH px on any axis, we decide\n\t\t// on the user's intent: horizontal means highlight, vertical means drag.\n\t\tconst DRAG_THRESH = 5;\n\n\t\tconst onMouseDown = e => {\n\n\t\t\tinitClientX = e.clientX;\n\t\t\tinitClientY = prevClientY = e.clientY;\n\t\t\ttestingForVerticalDrag = true;\n\n\t\t\tinitValue = this.getValue();\n\t\t\tdragDelta = 0;\n\n\t\t\twindow.addEventListener( 'mousemove', onMouseMove );\n\t\t\twindow.addEventListener( 'mouseup', onMouseUp );\n\n\t\t};\n\n\t\tconst onMouseMove = e => {\n\n\t\t\tif ( testingForVerticalDrag ) {\n\n\t\t\t\tconst dx = e.clientX - initClientX;\n\t\t\t\tconst dy = e.clientY - initClientY;\n\n\t\t\t\tif ( Math.abs( dy ) > DRAG_THRESH ) {\n\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.$input.blur();\n\t\t\t\t\ttestingForVerticalDrag = false;\n\t\t\t\t\tthis._setDraggingStyle( true, 'vertical' );\n\n\t\t\t\t} else if ( Math.abs( dx ) > DRAG_THRESH ) {\n\n\t\t\t\t\tonMouseUp();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// This isn't an else so that the first move counts towards dragDelta\n\t\t\tif ( !testingForVerticalDrag ) {\n\n\t\t\t\tconst dy = e.clientY - prevClientY;\n\n\t\t\t\tdragDelta -= dy * this._step * this._arrowKeyMultiplier( e );\n\n\t\t\t\t// Clamp dragDelta so we don't have 'dead space' after dragging past bounds.\n\t\t\t\t// We're okay with the fact that bounds can be undefined here.\n\t\t\t\tif ( initValue + dragDelta > this._max ) {\n\t\t\t\t\tdragDelta = this._max - initValue;\n\t\t\t\t} else if ( initValue + dragDelta < this._min ) {\n\t\t\t\t\tdragDelta = this._min - initValue;\n\t\t\t\t}\n\n\t\t\t\tthis._snapClampSetValue( initValue + dragDelta );\n\n\t\t\t}\n\n\t\t\tprevClientY = e.clientY;\n\n\t\t};\n\n\t\tconst onMouseUp = () => {\n\t\t\tthis._setDraggingStyle( false, 'vertical' );\n\t\t\tthis._callOnFinishChange();\n\t\t\twindow.removeEventListener( 'mousemove', onMouseMove );\n\t\t\twindow.removeEventListener( 'mouseup', onMouseUp );\n\t\t};\n\n\t\t// Focus state & onFinishChange\n\t\t// ---------------------------------------------------------------------\n\n\t\tconst onFocus = () => {\n\t\t\tthis._inputFocused = true;\n\t\t};\n\n\t\tconst onBlur = () => {\n\t\t\tthis._inputFocused = false;\n\t\t\tthis.updateDisplay();\n\t\t\tthis._callOnFinishChange();\n\t\t};\n\n\t\tthis.$input.addEventListener( 'input', onInput );\n\t\tthis.$input.addEventListener( 'keydown', onKeyDown );\n\t\tthis.$input.addEventListener( 'wheel', onWheel, { passive: false } );\n\t\tthis.$input.addEventListener( 'mousedown', onMouseDown );\n\t\tthis.$input.addEventListener( 'focus', onFocus );\n\t\tthis.$input.addEventListener( 'blur', onBlur );\n\n\t}\n\n\t_initSlider() {\n\n\t\tthis._hasSlider = true;\n\n\t\t// Build DOM\n\t\t// ---------------------------------------------------------------------\n\n\t\tthis.$slider = document.createElement( 'div' );\n\t\tthis.$slider.classList.add( 'slider' );\n\n\t\tthis.$fill = document.createElement( 'div' );\n\t\tthis.$fill.classList.add( 'fill' );\n\n\t\tthis.$slider.appendChild( this.$fill );\n\t\tthis.$widget.insertBefore( this.$slider, this.$input );\n\n\t\tthis.domElement.classList.add( 'hasSlider' );\n\n\t\t// Map clientX to value\n\t\t// ---------------------------------------------------------------------\n\n\t\tconst map = ( v, a, b, c, d ) => {\n\t\t\treturn ( v - a ) / ( b - a ) * ( d - c ) + c;\n\t\t};\n\n\t\tconst setValueFromX = clientX => {\n\t\t\tconst rect = this.$slider.getBoundingClientRect();\n\t\t\tlet value = map( clientX, rect.left, rect.right, this._min, this._max );\n\t\t\tthis._snapClampSetValue( value );\n\t\t};\n\n\t\t// Mouse drag\n\t\t// ---------------------------------------------------------------------\n\n\t\tconst mouseDown = e => {\n\t\t\tthis._setDraggingStyle( true );\n\t\t\tsetValueFromX( e.clientX );\n\t\t\twindow.addEventListener( 'mousemove', mouseMove );\n\t\t\twindow.addEventListener( 'mouseup', mouseUp );\n\t\t};\n\n\t\tconst mouseMove = e => {\n\t\t\tsetValueFromX( e.clientX );\n\t\t};\n\n\t\tconst mouseUp = () => {\n\t\t\tthis._callOnFinishChange();\n\t\t\tthis._setDraggingStyle( false );\n\t\t\twindow.removeEventListener( 'mousemove', mouseMove );\n\t\t\twindow.removeEventListener( 'mouseup', mouseUp );\n\t\t};\n\n\t\t// Touch drag\n\t\t// ---------------------------------------------------------------------\n\n\t\tlet testingForScroll = false, prevClientX, prevClientY;\n\n\t\tconst beginTouchDrag = e => {\n\t\t\te.preventDefault();\n\t\t\tthis._setDraggingStyle( true );\n\t\t\tsetValueFromX( e.touches[ 0 ].clientX );\n\t\t\ttestingForScroll = false;\n\t\t};\n\n\t\tconst onTouchStart = e => {\n\n\t\t\tif ( e.touches.length > 1 ) return;\n\n\t\t\t// If we're in a scrollable container, we should wait for the first\n\t\t\t// touchmove to see if the user is trying to slide or scroll.\n\t\t\tif ( this._hasScrollBar ) {\n\n\t\t\t\tprevClientX = e.touches[ 0 ].clientX;\n\t\t\t\tprevClientY = e.touches[ 0 ].clientY;\n\t\t\t\ttestingForScroll = true;\n\n\t\t\t} else {\n\n\t\t\t\t// Otherwise, we can set the value straight away on touchstart.\n\t\t\t\tbeginTouchDrag( e );\n\n\t\t\t}\n\n\t\t\twindow.addEventListener( 'touchmove', onTouchMove, { passive: false } );\n\t\t\twindow.addEventListener( 'touchend', onTouchEnd );\n\n\t\t};\n\n\t\tconst onTouchMove = e => {\n\n\t\t\tif ( testingForScroll ) {\n\n\t\t\t\tconst dx = e.touches[ 0 ].clientX - prevClientX;\n\t\t\t\tconst dy = e.touches[ 0 ].clientY - prevClientY;\n\n\t\t\t\tif ( Math.abs( dx ) > Math.abs( dy ) ) {\n\n\t\t\t\t\t// We moved horizontally, set the value and stop checking.\n\t\t\t\t\tbeginTouchDrag( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// This was, in fact, an attempt to scroll. Abort.\n\t\t\t\t\twindow.removeEventListener( 'touchmove', onTouchMove );\n\t\t\t\t\twindow.removeEventListener( 'touchend', onTouchEnd );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\te.preventDefault();\n\t\t\t\tsetValueFromX( e.touches[ 0 ].clientX );\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst onTouchEnd = () => {\n\t\t\tthis._callOnFinishChange();\n\t\t\tthis._setDraggingStyle( false );\n\t\t\twindow.removeEventListener( 'touchmove', onTouchMove );\n\t\t\twindow.removeEventListener( 'touchend', onTouchEnd );\n\t\t};\n\n\t\t// Mouse wheel\n\t\t// ---------------------------------------------------------------------\n\n\t\t// We have to use a debounced function to call onFinishChange because\n\t\t// there's no way to tell when the user is \"done\" mouse-wheeling.\n\t\tconst callOnFinishChange = this._callOnFinishChange.bind( this );\n\t\tconst WHEEL_DEBOUNCE_TIME = 400;\n\t\tlet wheelFinishChangeTimeout;\n\n\t\tconst onWheel = e => {\n\n\t\t\t// ignore vertical wheels if there's a scrollbar\n\t\t\tconst isVertical = Math.abs( e.deltaX ) < Math.abs( e.deltaY );\n\t\t\tif ( isVertical && this._hasScrollBar ) return;\n\n\t\t\te.preventDefault();\n\n\t\t\t// set value\n\t\t\tconst delta = this._normalizeMouseWheel( e ) * this._step;\n\t\t\tthis._snapClampSetValue( this.getValue() + delta );\n\n\t\t\t// force the input to updateDisplay when it's focused\n\t\t\tthis.$input.value = this.getValue();\n\n\t\t\t// debounce onFinishChange\n\t\t\tclearTimeout( wheelFinishChangeTimeout );\n\t\t\twheelFinishChangeTimeout = setTimeout( callOnFinishChange, WHEEL_DEBOUNCE_TIME );\n\n\t\t};\n\n\t\tthis.$slider.addEventListener( 'mousedown', mouseDown );\n\t\tthis.$slider.addEventListener( 'touchstart', onTouchStart, { passive: false } );\n\t\tthis.$slider.addEventListener( 'wheel', onWheel, { passive: false } );\n\n\t}\n\n\t_setDraggingStyle( active, axis = 'horizontal' ) {\n\t\tif ( this.$slider ) {\n\t\t\tthis.$slider.classList.toggle( 'active', active );\n\t\t}\n\t\tdocument.body.classList.toggle( 'lil-gui-dragging', active );\n\t\tdocument.body.classList.toggle( `lil-gui-${axis}`, active );\n\t}\n\n\t_getImplicitStep() {\n\n\t\tif ( this._hasMin && this._hasMax ) {\n\t\t\treturn ( this._max - this._min ) / 1000;\n\t\t}\n\n\t\treturn 0.1;\n\n\t}\n\n\t_onUpdateMinMax() {\n\n\t\tif ( !this._hasSlider && this._hasMin && this._hasMax ) {\n\n\t\t\t// If this is the first time we're hearing about min and max\n\t\t\t// and we haven't explicitly stated what our step is, let's\n\t\t\t// update that too.\n\t\t\tif ( !this._stepExplicit ) {\n\t\t\t\tthis.step( this._getImplicitStep(), false );\n\t\t\t}\n\n\t\t\tthis._initSlider();\n\t\t\tthis.updateDisplay();\n\n\t\t}\n\n\t}\n\n\t_normalizeMouseWheel( e ) {\n\n\t\tlet { deltaX, deltaY } = e;\n\n\t\t// Safari and Chrome report weird non-integral values for a notched wheel,\n\t\t// but still expose actual lines scrolled via wheelDelta. Notched wheels\n\t\t// should behave the same way as arrow keys.\n\t\tif ( Math.floor( e.deltaY ) !== e.deltaY && e.wheelDelta ) {\n\t\t\tdeltaX = 0;\n\t\t\tdeltaY = -e.wheelDelta / 120;\n\t\t\tdeltaY *= this._stepExplicit ? 1 : 10;\n\t\t}\n\n\t\tconst wheel = deltaX + -deltaY;\n\n\t\treturn wheel;\n\n\t}\n\n\t_arrowKeyMultiplier( e ) {\n\n\t\tlet mult = this._stepExplicit ? 1 : 10;\n\n\t\tif ( e.shiftKey ) {\n\t\t\tmult *= 10;\n\t\t} else if ( e.altKey ) {\n\t\t\tmult /= 10;\n\t\t}\n\n\t\treturn mult;\n\n\t}\n\n\t_snap( value ) {\n\n\t\t// This would be the logical way to do things, but floating point errors.\n\t\t// return Math.round( value / this._step ) * this._step;\n\n\t\t// Using inverse step solves a lot of them, but not all\n\t\t// const inverseStep = 1 / this._step;\n\t\t// return Math.round( value * inverseStep ) / inverseStep;\n\n\t\t// Not happy about this, but haven't seen it break.\n\t\tconst r = Math.round( value / this._step ) * this._step;\n\t\treturn parseFloat( r.toPrecision( 15 ) );\n\n\t}\n\n\t_clamp( value ) {\n\t\t// either condition is false if min or max is undefined\n\t\tif ( value < this._min ) value = this._min;\n\t\tif ( value > this._max ) value = this._max;\n\t\treturn value;\n\t}\n\n\t_snapClampSetValue( value ) {\n\t\tthis.setValue( this._clamp( this._snap( value ) ) );\n\t}\n\n\tget _hasScrollBar() {\n\t\tconst root = this.parent.root.$children;\n\t\treturn root.scrollHeight > root.clientHeight;\n\t}\n\n\tget _hasMin() {\n\t\treturn this._min !== undefined;\n\t}\n\n\tget _hasMax() {\n\t\treturn this._max !== undefined;\n\t}\n\n}\n\nclass OptionController extends Controller {\n\n\tconstructor( parent, object, property, options ) {\n\n\t\tsuper( parent, object, property, 'option' );\n\n\t\tthis.$select = document.createElement( 'select' );\n\t\tthis.$select.setAttribute( 'aria-labelledby', this.$name.id );\n\n\t\tthis.$display = document.createElement( 'div' );\n\t\tthis.$display.classList.add( 'display' );\n\n\t\tthis.$select.addEventListener( 'change', () => {\n\t\t\tthis.setValue( this._values[ this.$select.selectedIndex ] );\n\t\t\tthis._callOnFinishChange();\n\t\t} );\n\n\t\tthis.$select.addEventListener( 'focus', () => {\n\t\t\tthis.$display.classList.add( 'focus' );\n\t\t} );\n\n\t\tthis.$select.addEventListener( 'blur', () => {\n\t\t\tthis.$display.classList.remove( 'focus' );\n\t\t} );\n\n\t\tthis.$widget.appendChild( this.$select );\n\t\tthis.$widget.appendChild( this.$display );\n\n\t\tthis.$disable = this.$select;\n\n\t\tthis.options( options );\n\n\t}\n\n\toptions( options ) {\n\n\t\tthis._values = Array.isArray( options ) ? options : Object.values( options );\n\t\tthis._names = Array.isArray( options ) ? options : Object.keys( options );\n\n\t\tthis.$select.replaceChildren();\n\n\t\tthis._names.forEach( name => {\n\t\t\tconst $option = document.createElement( 'option' );\n\t\t\t$option.textContent = name;\n\t\t\tthis.$select.appendChild( $option );\n\t\t} );\n\n\t\tthis.updateDisplay();\n\n\t\treturn this;\n\n\t}\n\n\tupdateDisplay() {\n\t\tconst value = this.getValue();\n\t\tconst index = this._values.indexOf( value );\n\t\tthis.$select.selectedIndex = index;\n\t\tthis.$display.textContent = index === -1 ? value : this._names[ index ];\n\t\treturn this;\n\t}\n\n}\n\nclass StringController extends Controller {\n\n\tconstructor( parent, object, property ) {\n\n\t\tsuper( parent, object, property, 'string' );\n\n\t\tthis.$input = document.createElement( 'input' );\n\t\tthis.$input.setAttribute( 'type', 'text' );\n\t\tthis.$input.setAttribute( 'spellcheck', 'false' );\n\t\tthis.$input.setAttribute( 'aria-labelledby', this.$name.id );\n\n\t\tthis.$input.addEventListener( 'input', () => {\n\t\t\tthis.setValue( this.$input.value );\n\t\t} );\n\n\t\tthis.$input.addEventListener( 'keydown', e => {\n\t\t\tif ( e.code === 'Enter' ) {\n\t\t\t\tthis.$input.blur();\n\t\t\t}\n\t\t} );\n\n\t\tthis.$input.addEventListener( 'blur', () => {\n\t\t\tthis._callOnFinishChange();\n\t\t} );\n\n\t\tthis.$widget.appendChild( this.$input );\n\n\t\tthis.$disable = this.$input;\n\n\t\tthis.updateDisplay();\n\n\t}\n\n\tupdateDisplay() {\n\t\tthis.$input.value = this.getValue();\n\t\treturn this;\n\t}\n\n}\n\nconst stylesheet = `.lil-gui {\n font-family: var(--font-family);\n font-size: var(--font-size);\n line-height: 1;\n font-weight: normal;\n font-style: normal;\n text-align: left;\n color: var(--text-color);\n user-select: none;\n -webkit-user-select: none;\n touch-action: manipulation;\n --background-color: #1f1f1f;\n --text-color: #ebebeb;\n --title-background-color: #111111;\n --title-text-color: #ebebeb;\n --widget-color: #424242;\n --hover-color: #4f4f4f;\n --focus-color: #595959;\n --number-color: #2cc9ff;\n --string-color: #a2db3c;\n --font-size: 11px;\n --input-font-size: 11px;\n --font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n --font-family-mono: Menlo, Monaco, Consolas, \"Droid Sans Mono\", monospace;\n --padding: 4px;\n --spacing: 4px;\n --widget-height: 20px;\n --title-height: calc(var(--widget-height) + var(--spacing) * 1.25);\n --name-width: 45%;\n --slider-knob-width: 2px;\n --slider-input-width: 27%;\n --color-input-width: 27%;\n --slider-input-min-width: 45px;\n --color-input-min-width: 45px;\n --folder-indent: 7px;\n --widget-padding: 0 0 0 3px;\n --widget-border-radius: 2px;\n --checkbox-size: calc(0.75 * var(--widget-height));\n --scrollbar-width: 5px;\n}\n.lil-gui, .lil-gui * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n.lil-gui.root {\n width: var(--width, 245px);\n display: flex;\n flex-direction: column;\n background: var(--background-color);\n}\n.lil-gui.root > .title {\n background: var(--title-background-color);\n color: var(--title-text-color);\n}\n.lil-gui.root > .children {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.lil-gui.root > .children::-webkit-scrollbar {\n width: var(--scrollbar-width);\n height: var(--scrollbar-width);\n background: var(--background-color);\n}\n.lil-gui.root > .children::-webkit-scrollbar-thumb {\n border-radius: var(--scrollbar-width);\n background: var(--focus-color);\n}\n@media (pointer: coarse) {\n .lil-gui.allow-touch-styles, .lil-gui.allow-touch-styles .lil-gui {\n --widget-height: 28px;\n --padding: 6px;\n --spacing: 6px;\n --font-size: 13px;\n --input-font-size: 16px;\n --folder-indent: 10px;\n --scrollbar-width: 7px;\n --slider-input-min-width: 50px;\n --color-input-min-width: 65px;\n }\n}\n.lil-gui.force-touch-styles, .lil-gui.force-touch-styles .lil-gui {\n --widget-height: 28px;\n --padding: 6px;\n --spacing: 6px;\n --font-size: 13px;\n --input-font-size: 16px;\n --folder-indent: 10px;\n --scrollbar-width: 7px;\n --slider-input-min-width: 50px;\n --color-input-min-width: 65px;\n}\n.lil-gui.autoPlace {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 1001;\n}\n\n.lil-gui .controller {\n display: flex;\n align-items: center;\n padding: 0 var(--padding);\n margin: var(--spacing) 0;\n}\n.lil-gui .controller.disabled {\n opacity: 0.5;\n}\n.lil-gui .controller.disabled, .lil-gui .controller.disabled * {\n pointer-events: none !important;\n}\n.lil-gui .controller > .name {\n min-width: var(--name-width);\n flex-shrink: 0;\n white-space: pre;\n padding-right: var(--spacing);\n line-height: var(--widget-height);\n}\n.lil-gui .controller .widget {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n min-height: var(--widget-height);\n}\n.lil-gui .controller.string input {\n color: var(--string-color);\n}\n.lil-gui .controller.boolean {\n cursor: pointer;\n}\n.lil-gui .controller.color .display {\n width: 100%;\n height: var(--widget-height);\n border-radius: var(--widget-border-radius);\n position: relative;\n}\n@media (hover: hover) {\n .lil-gui .controller.color .display:hover:before {\n content: \" \";\n display: block;\n position: absolute;\n border-radius: var(--widget-border-radius);\n border: 1px solid #fff9;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n}\n.lil-gui .controller.color input[type=color] {\n opacity: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n}\n.lil-gui .controller.color input[type=text] {\n margin-left: var(--spacing);\n font-family: var(--font-family-mono);\n min-width: var(--color-input-min-width);\n width: var(--color-input-width);\n flex-shrink: 0;\n}\n.lil-gui .controller.option select {\n opacity: 0;\n position: absolute;\n width: 100%;\n max-width: 100%;\n}\n.lil-gui .controller.option .display {\n position: relative;\n pointer-events: none;\n border-radius: var(--widget-border-radius);\n height: var(--widget-height);\n line-height: var(--widget-height);\n max-width: 100%;\n overflow: hidden;\n word-break: break-all;\n padding-left: 0.55em;\n padding-right: 1.75em;\n background: var(--widget-color);\n}\n@media (hover: hover) {\n .lil-gui .controller.option .display.focus {\n background: var(--focus-color);\n }\n}\n.lil-gui .controller.option .display.active {\n background: var(--focus-color);\n}\n.lil-gui .controller.option .display:after {\n font-family: \"lil-gui\";\n content: \"\u2195\";\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n padding-right: 0.375em;\n}\n.lil-gui .controller.option .widget,\n.lil-gui .controller.option select {\n cursor: pointer;\n}\n@media (hover: hover) {\n .lil-gui .controller.option .widget:hover .display {\n background: var(--hover-color);\n }\n}\n.lil-gui .controller.number input {\n color: var(--number-color);\n}\n.lil-gui .controller.number.hasSlider input {\n margin-left: var(--spacing);\n width: var(--slider-input-width);\n min-width: var(--slider-input-min-width);\n flex-shrink: 0;\n}\n.lil-gui .controller.number .slider {\n width: 100%;\n height: var(--widget-height);\n background: var(--widget-color);\n border-radius: var(--widget-border-radius);\n padding-right: var(--slider-knob-width);\n overflow: hidden;\n cursor: ew-resize;\n touch-action: pan-y;\n}\n@media (hover: hover) {\n .lil-gui .controller.number .slider:hover {\n background: var(--hover-color);\n }\n}\n.lil-gui .controller.number .slider.active {\n background: var(--focus-color);\n}\n.lil-gui .controller.number .slider.active .fill {\n opacity: 0.95;\n}\n.lil-gui .controller.number .fill {\n height: 100%;\n border-right: var(--slider-knob-width) solid var(--number-color);\n box-sizing: content-box;\n}\n\n.lil-gui-dragging .lil-gui {\n --hover-color: var(--widget-color);\n}\n.lil-gui-dragging * {\n cursor: ew-resize !important;\n}\n\n.lil-gui-dragging.lil-gui-vertical * {\n cursor: ns-resize !important;\n}\n\n.lil-gui .title {\n height: var(--title-height);\n line-height: calc(var(--title-height) - 4px);\n font-weight: 600;\n padding: 0 var(--padding);\n -webkit-tap-highlight-color: transparent;\n cursor: pointer;\n outline: none;\n text-decoration-skip: objects;\n}\n.lil-gui .title:before {\n font-family: \"lil-gui\";\n content: \"\u25BE\";\n padding-right: 2px;\n display: inline-block;\n}\n.lil-gui .title:active {\n background: var(--title-background-color);\n opacity: 0.75;\n}\n@media (hover: hover) {\n body:not(.lil-gui-dragging) .lil-gui .title:hover {\n background: var(--title-background-color);\n opacity: 0.85;\n }\n .lil-gui .title:focus {\n text-decoration: underline var(--focus-color);\n }\n}\n.lil-gui.root > .title:focus {\n text-decoration: none !important;\n}\n.lil-gui.closed > .title:before {\n content: \"\u25B8\";\n}\n.lil-gui.closed > .children {\n transform: translateY(-7px);\n opacity: 0;\n}\n.lil-gui.closed:not(.transition) > .children {\n display: none;\n}\n.lil-gui.transition > .children {\n transition-duration: 300ms;\n transition-property: height, opacity, transform;\n transition-timing-function: cubic-bezier(0.2, 0.6, 0.35, 1);\n overflow: hidden;\n pointer-events: none;\n}\n.lil-gui .children:empty:before {\n content: \"Empty\";\n padding: 0 var(--padding);\n margin: var(--spacing) 0;\n display: block;\n height: var(--widget-height);\n font-style: italic;\n line-height: var(--widget-height);\n opacity: 0.5;\n}\n.lil-gui.root > .children > .lil-gui > .title {\n border: 0 solid var(--widget-color);\n border-width: 1px 0;\n transition: border-color 300ms;\n}\n.lil-gui.root > .children > .lil-gui.closed > .title {\n border-bottom-color: transparent;\n}\n.lil-gui + .controller {\n border-top: 1px solid var(--widget-color);\n margin-top: 0;\n padding-top: var(--spacing);\n}\n.lil-gui .lil-gui .lil-gui > .title {\n border: none;\n}\n.lil-gui .lil-gui .lil-gui > .children {\n border: none;\n margin-left: var(--folder-indent);\n border-left: 2px solid var(--widget-color);\n}\n.lil-gui .lil-gui .controller {\n border: none;\n}\n\n.lil-gui label, .lil-gui input, .lil-gui button {\n -webkit-tap-highlight-color: transparent;\n}\n.lil-gui input {\n border: 0;\n outline: none;\n font-family: var(--font-family);\n font-size: var(--input-font-size);\n border-radius: var(--widget-border-radius);\n height: var(--widget-height);\n background: var(--widget-color);\n color: var(--text-color);\n width: 100%;\n}\n@media (hover: hover) {\n .lil-gui input:hover {\n background: var(--hover-color);\n }\n .lil-gui input:active {\n background: var(--focus-color);\n }\n}\n.lil-gui input:disabled {\n opacity: 1;\n}\n.lil-gui input[type=text],\n.lil-gui input[type=number] {\n padding: var(--widget-padding);\n -moz-appearance: textfield;\n}\n.lil-gui input[type=text]:focus,\n.lil-gui input[type=number]:focus {\n background: var(--focus-color);\n}\n.lil-gui input[type=checkbox] {\n appearance: none;\n width: var(--checkbox-size);\n height: var(--checkbox-size);\n border-radius: var(--widget-border-radius);\n text-align: center;\n cursor: pointer;\n}\n.lil-gui input[type=checkbox]:checked:before {\n font-family: \"lil-gui\";\n content: \"\u2713\";\n font-size: var(--checkbox-size);\n line-height: var(--checkbox-size);\n}\n@media (hover: hover) {\n .lil-gui input[type=checkbox]:focus {\n box-shadow: inset 0 0 0 1px var(--focus-color);\n }\n}\n.lil-gui button {\n outline: none;\n cursor: pointer;\n font-family: var(--font-family);\n font-size: var(--font-size);\n color: var(--text-color);\n width: 100%;\n height: var(--widget-height);\n text-transform: none;\n background: var(--widget-color);\n border-radius: var(--widget-border-radius);\n border: none;\n}\n@media (hover: hover) {\n .lil-gui button:hover {\n background: var(--hover-color);\n }\n .lil-gui button:focus {\n box-shadow: inset 0 0 0 1px var(--focus-color);\n }\n}\n.lil-gui button:active {\n background: var(--focus-color);\n}\n\n@font-face {\n font-family: \"lil-gui\";\n src: url(\"data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUsAAsAAAAACJwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAH4AAADAImwmYE9TLzIAAAGIAAAAPwAAAGBKqH5SY21hcAAAAcgAAAD0AAACrukyyJBnbHlmAAACvAAAAF8AAACEIZpWH2hlYWQAAAMcAAAAJwAAADZfcj2zaGhlYQAAA0QAAAAYAAAAJAC5AHhobXR4AAADXAAAABAAAABMAZAAAGxvY2EAAANsAAAAFAAAACgCEgIybWF4cAAAA4AAAAAeAAAAIAEfABJuYW1lAAADoAAAASIAAAIK9SUU/XBvc3QAAATEAAAAZgAAAJCTcMc2eJxVjbEOgjAURU+hFRBK1dGRL+ALnAiToyMLEzFpnPz/eAshwSa97517c/MwwJmeB9kwPl+0cf5+uGPZXsqPu4nvZabcSZldZ6kfyWnomFY/eScKqZNWupKJO6kXN3K9uCVoL7iInPr1X5baXs3tjuMqCtzEuagm/AAlzQgPAAB4nGNgYRBlnMDAysDAYM/gBiT5oLQBAwuDJAMDEwMrMwNWEJDmmsJwgCFeXZghBcjlZMgFCzOiKOIFAB71Bb8AeJy1kjFuwkAQRZ+DwRAwBtNQRUGKQ8OdKCAWUhAgKLhIuAsVSpWz5Bbkj3dEgYiUIszqWdpZe+Z7/wB1oCYmIoboiwiLT2WjKl/jscrHfGg/pKdMkyklC5Zs2LEfHYpjcRoPzme9MWWmk3dWbK9ObkWkikOetJ554fWyoEsmdSlt+uR0pCJR34b6t/TVg1SY3sYvdf8vuiKrpyaDXDISiegp17p7579Gp3p++y7HPAiY9pmTibljrr85qSidtlg4+l25GLCaS8e6rRxNBmsnERunKbaOObRz7N72ju5vdAjYpBXHgJylOAVsMseDAPEP8LYoUHicY2BiAAEfhiAGJgZWBgZ7RnFRdnVJELCQlBSRlATJMoLV2DK4glSYs6ubq5vbKrJLSbGrgEmovDuDJVhe3VzcXFwNLCOILB/C4IuQ1xTn5FPilBTj5FPmBAB4WwoqAHicY2BkYGAA4sk1sR/j+W2+MnAzpDBgAyEMQUCSg4EJxAEAwUgFHgB4nGNgZGBgSGFggJMhDIwMqEAYAByHATJ4nGNgAIIUNEwmAABl3AGReJxjYAACIQYlBiMGJ3wQAEcQBEV4nGNgZGBgEGZgY2BiAAEQyQWEDAz/wXwGAAsPATIAAHicXdBNSsNAHAXwl35iA0UQXYnMShfS9GPZA7T7LgIu03SSpkwzYTIt1BN4Ak/gKTyAeCxfw39jZkjymzcvAwmAW/wgwHUEGDb36+jQQ3GXGot79L24jxCP4gHzF/EIr4jEIe7wxhOC3g2TMYy4Q7+Lu/SHuEd/ivt4wJd4wPxbPEKMX3GI5+DJFGaSn4qNzk8mcbKSR6xdXdhSzaOZJGtdapd4vVPbi6rP+cL7TGXOHtXKll4bY1Xl7EGnPtp7Xy2n00zyKLVHfkHBa4IcJ2oD3cgggWvt/V/FbDrUlEUJhTn/0azVWbNTNr0Ens8de1tceK9xZmfB1CPjOmPH4kitmvOubcNpmVTN3oFJyjzCvnmrwhJTzqzVj9jiSX911FjeAAB4nG3HMRKCMBBA0f0giiKi4DU8k0V2GWbIZDOh4PoWWvq6J5V8If9NVNQcaDhyouXMhY4rPTcG7jwYmXhKq8Wz+p762aNaeYXom2n3m2dLTVgsrCgFJ7OTmIkYbwIbC6vIB7WmFfAAAA==\") format(\"woff\");\n}`;\n\nfunction _injectStyles( cssContent ) {\n\tconst injected = document.createElement( 'style' );\n\tinjected.innerHTML = cssContent;\n\tconst before = document.querySelector( 'head link[rel=stylesheet], head style' );\n\tif ( before ) {\n\t\tdocument.head.insertBefore( injected, before );\n\t} else {\n\t\tdocument.head.appendChild( injected );\n\t}\n}\n\nlet stylesInjected = false;\n\nclass GUI {\n\n\t/**\n\t * Creates a panel that holds controllers.\n\t * @example\n\t * new GUI();\n\t * new GUI( { container: document.getElementById( 'custom' ) } );\n\t *\n\t * @param {object} [options]\n\t * @param {boolean} [options.autoPlace=true]\n\t * Adds the GUI to `document.body` and fixes it to the top right of the page.\n\t *\n\t * @param {HTMLElement} [options.container]\n\t * Adds the GUI to this DOM element. Overrides `autoPlace`.\n\t *\n\t * @param {number} [options.width=245]\n\t * Width of the GUI in pixels, usually set when name labels become too long. Note that you can make\n\t * name labels wider in CSS with `.lil\u2011gui { \u2011\u2011name\u2011width: 55% }`.\n\t *\n\t * @param {string} [options.title=Controls]\n\t * Name to display in the title bar.\n\t *\n\t * @param {boolean} [options.closeFolders=false]\n\t * Pass `true` to close all folders in this GUI by default.\n\t *\n\t * @param {boolean} [options.injectStyles=true]\n\t * Injects the default stylesheet into the page if this is the first GUI.\n\t * Pass `false` to use your own stylesheet.\n\t *\n\t * @param {number} [options.touchStyles=true]\n\t * Makes controllers larger on touch devices. Pass `false` to disable touch styles.\n\t *\n\t * @param {GUI} [options.parent]\n\t * Adds this GUI as a child in another GUI. Usually this is done for you by `addFolder()`.\n\t *\n\t */\n\tconstructor( {\n\t\tparent,\n\t\tautoPlace = parent === undefined,\n\t\tcontainer,\n\t\twidth,\n\t\ttitle = 'Controls',\n\t\tcloseFolders = false,\n\t\tinjectStyles = true,\n\t\ttouchStyles = true\n\t} = {} ) {\n\n\t\t/**\n\t\t * The GUI containing this folder, or `undefined` if this is the root GUI.\n\t\t * @type {GUI}\n\t\t */\n\t\tthis.parent = parent;\n\n\t\t/**\n\t\t * The top level GUI containing this folder, or `this` if this is the root GUI.\n\t\t * @type {GUI}\n\t\t */\n\t\tthis.root = parent ? parent.root : this;\n\n\t\t/**\n\t\t * The list of controllers and folders contained by this GUI.\n\t\t * @type {Array<GUI|Controller>}\n\t\t */\n\t\tthis.children = [];\n\n\t\t/**\n\t\t * The list of controllers contained by this GUI.\n\t\t * @type {Array<Controller>}\n\t\t */\n\t\tthis.controllers = [];\n\n\t\t/**\n\t\t * The list of folders contained by this GUI.\n\t\t * @type {Array<GUI>}\n\t\t */\n\t\tthis.folders = [];\n\n\t\t/**\n\t\t * Used to determine if the GUI is closed. Use `gui.open()` or `gui.close()` to change this.\n\t\t * @type {boolean}\n\t\t */\n\t\tthis._closed = false;\n\n\t\t/**\n\t\t * Used to determine if the GUI is hidden. Use `gui.show()` or `gui.hide()` to change this.\n\t\t * @type {boolean}\n\t\t */\n\t\tthis._hidden = false;\n\n\t\t/**\n\t\t * The outermost container element.\n\t\t * @type {HTMLElement}\n\t\t */\n\t\tthis.domElement = document.createElement( 'div' );\n\t\tthis.domElement.classList.add( 'lil-gui' );\n\n\t\t/**\n\t\t * The DOM element that contains the title.\n\t\t * @type {HTMLElement}\n\t\t */\n\t\tthis.$title = document.createElement( 'div' );\n\t\tthis.$title.classList.add( 'title' );\n\t\tthis.$title.setAttribute( 'role', 'button' );\n\t\tthis.$title.setAttribute( 'aria-expanded', true );\n\t\tthis.$title.setAttribute( 'tabindex', 0 );\n\n\t\tthis.$title.addEventListener( 'click', () => this.openAnimated( this._closed ) );\n\t\tthis.$title.addEventListener( 'keydown', e => {\n\t\t\tif ( e.code === 'Enter' || e.code === 'Space' ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.$title.click();\n\t\t\t}\n\t\t} );\n\n\t\t// enables :active pseudo class on mobile\n\t\tthis.$title.addEventListener( 'touchstart', () => {}, { passive: true } );\n\n\t\t/**\n\t\t * The DOM element that contains children.\n\t\t * @type {HTMLElement}\n\t\t */\n\t\tthis.$children = document.createElement( 'div' );\n\t\tthis.$children.classList.add( 'children' );\n\n\t\tthis.domElement.appendChild( this.$title );\n\t\tthis.domElement.appendChild( this.$children );\n\n\t\tthis.title( title );\n\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.children.push( this );\n\t\t\tthis.parent.folders.push( this );\n\n\t\t\tthis.parent.$children.appendChild( this.domElement );\n\n\t\t\t// Stop the constructor early, everything onward only applies to root GUI's\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.domElement.classList.add( 'root' );\n\n\t\tif ( touchStyles ) {\n\t\t\tthis.domElement.classList.add( 'allow-touch-styles' );\n\t\t}\n\n\t\t// Inject stylesheet if we haven't done that yet\n\t\tif ( !stylesInjected && injectStyles ) {\n\t\t\t_injectStyles( stylesheet );\n\t\t\tstylesInjected = true;\n\t\t}\n\n\t\tif ( container ) {\n\n\t\t\tcontainer.appendChild( this.domElement );\n\n\t\t} else if ( autoPlace ) {\n\n\t\t\tthis.domElement.classList.add( 'autoPlace' );\n\t\t\tdocument.body.appendChild( this.domElement );\n\n\t\t}\n\n\t\tif ( width ) {\n\t\t\tthis.domElement.style.setProperty( '--width', width + 'px' );\n\t\t}\n\n\t\tthis._closeFolders = closeFolders;\n\n\t}\n\n\t/**\n\t * Adds a controller to the GUI, inferring controller type using the `typeof` operator.\n\t * @example\n\t * gui.add( object, 'property' );\n\t * gui.add( object, 'number', 0, 100, 1 );\n\t * gui.add( object, 'options', [ 1, 2, 3 ] );\n\t *\n\t * @param {object} object The object the controller will modify.\n\t * @param {string} property Name of the property to control.\n\t * @param {number|object|Array} [$1] Minimum value for number controllers, or the set of\n\t * selectable values for a dropdown.\n\t * @param {number} [max] Maximum value for number controllers.\n\t * @param {number} [step] Step value for number controllers.\n\t * @returns {Controller}\n\t */\n\tadd( object, property, $1, max, step ) {\n\n\t\tif ( Object( $1 ) === $1 ) {\n\n\t\t\treturn new OptionController( this, object, property, $1 );\n\n\t\t}\n\n\t\tconst initialValue = object[ property ];\n\n\t\tswitch ( typeof initialValue ) {\n\n\t\t\tcase 'number':\n\n\t\t\t\treturn new NumberController( this, object, property, $1, max, step );\n\n\t\t\tcase 'boolean':\n\n\t\t\t\treturn new BooleanController( this, object, property );\n\n\t\t\tcase 'string':\n\n\t\t\t\treturn new StringController( this, object, property );\n\n\t\t\tcase 'function':\n\n\t\t\t\treturn new FunctionController( this, object, property );\n\n\t\t}\n\n\t\tconsole.error( `gui.add failed\n\tproperty:`, property, `\n\tobject:`, object, `\n\tvalue:`, initialValue );\n\n\t}\n\n\t/**\n\t * Adds a color controller to the GUI.\n\t * @example\n\t * params = {\n\t * \tcssColor: '#ff00ff',\n\t * \trgbColor: { r: 0, g: 0.2, b: 0.4 },\n\t * \tcustomRange: [ 0, 127, 255 ],\n\t * };\n\t *\n\t * gui.addColor( params, 'cssColor' );\n\t * gui.addColor( params, 'rgbColor' );\n\t * gui.addColor( params, 'customRange', 255 );\n\t *\n\t * @param {object} object The object the controller will modify.\n\t * @param {string} property Name of the property to control.\n\t * @param {number} rgbScale Maximum value for a color channel when using an RGB color. You may\n\t * need to set this to 255 if your colors are too bright.\n\t * @returns {Controller}\n\t */\n\taddColor( object, property, rgbScale = 1 ) {\n\t\treturn new ColorController( this, object, property, rgbScale );\n\t}\n\n\t/**\n\t * Adds a folder to the GUI, which is just another GUI. This method returns\n\t * the nested GUI so you can add controllers to it.\n\t * @example\n\t * const folder = gui.addFolder( 'Position' );\n\t * folder.add( position, 'x' );\n\t * folder.add( position, 'y' );\n\t * folder.add( position, 'z' );\n\t *\n\t * @param {string} title Name to display in the folder's title bar.\n\t * @returns {GUI}\n\t */\n\taddFolder( title ) {\n\t\tconst folder = new GUI( { parent: this, title } );\n\t\tif ( this.root._closeFolders ) folder.close();\n\t\treturn folder;\n\t}\n\n\t/**\n\t * Recalls values that were saved with `gui.save()`.\n\t * @param {object} obj\n\t * @param {boolean} recursive Pass false to exclude folders descending from this GUI.\n\t * @returns {this}\n\t */\n\tload( obj, recursive = true ) {\n\n\t\tif ( obj.controllers ) {\n\n\t\t\tthis.controllers.forEach( c => {\n\n\t\t\t\tif ( c instanceof FunctionController ) return;\n\n\t\t\t\tif ( c._name in obj.controllers ) {\n\t\t\t\t\tc.load( obj.controllers[ c._name ] );\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\tif ( recursive && obj.folders ) {\n\n\t\t\tthis.folders.forEach( f => {\n\n\t\t\t\tif ( f._title in obj.folders ) {\n\t\t\t\t\tf.load( obj.folders[ f._title ] );\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an object mapping controller names to values. The object can be passed to `gui.load()` to\n\t * recall these values.\n\t * @example\n\t * {\n\t * \tcontrollers: {\n\t * \t\tprop1: 1,\n\t * \t\tprop2: 'value',\n\t * \t\t...\n\t * \t},\n\t * \tfolders: {\n\t * \t\tfolderName1: { controllers, folders },\n\t * \t\tfolderName2: { controllers, folders }\n\t * \t\t...\n\t * \t}\n\t * }\n\t *\n\t * @param {boolean} recursive Pass false to exclude folders descending from this GUI.\n\t * @returns {object}\n\t */\n\tsave( recursive = true ) {\n\n\t\tconst obj = {\n\t\t\tcontrollers: {},\n\t\t\tfolders: {}\n\t\t};\n\n\t\tthis.controllers.forEach( c => {\n\n\t\t\tif ( c instanceof FunctionController ) return;\n\n\t\t\tif ( c._name in obj.controllers ) {\n\t\t\t\tthrow new Error( `Cannot save GUI with duplicate property \"${c._name}\"` );\n\t\t\t}\n\n\t\t\tobj.controllers[ c._name ] = c.save();\n\n\t\t} );\n\n\t\tif ( recursive ) {\n\n\t\t\tthis.folders.forEach( f => {\n\n\t\t\t\tif ( f._title in obj.folders ) {\n\t\t\t\t\tthrow new Error( `Cannot save GUI with duplicate folder \"${f._title}\"` );\n\t\t\t\t}\n\n\t\t\t\tobj.folders[ f._title ] = f.save();\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn obj;\n\n\t}\n\n\t/**\n\t * Opens a GUI or folder. GUI and folders are open by default.\n\t * @param {boolean} open Pass false to close.\n\t * @returns {this}\n\t * @example\n\t * gui.open(); // open\n\t * gui.open( false ); // close\n\t * gui.open( gui._closed ); // toggle\n\t */\n\topen( open = true ) {\n\n\t\tthis._setClosed( !open );\n\n\t\tthis.$title.setAttribute( 'aria-expanded', !this._closed );\n\t\tthis.domElement.classList.toggle( 'closed', this._closed );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Closes the GUI.\n\t * @returns {this}\n\t */\n\tclose() {\n\t\treturn this.open( false );\n\t}\n\n\t_setClosed( closed ) {\n\t\tif ( this._closed === closed ) return;\n\t\tthis._closed = closed;\n\t\tthis._callOnOpenClose( this );\n\t}\n\n\t/**\n\t * Shows the GUI after it's been hidden.\n\t * @param {boolean} show\n\t * @returns {this}\n\t * @example\n\t * gui.show();\n\t * gui.show( false ); // hide\n\t * gui.show( gui._hidden ); // toggle\n\t */\n\tshow( show = true ) {\n\n\t\tthis._hidden = !show;\n\n\t\tthis.domElement.style.display = this._hidden ? 'none' : '';\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Hides the GUI.\n\t * @returns {this}\n\t */\n\thide() {\n\t\treturn this.show( false );\n\t}\n\n\topenAnimated( open = true ) {\n\n\t\t// set state immediately\n\t\tthis._setClosed( !open );\n\n\t\tthis.$title.setAttribute( 'aria-expanded', !this._closed );\n\n\t\t// wait for next frame to measure $children\n\t\trequestAnimationFrame( () => {\n\n\t\t\t// explicitly set initial height for transition\n\t\t\tconst initialHeight = this.$children.clientHeight;\n\t\t\tthis.$children.style.height = initialHeight + 'px';\n\n\t\t\tthis.domElement.classList.add( 'transition' );\n\n\t\t\tconst onTransitionEnd = e => {\n\t\t\t\tif ( e.target !== this.$children ) return;\n\t\t\t\tthis.$children.style.height = '';\n\t\t\t\tthis.domElement.classList.remove( 'transition' );\n\t\t\t\tthis.$children.removeEventListener( 'transitionend', onTransitionEnd );\n\t\t\t};\n\n\t\t\tthis.$children.addEventListener( 'transitionend', onTransitionEnd );\n\n\t\t\t// todo: this is wrong if children's scrollHeight makes for a gui taller than maxHeight\n\t\t\tconst targetHeight = !open ? 0 : this.$children.scrollHeight;\n\n\t\t\tthis.domElement.classList.toggle( 'closed', !open );\n\n\t\t\trequestAnimationFrame( () => {\n\t\t\t\tthis.$children.style.height = targetHeight + 'px';\n\t\t\t} );\n\n\t\t} );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Change the title of this GUI.\n\t * @param {string} title\n\t * @returns {this}\n\t */\n\ttitle( title ) {\n\t\t/**\n\t\t * Current title of the GUI. Use `gui.title( 'Title' )` to modify this value.\n\t\t * @type {string}\n\t\t */\n\t\tthis._title = title;\n\t\tthis.$title.textContent = title;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets all controllers to their initial values.\n\t * @param {boolean} recursive Pass false to exclude folders descending from this GUI.\n\t * @returns {this}\n\t */\n\treset( recursive = true ) {\n\t\tconst controllers = recursive ? this.controllersRecursive() : this.controllers;\n\t\tcontrollers.forEach( c => c.reset() );\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pass a function to be called whenever a controller in this GUI changes.\n\t * @param {function({object:object, property:string, value:any, controller:Controller})} callback\n\t * @returns {this}\n\t * @example\n\t * gui.onChange( event => {\n\t * \tevent.object // object that was modified\n\t * \tevent.property // string, name of property\n\t * \tevent.value // new value of controller\n\t * \tevent.controller // controller that was modified\n\t * } );\n\t */\n\tonChange( callback ) {\n\t\t/**\n\t\t * Used to access the function bound to `onChange` events. Don't modify this value\n\t\t * directly. Use the `gui.onChange( callback )` method instead.\n\t\t * @type {Function}\n\t\t */\n\t\tthis._onChange = callback;\n\t\treturn this;\n\t}\n\n\t_callOnChange( controller ) {\n\n\t\tif ( this.parent ) {\n\t\t\tthis.parent._callOnChange( controller );\n\t\t}\n\n\t\tif ( this._onChange !== undefined ) {\n\t\t\tthis._onChange.call( this, {\n\t\t\t\tobject: controller.object,\n\t\t\t\tproperty: controller.property,\n\t\t\t\tvalue: controller.getValue(),\n\t\t\t\tcontroller\n\t\t\t} );\n\t\t}\n\t}\n\n\t/**\n\t * Pass a function to be called whenever a controller in this GUI has finished changing.\n\t * @param {function({object:object, property:string, value:any, controller:Controller})} callback\n\t * @returns {this}\n\t * @example\n\t * gui.onFinishChange( event => {\n\t * \tevent.object // object that was modified\n\t * \tevent.property // string, name of property\n\t * \tevent.value // new value of controller\n\t * \tevent.controller // controller that was modified\n\t * } );\n\t */\n\tonFinishChange( callback ) {\n\t\t/**\n\t\t * Used to access the function bound to `onFinishChange` events. Don't modify this value\n\t\t * directly. Use the `gui.onFinishChange( callback )` method instead.\n\t\t * @type {Function}\n\t\t */\n\t\tthis._onFinishChange = callback;\n\t\treturn this;\n\t}\n\n\t_callOnFinishChange( controller ) {\n\n\t\tif ( this.parent ) {\n\t\t\tthis.parent._callOnFinishChange( controller );\n\t\t}\n\n\t\tif ( this._onFinishChange !== undefined ) {\n\t\t\tthis._onFinishChange.call( this, {\n\t\t\t\tobject: controller.object,\n\t\t\t\tproperty: controller.property,\n\t\t\t\tvalue: controller.getValue(),\n\t\t\t\tcontroller\n\t\t\t} );\n\t\t}\n\t}\n\n\t/**\n\t * Pass a function to be called when this GUI or its descendants are opened or closed.\n\t * @param {function(GUI)} callback\n\t * @returns {this}\n\t * @example\n\t * gui.onOpenClose( changedGUI => {\n\t * \tconsole.log( changedGUI._closed );\n\t * } );\n\t */\n\tonOpenClose( callback ) {\n\t\tthis._onOpenClose = callback;\n\t\treturn this;\n\t}\n\n\t_callOnOpenClose( changedGUI ) {\n\t\tif ( this.parent ) {\n\t\t\tthis.parent._callOnOpenClose( changedGUI );\n\t\t}\n\n\t\tif ( this._onOpenClose !== undefined ) {\n\t\t\tthis._onOpenClose.call( this, changedGUI );\n\t\t}\n\t}\n\n\t/**\n\t * Destroys all DOM elements and event listeners associated with this GUI.\n\t */\n\tdestroy() {\n\n\t\tif ( this.parent ) {\n\t\t\tthis.parent.children.splice( this.parent.children.indexOf( this ), 1 );\n\t\t\tthis.parent.folders.splice( this.parent.folders.indexOf( this ), 1 );\n\t\t}\n\n\t\tif ( this.domElement.parentElement ) {\n\t\t\tthis.domElement.parentElement.removeChild( this.domElement );\n\t\t}\n\n\t\tArray.from( this.children ).forEach( c => c.destroy() );\n\n\t}\n\n\t/**\n\t * Returns an array of controllers contained by this GUI and its descendents.\n\t * @returns {Controller[]}\n\t */\n\tcontrollersRecursive() {\n\t\tlet controllers = Array.from( this.controllers );\n\t\tthis.folders.forEach( f => {\n\t\t\tcontrollers = controllers.concat( f.controllersRecursive() );\n\t\t} );\n\t\treturn controllers;\n\t}\n\n\t/**\n\t * Returns an array of folders contained by this GUI and its descendents.\n\t * @returns {GUI[]}\n\t */\n\tfoldersRecursive() {\n\t\tlet folders = Array.from( this.folders );\n\t\tthis.folders.forEach( f => {\n\t\t\tfolders = folders.concat( f.foldersRecursive() );\n\t\t} );\n\t\treturn folders;\n\t}\n\n}\n\nexport default GUI;\nexport { BooleanController, ColorController, Controller, FunctionController, GUI, NumberController, OptionController, StringController };\n", "import type GUI from 'lil-gui';\nimport type { Coordinate, Label, MapData } from '../../';\nimport { normalizeColor } from './utils';\nimport type { MapView } from '../../map-view';\nimport { createIsInViewHandler } from './interaction-control';\n\nexport function createLabelControls(labelFolder: GUI, _mapData: MapData, mapView: MapView) {\n\tconst state = {\n\t\tlabels: {} as { [id: string]: Label },\n\t\tall() {\n\t\t\tconst labels = mapView.Labels.all();\n\t\t\tlabels.forEach(l => {\n\t\t\t\tthis.labels[l.id] = l;\n\t\t\t});\n\t\t\trenderLabels();\n\t\t},\n\t\tremoveAllLabels() {\n\t\t\tconst removed = mapView.Labels.removeAll();\n\t\t\tremoved.forEach(l => {\n\t\t\t\tdelete this.labels[l.id];\n\t\t\t});\n\t\t\trenderLabels();\n\t\t},\n\t};\n\tconst { addLabel, destroy } = createAddControl(labelFolder, mapView);\n\n\tlabelFolder.add(state, 'all');\n\tlabelFolder.add(state, 'removeAllLabels');\n\tlet labelsListFolder = labelFolder.addFolder('Label List');\n\n\tlabelFolder.close();\n\n\tconst labelGuiMap = new Map<string, GUI>();\n\tconst { rerender: renderLabels } = createLabelControls();\n\tfunction createLabelControls() {\n\t\tfunction remove(label: Label) {\n\t\t\tdelete state.labels[label.id];\n\t\t\tlabelGuiMap.get(label.id)?.destroy();\n\t\t}\n\t\tfunction add(label: Label) {\n\t\t\tconst control = addLabelControlToFolder(mapView, label, labelsListFolder, {\n\t\t\t\tonRemove: l => {\n\t\t\t\t\tremove(l);\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!control) return;\n\t\t\tconst { labelItemFolder } = control;\n\t\t\tlabelGuiMap.set(label.id, labelItemFolder);\n\t\t}\n\t\tfunction rerender() {\n\t\t\tlabelsListFolder.destroy();\n\t\t\tlabelsListFolder = labelFolder.addFolder('Label');\n\t\t\tfor (const k in state.labels) {\n\t\t\t\tconst item = state.labels[k];\n\t\t\t\tadd(item);\n\t\t\t}\n\t\t}\n\n\t\treturn { rerender, add, remove };\n\t}\n\tlabelFolder.domElement.classList.add('list-items');\n\tlet lastLabelControl: GUI;\n\tmapView.on('click', ({ labels, coordinate }) => {\n\t\tif (labelFolder._closed) return;\n\t\tif (labels[0]) {\n\t\t\tlastLabelControl?.close();\n\t\t\tconst control = labelGuiMap.get(labels[0].id);\n\t\t\tlabelFolder.open();\n\t\t\tif (!control) return;\n\t\t\tcontrol?.open();\n\t\t\tcontrol?.domElement.scrollIntoView({\n\t\t\t\tblock: 'start',\n\t\t\t});\n\t\t\tcontrol?.domElement.focus();\n\t\t\tlastLabelControl = control;\n\t\t} else {\n\t\t\taddLabel(coordinate);\n\t\t}\n\t});\n\n\tfunction populatelabels(labels: Label[]) {\n\t\tfor (const label of labels) {\n\t\t\tstate.labels[label.id] = label;\n\t\t}\n\t\trenderLabels();\n\t}\n\n\treturn {\n\t\tpopulatelabels,\n\t\tdestroy() {\n\t\t\tdestroy();\n\t\t},\n\t};\n}\n\nexport function addLabelControlToFolder(\n\tmapView: MapView,\n\tentity: Label,\n\tparent: GUI,\n\t{ onRemove }: { onRemove?: (removed: Label) => void } = {},\n) {\n\tconst labelItemFolder = parent.addFolder(`${entity.text?.substring(0, 12)}`);\n\tlabelItemFolder.onChange(_ => {\n\t\tmapView.updateState(entity, {\n\t\t\tappearance: uiState.appearance as any,\n\t\t\tinteractive: uiState.interactive,\n\t\t});\n\t});\n\tlabelItemFolder.close();\n\n\tconst state = mapView.getState(entity);\n\tif (state?.type !== 'label') throw new Error(`error getting state for label: ${entity.id}`);\n\tconst { appearance, interactive } = state;\n\tif (!appearance || appearance.margin == null || interactive == null) throw new Error('incomplte label state');\n\tconst uiState = {\n\t\ttext: entity.text,\n\t\tinteractive,\n\t\tappearance: {\n\t\t\t...appearance,\n\t\t\tmargin: appearance.margin || 0,\n\t\t\tmarker: {\n\t\t\t\tforegroundColor: appearance.marker?.foregroundColor?.active\n\t\t\t\t\t? normalizeColor(appearance.marker.foregroundColor?.active)\n\t\t\t\t\t: 'black',\n\t\t\t},\n\t\t\ttext: { foregroundColor: normalizeColor(appearance.text!.foregroundColor!) },\n\t\t},\n\t\tremove() {\n\t\t\tmapView.Labels.remove(entity);\n\t\t\tonRemove?.(entity);\n\t\t\tlabelItemFolder.destroy();\n\t\t},\n\t\tisInView: createIsInViewHandler(mapView, entity.id),\n\t};\n\tlabelItemFolder.add(uiState.appearance, 'margin', 0, 20).name('margin');\n\tlabelItemFolder.add(uiState, 'text');\n\tlabelItemFolder.add(uiState, 'interactive');\n\tlabelItemFolder.addColor(uiState.appearance.marker, 'foregroundColor').name('marker foreground');\n\tlabelItemFolder.addColor(uiState.appearance.text, 'foregroundColor').name('text forground');\n\t// labelControlFolder.add(uiState, 'focus');\n\tlabelItemFolder.add(uiState, 'isInView');\n\tlabelItemFolder.add(uiState, 'remove');\n\n\treturn {\n\t\tlabelItemFolder,\n\t\tdestroy() {\n\t\t\tlabelItemFolder.destroy();\n\t\t},\n\t};\n}\n\nfunction createAddControl(labelFolder: GUI, mapView: MapView) {\n\tconst addFolder = labelFolder.addFolder('Add');\n\tconst state = {\n\t\tonClick: false,\n\t\tmargin: 0,\n\t\ttext: 'New Label!',\n\t\tinteractive: true,\n\t\tmarginForegroundColor: normalizeColor('skyblue'),\n\t\tmarginBackgroundColor: normalizeColor('coral'),\n\t\ttextForegroundColor: normalizeColor('slategray'),\n\t\ttextBackgroundColor: normalizeColor('white'),\n\t};\n\n\taddFolder.add(state, 'onClick');\n\taddFolder.add(state, 'margin');\n\taddFolder.add(state, 'interactive');\n\taddFolder.add(state, 'text');\n\taddFolder.addColor(state, 'marginForegroundColor');\n\taddFolder.addColor(state, 'marginBackgroundColor');\n\taddFolder.addColor(state, 'textForegroundColor');\n\taddFolder.addColor(state, 'textBackgroundColor');\n\n\treturn {\n\t\tdestroy() {\n\t\t\taddFolder.destroy();\n\t\t},\n\t\taddLabel(coordinate: Coordinate) {\n\t\t\tif (addFolder._closed || !state.onClick) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst label = mapView.Labels.add(coordinate, state.text, {\n\t\t\t\tappearance: {\n\t\t\t\t\tmargin: state.margin,\n\t\t\t\t\tmarker: {\n\t\t\t\t\t\tforegroundColor: { active: state.marginForegroundColor, inactive: state.marginForegroundColor },\n\t\t\t\t\t\tbackgroundColor: { active: state.marginBackgroundColor, inactive: state.marginBackgroundColor },\n\t\t\t\t\t},\n\t\t\t\t\ttext: {\n\t\t\t\t\t\tforegroundColor: state.textForegroundColor,\n\t\t\t\t\t\tbackgroundColor: state.marginBackgroundColor,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tinteractive: state.interactive,\n\t\t\t});\n\n\t\t\treturn label;\n\t\t},\n\t};\n}\n", "import { Color } from 'three';\nimport type { MapView } from '../../map-view';\nimport type GUI from 'lil-gui';\n\nexport const normalizeColor = (() => {\n\tconst color = new Color();\n\n\treturn function normalize(c: string) {\n\t\tcolor.set(c);\n\n\t\treturn `#${color.getHexString()}`;\n\t};\n})();\n\nexport function noop() {}\n\nexport function runAll(fns: (() => void)[]) {\n\tlet fn: () => void;\n\tfor (fn of fns) {\n\t\tfn();\n\t}\n}\n\nexport function updateCurrentUrlParamsWithNamespace(params: Record<string, any>, namespace: string) {\n\tconst currentUrl = window.location.href;\n\tconst urlObj = new URL(currentUrl);\n\tconst searchParams = new URLSearchParams(urlObj.search);\n\n\t// Append namespace to each parameter key\n\tfor (const key in params) {\n\t\tif (params.hasOwnProperty(key)) {\n\t\t\tconst namespacedKey = `${namespace}.${key}`;\n\t\t\tsearchParams.set(namespacedKey, params[key]);\n\t\t}\n\t}\n\n\turlObj.search = searchParams.toString();\n\thistory.pushState({ path: urlObj.toString() }, '', urlObj.toString());\n}\n\nexport function getUrlParamsWithNamespace(namespace: string, state?: Record<string, any>) {\n\tconst searchParams = new URLSearchParams(window.location.search);\n\tconst params: any = {};\n\n\t// Extract only parameters that start with the specified namespace\n\tfor (const [key, value] of searchParams) {\n\t\tif (key.startsWith(`${namespace}.`)) {\n\t\t\tconst actualKey = key.slice(namespace.length + 1);\n\t\t\tif (value === 'true' || value === 'false') {\n\t\t\t\tparams[actualKey] = value === 'true';\n\t\t\t} else if (typeof state?.[actualKey] === 'number') {\n\t\t\t\tparams[actualKey] = Number(value);\n\t\t\t} else {\n\t\t\t\tparams[actualKey] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { namespace, params };\n}\n\nconst propToRender = ['interactive'];\n/**\n * Should support rendering and controlling most state props\n */\nexport function renderByProp(\n\tmapView: MapView,\n\tstate: { id: string; type: string; isInView?: () => void; [key: string]: any },\n\tparentGui: GUI,\n) {\n\tconst itemFolder = parentGui.addFolder(`${state.type}-${state.id}`);\n\tfor (const prop in state) {\n\t\tif (prop === 'visible') {\n\t\t\titemFolder.add(state, prop).onChange(v => {\n\t\t\t\tmapView.updateState(state.id, { [prop]: v });\n\t\t\t});\n\t\t}\n\t\tif (prop === 'color' || prop === 'hoverColor') {\n\t\t\tstate[prop] = normalizeColor(state[prop]);\n\t\t\titemFolder.addColor(state, prop).onChange(c => {\n\t\t\t\tmapView.updateState(state.id, { [prop]: c });\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (prop === 'height') {\n\t\t\titemFolder.add(state, prop, 0, 20, 1).onChange(c => {\n\t\t\t\tmapView.updateState(state.id, { [prop as any]: c });\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (prop === 'texture' && state['texture']) {\n\t\t\tconst tFolder = itemFolder.addFolder('Texture - side');\n\t\t\ttFolder.add(state, 'texture')?.onChange(c => {\n\t\t\t\tmapView.updateState(state.id, {\n\t\t\t\t\ttexture: {\n\t\t\t\t\t\turl: c,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (prop === 'topTexture' && state['topTexture']) {\n\t\t\tconst tFolderTop = itemFolder.addFolder('Texture - top');\n\t\t\ttFolderTop.add(state, 'topTexture')?.onChange(c => {\n\t\t\t\tmapView.updateState(state.id, {\n\t\t\t\t\ttopTexture: {\n\t\t\t\t\t\turl: c,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcontinue;\n\t\t}\n\t\tif (prop === 'opacity') {\n\t\t\titemFolder.add(state, prop, 0, 1, 0.1).onChange(c => {\n\t\t\t\tmapView.updateState(state.id, { [prop as any]: c });\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (prop === 'altitude') {\n\t\t\titemFolder.add(state, prop, 0, 100, 1).onChange(c => {\n\t\t\t\tmapView.updateState(state.id, { [prop as any]: c });\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (propToRender.includes(prop)) {\n\t\t\titemFolder.add(state, prop).onChange(v => {\n\t\t\t\tmapView.updateState(state.id, { [prop]: v });\n\t\t\t});\n\t\t}\n\t}\n\tif (state.isInView) {\n\t\titemFolder.add(state, 'isInView').listen().disable();\n\t\titemFolder.add(state, 'isInViewCheck');\n\t}\n\n\treturn {\n\t\tcleanup() {\n\t\t\titemFolder.destroy();\n\t\t},\n\t};\n}\n", "import type GUI from 'lil-gui';\nimport { addLabelControlToFolder } from './labels-control';\nimport { normalizeColor, renderByProp } from './utils';\nimport type { MapView } from '../../map-view';\nimport { highlightControl } from './highlight';\nimport { PubSub } from '@packages/internal/common';\nimport type { TClickPayload, TEvents } from '../../events';\nimport { EnterpriseLocation, Space } from '../../map-data-objects';\nimport { createSearchControl } from './search-control';\nimport type MapData from '../../map-data';\n\nexport function createInteractionControls(mapView: MapView, mapData: MapData, parent: GUI) {\n\tparent.domElement.id = 'interactionPanel';\n\n\tlet cleanup: (() => void)[] = [];\n\n\tconst { pubsub: searchPubsub } = createSearchControl(mapView, mapData, parent);\n\tsearchPubsub.on('highlight', item => {\n\t\tif (item) {\n\t\t\tcleanup.forEach(fn => fn());\n\t\t\tcleanup = [];\n\t\t\tconst space = item instanceof EnterpriseLocation ? item.spaces[0] : (item as any);\n\t\t\tmapView.Camera.focusOn(item);\n\t\t\tif (space && !Space.is(space)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcleanup.push(highlightControl.highlightCard(mapView, space, { focus: true }));\n\t\t} else {\n\t\t\tcleanup.forEach(fn => fn());\n\t\t\tcleanup = [];\n\t\t}\n\t});\n\n\tconst clickFolder = parent.addFolder('Click \uD83D\uDC47').close();\n\tconst { sub: clickSub } = createClickControls(mapView, clickFolder);\n\tclickSub.on('click', payload => {\n\t\tcleanup.forEach(fn => fn());\n\t\tcleanup = [];\n\t\tif (payload.spaces[0]) {\n\t\t\tcleanup = [highlightControl.highlightCard(mapView, payload.spaces[0])];\n\t\t}\n\t});\n\n\tconst hoverFolder = parent.addFolder('Hover \uD83D\uDE81').close();\n\tconst { sub: hoverSub } = createHoverControls(mapView, hoverFolder);\n\tlet hoverCleanup: (() => void) | undefined;\n\thoverSub.on('hover', payload => {\n\t\tif (payload.spaces[0]) {\n\t\t\thoverCleanup?.();\n\t\t\tif (cleanup.length === 0) {\n\t\t\t\thoverCleanup = highlightControl.highlightCard(mapView, payload.spaces[0]);\n\t\t\t}\n\t\t} else {\n\t\t\thoverCleanup?.();\n\t\t\thoverCleanup = undefined;\n\t\t}\n\t});\n}\n\nfunction createClickControls(mapView: MapView, clickFolder: GUI) {\n\tconst sub = new PubSub<{ click: TClickPayload }>();\n\tconst state = { position: '', hoverColor: normalizeColor(mapView.getHoverColor()!) };\n\tconst positionControl = clickFolder.add(state, 'position').disable();\n\n\tconst cleanups: (() => void)[] = [];\n\tfunction reset() {\n\t\tcleanups.forEach(fn => fn());\n\t\tcleanups.length = 0;\n\t}\n\n\tlet intervalId: NodeJS.Timeout = 0 as any;\n\tmapView.on('click', payload => {\n\t\tconst { labels, markers, coordinate } = payload;\n\t\treset();\n\t\tsub.publish('click', payload);\n\t\tclearInterval(intervalId);\n\t\tpositionControl.load(JSON.stringify([coordinate.longitude, coordinate.latitude]));\n\t\tconst entity2D = labels[0] || markers[0];\n\t\tif (entity2D) {\n\t\t\tconst labelControl = addLabelControlToFolder(mapView, entity2D, clickFolder);\n\t\t\tif (!labelControl) return;\n\t\t\tcleanups.push(labelControl.destroy);\n\t\t\tlabelControl.labelItemFolder.openAnimated();\n\t\t}\n\t\tconst geometryDataObject = payload.spaces[0] ?? payload.objects[0];\n\t\tif (geometryDataObject) {\n\t\t\tconst state = {\n\t\t\t\tid: geometryDataObject.id,\n\t\t\t\t...mapView.getState(geometryDataObject.id),\n\t\t\t\ttype: geometryDataObject.type,\n\t\t\t\tisInView: false,\n\t\t\t\tisInViewCheck: createIsInViewHandler(mapView, geometryDataObject.id),\n\t\t\t};\n\t\t\tconst { cleanup } = renderByProp(mapView, state as any, clickFolder);\n\t\t\tintervalId = setInterval(() => {\n\t\t\t\tstate.isInView = mapView.isInView(entity2D || geometryDataObject);\n\t\t\t}, 500);\n\n\t\t\tcleanups.push(cleanup);\n\t\t}\n\t\t// if ((payload as any).geometryId) {\n\t\t// console.log('geometryId', geometryId);\n\t\t// const { cleanup } = renderByProp(mapView, mapView.getState((payload as any).geometryId), clickFolder);\n\t\t// cleanups.push(cleanup);\n\t\t// }\n\t});\n\n\treturn { sub };\n}\n\nfunction createHoverControls(mapView: MapView, parent: GUI) {\n\tconst sub = new PubSub<{ hover: TEvents['hover'] }>();\n\tmapView.setHoverColor('#1f3a7a');\n\tconst state = {\n\t\tposition: '',\n\t\thoverColor: normalizeColor(mapView.getHoverColor()!),\n\t\tintersected: '',\n\t\ttype: '',\n\t\tid: '',\n\t};\n\tconst positionControl = parent.add(state, 'position').disable();\n\t// const intersectedControl = parent.add(state, 'intersected').disable();\n\tparent.add(state, 'id').disable().listen();\n\tparent.add(state, 'type').disable().listen();\n\tparent.addColor(state, 'hoverColor').onChange(c => {\n\t\tmapView.setHoverColor(c);\n\t});\n\tconst cleanups: (() => void)[] = [];\n\tfunction reset() {\n\t\tcleanups.forEach(fn => fn());\n\t\tcleanups.length = 0;\n\t}\n\n\tmapView.on('hover', hoverState => {\n\t\tconst { coordinate, spaces, objects, markers, labels } = hoverState;\n\t\treset();\n\t\tsub.publish('hover', hoverState);\n\t\tpositionControl.load(JSON.stringify([coordinate.longitude, coordinate.latitude]));\n\t\tconst entity = spaces[0] ?? objects[0] ?? markers[0] ?? labels[0];\n\t\tif (!entity) return;\n\t\tconst s = mapView.getState(entity);\n\t\tif (!s) return;\n\t\tstate.type = s.type;\n\t\tstate.id = entity.id;\n\t});\n\n\treturn { sub };\n}\n\nexport function createIsInViewHandler(mapView: MapView, id: string) {\n\treturn function isInView() {\n\t\t// eslint-disable-next-line\n\t\tconsole.log('isInView', mapView.isInView(id));\n\t};\n}\n", "import GUI from 'lil-gui';\nimport type { Places } from '../../map-data-objects';\nimport { EnterpriseCategory, EnterpriseLocation, Space } from '../../map-data-objects';\nimport type { MapView } from '../../map-view';\nimport type { Marker } from '../../map-view-objects';\nimport type { TFocusOnOptions } from '../../types';\nimport { renderByProp } from './utils';\n\nfunction createHighlightControl() {\n\tconst lastMarkers: Marker[] = [];\n\n\tfunction getHighlightTarget(mapView: MapView, item: EnterpriseLocation | EnterpriseCategory | Places) {\n\t\tconst mapData = Object.values(mapView.getMapData())[0];\n\n\t\tlet target = item;\n\t\tif (target && Space.is(target)) {\n\t\t\tconst foundLocation = mapData.getByType('enterprise-location')?.find(l => l.spaces.some(s => s.id === target.id));\n\t\t\tif (foundLocation) {\n\t\t\t\ttarget = foundLocation;\n\t\t\t}\n\t\t}\n\n\t\treturn target;\n\t}\n\n\tasync function focusOn(mapView: MapView, target: EnterpriseLocation | EnterpriseCategory | Places) {\n\t\tif (target instanceof EnterpriseCategory) {\n\t\t\treturn mapView.Camera.focusOn(\n\t\t\t\ttarget.locations.flatMap(l => l.spaces),\n\t\t\t\tfocusOnOptions,\n\t\t\t);\n\t\t} else if (target instanceof EnterpriseLocation) {\n\t\t\treturn mapView.Camera.focusOn(target.spaces, focusOnOptions);\n\t\t} else {\n\t\t\treturn mapView.Camera.focusOn(target, focusOnOptions);\n\t\t}\n\t}\n\tfunction highlightCard(\n\t\tmapView: MapView,\n\t\titem: EnterpriseLocation | EnterpriseCategory | Places,\n\t\t{ focus = false }: { focus?: boolean } = {},\n\t) {\n\t\tif (!(window as any).enableHighlightCard) {\n\t\t\treturn () => {};\n\t\t}\n\t\tconst target = getHighlightTarget(mapView, item);\n\t\tconst card = document.createElement('div');\n\t\tcard.style.cssText = `\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 20px;\n\t\t\t\tleft: 20px;\n\t\t\t\tbackground-color: rgba(30, 30, 30, 0.95);\n\t\t\t\tbox-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n\t\t\t\tborder-radius: 12px;\n\t\t\t\tpadding: 24px;\n\t\t\t\tmax-width: 320px;\n\t\t\t\tz-index: 1000;\n\t\t\t\tfont-family: 'Arial', sans-serif;\n\t\t\t\ttransition: all 0.3s ease;\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t`;\n\n\t\tif ('name' in target) {\n\t\t\tconst title = document.createElement('h3');\n\t\t\ttitle.textContent = target.name;\n\t\t\ttitle.style.cssText = `\n\t\t\t\tmargin: 0 0 16px;\n\t\t\t\tfont-size: 22px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: #ffffff;\n\t\t\t\tletter-spacing: -0.5px;\n\t\t\t`;\n\t\t\tcard.appendChild(title);\n\t\t}\n\n\t\tif (target instanceof EnterpriseLocation) {\n\t\t\tif (target.description) {\n\t\t\t\tconst description = document.createElement('p');\n\t\t\t\tdescription.textContent = target.description;\n\t\t\t\tdescription.style.cssText = `\n\t\t\t\t\tmargin: 0 0 16px;\n\t\t\t\t\tfont-size: 14px;\n\t\t\t\t\tcolor: #b0b0b0;\n\t\t\t\t\tline-height: 1.5;\n\t\t\t\t`;\n\t\t\t\tcard.appendChild(description);\n\t\t\t}\n\n\t\t\tif (target.tags && target.tags.length > 0) {\n\t\t\t\tconst tagsContainer = document.createElement('div');\n\t\t\t\ttagsContainer.style.cssText = `\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-wrap: nowrap;\n\t\t\t\t\tgap: 8px;\n\t\t\t\t\tmargin-bottom: 16px;\n\t\t\t\t\toverflow-x: hidden;\n\t\t\t\t\tmax-height: 30px; /* Adjust this value based on your font size and padding */\n\t\t\t\t`;\n\t\t\t\ttarget.tags.forEach(tag => {\n\t\t\t\t\tconst tagElement = document.createElement('span');\n\t\t\t\t\ttagElement.textContent = tag;\n\t\t\t\t\ttagElement.style.cssText = `\n\t\t\t\t\t\tbackground-color: #3a3a3a;\n\t\t\t\t\t\tcolor: #e0e0e0;\n\t\t\t\t\t\tpadding: 6px 12px;\n\t\t\t\t\t\tborder-radius: 16px;\n\t\t\t\t\t\tfont-size: 12px;\n\t\t\t\t\t\tfont-weight: 500;\n\t\t\t\t\t\ttext-transform: uppercase;\n\t\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t\t`;\n\t\t\t\t\ttagsContainer.appendChild(tagElement);\n\t\t\t\t});\n\t\t\t\tcard.appendChild(tagsContainer);\n\t\t\t}\n\t\t}\n\n\t\tlet controls;\n\t\tif (!(item instanceof EnterpriseCategory)) {\n\t\t\tconst gui = new GUI({ autoPlace: false });\n\t\t\tgui.domElement.style.cssText = `\n\t\t\t\t\tposition: relative;\n\t\t\t\t\toverflow-y: auto;\n\t\t\t\t\tmargin-top: 16px;\n\t\t\t\t\tborder-top: 1px solid #444;\n\t\t\t\t\tpadding-top: 16px;\n\t\t\t\t`;\n\t\t\tconst state = mapView.getState(item as any);\n\t\t\tif (state) {\n\t\t\t\trenderByProp(mapView, { id: item.id, ...(state as any) }, gui);\n\t\t\t\tcard.appendChild(gui.domElement);\n\t\t\t}\n\t\t\tcontrols = gui;\n\t\t}\n\n\t\tdocument.body.appendChild(card);\n\t\tif (focus) {\n\t\t\tfocusOn(mapView, target);\n\t\t}\n\n\t\treturn () => {\n\t\t\tcard.style.opacity = '0';\n\t\t\tcard.style.transform = 'translateY(-10px)';\n\t\t\tsetTimeout(() => card.remove(), 300);\n\t\t\tcontrols?.destroy();\n\t\t};\n\t}\n\n\treturn {\n\t\thighlightCard,\n\t\thighlight: (\n\t\t\tmapView: MapView,\n\t\t\titem: EnterpriseLocation | EnterpriseCategory | Places,\n\t\t\t{ focus = true }: { focus?: boolean } = {},\n\t\t) => {\n\t\t\tif (lastMarkers.length > 0) {\n\t\t\t\tlastMarkers.forEach(marker => mapView.Markers.remove(marker));\n\t\t\t}\n\n\t\t\tconst target = getHighlightTarget(mapView, item);\n\n\t\t\tif (target instanceof EnterpriseLocation) {\n\t\t\t\tif (focus) mapView.Camera.focusOn(target.spaces, focusOnOptions);\n\t\t\t\tlastMarkers.push(\n\t\t\t\t\t...target.spaces.map(space =>\n\t\t\t\t\t\tmapView.Markers.add(\n\t\t\t\t\t\t\tspace,\n\t\t\t\t\t\t\t`<div style=\"padding: 15px; background-color: #ffffff; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); max-width: 250px; position: relative;\">\n\t\t\t\t\t\t\t<h3 style=\"margin: 0 0 10px; color: #333; font-size: 16px; font-weight: 600;\">${target.name}</h3>\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\ttarget.description\n\t\t\t\t\t\t\t\t\t? `<p style=\"margin: 0 0 10px; color: #666; font-size: 14px; font-weight: 400;\">${target.description}</p>`\n\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\ttarget.tags\n\t\t\t\t\t\t\t\t\t? target.tags\n\t\t\t\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t\t\t\ttag =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t`<span style=\"display: inline-block; padding: 3px 8px; background-color: #e0f2f1; color: #00796b; border-radius: 12px; font-size: 12px;\">${tag}</span>`,\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t.join(' ')\n\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t<div style=\"position: absolute; bottom: -10px; left: 50%; transform: translateX(-50%); width: 0; height: 0; border-left: 10px solid transparent; border-right: 10px solid transparent; border-top: 10px solid #ffffff;\"></div>\n\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t\t{ rank: 'always-visible', anchor: 'top' },\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t} else if (target instanceof EnterpriseCategory) {\n\t\t\t\tif (focus) {\n\t\t\t\t\tmapView.Camera.focusOn(\n\t\t\t\t\t\ttarget.locations.flatMap(l => l.spaces),\n\t\t\t\t\t\tfocusOnOptions,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst locationMarkers = new Map();\n\t\t\t\tconst coordinateNames = new Set();\n\t\t\t\ttarget.locations.forEach(location => {\n\t\t\t\t\tif (!locationMarkers.has(location.name)) {\n\t\t\t\t\t\tlocation.spaces.forEach(space => {\n\t\t\t\t\t\t\tlastMarkers.push(\n\t\t\t\t\t\t\t\tmapView.Markers.add(\n\t\t\t\t\t\t\t\t\tspace,\n\t\t\t\t\t\t\t\t\t`<div style=\"padding: 12px; background-color: rgba(0, 153, 51, 0.95); border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.3); transform: translateY(-4px); transition: all 0.3s ease;\">\n\t\t\t\t\t\t\t\t\t<span style=\"font-weight: 600; color: #FFFFFF; font-size: 16px; text-shadow: 1px 1px 2px rgba(0,0,0,0.2);\">${location.name}</span>\n\t\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\trank: 'always-visible',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tlocationMarkers.set(location.name, true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttarget.locations.forEach(location => {\n\t\t\t\t\tlocation.coordinates.forEach(space => {\n\t\t\t\t\t\tconst key = `${space.latitude},${space.longitude}`;\n\t\t\t\t\t\tif (!coordinateNames.has(key) && !locationMarkers.has(location.name)) {\n\t\t\t\t\t\t\tconst marker = mapView.Markers.add(\n\t\t\t\t\t\t\t\tspace,\n\t\t\t\t\t\t\t\t`<div style=\"padding: 10px; background-color: rgba(51, 102, 204, 0.9); border-radius: 6px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);\">\n\t\t\t\t\t\t\t\t<span style=\"font-weight: 500; color: #FFFFFF; font-size: 16px;\">${location.name}</span>\n\t\t\t\t\t\t\t\t<br>\n\t\t\t\t\t\t\t\t<span style=\"color: #FFFFFF; font-size: 12px; font-weight: 400;\">Node</span>\n\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\trank: 'always-visible',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcoordinateNames.add(key);\n\t\t\t\t\t\t\tlastMarkers.push(marker);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// mapView.Camera.focusOn(target, focusOnOptions);\n\t\t\t}\n\n\t\t\treturn () => {\n\t\t\t\tlastMarkers.forEach(marker => mapView.Markers.remove(marker));\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst focusOnOptions: TFocusOnOptions = {\n\tduration: 300,\n\teasing: 'ease-in-out',\n};\n\nexport const highlightControl = createHighlightControl();\n", "import type GUI from 'lil-gui';\nimport type MapData from '../../map-data';\nimport { type MapView } from '../../map-view';\nimport { type SearchResult } from '../../';\nimport { PubSub } from '@packages/internal/common';\nimport type { EnterpriseLocation, Places } from '../../map-data-objects';\nconst state = {\n\tsearch: '',\n\tresults: undefined as SearchResult | undefined,\n\toptions: {\n\t\tplaces: {\n\t\t\tfields: {\n\t\t\t\tname: true,\n\t\t\t\tdescription: true,\n\t\t\t\tlink: true,\n\t\t\t\tcategory: true,\n\t\t\t},\n\t\t\tlimit: 5,\n\t\t},\n\t\tlocations: {\n\t\t\tfields: {\n\t\t\t\tname: true,\n\t\t\t\ttag: true,\n\t\t\t\tdescription: true,\n\t\t\t},\n\t\t\tlimit: 5,\n\t\t},\n\t\tcategories: {\n\t\t\tfields: {\n\t\t\t\tname: true,\n\t\t\t},\n\t\t\tlimit: 5,\n\t\t},\n\t},\n};\n\nfunction createAdvancedSettings(parent: GUI) {\n\tparent.add(state.options.places.fields, 'name').name('Places: Name');\n\tparent.add(state.options.places.fields, 'description').name('Places: Description');\n\tparent.add(state.options.places.fields, 'link').name('Places: Link');\n\tparent.add(state.options.places.fields, 'category').name('Places: Category');\n\tparent.add(state.options.places, 'limit');\n\tparent.add(state.options.locations.fields, 'name').name('Locations: Name');\n\tparent.add(state.options.locations.fields, 'tag').name('Locations: Tag');\n\tparent.add(state.options.locations.fields, 'description').name('Locations: Description');\n\tparent.add(state.options.places, 'limit');\n\tparent.add(state.options.categories.fields, 'name').name('Categories: Name');\n}\n\nexport function createSearchControl(mapView: MapView, mapData: MapData, parent: GUI) {\n\tconst pubsub = new PubSub<{ highlight: EnterpriseLocation | Places }>();\n\tconst searchPanel = parent.addFolder('Search');\n\tsearchPanel.open();\n\n\tconst control = searchPanel.add(state, 'search').onChange(async v => {\n\t\tconst results = await mapData.Search.query(v, state.options);\n\t\tif (!results) return;\n\t\tstate.results = results;\n\t\trenderSearchQuery(results, pubsub);\n\t});\n\n\tconst resultsContainer = document.createElement('div');\n\tresultsContainer.style.marginLeft = '10px';\n\tcontrol.domElement.parentElement?.appendChild(resultsContainer);\n\tconst { renderSearch: renderSearchQuery, close } = mount(mapView, mapData, resultsContainer, (control as any).$input);\n\n\tconst advancedSettingsPanel = searchPanel.addFolder('Advanced');\n\tadvancedSettingsPanel.close();\n\tcreateAdvancedSettings(advancedSettingsPanel);\n\n\t// Add event listener for Ctrl+K to focus on the search input\n\tdocument.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\tif ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n\t\t\te.preventDefault();\n\t\t\tif (searchPanel._closed) searchPanel.open();\n\t\t\t((control as any).$input as HTMLInputElement).focus();\n\t\t} else if (e.key === 'Escape') {\n\t\t\tclose();\n\t\t\tpubsub.publish('highlight', undefined);\n\t\t}\n\t});\n\n\treturn {\n\t\tpubsub,\n\t};\n}\n\nfunction mount(mapView: MapView, mapData: MapData, containerEl: HTMLDivElement, input: HTMLInputElement) {\n\tlet suggestTimeout: NodeJS.Timeout;\n\tlet dropdownControl: ReturnType<typeof createCustomDropdown>;\n\n\tinput.addEventListener('input', async (event: Event) => {\n\t\tif (\n\t\t\tevent instanceof InputEvent &&\n\t\t\t(event.inputType === 'insertText' || event.inputType === 'insertCompositionText')\n\t\t) {\n\t\t\tclearTimeout(suggestTimeout);\n\t\t\tsuggestTimeout = setTimeout(async () => {\n\t\t\t\tconst suggestions = await mapData.Search.suggest(input.value);\n\t\t\t\tif (suggestions && suggestions.length > 0) renderSuggestion(suggestions[0]?.suggestion);\n\t\t\t}, 100);\n\t\t}\n\t});\n\n\tfunction renderSuggestion(suggestion: string | undefined) {\n\t\tif (!suggestion) {\n\t\t\tinput.placeholder = '';\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst inputValue = input.value;\n\t\tinput.value = suggestion;\n\t\tinput.setSelectionRange(inputValue.length, suggestion.length);\n\t}\n\n\treturn {\n\t\trenderSearch(results: SearchResult, pubsub: PubSub<{ highlight: EnterpriseLocation | Places }>) {\n\t\t\tif (\n\t\t\t\tresults.places.length === 0 &&\n\t\t\t\tresults.enterpriseCategories?.length === 0 &&\n\t\t\t\tresults.enterpriseLocations?.length === 0\n\t\t\t) {\n\t\t\t\tcontainerEl.textContent = 'No results found.';\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdropdownControl = createCustomDropdown(containerEl, results, mapView, pubsub);\n\t\t},\n\t\tclose() {\n\t\t\tdropdownControl.destroy();\n\t\t},\n\t};\n}\n\nfunction createCustomDropdown(\n\tcontainerEl: HTMLDivElement,\n\tresults: SearchResult,\n\t_mapView: MapView,\n\tpubsub: PubSub<{ highlight: EnterpriseLocation | Places }>,\n) {\n\tcontainerEl.innerHTML = ''; // Clear previous results\n\n\tconst dropdownContainer = document.createElement('div');\n\tObject.assign(dropdownContainer.style, styles.dropdownContainer);\n\n\tconst optionsList = document.createElement('ul');\n\toptionsList.className = 'options-list';\n\tObject.assign(optionsList.style, styles.optionsList);\n\toptionsList.style.display = 'block'; // Always display the options list\n\n\tconst options: HTMLLIElement[] = [];\n\n\tconst addSection = (\n\t\ttitle: string,\n\t\titems?: SearchResult['enterpriseLocations'] | SearchResult['enterpriseCategories'] | SearchResult['places'],\n\t) => {\n\t\tif (items && items.length > 0) {\n\t\t\tconst sectionHeader = document.createElement('li');\n\t\t\tsectionHeader.textContent = title;\n\t\t\tObject.assign(sectionHeader.style, styles.sectionHeader);\n\t\t\toptionsList.appendChild(sectionHeader);\n\n\t\t\titems.forEach((item, i) => {\n\t\t\t\tconst option = document.createElement('li');\n\t\t\t\toption.textContent = `${'name' in item.item ? item.item.name : ''} (${item.type})`;\n\t\t\t\tObject.assign(option.style, styles.option);\n\t\t\t\toption.tabIndex = 0;\n\n\t\t\t\toption.addEventListener('focus', () => {\n\t\t\t\t\thighlightOption(options.indexOf(option));\n\t\t\t\t});\n\n\t\t\t\toption.addEventListener('mouseover', () => {\n\t\t\t\t\toption.style.backgroundColor = '#f0f0f0';\n\t\t\t\t});\n\n\t\t\t\toption.addEventListener('mouseout', () => {\n\t\t\t\t\toption.style.backgroundColor = '';\n\t\t\t\t});\n\n\t\t\t\toption.addEventListener('click', () => {\n\t\t\t\t\t// Add your navigation logic here\n\t\t\t\t});\n\n\t\t\t\toption.setAttribute('data-type', title);\n\t\t\t\toption.setAttribute('data-index', i.toString());\n\n\t\t\t\toptionsList.appendChild(option);\n\t\t\t\toptions.push(option);\n\t\t\t});\n\t\t}\n\t};\n\n\taddSection('enterpriseLocations', results.enterpriseLocations);\n\taddSection('enterpriseCategories', results.enterpriseCategories);\n\taddSection('Places', results.places);\n\n\tdropdownContainer.appendChild(optionsList);\n\tcontainerEl.appendChild(dropdownContainer);\n\n\tlet highlightUndo: (() => void)[] = [];\n\tconst highlightOption = (index: number) => {\n\t\thighlightUndo.forEach(undo => undo());\n\t\thighlightUndo = [];\n\t\toptions.forEach((opt, i) => {\n\t\t\tif (i === index) {\n\t\t\t\topt.style.backgroundColor = '#e0e0e0';\n\t\t\t} else {\n\t\t\t\topt.style.backgroundColor = '';\n\t\t\t}\n\t\t});\n\t\tconst option = options[index];\n\t\tconst type = option.getAttribute('data-type');\n\t\tconst i = parseInt(option.getAttribute('data-index') || '0', 10);\n\t\tif (!type) return;\n\t\tconst { item } = results[type.toLowerCase()][i];\n\n\t\tpubsub.publish('highlight', item);\n\t};\n\n\t// Add click event listener to the document to handle clicks outside the dropdown\n\tconst handleClickOutside = (event: MouseEvent) => {\n\t\tif (!dropdownContainer.contains(event.target as Node) && event.target !== containerEl) {\n\t\t\tdestroy();\n\t\t}\n\t};\n\n\tdocument.addEventListener('click', handleClickOutside);\n\n\tconst destroy = () => {\n\t\tcontainerEl.innerHTML = ''; // Clear previous results\n\t\tdocument.removeEventListener('click', handleClickOutside);\n\t};\n\n\treturn {\n\t\tdestroy() {\n\t\t\tcontainerEl.innerHTML = ''; // Clear previous results\n\t\t\tpubsub.publish('highlight', undefined);\n\t\t},\n\t};\n}\n\nvar styles: Readonly<any> = {\n\tdropdownContainer: {\n\t\tposition: 'absolute',\n\t\tcolor: '#202020',\n\t},\n\toptionsList: {\n\t\tdisplay: 'block',\n\t\tzIndex: '1002',\n\t\tposition: 'relative',\n\t\tmaxHeight: '200px',\n\t\toverflowY: 'auto',\n\t\tborder: '1px solid #ccc',\n\t\tbackgroundColor: '#fff',\n\t\tlistStyleType: 'none',\n\t\tmargin: '0',\n\t\tpadding: '0',\n\t},\n\tsectionHeader: {\n\t\tfontWeight: 'bold',\n\t\tpadding: '5px',\n\t\tbackgroundColor: '#f0f0f0',\n\t},\n\toption: {\n\t\tpadding: '5px',\n\t\tcursor: 'pointer',\n\t},\n};\n", ".mappedin-js-inspector .list-items {\n max-height: 600px;\n overflow-y: scroll;\n scroll-behavior: smooth;\n}\n.mappedin-js-inspector .children:focus {\n border: 1px solid blue;\n}\n.mappedin-js-inspector #interactionPanel {\n position: absolute;\n right: 0;\n}\n.mappedin-js-inspector #mainPanel {\n position: absolute;\n left: 0px;\n}\n.mappedin-js-inspector .title {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvamVua2lucy93b3Jrc3BhY2UvZGV2LXJlbGF0aW9uL1dlYlNESyBWNiBBbHBoYSAtIEJ1aWxkIHdpdGggR2l0aHViIFBhY2thZ2VzL3Nka3MvbWFwcGVkaW4tanMvc3JjL2FwaS1nZW9qc29uL2luc3BlY3RvciIsInNvdXJjZXMiOlsic3R5bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQztFQUNDO0VBQ0E7RUFDQTs7QUFFRDtFQUNDOztBQUVEO0VBQ0M7RUFDQTs7QUFFRDtFQUNDO0VBQ0E7O0FBRUQ7RUFDQztFQUNBO0VBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIubWFwcGVkaW4tanMtaW5zcGVjdG9yIHtcblx0Lmxpc3QtaXRlbXMge1xuXHRcdG1heC1oZWlnaHQ6IDYwMHB4O1xuXHRcdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0XHRzY3JvbGwtYmVoYXZpb3I6IHNtb290aDtcblx0fVxuXHQuY2hpbGRyZW46Zm9jdXMge1xuXHRcdGJvcmRlcjogMXB4IHNvbGlkIGJsdWU7XG5cdH1cblx0I2ludGVyYWN0aW9uUGFuZWwge1xuXHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRyaWdodDogMDtcblx0fVxuXHQjbWFpblBhbmVsIHtcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0bGVmdDogMHB4O1xuXHR9XG5cdC50aXRsZSB7XG5cdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuXHR9XG59XG4iXX0= */", "import type GUI from 'lil-gui';\nimport { getUrlParamsWithNamespace, runAll, updateCurrentUrlParamsWithNamespace } from './utils';\nimport type { CameraTransform, TClickPayload, InsetPadding } from '../../';\nimport { Coordinate } from '../../';\nimport type { MapView } from '../../map-view';\nimport type { InspectorState } from './inspector';\n\nconst CAMERA_UI = 'camera-ui';\nexport function createCameraControls(parent: GUI, mapView: MapView, options?: InspectorState['camera']) {\n\tconst cameraControl = parent.addFolder('Camera \uD83D\uDCF7').onOpenClose(v => {\n\t\tupdateCurrentUrlParamsWithNamespace({ opened: !v._closed }, CAMERA_UI);\n\t});\n\tconst { params: cameraUiState } = getUrlParamsWithNamespace(CAMERA_UI);\n\tif (!cameraUiState.opened) {\n\t\tcameraControl.close();\n\t}\n\tconst initialCameraCenter = mapView.Camera.center.toJSON();\n\n\tconst el = document.createElement('div');\n\tObject.assign(el.style, {\n\t\tdisplay: 'none',\n\t\tposition: 'absolute',\n\t\tleft: 0 + 'px',\n\t\tzIndex: 999,\n\t\ttop: 0 + 'px',\n\t\tbottom: 0 + 'px',\n\t\tright: 0 + 'px',\n\t\tbackgroundColor: 'aqua',\n\t\tpointerEvents: 'none',\n\t\topacity: 0.5,\n\t});\n\tmapView.__core.container.appendChild(el);\n\n\tconst { innerHeight: h, innerWidth: w } = window;\n\tconst [top, right, bottom, left] = options?.padding ?? [\n\t\tmapView.Camera.screenOffsets.top,\n\t\tmapView.Camera.screenOffsets.right,\n\t\tmapView.Camera.screenOffsets.bottom,\n\t\tmapView.Camera.screenOffsets.left,\n\t];\n\tconst state = {\n\t\tcenter_lat: initialCameraCenter.latitude,\n\t\tcenter_lon: initialCameraCenter.longitude,\n\t\tzoomLevel: mapView.Camera.zoomLevel,\n\t\tpitch: mapView.Camera.pitch,\n\t\tbearing: mapView.Camera.bearing,\n\t\tminZoomLevel: mapView.Camera.minZoomLevel,\n\t\tmaxZoomLevel: mapView.Camera.maxZoomLevel,\n\t\tinset_type: options?.padding ? ('pixel' as InsetPadding['type']) : mapView.Camera.screenOffsets.type,\n\t\tinset_top: top ?? 0,\n\t\tinset_left: left ?? 0,\n\t\tinset_right: right ?? 0,\n\t\tinset_bottom: bottom ?? 0,\n\t\tanimateOnLoad: true,\n\t\tpersist: () => {\n\t\t\tupdateCurrentUrlParamsWithNamespace((cameraControl.save() as any).controllers, 'camera');\n\t\t\tnavigator.clipboard.writeText(window.location.href);\n\t\t},\n\t\tvisualizeInset: Boolean(top || right || bottom || left),\n\t\t'Focus on click': options?.focusOnClick ?? true,\n\t\t'Focus on current floor': () => {\n\t\t\tmapView.Camera.focusOn([mapView.currentFloor], {\n\t\t\t\tscreenOffsets: {\n\t\t\t\t\ttop: 20,\n\t\t\t\t\tleft: 20,\n\t\t\t\t\tright: 20,\n\t\t\t\t\tbottom: 20,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t};\n\n\tfunction updateInsetVisualizer() {\n\t\tstate.inset_type = mapView.Camera.screenOffsets.type;\n\t\tstate.inset_left = mapView.Camera.screenOffsets.left;\n\t\tstate.inset_top = mapView.Camera.screenOffsets.top;\n\t\tstate.inset_right = mapView.Camera.screenOffsets.right;\n\t\tstate.inset_bottom = mapView.Camera.screenOffsets.bottom;\n\t\tif (state.inset_type === 'portion') {\n\t\t\tObject.assign(el.style, {\n\t\t\t\tleft: state.inset_left * w + 'px',\n\t\t\t\ttop: state.inset_top * h + 'px',\n\t\t\t\tbottom: state.inset_bottom * h + 'px',\n\t\t\t\tright: state.inset_right * w + 'px',\n\t\t\t});\n\t\t} else {\n\t\t\tObject.assign(el.style, {\n\t\t\t\tleft: state.inset_left + 'px',\n\t\t\t\ttop: state.inset_top + 'px',\n\t\t\t\tbottom: state.inset_bottom + 'px',\n\t\t\t\tright: state.inset_right + 'px',\n\t\t\t});\n\t\t}\n\t}\n\tcameraControl.add(state, 'center_lat').listen().disable();\n\tcameraControl.add(state, 'center_lon').listen().disable();\n\tcameraControl.add(state, 'zoomLevel', 16, 22, 0.5).listen().disable();\n\tcameraControl.add(state, 'pitch').listen().disable();\n\tcameraControl.add(state, 'bearing').listen().disable();\n\tcameraControl.add(state, 'minZoomLevel', 5, 22, 0.5).onChange(v => {\n\t\tmapView.Camera.setMinZoomLevel(v);\n\t});\n\tcameraControl.add(state, 'maxZoomLevel', 10, 22, 0.5).onChange(v => {\n\t\tmapView.Camera.setMaxZoomLevel(v);\n\t});\n\n\tcameraControl.add(state, 'animateOnLoad');\n\n\tcameraControl.add(state, 'visualizeInset').onChange(visualizeInsetUpdated);\n\tvisualizeInsetUpdated(state.visualizeInset);\n\n\tcameraControl.add(state, 'inset_type', ['pixel', 'portion']).onChange(updateInset);\n\tcameraControl.add(state, 'inset_top', 0, h).onChange(updateInset);\n\tcameraControl.add(state, 'inset_bottom', 0, h).onChange(updateInset);\n\tcameraControl.add(state, 'inset_left', 0, w).onChange(updateInset);\n\tcameraControl.add(state, 'inset_right', 0, w).onChange(updateInset);\n\tconst handler = createHandler(mapView);\n\tcameraControl.add(state, 'Focus on click').onChange(v => {\n\t\tif (v) {\n\t\t\tmapView.on('click', handler);\n\t\t} else {\n\t\t\tmapView.off('click', handler);\n\t\t}\n\t});\n\tif (state['Focus on click']) mapView.on('click', handler);\n\tcameraControl.add(state, 'persist');\n\tcameraControl.add(state, 'Focus on current floor');\n\n\tconst onCameraChanged = (v: CameraTransform) => {\n\t\tif (cameraControl._closed) return;\n\t\tstate.center_lat = v.center.latitude;\n\t\tstate.center_lon = v.center.longitude;\n\t\tstate.zoomLevel = v.zoomLevel;\n\t\tstate.bearing = v.bearing;\n\t\tstate.pitch = v.pitch;\n\t};\n\n\tmapView.on('camera-change', onCameraChanged);\n\n\t// handle loading camera state from url\n\tconst { params } = getUrlParamsWithNamespace('camera', state);\n\tif (Object.keys(params).length > 0) {\n\t\tconst paramState: typeof state = params;\n\t\tmapView.Camera.setScreenOffsets({\n\t\t\ttop: paramState.inset_top,\n\t\t\tleft: paramState.inset_left,\n\t\t\tright: paramState.inset_right,\n\t\t\tbottom: paramState.inset_bottom,\n\t\t\ttype: paramState.inset_type,\n\t\t});\n\t\tconst target = {\n\t\t\tpitch: paramState.pitch,\n\t\t\tcenter: new Coordinate(paramState.center_lat, paramState.center_lon),\n\t\t\tbearing: paramState.bearing,\n\t\t\tzoomLevel: paramState.zoomLevel,\n\t\t};\n\t\tif (paramState.animateOnLoad) {\n\t\t\tmapView.Camera.animateTo(target);\n\t\t} else {\n\t\t\tmapView.Camera.set(target);\n\t\t}\n\t\tcameraControl.load({ controllers: paramState, folders: {} });\n\t\tupdateInsetVisualizer();\n\t}\n\n\tconst cleanups = [\n\t\t() => {\n\t\t\tmapView.off('camera-change', onCameraChanged);\n\t\t},\n\t];\n\n\tfunction updateInset() {\n\t\tmapView.Camera.setScreenOffsets({\n\t\t\ttop: state.inset_top,\n\t\t\tleft: state.inset_left,\n\t\t\tright: state.inset_right,\n\t\t\tbottom: state.inset_bottom,\n\t\t\ttype: state.inset_type,\n\t\t});\n\t\tupdateInsetVisualizer();\n\t}\n\n\tif (state.inset_top || state.inset_right || state.inset_bottom || state.inset_left) {\n\t\t// a bit of #trust\n\t\tupdateInset();\n\t}\n\n\tfunction visualizeInsetUpdated(v: boolean) {\n\t\tupdateInsetVisualizer();\n\t\tif (v) {\n\t\t\tel.style.display = 'block';\n\t\t} else {\n\t\t\tel.style.display = 'none';\n\t\t}\n\t}\n\n\treturn () => ({\n\t\tdestroy() {\n\t\t\tcameraControl.destroy();\n\t\t\trunAll(cleanups);\n\t\t},\n\t});\n}\n\nfunction createHandler(mapView: MapView) {\n\treturn function handler(payload: TClickPayload) {\n\t\tconst { spaces, objects } = payload;\n\t\tconst item = spaces[0] ?? objects[0];\n\t\tif (item) mapView.Camera.focusOn(item);\n\t};\n}\n", "import type GUI from 'lil-gui';\nimport type { Coordinate, Marker, MapData } from '../../';\nimport type { MapView } from '../../map-view';\n\nexport function createMarkerControls(markerFolder: GUI, _mapData: MapData, mapView: MapView) {\n\tconst state = {\n\t\tmarkers: {} as { [id: string]: Marker },\n\t\tremoveAllMarkers() {\n\t\t\tconst removed = mapView.Markers.removeAll();\n\t\t\tremoved.forEach(l => {\n\t\t\t\tdelete this.markers[l.id];\n\t\t\t});\n\t\t\trenderMarkers();\n\t\t},\n\t};\n\tconst { addMarker, destroy } = createAddControl(markerFolder, mapView);\n\n\tmarkerFolder.add(state, 'removeAllMarkers');\n\tlet markersListFolder = markerFolder.addFolder('Marker List');\n\n\tmarkerFolder.close();\n\n\tconst markerGuiMap = new Map<string, GUI>();\n\tconst { rerender: renderMarkers } = createMarkerControls();\n\tfunction createMarkerControls() {\n\t\tfunction remove(marker: Marker) {\n\t\t\tdelete state.markers[marker.id];\n\t\t\tmarkerGuiMap.get(marker.id)?.destroy();\n\t\t}\n\t\tfunction add(marker: Marker) {\n\t\t\tconst control = addMarkerControlToFolder(mapView, marker, markersListFolder, {\n\t\t\t\tonRemove: l => {\n\t\t\t\t\tremove(l);\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!control) return;\n\t\t\tconst { markerItemFolder } = control;\n\t\t\tmarkerGuiMap.set(marker.id, markerItemFolder);\n\t\t}\n\t\tfunction rerender() {\n\t\t\tmarkersListFolder.destroy();\n\t\t\tmarkersListFolder = markerFolder.addFolder('marker');\n\t\t\tfor (const k in state.markers) {\n\t\t\t\tconst item = state.markers[k];\n\t\t\t\tadd(item);\n\t\t\t}\n\t\t}\n\n\t\treturn { rerender, add, remove };\n\t}\n\tmarkerFolder.domElement.classList.add('list-items');\n\tlet lastMarkerControl: GUI;\n\tmapView.on('click', ({ markers, coordinate }) => {\n\t\tif (markerFolder._closed) return;\n\t\tif (markers[0]) {\n\t\t\tlastMarkerControl?.close();\n\t\t\tconst control = markerGuiMap.get(markers[0].id);\n\t\t\tmarkerFolder.open();\n\t\t\tif (!control) return;\n\t\t\tcontrol?.open();\n\t\t\tcontrol?.domElement.scrollIntoView({\n\t\t\t\tblock: 'start',\n\t\t\t});\n\t\t\tcontrol?.domElement.focus();\n\t\t\tlastMarkerControl = control;\n\t\t} else {\n\t\t\taddMarker(coordinate);\n\t\t}\n\t});\n\n\tfunction populateMarkers(markers: Marker[]) {\n\t\tfor (const marker of markers) {\n\t\t\tstate.markers[marker.id] = marker;\n\t\t}\n\t\trenderMarkers();\n\t}\n\n\treturn {\n\t\tpopulateMarkers,\n\t\tdestroy() {\n\t\t\tdestroy();\n\t\t},\n\t};\n}\n\nexport function addMarkerControlToFolder(\n\tmapView: MapView,\n\tmarker: Marker,\n\tparent: GUI,\n\t{ onRemove }: { onRemove?: (removed: Marker) => void } = {},\n) {\n\tconst markerItemFolder = parent.addFolder(`${marker.id.toString().substring(0, 8)}`);\n\tmarkerItemFolder.onChange(_ => {\n\t\tmapView.updateState(marker, {\n\t\t\tinteractive: uiState.interactive,\n\t\t});\n\t});\n\tmarkerItemFolder.close();\n\tconst state = mapView.getState(marker);\n\tif (state?.type !== 'marker') throw new Error(`error getting state for marker: ${marker.id}`);\n\tconst { interactive } = state;\n\tif (interactive == null) throw new Error('incomplte label state');\n\tconst uiState = {\n\t\tinteractive,\n\t\tremove() {\n\t\t\tmapView.Markers.remove(marker);\n\t\t\tonRemove?.(marker);\n\t\t\tmarkerItemFolder.destroy();\n\t\t},\n\t};\n\tmarkerItemFolder.add(uiState, 'interactive');\n\t// labelControlFolder.add(uiState, 'focus');\n\tmarkerItemFolder.add(uiState, 'remove');\n\n\treturn {\n\t\tmarkerItemFolder,\n\t\tdestroy() {\n\t\t\tmarkerItemFolder.destroy();\n\t\t},\n\t};\n}\n\nfunction createAddControl(markerFolder: GUI, mapView: MapView) {\n\tconst addFolder = markerFolder.addFolder('Add');\n\tconst state = {\n\t\tonClick: false,\n\t\tinteractive: true,\n\t};\n\n\taddFolder.add(state, 'onClick');\n\taddFolder.add(state, 'interactive');\n\n\treturn {\n\t\tdestroy() {\n\t\t\taddFolder.destroy();\n\t\t},\n\t\taddMarker(coordinate: Coordinate) {\n\t\t\tif (addFolder._closed || !state.onClick) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst marker = mapView.Markers.add(coordinate, `<div>New Marker</div>`, {\n\t\t\t\tinteractive: state.interactive,\n\t\t\t});\n\n\t\t\treturn marker;\n\t\t},\n\t};\n}\n", "import GUI from 'lil-gui';\nimport { MapView } from '../../map-view';\n\nexport function createGeometryControl(parent: GUI, mapView: MapView) {\n\tconst panel = parent.addFolder('Walls').close();\n\tconst state = { visible: true, topColor: '#b1fa87', color: '#e8e8e8', texture: { url: '' }, topTexture: { url: '' } };\n\tpanel.add(state, 'visible').onChange(v => {\n\t\tmapView.updateState('walls', {\n\t\t\tvisible: v,\n\t\t});\n\t});\n\tpanel.addColor(state, 'topColor').onChange(v => {\n\t\tmapView.updateState('walls', {\n\t\t\ttopColor: v,\n\t\t});\n\t});\n\n\tpanel.addColor(state, 'color').onChange(v => {\n\t\tmapView.updateState('walls', {\n\t\t\tcolor: v,\n\t\t});\n\t});\n\n\tconst tFolder = panel.addFolder('Texture - side');\n\ttFolder.add(state.texture, 'url').onFinishChange(c => {\n\t\tmapView.updateState('walls', {\n\t\t\ttexture: {\n\t\t\t\turl: c,\n\t\t\t},\n\t\t});\n\t});\n\tconst tFolderTop = panel.addFolder('Texture - top');\n\ttFolderTop.add(state.topTexture, 'url').onFinishChange(c => {\n\t\tmapView.updateState('walls', {\n\t\t\ttopTexture: {\n\t\t\t\turl: c,\n\t\t\t},\n\t\t});\n\t});\n\n\tmapView.updateState('walls', {\n\t\ttopColor: state.topColor,\n\t});\n\n\tmapView.updateState('walls', {\n\t\tcolor: state.color,\n\t});\n}\n", "/* eslint-disable no-console */\nimport type GUI from 'lil-gui';\nimport type { MapData, MapView } from '../../../src';\n\nexport function createMiscControl(panel: GUI, _mapView: MapView, mapData: MapData) {\n\tpanel.close();\n\tconst state = {\n\t\tlanguage: mapData.currentLanguage?.code ?? 'en',\n\t};\n\tconst venue = mapData.getByType('enterprise-venue');\n\tpanel\n\t\t.add(\n\t\t\tstate,\n\t\t\t'language',\n\t\t\tvenue?.languages.map(v => v.code),\n\t\t)\n\t\t.onChange(v => {\n\t\t\tmapData.changeLanguage(v);\n\t\t});\n}\n", "import type GUI from 'lil-gui';\nimport type { MapData, MapView, Debug } from '../..';\nexport function createDebugControl(parent: GUI, mapView: MapView, _mapData: MapData) {\n\tconst folder = parent.addFolder('Debug');\n\tfolder.close();\n\tconst debugInitialState = mapView.Debug.state;\n\tconst state = {\n\t\tshowPolygonLabelTextAreaMesh: debugInitialState.showPolygonLabelTextAreaMesh,\n\t\tshowCollisionBoxes: debugInitialState.showCollisionBoxes,\n\t\tshowEnvMap: debugInitialState.showEnvMap,\n\t};\n\n\tfolder\n\t\t.add(state, 'showPolygonLabelTextAreaMesh')\n\t\t.onChange((v: boolean) => {\n\t\t\tmapView.Debug.update({ showPolygonLabelTextAreaMesh: v });\n\t\t})\n\t\t.name('Show Flat Label Text Area Mesh');\n\n\tfolder\n\t\t.add(state, 'showCollisionBoxes')\n\t\t.onChange((v: boolean) => {\n\t\t\tmapView.Debug.update({ showCollisionBoxes: v });\n\t\t})\n\t\t.name('Show Collision Boxes');\n\n\tfolder\n\t\t.add(state, 'showEnvMap')\n\t\t.onChange((v: boolean) => {\n\t\t\tmapView.Debug.update({ showEnvMap: v });\n\t\t})\n\t\t.name('Show Environment Map');\n\n\tmapView.Debug.update(state as Debug['state']);\n}\n", "import type GUI from 'lil-gui';\nimport type { MapData, MapView } from '../..';\n\nexport function createText3DControl(parent: GUI, mapView: MapView, _mapData: MapData) {\n\tconst folder = parent.addFolder('Text3D').close();\n\tconst state = {\n\t\tall: () => {\n\t\t\tmapView.Text3D.labelAll();\n\t\t},\n\t\tremoveAll: () => {\n\t\t\tmapView.Text3D.removeAll();\n\t\t},\n\t};\n\n\tfolder.add(state, 'all').name('Show All');\n\tfolder.add(state, 'removeAll').name('Remove All');\n}\n", "import type GUI from 'lil-gui';\nimport type { MapData, MapView } from '../..';\nimport { createStackMapsControl } from '../../../examples/src/utils/stackedmaps';\nexport function createStackmapsControl(parent: GUI, mapView: MapView, mapData: MapData) {\n\tconst folder = parent.addFolder('StackedMaps');\n\tfolder.close();\n\n\tcreateStackMapsControl(mapView, mapData, { root: folder, showLabelsPerFloor: false });\n}\n", "import type GUI from 'lil-gui';\nimport { Floor, Label, MapData, MapView } from '../../../src';\nimport { createGUI } from './gui';\nexport async function createStackMapsControl(\n\tmapView: MapView,\n\tmapData: MapData,\n\t{\n\t\tinitialfloorsInStack,\n\t\troot,\n\t\tfloorsInDirections,\n\t\tshowLabelsPerFloor = true,\n\t}: { initialfloorsInStack?: Floor[]; root?: GUI; floorsInDirections?: Floor[]; showLabelsPerFloor?: boolean },\n) {\n\tasync function zoomToFloor(floor: Floor) {\n\t\tmapView.StackedMaps.changeFloorOnElevationChanges(false);\n\t\tmapView.Outdoor.setOpacity(0.15);\n\t\tmapView.StackedMaps.setFloorVisiblityMode('only-current-floor');\n\t\tmapView.Camera.setPanMode('default');\n\t\tawait mapView.Camera.focusOn(floor, {\n\t\t\tpitch: 10,\n\t\t});\n\t}\n\n\tasync function showCurrentFloorWithPadding() {\n\t\tmapView.Outdoor.setOpacity(0.25);\n\t\tmapView.StackedMaps.changeFloorOnElevationChanges(true);\n\t\tmapView.Camera.setPanMode('elevation');\n\t\tmapView.StackedMaps.setFloorVisiblityMode('all-floors');\n\t\tawait mapView.Camera.focusOn(mapView.currentFloor, {\n\t\t\taxisAlignedPadding: { vertical: mapView.StackedMaps.distanceBetweenFloors },\n\t\t\tpitch: 90,\n\t\t});\n\t}\n\n\tasync function scrollToFloor(floor: Floor) {\n\t\tawait mapView.Camera.animateElevation(floor.elevation * mapView.StackedMaps.distanceBetweenFloors);\n\t}\n\n\tlet previousFloor: Floor = mapView.currentFloor;\n\tmapView.on('floor-change', async change => {\n\t\tif (mapView.StackedMaps.expanded && change.reason !== 'stacked-maps-elevation-change') {\n\t\t\tmapView.StackedMaps.changeFloorOnElevationChanges(false);\n\t\t\tmapView.StackedMaps.setFloorVisiblityMode('all-floors');\n\t\t\tawait mapView.Camera.focusOn(previousFloor, {\n\t\t\t\taxisAlignedPadding: { vertical: mapView.StackedMaps.distanceBetweenFloors },\n\t\t\t\tpitch: 90,\n\t\t\t\tduration: 500,\n\t\t\t});\n\t\t\tmapView.StackedMaps.changeFloorOnElevationChanges(true);\n\t\t\tawait scrollToFloor(mapView.currentFloor);\n\t\t\tawait zoomToFloor(mapView.currentFloor);\n\t\t\tmapView.StackedMaps.setFloorVisiblityMode('only-current-floor');\n\t\t}\n\t\tpreviousFloor = mapView.currentFloor;\n\t});\n\n\t// const floors = mapData.getByType('floor').sort((a, b) => a.elevation - b.elevation);\n\t//\n\t// const depart = mapData\n\t// \t.getByType('space')\n\t// \t.find(space => space.name === 'Classroom' && space.floor.id === floors[0].id)!;\n\t// const arrive = mapData\n\t// \t.getByType('space')\n\t// \t.find(space => space.name === 'Classroom' && space.floor.id === floors[3].id)!;\n\t// const directions = mapView.getDirections(arrive, depart, {\n\t// \taccessible: false,\n\t// })!;\n\n\t// console.log(directions);\n\n\tmapView.on('stacked-maps-state-change', ({ state }) => {\n\t\tconsole.log('stacked-maps-state-change', state);\n\t});\n\n\tconst spaces = mapData.getByType('space');\n\n\tif (showLabelsPerFloor) {\n\t\tconst labelsPerFloor = spaces.reduce<Map<Floor, Label[]>>((acc, space) => {\n\t\t\tif (!acc.has(space.floor)) {\n\t\t\t\tacc.set(space.floor, []);\n\t\t\t}\n\t\t\tif (space.name && space.name !== '') {\n\t\t\t\tacc.get(space.floor)!.push(mapView.Labels.add(space, space.name));\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, new Map());\n\n\t\tmapView.on('floor-change', () => {\n\t\t\tlabelsPerFloor.forEach((labels, floor) => {\n\t\t\t\tlabels.forEach(label => {\n\t\t\t\t\tmapView.updateState(label, {\n\t\t\t\t\t\tenabled: mapView.currentFloor === floor,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\tconst gui = createGUI(mapData, mapView, root);\n\n\tlet floorsInStack = initialfloorsInStack ?? [];\n\n\tasync function expandAll() {\n\t\tmapView.Outdoor.setOpacity(0.25);\n\t\tfloorsInStack = mapData.getByType('floor');\n\t\tawait mapView.Camera.animateTo({\n\t\t\tpitch: 90,\n\t\t});\n\t\tawait mapView.StackedMaps.collapse();\n\t\tmapView.StackedMaps.clearCachedFloorSeparationDistance();\n\t\tawait mapView.StackedMaps.expand({\n\t\t\tdistanceBetweenFloors: 'auto',\n\t\t});\n\t}\n\n\tgui.add(\n\t\t'Expand - All',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tawait expandAll();\n\t\t\t},\n\t\t},\n\t\t'Stack Maps',\n\t);\n\n\tif (floorsInDirections) {\n\t\tgui.add(\n\t\t\t'Expand - Only Navigation',\n\t\t\t{\n\t\t\t\tdefault: async () => {\n\t\t\t\t\tmapView.Outdoor.setOpacity(0.25);\n\t\t\t\t\tfloorsInStack = floorsInDirections;\n\t\t\t\t\tawait mapView.StackedMaps.collapse();\n\t\t\t\t\tmapView.setFloor(floorsInDirections[0]);\n\t\t\t\t\tawait mapView.StackedMaps.expand({\n\t\t\t\t\t\tincludedFloors: floorsInDirections,\n\t\t\t\t\t\tdistanceBetweenFloors: 'auto',\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t'Stack Maps',\n\t\t);\n\t}\n\n\tgui.add(\n\t\t'Show All Floors',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tfloorsInStack = mapData.getByType('floor');\n\t\t\t\tmapView.Outdoor.setOpacity(0.25);\n\t\t\t\tmapView.StackedMaps.setFloorVisiblityMode('all-floors');\n\t\t\t\tmapView.StackedMaps.changeFloorOnElevationChanges(false);\n\t\t\t\tmapView.Camera.setPanMode('elevation');\n\t\t\t\tmapView.Camera.focusOn(floorsInStack, {\n\t\t\t\t\tpitch: 90,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\t'Stack Maps',\n\t);\n\n\tgui.add(\n\t\t'Show Current Floor with padding',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tawait showCurrentFloorWithPadding();\n\t\t\t},\n\t\t},\n\t\t'Stack Maps',\n\t);\n\n\tgui.add(\n\t\t'Zoom to Current Floor',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tzoomToFloor(mapView.currentFloor);\n\t\t\t},\n\t\t},\n\t\t'Stack Maps',\n\t);\n\n\tgui.add(\n\t\t'Collapse',\n\t\t{\n\t\t\tdefault: () => {\n\t\t\t\tmapView.Outdoor.setOpacity('initial');\n\t\t\t\tmapView.StackedMaps.collapse();\n\t\t\t},\n\t\t},\n\t\t'Stack Maps',\n\t);\n\n\tgui.add(\n\t\t'Default',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tmapView.Camera.setPanMode('default');\n\t\t\t},\n\t\t},\n\t\t'Camera Pan Mode',\n\t);\n\n\tgui.add(\n\t\t'Elevation',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tmapView.Camera.setPanMode('elevation');\n\t\t\t},\n\t\t},\n\t\t'Camera Pan Mode',\n\t);\n\n\tgui.add(\n\t\t'zoom in to floor 2',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tmapView.Outdoor.setOpacity(0.25);\n\t\t\t\tconsole.log(mapView.currentFloor.name);\n\t\t\t\tawait mapView.Camera.focusOn(mapView.currentFloor, {\n\t\t\t\t\taxisAlignedPadding: { vertical: mapView.StackedMaps.distanceBetweenFloors },\n\t\t\t\t\tpitch: 90,\n\t\t\t\t});\n\n\t\t\t\tif (!mapView.StackedMaps.expanded) {\n\t\t\t\t\tawait mapView.StackedMaps.expand({\n\t\t\t\t\t\tdistanceBetweenFloors: mapView.StackedMaps.distanceBetweenFloors,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst floor = mapView.StackedMaps.includedFloors[2];\n\n\t\t\t\tconst floorIndex = floorsInStack.findIndex(f => f.id === floor.id);\n\n\t\t\t\tmapView.StackedMaps.changeFloorOnElevationChanges(true);\n\t\t\t\tmapView.Camera.setPanMode('elevation');\n\t\t\t\tmapView.StackedMaps.setFloorVisiblityMode('all-floors');\n\t\t\t\tawait mapView.Camera.animateElevation(floorIndex * mapView.StackedMaps.distanceBetweenFloors);\n\t\t\t\tmapView.Outdoor.setOpacity(0.15);\n\t\t\t\tconsole.log('focusing on', floor.name);\n\t\t\t\tawait mapView.Camera.focusOn(floor, {\n\t\t\t\t\tpitch: 10,\n\t\t\t\t});\n\t\t\t\tmapView.StackedMaps.setFloorVisiblityMode('only-current-floor');\n\t\t\t\tmapView.Camera.setPanMode('default');\n\t\t\t\tmapView.StackedMaps.changeFloorOnElevationChanges(false);\n\t\t\t},\n\t\t},\n\t\t'Camera Pan Mode',\n\t);\n\n\tgui.add(\n\t\t'All Floors',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tmapView.StackedMaps.setFloorVisiblityMode('all-floors');\n\t\t\t},\n\t\t},\n\t\t'Visibility Mode',\n\t);\n\n\tgui.add(\n\t\t'Only Active Floor',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tmapView.StackedMaps.setFloorVisiblityMode('only-current-floor');\n\t\t\t},\n\t\t},\n\t\t'Visibility Mode',\n\t);\n\n\tgui.add(\n\t\t'Up',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tconst upFloor = floorsInStack.find(f => f.elevation === mapView.currentFloor.elevation + 1);\n\t\t\t\tif (upFloor) {\n\t\t\t\t\tawait scrollToFloor(upFloor);\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t'Floors Up/Down',\n\t);\n\n\tgui.add(\n\t\t'Down',\n\t\t{\n\t\t\tdefault: async () => {\n\t\t\t\tconst downFloor = floorsInStack.find(f => f.elevation === mapView.currentFloor.elevation - 1);\n\t\t\t\tif (downFloor) {\n\t\t\t\t\tawait scrollToFloor(downFloor);\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t'Floors Up/Down',\n\t);\n\treturn {\n\t\tzoomToFloor,\n\t\texpandAll,\n\t};\n}\n", "import { GUI as LilGUI, Controller as LilControl } from 'lil-gui';\n\nimport { MapData, MapView } from '../../../src';\n\ntype ControlValue = boolean | string | number | (() => void);\n\ntype Controller = {\n\t[property: string]: ControlValue;\n};\n\ntype Control<T extends ControlValue = ControlValue> = {\n\tdefault: T;\n\targs?: number | object | any[];\n\tmax?: number;\n\tstep?: number;\n\tonAdd?: (value: T, name: string) => void;\n\tonChange?: (value: T, name: string) => void;\n};\n\ntype Controls = {\n\t[name: string]: Control;\n};\n\nclass GUI {\n\t#gui: LilGUI;\n\t#folders: LilGUI[] = [];\n\t#controlsData: Controls = {};\n\t#controls: { [name: string]: LilControl } = {};\n\t#controller: Controller = {};\n\n\tconstructor(root = new LilGUI({ autoPlace: true })) {\n\t\tthis.#gui = root;\n\t\tthis.#gui.domElement.style.left = '0';\n\t}\n\n\tpublic add(name: string, control: Control, folderName?: string) {\n\t\tif (this.#controls[name]) {\n\t\t\tthrow new Error(`Control ${name} already exists`);\n\t\t}\n\n\t\tthis.#controlsData[name] = control;\n\t\tthis.#controller[name] = control.default;\n\n\t\tthis.#addControl(name, control, folderName);\n\t\tthis.show();\n\t}\n\n\tpublic addColor(name: string, control: Control, folderName?: string) {\n\t\tif (this.#controls[name]) {\n\t\t\tthrow new Error(`Control ${name} already exists`);\n\t\t}\n\n\t\tthis.#controlsData[name] = control;\n\t\tthis.#controller[name] = control.default;\n\n\t\tthis.#addColorControl(name, control, folderName);\n\t\tthis.show();\n\t}\n\n\tpublic update(name: string, value: ControlValue) {\n\t\tif (!this.#controls[name]) {\n\t\t\tthrow new Error(`Control ${name} does not exist`);\n\t\t}\n\n\t\tthis.#controls[name].setValue(value);\n\n\t\tif (this.#controlsData[name].onChange) {\n\t\t\tthis.#controlsData[name].onChange(value, name);\n\t\t}\n\t}\n\n\tpublic replace(name: string, control: Control, folderName?: string) {\n\t\tif (!this.#controls[name]) {\n\t\t\tthis.add(name, control, folderName);\n\t\t\treturn;\n\t\t}\n\n\t\tif (control.args) {\n\t\t\tthis.#controls[name].options(control.args as object);\n\t\t}\n\t\tif (control.default) {\n\t\t\tthis.#controls[name].setValue(control.default);\n\t\t}\n\t\tif (control.onChange) {\n\t\t\tthis.#controls[name].onChange((value: any) => {\n\t\t\t\tcontrol.onChange!(value, name);\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic remove(name: string) {\n\t\tif (!this.#controls[name]) {\n\t\t\tthrow new Error(`Control ${name} does not exist`);\n\t\t}\n\n\t\tthis.#controls[name].destroy();\n\t\tif (this.#controls[name].parent.children.length === 0) {\n\t\t\tthis.#controls[name].parent.hide();\n\t\t}\n\t\tdelete this.#controls[name];\n\t\tdelete this.#controlsData[name];\n\t\tdelete this.#controller[name];\n\t}\n\n\tpublic show() {\n\t\tthis.#gui.show();\n\t}\n\n\tpublic hide() {\n\t\tthis.#gui.hide();\n\t}\n\n\tpublic removeAll() {\n\t\tfor (const name in this.#controls) {\n\t\t\tthis.remove(name);\n\t\t}\n\t}\n\n\tpublic destroy() {\n\t\tthis.#gui.destroy();\n\t}\n\n\t#addControl(name: string, control: Control, folderName?: string) {\n\t\tconst folder = this.#getFolder(folderName);\n\t\tconst newControl = folder.add(this.#controller, name, control.args, control.max, control.step);\n\n\t\tif (control.onChange) {\n\t\t\tnewControl.onChange((value: any) => {\n\t\t\t\tcontrol.onChange!(value, name);\n\t\t\t});\n\t\t}\n\t\tif (control.onAdd) {\n\t\t\tcontrol.onAdd(control.default, name);\n\t\t}\n\n\t\tthis.#controls[name] = newControl;\n\t}\n\t#getFolder(folderName?: string): LilGUI {\n\t\tif (!folderName) {\n\t\t\treturn this.#gui;\n\t\t}\n\n\t\tlet folder = this.#folders.find(folder => (folder as any)._title === folderName);\n\n\t\tif (folder) {\n\t\t\tfolder.show();\n\t\t\treturn folder;\n\t\t} else {\n\t\t\tfolder = this.#gui.addFolder(folderName);\n\t\t\tthis.#folders.push(folder);\n\n\t\t\treturn folder;\n\t\t}\n\t}\n\n\t#addColorControl(name: string, control: Control, folderName?: string) {\n\t\tconst folder = this.#getFolder(folderName);\n\t\tconst newControl = folder.addColor(this.#controller, name);\n\n\t\tif (control.onChange) {\n\t\t\tnewControl.onChange((value: any) => {\n\t\t\t\tcontrol.onChange!(value, name);\n\t\t\t});\n\t\t}\n\n\t\tthis.#controls[name] = newControl;\n\t}\n}\n\nfunction createDefaultControls(mapData: MapData, mapView: MapView, gui: GUI): Controls {\n\tconst controls: Controls = {};\n\tconst floors = mapData.getByType('floor');\n\tconst floorStacks = mapData.getByType('floor-stack');\n\n\tif (floorStacks.length > 1) {\n\t\tcontrols.FloorStack = {\n\t\t\tdefault: mapView.currentFloorStack.id,\n\t\t\targs: floorStacks.reduce(\n\t\t\t\t(acc, { id, name }) => ({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[name]: id,\n\t\t\t\t}),\n\t\t\t\t{},\n\t\t\t),\n\t\t\tonChange: (value: ControlValue) => {\n\t\t\t\tif (value === mapView.currentFloorStack.id) return;\n\t\t\t\tmapView.setFloorStack(value as string);\n\t\t\t\tgui.replace('Floor', {\n\t\t\t\t\tdefault: mapView.currentFloor.id,\n\t\t\t\t\targs: mapView.currentFloorStack.floors.reduce(\n\t\t\t\t\t\t(acc, { id, name }) => ({\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t[name]: id,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{},\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n\n\tif (floors.length > 1) {\n\t\tcontrols.Floor = {\n\t\t\tdefault: mapView.currentFloor.id,\n\t\t\targs: [...mapView.currentFloorStack.floors.sort((a, b) => b.elevation - a.elevation)].reduce(\n\t\t\t\t(acc, { id, name }) => ({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[name]: id,\n\t\t\t\t}),\n\t\t\t\t{},\n\t\t\t),\n\t\t\tonChange: (floorValue: ControlValue) => {\n\t\t\t\tif (floorValue === mapView.currentFloor.id) return;\n\t\t\t\tmapView.setFloor(floorValue as string);\n\t\t\t},\n\t\t\tonAdd: () => {\n\t\t\t\tmapView.on('floor-change', event => {\n\t\t\t\t\t// update the level selector\n\t\t\t\t\tconst id = event?.floor.id;\n\t\t\t\t\tif (!id) return;\n\n\t\t\t\t\tif (floorStacks.length > 1) {\n\t\t\t\t\t\tgui.replace('FloorStack', {\n\t\t\t\t\t\t\tdefault: mapView.currentFloorStack.id,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tgui.replace('Floor', {\n\t\t\t\t\t\tdefault: mapView.currentFloor.id,\n\t\t\t\t\t\targs: mapView.currentFloorStack.floors.reduce(\n\t\t\t\t\t\t\t(acc, { id, name }) => ({\n\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t[name]: id,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n\n\tconst venue = mapData.getByType('enterprise-venue');\n\tif (venue && venue.languages.length > 1) {\n\t\tcontrols.Language = {\n\t\t\tdefault: mapData.currentLanguage?.code || venue.languages[0].code,\n\t\t\targs: venue.languages.reduce(\n\t\t\t\t(acc, { code, name }) => ({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[name]: code,\n\t\t\t\t}),\n\t\t\t\t{},\n\t\t\t),\n\t\t\tonChange: value => {\n\t\t\t\tmapData.changeLanguage(value as string);\n\t\t\t},\n\t\t};\n\t}\n\n\treturn controls;\n}\n\nfunction createGUI(mapData: MapData, mapView: MapView, root = new LilGUI()) {\n\tconst gui = new GUI(root);\n\n\tconst defaultControls = createDefaultControls(mapData, mapView, gui);\n\n\tif (!Object.keys(defaultControls).length) {\n\t\tgui.hide();\n\t}\n\n\tfor (const name in defaultControls) {\n\t\tgui.add(name, defaultControls[name]);\n\t}\n\n\treturn gui;\n}\n\nexport { createGUI, type GUI, type Control, type Controls, type ControlValue };\n"],
5
+ "mappings": "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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAuanB,SAASC,GAAeC,EAAa,CACpC,IAA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",
6
+ "names": ["init_define_process", "init_define_process", "init_define_process", "init_define_process", "Controller", "_Controller", "parent", "object", "property", "className", "elementType", "e", "name", "callback", "enabled", "disabled", "show", "options", "controller", "min", "max", "step", "decimals", "listen", "curValue", "value", "BooleanController", "normalizeColorString", "string", "match", "result", "STRING", "v", "INT", "ARRAY", "target", "rgbScale", "int", "r", "g", "b", "OBJECT", "FORMATS", "getColorFormat", "format", "ColorController", "tryParse", "newValue", "FunctionController", "NumberController", "stepExplicit", "explicit", "percent", "onInput", "increment", "delta", "onKeyDown", "onWheel", "testingForVerticalDrag", "initClientX", "initClientY", "prevClientY", "initValue", "dragDelta", "DRAG_THRESH", "onMouseDown", "onMouseMove", "onMouseUp", "dx", "dy", "onFocus", "onBlur", "map", "a", "c", "d", "setValueFromX", "clientX", "rect", "mouseDown", "mouseMove", "mouseUp", "testingForScroll", "prevClientX", "beginTouchDrag", "onTouchStart", "onTouchMove", "onTouchEnd", "callOnFinishChange", "WHEEL_DEBOUNCE_TIME", "wheelFinishChangeTimeout", "active", "axis", "deltaX", "deltaY", "mult", "root", "OptionController", "$option", "index", "StringController", "stylesheet", "_injectStyles", "cssContent", "injected", "before", "stylesInjected", "GUI", "_GUI", "autoPlace", "container", "width", "title", "closeFolders", "injectStyles", "touchStyles", "$1", "initialValue", "folder", "obj", "recursive", "f", "open", "closed", "initialHeight", "onTransitionEnd", "targetHeight", "changedGUI", "controllers", "folders", "lil_gui_esm_default", "init_define_process", "init_define_process", "normalizeColor", "color", "Color", "c", "runAll", "fns", "fn", "updateCurrentUrlParamsWithNamespace", "params", "namespace", "currentUrl", "urlObj", "searchParams", "key", "namespacedKey", "getUrlParamsWithNamespace", "state", "value", "actualKey", "propToRender", "renderByProp", "mapView", "parentGui", "itemFolder", "prop", "v", "normalizeColor", "c", "init_define_process", "init_define_process", "createHighlightControl", "lastMarkers", "getHighlightTarget", "mapView", "item", "mapData", "target", "space_default", "foundLocation", "l", "s", "focusOn", "category_default", "focusOnOptions", "location_default", "highlightCard", "focus", "card", "title", "description", "tagsContainer", "tag", "tagElement", "controls", "gui", "lil_gui_esm_default", "state", "renderByProp", "marker", "space", "locationMarkers", "coordinateNames", "location", "key", "highlightControl", "init_define_process", "state", "createAdvancedSettings", "parent", "createSearchControl", "mapView", "mapData", "pubsub", "PubSub", "searchPanel", "control", "v", "results", "renderSearchQuery", "resultsContainer", "close", "mount", "advancedSettingsPanel", "e", "containerEl", "input", "suggestTimeout", "dropdownControl", "event", "suggestions", "renderSuggestion", "suggestion", "inputValue", "createCustomDropdown", "_mapView", "dropdownContainer", "styles", "optionsList", "options", "addSection", "title", "items", "sectionHeader", "item", "i", "option", "highlightOption", "highlightUndo", "index", "undo", "opt", "type", "handleClickOutside", "destroy", "createInteractionControls", "mapView", "mapData", "parent", "cleanup", "searchPubsub", "createSearchControl", "item", "fn", "space", "location_default", "space_default", "highlightControl", "clickFolder", "clickSub", "createClickControls", "payload", "hoverFolder", "hoverSub", "createHoverControls", "hoverCleanup", "sub", "PubSub", "state", "normalizeColor", "positionControl", "cleanups", "reset", "intervalId", "labels", "markers", "coordinate", "entity2D", "labelControl", "addLabelControlToFolder", "geometryDataObject", "createIsInViewHandler", "renderByProp", "c", "hoverState", "spaces", "objects", "entity", "s", "id", "createLabelControls", "labelFolder", "_mapData", "mapView", "state", "renderLabels", "addLabel", "destroy", "createAddControl", "labelsListFolder", "labelGuiMap", "remove", "label", "add", "control", "addLabelControlToFolder", "l", "labelItemFolder", "rerender", "k", "item", "lastLabelControl", "labels", "coordinate", "populatelabels", "entity", "parent", "onRemove", "_", "uiState", "appearance", "interactive", "normalizeColor", "createIsInViewHandler", "addFolder", "style_default", "init_define_process", "CAMERA_UI", "createCameraControls", "parent", "mapView", "options", "cameraControl", "v", "updateCurrentUrlParamsWithNamespace", "cameraUiState", "getUrlParamsWithNamespace", "initialCameraCenter", "el", "h", "w", "top", "right", "bottom", "left", "state", "updateInsetVisualizer", "visualizeInsetUpdated", "updateInset", "handler", "createHandler", "onCameraChanged", "params", "paramState", "target", "coordinate_default", "cleanups", "runAll", "payload", "spaces", "objects", "item", "init_define_process", "createMarkerControls", "markerFolder", "_mapData", "mapView", "state", "renderMarkers", "addMarker", "destroy", "createAddControl", "markersListFolder", "markerGuiMap", "remove", "marker", "add", "control", "addMarkerControlToFolder", "l", "markerItemFolder", "rerender", "k", "item", "lastMarkerControl", "markers", "coordinate", "populateMarkers", "parent", "onRemove", "_", "uiState", "interactive", "addFolder", "init_define_process", "createGeometryControl", "parent", "mapView", "panel", "state", "v", "c", "init_define_process", "createMiscControl", "panel", "_mapView", "mapData", "state", "venue", "v", "init_define_process", "createDebugControl", "parent", "mapView", "_mapData", "folder", "debugInitialState", "state", "v", "init_define_process", "createText3DControl", "parent", "mapView", "_mapData", "folder", "state", "init_define_process", "init_define_process", "init_define_process", "_gui", "_folders", "_controlsData", "_controls", "_controller", "_GUI_instances", "addControl_fn", "getFolder_fn", "addColorControl_fn", "GUI", "root", "__privateAdd", "__privateSet", "__privateGet", "name", "control", "folderName", "__privateMethod", "value", "newControl", "folder", "createDefaultControls", "mapData", "mapView", "gui", "controls", "floors", "floorStacks", "acc", "id", "b", "floorValue", "event", "venue", "code", "createGUI", "defaultControls", "createStackMapsControl", "mapView", "mapData", "initialfloorsInStack", "root", "floorsInDirections", "showLabelsPerFloor", "zoomToFloor", "floor", "showCurrentFloorWithPadding", "scrollToFloor", "previousFloor", "change", "state", "spaces", "labelsPerFloor", "acc", "space", "labels", "label", "gui", "createGUI", "floorsInStack", "expandAll", "floorIndex", "f", "upFloor", "downFloor", "createStackmapsControl", "parent", "mapView", "mapData", "folder", "createStackMapsControl", "createUi", "mapData", "mapView", "options", "injectCss", "panel", "lil_gui_esm_default", "createInteractionControls", "createCameraControls", "levelsFolder", "sceneFolder", "labelFolder", "createText3DControl", "markerFolder", "createGeometryControl", "createStackmapsControl", "miscFolder", "createDebugControl", "createMiscControl", "state", "populatelabels", "createLabelControls", "populateMarkers", "createMarkerControls", "levels", "acc", "floor", "levelsControl", "update", "event", "s", "o", "STYLE_EL_ID", "style", "style_default", "Inspector", "mv", "api", "__publicField", "data", "options", "sceneFolder", "createUi", "v", "mountSceneGraphVisualizer", "f"]
7
+ }
@@ -0,0 +1,2 @@
1
+ .mappedin__smart-collision-engine__container{position:absolute;inset:0;pointer-events:none;transform-style:preserve-3d;font-family:InterUI-Regular,Helvetica,Arial,sans-serif}.mappedin__smart-collision-engine-debug__container{position:absolute;inset:0;transition:opacity .3s ease-in-out;pointer-events:none;will-change:opacity}.mappedin__smart-collision-engine-debug__container.interacting{opacity:.2}.mappedin-map .mappedin-interactive{cursor:grab}.mappedin-map .mappedin-interactive:active{cursor:grabbing}.mappedin-map .mappedin-interactive.mappedin-interaction-hover{cursor:pointer}.mappedin-marker{font-family:InterUI-Regular,Helvetica,Arial,sans-serif;font-weight:400;top:0;position:absolute;font-weight:700;color:#000;display:flex;flex-direction:row;will-change:transform,opacity;transition:opacity .15s ease-in-out;justify-content:center;opacity:0}.mappedin-marker[data-anchor=low-priority-pin]{font-size:0;line-height:0}.mappedin-marker[data-anchor=low-priority-pin]>*{visibility:hidden}.mappedin-marker[data-anchor=low-priority-pin]:before{content:"";display:block;border-radius:50%;position:relative;width:var(--mappedin-pin-size, 2px);height:var(--mappedin-pin-size, 2px);background-color:var(--pin-color, #666)}.mappedin-map .mappedin-control-container{position:absolute;inset:0;pointer-events:none;font-family:InterUI-Regular,Helvetica,Arial,sans-serif}.mappedin-map .mappedin-control-container .mappedin-ctrl-top-left,.mappedin-map .mappedin-control-container .mappedin-ctrl-top-right,.mappedin-map .mappedin-control-container .mappedin-ctrl-bottom-left,.mappedin-map .mappedin-control-container .mappedin-ctrl-bottom-right{position:absolute;pointer-events:none}.mappedin-map .mappedin-control-container .mappedin-ctrl-top-left{top:0;left:0}.mappedin-map .mappedin-control-container .mappedin-ctrl-top-right{top:0;right:0}.mappedin-map .mappedin-control-container .mappedin-ctrl-bottom-left{bottom:0;left:0}.mappedin-map .mappedin-control-container .mappedin-ctrl-bottom-right{bottom:0;right:0}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib{display:block;position:relative;pointer-events:auto;font:9px/11px InterUI-Regular,Helvetica,Arial,sans-serif;padding:3px 5px 1px;background-color:#ffffff80;margin:0;min-width:11px;min-height:11px;user-select:none}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib summary.mappedin-ctrl-attrib-button{appearance:none;list-style:none}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib summary.mappedin-ctrl-attrib-button::-webkit-details-marker{display:none}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib.mappedin-compact .mappedin-ctrl-attrib-button,.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib.mappedin-compact-show .mappedin-ctrl-attrib-inner{display:inline-block}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib.mappedin-compact{background-color:transparent}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib.mappedin-compact-show{min-width:15px;min-height:15px;box-sizing:border-box;background-color:#ffffff80}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-top-left{float:left;border-bottom-right-radius:4px}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-top-right{float:right;border-bottom-left-radius:4px}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-bottom-left{float:left;border-top-right-radius:4px}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-bottom-right{float:right;border-top-left-radius:4px}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-top-left,.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-bottom-left{padding:3px 5px 1px 20px}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-inner{display:inline-block;margin-right:12px}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-inner,.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-inner a{color:#000000bf;text-decoration:none}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-inner-bold,.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-inner-bold a{font-weight:700}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-inner a:hover{color:#017ef1;text-decoration:underline;cursor:pointer}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-button{display:none;cursor:pointer;position:absolute;width:15px;height:15px;box-sizing:border-box;border-radius:50%;top:0;right:2px;border:1px}.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-top-left .mappedin-ctrl-attrib-button,.mappedin-map .mappedin-control-container .mappedin-ctrl-attrib-bottom-left .mappedin-ctrl-attrib-button{left:2px}.maplibregl-map{font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative;-webkit-tap-highlight-color:rgb(0 0 0 / 0%)}.maplibregl-canvas{position:absolute;left:0;top:0}.maplibregl-map:fullscreen{width:100%;height:100%}.maplibregl-ctrl-group button.maplibregl-ctrl-compass{touch-action:none}.maplibregl-canvas-container.maplibregl-interactive,.maplibregl-ctrl-group button.maplibregl-ctrl-compass{cursor:grab;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.maplibregl-canvas-container.maplibregl-interactive.maplibregl-track-pointer{cursor:pointer}.maplibregl-canvas-container.maplibregl-interactive:active,.maplibregl-ctrl-group button.maplibregl-ctrl-compass:active{cursor:grabbing}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-canvas-container.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:pinch-zoom}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:none}.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures,.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-ctrl-top-left,.maplibregl-ctrl-top-right,.maplibregl-ctrl-bottom-left,.maplibregl-ctrl-bottom-right{position:absolute;pointer-events:none;z-index:2}.maplibregl-ctrl-top-left{top:0;left:0}.maplibregl-ctrl-top-right{top:0;right:0}.maplibregl-ctrl-bottom-left{bottom:0;left:0}.maplibregl-ctrl-bottom-right{right:0;bottom:0}.maplibregl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.maplibregl-ctrl-top-left .maplibregl-ctrl{margin:10px 0 0 10px;float:left}.maplibregl-ctrl-top-right .maplibregl-ctrl{margin:10px 10px 0 0;float:right}.maplibregl-ctrl-bottom-left .maplibregl-ctrl{margin:0 0 10px 10px;float:left}.maplibregl-ctrl-bottom-right .maplibregl-ctrl{margin:0 10px 10px 0;float:right}.maplibregl-ctrl-group{border-radius:4px;background:#fff}.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px #0000001a}@media (-ms-high-contrast: active){.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.maplibregl-ctrl-group button{width:29px;height:29px;display:block;padding:0;outline:none;border:0;box-sizing:border-box;background-color:transparent;cursor:pointer}.maplibregl-ctrl-group button+button{border-top:1px solid #ddd}.maplibregl-ctrl button .maplibregl-ctrl-icon{display:block;width:100%;height:100%;background-repeat:no-repeat;background-position:center center}@media (-ms-high-contrast: active){.maplibregl-ctrl-icon{background-color:transparent}.maplibregl-ctrl-group button+button{border-top:1px solid ButtonText}}.maplibregl-ctrl button::-moz-focus-inner{border:0;padding:0}.maplibregl-ctrl-attrib-button:focus,.maplibregl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl button:disabled{cursor:not-allowed}.maplibregl-ctrl button:disabled .maplibregl-ctrl-icon{opacity:.25}.maplibregl-ctrl button:not(:disabled):hover{background-color:#0000000d}.maplibregl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.maplibregl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.maplibregl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.maplibregl-ctrl-group button:focus:only-child{border-radius:inherit}.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-zoom-out.svg",fill: #333)}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-zoom-in.svg",fill: #333)}@media (-ms-high-contrast: active){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-zoom-out.svg",fill: #fff)}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-zoom-in.svg",fill: #fff)}}@media (-ms-high-contrast: black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-zoom-out.svg",fill: #000)}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-zoom-in.svg",fill: #000)}}.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-fullscreen.svg",fill: #333)}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-shrink.svg")}@media (-ms-high-contrast: active){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-fullscreen.svg",fill: #fff)}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-shrink.svg",fill: #fff)}}@media (-ms-high-contrast: black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-fullscreen.svg",fill: #000)}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-shrink.svg",fill: #000)}}.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-compass.svg",fill: #333)}@media (-ms-high-contrast: active){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{@svg-load ctrl-compass-white url(svg/maplibregl-ctrl-compass.svg){fill: #fff; #south {fill: #999;}}background-image:svg-inline(ctrl-compass-white)}}@media (-ms-high-contrast: black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-compass.svg",fill: #000)}}@svg-load ctrl-terrain url(svg/maplibregl-ctrl-terrain.svg){fill: #333; #stroke {display: none;}}@svg-load ctrl-terrain-enabled url(svg/maplibregl-ctrl-terrain.svg){fill: #33b5e5; #stroke {display: none;}}.maplibregl-ctrl button.maplibregl-ctrl-terrain .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-terrain)}.maplibregl-ctrl button.maplibregl-ctrl-terrain-enabled .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-terrain-enabled)}@svg-load ctrl-geolocate url(svg/maplibregl-ctrl-geolocate.svg){fill: #333; #stroke {display: none;}}@svg-load ctrl-geolocate-white url(svg/maplibregl-ctrl-geolocate.svg){fill: #fff; #stroke {display: none;}}@svg-load ctrl-geolocate-black url(svg/maplibregl-ctrl-geolocate.svg){fill: #000; #stroke {display: none;}}@svg-load ctrl-geolocate-disabled url(svg/maplibregl-ctrl-geolocate.svg){fill: #aaa; #stroke {fill: #f00;}}@svg-load ctrl-geolocate-disabled-white url(svg/maplibregl-ctrl-geolocate.svg){fill: #999; #stroke {fill: #f00;}}@svg-load ctrl-geolocate-disabled-black url(svg/maplibregl-ctrl-geolocate.svg){fill: #666; #stroke {fill: #f00;}}@svg-load ctrl-geolocate-active url(svg/maplibregl-ctrl-geolocate.svg){fill: #33b5e5; #stroke {display: none;}}@svg-load ctrl-geolocate-active-error url(svg/maplibregl-ctrl-geolocate.svg){fill: #e58978; #stroke {display: none;}}@svg-load ctrl-geolocate-background url(svg/maplibregl-ctrl-geolocate.svg){fill: #33b5e5; #stroke {display: none;} #dot {display: none;}}@svg-load ctrl-geolocate-background-error url(svg/maplibregl-ctrl-geolocate.svg){fill: #e54e33; #stroke {display: none;} #dot {display: none;}}.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-disabled)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-active)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-active-error)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-background)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-background-error)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-waiting .maplibregl-ctrl-icon{animation:maplibregl-spin 2s infinite linear}@media (-ms-high-contrast: active){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-white)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-disabled-white)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-active)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-active-error)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-background)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-background-error)}}@media (-ms-high-contrast: black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-black)}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-geolocate-disabled-black)}}@keyframes maplibregl-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}a.maplibregl-ctrl-logo{width:88px;height:23px;margin:0 0 -4px -4px;display:block;background-repeat:no-repeat;cursor:pointer;overflow:hidden;background-image:svg-load("svg/maplibregl-ctrl-logo.svg")}a.maplibregl-ctrl-logo.maplibregl-compact{width:14px}@media (-ms-high-contrast: active){a.maplibregl-ctrl-logo{@svg-load ctrl-logo-white url(svg/maplibregl-ctrl-logo.svg){#outline {opacity: 1;} #fill {opacity: 1;}}background-color:transparent;background-image:svg-inline(ctrl-logo-white)}}@media (-ms-high-contrast: black-on-white){a.maplibregl-ctrl-logo{@svg-load ctrl-logo-black url(svg/maplibregl-ctrl-logo.svg){#outline {opacity: 1; fill: #fff; stroke: #fff;} #fill {opacity: 1; fill: #000;}}background-image:svg-inline(ctrl-logo-black)}}.maplibregl-ctrl.maplibregl-ctrl-attrib{padding:0 5px;background-color:#ffffff7f;margin:0}@media screen{.maplibregl-ctrl-attrib.maplibregl-compact{min-height:20px;padding:2px 24px 2px 0;margin:10px;position:relative;background-color:#fff;color:#000;border-radius:12px;box-sizing:content-box}.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact-show,.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 8px 2px 28px;border-radius:12px}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-inner{display:none}.maplibregl-ctrl-attrib-button{display:none;cursor:pointer;position:absolute;background-image:svg-load("svg/maplibregl-ctrl-attrib.svg");background-color:#ffffff7f;width:24px;height:24px;box-sizing:border-box;border-radius:12px;outline:none;top:0;right:0;border:0}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button{appearance:none;list-style:none}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button::-webkit-details-marker{display:none}.maplibregl-ctrl-top-left .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-bottom-left .maplibregl-ctrl-attrib-button{left:0}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-inner{display:block}.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-button{background-color:#0000000d}.maplibregl-ctrl-bottom-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;right:0}.maplibregl-ctrl-top-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{top:0;right:0}.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{top:0;left:0}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;left:0}}@media screen and (-ms-high-contrast: active){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:svg-load("svg/maplibregl-ctrl-attrib.svg",fill=#fff)}}@media screen and (-ms-high-contrast: black-on-white){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:svg-load("svg/maplibregl-ctrl-attrib.svg")}}.maplibregl-ctrl-attrib a{color:#000000bf;text-decoration:none}.maplibregl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.maplibregl-attrib-empty{display:none}.maplibregl-ctrl-scale{background-color:#ffffffbf;font-size:10px;border-width:medium 2px 2px;border-style:none solid solid;border-color:#333;padding:0 5px;color:#333;box-sizing:border-box}.maplibregl-popup{position:absolute;top:0;left:0;display:flex;will-change:transform;pointer-events:none}.maplibregl-popup-anchor-top,.maplibregl-popup-anchor-top-left,.maplibregl-popup-anchor-top-right{flex-direction:column}.maplibregl-popup-anchor-bottom,.maplibregl-popup-anchor-bottom-left,.maplibregl-popup-anchor-bottom-right{flex-direction:column-reverse}.maplibregl-popup-anchor-left{flex-direction:row}.maplibregl-popup-anchor-right{flex-direction:row-reverse}.maplibregl-popup-tip{width:0;height:0;border:10px solid transparent;z-index:1}.maplibregl-popup-anchor-top .maplibregl-popup-tip{align-self:center;border-top:none;border-bottom-color:#fff}.maplibregl-popup-anchor-top-left .maplibregl-popup-tip{align-self:flex-start;border-top:none;border-left:none;border-bottom-color:#fff}.maplibregl-popup-anchor-top-right .maplibregl-popup-tip{align-self:flex-end;border-top:none;border-right:none;border-bottom-color:#fff}.maplibregl-popup-anchor-bottom .maplibregl-popup-tip{align-self:center;border-bottom:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip{align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.maplibregl-popup-anchor-left .maplibregl-popup-tip{align-self:center;border-left:none;border-right-color:#fff}.maplibregl-popup-anchor-right .maplibregl-popup-tip{align-self:center;border-right:none;border-left-color:#fff}.maplibregl-popup-close-button{position:absolute;right:0;top:0;border:0;border-radius:0 3px 0 0;cursor:pointer;background-color:transparent}.maplibregl-popup-close-button:hover{background-color:#0000000d}.maplibregl-popup-content{position:relative;background:#fff;border-radius:3px;box-shadow:0 1px 2px #0000001a;padding:15px 10px;pointer-events:auto}.maplibregl-popup-anchor-top-left .maplibregl-popup-content{border-top-left-radius:0}.maplibregl-popup-anchor-top-right .maplibregl-popup-content{border-top-right-radius:0}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-content{border-bottom-left-radius:0}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-content{border-bottom-right-radius:0}.maplibregl-popup-track-pointer{display:none}.maplibregl-popup-track-pointer *{pointer-events:none;user-select:none}.maplibregl-map:hover .maplibregl-popup-track-pointer{display:flex}.maplibregl-map:active .maplibregl-popup-track-pointer{display:none}.maplibregl-marker{position:absolute;top:0;left:0;will-change:transform;transition:opacity .2s}.maplibregl-user-location-dot{background-color:#1da1f2;width:15px;height:15px;border-radius:50%}.maplibregl-user-location-dot:before{background-color:#1da1f2;content:"";width:15px;height:15px;border-radius:50%;position:absolute;animation:maplibregl-user-location-dot-pulse 2s infinite}.maplibregl-user-location-dot:after{border-radius:50%;border:2px solid #fff;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px;box-sizing:border-box;box-shadow:0 0 3px #00000059}@keyframes maplibregl-user-location-dot-pulse{0%{transform:scale(1);opacity:1}70%{transform:scale(3);opacity:0}to{transform:scale(1);opacity:0}}.maplibregl-user-location-dot-stale{background-color:#aaa}.maplibregl-user-location-dot-stale:after{display:none}.maplibregl-user-location-accuracy-circle{background-color:#1da1f233;width:1px;height:1px;border-radius:100%}.maplibregl-crosshair,.maplibregl-crosshair .maplibregl-interactive,.maplibregl-crosshair .maplibregl-interactive:active{cursor:crosshair}.maplibregl-boxzoom{position:absolute;top:0;left:0;width:0;height:0;background:#fff;border:2px dotted #202020;opacity:.5}.maplibregl-cooperative-gesture-screen{background:#0006;position:absolute;inset:0;display:flex;justify-content:center;align-items:center;color:#fff;padding:1rem;font-size:1.4em;line-height:1.2;opacity:0;pointer-events:none;transition:opacity 1s ease 1s;z-index:99999}.maplibregl-cooperative-gesture-screen.maplibregl-show{opacity:1;transition:opacity .05s}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:none}@media (hover: none),(width <= 480px){.maplibregl-cooperative-gesture-screen .maplibregl-desktop-message{display:none}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:block}}.maplibregl-pseudo-fullscreen{position:fixed!important;width:100%!important;height:100%!important;top:0!important;left:0!important;z-index:99999}:root{--pin-shadow-hover-scale: .9;--pin-shadow-width: 12px;--pin-shadow-height: 5px;--pin-shadow-opacity: .35;--pin-drop-animation-duration-ms: .25s}@keyframes drop-pin{0%{transform:translateY(-200%)}to{transform:translateY(0)}}@keyframes pin-shadow{0%{transform:scale(var(--pin-shadow-hover-scale))}to{transform:scale(1)}}.mappedin-dropped-pin-wrapper{position:relative;width:fit-content;height:fit-content;width:36px;height:42px}.mappedin-dropped-pin-wrapper svg{position:absolute;left:calc(50% - var(--pin-shadow-width));animation:drop-pin var(--pin-drop-animation-duration-ms) ease-in}.mappedin-dropped-pin-wrapper>.pin-shadow{position:absolute;left:calc(50% - var(--pin-shadow-width) / 2);bottom:0;height:var(--pin-shadow-height);width:var(--pin-shadow-width);border-radius:100%;opacity:var(--pin-shadow-opacity);animation:pin-shadow .25s ease-in}@keyframes bounce{0%{transform:translateY(-10px);opacity:0}12.5%{transform:translateY(0);opacity:1}25%{transform:translateY(0)}37.5%{transform:translateY(-10px)}50%{transform:translateY(0)}62.5%{transform:translateY(-10px)}75%{transform:translateY(0)}87.5%{transform:translateY(-10px)}to{transform:translateY(0)}}.mappedin-connection-marker{position:relative;display:flex}.mappedin-connection-marker .bouncey{animation:bounce 2.5s linear}.mappedin-connection-marker .arrow--down{transform:rotate(180deg)}.mappedin-connection-marker .connection-circle{display:flex;box-sizing:border-box;justify-content:center;align-items:center;border-radius:50%;border:2px solid white;box-shadow:0 2px 8px #00000026;background:#595959}.mappedin-js-inspector .list-items{max-height:600px;overflow-y:scroll;scroll-behavior:smooth}.mappedin-js-inspector .children:focus{border:1px solid blue}.mappedin-js-inspector #interactionPanel{position:absolute;right:0}.mappedin-js-inspector #mainPanel{position:absolute;left:0}.mappedin-js-inspector .title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
2
+ /*# sourceMappingURL=internal-WH523TQS.css.map */