@mappedin/mappedin-js 6.1.2 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_LICENSES.txt +19 -17
- package/lib/esm/GLTFExporter-ZVF3Y5DX.js +1 -0
- package/lib/esm/{GLTFLoader-TLLNLQ5Y.js → GLTFLoader-3QTALUTA.js} +1 -2
- package/lib/esm/chunk-2DEFE4C2.js +1 -0
- package/lib/esm/chunk-5W2UDR4H.js +1 -0
- package/lib/esm/chunk-66DYOCZO.js +1 -0
- package/lib/esm/chunk-Q56Y72HB.js +1 -0
- package/lib/esm/{chunk-MLCPE7I2.js → chunk-YB4VFXKF.js} +1 -2
- package/lib/esm/index.css +1 -2
- package/lib/esm/index.d.ts +180 -54
- package/lib/esm/index.js +1 -2
- package/lib/esm/inspector-B32KFAD4.js +1 -0
- package/lib/esm/inspector-Z5ATF4CD.css +1 -0
- package/lib/esm/internal-OFWBS2NI.css +1 -0
- package/lib/esm/internal-RK6SZERV.js +1 -0
- package/lib/esm/{roboto-regular-R5KXKW73.js → roboto-regular-ERMR6E6W.js} +1 -2
- package/lib/esm/text3d-DIUCQLOC.js +1 -0
- package/lib/esm/{text3d-AXM5ZHCS.css → text3d-M57DIX3E.css} +0 -1
- package/lib/esm/workers/collision-worker.csp.js +1 -23
- package/lib/esm/workers/maplibre-worker.csp.js +1 -2
- package/lib/index.css +1 -2
- package/package.json +6 -4
- package/lib/esm/GLTFExporter-O4OUZTHE.js +0 -2
- package/lib/esm/GLTFExporter-O4OUZTHE.js.map +0 -7
- package/lib/esm/GLTFLoader-TLLNLQ5Y.js.map +0 -7
- package/lib/esm/chunk-3PM6GKGK.js +0 -2048
- package/lib/esm/chunk-3PM6GKGK.js.map +0 -7
- package/lib/esm/chunk-3U5JJXJA.js +0 -3820
- package/lib/esm/chunk-3U5JJXJA.js.map +0 -7
- package/lib/esm/chunk-MLCPE7I2.js.map +0 -7
- package/lib/esm/chunk-ROCNZJLL.js +0 -2
- package/lib/esm/chunk-ROCNZJLL.js.map +0 -7
- package/lib/esm/chunk-UOCWYBVK.js +0 -938
- package/lib/esm/chunk-UOCWYBVK.js.map +0 -7
- package/lib/esm/index.css.map +0 -7
- package/lib/esm/index.js.map +0 -7
- package/lib/esm/inspector-2XETNHYZ.css +0 -2
- package/lib/esm/inspector-2XETNHYZ.css.map +0 -7
- package/lib/esm/inspector-66PSYVJU.js +0 -483
- package/lib/esm/inspector-66PSYVJU.js.map +0 -7
- package/lib/esm/internal-R5XTRV7Q.css +0 -2
- package/lib/esm/internal-R5XTRV7Q.css.map +0 -7
- package/lib/esm/internal-WJZVXVL6.js +0 -2
- package/lib/esm/internal-WJZVXVL6.js.map +0 -7
- package/lib/esm/roboto-regular-R5KXKW73.js.map +0 -7
- package/lib/esm/text3d-AXM5ZHCS.css.map +0 -7
- package/lib/esm/text3d-EZBY7L7A.js +0 -253
- package/lib/esm/text3d-EZBY7L7A.js.map +0 -7
- package/lib/index-rn.js +0 -4306
|
@@ -1,7 +0,0 @@
|
|
|
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"],
|
|
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, { 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';\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\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\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, Marker } from '../../';\nimport { normalizeColor } from './utils';\nimport type { MapView } from '../../map-view';\nimport { createIsInViewHandler } from './interaction-control';\nimport { LABEL_STATE_TYPE, MARKER_STATE_TYPE } from '../../states';\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.__EXPERIMENTAL__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 as Label);\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\nfunction handleMarkerState(\n\tmapView: MapView,\n\tentity: Marker,\n\titemFolder: GUI,\n\tstate: any,\n\tonRemove?: (removed: Marker) => void,\n) {\n\tconst { interactive, enabled, rank, anchor, dynamicResize, zIndex, contentHTML, lowPriorityPin } = state;\n\tif (interactive == null || enabled == null) throw new Error('incomplete marker state');\n\n\tconst uiState = {\n\t\tinteractive,\n\t\tenabled,\n\t\trank: rank || 'medium',\n\t\tanchor: Array.isArray(anchor) ? anchor.join(', ') : anchor || 'center',\n\t\tdynamicResize: dynamicResize || false,\n\t\tzIndex: zIndex || 0,\n\t\tcontentHTML: contentHTML || '',\n\t\tlowPriorityPin: {\n\t\t\tenabled: lowPriorityPin?.enabled ?? true,\n\t\t\tsize: lowPriorityPin?.size ?? 8,\n\t\t\tcolor: normalizeColor(lowPriorityPin?.color ?? '#666'),\n\t\t},\n\t\tremove() {\n\t\t\tmapView.Markers.remove(entity);\n\t\t\tonRemove?.(entity);\n\t\t\titemFolder.destroy();\n\t\t},\n\t\tisInView: createIsInViewHandler(mapView, entity.id),\n\t};\n\n\titemFolder.onChange(_ => {\n\t\tconst updates: any = {\n\t\t\tinteractive: uiState.interactive,\n\t\t\tenabled: uiState.enabled,\n\t\t\trank: uiState.rank as any,\n\t\t\tdynamicResize: uiState.dynamicResize,\n\t\t\tcontentHTML: uiState.contentHTML,\n\t\t\tlowPriorityPin: {\n\t\t\t\tenabled: uiState.lowPriorityPin.enabled,\n\t\t\t\tsize: uiState.lowPriorityPin.size,\n\t\t\t\tcolor: uiState.lowPriorityPin.color,\n\t\t\t},\n\t\t};\n\n\t\t// Only include zIndex if rank is 'always-visible'\n\t\tif (uiState.rank === 'always-visible') {\n\t\t\tupdates.zIndex = uiState.zIndex;\n\t\t}\n\n\t\tmapView.updateState(entity, updates);\n\t});\n\n\t// Basic properties\n\titemFolder.add(uiState, 'interactive');\n\titemFolder.add(uiState, 'enabled');\n\titemFolder.add(uiState, 'rank', ['medium', 'high', 'always-visible', 'initial']).name('rank');\n\titemFolder.add(uiState, 'anchor').name('anchor (read-only)').disable();\n\titemFolder.add(uiState, 'dynamicResize').name('dynamic resize');\n\n\t// Only show zIndex control when rank is 'always-visible'\n\tif (uiState.rank === 'always-visible') {\n\t\titemFolder.add(uiState, 'zIndex', 0, 1000, 1).name('z-index');\n\t}\n\n\t// Content\n\titemFolder.add(uiState, 'contentHTML').name('content HTML');\n\n\t// Low priority pin\n\tconst lowPriorityFolder = itemFolder.addFolder('Low Priority Pin');\n\tlowPriorityFolder.add(uiState.lowPriorityPin, 'enabled');\n\tlowPriorityFolder.add(uiState.lowPriorityPin, 'size', 1, 20, 1);\n\tlowPriorityFolder.addColor(uiState.lowPriorityPin, 'color');\n\tlowPriorityFolder.close();\n\n\t// Actions\n\titemFolder.add(uiState, 'isInView');\n\titemFolder.add(uiState, 'remove');\n}\n\nfunction handleLabelState(\n\tmapView: MapView,\n\tentity: Label,\n\titemFolder: GUI,\n\tstate: any,\n\tonRemove?: (removed: Label) => void,\n) {\n\tconst { appearance, interactive } = state;\n\tif (!appearance || appearance.margin == null || interactive == null) throw new Error('incomplte label state');\n\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\tpinColor: appearance.pinColor ? normalizeColor(appearance.pinColor) : 'black',\n\t\t\ttextColor: appearance.textColor ? normalizeColor(appearance.textColor) : 'black',\n\t\t},\n\t\tremove() {\n\t\t\tmapView.Labels.remove(entity);\n\t\t\tonRemove?.(entity);\n\t\t\titemFolder.destroy();\n\t\t},\n\t\tisInView: createIsInViewHandler(mapView, entity.id),\n\t};\n\n\titemFolder.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\n\titemFolder.add(uiState.appearance, 'margin', 0, 20).name('margin');\n\titemFolder.add(uiState, 'text');\n\titemFolder.add(uiState, 'interactive');\n\titemFolder.addColor(uiState.appearance, 'pinColor').name('pin color');\n\titemFolder.addColor(uiState.appearance, 'pinOutlineColor').name('pin outline color');\n\titemFolder.addColor(uiState.appearance, 'textColor').name('text color');\n\titemFolder.addColor(uiState.appearance, 'textOutlineColor').name('text outline color');\n\titemFolder.add(uiState, 'isInView');\n\titemFolder.add(uiState, 'remove');\n}\n\nexport function addLabelControlToFolder(\n\tmapView: MapView,\n\tentity: Label | Marker,\n\tparent: GUI,\n\t{ onRemove }: { onRemove?: (removed: Label | Marker) => void } = {},\n) {\n\tconst state = mapView.getState(entity);\n\n\tif (!state) throw new Error(`error getting state for entity: ${entity.id}`);\n\n\tconst folderName =\n\t\tstate.type === LABEL_STATE_TYPE\n\t\t\t? (entity as Label).text?.substring(0, 12) || 'Label'\n\t\t\t: `Marker ${entity.id.toString().substring(0, 8)}`;\n\n\tconst itemFolder = parent.addFolder(folderName);\n\titemFolder.close();\n\n\tif (state.type === LABEL_STATE_TYPE) {\n\t\thandleLabelState(mapView, entity as Label, itemFolder, state, onRemove as any);\n\t} else if (state.type === MARKER_STATE_TYPE) {\n\t\thandleMarkerState(mapView, entity as Marker, itemFolder, state, onRemove as any);\n\t} else {\n\t\tthrow new Error(`unsupported entity type: ${(state as any).type}`);\n\t}\n\n\treturn {\n\t\tlabelItemFolder: itemFolder,\n\t\tdestroy() {\n\t\t\titemFolder.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: 6,\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\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\tpinColor: state.marginForegroundColor,\n\t\t\t\t\tpinOutlineColor: state.marginBackgroundColor,\n\t\t\t\t\ttextColor: state.textForegroundColor,\n\t\t\t\t\ttextOutlineColor: state.textBackgroundColor,\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 entityIdentity = { id: state.id, __type: state.__type } as any;\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(entityIdentity, { [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(entityIdentity, { [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(entityIdentity, { [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(entityIdentity, {\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(entityIdentity, {\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(entityIdentity, { [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(entityIdentity, { [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(entityIdentity, { [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, 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];\n\t\tif (entity2D != null) {\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\t...geometryDataObject,\n\t\t\t\t...mapView.getState(geometryDataObject),\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});\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', placement: '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.container.appendChild(el);\n\n\t// Use container dimensions instead of window dimensions\n\tconst getContainerDimensions = () => mapView.getDimensions();\n\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,\n\t\tinset_left: left,\n\t\tinset_right: right,\n\t\tinset_bottom: bottom,\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\n\t\t// Use container dimensions for visualization\n\t\tconst { width: w, height: h } = getContainerDimensions();\n\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\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\t// Store references to the inset controls so we can update their ranges\n\tlet insetTopControl: any;\n\tlet insetBottomControl: any;\n\tlet insetLeftControl: any;\n\tlet insetRightControl: any;\n\n\t// Function to update inset control ranges based on type\n\tfunction updateInsetControlRanges() {\n\t\tconst { width: w, height: h } = getContainerDimensions();\n\n\t\t// Get current type before switching\n\t\tconst previousType = mapView.Camera.screenOffsets.type;\n\t\tconst currentType = state.inset_type;\n\n\t\t// Convert values when switching between types\n\t\tif (previousType !== currentType) {\n\t\t\tif (currentType === 'portion' && previousType === 'pixel') {\n\t\t\t\t// Convert pixel values to portion (0-1)\n\t\t\t\tstate.inset_top = w > 0 ? Math.min(state.inset_top / h, 1) : 0;\n\t\t\t\tstate.inset_bottom = w > 0 ? Math.min(state.inset_bottom / h, 1) : 0;\n\t\t\t\tstate.inset_left = h > 0 ? Math.min(state.inset_left / w, 1) : 0;\n\t\t\t\tstate.inset_right = h > 0 ? Math.min(state.inset_right / w, 1) : 0;\n\t\t\t} else if (currentType === 'pixel' && previousType === 'portion') {\n\t\t\t\t// Convert portion values to pixel\n\t\t\t\tstate.inset_top = Math.round(state.inset_top * h);\n\t\t\t\tstate.inset_bottom = Math.round(state.inset_bottom * h);\n\t\t\t\tstate.inset_left = Math.round(state.inset_left * w);\n\t\t\t\tstate.inset_right = Math.round(state.inset_right * w);\n\t\t\t}\n\t\t}\n\n\t\t// Remove existing controls\n\t\tif (insetTopControl) insetTopControl.destroy();\n\t\tif (insetBottomControl) insetBottomControl.destroy();\n\t\tif (insetLeftControl) insetLeftControl.destroy();\n\t\tif (insetRightControl) insetRightControl.destroy();\n\n\t\tif (state.inset_type === 'portion') {\n\t\t\t// For portion type, range should be 0-1 (0-100%)\n\t\t\tinsetTopControl = cameraControl.add(state, 'inset_top', 0, 1, 0.01).onChange(updateInset);\n\t\t\tinsetBottomControl = cameraControl.add(state, 'inset_bottom', 0, 1, 0.01).onChange(updateInset);\n\t\t\tinsetLeftControl = cameraControl.add(state, 'inset_left', 0, 1, 0.01).onChange(updateInset);\n\t\t\tinsetRightControl = cameraControl.add(state, 'inset_right', 0, 1, 0.01).onChange(updateInset);\n\t\t} else {\n\t\t\t// For pixel type, range should be 0 to container dimensions\n\t\t\tinsetTopControl = cameraControl.add(state, 'inset_top', 0, h, 1).onChange(updateInset);\n\t\t\tinsetBottomControl = cameraControl.add(state, 'inset_bottom', 0, h, 1).onChange(updateInset);\n\t\t\tinsetLeftControl = cameraControl.add(state, 'inset_left', 0, w, 1).onChange(updateInset);\n\t\t\tinsetRightControl = cameraControl.add(state, 'inset_right', 0, w, 1).onChange(updateInset);\n\t\t}\n\t}\n\n\t// Add type control and update ranges when type changes\n\tcameraControl.add(state, 'inset_type', ['pixel', 'portion']).onChange(() => {\n\t\tupdateInsetControlRanges();\n\t\tupdateInset();\n\t});\n\n\t// Initialize inset controls with correct ranges\n\tupdateInsetControlRanges();\n\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';\nimport { addLabelControlToFolder } from './labels-control';\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 = addLabelControlToFolder(mapView, marker, markersListFolder, {\n\t\t\t\tonRemove: l => {\n\t\t\t\t\tremove(l as Marker);\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!control) return;\n\t\t\tconst { labelItemFolder } = control;\n\t\t\tmarkerGuiMap.set(marker.id, labelItemFolder);\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\n// This function is now replaced by the enhanced addLabelControlToFolder in labels-control.ts\n// export function addMarkerControlToFolder is deprecated\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\trank: 'medium' as 'medium' | 'high' | 'always-visible' | 'initial',\n\t\tanchor: 'center' as any,\n\t\tdynamicResize: false,\n\t\tenabled: true,\n\t\tzIndex: 0,\n\t\tlowPriorityPin: {\n\t\t\tenabled: true,\n\t\t\tsize: 8,\n\t\t\tcolor: '#666',\n\t\t},\n\t\tcontentHTML:\n\t\t\t'<div style=\"padding: 8px; background: white; border: 2px solid #333; border-radius: 4px;\">New Marker</div>',\n\t};\n\n\taddFolder.add(state, 'onClick');\n\taddFolder.add(state, 'interactive');\n\taddFolder.add(state, 'enabled');\n\taddFolder.add(state, 'rank', ['medium', 'high', 'always-visible', 'initial']).name('rank');\n\taddFolder\n\t\t.add(state, 'anchor', [\n\t\t\t'center',\n\t\t\t'top',\n\t\t\t'bottom',\n\t\t\t'left',\n\t\t\t'right',\n\t\t\t'top-left',\n\t\t\t'top-right',\n\t\t\t'bottom-left',\n\t\t\t'bottom-right',\n\t\t])\n\t\t.name('anchor');\n\taddFolder.add(state, 'dynamicResize').name('dynamic resize');\n\taddFolder.add(state, 'zIndex', 0, 1000, 1).name('z-index (always-visible only)');\n\taddFolder.add(state, 'contentHTML').name('content HTML');\n\n\t// Low priority pin controls\n\tconst lowPriorityFolder = addFolder.addFolder('Low Priority Pin');\n\tlowPriorityFolder.add(state.lowPriorityPin, 'enabled');\n\tlowPriorityFolder.add(state.lowPriorityPin, 'size', 1, 20, 1);\n\tlowPriorityFolder.addColor(state.lowPriorityPin, 'color');\n\tlowPriorityFolder.close();\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\n\t\t\tconst options: any = {\n\t\t\t\tinteractive: state.interactive,\n\t\t\t\tenabled: state.enabled,\n\t\t\t\trank: state.rank,\n\t\t\t\tanchor: state.anchor,\n\t\t\t\tdynamicResize: state.dynamicResize,\n\t\t\t\tlowPriorityPin: {\n\t\t\t\t\tenabled: state.lowPriorityPin.enabled,\n\t\t\t\t\tsize: state.lowPriorityPin.size,\n\t\t\t\t\tcolor: state.lowPriorityPin.color,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\t// Only include zIndex if rank is 'always-visible'\n\t\t\tif (state.rank === 'always-visible') {\n\t\t\t\toptions.zIndex = state.zIndex;\n\t\t\t}\n\n\t\t\tconst marker = mapView.Markers.add(coordinate, state.contentHTML, options);\n\n\t\t\treturn marker;\n\t\t},\n\t};\n}\n", "import type GUI from 'lil-gui';\nimport type { MapView } from '../../map-view';\nimport { WALLS } from '../../types';\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.Exterior, {\n\t\t\tvisible: v,\n\t\t});\n\t});\n\tpanel.addColor(state, 'topColor').onChange(v => {\n\t\tmapView.updateState(WALLS.Exterior, {\n\t\t\ttopColor: v,\n\t\t});\n\t});\n\n\tpanel.addColor(state, 'color').onChange(v => {\n\t\tmapView.updateState(WALLS.Exterior, {\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.Exterior, {\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.Exterior, {\n\t\t\ttopTexture: {\n\t\t\t\turl: c,\n\t\t\t},\n\t\t});\n\t});\n\n\tmapView.updateState(WALLS.Exterior, {\n\t\ttopColor: state.topColor,\n\t});\n\n\tmapView.updateState(WALLS.Exterior, {\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"],
|
|
5
|
-
"mappings": "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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", "entityIdentity", "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", "coordinate", "entity2D", "labelControl", "addLabelControlToFolder", "geometryDataObject", "createIsInViewHandler", "renderByProp", "c", "hoverState", "spaces", "objects", "markers", "entity", "s", "id", "createLabelControls", "labelFolder", "_mapData", "mapView", "state", "l", "renderLabels", "addLabel", "destroy", "createAddControl", "labelsListFolder", "labelGuiMap", "remove", "label", "add", "control", "addLabelControlToFolder", "labelItemFolder", "rerender", "k", "item", "lastLabelControl", "labels", "coordinate", "populatelabels", "handleMarkerState", "entity", "itemFolder", "onRemove", "interactive", "enabled", "rank", "anchor", "dynamicResize", "zIndex", "contentHTML", "lowPriorityPin", "uiState", "normalizeColor", "createIsInViewHandler", "_", "updates", "lowPriorityFolder", "handleLabelState", "appearance", "parent", "folderName", "LABEL_STATE_TYPE", "MARKER_STATE_TYPE", "addFolder", "style_default", "init_define_process", "CAMERA_UI", "createCameraControls", "parent", "mapView", "options", "cameraControl", "v", "updateCurrentUrlParamsWithNamespace", "cameraUiState", "getUrlParamsWithNamespace", "initialCameraCenter", "el", "getContainerDimensions", "top", "right", "bottom", "left", "state", "updateInsetVisualizer", "w", "h", "visualizeInsetUpdated", "insetTopControl", "insetBottomControl", "insetLeftControl", "insetRightControl", "updateInsetControlRanges", "previousType", "currentType", "updateInset", "handler", "createHandler", "onCameraChanged", "params", "paramState", "target", "coordinate_default", "cleanups", "runAll", "payload", "spaces", "objects", "item", "init_define_process", "createMarkerControls", "markerFolder", "_mapData", "mapView", "state", "l", "renderMarkers", "addMarker", "destroy", "createAddControl", "markersListFolder", "markerGuiMap", "remove", "marker", "add", "control", "addLabelControlToFolder", "labelItemFolder", "rerender", "k", "item", "lastMarkerControl", "markers", "coordinate", "populateMarkers", "addFolder", "lowPriorityFolder", "options", "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", "createUi", "mapData", "mapView", "options", "injectCss", "panel", "lil_gui_esm_default", "createInteractionControls", "createCameraControls", "levelsFolder", "sceneFolder", "labelFolder", "createText3DControl", "markerFolder", "createGeometryControl", "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
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
.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-placement=hidden]>.mappedin-marker-content{visibility:hidden}.mappedin-marker:before{content:"";display:none;border-radius:50%;position:relative;width:var(--mappedin-pin-size, 2px);height:var(--mappedin-pin-size, 2px);background-color:var(--pin-color, #666)}.mappedin-marker[data-placement=hidden]:before{display:block}.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-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;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 (forced-colors: 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 (forced-colors: 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}@media (hover: hover){.maplibregl-ctrl button:not(:disabled):hover{background-color:#0000000d}}.maplibregl-ctrl button:not(:disabled):active{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 (forced-colors: 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 (forced-colors: active) and (prefers-color-scheme: light){.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 (forced-colors: 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 (forced-colors: active) and (prefers-color-scheme: light){.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 (forced-colors: 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 (forced-colors: active) and (prefers-color-scheme: light){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:svg-load("svg/maplibregl-ctrl-compass.svg",fill: #000)}}@svg-load ctrl-globe url(svg/maplibregl-ctrl-globe.svg){stroke: #333;}@svg-load ctrl-globe-enabled url(svg/maplibregl-ctrl-globe.svg){stroke: #33b5e5;}.maplibregl-ctrl button.maplibregl-ctrl-globe .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-globe)}.maplibregl-ctrl button.maplibregl-ctrl-globe-enabled .maplibregl-ctrl-icon{background-image:svg-inline(ctrl-globe-enabled)}@svg-load ctrl-terrain url(svg/maplibregl-ctrl-terrain.svg){fill: #333;}@svg-load ctrl-terrain-enabled url(svg/maplibregl-ctrl-terrain.svg){fill: #33b5e5;}.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 (forced-colors: 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 (forced-colors: active) and (prefers-color-scheme: light){.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 (forced-colors: 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 (forced-colors: active) and (prefers-color-scheme: light){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 (forced-colors: active){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:svg-load("svg/maplibregl-ctrl-attrib.svg",fill=#fff)}}@media screen and (forced-colors: active) and (prefers-color-scheme: light){.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),(pointer: coarse){.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-R5XTRV7Q.css.map */
|