{"version":3,"mappings":"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AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,iBA+JPT,EAAO,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,sBA8LfA,EAAO,OAAO,OAAO;AAAA,8BACbA,EAAO,OAAO,OAAO;AAAA;;AAAA;AAAA,sBAI7BA,EAAO,OAAO,OAAO;AAAA,8BACbA,EAAO,OAAO,OAAO;AAAA;;AAAA;AAAA,sBAI7BA,EAAO,OAAO,MAAM;AAAA,8BACZA,EAAO,OAAO,MAAM;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AA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","names":["API_BASE","getBackendApiBase","DEVICE_ID_STORAGE_KEY","SESSION_STORAGE_KEY","AUTH_LIFECYCLE_EVENT","EXPLICIT_SIGN_OUT_STORAGE_KEY","AUTH_PERSIST_ENV_KEY","DEVICE_ID_COOKIE_MAX_AGE","readCookie","key","prefix","parts","part","trimmed","writeCookie","value","options","maxAge","path","sameSite","secure","cookie","clearCookie","readAuthPersistMode","__vite_import_meta_env__","raw","resolveAuthStorage","mode","parseJwtExp","token","payload","AuthService","getNoclipGovernanceClient","callback","type","state","event","listener","e","resolve","off","ua","deviceType","deviceName","response","text","data","message","handle","email","username","password","identifier","deviceInfo","storedDeviceId","attemptLogin","deviceId","device","priorUserId","_a","_b","nextUserId","_c","_d","loginDeviceId","_e","_f","platformAuthenticatorIsAvailable","__vitePreload","error","fallback","startAuthentication","attempt","optionsResponse","optionsData","credential","verifyResponse","result","signal","name","preference","startRegistration","passkeyId","headers","refreshEpoch","requestEpoch","sessionId","stored","cookieValue","storage","parsed","clearSession","exp","notify","storageName","active","restored","url","canRefresh","hadToken","attemptedRefresh","makeRequest","suppress401","isFormData","hasBody","includeContentType","authServiceInstance","getAuthService","WEATHER_VOLUME_LAYERS","WEATHER_MODEL_SOURCES","WEATHER_VOLUME_DEFAULTS","WEATHER_PRODUCT_STYLES","LABEL_TEMPORAL_FILTER_MODES","LABEL_TEMPORAL_FILTER_MODE_IDS","entry","MODE_IDS","ROLLING_WINDOWS_MS","DEFAULT_LABEL_TEMPORAL_FILTER","normalizeLabelTemporalFilter","selectedDate","localDayRange","dateText","nowMs","start","year","month","day","startMs","end","labelMatchesTemporalFilter","occurredAtMs","filter","normalized","occurrence","range","windowMs","nextLabelTemporalFilterChange","expiry","labelTemporalFilterSummary","LABEL_CATEGORY_GROUPS","LABEL_CATEGORIES","layer","BY_ID","category","BY_TYPE","DEFAULT_LABEL_CATEGORIES","DEFAULT_LABEL_PRESENTATION","DEFAULT_LABEL_DYNAMICS","SKY_LABEL_KINDS","DEFAULT_SKY_LABEL_KINDS","id","DEFAULT_LABEL_SETTINGS","LABEL_CATEGORY_SOURCE_BINDINGS","getLabelCategory","getLabelCategoryForType","getLabelCategoriesByGroup","groupId","getLabelCategoriesForFilterRail","getLabelCategoryValue","labels","categoryId","explicit","legacy","getLabelCategorySourceBinding","readSourceEnabled","settings","binding","sourceKey","scene","section","getLabelCategoryControlValue","labelsEnabled","sourceEnabled","buildLabelCategoryControlPatch","enabled","next","patch","sourcePatch","buildLabelCategoryPresetPatch","states","normalizedStates","synchronizeLabelCategorySourcePatch","scenePatch","categories","sectionPatch","sectionDisabled","sourceValue","labelValue","sourceTouched","getLabelCategoryPatch","changes","nested","migrateLegacyLabelSettings","source","CATEGORY_META","CATEGORY_COLORS","INCIDENT_TYPES","INCIDENT_EMOJI","normalizeKey","LABEL_TO_CODE","code","meta","resolveIncidentCategoryFallback","upper","buildInfo","emoji","resolveIncidentTypeInfo","callType","tokens","labelKey","NON_ACTIVE_FIRE_CODES","VEGETATION_FIRE_CODES","isActiveFireIncident","info","isVegetationFireIncident","formatIncidentTypeLabel","includeCode","label","normalizedLabel","normalizedCode","resolveIncidentEmoji","resolveIncidentColor","resolveIncidentColorHex","LIVE_WINDOW_SECONDS","EARTH_MEAN_RADIUS_METERS","normalizeMeshtasticNodeId","number","meshtasticNodeIdsEqual","a","b","left","right","meshtasticNodeIdFromLabelHover","detail","metadata","syncMeshtasticNodeListHover","listElement","nodeId","scroll","activeRow","row","bindMeshtasticNodeRowHover","eventBus","_g","_h","hasMeshtasticPosition","node","meshtasticNodeDistanceMeters","origin","toRadians","nodeLat","originLat","dLat","dLon","arc","formatMeshtasticNodeDistance","distanceMeters","distanceKm","isMeshtasticNodeLive","nowSeconds","formatMeshtasticNodeAge","ageSeconds","filterMeshtasticNodes","nodes","maxDistanceMeters","maxAgeSeconds","maxHops","sortBy","searchQuery","list","hasDistanceLimit","hasAgeLimit","hasHopLimit","searchTerms","matchesSearch","searchableText","term","nameOf","newestFirst","nullsLast","direction","leftValid","rightValid","compareNodes","primary","meshtasticNodeTitle","meshtasticNodeSummary","distance","readBoundedBytes","maxBytes","reserve","declared","reader","chunks","bytes","abort","done","offset","chunk","NIGHT_LIGHTS_EMISSION_DEFAULTS","V2_NIGHT_LIGHTS_EMISSION_DEFAULTS","PREVIOUS_NIGHT_LIGHTS_EMISSION_DEFAULTS","LEGACY_NIGHT_LIGHTS_EMISSION_DEFAULTS","NIGHT_LIGHTS_SOURCE_SIGNAL_GLSL","NIGHT_LIGHTS_SURFACE_CARRIER_GLSL","POSTPROCESS_BLOOM_DEFAULTS","POSTPROCESS_BLOOM_EFFECT_DEFAULTS","LIGHT_POLLUTION_BLOOM_DEFAULTS","ASTRONOMICAL_LENS_FLARE_DEFAULTS","ORBITAL_HDR_EXPOSURE_DEFAULTS","clamp01","smoothUnit","t","lambertianSpherePhase","cosinePhaseAngle","alpha","resolveOrbitalHdrExposureTarget","earthFrameWeight","earthPhaseLuminance","sunFrameWeight","solarVisibility","solarTransmission","earthMeter","earthExposure","visibleSolarEnergy","sunMeter","targetExposure","orbitalExposureResponseSeconds","currentExposure","angularSpeedRadPerSecond","motion","STAR_SCINTILLATION_DEFAULTS","PHOTOREAL_ALBEDO_SCALE_DEFAULT","PHOTOREAL_OCEAN_DEFAULTS","jsonRetentionWeight","cap","stack","item","cache","inflight","MAX_ENTRIES","MAX_BYTES","MAX_ENTRY_BYTES","MAX_RESPONSE_BYTES","MAX_INFLIGHT_BYTES","MAX_INFLIGHT","MAX_ACTIVE","PARSE_THRESHOLD","cacheBytes","inflightBytes","privateSequence","waiters","remove","touch","store","normalizeResourceUrl","base","drain","acquire","reject","index","join","finished","finish","fn","fetchJsonResource","_signal","init","timeoutMs","privateRequest","requestKey","cached","ownSignal","reserved","timeout","n","weight","getWorkerPool","DEFAULT_BASE_PATH","sharedWorldIndexCache","sharedWorldIndexPromises","sharedAdmIndexCache","sharedAdmIndexPromises","sharedBoundaryIndexCache","sharedBoundaryIndexPromises","SHARED_WORLD_INDEX_CACHE_MAX_ENTRIES","SHARED_ADM_INDEX_CACHE_MAX_ENTRIES","SHARED_BOUNDARY_INDEX_CACHE_MAX_ENTRIES","INSTANCE_BOUNDARY_INDEX_CACHE_MAX_ENTRIES","getRecentCacheEntry","setBoundedCacheEntry","maxEntries","oldest","normalizeIso3","normalizeName","getFeatureName","props","extractIso3","candidates","iso3","GeoBoundaryIndex","geojson","lat","lon","lonWrapped","feature","polygon","testLon","inHole","i","names","west","south","east","north","minLat","maxLat","rawSpan","normalizedWest","normalizedEast","longitudeSegments","intersectsLongitude","queryWest","queryEast","candidateWest","candidateEast","entries","polygons","geometry","poly","out","polyCoords","geom","rings","outerRing","wrap","outer","ringData","hole","ring","minLon","maxLon","canUseSourceRing","pt","rawLon","coords","prevLon","first","firstLon","inside","j","xi","yi","xj","yj","GeoBoundaryService","basePath","level","adminLevel","world","bounds","country","boundary","maxLevel","hierarchy","normalizedMaxLevel","rule","subdivisions","numeric","levelRaw","iso","subdivisionsRaw","sharedWorld","countries","seen","sharedAdm","promise","filesByIso","file","sharedKey","cachedBoundary","sharedBoundary","nclpDashboardStyleUrl","resolveColor","cssColor","match","varName","computed","TOKENS","ICON_SIZES","ICON_PATHS","formatIconSize","size","getIconSvg","strokeWidth","injectDesignSystemStyles","injectHudStyleKitStyles","style","link","escapeHtml","char","setHudButtonDisabled","el","disabled","isDisabled","createHudButtonElement","className","createButton","html","createToggle","checked","onChange","wrapper","input","track","labelEl","createInput","group","createSelect","select","opt","optionEl","createRangeSlider","header","valueDisplay","setValueA11y","selectValueText","selection","rangeSelection","clampToRange","min","max","step","commitValueDisplay","createCollapsible","title","content","open","body","contentWrapper","getUiAudioSfx","createDivider","divider","createMetric","metric","readJson","fallbackMessage","IncidentApiService","query","search","ids","params","suffix","incidentApiServiceInstance","getIncidentApiService","cleanText","shortAddress","buildIncidentPresentation","incident","placeName","placeType","address","locationName","SENSOR_SOURCES","SENSOR_CATEGORIES","getAllSensorIds","getSensorsByCategory","OPEN_INFRA_MAP_UTILITY_FILTERS","OPEN_INFRA_MAP_GROUP_BY_SETTING","setting","getEnabledOpenInfraMapGroups","layers","hasEnabledOpenInfraMapGroup","buildOpenInfraMapLayerPatch","validPlaceCoordinate","p","explicitSearchRegion","placeDistance","rad","h","rankPlaceResults","results","bias","limit","relevance","ranked","_sourceOrder","r","placeResultKey","routeStopBadge","count","role","PlaceSearchStore","owner","onSelect","activate","instance","getPlaceSearchStore","bindPlaceSearchList","container","selector","indexAttribute","hovered","leave","STYLE_ID","SIDEBAR_MENU_ROLES","ROLE_CLASS","splitClasses","applySidebarMenuRole","element","roleClass","prepareDesktopSidebarPanel","root","host","matching","headerSelector","titleSelector","child","filters","parent","actions","generateSidebarMenuComponent","selectors","createElement","tag","schema","toggle","copy","description","indicator","interactive","icon","eyebrow","trailing","summary","ensureSidebarMenuSystemStyles","rendered","bindings","keyAttributes","identity","compatible","patchNode","current","ownsValue","localAttribute","attr","patchChildren","nextParent","old","used","keyed","cursor","patchStableHtml","template","patchStableElement","clearStableHtml","bindStableEvent","handler","map","prior","patchStableSelect","emptyText","pending","desired","option","mergeLightingDate","currentDate","dateInput","timeInput","hours","minutes","seconds","millis","y","m","d","buildQuickTimeDate","buildScenePatch","readSetting","getLightingDate","read","_path","getDate","computeRingLodCaps","maxLod","falloffPower","power","midDrop","farDrop","hudPinModalInstance","HudPinModal","modal","button","corner","currentCorner","onUnpin","onClose","isActive","getHudPinModal","WGS84_MEAN_RADIUS_METERS","DEFAULT_NKN_FORWARDER","KM_PER_DEG","DEFAULT_SPEAK_PTT_KEY","miniMapWidgetClassPromise","loadMiniMapWidgetClass","module","normalizeKeyboardCode","formatKeyboardCode","ConfigSidebar","footer","target","SCROLL_KEY","savedScroll","scrollSaveTimer","MiniMapWidget","selectElement","sliderElement","labelElement","imageryManager","populateDropdown","versions","v","idx","currentVersion","canSave","statusText","percent","clamped","zoom","versionId","progress","pct","status","finalStats","blob","downloadLink","err","acc","onSync","transform","fallbackValue","paths","walk","entryKey","entryValue","nextPath","exact","rawValue","resolved","nextValue","sectionData","num","onCapture","clipNames","actionNames","updateList","emptyLabel","empty","panel","metrics","onGround","ft","knots","timestamp","deltaMs","callsign","rawId","aircraftType","mmsi","heading","typeLabel","presentation","location","items","previousValue","nextEntries","statusMap","sourceId","dot","hasError","countEl","wsEl","lines","str","parseTimestamp","limited","subtitleText","subtitle","detailParts","age","color","marker","addrInput","tuneables","tuneableDate","date","lightingSystem","activeEl","actionsGroup","actionsTitle","actionsRow","cloudGroup","cloudTitle","cloudDesc","cloudRow","metricsGroup","metricsTitle","hudGroup","hudTitle","hideHudMetrics","hideHudToggle","hideHudInput","renderScaleValue","autoRenderScaleEnabled","renderCadenceValue","frameDiscardEnabled","frameDiscardThreshold","bloomSettings","bloomEnabled","bloomIntensity","bloomRadius","bloomThreshold","bloomSmoothing","bloomLevels","bloomMipmapBlur","dofSettings","dofEnabled","dofAutofocus","dofFocusDistance","dofFocalLength","dofBokehScale","dofResolutionScale","dofResponse","dofSampleInterval","motionBlurSettings","motionBlurEnabled","motionBlurIntensity","motionBlurMaxSpeed","motionBlurSmoothing","motionBlurDampMin","motionBlurDampMax","speedFovSettings","speedFovEnabled","speedFovBase","speedFovMaxBoost","speedFovMaxSpeed","speedFovSmoothing","emissiveSettings","emissiveMaterialIntensity","emissiveMaterialColor","emissiveStarfieldIntensity","emissiveGalaxyIntensity","emissiveSunIntensity","wireframeEnabled","wireframeStyle","wireframeSurfaceColor","wireframeLineColor","renderScaleGroup","scaleGroup","scaleRange","val","autoScaleToggle","autoScaleInput","pacingGroup","cadenceSlider","discardToggle","discardInput","discardSlider","bloomGroup","bloomTitle","bloomToggle","bloomToggleInput","bloomIntensityGroup","bloomIntensityRange","bloomIntensityValueDisplay","bloomThresholdGroup","bloomThresholdRange","bloomThresholdValueDisplay","bloomRadiusGroup","bloomRadiusRange","bloomRadiusValueDisplay","bloomSmoothingGroup","bloomSmoothingRange","bloomSmoothingValueDisplay","bloomLevelsGroup","bloomLevelsRange","bloomLevelsValueDisplay","bloomMipmapToggle","bloomMipmapInput","dofGroup","dofTitle","dofToggle","dofToggleInput","dofAutofocusToggle","dofAutofocusInput","motionBlurGroup","motionBlurTitle","motionBlurToggle","motionBlurToggleInput","motionBlurIntensityGroup","motionBlurIntensityRange","motionBlurIntensityValueDisplay","motionBlurSpeedGroup","motionBlurSpeedRange","motionBlurSpeedValueDisplay","motionBlurSmoothingGroup","motionBlurSmoothingRange","motionBlurSmoothingValueDisplay","motionBlurDampMinGroup","motionBlurDampMinRange","motionBlurDampMinValueDisplay","motionBlurDampMaxGroup","motionBlurDampMaxRange","motionBlurDampMaxValueDisplay","speedFovGroup","speedFovTitle","speedFovToggle","speedFovToggleInput","speedFovBaseGroup","speedFovBaseRange","speedFovBaseValueDisplay","speedFovBoostGroup","speedFovBoostRange","speedFovBoostValueDisplay","speedFovSpeedGroup","speedFovSpeedRange","speedFovSpeedValueDisplay","speedFovSmoothingGroup","speedFovSmoothingRange","speedFovSmoothingValueDisplay","emissiveGroup","emissiveTitle","emissiveIntensityGroup","emissiveIntensityRange","emissiveIntensityValueDisplay","emissiveColorGroup","emissiveColorInput","starfieldIntensityGroup","starfieldIntensityRange","starfieldIntensityValueDisplay","galaxyIntensityGroup","galaxyIntensityRange","galaxyIntensityValueDisplay","sunIntensityGroup","sunIntensityRange","sunIntensityValueDisplay","wireframeGroup","wireframeToggle","wireframeInput","wireframeStyleGroup","wireframeStyleTitle","surfaceColorGroup","surfaceColorInput","wireframeColorRow","lineColorGroup","lineColorInput","wireframeStyleNote","audioEnabled","audioGroup","audioToggle","audioInput","overtoneToggle","speakConfig","speakEnabled","speakMode","speakRadiusM","speakPttKey","speakGroup","sidebar","speakTitle","speakToggle","speakToggleInput","speakModeGroup","speakModeSelect","syncSpeakUiState","pttKeyGroup","pttKeyLabel","pttKeyRow","pttKeyInput","pttRecordBtn","capturedCode","pttHint","speakRadiusGroup","pttModeActive","windConfig","windEnabled","windVolume","windGust","windSpeedScale","windMaxSpeed","windMinSpeed","windVerticalScale","windMass","windGroup","windTitle","windToggle","windToggleInput","windVolumeGroup","windGustGroup","windMassGroup","windAdvancedContent","windSpeedScaleGroup","windMaxSpeedGroup","windMinSpeedGroup","windVerticalGroup","windAdvancedPanel","commsGroup","summaryGroup","modelList","lightingDate","dateValue","timeValue","timeSpeedValue","simplifiedEnabled","timeGroup","dateInputEl","timeInputEl","speedSlider","timeButtons","simplifiedToggle","simplifiedInput","atmosphereEnabled","baseOffsetValue","surfaceBaseOffsetValue","adaptiveBaseOffset","adaptiveBaseOffsetEnabled","adaptiveOrbitClearance","adaptiveSurfaceClearance","irradianceValue","shadowRadiusValue","skyTuning","skyAlphaScaleValue","skyAlphaClampValue","skyLimbBoostValue","skyPathShortValue","skyLimbMaxValue","skyDensityScaleValue","skyScaleHeightValue","skyVerticalFadeStartValue","skyVerticalFadeEndValue","skyAltitudeFadeStartValue","skyAltitudeFadeEndValue","skyOutsideFadeStartValue","skyOutsideFadeEndValue","skyDepthThresholdValue","photometricEnabled","sunIrradianceEnabled","skyIrradianceEnabled","transmittanceEnabled","inscatterEnabled","skyEnabled","sunEnabled","moonEnabled","specularMap","specularEnabled","specularStrengthValue","ocean","oceanEnabled","oceanOpacity","oceanNormalScale","oceanDistortion","oceanSpecularStrength","oceanFresnelStrength","oceanSpeed","simpleClouds","simpleCloudsEnabled","simpleCloudsBlendMode","simpleCloudsShadowHeight","simpleCloudsOpacity","simpleCloudsShadowStrength","simpleCloudsAlphaThreshold","simpleCloudsAlphaSoftness","lightPollution","lightPollutionEnabled","lightPollutionIntensity","lightPollutionMapGain","lightPollutionEmissionThreshold","lightPollutionEmissionSoftness","lightPollutionEmissionPower","lightPollutionEmissionBlueSuppression","lightPollutionColor","lightPollutionMercator","lightPollutionOffsetU","lightPollutionOffsetV","lightPollutionScaleU","lightPollutionScaleV","airglow","airglowEnabled","airglowStrength","airglowBaseAlt","airglowCoreAlt","airglowFringeAlt","airglowRiseScale","airglowTailScale","airglowPathRef","airglowInsideMin","airglowInsideMax","airglowGrazingPower","aurora","auroraEnabled","auroraStrength","auroraTopAlt","auroraPathRef","auroraDepthBias","atmToggle","atmInput","adaptiveOffsetToggle","adaptiveOffsetInput","groupLabelStyle","addAtmosphereRange","skyLabel","renderLabel","photometricToggle","photometricInput","transmittanceToggle","transmittanceInput","inscatterToggle","inscatterInput","airglowLabel","airglowToggle","airglowInput","auroraLabel","auroraToggle","auroraInput","orbitOverlayLabel","specularToggle","specularInput","specularStrengthGroup","specularStrengthRange","specularStrengthDisplay","oceanLabel","oceanToggle","oceanInput","simpleCloudsToggle","simpleCloudsInput","simpleCloudsSourceNote","simpleCloudsOpacityGroup","simpleCloudsOpacityRange","simpleCloudsOpacityDisplay","simpleCloudsShadowStrengthGroup","simpleCloudsShadowStrengthRange","simpleCloudsShadowStrengthDisplay","simpleCloudBlendGroup","simpleCloudBlendSelect","simpleCloudShadowHeightGroup","simpleCloudShadowHeightRange","simpleCloudShadowHeightValue","simpleCloudThresholdGroup","simpleCloudThresholdRange","simpleCloudThresholdValue","simpleCloudSoftnessGroup","simpleCloudSoftnessRange","simpleCloudSoftnessValue","lightPollutionToggle","lightPollutionInput","lightIntensityGroup","lightIntensityRange","lightIntensityValue","lightGainGroup","lightGainRange","lightGainValue","lightColorGroup","lightColorInput","lpMercatorToggle","lpMercatorInput","lpAlign","lightingLabel","sunIrradianceToggle","sunIrradianceInput","skyIrradianceToggle","skyIrradianceInput","skyBodyLabel","skyToggle","skyInput","sunToggle","sunInput","moonToggle","moonInput","nightLabel","nightSettings","nightMinBrightnessValue","nightAmbientStrengthValue","nightTransitionStartValue","nightTransitionEndValue","nightPowerValue","nightAmbientColorValue","nightMinIrradianceValue","nightAmbientColorGroup","nightAmbientColorInput","cloudsEnabled","cloudCoverageValue","cloudScatteringValue","cloudAbsorptionValue","cloudTurbulenceDispValue","cloudQualityPreset","cloudShadow","shadowCascadeValue","shadowMapSizeValue","shadowMaxFarValue","shadowFarScaleValue","shadowSplitLambdaValue","shadowSplitModeValue","orbitClouds","orbitCloudsEnabled","orbitCloudsRawOverlay","orbitCloudsDebugOverlay","orbitCloudsOpacity","orbitCloudsRefresh","orbitCloudsTimeStep","orbitCloudsLayer","lightShaftsEnabled","shapeDetailEnabled","turbulenceEnabled","hazeEnabled","cloudsToggle","cloudsInput","qualityLabel","lightShaftsToggle","lightShaftsInput","shapeDetailToggle","shapeDetailInput","turbulenceToggle","turbulenceInput","hazeToggle","hazeInput","presetLabel","presetSelect","presetSelectEl","shadowLabel","shadowCascadeGroup","shadowCascadeRange","shadowCascadeValueDisplay","shadowMapSizeGroup","shadowMapSizeSelect","shadowMaxFarGroup","shadowMaxFarRange","shadowMaxFarDisplay","shadowFarScaleGroup","shadowFarScaleRange","shadowFarScaleDisplay","shadowSplitModeGroup","shadowSplitModeSelect","shadowSplitLambdaGroup","shadowSplitLambdaRange","shadowSplitLambdaDisplay","orbitLabel","orbitNote","orbitToggle","orbitCloudsInput","orbitRawToggle","orbitRawInput","orbitDebugToggle","orbitDebugInput","orbitOpacityGroup","orbitOpacityRange","orbitOpacityDisplay","orbitRefreshGroup","orbitRefreshRange","orbitRefreshDisplay","orbitTimeStepGroup","orbitTimeStepRange","orbitTimeStepDisplay","orbitLayerGroup","orbitLayerInput","cloudLayers","low","mid","high","lowAltitudeValue","lowHeightValue","midAltitudeValue","midHeightValue","highAltitudeValue","highHeightValue","note","layerSettings","altitudeGroup","altitudeRange","altitudeDisplay","heightGroup","heightRange","heightDisplay","navSettings","profileValue","runSpeedValue","zoomSpeedValue","rotateSpeedValue","dragSpeedValue","profileGroup","profileSelectGroup","profileSelect","profileNote","updateProfileNote","surfaceSettings","walkSpeedValue","walkSpeedGroup","altitudeSpeedMaxValue","altitudeSpeedMaxGroup","goToGroup","goToTitle","goToRow","latWrapper","latLabel","latInput","lonWrapper","lonLabel","lonInput","goBtn","searchGroup","searchHeader","searchTitle","searchPinBtn","searchRow","searchWrapper","searchInput","searchBtn","resultsContainer","miniMapGroup","miniMapHeader","miniMapTitle","miniMapPinBtn","miniMapHost","avatarConfig","animation","headLook","jump","debug","local","sharing","sharingFriends","sharingPublic","speedRef","useProxyBall","proxyRadius","proxyColor","fadeDuration","speedSmoothingRate","idleSpeedThreshold","runSpeedThreshold","directionThreshold","speedRefValues","headRate","headYawMax","headPitchUpMax","headPitchDownMax","headRollMax","jumpHeight","jumpGravity","meditateThreshold","resolveShareBool","shareDefaults","shareFields","shareGroup","shareTitle","nearbySharingNote","buildShareSection","values","eventLabel","defaults","enabledValue","sectionContent","enabledToggle","enabledInput","fieldset","field","fieldValue","keyLabel","debugGroup","debugTitle","proxyToggle","proxyInput","radiusGroup","colorGroup","animGroup","animTitle","tempoGroup","tempoTitle","headGroup","headTitle","jumpGroup","jumpTitle","listGroup","listTitle","animList","actionGroup","actionTitle","actionList","tileBudgetValue","splitBudgetValue","mergeBudgetValue","seamInterpolationEnabled","seamToggle","seamInput","stagingLabel","stageMinLodValue","stageMaxLodValue","stageCooldownValue","falloffLabel","surfaceLodNearValue","surfaceLodFarValue","surfaceFalloffPowerValue","surfaceStartDegSetting","surfaceStartKmLegacy","surfaceStartDegValue","surfaceLodStartValue","surfaceCullAngleSetting","surfaceCullAngleValue","orbitFalloffMarginValue","orbitFalloffAnchorValue","orbitLodFalloffValue","modeTitle","currentMode","modeGroup","modeSelect","photoPatch","applyTileDot","getFallbackCesiumIonToken","_tileAuth","_credsFetched","fetchExistingCredentials","_credentialId","buildingsEnabled","photoSub","currentProvider","providerGroup","statusRow","tileStatusDot","tileStatusText","DOT_COLORS","STATUS_LABELS","savedStatus","_s","applyTileStatus","maskedKey","keyEntry","keyValid","maskedDisplay","_credsFetching","resp","creds","provider","validCred","c","masked","shared","communityInput","_hasPlatformToken","authNotice","isAuthed","authed","saveBtn","keyRow","apiKeyInput","keyHint","maskedLabel","maskedRow","revokeBtn","communityDefault","communityWrap","_communityInput","communityHint","errMsg","handleSave","rawKey","communitySharing","cred","dualMode","dualWrap","dualInput","offsetVal","offsetGroup","offsetRange","offsetDisplay","attrArea","radiusMValue","maxFeaturesValue","surfaceOffsetMValue","falloffStartMValue","resnapIntervalMsValue","resnapBudgetValue","resnapToleranceValue","resnapFreezeFramesValue","tileDrivenResnapValue","fallbackResnapIntervalValue","maxSamplesValue","lodDetailRadiusValue","lodImpostorRadiusValue","lodUpdateIntervalValue","lodBudgetValue","lodHysteresisValue","impostorEnabledValue","impostorMinSizeValue","impostorMinHeightValue","impostorHeightScaleValue","impostorRebuildBudgetValue","polypBakeToTilesValue","imageryEnabledValue","imageryUpdateIntervalValue","buildingsEnabledInput","syncBuildingsEnabled","resnapLabel","tileResnapToggle","tileResnapInput","lodLabel","impostorToggle","impostorInput","bakeLabel","bakeToggle","bakeInput","bakeNote","imageryLabel","imageryToggle","buildingImageryInput","infraConfig","infraColorDefaults","infraEnabled","roadsEnabled","bridgesEnabled","waterwaysEnabled","areasEnabled","railwaysEnabled","refreshDistanceMValue","roadWidthScaleValue","roadStepMValue","bridgeHeightMValue","ribbonThicknessMValue","drapeBudgetValue","alignFreezeFramesValue","alignToleranceMValue","alignSampleStepMValue","alignMaxSamplesValue","pauseWhenFarValue","pauseDistanceMValue","pauseDistanceMultiplierValue","paintConfig","paintEnabled","paintResolutionValue","paintLineWidthValue","paintOpacityValue","paintBudgetValue","paintRepaintOnLodValue","infraColors","_i","_j","infraToggle","infraInput","terrainNote","layersLabel","roadsToggle","roadsInput","syncRoadsEnabled","bridgesToggle","bridgesInput","waterwaysToggle","waterwaysInput","areasToggle","areasInput","railwaysToggle","railwaysInput","utilLabel","utilLayers","allUtilGroups","allUtilOn","k","allUtilToggle","powerInput","telecomsInput","petroleumInput","waterUtilInput","internetInput","solarInput","nuclearInput","inp","powerOn","powerToggle","telecomsOn","telecomsToggle","petroleumOn","petroleumToggle","waterOn","waterUtilToggle","internetOn","internetToggle","solarOn","solarToggle","nuclearOn","nuclearToggle","nightLightsEnabled","nightLightsToggle","nightLightsInput","settingsLabel","pauseToggle","pauseInput","colorsLabel","resetRow","paintLabel","paintToggle","paintInput","paintRepaintToggle","paintRepaintInput","flightStatus","updateFlightStatus","available","s","flightsEnabled","providerValue","queryModeValue","queryValue","radiusNmValue","coneAngleValue","maxAircraftValue","pollIntervalValue","staleAfterValue","predictionValue","modelScaleValue","headingOffsetValue","altitudeOffsetValue","showPathsValue","pathHoursValue","pathMaxPointsValue","modelUrlValue","modelPresets","resolvePresetForUrl","preset","currentModelUrl","currentModelPreset","providerOptions","providerModes","currentQueryValue","currentRadiusNm","currentConeAngle","currentMaxAircraft","modelInput","modelSelect","headingRange","headingValueDisplay","altitudeValueDisplay","flightsEnabledInput","aircraftListGroup","aircraftListTitle","aircraftSelectGroup","aircraftSelect","aircraftDetailsPanel","aircraftDetailsMetrics","providerSelect","renderModeControls","modeContainer","controlsContainer","modes","queryGroup","queryInput","radiusRange","radiusValueDisplay","coneGroup","coneRange","coneValueDisplay","maxGroup","maxRange","maxValueDisplay","pollGroup","pollRange","pollValueDisplay","staleGroup","staleRange","staleValueDisplay","predictGroup","predictRange","predictValueDisplay","modelOptions","applyModelPreset","syncModelPreset","nextPreset","modelSelectGroup","modelSelectEl","modelGroup","modelInputGroup","modelScaleGroup","modelScaleRange","modelScaleValueDisplay","headingSlider","headingGroup","altitudeSlider","pathToggle","flightPathsInput","pathHoursGroup","pathHoursRange","pathHoursValueDisplay","pathPointsGroup","pathPointsRange","pathPointsValueDisplay","satellitesEnabled","maxSatellitesValue","showOrbitsValue","orbitSamplesValue","orbitWindowValue","currentMaxSatellites","satellitesEnabledInput","satelliteListGroup","satelliteListTitle","satelliteSelectGroup","satelliteSelect","satelliteDetailsPanel","satelliteDetailsMetrics","showOrbitsInput","orbitSamplesGroup","orbitSamplesRange","orbitSamplesValueDisplay","orbitWindowGroup","orbitWindowRange","orbitWindowValueDisplay","maritimeEnabled","maxVesselsValue","lookbackMinutesValue","smoothingValue","currentMaxVessels","maritimeEnabledInput","vesselListGroup","vesselListTitle","vesselSelectGroup","vesselSelect","vesselDetailsPanel","vesselDetailsMetrics","needsQueryValue","queryLabel","queryPlaceholder","lookbackGroup","lookbackRange","lookbackValueDisplay","scaleValueDisplay","smoothingGroup","smoothingRange","smoothingValueDisplay","maritimePathsInput","incidentsEnabled","maxIncidentsValue","spireHeightValue","spireRadiusValue","labelScaleFallback","labelScaleValue","includeRecentValue","includeAlertsValue","publicOnlyValue","hideMedicalValue","showLabelsValue","labelViewConeValue","autoZipEnabledValue","agencyIds","incidentsEnabledInput","autoToggle","autoZipInput","incidentListGroup","incidentListTitle","incidentSelectGroup","incidentSelect","incidentDetailsPanel","incidentDetailsMetrics","incidentRecentGroup","incidentRecentTitle","incidentRecentList","agencyGroup","agencyTitle","selectedTitle","selectedList","recentToggle","includeRecentInput","alertsToggle","includeAlertsInput","publicToggle","publicOnlyInput","medicalToggle","hideMedicalInput","labelConeRange","labelScaleRange","labelToggle","showLabelsInput","labelConeGroup","labelConeRangeInput","labelConeValueDisplay","labelScaleGroup","labelScaleRangeInput","labelScaleValueDisplay","heightValueDisplay","spireRadiusGroup","spireRadiusRange","spireRadiusValueDisplay","sensorsEnabled","sensorsEnabledInput","categoryOrder","catId","catMeta","sources","catColor","catGroup","catHeader","catArrow","catDot","catCount","catBody","isOpen","statusDot","srcToggle","srcInput","sourcesPatch","wsBadge","tierBadge","infoBtn","infoPanel","meshEnabled","enableToggle","meshEnabledInput","desc","statusEl","serialBtn","deviceSettingsHost","apiUrlGroup","apiUrlInput","fetchBtn","rosterHost","nodeListHeader","nodeListTitle","nodeCount","broadcastButton","nodeFilter","nodeSearch","nodeFilterGrid","createRosterFilter","labelText","ariaLabel","currentValue","optionLabel","nodeList","emptyState","threadHost","onNodes","onMsg","onLabelHover","onConnected","onDisconnected","getMeshtasticService","MeshtasticDeviceSettings","service","searchAnchor","sysInfoEl","connectBtn","sysSelectGroup","sysSelect","loadSystemsOnce","playerRow","playBtn","nowPlayingEl","transcribeRow","transcribeBtn","transcribeHint","transcriptEl","callListTitle","callList","on","evt","masterValue","aircraftInput","maritimeInput","satelliteInput","buildingsInput","incidentsInput","viewConeRange","maxVisibleRange","_setSubcontrols","masterToggle","masterInput","aircraftValue","aircraftToggle","aircraftIn","maritimeValue","maritimeToggle","maritimeIn","satelliteValue","satelliteToggle","satelliteIn","buildingsValue","buildingsToggle","buildingsIn","incidentsValue","incidentsToggle","incidentsIn","infraValue","infraIn","viewConeValue","viewConeGroup","viewConeRangeInput","viewConeDisplay","scaleValue","scaleRangeInput","scaleDisplay","maxVisibleValue","maxVisibleGroup","maxVisibleRangeInput","maxVisibleDisplay","gridLabel","lateralMaxDegValue","stepsSValue","stepsTValue","costLabel","uphillValue","downhillValue","elevDeltaValue","slopeSqValue","moveLabel","lateralValue","distanceValue","terrainLabel","highValue","roughValue","smoothValue","smoothGroup","smoothRange","smoothValueDisplay","manualToggle","api","gpsToggle","legendGroup","legendTitle","manualLegend","manualTrailToggle","gpsLegend","gpsTrailToggle","sessionsContainer","sessionsTitle","sessionsList","updateSessions","sessions","statusClass","statusLabel","duration","nknEnabled","relayFallback","datasetFallback","relayValue","datasetValue","addrValue","nknInput","relayGroup","relayInputGroup","relayInput","datasetGroup","datasetInputGroup","datasetInput","addrGroup","addrInputGroup","batchSizeValue","maxConcurrentValue","minIntervalValue","surfaceMinLevelValue","maxVertexRecordsValue","ringNearMetersValue","ringMidMetersValue","ringNearKmValue","ringMidKmValue","ringBudgetNearValue","ringBudgetMidValue","fetchModeValue","fetchModeGroup","fetchModeSelect","trafficLabel","maxKBPerMinuteSetting","maxKBPerMinValue","trafficGroup","trafficRange","trafficValueDisplay","queueLabel","queueResetDistanceM","queueResetKmValue","queueResetAngleDeg","queueResetAngleValue","detailLabel","ringLabel","imageryEnabled","maxZoomValue","maxAtlasTilesValue","padTilesValue","tileCacheValue","atlasCacheValue","imageryInput","resolutionBoostValue","resolutionBoostGroup","resolutionBoostRange","resolutionBoostValueDisplay","boostNote","versionLabel","versionSelectWrapper","versionSelect","loadingOption","selectedVersion","timelineWrapper","timelineLabel","timelineSlider","bulkLabel","bulkZoomGroup","bulkZoomValueDisplay","bulkActions","bulkDownloadBtn","bulkCancelBtn","bulkSaveBtn","bulkStatus","bulkProgress","bulkProgressFill","bulkNote","ring0OnlyValue","invertValue","autoSunValue","photoToggle","photoInput","ringToggle","ringInput","invertToggle","invertInput","autoSunToggle","autoSunInput","normalizeModeValue","normalizeGroup","normalizeSelect","cacheContainer","weatherEnabled","weatherAuto","weatherToggle","weatherInput","weatherAutoInput","weatherInfo","rotLabel","sunLabel","focusLabel","camLabel","debugSettings","statePersistEnabled","raycastLinePrecisionValue","persistToggle","persistInput","raycastLinePrecisionGroup","raycastLinePrecisionRange","raycastLinePrecisionValueDisplay","cacheGroup","cacheTitle","cacheRow","keys","settingsGroup","settingsTitle","settingsRow","svc","baseUrl","MeshtasticThreadView","sceneOrigin","hudStore","getHudInfoStore","latValue","lonValue","previous","merged","visibleNodes","makeAction","getOpenMhzService","systems","opt0","sys","system","shortName","newCalls","call","time","dur","transcript","saved","last","addresses","includeHeader","tgName","addressList","addr","searchPlaces","sysInfo","locality","titleEl","controls","control","normalizeLevel","normalizeCountry","depthOptions","setSelectOptions","geoJsonEnabled","geoJsonAutoDepth","geoJsonMaxDepth","geoJsonAdminLevel","geoJsonCountry","geoJsonAurora","geoJsonLabels","geoJsonLabelScaleCapAlt","geoJsonLabelScaleReleaseAlt","geoJsonLabelBorderRetireAlt","geoJsonFarMaxAlt","geoJsonFarMaxLevel","updateManualDisabled","applyManualSelection","countryLoadSeq","visibilityGroup","autoDepthToggle","autoDepthInput","maxDepthGroup","maxDepthSelect","manualGroup","adminLevelGroup","adminLevelSelect","populateCountries","countrySelect","countryGroup","levelValue","selectedIso3","selected","seq","countryOptions","getManualSelection","autoOn","displayGroup","labelsToggle","labelsInput","advancedGroup","labelCapGroup","labelCapRange","labelCapDisplay","labelReleaseGroup","labelReleaseRange","labelReleaseDisplay","labelBorderRetireGroup","labelBorderRetireRange","labelBorderRetireDisplay","farAltGroup","farAltRange","farAltDisplay","farLevelGroup","farLevelSelect","defaultOpen","contentBuilder","toggleConfig","STORAGE_KEY","savedStates","nowOpen","toggleBtn","updateToggleState","version","surfaceController","yaw","pitch","focusDir","_k","epoch","getGeocodingService","lookupNotice","notice","formatted","formatResultForDisplay","primaryText","secondaryText","typeTag","itemElement","widget","force","now","minIntervalMs","minMoveM","reverseGeocode","zip","normalizedZip","agencies","agency","manualIds","combinedSet","combined","selectedIds","alreadySelected","addBtn","nextIds","agencyId","removeBtn","containerId","models","tickets","totalQueued","sum","model","totalInFlight","memoryValues","memoryMb","card","kind","titleWrap","sub","queue","avg","memory","graphs","graph","graphLabel","canvas","stateValue","computeCanvas","queueCanvas","memoryCanvas","ctx","width","height","dpr","points","minVal","maxVal","x","bodyRect","offsetTop","anchorId","widgetPins","validCorners","minimapCorner","searchCorner","minimapReady","searchReady","persist","hudStack","widgetStack","closeBtn","mapHost","q","isAgentQuery","wordCount","loadingEl","apiBase","auth","sessResp","sess","msgResp","replyEl","loginHint","remainEl","errEl","GeocodingService","itemEl","placeId","entryId","configSidebarInstance","getConfigSidebar"],"ignoreList":[],"sources":["../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/auth/AuthService.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/weather/WeatherVolumeContract.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/labels/LabelTemporalFilter.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/labels/LabelCategoryRegistry.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/incidents/IncidentTypes.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/meshtastic/MeshtasticNodeUtils.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/shared/readBoundedBytes.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/render/NightLightsEmissionContract.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/render/PostProcessingContract.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/tiles/PhotorealAppearanceContract.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/shared/JsonRetentionWeight.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/shared/JsonResourceCache.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/geo/GeoBoundaryService.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/ui/DesignSystem.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/incidents/IncidentApiService.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/incidents/IncidentPresentation.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/sensors/SensorRegistry.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/overlays/OpenInfraMapContract.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/geo/PlaceSearchResults.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/geo/PlaceSearchStore.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/ui/PlaceSearchList.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/ui/SidebarMenuSystem.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/ui/StableDom.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/ui/ScenePatchUtils.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/ui/HudPinModal.js","../../../../home/roko/Documents/Projects/Adjacent/noclip-unified/earth/refactor/ui/ConfigSidebar.js"],"sourcesContent":["/**\n * AuthService\n *\n * Handles authentication API calls and token management.\n * Manages access tokens in memory and refresh tokens via HttpOnly cookies.\n */\n\nimport { getBackendApiBase } from '../shared/backend.js';\nimport { getNoclipGovernanceClient } from '../shared/NoclipGovernanceClient.js';\n\nconst API_BASE = getBackendApiBase();\nconst DEVICE_ID_STORAGE_KEY = 'noclip.device_id';\nconst SESSION_STORAGE_KEY = 'noclip.auth.session';\n\nexport const AUTH_LIFECYCLE_EVENT = Object.freeze({\n  SNAPSHOT: 'auth:snapshot',\n  SESSION_ESTABLISHED: 'auth:session-established',\n  SESSION_ENDED: 'auth:session-ended',\n  SESSION_EXPIRED: 'auth:session-expired',\n  SESSION_RESOLVED: 'auth:session-resolved',\n  SESSION_RESTORED: 'auth:session-restored',\n  CREDENTIAL_REFRESHED: 'auth:credential-refreshed',\n  IDENTITY_UPDATED: 'auth:identity-updated',\n});\nconst EXPLICIT_SIGN_OUT_STORAGE_KEY = 'noclip.auth.signed_out';\nconst AUTH_PERSIST_ENV_KEY = 'VITE_AUTH_PERSIST';\nconst DEVICE_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;\n\nconst readCookie = (key) => {\n  if (typeof document === 'undefined') return null;\n  try {\n    const prefix = `${encodeURIComponent(key)}=`;\n    const parts = document.cookie ? document.cookie.split(';') : [];\n    for (const part of parts) {\n      const trimmed = part.trim();\n      if (trimmed.startsWith(prefix)) {\n        return decodeURIComponent(trimmed.slice(prefix.length));\n      }\n    }\n  } catch {\n    return null;\n  }\n  return null;\n};\n\nconst writeCookie = (key, value, options = {}) => {\n  if (typeof document === 'undefined') return;\n  const maxAge = Number.isFinite(options.maxAge) ? options.maxAge : DEVICE_ID_COOKIE_MAX_AGE;\n  const path = options.path || '/';\n  const sameSite = options.sameSite || 'Lax';\n  const secure = typeof options.secure === 'boolean'\n    ? options.secure\n    : (typeof location !== 'undefined' && location.protocol === 'https:');\n  if (!value) return;\n  let cookie = `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}; Path=${path}; Max-Age=${maxAge}; SameSite=${sameSite}`;\n  if (secure) {\n    cookie += '; Secure';\n  }\n  document.cookie = cookie;\n};\n\nconst clearCookie = (key, options = {}) => {\n  if (typeof document === 'undefined') return;\n  const path = options.path || '/';\n  const sameSite = options.sameSite || 'Lax';\n  const secure = typeof options.secure === 'boolean'\n    ? options.secure\n    : (typeof location !== 'undefined' && location.protocol === 'https:');\n  let cookie = `${encodeURIComponent(key)}=; Path=${path}; Max-Age=0; SameSite=${sameSite}`;\n  if (secure) {\n    cookie += '; Secure';\n  }\n  document.cookie = cookie;\n};\n\nconst readAuthPersistMode = () => {\n  if (typeof import.meta !== 'undefined' && import.meta.env) {\n    const raw = import.meta.env[AUTH_PERSIST_ENV_KEY];\n    if (typeof raw === 'string' && raw.trim()) {\n      return raw.trim().toLowerCase();\n    }\n  }\n  return 'local';\n};\n\nconst resolveAuthStorage = () => {\n  if (typeof window === 'undefined') return null;\n  const mode = readAuthPersistMode();\n  if (mode === 'none' || mode === 'off') return null;\n  if (mode === 'session') return window.sessionStorage || null;\n  return window.localStorage || null;\n};\n\nconst parseJwtExp = (token) => {\n  if (!token || typeof token !== 'string') return null;\n  const parts = token.split('.');\n  if (parts.length < 2) return null;\n  try {\n    const payload = JSON.parse(atob(parts[1].replace(/-/g, '+').replace(/_/g, '/')));\n    if (typeof payload?.exp === 'number') {\n      return payload.exp * 1000;\n    }\n  } catch {\n    return null;\n  }\n  return null;\n};\n\nexport class AuthService {\n  constructor() {\n    this.accessToken = null;\n    this.user = null;\n    this.device = null;\n    this.session = null;\n    this.listeners = new Set();\n    this.governanceClient = getNoclipGovernanceClient();\n    this.refreshPromise = null;\n    this.authEpoch = 0;\n    this.refreshRejectedEpoch = -1;\n    this.signedOut = this._readExplicitSignOut();\n    this.deviceId = this._readDeviceId();\n    // Resolution state — \"has initialize() finished at least once?\". UI\n    // layers that conditionally show a login modal should wait until this\n    // is true so we don't flash the modal during the async token-refresh\n    // window on every page load.\n    this.resolved = false;\n    this.resolvedPromise = null;\n    // Eagerly hydrate from localStorage so the first call to getState()\n    // already reflects the stored session. Without this, PlanetScene and\n    // friends see isAuthenticated=false during the brief window between\n    // AuthService construction and initialize() kick-off → any module\n    // reading getState() there would treat the user as signed-out.\n    try { this._restoreSession({ notify: false }); } catch {}\n  }\n\n  /**\n   * Subscribe to auth state changes\n   */\n  subscribe(callback) {\n    this.listeners.add(callback);\n    return () => this.listeners.delete(callback);\n  }\n\n  /**\n   * Notify all listeners of auth state change\n   */\n  _notify(type = AUTH_LIFECYCLE_EVENT.SNAPSHOT) {\n    const state = {\n      isAuthenticated: !!this.accessToken,\n      accessToken: this.accessToken,\n      user: this.user,\n      device: this.device,\n      session: this.session,\n      resolved: !!this.resolved,\n    };\n    const event = Object.freeze({ type, authEpoch: this.authEpoch });\n    for (const listener of this.listeners) {\n      try {\n        // The event argument is additive: snapshot-only subscribers remain\n        // compatible while lifecycle-sensitive consumers can distinguish a\n        // credential renewal from a new or ended device session.\n        listener(state, event);\n      } catch (e) {\n        console.error('[AuthService] Listener error:', e);\n      }\n    }\n  }\n\n  /**\n   * Promise that resolves once initialize() has run at least once. UI layers\n   * that conditionally pop up a login modal should await this before deciding\n   * to show it — otherwise they'll flash the modal during the refresh window.\n   */\n  whenResolved() {\n    if (this.resolved) return Promise.resolve(this.getState());\n    if (!this.resolvedPromise) {\n      this.resolvedPromise = new Promise((resolve) => {\n        const off = this.subscribe((state) => {\n          if (state.resolved) { off(); resolve(state); }\n        });\n      });\n    }\n    return this.resolvedPromise;\n  }\n\n  /**\n   * Get device info for registration\n   */\n  _getDeviceInfo() {\n    const ua = navigator.userAgent;\n    let deviceType = 'other';\n    let deviceName = 'Browser';\n\n    if (/VR|Oculus|Quest|Vive|WMR|Pico/i.test(ua)) {\n      deviceType = 'vr';\n      deviceName = 'VR Headset';\n    } else if (/Mobile|Android|iPhone|iPad/i.test(ua)) {\n      deviceType = 'phone';\n      deviceName = 'Mobile Device';\n    } else if (/Windows|Mac|Linux/i.test(ua)) {\n      deviceType = 'laptop';\n      deviceName = navigator.platform || 'Desktop';\n    }\n\n    return { deviceType, deviceName };\n  }\n\n  /**\n   * Parse JSON response safely\n   */\n  async _parseResponse(response) {\n    const text = await response.text();\n    if (!text) {\n      return {};\n    }\n    try {\n      return JSON.parse(text);\n    } catch (e) {\n      console.error('[AuthService] Non-JSON response:', text.slice(0, 200));\n      throw new Error(`Server error: ${response.status} ${response.statusText}`);\n    }\n  }\n\n  _isDeviceOwnershipError(response, data) {\n    if (!response || response.status !== 403) return false;\n    const message = String(data?.message || data?.error || '').toLowerCase();\n    if (!message) return false;\n    return message.includes('device') && message.includes('belong') && message.includes('user');\n  }\n\n  /**\n   * Register a new user\n   */\n  async register({ handle, email, username, password }) {\n    const response = await this.governanceClient.request(`${API_BASE}/auth/register`, {\n      method: 'POST',\n      governanceLane: 'control',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ handle, email, username, password }),\n    });\n\n    const data = await this._parseResponse(response);\n\n    if (!response.ok) {\n      throw new Error(data.message || data.error || 'Registration failed');\n    }\n\n    return data;\n  }\n\n  /**\n   * Login with identifier and password\n   */\n  async login({ identifier, password }) {\n    const deviceInfo = this._getDeviceInfo();\n    const storedDeviceId = this.deviceId || this._readDeviceId();\n\n    const attemptLogin = async (deviceId) => {\n      const device = { ...deviceInfo };\n      if (deviceId) {\n        device.deviceId = deviceId;\n      }\n      const response = await this.governanceClient.request(`${API_BASE}/auth/login`, {\n        method: 'POST',\n        governanceLane: 'control',\n        headers: { 'Content-Type': 'application/json' },\n        credentials: 'include', // Include cookies for refresh token\n        body: JSON.stringify({\n          identifier,\n          password,\n          device,\n        }),\n      });\n\n      const data = await this._parseResponse(response);\n      return { response, data };\n    };\n\n    let { response, data } = await attemptLogin(storedDeviceId);\n\n    if (!response.ok && storedDeviceId && this._isDeviceOwnershipError(response, data)) {\n      this.clearDeviceId({ clearSession: true });\n      ({ response, data } = await attemptLogin(null));\n    }\n\n    if (!response.ok) {\n      throw new Error(data.message || data.error || 'Login failed');\n    }\n\n    return this._acceptAuthResult(data);\n  }\n\n  _acceptAuthResult(data) {\n    if (!data?.accessToken || !data?.user) {\n      throw new Error('Authentication response was incomplete');\n    }\n\n    const priorUserId = this.user?.userId || this.user?.id || null;\n    const nextUserId = data.user?.userId || data.user?.id || null;\n    if (priorUserId && nextUserId && priorUserId !== nextUserId) {\n      this.governanceClient.clearAccountState('account-switch');\n    }\n    // Invalidate any refresh request that began for the prior anonymous or\n    // account state before accepting a newly verified interactive session.\n    this.authEpoch += 1;\n    this.signedOut = false;\n    this._writeExplicitSignOut(false);\n    this.accessToken = data.accessToken;\n    this.user = data.user;\n    this.device = data.device;\n    const loginDeviceId = data.device?.deviceId\n      || data.device?.device_id\n      || data.deviceId\n      || null;\n    if (loginDeviceId) {\n      this.deviceId = loginDeviceId;\n      if (this.device && !this.device.deviceId) {\n        this.device.deviceId = loginDeviceId;\n      }\n      this._storeDeviceId(this.deviceId);\n    }\n    this._persistSession();\n    this._notify(AUTH_LIFECYCLE_EVENT.SESSION_ESTABLISHED);\n\n    return data;\n  }\n\n  isPasskeySupported() {\n    return typeof window !== 'undefined'\n      && !!window.PublicKeyCredential\n      && !!navigator?.credentials;\n  }\n\n  async isPlatformPasskeyAvailable() {\n    if (!this.isPasskeySupported()) return false;\n    try {\n      const { platformAuthenticatorIsAvailable } = await import('@simplewebauthn/browser');\n      return await platformAuthenticatorIsAvailable();\n    } catch {\n      return false;\n    }\n  }\n\n  _passkeyError(error, fallback) {\n    if (error?.name === 'NotAllowedError') {\n      return new Error('Passkey request cancelled or timed out.');\n    }\n    if (error?.name === 'InvalidStateError') {\n      return new Error('That passkey is already enrolled for this account.');\n    }\n    if (error?.name === 'SecurityError') {\n      return new Error('Passkeys are unavailable for this site origin.');\n    }\n    return error instanceof Error ? error : new Error(fallback);\n  }\n\n  async loginWithPasskey() {\n    if (!this.isPasskeySupported()) {\n      throw new Error('This browser does not support passkeys.');\n    }\n    const { startAuthentication } = await import('@simplewebauthn/browser');\n    const deviceInfo = this._getDeviceInfo();\n    const storedDeviceId = this.deviceId || this._readDeviceId();\n\n    const attempt = async (deviceId) => {\n      const optionsResponse = await this.governanceClient.request(\n        `${API_BASE}/auth/passkeys/authentication/options`,\n        {\n          method: 'POST',\n          governanceLane: 'control',\n          headers: { 'Content-Type': 'application/json' },\n          credentials: 'include',\n          body: '{}',\n        },\n      );\n      const optionsData = await this._parseResponse(optionsResponse);\n      if (!optionsResponse.ok) {\n        throw new Error(optionsData.message || 'Could not begin passkey sign-in');\n      }\n      const credential = await startAuthentication({ optionsJSON: optionsData.options });\n      const device = { ...deviceInfo };\n      if (deviceId) device.deviceId = deviceId;\n      const verifyResponse = await this.governanceClient.request(\n        `${API_BASE}/auth/passkeys/authentication/verify`,\n        {\n          method: 'POST',\n          governanceLane: 'control',\n          headers: { 'Content-Type': 'application/json' },\n          credentials: 'include',\n          body: JSON.stringify({\n            challengeId: optionsData.challengeId,\n            response: credential,\n            device,\n          }),\n        },\n      );\n      const data = await this._parseResponse(verifyResponse);\n      return { response: verifyResponse, data };\n    };\n\n    try {\n      let result = await attempt(storedDeviceId);\n      if (!result.response.ok\n        && storedDeviceId\n        && this._isDeviceOwnershipError(result.response, result.data)) {\n        this.clearDeviceId({ clearSession: true });\n        result = await attempt(null);\n      }\n      if (!result.response.ok) {\n        throw new Error(result.data.message || result.data.error || 'Passkey sign-in failed');\n      }\n      return this._acceptAuthResult(result.data);\n    } catch (error) {\n      throw this._passkeyError(error, 'Passkey sign-in failed');\n    }\n  }\n\n  async listPasskeys({signal} = {}) {\n    const response = await this.authenticatedFetch(`${API_BASE}/auth/passkeys`, {\n      signal,\n      method: 'GET',\n      governanceLane: 'control',\n    });\n    const data = await this._parseResponse(response);\n    if (!response.ok) throw new Error(data.message || 'Failed to load passkeys');\n    return data;\n  }\n\n  async registerPasskey({ name, preference = 'any' }) {\n    if (!this.isPasskeySupported()) {\n      throw new Error('This browser does not support passkeys.');\n    }\n    try {\n      const optionsResponse = await this.authenticatedFetch(\n        `${API_BASE}/auth/passkeys/registration/options`,\n        {\n          method: 'POST',\n          governanceLane: 'control',\n          body: JSON.stringify({ name, preference }),\n        },\n      );\n      const optionsData = await this._parseResponse(optionsResponse);\n      if (!optionsResponse.ok) {\n        throw new Error(optionsData.message || 'Could not begin passkey enrollment');\n      }\n      const { startRegistration } = await import('@simplewebauthn/browser');\n      const credential = await startRegistration({ optionsJSON: optionsData.options });\n      const verifyResponse = await this.authenticatedFetch(\n        `${API_BASE}/auth/passkeys/registration/verify`,\n        {\n          method: 'POST',\n          governanceLane: 'control',\n          body: JSON.stringify({ challengeId: optionsData.challengeId, response: credential }),\n        },\n      );\n      const data = await this._parseResponse(verifyResponse);\n      if (!verifyResponse.ok) throw new Error(data.message || 'Passkey enrollment failed');\n      return data;\n    } catch (error) {\n      throw this._passkeyError(error, 'Passkey enrollment failed');\n    }\n  }\n\n  async removePasskey(passkeyId, password) {\n    const response = await this.authenticatedFetch(\n      `${API_BASE}/auth/passkeys/${encodeURIComponent(passkeyId)}`,\n      {\n        method: 'DELETE',\n        governanceLane: 'control',\n        body: JSON.stringify({ password }),\n      },\n    );\n    const data = await this._parseResponse(response);\n    if (!response.ok) throw new Error(data.message || 'Failed to remove passkey');\n    return data;\n  }\n\n  /**\n   * Logout - invalidate session\n   */\n  async logout() {\n    // Capture revocation credentials, then make sign-out locally authoritative\n    // before waiting on the network. A congested or quota-denied logout request\n    // must never leave the account rendered as signed in.\n    const headers = this._authHeaders();\n    this.authEpoch += 1;\n    this.signedOut = true;\n    this._writeExplicitSignOut(true);\n    this.accessToken = null;\n    this.user = null;\n    this.device = null;\n    this.session = null;\n    this.governanceClient.clearAccountState('logout');\n    this._clearPersistedSession();\n    this._notify(AUTH_LIFECYCLE_EVENT.SESSION_ENDED);\n\n    try {\n      await this.governanceClient.request(`${API_BASE}/auth/logout`, {\n        method: 'POST',\n        governanceLane: 'control',\n        governanceRetry: false,\n        headers,\n        credentials: 'include',\n        keepalive: true,\n      });\n    } catch (e) {\n      console.warn('[AuthService] Logout request failed:', e);\n    }\n  }\n\n  /**\n   * Refresh access token using refresh token cookie\n   */\n  async refresh() {\n    if (this.signedOut) {\n      throw new Error('Signed out');\n    }\n    // A definitive missing/expired cookie cannot recover between anonymous\n    // requests. Login advances authEpoch; do not POST again for every layer.\n    if (this.refreshRejectedEpoch === this.authEpoch) {\n      throw new Error('Session expired');\n    }\n    // Prevent multiple simultaneous refresh calls\n    if (this.refreshPromise) {\n      return this.refreshPromise;\n    }\n\n    const refreshEpoch = this.authEpoch;\n    this.refreshPromise = (async () => {\n      try {\n        const deviceId = this.device?.deviceId\n          || this.device?.device_id\n          || this.deviceId\n          || this._readDeviceId();\n        if (!deviceId) {\n          throw new Error('Device ID missing');\n        }\n\n        const response = await this.governanceClient.request(`${API_BASE}/auth/refresh`, {\n          method: 'POST',\n          governanceLane: 'control',\n          headers: { 'Content-Type': 'application/json' },\n          credentials: 'include',\n          body: JSON.stringify({ deviceId }),\n        });\n\n        const data = await this._parseResponse(response);\n\n        if (refreshEpoch !== this.authEpoch) {\n          throw new Error('Session changed while refresh was in flight');\n        }\n\n        if (!response.ok) {\n          if (response.status !== 401) {\n            throw new Error(data.message || 'Session refresh unavailable');\n          }\n          this.refreshRejectedEpoch = refreshEpoch;\n          // Refresh failed - user needs to login again\n          this.accessToken = null;\n          this.user = null;\n          this.device = null;\n          this.session = null;\n          this._notify(AUTH_LIFECYCLE_EVENT.SESSION_EXPIRED);\n          throw new Error(data.message || 'Session expired');\n        }\n\n        this.accessToken = data.accessToken;\n        this._persistSession();\n        this._notify(AUTH_LIFECYCLE_EVENT.CREDENTIAL_REFRESHED);\n\n        return data.accessToken;\n      } finally {\n        this.refreshPromise = null;\n      }\n    })();\n\n    return this.refreshPromise;\n  }\n\n  /**\n   * Get current user info\n   */\n  async getMe() {\n    const requestEpoch = this.authEpoch;\n    const response = await this.governanceClient.request(`${API_BASE}/auth/me`, {\n      method: 'GET',\n      governanceLane: 'control',\n      headers: this._authHeaders(),\n      credentials: 'include',\n    });\n\n    const data = await this._parseResponse(response);\n\n    if (requestEpoch !== this.authEpoch || this.signedOut) {\n      throw new Error('Session changed while account verification was in flight');\n    }\n\n    if (!response.ok) {\n      if (response.status === 401) {\n        // Try to refresh token\n        await this.refresh();\n        return this.getMe();\n      }\n      throw new Error(data.message || 'Failed to get user info');\n    }\n\n    this.user = data.user;\n    const deviceId = data.device?.deviceId || data.device?.device_id || data.deviceId || data.device_id || null;\n    const sessionId = data.session?.sessionId || data.session?.session_id || data.sessionId || data.session_id || null;\n    this.device = data.device || (deviceId ? { deviceId } : null);\n    if (this.device && !this.device.deviceId && deviceId) {\n      this.device.deviceId = deviceId;\n    }\n    this.session = data.session || (sessionId ? { sessionId } : null);\n    if (deviceId) {\n      this.deviceId = deviceId;\n      this._storeDeviceId(this.deviceId);\n    }\n    this._persistSession();\n    this._notify(AUTH_LIFECYCLE_EVENT.IDENTITY_UPDATED);\n\n    return data;\n  }\n\n  _readDeviceId() {\n    if (typeof window === 'undefined') return null;\n    let stored = null;\n    try {\n      if (window.localStorage) {\n        stored = window.localStorage.getItem(DEVICE_ID_STORAGE_KEY);\n      }\n    } catch {\n      stored = null;\n    }\n    if (stored) return stored;\n    const cookieValue = readCookie(DEVICE_ID_STORAGE_KEY);\n    if (cookieValue) {\n      try {\n        if (window.localStorage) {\n          window.localStorage.setItem(DEVICE_ID_STORAGE_KEY, cookieValue);\n        }\n      } catch {\n        // ignore storage failures\n      }\n      return cookieValue;\n    }\n    // Generate a new deviceId if none exists\n    const deviceId = crypto.randomUUID();\n    try {\n      if (window.localStorage) {\n        window.localStorage.setItem(DEVICE_ID_STORAGE_KEY, deviceId);\n      }\n      writeCookie(DEVICE_ID_STORAGE_KEY, deviceId);\n    } catch {\n      // ignore storage failures\n    }\n    return deviceId;\n  }\n\n  _storeDeviceId(deviceId) {\n    if (!deviceId || typeof window === 'undefined') return;\n    try {\n      if (window.localStorage) {\n        window.localStorage.setItem(DEVICE_ID_STORAGE_KEY, deviceId);\n      }\n    } catch {\n      // ignore storage failures\n    }\n    writeCookie(DEVICE_ID_STORAGE_KEY, deviceId);\n  }\n\n  _stripDeviceIdFromSession() {\n    try {\n      const storage = resolveAuthStorage();\n      if (!storage) return;\n      const raw = storage.getItem(SESSION_STORAGE_KEY);\n      if (!raw) return;\n      const parsed = JSON.parse(raw);\n      if (!parsed || typeof parsed !== 'object' || !('deviceId' in parsed)) return;\n      delete parsed.deviceId;\n      storage.setItem(SESSION_STORAGE_KEY, JSON.stringify(parsed));\n    } catch {\n      // ignore storage failures\n    }\n  }\n\n  clearDeviceId({ clearSession = false } = {}) {\n    this.deviceId = null;\n    if (this.device && typeof this.device === 'object' && this.device.deviceId) {\n      this.device = { ...this.device };\n      delete this.device.deviceId;\n    }\n    if (typeof window !== 'undefined') {\n      try {\n        if (window.localStorage) {\n          window.localStorage.removeItem(DEVICE_ID_STORAGE_KEY);\n        }\n      } catch {\n        // ignore storage failures\n      }\n    }\n    clearCookie(DEVICE_ID_STORAGE_KEY);\n    if (clearSession) {\n      this._clearPersistedSession();\n    } else {\n      this._stripDeviceIdFromSession();\n    }\n  }\n\n  _persistSession() {\n    try {\n      const storage = resolveAuthStorage();\n      if (!storage) return;\n      const exp = parseJwtExp(this.accessToken);\n      const payload = {\n        accessToken: this.accessToken || null,\n        user: this.user || null,\n        device: this.device || null,\n        session: this.session || null,\n        deviceId: this.deviceId || null,\n        exp,\n        savedAt: Date.now(),\n      };\n      storage.setItem(SESSION_STORAGE_KEY, JSON.stringify(payload));\n    } catch {\n      // ignore storage failures\n    }\n  }\n\n  _restoreSession({ notify = false } = {}) {\n    if (this.signedOut) {\n      this._clearPersistedSession();\n      return false;\n    }\n    try {\n      const storage = resolveAuthStorage();\n      if (!storage) return false;\n      const raw = storage.getItem(SESSION_STORAGE_KEY);\n      if (!raw) return false;\n      const parsed = JSON.parse(raw);\n      if (!parsed || typeof parsed !== 'object') return false;\n      if (Number.isFinite(parsed.exp) && Date.now() >= parsed.exp) {\n        storage.removeItem(SESSION_STORAGE_KEY);\n        return false;\n      }\n      this.accessToken = parsed.accessToken || this.accessToken || null;\n      this.user = parsed.user || this.user || null;\n      this.device = parsed.device || this.device || null;\n      this.session = parsed.session || this.session || null;\n      if (parsed.deviceId) {\n        this.deviceId = parsed.deviceId;\n        this._storeDeviceId(parsed.deviceId);\n      }\n      if (notify) this._notify(AUTH_LIFECYCLE_EVENT.SESSION_RESTORED);\n      return !!this.accessToken;\n    } catch {\n      return false;\n    }\n  }\n\n  _clearPersistedSession() {\n    if (typeof window === 'undefined') return;\n    for (const storageName of ['localStorage', 'sessionStorage']) {\n      try {\n        const storage = window[storageName];\n        storage?.removeItem(SESSION_STORAGE_KEY);\n      } catch {\n        // ignore storage failures\n      }\n    }\n  }\n\n  _readExplicitSignOut() {\n    if (typeof window === 'undefined') return false;\n    for (const storageName of ['localStorage', 'sessionStorage']) {\n      try {\n        const storage = window[storageName];\n        if (storage?.getItem(EXPLICIT_SIGN_OUT_STORAGE_KEY) === '1') return true;\n      } catch {\n        // ignore storage failures\n      }\n    }\n    return false;\n  }\n\n  _writeExplicitSignOut(active) {\n    if (typeof window === 'undefined') return;\n    for (const storageName of ['localStorage', 'sessionStorage']) {\n      try {\n        const storage = window[storageName];\n        if (active) storage?.setItem(EXPLICIT_SIGN_OUT_STORAGE_KEY, '1');\n        else storage?.removeItem(EXPLICIT_SIGN_OUT_STORAGE_KEY);\n      } catch {\n        // ignore storage failures\n      }\n    }\n  }\n\n  /**\n   * Initialize auth state on page load\n   */\n  async initialize() {\n    const restored = this._restoreSession({ notify: false });\n    if (this.signedOut) {\n      this.resolved = true;\n      this._notify(AUTH_LIFECYCLE_EVENT.SESSION_RESOLVED);\n      return false;\n    }\n    try {\n      // Try to refresh and get current user\n      await this.refresh();\n      await this.getMe();\n      this.resolved = true;\n      // Notify even on the happy path so resolved=true propagates to any\n      // components that subscribed pre-resolution.\n      this._notify(AUTH_LIFECYCLE_EVENT.SESSION_RESOLVED);\n      return true;\n    } catch (e) {\n      if (restored && this.accessToken) {\n        this.resolved = true;\n        this._notify(AUTH_LIFECYCLE_EVENT.SESSION_RESOLVED);\n        return true;\n      }\n      console.log('[AuthService] No existing session');\n      this.accessToken = null;\n      this.user = null;\n      this.device = null;\n      this.session = null;\n      this._clearPersistedSession();\n      this.resolved = true;\n      this._notify(AUTH_LIFECYCLE_EVENT.SESSION_RESOLVED);\n      return false;\n    }\n  }\n\n  /**\n   * Get authorization headers\n   */\n  _authHeaders(options = {}) {\n    const headers = {};\n    if (options.includeContentType !== false) {\n      headers['Content-Type'] = 'application/json';\n    }\n    if (this.accessToken) {\n      headers['Authorization'] = `Bearer ${this.accessToken}`;\n    }\n    return headers;\n  }\n\n  /**\n   * Make authenticated API request with auto-refresh\n   */\n  async authenticatedFetch(url, options = {}) {\n    const deviceId = this.device?.deviceId\n      || this.device?.device_id\n      || this.deviceId\n      || this._readDeviceId();\n    const canRefresh = !this.signedOut && !!deviceId;\n    const hadToken = !!this.accessToken;\n    let attemptedRefresh = false;\n\n    if (!this.accessToken && canRefresh) {\n      attemptedRefresh = true;\n      try {\n        await this.refresh();\n      } catch {\n        // Ignore refresh failures before initial request; caller can handle 401.\n      }\n    }\n\n    const makeRequest = async (suppress401 = false) => {\n      const isFormData =\n        typeof FormData !== 'undefined' && options.body instanceof FormData;\n      const hasBody = options.body !== undefined && options.body !== null;\n      const includeContentType = options.includeContentType !== false && !isFormData && hasBody;\n      // Header names are case-insensitive. Object spread could retain both\n      // Content-Type and content-type, which fetch joins into an invalid MIME\n      // type (application/json, application/json) and the API rejects as 415.\n      const headers = new Headers(this._authHeaders({ includeContentType }));\n      new Headers(options.headers).forEach((value, name) => headers.set(name, value));\n\n      return this.governanceClient.request(url, {\n        ...options,\n        headers,\n        credentials: 'include',\n        governanceSuppress401: suppress401,\n      });\n    };\n\n    let response = await makeRequest(canRefresh);\n\n    if (response.status === 401 && canRefresh && (!attemptedRefresh || this.accessToken)) {\n      // Token expired, try to refresh\n      try {\n        await this.refresh();\n        response = await makeRequest(false);\n      } catch (e) {\n        if (hadToken) {\n          throw new Error('Session expired. Please login again.');\n        }\n      }\n    }\n\n    return response;\n  }\n\n  /**\n   * Get current auth state\n   */\n  getState() {\n    return {\n      isAuthenticated: !!this.accessToken,\n      // Runtime-only bearer material is needed by the authenticated\n      // WebSocket handshake. It remains in memory and must never be persisted\n      // by UI consumers beyond AuthService's existing session policy.\n      accessToken: this.accessToken,\n      user: this.user,\n      device: this.device,\n      session: this.session,\n      resolved: !!this.resolved,\n    };\n  }\n}\n\n// Singleton instance\nlet authServiceInstance = null;\n\nexport function getAuthService() {\n  if (!authServiceInstance) {\n    authServiceInstance = new AuthService();\n  }\n  return authServiceInstance;\n}\n","export const WEATHER_VOLUME_LAYERS = Object.freeze([\n  {id:'weatherRadar',product:'reflectivity',label:'3D radar reflectivity',description:'Measured NOAA MRMS / NEXRAD precipitation volumes; missing beams remain gaps.'},\n  {id:'weatherRadarVelocity',product:'radial-velocity',label:'Radar radial velocity',description:'Measured NEXRAD Doppler velocity along the beam; not a complete wind vector.'},\n  {id:'weatherCloudWater',product:'cloud-water',label:'Cloud liquid & ice',description:'Model condensate at supplied physical heights; no cloud density inferred from humidity.'},\n  {id:'weatherWind',product:'wind',label:'3D wind field',description:'Flowing streamlines from sampled east/north wind at physical model heights. Dashes animate at 20× display playback; no vertical wind or future trajectory is inferred.'},\n  {id:'weatherTemperature',product:'temperature',label:'Atmospheric temperature',description:'Color-coded multilevel temperatures, with source time and native height data.'},\n  {id:'weatherHumidity',product:'humidity',label:'Atmospheric humidity',description:'Relative humidity at model levels; distinct from measured clouds.'},\n  {id:'weatherPressure',product:'pressure',label:'Pressure systems',description:'Pressure surfaces placed using supplied geopotential, converted to geometric altitude.'},\n]);\nexport const WEATHER_MODEL_SOURCES=Object.freeze([\n  ['auto','Automatic: GFS / GEOS-FP'],['gfs','NOAA GFS 0.25°'],['ifs','ECMWF IFS 0.1°'],['hrrr','NOAA HRRR'],\n  ['icon','DWD ICON Global'],['icon-eu','DWD ICON-EU'],['icon-d2','DWD ICON-D2'],['gdps','Canada GDPS'],\n  ['geos','NASA GEOS-FP analysis'],['gefs','NOAA GEFS control'],['rrfs','NOAA RRFS'],\n]);\nexport const WEATHER_VOLUME_DEFAULTS=Object.freeze({source:'auto',radarSource:'auto',forecastHours:0,opacity:0.28,radiusKm:60,lod:2});\nexport const WEATHER_PRODUCT_STYLES=Object.freeze({\n  reflectivity:{range:[-10,70],unit:'dBZ',colors:[0x44b5d7,0x3bd65c,0xf0eb3b,0xfa8e28,0xea354b,0xd834d3]},\n  'radial-velocity':{range:[-50,50],unit:'m/s',colors:[0x3246ef,0x39c5e8,0xcccccc,0xf2a249,0xec3547]},\n  'cloud-water':{range:[0,0.001],unit:'kg/kg',colors:[0x839bab,0x9bd4f2,0xefedfd,0xc3a2f1]},\n  wind:{range:[0,80],unit:'m/s',colors:[0x47b8e8,0x46dfb0,0xf0db48,0xf55c52,0xba6dec]},\n  temperature:{range:[210,310],unit:'K',colors:[0x6946c3,0x4593e6,0x54dccb,0xece069,0xf08d45,0xe13b4e]},\n  humidity:{range:[0,100],unit:'%',colors:[0xa27a4f,0xd0c99a,0x7dccb3,0x4aaad9,0x6c75dc]},\n  pressure:{range:[100,1000],unit:'hPa',colors:[0x8a5ae4,0x478de3,0x44c9b9,0xd7dd64,0xf09045,0xe65558]},\n});\n\nexport function validateWeatherVolume(v){\n  if(v?.schema!=='noclip.weather-volume/1'||!WEATHER_PRODUCT_STYLES[v.product]||v.verticalDatum!=='geometric-MSL'\n    ||!['measured','analysis','forecast'].includes(v.classification)||!Array.isArray(v.cells)||v.cells.length>25000\n    ||!Array.isArray(v.columns)||v.columns.length<4||v.columns.length>6)throw new Error('Unsupported weather volume');\n  for(const row of v.cells){if(!Array.isArray(row)||row.length!==v.columns.length||row.some(n=>n!==null&&!Number.isFinite(n))\n    ||row[0]===null||Math.abs(row[0])>90||row[1]===null||Math.abs(row[1])>180||row[2]===null||row[2]<-1000||row[2]>25000)throw new Error('Invalid weather sample');}\n  if(v.cells.length&&(!Number.isFinite(Date.parse(v.validTime))||!Number.isFinite(Date.parse(v.referenceTime))))throw new Error('Weather time unavailable');\n  return v;\n}\n","export const LABEL_TEMPORAL_FILTER_MODES = Object.freeze([\n  { id: 'all', label: 'Any time' },\n  { id: 'today', label: 'Today only (intraday)' },\n  { id: '1h', label: 'Last hour' },\n  { id: '6h', label: 'Last 6 hours' },\n  { id: '24h', label: 'Last 24 hours' },\n  { id: '7d', label: 'Last 7 days' },\n  { id: 'day', label: 'Specific calendar day' },\n]);\n\nexport const LABEL_TEMPORAL_FILTER_MODE_IDS = Object.freeze(\n  LABEL_TEMPORAL_FILTER_MODES.map((entry) => entry.id),\n);\n\nconst MODE_IDS = new Set(LABEL_TEMPORAL_FILTER_MODE_IDS);\nconst ROLLING_WINDOWS_MS = Object.freeze({\n  '1h': 60 * 60_000,\n  '6h': 6 * 60 * 60_000,\n  '24h': 24 * 60 * 60_000,\n  '7d': 7 * 24 * 60 * 60_000,\n});\n\nexport const DEFAULT_LABEL_TEMPORAL_FILTER = Object.freeze({\n  mode: 'all',\n  selectedDate: '',\n  includeUntimestamped: true,\n});\n\nexport function normalizeLabelTemporalFilter(value = {}) {\n  const mode = MODE_IDS.has(value?.mode) ? value.mode : DEFAULT_LABEL_TEMPORAL_FILTER.mode;\n  const selectedDate = /^\\d{4}-\\d{2}-\\d{2}$/.test(String(value?.selectedDate || ''))\n    ? String(value.selectedDate)\n    : '';\n  return {\n    mode,\n    selectedDate,\n    includeUntimestamped: value?.includeUntimestamped !== false,\n  };\n}\n\nfunction localDayRange(dateText, nowMs) {\n  let start = new Date(nowMs);\n  if (dateText) {\n    const [year, month, day] = dateText.split('-').map(Number);\n    start = new Date(year, month - 1, day);\n    if (start.getFullYear() !== year || start.getMonth() !== month - 1 || start.getDate() !== day) {\n      return null;\n    }\n  } else {\n    start = new Date(nowMs);\n    start.setHours(0, 0, 0, 0);\n  }\n  const startMs = start.getTime();\n  const end = new Date(startMs);\n  end.setDate(end.getDate() + 1);\n  return { startMs, endMs: end.getTime() };\n}\n\n/** Shared source-time predicate used by both CSS2D and Leaflet projections. */\nexport function labelMatchesTemporalFilter(occurredAtMs, filter, nowMs = Date.now()) {\n  const normalized = normalizeLabelTemporalFilter(filter);\n  if (!Number.isFinite(occurredAtMs)) return normalized.includeUntimestamped;\n  if (normalized.mode === 'all') return true;\n\n  const occurrence = Number(occurredAtMs);\n  if (normalized.mode === 'today') {\n    const range = localDayRange('', nowMs);\n    return occurrence >= range.startMs && occurrence < range.endMs;\n  }\n  if (normalized.mode === 'day') {\n    const range = localDayRange(normalized.selectedDate, nowMs);\n    return !!range && occurrence >= range.startMs && occurrence < range.endMs;\n  }\n  const windowMs = ROLLING_WINDOWS_MS[normalized.mode];\n  if (!Number.isFinite(windowMs)) return true;\n  return occurrence <= nowMs && occurrence >= nowMs - windowMs;\n}\n\n/** Next clock-only eligibility change; lets parked candidates wake without polling. */\nexport function nextLabelTemporalFilterChange(occurredAtMs, filter, nowMs = Date.now()) {\n  if (!Number.isFinite(occurredAtMs) || filter?.mode === 'all') return Infinity;\n  if (filter?.mode === 'today' || (filter?.mode === 'day' && !filter.selectedDate)) return localDayRange('', nowMs).endMs;\n  if (filter?.mode === 'day') return Infinity;\n  const windowMs = ROLLING_WINDOWS_MS[filter?.mode];\n  if (!Number.isFinite(windowMs)) return Infinity;\n  if (occurredAtMs > nowMs) return occurredAtMs;\n  const expiry = occurredAtMs + windowMs + 1;\n  return expiry > nowMs ? expiry : Infinity;\n}\n\nexport function labelTemporalFilterSummary(filter) {\n  const normalized = normalizeLabelTemporalFilter(filter);\n  if (normalized.mode === 'day') return normalized.selectedDate || 'Choose day';\n  return LABEL_TEMPORAL_FILTER_MODES.find((entry) => entry.id === normalized.mode)?.label || 'Any time';\n}\n","/**\n * Canonical product categories for every label rendered by the scene.\n *\n * Overlay-specific settings may decide whether a source fetches or renders a\n * marker, but this registry is the only authority for label visibility.\n */\n\nimport { WEATHER_VOLUME_LAYERS } from '../weather/WeatherVolumeContract.js';\nimport { DEFAULT_LABEL_TEMPORAL_FILTER } from './LabelTemporalFilter.js';\n\nexport const LABEL_CATEGORY_GROUPS = Object.freeze([\n  { id: 'live', label: 'Live activity', description: 'Moving objects and time-sensitive public activity.' },\n  { id: 'weatherVolumes', label: 'Volumetric weather', description: 'Numeric radar, cloud water, wind and pressure fields at real atmospheric heights.' },\n  { id: 'environment', label: 'Environment', description: 'Scientifically distinct fire, smoke, air-quality, and imagery products.' },\n  { id: 'radiation', label: 'Radiation', description: 'Compatible ground measurements, derived dose-rate cells, and separate space-weather conditions.' },\n  { id: 'hazards', label: 'Conflict & hazards', description: 'Analyst-coded conflict, instrument detections, official alerts, and multi-hazard events.' },\n  { id: 'place', label: 'Places & map', description: 'Persistent places, map context, and boundaries.' },\n  { id: 'context', label: 'Context', description: 'Temporary interaction and authored context.' },\n]);\n\nexport const LABEL_CATEGORIES = Object.freeze([\n  ...WEATHER_VOLUME_LAYERS.map(layer=>({...layer,group:'weatherVolumes',types:['weather-volume-'+layer.product],essential:false,defaultEnabled:false})),\n  { id: 'leadership', group: 'live', label: 'Government & leadership', description: 'Global national, regional and municipal offices, government forms, terms and source-qualified leadership changes.', types: ['administrative-leadership', 'leadership-change'], essential: false, defaultEnabled: false },\n  { id: 'cveNow', group: 'live', label: 'CVE now', description: 'Global live and recent vulnerability advisories; non-geographic feed in Layers and Recent events.', types: ['cyber-vulnerability'], essential: false, defaultEnabled: false },\n  { id: 'lunarFeatures', group: 'context', label: 'Moon features', description: 'IAU named craters, lettered craters and surface features on the Moon.', types: ['lunar-feature'], essential: false },\n  { id: 'astronomy', group: 'context', label: 'Stars & sky', description: 'Constellations and catalog stars near where you look (mouse or centre of view), plus Milky Way and deep-sky landmarks above the 3D horizon.', types: ['celestial'], essential: false, defaultEnabled: false },\n  { id: 'aircraft', group: 'live', label: 'Aircraft', description: 'Flight callsigns and movement details.', types: ['aircraft'], legacyKey: 'aircraft', essential: true },\n  { id: 'maritime', group: 'live', label: 'Maritime', description: 'Vessel names and navigation details.', types: ['maritime'], legacyKey: 'maritime', essential: true },\n  { id: 'satellites', group: 'live', label: 'Satellites', description: 'Orbital object identifiers.', types: ['satellite'], legacyKey: 'satellites', essential: false },\n  { id: 'users', group: 'live', label: 'Nearby users', description: 'Usernames mated to live nearby avatars inside the shared scene viewshed.', types: ['user'], essential: true },\n  { id: 'incidents', group: 'live', label: 'Incidents', description: 'Public safety incident summaries.', types: ['incident'], legacyKey: 'incidents', essential: true },\n  { id: 'sensors', group: 'live', label: 'Sensors & mesh', description: 'Sensor, radio, and Meshtastic metadata.', types: ['sensor'], legacyKey: 'sensors', essential: false },\n  { id: 'trafficCameras', group: 'live', label: 'Traffic cameras', description: 'Public camera source and status labels.', types: ['traffic-camera'], essential: false },\n  { id: 'roadTraffic', group: 'live', label: 'Road traffic', description: 'Official measured flow, incidents, closures, and work-zone geometry.', types: ['road-traffic'], essential: false },\n  { id: 'radioReceivers', group: 'live', label: 'SDR receivers', description: 'Location-bounded public SDR and radiosonde receiver stations.', types: ['radio-receiver'], essential: false, defaultEnabled: false },\n  { id: 'radioPropagation', group: 'live', label: 'RF propagation', description: 'Recent WSPR, Reverse Beacon Network, and PSK reception paths; grid locators render at cell centroids.', types: ['radio-propagation'], essential: false, defaultEnabled: false },\n  { id: 'satelliteGroundStations', group: 'live', label: 'Satellite RF', description: 'Regional SatNOGS ground stations and validated observation audio/waterfall captures.', types: ['satellite-ground-station'], essential: false, defaultEnabled: false },\n  { id: 'radiosondes', group: 'live', label: 'Sondes & balloons', description: 'Current SondeHub radiosonde and amateur-balloon telemetry near the scene.', types: ['radiosonde', 'amateur-balloon'], essential: false, defaultEnabled: false },\n  { id: 'broadcastRadio', group: 'live', label: 'Broadcast radio', description: 'Geocoded Radio-Browser stations in the active country and scene radius.', types: ['broadcast-radio'], essential: false, defaultEnabled: false },\n  { id: 'thermalDetections', group: 'environment', label: 'Thermal detections', description: 'FIRMS satellite anomalies; orbit masks aggregate detections and are not confirmed wildfires or burn perimeters.', types: ['thermal-anomaly'], essential: false, defaultEnabled: false },\n  { id: 'wildfireEvents', group: 'environment', label: 'Wildfire events', description: 'Named EONET event metadata; orbit circles are magnitude context, not wildfire perimeters.', types: ['wildfire-event'], essential: false, defaultEnabled: false },\n  { id: 'smokePlumes', group: 'environment', label: 'Smoke volumes', description: 'NOAA HMS analyst smoke polygons shown as qualitative surface extents and volumes.', types: ['smoke-plume'], essential: false, defaultEnabled: false },\n  { id: 'airQuality', group: 'environment', label: 'Air quality', description: 'CAMS modeled pollutant cells via Open-Meteo; not ground-station observations.', types: ['modeled-air-quality'], essential: false, defaultEnabled: false },\n  { id: 'environmentImagery', group: 'environment', label: 'Atmospheric imagery', description: 'CAMS and NASA GIBS rendered layers; image colors are not concentration values.', types: ['environment-imagery'], essential: false, defaultEnabled: false },\n  { id: 'radiationObservations', group: 'radiation', label: 'Radiation monitors', description: 'Government and citizen measurements with original units retained; CPM is not converted without detector calibration.', types: ['radiation-observation'], essential: false, defaultEnabled: false },\n  { id: 'radiationHeatmap', group: 'radiation', label: 'Radiation heatmap', description: 'H3 cells derived only from physically compatible dose-rate observations, with no gap interpolation.', types: ['radiation-heatmap'], essential: false, defaultEnabled: false },\n  { id: 'spaceRadiation', group: 'radiation', label: 'Space radiation', description: 'NOAA SWPC solar-proton conditions; never projected as terrestrial contamination.', types: ['space-radiation'], essential: false, defaultEnabled: false },\n  { id: 'armedConflict', group: 'hazards', label: 'Armed conflict', description: 'UCDP analyst-coded organized violence from public bulk artifacts; locations may be approximate.', types: ['armed-conflict'], essential: false, defaultEnabled: false },\n  { id: 'violentCrime', group: 'hazards', label: 'Violent crime', description: 'Regional media, CAD, and police-reported violent incidents with confidence and published location precision; statistical baselines never become incident points.', types: ['violent-crime'], essential: false, defaultEnabled: false },\n  { id: 'reportedExplosions', group: 'hazards', label: 'Cataloged explosions', description: 'USGS instrument-cataloged explosions and blasts; shallow earthquakes are not inferred to be explosions.', types: ['reported-explosion'], essential: false, defaultEnabled: false },\n  { id: 'seismicEvents', group: 'hazards', label: 'Seismic events', description: 'USGS instrument-detected earthquakes with magnitude, depth, status, and revision metadata.', types: ['seismic-event'], essential: false, defaultEnabled: false },\n  { id: 'volcanoes', group: 'hazards', label: 'Volcanoes', description: 'EONET volcanic event references; points are not eruption footprints or hazard zones.', types: ['volcanic-event'], essential: false, defaultEnabled: false },\n  { id: 'tsunamiAlerts', group: 'hazards', label: 'Tsunami alerts', description: 'Official tsunami.gov CAP alerts; alert areas are not inundation boundaries.', types: ['tsunami-alert'], essential: false, defaultEnabled: false },\n  { id: 'multiHazards', group: 'hazards', label: 'Multi-hazard alerts', description: 'GDACS earthquake, cyclone, flood, volcano, drought, and wildfire event alerts.', types: ['multi-hazard'], essential: false, defaultEnabled: false },\n  { id: 'buildings', group: 'place', label: 'Buildings', description: 'Named buildings and photoreal building context.', types: ['building'], legacyKey: 'buildings', essential: false },\n  { id: 'places', group: 'place', label: 'Places & businesses', description: 'Named businesses and places from public map data.', types: ['business'], essential: true },\n  { id: 'geocaches', group: 'place', label: 'Geocaches', description: 'Public OpenCaching inventory with cache type, status, terrain, difficulty, and provider attribution.', types: ['geocache'], essential: false, defaultEnabled: false },\n  { id: 'communityNotes', group: 'place', label: 'Community notes & assets', description: 'Public field notes and assets backed by mobile GPS/orientation proof.', types: ['community-note'], essential: true },\n  { id: 'personalNotes', group: 'place', label: 'Account notes', description: 'Account-owned notes from the automatically managed My Notes overlay; notes explicitly published through the complete overlay/layer/item access chain are visible to everyone.', types: ['account-note'], essential: true },\n  { id: 'natural', group: 'place', label: 'Natural features', description: 'Named terrain and natural points of interest.', types: ['natural'], essential: false },\n  { id: 'infrastructure', group: 'place', label: 'Infrastructure', description: 'Named roads, utilities, and transport infrastructure.', types: ['infrastructure'], legacyKey: 'infrastructure', essential: false, showInFilterRail: false },\n  { id: 'administrative', group: 'place', label: 'Administrative borders', description: 'Country, regional, and local boundary spires, orbital ribbons, and labels.', types: ['geojson'], essential: true },\n  { id: 'overlays', group: 'context', label: 'Authored overlays', description: 'Labels supplied by user or shared overlays.', types: ['overlay'], essential: true },\n]);\n\nconst BY_ID = new Map(LABEL_CATEGORIES.map((category) => [category.id, category]));\nconst BY_TYPE = new Map();\nfor (const category of LABEL_CATEGORIES) {\n  for (const type of category.types || []) {\n    if (!BY_TYPE.has(type)) BY_TYPE.set(type, category);\n  }\n}\n\nexport const DEFAULT_LABEL_CATEGORIES = Object.freeze(\n  Object.fromEntries(LABEL_CATEGORIES.map((category) => [\n    category.id,\n    category.defaultEnabled !== false,\n  ]))\n);\n\nexport const DEFAULT_LABEL_PRESENTATION = Object.freeze({\n  maxWidthPx: 220,\n  maxLines: 3,\n  verbosity: 2,\n});\n\nexport const DEFAULT_LABEL_DYNAMICS = Object.freeze({\n  detailRadius: 0.38,\n  fullDetailRadius: 0.22,\n  peripheryScale: 0.5,\n  focusedMarkerScale: 1.25,\n  pointerFocusRadiusPx: 170,\n  collisionPaddingPx: 5,\n  avoidanceStrength: 0.58,\n  clusterBranchSpacingPx: 44,\n  clusterHoverPaddingPx: 48,\n});\n\n/** Celestial object kinds shown when \"Stars & sky\" is on. */\nexport const SKY_LABEL_KINDS = Object.freeze([\n  ['constellations', 'Constellations'],\n  ['stars', 'Stars'],\n  ['clusters', 'Clusters'],\n  ['galaxies', 'Galaxies'],\n  ['nebulae', 'Nebulae'],\n]);\nexport const DEFAULT_SKY_LABEL_KINDS = Object.freeze(Object.fromEntries(SKY_LABEL_KINDS.map(([id]) => [id, true])));\n\nexport const DEFAULT_LABEL_SETTINGS = Object.freeze({\n  enabled: true,\n  categories: DEFAULT_LABEL_CATEGORIES,\n  smokePresentation: 'geometry',\n  skyKinds: DEFAULT_SKY_LABEL_KINDS,\n  temporalFilter: DEFAULT_LABEL_TEMPORAL_FILTER,\n  viewConeDeg: 75,\n  scaleMultiplier: 1,\n  maxVisible: 50,\n  presentation: DEFAULT_LABEL_PRESENTATION,\n  dynamics: DEFAULT_LABEL_DYNAMICS,\n});\n\n/**\n * Categories whose rail/mobile label buttons also own a live scene source.\n *\n * These bindings keep the compact label controls and the expanded Overlays\n * controls on one state instead of allowing a source to be enabled while its\n * corresponding rail button reports that it is disabled (or vice versa).\n * Paths are scene-relative because every consumer ultimately calls\n * SceneSettings.updateScene().\n */\nexport const LABEL_CATEGORY_SOURCE_BINDINGS = Object.freeze({\n  administrative: Object.freeze({\n    section: 'debug',\n    key: 'geoJson',\n    syncLabelKey: 'geoJsonLabels',\n    // The engineering/debug provider configuration can seed and explicitly\n    // override the product category, but ordinary layer controls own only the\n    // canonical category. This keeps a user-facing toggle out of debug policy.\n    controlSource: false,\n  }),\n  aircraft: Object.freeze({ section: 'flights' }),\n  satellites: Object.freeze({ section: 'satellites' }),\n  maritime: Object.freeze({ section: 'maritime' }),\n  incidents: Object.freeze({\n    section: 'incidents',\n    syncShowLabels: true,\n    enablePatch: Object.freeze({ autoZipEnabled: true }),\n  }),\n  sensors: Object.freeze({ section: 'sensors' }),\n  trafficCameras: Object.freeze({ section: 'trafficCameras', syncShowLabels: true }),\n  roadTraffic: Object.freeze({ section: 'roadTraffic', syncShowLabels: true }),\n  buildings: Object.freeze({ section: 'buildings' }),\n  geocaches: Object.freeze({ section: 'geocaches' }),\n  infrastructure: Object.freeze({ section: 'infrastructure' }),\n  radioReceivers: Object.freeze({ section: 'radioData', feed: 'receivers' }),\n  radioPropagation: Object.freeze({ section: 'radioData', feed: 'propagation' }),\n  satelliteGroundStations: Object.freeze({ section: 'radioData', feed: 'satellite-rf' }),\n  radiosondes: Object.freeze({ section: 'radioData', feed: 'balloons' }),\n  broadcastRadio: Object.freeze({ section: 'radioData', feed: 'broadcast' }),\n});\n\nexport function getLabelCategory(id) {\n  return BY_ID.get(id) || null;\n}\n\nexport function getLabelCategoryForType(type) {\n  return BY_TYPE.get(type) || null;\n}\n\nexport function getLabelCategoriesByGroup(groupId) {\n  return LABEL_CATEGORIES.filter((category) => category.group === groupId);\n}\n\nexport function getLabelCategoriesForFilterRail(groupId) {\n  return getLabelCategoriesByGroup(groupId)\n    .filter((category) => category.showInFilterRail !== false);\n}\n\nexport function getLabelCategoryValue(labels, categoryId, fallback = true) {\n  const category = getLabelCategory(categoryId);\n  if (!category) return fallback;\n  const explicit = labels?.categories?.[category.id];\n  if (typeof explicit === 'boolean') return explicit;\n  const legacy = category.legacyKey ? labels?.[category.legacyKey] : undefined;\n  if (typeof legacy === 'boolean') return legacy;\n  return Object.prototype.hasOwnProperty.call(DEFAULT_LABEL_CATEGORIES, category.id)\n    ? DEFAULT_LABEL_CATEGORIES[category.id]\n    : fallback;\n}\n\nexport function getLabelCategorySourceBinding(categoryId) {\n  return LABEL_CATEGORY_SOURCE_BINDINGS[categoryId] || null;\n}\n\nfunction readSourceEnabled(settings, binding) {\n  if (!binding) return null;\n  const sourceKey = binding.key || 'enabled';\n  if (typeof settings?.getSection === 'function') {\n    const sectionEnabled = settings.getSection(`scene.${binding.section}.enabled`);\n    if (sectionEnabled === false) return false;\n    const value = settings.getSection(`scene.${binding.section}.${binding.feed ? `feeds.${binding.feed}` : sourceKey}`);\n    return typeof value === 'boolean' ? value : null;\n  }\n  const scene = settings?.scene && typeof settings.scene === 'object'\n    ? settings.scene\n    : settings;\n  const section = scene?.[binding.section];\n  if (section?.enabled === false) return false;\n  const value = binding.feed ? section?.feeds?.[binding.feed] : section?.[sourceKey];\n  return typeof value === 'boolean' ? value : null;\n}\n\n/** Resolve the state shown by any button that owns both labels and a source. */\nexport function getLabelCategoryControlValue(settings, labels, categoryId, fallback = true) {\n  const labelsEnabled = getLabelCategoryValue(labels, categoryId, fallback);\n  if (!labelsEnabled) return false;\n  const binding = getLabelCategorySourceBinding(categoryId);\n  if (!binding || binding.controlSource === false) return true;\n  const sourceEnabled = readSourceEnabled(settings, binding);\n  return sourceEnabled === null ? labelsEnabled : sourceEnabled;\n}\n\n/** Build one scene-relative patch for the rail and expanded Overlay controls. */\nexport function buildLabelCategoryControlPatch(categoryId, enabled) {\n  const next = !!enabled;\n  const patch = {\n    labels: { categories: { [categoryId]: next } },\n  };\n  const binding = getLabelCategorySourceBinding(categoryId);\n  if (!binding || binding.controlSource === false) return patch;\n\n  const sourcePatch = binding.feed\n    ? { ...(next ? { enabled: true } : {}), feeds: { [binding.feed]: next } }\n    : { [binding.key || 'enabled']: next };\n  if (binding.syncShowLabels) sourcePatch.showLabels = next;\n  if (binding.syncLabelKey) sourcePatch[binding.syncLabelKey] = next;\n  if (next && binding.enablePatch) Object.assign(sourcePatch, binding.enablePatch);\n  patch[binding.section] = sourcePatch;\n  return patch;\n}\n\n/** Apply a label preset without leaving source-backed buttons out of sync. */\nexport function buildLabelCategoryPresetPatch(states = {}) {\n  const normalizedStates = Object.fromEntries(\n    Object.entries(states).map(([id, enabled]) => [id, !!enabled]),\n  );\n  const patch = { labels: { categories: normalizedStates } };\n  for (const [categoryId, enabled] of Object.entries(normalizedStates)) {\n    const binding = getLabelCategorySourceBinding(categoryId);\n    if (!binding || binding.controlSource === false) continue;\n    const sourcePatch = binding.feed\n      ? {\n        ...(patch[binding.section] || {}),\n        ...(enabled ? { enabled: true } : {}),\n        feeds: {\n          ...(patch[binding.section]?.feeds || {}),\n          [binding.feed]: enabled,\n        },\n      }\n      : {\n        ...(patch[binding.section] || {}),\n        [binding.key || 'enabled']: enabled,\n      };\n    if (binding.syncShowLabels) sourcePatch.showLabels = enabled;\n    if (binding.syncLabelKey) sourcePatch[binding.syncLabelKey] = enabled;\n    if (enabled && binding.enablePatch) Object.assign(sourcePatch, binding.enablePatch);\n    patch[binding.section] = sourcePatch;\n  }\n  const radioCategories = Object.entries(LABEL_CATEGORY_SOURCE_BINDINGS)\n    .filter(([, binding]) => binding.section === 'radioData' && binding.feed)\n    .map(([categoryId]) => categoryId);\n  if (radioCategories.every((categoryId) => (\n    Object.prototype.hasOwnProperty.call(normalizedStates, categoryId)\n    && normalizedStates[categoryId] === false\n  ))) {\n    patch.radioData = { ...(patch.radioData || {}), enabled: false };\n  }\n  return patch;\n}\n\n/**\n * Normalize any partial scene patch so direct source and direct label writes\n * obey the same contract as the UI helpers. Source enablement wins if a\n * caller supplies contradictory values in one patch.\n */\nexport function synchronizeLabelCategorySourcePatch(scenePatch) {\n  if (!scenePatch || typeof scenePatch !== 'object') return scenePatch;\n  const next = { ...scenePatch };\n  let categories = null;\n\n  for (const [categoryId, binding] of Object.entries(LABEL_CATEGORY_SOURCE_BINDINGS)) {\n    const sectionPatch = scenePatch[binding.section];\n    const sectionDisabled = binding.feed && sectionPatch?.enabled === false;\n    const sourceKey = binding.key || 'enabled';\n    const sourceValue = binding.feed ? sectionPatch?.feeds?.[binding.feed] : sectionPatch?.[sourceKey];\n    const labelValue = scenePatch.labels?.categories?.[categoryId];\n    const sourceTouched = typeof sourceValue === 'boolean' || sectionDisabled;\n    const labelTouched = typeof labelValue === 'boolean';\n    if (!sourceTouched && !labelTouched) continue;\n    if (binding.controlSource === false && !sourceTouched) continue;\n\n    const enabled = sectionDisabled ? false : (sourceTouched ? sourceValue : labelValue);\n    if (!categories) categories = { ...(scenePatch.labels?.categories || {}) };\n    categories[categoryId] = enabled;\n\n    const sourcePatch = { ...(next[binding.section] || sectionPatch || {}) };\n    if (binding.feed) {\n      sourcePatch.feeds = { ...(sourcePatch.feeds || {}), [binding.feed]: enabled };\n      if (enabled) sourcePatch.enabled = true;\n    } else {\n      sourcePatch[sourceKey] = enabled;\n    }\n    if (binding.syncShowLabels) sourcePatch.showLabels = enabled;\n    if (binding.syncLabelKey) sourcePatch[binding.syncLabelKey] = enabled;\n    if (enabled && binding.enablePatch) Object.assign(sourcePatch, binding.enablePatch);\n    next[binding.section] = sourcePatch;\n  }\n\n  if (categories) {\n    next.labels = {\n      ...(scenePatch.labels || {}),\n      categories,\n    };\n  }\n  return next;\n}\n\n/** Return only categories explicitly present in a partial scene patch. */\nexport function getLabelCategoryPatch(labels = {}) {\n  if (!labels || typeof labels !== 'object') return [];\n  const changes = new Map();\n  for (const category of LABEL_CATEGORIES) {\n    const nested = labels.categories?.[category.id];\n    const legacy = category.legacyKey ? labels[category.legacyKey] : undefined;\n    if (typeof nested === 'boolean') changes.set(category.id, nested);\n    else if (typeof legacy === 'boolean') changes.set(category.id, legacy);\n  }\n  return [...changes].map(([id, enabled]) => ({ category: getLabelCategory(id), enabled }));\n}\n\n/** Mutates a stored settings payload before it is merged with new defaults. */\nexport function migrateLegacyLabelSettings(scene) {\n  if (!scene || typeof scene !== 'object') return;\n  if (!scene.labels || typeof scene.labels !== 'object') scene.labels = {};\n  const labels = scene.labels;\n  if (!labels.categories || typeof labels.categories !== 'object') labels.categories = {};\n  for (const category of LABEL_CATEGORIES) {\n    if (typeof labels.categories[category.id] === 'boolean') continue;\n    if (category.legacyKey && typeof labels[category.legacyKey] === 'boolean') {\n      labels.categories[category.id] = labels[category.legacyKey];\n      continue;\n    }\n    if (category.id === 'trafficCameras' && typeof scene.trafficCameras?.showLabels === 'boolean') {\n      labels.categories[category.id] = scene.trafficCameras.showLabels;\n      continue;\n    }\n    if (category.id === 'roadTraffic' && typeof scene.roadTraffic?.showLabels === 'boolean') {\n      labels.categories[category.id] = scene.roadTraffic.showLabels;\n      continue;\n    }\n    if (category.id === 'administrative' && typeof scene.debug?.geoJsonLabels === 'boolean') {\n      labels.categories[category.id] = scene.debug.geoJsonLabels;\n      continue;\n    }\n    if (category.id === 'sensors' && typeof scene.meshtastic?.showLabels === 'boolean') {\n      labels.categories[category.id] = scene.meshtastic.showLabels;\n    }\n  }\n\n  // Source-backed label buttons are now full layer controls. Treat the live\n  // source as canonical when upgrading saved settings created before that\n  // contract, so the rail and expanded Overlay UI agree on first render.\n  for (const [categoryId, binding] of Object.entries(LABEL_CATEGORY_SOURCE_BINDINGS)) {\n    const source = scene[binding.section];\n    if (binding.feed) {\n      if (source?.enabled === false) labels.categories[categoryId] = false;\n      else if (typeof source?.feeds?.[binding.feed] === 'boolean') {\n        labels.categories[categoryId] = source.feeds[binding.feed];\n      }\n      continue;\n    }\n    const sourceKey = binding.key || 'enabled';\n    if (typeof source?.[sourceKey] !== 'boolean') continue;\n    labels.categories[categoryId] = source[sourceKey];\n    if (binding.syncShowLabels && typeof source.showLabels === 'boolean') {\n      source.showLabels = source[sourceKey];\n    }\n    if (binding.syncLabelKey && typeof source[binding.syncLabelKey] === 'boolean') {\n      source[binding.syncLabelKey] = source[sourceKey];\n    }\n  }\n}\n","/**\n * Incident type normalization and emoji mapping.\n */\n\nconst CATEGORY_META = {\n  aid: { label: 'Aid', emoji: '🤝', group: 'other' },\n  aircraft: { label: 'Aircraft', emoji: '✈️', group: 'other' },\n  alarm: { label: 'Alarm', emoji: '🔔', group: 'fire' },\n  assist: { label: 'Assist', emoji: '🧰', group: 'other' },\n  explosion: { label: 'Explosion', emoji: '💥', group: 'fire' },\n  fire: { label: 'Fire', emoji: '🔥', group: 'fire' },\n  hazard: { label: 'Hazard', emoji: '⚠️', group: 'other' },\n  investigation: { label: 'Investigation', emoji: '🔎', group: 'other' },\n  lockout: { label: 'Lockout', emoji: '🔒', group: 'other' },\n  medical: { label: 'Medical', emoji: '🚑', group: 'medical' },\n  natural_disaster: { label: 'Natural Disaster', emoji: '🌪️', group: 'other' },\n  other: { label: 'Other', emoji: '⚠️', group: 'other' },\n  police: { label: 'Police', emoji: '🚓', group: 'other' },\n  rescue: { label: 'Rescue', emoji: '🛟', group: 'other' },\n  vehicle: { label: 'Vehicle', emoji: '🚗', group: 'other' },\n  wires: { label: 'Wires', emoji: '⚡', group: 'other' },\n};\n\nconst CATEGORY_COLORS = {\n  aid: 0x00c853,\n  aircraft: 0x4da3ff,\n  alarm: 0xff4d8d,\n  assist: 0x00bcd4,\n  explosion: 0xff8f00,\n  fire: 0xff3b30,\n  hazard: 0xffd600,\n  investigation: 0x8e6bff,\n  lockout: 0xff8a65,\n  medical: 0x2de2e6,\n  natural_disaster: 0x7cb342,\n  other: 0xffb020,\n  police: 0x5c6bc0,\n  rescue: 0x1de9b6,\n  vehicle: 0xffab00,\n  wires: 0xffea00,\n};\n\nconst INCIDENT_TYPES = {\n  AID: { label: 'Aid', category: 'aid' },\n  AA: { label: 'Auto Aid', category: 'aid' },\n  MU: { label: 'Mutual Aid', category: 'aid' },\n  ST: { label: 'Strike Team/Task Force', category: 'aid' },\n\n  AIRCRAFT: { label: 'Aircraft', category: 'aircraft' },\n  AC: { label: 'Aircraft Crash', category: 'aircraft' },\n  AE: { label: 'Aircraft Emergency', category: 'aircraft' },\n  AES: { label: 'Aircraft Emergency Standby', category: 'aircraft' },\n  LZ: { label: 'Landing Zone', category: 'aircraft' },\n\n  ALARM: { label: 'Alarm', category: 'alarm' },\n  AED: { label: 'AED Alarm', category: 'alarm' },\n  OA: { label: 'Alarm', category: 'alarm' },\n  CMA: { label: 'Carbon Monoxide', category: 'alarm' },\n  FA: { label: 'Fire Alarm', category: 'alarm' },\n  MA: { label: 'Manual Alarm', category: 'alarm' },\n  SD: { label: 'Smoke Detector', category: 'alarm' },\n  TRBL: { label: 'Trouble Alarm', category: 'alarm' },\n  WFA: { label: 'Waterflow Alarm', category: 'alarm' },\n\n  ASSIST: { label: 'Assist', category: 'assist' },\n  FL: { label: 'Flooding', category: 'assist' },\n  LR: { label: 'Ladder Request', category: 'assist' },\n  LA: { label: 'Lift Assist', category: 'assist' },\n  PA: { label: 'Police Assist', category: 'assist' },\n  PS: { label: 'Public Service', category: 'assist' },\n  SH: { label: 'Sheared Hydrant', category: 'assist' },\n\n  EXPLOSION: { label: 'Explosion', category: 'explosion' },\n  EX: { label: 'Explosion', category: 'explosion' },\n  PE: { label: 'Pipeline Emergency', category: 'explosion' },\n  TE: { label: 'Transformer Explosion', category: 'explosion' },\n\n  FIRE: { label: 'Fire', category: 'fire' },\n  AF: { label: 'Appliance Fire', category: 'fire' },\n  CHIM: { label: 'Chimney Fire', category: 'fire' },\n  CF: { label: 'Commercial Fire', category: 'fire' },\n  WSF: { label: 'Confirmed Structure Fire', category: 'fire' },\n  WVEG: { label: 'Confirmed Vegetation Fire', category: 'fire' },\n  CB: { label: 'Controlled Burn/Prescribed Fire', category: 'fire' },\n  ELF: { label: 'Electrical Fire', category: 'fire' },\n  EF: { label: 'Extinguished Fire', category: 'fire' },\n  FULL: { label: 'Full Assignment', category: 'fire' },\n  IF: { label: 'Illegal Fire', category: 'fire' },\n  MF: { label: 'Marine Fire', category: 'fire' },\n  OF: { label: 'Outside Fire', category: 'fire' },\n  PF: { label: 'Pole Fire', category: 'fire' },\n  GF: { label: 'Refuse/Garbage Fire', category: 'fire' },\n  RF: { label: 'Residential Fire', category: 'fire' },\n  SF: { label: 'Structure Fire', category: 'fire' },\n  TF: { label: 'Tank Fire', category: 'fire' },\n  VEG: { label: 'Vegetation Fire', category: 'fire' },\n  VF: { label: 'Vehicle Fire', category: 'fire' },\n  WF: { label: 'Working Fire', category: 'fire' },\n  WCF: { label: 'Working Commercial Fire', category: 'fire' },\n  WRF: { label: 'Working Residential Fire', category: 'fire' },\n\n  HAZARD: { label: 'Hazard', category: 'hazard' },\n  BT: { label: 'Bomb Threat', category: 'hazard' },\n  EE: { label: 'Electrical Emergency', category: 'hazard' },\n  EM: { label: 'Emergency', category: 'hazard' },\n  ER: { label: 'Emergency Response', category: 'hazard' },\n  GAS: { label: 'Gas Leak', category: 'hazard' },\n  HC: { label: 'Hazardous Condition', category: 'hazard' },\n  HMR: { label: 'Hazmat Response', category: 'hazard' },\n  TD: { label: 'Tree Down', category: 'hazard' },\n  WE: { label: 'Water Emergency', category: 'hazard' },\n\n  INVESTIGATION: { label: 'Investigation', category: 'investigation' },\n  AI: { label: 'Arson Investigation', category: 'investigation' },\n  FWI: { label: 'Fireworks Investigation', category: 'investigation' },\n  HMI: { label: 'Hazmat Investigation', category: 'investigation' },\n  INV: { label: 'Investigation', category: 'investigation' },\n  OI: { label: 'Odor Investigation', category: 'investigation' },\n  SI: { label: 'Smoke Investigation', category: 'investigation' },\n\n  LOCKOUT: { label: 'Lockout', category: 'lockout' },\n  CL: { label: 'Commercial Lockout', category: 'lockout' },\n  LO: { label: 'Lockout', category: 'lockout' },\n  RL: { label: 'Residential Lockout', category: 'lockout' },\n  VL: { label: 'Vehicle Lockout', category: 'lockout' },\n\n  MEDICAL: { label: 'Medical', category: 'medical' },\n  CP: { label: 'Community Paramedicine', category: 'medical' },\n  CPR: { label: 'CPR Needed', category: 'medical' },\n  IFT: { label: 'Interfacility Transfer', category: 'medical' },\n  ME: { label: 'Medical Emergency', category: 'medical' },\n  MCI: { label: 'Multi Casualty', category: 'medical' },\n\n  'NATURAL DISASTER': { label: 'Natural Disaster', category: 'natural_disaster' },\n  EQ: { label: 'Earthquake', category: 'natural_disaster' },\n  FLW: { label: 'Flood Warning', category: 'natural_disaster' },\n  TOW: { label: 'Tornado Warning', category: 'natural_disaster' },\n  TSW: { label: 'Tsunami Warning', category: 'natural_disaster' },\n  WX: { label: 'Weather Incident', category: 'natural_disaster' },\n\n  OTHER: { label: 'Other', category: 'other' },\n  BP: { label: 'Burn Permit', category: 'other' },\n  CA: { label: 'Community Activity', category: 'other' },\n  FW: { label: 'Fire Watch', category: 'other' },\n  MC: { label: 'Move-up/Cover', category: 'other' },\n  NO: { label: 'Notification', category: 'other' },\n  STBY: { label: 'Standby', category: 'other' },\n  TEST: { label: 'Test', category: 'other' },\n  TRNG: { label: 'Training', category: 'other' },\n\n  RESCUE: { label: 'Rescue', category: 'rescue' },\n  AR: { label: 'Animal Rescue', category: 'rescue' },\n  CR: { label: 'Cliff Rescue', category: 'rescue' },\n  CSR: { label: 'Confined Space Rescue', category: 'rescue' },\n  ELR: { label: 'Elevator Rescue', category: 'rescue' },\n  EER: { label: 'Elevator/Escalator Rescue', category: 'rescue' },\n  IR: { label: 'Ice Rescue', category: 'rescue' },\n  IA: { label: 'Industrial Accident', category: 'rescue' },\n  RES: { label: 'Rescue', category: 'rescue' },\n  RR: { label: 'Rope Rescue', category: 'rescue' },\n  SC: { label: 'Structural Collapse', category: 'rescue' },\n  TR: { label: 'Technical Rescue', category: 'rescue' },\n  TNR: { label: 'Trench Rescue', category: 'rescue' },\n  USAR: { label: 'Urban Search and Rescue', category: 'rescue' },\n  VS: { label: 'Vessel Sinking', category: 'rescue' },\n  WR: { label: 'Water Rescue', category: 'rescue' },\n\n  VEHICLE: { label: 'Vehicle', category: 'vehicle' },\n  TCP: { label: 'Collision Involving Pedestrian', category: 'vehicle' },\n  TCS: { label: 'Collision Involving Structure', category: 'vehicle' },\n  TCT: { label: 'Collision Involving Train', category: 'vehicle' },\n  TCE: { label: 'Expanded Traffic Collision', category: 'vehicle' },\n  RTE: { label: 'Railroad/Train Emergency', category: 'vehicle' },\n  TC: { label: 'Traffic Collision', category: 'vehicle' },\n\n  WIRES: { label: 'Wires', category: 'wires' },\n  PLE: { label: 'Powerline Emergency', category: 'wires' },\n  WA: { label: 'Wires Arcing', category: 'wires' },\n  WD: { label: 'Wires Down', category: 'wires' },\n  WDA: { label: 'Wires Down/Arcing', category: 'wires' },\n};\n\nconst INCIDENT_EMOJI = {\n  AID: '🤝',\n  AA: '🤝',\n  MU: '🫱🏽‍🫲🏼',\n  ST: '👥',\n\n  AIRCRAFT: '✈️',\n  AC: '✈️💥',\n  AE: '✈️🚨',\n  AES: '✈️⏳',\n  LZ: '🎯',\n\n  ALARM: '🔔',\n  AED: '🫀',\n  OA: '🔔',\n  CMA: '☠️',\n  FA: '🚨',\n  MA: '🖐️',\n  SD: '🚬',\n  TRBL: '⚠️',\n  WFA: '💧',\n\n  ASSIST: '🧰',\n  FL: '🌊',\n  LR: '🪜',\n  LA: '🏋️',\n  PA: '👮',\n  PS: '🛠️',\n  SH: '🚰',\n\n  EXPLOSION: '💥',\n  EX: '💥',\n  PE: '🛢️',\n  TE: '⚡',\n\n  FIRE: '🔥',\n  AF: '🍳🔥',\n  CHIM: '🏠🔥',\n  CF: '🏢🔥',\n  WSF: '✅🏠🔥',\n  WVEG: '✅🌲🔥',\n  CB: '🔥🧯',\n  ELF: '⚡🔥',\n  EF: '✅🧯',\n  FULL: '📣',\n  IF: '🚫🔥',\n  MF: '🚤🔥',\n  OF: '🌳🔥',\n  PF: '🪵🔥',\n  GF: '🗑️🔥',\n  RF: '🏠🔥',\n  SF: '🏗️🔥',\n  TF: '🛢️🔥',\n  VEG: '🌲🔥',\n  VF: '🚗🔥',\n  WF: '🚒🔥',\n  WCF: '🚒🏢🔥',\n  WRF: '🚒🏠🔥',\n\n  HAZARD: '⚠️',\n  BT: '💣',\n  EE: '⚡🚨',\n  EM: '🚨',\n  ER: '🚒',\n  GAS: '⛽',\n  HC: '⚠️',\n  HMR: '☣️',\n  TD: '🌳⬇️',\n  WE: '💧🚨',\n\n  INVESTIGATION: '🔎',\n  AI: '🔎🔥',\n  FWI: '🔎🎆',\n  HMI: '🔎☣️',\n  INV: '🔎',\n  OI: '👃',\n  SI: '🔎💨',\n\n  LOCKOUT: '🔒',\n  CL: '🏢🔒',\n  LO: '🔒',\n  RL: '🏠🔒',\n  VL: '🚗🔒',\n\n  MEDICAL: '🚑',\n  CP: '🏥',\n  CPR: '🫀🚑',\n  IFT: '🚑',\n  ME: '🩺',\n  MCI: '🧑‍🤝‍🧑🩸',\n\n  'NATURAL DISASTER': '🌪️',\n  EQ: '🌎',\n  FLW: '⚠️🌊',\n  TOW: '🌪️',\n  TSW: '🌊⚠️',\n  WX: '🌦️',\n\n  OTHER: '⚠️',\n  BP: '📝🔥',\n  CA: '🎪',\n  FW: '👀🔥',\n  MC: '🔁',\n  NO: '📢',\n  STBY: '⏳',\n  TEST: '🧪',\n  TRNG: '🎓',\n\n  RESCUE: '🛟',\n  AR: '🐾',\n  CR: '🧗',\n  CSR: '🕳️',\n  ELR: '🛗',\n  EER: '🛗',\n  IR: '🧊',\n  IA: '🏭',\n  RES: '🛟',\n  RR: '🪢',\n  SC: '🏚️',\n  TR: '🧰',\n  TNR: '🕳️',\n  USAR: '🏙️',\n  VS: '🚢⬇️',\n  WR: '🌊🛟',\n\n  VEHICLE: '🚗',\n  TCP: '🚗🚶',\n  TCS: '🚗🏠',\n  TCT: '🚗🚆',\n  TCE: '🚧',\n  RTE: '🚆🚨',\n  TC: '🚗💥',\n\n  WIRES: '⚡',\n  PLE: '🔌⚡',\n  WA: '⚡✨',\n  WD: '⚡⬇️',\n  WDA: '⚡⬇️✨',\n};\n\nconst normalizeKey = (value) => String(value).toUpperCase().replace(/[^A-Z0-9]/g, '');\n\nconst LABEL_TO_CODE = {};\nObject.entries(INCIDENT_TYPES).forEach(([code, meta]) => {\n  const key = normalizeKey(meta.label);\n  if (key && !LABEL_TO_CODE[key]) {\n    LABEL_TO_CODE[key] = code;\n  }\n});\n\nconst resolveIncidentCategoryFallback = (upper) => {\n  if (!upper) return 'other';\n  if (\n    upper.includes('FIRE')\n    || upper.includes('SMOKE')\n    || upper.includes('BRUSH')\n    || upper.includes('VEG')\n    || upper.includes('WILD')\n    || upper.startsWith('FS')\n  ) {\n    return 'fire';\n  }\n  if (upper.includes('ALARM')) return 'alarm';\n  if (\n    upper.includes('MED')\n    || upper.includes('EMS')\n    || upper.includes('CPR')\n    || upper.includes('MEDICAL')\n    || upper.includes('AMB')\n  ) {\n    return 'medical';\n  }\n  if (\n    upper.includes('RESCUE')\n    || upper.includes('RESC')\n    || upper.includes('SAR')\n    || upper.includes('SEARCH')\n  ) {\n    return 'rescue';\n  }\n  if (\n    upper.includes('TRAFFIC')\n    || upper.includes('MVC')\n    || upper.includes('MVA')\n    || upper.includes('ACCIDENT')\n    || upper.includes('COLLISION')\n  ) {\n    return 'vehicle';\n  }\n  if (\n    upper.includes('HAZ')\n    || upper.includes('HAZMAT')\n    || upper.includes('CHEM')\n    || upper.includes('SPILL')\n  ) {\n    return 'hazard';\n  }\n  if (\n    upper.includes('POLICE')\n    || upper.includes('SHERIFF')\n    || upper.startsWith('PD')\n    || upper.includes('LAW')\n  ) {\n    return 'police';\n  }\n  if (upper.includes('AIRCRAFT') || upper.includes('PLANE') || upper.includes('HELI')) return 'aircraft';\n  if (upper.includes('LOCKOUT')) return 'lockout';\n  if (upper.includes('INVEST')) return 'investigation';\n  if (\n    upper.includes('TORNADO')\n    || upper.includes('TSUNAMI')\n    || upper.includes('EARTHQUAKE')\n    || upper.includes('FLOOD')\n    || upper.includes('WEATHER')\n  ) {\n    return 'natural_disaster';\n  }\n  if (upper.includes('WIRE') || upper.includes('POWERLINE')) return 'wires';\n  if (upper.includes('AID')) return 'aid';\n  if (upper.includes('ASSIST')) return 'assist';\n  return 'other';\n};\n\nconst buildInfo = (code, raw) => {\n  const type = INCIDENT_TYPES[code];\n  const meta = CATEGORY_META[type?.category] || CATEGORY_META.other;\n  const emoji = INCIDENT_EMOJI[code] || type?.emoji || meta.emoji;\n  return {\n    raw,\n    code,\n    label: type?.label || raw,\n    category: type?.category || 'other',\n    group: meta.group,\n    emoji,\n  };\n};\n\nexport function resolveIncidentTypeInfo(callType) {\n  const raw = typeof callType === 'string' ? callType.trim() : '';\n  if (!raw) {\n    const meta = CATEGORY_META.other;\n    return {\n      raw: '',\n      code: null,\n      label: '',\n      category: 'other',\n      group: meta.group,\n      emoji: meta.emoji,\n    };\n  }\n\n  const upper = raw.toUpperCase();\n  if (INCIDENT_TYPES[upper]) return buildInfo(upper, raw);\n\n  const tokens = upper.split(/[^A-Z0-9]+/).filter(Boolean);\n  for (const token of tokens) {\n    if (INCIDENT_TYPES[token]) return buildInfo(token, raw);\n  }\n\n  const labelKey = normalizeKey(raw);\n  const code = LABEL_TO_CODE[labelKey];\n  if (code && INCIDENT_TYPES[code]) return buildInfo(code, raw);\n\n  const category = resolveIncidentCategoryFallback(upper);\n  const meta = CATEGORY_META[category] || CATEGORY_META.other;\n  return {\n    raw,\n    code: null,\n    label: raw,\n    category,\n    group: meta.group,\n    emoji: meta.emoji,\n  };\n}\n\nconst NON_ACTIVE_FIRE_CODES = new Set([\n  'EF', // Extinguished fire\n  'FULL', // Dispatch assignment, not itself a confirmed fire\n]);\n\nconst VEGETATION_FIRE_CODES = new Set([\n  'WVEG',\n  'VEG',\n  'OF',\n  'CB',\n]);\n\n/** Only calls that describe an active fire receive physical flame geometry. */\nexport function isActiveFireIncident(callType) {\n  const info = resolveIncidentTypeInfo(callType);\n  return info.category === 'fire'\n    && !NON_ACTIVE_FIRE_CODES.has(info.code);\n}\n\n/**\n * Vegetation and outside-fire calls use a wider multi-tongue field. The raw\n * text fallback covers agency-specific codes without reclassifying alarms or\n * investigations as an observed fire.\n */\nexport function isVegetationFireIncident(callType) {\n  const info = resolveIncidentTypeInfo(callType);\n  if (!isActiveFireIncident(callType)) return false;\n  if (VEGETATION_FIRE_CODES.has(info.code)) return true;\n  return /\\b(?:BRUSH|FOREST|GRASS|VEGETATION|VEG|WILD(?:LAND|FIRE)?|OUTSIDE)\\b/i\n    .test(info.raw || '');\n}\n\nexport function formatIncidentTypeLabel(callType, { includeCode = true, fallback = 'Incident' } = {}) {\n  const info = resolveIncidentTypeInfo(callType);\n  const label = info.label || '';\n  if (!label) return fallback;\n  if (includeCode && info.code) {\n    const normalizedLabel = normalizeKey(label);\n    const normalizedCode = normalizeKey(info.code);\n    if (normalizedCode && normalizedCode !== normalizedLabel) {\n      return `${label} (${info.code})`;\n    }\n  }\n  return label;\n}\n\nexport function resolveIncidentEmoji(callType) {\n  return resolveIncidentTypeInfo(callType).emoji || CATEGORY_META.other.emoji;\n}\n\nexport function resolveIncidentGroup(callType) {\n  return resolveIncidentTypeInfo(callType).group || CATEGORY_META.other.group;\n}\n\nexport function resolveIncidentColor(callType) {\n  const info = resolveIncidentTypeInfo(callType);\n  return CATEGORY_COLORS[info.category] ?? CATEGORY_COLORS.other;\n}\n\nexport function resolveIncidentColorHex(callType) {\n  const color = resolveIncidentColor(callType);\n  return `#${color.toString(16).padStart(6, '0')}`;\n}\n","const LIVE_WINDOW_SECONDS = 60 * 60;\nconst EARTH_MEAN_RADIUS_METERS = 6_371_008.8;\n\nexport function normalizeMeshtasticNodeId(value) {\n  if (typeof value === 'number' && Number.isFinite(value)) {\n    return `!${(value >>> 0).toString(16).padStart(8, '0')}`;\n  }\n  const text = String(value ?? '').trim().toLowerCase();\n  if (!text || text === 'broadcast') return text;\n  if (/^![0-9a-f]+$/.test(text)) {\n    return `!${text.slice(1).padStart(8, '0')}`;\n  }\n  if (/^0x[0-9a-f]+$/.test(text)) {\n    return `!${text.slice(2).padStart(8, '0')}`;\n  }\n  if (/^\\d+$/.test(text)) {\n    const number = Number(text);\n    if (Number.isSafeInteger(number) && number >= 0) {\n      return `!${(number >>> 0).toString(16).padStart(8, '0')}`;\n    }\n  }\n  return text;\n}\n\nexport function meshtasticNodeIdsEqual(a, b) {\n  const left = normalizeMeshtasticNodeId(a);\n  const right = normalizeMeshtasticNodeId(b);\n  return !!left && left === right;\n}\n\nexport function meshtasticNodeIdFromLabelHover(detail) {\n  const metadata = detail?.metadata;\n  if (!metadata || metadata.source !== 'Meshtastic') return null;\n  return metadata.meshtasticNodeId || metadata.id || null;\n}\n\nexport function syncMeshtasticNodeListHover(listElement, nodeId, { scroll = true } = {}) {\n  if (!listElement?.querySelectorAll) return null;\n  let activeRow = null;\n  for (const row of listElement.querySelectorAll('[data-meshtastic-node-id]')) {\n    const active = meshtasticNodeIdsEqual(row.dataset?.meshtasticNodeId, nodeId);\n    row.classList?.toggle?.('is-meshtastic-node-hovered', active);\n    row.setAttribute?.('aria-selected', active ? 'true' : 'false');\n    if (active) activeRow = row;\n  }\n  if (activeRow && scroll) {\n    activeRow.scrollIntoView?.({ block: 'nearest', inline: 'nearest', behavior: 'smooth' });\n  }\n  return activeRow;\n}\n\nexport function bindMeshtasticNodeRowHover(row, nodeId, eventBus, listElement = row?.parentElement) {\n  if (!row || !nodeId) return;\n  row.classList?.add?.('meshtastic-node-row');\n  row.dataset.meshtasticNodeId = String(nodeId);\n  row.setAttribute?.('role', 'option');\n  row.setAttribute?.('aria-selected', 'false');\n  row.addEventListener?.('pointerenter', () => {\n    syncMeshtasticNodeListHover(listElement, nodeId, { scroll: false });\n    eventBus?.emit?.('meshtastic:node-hover', { nodeId, source: 'list' });\n  });\n  row.addEventListener?.('pointerleave', () => {\n    syncMeshtasticNodeListHover(listElement, null, { scroll: false });\n    eventBus?.emit?.('meshtastic:node-hover', { nodeId: null, source: 'list' });\n  });\n  row.addEventListener?.('focusin', () => {\n    syncMeshtasticNodeListHover(listElement, nodeId, { scroll: false });\n    eventBus?.emit?.('meshtastic:node-hover', { nodeId, source: 'list' });\n  });\n  row.addEventListener?.('focusout', (event) => {\n    if (row.contains?.(event.relatedTarget)) return;\n    syncMeshtasticNodeListHover(listElement, null, { scroll: false });\n    eventBus?.emit?.('meshtastic:node-hover', { nodeId: null, source: 'list' });\n  });\n}\n\nexport function hasMeshtasticPosition(node) {\n  return Number.isFinite(node?.lat) && Number.isFinite(node?.lon);\n}\n\nexport function meshtasticNodeDistanceMeters(node, origin) {\n  if (!hasMeshtasticPosition(node)\n    || !Number.isFinite(origin?.lat)\n    || !Number.isFinite(origin?.lon)) {\n    return null;\n  }\n  const toRadians = Math.PI / 180;\n  const nodeLat = node.lat * toRadians;\n  const originLat = origin.lat * toRadians;\n  const dLat = nodeLat - originLat;\n  const dLon = (node.lon - origin.lon) * toRadians;\n  const a = Math.sin(dLat / 2) ** 2\n    + Math.cos(originLat) * Math.cos(nodeLat) * Math.sin(dLon / 2) ** 2;\n  const arc = 2 * Math.atan2(Math.sqrt(Math.min(1, a)), Math.sqrt(Math.max(0, 1 - a)));\n  return EARTH_MEAN_RADIUS_METERS * arc;\n}\n\nexport function formatMeshtasticNodeDistance(node, origin) {\n  const distanceMeters = meshtasticNodeDistanceMeters(node, origin);\n  if (!Number.isFinite(distanceMeters)) return '';\n  if (distanceMeters < 1000) return `${Math.round(distanceMeters)} m away`;\n  const distanceKm = distanceMeters / 1000;\n  return `${distanceKm < 10 ? distanceKm.toFixed(1) : Math.round(distanceKm)} km away`;\n}\n\nexport function isMeshtasticNodeLive(node, nowSeconds = Date.now() / 1000) {\n  return Number.isFinite(node?.lastHeard)\n    && node.lastHeard > 0\n    && nowSeconds - node.lastHeard <= LIVE_WINDOW_SECONDS;\n}\n\nexport function formatMeshtasticNodeAge(node, nowSeconds = Date.now() / 1000) {\n  if (!Number.isFinite(node?.lastHeard) || node.lastHeard <= 0) return 'Last heard unknown';\n  const ageSeconds = Math.max(0, Math.floor(nowSeconds - node.lastHeard));\n  if (ageSeconds < 60) return `${ageSeconds}s ago`;\n  if (ageSeconds < 3600) return `${Math.floor(ageSeconds / 60)}m ago`;\n  if (ageSeconds < 86400) return `${Math.floor(ageSeconds / 3600)}h ago`;\n  return `${Math.floor(ageSeconds / 86400)}d ago`;\n}\n\nexport function filterMeshtasticNodes(\n  nodes,\n  mode = 'all',\n  nowSeconds = Date.now() / 1000,\n  {\n    origin = null,\n    maxDistanceMeters = null,\n    maxAgeSeconds = null,\n    maxHops = null,\n    sortBy = 'closest',\n    searchQuery = '',\n  } = {},\n) {\n  const list = Array.isArray(nodes) ? nodes.filter(Boolean) : [];\n  const hasDistanceLimit = Number.isFinite(maxDistanceMeters) && maxDistanceMeters > 0;\n  const hasAgeLimit = Number.isFinite(maxAgeSeconds) && maxAgeSeconds > 0;\n  const hasHopLimit = Number.isFinite(maxHops) && maxHops >= 0;\n  const searchTerms = String(searchQuery || '')\n    .trim()\n    .toLocaleLowerCase()\n    .split(/\\s+/)\n    .filter(Boolean);\n  const matchesSearch = (node) => {\n    if (!searchTerms.length) return true;\n    const searchableText = [\n      node?.user,\n      node?.shortName,\n      node?.id,\n      node?.num,\n      node?.hardware,\n      node?.role,\n      Number.isFinite(node?.lat) ? node.lat : null,\n      Number.isFinite(node?.lon) ? node.lon : null,\n    ]\n      .filter((value) => value != null && value !== '')\n      .join(' ')\n      .toLocaleLowerCase();\n    return searchTerms.every((term) => searchableText.includes(term));\n  };\n  const nameOf = (node) => String(node?.user || node?.shortName || node?.id || '');\n  const newestFirst = (a, b) => (Number(b?.lastHeard) || 0) - (Number(a?.lastHeard) || 0);\n  const nullsLast = (left, right, direction = 1) => {\n    const leftValid = Number.isFinite(left);\n    const rightValid = Number.isFinite(right);\n    if (leftValid !== rightValid) return leftValid ? -1 : 1;\n    if (!leftValid) return 0;\n    return (left - right) * direction;\n  };\n  const compareNodes = (a, b) => {\n    let primary = 0;\n    switch (sortBy) {\n      case 'signal':\n        primary = nullsLast(a?.snr, b?.snr, -1);\n        break;\n      case 'recent':\n        primary = nullsLast(a?.lastHeard, b?.lastHeard, -1);\n        break;\n      case 'hops':\n        primary = nullsLast(a?.hopsAway, b?.hopsAway, 1);\n        break;\n      case 'battery':\n        primary = nullsLast(a?.batteryLevel, b?.batteryLevel, -1);\n        break;\n      case 'name':\n        primary = nameOf(a).localeCompare(nameOf(b));\n        break;\n      case 'closest':\n      default:\n        primary = nullsLast(\n          meshtasticNodeDistanceMeters(a, origin),\n          meshtasticNodeDistanceMeters(b, origin),\n          1,\n        );\n        break;\n    }\n    return primary\n      || newestFirst(a, b)\n      || nameOf(a).localeCompare(nameOf(b))\n      || String(a?.id || '').localeCompare(String(b?.id || ''));\n  };\n  return list\n    .filter((node) => {\n      if (mode === 'live') return isMeshtasticNodeLive(node, nowSeconds);\n      if (mode === 'positioned') return hasMeshtasticPosition(node);\n      return true;\n    })\n    .filter((node) => {\n      if (!matchesSearch(node)) return false;\n      if (hasAgeLimit) {\n        if (!Number.isFinite(node?.lastHeard) || node.lastHeard <= 0) return false;\n        if (Math.max(0, nowSeconds - node.lastHeard) > maxAgeSeconds) return false;\n      }\n      if (hasDistanceLimit) {\n        const distanceMeters = meshtasticNodeDistanceMeters(node, origin);\n        if (!Number.isFinite(distanceMeters) || distanceMeters > maxDistanceMeters) return false;\n      }\n      if (hasHopLimit) {\n        if (!Number.isFinite(node?.hopsAway) || node.hopsAway > maxHops) return false;\n      }\n      return true;\n    })\n    .sort(compareNodes);\n}\n\nexport function meshtasticNodeTitle(node) {\n  return String(node?.user || node?.shortName || node?.id || 'Unknown node');\n}\n\nexport function meshtasticNodeSummary(node, nowSeconds = Date.now() / 1000, origin = null) {\n  const parts = [];\n  const distance = formatMeshtasticNodeDistance(node, origin);\n  if (distance) parts.push(distance);\n  if (hasMeshtasticPosition(node)) parts.push(`${node.lat.toFixed(4)}, ${node.lon.toFixed(4)}`);\n  else parts.push('No GPS');\n  if (Number.isFinite(node?.snr)) parts.push(`SNR ${node.snr.toFixed(1)} dB`);\n  if (Number.isFinite(node?.hopsAway)) parts.push(`${node.hopsAway} hop${node.hopsAway === 1 ? '' : 's'}`);\n  if (Number.isFinite(node?.batteryLevel)) parts.push(`${Math.round(node.batteryLevel)}%`);\n  parts.push(formatMeshtasticNodeAge(node, nowSeconds));\n  return parts.join(' · ');\n}\n","/** Read decoded response bytes, cancelling before an oversized body is buffered. */\nexport async function readBoundedBytes(response, { maxBytes, signal, reserve = () => {} } = {}) {\n    if (!Number.isSafeInteger(maxBytes) || maxBytes < 1) throw new RangeError('Invalid response byte limit');\n    if (signal?.aborted) {\n        await response.body?.cancel().catch(() => {});\n        signal.throwIfAborted();\n    }\n    const declared = Number(response.headers?.get?.('content-length'));\n    if (Number.isFinite(declared) && declared > maxBytes) {\n        await response.body?.cancel().catch(() => {});\n        throw new RangeError(`JSON resource exceeds ${maxBytes} decoded bytes`);\n    }\n    if (!response.body) return new Uint8Array();\n    const reader = response.body.getReader(), chunks = [];\n    let bytes = 0;\n    const abort = () => { reader.cancel(signal.reason).catch(() => {}); };\n    signal?.addEventListener('abort', abort, { once: true });\n    try {\n        for (;;) {\n            signal?.throwIfAborted();\n            const { value, done } = await reader.read();\n            signal?.throwIfAborted();\n            if (done) break;\n            if (bytes + value.byteLength > maxBytes) throw new RangeError(`JSON resource exceeds ${maxBytes} decoded bytes`);\n            reserve(value.byteLength);\n            chunks.push(value); bytes += value.byteLength;\n        }\n        const result = new Uint8Array(bytes);\n        let offset = 0;\n        for (const chunk of chunks) { result.set(chunk, offset); offset += chunk.byteLength; }\n        return result;\n    } catch (error) {\n        await reader.cancel(error).catch(() => {});\n        throw error;\n    } finally {\n        chunks.length = 0;\n        signal?.removeEventListener('abort', abort);\n        reader.releaseLock();\n    }\n}\n","/**\n * Canonical display-signal contract for the styled NASA VIIRS Black Marble\n * PNG pyramid. The source includes blue/purple relief that is not emitted\n * light, so raw max-channel brightness is not a valid radiance classifier.\n */\nexport const NIGHT_LIGHTS_EMISSION_DEFAULTS = Object.freeze({\n  intensity: 1.8,\n  mapGain: 0.025,\n  // Admit the dim shoulders surrounding a city core, then ease them into the\n  // hotspot instead of stepping abruptly from black to emitted light.\n  emissionThreshold: 0.04,\n  emissionSoftness: 0.12,\n  emissionPower: 0.82,\n  emissionBlueSuppression: 1.5,\n  // A z8 source texel spans far more ground than a street-level fragment.\n  // Keep it as a dim regional energy envelope at the surface, then recover\n  // the authored source-pixel radiance progressively toward orbit.\n  surfaceIntensityScale: 0.02,\n  // Local provider imagery supplies nearly all street-level colour/structure;\n  // the source/light tint remains only a small provenance cue.\n  surfaceProviderColorMix: 0.9,\n});\n\n// Contract v2 values are retained solely so persisted resolved defaults can\n// inherit the wider halo response without disturbing authored curves.\nexport const V2_NIGHT_LIGHTS_EMISSION_DEFAULTS = Object.freeze({\n  intensity: 1.8,\n  mapGain: 0.025,\n  emissionThreshold: 0.07,\n  emissionSoftness: 0.07,\n  emissionPower: 0.82,\n  emissionBlueSuppression: 1.5,\n  surfaceIntensityScale: 0.02,\n});\n\n// Contract v1 values are retained solely so returning browsers that persisted\n// the former resolved defaults can be migrated without overwriting a custom\n// response curve.\nexport const PREVIOUS_NIGHT_LIGHTS_EMISSION_DEFAULTS = Object.freeze({\n  intensity: 5,\n  mapGain: 0.05,\n  emissionThreshold: 0.085,\n  emissionSoftness: 0.055,\n  emissionPower: 0.55,\n  emissionBlueSuppression: 0.8,\n});\n\nexport const LEGACY_NIGHT_LIGHTS_EMISSION_DEFAULTS = Object.freeze({\n  intensity: 6,\n  emissionThreshold: 0.18,\n  emissionSoftness: 0.08,\n  emissionPower: 0.65,\n});\n\nexport function resolveNightLightsSourceSignal(\n  sourceRgb,\n  blueSuppression = NIGHT_LIGHTS_EMISSION_DEFAULTS.emissionBlueSuppression,\n) {\n  const r = Math.max(0, Number(sourceRgb?.r) || 0);\n  const g = Math.max(0, Number(sourceRgb?.g) || 0);\n  const b = Math.max(0, Number(sourceRgb?.b) || 0);\n  const warmSignal = Math.max(r, g);\n  const blueExcess = Math.max(b - warmSignal, 0);\n  const suppression = Math.min(1.5, Math.max(0, Number(blueSuppression) || 0));\n  const peak = Math.max(r, g, b, 1e-4);\n  const blueDominance = blueExcess / peak;\n  const coolBackgroundRejection = 1 - smoothstep(0.12, 0.32, blueDominance);\n  return Math.max(warmSignal - blueExcess * suppression, 0)\n    * coolBackgroundRejection;\n}\n\nfunction smoothstep(edge0, edge1, value) {\n  const t = Math.min(1, Math.max(0, (value - edge0) / (edge1 - edge0)));\n  return t * t * (3 - 2 * t);\n}\n\n/**\n * Resolve the street-level colour/structure carrier. The NASA field controls\n * whether and how much a region emits; it does not replace every real surface\n * fragment below one coarse source texel with a flat monochrome colour.\n */\nexport function resolveNightLightsSurfaceCarrier(\n  providerRgb,\n  sourceRgb,\n  lightRgb = { r: 1, g: 1, b: 1 },\n  providerColorMix = NIGHT_LIGHTS_EMISSION_DEFAULTS.surfaceProviderColorMix,\n) {\n  const provider = {\n    r: Math.max(0, Number(providerRgb?.r) || 0),\n    g: Math.max(0, Number(providerRgb?.g) || 0),\n    b: Math.max(0, Number(providerRgb?.b) || 0),\n  };\n  const source = {\n    r: Math.max(0, Number(sourceRgb?.r) || 0),\n    g: Math.max(0, Number(sourceRgb?.g) || 0),\n    b: Math.max(0, Number(sourceRgb?.b) || 0),\n  };\n  const tint = {\n    r: Math.max(0, Number(lightRgb?.r) || 0),\n    g: Math.max(0, Number(lightRgb?.g) || 0),\n    b: Math.max(0, Number(lightRgb?.b) || 0),\n  };\n  const providerLuminance = provider.r * 0.2126\n    + provider.g * 0.7152\n    + provider.b * 0.0722;\n  const providerPeak = Math.max(provider.r, provider.g, provider.b, 0.08);\n  const sourcePeak = Math.max(source.r, source.g, source.b, 1e-4);\n  const structure = smoothstep(0.025, 0.65, providerLuminance);\n  const mixAmount = Math.min(1, Math.max(0, Number(providerColorMix) || 0));\n  const providerChroma = {\n    r: provider.r / providerPeak,\n    g: provider.g / providerPeak,\n    b: provider.b / providerPeak,\n  };\n  const sourceTint = {\n    r: source.r / sourcePeak * tint.r,\n    g: source.g / sourcePeak * tint.g,\n    b: source.b / sourcePeak * tint.b,\n  };\n  return {\n    r: (sourceTint.r * (1 - mixAmount) + providerChroma.r * mixAmount) * structure,\n    g: (sourceTint.g * (1 - mixAmount) + providerChroma.g * mixAmount) * structure,\n    b: (sourceTint.b * (1 - mixAmount) + providerChroma.b * mixAmount) * structure,\n  };\n}\n\n// Pure helper shared verbatim by the TriTree, overview, legacy photoreal, and\n// deferred photoreal shaders. Each owner supplies its own uniform value.\nexport const NIGHT_LIGHTS_SOURCE_SIGNAL_GLSL = /* glsl */`\nfloat resolveNightLightsSourceSignal(\n  vec3 sourceRgb,\n  float blueSuppression\n) {\n  float warmSignal = max(sourceRgb.r, sourceRgb.g);\n  float blueExcess = max(sourceRgb.b - warmSignal, 0.0);\n  float sourcePeak = max(max(sourceRgb.r, sourceRgb.g), max(sourceRgb.b, 1e-4));\n  float blueDominance = blueExcess / sourcePeak;\n  float coolBackgroundRejection = 1.0 - smoothstep(0.12, 0.32, blueDominance);\n  return max(\n    warmSignal - blueExcess * clamp(blueSuppression, 0.0, 1.5),\n    0.0\n  ) * coolBackgroundRejection;\n}\n`;\n\n// Shared by every real surface owner. Provider albedo is sampled before night\n// attenuation, preserving local streets/buildings and their colour instead of\n// projecting a flat source-map texel onto all underlying fragments.\nexport const NIGHT_LIGHTS_SURFACE_CARRIER_GLSL = /* glsl */`\nvec3 resolveNightLightsSurfaceCarrier(\n  vec3 providerAlbedo,\n  vec3 sourceChroma,\n  vec3 sourceColor,\n  float providerColorMix\n) {\n  vec3 safeProvider = max(providerAlbedo, vec3(0.0));\n  float providerLuminance = dot(\n    safeProvider,\n    vec3(0.2126, 0.7152, 0.0722)\n  );\n  float providerPeak = max(\n    max(safeProvider.r, safeProvider.g),\n    max(safeProvider.b, 0.08)\n  );\n  vec3 providerChroma = safeProvider / providerPeak;\n  float localStructure = smoothstep(0.025, 0.65, providerLuminance);\n  vec3 sourceTint = sourceChroma * sourceColor;\n  return mix(\n    sourceTint,\n    providerChroma,\n    clamp(providerColorMix, 0.0, 1.0)\n  ) * localStructure;\n}\n`;\n","/**\n * Shared perceptual defaults for scene-owned postprocessing.\n *\n * Keep the physical render contract separate from presentation effects:\n * AgX exposure remains owned by the final-frame path. Orbital metering models\n * the enormous luminance change between deep space, sunlit Earth, and the\n * finite solar disc; the astronomical flare supplies the optical veil that a\n * post-tone-map Sun requires without bypassing physical occlusion.\n */\n\nexport const POSTPROCESS_BLOOM_DEFAULTS = Object.freeze({\n  intensity: 0.22,\n  radius: 0.35,\n  threshold: 0.9,\n  smoothing: 0.08,\n  levels: 5,\n  mipmapBlur: true,\n});\n\nexport const POSTPROCESS_BLOOM_EFFECT_DEFAULTS = Object.freeze({\n  intensity: POSTPROCESS_BLOOM_DEFAULTS.intensity,\n  radius: POSTPROCESS_BLOOM_DEFAULTS.radius,\n  luminanceThreshold: POSTPROCESS_BLOOM_DEFAULTS.threshold,\n  luminanceSmoothing: POSTPROCESS_BLOOM_DEFAULTS.smoothing,\n  levels: POSTPROCESS_BLOOM_DEFAULTS.levels,\n  mipmapBlur: POSTPROCESS_BLOOM_DEFAULTS.mipmapBlur,\n});\n\nexport const LIGHT_POLLUTION_BLOOM_DEFAULTS = Object.freeze({\n  // The light map is an irradiance locator, not a screen-space picture.\n  // Keep the independent projected-map bloom off so orbit shows provider\n  // photoreal albedo with derived illumination instead of coarse blotches.\n  enabled: false,\n  intensity: 0.32,\n  radiusPixels: 4.5,\n  threshold: 0.012,\n  orbitFadeStartMeters: 80_000,\n  orbitFadeEndMeters: 180_000,\n});\n\nexport const ASTRONOMICAL_LENS_FLARE_DEFAULTS = Object.freeze({\n  opacity: 0.74,\n  colorGain: Object.freeze([8, 7.6, 6.8]),\n  energy: 8,\n  glareSize: 0.42,\n  flareSize: 0.0022,\n  ghostScale: 0.075,\n  desaturate: 0.9,\n  coronaStrength: 1.3,\n  veilStrength: 0.18,\n  diffractionStrength: 0.35,\n});\n\nexport const ORBITAL_HDR_EXPOSURE_DEFAULTS = Object.freeze({\n  deepSpaceExposure: 10,\n  sunlitEarthExposure: 4.2,\n  directSunExposure: 0.68,\n  closeSecondsStationary: 0.11,\n  closeSecondsMoving: 0.045,\n  openSecondsStationary: 2.8,\n  openSecondsMoving: 6.2,\n  motionReferenceRadPerSecond: Math.PI * 0.75,\n});\n\nconst clamp01 = (value) => Math.min(1, Math.max(0, Number(value) || 0));\nconst smoothUnit = (value) => {\n  const t = clamp01(value);\n  return t * t * (3 - 2 * t);\n};\n\n/**\n * Illuminated fraction weighted by Lambertian apparent brightness. A camera on\n * the Sun-facing side sees a full bright Earth (1); the anti-solar side sees a\n * new, predominantly dark Earth (0).\n */\nexport function lambertianSpherePhase(cosinePhaseAngle) {\n  const alpha = Math.acos(Math.min(1, Math.max(-1, Number(cosinePhaseAngle) || 0)));\n  return clamp01((Math.sin(alpha) + (Math.PI - alpha) * Math.cos(alpha)) / Math.PI);\n}\n\n/**\n * Resolve an analytic exposure target without a framebuffer readback. This\n * keeps adaptation invariant across resolution and render-path handoffs while\n * still responding continuously as the camera pans between space, Earth, and\n * the visible solar disc.\n */\nexport function resolveOrbitalHdrExposureTarget({\n  earthFrameWeight = 0,\n  earthPhaseLuminance = 0,\n  sunFrameWeight = 0,\n  solarVisibility = 0,\n  solarTransmission = 0,\n} = {}) {\n  // Dark-biased metering: a camera framing the night side with a sunlit\n  // sliver stays night-adapted, so the day side and limb blow out near the\n  // terminator, as in ISS night photography. Fully lit Earth still meters\n  // to sunlitEarthExposure.\n  const earthMeter = clamp01(\n    clamp01(earthFrameWeight) * Math.pow(clamp01(earthPhaseLuminance), 1.6),\n  );\n  const earthExposure = ORBITAL_HDR_EXPOSURE_DEFAULTS.deepSpaceExposure\n    + (ORBITAL_HDR_EXPOSURE_DEFAULTS.sunlitEarthExposure\n      - ORBITAL_HDR_EXPOSURE_DEFAULTS.deepSpaceExposure) * earthMeter;\n  const visibleSolarEnergy = clamp01(solarVisibility) * clamp01(solarTransmission);\n  const sunMeter = smoothUnit(\n    clamp01(sunFrameWeight) * Math.pow(visibleSolarEnergy, 0.28),\n  );\n  const targetExposure = earthExposure\n    + (ORBITAL_HDR_EXPOSURE_DEFAULTS.directSunExposure - earthExposure) * sunMeter;\n  return Object.freeze({\n    targetExposure,\n    earthMeter,\n    sunMeter,\n    visibleSolarEnergy,\n  });\n}\n\n/**\n * Iris/camera response is asymmetric: it closes quickly toward a bright source\n * and opens slowly after leaving it. Rapid camera rotation accelerates closing\n * but holds recovery to avoid exposure pumping during a fast orbit pan.\n */\nexport function orbitalExposureResponseSeconds({\n  currentExposure,\n  targetExposure,\n  angularSpeedRadPerSecond = 0,\n} = {}) {\n  const motion = clamp01(\n    Math.max(0, Number(angularSpeedRadPerSecond) || 0)\n      / ORBITAL_HDR_EXPOSURE_DEFAULTS.motionReferenceRadPerSecond,\n  );\n  if (targetExposure < currentExposure) {\n    return ORBITAL_HDR_EXPOSURE_DEFAULTS.closeSecondsStationary\n      + (ORBITAL_HDR_EXPOSURE_DEFAULTS.closeSecondsMoving\n        - ORBITAL_HDR_EXPOSURE_DEFAULTS.closeSecondsStationary) * motion;\n  }\n  return ORBITAL_HDR_EXPOSURE_DEFAULTS.openSecondsStationary\n    + (ORBITAL_HDR_EXPOSURE_DEFAULTS.openSecondsMoving\n      - ORBITAL_HDR_EXPOSURE_DEFAULTS.openSecondsStationary) * motion;\n}\n\nexport const STAR_SCINTILLATION_DEFAULTS = Object.freeze({\n  zenithStrength: 0.018,\n  maximumStrength: 0.08,\n  turbulenceScaleHeightMeters: 8_000,\n  maximumAirMass: 12,\n});\n","/**\n * Provider imagery is display-referred aerial photography, not a laboratory\n * reflectance chart. Takram interprets it as Lambertian albedo, so a modest\n * calibration keeps physical sun/sky irradiance from lifting the entire\n * surface into the shoulder of the final AgX curve.\n */\nexport const PHOTOREAL_ALBEDO_SCALE_DEFAULT = 0.82;\n\n/**\n * Open-ocean diffuse body colour. Specular response and atmospheric\n * transmittance remain separate; this value represents the low diffuse\n * reflectance of deep water before physical scene lighting.\n */\nexport const PHOTOREAL_OCEAN_DEFAULTS = Object.freeze({\n  color: '#031e32',\n  opacity: 0.9,\n});\n","/** Conservative retention weight, not a browser heap measurement. Stops at cap. */\nexport function jsonRetentionWeight(value, cap) {\n    let bytes = 0;\n    const stack = [[value][Symbol.iterator]()];\n    while (stack.length && bytes <= cap) {\n        const next = stack[stack.length - 1].next();\n        if (next.done) { stack.pop(); continue; }\n        const item = next.value;\n        if (typeof item === 'string') bytes += 32 + item.length * 2;\n        else if (item === null || typeof item !== 'object') bytes += 16;\n        else if (Array.isArray(item)) {\n            bytes += 64 + item.length * 8;\n            if (bytes <= cap) stack.push(item[Symbol.iterator]());\n        } else {\n            bytes += 64;\n            stack.push((function* () {\n                for (const key in item) {\n                    bytes += 48 + key.length * 2;\n                    yield item[key];\n                }\n            })());\n        }\n    }\n    return bytes;\n}\n","import { readBoundedBytes } from './readBoundedBytes.js';\nimport { jsonRetentionWeight } from './JsonRetentionWeight.js';\nimport { getWorkerPool } from '../async/workers/WorkerPool.js';\n\nconst cache = new Map(), inflight = new Map();\nconst MAX_ENTRIES = 24, MAX_BYTES = 8 * 1024 * 1024, MAX_ENTRY_BYTES = 2 * 1024 * 1024;\nconst MAX_RESPONSE_BYTES = 96 * 1024 * 1024, MAX_INFLIGHT_BYTES = 128 * 1024 * 1024;\nconst MAX_INFLIGHT = 16, MAX_ACTIVE = 2, PARSE_THRESHOLD = 32 * 1024;\nlet cacheBytes = 0, active = 0, inflightBytes = 0, privateSequence = 0;\nconst waiters = [];\n\nfunction remove(key) {\n    const entry = cache.get(key);\n    if (entry) cacheBytes -= entry.bytes;\n    cache.delete(key);\n}\n\nfunction touch(key, entry) { cache.delete(key); cache.set(key, entry); return entry; }\n\nfunction store(key, data, bytes) {\n    remove(key);\n    if (!Number.isFinite(bytes) || bytes <= 0 || bytes > MAX_ENTRY_BYTES) return;\n    cache.set(key, { data, bytes }); cacheBytes += bytes;\n    while (cache.size > MAX_ENTRIES || cacheBytes > MAX_BYTES) remove(cache.keys().next().value);\n}\n\nexport function normalizeResourceUrl(url) {\n    if (!url || typeof url !== 'string') return '';\n    const base = typeof window !== 'undefined' && window.location ? window.location.href : 'http://localhost/';\n    const parsed = new URL(url, base);\n    return `${parsed.origin}${parsed.pathname}${parsed.search}`;\n}\n\nfunction drain() {\n    while (active < MAX_ACTIVE && waiters.length) {\n        const next = waiters.shift();\n        next.signal.removeEventListener('abort', next.abort);\n        if (next.signal.aborted) { next.reject(next.signal.reason); continue; }\n        active++; next.resolve();\n    }\n}\n\nfunction acquire(signal) {\n    return new Promise((resolve, reject) => {\n        const entry = { signal, resolve, reject, abort: null };\n        entry.abort = () => {\n            const index = waiters.indexOf(entry);\n            if (index !== -1) waiters.splice(index, 1);\n            reject(signal.reason);\n        };\n        signal.throwIfAborted();\n        signal.addEventListener('abort', entry.abort, { once: true });\n        waiters.push(entry); drain();\n    });\n}\n\nfunction join(entry, signal) {\n    entry.consumers++;\n    return new Promise((resolve, reject) => {\n        let finished = false;\n        const finish = (fn, value) => {\n            if (finished) return;\n            finished = true;\n            signal?.removeEventListener('abort', abort);\n            entry.consumers--;\n            fn(value);\n        };\n        const abort = () => {\n            finish(reject, signal.reason || new DOMException('aborted', 'AbortError'));\n            if (!entry.consumers && !entry.done) {\n                if (inflight.get(entry.key) === entry) inflight.delete(entry.key);\n                entry.controller.abort();\n            }\n        };\n        signal?.addEventListener('abort', abort, { once: true });\n        if (signal?.aborted) abort();\n        entry.promise.then(data => finish(resolve, data), error => finish(reject, error));\n    });\n}\n\nexport async function fetchJsonResource(url, options = {}) {\n    const key = normalizeResourceUrl(url);\n    if (!key) throw new Error('Cannot fetch JSON resource without a URL.');\n    const signal = options.signal || options.fetchOptions?.signal;\n    signal?.throwIfAborted();\n    const { signal: _signal, ...init } = options.fetchOptions || {};\n    const maxBytes = Math.min(MAX_RESPONSE_BYTES, options.maxBytes ?? MAX_RESPONSE_BYTES);\n    if (!Number.isSafeInteger(maxBytes) || maxBytes < 1) throw new RangeError('Invalid response byte limit');\n    const timeoutMs = Math.min(60000, options.timeoutMs ?? 30000);\n    if (!Number.isFinite(timeoutMs) || timeoutMs < 1) throw new RangeError('Invalid resource timeout');\n    // Only uncustomized static GETs share/persist. Authenticated/body/custom\n    // requests must not share cache entries or retain account data globally.\n    const privateRequest = Object.keys(init).length > 0;\n    const requestKey = `${key}|${maxBytes}|${timeoutMs}${privateRequest ? '|private:' + ++privateSequence : ''}`;\n    const cached = !privateRequest && cache.get(key);\n    if (cached && cached.bytes <= maxBytes) return touch(key, cached).data;\n    let entry = inflight.get(requestKey);\n    if (!entry) {\n        if (inflight.size >= MAX_INFLIGHT) throw new Error('JSON resource admission limit reached');\n        entry = { key: requestKey, resourceKey: key, controller: new AbortController(), consumers: 0, done: false, promise: null };\n        inflight.set(requestKey, entry);\n        entry.promise = (async () => {\n            const ownSignal = entry.controller.signal;\n            await acquire(ownSignal);\n            let reserved = 0;\n            const timeout = setTimeout(() => entry.controller.abort(new DOMException('JSON resource timed out', 'TimeoutError')), timeoutMs);\n            try {\n                const response = await fetch(url, { ...init, signal: ownSignal });\n                if (!response.ok) {\n                    await response.body?.cancel().catch(() => {});\n                    throw new Error(options.errorMessage || `JSON resource load failed: ${response.status} ${response.statusText}`);\n                }\n                const bytes = await readBoundedBytes(response, { maxBytes, signal: ownSignal, reserve: n => {\n                    if (inflightBytes + n > MAX_INFLIGHT_BYTES) throw new RangeError('JSON in-flight decoded-byte budget exceeded');\n                    inflightBytes += n; reserved += n;\n                } });\n                ownSignal.throwIfAborted();\n                let data, weight;\n                if (bytes.byteLength >= PARSE_THRESHOLD && typeof Worker !== 'undefined') {\n                    const parsed = await getWorkerPool().run('parser-worker', 'parseJSONBuffer', { buffer: bytes.buffer, retentionCap: MAX_ENTRY_BYTES }, { transfer: [bytes.buffer], signal: ownSignal });\n                    if (!parsed?.ok) throw new SyntaxError('Invalid JSON resource');\n                    data = parsed.data; weight = parsed.weight;\n                } else {\n                    if (bytes.byteLength >= PARSE_THRESHOLD && typeof window !== 'undefined') throw new Error('Large JSON resources require a worker');\n                    data = JSON.parse(new TextDecoder().decode(bytes));\n                    weight = jsonRetentionWeight(data, MAX_ENTRY_BYTES);\n                }\n                ownSignal.throwIfAborted();\n                if (!privateRequest && inflight.get(requestKey) === entry) store(key, data, Math.max(reserved, weight));\n                return data;\n            } finally {\n                clearTimeout(timeout);\n                inflightBytes -= reserved; active--; drain();\n            }\n        })().finally(() => {\n            entry.done = true;\n            if (inflight.get(requestKey) === entry) inflight.delete(requestKey);\n        });\n    }\n    return join(entry, signal);\n}\n\nexport function peekJsonResource(url) {\n    const key = normalizeResourceUrl(url), entry = cache.get(key);\n    return entry ? touch(key, entry).data : null;\n}\n\nexport function clearJsonResourceCache(url = null) {\n    const key = url ? normalizeResourceUrl(url) : null;\n    for (const cacheKey of cache.keys()) if (!key || cacheKey === key) remove(cacheKey);\n    for (const [requestKey, entry] of inflight) {\n        if (!key || entry.resourceKey === key) {\n            inflight.delete(requestKey); entry.controller.abort();\n        }\n    }\n}\n\nexport function getJsonResourceCacheStats() {\n    return { entries: cache.size, bytes: cacheBytes, maxEntries: MAX_ENTRIES, maxBytes: MAX_BYTES,\n        maxEntryBytes: MAX_ENTRY_BYTES, inflight: inflight.size, active, queued: waiters.length,\n        inflightBytes, maxInflightBytes: MAX_INFLIGHT_BYTES, maxResponseBytes: MAX_RESPONSE_BYTES };\n}\n","import { fetchJsonResource, normalizeResourceUrl } from '../shared/JsonResourceCache.js';\n\nconst DEFAULT_BASE_PATH = '/refactor/data/geojson/';\n\nconst sharedWorldIndexCache = new Map();\nconst sharedWorldIndexPromises = new Map();\nconst sharedAdmIndexCache = new Map();\nconst sharedAdmIndexPromises = new Map();\nconst sharedBoundaryIndexCache = new Map();\nconst sharedBoundaryIndexPromises = new Map();\nconst SHARED_WORLD_INDEX_CACHE_MAX_ENTRIES = 1;\nconst SHARED_ADM_INDEX_CACHE_MAX_ENTRIES = 4;\nconst SHARED_BOUNDARY_INDEX_CACHE_MAX_ENTRIES = 3;\nconst INSTANCE_BOUNDARY_INDEX_CACHE_MAX_ENTRIES = 2;\n\nfunction getRecentCacheEntry(cache, key) {\n    if (!cache.has(key)) return undefined;\n    const value = cache.get(key);\n    // Map insertion order provides a compact LRU without a second object graph.\n    cache.delete(key);\n    cache.set(key, value);\n    return value;\n}\n\nfunction setBoundedCacheEntry(cache, key, value, maxEntries) {\n    cache.delete(key);\n    cache.set(key, value);\n    while (cache.size > maxEntries) {\n        const oldest = cache.keys().next().value;\n        if (oldest === undefined) break;\n        cache.delete(oldest);\n    }\n    return value;\n}\n\nconst normalizeIso3 = (value) => {\n    if (typeof value !== 'string') return null;\n    const trimmed = value.trim().toUpperCase();\n    if (!/^[A-Z]{3}$/.test(trimmed)) return null;\n    return trimmed;\n};\n\nconst normalizeName = (value) => {\n    if (typeof value !== 'string') return null;\n    const trimmed = value.trim();\n    return trimmed ? trimmed.toLowerCase() : null;\n};\n\nconst getFeatureName = (props) => {\n    if (!props) return null;\n    return props.name ||\n        props.admin ||\n        props.shapeName ||\n        props.name_long ||\n        props.name_en ||\n        props.sovereignt ||\n        props.brk_name ||\n        props.NAME_0 ||\n        props.NAME_1 ||\n        props.NAME_2 ||\n        props.NAME_3 ||\n        props.NAME_4 ||\n        props.NAME ||\n        null;\n};\n\nconst extractIso3 = (props) => {\n    if (!props) return null;\n    const candidates = [\n        props.iso3,\n        props.iso_a3,\n        props.adm0_a3,\n        props.sov_a3,\n        props.iso_a3_eh,\n        props.adm0_a3_us,\n        props.adm0_a3_un,\n        props.adm0_a3_wb,\n        props.brk_a3,\n        props.gu_a3,\n        props.su_a3,\n        props.country_iso3,\n        props.shapeGroup\n    ];\n    for (const value of candidates) {\n        const iso3 = normalizeIso3(value);\n        if (iso3) return iso3;\n    }\n    return null;\n};\n\nclass GeoBoundaryIndex {\n    constructor(geojson) {\n        this._featureIndex = this._buildFeatureIndex(geojson);\n        this._featureNames = null;\n    }\n\n    getFeatureAtLatLon(lat, lon) {\n        if (!Number.isFinite(lat) || !Number.isFinite(lon)) return null;\n        if (!this._featureIndex || !this._featureIndex.length) return null;\n        const lonWrapped = this._wrapLon180(lon);\n        for (const feature of this._featureIndex) {\n            for (const polygon of feature.polygons) {\n                const testLon = polygon.wrap && lonWrapped < 0 ? lonWrapped + 360 : lonWrapped;\n                if (testLon < polygon.bbox.minLon || testLon > polygon.bbox.maxLon) continue;\n                if (lat < polygon.bbox.minLat || lat > polygon.bbox.maxLat) continue;\n                if (!this._pointInRing(testLon, lat, polygon.rings[0])) continue;\n                let inHole = false;\n                for (let i = 1; i < polygon.rings.length; i++) {\n                    if (this._pointInRing(testLon, lat, polygon.rings[i])) {\n                        inHole = true;\n                        break;\n                    }\n                }\n                if (!inHole) {\n                    return feature;\n                }\n            }\n        }\n        return null;\n    }\n\n    getFeatureNames() {\n        if (this._featureNames) return this._featureNames.slice();\n        const names = new Set();\n        for (const feature of this._featureIndex) {\n            if (feature.name) names.add(feature.name);\n        }\n        this._featureNames = Array.from(names).sort((a, b) => a.localeCompare(b));\n        return this._featureNames.slice();\n    }\n\n    getFeaturesIntersectingBounds({ west, south, east, north } = {}) {\n        if (![west, south, east, north].every(Number.isFinite)) return [];\n        const minLat = Math.max(-90, Math.min(south, north));\n        const maxLat = Math.min(90, Math.max(south, north));\n        const rawSpan = Math.abs(east - west);\n        const normalizedWest = this._wrapLon180(west);\n        const normalizedEast = this._wrapLon180(east);\n        const longitudeSegments = rawSpan >= 359.999\n            ? [[-180, 180]]\n            : (normalizedWest <= normalizedEast\n                ? [[normalizedWest, normalizedEast]]\n                : [[normalizedWest, 180], [-180, normalizedEast]]);\n        const intersectsLongitude = (polygon) => longitudeSegments.some(([queryWest, queryEast]) => {\n            const candidates = polygon.wrap\n                ? [[queryWest, queryEast], [queryWest + 360, queryEast + 360]]\n                : [[queryWest, queryEast]];\n            return candidates.some(([candidateWest, candidateEast]) => (\n                candidateEast >= polygon.bbox.minLon && candidateWest <= polygon.bbox.maxLon\n            ));\n        });\n        return this._featureIndex\n            .filter((entry) => entry.polygons.some((polygon) => (\n                polygon.bbox.maxLat >= minLat\n                && polygon.bbox.minLat <= maxLat\n                && intersectsLongitude(polygon)\n            )))\n            .map((entry) => entry.feature)\n            .filter(Boolean);\n    }\n\n    _buildFeatureIndex(geojson) {\n        const entries = [];\n        if (geojson && Array.isArray(geojson.features)) {\n            for (const feature of geojson.features) {\n                this._pushFeatureEntry(feature, entries);\n            }\n        } else if (geojson && geojson.type && geojson.coordinates) {\n            this._pushFeatureEntry({ geometry: geojson, properties: geojson.properties || {} }, entries);\n        }\n        return entries;\n    }\n\n    _pushFeatureEntry(feature, entries) {\n        if (!feature || !feature.geometry) return;\n        const polygons = this._extractPolygons(feature.geometry);\n        if (!polygons.length) return;\n        const props = feature.properties || {};\n        entries.push({\n            name: getFeatureName(props),\n            properties: props,\n            polygons,\n            feature\n        });\n    }\n\n    _extractPolygons(geometry) {\n        if (!geometry) return [];\n        const type = geometry.type;\n        if (type === 'Polygon') {\n            const poly = this._preparePolygon(geometry.coordinates);\n            return poly ? [poly] : [];\n        }\n        if (type === 'MultiPolygon') {\n            const out = [];\n            for (const polyCoords of geometry.coordinates || []) {\n                const poly = this._preparePolygon(polyCoords);\n                if (poly) out.push(poly);\n            }\n            return out;\n        }\n        if (type === 'GeometryCollection') {\n            const out = [];\n            for (const geom of geometry.geometries || []) {\n                out.push(...this._extractPolygons(geom));\n            }\n            return out;\n        }\n        return [];\n    }\n\n    _preparePolygon(rings) {\n        if (!Array.isArray(rings) || !rings.length) return null;\n        const outerRing = rings[0];\n        if (!Array.isArray(outerRing) || outerRing.length < 3) return null;\n        const wrap = this._ringCrossesDateline(outerRing);\n        const outer = this._normalizeRing(outerRing, wrap);\n        if (!outer) return null;\n        const ringData = [outer.coords];\n        for (let i = 1; i < rings.length; i++) {\n            const hole = this._normalizeRing(rings[i], wrap);\n            if (hole) ringData.push(hole.coords);\n        }\n        return {\n            wrap,\n            rings: ringData,\n            bbox: {\n                minLon: outer.minLon,\n                maxLon: outer.maxLon,\n                minLat: outer.minLat,\n                maxLat: outer.maxLat\n            }\n        };\n    }\n\n    _normalizeRing(ring, wrap) {\n        if (!Array.isArray(ring)) return null;\n        let minLon = Infinity;\n        let maxLon = -Infinity;\n        let minLat = Infinity;\n        let maxLat = -Infinity;\n\n        // Ordinary GeoJSON rings can be used directly. Avoid duplicating the\n        // entire coordinate tree in each boundary index; only antimeridian or\n        // non-normalized rings need a normalized copy.\n        let canUseSourceRing = !wrap;\n        for (const pt of ring) {\n            if (!Array.isArray(pt) || pt.length < 2) continue;\n            const rawLon = Number(pt[0]);\n            const lat = Number(pt[1]);\n            if (!Number.isFinite(rawLon) || !Number.isFinite(lat)) {\n                canUseSourceRing = false;\n                continue;\n            }\n            if (rawLon < -180 || rawLon >= 180) canUseSourceRing = false;\n            if (rawLon < minLon) minLon = rawLon;\n            if (rawLon > maxLon) maxLon = rawLon;\n            if (lat < minLat) minLat = lat;\n            if (lat > maxLat) maxLat = lat;\n        }\n        if (ring.length < 3 || !Number.isFinite(minLon) || !Number.isFinite(minLat)) return null;\n        if (canUseSourceRing) {\n            return { coords: ring, minLon, maxLon, minLat, maxLat };\n        }\n\n        const coords = [];\n        minLon = Infinity;\n        maxLon = -Infinity;\n        minLat = Infinity;\n        maxLat = -Infinity;\n        for (const pt of ring) {\n            if (!Array.isArray(pt) || pt.length < 2) continue;\n            let lon = Number(pt[0]);\n            const lat = Number(pt[1]);\n            if (!Number.isFinite(lon) || !Number.isFinite(lat)) continue;\n            lon = this._wrapLon180(lon);\n            if (wrap && lon < 0) lon += 360;\n            coords.push([lon, lat]);\n            if (lon < minLon) minLon = lon;\n            if (lon > maxLon) maxLon = lon;\n            if (lat < minLat) minLat = lat;\n            if (lat > maxLat) maxLat = lat;\n        }\n        if (coords.length < 3) return null;\n        return { coords, minLon, maxLon, minLat, maxLat };\n    }\n\n    _ringCrossesDateline(ring) {\n        if (!Array.isArray(ring) || ring.length < 2) return false;\n        let prevLon = null;\n        for (const pt of ring) {\n            if (!Array.isArray(pt) || pt.length < 2) continue;\n            const lon = this._wrapLon180(Number(pt[0]));\n            if (!Number.isFinite(lon)) continue;\n            if (prevLon !== null && Math.abs(lon - prevLon) > 180) return true;\n            prevLon = lon;\n        }\n        if (prevLon === null) return false;\n        const first = ring[0];\n        if (Array.isArray(first) && first.length >= 2) {\n            const firstLon = this._wrapLon180(Number(first[0]));\n            if (Number.isFinite(firstLon) && Math.abs(firstLon - prevLon) > 180) return true;\n        }\n        return false;\n    }\n\n    _pointInRing(lon, lat, ring) {\n        if (!Array.isArray(ring) || ring.length < 3) return false;\n        let inside = false;\n        for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n            const xi = ring[i][0];\n            const yi = ring[i][1];\n            const xj = ring[j][0];\n            const yj = ring[j][1];\n            const intersects = ((yi > lat) !== (yj > lat)) &&\n                (lon < ((xj - xi) * (lat - yi)) / (yj - yi) + xi);\n            if (intersects) inside = !inside;\n        }\n        return inside;\n    }\n\n    _wrapLon180(lon) {\n        if (!Number.isFinite(lon)) return NaN;\n        const wrapped = ((lon + 180) % 360 + 360) % 360;\n        return wrapped - 180;\n    }\n}\n\nexport class GeoBoundaryService {\n    constructor({ basePath = DEFAULT_BASE_PATH } = {}) {\n        this.basePath = basePath;\n        this._admIndexCache = new Map();\n        this._admIndexPromises = new Map();\n        this._boundaryCache = new Map();\n        this._boundaryPromises = new Map();\n        this._worldIndex = null;\n        this._worldCountries = null;\n        this._worldPromise = null;\n    }\n\n    async getCountries(level) {\n        const adminLevel = this._normalizeLevel(level);\n        if (adminLevel === 0) {\n            const world = await this._loadWorldIndex();\n            return world?.countries ? world.countries.slice() : [];\n        }\n        const index = await this._loadAdmIndex(adminLevel);\n        return index?.countries ? index.countries.slice() : [];\n    }\n\n    async getWorldIndex() {\n        return this._loadWorldIndex();\n    }\n\n    async getWorldFeaturesInBounds(bounds) {\n        const world = await this._loadWorldIndex();\n        return world?.index?.getFeaturesIntersectingBounds?.(bounds) || [];\n    }\n\n    getWorldIndexSync() {\n        if (this._worldIndex) {\n            return { index: this._worldIndex, countries: this._worldCountries || [] };\n        }\n        return null;\n    }\n\n    async getSubdivisions(level, iso3) {\n        const adminLevel = this._normalizeLevel(level);\n        if (adminLevel <= 0) return [];\n        const country = normalizeIso3(iso3);\n        if (!country) return [];\n        const boundary = await this._loadBoundaryIndex(adminLevel, country);\n        return boundary?.index?.getFeatureNames?.() || [];\n    }\n\n    async getCountryAtLatLon(lat, lon) {\n        if (!Number.isFinite(lat) || !Number.isFinite(lon)) return null;\n        const world = await this._loadWorldIndex();\n        if (!world?.index) return null;\n        const feature = world.index.getFeatureAtLatLon(lat, lon);\n        if (!feature) return null;\n        const props = feature.properties || {};\n        const iso3 = extractIso3(props);\n        const name = getFeatureName(props) || iso3 || null;\n        return {\n            iso3,\n            name,\n            feature,\n            properties: props\n        };\n    }\n\n    async getAdminFeatureAtLatLon(level, iso3, lat, lon) {\n        const adminLevel = this._normalizeLevel(level);\n        const country = normalizeIso3(iso3);\n        if (adminLevel <= 0 || !country) return null;\n        if (!Number.isFinite(lat) || !Number.isFinite(lon)) return null;\n        const boundary = await this._loadBoundaryIndex(adminLevel, country);\n        if (!boundary?.index) return null;\n        const feature = boundary.index.getFeatureAtLatLon(lat, lon);\n        if (!feature) return null;\n        const props = feature.properties || {};\n        const name = feature.name || getFeatureName(props) || null;\n        return {\n            level: adminLevel,\n            name,\n            feature,\n            properties: props\n        };\n    }\n\n    async hasCountryAtLevel(level, iso3) {\n        const adminLevel = this._normalizeLevel(level);\n        const country = normalizeIso3(iso3);\n        if (adminLevel <= 0 || !country) return false;\n        const index = await this._loadAdmIndex(adminLevel);\n        if (index?.filesByIso?.has(country)) return true;\n        return !!index?.countries?.some?.((entry) => entry?.iso3 === country);\n    }\n\n    /**\n     * Get the full administrative hierarchy at a lat/lon position.\n     * Returns an object with levels: { adm1: { name, properties }, adm2: { name, properties }, ... }\n     * This allows knowing which parent region a point is in at each level.\n     */\n    async getAdminHierarchyAtLatLon(iso3, lat, lon, maxLevel = 3) {\n        const country = normalizeIso3(iso3);\n        if (!country) return null;\n        if (!Number.isFinite(lat) || !Number.isFinite(lon)) return null;\n\n        const hierarchy = {};\n        const normalizedMaxLevel = this._normalizeLevel(maxLevel);\n\n        for (let level = 1; level <= normalizedMaxLevel; level++) {\n            const hasLevel = await this.hasCountryAtLevel(level, country);\n            if (!hasLevel) continue;\n\n            const feature = await this.getAdminFeatureAtLatLon(level, country, lat, lon);\n            if (feature?.name) {\n                const props = feature.properties || {};\n                hierarchy[`adm${level}`] = {\n                    name: feature.name,\n                    properties: props,\n                    // Extract parent names from properties (GADM convention)\n                    parentName: props.NAME_1 || props.name_1 || props.ADM1_NAME || null,\n                    grandparentName: props.NAME_0 || props.name_0 || props.ADM0_NAME || null\n                };\n            }\n        }\n\n        return Object.keys(hierarchy).length > 0 ? hierarchy : null;\n    }\n\n    async matchRule(lat, lon, rule) {\n        if (!Number.isFinite(lat) || !Number.isFinite(lon)) return false;\n        const normalized = this._normalizeRule(rule);\n        if (!normalized) return true;\n        const { level, country, subdivisions } = normalized;\n        if (level === 0) {\n            const world = await this._loadWorldIndex();\n            if (!world?.index) return false;\n            const feature = world.index.getFeatureAtLatLon(lat, lon);\n            if (!feature) return false;\n            if (!country) return true;\n            const iso3 = extractIso3(feature.properties);\n            if (iso3 && iso3 === country) return true;\n            const name = normalizeName(getFeatureName(feature.properties));\n            return name ? name === normalizeName(country) : false;\n        }\n        if (!country) return false;\n        const boundary = await this._loadBoundaryIndex(level, country);\n        if (!boundary?.index) return false;\n        const feature = boundary.index.getFeatureAtLatLon(lat, lon);\n        if (!feature) return false;\n        if (!subdivisions || subdivisions.size === 0) return true;\n        const name = normalizeName(feature.name || getFeatureName(feature.properties));\n        return name ? subdivisions.has(name) : false;\n    }\n\n    _normalizeLevel(value) {\n        const numeric = Number.isFinite(value) ? value : Number.parseInt(value, 10);\n        if (!Number.isFinite(numeric)) return 0;\n        if (numeric < 0) return 0;\n        return Math.min(numeric, 3);\n    }\n\n    _normalizeRule(rule) {\n        if (!rule || typeof rule !== 'object') return null;\n        const levelRaw = rule.admin_level ?? rule.adm_level ?? rule.level ?? rule.adminLevel ?? 0;\n        const level = this._normalizeLevel(levelRaw);\n        let country = rule.country ?? rule.iso3 ?? rule.country_iso3 ?? rule.adm0 ?? null;\n        if (country === '*' || country === 'ANY') country = null;\n        const iso = normalizeIso3(country);\n        const subdivisionsRaw = rule.subdivisions ?? rule.subdivision ?? rule.subdivision_names ?? null;\n        const subdivisions = new Set();\n        if (Array.isArray(subdivisionsRaw)) {\n            for (const entry of subdivisionsRaw) {\n                const name = normalizeName(entry);\n                if (name) subdivisions.add(name);\n            }\n        } else if (typeof subdivisionsRaw === 'string') {\n            const name = normalizeName(subdivisionsRaw);\n            if (name) subdivisions.add(name);\n        }\n        return {\n            level,\n            country: iso || country || null,\n            subdivisions\n        };\n    }\n\n    async _loadWorldIndex() {\n        if (this._worldIndex) {\n            return { index: this._worldIndex, countries: this._worldCountries || [] };\n        }\n        if (this._worldPromise) return this._worldPromise;\n        const url = `${this.basePath}world.geojson`;\n        const key = normalizeResourceUrl(url);\n        const sharedWorld = getRecentCacheEntry(sharedWorldIndexCache, key);\n        if (sharedWorld) {\n            const payload = sharedWorld;\n            this._worldIndex = payload?.index || null;\n            this._worldCountries = payload?.countries || [];\n            return payload;\n        }\n        if (sharedWorldIndexPromises.has(key)) {\n            this._worldPromise = sharedWorldIndexPromises.get(key).then((payload) => {\n                this._worldIndex = payload?.index || null;\n                this._worldCountries = payload?.countries || [];\n                return payload;\n            }).finally(() => {\n                this._worldPromise = null;\n            });\n            return this._worldPromise;\n        }\n        this._worldPromise = (async () => {\n            try {\n                const geojson = await fetchJsonResource(url, {\n                    errorMessage: 'GeoJSON world load failed'\n                });\n                const index = new GeoBoundaryIndex(geojson);\n                const countries = [];\n                const seen = new Set();\n                if (Array.isArray(geojson.features)) {\n                    for (const feature of geojson.features) {\n                        const props = feature?.properties || {};\n                        const iso3 = extractIso3(props);\n                        if (!iso3 || seen.has(iso3)) continue;\n                        const name = getFeatureName(props) || iso3;\n                        seen.add(iso3);\n                        countries.push({ iso3, name });\n                    }\n                }\n                countries.sort((a, b) => a.name.localeCompare(b.name));\n                const payload = { index, countries };\n                setBoundedCacheEntry(sharedWorldIndexCache, key, payload, SHARED_WORLD_INDEX_CACHE_MAX_ENTRIES);\n                this._worldIndex = payload.index;\n                this._worldCountries = payload.countries;\n                return payload;\n            } catch (error) {\n                console.warn('[GeoBoundaryService] World load failed', error);\n                this._worldIndex = null;\n                this._worldCountries = [];\n                const payload = { index: null, countries: [] };\n                setBoundedCacheEntry(sharedWorldIndexCache, key, payload, SHARED_WORLD_INDEX_CACHE_MAX_ENTRIES);\n                return payload;\n            } finally {\n                this._worldPromise = null;\n                sharedWorldIndexPromises.delete(key);\n            }\n        })();\n        sharedWorldIndexPromises.set(key, this._worldPromise);\n        return this._worldPromise;\n    }\n\n    async _loadAdmIndex(level) {\n        const adminLevel = this._normalizeLevel(level);\n        if (adminLevel <= 0) return null;\n        const key = `${normalizeResourceUrl(this.basePath)}:ADM${adminLevel}:index`;\n        if (this._admIndexCache.has(adminLevel)) {\n            return this._admIndexCache.get(adminLevel);\n        }\n        if (this._admIndexPromises.has(adminLevel)) {\n            return this._admIndexPromises.get(adminLevel);\n        }\n        const sharedAdm = getRecentCacheEntry(sharedAdmIndexCache, key);\n        if (sharedAdm) {\n            const payload = sharedAdm;\n            this._admIndexCache.set(adminLevel, payload);\n            return payload;\n        }\n        if (sharedAdmIndexPromises.has(key)) {\n            const promise = sharedAdmIndexPromises.get(key).then((payload) => {\n                this._admIndexCache.set(adminLevel, payload);\n                return payload;\n            }).finally(() => {\n                this._admIndexPromises.delete(adminLevel);\n            });\n            this._admIndexPromises.set(adminLevel, promise);\n            return promise;\n        }\n        const promise = (async () => {\n            try {\n                const data = await fetchJsonResource(`${this.basePath}ADM${adminLevel}/index.json`, {\n                    errorMessage: `ADM${adminLevel} index load failed`\n                });\n                const list = Array.isArray(data?.countries) ? data.countries : [];\n                const filesByIso = new Map();\n                const countries = [];\n                for (const entry of list) {\n                    const iso3 = normalizeIso3(entry?.iso3);\n                    if (!iso3) continue;\n                    const name = entry?.name || iso3;\n                    if (!filesByIso.has(iso3)) {\n                        const file = entry?.file || `ADM${adminLevel}/${iso3}.geojson`;\n                        filesByIso.set(iso3, file);\n                        countries.push({ iso3, name });\n                    }\n                }\n                countries.sort((a, b) => a.name.localeCompare(b.name));\n                const payload = { countries, filesByIso };\n                setBoundedCacheEntry(sharedAdmIndexCache, key, payload, SHARED_ADM_INDEX_CACHE_MAX_ENTRIES);\n                this._admIndexCache.set(adminLevel, payload);\n                return payload;\n            } catch (error) {\n                console.warn('[GeoBoundaryService] ADM index load failed', error);\n                const payload = { countries: [], filesByIso: new Map() };\n                setBoundedCacheEntry(sharedAdmIndexCache, key, payload, SHARED_ADM_INDEX_CACHE_MAX_ENTRIES);\n                this._admIndexCache.set(adminLevel, payload);\n                return payload;\n            } finally {\n                this._admIndexPromises.delete(adminLevel);\n                sharedAdmIndexPromises.delete(key);\n            }\n        })();\n        this._admIndexPromises.set(adminLevel, promise);\n        sharedAdmIndexPromises.set(key, promise);\n        return promise;\n    }\n\n    async _loadBoundaryIndex(level, iso3) {\n        const adminLevel = this._normalizeLevel(level);\n        const country = normalizeIso3(iso3);\n        if (adminLevel <= 0 || !country) return null;\n        const key = `${adminLevel}:${country}`;\n        const sharedKey = `${normalizeResourceUrl(this.basePath)}:${key}`;\n        const cachedBoundary = getRecentCacheEntry(this._boundaryCache, key);\n        if (cachedBoundary) {\n            return cachedBoundary;\n        }\n        if (this._boundaryPromises.has(key)) {\n            return this._boundaryPromises.get(key);\n        }\n        const sharedBoundary = getRecentCacheEntry(sharedBoundaryIndexCache, sharedKey);\n        if (sharedBoundary) {\n            const payload = sharedBoundary;\n            setBoundedCacheEntry(this._boundaryCache, key, payload, INSTANCE_BOUNDARY_INDEX_CACHE_MAX_ENTRIES);\n            return payload;\n        }\n        if (sharedBoundaryIndexPromises.has(sharedKey)) {\n            const promise = sharedBoundaryIndexPromises.get(sharedKey).then((payload) => {\n                setBoundedCacheEntry(this._boundaryCache, key, payload, INSTANCE_BOUNDARY_INDEX_CACHE_MAX_ENTRIES);\n                return payload;\n            }).finally(() => {\n                this._boundaryPromises.delete(key);\n            });\n            this._boundaryPromises.set(key, promise);\n            return promise;\n        }\n        const promise = (async () => {\n            try {\n                const index = await this._loadAdmIndex(adminLevel);\n                const file = index?.filesByIso?.get(country) || `ADM${adminLevel}/${country}.geojson`;\n                const url = `${this.basePath}${file}`;\n                const geojson = await fetchJsonResource(url, {\n                    errorMessage: `ADM${adminLevel} ${country} load failed`\n                });\n                const boundaryIndex = new GeoBoundaryIndex(geojson);\n                const payload = { index: boundaryIndex, file, url };\n                setBoundedCacheEntry(sharedBoundaryIndexCache, sharedKey, payload, SHARED_BOUNDARY_INDEX_CACHE_MAX_ENTRIES);\n                setBoundedCacheEntry(this._boundaryCache, key, payload, INSTANCE_BOUNDARY_INDEX_CACHE_MAX_ENTRIES);\n                return payload;\n            } catch (error) {\n                console.warn('[GeoBoundaryService] Boundary load failed', error);\n                const payload = { index: null, file: null, url: null };\n                setBoundedCacheEntry(sharedBoundaryIndexCache, sharedKey, payload, SHARED_BOUNDARY_INDEX_CACHE_MAX_ENTRIES);\n                setBoundedCacheEntry(this._boundaryCache, key, payload, INSTANCE_BOUNDARY_INDEX_CACHE_MAX_ENTRIES);\n                return payload;\n            } finally {\n                this._boundaryPromises.delete(key);\n                sharedBoundaryIndexPromises.delete(sharedKey);\n            }\n        })();\n        this._boundaryPromises.set(key, promise);\n        sharedBoundaryIndexPromises.set(sharedKey, promise);\n        return promise;\n    }\n}\n","import { getUiAudioSfx } from '../../modules/audio-sfx.js';\n\nconst nclpDashboardStyleUrl = new URL('./styles/nclp-dashboard.css', import.meta.url).href;\n\n/**\n * DesignSystem.js\n *\n * Unified design system with reusable UI components.\n * Provides consistent styling, buttons, toggles, inputs, and panels\n * following the clean surface design language.\n */\n\n/**\n * Resolve a CSS color value to a hex color string.\n * Handles CSS variables like 'var(--accent-soft, #ffffff)' by:\n * 1. Computing the actual value from the DOM if available\n * 2. Falling back to the default value in the var() statement\n * 3. Returning as-is if already a valid color\n *\n * Use this when passing colors to THREE.js which cannot parse CSS variables.\n */\nexport function resolveColor(cssColor) {\n  if (!cssColor || typeof cssColor !== 'string') {\n    return '#ffffff';\n  }\n\n  // If it's a CSS variable, try to resolve it\n  if (cssColor.startsWith('var(')) {\n    // Extract variable name and fallback: var(--name, fallback)\n    const match = cssColor.match(/var\\(\\s*(--[^,)]+)\\s*(?:,\\s*([^)]+))?\\)/);\n    if (match) {\n      const varName = match[1];\n      const fallback = match[2]?.trim() || '#ffffff';\n\n      // Try to get computed value from DOM\n      if (typeof document !== 'undefined') {\n        const computed = getComputedStyle(document.documentElement).getPropertyValue(varName).trim();\n        if (computed) {\n          return computed;\n        }\n      }\n\n      // Return fallback\n      return fallback;\n    }\n  }\n\n  // Already a valid color value (hex, rgb, etc.)\n  return cssColor;\n}\n\n// Design tokens\nexport const TOKENS = {\n  colors: {\n    bg: '#0a0a0a',\n    panel: 'rgba(20, 20, 20, 0.97)',\n    panelLight: '#111111',\n    accent: '#facc15',\n    accentHover: '#fde047',\n    accentActive: '#f59e0b',\n    success: '#8ef6c8',\n    danger: '#fca5a5',\n    warning: '#facc15',\n    text: '#fafafa',\n    textMuted: 'rgba(250, 250, 250, 0.7)',\n    textDim: 'rgba(250, 250, 250, 0.48)',\n    border: 'rgba(250, 250, 250, 0.12)',\n    borderHover: 'rgba(250, 250, 250, 0.30)',\n    inputBg: '#111111',\n  },\n  spacing: {\n    xs: '4px',\n    sm: '8px',\n    md: '12px',\n    lg: '16px',\n    xl: '20px',\n    xxl: '24px',\n  },\n  radius: {\n    sm: '3px',\n    md: '3px',\n    lg: '5px',\n    xl: '7px',\n    round: '50%',\n  },\n  font: {\n    family: 'Inter, \"IBM Plex Mono\", \"JetBrains Mono\", ui-monospace, SFMono-Regular, monospace',\n    sizeXs: '10px',\n    sizeSm: '11px',\n    sizeMd: '13px',\n    sizeLg: '15px',\n    sizeXl: '18px',\n    weight: {\n      normal: '400',\n      medium: '500',\n      semibold: '600',\n    },\n  },\n  transition: {\n    fast: '0.15s ease',\n    normal: '0.2s ease',\n    slow: '0.3s ease',\n  },\n  shadow: {\n    sm: '0 6px 16px rgba(0, 0, 0, 0.16)',\n    md: '0 12px 28px rgba(0, 0, 0, 0.16)',\n    lg: '0 16px 40px rgba(0, 0, 0, 0.16)',\n    glow: '0 0 16px rgba(250, 204, 21, 0.28)',\n  },\n};\n\nexport const ICON_SIZES = {\n  close: 0.7,\n  action: 0.9,\n};\n\nconst ICON_PATHS = {\n  close: 'M2 2L10 10M10 2L2 10',\n  plus: 'M6 2V10M2 6H10',\n  minus: 'M2 6H10',\n  'arrow-right': 'M3 6H9M7 3L10 6L7 9',\n  eye: 'M1.5 6C2.6 3.5 4.5 2.5 6 2.5C7.5 2.5 9.4 3.5 10.5 6C9.4 8.5 7.5 9.5 6 9.5C4.5 9.5 2.6 8.5 1.5 6Z M6 4.5C7 4.5 7.5 5 7.5 6C7.5 7 7 7.5 6 7.5C5 7.5 4.5 7 4.5 6C4.5 5 5 4.5 6 4.5Z',\n  'eye-off': 'M1.5 6C2.6 3.5 4.5 2.5 6 2.5C7.5 2.5 9.4 3.5 10.5 6C9.4 8.5 7.5 9.5 6 9.5C4.5 9.5 2.6 8.5 1.5 6Z M2 2L10 10',\n  sliders: 'M3 2V10M3 4H5M7 2V10M7 8H9',\n};\n\nconst formatIconSize = (size) => {\n  if (typeof size === 'number') return `${size}em`;\n  if (typeof size === 'string' && size.trim()) return size;\n  return `${ICON_SIZES.action}em`;\n};\n\nexport function getIconSvg(name, options = {}) {\n  const path = ICON_PATHS[name];\n  if (!path) return '';\n  const size = formatIconSize(options.size);\n  const strokeWidth = Number.isFinite(options.strokeWidth) ? options.strokeWidth : 1.5;\n  return `<svg class=\"nc-icon\" viewBox=\"0 0 12 12\" width=\"${size}\" height=\"${size}\" aria-hidden=\"true\" focusable=\"false\"><path d=\"${path}\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"${strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n}\n\n/**\n * Inject the design system CSS into the document\n */\nexport function injectDesignSystemStyles() {\n  injectHudStyleKitStyles();\n  if (document.getElementById('design-system-styles')) return;\n\n  const style = document.createElement('style');\n  style.id = 'design-system-styles';\n  style.textContent = `\n    /* ============================================\n       DESIGN SYSTEM - Base Styles\n       ============================================ */\n\n    .nc-panel {\n      background: linear-gradient(135deg, ${TOKENS.colors.panel} 0%, ${TOKENS.colors.panelLight} 100%);\n      border: 1px solid ${TOKENS.colors.border};\n      border-radius: ${TOKENS.radius.xl};\n      backdrop-filter: blur(12px);\n      box-shadow: ${TOKENS.shadow.lg};\n    }\n\n    .nc-panel-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: ${TOKENS.spacing.lg} ${TOKENS.spacing.xl};\n      border-bottom: 1px solid ${TOKENS.colors.border};\n    }\n\n    .nc-panel-title {\nmargin-right: 0.5rem;\n      margin: 0;\n      font-size: ${TOKENS.font.sizeXl};\n      font-weight: ${TOKENS.font.weight.medium};\n      color: ${TOKENS.colors.text};\n      font-family: ${TOKENS.font.family};\n    }\n\n    .nc-panel-body {\n      padding: ${TOKENS.spacing.xl};\n    }\n\n    .nc-panel-footer {\n      display: flex;\n      justify-content: flex-end;\n      gap: ${TOKENS.spacing.sm};\n      padding: ${TOKENS.spacing.lg} ${TOKENS.spacing.xl};\n      border-top: 1px solid ${TOKENS.colors.border};\n    }\n\n    /* ============================================\n       Buttons\n       ============================================ */\n\n    .nc-btn {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      gap: ${TOKENS.spacing.xs};\n      padding: ${TOKENS.spacing.sm} ${TOKENS.spacing.lg};\n      border: none;\n      border-radius: ${TOKENS.radius.md};\n      font-size: ${TOKENS.font.sizeMd};\n      font-weight: ${TOKENS.font.weight.medium};\n      font-family: ${TOKENS.font.family};\n      cursor: pointer;\n      transition: all ${TOKENS.transition.fast};\n      white-space: nowrap;\n    }\n\n    .nc-btn:disabled {\n      opacity: 0.5;\n      cursor: not-allowed;\n    }\n\n    .nc-btn-primary {\n      background: linear-gradient(135deg, ${TOKENS.colors.accent} 0%, ${TOKENS.colors.accentActive} 100%);\n      color: #000000;;\n    }\n\n    .nc-btn-primary:hover:not(:disabled) {\n      filter: brightness(1.15);\n      box-shadow: ${TOKENS.shadow.glow};\n    }\n\n    .nc-btn-secondary {\n      background: rgba(255, 255, 255, 0.08);\n      color: ${TOKENS.colors.text};\n      border: 1px solid ${TOKENS.colors.border};\n    }\n\n    .nc-btn-secondary:hover:not(:disabled) {\n      background: rgba(255, 255, 255, 0.12);\n      border-color: ${TOKENS.colors.borderHover};\n    }\n\n    .nc-btn-ghost {\n      background: transparent;\n      color: ${TOKENS.colors.textMuted};\n    }\n\n    .nc-btn-ghost:hover:not(:disabled) {\n      background: rgba(255, 255, 255, 0.05);\n      color: ${TOKENS.colors.text};\n    }\n\n    .nc-btn-danger {\n      background: rgba(255, 107, 107, 0.15);\n      color: ${TOKENS.colors.danger};\n      border: 1px solid rgba(255, 107, 107, 0.3);\n    }\n\n    .nc-btn-danger:hover:not(:disabled) {\n      background: rgba(255, 107, 107, 0.25);\n    }\n\n    .nc-btn-icon {\n      padding: ${TOKENS.spacing.sm};\n      min-width: 32px;\n      min-height: 32px;\n    }\n\n    .nc-btn-sm {\n      padding: ${TOKENS.spacing.xs} ${TOKENS.spacing.sm};\n      font-size: ${TOKENS.font.sizeSm};\n    }\n\n    .nc-btn-lg {\n      padding: ${TOKENS.spacing.md} ${TOKENS.spacing.xl};\n      font-size: ${TOKENS.font.sizeLg};\n    }\n\n    .nc-icon {\n      display: block;\n    }\n\n    /* ============================================\n       Toggle Button (replaces checkboxes)\n       ============================================ */\n\n    .nc-toggle {\n      position: relative;\n      display: inline-flex;\n      align-items: center;\n      gap: ${TOKENS.spacing.sm};\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .nc-toggle-input {\n      position: absolute;\n      opacity: 0;\n      width: 0;\n      height: 0;\n    }\n\n    .nc-toggle-track {\n      position: relative;\n      width: 36px;\n      height: 20px;\n      background: rgba(255, 255, 255, 0.1);\n      border: 1px solid ${TOKENS.colors.border};\n      border-radius: 10px;\n      transition: all ${TOKENS.transition.fast};\n    }\n\n    .nc-toggle-thumb {\n      position: absolute;\n      top: 2px;\n      left: 2px;\n      width: 14px;\n      height: 14px;\n      background: ${TOKENS.colors.textMuted};\n      border-radius: ${TOKENS.radius.round};\n      transition: all ${TOKENS.transition.fast};\n    }\n\n    .nc-toggle-input:checked + .nc-toggle-track {\n      background: ${TOKENS.colors.accent};\n      border-color: ${TOKENS.colors.accent};\n    }\n\n    .nc-toggle-input:checked + .nc-toggle-track .nc-toggle-thumb {\n      left: 18px;\n      background: ${TOKENS.colors.text};\n    }\n\n    .nc-toggle:hover .nc-toggle-track {\n      border-color: ${TOKENS.colors.borderHover};\n    }\n\n    .nc-toggle-label {\n      font-size: ${TOKENS.font.sizeSm};\n      color: ${TOKENS.colors.textMuted};\n    }\n\n    /* ============================================\n       Inputs\n       ============================================ */\n\n    .nc-input-group {\n      display: flex;\n      flex-direction: column;\n      gap: ${TOKENS.spacing.xs};\n    }\n\n    .nc-label {\n      font-size: ${TOKENS.font.sizeXs};\n      font-weight: ${TOKENS.font.weight.medium};\n      color: ${TOKENS.colors.textDim};\n      text-transform: uppercase;\n      letter-spacing: 0.05em;\n    }\n\n    .nc-input,\n    .nc-select,\n    .nc-textarea {\n      width: 100%;\n      padding: ${TOKENS.spacing.sm} ${TOKENS.spacing.md};\n      background: ${TOKENS.colors.inputBg};\n      border: 1px solid ${TOKENS.colors.border};\n      border-radius: ${TOKENS.radius.md};\n      color: ${TOKENS.colors.text};\n      font-size: ${TOKENS.font.sizeMd};\n      font-family: ${TOKENS.font.family};\n      transition: all ${TOKENS.transition.fast};\n    }\n\n    .nc-input:focus,\n    .nc-select:focus,\n    .nc-textarea:focus {\n      outline: none;\n      border-color: ${TOKENS.colors.accent};\n      box-shadow: 0 0 0 2px rgba(74, 144, 217, 0.2);\n    }\n\n    .nc-input::placeholder {\n      color: ${TOKENS.colors.textDim};\n    }\n\n    .nc-textarea {\n      resize: none;\n      min-height: 80px;\n    }\n\n    .nc-select {\n      appearance: none;\n      background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23ffffff80' d='M6 8L2 4h8z'/%3E%3C/svg%3E\");\n      background-repeat: no-repeat;\n      background-position: right 12px center;\n      padding-right: 32px;\n    }\n\n    /* ============================================\n       Collapsible Section\n       ============================================ */\n\n    .nc-collapsible {\n      border: 1px solid rgba(255, 255, 255, 0.12);\n      border-radius: ${TOKENS.radius.xl};\n      background: rgba(255, 255, 255, 0.03);\n      overflow: hidden;\n      margin-bottom: ${TOKENS.spacing.sm};\n    }\n\n    .nc-collapsible-header {\n      display: flex;\n      align-items: center;\n      gap: ${TOKENS.spacing.sm};\n      width: 100%;\n      padding: ${TOKENS.spacing.sm} ${TOKENS.spacing.md};\n      background: transparent;\n      border: 0;\n      cursor: pointer;\n      user-select: none;\n      transition: background ${TOKENS.transition.fast};\n    }\n\n    .nc-collapsible-header:hover {\n      background: rgba(255, 255, 255, 0.06);\n    }\n\n    .nc-collapsible-title {\n      flex: 1;\n      text-align: left;\n      font-size: ${TOKENS.font.sizeXs};\n      font-weight: ${TOKENS.font.weight.semibold};\n      color: ${TOKENS.colors.text};\n      text-transform: uppercase;\n      letter-spacing: 0.08em;\n    }\n\n    .nc-collapsible-icon {\n      width: 12px;\n      font-size: 9px;\n      color: ${TOKENS.colors.textDim};\n      transition: transform ${TOKENS.transition.fast};\n      transform: rotate(-90deg);\n      transform-origin: center;\n    }\n\n    .nc-collapsible.open .nc-collapsible-icon {\n      transform: rotate(0deg);\n    }\n\n    .nc-collapsible-body {\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height ${TOKENS.transition.normal};\n    }\n\n    .nc-collapsible.open .nc-collapsible-body {\n      max-height: 2000px;\n    }\n\n    .nc-collapsible-content {\n      padding: ${TOKENS.spacing.md};\n      border-top: 1px solid rgba(255, 255, 255, 0.09);\n    }\n\n    /* Section quick toggle button */\n    .nc-section-toggle {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 20px;\n      height: 20px;\n      margin-right: ${TOKENS.spacing.sm};\n      margin-left: auto;\n      padding: 0;\n      border: 1px solid ${TOKENS.colors.border};\n      border-radius: ${TOKENS.radius.sm};\n      background: rgba(255, 255, 255, 0.03);\n      cursor: pointer;\n      transition: all ${TOKENS.transition.fast};\n      flex-shrink: 0;\n    }\n\n    .nc-section-toggle:hover {\n      background: rgba(255, 255, 255, 0.08);\n      border-color: rgba(255, 255, 255, 0.3);\n    }\n\n    .nc-section-toggle .toggle-indicator {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      background: rgba(255, 255, 255, 0.2);\n      transition: all ${TOKENS.transition.fast};\n    }\n\n    .nc-section-toggle.enabled .toggle-indicator {\n      background: ${TOKENS.colors.accent};\n      box-shadow: 0 0 6px ${TOKENS.colors.accentHover};\n    }\n\n    .nc-section-toggle:active {\n      transform: scale(0.9);\n    }\n\n    /* ============================================\n       Cards & List Items\n       ============================================ */\n\n    .nc-card {\n      padding: ${TOKENS.spacing.lg};\n      background: rgba(255, 255, 255, 0.03);\n      border: 1px solid ${TOKENS.colors.border};\n      border-radius: ${TOKENS.radius.lg};\n      transition: all ${TOKENS.transition.fast};\n    }\n\n    .nc-card:hover {\n      background: rgba(255, 255, 255, 0.05);\n      border-color: ${TOKENS.colors.borderHover};\n    }\n\n    .nc-card-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: ${TOKENS.spacing.sm};\n    }\n\n    .nc-card-title {\n      font-size: ${TOKENS.font.sizeLg};\n      font-weight: ${TOKENS.font.weight.medium};\n      color: ${TOKENS.colors.text};\n    }\n\n    .nc-card-meta {\n      font-size: ${TOKENS.font.sizeXs};\n      color: ${TOKENS.colors.textDim};\n    }\n\n    .nc-card-actions {\n      display: flex;\n      gap: ${TOKENS.spacing.xs};\n    }\n\n    /* ============================================\n       Badges\n       ============================================ */\n\n    .nc-badge {\n      display: inline-block;\n      padding: 2px ${TOKENS.spacing.sm};\n      font-size: 9px;\n      font-weight: ${TOKENS.font.weight.semibold};\n      text-transform: uppercase;\n      letter-spacing: 0.03em;\n      border-radius: ${TOKENS.radius.sm};\n    }\n\n    .nc-badge-default {\n      background: rgba(255, 255, 255, 0.1);\n      color: ${TOKENS.colors.textMuted};\n    }\n\n    .nc-badge-primary {\n      background: rgba(74, 144, 217, 0.2);\n      color: ${TOKENS.colors.accent};\n    }\n\n    .nc-badge-success {\n      background: rgba(80, 200, 120, 0.2);\n      color: ${TOKENS.colors.success};\n    }\n\n    .nc-badge-warning {\n      background: rgba(var(--accent-rgb, 255, 174, 0), 0.2);\n      color: ${TOKENS.colors.warning};\n    }\n\n    .nc-badge-danger {\n      background: rgba(255, 107, 107, 0.2);\n      color: ${TOKENS.colors.danger};\n    }\n\n    /* ============================================\n       Empty State\n       ============================================ */\n\n    .nc-empty {\n      text-align: center;\n      padding: ${TOKENS.spacing.xxl};\n    }\n\n    .nc-empty-icon {\n      font-size: 48px;\n      margin-bottom: ${TOKENS.spacing.lg};\n      opacity: 0.5;\n    }\n\n    .nc-empty-text {\n      color: ${TOKENS.colors.textDim};\n      font-size: ${TOKENS.font.sizeMd};\n    }\n\n    .nc-empty-subtext {\n      color: ${TOKENS.colors.textDim};\n      font-size: ${TOKENS.font.sizeSm};\n      margin-top: ${TOKENS.spacing.xs};\n    }\n\n    /* ============================================\n       Messages (Error, Success, Info)\n       ============================================ */\n\n    .nc-message {\n      padding: ${TOKENS.spacing.md} ${TOKENS.spacing.lg};\n      border-radius: ${TOKENS.radius.lg};\n      font-size: ${TOKENS.font.sizeSm};\n      margin-bottom: ${TOKENS.spacing.lg};\n    }\n\n    .nc-message-error {\n      background: rgba(255, 107, 107, 0.1);\n      border: 1px solid rgba(255, 107, 107, 0.3);\n      color: ${TOKENS.colors.danger};\n    }\n\n    .nc-message-success {\n      background: rgba(80, 200, 120, 0.1);\n      border: 1px solid rgba(80, 200, 120, 0.3);\n      color: ${TOKENS.colors.success};\n    }\n\n    .nc-message-info {\n      background: rgba(74, 144, 217, 0.1);\n      border: 1px solid rgba(74, 144, 217, 0.3);\n      color: ${TOKENS.colors.accent};\n    }\n\n    /* ============================================\n       Form Row (horizontal layout)\n       ============================================ */\n\n    .nc-form-row {\n      display: flex;\n      gap: ${TOKENS.spacing.md};\n      align-items: flex-end;\n      flex-wrap: wrap;\n    }\n\n    .nc-form-row .nc-input-group {\n      flex: 1;\n      min-width: 120px;\n    }\n\n    /* ============================================\n       Loading Spinner\n       ============================================ */\n\n    .nc-loading {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: ${TOKENS.spacing.sm};\n      padding: ${TOKENS.spacing.xl};\n      color: ${TOKENS.colors.textDim};\n    }\n\n    .nc-spinner {\n      width: 20px;\n      height: 20px;\n      border: 2px solid ${TOKENS.colors.border};\n      border-top-color: ${TOKENS.colors.accent};\n      border-radius: ${TOKENS.radius.round};\n      animation: nc-spin 0.8s linear infinite;\n    }\n\n    @keyframes nc-spin {\n      to { transform: rotate(360deg); }\n    }\n\n    /* ============================================\n       Divider\n       ============================================ */\n\n    .nc-divider {\n      height: 1px;\n      background: ${TOKENS.colors.border};\n      margin: ${TOKENS.spacing.lg} 0;\n    }\n\n    /* ============================================\n       Close Button\n       ============================================ */\n\n    .nc-close {\n      background: none;\n      border: none;\n      color: ${TOKENS.colors.textDim};\n      font-size: 24px;\n      cursor: pointer;\n      padding: 0;\n      line-height: 1;\n      transition: color ${TOKENS.transition.fast};\n    }\n\n    .nc-close:hover {\n      color: ${TOKENS.colors.text};\n    }\n\n    /* ============================================\n       Sidebar Layout\n       ============================================ */\n\n    .nc-sidebar {\n      position: absolute;\n      top: 0;\n      bottom: 0;\n      width: min(380px, 90vw);\n      display: flex;\n      flex-direction: column;\n      background: linear-gradient(135deg, ${TOKENS.colors.panel} 0%, ${TOKENS.colors.panelLight} 100%);\n      border: 1px solid ${TOKENS.colors.border};\n      backdrop-filter: blur(16px);\n      box-shadow: ${TOKENS.shadow.lg};\n      z-index: 100;\n      transition: transform ${TOKENS.transition.normal};\n    }\n\n    .nc-sidebar-left {\n      left: 0;\n      border-radius: 0 ${TOKENS.radius.xl} ${TOKENS.radius.xl} 0;\n      transform: translateX(-100%);\n    }\n\n    .nc-sidebar-left.open {\n      transform: translateX(0);\n    }\n\n    .nc-sidebar-right {\n      right: 0;\n      border-radius: ${TOKENS.radius.xl} 0 0 ${TOKENS.radius.xl};\n      transform: translateX(100%);\n    }\n\n    .nc-sidebar-right.open {\n      transform: translateX(0);\n    }\n\n    .nc-sidebar-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: ${TOKENS.spacing.lg} ${TOKENS.spacing.xl};\n      border-bottom: 1px solid ${TOKENS.colors.border};\n      flex-shrink: 0;\n    }\n\n    .nc-sidebar-title {\n      font-size: ${TOKENS.font.sizeLg};\n      font-weight: ${TOKENS.font.weight.medium};\n      color: ${TOKENS.colors.text};\n      font-family: ${TOKENS.font.family};\n    }\n\n    .nc-sidebar-body {\n      flex: 1;\n      overflow-y: auto;\n      padding: ${TOKENS.spacing.lg};\n    }\n\n    .nc-sidebar-footer {\n      padding: ${TOKENS.spacing.lg};\n      border-top: 1px solid ${TOKENS.colors.border};\n      flex-shrink: 0;\n    }\n\n    /* ============================================\n       HUD Toggle Button\n       ============================================ */\n\n    .nc-hud-toggle {\n      position: fixed;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 40px;\n      height: 40px;\n      background: linear-gradient(135deg, ${TOKENS.colors.panel} 0%, ${TOKENS.colors.panelLight} 100%);\n      border: 1px solid ${TOKENS.colors.border};\n      border-radius: ${TOKENS.radius.lg};\n      color: ${TOKENS.colors.textMuted};\n      cursor: pointer;\n      z-index: 101;\n      transition: all ${TOKENS.transition.fast};\n      backdrop-filter: blur(8px);\n    }\n\n    .nc-hud-toggle:hover {\n      border-color: ${TOKENS.colors.borderHover};\n      color: ${TOKENS.colors.text};\n    }\n\n    .nc-hud-toggle.active {\n      background: ${TOKENS.colors.accent};\n      border-color: ${TOKENS.colors.accent};\n      color: ${TOKENS.colors.text};\n    }\n\n    /* ============================================\n       Metric Display\n       ============================================ */\n\n    .nc-metric {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: ${TOKENS.spacing.xs} 0;\n      font-size: ${TOKENS.font.sizeSm};\n    }\n\n    .nc-metric-label {\n      color: ${TOKENS.colors.textDim};\n    }\n\n    .nc-metric-value {\n      color: ${TOKENS.colors.text};\n      font-family: ${TOKENS.font.family};\n    }\n\n    /* ============================================\n       Range Slider with Value\n       ============================================ */\n\n    .nc-range-group {\n      display: flex;\n      flex-direction: column;\n      gap: ${TOKENS.spacing.sm};\n    }\n\n    .nc-range-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      gap: ${TOKENS.spacing.sm};\n      margin-bottom: ${TOKENS.spacing.xs};\n    }\n\n    .nc-range-value {\n      min-width: 52px;\n      padding: 2px 7px;\n      border: 1px solid ${TOKENS.colors.border};\n      background: rgba(255, 255, 255, 0.04);\n      font-size: ${TOKENS.font.sizeSm};\n      color: ${TOKENS.colors.accent};\n      font-family: ${TOKENS.font.family};\n      text-align: right;\n      cursor: text;\n      user-select: text;\n    }\n\n    .nc-range {\n      width: 100%;\n      height: 14px;\n      background: transparent;\n      appearance: none;\n      cursor: pointer;\n    }\n\n    .nc-range::-webkit-slider-thumb {\n      appearance: none;\n      width: 10px;\n      height: 18px;\n      background: ${TOKENS.colors.accent};\n      border-radius: 0;\n      cursor: pointer;\n      transition: transform ${TOKENS.transition.fast};\n    }\n\n    .nc-range::-webkit-slider-thumb:hover {\n      transform: scale(1.2);\n    }\n\n    .nc-range::-moz-range-thumb {\n      width: 10px;\n      height: 18px;\n      background: ${TOKENS.colors.accent};\n      border: none;\n      border-radius: 0;\n      cursor: pointer;\n    }\n  `;\n  document.head.appendChild(style);\n}\n\nexport function injectHudStyleKitStyles() {\n  if (typeof document === 'undefined') return;\n  let link = document.getElementById('nca-hud-style-kit');\n  // Re-appending an existing stylesheet link reparses it and restarts every\n  // CSS animation which it owns. Several independently initialized panels\n  // call this helper, so the former append-on-every-call behavior repeatedly\n  // returned dynamic surfaces (including sidebar search) to their opacity: 0\n  // starting frame during boot.\n  if (link) return;\n  link = document.createElement('link');\n  link.id = 'nca-hud-style-kit';\n  link.rel = 'stylesheet';\n  link.href = nclpDashboardStyleUrl;\n  document.head.appendChild(link);\n}\n\n/**\n * Component factory functions\n */\n\nconst escapeHtml = (value) => String(value ?? '').replace(/[&<>\"']/g, (char) => ({\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;',\n}[char]));\n\nexport function setHudButtonDisabled(el, disabled = false) {\n  if (!el) return;\n  const isDisabled = Boolean(disabled);\n  el.classList.toggle('is-disabled', isDisabled);\n  el.setAttribute('aria-disabled', isDisabled ? 'true' : 'false');\n  if (el.getAttribute('role') === 'button') {\n    el.tabIndex = isDisabled ? -1 : 0;\n  }\n}\n\nexport function createHudButtonElement(options = {}) {\n  const el = document.createElement('div');\n  const className = options.className || '';\n  el.className = className.trim();\n  el.setAttribute('role', 'button');\n  el.tabIndex = 0;\n  el.dataset.hudButton = 'true';\n  if (options.ariaLabel) el.setAttribute('aria-label', options.ariaLabel);\n  if (options.title) el.title = options.title;\n  if (options.html != null) {\n    el.innerHTML = options.html;\n  } else {\n    el.textContent = options.text ?? '';\n  }\n\n  Object.defineProperty(el, 'disabled', {\n    configurable: true,\n    get: () => el.getAttribute('aria-disabled') === 'true',\n    set: (value) => setHudButtonDisabled(el, value),\n  });\n  setHudButtonDisabled(el, options.disabled);\n\n  el.addEventListener('click', (event) => {\n    if (!el.disabled) return;\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  }, true);\n\n  el.addEventListener('keydown', (event) => {\n    if (el.disabled) return;\n    if (event.key !== 'Enter' && event.key !== ' ') return;\n    event.preventDefault();\n    el.click();\n  });\n\n  if (options.onClick) el.addEventListener('click', options.onClick);\n  return el;\n}\n\nexport function createButton(text, options = {}) {\n  const className = `nc-btn ${options.variant ? `nc-btn-${options.variant}` : 'nc-btn-secondary'} ${options.size ? `nc-btn-${options.size}` : ''} ${options.className || ''}`.trim();\n  const html = options.icon\n    ? `<span class=\"hud-btn-icon\" aria-hidden=\"true\">${options.icon}</span><span>${escapeHtml(text)}</span>`\n    : null;\n  return createHudButtonElement({\n    className,\n    text,\n    html,\n    ariaLabel: options.ariaLabel,\n    title: options.title,\n    disabled: options.disabled,\n    onClick: options.onClick,\n  });\n}\n\nexport function createToggle(label, checked = false, onChange = null) {\n  const wrapper = document.createElement('label');\n  wrapper.className = 'nc-toggle';\n\n  const input = document.createElement('input');\n  input.type = 'checkbox';\n  input.className = 'nc-toggle-input';\n  input.checked = checked;\n  if (onChange) input.addEventListener('change', () => onChange(input.checked));\n\n  const track = document.createElement('span');\n  track.className = 'nc-toggle-track';\n  track.innerHTML = '<span class=\"nc-toggle-thumb\"></span>';\n\n  const labelEl = document.createElement('span');\n  labelEl.className = 'nc-toggle-label';\n  labelEl.textContent = label;\n\n  wrapper.appendChild(input);\n  wrapper.appendChild(track);\n  wrapper.appendChild(labelEl);\n\n  return { wrapper, input };\n}\n\nexport function createInput(options = {}) {\n  const group = document.createElement('div');\n  group.className = 'nc-input-group';\n\n  if (options.label) {\n    const label = document.createElement('label');\n    label.className = 'nc-label';\n    label.textContent = options.label;\n    group.appendChild(label);\n  }\n\n  const input = document.createElement('input');\n  input.type = options.type || 'text';\n  input.className = 'nc-input';\n  if (options.placeholder) input.placeholder = options.placeholder;\n  if (options.value !== undefined) input.value = options.value;\n  if (options.onChange) input.addEventListener('input', () => options.onChange(input.value));\n\n  group.appendChild(input);\n  return { group, input };\n}\n\nexport function createSelect(options = {}) {\n  const group = document.createElement('div');\n  group.className = 'nc-input-group';\n\n  if (options.label) {\n    const label = document.createElement('label');\n    label.className = 'nc-label';\n    label.textContent = options.label;\n    group.appendChild(label);\n  }\n\n  const select = document.createElement('select');\n  select.className = 'nc-select';\n\n  (options.options || []).forEach((opt) => {\n    const optionEl = document.createElement('option');\n    optionEl.value = typeof opt === 'object' ? opt.value : opt;\n    optionEl.textContent = typeof opt === 'object' ? opt.label : opt;\n    if (options.value === optionEl.value) optionEl.selected = true;\n    select.appendChild(optionEl);\n  });\n\n  if (options.onChange) select.addEventListener('change', () => options.onChange(select.value));\n\n  group.appendChild(select);\n  return { group, select };\n}\n\nexport function createRangeSlider(options = {}) {\n  const group = document.createElement('div');\n  group.className = 'nc-range-group';\n\n  const header = document.createElement('div');\n  header.className = 'nc-range-header';\n\n  if (options.label) {\n    const label = document.createElement('span');\n    label.className = 'nc-label';\n    label.textContent = options.label;\n    header.appendChild(label);\n  }\n\n  const valueDisplay = document.createElement('span');\n  valueDisplay.className = 'nc-range-value';\n  valueDisplay.textContent = options.value ?? options.min ?? 0;\n  valueDisplay.tabIndex = 0;\n  valueDisplay.spellcheck = false;\n  valueDisplay.setAttribute('contenteditable', 'plaintext-only');\n  valueDisplay.setAttribute('role', 'spinbutton');\n  valueDisplay.setAttribute('aria-label', options.label ? `${options.label} value` : 'Range value');\n  header.appendChild(valueDisplay);\n\n  const range = document.createElement('input');\n  range.type = 'range';\n  range.className = 'nc-range';\n  range.min = options.min ?? 0;\n  range.max = options.max ?? 100;\n  range.step = options.step ?? 1;\n  range.value = options.value ?? options.min ?? 0;\n\n  const setValueA11y = () => {\n    valueDisplay.dataset.rawValue = range.value;\n    valueDisplay.setAttribute('aria-valuemin', range.min);\n    valueDisplay.setAttribute('aria-valuemax', range.max);\n    valueDisplay.setAttribute('aria-valuenow', range.value);\n  };\n  const selectValueText = () => {\n    const selection = window.getSelection?.();\n    if (!selection) return;\n    const rangeSelection = document.createRange();\n    rangeSelection.selectNodeContents(valueDisplay);\n    selection.removeAllRanges();\n    selection.addRange(rangeSelection);\n  };\n  const clampToRange = (value) => {\n    const min = Number.parseFloat(range.min);\n    const max = Number.parseFloat(range.max);\n    const step = Number.parseFloat(range.step);\n    let next = value;\n    if (Number.isFinite(min)) next = Math.max(min, next);\n    if (Number.isFinite(max)) next = Math.min(max, next);\n    if (Number.isFinite(step) && step > 0 && Number.isFinite(min)) {\n      next = min + Math.round((next - min) / step) * step;\n    }\n    return Number.isFinite(step) && step > 0\n      ? Number.parseFloat(next.toFixed(6))\n      : next;\n  };\n  const commitValueDisplay = () => {\n    const parsed = Number.parseFloat(String(valueDisplay.textContent || '').replace(',', '.'));\n    if (!Number.isFinite(parsed)) {\n      valueDisplay.textContent = range.value;\n      setValueA11y();\n      return;\n    }\n    range.value = String(clampToRange(parsed));\n    range.dispatchEvent(new Event('input', { bubbles: true }));\n  };\n\n  range.addEventListener('input', () => {\n    valueDisplay.textContent = range.value;\n    setValueA11y();\n    if (options.onChange) options.onChange(parseFloat(range.value));\n  });\n  valueDisplay.addEventListener('focus', () => {\n    valueDisplay.dataset.editing = 'true';\n    requestAnimationFrame(selectValueText);\n  });\n  valueDisplay.addEventListener('blur', () => {\n    delete valueDisplay.dataset.editing;\n    commitValueDisplay();\n  });\n  valueDisplay.addEventListener('keydown', (event) => {\n    if (event.key === 'Enter') {\n      event.preventDefault();\n      valueDisplay.blur();\n    } else if (event.key === 'Escape') {\n      event.preventDefault();\n      valueDisplay.textContent = range.value;\n      valueDisplay.blur();\n    }\n  });\n  valueDisplay.addEventListener('paste', (event) => {\n    event.preventDefault();\n    const text = event.clipboardData?.getData('text/plain') || '';\n    document.execCommand?.('insertText', false, text.replace(/[^\\d.,+-]/g, ''));\n  });\n  setValueA11y();\n\n  group.appendChild(header);\n  group.appendChild(range);\n\n  return { group, range, valueDisplay };\n}\n\nexport function createCollapsible(title, content, open = false) {\n  const section = document.createElement('div');\n  section.className = `nc-collapsible ${open ? 'open' : ''}`;\n\n  const header = document.createElement('div');\n  header.className = 'nc-collapsible-header';\n  header.innerHTML = `\n    <span class=\"nc-collapsible-title\">${title}</span>\n    <span class=\"nc-collapsible-icon\">▼</span>\n  `;\n\n  const body = document.createElement('div');\n  body.className = 'nc-collapsible-body';\n\n  const contentWrapper = document.createElement('div');\n  contentWrapper.className = 'nc-collapsible-content';\n\n  if (typeof content === 'string') {\n    contentWrapper.innerHTML = content;\n  } else if (content instanceof HTMLElement) {\n    contentWrapper.appendChild(content);\n  }\n\n  body.appendChild(contentWrapper);\n\n  header.addEventListener('click', () => {\n    const audio = getUiAudioSfx();\n    audio.playResizeBlip();\n    section.classList.toggle('open');\n  });\n\n  section.appendChild(header);\n  section.appendChild(body);\n\n  return { section, contentWrapper };\n}\n\nexport function createCard(options = {}) {\n  const card = document.createElement('div');\n  card.className = 'nc-card';\n\n  if (options.title || options.actions) {\n    const header = document.createElement('div');\n    header.className = 'nc-card-header';\n\n    if (options.title) {\n      const titleEl = document.createElement('div');\n      titleEl.className = 'nc-card-title';\n      titleEl.textContent = options.title;\n      header.appendChild(titleEl);\n    }\n\n    if (options.actions) {\n      const actions = document.createElement('div');\n      actions.className = 'nc-card-actions';\n      options.actions.forEach((action) => actions.appendChild(action));\n      header.appendChild(actions);\n    }\n\n    card.appendChild(header);\n  }\n\n  if (options.meta) {\n    const meta = document.createElement('div');\n    meta.className = 'nc-card-meta';\n    meta.textContent = options.meta;\n    card.appendChild(meta);\n  }\n\n  if (options.content) {\n    if (typeof options.content === 'string') {\n      card.insertAdjacentHTML('beforeend', options.content);\n    } else {\n      card.appendChild(options.content);\n    }\n  }\n\n  return card;\n}\n\nexport function createBadge(text, variant = 'default') {\n  const badge = document.createElement('span');\n  badge.className = `nc-badge nc-badge-${variant}`;\n  badge.textContent = text;\n  return badge;\n}\n\nexport function createMessage(text, type = 'info') {\n  const message = document.createElement('div');\n  message.className = `nc-message nc-message-${type}`;\n  message.textContent = text;\n  return message;\n}\n\nexport function createEmpty(icon, text, subtext = '') {\n  const empty = document.createElement('div');\n  empty.className = 'nc-empty';\n  empty.innerHTML = `\n    <div class=\"nc-empty-icon\">${icon}</div>\n    <div class=\"nc-empty-text\">${text}</div>\n    ${subtext ? `<div class=\"nc-empty-subtext\">${subtext}</div>` : ''}\n  `;\n  return empty;\n}\n\nexport function createLoading(text = 'Loading...') {\n  const loading = document.createElement('div');\n  loading.className = 'nc-loading';\n  loading.innerHTML = `<div class=\"nc-spinner\"></div><span>${text}</span>`;\n  return loading;\n}\n\nexport function createDivider() {\n  const divider = document.createElement('div');\n  divider.className = 'nc-divider';\n  return divider;\n}\n\nexport function createMetric(label, value) {\n  const metric = document.createElement('div');\n  metric.className = 'nc-metric';\n  metric.innerHTML = `\n    <span class=\"nc-metric-label\">${label}</span>\n    <span class=\"nc-metric-value\">${value}</span>\n  `;\n  return metric;\n}\n","/**\n * IncidentApiService\n *\n * Browser client for the canonical NOCLIP incident relay. PulsePoint protocol,\n * caching, rate control, and replay remain backend concerns.\n */\n\nimport { getAuthService } from '../auth/AuthService.js';\nimport { getBackendApiBase } from '../shared/backend.js';\n\nconst API_BASE = getBackendApiBase();\n\nasync function readJson(response, fallbackMessage) {\n  const data = await response.json().catch(() => ({}));\n  if (!response.ok) throw new Error(data.error || fallbackMessage);\n  return data;\n}\n\nexport class IncidentApiService {\n  constructor() {\n    this.authService = getAuthService();\n  }\n\n  async searchAgencies(query) {\n    const search = new URLSearchParams();\n    if (query) search.set('query', String(query));\n    const response = await this.authService.authenticatedFetch(\n      `${API_BASE}/incidents/agencies?${search.toString()}`,\n    );\n    const data = await readJson(response, 'Failed to search agencies');\n    return data.agencies || [];\n  }\n\n  async getAgencies(ids = []) {\n    const search = new URLSearchParams();\n    if (Array.isArray(ids) && ids.length) search.set('ids', ids.join(','));\n    const response = await this.authService.authenticatedFetch(\n      `${API_BASE}/incidents/agencies?${search.toString()}`,\n    );\n    const data = await readJson(response, 'Failed to load agencies');\n    return data.agencies || [];\n  }\n\n  async getIncidents(params = {}) {\n    const search = new URLSearchParams();\n    Object.entries(params).forEach(([key, value]) => {\n      if (value === undefined || value === null || value === '') return;\n      if (Array.isArray(value)) {\n        if (value.length) search.set(key, value.join(','));\n        return;\n      }\n      search.set(key, String(value));\n    });\n    const suffix = search.size ? `?${search.toString()}` : '';\n    const response = await this.authService.authenticatedFetch(`${API_BASE}/incidents/near${suffix}`);\n    return readJson(response, 'Failed to fetch incidents');\n  }\n}\n\nlet incidentApiServiceInstance = null;\n\nexport function getIncidentApiService() {\n  if (!incidentApiServiceInstance) incidentApiServiceInstance = new IncidentApiService();\n  return incidentApiServiceInstance;\n}\n","/**\n * IncidentPresentation\n *\n * Shared, compact display text for incident labels and lists.  The incident\n * feed supplies the emergency type; a place resolver can add a named building\n * or business without changing the raw incident record.\n */\n\nimport { formatIncidentTypeLabel } from './IncidentTypes.js';\n\nconst cleanText = (value) => (value == null ? '' : String(value).replace(/\\s+/g, ' ').trim());\nconst shortAddress = (value) => cleanText(value).split(',')[0]?.trim() || '';\n\nexport const buildIncidentPresentation = (incident = {}) => {\n  const callType = formatIncidentTypeLabel(incident.callType, {\n    includeCode: false,\n    fallback: '',\n  });\n  const placeName = cleanText(incident.placeName || incident.place?.name);\n  const placeType = cleanText(incident.placeType || incident.place?.type);\n  const address = cleanText(incident.address);\n  const locationName = placeName || shortAddress(address);\n\n  const title = callType && locationName\n    ? `${callType} at ${locationName}`\n    : (callType || locationName || cleanText(incident.id) || 'Incident');\n\n  // A place category is intentionally shorter than a street address. It sits\n  // alongside range and elapsed time in the compact in-scene label.\n  const subheader = placeType;\n\n  return { title, subheader, placeName, placeType, address };\n};\n","/**\n * Renderable scene-sensor contracts.\n *\n * This registry is intentionally narrower than the backend data catalog. A\n * source belongs here only when SensorEventStore can preserve provider geometry\n * and SensorOverlay can render it. Non-geospatial OSINT and products owned by\n * dedicated overlays remain available through the Live Catalog, global-signal\n * layers, environment layers, or agent tools.\n */\n\nexport const SENSOR_SOURCES = {\n  usgs_earthquake: {\n    id: 'usgs_earthquake', label: 'USGS Earthquakes', transport: 'rest', auth: 'anonymous', tier: 1,\n    category: 'seismic', proxyPath: '/sensors/usgs/earthquakes', queryProxyPath: '/sensors/usgs/earthquakes/query',\n    pollIntervalMs: 60_000, cacheControlSec: 60, confidenceClass: 'sensor', licenseNotes: 'Public domain (USGS)',\n  },\n  emsc: {\n    id: 'emsc', label: 'EMSC SeismicPortal', transport: 'websocket', auth: 'anonymous', tier: 1,\n    category: 'seismic', wsUrl: 'wss://www.seismicportal.eu/standing_order/websocket', proxyPath: '/sensors/emsc/events',\n    pollIntervalMs: 0, cacheControlSec: 30, confidenceClass: 'sensor', licenseNotes: 'EMSC public data',\n  },\n  geonet: {\n    id: 'geonet', label: 'GeoNet New Zealand', transport: 'rest', auth: 'anonymous', tier: 1,\n    category: 'seismic', proxyPath: '/sensors/geonet/quakes', newsProxyPath: '/sensors/geonet/news',\n    pollIntervalMs: 300_000, cacheControlSec: 60, confidenceClass: 'sensor', licenseNotes: 'CC BY 3.0 NZ',\n  },\n  usgs_volcano: {\n    id: 'usgs_volcano', label: 'USGS Volcanoes', transport: 'rest', auth: 'anonymous', tier: 1,\n    category: 'volcanic', proxyPath: '/sensors/usgs/volcanoes/elevated', geojsonProxyPath: '/sensors/usgs/volcanoes/geojson',\n    monitoredProxyPath: '/sensors/usgs/volcanoes/monitored', pollIntervalMs: 300_000, cacheControlSec: 300,\n    confidenceClass: 'sensor', licenseNotes: 'Public domain (USGS)',\n  },\n  eonet: {\n    id: 'eonet', label: 'NASA EONET', transport: 'rest', auth: 'anonymous', tier: 1,\n    category: 'natural_event', proxyPath: '/sensors/eonet/events', geojsonProxyPath: '/sensors/eonet/events/geojson',\n    categoriesProxyPath: '/sensors/eonet/categories', pollIntervalMs: 600_000, cacheControlSec: 300,\n    confidenceClass: 'curated', licenseNotes: 'NASA public data',\n  },\n  nws: {\n    id: 'nws', label: 'NWS Weather Alerts', transport: 'rest', auth: 'anonymous', tier: 1,\n    category: 'weather', proxyPath: '/sensors/nws/alerts', pointsProxyPath: '/sensors/nws/points',\n    pollIntervalMs: 120_000, cacheControlSec: 60, confidenceClass: 'sensor', licenseNotes: 'Public domain (NOAA/NWS)',\n  },\n  nhc: {\n    id: 'nhc', label: 'NHC Tropical Cyclones', transport: 'rest', auth: 'anonymous', tier: 1,\n    category: 'weather', proxyPath: '/sensors/nhc/storms', pollIntervalMs: 300_000, cacheControlSec: 300,\n    confidenceClass: 'sensor', licenseNotes: 'Public domain (NOAA/NHC)',\n  },\n  aviation: {\n    id: 'aviation', label: 'AviationWeather', transport: 'rest', auth: 'anonymous', tier: 2,\n    category: 'aviation', proxyPath: '/sensors/aviation/metar', tafProxyPath: '/sensors/aviation/taf',\n    sigmetProxyPath: '/sensors/aviation/sigmet', pollIntervalMs: 60_000, cacheControlSec: 60,\n    confidenceClass: 'sensor', licenseNotes: 'Public domain (NOAA). Max 100 req/min.',\n  },\n  gdacs: {\n    id: 'gdacs', label: 'GDACS', transport: 'rest', auth: 'anonymous', tier: 1,\n    category: 'disaster', proxyPath: '/sensors/gdacs/events', rssProxyPath: '/sensors/gdacs/rss',\n    pollIntervalMs: 360_000, cacheControlSec: 360, confidenceClass: 'curated',\n    licenseNotes: 'GDACS public feed; provider event points retain explicit alert semantics.',\n  },\n};\n\nexport const SENSOR_CATEGORIES = {\n  seismic: { label: 'Seismic', color: 0xff4444 },\n  volcanic: { label: 'Volcanic', color: 0xff8800 },\n  weather: { label: 'Weather', color: 0x44aaff },\n  natural_event: { label: 'Natural Events', color: 0x44cc44 },\n  aviation: { label: 'Aviation', color: 0x4488ff },\n  disaster: { label: 'Disasters', color: 0xff6644 },\n};\n\nexport function getSensorSource(id) {\n  return SENSOR_SOURCES[id] || null;\n}\n\nexport function getAllSensorIds() {\n  return Object.keys(SENSOR_SOURCES);\n}\n\nexport function getSensorsByCategory(category) {\n  return Object.values(SENSOR_SOURCES).filter((source) => source.category === category);\n}\n\nexport function getSensorsByTier(tier) {\n  return Object.values(SENSOR_SOURCES).filter((source) => source.tier === tier);\n}\n","/**\n * Canonical settings/UI contract for the independently selectable\n * OpenInfraMap utility products. Keep renderer group codes out of UI owners.\n */\nexport const OPEN_INFRA_MAP_UTILITY_FILTERS = Object.freeze([\n  Object.freeze({\n    setting: 'power',\n    group: 'P',\n    iconType: 'power-grid',\n    label: 'Power grid',\n    description: 'Transmission and distribution lines, towers, substations, and grid equipment.',\n  }),\n  Object.freeze({\n    setting: 'telecoms',\n    group: 'T',\n    iconType: 'telecoms-network',\n    label: 'Telecoms',\n    description: 'Communication lines and masts.',\n  }),\n  Object.freeze({\n    setting: 'petroleum',\n    group: 'O',\n    iconType: 'oil-gas',\n    label: 'Oil & gas',\n    description: 'Petroleum and gas pipelines, wells, and sites.',\n  }),\n  Object.freeze({\n    setting: 'water',\n    group: 'L',\n    iconType: 'water-utility',\n    label: 'Water',\n    description: 'Mapped utility water pipelines and facilities.',\n  }),\n  Object.freeze({\n    setting: 'internet',\n    group: 'I',\n    iconType: 'internet-infrastructure',\n    label: 'Internet',\n    description: 'Data centers and internet exchanges.',\n  }),\n  Object.freeze({\n    setting: 'solar',\n    group: 'S',\n    iconType: 'solar-generation',\n    label: 'Solar generation',\n    description: 'Solar generators, arrays, and mapped generation areas.',\n  }),\n  Object.freeze({\n    setting: 'nuclear',\n    group: 'N',\n    iconType: 'nuclear-energy',\n    label: 'Nuclear plants',\n    description: 'Power plants explicitly tagged with nuclear generation.',\n  }),\n]);\n\nexport const OPEN_INFRA_MAP_GROUP_BY_SETTING = Object.freeze(\n  Object.fromEntries(OPEN_INFRA_MAP_UTILITY_FILTERS.map(({ setting, group }) => [setting, group])),\n);\n\nexport const OPEN_INFRA_MAP_GROUP_CODES = Object.freeze(\n  OPEN_INFRA_MAP_UTILITY_FILTERS.map(({ group }) => group),\n);\n\nexport function getEnabledOpenInfraMapGroups(layers = {}) {\n  return OPEN_INFRA_MAP_UTILITY_FILTERS\n    .filter(({ setting }) => layers?.[setting] === true)\n    .map(({ group }) => group);\n}\n\nexport function hasEnabledOpenInfraMapGroup(layers = {}) {\n  return OPEN_INFRA_MAP_UTILITY_FILTERS.some(({ setting }) => layers?.[setting] === true);\n}\n\n/** Utility products remain independently selectable from the classic OSM layer master. */\nexport function buildOpenInfraMapLayerPatch(setting, enabled) {\n  if (!Object.prototype.hasOwnProperty.call(OPEN_INFRA_MAP_GROUP_BY_SETTING, setting)) {\n    return null;\n  }\n  const next = enabled === true;\n  return {\n    infrastructure: {\n      layers: { [setting]: next },\n    },\n  };\n}\n","// Presentation rules follow mapsource-app's regional-search/search-results.\n// Keep upstream ambiguity and coverage intact when changing display order.\nexport const validPlaceCoordinate = p => Number.isFinite(p?.lat) && Number.isFinite(p?.lon)\n  && Math.abs(p.lat) <= 90 && Math.abs(p.lon) <= 180;\nexport const explicitSearchRegion = query => /\\b(?:in|near)\\s+[\\p{L}\\p{N}]/iu.test(query) || /,\\s*\\p{L}/u.test(query);\nexport function placeDistance(a, b) {\n  const rad = Math.PI / 180, dLat = (b.lat - a.lat) * rad, dLon = (b.lon - a.lon) * rad;\n  const h = Math.sin(dLat / 2) ** 2 + Math.cos(a.lat * rad) * Math.cos(b.lat * rad) * Math.sin(dLon / 2) ** 2;\n  return 12742017.6 * Math.asin(Math.min(1, Math.sqrt(h)));\n}\nexport function rankPlaceResults(results, query, bias, limit = 8) {\n  const candidates = results.filter(validPlaceCoordinate).map((r, i) => ({ ...r,\n    distanceMeters: validPlaceCoordinate(bias) ? placeDistance(bias, r) : r.distanceMeters,\n    _sourceOrder: i,\n  }));\n  if (validPlaceCoordinate(bias) && !explicitSearchRegion(query)) {\n    const relevance = { exact: 6, prefix: 5, category: 4, partial: 3, fuzzy: 2, indexed: 1 };\n    candidates.sort((a, b) => a.distanceMeters - b.distanceMeters\n      || (relevance[b.match?.type] || 0) - (relevance[a.match?.type] || 0)\n      || (b.match?.score || 0) - (a.match?.score || 0) || a._sourceOrder - b._sourceOrder);\n  }\n  const ranked = candidates.slice(0, limit).map(({ _sourceOrder, ...r }) => r);\n  ranked.lookup = results.lookup;\n  return ranked;\n}\n\nexport function placeResultKey(result, index = 0) {\n  return `${result.placeId || `${result.name || ''}:${result.lat}:${result.lon}`}:${index}`;\n}\nexport function routeStopBadge(index, count, role) {\n  return count === 1 ? role === 'origin' ? 'A' : 'B' : index === 0 ? 'A' : index === count - 1 ? 'B' : String(index);\n}\n","import { validPlaceCoordinate, placeResultKey } from './PlaceSearchResults.js';\n\n/** One bounded, session-only search projection shared by the list, map and\n * surface. Ownership prevents a closed older widget clearing a newer search. */\nexport class PlaceSearchStore {\n  constructor() { this._state = { owner: null, results: [], hovered: null, selected: null }; this._listeners = new Set(); }\n  getState() { return this._state; }\n  subscribe(fn) { this._listeners.add(fn); fn(this._state); return () => this._listeners.delete(fn); }\n  _emit() { for (const fn of this._listeners) fn(this._state); }\n  setResults(owner, results, { onSelect } = {}) {\n    this._onSelect = onSelect;\n    this._state = { owner, results: results.filter(validPlaceCoordinate).slice(0, 20)\n      .map((r, i) => ({ ...r, searchId: placeResultKey(r, i) })), hovered: null, selected: null };\n    this._emit();\n    return this._state.results;\n  }\n  clear(owner) { if (owner !== this._state.owner) return; this.setResults(null, []); }\n  hover(id = null) {\n    id = this._state.results.some(r => r.searchId === id) ? id : null;\n    if (id === this._state.hovered) return;\n    this._state = { ...this._state, hovered: id }; this._emit();\n  }\n  select(id, { activate = false } = {}) {\n    const result = this._state.results.find(r => r.searchId === id);\n    if (!result) return false;\n    this._state = { ...this._state, selected: id }; this._emit();\n    if (activate) this._onSelect?.(result);\n    return true;\n  }\n}\nlet instance;\nexport const getPlaceSearchStore = () => instance ||= new PlaceSearchStore();\n","import { getPlaceSearchStore } from '../geo/PlaceSearchStore.js';\n\nexport function bindPlaceSearchList(container, { owner, selector, indexAttribute, store = getPlaceSearchStore() }) {\n  const hovered = event => {\n    if (event.pointerType === 'touch') return;\n    const row = event.target.closest(selector);\n    if (!row || !container.contains(row)) return;\n    const state = store.getState(); if (state.owner !== owner) return;\n    store.hover(state.results[Number(row.getAttribute(indexAttribute))]?.searchId);\n  };\n  const leave = () => { if (store.getState().owner === owner) store.hover(null); };\n  const off = store.subscribe(state => {\n    for (const row of container.querySelectorAll(selector)) {\n      const id = state.owner === owner ? state.results[Number(row.getAttribute(indexAttribute))]?.searchId : null;\n      row.classList.toggle('is-hovered', !!id && id === state.hovered);\n      row.classList.toggle('is-selected', !!id && id === state.selected);\n      row.classList.toggle('is-dimmed', !!id && !!state.hovered && id !== state.hovered);\n    }\n  });\n  container.addEventListener('pointerover', hovered); container.addEventListener('pointerleave', leave);\n  container.addEventListener('focusin', hovered); container.addEventListener('focusout', leave);\n  return () => { off(); store.clear(owner); container.removeEventListener('pointerover', hovered);\n    container.removeEventListener('pointerleave', leave); container.removeEventListener('focusin', hovered); container.removeEventListener('focusout', leave); };\n}\n","/**\n * SidebarMenuSystem\n *\n * Declarative DOM renderer and visual contract for every expanded desktop\n * sidebar destination. The Layers filter rail is the reference surface: its\n * compact header, square cards, yellow interaction state, typography, spacing,\n * and form geometry are projected here instead of being recreated per tool.\n */\n\nconst STYLE_ID = 'nca-sidebar-menu-system-styles';\n\nexport const SIDEBAR_MENU_ROLES = Object.freeze({\n  surface: 'surface',\n  header: 'header',\n  title: 'title',\n  description: 'description',\n  body: 'body',\n  route: 'route',\n  view: 'view',\n  section: 'section',\n  sectionHeader: 'section-header',\n  sectionTitle: 'section-title',\n  sectionDescription: 'section-description',\n  sectionBody: 'section-body',\n  card: 'card',\n  row: 'row',\n  actions: 'actions',\n  button: 'button',\n  status: 'status',\n  disclosure: 'disclosure',\n  badge: 'badge',\n});\n\nconst ROLE_CLASS = Object.freeze(Object.fromEntries(\n  Object.values(SIDEBAR_MENU_ROLES).map((role) => [role, `nca-menu-${role}`]),\n));\n\nconst splitClasses = (value) => String(value || '').split(/\\s+/).filter(Boolean);\n\nexport function applySidebarMenuRole(element, role, className = '') {\n  if (!element) return element;\n  const roleClass = ROLE_CLASS[role];\n  if (!roleClass) throw new Error(`Unknown sidebar menu role: ${role}`);\n  element.classList.add(roleClass, ...splitClasses(className));\n  element.dataset.ncaMenuRole = role;\n  return element;\n}\n\n/** Desktop projection of existing feature-owned DOM onto the common roles.\n * Called on mount and data admission, never from a frame clock or observer.\n * Mobile components retain their original structure and styles.\n */\nexport function prepareDesktopSidebarPanel(root,host=root){\n  if(!host?.closest?.('.nca-sidebar-detail')||root.ownerDocument.body.classList.contains('is-mobile'))return;\n  const matching=selector=>[...(root.matches?.(selector)?[root]:[]),...root.querySelectorAll(selector)];\n  const wrap=(element,headerSelector,titleSelector)=>{\n    if(!element||element.dataset.ncaDesktopSection)return;\n    const header=element.querySelector(headerSelector);if(!header)return;\n    element.dataset.ncaDesktopSection='true';applySidebarMenuRole(element,'section');applySidebarMenuRole(header,'section-header');\n    let title=titleSelector?header.querySelector(titleSelector):header.querySelector(':scope > .nca-menu-section-title');\n    if(!title){title=element.ownerDocument.createElement('span');for(const child of [...header.childNodes])title.appendChild(child);header.appendChild(title);}applySidebarMenuRole(title,'section-title');\n    const body=element.ownerDocument.createElement('div');applySidebarMenuRole(body,'section-body');\n    const filters=header.querySelector('.hud-user-device-filters');if(filters)body.appendChild(filters);\n    for(const child of [...element.childNodes])if(child!==header)body.appendChild(child);\n    element.appendChild(body);\n  };\n  const name=root.querySelector('.hud-user-name');\n  if(name&&!name.closest('[data-desktop-identity]')){\n    const parent=name.parentNode,meta=parent.querySelector('.hud-user-meta'),actions=parent.querySelector('.hud-user-actions');\n    const section=generateSidebarMenuComponent({type:'section',title:'Identity'});section.element.dataset.desktopIdentity='true';parent.insertBefore(section.element,name);section.body.append(name);if(meta)section.body.append(meta);if(actions)section.body.append(actions);\n    applySidebarMenuRole(parent,'view','nca-menu-panel-view');\n  }\n  for(const el of matching('.auth-methods-panel'))wrap(el,'.auth-methods-heading','.auth-methods-title');\n  for(const el of matching('.hud-user-noclip'))wrap(el,'.hud-user-noclip-header','.hud-user-noclip-title');\n  for(const el of matching('.hud-user-devices'))wrap(el,'.hud-user-devices-header','.hud-user-devices-title');\n  for(const el of matching('.wallet-section'))wrap(el,'.wallet-section-title');\n  for(const el of matching('.balance-section'))wrap(el,'.balance-title');\n  for(const el of matching('.nclp-agent-access__section'))wrap(el,'.nclp-agent-access__section-title');\n  for(const el of matching('.nca-provider-key'))wrap(el,'.nca-provider-key__head','.nca-provider-key__title');\n  for(const el of matching('.friends-add-form,.friends-peer-ingress')){\n    if(el.dataset.ncaDesktopSection)continue;\n    const title=el.matches('.friends-peer-ingress')?'Peer connections':'Find people';\n    const header=el.ownerDocument.createElement('header'),label=el.ownerDocument.createElement('span');applySidebarMenuRole(header,'section-header');applySidebarMenuRole(label,'section-title');label.textContent=title;header.append(label);el.prepend(header);wrap(el,':scope > header');\n  }\n  for(const [role,selectors]of Object.entries({\n    view:'.wallet-panel-content,.friends-panel-content,.nclp-agent-access__content,.nca-provider-keys',\n    card:'.nca-public-data-card,.nclp-agent-access__metric,.nclp-agent-access__hero',\n    row:'.hud-device-item,.friend-item,.request-item,.wallet-item,.balance-item,.auth-method-row,.nca-session-card',\n    actions:'.hud-user-actions,.hud-user-noclip-actions,.hud-device-actions,.hud-device-edit-actions,.hud-user-device-filters,.wallet-actions,.wallet-connect-section,.friends-panel-tabs,.friends-add-row,.friends-peer-row,.request-actions',\n    badge:'.hud-device-live-label,.auth-methods-badge,.hud-user-noclip-tier,.hud-device-tag,.friends-tab-badge,.wallet-status,.wallet-badge,.nca-public-data-card__badge,.nca-public-data-card__chip,.nca-provider-key__state,.friends-market-state,.friends-market-transport,.friends-market-visibility,.friends-market-chip',\n    button:'.hud-user-noclip-btn',\n    status:'.wallet-refresh-status,.nclp-agent-access__status,.nca-provider-keys__notice,.nca-public-data-catalog__notice',\n  }))for(const el of matching(selectors))applySidebarMenuRole(el,role);\n}\n\nfunction createElement(tag, role, options = {}) {\n  const element = document.createElement(tag);\n  applySidebarMenuRole(element, role, options.className);\n  if (options.id) element.dataset.sidebarMenuId = options.id;\n  if (options.text != null) element.textContent = String(options.text);\n  if (options.html != null) element.innerHTML = String(options.html);\n  for (const [name, value] of Object.entries(options.attributes || {})) {\n    if (value == null) continue;\n    element.setAttribute(name, String(value));\n  }\n  return element;\n}\n\n/**\n * Generate a semantic sidebar component from a small schema. Callers retain\n * feature lifecycle and data ownership; this renderer owns only menu structure.\n */\nexport function generateSidebarMenuComponent(schema = {}) {\n  const type = schema.type || 'view';\n\n  if (type === 'view') {\n    const element = createElement(schema.tag || 'div', SIDEBAR_MENU_ROLES.view, schema);\n    for (const child of schema.children || []) {\n      element.appendChild(child?.nodeType ? child : generateSidebarMenuComponent(child).element);\n    }\n    schema.mount?.(element);\n    return { element, body: element };\n  }\n\n  if (type === 'section') {\n    const element = createElement('section', SIDEBAR_MENU_ROLES.section, schema);\n    let header = null;\n    let toggle = null;\n    if (schema.title || schema.description) {\n      header = createElement(\n        schema.collapsible ? 'button' : 'header',\n        SIDEBAR_MENU_ROLES.sectionHeader,\n        { className: schema.headerClass },\n      );\n      if (schema.collapsible) {\n        toggle = header;\n        toggle.type = 'button';\n        toggle.setAttribute('aria-expanded', schema.open ? 'true' : 'false');\n      }\n      const copy = document.createElement('span');\n      copy.className = 'nca-menu-section-copy';\n      if (schema.title) {\n        const title = createElement('span', SIDEBAR_MENU_ROLES.sectionTitle, { text: schema.title });\n        copy.appendChild(title);\n      }\n      if (schema.description) {\n        const description = createElement('span', SIDEBAR_MENU_ROLES.sectionDescription, {\n          text: schema.description,\n        });\n        copy.appendChild(description);\n      }\n      header.appendChild(copy);\n      if (schema.collapsible) {\n        const indicator = document.createElement('span');\n        indicator.className = 'nca-menu-section-indicator';\n        indicator.innerHTML = schema.indicatorHtml || '<span aria-hidden=\"true\">+</span>';\n        header.appendChild(indicator);\n      }\n      element.appendChild(header);\n    }\n    const body = createElement('div', SIDEBAR_MENU_ROLES.sectionBody, {\n      className: schema.bodyClass,\n    });\n    element.appendChild(body);\n    for (const child of schema.children || []) {\n      body.appendChild(child?.nodeType ? child : generateSidebarMenuComponent(child).element);\n    }\n    schema.mount?.(body, element);\n    if (schema.collapsible) {\n      element.classList.toggle('is-open', !!schema.open);\n      body.hidden = !schema.open;\n      toggle.addEventListener('click', () => {\n        const open = !element.classList.contains('is-open');\n        element.classList.toggle('is-open', open);\n        body.hidden = !open;\n        toggle.setAttribute('aria-expanded', open ? 'true' : 'false');\n        schema.onToggle?.(open, { element, body, toggle });\n      });\n    }\n    return { element, body, header, toggle };\n  }\n\n  if (type === 'card' || type === 'row') {\n    const role = type === 'card' ? SIDEBAR_MENU_ROLES.card : SIDEBAR_MENU_ROLES.row;\n    const interactive = typeof schema.onActivate === 'function' || schema.interactive === true;\n    const element = createElement(interactive ? 'button' : (schema.tag || 'div'), role, schema);\n    if (interactive) element.type = 'button';\n    if (schema.active) element.classList.add('is-active');\n    if (schema.disabled) {\n      element.disabled = true;\n      element.setAttribute('aria-disabled', 'true');\n    }\n    if (schema.iconHtml) {\n      const icon = document.createElement('span');\n      icon.className = 'nca-menu-item-icon';\n      icon.innerHTML = schema.iconHtml;\n      element.appendChild(icon);\n    }\n    const copy = document.createElement('span');\n    copy.className = 'nca-menu-item-copy';\n    if (schema.eyebrow) {\n      const eyebrow = document.createElement('span');\n      eyebrow.className = 'nca-menu-item-eyebrow';\n      eyebrow.textContent = schema.eyebrow;\n      copy.appendChild(eyebrow);\n    }\n    const title = document.createElement('span');\n    title.className = 'nca-menu-item-title';\n    title.textContent = schema.title || '';\n    copy.appendChild(title);\n    if (schema.description) {\n      const description = document.createElement('span');\n      description.className = 'nca-menu-item-description';\n      description.textContent = schema.description;\n      copy.appendChild(description);\n    }\n    element.appendChild(copy);\n    if (schema.meta || schema.trailingHtml) {\n      const trailing = document.createElement('span');\n      trailing.className = 'nca-menu-item-trailing';\n      if (schema.trailingHtml) trailing.innerHTML = schema.trailingHtml;\n      else trailing.textContent = schema.meta;\n      element.appendChild(trailing);\n    }\n    if (schema.onActivate) element.addEventListener('click', schema.onActivate);\n    return { element, copy, title };\n  }\n\n  if (type === 'actions') {\n    const element = createElement('div', SIDEBAR_MENU_ROLES.actions, schema);\n    for (const child of schema.children || []) {\n      element.appendChild(child?.nodeType ? child : generateSidebarMenuComponent(child).element);\n    }\n    return { element, body: element };\n  }\n\n  if (type === 'button') {\n    const element = createElement('button', SIDEBAR_MENU_ROLES.button, schema);\n    element.type = schema.buttonType || 'button';\n    element.disabled = !!schema.disabled;\n    if (schema.variant) element.classList.add(`nca-menu-button--${schema.variant}`);\n    if (schema.title) element.title = schema.title;\n    if (schema.onActivate) element.addEventListener('click', schema.onActivate);\n    return { element };\n  }\n\n  if (type === 'status') {\n    const element = createElement('div', SIDEBAR_MENU_ROLES.status, schema);\n    if (schema.tone) element.classList.add(`nca-menu-status--${schema.tone}`);\n    element.setAttribute('role', schema.tone === 'danger' ? 'alert' : 'status');\n    return { element };\n  }\n\n  if (type === 'disclosure') {\n    const element = createElement('details', SIDEBAR_MENU_ROLES.disclosure, schema);\n    element.open = !!schema.open;\n    const summary = document.createElement('summary');\n    summary.className = 'nca-menu-disclosure-summary';\n    summary.textContent = schema.title || '';\n    const body = document.createElement('div');\n    body.className = 'nca-menu-disclosure-body';\n    for (const child of schema.children || []) {\n      body.appendChild(child?.nodeType ? child : generateSidebarMenuComponent(child).element);\n    }\n    schema.mount?.(body, element);\n    element.append(summary, body);\n    return { element, body, summary };\n  }\n\n  throw new Error(`Unsupported sidebar menu component: ${type}`);\n}\n\nexport function ensureSidebarMenuSystemStyles() {\n  if (typeof document === 'undefined' || document.getElementById(STYLE_ID)) return;\n  const style = document.createElement('style');\n  style.id = STYLE_ID;\n  style.textContent = `\n    /* Layers is the canonical visual contract for every expanded rail page. */\n    .nca-menu-surface {\n      --nca-menu-accent: var(--nclp-yellow, #facc15);\n      --nca-menu-bg: var(--nclp-bg-secondary, #111);\n      --nca-menu-bg-main: var(--nclp-bg-main, #0a0a0a);\n      --nca-menu-border: var(--nclp-border-subtle, rgba(255,255,255,.14));\n      --nca-menu-text: var(--nclp-text-primary, #fff);\n      --nca-menu-muted: var(--nclp-muted, rgba(250,250,250,.7));\n      --nca-menu-quiet: var(--nclp-quiet, rgba(250,250,250,.48));\n      box-sizing: border-box;\n      border: 1px solid var(--nca-menu-border);\n      border-radius: var(--nc-radius-sm, 3px);\n      background: var(--nca-menu-bg);\n      background: color-mix(in srgb, var(--nca-menu-bg) 94%, transparent);\n      box-shadow: 0 12px 32px rgba(0,0,0,.34);\n      color: var(--nca-menu-text);\n      font-family: var(--nca-font-sans, sans-serif);\n      backdrop-filter: blur(12px);\n    }\n\n    /* The desktop detail retains its positioning contract, while the generated\n       role wins the visual cascade over the legacy rail stylesheet. */\n    .nca-sidebar-detail.nca-menu-surface {\n      border: 1px solid var(--nca-menu-border) !important;\n      background: var(--nca-menu-bg) !important;\n      background: color-mix(in srgb, var(--nca-menu-bg) 94%, transparent) !important;\n      color: var(--nca-menu-text) !important;\n      font-family: var(--nca-font-sans, sans-serif) !important;\n    }\n\n    .nca-menu-header {\n      min-height: 32px;\n      box-sizing: border-box;\n      padding: 0 8px;\n      border-bottom: 1px solid var(--nca-menu-border);\n    }\n\n    .nca-sidebar-detail-header.nca-menu-header {\n      min-height: 32px !important;\n      height: auto !important;\n      padding: 8px !important;\n      gap: 2px !important;\n      border-bottom-color: var(--nca-menu-border) !important;\n    }\n\n    .nca-menu-title {\n      color: var(--nca-menu-text);\n      font: 650 9px/1 var(--nca-font-mono, monospace);\n      letter-spacing: .12em;\n      text-transform: uppercase;\n    }\n\n    .nca-sidebar-detail-title.nca-menu-title {\n      margin: 0 !important;\n      color: var(--nca-menu-text) !important;\n      font: 650 9px/1 var(--nca-font-mono, monospace) !important;\n      letter-spacing: .12em !important;\n    }\n\n    .nca-menu-description {\n      color: var(--nca-menu-quiet);\n      font: 500 9px/1.35 var(--nca-font-sans, sans-serif);\n    }\n\n    .nca-sidebar-detail-description.nca-menu-description {\n      margin: 2px 0 0 !important;\n      color: var(--nca-menu-quiet) !important;\n      font: 500 9px/1.2 var(--nca-font-sans, sans-serif) !important;\n    }\n\n    .nca-menu-body,\n    .nca-menu-route {\n      box-sizing: border-box;\n      min-width: 0;\n      color: var(--nca-menu-text);\n    }\n\n    .nca-menu-body {\n      padding: 12px;\n      scrollbar-width: thin;\n      scrollbar-color: var(--nclp-line-strong, rgba(250,250,250,.3)) transparent;\n    }\n\n    .nca-sidebar-detail-content.nca-menu-body { padding: 12px !important; }\n\n    /* A standalone route already lives inside the detail menu surface. Panels\n       mounted as its direct child must not acquire a second outer card from\n       the global [class$=\"-panel\"] skin; nested cards retain their styling. */\n    .nca-sidebar-detail-body--standalone.nca-menu-route > .nca-sidebar-panel.nca-embedded {\n      border: unset !important;\n      background: unset !important;\n      box-shadow: none !important;\n    }\n\n    .nca-menu-route,\n    .nca-menu-view,\n    .nca-menu-section-body {\n      display: grid;\n      grid-template-columns: minmax(0, 1fr);\n      grid-auto-rows: max-content;\n      align-content: start;\n      gap: 6px;\n      width: 100%;\n      min-width: 0;\n    }\n\n    .nca-menu-section,\n    .nca-menu-card,\n    .nca-menu-row,\n    .nca-menu-disclosure {\n      box-sizing: border-box;\n      width: 100%;\n      min-width: 0;\n      border: 1px solid var(--nca-menu-border);\n      border-radius: var(--nc-radius-sm, 3px);\n      background: var(--nca-menu-bg);\n      color: inherit;\n    }\n\n    .nca-menu-section {\n      display: flex;\n      flex-direction: column;\n      gap: 0;\n      padding: 0;\n      overflow: hidden;\n    }\n\n    .nca-menu-section-header {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 8px;\n      width: 100%;\n      min-height: 32px;\n      box-sizing: border-box;\n      padding: 8px 9px;\n      border: 0;\n      border-radius: 0;\n      background: transparent;\n      color: inherit;\n      text-align: left;\n    }\n\n    button.nca-menu-section-header { cursor: pointer; }\n    button.nca-menu-section-header:hover,\n    button.nca-menu-section-header:focus-visible {\n      outline: none;\n      color: var(--nca-menu-accent);\n      background: var(--nclp-bg-tertiary, #1a1a1a);\n    }\n\n    .nca-menu-section-copy { display: grid; min-width: 0; gap: 3px; }\n    .nca-menu-section-title {\n      color: inherit;\n      font: 700 9px/1.2 var(--nca-font-mono, monospace);\n      letter-spacing: .11em;\n      text-transform: uppercase;\n    }\n    .nca-menu-section-description {\n      color: var(--nca-menu-quiet);\n      font: 500 9px/1.35 var(--nca-font-sans, sans-serif);\n    }\n    .nca-menu-section-indicator {\n      flex: 0 0 auto;\n      color: var(--nca-menu-quiet);\n      font: 700 12px/1 var(--nca-font-mono, monospace);\n    }\n    .nca-menu-section.is-open > .nca-menu-section-header .nca-menu-section-indicator {\n      color: var(--nca-menu-accent);\n      transform: rotate(45deg);\n    }\n    .nca-menu-section-body { padding: 9px; border-top: 1px solid var(--nca-menu-border); }\n    .nca-menu-section-body[hidden] { display: none !important; }\n\n    .nca-menu-card,\n    .nca-menu-row {\n      position: relative;\n      display: grid;\n      grid-template-columns: auto minmax(0, 1fr) auto;\n      align-items: start;\n      gap: 7px;\n      padding: 8px 9px;\n      text-align: left;\n      font: 600 10px/1.2 var(--nca-font-sans, sans-serif);\n    }\n    .nca-menu-card { min-height: 64px; }\n    .nca-menu-row { min-height: 44px; }\n    button.nca-menu-card,\n    button.nca-menu-row { cursor: pointer; }\n    button.nca-menu-card:hover,\n    button.nca-menu-card:focus-visible,\n    button.nca-menu-row:hover,\n    button.nca-menu-row:focus-visible,\n    .nca-menu-card.is-active,\n    .nca-menu-row.is-active {\n      outline: none;\n      color: var(--nca-menu-accent);\n      border-color: var(--nca-menu-accent);\n      background: var(--nca-menu-bg);\n    }\n    .nca-menu-item-icon {\n      display: grid;\n      place-items: center;\n      width: 22px;\n      height: 22px;\n      color: var(--nca-menu-quiet);\n    }\n    .nca-menu-item-icon svg { width: 15px; height: 15px; }\n    .nca-menu-item-copy { display: grid; min-width: 0; gap: 3px; }\n    .nca-menu-item-eyebrow {\n      color: rgba(255,255,255,.34);\n      font: 700 7px/1 var(--nca-font-mono, monospace);\n      letter-spacing: .1em;\n      text-transform: uppercase;\n    }\n    .nca-menu-item-title { color: inherit; font-size: 11px; line-height: 1.25; font-weight: 700; }\n    .nca-menu-item-description {\n      color: rgba(255,255,255,.56);\n      font-size: 9px;\n      line-height: 1.3;\n    }\n    .nca-menu-item-trailing {\n      color: rgba(255,255,255,.34);\n      font: 700 8px/1 var(--nca-font-mono, monospace);\n      letter-spacing: .06em;\n    }\n    button.nca-menu-card:hover :is(.nca-menu-item-description,.nca-menu-item-eyebrow,.nca-menu-item-trailing),\n    button.nca-menu-row:hover :is(.nca-menu-item-description,.nca-menu-item-eyebrow,.nca-menu-item-trailing) {\n      color: color-mix(in srgb, var(--nca-menu-accent) 68%, #fff);\n    }\n\n    .nca-menu-actions { display: flex; flex-wrap: wrap; gap: 6px; min-width: 0; }\n    .nca-menu-button,\n    .nca-menu-route :is(button, input:not([type=\"checkbox\"]):not([type=\"radio\"]), select, textarea) {\n      box-sizing: border-box;\n      min-height: 32px;\n      aspect-ratio: auto !important;\n      border: 1px solid var(--nca-menu-border);\n      border-radius: var(--nc-radius-sm, 3px) !important;\n      background: var(--nca-menu-bg-main);\n      color: var(--nca-menu-muted);\n      font-family: var(--nca-font-mono, monospace);\n    }\n    .nca-menu-button {\n      padding: 0 9px;\n      font-size: 9px;\n      font-weight: 650;\n      letter-spacing: .06em;\n      text-transform: uppercase;\n      cursor: pointer;\n    }\n    .nca-menu-button:hover,\n    .nca-menu-route button:hover,\n    .nca-menu-route :is(input,select,textarea):focus-visible {\n      outline: none;\n      color: var(--nca-menu-accent);\n      border-color: var(--nca-menu-accent);\n    }\n    .nca-menu-button--primary,\n    .nca-menu-button.is-active,\n    .nca-menu-route button:is(.active,.is-active,[aria-pressed=\"true\"],[aria-checked=\"true\"]) {\n      color: var(--nca-menu-accent) !important;\n      border-color: var(--nca-menu-accent) !important;\n      background: var(--nca-menu-bg) !important;\n    }\n\n    .nca-menu-status {\n      box-sizing: border-box;\n      width: 100%;\n      padding: 12px;\n      border: 1px solid var(--nca-menu-border);\n      border-radius: var(--nc-radius-sm, 3px);\n      background: var(--nca-menu-bg);\n      color: var(--nca-menu-quiet);\n      font: 500 10px/1.45 var(--nca-font-sans, sans-serif);\n      text-align: center;\n    }\n    .nca-menu-status--danger { color: var(--nca-danger, #fda4af); border-color: rgba(253,164,175,.4); }\n\n    .nca-menu-disclosure { overflow: hidden; }\n    .nca-menu-disclosure-summary {\n      box-sizing: border-box;\n      min-height: 32px;\n      padding: 9px;\n      color: var(--nca-menu-muted);\n      cursor: pointer;\n      font: 700 9px/1.2 var(--nca-font-mono, monospace);\n      letter-spacing: .1em;\n      list-style: none;\n      text-transform: uppercase;\n    }\n    .nca-menu-disclosure-summary::-webkit-details-marker { display: none; }\n    .nca-menu-disclosure-summary::after { content: '+'; float: right; color: var(--nca-menu-quiet); }\n    .nca-menu-disclosure[open] > .nca-menu-disclosure-summary::after { content: '\\\\2212'; color: var(--nca-menu-accent); }\n    .nca-menu-disclosure-body { display: grid; gap: 6px; padding: 9px; border-top: 1px solid var(--nca-menu-border); }\n\n    .nca-menu-route :is(input:not([type=\"checkbox\"]):not([type=\"radio\"]), select, textarea) {\n      width: 100%;\n      min-width: 0;\n      padding: 6px 8px;\n      font-size: 10px;\n    }\n    .nca-menu-route input:is([type=\"checkbox\"],[type=\"radio\"]) { accent-color: var(--nca-menu-accent); }\n    .nca-menu-route :is(fieldset, form) { min-width: 0; max-width: 100%; }\n    .nca-menu-route fieldset {\n      box-sizing: border-box;\n      padding: 9px;\n      border: 1px solid var(--nca-menu-border);\n      border-radius: var(--nc-radius-sm, 3px);\n      background: var(--nca-menu-bg);\n    }\n    .nca-menu-route fieldset > legend {\n      padding: 0 5px;\n      color: var(--nca-menu-muted);\n      font: 700 9px/1.2 var(--nca-font-mono, monospace);\n      letter-spacing: .1em;\n      text-transform: uppercase;\n    }\n    .nca-menu-route :is(img,canvas,svg,video) { max-width: 100%; }\n\n    /* Desktop content uses the mobile section rhythm. The host and guard are\n       deliberate: none of these rules apply to mobile sheets or dock panels. */\n    body:not(.is-mobile) .nca-sidebar-detail {\n      --nca-menu-bg: #111; --nca-menu-bg-main: #0a0a0a;\n      --nca-menu-border: rgba(255,255,255,.13);\n      --nca-menu-text: rgba(255,255,255,.84);\n      --nca-menu-muted: rgba(255,255,255,.7); --nca-menu-quiet: rgba(255,255,255,.48);\n      --nca-radius-sm: 3px; --nca-radius-md: 3px; --nca-radius-lg: 3px;\n      --nc-radius-sm: 3px; --nc-radius-md: 3px; --nc-radius-lg: 3px;\n      --nca-sidebar-block-gap: 12px; --nca-sidebar-row-gap: 8px;\n      background: #111 !important;\n    }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-route { font: 11px/1.4 var(--nca-font-sans,sans-serif); color: var(--nca-menu-text); }\n    body:not(.is-mobile) .nca-sidebar-detail :where(section,article,fieldset,details,button,a[class],input,select,textarea,[class*=\"panel\"],[class*=\"section\"],[class*=\"card\"],[class*=\"item\"],[class*=\"badge\"],[class*=\"tag\"],[class*=\"bar\"],[class*=\"chip\"],[class*=\"metric\"],[class*=\"notice\"],[class*=\"status\"],[class*=\"tabs\"]):not(:is(.friend-avatar,[class*=\"status-dot\"],[class*=\"spinner\"],[class*=\"indicator\"],[class*=\"thumb\"],input[type=\"range\"])) { border-radius: 3px !important; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.hud-user-panel-shell,.friends-panel,.wallet-panel,.avatar-editor-panel,.agent-access-panel) { border: 0 !important; background: none !important; box-shadow: none !important; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.hud-user-content,.hud-user-panel-content,.wallet-panel-content,.friends-panel-content,.nca-menu-panel-view) { padding: 0 !important; border: 0 !important; gap: var(--nca-sidebar-block-gap) !important; background: none !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-panel-view { display: grid !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-section { padding: 0 !important; margin: 0 !important; gap: 0 !important; border: 1px solid var(--nca-menu-border) !important; background: rgba(255,255,255,.035) !important; background-image: none !important; box-shadow: none !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-section-header { display: flex; justify-content: space-between; align-items: center; text-align: left; padding: 8px 10px !important; min-height: 34px; border: 0 !important; background: transparent !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-section-title { font: 650 11px/1.3 var(--nca-font-sans,sans-serif) !important; letter-spacing: .055em !important; color: var(--nca-menu-text) !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-section-description { font: 400 10px/1.4 var(--nca-font-sans,sans-serif); }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-section-body { display: grid; gap: 8px; padding: 10px !important; border-top: 1px solid var(--nca-menu-border); }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.nca-menu-row,.nca-menu-card,.hud-device-item,.friend-item,.request-item,.wallet-item,.balance-item,.auth-method-row) { box-sizing: border-box; margin: 0 !important; padding: 8px 9px !important; gap: 8px; border: 1px solid var(--nca-menu-border) !important; background: rgba(255,255,255,.035) !important; background-image: none !important; box-shadow: none !important; font-family: var(--nca-font-sans,sans-serif) !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-card { min-height: 56px; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.nca-public-data-card,.nclp-agent-access__metric,.nclp-agent-access__hero,.nca-session-card,.request-item) { display: grid; grid-template-columns: minmax(0,1fr); min-width: 0; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-public-data-card__head { flex-wrap: wrap; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-public-data-card__endpoint { overflow-wrap: anywhere; min-width: 0; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.hud-device-item,.wallet-item) { display: grid; grid-template-columns: minmax(0,1fr); }\n    body:not(.is-mobile) .nca-sidebar-detail .friend-item { display: grid; grid-template-columns: 32px minmax(0,1fr) auto; }\n    body:not(.is-mobile) .nca-sidebar-detail .manual-peer-item { grid-template-columns: 32px minmax(0,1fr); align-items: start; }\n    body:not(.is-mobile) .nca-sidebar-detail .manual-peer-item .friend-actions { grid-column: 1 / -1; justify-content: flex-start; }\n    body:not(.is-mobile) .nca-sidebar-detail .auth-method-row { grid-template-columns: minmax(0,1fr) auto; }\n    body:not(.is-mobile) .nca-sidebar-detail .balance-item { display: flex; justify-content: space-between; align-items: center; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.nca-menu-actions,.wallet-actions,.hud-device-actions) { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 6px !important; padding: 0 !important; border: 0 !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .hud-device-action { width: auto; min-width: 32px; height: 32px; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(button,.nca-menu-button) { min-height: 32px !important; box-sizing: border-box; padding: 6px 9px; font: 650 10px/1.3 var(--nca-font-sans,sans-serif) !important; letter-spacing: .035em; text-transform: uppercase; }\n    /* Overlay tree row actions are square icon buttons, not text buttons. */\n    body:not(.is-mobile) .nca-sidebar-detail .overlay-tree-actions :is(button,.nca-menu-button) { padding: 0 !important; aspect-ratio: 1 / 1; min-height: 0 !important; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(input:not([type=\"range\"]):not([type=\"checkbox\"]):not([type=\"radio\"]),select,textarea) { min-height: 34px; box-sizing: border-box; font: 400 12px/1.4 var(--nca-font-sans,sans-serif) !important; background: var(--nca-menu-bg-main) !important; color: var(--nca-menu-text) !important; border-color: var(--nca-menu-border) !important; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.nca-menu-badge,.wallet-status,.wallet-badge,.hud-device-tag,.auth-methods-badge) { padding: 2px 6px; border: 1px solid var(--nca-menu-border); background: rgba(255,255,255,.035); font: 600 9px/1.25 var(--nca-font-sans,sans-serif); letter-spacing: .025em; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.hud-user-name,.friend-name,.wallet-address,.hud-device-title,.auth-method-name) { font-family: var(--nca-font-sans,sans-serif) !important; color: var(--nca-menu-text); }\n    body:not(.is-mobile) .nca-sidebar-detail .hud-user-name { font-size: 14px; margin: 0; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.hud-user-meta,.hud-device-meta,.auth-method-meta,.friend-status,.friend-live,.friend-live-label,.wallet-chain,.balance-token-contract,.friends-add-hint) { margin: 0; font: 400 9px/1.4 var(--nca-font-sans,sans-serif) !important; color: var(--nca-menu-quiet) !important; overflow-wrap: anywhere; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.hud-user-device-list,.wallet-list,.balance-list,.auth-methods-list) { display: grid; gap: 8px; }\n    body:not(.is-mobile) .nca-sidebar-detail .hud-user-device-filters { flex-wrap: wrap; padding: 0 !important; margin: 0; border: 0; }\n    body:not(.is-mobile) .nca-sidebar-detail .hud-user-devices-title { font-family: var(--nca-font-sans,sans-serif); letter-spacing: .055em; }\n    body:not(.is-mobile) .nca-sidebar-detail .hud-user-noclip-balance { font: 600 18px/1.35 var(--nca-font-mono,monospace); }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.hud-user-noclip-usage,.hud-user-noclip-nftgate) { padding: 8px; border: 1px solid var(--nca-menu-border); background: rgba(255,255,255,.025); }\n    body:not(.is-mobile) .nca-sidebar-detail .hud-user-noclip-btn { display: inline-flex; align-items: center; justify-content: center; text-decoration: none; background: var(--nca-menu-bg-main) !important; border: 1px solid var(--nca-menu-border) !important; color: var(--nca-menu-text) !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .hud-user-noclip-btn.primary { border-color: var(--nca-menu-accent) !important; color: var(--nca-menu-accent) !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .friends-panel-tabs { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); margin: 0; border: 0; gap: 4px; }\n    body:not(.is-mobile) .nca-sidebar-detail .friend-avatar { width: 32px; height: 32px; font-size: 12px; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.friend-info,.hud-device-main,.balance-token-group) { min-width: 0; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-row .friend-actions { align-self: start; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-route :where([class*=\"-card\"],[class*=\"__card\"],[class$=\"-section\"],[class*=\"__section\"],[class$=\"-panel\"]):not(.nca-sidebar-panel) { background-image: none !important; box-shadow: none !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .nca-menu-route :where(h2,h3,h4,[class$=\"-title\"],[class*=\"__title\"],[class$=\"-heading\"]) { font-family: var(--nca-font-sans,sans-serif) !important; font-size: 11px !important; line-height: 1.35; letter-spacing: .04em; }\n    body:not(.is-mobile) .nca-sidebar-detail .hud-user-noclip-wallets { border: 0; padding: 0; }\n    body:not(.is-mobile) .nca-sidebar-detail :is(.hud-device-live-label,.nca-provider-key__state) { border-radius: 3px !important; }\n    body:not(.is-mobile) .nca-sidebar-detail .wallet-refresh-status[hidden] { display: none !important; }\n\n    @media (max-width: 720px) {\n      .nca-menu-body { padding: 8px; }\n    }\n  `;\n  document.head.appendChild(style);\n}\n\nexport function sidebarMenuRoleSelector(role) {\n  return `.${ROLE_CLASS[role] || ''}`;\n}\n","// Retain live controls while their data changes. Owners must clear protected\n// roots on identity replacement; this helper owns no fetches, clocks or state.\nconst rendered = new WeakMap();\nconst bindings = new WeakMap();\nconst keyAttributes = [\n  'id', 'data-stable-key', 'data-device-row', 'data-wallet-id', 'data-user-id',\n  'data-request-id', 'data-peer-address', 'data-manual-peer', 'data-passkey-id',\n  'data-token-key', 'data-session-id', 'data-device-action', 'data-peer-action',\n  'data-manual-action', 'data-remove', 'data-accept', 'data-decline', 'data-add',\n];\n\nfunction key(node) {\n  if (node.nodeType !== 1) return null;\n  for (const name of keyAttributes) {\n    if (node.hasAttribute(name)) return `${node.tagName}:${name}:${node.getAttribute(name)}`;\n  }\n  if (node.matches('input,select,textarea,button,option')) {\n    const identity = node.getAttribute('name') || node.getAttribute('aria-label')\n      || node.getAttribute('data-action') || node.getAttribute('value');\n    if (identity != null) return `${node.tagName}:${node.getAttribute('type') || ''}:${identity}`;\n  }\n  return null;\n}\n\nconst compatible = (a, b) => a && a.nodeType === b.nodeType\n  && (a.nodeType !== 1 || a.tagName === b.tagName && key(a) === key(b));\n\nfunction patchNode(current, next) {\n  if (current.nodeType !== 1) {\n    if (current.nodeValue !== next.nodeValue) current.nodeValue = next.nodeValue;\n    return;\n  }\n  const ownsValue = current.matches('input,select,textarea,option');\n  const localAttribute = name => (ownsValue && ['value', 'checked', 'selected'].includes(name))\n    || (current.tagName === 'DETAILS' && name === 'open')\n    || (name === 'hidden' && current.hasAttribute('data-local-state'))\n    || (name === 'disabled' && current._ncaLocallyDisabled === true);\n  for (const attr of [...current.attributes]) {\n    if (!next.hasAttribute(attr.name) && !localAttribute(attr.name)) current.removeAttribute(attr.name);\n  }\n  for (const attr of next.attributes) {\n    if (!localAttribute(attr.name) && current.getAttribute(attr.name) !== attr.value) {\n      current.setAttribute(attr.name, attr.value);\n    }\n  }\n  if (current.tagName !== 'TEXTAREA') patchChildren(current, next);\n}\n\nfunction patchChildren(parent, nextParent) {\n  const old = [...parent.childNodes];\n  const used = new Set();\n  const keyed = new Map(old.map(node => [key(node), node]).filter(([identity]) => identity != null));\n  let cursor = parent.firstChild;\n  for (const next of [...nextParent.childNodes]) {\n    let current = key(next) != null ? keyed.get(key(next)) : cursor;\n    if (used.has(current) || !compatible(current, next)) {\n      current = old.find(node => !used.has(node) && compatible(node, next));\n    }\n    if (!current) {\n      // Adopt, rather than clone, programmatically created controls/listeners.\n      current = next;\n      parent.insertBefore(current, cursor);\n    } else {\n      if (current !== cursor) {\n        const active = parent.ownerDocument.activeElement;\n        const start = active?.selectionStart, end = active?.selectionEnd;\n        if (parent.moveBefore) parent.moveBefore(current, cursor);\n        else parent.insertBefore(current, cursor);\n        if (active?.isConnected && parent.ownerDocument.activeElement !== active) {\n          active.focus({ preventScroll: true });\n          if (Number.isFinite(start)) active.setSelectionRange(start, end);\n        }\n      }\n      patchNode(current, next);\n    }\n    used.add(current);\n    cursor = current.nextSibling;\n  }\n  for (const node of old) if (!used.has(node)) node.remove();\n}\n\nexport function patchStableHtml(host, html) {\n  if (!host) return;\n  const source = String(html ?? '');\n  if (rendered.get(host) === source) return;\n  const template = host.ownerDocument.createElement('template');\n  template.innerHTML = source;\n  patchChildren(host, template.content);\n  rendered.set(host, source);\n}\n\nexport function patchStableElement(host, next) {\n  if (!host || !next) return;\n  rendered.delete(host);\n  patchChildren(host, next);\n}\n\nexport function clearStableHtml(host) {\n  if (!host) return;\n  rendered.delete(host);\n  host.replaceChildren();\n}\n\nexport function bindStableEvent(element, event, identity, handler) {\n  let map = bindings.get(element);\n  if (!map) { map = new Map(); bindings.set(element, map); }\n  const id = `${event}:${identity}`, prior = map.get(id);\n  if (prior) { prior.handler = handler; return; }\n  const entry = { handler };\n  map.set(id, entry);\n  element.addEventListener(event, value => entry.handler(value));\n}\n\nexport function patchStableSelect(select, entries, emptyText) {\n  if (select.ownerDocument.activeElement === select) {\n    select._ncaPendingOptions = { entries, emptyText };\n    if (!select._ncaOptionBlurBound) {\n      select._ncaOptionBlurBound = true;\n      select.addEventListener('blur', () => {\n        const pending = select._ncaPendingOptions;\n        select._ncaPendingOptions = null;\n        if (pending) patchStableSelect(select, pending.entries, pending.emptyText);\n      });\n    }\n    return;\n  }\n  const value = select.value;\n  const desired = entries.length ? entries : [{ id: '', label: emptyText }];\n  const old = new Map([...select.options].map(option => [option.value, option]));\n  let cursor = select.firstElementChild;\n  for (const item of desired) {\n    const id = String(item.id);\n    let option = old.get(id);\n    if (!option) { option = select.ownerDocument.createElement('option'); option.value = id; }\n    old.delete(id);\n    if (option.textContent !== item.label) option.textContent = item.label;\n    option.disabled = !entries.length;\n    if (option !== cursor) select.insertBefore(option, cursor);\n    cursor = option.nextElementSibling;\n  }\n  for (const option of old.values()) option.remove();\n  select.disabled = !entries.length;\n  const next = desired.some(entry => String(entry.id) === value) ? value : String(desired[0].id);\n  if (select.value !== next) select.value = next;\n}\n","import { buildLabelCategoryControlPatch } from '../labels/LabelCategoryRegistry.js';\nimport { buildOpenInfraMapLayerPatch } from '../overlays/OpenInfraMapContract.js';\n\nexport const mergeLightingDate = ({ currentDate, dateInput, timeInput }) => {\n  const base = (currentDate instanceof Date && !Number.isNaN(currentDate.valueOf()))\n    ? currentDate\n    : new Date();\n  let year = base.getUTCFullYear();\n  let month = base.getUTCMonth();\n  let day = base.getUTCDate();\n  let hours = base.getUTCHours();\n  let minutes = base.getUTCMinutes();\n  const seconds = base.getUTCSeconds();\n  const millis = base.getUTCMilliseconds();\n\n  if (dateInput) {\n    const [y, m, d] = String(dateInput).split('-').map(Number);\n    if (Number.isFinite(y) && Number.isFinite(m) && Number.isFinite(d)) {\n      year = y;\n      month = m - 1;\n      day = d;\n    }\n  }\n\n  if (timeInput) {\n    const [h, min] = String(timeInput).split(':').map(Number);\n    if (Number.isFinite(h) && Number.isFinite(min)) {\n      hours = h;\n      minutes = min;\n    }\n  }\n\n  return new Date(Date.UTC(year, month, day, hours, minutes, seconds, millis));\n};\n\nexport const buildQuickTimeDate = (label, currentDate) => {\n  const normalized = String(label || '').toLowerCase();\n  if (!normalized) return null;\n  if (normalized === 'now') return new Date();\n  const base = (currentDate instanceof Date && !Number.isNaN(currentDate.valueOf()))\n    ? currentDate\n    : new Date();\n  const map = {\n    sunrise: 6,\n    noon: 12,\n    sunset: 18,\n    midnight: 0,\n  };\n  if (!Object.prototype.hasOwnProperty.call(map, normalized)) return null;\n  const hours = map[normalized];\n  return new Date(Date.UTC(\n    base.getUTCFullYear(),\n    base.getUTCMonth(),\n    base.getUTCDate(),\n    hours,\n    0,\n    base.getUTCSeconds(),\n    base.getUTCMilliseconds()\n  ));\n};\n\nexport const buildScenePatch = (key, value, { readSetting, getLightingDate } = {}) => {\n  const read = typeof readSetting === 'function' ? readSetting : (_path, fallback) => fallback;\n  const getDate = typeof getLightingDate === 'function' ? getLightingDate : () => new Date();\n  const computeRingLodCaps = (maxLod, falloffPower) => {\n    const base = Number.isFinite(maxLod) ? Math.floor(maxLod) : 15;\n    const power = Number.isFinite(falloffPower) ? falloffPower : 0.8;\n    const midDrop = Math.max(1, Math.round(2 * power));\n    const farDrop = Math.max(midDrop + 1, Math.round(4 * power));\n    return {\n      near: base,\n      mid: Math.max(0, base - midDrop),\n      far: Math.max(0, base - farDrop)\n    };\n  };\n\n  switch (key) {\n    case 'renderScale':\n      return { renderer: { renderScale: 1 } };\n    case 'autoRenderScale':\n      return { renderer: { autoRenderScale: { enabled: false } } };\n    case 'renderCadenceMs':\n      return { renderer: { renderCadenceMs: value } };\n    case 'frameDiscardEnabled':\n      return { renderer: { frameDiscard: { enabled: !!value } } };\n    case 'frameDiscardThresholdMs':\n      return { renderer: { frameDiscard: { waitThresholdMs: value } } };\n    case 'bloomEnabled':\n      return { renderer: { bloom: { enabled: !!value } } };\n    case 'bloomIntensity':\n      return { renderer: { bloom: { intensity: value } } };\n    case 'bloomRadius':\n      return { renderer: { bloom: { radius: value } } };\n    case 'bloomThreshold':\n      return { renderer: { bloom: { threshold: value } } };\n    case 'bloomSmoothing':\n      return { renderer: { bloom: { smoothing: value } } };\n    case 'bloomLevels':\n      return { renderer: { bloom: { levels: value } } };\n    case 'bloomMipmapBlur':\n      return { renderer: { bloom: { mipmapBlur: !!value } } };\n    case 'dofEnabled':\n      return { renderer: { depthOfField: { enabled: !!value } } };\n    case 'dofAutofocus':\n      return { renderer: { depthOfField: { autofocus: !!value } } };\n    case 'dofFocusDistance':\n      return { renderer: { depthOfField: { focusDistance: value } } };\n    case 'dofFocalLength':\n      return { renderer: { depthOfField: { focalLength: value } } };\n    case 'dofBokehScale':\n      return { renderer: { depthOfField: { bokehScale: value } } };\n    case 'dofResolutionScale':\n      return { renderer: { depthOfField: { resolutionScale: value } } };\n    case 'dofResponse':\n      return { renderer: { depthOfField: { response: value } } };\n    case 'dofSampleInterval':\n      return { renderer: { depthOfField: { sampleIntervalMs: value } } };\n    case 'emissiveMaterialIntensity':\n      return { renderer: { emissive: { materialIntensity: value } } };\n    case 'emissiveMaterialColor':\n      return { renderer: { emissive: { materialColor: value } } };\n    case 'emissiveStarfieldIntensity':\n      return { renderer: { emissive: { starfieldIntensity: value } } };\n    case 'emissiveGalaxyIntensity':\n      return { renderer: { emissive: { galaxyIntensity: value } } };\n    case 'emissiveSunIntensity':\n      return { renderer: { emissive: { sunIntensity: value } } };\n    case 'motionBlurEnabled':\n      return { renderer: { motionBlur: { enabled: !!value } } };\n    case 'motionBlurIntensity':\n      return { renderer: { motionBlur: { intensity: value } } };\n    case 'motionBlurMaxSpeed':\n      return { renderer: { motionBlur: { maxSpeed: value } } };\n    case 'motionBlurSmoothing':\n      return { renderer: { motionBlur: { smoothing: value } } };\n    case 'motionBlurDampMin':\n      return { renderer: { motionBlur: { dampMin: value } } };\n    case 'motionBlurDampMax':\n      return { renderer: { motionBlur: { dampMax: value } } };\n    case 'speedFovEnabled':\n      return { renderer: { speedFov: { enabled: !!value } } };\n    case 'speedFovBase':\n      return { renderer: { speedFov: { baseFov: value } } };\n    case 'speedFovMaxBoost':\n      return { renderer: { speedFov: { maxBoost: value } } };\n    case 'speedFovMaxSpeed':\n      return { renderer: { speedFov: { maxSpeed: value } } };\n    case 'speedFovSmoothing':\n      return { renderer: { speedFov: { smoothing: value } } };\n    case 'audioEnabled':\n      return { audio: { enabled: !!value } };\n    case 'audioWindEnabled':\n      return { audio: { wind: { enabled: !!value } } };\n    case 'audioWindVolume':\n      return { audio: { wind: { volume: value } } };\n    case 'audioWindGustiness':\n      return { audio: { wind: { gustiness: value } } };\n    case 'audioWindSpeedScale':\n      return { audio: { wind: { speedScale: value } } };\n    case 'audioWindMaxSpeed':\n      return { audio: { wind: { maxSpeedMps: value } } };\n    case 'audioWindMinSpeed':\n      return { audio: { wind: { minSpeedMps: value } } };\n    case 'audioWindVerticalScale':\n      return { audio: { wind: { verticalScale: value } } };\n    case 'audioWindMass':\n      return { audio: { wind: { mass: value } } };\n    case 'audioSpeakEnabled':\n      return { audio: { speak: { enabled: !!value } } };\n    case 'audioSpeakMode':\n      return { audio: { speak: { mode: value === 'always_on' ? 'always_on' : 'push_to_talk' } } };\n    case 'audioSpeakPushToTalkKey':\n      return { audio: { speak: { pushToTalkKey: String(value || 'KeyV') } } };\n    case 'audioSpeakRadiusM':\n      return { audio: { speak: { radiusM: value } } };\n    case 'date':\n      if (!value) return null;\n      return {\n        lighting: {\n          date: mergeLightingDate({ currentDate: getDate(), dateInput: value }).toISOString(),\n          timeSpeed: 0\n        }\n      };\n    case 'time':\n      if (!value) return null;\n      return {\n        lighting: {\n          date: mergeLightingDate({ currentDate: getDate(), timeInput: value }).toISOString(),\n          timeSpeed: 0\n        }\n      };\n    case 'timeSpeed':\n      return { lighting: { timeSpeed: value } };\n    case 'quickTime': {\n      const label = String(value || '').toLowerCase();\n      if (label === 'now') {\n        return { lighting: { date: null, timeSpeed: 1 } };\n      }\n      const next = buildQuickTimeDate(label, getDate());\n      return next\n        ? { lighting: { date: next.toISOString(), timeSpeed: 0 } }\n        : null;\n    }\n    case 'useSimplified':\n      return { lighting: { simplified: !!value } };\n    case 'atmosphereEnabled':\n      return { atmosphere: { enabled: !!value } };\n    case 'atmBaseOffset':\n      return { atmosphere: { baseOffsetMeters: value } };\n    case 'atmSurfaceBaseOffset':\n      return { atmosphere: { surfaceBaseOffsetMeters: value } };\n    case 'atmIrradianceScale':\n      return { atmosphere: { irradianceScale: value } };\n    case 'atmShadowRadius':\n      return { atmosphere: { shadowRadius: value } };\n    case 'atmSkyAlphaScale':\n      return { atmosphere: { skyTuning: { alphaScale: value } } };\n    case 'atmSkyAlphaClamp':\n      return { atmosphere: { skyTuning: { alphaClamp: value } } };\n    case 'atmSkyLimbBoost':\n      return { atmosphere: { skyTuning: { limbBoost: value } } };\n    case 'atmSkyPathShort':\n      return { atmosphere: { skyTuning: { pathShort: value } } };\n    case 'atmSkyLimbMax':\n      return { atmosphere: { skyTuning: { limbMax: value } } };\n    case 'atmSkyDensityScale':\n      return { atmosphere: { skyTuning: { densityScale: value } } };\n    case 'atmSkyScaleHeight':\n      return { atmosphere: { skyTuning: { scaleHeight: value } } };\n    case 'atmSkyVerticalFadeStart':\n      return { atmosphere: { skyTuning: { verticalFadeStart: value } } };\n    case 'atmSkyVerticalFadeEnd':\n      return { atmosphere: { skyTuning: { verticalFadeEnd: value } } };\n    case 'atmSkyAltitudeFadeStart':\n      return { atmosphere: { skyTuning: { altitudeFadeStart: value } } };\n    case 'atmSkyAltitudeFadeEnd':\n      return { atmosphere: { skyTuning: { altitudeFadeEnd: value } } };\n    case 'atmSkyOutsideFadeStart':\n      return { atmosphere: { skyTuning: { outsideFadeStart: value } } };\n    case 'atmSkyOutsideFadeEnd':\n      return { atmosphere: { skyTuning: { outsideFadeEnd: value } } };\n    case 'atmSkyDepthThreshold':\n      return { atmosphere: { skyTuning: { depthThreshold: value } } };\n    case 'atmPhotometric':\n      return { atmosphere: { photometric: !!value } };\n    case 'atmSunIrradiance':\n      return { atmosphere: { sunIrradiance: !!value } };\n    case 'atmSkyIrradiance':\n      return { atmosphere: { skyIrradiance: !!value } };\n    case 'atmTransmittance':\n      return { atmosphere: { transmittance: !!value } };\n    case 'atmInscatter':\n      return { atmosphere: { inscatter: !!value } };\n    case 'atmSpecularMap':\n      return { atmosphere: { specularMap: { enabled: !!value } } };\n    case 'atmSpecularStrength':\n      return { atmosphere: { specularMap: { strength: value } } };\n    case 'oceanEnabled':\n      return { atmosphere: { water: { enabled: !!value } } };\n    case 'oceanOpacity':\n      return { atmosphere: { water: { opacity: value } } };\n    case 'oceanNormalScale':\n      return { atmosphere: { water: { normalScale: value } } };\n    case 'oceanDistortion':\n      return { atmosphere: { water: { distortion: value } } };\n    case 'oceanSpecularStrength':\n      return { atmosphere: { water: { specularStrength: value } } };\n    case 'oceanFresnelStrength':\n      return { atmosphere: { water: { fresnelStrength: value } } };\n    case 'oceanSpeed':\n      return { atmosphere: { water: { speed: value } } };\n    case 'atmSimpleClouds':\n      return { atmosphere: { simpleClouds: { enabled: !!value } } };\n    case 'atmSimpleCloudsOpacity':\n      return { atmosphere: { simpleClouds: { opacity: value } } };\n    case 'atmSimpleCloudsShadowStrength':\n      return { atmosphere: { simpleClouds: { shadowStrength: value } } };\n    case 'atmSimpleCloudsBlendMode':\n      return { atmosphere: { simpleClouds: { blendMode: String(value || 'overlay') } } };\n    case 'atmSimpleCloudsShadowHeight':\n      return { atmosphere: { simpleClouds: { shadowHeightMeters: value } } };\n    case 'atmSimpleCloudsAlphaThreshold':\n      return { atmosphere: { simpleClouds: { alphaThreshold: value } } };\n    case 'atmSimpleCloudsAlphaSoftness':\n      return { atmosphere: { simpleClouds: { alphaSoftness: value } } };\n    case 'lightPollutionEnabled':\n      return { atmosphere: { lightPollution: { enabled: !!value } } };\n    case 'lightPollutionIntensity':\n      return { atmosphere: { lightPollution: { intensity: value } } };\n    case 'lightPollutionMapGain':\n      return { atmosphere: { lightPollution: { mapGain: value } } };\n    case 'lightPollutionEmissionThreshold':\n      return { atmosphere: { lightPollution: { emissionThreshold: value } } };\n    case 'lightPollutionEmissionSoftness':\n      return { atmosphere: { lightPollution: { emissionSoftness: value } } };\n    case 'lightPollutionEmissionPower':\n      return { atmosphere: { lightPollution: { emissionPower: value } } };\n    case 'lightPollutionEmissionBlueSuppression':\n      return { atmosphere: { lightPollution: { emissionBlueSuppression: value } } };\n    case 'lightPollutionColor':\n      return { atmosphere: { lightPollution: { color: value } } };\n    case 'lightPollutionMercator':\n      return { atmosphere: { lightPollution: { mercator: !!value } } };\n    case 'lightPollutionOffsetU':\n      return { atmosphere: { lightPollution: { offsetU: value } } };\n    case 'lightPollutionOffsetV':\n      return { atmosphere: { lightPollution: { offsetV: value } } };\n    case 'lightPollutionScaleU':\n      return { atmosphere: { lightPollution: { scaleU: value } } };\n    case 'lightPollutionScaleV':\n      return { atmosphere: { lightPollution: { scaleV: value } } };\n    case 'atmSky':\n      return { atmosphere: { sky: !!value } };\n    case 'atmSun':\n      return { atmosphere: { sun: !!value } };\n    case 'atmMoon':\n      return { atmosphere: { moon: !!value } };\n    case 'atmNightMinBrightness':\n      return { atmosphere: { nightSettings: { nightMinBrightness: value } } };\n    case 'atmNightAmbientStrength':\n      return { atmosphere: { nightSettings: { nightAmbientStrength: value } } };\n    case 'atmNightTransitionStart':\n      return { atmosphere: { nightSettings: { nightTransitionStart: value } } };\n    case 'atmNightTransitionEnd':\n      return { atmosphere: { nightSettings: { nightTransitionEnd: value } } };\n    case 'atmNightPower':\n      return { atmosphere: { nightSettings: { nightPower: value } } };\n    case 'atmNightMinIrradiance':\n      return { atmosphere: { nightMinIrradiance: value } };\n    case 'atmNightAmbientColor':\n      return { atmosphere: { nightSettings: { nightAmbientColor: value } } };\n    case 'cloudsEnabled':\n      return { atmosphere: { clouds: { enabled: !!value } } };\n    case 'cloudCoverage':\n      return { atmosphere: { clouds: { coverage: value } } };\n    case 'cloudScattering':\n      return { atmosphere: { clouds: { scatteringCoefficient: value } } };\n    case 'cloudAbsorption':\n      return { atmosphere: { clouds: { absorptionCoefficient: value } } };\n    case 'cloudTurbulenceDisp':\n      return { atmosphere: { clouds: { turbulenceDisplacement: value } } };\n    case 'cloudLightShafts':\n      return { atmosphere: { clouds: { lightShafts: !!value } } };\n    case 'cloudShapeDetail':\n      return { atmosphere: { clouds: { shapeDetail: !!value } } };\n    case 'cloudTurbulence':\n      return { atmosphere: { clouds: { turbulence: !!value } } };\n    case 'cloudHaze':\n      return { atmosphere: { clouds: { haze: !!value } } };\n    case 'cloudQualityPreset':\n      return { atmosphere: { clouds: { qualityPreset: value } } };\n    case 'cloudShadowCascadeCount':\n      return { atmosphere: { clouds: { shadow: { cascadeCount: value } } } };\n    case 'cloudShadowMapSize':\n      return { atmosphere: { clouds: { shadow: { mapSize: value } } } };\n    case 'cloudShadowMaxFar':\n      return { atmosphere: { clouds: { shadow: { maxFar: value } } } };\n    case 'cloudShadowFarScale':\n      return { atmosphere: { clouds: { shadow: { farScale: value } } } };\n    case 'cloudShadowSplitMode':\n      return { atmosphere: { clouds: { shadow: { splitMode: value } } } };\n    case 'cloudShadowSplitLambda':\n      return { atmosphere: { clouds: { shadow: { splitLambda: value } } } };\n    case 'orbitCloudsEnabled':\n      return { atmosphere: { orbitClouds: { enabled: !!value } } };\n    case 'orbitCloudsOpacity':\n      return { atmosphere: { orbitClouds: { opacity: value } } };\n    case 'orbitCloudsRefresh':\n      return { atmosphere: { orbitClouds: { refreshMinutes: value } } };\n    case 'orbitCloudsTimeStep':\n      return { atmosphere: { orbitClouds: { timeStepMinutes: value } } };\n    case 'orbitCloudsLayer':\n      return { atmosphere: { orbitClouds: { layer: value } } };\n    case 'orbitCloudsRawOverlay':\n      return { atmosphere: { orbitClouds: { rawOverlay: !!value } } };\n    case 'orbitCloudsDebugOverlay':\n      return { atmosphere: { orbitClouds: { debugOverlay: !!value } } };\n    case 'cloudLowAltitude':\n      return { atmosphere: { cloudLayers: { low: { altitude: value } } } };\n    case 'cloudLowHeight':\n      return { atmosphere: { cloudLayers: { low: { height: value } } } };\n    case 'cloudMidAltitude':\n      return { atmosphere: { cloudLayers: { mid: { altitude: value } } } };\n    case 'cloudMidHeight':\n      return { atmosphere: { cloudLayers: { mid: { height: value } } } };\n    case 'cloudHighAltitude':\n      return { atmosphere: { cloudLayers: { high: { altitude: value } } } };\n    case 'cloudHighHeight':\n      return { atmosphere: { cloudLayers: { high: { height: value } } } };\n    case 'navProfile':\n      return { camera: { navigation: { profile: value } } };\n    case 'navWalkSpeed':\n      return { camera: { surface: { moveSpeed: value } } };\n    case 'navAltitudeSpeedMax':\n      return { camera: { surface: { altitudeSpeedMax: value } } };\n    case 'navRunSpeed':\n      return { camera: { navigation: { runSpeed: value } } };\n    case 'navZoomSpeed':\n      return { camera: { navigation: { zoomSpeed: value } } };\n    case 'navRotateSpeed':\n      return { camera: { navigation: { rotateSpeed: value } } };\n    case 'navDragSpeed':\n      return { camera: { navigation: { dragSpeed: value } } };\n    case 'avatarDebugBall':\n      return { avatar: { debug: { useProxyBall: !!value } } };\n    case 'avatarDebugBallRadius':\n      return { avatar: { debug: { proxyRadius: value } } };\n    case 'avatarDebugBallColor':\n      return { avatar: { debug: { proxyColor: value } } };\n    case 'avatarFadeDuration':\n      return { avatar: { animation: { fadeDuration: value } } };\n    case 'avatarSpeedSmoothingRate':\n      return { avatar: { animation: { speedSmoothingRate: value } } };\n    case 'avatarIdleSpeedThreshold':\n      return { avatar: { animation: { idleSpeedThreshold: value } } };\n    case 'avatarRunSpeedThreshold':\n      return { avatar: { animation: { runSpeedThreshold: value } } };\n    case 'avatarDirectionThreshold':\n      return { avatar: { animation: { directionThreshold: value } } };\n    case 'avatarSpeedRefWalkForward':\n      return { avatar: { animation: { speedRef: { WalkForward: value } } } };\n    case 'avatarSpeedRefWalkBackward':\n      return { avatar: { animation: { speedRef: { WalkBackward: value } } } };\n    case 'avatarSpeedRefWalkLeft':\n      return { avatar: { animation: { speedRef: { WalkLeft: value } } } };\n    case 'avatarSpeedRefWalkRight':\n      return { avatar: { animation: { speedRef: { WalkRight: value } } } };\n    case 'avatarSpeedRefSprint':\n      return { avatar: { animation: { speedRef: { Sprint: value } } } };\n    case 'avatarSpeedRefCrouchForward':\n      return { avatar: { animation: { speedRef: { CrouchForward: value } } } };\n    case 'avatarSpeedRefCrouchBackward':\n      return { avatar: { animation: { speedRef: { CrouchBackward: value } } } };\n    case 'avatarSpeedRefCrouchLeft':\n      return { avatar: { animation: { speedRef: { CrouchLeft: value } } } };\n    case 'avatarSpeedRefCrouchRight':\n      return { avatar: { animation: { speedRef: { CrouchRight: value } } } };\n    case 'avatarHeadLookRate':\n      return { avatar: { headLook: { rate: value } } };\n    case 'avatarHeadYawMax':\n      return { avatar: { headLook: { yawMaxDeg: value } } };\n    case 'avatarHeadPitchUpMax':\n      return { avatar: { headLook: { pitchUpMaxDeg: value } } };\n    case 'avatarHeadPitchDownMax':\n      return { avatar: { headLook: { pitchDownMaxDeg: value } } };\n    case 'avatarHeadRollMax':\n      return { avatar: { headLook: { rollMaxDeg: value } } };\n    case 'avatarJumpHeight':\n      return { avatar: { jump: { height: value } } };\n    case 'avatarJumpGravity':\n      return { avatar: { jump: { gravity: value } } };\n    case 'avatarMeditateThreshold':\n      return { avatar: { local: { meditateAltitudeThreshold: value } } };\n    case 'avatarShareFriendsEnabled':\n      return { avatar: { sharing: { friends: { enabled: !!value } } } };\n    case 'avatarShareFriendsLocation':\n      return { avatar: { sharing: { friends: { location: !!value } } } };\n    case 'avatarShareFriendsAltitude':\n      return { avatar: { sharing: { friends: { altitude: !!value } } } };\n    case 'avatarShareFriendsOrientation':\n      return { avatar: { sharing: { friends: { orientation: !!value } } } };\n    case 'avatarShareFriendsMotion':\n      return { avatar: { sharing: { friends: { motion: !!value } } } };\n    case 'avatarShareFriendsLabel':\n      return { avatar: { sharing: { friends: { label: !!value } } } };\n    case 'avatarShareFriendsView':\n      return { avatar: { sharing: { friends: { view: !!value } } } };\n    case 'avatarSharePublicEnabled':\n      return { avatar: { sharing: { public: { enabled: !!value } } } };\n    case 'avatarSharePublicLocation':\n      return { avatar: { sharing: { public: { location: !!value } } } };\n    case 'avatarSharePublicAltitude':\n      return { avatar: { sharing: { public: { altitude: !!value } } } };\n    case 'avatarSharePublicOrientation':\n      return { avatar: { sharing: { public: { orientation: !!value } } } };\n    case 'avatarSharePublicMotion':\n      return { avatar: { sharing: { public: { motion: !!value } } } };\n    case 'avatarSharePublicLabel':\n      return { avatar: { sharing: { public: { label: !!value } } } };\n    case 'avatarSharePublicView':\n      return { avatar: { sharing: { public: { view: !!value } } } };\n    case 'tileBudget':\n      return { terrain: { lod: { tileBudget: value } } };\n    case 'splitBudget':\n      return { terrain: { lod: { splitBudget: value } } };\n    case 'mergeBudget':\n      return { terrain: { lod: { mergeBudget: value } } };\n    case 'seamInterpolation':\n      return { terrain: { lod: { seamInterpolation: !!value } } };\n    case 'batchSize':\n      return { terrain: { elevation: { batchSize: value } } };\n    case 'maxConcurrent':\n      return { terrain: { elevation: { maxConcurrent: value } } };\n    case 'minInterval':\n      return { terrain: { elevation: { minIntervalMs: value } } };\n    case 'elevSurfaceMinLevel':\n      return { terrain: { elevation: { surfaceMinLevel: value } } };\n    case 'elevMaxVertexRecords':\n      return { terrain: { elevation: { maxVertexRecords: value } } };\n    case 'elevRingNearKm':\n      return { terrain: { elevation: { ringNearMeters: value * 1000 } } };\n    case 'elevRingMidKm':\n      return { terrain: { elevation: { ringMidMeters: value * 1000 } } };\n    case 'elevRingBudgetNear':\n      return { terrain: { elevation: { ringBudgetNear: value } } };\n    case 'elevRingBudgetMid':\n      return { terrain: { elevation: { ringBudgetMid: value } } };\n    case 'maxKBPerMin':\n      return { terrain: { elevation: { maxKBPerMinute: value } } };\n    case 'elevQueueResetKm':\n      return { terrain: { elevation: { queueResetDistanceM: value * 1000 } } };\n    case 'elevQueueResetAngle':\n      return { terrain: { elevation: { queueResetAngleDeg: value } } };\n    case 'surfaceMaxLod':\n      return {\n        terrain: {\n          surface: {\n            staging: { maxLOD: value },\n            falloff: { nearLOD: value }\n          },\n          elevation: {\n            ringLodCaps: computeRingLodCaps(value, read('scene.terrain.surface.falloff.power', 0.8))\n          }\n        }\n      };\n    case 'surfaceFarLod':\n      return { terrain: { surface: { falloff: { farLOD: value } } } };\n    case 'surfaceFalloffPower':\n      return {\n        terrain: {\n          surface: { falloff: { power: value } },\n          elevation: {\n            ringLodCaps: computeRingLodCaps(\n              read('scene.terrain.surface.staging.maxLOD', 15),\n              value\n            )\n          }\n        }\n      };\n    case 'surfaceStageMinLod':\n      return { terrain: { surface: { staging: { minLOD: value } } } };\n    case 'surfaceStageMaxLod':\n      return { terrain: { surface: { staging: { maxLOD: value } } } };\n    case 'surfaceStageCooldown':\n      return { terrain: { surface: { staging: { cooldownMs: value } } } };\n    case 'surfaceLodNear':\n      return { terrain: { surface: { falloff: { nearLOD: value } } } };\n    case 'surfaceLodStart':\n      return { terrain: { surface: { falloff: { startDeg: value } } } };\n    case 'surfaceCullAngle':\n      return { terrain: { surface: { staging: { cullAngleDeg: value } } } };\n    case 'orbitFalloffMargin':\n      return { terrain: { orbit: { falloff: { marginDeg: value } } } };\n    case 'orbitFalloffAnchor':\n      return { terrain: { orbit: { falloff: { anchorDeg: value } } } };\n    case 'orbitLodFalloff':\n      return { terrain: { orbit: { falloff: { power: value } } } };\n    case 'pathLateralMaxDeg':\n      return { pathfinding: { lateralMaxDeg: value } };\n    case 'pathStepsS':\n      return { pathfinding: { stepsS: value } };\n    case 'pathStepsT':\n      return { pathfinding: { stepsT: value } };\n    case 'pathUphill':\n      return { pathfinding: { costs: { uphill: value } } };\n    case 'pathDownhill':\n      return { pathfinding: { costs: { downhill: value } } };\n    case 'pathElevDelta':\n      return { pathfinding: { costs: { elevDelta: value } } };\n    case 'pathSlopeSq':\n      return { pathfinding: { costs: { slopeSq: value } } };\n    case 'pathLateral':\n      return { pathfinding: { costs: { lateral: value } } };\n    case 'pathDistance':\n      return { pathfinding: { costs: { distance: value } } };\n    case 'pathHigh':\n      return { pathfinding: { costs: { high: value } } };\n    case 'pathRough':\n      return { pathfinding: { costs: { rough: value } } };\n    case 'pathSmooth':\n      return { pathfinding: { smooth: value } };\n    case 'imageryEnabled':\n      return { terrain: { imagery: { enabled: !!value } } };\n    case 'imageryVersion':\n      return { terrain: { imagery: { versionId: value } } };\n    case 'imageryMaxZoom':\n      return { terrain: { imagery: { maxZoom: value } } };\n    case 'imageryMaxAtlasTiles':\n      return { terrain: { imagery: { config: { maxAtlasTiles: value } } } };\n    case 'imageryPadTiles':\n      return { terrain: { imagery: { config: { padTiles: value } } } };\n    case 'imageryTileCacheMB':\n      return { terrain: { imagery: { config: { maxTileCacheMB: value } } } };\n    case 'imageryAtlasCacheMB':\n      return { terrain: { imagery: { config: { maxAtlasCacheMB: value } } } };\n    case 'imageryResolutionBoost':\n      return { terrain: { imagery: { resolutionBoost: value } } };\n    case 'photogramEnabled':\n      return { terrain: { photogrammetry: { enabled: !!value } } };\n    case 'photogramRing0Only':\n      return { terrain: { photogrammetry: { ring0Only: !!value } } };\n    case 'photogramInvert':\n      return { terrain: { photogrammetry: { invertHeight: !!value } } };\n    case 'photogramAutoSun':\n      return { terrain: { photogrammetry: { autoSun: !!value } } };\n    case 'photogramMapResolution':\n      return { terrain: { photogrammetry: { mapResolution: value } } };\n    case 'photogramPyramidLevels':\n      return { terrain: { photogrammetry: { pyramidLevels: value } } };\n    case 'photogramIllumBlur':\n      return { terrain: { photogrammetry: { illumBlurRadius: value } } };\n    case 'photogramDisp':\n      return { terrain: { photogrammetry: { displacementScale: value } } };\n    case 'photogramDetail':\n      return { terrain: { photogrammetry: { detailGain: value } } };\n    case 'photogramShadowMicro':\n      return { terrain: { photogrammetry: { shadowMicro: value } } };\n    case 'photogramDirMicro':\n      return { terrain: { photogrammetry: { dirMicro: value } } };\n    case 'photogramCanopyScale':\n      return { terrain: { photogrammetry: { canopyScale: value } } };\n    case 'photogramVegThr':\n      return { terrain: { photogrammetry: { vegThreshold: value } } };\n    case 'photogramShadowThr':\n      return { terrain: { photogrammetry: { shadowThreshold: value } } };\n    case 'photogramMaxShadow':\n      return { terrain: { photogrammetry: { maxShadowLenPx: value } } };\n    case 'photogramCanopyBlur':\n      return { terrain: { photogrammetry: { canopyBlurPx: value } } };\n    case 'photogramDome':\n      return { terrain: { photogrammetry: { domeStrength: value } } };\n    case 'photogramSmooth':\n      return { terrain: { photogrammetry: { smoothPasses: value } } };\n    case 'photogramSunAz':\n      return { terrain: { photogrammetry: { sunAzimuthDeg: value } } };\n    case 'photogramSunEl':\n      return { terrain: { photogrammetry: { sunElevationDeg: value } } };\n    case 'photogramTiles':\n      return { terrain: { photogrammetry: { tilesPerAxis: value } } };\n    case 'photogramSubdiv':\n      return { terrain: { photogrammetry: { subdivPerTile: value } } };\n    case 'photogramMaxSubdiv':\n      return { terrain: { photogrammetry: { maxSubdiv: value } } };\n    case 'photogramMinZoom':\n      return { terrain: { photogrammetry: { minImageryZoom: value } } };\n    case 'photogramNormalizeMode':\n      return { terrain: { photogrammetry: { normalizeMode: value } } };\n    case 'photogramOffsetClamp':\n      return { terrain: { photogrammetry: { offsetClampMeters: value } } };\n    case 'photogramMinElevComplete':\n      return { terrain: { photogrammetry: { minElevationCompletion: value } } };\n    case 'photogramEdgeFade':\n      return { terrain: { photogrammetry: { edgeFade: value } } };\n    case 'photogramMaxJobs':\n      return { terrain: { photogrammetry: { maxJobsPerFrame: value } } };\n    case 'photogramMaxConcurrent':\n      return { terrain: { photogrammetry: { maxConcurrentJobs: value } } };\n    case 'photogramMaxMs':\n      return { terrain: { photogrammetry: { maxProcessingMs: value } } };\n    case 'photogramCacheMax':\n      return { terrain: { photogrammetry: { cacheMaxTiles: value } } };\n    case 'weatherEnabled':\n      return { weather: { enabled: !!value } };\n    case 'weatherAuto':\n      return { weather: { autoTarget: !!value } };\n    case 'geojson':\n      return { debug: { geoJson: !!value } };\n    case 'geojsonAutoDepth':\n      return { debug: { geoJsonAutoDepth: !!value } };\n    case 'geojsonMaxDepth':\n      return { debug: { geoJsonMaxAdminLevel: value } };\n    case 'geojsonAdminLevel':\n      return { debug: { geoJsonAdminLevel: value } };\n    case 'geojsonCountry':\n      return { debug: { geoJsonCountry: value || null } };\n    case 'geojsonSource':\n      return { debug: { geoJsonSource: value } };\n    case 'geojsonSelection':\n      return {\n        debug: {\n          geoJsonAdminLevel: value?.adminLevel ?? 0,\n          geoJsonCountry: value?.country || null,\n          geoJsonSource: value?.source || 'world.geojson',\n        },\n      };\n    case 'geojsonAurora':\n      return { debug: { geoJsonAurora: !!value } };\n    case 'geojsonLabels':\n      return { debug: { geoJsonLabels: !!value } };\n    case 'geojsonLabelScaleCapAlt':\n      return { debug: { geoJsonLabelScaleCapAltM: value } };\n    case 'geojsonLabelScaleReleaseAlt':\n      return { debug: { geoJsonLabelScaleReleaseAltM: value } };\n    case 'geojsonLabelBorderRetireAlt':\n      return { debug: { geoJsonLabelBorderRetireAltM: value } };\n    case 'geojsonFarMaxLevelAlt':\n      return { debug: { geoJsonFarMaxAdminLevelAltM: value } };\n    case 'geojsonFarMaxLevel':\n      return { debug: { geoJsonFarMaxAdminLevel: value } };\n    case 'raycastLinePrecision':\n      return { debug: { raycastLinePrecision: value } };\n    case 'buildingsEnabled':\n      return buildLabelCategoryControlPatch('buildings', value);\n    case 'buildingsRadius':\n      return { buildings: { radiusM: value } };\n    case 'buildingsMaxFeatures':\n      return { buildings: { maxFeatures: value } };\n    case 'buildingsSurfaceOffset':\n      return { buildings: { surfaceOffsetM: value } };\n    case 'buildingsFalloff':\n      return { buildings: { falloffStartM: value } };\n    case 'buildingsResnapInterval':\n      return { buildings: { resnapIntervalMs: value } };\n    case 'buildingsResnapBudget':\n      return { buildings: { resnapBudget: value } };\n    case 'buildingsResnapTolerance':\n      return { buildings: { resnapToleranceM: value } };\n    case 'buildingsResnapFreezeFrames':\n      return { buildings: { resnapFreezeFrames: value } };\n    case 'buildingsTileDrivenResnap':\n      return { buildings: { tileDrivenResnap: !!value } };\n    case 'buildingsFallbackResnapInterval':\n      return { buildings: { fallbackResnapIntervalMs: value } };\n    case 'buildingsMaxSamples':\n      return { buildings: { maxSamplesPerBuilding: value } };\n    case 'buildingsLodDetailRadius':\n      return { buildings: { lodDetailRadiusM: value } };\n    case 'buildingsLodImpostorRadius':\n      return { buildings: { lodImpostorRadiusM: value } };\n    case 'buildingsLodUpdateInterval':\n      return { buildings: { lodUpdateIntervalMs: value } };\n    case 'buildingsLodBudget':\n      return { buildings: { lodBudget: value } };\n    case 'buildingsLodHysteresis':\n      return { buildings: { lodHysteresisM: value } };\n    case 'buildingsImpostorEnabled':\n      return { buildings: { impostorEnabled: !!value } };\n    case 'buildingsImpostorMinSize':\n      return { buildings: { impostorMinSizeM: value } };\n    case 'buildingsImpostorMinHeight':\n      return { buildings: { impostorMinHeightM: value } };\n    case 'buildingsImpostorHeightScale':\n      return { buildings: { impostorHeightScale: value } };\n    case 'buildingsImpostorRebuildBudget':\n      return { buildings: { impostorRebuildBudget: value } };\n    case 'buildingsPolypEnabled':\n      return { buildings: { polypEnabled: !!value } };\n    case 'buildingsPolypMinPointSpacing':\n      return { buildings: { polypMinPointSpacingM: value } };\n    case 'buildingsPolypMaxPoints':\n      return { buildings: { polypMaxPointsPerFootprint: value } };\n    case 'buildingsPolypMaxEntries':\n      return { buildings: { polypMaxEntriesPerTile: value } };\n    case 'buildingsPolypHeightScale':\n      return { buildings: { polypHeightScale: value } };\n    case 'buildingsPolypMinHeight':\n      return { buildings: { polypMinHeightM: value } };\n    case 'buildingsPolypBakeToTiles':\n      return { buildings: { polypBakeToTiles: !!value } };\n    case 'buildingsImageryEnabled':\n      return { buildings: { imageryEnabled: !!value } };\n    case 'buildingsImageryUpdateInterval':\n      return { buildings: { imageryUpdateIntervalMs: value } };\n    case 'buildingsPhotorealFallbackEnabled':\n      return { buildings: { photorealFallbackEnabled: !!value } };\n    case 'buildingsPhotoProbeRaysPerFrame':\n      return { buildings: { photoProbeRaysPerFrame: value } };\n    case 'buildingsPhotoProbeBudgetMs':\n      return { buildings: { photoProbeBudgetMs: value } };\n    case 'buildingsPhotoCoverageMinHeightM':\n      return { buildings: { photoCoverageMinHeightM: value } };\n    case 'buildingsPhotoExteriorMarginM':\n      return { buildings: { photoExteriorMarginM: value } };\n    case 'infraEnabled':\n      return buildLabelCategoryControlPatch('infrastructure', value);\n    case 'infraRoadsEnabled':\n      return { infrastructure: { layers: { roads: !!value } } };\n    case 'infraBridgesEnabled':\n      return { infrastructure: { layers: { bridges: !!value } } };\n    case 'infraWaterwaysEnabled':\n      return { infrastructure: { layers: { waterways: !!value } } };\n    case 'infraAreasEnabled':\n      return { infrastructure: { layers: { areas: !!value } } };\n    case 'infraRailwaysEnabled':\n      return { infrastructure: { layers: { railways: !!value } } };\n    case 'infraPowerEnabled':\n      return buildOpenInfraMapLayerPatch('power', !!value);\n    case 'infraTelecomsEnabled':\n      return buildOpenInfraMapLayerPatch('telecoms', !!value);\n    case 'infraPetroleumEnabled':\n      return buildOpenInfraMapLayerPatch('petroleum', !!value);\n    case 'infraWaterEnabled':\n      return buildOpenInfraMapLayerPatch('water', !!value);\n    case 'infraInternetEnabled':\n      return buildOpenInfraMapLayerPatch('internet', !!value);\n    case 'infraSolarEnabled':\n      return buildOpenInfraMapLayerPatch('solar', !!value);\n    case 'infraNuclearEnabled':\n      return buildOpenInfraMapLayerPatch('nuclear', !!value);\n    case 'infraRadiusM':\n      return { infrastructure: { radiusM: value } };\n    case 'infraRefreshDistanceM':\n      return { infrastructure: { refreshDistanceM: value } };\n    case 'infraSurfaceOffsetM':\n      return { infrastructure: { surfaceOffsetM: value } };\n    case 'infraRoadWidthScale':\n      return { infrastructure: { roadWidthScale: value } };\n    case 'infraRoadStepM':\n      return { infrastructure: { roadStepM: value } };\n    case 'infraBridgeHeightM':\n      return { infrastructure: { bridgeHeightM: value } };\n    case 'infraRibbonThicknessM':\n      return { infrastructure: { ribbonThicknessM: value } };\n    case 'infraTileDrivenResnap':\n      return { infrastructure: { tileDrivenResnap: !!value } };\n    case 'infraResnapIntervalMs':\n      return { infrastructure: { resnapIntervalMs: value } };\n    case 'infraResnapBudget':\n      return { infrastructure: { resnapBudget: value } };\n    case 'infraDrapeBudget':\n      return { infrastructure: { drapeBudget: value } };\n    case 'infraAlignFreezeFrames':\n      return { infrastructure: { alignFreezeFrames: value } };\n    case 'infraAlignToleranceM':\n      return { infrastructure: { alignToleranceM: value } };\n    case 'infraAlignSampleStepM':\n      return { infrastructure: { alignSampleStepM: value } };\n    case 'infraAlignMaxSamples':\n      return { infrastructure: { alignMaxSamples: value } };\n    case 'infraPauseWhenFar':\n      return { infrastructure: { pauseWhenFar: !!value } };\n    case 'infraPauseDistanceM':\n      return { infrastructure: { pauseDistanceM: value } };\n    case 'infraPauseDistanceMultiplier':\n      return { infrastructure: { pauseDistanceMultiplier: value } };\n    case 'infraRoadColor':\n      return { infrastructure: { colors: { roads: value } } };\n    case 'infraBridgeColor':\n      return { infrastructure: { colors: { bridges: value } } };\n    case 'infraWaterwayColor':\n      return { infrastructure: { colors: { waterways: value } } };\n    case 'infraAreaColor':\n      return { infrastructure: { colors: { areas: value } } };\n    case 'infraRailwayColor':\n      return { infrastructure: { colors: { railways: value } } };\n    case 'infraPaintEnabled':\n      return { infrastructure: { paint: { enabled: !!value } } };\n    case 'infraPaintResolution':\n      return { infrastructure: { paint: { resolution: value } } };\n    case 'infraPaintLineWidthPx':\n      return { infrastructure: { paint: { lineWidthPx: value } } };\n    case 'infraPaintOpacity':\n      return { infrastructure: { paint: { opacity: value } } };\n    case 'infraPaintRepaintOnLod':\n      return { infrastructure: { paint: { repaintOnLod: !!value } } };\n    case 'infraPaintBudget':\n      return { infrastructure: { paint: { budget: value } } };\n    case 'meshtasticEnabled':\n      return { meshtastic: { enabled: !!value } };\n    case 'meshtasticApiUrl':\n      return { meshtastic: { apiUrl: value } };\n    case 'meshtasticPollInterval':\n      return { meshtastic: { pollIntervalMs: value } };\n    case 'meshtasticShowLabels':\n      return { meshtastic: { showLabels: !!value } };\n    case 'flightsEnabled':\n      return buildLabelCategoryControlPatch('aircraft', value);\n    case 'flightsProvider':\n      return { flights: { provider: value } };\n    case 'flightsQueryMode':\n      return { flights: { queryMode: value } };\n    case 'flightsQueryValue':\n      return { flights: { queryValue: value } };\n    case 'flightsRadiusNm':\n      return { flights: { radiusNm: value } };\n    case 'flightsConeAngle':\n      return { flights: { coneAngleDeg: value } };\n    case 'flightsMaxAircraft':\n      return { flights: { maxAircraft: value } };\n    case 'flightsPollInterval':\n      return { flights: { pollIntervalMs: value } };\n    case 'flightsStaleMs':\n      return { flights: { staleAfterMs: value } };\n    case 'flightsPredictionMs':\n      return { flights: { predictionMaxMs: value } };\n    case 'flightsModelUrl':\n      return { flights: { modelUrl: value } };\n    case 'flightsModelScale':\n      return { flights: { modelScale: value } };\n    case 'flightsHeadingOffset':\n      return { flights: { headingOffsetDeg: value } };\n    case 'flightsAltitudeOffset':\n      return { flights: { altitudeOffsetM: value } };\n    case 'flightsShowPaths':\n      return { flights: { showPaths: !!value } };\n    case 'flightsPathHours':\n      return { flights: { pathHours: value } };\n    case 'flightsPathMaxPoints':\n      return { flights: { pathMaxPoints: value } };\n    case 'satellitesEnabled':\n      return buildLabelCategoryControlPatch('satellites', value);\n    case 'satellitesProvider':\n      return { satellites: { provider: value } };\n    case 'satellitesQueryMode':\n      return { satellites: { queryMode: value } };\n    case 'satellitesQueryValue':\n      return { satellites: { queryValue: value } };\n    case 'satellitesMaxSatellites':\n      return { satellites: { maxSatellites: value } };\n    case 'satellitesPollInterval':\n      return { satellites: { pollIntervalMs: value } };\n    case 'satellitesStaleMs':\n      return { satellites: { staleAfterMs: value } };\n    case 'satellitesConeAngle':\n      return { satellites: { coneAngleDeg: value } };\n    case 'satellitesModelScale':\n      return { satellites: { modelScale: value } };\n    case 'satellitesAltitudeOffset':\n      return { satellites: { altitudeOffsetM: value } };\n    case 'satellitesShowOrbits':\n      return { satellites: { showOrbits: !!value } };\n    case 'satellitesOrbitSamples':\n      return { satellites: { orbitSamples: value } };\n    case 'satellitesOrbitWindow':\n      return { satellites: { orbitWindowMinutes: value } };\n    case 'maritimeEnabled':\n      return buildLabelCategoryControlPatch('maritime', value);\n    case 'maritimeProvider':\n      return { maritime: { provider: value } };\n    case 'maritimeQueryMode':\n      return { maritime: { queryMode: value } };\n    case 'maritimeQueryValue':\n      return { maritime: { queryValue: value } };\n    case 'maritimeRadiusNm':\n      return { maritime: { radiusNm: value } };\n    case 'maritimeConeAngle':\n      return { maritime: { coneAngleDeg: value } };\n    case 'maritimeMaxVessels':\n      return { maritime: { maxVessels: value } };\n    case 'maritimePollInterval':\n      return { maritime: { pollIntervalMs: value } };\n    case 'maritimeStaleMs':\n      return { maritime: { staleAfterMs: value } };\n    case 'maritimePredictionMs':\n      return { maritime: { predictionMaxMs: value } };\n    case 'maritimeLookbackMinutes':\n      return { maritime: { lookbackMinutes: value } };\n    case 'maritimeModelScale':\n      return { maritime: { modelScale: value } };\n    case 'maritimeHeadingOffset':\n      return { maritime: { headingOffsetDeg: value } };\n    case 'maritimeAltitudeOffset':\n      return { maritime: { altitudeOffsetM: value } };\n    case 'maritimeSmoothingMs':\n      return { maritime: { smoothingMs: value } };\n    case 'maritimeShowPaths':\n      return { maritime: { showPaths: !!value } };\n    case 'maritimePathHours':\n      return { maritime: { pathHours: value } };\n    case 'maritimePathMaxPoints':\n      return { maritime: { pathMaxPoints: value } };\n    case 'incidentsEnabled':\n      return buildLabelCategoryControlPatch('incidents', value);\n    case 'sensorsEnabled':\n      return buildLabelCategoryControlPatch('sensors', value);\n    case 'incidentsAgencyIds': {\n      const nextIds = Array.isArray(value)\n        ? value\n        : (typeof value === 'string'\n          ? value.split(',').map((entry) => entry.trim()).filter(Boolean)\n          : []);\n      return { incidents: { agencyIds: nextIds } };\n    }\n    case 'incidentsRadius':\n      return { incidents: { radiusM: value } };\n    case 'incidentsMax':\n      return { incidents: { maxIncidents: value } };\n    case 'incidentsPollInterval':\n      return { incidents: { pollIntervalMs: value } };\n    case 'incidentsMarkerScale':\n    case 'incidentsSpireHeight':\n      return { incidents: { markerScaleM: value, spireHeightM: value } };\n    case 'incidentsSpireRadius':\n      return { incidents: { spireRadiusM: value } };\n    case 'incidentsSurfaceOffset':\n      return { incidents: { surfaceOffsetM: value } };\n    case 'incidentsIncludeRecent':\n      return { incidents: { includeRecent: !!value } };\n    case 'incidentsIncludeAlerts':\n      return { incidents: { includeAlerts: !!value } };\n    case 'incidentsPublicOnly':\n      return { incidents: { publicOnly: !!value } };\n    case 'incidentsHideMedical':\n      return { incidents: { hideMedical: !!value } };\n    case 'incidentsShowLabels':\n      return { incidents: { showLabels: !!value } };\n    case 'incidentsLabelScale':\n      return { incidents: { labelScaleM: value } };\n    case 'incidentsLabelCone':\n      return { incidents: { labelViewConeDeg: value } };\n    case 'incidentsAutoZip':\n      return { incidents: { autoZipEnabled: !!value } };\n    case 'wireframeSurfaceColor':\n      return { debug: { wireframeStyle: { surfaceColor: value } } };\n    case 'wireframeLineColor':\n      return { debug: { wireframeStyle: { lineColor: value } } };\n    case 'wireframeStyleMode':\n      return { debug: { wireframeStyle: { mode: value } } };\n    case 'wireframeAccent':\n      return { debug: { wireframeStyle: { accent: value } } };\n    case 'wireframeAccentSoft':\n      return { debug: { wireframeStyle: { accentSoft: value } } };\n    case 'wireframeAccentStrong':\n      return { debug: { wireframeStyle: { accentStrong: value } } };\n    case 'wireframeTerrainLine':\n      return { debug: { wireframeStyle: { terrainLine: value } } };\n    case 'wireframeTerrainLineOverlay':\n      return { debug: { wireframeStyle: { terrainLineOverlay: !!value } } };\n    case 'wireframeTerrainFillMin':\n      return { debug: { wireframeStyle: { terrainFillMin: value } } };\n    case 'wireframeTerrainFillMax':\n      return { debug: { wireframeStyle: { terrainFillMax: value } } };\n    case 'wireframeTerrainMaterial':\n      return { debug: { wireframeStyle: { terrainMaterial: value } } };\n    case 'wireframeHalftoneScale':\n      return { debug: { wireframeStyle: { halftoneScale: value } } };\n    case 'wireframeHalftoneStrength':\n      return { debug: { wireframeStyle: { halftoneStrength: value } } };\n    case 'wireframeHalftoneSoftness':\n      return { debug: { wireframeStyle: { halftoneSoftness: value } } };\n    case 'wireframeHalftoneAngle':\n      return { debug: { wireframeStyle: { halftoneAngle: value } } };\n    case 'wireframeBuildingFill':\n      return { debug: { wireframeStyle: { buildingFill: value } } };\n    case 'wireframeBuildingLine':\n      return { debug: { wireframeStyle: { buildingLine: value } } };\n    case 'wireframeTopoEnabled':\n      return { debug: { wireframeStyle: { topoEnabled: !!value } } };\n    case 'wireframeTopoInterval':\n      return { debug: { wireframeStyle: { topoInterval: value } } };\n    case 'wireframeTopoMinorDivisions':\n      return { debug: { wireframeStyle: { topoMinorDivisions: value } } };\n    case 'flipRotation180':\n      return { debug: { flipRotation180: !!value } };\n    case 'invertQuaternion':\n      return { debug: { invertQuaternion: !!value } };\n    case 'negateSunX':\n      return { debug: { negateSunX: !!value } };\n    case 'negateSunZ':\n      return { debug: { negateSunZ: !!value } };\n    case 'invertFocusDir':\n      return { debug: { invertFocusDir: !!value } };\n    case 'negateFocusX':\n      return { debug: { negateFocusX: !!value } };\n    case 'negateFocusZ':\n      return { debug: { negateFocusZ: !!value } };\n    case 'invertCameraDir':\n      return { debug: { invertCameraDir: !!value } };\n    case 'invertCameraPos':\n      return { debug: { invertCameraPos: !!value } };\n    case 'negateCamPosX':\n      return { debug: { negateCamPosX: !!value } };\n    case 'negateCamPosZ':\n      return { debug: { negateCamPosZ: !!value } };\n    // Labels\n    case 'labelsEnabled':\n      return { labels: { enabled: !!value } };\n    case 'labelsAircraft':\n      return { labels: { categories: { aircraft: !!value } } };\n    case 'labelsMaritime':\n      return { labels: { categories: { maritime: !!value } } };\n    case 'labelsSatellites':\n      return { labels: { categories: { satellites: !!value } } };\n    case 'labelsBuildings':\n      return { labels: { categories: { buildings: !!value } } };\n    case 'labelsViewCone':\n      return { labels: { viewConeDeg: value } };\n    case 'labelsScale':\n      return { labels: { scaleMultiplier: value } };\n    case 'labelsMaxVisible':\n      return { labels: { maxVisible: value } };\n    case 'labelsIncidents':\n      return { labels: { categories: { incidents: !!value } } };\n    case 'labelsInfrastructure':\n      return { labels: { categories: { infrastructure: !!value } } };\n    default:\n      return null;\n  }\n};\n","let hudPinModalInstance = null;\n\nclass HudPinModal {\n  constructor() {\n    this.element = null;\n    this._titleEl = null;\n    this._onSelect = null;\n    this._onUnpin = null;\n    this._onClose = null;\n    this._build();\n  }\n\n  _build() {\n    if (this.element) return;\n    const modal = document.createElement('div');\n    modal.className = 'hud-pin-modal';\n    modal.innerHTML = `\n      <div class=\"hud-pin-modal-content\" role=\"dialog\" aria-modal=\"true\">\n        <div class=\"hud-pin-modal-title\">Pin</div>\n        <div class=\"hud-pin-modal-actions\">\n          <button type=\"button\" data-hud-corner=\"top-left\">Top Left</button>\n          <button type=\"button\" data-hud-corner=\"top-right\">Top Right</button>\n          <button type=\"button\" data-hud-corner=\"bottom-left\">Bottom Left</button>\n          <button type=\"button\" data-hud-corner=\"bottom-right\">Bottom Right</button>\n        </div>\n        <div class=\"hud-pin-modal-footer\">\n          <button type=\"button\" data-hud-action=\"unpin\">Unpin</button>\n          <button type=\"button\" data-hud-action=\"cancel\">Cancel</button>\n        </div>\n      </div>\n    `;\n\n    modal.addEventListener('click', (event) => {\n      if (event.target === modal) {\n        this.close();\n      }\n    });\n\n    modal.querySelectorAll('[data-hud-corner]').forEach((button) => {\n      button.addEventListener('click', () => {\n        const corner = button.getAttribute('data-hud-corner');\n        if (!corner) return;\n        if (typeof this._onSelect === 'function') {\n          this._onSelect(corner);\n        }\n        this.close();\n      });\n    });\n\n    modal.querySelectorAll('[data-hud-action]').forEach((button) => {\n      button.addEventListener('click', () => {\n        const action = button.getAttribute('data-hud-action');\n        if (action === 'unpin') {\n          if (typeof this._onUnpin === 'function') {\n            this._onUnpin();\n          }\n        }\n        this.close();\n      });\n    });\n\n    document.body.appendChild(modal);\n    this.element = modal;\n    this._titleEl = modal.querySelector('.hud-pin-modal-title');\n  }\n\n  open({ title, currentCorner = null, onSelect, onUnpin, onClose } = {}) {\n    this._onSelect = typeof onSelect === 'function' ? onSelect : null;\n    this._onUnpin = typeof onUnpin === 'function' ? onUnpin : null;\n    this._onClose = typeof onClose === 'function' ? onClose : null;\n    if (this._titleEl) {\n      this._titleEl.textContent = title || 'Pin';\n    }\n    this.element?.querySelectorAll('[data-hud-corner]').forEach((button) => {\n      const isActive = button.getAttribute('data-hud-corner') === currentCorner;\n      button.classList.toggle('active', isActive);\n    });\n    this.element?.classList.add('visible');\n  }\n\n  close() {\n    if (!this.element) return;\n    this.element.classList.remove('visible');\n    if (typeof this._onClose === 'function') {\n      this._onClose();\n    }\n    this._onSelect = null;\n    this._onUnpin = null;\n    this._onClose = null;\n  }\n\n  destroy() {\n    if (!this.element) return;\n    this.element.remove();\n    this.element = null;\n    this._titleEl = null;\n    this._onSelect = null;\n    this._onUnpin = null;\n    this._onClose = null;\n  }\n}\n\nexport function getHudPinModal() {\n  if (!hudPinModalInstance) {\n    hudPinModalInstance = new HudPinModal();\n  }\n  return hudPinModalInstance;\n}\n","/**\n * ConfigSidebar.js\n *\n * Unified right sidebar for configuration and debug settings.\n * Uses the design system components for consistent styling.\n * All debug sections are collapsible.\n */\n\nimport {\n  injectDesignSystemStyles,\n  createButton,\n  createToggle,\n  createInput,\n  createSelect,\n  createRangeSlider,\n  createCollapsible,\n  createMetric,\n  createDivider,\n  TOKENS,\n  getIconSvg,\n  ICON_SIZES,\n} from './DesignSystem.js';\nimport { buildScenePatch } from './ScenePatchUtils.js';\nimport { patchStableHtml, patchStableSelect } from './StableDom.js';\nimport { prepareDesktopSidebarPanel } from './SidebarMenuSystem.js';\nimport {\n  buildLabelCategoryControlPatch,\n  buildLabelCategoryPresetPatch,\n} from '../labels/LabelCategoryRegistry.js';\nimport { getHudPinModal } from './HudPinModal.js';\nimport { getGeocodingService, formatResultForDisplay, reverseGeocode, lookupNotice } from '../../modules/geocoding-service.js';\nimport { getPlaceSearchStore } from '../geo/PlaceSearchStore.js';\nimport { bindPlaceSearchList } from './PlaceSearchList.js';\nimport { getHudInfoStore } from '../../modules/hud-info-store.js';\nimport { getIncidentApiService } from '../incidents/IncidentApiService.js';\nimport { GeoBoundaryService } from '../geo/GeoBoundaryService.js';\nimport {\n  formatIncidentTypeLabel,\n  resolveIncidentColorHex,\n  resolveIncidentEmoji,\n} from '../incidents/IncidentTypes.js';\nimport { buildIncidentPresentation } from '../incidents/IncidentPresentation.js';\nimport { SENSOR_SOURCES, SENSOR_CATEGORIES, getAllSensorIds, getSensorsByCategory } from '../sensors/SensorRegistry.js';\nimport { getAuthService } from '../auth/AuthService.js';\nimport { getBackendApiBase, getFallbackCesiumIonToken } from '../shared/backend.js';\nimport { POSTPROCESS_BLOOM_DEFAULTS } from '../render/PostProcessingContract.js';\nimport { NIGHT_LIGHTS_EMISSION_DEFAULTS } from '../render/NightLightsEmissionContract.js';\nimport {\n  bindMeshtasticNodeRowHover,\n  filterMeshtasticNodes,\n  hasMeshtasticPosition,\n  isMeshtasticNodeLive,\n  meshtasticNodeIdFromLabelHover,\n  meshtasticNodeSummary,\n  meshtasticNodeTitle,\n  syncMeshtasticNodeListHover,\n} from '../meshtastic/MeshtasticNodeUtils.js';\nimport {\n  PHOTOREAL_ALBEDO_SCALE_DEFAULT,\n  PHOTOREAL_OCEAN_DEFAULTS,\n} from '../tiles/PhotorealAppearanceContract.js';\n\n// These values are static UI defaults. Keeping them local avoids importing\n// modules/constants.js (and its scene dependencies) into the configuration\n// chunk during application bootstrap.\nconst WGS84_MEAN_RADIUS_METERS = 6_371_008.771415059;\nconst DEFAULT_NKN_FORWARDER =\n  'forwarder.5d7bdb47e1c757508d28f5726469afa1f7c93bd037a1940aa0dab97ab421c833';\nconst KM_PER_DEG = (2 * Math.PI * WGS84_MEAN_RADIUS_METERS) / 360 / 1000;\n\nconst DEFAULT_SPEAK_PTT_KEY = 'KeyV';\nlet miniMapWidgetClassPromise = null;\n\nfunction loadMiniMapWidgetClass() {\n  if (!miniMapWidgetClassPromise) {\n    miniMapWidgetClassPromise = import('./MiniMapWidget.js').then((module) => module.MiniMapWidget);\n  }\n  return miniMapWidgetClassPromise;\n}\n\nfunction normalizeKeyboardCode(event) {\n  if (event?.code && typeof event.code === 'string') {\n    return event.code;\n  }\n  const key = String(event?.key || '').trim();\n  if (!key) return DEFAULT_SPEAK_PTT_KEY;\n  if (key === ' ') return 'Space';\n  if (key.length === 1 && /[a-z]/i.test(key)) {\n    return `Key${key.toUpperCase()}`;\n  }\n  if (key.length === 1 && /[0-9]/.test(key)) {\n    return `Digit${key}`;\n  }\n  return key;\n}\n\nfunction formatKeyboardCode(code) {\n  const raw = String(code || '').trim();\n  if (!raw) return 'V';\n  if (raw === 'Space') return 'Space';\n  if (/^Key[A-Z]$/.test(raw)) return raw.slice(3);\n  if (/^Digit[0-9]$/.test(raw)) return raw.slice(5);\n  if (raw.startsWith('Arrow')) return raw.replace('Arrow', 'Arrow ');\n  if (raw === 'ControlLeft') return 'Left Ctrl';\n  if (raw === 'ControlRight') return 'Right Ctrl';\n  if (raw === 'AltLeft') return 'Left Alt';\n  if (raw === 'AltRight') return 'Right Alt';\n  if (raw === 'ShiftLeft') return 'Left Shift';\n  if (raw === 'ShiftRight') return 'Right Shift';\n  return raw;\n}\n\nexport class ConfigSidebar {\n  constructor(options = {}) {\n    this.settings = options.settings || null;\n    this._policyContext = options.policyContext || null;\n    this.onSettingChange = options.onSettingChange || null;\n    this.onExport = options.onExport || null;\n    this.onImport = options.onImport || null;\n    this.onReset = options.onReset || null;\n    this.onCloudSave = options.onCloudSave || null;\n    this.onCloudLoad = options.onCloudLoad || null;\n    this.onRequestClose = options.onRequestClose || null;\n    this.container = options.container || null;\n    this.docked = !!options.docked;\n    this.autoMount = options.autoMount !== false;\n    this.showToggle = options.showToggle !== false && !this.docked;\n    this.scene = options.scene || null;\n    this.uiController = options.uiController || this.scene?.uiController || this.scene?._uiController || null;\n    this.eventBus = options.eventBus || this.scene?.eventBus || this.uiController?.eventBus || null;\n\n    this.isOpen = false;\n    this.element = null;\n    this.toggleBtn = null;\n    this.sections = new Map();\n    this._audioTestActive = false;\n    this._miniMapHost = null;\n    this._miniMap = null;\n    this._avatarAnimationsEl = null;\n    this._avatarActionsEl = null;\n    this._aircraftListSelect = null;\n    this._aircraftDetailsEl = null;\n    this._aircraftEntriesById = new Map();\n    this._satelliteListSelect = null;\n    this._satelliteDetailsEl = null;\n    this._satelliteEntriesById = new Map();\n    this._maritimeListSelect = null;\n    this._maritimeDetailsEl = null;\n    this._maritimeEntriesById = new Map();\n    this._incidentListSelect = null;\n    this._incidentDetailsEl = null;\n    this._incidentEntriesById = new Map();\n    this._incidentRecentList = null;\n    this._incidentEntriesCache = [];\n    this._incidentMarkerLayer = null;\n    this._incidentAutoEnabled = false;\n    this._incidentAutoTimer = null;\n    this._incidentAutoSeq = 0;\n    this._incidentAutoInFlight = false;\n    this._incidentAutoLastLat = null;\n    this._incidentAutoLastLon = null;\n    this._incidentAutoLastZip = null;\n    this._incidentAutoLastAt = 0;\n    this._incidentAutoAgencyIds = new Set();\n    this._incidentApi = null;\n    this._incidentSearchInput = null;\n    this._incidentSearchResults = null;\n    this._incidentSelectedList = null;\n    this._incidentAgencyMap = new Map();\n    this._incidentSearchSeq = 0;\n    this._incidentSearchCache = [];\n    this._incidentAgencyLoadSeq = 0;\n    this._sensorSourceToggles = new Map();\n    this._sensorStatusEls = new Map();\n    this._sensorSection = null;\n    this._meshtasticNodesCache = [];\n    this._meshtasticNodesById = new Map();\n    this._meshtasticNodeFilter = 'all';\n    this._meshtasticNodeSort = 'closest';\n    this._meshtasticNodeSearch = '';\n    this._meshtasticNodeRecencySeconds = 0;\n    this._meshtasticNodeMaxHops = null;\n    this._meshtasticThreadView = null;\n    this._meshtasticNodeCountEl = null;\n    this._meshtasticHoveredNodeId = null;\n    this._meshtasticEventUnsubscribe = null;\n    this._lightingDateInput = null;\n    this._lightingTimeInput = null;\n    this._lightingLiveInterval = null;\n    this._settingBindings = [];\n    this._settingsUnsub = null;\n    this._isSyncing = false;\n    this._boundAvatarReady = null;\n    this._geocodingService = null;\n    this._searchInput = null;\n    this._searchResults = null;\n    this._searchDebounceTimer = null;\n    this._selectedSearchResult = null;\n    this._lastSearchResults = [];\n    this._searchMarkerLayer = null;\n    this._computationModelList = null;\n    this._computationEmptyEl = null;\n    this._computationModelEls = new Map();\n    this._nknConnectedHandler = null;\n    this._nknAddressCache = null;\n    this._imageryBulkState = null;\n    this._imageryBulkZoom = 0;\n    this._imageryBulkStatusEl = null;\n    this._imageryBulkProgressFill = null;\n    this._imageryBulkDownloadBtn = null;\n    this._imageryBulkCancelBtn = null;\n    this._imageryBulkSaveBtn = null;\n    this._speakPttRecordBtn = null;\n    this._speakPttInput = null;\n    this._speakPttCaptureListener = null;\n    this._geoBoundaryService = null;\n\n    // Pinned widget state\n    this._pinnedMinimap = null;\n    this._pinnedMinimapCorner = null;\n    this._pinnedMinimapExpanded = false;\n    this._pinnedSearch = null;\n    this._pinnedSearchCorner = null;\n    this._widgetPinModalType = null;\n    this._pinnedMinimapWidget = null;\n    this._pinnedSearchInput = null;\n    this._pinnedSearchResults = null;\n    this._pinnedSearchDebounce = null;\n    this._widgetPinsLoaded = false;\n    this._widgetPinsRestoreTimer = null;\n    this._widgetPinsRestoreAttempts = 0;\n\n    injectDesignSystemStyles();\n    this._injectStyles();\n    this._createElements();\n    this._bindAvatarEvents();\n    this._bindNknEvents();\n    this._initMiniMap();\n    this._bindEvents();\n    this._loadWidgetPins();\n    this._bindSettingsSubscription();\n    this.syncFromSettings();\n  }\n\n  _injectStyles() {\n    if (document.getElementById('config-sidebar-styles')) return;\n\n    const style = document.createElement('style');\n    style.id = 'config-sidebar-styles';\n    style.textContent = `\n      .config-sidebar {\n        position: absolute;\n        top: 60px;\n        right: 12px;\n        bottom: 12px;\n        width: min(380px, calc(100vw - 80px));\n        display: flex;\n        flex-direction: column;\n        background: linear-gradient(135deg, rgba(10, 10, 10, 0.95) 0%, rgba(18, 18, 18, 0.98) 100%);\nbackdrop-filter:blur(8px);\n        border: 1px solid rgba(255, 255, 255, 0.1);\n        border-radius: 12px;\n        backdrop-filter: blur(16px);\n        box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);\n        z-index: 50;\n        transform: translateX(calc(100% + 24px));\n        transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n        overflow: hidden;\n      }\n\n      .config-sidebar.open {\n        transform: translateX(0);\n      }\n\n      .config-sidebar.docked {\n        position: relative;\n        inset: 0;\n        width: 100%;\n        height: 100%;\n        transform: none;\n        border-radius: 12px;\n        background: rgba(0, 0, 0, 0.88);\n        border: 1px solid rgba(255, 255, 255, 0.2);\n        box-shadow: 0 10px 30px rgba(0, 0, 0, 0.35), inset 0 0 1px rgba(255, 255, 255, 0.2);\n        backdrop-filter: blur(18px);\n      }\n\n      .config-sidebar.docked.open {\n        transform: none;\n      }\n\n      .config-sidebar-toggle {\n        position: fixed;\n        top: 12px;\n        right: 12px;\n        width: 40px;\n        height: 40px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        background: linear-gradient(135deg, rgba(10, 10, 10, 0.95) 0%, rgba(18, 18, 18, 0.98) 100%);\nbackdrop-filter:blur(8px);\n        border: 1px solid rgba(255, 255, 255, 0.1);\n        border-radius: 8px;\n        color: rgba(255, 255, 255, 0.7);\n        font-size: 18px;\n        cursor: pointer;\n        z-index: 51;\n        transition: all 0.2s ease;\n        backdrop-filter: blur(8px);\n      }\n\n      .config-sidebar-toggle:hover {\n        border-color: rgba(100, 200, 255, 0.3);\n        color: #fff;\n      }\n\n      .config-sidebar-toggle.active {\n        background: linear-gradient(135deg, #4a90d9 0%, #357abd 100%);\n        border-color: #4a90d9;\n        color: #fff;\n      }\n\n      .config-sidebar-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        gap: 10px;\n        padding: 12px 14px;\n        border-bottom: 1px solid rgba(255, 255, 255, 0.14);\n        flex-shrink: 0;\n      }\n\n      .config-sidebar.docked .config-sidebar-header {\n        border-bottom: 1px solid rgba(255, 255, 255, 0.14);\n      }\n\n      .config-sidebar-title {\n        font-size: 12px;\n        font-weight: 700;\n        text-transform: uppercase;\n        letter-spacing: 0.09em;\n        color: #fff;\n        font-family: 'Rajdhani', 'Chakra Petch', sans-serif;\n      }\n\n      .config-sidebar-header-actions {\n        display: flex;\n        gap: 6px;\n      }\n\n      .config-sidebar-close {\n        background: none;\n        border: none;\n        color: rgba(255, 255, 255, 0.5);\n        font-size: 22px;\n        cursor: pointer;\n        padding: 0;\n        line-height: 1;\n        transition: color 0.2s;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n      }\n\n      .config-sidebar-close:hover {\n        color: #fff;\n      }\n\n      .config-sidebar-body {\n        flex: 1;\n        overflow-y: auto;\n        padding: 12px;\n      }\n\n      .config-section {\n        margin-bottom: 8px;\n      }\n\n      .config-section-grid {\n        display: grid;\n        grid-template-columns: repeat(2, 1fr);\n        gap: 12px;\n      }\n\n      .config-section-grid.single-col {\n        grid-template-columns: 1fr;\n      }\n\n      .config-row {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 8px 0;\n      }\n\n      .config-row-label {\n        font-size: 11px;\n        color: rgba(255, 255, 255, 0.7);\n      }\n\n      .config-group {\n        margin-bottom: 16px;\n      }\n\n      .config-group-title {\n        font-size: 10px;\n        font-weight: 600;\n        color: ${TOKENS.colors.accent};\n        text-transform: uppercase;\n        letter-spacing: 0.08em;\n        margin-bottom: 10px;\n        padding-bottom: 6px;\n        border-bottom: 1px solid rgba(255, 255, 255, 0.05);\n      }\n\n      .avatar-anim-list {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 6px;\n      }\n\n      .avatar-anim-item {\n        font-size: 10px;\n        padding: 3px 6px;\n        border-radius: 6px;\n        border: 1px solid rgba(255, 255, 255, 0.12);\n        background: rgba(255, 255, 255, 0.06);\n        color: rgba(255, 255, 255, 0.8);\n      }\n\n      .avatar-anim-empty {\n        font-size: 10px;\n        color: rgba(255, 255, 255, 0.5);\n      }\n\n\n      .config-footer {\n        padding: 12px 16px;\n        border-top: 1px solid rgba(255, 255, 255, 0.1);\n        flex-shrink: 0;\n        display: flex;\n        gap: 8px;\n        flex-wrap: wrap;\n      }\n\n      .config-sidebar.docked .config-footer {\n        border-top: 1px solid rgba(255, 255, 255, 0.14);\n      }\n\n      .config-metrics {\n        display: grid;\n        grid-template-columns: 1fr 1fr;\n        gap: 8px 16px;\n      }\n\n      .config-detail-panel {\n        margin-top: 8px;\n        padding: 8px;\n        border-radius: 8px;\n        border: 1px solid rgba(255, 255, 255, 0.08);\n        background: rgba(0, 0, 0, 0.35);\n      }\n\n      .config-detail-panel .config-metrics {\n        grid-template-columns: 1fr;\n        gap: 6px;\n      }\n\n      .computation-model-list {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n        margin-top: 8px;\n      }\n\n      .computation-model-card {\n        border: 1px solid rgba(255, 255, 255, 0.08);\n        border-radius: 10px;\n        padding: 10px;\n        background: rgba(0, 0, 0, 0.35);\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .computation-model-header {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 8px;\n      }\n\n      .computation-model-title {\n        font-size: 11px;\n        font-weight: 600;\n        color: #fff;\n      }\n\n      .computation-model-sub {\n        font-size: 9px;\n        text-transform: uppercase;\n        letter-spacing: 0.08em;\n        color: rgba(255, 255, 255, 0.45);\n      }\n\n      .computation-model-state {\n        font-size: 9px;\n        padding: 2px 8px;\n        border-radius: 999px;\n        border: 1px solid rgba(255, 255, 255, 0.16);\n        background: rgba(255, 255, 255, 0.08);\n        color: rgba(255, 255, 255, 0.75);\n        text-transform: uppercase;\n        letter-spacing: 0.08em;\n      }\n\n      .computation-model-state.ready {\n        border-color: rgba(80, 200, 120, 0.5);\n        color: rgba(80, 200, 120, 0.95);\n        background: rgba(80, 200, 120, 0.12);\n      }\n\n      .computation-model-state.loading {\n        border-color: rgba(255, 255, 255, 0.55);\n        color: rgba(255, 255, 255, 0.95);\n        background: rgba(255, 255, 255, 0.12);\n      }\n\n      .computation-model-state.error {\n        border-color: rgba(239, 68, 68, 0.6);\n        color: rgba(239, 68, 68, 0.9);\n        background: rgba(239, 68, 68, 0.15);\n      }\n\n      .computation-model-meta {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 8px 10px;\n        font-size: 9px;\n        color: rgba(255, 255, 255, 0.65);\n      }\n\n      .computation-model-graphs {\n        display: grid;\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        gap: 8px;\n      }\n\n      .computation-graph {\n        display: flex;\n        flex-direction: column;\n        gap: 4px;\n      }\n\n      .computation-graph-label {\n        font-size: 8px;\n        text-transform: uppercase;\n        letter-spacing: 0.1em;\n        color: rgba(255, 255, 255, 0.45);\n      }\n\n      .computation-graph-canvas {\n        position:relative!important;\n        width: 100%;\n        height: 36px;\n        border-radius: 6px;\n        background: rgba(255, 255, 255, 0.06);\n      }\n\n      .computation-empty {\n        font-size: 10px;\n        color: rgba(255, 255, 255, 0.5);\n        padding: 6px 0;\n      }\n\n      .config-detail-empty {\n        font-size: 10px;\n        color: rgba(255, 255, 255, 0.5);\n      }\n\n      .config-time-buttons {\n        display: flex;\n        gap: 6px;\n        flex-wrap: wrap;\n        margin-top: 8px;\n      }\n\n      /* Debug panel specific */\n      .debug-indicator {\n        display: inline-block;\n        width: 8px;\n        height: 8px;\n        border-radius: 50%;\n        margin-right: 6px;\n      }\n\n      .debug-indicator.ok {\n        background: ${TOKENS.colors.success};\n        box-shadow: 0 0 6px ${TOKENS.colors.success};\n      }\n\n      .debug-indicator.warning {\n        background: ${TOKENS.colors.warning};\n        box-shadow: 0 0 6px ${TOKENS.colors.warning};\n      }\n\n      .debug-indicator.error {\n        background: ${TOKENS.colors.danger};\n        box-shadow: 0 0 6px ${TOKENS.colors.danger};\n      }\n\n      .nc-mini-map {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .nc-mini-map-status {\n        font-size: 10px;\n        letter-spacing: 0.16em;\n        text-transform: uppercase;\n        color: rgba(255, 255, 255, 0.55);\n      }\n\n      .nc-mini-map-frame {\n        position: relative;\n        width: 100%;\n        top: 3rem;\n        right: -3rem;\n        height: clamp(180px, 32vh, 260px);\n        border-radius: 12px;\n        overflow: hidden;\n        border: 1px solid rgba(255, 255, 255, 0.14);\n        background: rgba(0, 0, 0, 0.35);\n      }\n\n      .nc-mini-map-map {\n        position: absolute;\n        inset: 0;\n      }\n\n      .nc-mini-map-map:focus {\n        outline: 1px solid rgba(255, 255, 255, 0.35);\n        outline-offset: -1px;\n      }\n\n      .nc-mini-map-center {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        width: 20px;\n        height: 20px;\n        margin: -10px 0 0 -10px;\n        pointer-events: none;\n        z-index: 400;\n      }\n\n      .nc-mini-map-center::before,\n      .nc-mini-map-center::after {\n        content: '';\n        position: absolute;\n        left: 50%;\n        top: 50%;\n        background: rgba(0, 0, 0, 0.7);\n        transform: translate(-50%, -50%);\n      }\n\n      .nc-mini-map-center::before {\n        width: 18px;\n        height: 2px;\n        box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.5);\n      }\n\n      .nc-mini-map-center::after {\n        width: 2px;\n        height: 18px;\n        box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.5);\n      }\n\n      .nc-mini-map-controls {\n        position: absolute;\n        top: 8px;\n        right: 8px;\n        display: flex;\n        flex-direction: column;\n        gap: 6px;\n        z-index: 450;\n      }\n\n      .nc-mini-map-control-btn {\n        width: 28px;\n        height: 28px;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        border-radius: 8px;\n        border: 1px solid var(--peer-color, #4ade80);\n        background: rgba(0, 0, 0, 0.55);\n        color: #ffffff;\n        font-size: 16px;\n        cursor: pointer;\n        transition: background 0.15s ease, border-color 0.15s ease, transform 0.15s ease;\n      }\n\n      .nc-mini-map-control-btn:hover {\n        background: rgba(0, 0, 0, 0.75);\n        border-color: rgba(255, 255, 255, 0.35);\n      }\n\n      .nc-mini-map-control-btn:active {\n        transform: translateY(1px);\n      }\n\n      .nc-mini-map-go {\n        width: 100%;\n        justify-content: center;\n      }\n\n      .nc-mini-map-actions {\n        display: grid;\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        gap: 8px;\n      }\n\n      .nc-mini-map-actions[aria-hidden=\"true\"] {\n        display: none;\n      }\n\n      .minimap-player-icon,\n      .minimap-target-icon {\n        background: transparent;\n        border: none;\n      }\n\n      .minimap-player-marker {\n        width: 12px;\n        height: 12px;\n        border-radius: 50%;\n        background: #f8f8f8;\n        border: 2px solid #101010;\n        box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.35);\n      }\n\n      .minimap-target-cross {\n        position: relative;\n        width: 18px;\n        height: 18px;\n      }\n\n      .minimap-target-cross::before,\n      .minimap-target-cross::after {\n        content: '';\n        position: absolute;\n        left: 50%;\n        top: 50%;\n        background: rgba(var(--accent-rgb, 255, 174, 0), 0.9);\n        box-shadow: 0 0 6px rgba(var(--accent-rgb, 255, 174, 0), 0.6);\n        transform: translate(-50%, -50%);\n      }\n\n      .minimap-target-cross::before {\n        width: 16px;\n        height: 2px;\n      }\n\n      .minimap-target-cross::after {\n        width: 2px;\n        height: 16px;\n      }\n\n      .minimap-peer-icon {\n        background: transparent;\n        border: none;\n      }\n\n      .minimap-peer-marker {\n        position: relative;\n        width: 28px;\n        height: 28px;\n      }\n\n      .minimap-peer-dot {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        width: 12px;\n        height: 12px;\n        border-radius: 50%;\n        background: var(--peer-color, #4ade80);\n        border: 2px solid #101010;\n        box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.4);\n        transform: translate(-50%, -50%);\n      }\n\n      .minimap-peer-arrow {\n        position: absolute;\n        top: 2px;\n        left: 50%;\n        width: 0;\n        height: 0;\n        border-left: 4px solid transparent;\n        border-right: 4px solid transparent;\n        border-bottom: 8px solid var(--peer-color, #4ade80);\n        transform: translate(-50%, -50%) rotate(var(--peer-heading, 0deg));\n        transform-origin: 50% 100%;\n        filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.45));\n      }\n\n      .minimap-peer-label {\n        position: absolute;\n        top: 18px;\n        left: 50%;\n        transform: translateX(-50%);\n        font-size: 9px;\n        padding: 2px 6px;\n        border-radius: 8px;\n        background: rgba(0, 0, 0, 0.65);\n        border: 1px solid rgba(255, 255, 255, 0.2);\n        color: #ffffff;\n        white-space: nowrap;\n        text-transform: uppercase;\n        letter-spacing: 0.08em;\n      }\n\n      .minimap-peer-icon {\n        cursor: pointer;\n        transition: transform 0.15s ease;\n      }\n\n      .minimap-peer-icon:hover .minimap-peer-dot {\n        transform: translate(-50%, -50%) scale(1.2);\n        box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.3), 0 0 8px var(--peer-color, #4ade80);\n      }\n\n      .minimap-peer-selected .minimap-peer-dot {\n        transform: translate(-50%, -50%) scale(1.3);\n        box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.5), 0 0 12px var(--peer-color, #4ade80);\n        animation: pulse-peer 1.5s ease-in-out infinite;\n      }\n\n      @keyframes pulse-peer {\n        0%, 100% { box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.5), 0 0 12px var(--peer-color, #4ade80); }\n        50% { box-shadow: 0 0 0 5px rgba(255, 255, 255, 0.3), 0 0 20px var(--peer-color, #4ade80); }\n      }\n\n      .minimap-peer-selected .minimap-peer-label {\n        background: var(--peer-color, #4ade80);\n        color: #000000;\n        font-weight: 600;\n      }\n\n      .nc-mini-map-go-session {\n        grid-column: 1 / -1;\n        background: linear-gradient(135deg, #4ade80, #22c55e);\n        border: none;\n        color: #000000;\n        font-weight: 600;\n      }\n\n      .nc-mini-map-go-session:hover:not(:disabled) {\n        background: linear-gradient(135deg, #86efac, #4ade80);\n      }\n\n      .nc-mini-map-go-session:disabled {\n        opacity: 0.5;\n        cursor: not-allowed;\n      }\n\n      .nc-mini-map .leaflet-control-container {\n        display: none;\n      }\n\n      /* Player location marker (separate from center crosshair) */\n      .minimap-player-icon {\n        background: transparent;\n        border: none;\n      }\n\n      .minimap-player-marker-container {\n        position: relative;\n        width: 24px;\n        height: 24px;\n      }\n\n      .minimap-player-dot {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        width: 14px;\n        height: 14px;\n        border-radius: 50%;\n        background: #3b82f6;\n        border: 3px solid #ffffff;\n        box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.5), 0 0 8px rgba(59, 130, 246, 0.6);\n        transform: translate(-50%, -50%);\n      }\n\n      .minimap-player-arrow {\n        position: absolute;\n        top: 0;\n        left: 50%;\n        width: 0;\n        height: 0;\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-bottom: 10px solid #3b82f6;\n        transform: translateX(-50%) rotate(var(--player-heading, 0deg));\n        transform-origin: 50% 12px;\n        filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.5));\n      }\n\n      /* Aircraft markers */\n      .minimap-aircraft-icon {\n        background: transparent;\n        border: none;\n      }\n\n      .minimap-aircraft-marker {\n        position: relative;\n        width: 20px;\n        height: 20px;\n      }\n\n      .minimap-aircraft-icon-svg {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        width: 18px;\n        height: 18px;\n        transform: translate(-50%, -50%) rotate(var(--aircraft-heading, 0deg));\n        filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.6));\n      }\n      .minimap-aircraft-icon-svg svg {\n        width: 100%;\n        height: 100%;\n        fill: #f59e0b;\n      }\n\n      .minimap-aircraft-tooltip {\n        background: rgba(0, 0, 0, 0.85);\n        border: 1px solid rgba(245, 158, 11, 0.5);\n        color: #ffffff;\n        font-size: 10px;\n        padding: 3px 6px;\n        border-radius: 4px;\n      }\n\n      /* Satellite markers */\n      .minimap-satellite-icon {\n        background: transparent;\n        border: none;\n      }\n\n      .minimap-satellite-marker {\n        position: relative;\n        width: 14px;\n        height: 14px;\n      }\n\n      .minimap-satellite-dot {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        width: 8px;\n        height: 8px;\n        border-radius: 50%;\n        background: #a855f7;\n        border: 2px solid #ffffff;\n        box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.4), 0 0 6px rgba(168, 85, 247, 0.6);\n        transform: translate(-50%, -50%);\n      }\n\n      .minimap-satellite-tooltip {\n        background: rgba(0, 0, 0, 0.85);\n        border: 1px solid rgba(168, 85, 247, 0.5);\n        color: #ffffff;\n        font-size: 10px;\n        padding: 3px 6px;\n        border-radius: 4px;\n      }\n\n      /* Widget pin button */\n      .widget-pin-btn {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        width: 24px;\n        height: 24px;\n        border-radius: 4px;\n        border: 1px solid rgba(255, 255, 255, 0.15);\n        background: rgba(0, 0, 0, 0.4);\n        color: rgba(255, 255, 255, 0.6);\n        cursor: pointer;\n        flex-shrink: 0;\n        transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;\n      }\n\n      .widget-pin-btn:hover {\n        border-color: var(--accent, #ffffff);\n        background: rgba(0, 0, 0, 0.6);\n        color: var(--accent, #ffffff);\n      }\n\n      .widget-pin-btn.active {\n        border-color: var(--accent, #ffffff);\n        background: rgba(255, 255, 255, 0.15);\n        color: var(--accent, #ffffff);\n      }\n\n      .widget-pin-btn svg {\n        width: 14px;\n        height: 14px;\n      }\n\n      .widget-header {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        margin-bottom: 8px;\n      }\n\n      .widget-header-title {\n        font-size: 11px;\n        text-transform: uppercase;\n        letter-spacing: 0.12em;\n        color: rgba(255, 255, 255, 0.7);\n      }\n\n      /* Pinned minimap container - clean, no chrome */\n      .pinned-minimap {\n        position: relative;\n        border-radius: 4px;\n        overflow: hidden;\n        cursor: pointer;\n        transition: width 0.25s ease, height 0.25s ease;\n      }\n\n      .pinned-minimap.collapsed {\n        width: 180px;\n        height: 180px;\n      }\n\n      .pinned-minimap.expanded {\n        width: 320px;\n        height: 320px;\n      }\n\n      .pinned-minimap .nc-mini-map {\n        width: 100%;\n        height: 100%;\n      }\n\n      .pinned-minimap .nc-mini-map-frame,\n      .pinned-minimap .nc-mini-map-host {\n        height: 100%;\n      }\n\n      /* Hide minimap labels/info in pinned mode */\n      .pinned-minimap .nc-mini-map-info,\n      .pinned-minimap .nc-mini-map-coords,\n      .pinned-minimap .nc-mini-map-label {\n        display: none !important;\n      }\n\n      .pinned-minimap-close {\n        position: absolute;\n        top: 4px;\n        right: 4px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 18px;\n        height: 18px;\n        background: rgba(0, 0, 0, 0.6);\n        border: none;\n        color: rgba(255, 255, 255, 0.6);\n        font-size: 12px;\n        cursor: pointer;\n        border-radius: 3px;\n        opacity: 0;\n        transition: opacity 0.15s ease, background 0.15s ease;\n        z-index: 10;\n      }\n\n      .pinned-minimap:hover .pinned-minimap-close {\n        opacity: 1;\n      }\n\n      .pinned-minimap-close:hover {\n        background: rgba(0, 0, 0, 0.8);\n        color: #fff;\n      }\n\n      /* Pinned search container - clean, just input + results */\n      .pinned-search {\n        position: relative;\n        width: 240px;\n      }\n\n      .pinned-search-close {\n        position: absolute;\n        top: 7px;\n        right: 7px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 16px;\n        height: 16px;\n        background: rgba(0, 0, 0, 0.4);\n        border: none;\n        color: rgba(255, 255, 255, 0.5);\n        font-size: 11px;\n        cursor: pointer;\n        border-radius: 3px;\n        opacity: 0;\n        transition: opacity 0.15s ease;\n        z-index: 10;\n      }\n\n      .pinned-search:hover .pinned-search-close {\n        opacity: 1;\n      }\n\n      .pinned-search-close:hover {\n        background: rgba(0, 0, 0, 0.6);\n        color: #fff;\n      }\n\n      .pinned-search input {\n        width: 100%;\n        padding: 8px 10px;\n        padding-right: 28px;\n        background: rgba(0, 0, 0, 0.75);\n        border: 1px solid rgba(255, 255, 255, 0.1);\n        border-radius: 4px;\n        color: #fff;\n        font-size: 12px;\n        font-family: inherit;\n      }\n\n      .pinned-search input:focus {\n        outline: none;\n        border-color: rgba(255, 255, 255, 0.25);\n      }\n\n      .pinned-search input::placeholder {\n        color: rgba(255, 255, 255, 0.4);\n      }\n\n      .pinned-search-results {\n        margin-top: 4px;\n        max-height: 240px;\n        overflow-y: auto;\n        border-radius: 4px;\n        background: rgba(0, 0, 0, 0.85);\n        border: 1px solid rgba(255, 255, 255, 0.1);\n      }\n\n      .pinned-search-results:empty {\n        display: none;\n      }\n\n      .pinned-search-results .search-result-item:last-child {\n        border-bottom: none;\n      }\n    `;\n    document.head.appendChild(style);\n  }\n\n  _createElements() {\n    if (this.showToggle) {\n      this.toggleBtn = document.createElement('button');\n      this.toggleBtn.className = 'config-sidebar-toggle';\n      this.toggleBtn.innerHTML = '⚙️';\n      this.toggleBtn.title = 'Toggle configuration panel';\n    }\n\n    // Main sidebar\n    this.element = document.createElement('div');\n    this.element.className = `config-sidebar${this.docked ? ' docked' : ''}`;\n\n    const header = document.createElement('div');\n    header.className = 'config-sidebar-header';\n    header.innerHTML = `\n      <span class=\"config-sidebar-title\">Configuration</span>\n      <button class=\"config-sidebar-close\" aria-label=\"Close configuration\">${getIconSvg('close', { size: ICON_SIZES.close })}</button>\n    `;\n\n    const body = document.createElement('div');\n    body.className = 'config-sidebar-body';\n\n    const footer = document.createElement('div');\n    footer.className = 'config-footer';\n\n    this.element.appendChild(header);\n    this.element.appendChild(body);\n    this.element.appendChild(footer);\n\n    if (this.docked) {\n      this.element.classList.add('open');\n      this.isOpen = true;\n    }\n\n    if (this.autoMount) {\n      const target = this.container || document.body;\n      if (this.toggleBtn) {\n        target.appendChild(this.toggleBtn);\n      }\n      target.appendChild(this.element);\n    }\n\n    this._buildSections(body);\n    this._buildFooter(footer);\n\n    // Persist and restore sidebar scroll position\n    const SCROLL_KEY = 'noclip.sidebar.scrollTop';\n    requestAnimationFrame(() => {\n      try {\n        const savedScroll = Number(localStorage.getItem(SCROLL_KEY));\n        if (savedScroll > 0) body.scrollTop = savedScroll;\n      } catch {}\n    });\n    let scrollSaveTimer = null;\n    body.addEventListener('scroll', () => {\n      if (scrollSaveTimer) clearTimeout(scrollSaveTimer);\n      scrollSaveTimer = setTimeout(() => {\n        try { localStorage.setItem(SCROLL_KEY, String(body.scrollTop)); } catch {}\n      }, 300);\n    }, { passive: true });\n  }\n\n  _refreshMiniMap() {\n    void this._refreshMiniMapAsync();\n  }\n\n  async _refreshMiniMapAsync() {\n    if (!this._miniMap) {\n      await this._initMiniMapAsync();\n    }\n    if (!this._miniMap) return;\n    this._miniMap.invalidateSize();\n    setTimeout(() => this._miniMap?.invalidateSize(), 350);\n  }\n\n  _initMiniMap() {\n    void this._initMiniMapAsync();\n  }\n\n  async _initMiniMapAsync() {\n    if (this._miniMap || !this._miniMapHost) return;\n    if (!this.scene && !this.uiController) return;\n    if (!this._miniMapHost.isConnected) return;\n    const MiniMapWidget = await loadMiniMapWidgetClass();\n    if (this._miniMap || !this._miniMapHost?.isConnected) return;\n    this._miniMap = new MiniMapWidget({\n      container: this._miniMapHost,\n      scene: this.scene,\n      uiController: this.uiController,\n    });\n    if (this._incidentEntriesCache?.length) {\n      this._updateMiniMapIncidentMarkers(this._incidentEntriesCache);\n    }\n  }\n\n  /**\n   * Initialize wayback version dropdown by fetching available versions from ImageryManager\n   */\n  _initWaybackVersionDropdown(selectElement, sliderElement, labelElement) {\n    // Try to get ImageryManager from scene\n    const imageryManager = this._getImageryManager();\n\n    if (!imageryManager) {\n      // Retry after a short delay if scene not ready\n      setTimeout(() => this._initWaybackVersionDropdown(selectElement, sliderElement, labelElement), 500);\n      return;\n    }\n\n    // Set up callback for when versions are loaded\n    const populateDropdown = (versions) => {\n      if (!versions || !versions.length) return;\n\n      this._waybackVersions = versions;\n\n      // Clear loading option\n      selectElement.innerHTML = '';\n\n      // Add versions to dropdown\n      versions.forEach((v, idx) => {\n        const opt = document.createElement('option');\n        opt.value = v.id;\n        opt.textContent = v.label;\n        if (idx === 0) opt.selected = true;\n        selectElement.appendChild(opt);\n      });\n\n      // Set current version if available\n      const currentVersion = this._getSettingValue('scene.terrain.imagery.versionId', imageryManager.versionId);\n      if (currentVersion) {\n        selectElement.value = currentVersion;\n        const idx = versions.findIndex(v => v.id === currentVersion);\n        if (idx >= 0) {\n          sliderElement.value = String(idx);\n          labelElement.textContent = versions[idx].label;\n        }\n      }\n\n      // Enable and configure timeline slider\n      sliderElement.disabled = false;\n      sliderElement.max = String(versions.length - 1);\n      sliderElement.value = '0';\n      if (versions[0]) {\n        labelElement.textContent = versions[0].label;\n      }\n      this.syncFromSettings();\n    };\n\n    // Register callback\n    imageryManager.onVersionsLoaded(populateDropdown);\n\n    // Trigger fetch if not already done\n    imageryManager.fetchAvailableVersions();\n  }\n\n  _getImageryManager() {\n    return this.scene?.triTree?.imageryManager ||\n      this.scene?._triTree?.imageryManager ||\n      this.uiController?.triTree?.imageryManager ||\n      this.scene?._imageryManager ||\n      null;\n  }\n\n  _setImageryBulkUiState({ active, canSave, statusText, percent } = {}) {\n    if (this._imageryBulkDownloadBtn) {\n      this._imageryBulkDownloadBtn.disabled = !!active;\n    }\n    if (this._imageryBulkCancelBtn) {\n      this._imageryBulkCancelBtn.disabled = !active;\n    }\n    if (this._imageryBulkSaveBtn) {\n      this._imageryBulkSaveBtn.disabled = !canSave;\n    }\n    if (this._imageryBulkStatusEl && typeof statusText === 'string') {\n      this._imageryBulkStatusEl.textContent = statusText;\n    }\n    if (this._imageryBulkProgressFill && Number.isFinite(percent)) {\n      const clamped = Math.max(0, Math.min(1, percent));\n      this._imageryBulkProgressFill.style.width = `${(clamped * 100).toFixed(1)}%`;\n    }\n  }\n\n  _startImageryBulkDownload() {\n    const imageryManager = this._getImageryManager();\n    if (!imageryManager) {\n      this._setImageryBulkUiState({ statusText: 'Imagery manager not ready.' });\n      return;\n    }\n    if (this._imageryBulkState?.active) return;\n\n    const zoom = Number.isFinite(this._imageryBulkZoom) ? this._imageryBulkZoom : 0;\n    const versionId = this._getSettingValue('scene.terrain.imagery.versionId', imageryManager.versionId);\n\n    this._setImageryBulkUiState({\n      active: true,\n      canSave: false,\n      statusText: `Downloading zoom ${zoom}…`,\n      percent: 0\n    });\n\n    const state = imageryManager.startZoomLevelDownload({\n      zoom,\n      versionId,\n      onProgress: (progress) => {\n        if (!progress) return;\n        const pct = Number.isFinite(progress.percent) ? progress.percent : 0;\n        const status = progress.cancelled\n          ? 'Download cancelled.'\n          : progress.completed >= progress.total\n            ? `Downloaded zoom ${progress.zoom}.`\n            : `Downloading zoom ${progress.zoom}: ${progress.completed}/${progress.total}`;\n        this._setImageryBulkUiState({\n          active: progress.completed < progress.total && !progress.cancelled,\n          canSave: progress.completed >= progress.total && !progress.cancelled,\n          statusText: `${status} (ok ${progress.downloaded + progress.cached}, fail ${progress.failed})`,\n          percent: pct\n        });\n      }\n    });\n\n    this._imageryBulkState = state;\n    if (state?.promise) {\n      state.promise.then((finalStats) => {\n        if (!finalStats) return;\n        const percent = finalStats.total > 0 ? finalStats.completed / finalStats.total : 0;\n        const status = finalStats.cancelled\n          ? 'Download cancelled.'\n          : `Downloaded zoom ${finalStats.zoom}.`;\n        this._setImageryBulkUiState({\n          active: false,\n          canSave: !finalStats.cancelled,\n          statusText: `${status} (ok ${finalStats.downloaded + finalStats.cached}, fail ${finalStats.failed})`,\n          percent\n        });\n      });\n    }\n  }\n\n  _cancelImageryBulkDownload() {\n    if (this._imageryBulkState?.cancel) {\n      this._imageryBulkState.cancel();\n    }\n    this._setImageryBulkUiState({\n      active: false,\n      canSave: false,\n      statusText: 'Download cancelled.',\n      percent: 0\n    });\n  }\n\n  async _saveImageryBulkDownload() {\n    const imageryManager = this._getImageryManager();\n    if (!imageryManager) {\n      this._setImageryBulkUiState({ statusText: 'Imagery manager not ready.' });\n      return;\n    }\n    const zoom = Number.isFinite(this._imageryBulkZoom) ? this._imageryBulkZoom : 0;\n    const versionId = this._getSettingValue('scene.terrain.imagery.versionId', imageryManager.versionId);\n\n    this._setImageryBulkUiState({\n      active: true,\n      canSave: false,\n      statusText: `Packaging zoom ${zoom}…`,\n      percent: 0\n    });\n\n    try {\n      const result = await imageryManager.exportZoomLevelTar({\n        zoom,\n        versionId,\n        onProgress: (progress) => {\n          const pct = progress?.total ? progress.processed / progress.total : 0;\n          this._setImageryBulkUiState({\n            active: true,\n            canSave: false,\n            statusText: `Packaging zoom ${zoom}: ${progress.processed}/${progress.total}`,\n            percent: pct\n          });\n        }\n      });\n\n      const blob = result?.blob;\n      if (!blob) {\n        this._setImageryBulkUiState({\n          active: false,\n          canSave: true,\n          statusText: 'Packaging failed.',\n          percent: 0\n        });\n        return;\n      }\n\n      const downloadLink = document.createElement('a');\n      downloadLink.href = URL.createObjectURL(blob);\n      downloadLink.download = `wayback-zoom${zoom}-v${versionId}.tar`;\n      document.body.appendChild(downloadLink);\n      downloadLink.click();\n      document.body.removeChild(downloadLink);\n      setTimeout(() => URL.revokeObjectURL(downloadLink.href), 1000);\n\n      this._setImageryBulkUiState({\n        active: false,\n        canSave: true,\n        statusText: `Saved ${result.exported}/${result.total} tiles.`,\n        percent: 1\n      });\n    } catch (err) {\n      console.warn('[Imagery] Save pack failed', err);\n      this._setImageryBulkUiState({\n        active: false,\n        canSave: true,\n        statusText: 'Save failed.',\n        percent: 0\n      });\n    }\n  }\n\n  _getSettingValue(path, fallback) {\n    if (!this.settings || !path) return fallback;\n    if (typeof this.settings.getSection === 'function') {\n      const value = this.settings.getSection(path);\n      return value ?? fallback;\n    }\n    return path.split('.').reduce((acc, key) => (acc && acc[key] !== undefined ? acc[key] : undefined), this.settings) ?? fallback;\n  }\n\n  _applyScenePatch(patch, options) {\n    if (!patch) return false;\n    if (this.settings?.updateScene) {\n      this.settings.updateScene(patch, { ...(options || {}), policyContext: this._policyContext });\n      return true;\n    }\n    if (this.scene?.api?.tuneables?.set) {\n      console.warn('[ConfigSidebar] _applyScenePatch: settings.updateScene missing, using scene.api.tuneables.set fallback');\n      this.scene.api.tuneables.set(patch);\n      return true;\n    }\n    console.error('[ConfigSidebar] _applyScenePatch FAILED: no settings.updateScene AND no scene.api.tuneables.set!', 'settings:', !!this.settings, 'scene:', !!this.scene);\n    return false;\n  }\n\n  _updateSettingPath(path, value, options) {\n    if (!path) return false;\n    if (this.settings?.updatePath) {\n      this.settings.updatePath(path, value, { ...(options || {}), policyContext: this._policyContext });\n      return true;\n    }\n    if (this.settings?.update) {\n      const patch = {};\n      const parts = Array.isArray(path) ? path : String(path).split('.');\n      let current = patch;\n      for (let i = 0; i < parts.length - 1; i += 1) {\n        const key = parts[i];\n        if (!current[key] || typeof current[key] !== 'object') current[key] = {};\n        current = current[key];\n      }\n      current[parts[parts.length - 1]] = value;\n      this.settings.update(patch, { ...(options || {}), policyContext: this._policyContext });\n      return true;\n    }\n    return false;\n  }\n\n  _applySettingChange(key, value) {\n    if (!this.settings || !key) return false;\n    if (key === 'hudMetricsHidden') {\n      return this._updateSettingPath('hud.hideMetrics', !!value);\n    }\n    if (key === 'nknEnabled') {\n      return this._updateSettingPath('nkn.enabled', !!value);\n    }\n    if (key === 'nknRelay') {\n      return this._updateSettingPath('nkn.relay', value);\n    }\n    if (key === 'nknDataset') {\n      return this._updateSettingPath('nkn.dataset', value);\n    }\n    if (key === 'statePersist') {\n      return this._updateSettingPath('scene.debug.statePersist', !!value);\n    }\n    if (key === 'wireframe') {\n      return this._applyScenePatch({ debug: { wireframe: !!value } });\n    }\n\n    const patch = buildScenePatch(key, value, {\n      readSetting: (path, fallback) => this._getSettingValue(path, fallback),\n      getLightingDate: () => this._getLightingDate(),\n    });\n    if (patch) {\n      return this._applyScenePatch(patch);\n    }\n    return false;\n  }\n\n  _bindSettingToggle(path, input, fallback = false, onSync = null) {\n    if (!path || !input) return;\n    this._settingBindings.push({ path, input, fallback, type: 'toggle', onSync });\n  }\n\n  _bindSettingRange(path, input, fallback, { valueDisplay = null, transform = null, onSync = null } = {}) {\n    if (!path || !input) return;\n    this._settingBindings.push({\n      path,\n      input,\n      fallback,\n      type: 'range',\n      valueDisplay,\n      transform,\n      onSync\n    });\n  }\n\n  _bindSettingRangeKey(key, input, fallback, { valueDisplay = null, transform = null, onSync = null } = {}) {\n    if (!key || !input) return;\n    this._settingBindings.push({\n      key,\n      path: null,\n      input,\n      fallback,\n      type: 'range',\n      valueDisplay,\n      transform,\n      onSync\n    });\n  }\n\n  _bindSettingSelect(path, input, fallback, { transform = null, onSync = null } = {}) {\n    if (!path || !input) return;\n    this._settingBindings.push({\n      path,\n      input,\n      fallback,\n      type: 'select',\n      transform,\n      onSync\n    });\n  }\n\n  _bindSettingSelectKey(key, input, fallback, { transform = null, onSync = null } = {}) {\n    if (!key || !input) return;\n    this._settingBindings.push({\n      key,\n      path: null,\n      input,\n      fallback,\n      type: 'select',\n      transform,\n      onSync\n    });\n  }\n\n  _bindSettingInput(path, input, fallback, { transform = null, onSync = null } = {}) {\n    if (!path || !input) return;\n    this._settingBindings.push({\n      path,\n      input,\n      fallback,\n      type: 'input',\n      transform,\n      onSync\n    });\n  }\n\n  _bindSettingInputKey(key, input, fallback, { transform = null, onSync = null } = {}) {\n    if (!key || !input) return;\n    this._settingBindings.push({\n      key,\n      path: null,\n      input,\n      fallback,\n      type: 'input',\n      transform,\n      onSync\n    });\n  }\n\n  _resolveSettingPathForKey(key, fallbackValue) {\n    if (!key) return null;\n    const patch = buildScenePatch(key, fallbackValue, {\n      readSetting: (path, fallback) => this._getSettingValue(path, fallback),\n      getLightingDate: () => this._getLightingDate()\n    });\n    if (!patch || typeof patch !== 'object') return null;\n    const scenePatch = (patch.scene && typeof patch.scene === 'object') ? patch.scene : patch;\n    const paths = [];\n    const walk = (node, prefix = '') => {\n      if (!node || typeof node !== 'object') return;\n      Object.entries(node).forEach(([entryKey, entryValue]) => {\n        const nextPath = prefix ? `${prefix}.${entryKey}` : entryKey;\n        if (entryValue && typeof entryValue === 'object' && !Array.isArray(entryValue)) {\n          walk(entryValue, nextPath);\n        } else {\n          paths.push({ path: nextPath, value: entryValue });\n        }\n      });\n    };\n    walk(scenePatch);\n    if (!paths.length) return null;\n    if (fallbackValue !== undefined) {\n      const exact = paths.find((entry) => entry.value === fallbackValue);\n      if (exact) return `scene.${exact.path}`;\n    }\n    return `scene.${paths[0].path}`;\n  }\n\n  _bindSettingsSubscription() {\n    if (this._settingsUnsub || !this.settings?.subscribe) return;\n    this._settingsUnsub = this.settings.subscribe((payload) => {\n      this.syncFromSettings(payload);\n      const shouldRestorePins = !!(payload?.reset || payload?.import || payload?.patch?.hud?.widgetPins);\n      if (shouldRestorePins) {\n        this._widgetPinsLoaded = false;\n        this._restoreWidgetPins();\n      }\n    });\n  }\n\n  syncFromSettings() {\n    if (!this._settingBindings.length) return;\n    if (this.element?.isConnected) {\n      this._settingBindings = this._settingBindings.filter((binding) => binding?.input?.isConnected);\n      if (!this._settingBindings.length) return;\n    }\n    this._isSyncing = true;\n    this._settingBindings.forEach((binding) => {\n      if (!binding?.input) return;\n      if (!binding.path && binding.key) {\n        binding.path = this._resolveSettingPathForKey(binding.key, binding.fallback);\n      }\n      if (!binding.path) return;\n      const rawValue = this._getSettingValue(binding.path, binding.fallback);\n      const resolved = typeof binding.transform === 'function'\n        ? binding.transform(rawValue)\n        : rawValue;\n      if (binding.type === 'toggle') {\n        const nextValue = !!resolved;\n        binding.input.checked = nextValue;\n        if (typeof binding.onSync === 'function') {\n          binding.onSync(nextValue);\n        }\n        return;\n      }\n      if (binding.type === 'range') {\n        if (resolved === null || resolved === undefined || Number.isNaN(resolved)) return;\n        const value = Number(resolved);\n        if (!Number.isFinite(value)) return;\n        binding.input.value = String(value);\n        if (binding.valueDisplay) {\n          if (binding.valueDisplay.dataset?.editing !== 'true') {\n            binding.valueDisplay.textContent = binding.input.value;\n          }\n          if (binding.valueDisplay.dataset) {\n            binding.valueDisplay.dataset.rawValue = binding.input.value;\n          }\n          binding.valueDisplay.setAttribute?.('aria-valuemin', binding.input.min || '');\n          binding.valueDisplay.setAttribute?.('aria-valuemax', binding.input.max || '');\n          binding.valueDisplay.setAttribute?.('aria-valuenow', binding.input.value);\n        }\n        if (typeof binding.onSync === 'function') {\n          binding.onSync(value);\n        }\n        return;\n      }\n      if (binding.type === 'select' || binding.type === 'input') {\n        if (resolved === null || resolved === undefined) return;\n        const next = String(resolved);\n        if (binding.input.value !== next) {\n          binding.input.value = next;\n        }\n        if (typeof binding.onSync === 'function') {\n          binding.onSync(next);\n        }\n      }\n    });\n\n    // Sync section toggle button states\n    this._syncSectionToggleStates();\n\n    this._isSyncing = false;\n  }\n\n  /**\n   * Update all section toggle button states to match their underlying settings.\n   * Called after settings sync to ensure section toggle indicators reflect current state.\n   */\n  _syncSectionToggleStates() {\n    if (!this.sections) return;\n    this.sections.forEach((sectionData) => {\n      const section = sectionData?.section;\n      if (section && typeof section._updateToggleState === 'function') {\n        section._updateToggleState();\n      }\n    });\n  }\n\n  _resolveNumber(value, fallback, { min, max } = {}) {\n    const num = Number(value);\n    if (!Number.isFinite(num)) return fallback;\n    let next = num;\n    if (Number.isFinite(min)) next = Math.max(min, next);\n    if (Number.isFinite(max)) next = Math.min(max, next);\n    return next;\n  }\n\n  _startSpeakPttCapture(onCapture) {\n    if (typeof onCapture !== 'function') return;\n    this._stopSpeakPttCapture();\n    const button = this._speakPttRecordBtn;\n    if (button) {\n      button.textContent = 'Press key...';\n    }\n    this._speakPttCaptureListener = (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n      const code = normalizeKeyboardCode(event);\n      onCapture(code);\n      this._stopSpeakPttCapture();\n    };\n    window.addEventListener('keydown', this._speakPttCaptureListener, true);\n  }\n\n  _stopSpeakPttCapture() {\n    if (this._speakPttCaptureListener) {\n      window.removeEventListener('keydown', this._speakPttCaptureListener, true);\n      this._speakPttCaptureListener = null;\n    }\n    if (this._speakPttRecordBtn) {\n      this._speakPttRecordBtn.textContent = 'Record Key';\n    }\n  }\n\n  _getAvatarAnimationNames() {\n    const names = this.scene?.api?.avatar?.getAvailableAnimations?.();\n    if (Array.isArray(names)) return names.filter(Boolean);\n    return [];\n  }\n\n  _getAvatarActionNames() {\n    const names = this.scene?.api?.avatar?.getAvailableActionStates?.();\n    if (Array.isArray(names)) return names.filter(Boolean);\n    return [];\n  }\n\n  _refreshAvatarAnimations() {\n    if (!this._avatarAnimationsEl) return;\n    const clipNames = this._getAvatarAnimationNames();\n    const actionNames = this._getAvatarActionNames();\n\n    const updateList = (el, names, emptyLabel) => {\n      el.innerHTML = '';\n      if (!names.length) {\n        const empty = document.createElement('div');\n        empty.className = 'avatar-anim-empty';\n        empty.textContent = emptyLabel;\n        el.appendChild(empty);\n        return;\n      }\n      names.forEach((name) => {\n        const item = document.createElement('div');\n        item.className = 'avatar-anim-item';\n        item.textContent = name;\n        el.appendChild(item);\n      });\n    };\n\n    updateList(this._avatarAnimationsEl, clipNames, 'No GLB animations loaded yet.');\n    if (this._avatarActionsEl) {\n      updateList(this._avatarActionsEl, actionNames, 'No avatar action states yet.');\n    }\n  }\n\n  _createDetailPanel(emptyLabel) {\n    const panel = document.createElement('div');\n    panel.className = 'config-detail-panel';\n    const metrics = document.createElement('div');\n    metrics.className = 'config-metrics';\n    panel.appendChild(metrics);\n    this._renderDetailMetrics(metrics, [], emptyLabel);\n    return { panel, metrics };\n  }\n\n  _renderDetailMetrics(container, metrics, emptyLabel) {\n    if (!container) return;\n    container.innerHTML = '';\n    if (!metrics || metrics.length === 0) {\n      const empty = document.createElement('div');\n      empty.className = 'config-detail-empty';\n      empty.textContent = emptyLabel || 'No data available.';\n      container.appendChild(empty);\n      return;\n    }\n    metrics.forEach(({ label, value }) => {\n      container.appendChild(createMetric(label, value));\n    });\n  }\n\n  _formatLatLon(lat, lon) {\n    if (!Number.isFinite(lat) || !Number.isFinite(lon)) return '--';\n    return `${lat.toFixed(5)}, ${lon.toFixed(5)}`;\n  }\n\n  _formatAltitudeM(value, onGround) {\n    if (onGround === true) return 'Ground';\n    if (!Number.isFinite(value)) return '--';\n    const ft = value * 3.28084;\n    return `${value.toFixed(0)} m (${ft.toFixed(0)} ft)`;\n  }\n\n  _formatAltitudeKm(value) {\n    if (!Number.isFinite(value)) return '--';\n    return `${(value / 1000).toFixed(1)} km`;\n  }\n\n  _formatSpeedMps(value) {\n    if (!Number.isFinite(value)) return '--';\n    const knots = value * 1.94384;\n    return `${value.toFixed(1)} m/s (${knots.toFixed(0)} kt)`;\n  }\n\n  _formatHeading(value) {\n    if (!Number.isFinite(value)) return '--';\n    return `${value.toFixed(0)} deg`;\n  }\n\n  _formatDistanceM(value) {\n    if (!Number.isFinite(value)) return '--';\n    if (value >= 100000) return `${(value / 1000).toFixed(0)} km`;\n    if (value >= 1000) return `${(value / 1000).toFixed(1)} km`;\n    return `${value.toFixed(0)} m`;\n  }\n\n  _formatAge(value) {\n    let timestamp = null;\n    if (Number.isFinite(value)) {\n      timestamp = value;\n    } else if (typeof value === 'string') {\n      const parsed = Date.parse(value);\n      if (Number.isFinite(parsed)) {\n        timestamp = parsed;\n      }\n    }\n    if (!Number.isFinite(timestamp)) return '--';\n    const deltaMs = Math.max(0, Date.now() - timestamp);\n    if (deltaMs < 1000) return 'just now';\n    if (deltaMs < 60000) return `${Math.round(deltaMs / 1000)}s ago`;\n    if (deltaMs < 3600000) return `${Math.round(deltaMs / 60000)}m ago`;\n    return `${Math.round(deltaMs / 3600000)}h ago`;\n  }\n\n  _formatAircraftLabel(entry) {\n    if (!entry) return 'Unknown aircraft';\n    const callsign = typeof entry.callsign === 'string' ? entry.callsign.trim() : '';\n    const rawId = entry.rawId ? String(entry.rawId).trim() : '';\n    const aircraftType = entry.aircraftType ? String(entry.aircraftType).trim() : '';\n    const parts = [];\n    if (callsign) parts.push(callsign);\n    if (rawId && rawId !== callsign) parts.push(rawId);\n    if (aircraftType) parts.push(aircraftType);\n    return parts.length ? parts.join(' / ') : (entry.id ? String(entry.id) : 'Unknown aircraft');\n  }\n\n  _formatSatelliteLabel(entry) {\n    if (!entry) return 'Unknown satellite';\n    const name = entry.name ? String(entry.name).trim() : '';\n    const id = entry.noradCatId ?? entry.id;\n    if (name && id !== undefined && id !== null) return `${name} (${id})`;\n    if (name) return name;\n    if (id !== undefined && id !== null) return String(id);\n    return 'Unknown satellite';\n  }\n\n  _formatMaritimeLabel(entry) {\n    if (!entry) return 'Unknown vessel';\n    const name = entry.name ? String(entry.name).trim() : '';\n    const mmsi = entry.mmsi ?? entry.id;\n    if (name && mmsi !== undefined && mmsi !== null) return `${name} (${mmsi})`;\n    if (name) return name;\n    if (mmsi !== undefined && mmsi !== null) return String(mmsi);\n    return 'Unknown vessel';\n  }\n\n  _formatIncidentLabel(entry) {\n    if (!entry) return 'Incident';\n    const callType = formatIncidentTypeLabel(entry.callType, { includeCode: true, fallback: '' });\n    const address = entry.address ? String(entry.address).trim() : '';\n    if (callType && address) return `${callType} - ${address}`;\n    if (callType) return callType;\n    if (address) return address;\n    return entry.id ? String(entry.id) : 'Incident';\n  }\n\n  _resolveIncidentEmoji(callType) {\n    return resolveIncidentEmoji(callType);\n  }\n\n  _renderAircraftDetails(entry) {\n    if (!this._aircraftDetailsEl) return;\n    if (!entry) {\n      this._renderDetailMetrics(this._aircraftDetailsEl, [], 'Select an aircraft to see details.');\n      return;\n    }\n    const metrics = [\n      { label: 'Callsign', value: entry.callsign ? String(entry.callsign).trim() : (entry.rawId || entry.id || '--') },\n      { label: 'Type', value: entry.aircraftType || '--' },\n      { label: 'Position', value: this._formatLatLon(entry.lat, entry.lon) },\n      { label: 'Altitude', value: this._formatAltitudeM(entry.altitudeM, entry.onGround) },\n      { label: 'Speed', value: this._formatSpeedMps(entry.velocityMps) },\n      { label: 'Heading', value: this._formatHeading(entry.headingDeg) },\n      { label: 'Updated', value: this._formatAge(entry.lastContactMs ?? entry.updatedAtMs) },\n    ];\n    this._renderDetailMetrics(this._aircraftDetailsEl, metrics, '');\n  }\n\n  _renderSatelliteDetails(entry) {\n    if (!this._satelliteDetailsEl) return;\n    if (!entry) {\n      this._renderDetailMetrics(this._satelliteDetailsEl, [], 'Select a satellite to see details.');\n      return;\n    }\n    const metrics = [\n      { label: 'Name', value: entry.name || '--' },\n      { label: 'NORAD', value: entry.noradCatId ?? entry.id ?? '--' },\n      { label: 'Type', value: entry.objectType || '--' },\n      { label: 'Position', value: this._formatLatLon(entry.lat, entry.lon) },\n      { label: 'Altitude', value: this._formatAltitudeKm(entry.altitudeM) },\n      { label: 'Updated', value: this._formatAge(entry.updatedAtMs ?? entry.updatedAt) },\n      { label: 'Source', value: entry.source || '--' },\n      { label: 'Orbit', value: entry.orbitStatus || 'Legacy estimate' },\n      { label: 'Elements epoch', value: entry.tleEpoch || '--' },\n      { label: 'Position method', value: entry.orbitStatus ? 'SGP4 prediction · TEME / UTC' : '--' },\n    ];\n    this._renderDetailMetrics(this._satelliteDetailsEl, metrics, '');\n  }\n\n  _renderMaritimeDetails(entry) {\n    if (!this._maritimeDetailsEl) return;\n    if (!entry) {\n      this._renderDetailMetrics(this._maritimeDetailsEl, [], 'Select a vessel to see details.');\n      return;\n    }\n    const heading = Number.isFinite(entry.headingDeg) ? entry.headingDeg : entry.courseDeg;\n    const metrics = [\n      { label: 'Name', value: entry.name || '--' },\n      { label: 'MMSI', value: entry.mmsi ?? entry.id ?? '--' },\n      { label: 'Position', value: this._formatLatLon(entry.lat, entry.lon) },\n      { label: 'Speed', value: this._formatSpeedMps(entry.speedMps) },\n      { label: 'Heading', value: this._formatHeading(heading) },\n      { label: 'Status', value: entry.navStatus || '--' },\n      { label: 'Updated', value: this._formatAge(entry.lastReportMs ?? entry.updatedAtMs) },\n      { label: 'Source', value: entry.source || '--' },\n    ];\n    this._renderDetailMetrics(this._maritimeDetailsEl, metrics, '');\n  }\n\n  _renderIncidentDetails(entry) {\n    if (!this._incidentDetailsEl) return;\n    if (!entry) {\n      this._renderDetailMetrics(this._incidentDetailsEl, [], 'Select an incident to see details.');\n      return;\n    }\n    const typeLabel = formatIncidentTypeLabel(entry.callType, { includeCode: true, fallback: '--' });\n    const presentation = buildIncidentPresentation(entry);\n    const location = [presentation.placeName, presentation.placeType].filter(Boolean).join(' · ');\n    const metrics = [\n      { label: 'Type', value: typeLabel || '--' },\n      { label: 'Location', value: location || '--' },\n      { label: 'Address', value: entry.address || '--' },\n      { label: 'Agency', value: entry.agencyId || '--' },\n      { label: 'Position', value: this._formatLatLon(entry.lat, entry.lon) },\n      { label: 'Distance', value: this._formatDistanceM(entry.distanceM) },\n      { label: 'Received', value: this._formatAge(entry.receivedAt) },\n    ];\n    this._renderDetailMetrics(this._incidentDetailsEl, metrics, '');\n  }\n\n  updateAircraftList(entries = []) {\n    if (!this._aircraftListSelect || !this._aircraftDetailsEl) return;\n    const items = Array.isArray(entries) ? entries : [];\n    const select = this._aircraftListSelect;\n    const previousValue = select.value;\n    const nextEntries = [];\n\n    this._aircraftEntriesById.clear();\n    items.forEach((entry) => {\n      if (!entry) return;\n      const callsign = typeof entry.callsign === 'string' ? entry.callsign.trim() : '';\n      const id = entry.id || entry.rawId || callsign;\n      if (!id) return;\n      nextEntries.push({\n        id: String(id),\n        label: this._formatAircraftLabel(entry),\n        entry\n      });\n    });\n\n    nextEntries.sort((a, b) => a.label.localeCompare(b.label));\n\n    if (!nextEntries.length) {\n      patchStableSelect(select,[],'No aircraft in scene');\n      this._renderDetailMetrics(this._aircraftDetailsEl, [], 'No aircraft in scene.');\n      return;\n    }\n\n    nextEntries.forEach(({ id, label, entry }) => {\n      this._aircraftEntriesById.set(id, entry);\n    });\n    patchStableSelect(select,nextEntries,'No aircraft in scene');\n\n    const nextValue = this._aircraftEntriesById.has(previousValue)\n      ? previousValue\n      : nextEntries[0].id;\n    if(select.ownerDocument.activeElement!==select)select.value=nextValue;\n    this._renderAircraftDetails(this._aircraftEntriesById.get(nextValue) || null);\n  }\n\n  updateSatelliteList(entries = []) {\n    if (!this._satelliteListSelect || !this._satelliteDetailsEl) return;\n    const items = Array.isArray(entries) ? entries : [];\n    const select = this._satelliteListSelect;\n    const previousValue = select.value;\n    const nextEntries = [];\n\n    this._satelliteEntriesById.clear();\n    items.forEach((entry) => {\n      if (!entry) return;\n      const name = entry.name ? String(entry.name).trim() : '';\n      const id = entry.noradCatId ?? entry.id ?? name;\n      if (id === undefined || id === null || id === '') return;\n      nextEntries.push({\n        id: String(id),\n        label: this._formatSatelliteLabel(entry),\n        entry\n      });\n    });\n\n    nextEntries.sort((a, b) => a.label.localeCompare(b.label));\n\n    if (!nextEntries.length) {\n      patchStableSelect(select,[],'No satellites in scene');\n      this._renderDetailMetrics(this._satelliteDetailsEl, [], 'No satellites in scene.');\n      return;\n    }\n\n    nextEntries.forEach(({ id, label, entry }) => {\n      this._satelliteEntriesById.set(id, entry);\n    });\n    patchStableSelect(select,nextEntries,'No satellites in scene');\n\n    const nextValue = this._satelliteEntriesById.has(previousValue)\n      ? previousValue\n      : nextEntries[0].id;\n    if(select.ownerDocument.activeElement!==select)select.value=nextValue;\n    this._renderSatelliteDetails(this._satelliteEntriesById.get(nextValue) || null);\n  }\n\n  updateSatelliteCatalogStatus(status) {\n    if(!this._satelliteCatalogStatus)return;\n    this._satelliteCatalogStatus.textContent=status?.counts\n      ? `${status.counts.total.toLocaleString()} objects${status.loaded<status.matched?` · Loading ${status.loaded.toLocaleString()} / ${status.matched.toLocaleString()}`:''} · ${status.rendered.toLocaleString()} positioned · ${status.counts.stale.toLocaleString()} stale · ${status.counts.unavailable.toLocaleString()} with no current orbit loaded. SGP4 predictions. ${status.backfill==='pending'?'Additional orbit catalog loading.':status.backfill==='partial'?'Supplementary catalog partly available.':''} ${status.error||''}`\n      : 'Satellite catalogs are fetched server-side and cached for all users.';\n  }\n\n  updateMaritimeList(entries = []) {\n    if (!this._maritimeListSelect || !this._maritimeDetailsEl) return;\n    const items = Array.isArray(entries) ? entries : [];\n    const select = this._maritimeListSelect;\n    const previousValue = select.value;\n    const nextEntries = [];\n\n    this._maritimeEntriesById.clear();\n    items.forEach((entry) => {\n      if (!entry) return;\n      const mmsi = entry.mmsi ?? entry.id;\n      if (!mmsi) return;\n      nextEntries.push({\n        id: String(mmsi),\n        label: this._formatMaritimeLabel(entry),\n        entry\n      });\n    });\n\n    nextEntries.sort((a, b) => a.label.localeCompare(b.label));\n\n    if (!nextEntries.length) {\n      patchStableSelect(select,[],'No vessels in scene');\n      this._renderDetailMetrics(this._maritimeDetailsEl, [], 'No vessels in scene.');\n      return;\n    }\n\n    nextEntries.forEach(({ id, label, entry }) => {\n      this._maritimeEntriesById.set(id, entry);\n    });\n    patchStableSelect(select,nextEntries,'No vessels in scene');\n\n    const nextValue = this._maritimeEntriesById.has(previousValue)\n      ? previousValue\n      : nextEntries[0].id;\n    if(select.ownerDocument.activeElement!==select)select.value=nextValue;\n    this._renderMaritimeDetails(this._maritimeEntriesById.get(nextValue) || null);\n  }\n\n  updateIncidentList(entries = []) {\n    if (!this._incidentListSelect || !this._incidentDetailsEl) return;\n    const items = Array.isArray(entries) ? entries : [];\n    const select = this._incidentListSelect;\n    const previousValue = select.value;\n    const nextEntries = [];\n    this._incidentEntriesCache = items;\n\n    this._incidentEntriesById.clear();\n    items.forEach((entry) => {\n      if (!entry) return;\n      const rawId = entry.id || entry.IncidentID || entry.IncidentNumber;\n      if (!rawId) return;\n      const id = String(rawId);\n      nextEntries.push({\n        id,\n        label: this._formatIncidentLabel(entry),\n        entry\n      });\n    });\n\n    nextEntries.sort((a, b) => a.label.localeCompare(b.label));\n\n    if (!nextEntries.length) {\n      patchStableSelect(select,[],'No incidents in scene');\n      this._renderDetailMetrics(this._incidentDetailsEl, [], 'No incidents in scene.');\n      this._renderIncidentRecentList([]);\n      this._updateMiniMapIncidentMarkers([]);\n      return;\n    }\n\n    nextEntries.forEach(({ id, label, entry }) => {\n      this._incidentEntriesById.set(id, entry);\n    });\n    patchStableSelect(select,nextEntries,'No incidents in scene');\n\n    const nextValue = this._incidentEntriesById.has(previousValue)\n      ? previousValue\n      : nextEntries[0].id;\n    if(select.ownerDocument.activeElement!==select)select.value=nextValue;\n    this._renderIncidentDetails(this._incidentEntriesById.get(nextValue) || null);\n    this._renderIncidentRecentList(items);\n    this._updateMiniMapIncidentMarkers(items);\n  }\n\n  getSection(id) {\n    if (id === 'sensors') {\n      return {\n        update: (payload) => this.updateSensorStatus(payload?.sensorStatus),\n      };\n    }\n    return null;\n  }\n\n  updateSensorStatus(statusMap) {\n    if (!statusMap || typeof statusMap !== 'object') return;\n    for (const [sourceId, info] of Object.entries(statusMap)) {\n      const el = this._sensorStatusEls.get(sourceId);\n      if (!el) continue;\n      const dot = el.querySelector('.sensor-status-dot');\n      if (dot) {\n        const hasError = info.error && info.error.message;\n        dot.style.background = hasError ? '#f44336' : (info.enabled ? '#4caf50' : '#666');\n      }\n      const countEl = el.querySelector('.sensor-event-count');\n      if (countEl) {\n        countEl.textContent = info.eventCount > 0 ? `${info.eventCount} events` : '';\n      }\n      const wsEl = el.querySelector('.sensor-ws-status');\n      if (wsEl) {\n        if (info.wsConnected === true) {\n          wsEl.textContent = 'WS';\n          wsEl.style.color = '#4caf50';\n        } else if (info.wsConnected === false) {\n          wsEl.textContent = 'WS';\n          wsEl.style.color = '#f44336';\n        } else {\n          wsEl.textContent = '';\n        }\n      }\n      // Update info panel\n      const panel = el.nextElementSibling;\n      if (panel && panel.classList.contains('sensor-info-panel')) {\n        const lines = [];\n        // API health\n        const hasErr = info.error && info.error.message;\n        if (hasErr) {\n          lines.push(`<span style=\"color:#f44336;\">Error: ${this._escapeHtml(info.error.message)}</span>`);\n          if (info.error.at) lines.push(`<span style=\"color:rgba(255,255,255,0.35);\">Last error: ${new Date(info.error.at).toLocaleTimeString()}</span>`);\n          if (info.error.count > 1) lines.push(`<span style=\"color:rgba(255,255,255,0.35);\">Error count: ${info.error.count}</span>`);\n        } else if (info.enabled) {\n          lines.push(`<span style=\"color:#4caf50;\">OK</span>`);\n        } else {\n          lines.push(`<span style=\"color:rgba(255,255,255,0.35);\">Disabled</span>`);\n        }\n        // Fetch stats\n        lines.push(`Fetches: <span style=\"color:#81c784;\">${info.fetchOk || 0} ok</span> / <span style=\"color:#ef9a9a;\">${info.fetchFail || 0} fail</span>`);\n        if (info.lastFetchMs) lines.push(`Last fetch: ${new Date(info.lastFetchMs).toLocaleTimeString()}`);\n        // Transport\n        lines.push(`Transport: ${info.transport || 'rest'}`);\n        if (info.transport === 'websocket') {\n          lines.push(`WS connected: ${info.wsConnected ? '<span style=\"color:#4caf50;\">yes</span>' : '<span style=\"color:#f44336;\">no</span>'}`);\n          if (info.wsReconnects > 0) lines.push(`WS reconnects: ${info.wsReconnects}`);\n          if (info.wsUrl) lines.push(`WS URL: <span style=\"color:rgba(255,255,255,0.3);\">${this._escapeHtml(info.wsUrl)}</span>`);\n        }\n        if (info.pollIntervalMs) lines.push(`Poll interval: ${(info.pollIntervalMs / 1000).toFixed(0)}s`);\n        if (info.proxyPath) lines.push(`Proxy: <span style=\"color:rgba(255,255,255,0.3);\">${this._escapeHtml(info.proxyPath)}</span>`);\n        if (info.licenseNotes) lines.push(`License: <span style=\"color:rgba(255,255,255,0.3);\">${this._escapeHtml(info.licenseNotes)}</span>`);\n        panel.innerHTML = lines.join('<br>');\n      }\n    }\n  }\n\n  _escapeHtml(str) {\n    if (!str) return '';\n    return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n  }\n\n  _renderIncidentRecentList(entries = []) {\n    if (!this._incidentRecentList) return;\n    const list = this._incidentRecentList;\n    list.innerHTML = '';\n\n    const items = Array.isArray(entries) ? entries.slice() : [];\n    const parseTimestamp = (entry) => {\n      const value = entry?.receivedAt ?? entry?.CallReceivedDateTime ?? null;\n      if (Number.isFinite(value)) return value;\n      if (typeof value === 'string') {\n        const parsed = Date.parse(value);\n        return Number.isFinite(parsed) ? parsed : 0;\n      }\n      return 0;\n    };\n    items.sort((a, b) => parseTimestamp(b) - parseTimestamp(a));\n    const limited = items.slice(0, 12);\n\n    if (!limited.length) {\n      const empty = document.createElement('div');\n      empty.style.cssText = 'font-size: 11px; color: rgba(255, 255, 255, 0.55);';\n      empty.textContent = 'No incidents in scene.';\n      list.appendChild(empty);\n      return;\n    }\n\n    limited.forEach((entry) => {\n      const row = document.createElement('div');\n      row.style.cssText = 'display: flex; flex-direction: column; gap: 2px; padding: 6px 8px; background: rgba(255,255,255,0.06); border-radius: 6px; cursor: pointer;';\n\n      const presentation = buildIncidentPresentation(entry);\n      const address = entry?.address ? String(entry.address).trim() : '';\n\n      const title = document.createElement('div');\n      title.style.cssText = 'font-size: 11px; color: #fff; font-weight: 600;';\n      title.textContent = presentation.title || 'Incident';\n\n      const subtitleText = [presentation.subheader, address]\n        .filter(Boolean)\n        .join(' · ') || (entry?.id ? String(entry.id) : '');\n      const subtitle = document.createElement('div');\n      subtitle.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.7);';\n      subtitle.textContent = subtitleText;\n\n      const detailParts = [];\n      if (Number.isFinite(entry.distanceM)) detailParts.push(this._formatDistanceM(entry.distanceM));\n      const age = this._formatAge(entry.receivedAt);\n      if (age && age !== '--') detailParts.push(age);\n      const detail = document.createElement('div');\n      detail.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.55);';\n      detail.textContent = detailParts.join(' | ') || 'Click to teleport';\n\n      row.appendChild(title);\n      if (subtitleText) {\n        row.appendChild(subtitle);\n      }\n      row.appendChild(detail);\n      row.addEventListener('click', () => {\n        if (Number.isFinite(entry.lat) && Number.isFinite(entry.lon)) {\n          this._goToLatLon(entry.lat, entry.lon);\n        }\n        const rawId = entry.id || entry.IncidentID || entry.IncidentNumber;\n        if (rawId && this._incidentEntriesById.has(String(rawId)) && this._incidentListSelect) {\n          this._incidentListSelect.value = String(rawId);\n          this._renderIncidentDetails(this._incidentEntriesById.get(String(rawId)) || null);\n        }\n      });\n\n      list.appendChild(row);\n    });\n  }\n\n  _updateMiniMapIncidentMarkers(entries) {\n    if (!this._miniMap?._map || !window.L) return;\n\n    if (this._incidentMarkerLayer) {\n      this._incidentMarkerLayer.clearLayers();\n    } else {\n      this._incidentMarkerLayer = window.L.layerGroup().addTo(this._miniMap._map);\n    }\n\n    const items = Array.isArray(entries) ? entries : [];\n    if (!items.length) return;\n\n    const resolveColor = (entry) => resolveIncidentColorHex(entry?.callType);\n\n    items.forEach((entry) => {\n      if (!Number.isFinite(entry?.lat) || !Number.isFinite(entry?.lon)) return;\n      const color = resolveColor(entry);\n      const emoji = this._resolveIncidentEmoji(entry?.callType);\n      const icon = window.L.divIcon({\n        className: 'incident-marker-icon',\n        html: `<div style=\"\n          width: 18px;\n          height: 18px;\n          background: ${color};\n          border: 2px solid #fff;\n          border-radius: 50%;\n          box-shadow: 0 2px 6px rgba(0,0,0,0.4);\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          font-size: 11px;\n        \">${emoji || ''}</div>`,\n        iconSize: [18, 18],\n        iconAnchor: [9, 9],\n      });\n\n      const marker = window.L.marker([entry.lat, entry.lon], { icon })\n        .addTo(this._incidentMarkerLayer);\n\n      marker.on('click', () => {\n        this._goToLatLon(entry.lat, entry.lon);\n      });\n\n      const label = this._formatIncidentLabel(entry);\n      if (label) {\n        marker.bindTooltip(label, {\n          permanent: false,\n          direction: 'top',\n          offset: [0, -12],\n        });\n      }\n    });\n  }\n\n  _bindAvatarEvents() {\n    if (!this.eventBus || this._boundAvatarReady) return;\n    this._boundAvatarReady = () => this._refreshAvatarAnimations();\n    this.eventBus.on('avatars:ready', this._boundAvatarReady);\n    this._refreshAvatarAnimations();\n  }\n\n  _bindNknEvents() {\n    if (!this.eventBus || this._nknConnectedHandler) return;\n    this._nknConnectedHandler = (payload = {}) => {\n      const address = payload.address || payload.addr || null;\n      if (!address) return;\n      this._nknAddressCache = address;\n      try { localStorage.setItem('nkn.globe.addr', address); } catch { /* ignore */ }\n      const addrInput = document.querySelector('input[data-setting=\"nknAddress\"]');\n      if (addrInput) addrInput.value = address;\n    };\n    this.eventBus.on('nkn:connected', this._nknConnectedHandler);\n  }\n\n  _getLightingDate() {\n    const raw = this._getSettingValue('scene.lighting.date', null);\n    if (raw instanceof Date && !Number.isNaN(raw.valueOf())) return raw;\n    if (raw) {\n      const parsed = new Date(raw);\n      if (!Number.isNaN(parsed.valueOf())) return parsed;\n    }\n    const tuneables = this.scene?.api?.tuneables?.get?.();\n    const tuneableDate = tuneables?.lighting?.date;\n    if (tuneableDate instanceof Date && !Number.isNaN(tuneableDate.valueOf())) return tuneableDate;\n    if (tuneableDate) {\n      const parsed = new Date(tuneableDate);\n      if (!Number.isNaN(parsed.valueOf())) return parsed;\n    }\n    return new Date();\n  }\n\n  _formatDateInput(date) {\n    const year = date.getUTCFullYear();\n    const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n    const day = String(date.getUTCDate()).padStart(2, '0');\n    return `${year}-${month}-${day}`;\n  }\n\n  _formatTimeInput(date) {\n    const hours = String(date.getUTCHours()).padStart(2, '0');\n    const minutes = String(date.getUTCMinutes()).padStart(2, '0');\n    return `${hours}:${minutes}`;\n  }\n\n  _getLightingSystem() {\n    return this.uiController?.lightingSystem\n      || this.uiController?._lightingSystem\n      || this.scene?.lightingSystem\n      || this.scene?._lightingSystem\n      || null;\n  }\n\n  _refreshLightingInputs() {\n    const lightingSystem = this._getLightingSystem();\n    if (!lightingSystem || !this._lightingDateInput || !this._lightingTimeInput) return;\n    const currentDate = lightingSystem.currentDate;\n    if (!(currentDate instanceof Date) || Number.isNaN(currentDate.valueOf())) return;\n\n    const activeEl = document.activeElement;\n    if (activeEl !== this._lightingDateInput) {\n      this._lightingDateInput.value = this._formatDateInput(currentDate);\n    }\n    if (activeEl !== this._lightingTimeInput) {\n      this._lightingTimeInput.value = this._formatTimeInput(currentDate);\n    }\n  }\n\n  _startLightingLiveUpdates() {\n    if (this._lightingLiveInterval) return;\n    this._refreshLightingInputs();\n    this._lightingLiveInterval = setInterval(() => {\n      this._refreshLightingInputs();\n    }, 1000);\n  }\n\n  _buildSections(container) {\n    // Overview Section (non-debug)\n    this._addSection(container, 'overview', 'Overview', true, () => {\n      const content = document.createElement('div');\n\n      // Settings actions\n      const actionsGroup = document.createElement('div');\n      actionsGroup.className = 'config-group';\n\n      const actionsTitle = document.createElement('div');\n      actionsTitle.className = 'config-group-title';\n      actionsTitle.textContent = 'Settings';\n      actionsGroup.appendChild(actionsTitle);\n\n      const actionsRow = document.createElement('div');\n      actionsRow.style.display = 'flex';\n      actionsRow.style.gap = '8px';\n      actionsRow.style.flexWrap = 'wrap';\n\n      actionsRow.appendChild(createButton('Export', { variant: 'secondary', size: 'sm', onClick: () => this.onExport?.() }));\n      actionsRow.appendChild(createButton('Import', { variant: 'secondary', size: 'sm', onClick: () => this._triggerImport() }));\n      actionsRow.appendChild(createButton('Reset', { variant: 'danger', size: 'sm', onClick: () => this.onReset?.() }));\n\n      actionsGroup.appendChild(actionsRow);\n      content.appendChild(actionsGroup);\n\n      // Cloud sync actions (only shown when logged in)\n      const cloudGroup = document.createElement('div');\n      cloudGroup.className = 'config-group';\n\n      const cloudTitle = document.createElement('div');\n      cloudTitle.className = 'config-group-title';\n      cloudTitle.textContent = 'Cloud Sync';\n      cloudGroup.appendChild(cloudTitle);\n\n      const cloudDesc = document.createElement('div');\n      cloudDesc.style.cssText = 'font-size: 11px; color: rgba(255,255,255,0.5); margin-bottom: 8px;';\n      cloudDesc.textContent = 'Sync settings with your account (auto-saves when logged in)';\n      cloudGroup.appendChild(cloudDesc);\n\n      const cloudRow = document.createElement('div');\n      cloudRow.style.display = 'flex';\n      cloudRow.style.gap = '8px';\n      cloudRow.style.flexWrap = 'wrap';\n\n      cloudRow.appendChild(createButton('Save to Cloud', {\n        variant: 'primary',\n        size: 'sm',\n        onClick: () => this.onCloudSave?.()\n      }));\n      cloudRow.appendChild(createButton('Load from Cloud', {\n        variant: 'secondary',\n        size: 'sm',\n        onClick: () => this.onCloudLoad?.()\n      }));\n\n      cloudGroup.appendChild(cloudRow);\n      content.appendChild(cloudGroup);\n\n      // Session metrics\n      const metricsGroup = document.createElement('div');\n      metricsGroup.className = 'config-group';\n\n      const metricsTitle = document.createElement('div');\n      metricsTitle.className = 'config-group-title';\n      metricsTitle.textContent = 'Session';\n      metricsGroup.appendChild(metricsTitle);\n\n      const metrics = document.createElement('div');\n      metrics.className = 'config-metrics';\n      metrics.id = 'session-metrics';\n      metricsGroup.appendChild(metrics);\n\n      content.appendChild(metricsGroup);\n\n      const hudGroup = document.createElement('div');\n      hudGroup.className = 'config-group';\n\n      const hudTitle = document.createElement('div');\n      hudTitle.className = 'config-group-title';\n      hudTitle.textContent = 'HUD';\n      hudGroup.appendChild(hudTitle);\n\n      const hideHudMetrics = !!this._getSettingValue('hud.hideMetrics', false);\n      const { wrapper: hideHudToggle, input: hideHudInput } = createToggle('Hide HUD Metrics', hideHudMetrics, (checked) => {\n        this._emitChange('hudMetricsHidden', checked);\n      });\n      this._bindSettingToggle('hud.hideMetrics', hideHudInput, false);\n      hudGroup.appendChild(hideHudToggle);\n\n      content.appendChild(hudGroup);\n\n      return content;\n    });\n\n    // Rendering Section\n    this._addSection(container, 'rendering', 'Rendering', false, () => {\n      const content = document.createElement('div');\n      const renderScaleValue = 1;\n      const autoRenderScaleEnabled = false;\n      const renderCadenceValue = this._resolveNumber(\n        this._getSettingValue('scene.renderer.renderCadenceMs', 0),\n        0,\n        { min: 0, max: 200 }\n      );\n      const frameDiscardEnabled = !!this._getSettingValue('scene.renderer.frameDiscard.enabled', false);\n      const frameDiscardThreshold = this._resolveNumber(\n        this._getSettingValue('scene.renderer.frameDiscard.waitThresholdMs', 120),\n        120,\n        { min: 20, max: 500 }\n      );\n      const bloomSettings = this._getSettingValue('scene.renderer.bloom', {}) || {};\n      const bloomEnabled = !!bloomSettings.enabled;\n      const bloomIntensity = this._resolveNumber(\n        bloomSettings.intensity,\n        POSTPROCESS_BLOOM_DEFAULTS.intensity,\n        { min: 0, max: 6 }\n      );\n      const bloomRadius = this._resolveNumber(\n        bloomSettings.radius,\n        POSTPROCESS_BLOOM_DEFAULTS.radius,\n        { min: 0, max: 1 }\n      );\n      const bloomThreshold = this._resolveNumber(\n        bloomSettings.threshold,\n        POSTPROCESS_BLOOM_DEFAULTS.threshold,\n        { min: 0, max: 1 }\n      );\n      const bloomSmoothing = this._resolveNumber(\n        bloomSettings.smoothing,\n        POSTPROCESS_BLOOM_DEFAULTS.smoothing,\n        { min: 0, max: 1 }\n      );\n      const bloomLevels = this._resolveNumber(\n        bloomSettings.levels,\n        POSTPROCESS_BLOOM_DEFAULTS.levels,\n        { min: 1, max: 8 }\n      );\n      const bloomMipmapBlur = bloomSettings.mipmapBlur !== false;\n      const dofSettings = this._getSettingValue('scene.renderer.depthOfField', {}) || {};\n      const dofEnabled = !!dofSettings.enabled;\n      const dofAutofocus = dofSettings.autofocus !== false;\n      const dofFocusDistance = this._resolveNumber(dofSettings.focusDistance, 25, { min: 0.5, max: 10000 });\n      const dofFocalLength = this._resolveNumber(dofSettings.focalLength, 12, { min: 0.5, max: 50000 });\n      const dofBokehScale = this._resolveNumber(dofSettings.bokehScale, 2.5, { min: 0, max: 10 });\n      const dofResolutionScale = this._resolveNumber(dofSettings.resolutionScale, 0.5, { min: 0.25, max: 1 });\n      const dofResponse = this._resolveNumber(dofSettings.response, 0.18, { min: 0.02, max: 1 });\n      const dofSampleInterval = this._resolveNumber(dofSettings.sampleIntervalMs, 140, { min: 60, max: 500 });\n      const motionBlurSettings = this._getSettingValue('scene.renderer.motionBlur', {}) || {};\n      const motionBlurEnabled = !!motionBlurSettings.enabled;\n      const motionBlurIntensity = this._resolveNumber(motionBlurSettings.intensity, 0.55, { min: 0, max: 1 });\n      const motionBlurMaxSpeed = this._resolveNumber(motionBlurSettings.maxSpeed, 300, { min: 10, max: 2000 });\n      const motionBlurSmoothing = this._resolveNumber(motionBlurSettings.smoothing, 0.2, { min: 0, max: 1 });\n      const motionBlurDampMin = this._resolveNumber(motionBlurSettings.dampMin, 0.85, { min: 0.5, max: 0.99 });\n      const motionBlurDampMax = this._resolveNumber(motionBlurSettings.dampMax, 0.985, { min: 0.5, max: 0.999 });\n      const speedFovSettings = this._getSettingValue('scene.renderer.speedFov', {}) || {};\n      const speedFovEnabled = !!speedFovSettings.enabled;\n      const speedFovBase = this._resolveNumber(speedFovSettings.baseFov, 45, { min: 10, max: 120 });\n      const speedFovMaxBoost = this._resolveNumber(speedFovSettings.maxBoost, 8, { min: 0, max: 60 });\n      const speedFovMaxSpeed = this._resolveNumber(speedFovSettings.maxSpeed, 300, { min: 10, max: 2000 });\n      const speedFovSmoothing = this._resolveNumber(speedFovSettings.smoothing, 0.15, { min: 0, max: 1 });\n      const emissiveSettings = this._getSettingValue('scene.renderer.emissive', {}) || {};\n      const emissiveMaterialIntensity = this._resolveNumber(emissiveSettings.materialIntensity, 1, { min: 0, max: 8 });\n      const emissiveMaterialColor = emissiveSettings.materialColor || '#ffffff';\n      const emissiveStarfieldIntensity = this._resolveNumber(emissiveSettings.starfieldIntensity, 1, { min: 0, max: 8 });\n      const emissiveGalaxyIntensity = this._resolveNumber(emissiveSettings.galaxyIntensity, 1, { min: 0, max: 8 });\n      const emissiveSunIntensity = this._resolveNumber(emissiveSettings.sunIntensity, 1, { min: 0, max: 8 });\n      const wireframeEnabled = !!this._getSettingValue('scene.debug.wireframe', false);\n      const wireframeStyle = this._getSettingValue('scene.debug.wireframeStyle', {}) || {};\n      const wireframeSurfaceColor = wireframeStyle.surfaceColor || '#b8b8b8';\n      const wireframeLineColor = wireframeStyle.lineColor || '#15191f';\n\n      // Render scale\n      const renderScaleGroup = document.createElement('div');\n      renderScaleGroup.className = 'config-group';\n\n      const { group: scaleGroup, range: scaleRange } = createRangeSlider({\n        label: 'Render Scale',\n        min: 0.25,\n        max: 2,\n        step: 0.05,\n        value: renderScaleValue,\n        onChange: (val) => this._emitChange('renderScale', val),\n      });\n      this._bindSettingRange('scene.renderer.renderScale', scaleRange, 1, { valueDisplay: scaleGroup.querySelector('.nc-range-value') });\n      scaleRange.disabled = true;\n      renderScaleGroup.appendChild(scaleGroup);\n\n      const { wrapper: autoScaleToggle, input: autoScaleInput } = createToggle('Auto Render Scale', autoRenderScaleEnabled, (checked) => {\n        autoScaleInput.checked = false;\n        this._emitChange('autoRenderScale', false);\n      });\n      this._bindSettingToggle('scene.renderer.autoRenderScale.enabled', autoScaleInput, false);\n      autoScaleInput.checked = false;\n      autoScaleInput.disabled = true;\n      renderScaleGroup.appendChild(autoScaleToggle);\n\n      content.appendChild(renderScaleGroup);\n\n      const pacingGroup = document.createElement('div');\n      pacingGroup.className = 'config-group';\n      pacingGroup.style.marginTop = '16px';\n\n      const { group: cadenceSlider } = createRangeSlider({\n        label: 'Render Cadence (ms)',\n        min: 0,\n        max: 200,\n        step: 1,\n        value: renderCadenceValue,\n        onChange: (val) => this._emitChange('renderCadenceMs', val),\n      });\n      this._bindSettingRange('scene.renderer.renderCadenceMs', cadenceSlider.querySelector('input[type=\"range\"]'), 0, {\n        valueDisplay: cadenceSlider.querySelector('.nc-range-value')\n      });\n      cadenceSlider.style.marginBottom = '12px';\n      pacingGroup.appendChild(cadenceSlider);\n\n      const { wrapper: discardToggle, input: discardInput } = createToggle('Discard Stalled Frames', frameDiscardEnabled, (checked) => {\n        this._emitChange('frameDiscardEnabled', checked);\n      });\n      this._bindSettingToggle('scene.renderer.frameDiscard.enabled', discardInput, false);\n      pacingGroup.appendChild(discardToggle);\n\n      const { group: discardSlider } = createRangeSlider({\n        label: 'Discard Threshold (ms)',\n        min: 20,\n        max: 500,\n        step: 5,\n        value: frameDiscardThreshold,\n        onChange: (val) => this._emitChange('frameDiscardThresholdMs', val),\n      });\n      this._bindSettingRange('scene.renderer.frameDiscard.waitThresholdMs', discardSlider.querySelector('input[type=\"range\"]'), 120, {\n        valueDisplay: discardSlider.querySelector('.nc-range-value')\n      });\n      pacingGroup.appendChild(discardSlider);\n\n      content.appendChild(pacingGroup);\n\n      // Bloom\n      const bloomGroup = document.createElement('div');\n      bloomGroup.className = 'config-group';\n      bloomGroup.style.marginTop = '16px';\n\n      const bloomTitle = document.createElement('div');\n      bloomTitle.className = 'config-group-title';\n      bloomTitle.textContent = 'Bloom';\n      bloomGroup.appendChild(bloomTitle);\n\n      const { wrapper: bloomToggle, input: bloomToggleInput } = createToggle('Enable Bloom', bloomEnabled, (checked) => {\n        this._emitChange('bloomEnabled', checked);\n      });\n      this._bindSettingToggle('scene.renderer.bloom.enabled', bloomToggleInput, false);\n      bloomGroup.appendChild(bloomToggle);\n\n      const { group: bloomIntensityGroup, range: bloomIntensityRange, valueDisplay: bloomIntensityValueDisplay } = createRangeSlider({\n        label: 'Bloom Intensity',\n        min: 0,\n        max: 6,\n        step: 0.05,\n        value: bloomIntensity,\n        onChange: (val) => this._emitChange('bloomIntensity', val),\n      });\n      this._bindSettingRange(\n        'scene.renderer.bloom.intensity',\n        bloomIntensityRange,\n        POSTPROCESS_BLOOM_DEFAULTS.intensity,\n        {\n        valueDisplay: bloomIntensityValueDisplay\n        }\n      );\n      bloomGroup.appendChild(bloomIntensityGroup);\n\n      const { group: bloomThresholdGroup, range: bloomThresholdRange, valueDisplay: bloomThresholdValueDisplay } = createRangeSlider({\n        label: 'Bloom Threshold',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: bloomThreshold,\n        onChange: (val) => this._emitChange('bloomThreshold', val),\n      });\n      this._bindSettingRange(\n        'scene.renderer.bloom.threshold',\n        bloomThresholdRange,\n        POSTPROCESS_BLOOM_DEFAULTS.threshold,\n        {\n        valueDisplay: bloomThresholdValueDisplay\n        }\n      );\n      bloomGroup.appendChild(bloomThresholdGroup);\n\n      const { group: bloomRadiusGroup, range: bloomRadiusRange, valueDisplay: bloomRadiusValueDisplay } = createRangeSlider({\n        label: 'Bloom Radius',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: bloomRadius,\n        onChange: (val) => this._emitChange('bloomRadius', val),\n      });\n      this._bindSettingRange(\n        'scene.renderer.bloom.radius',\n        bloomRadiusRange,\n        POSTPROCESS_BLOOM_DEFAULTS.radius,\n        {\n        valueDisplay: bloomRadiusValueDisplay\n        }\n      );\n      bloomGroup.appendChild(bloomRadiusGroup);\n\n      const { group: bloomSmoothingGroup, range: bloomSmoothingRange, valueDisplay: bloomSmoothingValueDisplay } = createRangeSlider({\n        label: 'Bloom Smoothing',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: bloomSmoothing,\n        onChange: (val) => this._emitChange('bloomSmoothing', val),\n      });\n      this._bindSettingRange(\n        'scene.renderer.bloom.smoothing',\n        bloomSmoothingRange,\n        POSTPROCESS_BLOOM_DEFAULTS.smoothing,\n        {\n        valueDisplay: bloomSmoothingValueDisplay\n        }\n      );\n      bloomGroup.appendChild(bloomSmoothingGroup);\n\n      const { group: bloomLevelsGroup, range: bloomLevelsRange, valueDisplay: bloomLevelsValueDisplay } = createRangeSlider({\n        label: 'Bloom Levels',\n        min: 1,\n        max: 8,\n        step: 1,\n        value: bloomLevels,\n        onChange: (val) => this._emitChange('bloomLevels', val),\n      });\n      this._bindSettingRange('scene.renderer.bloom.levels', bloomLevelsRange, 5, {\n        valueDisplay: bloomLevelsValueDisplay\n      });\n      bloomGroup.appendChild(bloomLevelsGroup);\n\n      const { wrapper: bloomMipmapToggle, input: bloomMipmapInput } = createToggle('Mipmap Blur', bloomMipmapBlur, (checked) => {\n        this._emitChange('bloomMipmapBlur', checked);\n      });\n      this._bindSettingToggle('scene.renderer.bloom.mipmapBlur', bloomMipmapInput, true);\n      bloomGroup.appendChild(bloomMipmapToggle);\n\n      content.appendChild(bloomGroup);\n\n      // Depth of Field — center-screen autofocus follows the active terrain\n      // provider, and focus range tracks that hit distance (about 1/4 of the\n      // center focus distance) when autofocus is enabled.\n      const dofGroup = document.createElement('div');\n      dofGroup.className = 'config-group';\n      dofGroup.style.marginTop = '16px';\n\n      const dofTitle = document.createElement('div');\n      dofTitle.className = 'config-group-title';\n      // Only the legacy (non-atmosphere) renderer uses this effect. The live\n      // compositor's physical lens lives in Preferences → Scene modifiers.\n      dofTitle.textContent = 'Depth of Field (fallback renderer)';\n      dofTitle.title = 'Physical depth of field and chromatic aberration: Preferences → Scene modifiers';\n      dofGroup.appendChild(dofTitle);\n\n      const { wrapper: dofToggle, input: dofToggleInput } = createToggle('Enable Depth of Field', dofEnabled, (checked) => {\n        this._emitChange('dofEnabled', checked);\n      });\n      this._bindSettingToggle('scene.renderer.depthOfField.enabled', dofToggleInput, false);\n      dofGroup.appendChild(dofToggle);\n\n      const { wrapper: dofAutofocusToggle, input: dofAutofocusInput } = createToggle('Center Autofocus', dofAutofocus, (checked) => {\n        this._emitChange('dofAutofocus', checked);\n      });\n      this._bindSettingToggle('scene.renderer.depthOfField.autofocus', dofAutofocusInput, true);\n      dofGroup.appendChild(dofAutofocusToggle);\n\n      [\n        { key: 'dofFocusDistance', path: 'scene.renderer.depthOfField.focusDistance', label: 'Manual Focus Distance (m)', min: 0.5, max: 10000, step: 0.5, value: dofFocusDistance, fallback: 25 },\n        { key: 'dofFocalLength', path: 'scene.renderer.depthOfField.focalLength', label: 'Focal Range (m)', min: 0.5, max: 50000, step: 1, value: dofFocalLength, fallback: 12 },\n        { key: 'dofBokehScale', path: 'scene.renderer.depthOfField.bokehScale', label: 'Bokeh Scale', min: 0, max: 10, step: 0.1, value: dofBokehScale, fallback: 2.5 },\n        { key: 'dofResolutionScale', path: 'scene.renderer.depthOfField.resolutionScale', label: 'DOF Resolution Scale', min: 0.25, max: 1, step: 0.05, value: dofResolutionScale, fallback: 0.5 },\n        { key: 'dofResponse', path: 'scene.renderer.depthOfField.response', label: 'Autofocus Response (s)', min: 0.02, max: 1, step: 0.01, value: dofResponse, fallback: 0.18 },\n        { key: 'dofSampleInterval', path: 'scene.renderer.depthOfField.sampleIntervalMs', label: 'Focus Sample Interval (ms)', min: 60, max: 500, step: 10, value: dofSampleInterval, fallback: 140 },\n      ].forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.fallback, { valueDisplay });\n        dofGroup.appendChild(group);\n      });\n\n      content.appendChild(dofGroup);\n\n      // Motion Blur\n      const motionBlurGroup = document.createElement('div');\n      motionBlurGroup.className = 'config-group';\n      motionBlurGroup.style.marginTop = '16px';\n\n      const motionBlurTitle = document.createElement('div');\n      motionBlurTitle.className = 'config-group-title';\n      motionBlurTitle.textContent = 'Motion Blur';\n      motionBlurGroup.appendChild(motionBlurTitle);\n\n      const { wrapper: motionBlurToggle, input: motionBlurToggleInput } = createToggle('Enable Motion Blur', motionBlurEnabled, (checked) => {\n        this._emitChange('motionBlurEnabled', checked);\n      });\n      this._bindSettingToggle('scene.renderer.motionBlur.enabled', motionBlurToggleInput, false);\n      motionBlurGroup.appendChild(motionBlurToggle);\n\n      const { group: motionBlurIntensityGroup, range: motionBlurIntensityRange, valueDisplay: motionBlurIntensityValueDisplay } = createRangeSlider({\n        label: 'Blur Strength',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: motionBlurIntensity,\n        onChange: (val) => this._emitChange('motionBlurIntensity', val),\n      });\n      this._bindSettingRange('scene.renderer.motionBlur.intensity', motionBlurIntensityRange, 0.55, {\n        valueDisplay: motionBlurIntensityValueDisplay\n      });\n      motionBlurGroup.appendChild(motionBlurIntensityGroup);\n\n      const { group: motionBlurSpeedGroup, range: motionBlurSpeedRange, valueDisplay: motionBlurSpeedValueDisplay } = createRangeSlider({\n        label: 'Max Speed (m/s)',\n        min: 10,\n        max: 2000,\n        step: 10,\n        value: motionBlurMaxSpeed,\n        onChange: (val) => this._emitChange('motionBlurMaxSpeed', val),\n      });\n      this._bindSettingRange('scene.renderer.motionBlur.maxSpeed', motionBlurSpeedRange, 300, {\n        valueDisplay: motionBlurSpeedValueDisplay\n      });\n      motionBlurGroup.appendChild(motionBlurSpeedGroup);\n\n      const { group: motionBlurSmoothingGroup, range: motionBlurSmoothingRange, valueDisplay: motionBlurSmoothingValueDisplay } = createRangeSlider({\n        label: 'Blur Smoothing',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: motionBlurSmoothing,\n        onChange: (val) => this._emitChange('motionBlurSmoothing', val),\n      });\n      this._bindSettingRange('scene.renderer.motionBlur.smoothing', motionBlurSmoothingRange, 0.2, {\n        valueDisplay: motionBlurSmoothingValueDisplay\n      });\n      motionBlurGroup.appendChild(motionBlurSmoothingGroup);\n\n      const { group: motionBlurDampMinGroup, range: motionBlurDampMinRange, valueDisplay: motionBlurDampMinValueDisplay } = createRangeSlider({\n        label: 'Damp Min',\n        min: 0.5,\n        max: 0.99,\n        step: 0.005,\n        value: motionBlurDampMin,\n        onChange: (val) => this._emitChange('motionBlurDampMin', val),\n      });\n      this._bindSettingRange('scene.renderer.motionBlur.dampMin', motionBlurDampMinRange, 0.85, {\n        valueDisplay: motionBlurDampMinValueDisplay\n      });\n      motionBlurGroup.appendChild(motionBlurDampMinGroup);\n\n      const { group: motionBlurDampMaxGroup, range: motionBlurDampMaxRange, valueDisplay: motionBlurDampMaxValueDisplay } = createRangeSlider({\n        label: 'Damp Max',\n        min: 0.5,\n        max: 0.999,\n        step: 0.001,\n        value: motionBlurDampMax,\n        onChange: (val) => this._emitChange('motionBlurDampMax', val),\n      });\n      this._bindSettingRange('scene.renderer.motionBlur.dampMax', motionBlurDampMaxRange, 0.985, {\n        valueDisplay: motionBlurDampMaxValueDisplay\n      });\n      motionBlurGroup.appendChild(motionBlurDampMaxGroup);\n\n      content.appendChild(motionBlurGroup);\n\n      // Speed FOV\n      const speedFovGroup = document.createElement('div');\n      speedFovGroup.className = 'config-group';\n      speedFovGroup.style.marginTop = '16px';\n\n      const speedFovTitle = document.createElement('div');\n      speedFovTitle.className = 'config-group-title';\n      speedFovTitle.textContent = 'Speed FOV';\n      speedFovGroup.appendChild(speedFovTitle);\n\n      const { wrapper: speedFovToggle, input: speedFovToggleInput } = createToggle('Enable Speed FOV', speedFovEnabled, (checked) => {\n        this._emitChange('speedFovEnabled', checked);\n      });\n      this._bindSettingToggle('scene.renderer.speedFov.enabled', speedFovToggleInput, false);\n      speedFovGroup.appendChild(speedFovToggle);\n\n      const { group: speedFovBaseGroup, range: speedFovBaseRange, valueDisplay: speedFovBaseValueDisplay } = createRangeSlider({\n        label: 'Base FOV',\n        min: 10,\n        max: 120,\n        step: 1,\n        value: speedFovBase,\n        onChange: (val) => this._emitChange('speedFovBase', val),\n      });\n      this._bindSettingRange('scene.renderer.speedFov.baseFov', speedFovBaseRange, 45, {\n        valueDisplay: speedFovBaseValueDisplay\n      });\n      speedFovGroup.appendChild(speedFovBaseGroup);\n\n      const { group: speedFovBoostGroup, range: speedFovBoostRange, valueDisplay: speedFovBoostValueDisplay } = createRangeSlider({\n        label: 'Max Boost',\n        min: 0,\n        max: 60,\n        step: 0.5,\n        value: speedFovMaxBoost,\n        onChange: (val) => this._emitChange('speedFovMaxBoost', val),\n      });\n      this._bindSettingRange('scene.renderer.speedFov.maxBoost', speedFovBoostRange, 8, {\n        valueDisplay: speedFovBoostValueDisplay\n      });\n      speedFovGroup.appendChild(speedFovBoostGroup);\n\n      const { group: speedFovSpeedGroup, range: speedFovSpeedRange, valueDisplay: speedFovSpeedValueDisplay } = createRangeSlider({\n        label: 'Max Speed (m/s)',\n        min: 10,\n        max: 2000,\n        step: 10,\n        value: speedFovMaxSpeed,\n        onChange: (val) => this._emitChange('speedFovMaxSpeed', val),\n      });\n      this._bindSettingRange('scene.renderer.speedFov.maxSpeed', speedFovSpeedRange, 300, {\n        valueDisplay: speedFovSpeedValueDisplay\n      });\n      speedFovGroup.appendChild(speedFovSpeedGroup);\n\n      const { group: speedFovSmoothingGroup, range: speedFovSmoothingRange, valueDisplay: speedFovSmoothingValueDisplay } = createRangeSlider({\n        label: 'FOV Smoothing',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: speedFovSmoothing,\n        onChange: (val) => this._emitChange('speedFovSmoothing', val),\n      });\n      this._bindSettingRange('scene.renderer.speedFov.smoothing', speedFovSmoothingRange, 0.15, {\n        valueDisplay: speedFovSmoothingValueDisplay\n      });\n      speedFovGroup.appendChild(speedFovSmoothingGroup);\n\n      content.appendChild(speedFovGroup);\n\n      // Emissive\n      const emissiveGroup = document.createElement('div');\n      emissiveGroup.className = 'config-group';\n      emissiveGroup.style.marginTop = '16px';\n\n      const emissiveTitle = document.createElement('div');\n      emissiveTitle.className = 'config-group-title';\n      emissiveTitle.textContent = 'Emissive';\n      emissiveGroup.appendChild(emissiveTitle);\n\n      const { group: emissiveIntensityGroup, range: emissiveIntensityRange, valueDisplay: emissiveIntensityValueDisplay } = createRangeSlider({\n        label: 'Material Emissive',\n        min: 0,\n        max: 8,\n        step: 0.1,\n        value: emissiveMaterialIntensity,\n        onChange: (val) => this._emitChange('emissiveMaterialIntensity', val),\n      });\n      this._bindSettingRange('scene.renderer.emissive.materialIntensity', emissiveIntensityRange, 1, {\n        valueDisplay: emissiveIntensityValueDisplay\n      });\n      emissiveGroup.appendChild(emissiveIntensityGroup);\n\n      const { group: emissiveColorGroup, input: emissiveColorInput } = createInput({\n        label: 'Emissive Tint',\n        type: 'color',\n        value: emissiveMaterialColor,\n        onChange: (val) => this._emitChange('emissiveMaterialColor', val)\n      });\n      emissiveColorInput.dataset.setting = 'emissiveMaterialColor';\n      this._bindSettingInput('scene.renderer.emissive.materialColor', emissiveColorInput, emissiveMaterialColor);\n      emissiveGroup.appendChild(emissiveColorGroup);\n\n      const { group: starfieldIntensityGroup, range: starfieldIntensityRange, valueDisplay: starfieldIntensityValueDisplay } = createRangeSlider({\n        label: 'Starfield Glow',\n        min: 0,\n        max: 8,\n        step: 0.1,\n        value: emissiveStarfieldIntensity,\n        onChange: (val) => this._emitChange('emissiveStarfieldIntensity', val),\n      });\n      this._bindSettingRange('scene.renderer.emissive.starfieldIntensity', starfieldIntensityRange, 1, {\n        valueDisplay: starfieldIntensityValueDisplay\n      });\n      emissiveGroup.appendChild(starfieldIntensityGroup);\n\n      const { group: galaxyIntensityGroup, range: galaxyIntensityRange, valueDisplay: galaxyIntensityValueDisplay } = createRangeSlider({\n        label: 'Galaxy Glow',\n        min: 0,\n        max: 8,\n        step: 0.1,\n        value: emissiveGalaxyIntensity,\n        onChange: (val) => this._emitChange('emissiveGalaxyIntensity', val),\n      });\n      this._bindSettingRange('scene.renderer.emissive.galaxyIntensity', galaxyIntensityRange, 1, {\n        valueDisplay: galaxyIntensityValueDisplay\n      });\n      emissiveGroup.appendChild(galaxyIntensityGroup);\n\n      const { group: sunIntensityGroup, range: sunIntensityRange, valueDisplay: sunIntensityValueDisplay } = createRangeSlider({\n        label: 'Sun Glow',\n        min: 0,\n        max: 8,\n        step: 0.1,\n        value: emissiveSunIntensity,\n        onChange: (val) => this._emitChange('emissiveSunIntensity', val),\n      });\n      this._bindSettingRange('scene.renderer.emissive.sunIntensity', sunIntensityRange, 1, {\n        valueDisplay: sunIntensityValueDisplay\n      });\n      emissiveGroup.appendChild(sunIntensityGroup);\n\n      content.appendChild(emissiveGroup);\n\n      // Wireframe\n      const wireframeGroup = document.createElement('div');\n      wireframeGroup.className = 'config-group';\n      wireframeGroup.style.marginTop = '16px';\n\n      const { wrapper: wireframeToggle, input: wireframeInput } = createToggle('Wireframe Mode', wireframeEnabled, (checked) => {\n        this._emitChange('wireframe', checked);\n      });\n      this._bindSettingToggle('scene.debug.wireframe', wireframeInput, false);\n      wireframeGroup.appendChild(wireframeToggle);\n\n      content.appendChild(wireframeGroup);\n\n      const wireframeStyleGroup = document.createElement('div');\n      wireframeStyleGroup.className = 'config-group';\n      wireframeStyleGroup.style.marginTop = '16px';\n      wireframeStyleGroup.id = 'wireframe-style';\n\n      const wireframeStyleTitle = document.createElement('div');\n      wireframeStyleTitle.className = 'config-group-title';\n      wireframeStyleTitle.textContent = 'Wireframe Style';\n      wireframeStyleGroup.appendChild(wireframeStyleTitle);\n\n      const { group: surfaceColorGroup, input: surfaceColorInput } = createInput({\n        label: 'Flat Geometry',\n        type: 'color',\n        value: wireframeSurfaceColor,\n        onChange: (val) => this._emitChange('wireframeSurfaceColor', val)\n      });\n      surfaceColorInput.dataset.setting = 'wireframeSurfaceColor';\n      this._bindSettingInput(\n        'scene.debug.wireframeStyle.surfaceColor',\n        surfaceColorInput,\n        wireframeSurfaceColor\n      );\n      const wireframeColorRow = document.createElement('div');\n      wireframeColorRow.className = 'nc-form-row';\n      wireframeColorRow.appendChild(surfaceColorGroup);\n\n      const { group: lineColorGroup, input: lineColorInput } = createInput({\n        label: 'Geometry Outline',\n        type: 'color',\n        value: wireframeLineColor,\n        onChange: (val) => this._emitChange('wireframeLineColor', val)\n      });\n      lineColorInput.dataset.setting = 'wireframeLineColor';\n      this._bindSettingInput(\n        'scene.debug.wireframeStyle.lineColor',\n        lineColorInput,\n        wireframeLineColor\n      );\n      wireframeColorRow.appendChild(lineColorGroup);\n      wireframeStyleGroup.appendChild(wireframeColorRow);\n\n      const wireframeStyleNote = document.createElement('div');\n      wireframeStyleNote.style.cssText = 'font-size: 10px; color: rgba(255,255,255,0.5); margin-top: 6px;';\n      wireframeStyleNote.textContent = 'Flat geometry keeps one physically shaded albedo; the outline color follows crease-filtered walls, roofs, and protrusions while suppressing coplanar surface triangles.';\n      wireframeStyleGroup.appendChild(wireframeStyleNote);\n\n      content.appendChild(wireframeStyleGroup);\n\n      return content;\n    });\n\n    // Audio Section\n    this._addSection(container, 'audio', 'Audio', false, () => {\n      const content = document.createElement('div');\n      const audioEnabled = !!this._getSettingValue('scene.audio.enabled', true);\n\n      const audioGroup = document.createElement('div');\n      audioGroup.className = 'config-group';\n\n      const { wrapper: audioToggle, input: audioInput } = createToggle('Enable Scene Audio', audioEnabled, (checked) => {\n        this._emitChange('audioEnabled', checked);\n      });\n      this._bindSettingToggle('scene.audio.enabled', audioInput, true);\n      audioGroup.appendChild(audioToggle);\n\n      const { wrapper: overtoneToggle } = createToggle('Overtone Test', this._audioTestActive, (checked) => {\n        this._audioTestActive = checked;\n        this._emitChange('audioOvertoneTest', checked);\n      });\n      audioGroup.appendChild(overtoneToggle);\n\n      const actionsRow = document.createElement('div');\n      actionsRow.style.display = 'flex';\n      actionsRow.style.gap = '8px';\n      actionsRow.style.flexWrap = 'wrap';\n      actionsRow.style.marginTop = '8px';\n      actionsRow.appendChild(createButton('Spawn Test Ball', {\n        variant: 'secondary',\n        size: 'sm',\n        onClick: () => this._emitChange('audioSpawnTestBall', true)\n      }));\n      audioGroup.appendChild(actionsRow);\n\n      content.appendChild(audioGroup);\n\n      const speakConfig = this._getSettingValue('scene.audio.speak', {}) || {};\n      const speakEnabled = typeof speakConfig.enabled === 'boolean' ? speakConfig.enabled : false;\n      const speakMode = speakConfig.mode === 'always_on' ? 'always_on' : 'push_to_talk';\n      const speakRadiusM = this._resolveNumber(speakConfig.radiusM, 35, { min: 5, max: 250 });\n      const speakPttKey = typeof speakConfig.pushToTalkKey === 'string' && speakConfig.pushToTalkKey.trim()\n        ? speakConfig.pushToTalkKey.trim()\n        : DEFAULT_SPEAK_PTT_KEY;\n\n      const speakGroup = document.createElement('div');\n      speakGroup.className = 'config-group';\n      const sidebar = this;\n\n      const speakTitle = document.createElement('div');\n      speakTitle.className = 'config-group-title';\n      speakTitle.textContent = 'Speak';\n      speakGroup.appendChild(speakTitle);\n\n      const { wrapper: speakToggle, input: speakToggleInput } = createToggle('Enable Spatial Peer Voice', speakEnabled, (checked) => {\n        this._emitChange('audioSpeakEnabled', checked);\n      });\n      this._bindSettingToggle('scene.audio.speak.enabled', speakToggleInput, false);\n      speakGroup.appendChild(speakToggle);\n\n      const { group: speakModeGroup, select: speakModeSelect } = createSelect({\n        label: 'Transmit Mode',\n        value: speakMode,\n        options: [\n          { value: 'push_to_talk', label: 'Push To Talk' },\n          { value: 'always_on', label: 'Always On' },\n        ],\n        onChange: (val) => {\n          this._emitChange('audioSpeakMode', val);\n          syncSpeakUiState();\n        }\n      });\n      this._bindSettingSelect('scene.audio.speak.mode', speakModeSelect, speakMode, {\n        onSync: () => {\n          syncSpeakUiState();\n        }\n      });\n      speakGroup.appendChild(speakModeGroup);\n\n      const pttKeyGroup = document.createElement('div');\n      pttKeyGroup.className = 'nc-input-group';\n\n      const pttKeyLabel = document.createElement('label');\n      pttKeyLabel.className = 'nc-label';\n      pttKeyLabel.textContent = 'Push-To-Talk Key';\n      pttKeyGroup.appendChild(pttKeyLabel);\n\n      const pttKeyRow = document.createElement('div');\n      pttKeyRow.style.display = 'flex';\n      pttKeyRow.style.gap = '8px';\n      pttKeyRow.style.alignItems = 'center';\n\n      const pttKeyInput = document.createElement('input');\n      pttKeyInput.type = 'text';\n      pttKeyInput.className = 'nc-input';\n      pttKeyInput.readOnly = true;\n      pttKeyInput.value = formatKeyboardCode(speakPttKey);\n      pttKeyInput.style.flex = '1';\n      pttKeyInput.title = 'Click Record Key and press the key you want for push-to-talk.';\n\n      const pttRecordBtn = createButton('Record Key', {\n        variant: 'secondary',\n        size: 'sm',\n        onClick: () => {\n          const pttModeActive = speakToggleInput.checked && speakModeSelect.value === 'push_to_talk';\n          if (!pttModeActive) return;\n          if (this._speakPttCaptureListener) {\n            this._stopSpeakPttCapture();\n            return;\n          }\n          this._startSpeakPttCapture((capturedCode) => {\n            pttKeyInput.value = formatKeyboardCode(capturedCode);\n            this._emitChange('audioSpeakPushToTalkKey', capturedCode);\n          });\n        }\n      });\n      pttRecordBtn.style.flexShrink = '0';\n\n      pttKeyRow.appendChild(pttKeyInput);\n      pttKeyRow.appendChild(pttRecordBtn);\n      pttKeyGroup.appendChild(pttKeyRow);\n\n      const pttHint = document.createElement('div');\n      pttHint.style.fontSize = '10px';\n      pttHint.style.color = 'rgba(255, 255, 255, 0.55)';\n      pttHint.style.marginTop = '4px';\n      pttHint.textContent = 'Hold the key to transmit in push-to-talk mode.';\n      pttKeyGroup.appendChild(pttHint);\n\n      this._speakPttInput = pttKeyInput;\n      this._speakPttRecordBtn = pttRecordBtn;\n      this._bindSettingInput('scene.audio.speak.pushToTalkKey', pttKeyInput, speakPttKey, {\n        transform: (raw) => formatKeyboardCode(raw || DEFAULT_SPEAK_PTT_KEY)\n      });\n      speakGroup.appendChild(pttKeyGroup);\n\n      const speakRadiusGroup = createRangeSlider({\n        label: 'Proximity Radius (m)',\n        min: 5,\n        max: 250,\n        step: 1,\n        value: speakRadiusM,\n        onChange: (val) => this._emitChange('audioSpeakRadiusM', val)\n      });\n      speakRadiusGroup.valueDisplay.textContent = `${Math.round(speakRadiusM)}m`;\n      this._bindSettingRange('scene.audio.speak.radiusM', speakRadiusGroup.range, speakRadiusM, {\n        valueDisplay: speakRadiusGroup.valueDisplay,\n        onSync: (val) => {\n          speakRadiusGroup.valueDisplay.textContent = `${Math.round(val)}m`;\n        }\n      });\n      speakGroup.appendChild(speakRadiusGroup.group);\n\n      function syncSpeakUiState() {\n        const pttModeActive = speakToggleInput.checked && speakModeSelect.value === 'push_to_talk';\n        pttKeyInput.disabled = !pttModeActive;\n        pttRecordBtn.disabled = !pttModeActive;\n        pttHint.style.opacity = pttModeActive ? '1' : '0.65';\n        if (!pttModeActive) {\n          sidebar._stopSpeakPttCapture();\n        }\n      }\n\n      speakToggleInput.addEventListener('change', syncSpeakUiState);\n      syncSpeakUiState();\n      content.appendChild(speakGroup);\n\n      const windConfig = this._getSettingValue('scene.audio.wind', {}) || {};\n      const windEnabled = typeof windConfig.enabled === 'boolean' ? windConfig.enabled : true;\n      const windVolume = Number.isFinite(windConfig.volume) ? windConfig.volume : 0.2;\n      const windGust = Number.isFinite(windConfig.gustiness) ? windConfig.gustiness : 0.55;\n      const windSpeedScale = Number.isFinite(windConfig.speedScale) ? windConfig.speedScale : 1;\n      const windMaxSpeed = Number.isFinite(windConfig.maxSpeedMps) ? windConfig.maxSpeedMps : 70;\n      const windMinSpeed = Number.isFinite(windConfig.minSpeedMps) ? windConfig.minSpeedMps : 0;\n      const windVerticalScale = Number.isFinite(windConfig.verticalScale) ? windConfig.verticalScale : 1;\n      const windMass = Number.isFinite(windConfig.mass) ? windConfig.mass : 0.6;\n\n      const windGroup = document.createElement('div');\n      windGroup.className = 'config-group';\n\n      const windTitle = document.createElement('div');\n      windTitle.className = 'config-group-title';\n      windTitle.textContent = 'Surface Wind';\n      windGroup.appendChild(windTitle);\n\n      const { wrapper: windToggle, input: windToggleInput } = createToggle('Enable Wind', windEnabled, (checked) => {\n        this._emitChange('audioWindEnabled', checked);\n      });\n      this._bindSettingToggle('scene.audio.wind.enabled', windToggleInput, true);\n      windGroup.appendChild(windToggle);\n\n      const windVolumeGroup = createRangeSlider({\n        label: 'Wind Volume',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: windVolume,\n        onChange: (val) => this._emitChange('audioWindVolume', val)\n      });\n      windVolumeGroup.valueDisplay.textContent = `${Math.round(windVolume * 100)}%`;\n      this._bindSettingRange('scene.audio.wind.volume', windVolumeGroup.range, windVolume, {\n        valueDisplay: windVolumeGroup.valueDisplay,\n        onSync: (val) => {\n          windVolumeGroup.valueDisplay.textContent = `${Math.round(val * 100)}%`;\n        }\n      });\n      windGroup.appendChild(windVolumeGroup.group);\n\n      const windGustGroup = createRangeSlider({\n        label: 'Gustiness',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: windGust,\n        onChange: (val) => this._emitChange('audioWindGustiness', val)\n      });\n      windGustGroup.valueDisplay.textContent = `${Math.round(windGust * 100)}%`;\n      this._bindSettingRange('scene.audio.wind.gustiness', windGustGroup.range, windGust, {\n        valueDisplay: windGustGroup.valueDisplay,\n        onSync: (val) => {\n          windGustGroup.valueDisplay.textContent = `${Math.round(val * 100)}%`;\n        }\n      });\n      windGroup.appendChild(windGustGroup.group);\n\n      const windMassGroup = createRangeSlider({\n        label: 'Low Mass',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: windMass,\n        onChange: (val) => this._emitChange('audioWindMass', val)\n      });\n      windMassGroup.valueDisplay.textContent = `${Math.round(windMass * 100)}%`;\n      this._bindSettingRange('scene.audio.wind.mass', windMassGroup.range, windMass, {\n        valueDisplay: windMassGroup.valueDisplay,\n        onSync: (val) => {\n          windMassGroup.valueDisplay.textContent = `${Math.round(val * 100)}%`;\n        }\n      });\n      windGroup.appendChild(windMassGroup.group);\n\n      const windAdvancedContent = document.createElement('div');\n\n      const windSpeedScaleGroup = createRangeSlider({\n        label: 'Speed Scale',\n        min: 0.1,\n        max: 4,\n        step: 0.05,\n        value: windSpeedScale,\n        onChange: (val) => this._emitChange('audioWindSpeedScale', val)\n      });\n      windSpeedScaleGroup.valueDisplay.textContent = `${windSpeedScale.toFixed(2)}x`;\n      this._bindSettingRange('scene.audio.wind.speedScale', windSpeedScaleGroup.range, windSpeedScale, {\n        valueDisplay: windSpeedScaleGroup.valueDisplay,\n        onSync: (val) => {\n          windSpeedScaleGroup.valueDisplay.textContent = `${val.toFixed(2)}x`;\n        }\n      });\n      windAdvancedContent.appendChild(windSpeedScaleGroup.group);\n\n      const windMaxSpeedGroup = createRangeSlider({\n        label: 'Max Speed (m/s)',\n        min: 5,\n        max: 140,\n        step: 1,\n        value: windMaxSpeed,\n        onChange: (val) => this._emitChange('audioWindMaxSpeed', val)\n      });\n      windMaxSpeedGroup.valueDisplay.textContent = `${windMaxSpeed.toFixed(0)}`;\n      this._bindSettingRange('scene.audio.wind.maxSpeedMps', windMaxSpeedGroup.range, windMaxSpeed, {\n        valueDisplay: windMaxSpeedGroup.valueDisplay\n      });\n      windAdvancedContent.appendChild(windMaxSpeedGroup.group);\n\n      const windMinSpeedGroup = createRangeSlider({\n        label: 'Min Speed (m/s)',\n        min: 0,\n        max: 20,\n        step: 0.5,\n        value: windMinSpeed,\n        onChange: (val) => this._emitChange('audioWindMinSpeed', val)\n      });\n      windMinSpeedGroup.valueDisplay.textContent = `${windMinSpeed.toFixed(1)}`;\n      this._bindSettingRange('scene.audio.wind.minSpeedMps', windMinSpeedGroup.range, windMinSpeed, {\n        valueDisplay: windMinSpeedGroup.valueDisplay\n      });\n      windAdvancedContent.appendChild(windMinSpeedGroup.group);\n\n      const windVerticalGroup = createRangeSlider({\n        label: 'Vertical Scale',\n        min: 0,\n        max: 2,\n        step: 0.05,\n        value: windVerticalScale,\n        onChange: (val) => this._emitChange('audioWindVerticalScale', val)\n      });\n      windVerticalGroup.valueDisplay.textContent = `${windVerticalScale.toFixed(2)}x`;\n      this._bindSettingRange('scene.audio.wind.verticalScale', windVerticalGroup.range, windVerticalScale, {\n        valueDisplay: windVerticalGroup.valueDisplay,\n        onSync: (val) => {\n          windVerticalGroup.valueDisplay.textContent = `${val.toFixed(2)}x`;\n        }\n      });\n      windAdvancedContent.appendChild(windVerticalGroup.group);\n\n      const windAdvancedPanel = createCollapsible('Wind Advanced', windAdvancedContent, false);\n      windGroup.appendChild(windAdvancedPanel.section);\n\n      content.appendChild(windGroup);\n      return content;\n    }, {\n      getValue: () => !!this._getSettingValue('scene.audio.enabled', true),\n      setValue: (val) => this._applyScenePatch({ audio: { enabled: val } })\n    });\n\n    // Communication Section\n    this._addSection(container, 'communication', 'Communication', false, () => {\n      const content = document.createElement('div');\n      const commsGroup = document.createElement('div');\n      commsGroup.className = 'config-group';\n\n      const title = document.createElement('div');\n      title.className = 'config-group-title';\n      title.textContent = 'PCM Bitrate';\n      commsGroup.appendChild(title);\n\n      const metrics = document.createElement('div');\n      metrics.className = 'config-metrics';\n      metrics.id = 'comms-metrics';\n\n      [\n        { label: 'PCM Sent', value: '--' },\n        { label: 'PCM Received', value: '--' },\n      ].forEach(({ label, value }) => {\n        const metric = createMetric(label, value);\n        metric.dataset.metric = label;\n        metrics.appendChild(metric);\n      });\n\n      commsGroup.appendChild(metrics);\n      content.appendChild(commsGroup);\n      return content;\n    });\n\n    // Computation Section\n    this._addSection(container, 'computation', 'Computation', false, () => {\n      const content = document.createElement('div');\n\n      const summaryGroup = document.createElement('div');\n      summaryGroup.className = 'config-group';\n\n      const title = document.createElement('div');\n      title.className = 'config-group-title';\n      title.textContent = 'Inference Utilization';\n      summaryGroup.appendChild(title);\n\n      const metrics = document.createElement('div');\n      metrics.className = 'config-metrics';\n      metrics.id = 'computation-metrics';\n\n      [\n        { label: 'Tickets ASR', value: '--' },\n        { label: 'Tickets TTS', value: '--' },\n        { label: 'Active Jobs', value: '--' },\n        { label: 'Queued', value: '--' },\n        { label: 'Memory', value: '--' },\n        { label: 'Last Ticket', value: '--' },\n      ].forEach(({ label, value }) => {\n        const metric = createMetric(label, value);\n        metric.dataset.metric = label;\n        metrics.appendChild(metric);\n      });\n\n      summaryGroup.appendChild(metrics);\n      content.appendChild(summaryGroup);\n\n      const modelList = document.createElement('div');\n      modelList.className = 'computation-model-list';\n      const empty = document.createElement('div');\n      empty.className = 'computation-empty';\n      empty.textContent = 'No inference provider active.';\n      modelList.appendChild(empty);\n      this._computationModelList = modelList;\n      this._computationEmptyEl = empty;\n\n      content.appendChild(modelList);\n      return content;\n    });\n\n    // Lighting Section\n    this._addSection(container, 'lighting', 'Lighting & Time', false, () => {\n      const content = document.createElement('div');\n      const lightingDate = this._getLightingDate();\n      const dateValue = this._formatDateInput(lightingDate);\n      const timeValue = this._formatTimeInput(lightingDate);\n      const timeSpeedValue = this._resolveNumber(\n        this._getSettingValue('scene.lighting.timeSpeed', 1),\n        1,\n        { min: 0, max: 3600 }\n      );\n      const simplifiedEnabled = !!this._getSettingValue('scene.lighting.simplified', false);\n\n      // Date/Time\n      const timeGroup = document.createElement('div');\n      timeGroup.className = 'config-group';\n\n      const { group: dateInput, input: dateInputEl } = createInput({\n        label: 'Date',\n        type: 'date',\n        value: dateValue,\n        onChange: (val) => this._emitChange('date', val),\n      });\n      this._bindSettingInput('scene.lighting.date', dateInputEl, dateValue, {\n        transform: () => this._formatDateInput(this._getLightingDate())\n      });\n      timeGroup.appendChild(dateInput);\n      this._lightingDateInput = dateInputEl;\n\n      const { group: timeInput, input: timeInputEl } = createInput({\n        label: 'Time',\n        type: 'time',\n        value: timeValue,\n        onChange: (val) => this._emitChange('time', val),\n      });\n      this._bindSettingInput('scene.lighting.date', timeInputEl, timeValue, {\n        transform: () => this._formatTimeInput(this._getLightingDate())\n      });\n      timeGroup.appendChild(timeInput);\n      this._lightingTimeInput = timeInputEl;\n\n      const { group: speedSlider } = createRangeSlider({\n        label: 'Time Speed',\n        min: 0,\n        max: 3600,\n        step: 60,\n        value: timeSpeedValue,\n        onChange: (val) => this._emitChange('timeSpeed', val),\n      });\n      this._bindSettingRange('scene.lighting.timeSpeed', speedSlider.querySelector('input[type=\"range\"]'), 1, {\n        valueDisplay: speedSlider.querySelector('.nc-range-value')\n      });\n      timeGroup.appendChild(speedSlider);\n\n      // Quick time buttons\n      const timeButtons = document.createElement('div');\n      timeButtons.className = 'config-time-buttons';\n      ['Now', 'Sunrise', 'Noon', 'Sunset', 'Midnight'].forEach((label) => {\n        timeButtons.appendChild(createButton(label, {\n          variant: 'ghost',\n          size: 'sm',\n          onClick: () => this._emitChange('quickTime', label.toLowerCase()),\n        }));\n      });\n      timeGroup.appendChild(timeButtons);\n\n      content.appendChild(timeGroup);\n\n      // Simplified lighting toggle\n      const { wrapper: simplifiedToggle, input: simplifiedInput } = createToggle('Simplified Lighting', simplifiedEnabled, (checked) => {\n        this._emitChange('useSimplified', checked);\n      });\n      this._bindSettingToggle('scene.lighting.simplified', simplifiedInput, false);\n      content.appendChild(simplifiedToggle);\n\n      return content;\n    });\n\n    // Atmosphere Section (Debug)\n    this._addSection(container, 'atmosphere', 'Atmosphere', false, () => {\n      const content = document.createElement('div');\n      const atmosphereEnabled = !!this._getSettingValue('scene.atmosphere.enabled', true);\n      const baseOffsetValue = this._resolveNumber(\n        this._getSettingValue('scene.atmosphere.baseOffsetMeters', 0),\n        0,\n        { min: 0, max: 32000 }\n      );\n      const surfaceBaseOffsetValue = this._resolveNumber(\n        this._getSettingValue('scene.atmosphere.surfaceBaseOffsetMeters', 13000),\n        13000,\n        { min: 0, max: 32000 }\n      );\n      const adaptiveBaseOffset = this._getSettingValue('scene.atmosphere.adaptiveBaseOffset', {}) || {};\n      const adaptiveBaseOffsetEnabled = adaptiveBaseOffset.enabled !== false;\n      const adaptiveOrbitClearance = this._resolveNumber(\n        adaptiveBaseOffset.orbitClearanceMeters,\n        4000,\n        { min: 0, max: 12000 }\n      );\n      const adaptiveSurfaceClearance = this._resolveNumber(\n        adaptiveBaseOffset.surfaceClearanceMeters,\n        5000,\n        { min: 0, max: 12000 }\n      );\n      const irradianceValue = this._resolveNumber(\n        this._getSettingValue(\n          'scene.atmosphere.irradianceScale',\n          PHOTOREAL_ALBEDO_SCALE_DEFAULT\n        ),\n        PHOTOREAL_ALBEDO_SCALE_DEFAULT,\n        { min: 0.2, max: 3 }\n      );\n      const shadowRadiusValue = this._resolveNumber(\n        this._getSettingValue('scene.atmosphere.shadowRadius', 3),\n        3,\n        { min: 0, max: 10 }\n      );\n      const skyTuning = this._getSettingValue('scene.atmosphere.skyTuning', {}) || {};\n      const skyAlphaScaleValue = this._resolveNumber(skyTuning.alphaScale, 1, { min: 0, max: 1 });\n      const skyAlphaClampValue = this._resolveNumber(skyTuning.alphaClamp, 0.95, { min: 0, max: 1 });\n      const skyLimbBoostValue = this._resolveNumber(skyTuning.limbBoost, 2.5, { min: 0, max: 5 });\n      const skyPathShortValue = this._resolveNumber(skyTuning.pathShort, 0.25, { min: 0, max: 1 });\n      const skyLimbMaxValue = this._resolveNumber(skyTuning.limbMax, 6, { min: 0.5, max: 12 });\n      const skyDensityScaleValue = this._resolveNumber(skyTuning.densityScale, 2, { min: 0, max: 6 });\n      const skyScaleHeightValue = this._resolveNumber(skyTuning.scaleHeight, 0.08, { min: 0.02, max: 0.2 });\n      const skyVerticalFadeStartValue = this._resolveNumber(skyTuning.verticalFadeStart, 0.05, { min: 0, max: 1 });\n      const skyVerticalFadeEndValue = this._resolveNumber(skyTuning.verticalFadeEnd, 0.4, { min: 0, max: 1 });\n      const skyAltitudeFadeStartValue = this._resolveNumber(skyTuning.altitudeFadeStart, 0.5, { min: 0, max: 1 });\n      const skyAltitudeFadeEndValue = this._resolveNumber(skyTuning.altitudeFadeEnd, 1.0, { min: 0, max: 1 });\n      const skyOutsideFadeStartValue = this._resolveNumber(skyTuning.outsideFadeStart, 0.0, { min: 0, max: 1 });\n      const skyOutsideFadeEndValue = this._resolveNumber(skyTuning.outsideFadeEnd, 0.1, { min: 0, max: 1 });\n      const skyDepthThresholdValue = this._resolveNumber(\n        skyTuning.depthThreshold,\n        0.9999999,\n        { min: 0.95, max: 1 }\n      );\n\n      const photometricEnabled = !!this._getSettingValue('scene.atmosphere.photometric', true);\n      const sunIrradianceEnabled = !!this._getSettingValue('scene.atmosphere.sunIrradiance', true);\n      const skyIrradianceEnabled = !!this._getSettingValue('scene.atmosphere.skyIrradiance', true);\n      const transmittanceEnabled = !!this._getSettingValue('scene.atmosphere.transmittance', true);\n      const inscatterEnabled = !!this._getSettingValue('scene.atmosphere.inscatter', true);\n      const skyEnabled = !!this._getSettingValue('scene.atmosphere.sky', true);\n      const sunEnabled = !!this._getSettingValue('scene.atmosphere.sun', true);\n      const moonEnabled = !!this._getSettingValue('scene.atmosphere.moon', true);\n      const specularMap = this._getSettingValue('scene.atmosphere.specularMap', {}) || {};\n      const specularEnabled = !!(specularMap.enabled ?? true);\n      const specularStrengthValue = this._resolveNumber(specularMap.strength, 0.9, { min: 0, max: 2 });\n      const ocean = this._getSettingValue('scene.atmosphere.water', {}) || {};\n      const oceanEnabled = ocean.enabled !== false;\n      const oceanOpacity = this._resolveNumber(\n        ocean.opacity,\n        PHOTOREAL_OCEAN_DEFAULTS.opacity,\n        { min: 0, max: 1 }\n      );\n      const oceanNormalScale = this._resolveNumber(ocean.normalScale, 0.7, { min: 0, max: 4 });\n      const oceanDistortion = this._resolveNumber(ocean.distortion, 0.35, { min: 0, max: 4 });\n      const oceanSpecularStrength = this._resolveNumber(ocean.specularStrength, 1.1, { min: 0, max: 4 });\n      const oceanFresnelStrength = this._resolveNumber(ocean.fresnelStrength, 0.6, { min: 0, max: 4 });\n      const oceanSpeed = this._resolveNumber(ocean.speed, 0.25, { min: 0, max: 2 });\n      const simpleClouds = this._getSettingValue('scene.atmosphere.simpleClouds', {}) || {};\n      const simpleCloudsEnabled = !!(simpleClouds.enabled ?? true);\n      const simpleCloudsBlendMode = (() => {\n        const raw = String(simpleClouds.blendMode || 'overlay').toLowerCase();\n        return ['overlay', 'additive', 'screen', 'multiply'].includes(raw) ? raw : 'overlay';\n      })();\n      const simpleCloudsShadowHeight = this._resolveNumber(simpleClouds.shadowHeightMeters, 12000, { min: 0, max: 60000 });\n      const simpleCloudsOpacity = this._resolveNumber(simpleClouds.opacity, 0.6, { min: 0, max: 1 });\n      const simpleCloudsShadowStrength = this._resolveNumber(simpleClouds.shadowStrength, 0.25, { min: 0, max: 1 });\n      const simpleCloudsAlphaThreshold = this._resolveNumber(simpleClouds.alphaThreshold, 0, { min: 0, max: 1 });\n      const simpleCloudsAlphaSoftness = this._resolveNumber(simpleClouds.alphaSoftness, 0, { min: 0, max: 1 });\n      const lightPollution = this._getSettingValue('scene.atmosphere.lightPollution', {}) || {};\n      const lightPollutionEnabled = !!(lightPollution.enabled ?? false);\n      const lightPollutionIntensity = this._resolveNumber(\n        lightPollution.intensity,\n        NIGHT_LIGHTS_EMISSION_DEFAULTS.intensity,\n        { min: 0, max: 6 }\n      );\n      const lightPollutionMapGain = this._resolveNumber(\n        lightPollution.mapGain,\n        NIGHT_LIGHTS_EMISSION_DEFAULTS.mapGain,\n        { min: 0, max: 6 }\n      );\n      const lightPollutionEmissionThreshold = this._resolveNumber(\n        lightPollution.emissionThreshold,\n        NIGHT_LIGHTS_EMISSION_DEFAULTS.emissionThreshold,\n        { min: 0, max: 0.95 }\n      );\n      const lightPollutionEmissionSoftness = this._resolveNumber(\n        lightPollution.emissionSoftness,\n        NIGHT_LIGHTS_EMISSION_DEFAULTS.emissionSoftness,\n        { min: 0.001, max: 0.5 }\n      );\n      const lightPollutionEmissionPower = this._resolveNumber(\n        lightPollution.emissionPower,\n        NIGHT_LIGHTS_EMISSION_DEFAULTS.emissionPower,\n        { min: 0.1, max: 4 }\n      );\n      const lightPollutionEmissionBlueSuppression = this._resolveNumber(\n        lightPollution.emissionBlueSuppression,\n        NIGHT_LIGHTS_EMISSION_DEFAULTS.emissionBlueSuppression,\n        { min: 0, max: 1.5 }\n      );\n      const lightPollutionColor = lightPollution.color || '#ffb57a';\n      const lightPollutionMercator = !!(lightPollution.mercator ?? false);\n      const lightPollutionOffsetU = this._resolveNumber(lightPollution.offsetU, 0, { min: -0.5, max: 0.5 });\n      const lightPollutionOffsetV = this._resolveNumber(lightPollution.offsetV, 0, { min: -0.5, max: 0.5 });\n      const lightPollutionScaleU = this._resolveNumber(lightPollution.scaleU, 1, { min: 0.5, max: 2 });\n      const lightPollutionScaleV = this._resolveNumber(lightPollution.scaleV, 1, { min: 0.5, max: 2 });\n      const airglow = this._getSettingValue('scene.atmosphere.airglow', {}) || {};\n      const airglowEnabled = airglow.enabled !== false;\n      const airglowStrength = this._resolveNumber(airglow.strength, 0.13, { min: 0, max: 2 });\n      const airglowBaseAlt = this._resolveNumber(airglow.baseAltitudeMeters, 85000, { min: 30000, max: 180000 });\n      const airglowCoreAlt = this._resolveNumber(airglow.coreAltitudeMeters, 122000, { min: 60000, max: 260000 });\n      const airglowFringeAlt = this._resolveNumber(airglow.fringeAltitudeMeters, 255000, { min: 90000, max: 600000 });\n      const airglowRiseScale = this._resolveNumber(airglow.riseScaleMeters, 26000, { min: 1000, max: 150000 });\n      const airglowTailScale = this._resolveNumber(airglow.tailScaleMeters, 56000, { min: 1000, max: 250000 });\n      const airglowPathRef = this._resolveNumber(airglow.pathRefMeters, 900000, { min: 50000, max: 3000000 });\n      const airglowInsideMin = this._resolveNumber(airglow.insideMin, 0.05, { min: 0, max: 1 });\n      const airglowInsideMax = this._resolveNumber(airglow.insideMax, 0.48, { min: 0, max: 1 });\n      const airglowGrazingPower = this._resolveNumber(airglow.grazingPower, 1.7, { min: 0.2, max: 8 });\n      const aurora = this._getSettingValue('scene.atmosphere.aurora', {}) || {};\n      const auroraEnabled = aurora.enabled !== false;\n      const auroraStrength = this._resolveNumber(aurora.strength, 0.9, { min: 0, max: 3 });\n      const auroraTopAlt = this._resolveNumber(aurora.topAltitudeMeters, 400000, { min: 120000, max: 900000 });\n      const auroraPathRef = this._resolveNumber(aurora.pathRefMeters, 30000, { min: 5000, max: 1000000 });\n      const auroraDepthBias = this._resolveNumber(aurora.depthBiasMeters, 4, { min: 0, max: 200 });\n\n      const { wrapper: atmToggle, input: atmInput } = createToggle('Atmosphere Enabled', atmosphereEnabled, (checked) => {\n        this._emitChange('atmosphereEnabled', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.enabled', atmInput, true);\n      content.appendChild(atmToggle);\n\n      const { wrapper: adaptiveOffsetToggle, input: adaptiveOffsetInput } = createToggle(\n        'Regional Terrain Base Offset',\n        adaptiveBaseOffsetEnabled,\n        (checked) => this._updateSettingPath('scene.atmosphere.adaptiveBaseOffset.enabled', checked)\n      );\n      this._bindSettingToggle(\n        'scene.atmosphere.adaptiveBaseOffset.enabled',\n        adaptiveOffsetInput,\n        adaptiveBaseOffsetEnabled\n      );\n      content.appendChild(adaptiveOffsetToggle);\n\n      content.appendChild(createDivider());\n\n      const atmSettings = [\n        { key: 'atmBaseOffset', path: 'scene.atmosphere.baseOffsetMeters', label: 'Orbit Fallback Offset (m)', min: 0, max: 32000, step: 100, value: baseOffsetValue },\n        { key: 'atmSurfaceBaseOffset', path: 'scene.atmosphere.surfaceBaseOffsetMeters', label: 'Surface Fallback Offset (m)', min: 0, max: 32000, step: 100, value: surfaceBaseOffsetValue },\n        { key: 'atmIrradianceScale', path: 'scene.atmosphere.irradianceScale', label: 'Irradiance Scale', min: 0.2, max: 3, step: 0.05, value: irradianceValue },\n        { key: 'atmShadowRadius', path: 'scene.atmosphere.shadowRadius', label: 'Shadow Radius', min: 0, max: 10, step: 0.1, value: shadowRadiusValue },\n      ];\n\n      atmSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      [\n        {\n          path: 'scene.atmosphere.adaptiveBaseOffset.orbitClearanceMeters',\n          label: 'Orbit Terrain Clearance (m)',\n          min: 0,\n          max: 12000,\n          step: 100,\n          value: adaptiveOrbitClearance,\n        },\n        {\n          path: 'scene.atmosphere.adaptiveBaseOffset.surfaceClearanceMeters',\n          label: 'Surface Terrain Clearance (m)',\n          min: 0,\n          max: 12000,\n          step: 100,\n          value: adaptiveSurfaceClearance,\n        },\n      ].forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._updateSettingPath(setting.path, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      const groupLabelStyle = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n      const addAtmosphereRange = (setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._updateSettingPath(setting.path, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      };\n\n      const skyLabel = document.createElement('div');\n      skyLabel.style.cssText = groupLabelStyle;\n      skyLabel.textContent = 'Sky Tuning';\n      content.appendChild(skyLabel);\n\n      const skySettings = [\n        { key: 'atmSkyAlphaScale', path: 'scene.atmosphere.skyTuning.alphaScale', label: 'Alpha Scale', min: 0, max: 1, step: 0.01, value: skyAlphaScaleValue },\n        { key: 'atmSkyAlphaClamp', path: 'scene.atmosphere.skyTuning.alphaClamp', label: 'Alpha Clamp', min: 0, max: 1, step: 0.01, value: skyAlphaClampValue },\n        { key: 'atmSkyLimbBoost', path: 'scene.atmosphere.skyTuning.limbBoost', label: 'Limb Boost', min: 0, max: 5, step: 0.1, value: skyLimbBoostValue },\n        { key: 'atmSkyPathShort', path: 'scene.atmosphere.skyTuning.pathShort', label: 'Path Short', min: 0, max: 1, step: 0.01, value: skyPathShortValue },\n        { key: 'atmSkyLimbMax', path: 'scene.atmosphere.skyTuning.limbMax', label: 'Limb Max', min: 0.5, max: 12, step: 0.1, value: skyLimbMaxValue },\n        { key: 'atmSkyDensityScale', path: 'scene.atmosphere.skyTuning.densityScale', label: 'Density Scale', min: 0, max: 6, step: 0.1, value: skyDensityScaleValue },\n        { key: 'atmSkyScaleHeight', path: 'scene.atmosphere.skyTuning.scaleHeight', label: 'Scale Height', min: 0.02, max: 0.2, step: 0.005, value: skyScaleHeightValue },\n        { key: 'atmSkyVerticalFadeStart', path: 'scene.atmosphere.skyTuning.verticalFadeStart', label: 'Vertical Fade Start', min: 0, max: 1, step: 0.01, value: skyVerticalFadeStartValue },\n        { key: 'atmSkyVerticalFadeEnd', path: 'scene.atmosphere.skyTuning.verticalFadeEnd', label: 'Vertical Fade End', min: 0, max: 1, step: 0.01, value: skyVerticalFadeEndValue },\n        { key: 'atmSkyAltitudeFadeStart', path: 'scene.atmosphere.skyTuning.altitudeFadeStart', label: 'Altitude Fade Start', min: 0, max: 1, step: 0.01, value: skyAltitudeFadeStartValue },\n        { key: 'atmSkyAltitudeFadeEnd', path: 'scene.atmosphere.skyTuning.altitudeFadeEnd', label: 'Altitude Fade End', min: 0, max: 1, step: 0.01, value: skyAltitudeFadeEndValue },\n        { key: 'atmSkyOutsideFadeStart', path: 'scene.atmosphere.skyTuning.outsideFadeStart', label: 'Outside Fade Start', min: 0, max: 1, step: 0.01, value: skyOutsideFadeStartValue },\n        { key: 'atmSkyOutsideFadeEnd', path: 'scene.atmosphere.skyTuning.outsideFadeEnd', label: 'Outside Fade End', min: 0, max: 1, step: 0.01, value: skyOutsideFadeEndValue },\n        { key: 'atmSkyDepthThreshold', path: 'scene.atmosphere.skyTuning.depthThreshold', label: 'Depth Threshold', min: 0.95, max: 1, step: 0.000001, value: skyDepthThresholdValue },\n      ];\n\n      skySettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      const renderLabel = document.createElement('div');\n      renderLabel.style.cssText = groupLabelStyle;\n      renderLabel.textContent = 'Rendering';\n      content.appendChild(renderLabel);\n\n      const { wrapper: photometricToggle, input: photometricInput } = createToggle('Photometric Lighting', photometricEnabled, (checked) => {\n        this._emitChange('atmPhotometric', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.photometric', photometricInput, true);\n      content.appendChild(photometricToggle);\n\n      const { wrapper: transmittanceToggle, input: transmittanceInput } = createToggle('Transmittance', transmittanceEnabled, (checked) => {\n        this._emitChange('atmTransmittance', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.transmittance', transmittanceInput, true);\n      content.appendChild(transmittanceToggle);\n\n      const { wrapper: inscatterToggle, input: inscatterInput } = createToggle('Inscatter', inscatterEnabled, (checked) => {\n        this._emitChange('atmInscatter', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.inscatter', inscatterInput, true);\n      content.appendChild(inscatterToggle);\n\n      content.appendChild(createDivider());\n\n      const airglowLabel = document.createElement('div');\n      airglowLabel.style.cssText = groupLabelStyle;\n      airglowLabel.textContent = 'Airglow';\n      content.appendChild(airglowLabel);\n\n      const { wrapper: airglowToggle, input: airglowInput } = createToggle('Airglow Enabled', airglowEnabled, (checked) => {\n        this._updateSettingPath('scene.atmosphere.airglow.enabled', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.airglow.enabled', airglowInput, true);\n      content.appendChild(airglowToggle);\n\n      [\n        { path: 'scene.atmosphere.airglow.strength', label: 'Airglow Strength', min: 0, max: 2, step: 0.01, value: airglowStrength },\n        { path: 'scene.atmosphere.airglow.baseAltitudeMeters', label: 'Base Altitude (m)', min: 30000, max: 180000, step: 1000, value: airglowBaseAlt },\n        { path: 'scene.atmosphere.airglow.coreAltitudeMeters', label: 'Core Altitude (m)', min: 60000, max: 260000, step: 1000, value: airglowCoreAlt },\n        { path: 'scene.atmosphere.airglow.fringeAltitudeMeters', label: 'Fringe Altitude (m)', min: 90000, max: 600000, step: 5000, value: airglowFringeAlt },\n        { path: 'scene.atmosphere.airglow.riseScaleMeters', label: 'Rise Scale (m)', min: 1000, max: 150000, step: 1000, value: airglowRiseScale },\n        { path: 'scene.atmosphere.airglow.tailScaleMeters', label: 'Tail Scale (m)', min: 1000, max: 250000, step: 1000, value: airglowTailScale },\n        { path: 'scene.atmosphere.airglow.pathRefMeters', label: 'Path Reference (m)', min: 50000, max: 3000000, step: 50000, value: airglowPathRef },\n        { path: 'scene.atmosphere.airglow.insideMin', label: 'Inside Perpendicular', min: 0, max: 1, step: 0.01, value: airglowInsideMin },\n        { path: 'scene.atmosphere.airglow.insideMax', label: 'Inside Grazing', min: 0, max: 1, step: 0.01, value: airglowInsideMax },\n        { path: 'scene.atmosphere.airglow.grazingPower', label: 'Grazing Power', min: 0.2, max: 8, step: 0.1, value: airglowGrazingPower },\n      ].forEach(addAtmosphereRange);\n\n      content.appendChild(createDivider());\n\n      const auroraLabel = document.createElement('div');\n      auroraLabel.style.cssText = groupLabelStyle;\n      auroraLabel.textContent = 'Aurora';\n      content.appendChild(auroraLabel);\n\n      const { wrapper: auroraToggle, input: auroraInput } = createToggle('Aurora Enabled', auroraEnabled, (checked) => {\n        this._updateSettingPath('scene.atmosphere.aurora.enabled', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.aurora.enabled', auroraInput, true);\n      content.appendChild(auroraToggle);\n\n      [\n        { path: 'scene.atmosphere.aurora.strength', label: 'Aurora Strength', min: 0, max: 3, step: 0.01, value: auroraStrength },\n        { path: 'scene.atmosphere.aurora.topAltitudeMeters', label: 'Aurora Top Altitude (m)', min: 120000, max: 900000, step: 5000, value: auroraTopAlt },\n        { path: 'scene.atmosphere.aurora.pathRefMeters', label: 'Aurora Path Reference (m)', min: 5000, max: 1000000, step: 10000, value: auroraPathRef },\n        { path: 'scene.atmosphere.aurora.depthBiasMeters', label: 'Terrain Depth Bias (m)', min: 0, max: 200, step: 1, value: auroraDepthBias },\n      ].forEach(addAtmosphereRange);\n\n      content.appendChild(createDivider());\n\n      const orbitOverlayLabel = document.createElement('div');\n      orbitOverlayLabel.style.cssText = groupLabelStyle;\n      orbitOverlayLabel.textContent = 'Orbit Overlays';\n      content.appendChild(orbitOverlayLabel);\n\n      const { wrapper: specularToggle, input: specularInput } = createToggle('Specular Map (Ocean Shine)', specularEnabled, (checked) => {\n        this._emitChange('atmSpecularMap', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.specularMap.enabled', specularInput, true);\n      content.appendChild(specularToggle);\n\n      const { group: specularStrengthGroup, range: specularStrengthRange, valueDisplay: specularStrengthDisplay } = createRangeSlider({\n        label: 'Specular Strength',\n        min: 0,\n        max: 2,\n        step: 0.05,\n        value: specularStrengthValue,\n        onChange: (val) => this._emitChange('atmSpecularStrength', val),\n      });\n      this._bindSettingRange('scene.atmosphere.specularMap.strength', specularStrengthRange, specularStrengthValue, {\n        valueDisplay: specularStrengthDisplay,\n      });\n      content.appendChild(specularStrengthGroup);\n\n      const oceanLabel = document.createElement('div');\n      oceanLabel.style.cssText = groupLabelStyle;\n      oceanLabel.style.marginTop = '12px';\n      oceanLabel.textContent = 'Ocean Surface';\n      content.appendChild(oceanLabel);\n\n      const { wrapper: oceanToggle, input: oceanInput } = createToggle('Animated Ocean', oceanEnabled, (checked) => {\n        this._emitChange('oceanEnabled', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.water.enabled', oceanInput, true);\n      content.appendChild(oceanToggle);\n\n      [\n        { key: 'oceanOpacity', path: 'scene.atmosphere.water.opacity', label: 'Water Opacity', min: 0, max: 1, step: 0.01, value: oceanOpacity, fallback: PHOTOREAL_OCEAN_DEFAULTS.opacity },\n        { key: 'oceanNormalScale', path: 'scene.atmosphere.water.normalScale', label: 'Wave Normal Scale', min: 0, max: 4, step: 0.05, value: oceanNormalScale, fallback: 0.7 },\n        { key: 'oceanDistortion', path: 'scene.atmosphere.water.distortion', label: 'Wave Distortion', min: 0, max: 4, step: 0.05, value: oceanDistortion, fallback: 0.35 },\n        { key: 'oceanSpecularStrength', path: 'scene.atmosphere.water.specularStrength', label: 'Sun Glint', min: 0, max: 4, step: 0.05, value: oceanSpecularStrength, fallback: 1.1 },\n        { key: 'oceanFresnelStrength', path: 'scene.atmosphere.water.fresnelStrength', label: 'Horizon Fresnel', min: 0, max: 4, step: 0.05, value: oceanFresnelStrength, fallback: 0.6 },\n        { key: 'oceanSpeed', path: 'scene.atmosphere.water.speed', label: 'Wave Speed', min: 0, max: 2, step: 0.01, value: oceanSpeed, fallback: 0.25 },\n      ].forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.fallback, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      const { wrapper: simpleCloudsToggle, input: simpleCloudsInput } = createToggle('Simple Orbit Clouds', simpleCloudsEnabled, (checked) => {\n        this._emitChange('atmSimpleClouds', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.simpleClouds.enabled', simpleCloudsInput, true);\n      content.appendChild(simpleCloudsToggle);\n\n      const simpleCloudsSourceNote = document.createElement('div');\n      simpleCloudsSourceNote.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin: -4px 0 10px; line-height: 1.4;';\n      simpleCloudsSourceNote.textContent = 'Source: Matteason live-cloud-maps / clouds-alpha.png.';\n      content.appendChild(simpleCloudsSourceNote);\n\n      const { group: simpleCloudsOpacityGroup, range: simpleCloudsOpacityRange, valueDisplay: simpleCloudsOpacityDisplay } = createRangeSlider({\n        label: 'Simple Clouds Opacity',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: simpleCloudsOpacity,\n        onChange: (val) => this._emitChange('atmSimpleCloudsOpacity', val),\n      });\n      this._bindSettingRange('scene.atmosphere.simpleClouds.opacity', simpleCloudsOpacityRange, simpleCloudsOpacity, {\n        valueDisplay: simpleCloudsOpacityDisplay,\n      });\n      content.appendChild(simpleCloudsOpacityGroup);\n\n      const { group: simpleCloudsShadowStrengthGroup, range: simpleCloudsShadowStrengthRange, valueDisplay: simpleCloudsShadowStrengthDisplay } = createRangeSlider({\n        label: 'Simple Clouds Shadow Strength',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: simpleCloudsShadowStrength,\n        onChange: (val) => this._emitChange('atmSimpleCloudsShadowStrength', val),\n      });\n      this._bindSettingRange('scene.atmosphere.simpleClouds.shadowStrength', simpleCloudsShadowStrengthRange, simpleCloudsShadowStrength, {\n        valueDisplay: simpleCloudsShadowStrengthDisplay,\n      });\n      content.appendChild(simpleCloudsShadowStrengthGroup);\n\n      const { group: simpleCloudBlendGroup, select: simpleCloudBlendSelect } = createSelect({\n        label: 'Simple Clouds Blend',\n        options: [\n          { label: 'Overlay', value: 'overlay' },\n          { label: 'Additive', value: 'additive' },\n          { label: 'Screen', value: 'screen' },\n          { label: 'Multiply', value: 'multiply' },\n        ],\n        value: simpleCloudsBlendMode,\n        onChange: (val) => this._emitChange('atmSimpleCloudsBlendMode', val),\n      });\n      this._bindSettingSelect('scene.atmosphere.simpleClouds.blendMode', simpleCloudBlendSelect, 'overlay');\n      content.appendChild(simpleCloudBlendGroup);\n\n      const { group: simpleCloudShadowHeightGroup, range: simpleCloudShadowHeightRange, valueDisplay: simpleCloudShadowHeightValue } = createRangeSlider({\n        label: 'Simple Clouds Shadow Height (m)',\n        min: 0,\n        max: 60000,\n        step: 100,\n        value: simpleCloudsShadowHeight,\n        onChange: (val) => this._emitChange('atmSimpleCloudsShadowHeight', val),\n      });\n      this._bindSettingRange('scene.atmosphere.simpleClouds.shadowHeightMeters', simpleCloudShadowHeightRange, simpleCloudsShadowHeight, {\n        valueDisplay: simpleCloudShadowHeightValue,\n      });\n      content.appendChild(simpleCloudShadowHeightGroup);\n\n      const { group: simpleCloudThresholdGroup, range: simpleCloudThresholdRange, valueDisplay: simpleCloudThresholdValue } = createRangeSlider({\n        label: 'Simple Clouds Background Cutoff',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: simpleCloudsAlphaThreshold,\n        onChange: (val) => this._emitChange('atmSimpleCloudsAlphaThreshold', val),\n      });\n      this._bindSettingRange('scene.atmosphere.simpleClouds.alphaThreshold', simpleCloudThresholdRange, simpleCloudsAlphaThreshold, {\n        valueDisplay: simpleCloudThresholdValue,\n      });\n      content.appendChild(simpleCloudThresholdGroup);\n\n      const { group: simpleCloudSoftnessGroup, range: simpleCloudSoftnessRange, valueDisplay: simpleCloudSoftnessValue } = createRangeSlider({\n        label: 'Simple Clouds Detail Contrast',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: simpleCloudsAlphaSoftness,\n        onChange: (val) => this._emitChange('atmSimpleCloudsAlphaSoftness', val),\n      });\n      this._bindSettingRange('scene.atmosphere.simpleClouds.alphaSoftness', simpleCloudSoftnessRange, simpleCloudsAlphaSoftness, {\n        valueDisplay: simpleCloudSoftnessValue,\n      });\n      content.appendChild(simpleCloudSoftnessGroup);\n\n      const { wrapper: lightPollutionToggle, input: lightPollutionInput } = createToggle('Light Pollution (City Lights)', lightPollutionEnabled, (checked) => {\n        this._emitChange('lightPollutionEnabled', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.lightPollution.enabled', lightPollutionInput, false);\n      content.appendChild(lightPollutionToggle);\n\n      const { group: lightIntensityGroup, range: lightIntensityRange, valueDisplay: lightIntensityValue } = createRangeSlider({\n        label: 'Light Intensity',\n        min: 0,\n        max: 6,\n        step: 0.05,\n        value: lightPollutionIntensity,\n        onChange: (val) => this._emitChange('lightPollutionIntensity', val),\n      });\n      this._bindSettingRange('scene.atmosphere.lightPollution.intensity', lightIntensityRange, lightPollutionIntensity, {\n        valueDisplay: lightIntensityValue,\n      });\n      content.appendChild(lightIntensityGroup);\n\n      const { group: lightGainGroup, range: lightGainRange, valueDisplay: lightGainValue } = createRangeSlider({\n        label: 'Light Map Gain',\n        min: 0,\n        max: 6,\n        step: 0.05,\n        value: lightPollutionMapGain,\n        onChange: (val) => this._emitChange('lightPollutionMapGain', val),\n      });\n      this._bindSettingRange('scene.atmosphere.lightPollution.mapGain', lightGainRange, lightPollutionMapGain, {\n        valueDisplay: lightGainValue,\n      });\n      content.appendChild(lightGainGroup);\n\n      const lightSignalControls = [\n        {\n          label: 'Light Source Threshold',\n          min: 0,\n          max: 0.5,\n          step: 0.005,\n          value: lightPollutionEmissionThreshold,\n          key: 'emissionThreshold',\n          emit: 'lightPollutionEmissionThreshold',\n        },\n        {\n          label: 'Light Threshold Softness',\n          min: 0.001,\n          max: 0.3,\n          step: 0.005,\n          value: lightPollutionEmissionSoftness,\n          key: 'emissionSoftness',\n          emit: 'lightPollutionEmissionSoftness',\n        },\n        {\n          label: 'Light Source Bias',\n          min: 0.25,\n          max: 2,\n          step: 0.05,\n          value: lightPollutionEmissionPower,\n          key: 'emissionPower',\n          emit: 'lightPollutionEmissionPower',\n        },\n        {\n          label: 'Blue Terrain Rejection',\n          min: 0,\n          max: 1.5,\n          step: 0.05,\n          value: lightPollutionEmissionBlueSuppression,\n          key: 'emissionBlueSuppression',\n          emit: 'lightPollutionEmissionBlueSuppression',\n        },\n      ];\n      lightSignalControls.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.emit, val),\n        });\n        this._bindSettingRange(\n          `scene.atmosphere.lightPollution.${setting.key}`,\n          range,\n          setting.value,\n          { valueDisplay }\n        );\n        content.appendChild(group);\n      });\n\n      const { group: lightColorGroup, input: lightColorInput } = createInput({\n        label: 'Light Color',\n        type: 'color',\n        value: lightPollutionColor,\n        onChange: (val) => this._emitChange('lightPollutionColor', val),\n      });\n      this._bindSettingInput('scene.atmosphere.lightPollution.color', lightColorInput, lightPollutionColor);\n      content.appendChild(lightColorGroup);\n\n      // ── Alignment: the City-Lights texture is EPSG:4326 equirectangular.\n      // Default sampling is equirect; toggle Mercator if a Web-Mercator source\n      // is swapped in. Offset/scale nudge + size the overlay onto its true\n      // surface position (fixes the pole-to-pole stretch). ──\n      const { wrapper: lpMercatorToggle, input: lpMercatorInput } = createToggle('Light Mercator Projection', lightPollutionMercator, (checked) => {\n        this._emitChange('lightPollutionMercator', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.lightPollution.mercator', lpMercatorInput, false);\n      content.appendChild(lpMercatorToggle);\n\n      const lpAlign = [\n        { key: 'offsetU', label: 'Light Offset X (lon)', val: lightPollutionOffsetU, min: -0.5, max: 0.5, step: 0.001, emit: 'lightPollutionOffsetU' },\n        { key: 'offsetV', label: 'Light Offset Y (lat)', val: lightPollutionOffsetV, min: -0.5, max: 0.5, step: 0.001, emit: 'lightPollutionOffsetV' },\n        { key: 'scaleU', label: 'Light Scale X (lon)', val: lightPollutionScaleU, min: 0.5, max: 2, step: 0.005, emit: 'lightPollutionScaleU' },\n        { key: 'scaleV', label: 'Light Scale Y (lat)', val: lightPollutionScaleV, min: 0.5, max: 2, step: 0.005, emit: 'lightPollutionScaleV' },\n      ];\n      for (const a of lpAlign) {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: a.label, min: a.min, max: a.max, step: a.step, value: a.val,\n          onChange: (val) => this._emitChange(a.emit, val),\n        });\n        this._bindSettingRange(`scene.atmosphere.lightPollution.${a.key}`, range, a.val, { valueDisplay });\n        content.appendChild(group);\n      }\n\n      content.appendChild(createDivider());\n\n      const lightingLabel = document.createElement('div');\n      lightingLabel.style.cssText = groupLabelStyle;\n      lightingLabel.textContent = 'Lighting Contribution';\n      content.appendChild(lightingLabel);\n\n      const { wrapper: sunIrradianceToggle, input: sunIrradianceInput } = createToggle('Sun Irradiance', sunIrradianceEnabled, (checked) => {\n        this._emitChange('atmSunIrradiance', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.sunIrradiance', sunIrradianceInput, true);\n      content.appendChild(sunIrradianceToggle);\n\n      const { wrapper: skyIrradianceToggle, input: skyIrradianceInput } = createToggle('Sky Irradiance', skyIrradianceEnabled, (checked) => {\n        this._emitChange('atmSkyIrradiance', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.skyIrradiance', skyIrradianceInput, true);\n      content.appendChild(skyIrradianceToggle);\n\n      content.appendChild(createDivider());\n\n      const skyBodyLabel = document.createElement('div');\n      skyBodyLabel.style.cssText = groupLabelStyle;\n      skyBodyLabel.textContent = 'Sky / Sun / Moon';\n      content.appendChild(skyBodyLabel);\n\n      const { wrapper: skyToggle, input: skyInput } = createToggle('Sky Background', skyEnabled, (checked) => {\n        this._emitChange('atmSky', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.sky', skyInput, true);\n      content.appendChild(skyToggle);\n\n      const { wrapper: sunToggle, input: sunInput } = createToggle('Sun Disk', sunEnabled, (checked) => {\n        this._emitChange('atmSun', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.sun', sunInput, true);\n      content.appendChild(sunToggle);\n\n      const { wrapper: moonToggle, input: moonInput } = createToggle('Moon Disk', moonEnabled, (checked) => {\n        this._emitChange('atmMoon', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.moon', moonInput, true);\n      content.appendChild(moonToggle);\n\n      content.appendChild(createDivider());\n\n      // Night-side visibility settings\n      const nightLabel = document.createElement('div');\n      nightLabel.style.cssText = groupLabelStyle;\n      nightLabel.textContent = 'Night-Side Visibility';\n      content.appendChild(nightLabel);\n\n      const nightSettings = this._getSettingValue('scene.atmosphere.nightSettings', {}) || {};\n      const nightMinBrightnessValue = this._resolveNumber(nightSettings.nightMinBrightness, 0.002, { min: 0, max: 1 });\n      const nightAmbientStrengthValue = this._resolveNumber(nightSettings.nightAmbientStrength, 0.2, { min: 0, max: 1 });\n      const nightTransitionStartValue = this._resolveNumber(nightSettings.nightTransitionStart, 0, { min: -1, max: 1 });\n      const nightTransitionEndValue = this._resolveNumber(nightSettings.nightTransitionEnd, 0.5, { min: -1, max: 1 });\n      const nightPowerValue = this._resolveNumber(nightSettings.nightPower, 1.6, { min: 0.1, max: 5 });\n      const nightAmbientColorValue = nightSettings.nightAmbientColor || '#000000';\n      const nightMinIrradianceValue = this._resolveNumber(\n        this._getSettingValue('scene.atmosphere.nightMinIrradiance', 0),\n        0,\n        { min: 0, max: 1 }\n      );\n\n      const nightSettingsSliders = [\n        { key: 'atmNightMinBrightness', path: 'scene.atmosphere.nightSettings.nightMinBrightness', label: 'Min Brightness', min: 0, max: 1, step: 0.01, value: nightMinBrightnessValue },\n        { key: 'atmNightAmbientStrength', path: 'scene.atmosphere.nightSettings.nightAmbientStrength', label: 'Ambient Strength', min: 0, max: 1, step: 0.01, value: nightAmbientStrengthValue },\n        { key: 'atmNightTransitionStart', path: 'scene.atmosphere.nightSettings.nightTransitionStart', label: 'Transition Start', min: -1, max: 1, step: 0.01, value: nightTransitionStartValue },\n        { key: 'atmNightTransitionEnd', path: 'scene.atmosphere.nightSettings.nightTransitionEnd', label: 'Transition End', min: -1, max: 1, step: 0.01, value: nightTransitionEndValue },\n        { key: 'atmNightPower', path: 'scene.atmosphere.nightSettings.nightPower', label: 'Falloff Power', min: 0.1, max: 5, step: 0.1, value: nightPowerValue },\n        { key: 'atmNightMinIrradiance', path: 'scene.atmosphere.nightMinIrradiance', label: 'Min Irradiance', min: 0, max: 1, step: 0.01, value: nightMinIrradianceValue },\n      ];\n\n      nightSettingsSliders.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      const { group: nightAmbientColorGroup, input: nightAmbientColorInput } = createInput({\n        label: 'Ambient Color',\n        type: 'color',\n        value: nightAmbientColorValue,\n        onChange: (val) => this._emitChange('atmNightAmbientColor', val),\n      });\n      this._bindSettingInput('scene.atmosphere.nightSettings.nightAmbientColor', nightAmbientColorInput, nightAmbientColorValue);\n      content.appendChild(nightAmbientColorGroup);\n\n      return content;\n    }, {\n      getValue: () => !!this._getSettingValue('scene.atmosphere.enabled', true),\n      setValue: (val) => this._applyScenePatch({ atmosphere: { enabled: val } })\n    });\n\n    // Clouds Section (Debug)\n    this._addSection(container, 'clouds', 'Clouds', false, () => {\n      const content = document.createElement('div');\n      const cloudsEnabled = this._getSettingValue('scene.atmosphere.clouds.enabled', true);\n      const cloudCoverageValue = this._resolveNumber(\n        this._getSettingValue('scene.atmosphere.clouds.coverage', 0.3),\n        0.5,\n        { min: 0, max: 1 }\n      );\n      const cloudScatteringValue = this._resolveNumber(\n        this._getSettingValue('scene.atmosphere.clouds.scatteringCoefficient', 1),\n        1,\n        { min: 0, max: 3 }\n      );\n      const cloudAbsorptionValue = this._resolveNumber(\n        this._getSettingValue('scene.atmosphere.clouds.absorptionCoefficient', 0),\n        0,\n        { min: 0, max: 1 }\n      );\n      const cloudTurbulenceDispValue = this._resolveNumber(\n        this._getSettingValue('scene.atmosphere.clouds.turbulenceDisplacement', 350),\n        350,\n        { min: 0, max: 1000 }\n      );\n      const cloudQualityPreset = String(\n        this._getSettingValue('scene.atmosphere.clouds.qualityPreset', 'ultra')\n      ).toLowerCase();\n      const cloudShadow = this._getSettingValue('scene.atmosphere.clouds.shadow', {}) || {};\n      const shadowCascadeValue = this._resolveNumber(cloudShadow.cascadeCount, 1, { min: 1, max: 4 });\n      const shadowMapSizeValue = this._resolveNumber(cloudShadow.mapSize, 512, { min: 128, max: 2048 });\n      const shadowMaxFarValue = this._resolveNumber(cloudShadow.maxFar, 100000, { min: 10000, max: 300000 });\n      const shadowFarScaleValue = this._resolveNumber(cloudShadow.farScale, 0.25, { min: 0.05, max: 1 });\n      const shadowSplitLambdaValue = this._resolveNumber(cloudShadow.splitLambda, 0.71, { min: 0, max: 1 });\n      const shadowSplitModeValue = typeof cloudShadow.splitMode === 'string'\n        ? cloudShadow.splitMode\n        : 'practical';\n      const orbitClouds = this._getSettingValue('scene.atmosphere.orbitClouds', {}) || {};\n      const orbitCloudsEnabled = !!(orbitClouds.enabled ?? true);\n      const orbitCloudsRawOverlay = !!orbitClouds.rawOverlay;\n      const orbitCloudsDebugOverlay = !!orbitClouds.debugOverlay;\n      const orbitCloudsOpacity = this._resolveNumber(orbitClouds.opacity, 0.6, { min: 0, max: 1 });\n      const orbitCloudsRefresh = this._resolveNumber(orbitClouds.refreshMinutes, 30, { min: 5, max: 180 });\n      const orbitCloudsTimeStep = this._resolveNumber(orbitClouds.timeStepMinutes, 1440, { min: 15, max: 1440 });\n      const orbitCloudsLayer = typeof orbitClouds.layer === 'string'\n        ? orbitClouds.layer\n        : 'MODIS_Terra_CorrectedReflectance_TrueColor';\n\n      // Expensive cloud features (GPU performance impact)\n      const lightShaftsEnabled = !!this._getSettingValue('scene.atmosphere.clouds.lightShafts', true);\n      const shapeDetailEnabled = !!this._getSettingValue('scene.atmosphere.clouds.shapeDetail', true);\n      const turbulenceEnabled = !!this._getSettingValue('scene.atmosphere.clouds.turbulence', true);\n      const hazeEnabled = !!this._getSettingValue('scene.atmosphere.clouds.haze', true);\n\n      const { wrapper: cloudsToggle, input: cloudsInput } = createToggle('Clouds Enabled', !!cloudsEnabled, (checked) => {\n        this._emitChange('cloudsEnabled', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.clouds.enabled', cloudsInput, true);\n      content.appendChild(cloudsToggle);\n\n      content.appendChild(createDivider());\n\n      const cloudSettings = [\n        { key: 'cloudCoverage', path: 'scene.atmosphere.clouds.coverage', label: 'Coverage', min: 0, max: 1, step: 0.01, value: cloudCoverageValue },\n        { key: 'cloudScattering', path: 'scene.atmosphere.clouds.scatteringCoefficient', label: 'Scattering', min: 0, max: 3, step: 0.05, value: cloudScatteringValue },\n        { key: 'cloudAbsorption', path: 'scene.atmosphere.clouds.absorptionCoefficient', label: 'Absorption', min: 0, max: 1, step: 0.01, value: cloudAbsorptionValue },\n        { key: 'cloudTurbulenceDisp', path: 'scene.atmosphere.clouds.turbulenceDisplacement', label: 'Turbulence Disp (m)', min: 0, max: 1000, step: 10, value: cloudTurbulenceDispValue },\n      ];\n\n      cloudSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      // GPU-heavy quality toggles\n      content.appendChild(createDivider());\n\n      const qualityLabel = document.createElement('div');\n      qualityLabel.style.cssText = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n      qualityLabel.textContent = 'Quality (GPU intensive)';\n      content.appendChild(qualityLabel);\n\n      const { wrapper: lightShaftsToggle, input: lightShaftsInput } = createToggle('Light Shafts', lightShaftsEnabled, (checked) => {\n        this._emitChange('cloudLightShafts', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.clouds.lightShafts', lightShaftsInput, true);\n      content.appendChild(lightShaftsToggle);\n\n      const { wrapper: shapeDetailToggle, input: shapeDetailInput } = createToggle('Shape Detail', shapeDetailEnabled, (checked) => {\n        this._emitChange('cloudShapeDetail', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.clouds.shapeDetail', shapeDetailInput, true);\n      content.appendChild(shapeDetailToggle);\n\n      const { wrapper: turbulenceToggle, input: turbulenceInput } = createToggle('Turbulence', turbulenceEnabled, (checked) => {\n        this._emitChange('cloudTurbulence', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.clouds.turbulence', turbulenceInput, true);\n      content.appendChild(turbulenceToggle);\n\n      const { wrapper: hazeToggle, input: hazeInput } = createToggle('Haze', hazeEnabled, (checked) => {\n        this._emitChange('cloudHaze', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.clouds.haze', hazeInput, true);\n      content.appendChild(hazeToggle);\n\n      content.appendChild(createDivider());\n\n      const presetLabel = document.createElement('div');\n      presetLabel.style.cssText = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n      presetLabel.textContent = 'Quality Preset';\n      content.appendChild(presetLabel);\n\n      const { group: presetSelect, select: presetSelectEl } = createSelect({\n        label: 'Preset',\n        value: cloudQualityPreset,\n        options: [\n          { label: 'Low (Fastest)', value: 'low' },\n          { label: 'Medium', value: 'medium' },\n          { label: 'High', value: 'high' },\n          { label: 'Ultra', value: 'ultra' },\n        ],\n        onChange: (val) => this._emitChange('cloudQualityPreset', val),\n      });\n      this._bindSettingSelect('scene.atmosphere.clouds.qualityPreset', presetSelectEl, 'ultra');\n      content.appendChild(presetSelect);\n\n      content.appendChild(createDivider());\n\n      const shadowLabel = document.createElement('div');\n      shadowLabel.style.cssText = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n      shadowLabel.textContent = 'Cloud Shadows';\n      content.appendChild(shadowLabel);\n\n      const { group: shadowCascadeGroup, range: shadowCascadeRange, valueDisplay: shadowCascadeValueDisplay } = createRangeSlider({\n        label: 'Cascade Count',\n        min: 1,\n        max: 4,\n        step: 1,\n        value: shadowCascadeValue,\n        onChange: (val) => this._emitChange('cloudShadowCascadeCount', val),\n      });\n      this._bindSettingRange('scene.atmosphere.clouds.shadow.cascadeCount', shadowCascadeRange, shadowCascadeValue, {\n        valueDisplay: shadowCascadeValueDisplay\n      });\n      content.appendChild(shadowCascadeGroup);\n\n      const { group: shadowMapSizeGroup, select: shadowMapSizeSelect } = createSelect({\n        label: 'Map Size',\n        value: String(shadowMapSizeValue),\n        options: [\n          { label: '256', value: '256' },\n          { label: '512', value: '512' },\n          { label: '1024', value: '1024' },\n        ],\n        onChange: (val) => this._emitChange('cloudShadowMapSize', Number.parseInt(val, 10)),\n      });\n      this._bindSettingSelect('scene.atmosphere.clouds.shadow.mapSize', shadowMapSizeSelect, shadowMapSizeValue, {\n        transform: (val) => String(val)\n      });\n      content.appendChild(shadowMapSizeGroup);\n\n      const { group: shadowMaxFarGroup, range: shadowMaxFarRange, valueDisplay: shadowMaxFarDisplay } = createRangeSlider({\n        label: 'Max Distance (m)',\n        min: 10000,\n        max: 300000,\n        step: 5000,\n        value: shadowMaxFarValue,\n        onChange: (val) => this._emitChange('cloudShadowMaxFar', val),\n      });\n      this._bindSettingRange('scene.atmosphere.clouds.shadow.maxFar', shadowMaxFarRange, shadowMaxFarValue, {\n        valueDisplay: shadowMaxFarDisplay\n      });\n      content.appendChild(shadowMaxFarGroup);\n\n      const { group: shadowFarScaleGroup, range: shadowFarScaleRange, valueDisplay: shadowFarScaleDisplay } = createRangeSlider({\n        label: 'Far Scale',\n        min: 0.05,\n        max: 1,\n        step: 0.05,\n        value: shadowFarScaleValue,\n        onChange: (val) => this._emitChange('cloudShadowFarScale', val),\n      });\n      this._bindSettingRange('scene.atmosphere.clouds.shadow.farScale', shadowFarScaleRange, shadowFarScaleValue, {\n        valueDisplay: shadowFarScaleDisplay\n      });\n      content.appendChild(shadowFarScaleGroup);\n\n      const { group: shadowSplitModeGroup, select: shadowSplitModeSelect } = createSelect({\n        label: 'Split Mode',\n        value: shadowSplitModeValue,\n        options: [\n          { label: 'Practical', value: 'practical' },\n          { label: 'Uniform', value: 'uniform' },\n          { label: 'Logarithmic', value: 'logarithmic' },\n        ],\n        onChange: (val) => this._emitChange('cloudShadowSplitMode', val),\n      });\n      this._bindSettingSelect('scene.atmosphere.clouds.shadow.splitMode', shadowSplitModeSelect, shadowSplitModeValue);\n      content.appendChild(shadowSplitModeGroup);\n\n      const { group: shadowSplitLambdaGroup, range: shadowSplitLambdaRange, valueDisplay: shadowSplitLambdaDisplay } = createRangeSlider({\n        label: 'Split Lambda',\n        min: 0,\n        max: 1,\n        step: 0.05,\n        value: shadowSplitLambdaValue,\n        onChange: (val) => this._emitChange('cloudShadowSplitLambda', val),\n      });\n      this._bindSettingRange('scene.atmosphere.clouds.shadow.splitLambda', shadowSplitLambdaRange, shadowSplitLambdaValue, {\n        valueDisplay: shadowSplitLambdaDisplay\n      });\n      content.appendChild(shadowSplitLambdaGroup);\n\n      content.appendChild(createDivider());\n\n      const orbitLabel = document.createElement('div');\n      orbitLabel.style.cssText = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n      orbitLabel.textContent = 'Orbit Clouds (NASA GIBS)';\n      content.appendChild(orbitLabel);\n\n      const orbitNote = document.createElement('div');\n      orbitNote.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin-bottom: 10px; line-height: 1.4;';\n      orbitNote.innerHTML = [\n        'Source: NASA GIBS WMS (no API key).',\n        'Coverage: MODIS_Terra_Cloud_Fraction_Day/Night, MODIS_Aqua_Cloud_Fraction_Day/Night.',\n        'Mask-ish: MODIS_Terra_Cloud_Multi_Layer_Flag, MODIS_Aqua_Cloud_Multi_Layer_Flag.'\n      ].join('<br>');\n      content.appendChild(orbitNote);\n\n      const { wrapper: orbitToggle, input: orbitCloudsInput } = createToggle('Orbit Clouds Enabled', orbitCloudsEnabled, (checked) => {\n        this._emitChange('orbitCloudsEnabled', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.orbitClouds.enabled', orbitCloudsInput, true);\n      content.appendChild(orbitToggle);\n\n      const { wrapper: orbitRawToggle, input: orbitRawInput } = createToggle('Orbit Clouds Raw Overlay', orbitCloudsRawOverlay, (checked) => {\n        this._emitChange('orbitCloudsRawOverlay', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.orbitClouds.rawOverlay', orbitRawInput, false);\n      content.appendChild(orbitRawToggle);\n\n      const { wrapper: orbitDebugToggle, input: orbitDebugInput } = createToggle('Orbit Clouds Mask Overlay', orbitCloudsDebugOverlay, (checked) => {\n        this._emitChange('orbitCloudsDebugOverlay', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.orbitClouds.debugOverlay', orbitDebugInput, false);\n      content.appendChild(orbitDebugToggle);\n\n      const { group: orbitOpacityGroup, range: orbitOpacityRange, valueDisplay: orbitOpacityDisplay } = createRangeSlider({\n        label: 'Orbit Opacity',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: orbitCloudsOpacity,\n        onChange: (val) => this._emitChange('orbitCloudsOpacity', val),\n      });\n      this._bindSettingRange('scene.atmosphere.orbitClouds.opacity', orbitOpacityRange, orbitCloudsOpacity, {\n        valueDisplay: orbitOpacityDisplay\n      });\n      content.appendChild(orbitOpacityGroup);\n\n      const { group: orbitRefreshGroup, range: orbitRefreshRange, valueDisplay: orbitRefreshDisplay } = createRangeSlider({\n        label: 'Refresh (min)',\n        min: 5,\n        max: 180,\n        step: 5,\n        value: orbitCloudsRefresh,\n        onChange: (val) => this._emitChange('orbitCloudsRefresh', val),\n      });\n      this._bindSettingRange('scene.atmosphere.orbitClouds.refreshMinutes', orbitRefreshRange, orbitCloudsRefresh, {\n        valueDisplay: orbitRefreshDisplay\n      });\n      content.appendChild(orbitRefreshGroup);\n\n      const { group: orbitTimeStepGroup, range: orbitTimeStepRange, valueDisplay: orbitTimeStepDisplay } = createRangeSlider({\n        label: 'Time Step (min)',\n        min: 15,\n        max: 1440,\n        step: 15,\n        value: orbitCloudsTimeStep,\n        onChange: (val) => this._emitChange('orbitCloudsTimeStep', val),\n      });\n      this._bindSettingRange('scene.atmosphere.orbitClouds.timeStepMinutes', orbitTimeStepRange, orbitCloudsTimeStep, {\n        valueDisplay: orbitTimeStepDisplay\n      });\n      content.appendChild(orbitTimeStepGroup);\n\n      const { group: orbitLayerGroup, input: orbitLayerInput } = createInput({\n        label: 'GIBS Layer',\n        type: 'text',\n        value: orbitCloudsLayer,\n        onChange: (val) => this._emitChange('orbitCloudsLayer', val.trim()),\n      });\n      this._bindSettingInput('scene.atmosphere.orbitClouds.layer', orbitLayerInput, orbitCloudsLayer);\n      content.appendChild(orbitLayerGroup);\n\n      return content;\n    }, {\n      getValue: () => !!this._getSettingValue('scene.atmosphere.clouds.enabled', true),\n      setValue: (val) => this._applyScenePatch({ atmosphere: { clouds: { enabled: val } } })\n    });\n\n    // Cloud Layers Section (Debug)\n    this._addSection(container, 'cloudLayers', 'Cloud Layers', false, () => {\n      const content = document.createElement('div');\n      const cloudLayers = this._getSettingValue('scene.atmosphere.cloudLayers', {}) || {};\n      const low = cloudLayers.low || {};\n      const mid = cloudLayers.mid || {};\n      const high = cloudLayers.high || {};\n\n      const lowAltitudeValue = this._resolveNumber(low.altitude, 750, { min: 0, max: 20000 });\n      const lowHeightValue = this._resolveNumber(low.height, 650, { min: 0, max: 20000 });\n      const midAltitudeValue = this._resolveNumber(mid.altitude, 1000, { min: 0, max: 20000 });\n      const midHeightValue = this._resolveNumber(mid.height, 1200, { min: 0, max: 20000 });\n      const highAltitudeValue = this._resolveNumber(high.altitude, 7500, { min: 0, max: 20000 });\n      const highHeightValue = this._resolveNumber(high.height, 500, { min: 0, max: 20000 });\n\n      const note = document.createElement('div');\n      note.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin-bottom: 8px;';\n      note.textContent = 'Altitudes are measured above the terrain baseline.';\n      content.appendChild(note);\n\n      const groupLabelStyle = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n      const layerSettings = [\n        {\n          title: 'Low Layer',\n          altitudeKey: 'cloudLowAltitude',\n          altitudePath: 'scene.atmosphere.cloudLayers.low.altitude',\n          altitudeValue: lowAltitudeValue,\n          heightKey: 'cloudLowHeight',\n          heightPath: 'scene.atmosphere.cloudLayers.low.height',\n          heightValue: lowHeightValue,\n        },\n        {\n          title: 'Mid Layer',\n          altitudeKey: 'cloudMidAltitude',\n          altitudePath: 'scene.atmosphere.cloudLayers.mid.altitude',\n          altitudeValue: midAltitudeValue,\n          heightKey: 'cloudMidHeight',\n          heightPath: 'scene.atmosphere.cloudLayers.mid.height',\n          heightValue: midHeightValue,\n        },\n        {\n          title: 'High Layer',\n          altitudeKey: 'cloudHighAltitude',\n          altitudePath: 'scene.atmosphere.cloudLayers.high.altitude',\n          altitudeValue: highAltitudeValue,\n          heightKey: 'cloudHighHeight',\n          heightPath: 'scene.atmosphere.cloudLayers.high.height',\n          heightValue: highHeightValue,\n        },\n      ];\n\n      layerSettings.forEach((layer, index) => {\n        const label = document.createElement('div');\n        label.style.cssText = groupLabelStyle;\n        label.textContent = layer.title;\n        content.appendChild(label);\n\n        const { group: altitudeGroup, range: altitudeRange, valueDisplay: altitudeDisplay } = createRangeSlider({\n          label: 'Altitude (m)',\n          min: 0,\n          max: 20000,\n          step: 50,\n          value: layer.altitudeValue,\n          onChange: (val) => this._emitChange(layer.altitudeKey, val),\n        });\n        this._bindSettingRange(layer.altitudePath, altitudeRange, layer.altitudeValue, { valueDisplay: altitudeDisplay });\n        content.appendChild(altitudeGroup);\n\n        const { group: heightGroup, range: heightRange, valueDisplay: heightDisplay } = createRangeSlider({\n          label: 'Height (m)',\n          min: 0,\n          max: 20000,\n          step: 50,\n          value: layer.heightValue,\n          onChange: (val) => this._emitChange(layer.heightKey, val),\n        });\n        this._bindSettingRange(layer.heightPath, heightRange, layer.heightValue, { valueDisplay: heightDisplay });\n        content.appendChild(heightGroup);\n\n        if (index < layerSettings.length - 1) {\n          content.appendChild(createDivider());\n        }\n      });\n\n      return content;\n    });\n\n    this._addSection(container, 'adminLayers', 'Borders & Admin', false, () => this._buildAdminLayersSection());\n\n    // Navigation Section\n    this._addSection(container, 'navigation', 'Navigation', false, () => {\n      const content = document.createElement('div');\n      const navSettings = this._getSettingValue('scene.camera.navigation', {}) || {};\n      const profileValue = String(navSettings.profile || 'classic').toLowerCase();\n      const runSpeedValue = this._resolveNumber(navSettings.runSpeed, 1, { min: 0.25, max: 4 });\n      const zoomSpeedValue = this._resolveNumber(navSettings.zoomSpeed, 1, { min: 0.25, max: 4 });\n      const rotateSpeedValue = this._resolveNumber(navSettings.rotateSpeed, 1, { min: 0.25, max: 4 });\n      const dragSpeedValue = this._resolveNumber(navSettings.dragSpeed, 1, { min: 0.25, max: 4 });\n\n      const profileGroup = document.createElement('div');\n      profileGroup.className = 'config-group';\n\n      const { group: profileSelectGroup, select: profileSelect } = createSelect({\n        label: 'Profile',\n        value: profileValue,\n        options: [\n          { label: 'Classic (Orbit + WASD)', value: 'classic' },\n          { label: 'Geospatial (Drag + Shift/Right Orbit)', value: 'geospatial' },\n        ],\n        onChange: (val) => this._emitChange('navProfile', val),\n      });\n      this._bindSettingSelect('scene.camera.navigation.profile', profileSelect, profileValue);\n      profileGroup.appendChild(profileSelectGroup);\n\n      const profileNote = document.createElement('div');\n      profileNote.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.6); margin-top: 6px;';\n      const updateProfileNote = () => {\n        profileNote.textContent = 'Drag orbits. Shift+drag pans across the surface. Shift+right-drag orbits around the point under the camera.';\n      };\n      updateProfileNote();\n      profileSelect.addEventListener('change', updateProfileNote);\n      profileGroup.appendChild(profileNote);\n\n      content.appendChild(profileGroup);\n      content.appendChild(createDivider());\n\n      // Walk Speed slider (actual m/s surface movement)\n      const surfaceSettings = this._getSettingValue('scene.camera.surface', {}) || {};\n      const walkSpeedValue = this._resolveNumber(surfaceSettings.moveSpeed, 1.4, { min: 0.5, max: 10 });\n      const { group: walkSpeedGroup } = createRangeSlider({\n        label: 'Walk Speed (m/s)',\n        min: 0.5,\n        max: 10,\n        step: 0.1,\n        value: walkSpeedValue,\n        onChange: (val) => this._emitChange('navWalkSpeed', val),\n      });\n      this._bindSettingRange('scene.camera.surface.moveSpeed', walkSpeedGroup.querySelector('input[type=\"range\"]'), walkSpeedValue, {\n        valueDisplay: walkSpeedGroup.querySelector('.nc-range-value')\n      });\n      content.appendChild(walkSpeedGroup);\n\n      const altitudeSpeedMaxValue = this._resolveNumber(surfaceSettings.altitudeSpeedMax, 64, { min: 1, max: 256 });\n      const { group: altitudeSpeedMaxGroup } = createRangeSlider({\n        label: 'Altitude Speed Max (x)',\n        min: 1,\n        max: 256,\n        step: 1,\n        value: altitudeSpeedMaxValue,\n        onChange: (val) => this._emitChange('navAltitudeSpeedMax', val),\n      });\n      this._bindSettingRange('scene.camera.surface.altitudeSpeedMax', altitudeSpeedMaxGroup.querySelector('input[type=\"range\"]'), altitudeSpeedMaxValue, {\n        valueDisplay: altitudeSpeedMaxGroup.querySelector('.nc-range-value')\n      });\n      content.appendChild(altitudeSpeedMaxGroup);\n\n      const navSettingsList = [\n        { key: 'navRunSpeed', path: 'scene.camera.navigation.runSpeed', label: 'Run Speed', min: 0.25, max: 4, step: 0.05, value: runSpeedValue },\n        { key: 'navZoomSpeed', path: 'scene.camera.navigation.zoomSpeed', label: 'Zoom Speed', min: 0.25, max: 4, step: 0.05, value: zoomSpeedValue },\n        { key: 'navRotateSpeed', path: 'scene.camera.navigation.rotateSpeed', label: 'Rotate Speed', min: 0.25, max: 4, step: 0.05, value: rotateSpeedValue },\n        { key: 'navDragSpeed', path: 'scene.camera.navigation.dragSpeed', label: 'Drag Speed', min: 0.25, max: 4, step: 0.05, value: dragSpeedValue },\n      ];\n\n      navSettingsList.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      // Go To Lat/Lon section\n      const goToGroup = document.createElement('div');\n      goToGroup.className = 'config-group';\n      const goToTitle = document.createElement('div');\n      goToTitle.className = 'config-group-title';\n      goToTitle.textContent = 'Go To Location';\n      goToGroup.appendChild(goToTitle);\n\n      const goToRow = document.createElement('div');\n      goToRow.style.cssText = 'display: flex; gap: 8px; align-items: flex-end; margin-top: 8px;';\n\n      // Lat input\n      const latWrapper = document.createElement('div');\n      latWrapper.style.cssText = 'flex: 1;';\n      const latLabel = document.createElement('label');\n      latLabel.style.cssText = 'font-size: 10px; color: rgba(255,255,255,0.6); display: block; margin-bottom: 4px;';\n      latLabel.textContent = 'Latitude';\n      const latInput = document.createElement('input');\n      latInput.type = 'number';\n      latInput.step = '0.0001';\n      latInput.min = '-90';\n      latInput.max = '90';\n      latInput.placeholder = '0.0';\n      latInput.style.cssText = 'width: 100%; padding: 6px 8px; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.15); border-radius: 6px; color: #fff; font-size: 12px; font-family: inherit;';\n      latWrapper.appendChild(latLabel);\n      latWrapper.appendChild(latInput);\n      goToRow.appendChild(latWrapper);\n\n      // Lon input\n      const lonWrapper = document.createElement('div');\n      lonWrapper.style.cssText = 'flex: 1;';\n      const lonLabel = document.createElement('label');\n      lonLabel.style.cssText = 'font-size: 10px; color: rgba(255,255,255,0.6); display: block; margin-bottom: 4px;';\n      lonLabel.textContent = 'Longitude';\n      const lonInput = document.createElement('input');\n      lonInput.type = 'number';\n      lonInput.step = '0.0001';\n      lonInput.min = '-180';\n      lonInput.max = '180';\n      lonInput.placeholder = '0.0';\n      lonInput.style.cssText = 'width: 100%; padding: 6px 8px; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.15); border-radius: 6px; color: #fff; font-size: 12px; font-family: inherit;';\n      lonWrapper.appendChild(lonLabel);\n      lonWrapper.appendChild(lonInput);\n      goToRow.appendChild(lonWrapper);\n\n      // Go button\n      const goBtn = createButton('Go', {\n        variant: 'accent',\n        size: 'sm',\n        onClick: () => {\n          const lat = parseFloat(latInput.value);\n          const lon = parseFloat(lonInput.value);\n          if (Number.isFinite(lat) && Number.isFinite(lon)) {\n            this._goToLatLon(lat, lon);\n          }\n        },\n      });\n      goBtn.style.cssText += 'min-width: 48px; height: 32px;';\n      goToRow.appendChild(goBtn);\n\n      goToGroup.appendChild(goToRow);\n      content.appendChild(goToGroup);\n\n      // Place Search section\n      const searchGroup = document.createElement('div');\n      searchGroup.className = 'config-group';\n      searchGroup.style.marginTop = '12px';\n\n      const searchHeader = document.createElement('div');\n      searchHeader.className = 'widget-header';\n      const searchTitle = document.createElement('div');\n      searchTitle.className = 'widget-header-title';\n      searchTitle.textContent = 'Search Places';\n      searchHeader.appendChild(searchTitle);\n\n      const searchPinBtn = document.createElement('button');\n      searchPinBtn.type = 'button';\n      searchPinBtn.className = 'widget-pin-btn';\n      searchPinBtn.innerHTML = this._getPinIconSvg();\n      searchPinBtn.title = 'Pin to HUD corner';\n      searchPinBtn.addEventListener('click', () => this._openWidgetPinModal('search'));\n      this._searchPinBtn = searchPinBtn;\n      searchHeader.appendChild(searchPinBtn);\n\n      searchGroup.appendChild(searchHeader);\n\n      const searchRow = document.createElement('div');\n      searchRow.style.cssText = 'display: flex; gap: 8px; align-items: flex-end; margin-top: 8px;';\n\n      const searchWrapper = document.createElement('div');\n      searchWrapper.style.cssText = 'flex: 1; position: relative;';\n\n      const searchInput = document.createElement('input');\n      searchInput.type = 'text';\n      searchInput.placeholder = 'Address, business, landmark...';\n      searchInput.style.cssText = 'width: 100%; padding: 6px 8px; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.15); border-radius: 6px; color: #fff; font-size: 12px; font-family: inherit;';\n      searchInput.addEventListener('input', () => this._onSearchInput(searchInput.value));\n      searchInput.addEventListener('keydown', (e) => {\n        if (e.key === 'Enter') {\n          e.preventDefault();\n          this._performSearch(searchInput.value);\n        } else if (e.key === 'Escape') {\n          this._clearSearchResults();\n        }\n      });\n      this._searchInput = searchInput;\n      searchWrapper.appendChild(searchInput);\n\n      const searchBtn = createButton('Search', {\n        variant: 'secondary',\n        size: 'sm',\n        onClick: () => this._performSearch(searchInput.value),\n      });\n      searchBtn.style.cssText += 'min-width: 64px; height: 32px;';\n\n      searchRow.appendChild(searchWrapper);\n      searchRow.appendChild(searchBtn);\n      searchGroup.appendChild(searchRow);\n\n      // Search results container\n      const resultsContainer = document.createElement('div');\n      resultsContainer.className = 'search-results-container';\n      resultsContainer.style.cssText = 'margin-top: 8px; max-height: 200px; overflow-y: auto; display: none;';\n      this._searchResults = resultsContainer;\n      searchGroup.appendChild(resultsContainer);\n\n      content.appendChild(searchGroup);\n\n      content.appendChild(createDivider());\n\n      // Minimap section with pin button\n      const miniMapGroup = document.createElement('div');\n      miniMapGroup.className = 'config-group';\n\n      const miniMapHeader = document.createElement('div');\n      miniMapHeader.className = 'widget-header';\n      const miniMapTitle = document.createElement('div');\n      miniMapTitle.className = 'widget-header-title';\n      miniMapTitle.textContent = 'Mini Map';\n      miniMapHeader.appendChild(miniMapTitle);\n\n      const miniMapPinBtn = document.createElement('button');\n      miniMapPinBtn.type = 'button';\n      miniMapPinBtn.className = 'widget-pin-btn';\n      miniMapPinBtn.innerHTML = this._getPinIconSvg();\n      miniMapPinBtn.title = 'Pin to HUD corner';\n      miniMapPinBtn.addEventListener('click', () => this._openWidgetPinModal('minimap'));\n      this._miniMapPinBtn = miniMapPinBtn;\n      miniMapHeader.appendChild(miniMapPinBtn);\n\n      miniMapGroup.appendChild(miniMapHeader);\n\n      const miniMapHost = document.createElement('div');\n      miniMapHost.className = 'nc-mini-map-host';\n      miniMapGroup.appendChild(miniMapHost);\n      content.appendChild(miniMapGroup);\n      this._miniMapHost = miniMapHost;\n      this._initMiniMap();\n\n      return content;\n    });\n\n    // Avatar Section\n    this._addSection(container, 'avatar', 'Avatar', false, () => {\n      const content = document.createElement('div');\n      const avatarConfig = this._getSettingValue('scene.avatar', {}) || {};\n      const animation = avatarConfig.animation || {};\n      const headLook = avatarConfig.headLook || {};\n      const jump = avatarConfig.jump || {};\n      const debug = avatarConfig.debug || {};\n      const local = avatarConfig.local || {};\n      const sharing = avatarConfig.sharing || {};\n      const sharingFriends = sharing.friends || {};\n      const sharingPublic = sharing.public || {};\n      const speedRef = animation.speedRef || {};\n\n      const useProxyBall = !!debug.useProxyBall;\n      const proxyRadius = this._resolveNumber(debug.proxyRadius, 0.35, { min: 0.05, max: 2 });\n      const proxyColor = debug.proxyColor || '#38bdf8';\n\n      const fadeDuration = this._resolveNumber(animation.fadeDuration, 0.35, { min: 0, max: 2 });\n      const speedSmoothingRate = this._resolveNumber(animation.speedSmoothingRate, 12, { min: 0.5, max: 30 });\n      const idleSpeedThreshold = this._resolveNumber(animation.idleSpeedThreshold, 0.12, { min: 0, max: 2 });\n      const runSpeedThreshold = this._resolveNumber(animation.runSpeedThreshold, 3.4, { min: 0.5, max: 10 });\n      const directionThreshold = this._resolveNumber(animation.directionThreshold, 0.25, { min: 0, max: 1 });\n      const speedRefValues = [\n        { key: 'WalkForward', label: 'Walk Forward', value: this._resolveNumber(speedRef.WalkForward, 1.8, { min: 0.2, max: 8 }) },\n        { key: 'WalkBackward', label: 'Walk Backward', value: this._resolveNumber(speedRef.WalkBackward, 1.6, { min: 0.2, max: 8 }) },\n        { key: 'WalkLeft', label: 'Walk Left', value: this._resolveNumber(speedRef.WalkLeft, 1.4, { min: 0.2, max: 8 }) },\n        { key: 'WalkRight', label: 'Walk Right', value: this._resolveNumber(speedRef.WalkRight, 1.4, { min: 0.2, max: 8 }) },\n        { key: 'Sprint', label: 'Sprint', value: this._resolveNumber(speedRef.Sprint, 5, { min: 0.2, max: 12 }) },\n        { key: 'CrouchForward', label: 'Crouch Forward', value: this._resolveNumber(speedRef.CrouchForward, 1.1, { min: 0.2, max: 8 }) },\n        { key: 'CrouchBackward', label: 'Crouch Backward', value: this._resolveNumber(speedRef.CrouchBackward, 1.1, { min: 0.2, max: 8 }) },\n        { key: 'CrouchLeft', label: 'Crouch Left', value: this._resolveNumber(speedRef.CrouchLeft, 1, { min: 0.2, max: 8 }) },\n        { key: 'CrouchRight', label: 'Crouch Right', value: this._resolveNumber(speedRef.CrouchRight, 1, { min: 0.2, max: 8 }) },\n      ];\n\n      const headRate = this._resolveNumber(headLook.rate, 12, { min: 0, max: 30 });\n      const headYawMax = this._resolveNumber(headLook.yawMaxDeg, 75, { min: 0, max: 120 });\n      const headPitchUpMax = this._resolveNumber(headLook.pitchUpMaxDeg, 55, { min: 0, max: 120 });\n      const headPitchDownMax = this._resolveNumber(headLook.pitchDownMaxDeg, 65, { min: 0, max: 120 });\n      const headRollMax = this._resolveNumber(headLook.rollMaxDeg, 30, { min: 0, max: 120 });\n\n      const jumpHeight = this._resolveNumber(jump.height, 0.8, { min: 0, max: 3 });\n      const jumpGravity = this._resolveNumber(jump.gravity, 20, { min: 1, max: 60 });\n      const meditateThreshold = this._resolveNumber(local.meditateAltitudeThreshold, 2, { min: 0, max: 10 });\n\n      const resolveShareBool = (value, fallback) => (typeof value === 'boolean' ? value : fallback);\n      const shareDefaults = {\n        friends: {\n          enabled: true,\n          location: true,\n          altitude: true,\n          orientation: true,\n          motion: true,\n          label: true,\n          view: false,\n        },\n        public: {\n          enabled: true,\n          location: true,\n          altitude: true,\n          orientation: true,\n          motion: true,\n          label: true,\n          view: true,\n        },\n      };\n\n      const shareFields = [\n        { key: 'location', label: 'Location (lat/lon)' },\n        { key: 'altitude', label: 'Altitude' },\n        { key: 'orientation', label: 'Orientation (heading/pitch)' },\n        { key: 'motion', label: 'Motion + State' },\n        { key: 'label', label: 'Label' },\n        { key: 'view', label: 'View Cone' },\n      ];\n\n      const shareGroup = document.createElement('div');\n      shareGroup.className = 'config-group';\n      const shareTitle = document.createElement('div');\n      shareTitle.className = 'config-group-title';\n      shareTitle.textContent = 'State Sharing';\n      shareGroup.appendChild(shareTitle);\n\n      const nearbySharingNote = document.createElement('div');\n      nearbySharingNote.style.cssText = 'font-size:10px;color:rgba(255,255,255,.55);line-height:1.4;margin:0 0 8px;';\n      nearbySharingNote.textContent = 'Nearby presence is server-routed only when both avatars would resolve to at least one screen pixel for each other.';\n      shareGroup.appendChild(nearbySharingNote);\n\n      const buildShareSection = (label, key, values, eventLabel = label) => {\n        const defaults = shareDefaults[key];\n        const enabledValue = resolveShareBool(values.enabled, defaults.enabled);\n\n        const sectionContent = document.createElement('div');\n\n        const { wrapper: enabledToggle, input: enabledInput } = createToggle(\n          `Share with ${label}`,\n          enabledValue,\n          (checked) => this._emitChange(`avatarShare${eventLabel}Enabled`, checked)\n        );\n        this._bindSettingToggle(`scene.avatar.sharing.${key}.enabled`, enabledInput, defaults.enabled);\n        sectionContent.appendChild(enabledToggle);\n\n        const fieldset = document.createElement('fieldset');\n        fieldset.style.border = '0';\n        fieldset.style.padding = '0';\n        fieldset.style.margin = '8px 0 0 0';\n        fieldset.disabled = !enabledValue;\n        fieldset.style.opacity = enabledValue ? '1' : '0.6';\n\n        enabledInput.addEventListener('change', () => {\n          fieldset.disabled = !enabledInput.checked;\n          fieldset.style.opacity = enabledInput.checked ? '1' : '0.6';\n        });\n\n        shareFields.forEach((field) => {\n          const fieldValue = resolveShareBool(values[field.key], defaults[field.key]);\n          const keyLabel = `${eventLabel}${field.key[0].toUpperCase()}${field.key.slice(1)}`;\n          const { wrapper, input } = createToggle(\n            field.label,\n            fieldValue,\n            (checked) => this._emitChange(`avatarShare${keyLabel}`, checked)\n          );\n          this._bindSettingToggle(`scene.avatar.sharing.${key}.${field.key}`, input, defaults[field.key]);\n          fieldset.appendChild(wrapper);\n        });\n\n        sectionContent.appendChild(fieldset);\n\n        const { section } = createCollapsible(`${label} Sharing`, sectionContent, false);\n        shareGroup.appendChild(section);\n      };\n\n      buildShareSection('Friends', 'friends', sharingFriends);\n      buildShareSection('Nearby', 'public', sharingPublic, 'Public');\n\n      content.appendChild(shareGroup);\n      content.appendChild(createDivider());\n\n      const debugGroup = document.createElement('div');\n      debugGroup.className = 'config-group';\n      const debugTitle = document.createElement('div');\n      debugTitle.className = 'config-group-title';\n      debugTitle.textContent = 'Debug';\n      debugGroup.appendChild(debugTitle);\n\n      const { wrapper: proxyToggle, input: proxyInput } = createToggle(\n        'Proxy Ball',\n        useProxyBall,\n        (checked) => this._emitChange('avatarDebugBall', checked)\n      );\n      this._bindSettingToggle('scene.avatar.debug.useProxyBall', proxyInput, false);\n      debugGroup.appendChild(proxyToggle);\n\n      const { group: radiusGroup } = createRangeSlider({\n        label: 'Ball Radius (m)',\n        min: 0.05,\n        max: 2,\n        step: 0.01,\n        value: proxyRadius,\n        onChange: (val) => this._emitChange('avatarDebugBallRadius', val),\n      });\n      this._bindSettingRange('scene.avatar.debug.proxyRadius', radiusGroup.querySelector('input[type=\"range\"]'), proxyRadius, {\n        valueDisplay: radiusGroup.querySelector('.nc-range-value')\n      });\n      debugGroup.appendChild(radiusGroup);\n\n      const { group: colorGroup } = createInput({\n        label: 'Ball Color',\n        type: 'color',\n        value: proxyColor,\n        onChange: (val) => this._emitChange('avatarDebugBallColor', val),\n      });\n      this._bindSettingInput('scene.avatar.debug.proxyColor', colorGroup.querySelector('input'), proxyColor);\n      debugGroup.appendChild(colorGroup);\n\n      content.appendChild(debugGroup);\n      content.appendChild(createDivider());\n\n      const animGroup = document.createElement('div');\n      animGroup.className = 'config-group';\n      const animTitle = document.createElement('div');\n      animTitle.className = 'config-group-title';\n      animTitle.textContent = 'Animation';\n      animGroup.appendChild(animTitle);\n\n      const animSettings = [\n        { key: 'avatarFadeDuration', path: 'scene.avatar.animation.fadeDuration', label: 'Crossfade (s)', min: 0, max: 2, step: 0.01, value: fadeDuration },\n        { key: 'avatarSpeedSmoothingRate', path: 'scene.avatar.animation.speedSmoothingRate', label: 'Speed Smoothing', min: 0.5, max: 30, step: 0.5, value: speedSmoothingRate },\n        { key: 'avatarIdleSpeedThreshold', path: 'scene.avatar.animation.idleSpeedThreshold', label: 'Idle Threshold', min: 0, max: 2, step: 0.01, value: idleSpeedThreshold },\n        { key: 'avatarRunSpeedThreshold', path: 'scene.avatar.animation.runSpeedThreshold', label: 'Run Threshold', min: 0.5, max: 10, step: 0.05, value: runSpeedThreshold },\n        { key: 'avatarDirectionThreshold', path: 'scene.avatar.animation.directionThreshold', label: 'Direction Threshold', min: 0, max: 1, step: 0.01, value: directionThreshold },\n      ];\n\n      animSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        animGroup.appendChild(group);\n      });\n\n      content.appendChild(animGroup);\n      content.appendChild(createDivider());\n\n      const tempoGroup = document.createElement('div');\n      tempoGroup.className = 'config-group';\n      const tempoTitle = document.createElement('div');\n      tempoTitle.className = 'config-group-title';\n      tempoTitle.textContent = 'Tempo Reference';\n      tempoGroup.appendChild(tempoTitle);\n\n      speedRefValues.forEach((entry) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: `${entry.label} (m/s)`,\n          min: 0.2,\n          max: entry.key === 'Sprint' ? 12 : 8,\n          step: 0.1,\n          value: entry.value,\n          onChange: (val) => this._emitChange(`avatarSpeedRef${entry.key}`, val),\n        });\n        this._bindSettingRange(`scene.avatar.animation.speedRef.${entry.key}`, range, entry.value, { valueDisplay });\n        tempoGroup.appendChild(group);\n      });\n\n      content.appendChild(tempoGroup);\n      content.appendChild(createDivider());\n\n      const headGroup = document.createElement('div');\n      headGroup.className = 'config-group';\n      const headTitle = document.createElement('div');\n      headTitle.className = 'config-group-title';\n      headTitle.textContent = 'Head Look';\n      headGroup.appendChild(headTitle);\n\n      const headSettings = [\n        { key: 'avatarHeadLookRate', path: 'scene.avatar.headLook.rate', label: 'Look Rate', min: 0, max: 30, step: 0.5, value: headRate },\n        { key: 'avatarHeadYawMax', path: 'scene.avatar.headLook.yawMaxDeg', label: 'Yaw Max (deg)', min: 0, max: 120, step: 1, value: headYawMax },\n        { key: 'avatarHeadPitchUpMax', path: 'scene.avatar.headLook.pitchUpMaxDeg', label: 'Pitch Up Max (deg)', min: 0, max: 120, step: 1, value: headPitchUpMax },\n        { key: 'avatarHeadPitchDownMax', path: 'scene.avatar.headLook.pitchDownMaxDeg', label: 'Pitch Down Max (deg)', min: 0, max: 120, step: 1, value: headPitchDownMax },\n        { key: 'avatarHeadRollMax', path: 'scene.avatar.headLook.rollMaxDeg', label: 'Roll Max (deg)', min: 0, max: 120, step: 1, value: headRollMax },\n      ];\n\n      headSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        headGroup.appendChild(group);\n      });\n\n      content.appendChild(headGroup);\n      content.appendChild(createDivider());\n\n      const jumpGroup = document.createElement('div');\n      jumpGroup.className = 'config-group';\n      const jumpTitle = document.createElement('div');\n      jumpTitle.className = 'config-group-title';\n      jumpTitle.textContent = 'Jump + Meditate';\n      jumpGroup.appendChild(jumpTitle);\n\n      const jumpSettings = [\n        { key: 'avatarJumpHeight', path: 'scene.avatar.jump.height', label: 'Jump Height (m)', min: 0, max: 3, step: 0.05, value: jumpHeight },\n        { key: 'avatarJumpGravity', path: 'scene.avatar.jump.gravity', label: 'Gravity', min: 1, max: 60, step: 1, value: jumpGravity },\n        { key: 'avatarMeditateThreshold', path: 'scene.avatar.local.meditateAltitudeThreshold', label: 'Meditate Threshold (m)', min: 0, max: 10, step: 0.1, value: meditateThreshold },\n      ];\n\n      jumpSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        jumpGroup.appendChild(group);\n      });\n\n      content.appendChild(jumpGroup);\n      content.appendChild(createDivider());\n\n      const listGroup = document.createElement('div');\n      listGroup.className = 'config-group';\n      const listTitle = document.createElement('div');\n      listTitle.className = 'config-group-title';\n      listTitle.textContent = 'GLB Animations';\n      listGroup.appendChild(listTitle);\n\n      const animList = document.createElement('div');\n      animList.className = 'avatar-anim-list';\n      listGroup.appendChild(animList);\n      this._avatarAnimationsEl = animList;\n\n      content.appendChild(listGroup);\n\n      const actionGroup = document.createElement('div');\n      actionGroup.className = 'config-group';\n      const actionTitle = document.createElement('div');\n      actionTitle.className = 'config-group-title';\n      actionTitle.textContent = 'Action States';\n      actionGroup.appendChild(actionTitle);\n\n      const actionList = document.createElement('div');\n      actionList.className = 'avatar-anim-list';\n      actionGroup.appendChild(actionList);\n      this._avatarActionsEl = actionList;\n\n      content.appendChild(actionGroup);\n\n      this._refreshAvatarAnimations();\n\n      return content;\n    });\n\n    // LOD/Terrain Section (Debug)\n    this._addSection(container, 'terrain', 'Terrain & LOD', false, () => {\n      const content = document.createElement('div');\n      const groupLabelStyle = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n\n      // Tile budgets\n      const tileBudgetValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.lod.tileBudget', 1000),\n        1000,\n        { min: 100, max: 5000 }\n      );\n      const splitBudgetValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.lod.splitBudget', 20),\n        20,\n        { min: 1, max: 256 }\n      );\n      const mergeBudgetValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.lod.mergeBudget', 10),\n        10,\n        { min: 1, max: 256 }\n      );\n      const seamInterpolationEnabled = !!this._getSettingValue('scene.terrain.lod.seamInterpolation', false);\n\n      const lodSettings = [\n        { key: 'tileBudget', path: 'scene.terrain.lod.tileBudget', label: 'Tile Budget', min: 100, max: 5000, step: 100, value: tileBudgetValue },\n        { key: 'splitBudget', path: 'scene.terrain.lod.splitBudget', label: 'Split Budget', min: 1, max: 256, step: 1, value: splitBudgetValue },\n        { key: 'mergeBudget', path: 'scene.terrain.lod.mergeBudget', label: 'Merge Budget', min: 1, max: 256, step: 1, value: mergeBudgetValue },\n      ];\n\n      lodSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      const { wrapper: seamToggle, input: seamInput } = createToggle('Seam Interpolation', seamInterpolationEnabled, (checked) => {\n        this._emitChange('seamInterpolation', checked);\n      });\n      this._bindSettingToggle('scene.terrain.lod.seamInterpolation', seamInput, false);\n      content.appendChild(seamToggle);\n\n      content.appendChild(createDivider());\n\n      // Surface LOD Staging\n      const stagingLabel = document.createElement('div');\n      stagingLabel.style.cssText = groupLabelStyle;\n      stagingLabel.textContent = 'Surface LOD Staging';\n      content.appendChild(stagingLabel);\n\n      const stageMinLodValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.surface.staging.minLOD', 6),\n        6,\n        { min: 0, max: 18 }\n      );\n      const stageMaxLodValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.surface.staging.maxLOD', 15),\n        18,\n        { min: 0, max: 18 }\n      );\n      const stageCooldownValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.surface.staging.cooldownMs', 500),\n        500,\n        { min: 100, max: 5000 }\n      );\n\n      const stagingSettings = [\n        { key: 'surfaceStageMinLod', path: 'scene.terrain.surface.staging.minLOD', label: 'Stage Min LOD', min: 0, max: 18, step: 1, value: stageMinLodValue },\n        { key: 'surfaceStageMaxLod', path: 'scene.terrain.surface.staging.maxLOD', label: 'Stage Max LOD', min: 0, max: 18, step: 1, value: stageMaxLodValue },\n        { key: 'surfaceStageCooldown', path: 'scene.terrain.surface.staging.cooldownMs', label: 'Stage Cooldown (ms)', min: 100, max: 5000, step: 100, value: stageCooldownValue },\n      ];\n\n      stagingSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      // Surface LOD Falloff\n      const falloffLabel = document.createElement('div');\n      falloffLabel.style.cssText = groupLabelStyle;\n      falloffLabel.textContent = 'Surface LOD Falloff';\n      content.appendChild(falloffLabel);\n\n      const surfaceLodNearValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.surface.falloff.nearLOD', 18),\n        18,\n        { min: 0, max: 18 }\n      );\n      const surfaceLodFarValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.surface.falloff.farLOD', 6),\n        6,\n        { min: 0, max: 18 }\n      );\n      const surfaceFalloffPowerValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.surface.falloff.power', 0.8),\n        0.8,\n        { min: 0.5, max: 3 }\n      );\n      const surfaceStartDegSetting = this._getSettingValue('scene.terrain.surface.falloff.startDeg', null);\n      const surfaceStartKmLegacy = this._getSettingValue('scene.terrain.surface.falloff.startKm', null);\n      const surfaceStartDegValue = Number.isFinite(surfaceStartDegSetting)\n        ? surfaceStartDegSetting\n        : (Number.isFinite(surfaceStartKmLegacy) ? surfaceStartKmLegacy / KM_PER_DEG : 0);\n      const surfaceLodStartValue = this._resolveNumber(\n        surfaceStartDegValue,\n        0,\n        { min: 0, max: 5 }\n      );\n      const surfaceCullAngleSetting = this._getSettingValue('scene.terrain.surface.staging.cullAngleDeg', null);\n      const surfaceCullAngleValue = this._resolveNumber(\n        Number.isFinite(surfaceCullAngleSetting)\n          ? surfaceCullAngleSetting\n          : this._getSettingValue('scene.terrain.surface.cullAngle', 50),\n        50,\n        { min: 30, max: 120 }\n      );\n\n      const falloffSettings = [\n        { key: 'surfaceLodNear', path: 'scene.terrain.surface.falloff.nearLOD', label: 'Near LOD', min: 0, max: 18, step: 1, value: surfaceLodNearValue },\n        { key: 'surfaceFarLod', path: 'scene.terrain.surface.falloff.farLOD', label: 'Far LOD', min: 0, max: 18, step: 1, value: surfaceLodFarValue },\n        { key: 'surfaceFalloffPower', path: 'scene.terrain.surface.falloff.power', label: 'Falloff Power', min: 0.5, max: 3, step: 0.1, value: surfaceFalloffPowerValue },\n        { key: 'surfaceLodStart', path: 'scene.terrain.surface.falloff.startDeg', label: 'Start Distance (deg)', min: 0, max: 5, step: 0.1, value: surfaceLodStartValue },\n        { key: 'surfaceCullAngle', path: 'scene.terrain.surface.staging.cullAngleDeg', label: 'Cull Angle (°)', min: 30, max: 120, step: 1, value: surfaceCullAngleValue },\n      ];\n\n      falloffSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      // Orbit View LOD\n      const orbitLabel = document.createElement('div');\n      orbitLabel.style.cssText = groupLabelStyle;\n      orbitLabel.textContent = 'Orbit View LOD';\n      content.appendChild(orbitLabel);\n\n      const orbitFalloffMarginValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.orbit.falloff.marginDeg', 6),\n        6,\n        { min: 0, max: 30 }\n      );\n      const orbitFalloffAnchorValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.orbit.falloff.anchorDeg', 90),\n        90,\n        { min: 30, max: 170 }\n      );\n      const orbitLodFalloffValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.orbit.falloff.power', 1.5),\n        1.5,\n        { min: 0.5, max: 3 }\n      );\n\n      const orbitSettings = [\n        { key: 'orbitFalloffMargin', path: 'scene.terrain.orbit.falloff.marginDeg', label: 'View Cone Margin (°)', min: 0, max: 30, step: 0.5, value: orbitFalloffMarginValue },\n        { key: 'orbitFalloffAnchor', path: 'scene.terrain.orbit.falloff.anchorDeg', label: 'Falloff End Angle (°)', min: 30, max: 170, step: 1, value: orbitFalloffAnchorValue },\n        { key: 'orbitLodFalloff', path: 'scene.terrain.orbit.falloff.power', label: 'LOD Falloff Power', min: 0.5, max: 3, step: 0.1, value: orbitLodFalloffValue },\n      ];\n\n      orbitSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      return content;\n    });\n\n    // Tile Source Section (BYO Photorealistic 3D Tiles)\n    this._addSection(container, 'tileSource', 'Tile Source', false, () => {\n      const content = document.createElement('div');\n\n      // Tile mode selector\n      const modeTitle = document.createElement('div');\n      modeTitle.style.cssText = 'font-size: 11px; color: #888; margin-bottom: 6px; font-weight: 500;';\n      modeTitle.textContent = 'Tile Mode';\n      content.appendChild(modeTitle);\n\n      const currentMode = this._getSettingValue('scene.terrain.tileSource', 'tritree');\n      const { group: modeGroup, select: modeSelect } = createSelect({\n        label: '',\n        options: [\n          { value: 'tritree', label: 'TriTree (Default)' },\n          { value: 'quadtree', label: 'Photorealistic 3D Tiles (BYO)' },\n        ],\n        value: currentMode,\n        onChange: async (val) => {\n          const photoPatch = {};\n          if (val === 'quadtree') {\n            photoPatch.enabled = true;\n            applyTileDot('validating');\n            // If a platform-provided Cesium Ion token exists, skip BYO credential\n            // lookup entirely — guests get instant access without auth or network delay.\n            const hasFallbackToken = !!getFallbackCesiumIonToken();\n            if (!hasFallbackToken && _tileAuth.getState().isAuthenticated && !_credsFetched) {\n              await fetchExistingCredentials();\n            }\n            if (_credentialId) photoPatch.credentialId = _credentialId;\n          } else {\n            photoPatch.enabled = false;\n            applyTileDot('disconnected');\n          }\n          this._applyScenePatch({ terrain: { tileSource: val, photorealistic: photoPatch } });\n\n          // Generated buildings are terrain-provider-owned. Infrastructure is\n          // independently user-owned and remains selectable over either\n          // TriTree or photoreal terrain.\n          const buildingsEnabled = val === 'tritree';\n          this._applyScenePatch(buildLabelCategoryPresetPatch({\n            buildings: buildingsEnabled,\n          }));\n\n          this._emitChange('tileSource', val);\n          if (photoSub) photoSub.style.display = val === 'quadtree' ? '' : 'none';\n        },\n      });\n      modeGroup.style.marginBottom = '12px';\n      content.appendChild(modeGroup);\n\n      // Photorealistic subsection (visible only in quadtree mode)\n      const photoSub = document.createElement('div');\n      photoSub.style.display = currentMode === 'quadtree' ? '' : 'none';\n\n      // Provider selector\n      const currentProvider = this._getSettingValue('scene.terrain.photorealistic.provider', 'cesiumIon');\n      const { group: providerGroup } = createSelect({\n        label: 'Provider',\n        options: [\n          { value: 'cesiumIon', label: 'Cesium Ion (Default)' },\n          { value: 'google', label: 'Google (Photorealistic 3D Tiles)' },\n        ],\n        value: currentProvider,\n        onChange: (val) => {\n          this._applyScenePatch({ terrain: { photorealistic: { provider: val } } });\n          this._emitChange('photoProvider', val);\n        },\n      });\n      providerGroup.style.marginBottom = '10px';\n      photoSub.appendChild(providerGroup);\n\n      // Connection status row\n      const statusRow = document.createElement('div');\n      statusRow.style.cssText = 'display: flex; align-items: center; gap: 8px; margin-bottom: 10px; padding: 6px 8px; background: rgba(0,0,0,0.25); border-radius: 6px; border: 1px solid rgba(255,255,255,0.08);';\n\n      const tileStatusDot = document.createElement('span');\n      tileStatusDot.className = 'tile-status-dot';\n      tileStatusDot.style.cssText = 'width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; background: rgba(255,255,255,0.2);';\n\n      const tileStatusText = document.createElement('span');\n      tileStatusText.className = 'tile-status-text';\n      tileStatusText.style.cssText = 'font-size: 11px; color: rgba(255,255,255,0.55); flex: 1;';\n      tileStatusText.textContent = 'Disconnected';\n\n      statusRow.appendChild(tileStatusDot);\n      statusRow.appendChild(tileStatusText);\n      photoSub.appendChild(statusRow);\n\n      const DOT_COLORS = { disconnected: 'rgba(255,255,255,0.2)', validating: '#ffffff', valid: '#50c878', invalid: '#ff6b6b', revoked: '#ff6b6b', 'rate-limited': '#ff6b6b' };\n      const STATUS_LABELS = { disconnected: 'Disconnected', validating: 'Validating...', valid: 'Connected', invalid: 'Invalid key', revoked: 'Key revoked', 'rate-limited': 'Rate limited — using TriTree' };\n      const savedStatus = this._getSettingValue('scene.terrain.photorealistic.status', 'disconnected');\n      tileStatusDot.style.background = DOT_COLORS[savedStatus] || DOT_COLORS.disconnected;\n      tileStatusText.textContent = STATUS_LABELS[savedStatus] || 'Disconnected';\n\n      // Inject pulse keyframes once\n      if (!document.getElementById('nc-pulse-keyframes')) {\n        const _s = document.createElement('style');\n        _s.id = 'nc-pulse-keyframes';\n        _s.textContent = '@keyframes nc-pulse{0%,100%{opacity:1}50%{opacity:.3}}';\n        document.head.appendChild(_s);\n      }\n\n      // Dot-only update (no credential UI toggling) — used by EventBus listener\n      const applyTileDot = (status) => {\n        tileStatusDot.style.background = DOT_COLORS[status] || DOT_COLORS.disconnected;\n        tileStatusText.textContent = STATUS_LABELS[status] || status;\n        tileStatusDot.style.animation = status === 'validating' ? 'nc-pulse 1s ease-in-out infinite' : '';\n        // Runtime provider status is display-only. Persisting it here replays\n        // the terrain settings and can re-enter photorealistic initialisation.\n      };\n\n      // Full status update (dot + credential UI areas)\n      const applyTileStatus = (status, maskedKey) => {\n        applyTileDot(status);\n        if (keyEntry) keyEntry.style.display = status === 'valid' ? 'none' : '';\n        if (keyValid) keyValid.style.display = status === 'valid' ? '' : 'none';\n        if (status === 'valid' && maskedKey && maskedDisplay) maskedDisplay.textContent = maskedKey;\n      };\n\n      // Listen for status feedback from PlanetScene (env var / community pool paths)\n      if (this.eventBus?.on) {\n        this.eventBus.on('photo:status', (payload) => {\n          if (!payload?.status) return;\n          applyTileDot(payload.status);\n\n          // On rate-limit fallback: switch mode selector back to TriTree so\n          // the user sees terrain filling in instead of a broken quadtree view.\n          if (payload.status === 'rate-limited') {\n            modeSelect.value = 'tritree';\n            if (photoSub) photoSub.style.display = 'none';\n            // Falling back to TriTree restores its generated buildings while\n            // preserving the user's independent infrastructure selection.\n            this._applyScenePatch(buildLabelCategoryPresetPatch({\n              buildings: true,\n            }));\n          }\n        });\n      }\n\n      // Credential persistence — fetch existing credentials on init\n      let _credsFetched = false;\n      let _credsFetching = false;\n      const fetchExistingCredentials = async () => {\n        if (_credsFetching || _credsFetched) return;\n        _credsFetching = true;\n        try {\n          const resp = await _tileAuth.authenticatedFetch(\n            `${getBackendApiBase()}/account/byoapi/photorealistic/credentials`,\n            { method: 'GET' }\n          );\n          if (!resp.ok) return;\n          const data = await resp.json();\n          const creds = data.credentials || [];\n          const provider = this._getSettingValue('scene.terrain.photorealistic.provider', 'cesiumIon');\n          const validCred = creds.find(c => c.status === 'valid' && c.provider === provider)\n            || creds.find(c => c.status === 'valid');\n          if (validCred) {\n            _credentialId = validCred.id;\n            const masked = validCred.secret_fingerprint || '\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022';\n            applyTileStatus('valid', masked);\n            // Restore community toggle state\n            const shared = validCred.metadata_json?.community_shared !== false;\n            if (communityInput) communityInput.checked = shared;\n            this._applyScenePatch({ terrain: { photorealistic: {\n              credentialId: validCred.id,\n              provider: validCred.provider,\n              communityKeySharing: shared,\n            } } });\n            const curMode = this._getSettingValue('scene.terrain.tileSource', 'tritree');\n            if (curMode === 'quadtree') {\n              this._applyScenePatch({ terrain: { photorealistic: { enabled: true } } });\n            }\n          }\n        } catch (err) {\n          console.warn('[ConfigSidebar] Credential fetch error:', err);\n        } finally {\n          _credsFetched = true;\n          _credsFetching = false;\n        }\n      };\n\n      // Forward-declared — will be set once the community toggle is created\n      let communityInput = null;\n\n      // Auth notice — hidden when platform provides a default Cesium token\n      const _hasPlatformToken = !!getFallbackCesiumIonToken();\n      const authNotice = document.createElement('div');\n      authNotice.style.cssText = 'padding: 8px 10px; border-radius: 6px; background: rgba(255, 255, 255,0.08); border: 1px solid rgba(255, 255, 255,0.25); font-size: 11px; color: rgba(255, 255, 255,0.9); margin-bottom: 10px;';\n      authNotice.textContent = _hasPlatformToken\n        ? 'Default Cesium Ion tiles provided. Sign in to use your own key.'\n        : 'Sign in to save your API key securely.';\n      const _tileAuth = getAuthService();\n      const isAuthed = _tileAuth.getState().isAuthenticated;\n      // Hide auth notice entirely when platform token exists or user is authed\n      authNotice.style.display = (isAuthed || _hasPlatformToken) ? 'none' : '';\n\n      // Listen for auth state changes to update UI dynamically\n      _tileAuth.subscribe((state) => {\n        const authed = state.isAuthenticated;\n        authNotice.style.display = (authed || _hasPlatformToken) ? 'none' : '';\n        saveBtn.disabled = !authed;\n        if (authed && !_credsFetched && !_credsFetching) fetchExistingCredentials();\n      });\n      // Also fetch on init if already authenticated\n      if (isAuthed && !_credsFetched) fetchExistingCredentials();\n      photoSub.appendChild(authNotice);\n\n      // API key entry area\n      const keyEntry = document.createElement('div');\n      keyEntry.style.cssText = 'margin-bottom: 10px;';\n      keyEntry.style.display = savedStatus === 'valid' ? 'none' : '';\n\n      const keyLabel = document.createElement('div');\n      keyLabel.style.cssText = 'font-size: 11px; color: rgba(255,255,255,0.6); margin-bottom: 4px;';\n      keyLabel.textContent = 'API Key';\n      keyEntry.appendChild(keyLabel);\n\n      const keyRow = document.createElement('div');\n      keyRow.style.cssText = 'display: flex; gap: 6px; align-items: center;';\n\n      const apiKeyInput = document.createElement('input');\n      apiKeyInput.type = 'password';\n      apiKeyInput.placeholder = 'Paste API key here';\n      apiKeyInput.autocomplete = 'off';\n      apiKeyInput.spellcheck = false;\n      apiKeyInput.style.cssText = 'flex: 1; padding: 5px 8px; background: rgba(0,0,0,0.3); border: 1px solid rgba(255,255,255,0.15); border-radius: 4px; color: #fff; font-size: 11px; outline: none;';\n\n      const saveBtn = document.createElement('button');\n      saveBtn.textContent = 'Save';\n      saveBtn.style.cssText = 'padding: 5px 12px; background: rgba(76,175,80,0.3); border: 1px solid rgba(76,175,80,0.5); border-radius: 4px; color: #81c784; font-size: 11px; cursor: pointer; flex-shrink: 0;';\n      saveBtn.disabled = !_tileAuth.getState().isAuthenticated;\n\n      keyRow.appendChild(apiKeyInput);\n      keyRow.appendChild(saveBtn);\n      keyEntry.appendChild(keyRow);\n\n      const keyHint = document.createElement('div');\n      keyHint.style.cssText = 'font-size: 9px; color: rgba(255,255,255,0.3); margin-top: 4px;';\n      keyHint.textContent = 'Key is sent to the server and never stored locally.';\n      keyEntry.appendChild(keyHint);\n      photoSub.appendChild(keyEntry);\n\n      // Masked key area (shown when valid)\n      const keyValid = document.createElement('div');\n      keyValid.style.cssText = 'margin-bottom: 10px;';\n      keyValid.style.display = savedStatus === 'valid' ? '' : 'none';\n\n      const maskedLabel = document.createElement('div');\n      maskedLabel.style.cssText = 'font-size: 11px; color: rgba(255,255,255,0.6); margin-bottom: 4px;';\n      maskedLabel.textContent = 'API Key';\n      keyValid.appendChild(maskedLabel);\n\n      const maskedRow = document.createElement('div');\n      maskedRow.style.cssText = 'display: flex; gap: 6px; align-items: center;';\n\n      const maskedDisplay = document.createElement('div');\n      maskedDisplay.style.cssText = \"flex: 1; padding: 5px 8px; background: rgba(0,0,0,0.3); border: 1px solid rgba(255,255,255,0.1); border-radius: 4px; font-size: 11px; font-family: monospace; color: rgba(255,255,255,0.7);\";\n      maskedDisplay.textContent = '\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022';\n\n      const revokeBtn = document.createElement('button');\n      revokeBtn.textContent = 'Revoke';\n      revokeBtn.style.cssText = 'padding: 5px 12px; background: rgba(244,67,54,0.2); border: 1px solid rgba(244,67,54,0.4); border-radius: 4px; color: #ef9a9a; font-size: 11px; cursor: pointer; flex-shrink: 0;';\n\n      maskedRow.appendChild(maskedDisplay);\n      maskedRow.appendChild(revokeBtn);\n      keyValid.appendChild(maskedRow);\n\n      // Community key sharing toggle\n      const communityDefault = !!this._getSettingValue('scene.terrain.photorealistic.communityKeySharing', true);\n      const { wrapper: communityWrap, input: _communityInput } = createToggle(\n        'Share as community key',\n        communityDefault,\n        (checked) => {\n          this._applyScenePatch({ terrain: { photorealistic: { communityKeySharing: checked } } });\n          this._emitChange('communityKeySharing', checked);\n          // PATCH backend\n          if (_credentialId && _tileAuth.getState().isAuthenticated) {\n            _tileAuth.authenticatedFetch(\n              `${getBackendApiBase()}/account/byoapi/photorealistic/credentials/${_credentialId}/community`,\n              { method: 'PATCH', body: JSON.stringify({ community_shared: !!checked }) }\n            ).catch(() => {});\n          }\n        }\n      );\n      communityInput = _communityInput;\n      communityWrap.style.marginTop = '8px';\n      keyValid.appendChild(communityWrap);\n\n      const communityHint = document.createElement('div');\n      communityHint.style.cssText = 'font-size: 9px; color: rgba(255,255,255,0.3); margin-top: 2px; line-height: 1.4;';\n      communityHint.textContent = 'Help load-balance photorealistic tile queries for all users.';\n      keyValid.appendChild(communityHint);\n\n      photoSub.appendChild(keyValid);\n\n      // Error message\n      const errMsg = document.createElement('div');\n      errMsg.style.cssText = 'padding: 6px 10px; border-radius: 6px; background: rgba(255,107,107,0.1); border: 1px solid rgba(255,107,107,0.3); font-size: 11px; color: #ff6b6b; margin-bottom: 8px; display: none;';\n      photoSub.appendChild(errMsg);\n\n      let _credentialId = null;\n\n      // Save key handler\n      const handleSave = async () => {\n        const rawKey = apiKeyInput.value?.trim();\n        if (!rawKey) { errMsg.textContent = 'Please paste an API key.'; errMsg.style.display = ''; return; }\n        if (!_tileAuth.getState().isAuthenticated) { errMsg.textContent = 'Sign in required.'; errMsg.style.display = ''; return; }\n        errMsg.style.display = 'none';\n        saveBtn.disabled = true;\n        saveBtn.textContent = 'Saving...';\n        applyTileStatus('validating');\n        const provider = this._getSettingValue('scene.terrain.photorealistic.provider', 'cesiumIon');\n        try {\n          const communitySharing = !!this._getSettingValue('scene.terrain.photorealistic.communityKeySharing', true);\n          const resp = await _tileAuth.authenticatedFetch(`${getBackendApiBase()}/account/byoapi/photorealistic/credentials`, {\n            method: 'POST',\n            body: JSON.stringify({ provider, secret: rawKey, community_shared: communitySharing }),\n          });\n          if (!resp.ok) { const b = await resp.json().catch(() => ({})); throw new Error(b?.message || `Server error ${resp.status}`); }\n          const data = await resp.json();\n          const cred = data.credential || data;\n          _credentialId = cred.id || cred.credentialId || null;\n          const masked = cred.secret_fingerprint || (rawKey.length >= 8 ? `${rawKey.slice(0, 4)}...${rawKey.slice(-2)}` : '\\u2022\\u2022\\u2022\\u2022');\n          const credStatus = cred.status || 'valid';\n          if (credStatus === 'valid') {\n            applyTileStatus('valid', masked);\n            this._applyScenePatch({ terrain: { photorealistic: { enabled: true, credentialId: _credentialId, provider } } });\n          } else {\n            applyTileStatus('invalid');\n            errMsg.textContent = cred.last_validation_error || 'Key validation failed upstream.';\n            errMsg.style.display = '';\n          }\n          apiKeyInput.value = '';\n        } catch (err) {\n          applyTileStatus('invalid');\n          errMsg.textContent = err.message || 'Failed to save API key.';\n          errMsg.style.display = '';\n        } finally {\n          saveBtn.disabled = !_tileAuth.getState().isAuthenticated;\n          saveBtn.textContent = 'Save';\n        }\n      };\n      saveBtn.addEventListener('click', handleSave);\n      apiKeyInput.addEventListener('keydown', (e) => { if (e.key === 'Enter') handleSave(); });\n\n      // Revoke key handler\n      revokeBtn.addEventListener('click', async () => {\n        if (!_credentialId) { applyTileStatus('disconnected'); this._applyScenePatch({ terrain: { photorealistic: { enabled: false } } }); return; }\n        revokeBtn.disabled = true;\n        errMsg.style.display = 'none';\n        try {\n          const resp = await _tileAuth.authenticatedFetch(`${getBackendApiBase()}/account/byoapi/photorealistic/credentials/${_credentialId}`, {\n            method: 'DELETE',\n          });\n          if (!resp.ok && resp.status !== 404) { const b = await resp.json().catch(() => ({})); throw new Error(b?.message || `Server error ${resp.status}`); }\n          _credentialId = null;\n          applyTileStatus('revoked');\n          this._applyScenePatch({ terrain: { photorealistic: { enabled: false } } });\n        } catch (err) {\n          errMsg.textContent = err.message || 'Failed to revoke key.';\n          errMsg.style.display = '';\n        } finally {\n          revokeBtn.disabled = false;\n        }\n      });\n\n      content.appendChild(photoSub);\n      content.appendChild(createDivider());\n\n      // Debug: Dual Tile Systems\n      const debugTitle = document.createElement('div');\n      debugTitle.style.cssText = 'font-size: 11px; color: #888; margin: 8px 0 6px; font-weight: 500;';\n      debugTitle.textContent = 'Debug: Dual Tile Systems';\n      content.appendChild(debugTitle);\n\n      // Dual-mode toggle — show both tritree and photorealistic tiles simultaneously\n      const dualMode = !!this._getSettingValue('scene.terrain.debugDualMode', false);\n      const { wrapper: dualWrap, input: dualInput } = createToggle(\n        'Show Both Systems',\n        dualMode,\n        (checked) => {\n          this._applyScenePatch({ terrain: { debugDualMode: checked } });\n          this._emitChange('debugDualMode', checked);\n        }\n      );\n      this._bindSettingToggle('scene.terrain.debugDualMode', dualInput, false);\n      dualWrap.style.marginBottom = '8px';\n      content.appendChild(dualWrap);\n\n      // TriTree elevation offset slider\n      const offsetVal = this._resolveNumber(this._getSettingValue('scene.terrain.debugTriTreeOffsetM', 0), 0, { min: -500, max: 500 });\n      const { group: offsetGroup, range: offsetRange, valueDisplay: offsetDisplay } = createRangeSlider({\n        label: 'TriTree Offset (m)',\n        min: -500, max: 500, step: 1,\n        value: offsetVal,\n        onChange: (val) => {\n          this._applyScenePatch({ terrain: { debugTriTreeOffsetM: val } });\n          this._emitChange('debugTriTreeOffsetM', val);\n        },\n      });\n      this._bindSettingRange('scene.terrain.debugTriTreeOffsetM', offsetRange, offsetVal, { valueDisplay: offsetDisplay });\n      content.appendChild(offsetGroup);\n\n      // Attribution area\n      const attrArea = document.createElement('div');\n      attrArea.className = 'tile-attribution';\n      attrArea.style.cssText = 'margin-top: 12px; padding: 6px 8px; background: rgba(0,0,0,0.3); border-radius: 4px; font-size: 10px; color: rgba(255,255,255,0.4); min-height: 20px; display: none;';\n      content.appendChild(attrArea);\n      this._tileAttributionEl = attrArea;\n\n      return content;\n    });\n\n    // Buildings Section\n    this._addSection(container, 'buildings', 'Buildings', false, () => {\n      const content = document.createElement('div');\n      const groupLabelStyle = 'font-size: 11px; color: #888; margin: 12px 0 8px; font-weight: 500;';\n      const buildingsEnabled = this._getSettingValue('scene.buildings.enabled', false) === true;\n      const radiusMValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.radiusM', 1000),\n        1000,\n        { min: 100, max: 50000 }\n      );\n      const maxFeaturesValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.maxFeatures', 500),\n        500,\n        { min: 50, max: 10000 }\n      );\n      const surfaceOffsetMValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.surfaceOffsetM', 0),\n        0,\n        { min: -5, max: 10 }\n      );\n      const falloffStartMValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.falloffStartM', 700),\n        700,\n        { min: 50, max: 40000 }\n      );\n      const resnapIntervalMsValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.resnapIntervalMs', 200),\n        200,\n        { min: 50, max: 1000 }\n      );\n      const resnapBudgetValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.resnapBudget', 8),\n        8,\n        { min: 1, max: 60 }\n      );\n      const resnapToleranceValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.resnapToleranceM', 0.25),\n        0.25,\n        { min: 0, max: 5 }\n      );\n      const resnapFreezeFramesValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.resnapFreezeFrames', 2),\n        2,\n        { min: 0, max: 12 }\n      );\n      const tileDrivenResnapValue = this._getSettingValue('scene.buildings.tileDrivenResnap', true) !== false;\n      const fallbackResnapIntervalValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.fallbackResnapIntervalMs', 200),\n        200,\n        { min: 50, max: 5000 }\n      );\n      const maxSamplesValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.maxSamplesPerBuilding', 18),\n        18,\n        { min: 3, max: 48 }\n      );\n      const lodDetailRadiusValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.lodDetailRadiusM', 1200),\n        1200,\n        { min: 100, max: 30000 }\n      );\n      const lodImpostorRadiusValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.lodImpostorRadiusM', 5000),\n        5000,\n        { min: 500, max: 80000 }\n      );\n      const lodUpdateIntervalValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.lodUpdateIntervalMs', 200),\n        200,\n        { min: 50, max: 2000 }\n      );\n      const lodBudgetValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.lodBudget', 120),\n        120,\n        { min: 10, max: 400 }\n      );\n      const lodHysteresisValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.lodHysteresisM', 150),\n        150,\n        { min: 0, max: 1000 }\n      );\n      const impostorEnabledValue = this._getSettingValue('scene.buildings.impostorEnabled', true) !== false;\n      const impostorMinSizeValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.impostorMinSizeM', 6),\n        6,\n        { min: 1, max: 50 }\n      );\n      const impostorMinHeightValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.impostorMinHeightM', 4),\n        4,\n        { min: 1, max: 60 }\n      );\n      const impostorHeightScaleValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.impostorHeightScale', 1),\n        1,\n        { min: 0.1, max: 2.5 }\n      );\n      const impostorRebuildBudgetValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.impostorRebuildBudget', 2),\n        2,\n        { min: 1, max: 10 }\n      );\n      const polypBakeToTilesValue = this._getSettingValue('scene.buildings.polypBakeToTiles', false) === true;\n      const imageryEnabledValue = this._getSettingValue('scene.buildings.imageryEnabled', false) === true;\n      const imageryUpdateIntervalValue = this._resolveNumber(\n        this._getSettingValue('scene.buildings.imageryUpdateIntervalMs', 500),\n        500,\n        { min: 50, max: 5000 }\n      );\n      const { wrapper: enabledToggle, input: buildingsEnabledInput } = createToggle('Enable Buildings', buildingsEnabled, (checked) => {\n        this._emitChange('buildingsEnabled', checked);\n      });\n      const syncBuildingsEnabled = (value) => {\n        buildingsEnabledInput.disabled = this._getSettingValue('scene.terrain.tileSource', 'quadtree') !== 'tritree';\n        buildingsEnabledInput.checked = !buildingsEnabledInput.disabled && value;\n      };\n      this._bindSettingToggle('scene.buildings.enabled', buildingsEnabledInput, false, syncBuildingsEnabled);\n      syncBuildingsEnabled(buildingsEnabled);\n      content.appendChild(enabledToggle);\n\n      const note = document.createElement('div');\n      note.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin: 8px 0;';\n      note.textContent = 'Generated buildings, tile extrusion and texture projection run only with TriTree. Photoreal tiles retain their native buildings without generated repair work.';\n      content.appendChild(note);\n\n      content.appendChild(createDivider());\n\n      const buildingSettings = [\n        { key: 'buildingsRadius', path: 'scene.buildings.radiusM', label: 'Load Radius (m)', min: 100, max: 50000, step: 50, value: radiusMValue },\n        { key: 'buildingsMaxFeatures', path: 'scene.buildings.maxFeatures', label: 'Max Features', min: 50, max: 10000, step: 50, value: maxFeaturesValue },\n        { key: 'buildingsSurfaceOffset', path: 'scene.buildings.surfaceOffsetM', label: 'Surface Offset (m)', min: -5, max: 10, step: 0.5, value: surfaceOffsetMValue },\n        { key: 'buildingsFalloff', path: 'scene.buildings.falloffStartM', label: 'Falloff Start (m)', min: 50, max: 40000, step: 50, value: falloffStartMValue },\n      ];\n\n      buildingSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      const resnapLabel = document.createElement('div');\n      resnapLabel.style.cssText = groupLabelStyle;\n      resnapLabel.textContent = 'Resnap';\n      content.appendChild(resnapLabel);\n\n      const { wrapper: tileResnapToggle, input: tileResnapInput } = createToggle('Tile-Driven Resnap', tileDrivenResnapValue, (checked) => {\n        this._emitChange('buildingsTileDrivenResnap', checked);\n      });\n      this._bindSettingToggle('scene.buildings.tileDrivenResnap', tileResnapInput, true);\n      content.appendChild(tileResnapToggle);\n\n      const resnapSettings = [\n        { key: 'buildingsResnapInterval', path: 'scene.buildings.resnapIntervalMs', label: 'Resnap Interval (ms)', min: 50, max: 1000, step: 50, value: resnapIntervalMsValue },\n        { key: 'buildingsResnapBudget', path: 'scene.buildings.resnapBudget', label: 'Resnap Budget', min: 1, max: 60, step: 1, value: resnapBudgetValue },\n        { key: 'buildingsResnapTolerance', path: 'scene.buildings.resnapToleranceM', label: 'Resnap Tolerance (m)', min: 0, max: 5, step: 0.05, value: resnapToleranceValue },\n        { key: 'buildingsResnapFreezeFrames', path: 'scene.buildings.resnapFreezeFrames', label: 'Freeze Frames', min: 0, max: 12, step: 1, value: resnapFreezeFramesValue },\n        { key: 'buildingsFallbackResnapInterval', path: 'scene.buildings.fallbackResnapIntervalMs', label: 'Fallback Resnap (ms)', min: 50, max: 5000, step: 50, value: fallbackResnapIntervalValue },\n        { key: 'buildingsMaxSamples', path: 'scene.buildings.maxSamplesPerBuilding', label: 'Samples per Building', min: 3, max: 48, step: 1, value: maxSamplesValue },\n      ];\n\n      resnapSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      const lodLabel = document.createElement('div');\n      lodLabel.style.cssText = groupLabelStyle;\n      lodLabel.textContent = 'LOD';\n      content.appendChild(lodLabel);\n\n      const lodSettings = [\n        { key: 'buildingsLodDetailRadius', path: 'scene.buildings.lodDetailRadiusM', label: 'Detail Radius (m)', min: 100, max: 30000, step: 50, value: lodDetailRadiusValue },\n        { key: 'buildingsLodImpostorRadius', path: 'scene.buildings.lodImpostorRadiusM', label: 'Impostor Radius (m)', min: 500, max: 80000, step: 100, value: lodImpostorRadiusValue },\n        { key: 'buildingsLodUpdateInterval', path: 'scene.buildings.lodUpdateIntervalMs', label: 'LOD Update (ms)', min: 50, max: 2000, step: 50, value: lodUpdateIntervalValue },\n        { key: 'buildingsLodBudget', path: 'scene.buildings.lodBudget', label: 'LOD Budget', min: 10, max: 400, step: 10, value: lodBudgetValue },\n        { key: 'buildingsLodHysteresis', path: 'scene.buildings.lodHysteresisM', label: 'LOD Hysteresis (m)', min: 0, max: 1000, step: 10, value: lodHysteresisValue },\n      ];\n\n      lodSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      const { wrapper: impostorToggle, input: impostorInput } = createToggle('Enable Impostors', impostorEnabledValue, (checked) => {\n        this._emitChange('buildingsImpostorEnabled', checked);\n      });\n      this._bindSettingToggle('scene.buildings.impostorEnabled', impostorInput, true);\n      content.appendChild(impostorToggle);\n\n      const impostorSettings = [\n        { key: 'buildingsImpostorMinSize', path: 'scene.buildings.impostorMinSizeM', label: 'Impostor Min Size (m)', min: 1, max: 50, step: 1, value: impostorMinSizeValue },\n        { key: 'buildingsImpostorMinHeight', path: 'scene.buildings.impostorMinHeightM', label: 'Impostor Min Height (m)', min: 1, max: 60, step: 1, value: impostorMinHeightValue },\n        { key: 'buildingsImpostorHeightScale', path: 'scene.buildings.impostorHeightScale', label: 'Impostor Height Scale', min: 0.1, max: 2.5, step: 0.05, value: impostorHeightScaleValue },\n        { key: 'buildingsImpostorRebuildBudget', path: 'scene.buildings.impostorRebuildBudget', label: 'Impostor Rebuild Budget', min: 1, max: 10, step: 1, value: impostorRebuildBudgetValue },\n      ];\n\n      impostorSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      const bakeLabel = document.createElement('div');\n      bakeLabel.style.cssText = groupLabelStyle;\n      bakeLabel.textContent = 'Tile Bake';\n      content.appendChild(bakeLabel);\n\n      const { wrapper: bakeToggle, input: bakeInput } = createToggle('Bake Buildings Into Tiles', polypBakeToTilesValue, (checked) => {\n        this._emitChange('buildingsPolypBakeToTiles', checked);\n      });\n      this._bindSettingToggle('scene.buildings.polypBakeToTiles', bakeInput, false);\n      content.appendChild(bakeToggle);\n\n      const bakeNote = document.createElement('div');\n      bakeNote.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin: 6px 0 0;';\n      bakeNote.textContent = 'Extrudes footprints into tile geometry and hides separate meshes.';\n      content.appendChild(bakeNote);\n\n      content.appendChild(createDivider());\n\n      const imageryLabel = document.createElement('div');\n      imageryLabel.style.cssText = groupLabelStyle;\n      imageryLabel.textContent = 'Imagery';\n      content.appendChild(imageryLabel);\n\n      const { wrapper: imageryToggle, input: buildingImageryInput } = createToggle('Project Tile Imagery', imageryEnabledValue, (checked) => {\n        this._emitChange('buildingsImageryEnabled', checked);\n      });\n      this._bindSettingToggle('scene.buildings.imageryEnabled', buildingImageryInput, false);\n      content.appendChild(imageryToggle);\n\n      const imagerySettings = [\n        { key: 'buildingsImageryUpdateInterval', path: 'scene.buildings.imageryUpdateIntervalMs', label: 'Imagery Update (ms)', min: 50, max: 5000, step: 50, value: imageryUpdateIntervalValue },\n      ];\n\n      imagerySettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      return content;\n    }, {\n      getValue: () => this._getSettingValue('scene.buildings.enabled', false) === true,\n      setValue: (val) => this._applyScenePatch(buildLabelCategoryControlPatch('buildings', val))\n    });\n\n    // Infrastructure Section\n    this._addSection(container, 'infrastructure', 'Infrastructure', false, () => {\n      const content = document.createElement('div');\n      const groupLabelStyle = 'font-size: 11px; color: #888; margin: 12px 0 8px; font-weight: 500;';\n      const infraConfig = this._getSettingValue('scene.infrastructure', {}) || {};\n      const infraColorDefaults = {\n        roads: '#808080',\n        bridges: '#606060',\n        waterways: '#4a90d9',\n        areas: '#4a8b4a',\n        railways: '#505050'\n      };\n      const resolveColor = (value, fallback) => {\n        if (typeof value === 'string' && value.trim().startsWith('#')) return value.trim();\n        return fallback;\n      };\n      const infraEnabled = infraConfig.enabled !== false;\n      const roadsEnabled = infraConfig.layers?.roads === true;\n      const bridgesEnabled = infraConfig.layers?.bridges !== false;\n      const waterwaysEnabled = infraConfig.layers?.waterways !== false;\n      const areasEnabled = infraConfig.layers?.areas === true;\n      const railwaysEnabled = infraConfig.layers?.railways === true;\n      const radiusMValue = this._resolveNumber(infraConfig.radiusM, 1500, { min: 100, max: 10000 });\n      const refreshDistanceMValue = this._resolveNumber(infraConfig.refreshDistanceM, 300, { min: 50, max: 2000 });\n      const surfaceOffsetMValue = this._resolveNumber(infraConfig.surfaceOffsetM, 0.3, { min: 0, max: 5 });\n      const roadWidthScaleValue = this._resolveNumber(infraConfig.roadWidthScale, 1.0, { min: 0.1, max: 5 });\n      const roadStepMValue = this._resolveNumber(infraConfig.roadStepM, 5, { min: 1, max: 20 });\n      const bridgeHeightMValue = this._resolveNumber(infraConfig.bridgeHeightM, 3.0, { min: 0, max: 20 });\n      const ribbonThicknessMValue = this._resolveNumber(infraConfig.ribbonThicknessM, 0.2, { min: 0, max: 2 });\n      const tileDrivenResnapValue = infraConfig.tileDrivenResnap !== false;\n      const resnapIntervalMsValue = this._resolveNumber(infraConfig.resnapIntervalMs, 1000, { min: 100, max: 5000 });\n      const resnapBudgetValue = this._resolveNumber(infraConfig.resnapBudget, 2, { min: 1, max: 20 });\n      const drapeBudgetValue = this._resolveNumber(infraConfig.drapeBudget, 800, { min: 50, max: 10000 });\n      const alignFreezeFramesValue = this._resolveNumber(infraConfig.alignFreezeFrames, 3, { min: 0, max: 10 });\n      const alignToleranceMValue = this._resolveNumber(infraConfig.alignToleranceM, 0.2, { min: 0, max: 2 });\n      const alignSampleStepMValue = this._resolveNumber(infraConfig.alignSampleStepM, 60, { min: 10, max: 500 });\n      const alignMaxSamplesValue = this._resolveNumber(infraConfig.alignMaxSamples, 96, { min: 16, max: 256 });\n      const pauseWhenFarValue = infraConfig.pauseWhenFar !== false;\n      const pauseDistanceMValue = this._resolveNumber(infraConfig.pauseDistanceM, 0, { min: 0, max: 20000 });\n      const pauseDistanceMultiplierValue = this._resolveNumber(infraConfig.pauseDistanceMultiplier, 2.5, { min: 0.5, max: 6 });\n      const paintConfig = infraConfig.paint || {};\n      const paintEnabled = paintConfig.enabled === true;\n      const paintResolutionValue = this._resolveNumber(paintConfig.resolution, 512, { min: 64, max: 2048 });\n      const paintLineWidthValue = this._resolveNumber(paintConfig.lineWidthPx, 2, { min: 0.5, max: 20 });\n      const paintOpacityValue = this._resolveNumber(paintConfig.opacity, 0.9, { min: 0, max: 1 });\n      const paintBudgetValue = this._resolveNumber(paintConfig.budget, 2, { min: 1, max: 20 });\n      const paintRepaintOnLodValue = paintConfig.repaintOnLod !== false;\n      const infraColors = {\n        roads: resolveColor(infraConfig.colors?.roads, infraColorDefaults.roads),\n        bridges: resolveColor(infraConfig.colors?.bridges, infraColorDefaults.bridges),\n        waterways: resolveColor(infraConfig.colors?.waterways, infraColorDefaults.waterways),\n        areas: resolveColor(infraConfig.colors?.areas, infraColorDefaults.areas),\n        railways: resolveColor(infraConfig.colors?.railways, infraColorDefaults.railways)\n      };\n\n      const { wrapper: infraToggle, input: infraInput } = createToggle('Infrastructure Enabled', infraEnabled, (checked) => {\n        this._emitChange('infraEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.enabled', infraInput, true);\n      content.appendChild(infraToggle);\n      const terrainNote = document.createElement('p');\n      terrainNote.textContent = 'Generated road ribbons and classic surface geometry run only with TriTree. These preferences are retained while photoreal tiles are active; utility overlays below remain independent.';\n      content.appendChild(terrainNote);\n\n      content.appendChild(createDivider());\n\n      // Layer toggles\n      const layersLabel = document.createElement('div');\n      layersLabel.style.cssText = groupLabelStyle;\n      layersLabel.textContent = 'Layers';\n      content.appendChild(layersLabel);\n\n      const { wrapper: roadsToggle, input: roadsInput } = createToggle('Roads', roadsEnabled, (checked) => {\n        this._emitChange('infraRoadsEnabled', checked);\n      });\n      const syncRoadsEnabled = (value) => {\n        roadsInput.disabled = this._getSettingValue('scene.terrain.tileSource', 'quadtree') !== 'tritree';\n        roadsInput.checked = !roadsInput.disabled && value;\n      };\n      this._bindSettingToggle('scene.infrastructure.layers.roads', roadsInput, false, syncRoadsEnabled);\n      syncRoadsEnabled(roadsEnabled);\n      content.appendChild(roadsToggle);\n\n      const { wrapper: bridgesToggle, input: bridgesInput } = createToggle('Bridges', bridgesEnabled, (checked) => {\n        this._emitChange('infraBridgesEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.bridges', bridgesInput, true);\n      content.appendChild(bridgesToggle);\n\n      const { wrapper: waterwaysToggle, input: waterwaysInput } = createToggle('Waterways', waterwaysEnabled, (checked) => {\n        this._emitChange('infraWaterwaysEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.waterways', waterwaysInput, true);\n      content.appendChild(waterwaysToggle);\n\n      const { wrapper: areasToggle, input: areasInput } = createToggle('Areas (Parks, Land Use)', areasEnabled, (checked) => {\n        this._emitChange('infraAreasEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.areas', areasInput, false);\n      content.appendChild(areasToggle);\n\n      const { wrapper: railwaysToggle, input: railwaysInput } = createToggle('Railways', railwaysEnabled, (checked) => {\n        this._emitChange('infraRailwaysEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.railways', railwaysInput, false);\n      content.appendChild(railwaysToggle);\n\n      content.appendChild(createDivider());\n\n      // OpenInfraMap utility infrastructure layers\n      const utilLabel = document.createElement('div');\n      utilLabel.style.cssText = 'font-size: 11px; color: rgba(255,255,255,0.5); margin-bottom: 8px; font-weight: 500;';\n      utilLabel.textContent = 'Utility Infrastructure (OpenInfraMap)';\n      content.appendChild(utilLabel);\n\n      const utilLayers = infraConfig.layers || {};\n      const allUtilGroups = ['power', 'telecoms', 'petroleum', 'water', 'internet', 'solar', 'nuclear'];\n      const allUtilOn = allUtilGroups.every(k => utilLayers[k] === true);\n\n      // \"Enable All\" master toggle for all OpenInfraMap utility layers\n      const { wrapper: allUtilToggle } = createToggle('Enable All Utility Layers', allUtilOn, (checked) => {\n        this._applyScenePatch({\n          infrastructure: {\n            layers: Object.fromEntries(allUtilGroups.map((key) => [key, checked])),\n          },\n        });\n        // Sync individual checkboxes\n        [powerInput, telecomsInput, petroleumInput, waterUtilInput, internetInput, solarInput, nuclearInput]\n          .forEach(inp => { if (inp) inp.checked = checked; });\n      });\n      content.appendChild(allUtilToggle);\n\n      const powerOn = utilLayers.power === true;\n      const { wrapper: powerToggle, input: powerInput } = createToggle('Power (lines, towers)', powerOn, (checked) => {\n        this._emitChange('infraPowerEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.power', powerInput, false);\n      content.appendChild(powerToggle);\n\n      const telecomsOn = utilLayers.telecoms === true;\n      const { wrapper: telecomsToggle, input: telecomsInput } = createToggle('Telecoms (towers, fiber)', telecomsOn, (checked) => {\n        this._emitChange('infraTelecomsEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.telecoms', telecomsInput, false);\n      content.appendChild(telecomsToggle);\n\n      const petroleumOn = utilLayers.petroleum === true;\n      const { wrapper: petroleumToggle, input: petroleumInput } = createToggle('Oil & Gas (pipelines)', petroleumOn, (checked) => {\n        this._emitChange('infraPetroleumEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.petroleum', petroleumInput, false);\n      content.appendChild(petroleumToggle);\n\n      const waterOn = utilLayers.water === true;\n      const { wrapper: waterUtilToggle, input: waterUtilInput } = createToggle('Water (treatment, dams)', waterOn, (checked) => {\n        this._emitChange('infraWaterEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.water', waterUtilInput, false);\n      content.appendChild(waterUtilToggle);\n\n      const internetOn = utilLayers.internet === true;\n      const { wrapper: internetToggle, input: internetInput } = createToggle('Internet (data centers)', internetOn, (checked) => {\n        this._emitChange('infraInternetEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.internet', internetInput, false);\n      content.appendChild(internetToggle);\n\n      const solarOn = utilLayers.solar === true;\n      const { wrapper: solarToggle, input: solarInput } = createToggle('Solar Generation', solarOn, (checked) => {\n        this._emitChange('infraSolarEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.solar', solarInput, false);\n      content.appendChild(solarToggle);\n\n      const nuclearOn = utilLayers.nuclear === true;\n      const { wrapper: nuclearToggle, input: nuclearInput } = createToggle('Nuclear Plants', nuclearOn, (checked) => {\n        this._emitChange('infraNuclearEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.layers.nuclear', nuclearInput, false);\n      content.appendChild(nuclearToggle);\n\n      content.appendChild(createDivider());\n\n      // Nighttime lights (shortcut to atmosphere.lightPollution)\n      const nightLabel = document.createElement('div');\n      nightLabel.style.cssText = 'font-size: 11px; color: rgba(255,255,255,0.5); margin-bottom: 8px; font-weight: 500;';\n      nightLabel.textContent = 'Nighttime Lights';\n      content.appendChild(nightLabel);\n\n      const nightLightsEnabled = this._getSettingValue('scene.atmosphere.lightPollution.enabled', false) === true;\n      const { wrapper: nightLightsToggle, input: nightLightsInput } = createToggle('City Lights (VIIRS)', nightLightsEnabled, (checked) => {\n        this._emitChange('lightPollutionEnabled', checked);\n      });\n      this._bindSettingToggle('scene.atmosphere.lightPollution.enabled', nightLightsInput, false);\n      content.appendChild(nightLightsToggle);\n\n      content.appendChild(createDivider());\n\n      // Settings sliders\n      const settingsLabel = document.createElement('div');\n      settingsLabel.style.cssText = groupLabelStyle;\n      settingsLabel.textContent = 'Settings';\n      content.appendChild(settingsLabel);\n\n      const { wrapper: tileResnapToggle, input: tileResnapInput } = createToggle('Tile-Driven Resnap', tileDrivenResnapValue, (checked) => {\n        this._emitChange('infraTileDrivenResnap', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.tileDrivenResnap', tileResnapInput, true);\n      content.appendChild(tileResnapToggle);\n\n      const { wrapper: pauseToggle, input: pauseInput } = createToggle('Pause When Far', pauseWhenFarValue, (checked) => {\n        this._emitChange('infraPauseWhenFar', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.pauseWhenFar', pauseInput, true);\n      content.appendChild(pauseToggle);\n\n      const infraSettings = [\n        { key: 'infraRadiusM', path: 'scene.infrastructure.radiusM', label: 'Radius (m)', min: 100, max: 10000, step: 100, value: radiusMValue },\n        { key: 'infraRefreshDistanceM', path: 'scene.infrastructure.refreshDistanceM', label: 'Refresh Distance (m)', min: 50, max: 2000, step: 50, value: refreshDistanceMValue },\n        { key: 'infraSurfaceOffsetM', path: 'scene.infrastructure.surfaceOffsetM', label: 'Surface Offset (m)', min: 0, max: 5, step: 0.05, value: surfaceOffsetMValue },\n        { key: 'infraRoadWidthScale', path: 'scene.infrastructure.roadWidthScale', label: 'Road Width Scale', min: 0.1, max: 5, step: 0.1, value: roadWidthScaleValue },\n        { key: 'infraRoadStepM', path: 'scene.infrastructure.roadStepM', label: 'Road Detail (m)', min: 1, max: 20, step: 1, value: roadStepMValue },\n        { key: 'infraBridgeHeightM', path: 'scene.infrastructure.bridgeHeightM', label: 'Bridge Height (m)', min: 0, max: 20, step: 0.5, value: bridgeHeightMValue },\n        { key: 'infraRibbonThicknessM', path: 'scene.infrastructure.ribbonThicknessM', label: 'Ribbon Thickness (m)', min: 0, max: 2, step: 0.05, value: ribbonThicknessMValue },\n        { key: 'infraResnapIntervalMs', path: 'scene.infrastructure.resnapIntervalMs', label: 'Align Sweep (ms)', min: 100, max: 5000, step: 100, value: resnapIntervalMsValue },\n        { key: 'infraResnapBudget', path: 'scene.infrastructure.resnapBudget', label: 'Align Budget', min: 1, max: 20, step: 1, value: resnapBudgetValue },\n        { key: 'infraDrapeBudget', path: 'scene.infrastructure.drapeBudget', label: 'Drape Budget (verts)', min: 50, max: 10000, step: 50, value: drapeBudgetValue },\n        { key: 'infraAlignFreezeFrames', path: 'scene.infrastructure.alignFreezeFrames', label: 'Align Freeze Frames', min: 0, max: 10, step: 1, value: alignFreezeFramesValue },\n        { key: 'infraAlignToleranceM', path: 'scene.infrastructure.alignToleranceM', label: 'Align Tolerance (m)', min: 0, max: 2, step: 0.05, value: alignToleranceMValue },\n        { key: 'infraAlignSampleStepM', path: 'scene.infrastructure.alignSampleStepM', label: 'Align Sample Step (m)', min: 10, max: 500, step: 10, value: alignSampleStepMValue },\n        { key: 'infraAlignMaxSamples', path: 'scene.infrastructure.alignMaxSamples', label: 'Align Max Samples', min: 16, max: 256, step: 8, value: alignMaxSamplesValue },\n        { key: 'infraPauseDistanceM', path: 'scene.infrastructure.pauseDistanceM', label: 'Pause Distance (m, 0=auto)', min: 0, max: 20000, step: 100, value: pauseDistanceMValue },\n        { key: 'infraPauseDistanceMultiplier', path: 'scene.infrastructure.pauseDistanceMultiplier', label: 'Pause Distance Mult', min: 0.5, max: 6, step: 0.1, value: pauseDistanceMultiplierValue },\n      ];\n\n      infraSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      // Colors\n      const colorsLabel = document.createElement('div');\n      colorsLabel.style.cssText = groupLabelStyle;\n      colorsLabel.textContent = 'Colors';\n      content.appendChild(colorsLabel);\n\n      const colorInputs = [\n        { key: 'infraRoadColor', path: 'scene.infrastructure.colors.roads', label: 'Roads', value: infraColors.roads },\n        { key: 'infraBridgeColor', path: 'scene.infrastructure.colors.bridges', label: 'Bridges', value: infraColors.bridges },\n        { key: 'infraWaterwayColor', path: 'scene.infrastructure.colors.waterways', label: 'Waterways', value: infraColors.waterways },\n        { key: 'infraAreaColor', path: 'scene.infrastructure.colors.areas', label: 'Areas', value: infraColors.areas },\n        { key: 'infraRailwayColor', path: 'scene.infrastructure.colors.railways', label: 'Railways', value: infraColors.railways },\n      ];\n\n      colorInputs.forEach((setting) => {\n        const { group, input } = createInput({\n          label: setting.label,\n          type: 'color',\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingInput(setting.path, input, setting.value);\n        content.appendChild(group);\n      });\n\n      const resetRow = document.createElement('div');\n      resetRow.style.marginTop = '10px';\n      resetRow.appendChild(createButton('Reset Colors', {\n        variant: 'secondary',\n        size: 'sm',\n        onClick: () => {\n          this._applyScenePatch({ infrastructure: { colors: { ...infraColorDefaults } } });\n        }\n      }));\n      content.appendChild(resetRow);\n\n      content.appendChild(createDivider());\n\n      const paintLabel = document.createElement('div');\n      paintLabel.style.cssText = groupLabelStyle;\n      paintLabel.textContent = 'Cheap Paint';\n      content.appendChild(paintLabel);\n\n      const { wrapper: paintToggle, input: paintInput } = createToggle('Paint On Tiles', paintEnabled, (checked) => {\n        this._emitChange('infraPaintEnabled', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.paint.enabled', paintInput, false);\n      content.appendChild(paintToggle);\n\n      const { wrapper: paintRepaintToggle, input: paintRepaintInput } = createToggle('Repaint On LOD', paintRepaintOnLodValue, (checked) => {\n        this._emitChange('infraPaintRepaintOnLod', checked);\n      });\n      this._bindSettingToggle('scene.infrastructure.paint.repaintOnLod', paintRepaintInput, true);\n      content.appendChild(paintRepaintToggle);\n\n      const paintSettings = [\n        { key: 'infraPaintResolution', path: 'scene.infrastructure.paint.resolution', label: 'Paint Resolution', min: 64, max: 2048, step: 64, value: paintResolutionValue },\n        { key: 'infraPaintLineWidthPx', path: 'scene.infrastructure.paint.lineWidthPx', label: 'Line Width (px)', min: 0.5, max: 20, step: 0.5, value: paintLineWidthValue },\n        { key: 'infraPaintOpacity', path: 'scene.infrastructure.paint.opacity', label: 'Opacity', min: 0, max: 1, step: 0.05, value: paintOpacityValue },\n        { key: 'infraPaintBudget', path: 'scene.infrastructure.paint.budget', label: 'Paint Budget', min: 1, max: 20, step: 1, value: paintBudgetValue },\n      ];\n\n      paintSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      return content;\n    }, {\n      getValue: () => (this._getSettingValue('scene.infrastructure', {}) || {}).enabled !== false,\n      setValue: (val) => this._applyScenePatch(buildLabelCategoryControlPatch('infrastructure', val))\n    });\n\n    // Aircraft Section\n    this._addSection(container, 'aircraft', 'Aircraft', false, () => {\n      const content = document.createElement('div');\n      const flightStatus=document.createElement('div');flightStatus.className='nca-menu-status';flightStatus.textContent='Loading aircraft sources…';content.appendChild(flightStatus);\n      const updateFlightStatus=summary=>{\n        const available=(summary?.sources||[]).filter(s=>s.status==='available').map(s=>s.name);\n        flightStatus.textContent=`${Number(summary?.count||0).toLocaleString()} aircraft · ${available.join(' / ')||'Awaiting source observations'} · best-effort coverage`;\n        flightStatus.title=(summary?.sources||[]).map(s=>`${s.name}: ${s.status}`).join('\\n');\n      };\n      this._flightStatusOff?.();this.scene?.eventBus?.on?.('flights:status',updateFlightStatus);\n      this._flightStatusOff=()=>this.scene?.eventBus?.off?.('flights:status',updateFlightStatus);\n      const flightsEnabled = this._getSettingValue('scene.flights.enabled', false) !== false;\n      const providerValue = String(this._getSettingValue('scene.flights.provider', 'unified') || 'unified');\n      const queryModeValue = String(this._getSettingValue('scene.flights.queryMode', 'catalog') || 'catalog');\n      const queryValue = String(this._getSettingValue('scene.flights.queryValue', '') || '');\n      const radiusNmValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.radiusNm', 80),\n        80,\n        { min: 1, max: 250 }\n      );\n      const coneAngleValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.coneAngleDeg', 170),\n        170,\n        { min: 60, max: 180 }\n      );\n      const maxAircraftValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.maxAircraft', 200),\n        200,\n        { min: 10, max: 200 }\n      );\n      const pollIntervalValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.pollIntervalMs', 2000),\n        2000,\n        { min: 1000, max: 60000 }\n      );\n      const staleAfterValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.staleAfterMs', 60000),\n        60000,\n        { min: 5000, max: 120000 }\n      );\n      const predictionValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.predictionMaxMs', 30000),\n        30000,\n        { min: 0, max: 60000 }\n      );\n      const modelScaleValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.modelScale', 0.125),\n        0.125,\n        { min: 0.1, max: 10 }\n      );\n      const headingOffsetValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.headingOffsetDeg', 180),\n        180,\n        { min: -180, max: 180 }\n      );\n      const altitudeOffsetValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.altitudeOffsetM', 8),\n        8,\n        { min: -1000, max: 10000 }\n      );\n      const showPathsValue = this._getSettingValue('scene.flights.showPaths', false) === true;\n      const pathHoursValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.pathHours', 24),\n        24,\n        { min: 1, max: 24 }\n      );\n      const pathMaxPointsValue = this._resolveNumber(\n        this._getSettingValue('scene.flights.pathMaxPoints', 120),\n        120,\n        { min: 10, max: 256 }\n      );\n      const modelUrlValue = String(this._getSettingValue('scene.flights.modelUrl', './refactor/data/models/a330-300.glb') || '');\n      const modelPresets = [\n        {\n          id: 'a330-300',\n          label: 'Airbus A330-300',\n          url: './refactor/data/models/a330-300.glb',\n          headingOffsetDeg: 180,\n          altitudeOffsetM: 8,\n        },\n      ];\n      const resolvePresetForUrl = (url) => modelPresets.find((preset) => preset.url === url);\n      let currentModelUrl = modelUrlValue;\n      let currentModelPreset = resolvePresetForUrl(currentModelUrl)?.id || 'custom';\n\n      const providerOptions = [\n        { label: 'All available aircraft sources', value: 'unified' },\n        { label: 'OpenSky Network (anonymous)', value: 'opensky' },\n        { label: 'Airplanes.live (no key)', value: 'airplanes_live' },\n        { label: 'ADSB.one (no key)', value: 'adsb_one' },\n        { label: 'ADSB.lol (no key)', value: 'adsb_lol' },\n        { label: 'ADSB.fi Open Data (no key)', value: 'adsb_fi' },\n      ];\n\n      const providerModes = {\n        unified: [{label:'Global catalog · best effort',value:'catalog'},{label:'Nearby combined feeds',value:'point'},{label:'ICAO address',value:'hex'},{label:'Callsign',value:'callsign'},{label:'Registration',value:'reg'},{label:'Aircraft type',value:'type'}],\n        opensky: [\n          { label: 'States (Global)', value: 'global' },\n          { label: 'States (Bounding Box)', value: 'bbox' },\n        ],\n        airplanes_live: [\n          { label: 'Point (Lat/Lon/Radius)', value: 'point' },\n          { label: 'Hex (ICAO24)', value: 'hex' },\n          { label: 'Callsign', value: 'callsign' },\n          { label: 'Reg', value: 'reg' },\n          { label: 'Type', value: 'type' },\n          { label: 'Squawk', value: 'squawk' },\n          { label: 'MIL', value: 'mil' },\n          { label: 'LADD', value: 'ladd' },\n          { label: 'PIA', value: 'pia' },\n        ],\n        adsb_one: [\n          { label: 'Point (Lat/Lon/Radius)', value: 'point' },\n          { label: 'Hex (ICAO24)', value: 'hex' },\n          { label: 'Callsign', value: 'callsign' },\n          { label: 'Reg', value: 'reg' },\n          { label: 'Type', value: 'type' },\n          { label: 'Squawk', value: 'squawk' },\n          { label: 'MIL', value: 'mil' },\n          { label: 'LADD', value: 'ladd' },\n          { label: 'PIA', value: 'pia' },\n        ],\n        adsb_lol: [\n          { label: 'Point (Lat/Lon/Radius)', value: 'point' },\n          { label: 'Hex (ICAO24)', value: 'hex' },\n          { label: 'Callsign', value: 'callsign' },\n          { label: 'Reg', value: 'reg' },\n          { label: 'Type', value: 'type' },\n          { label: 'Squawk', value: 'squawk' },\n          { label: 'MIL', value: 'mil' },\n          { label: 'LADD', value: 'ladd' },\n          { label: 'PIA', value: 'pia' },\n        ],\n        adsb_fi: [\n          { label: 'Point (Lat/Lon/Radius)', value: 'point' },\n          { label: 'Hex (ICAO24)', value: 'hex' },\n          { label: 'Callsign', value: 'callsign' },\n          { label: 'Reg', value: 'reg' },\n          { label: 'Type', value: 'type' },\n          { label: 'Squawk', value: 'squawk' },\n          { label: 'MIL', value: 'mil' },\n          { label: 'LADD', value: 'ladd' },\n          { label: 'PIA', value: 'pia' },\n        ],\n      };\n\n      let currentProvider = providerValue;\n      let currentMode = queryModeValue;\n      let currentQueryValue = queryValue;\n      let currentRadiusNm = radiusNmValue;\n      let currentConeAngle = coneAngleValue;\n      let currentMaxAircraft = maxAircraftValue;\n      let modelInput = null;\n      let modelSelect = null;\n      let headingRange = null;\n      let headingValueDisplay = null;\n      let altitudeRange = null;\n      let altitudeValueDisplay = null;\n\n      const { wrapper: enabledToggle, input: flightsEnabledInput } = createToggle('Enable Aircraft', flightsEnabled, (checked) => {\n        this._emitChange('flightsEnabled', checked);\n      });\n      this._bindSettingToggle('scene.flights.enabled', flightsEnabledInput, false);\n      content.appendChild(enabledToggle);\n\n      const note = document.createElement('div');\n      note.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin: 8px 0;';\n      note.textContent = 'Flight feeds are fetched server-side and cached for all users.';\n      content.appendChild(note);\n\n      const aircraftListGroup = document.createElement('div');\n      aircraftListGroup.className = 'config-group';\n\n      const aircraftListTitle = document.createElement('div');\n      aircraftListTitle.className = 'config-group-title';\n      aircraftListTitle.textContent = 'Tracked Aircraft';\n      aircraftListGroup.appendChild(aircraftListTitle);\n\n      const { group: aircraftSelectGroup, select: aircraftSelect } = createSelect({\n        label: 'Aircraft',\n        value: '',\n        options: [{ label: 'No aircraft in scene', value: '' }],\n        onChange: (val) => {\n          const entry = this._aircraftEntriesById.get(val) || null;\n          this._renderAircraftDetails(entry);\n        },\n      });\n      aircraftSelect.disabled = true;\n      aircraftListGroup.appendChild(aircraftSelectGroup);\n\n      const { panel: aircraftDetailsPanel, metrics: aircraftDetailsMetrics } = this._createDetailPanel(\n        'No aircraft in scene.'\n      );\n      aircraftListGroup.appendChild(aircraftDetailsPanel);\n\n      this._aircraftListSelect = aircraftSelect;\n      this._aircraftDetailsEl = aircraftDetailsMetrics;\n\n      content.appendChild(aircraftListGroup);\n      content.appendChild(createDivider());\n\n      const { group: providerGroup, select: providerSelect } = createSelect({\n        label: 'Provider',\n        value: currentProvider,\n        options: providerOptions,\n        onChange: (val) => {\n          currentProvider = val;\n          this._emitChange('flightsProvider', val);\n          renderModeControls();\n        },\n      });\n      this._bindSettingSelect('scene.flights.provider', providerSelect, currentProvider, {\n        onSync: (val) => {\n          if (currentProvider === val) return;\n          currentProvider = val;\n          renderModeControls();\n        }\n      });\n      content.appendChild(providerGroup);\n      content.appendChild(createDivider());\n\n      const modeContainer = document.createElement('div');\n      const controlsContainer = document.createElement('div');\n\n      const renderModeControls = () => {\n        modeContainer.innerHTML = '';\n        controlsContainer.innerHTML = '';\n\n        currentMode = String(this._getSettingValue('scene.flights.queryMode', currentMode) || currentMode);\n        currentQueryValue = String(this._getSettingValue('scene.flights.queryValue', currentQueryValue) || '');\n        currentRadiusNm = this._resolveNumber(\n          this._getSettingValue('scene.flights.radiusNm', currentRadiusNm),\n          currentRadiusNm,\n          { min: 1, max: 250 }\n        );\n        currentConeAngle = this._resolveNumber(\n          this._getSettingValue('scene.flights.coneAngleDeg', currentConeAngle),\n          currentConeAngle,\n          { min: 60, max: 180 }\n        );\n        currentMaxAircraft = this._resolveNumber(\n          this._getSettingValue('scene.flights.maxAircraft', currentMaxAircraft),\n          currentMaxAircraft,\n          { min: 10, max: 200 }\n        );\n\n        const modes = providerModes[currentProvider] || providerModes.unified;\n        if (!modes.find((m) => m.value === currentMode)) {\n          currentMode = modes[0].value;\n          this._emitChange('flightsQueryMode', currentMode);\n        }\n\n        const { group: modeGroup, select: modeSelect } = createSelect({\n          label: 'Endpoint',\n          value: currentMode,\n          options: modes,\n          onChange: (val) => {\n            currentMode = val;\n            this._emitChange('flightsQueryMode', val);\n            renderModeControls();\n          },\n        });\n        this._bindSettingSelect('scene.flights.queryMode', modeSelect, currentMode, {\n          onSync: (val) => {\n            if (currentMode === val) return;\n            currentMode = val;\n            renderModeControls();\n          }\n        });\n        modeContainer.appendChild(modeGroup);\n\n        const needsQueryValue = ['hex', 'callsign', 'reg', 'type', 'squawk'].includes(currentMode);\n        if (needsQueryValue) {\n          const { group: queryGroup, input: queryInput } = createInput({\n            label: 'Query Value',\n            placeholder: 'A9CEE9',\n            value: currentQueryValue,\n            onChange: (val) => {\n              currentQueryValue = val.trim();\n              this._emitChange('flightsQueryValue', currentQueryValue);\n            },\n          });\n          this._bindSettingInput('scene.flights.queryValue', queryInput, currentQueryValue, {\n            onSync: (val) => {\n              currentQueryValue = val;\n            }\n          });\n          queryInput.dataset.setting = 'flightsQueryValue';\n          controlsContainer.appendChild(queryGroup);\n        }\n\n        const usesRadius = ['point', 'bbox', 'global'].includes(currentMode);\n        if (usesRadius) {\n          const { group: radiusGroup, range: radiusRange, valueDisplay: radiusValueDisplay } = createRangeSlider({\n            label: 'Radius (nm)',\n            min: 1,\n            max: 250,\n            step: 1,\n            value: currentRadiusNm,\n            onChange: (val) => {\n              currentRadiusNm = val;\n              this._emitChange('flightsRadiusNm', val);\n            },\n          });\n          this._bindSettingRange('scene.flights.radiusNm', radiusRange, currentRadiusNm, {\n            valueDisplay: radiusValueDisplay,\n            onSync: (val) => {\n              currentRadiusNm = val;\n            }\n          });\n          radiusRange.dataset.setting = 'flightsRadiusNm';\n          controlsContainer.appendChild(radiusGroup);\n        }\n\n        const { group: coneGroup, range: coneRange, valueDisplay: coneValueDisplay } = createRangeSlider({\n          label: 'View Cone (deg)',\n          min: 60,\n          max: 180,\n          step: 1,\n          value: currentConeAngle,\n          onChange: (val) => {\n            currentConeAngle = val;\n            this._emitChange('flightsConeAngle', val);\n          },\n        });\n        this._bindSettingRange('scene.flights.coneAngleDeg', coneRange, currentConeAngle, {\n          valueDisplay: coneValueDisplay,\n          onSync: (val) => {\n            currentConeAngle = val;\n          }\n        });\n        coneRange.dataset.setting = 'flightsConeAngle';\n        controlsContainer.appendChild(coneGroup);\n\n        const { group: maxGroup, range: maxRange, valueDisplay: maxValueDisplay } = createRangeSlider({\n          label: 'Nearby aircraft models',\n          min: 10,\n          max: 200,\n          step: 10,\n          value: currentMaxAircraft,\n          onChange: (val) => {\n            currentMaxAircraft = val;\n            this._emitChange('flightsMaxAircraft', val);\n          },\n        });\n        this._bindSettingRange('scene.flights.maxAircraft', maxRange, currentMaxAircraft, {\n          valueDisplay: maxValueDisplay,\n          onSync: (val) => {\n            currentMaxAircraft = val;\n          }\n        });\n        maxRange.dataset.setting = 'flightsMaxAircraft';\n        controlsContainer.appendChild(maxGroup);\n      };\n\n      renderModeControls();\n      content.appendChild(modeContainer);\n      content.appendChild(controlsContainer);\n      content.appendChild(createDivider());\n\n      const { group: pollGroup, range: pollRange, valueDisplay: pollValueDisplay } = createRangeSlider({\n        label: 'Poll Interval (ms)',\n        min: 1000,\n        max: 60000,\n        step: 500,\n        value: pollIntervalValue,\n        onChange: (val) => this._emitChange('flightsPollInterval', val),\n      });\n      this._bindSettingRange('scene.flights.pollIntervalMs', pollRange, pollIntervalValue, { valueDisplay: pollValueDisplay });\n      pollRange.dataset.setting = 'flightsPollInterval';\n      content.appendChild(pollGroup);\n\n      const { group: staleGroup, range: staleRange, valueDisplay: staleValueDisplay } = createRangeSlider({\n        label: 'Stale After (ms)',\n        min: 5000,\n        max: 120000,\n        step: 1000,\n        value: staleAfterValue,\n        onChange: (val) => this._emitChange('flightsStaleMs', val),\n      });\n      this._bindSettingRange('scene.flights.staleAfterMs', staleRange, staleAfterValue, { valueDisplay: staleValueDisplay });\n      staleRange.dataset.setting = 'flightsStaleMs';\n      content.appendChild(staleGroup);\n\n      const { group: predictGroup, range: predictRange, valueDisplay: predictValueDisplay } = createRangeSlider({\n        label: 'Prediction Max (ms)',\n        min: 0,\n        max: 60000,\n        step: 1000,\n        value: predictionValue,\n        onChange: (val) => this._emitChange('flightsPredictionMs', val),\n      });\n      this._bindSettingRange('scene.flights.predictionMaxMs', predictRange, predictionValue, { valueDisplay: predictValueDisplay });\n      predictRange.dataset.setting = 'flightsPredictionMs';\n      content.appendChild(predictGroup);\n\n      content.appendChild(createDivider());\n\n      const modelOptions = [\n        ...modelPresets.map((preset) => ({ label: preset.label, value: preset.id })),\n        { label: 'Custom URL', value: 'custom' },\n      ];\n      const applyModelPreset = (preset) => {\n        if (!preset) return;\n        currentModelUrl = preset.url;\n        if (modelInput) modelInput.value = preset.url;\n        this._emitChange('flightsModelUrl', preset.url);\n        if (Number.isFinite(preset.headingOffsetDeg)) {\n          if (headingRange) headingRange.value = preset.headingOffsetDeg;\n          if (headingValueDisplay) headingValueDisplay.textContent = preset.headingOffsetDeg;\n          this._emitChange('flightsHeadingOffset', preset.headingOffsetDeg);\n        }\n        if (Number.isFinite(preset.altitudeOffsetM)) {\n          if (altitudeRange) altitudeRange.value = preset.altitudeOffsetM;\n          if (altitudeValueDisplay) altitudeValueDisplay.textContent = preset.altitudeOffsetM;\n          this._emitChange('flightsAltitudeOffset', preset.altitudeOffsetM);\n        }\n      };\n      const syncModelPreset = (url) => {\n        const preset = resolvePresetForUrl(url);\n        const nextPreset = preset ? preset.id : 'custom';\n        if (modelSelect && modelSelect.value !== nextPreset) {\n          modelSelect.value = nextPreset;\n        }\n      };\n\n      const { group: modelSelectGroup, select: modelSelectEl } = createSelect({\n        label: 'Model',\n        value: currentModelPreset,\n        options: modelOptions,\n        onChange: (val) => {\n          currentModelPreset = val;\n          if (val === 'custom') return;\n          applyModelPreset(modelPresets.find((preset) => preset.id === val));\n        },\n      });\n      modelSelect = modelSelectEl;\n      content.appendChild(modelSelectGroup);\n\n      const modelGroup = document.createElement('div');\n      modelGroup.className = 'config-group';\n      const { group: modelInputGroup, input } = createInput({\n        label: 'Model URL',\n        placeholder: './refactor/data/models/a330-300.glb',\n        value: modelUrlValue,\n        onChange: (val) => {\n          currentModelUrl = val.trim();\n          this._emitChange('flightsModelUrl', currentModelUrl);\n          syncModelPreset(currentModelUrl);\n        },\n      });\n      modelInput = input;\n      this._bindSettingInput('scene.flights.modelUrl', modelInput, modelUrlValue, {\n        onSync: (val) => {\n          currentModelUrl = val;\n          currentModelPreset = resolvePresetForUrl(val)?.id || 'custom';\n          syncModelPreset(val);\n        }\n      });\n      modelInput.dataset.setting = 'flightsModelUrl';\n      modelGroup.appendChild(modelInputGroup);\n      content.appendChild(modelGroup);\n\n      const { group: modelScaleGroup, range: modelScaleRange, valueDisplay: modelScaleValueDisplay } = createRangeSlider({\n        label: 'Model Scale',\n        min: 0.01,\n        max: 10,\n        step: 0.01,\n        value: modelScaleValue,\n        onChange: (val) => this._emitChange('flightsModelScale', val),\n      });\n      this._bindSettingRange('scene.flights.modelScale', modelScaleRange, modelScaleValue, { valueDisplay: modelScaleValueDisplay });\n      modelScaleRange.dataset.setting = 'flightsModelScale';\n      content.appendChild(modelScaleGroup);\n\n      const headingSlider = createRangeSlider({\n        label: 'Heading Offset (deg)',\n        min: -180,\n        max: 180,\n        step: 1,\n        value: headingOffsetValue,\n        onChange: (val) => this._emitChange('flightsHeadingOffset', val),\n      });\n      const { group: headingGroup } = headingSlider;\n      headingRange = headingSlider.range;\n      headingValueDisplay = headingSlider.valueDisplay;\n      this._bindSettingRange('scene.flights.headingOffsetDeg', headingRange, headingOffsetValue, { valueDisplay: headingValueDisplay });\n      headingRange.dataset.setting = 'flightsHeadingOffset';\n      content.appendChild(headingGroup);\n\n      const altitudeSlider = createRangeSlider({\n        label: 'Altitude Offset (m)',\n        min: -10,\n        max: 100,\n        step: 0.1,\n        value: altitudeOffsetValue,\n        onChange: (val) => this._emitChange('flightsAltitudeOffset', val),\n      });\n      const { group: altitudeGroup } = altitudeSlider;\n      altitudeRange = altitudeSlider.range;\n      altitudeValueDisplay = altitudeSlider.valueDisplay;\n      this._bindSettingRange('scene.flights.altitudeOffsetM', altitudeRange, altitudeOffsetValue, { valueDisplay: altitudeValueDisplay });\n      altitudeRange.dataset.setting = 'flightsAltitudeOffset';\n      content.appendChild(altitudeGroup);\n\n      content.appendChild(createDivider());\n\n      const { wrapper: pathToggle, input: flightPathsInput } = createToggle('Show Flight Paths', showPathsValue, (checked) => {\n        this._emitChange('flightsShowPaths', checked);\n      });\n      this._bindSettingToggle('scene.flights.showPaths', flightPathsInput, false);\n      content.appendChild(pathToggle);\n\n      const { group: pathHoursGroup, range: pathHoursRange, valueDisplay: pathHoursValueDisplay } = createRangeSlider({\n        label: 'Path Window (hrs)',\n        min: 1,\n        max: 24,\n        step: 1,\n        value: pathHoursValue,\n        onChange: (val) => this._emitChange('flightsPathHours', val),\n      });\n      this._bindSettingRange('scene.flights.pathHours', pathHoursRange, pathHoursValue, { valueDisplay: pathHoursValueDisplay });\n      pathHoursRange.dataset.setting = 'flightsPathHours';\n      content.appendChild(pathHoursGroup);\n\n      const { group: pathPointsGroup, range: pathPointsRange, valueDisplay: pathPointsValueDisplay } = createRangeSlider({\n        label: 'Path Points',\n        min: 10,\n        max: 256,\n        step: 10,\n        value: pathMaxPointsValue,\n        onChange: (val) => this._emitChange('flightsPathMaxPoints', val),\n      });\n      this._bindSettingRange('scene.flights.pathMaxPoints', pathPointsRange, pathMaxPointsValue, { valueDisplay: pathPointsValueDisplay });\n      pathPointsRange.dataset.setting = 'flightsPathMaxPoints';\n      content.appendChild(pathPointsGroup);\n\n      return content;\n    }, {\n      getValue: () => this._getSettingValue('scene.flights.enabled', false) !== false,\n      setValue: (val) => this._applyScenePatch(buildLabelCategoryControlPatch('aircraft', val))\n    });\n\n    // Satellites Section\n    this._addSection(container, 'satellites', 'Satellites', false, () => {\n      const content = document.createElement('div');\n      const satellitesEnabled = this._getSettingValue('scene.satellites.enabled', false) !== false;\n      const providerValue = String(this._getSettingValue('scene.satellites.provider', 'unified') || 'unified');\n      const queryModeValue = String(this._getSettingValue('scene.satellites.queryMode', 'tle') || 'tle');\n      const queryValue = String(this._getSettingValue('scene.satellites.queryValue', '') || '');\n      const maxSatellitesValue = this._resolveNumber(\n        this._getSettingValue('scene.satellites.maxSatellites', 200),\n        200,\n        { min: 10, max: 1000 }\n      );\n      const pollIntervalValue = this._resolveNumber(\n        this._getSettingValue('scene.satellites.pollIntervalMs', 600000),\n        600000,\n        { min: 60000, max: 3600000 }\n      );\n      const staleAfterValue = this._resolveNumber(\n        this._getSettingValue('scene.satellites.staleAfterMs', 21600000),\n        21600000,\n        { min: 60000, max: 172800000 }\n      );\n      const coneAngleValue = this._resolveNumber(\n        this._getSettingValue('scene.satellites.coneAngleDeg', 180),\n        180,\n        { min: 30, max: 180 }\n      );\n      const modelScaleValue = this._resolveNumber(\n        this._getSettingValue('scene.satellites.modelScale', 200),\n        200,\n        { min: 10, max: 2000 }\n      );\n      const altitudeOffsetValue = this._resolveNumber(\n        this._getSettingValue('scene.satellites.altitudeOffsetM', 0),\n        0,\n        { min: -10000, max: 100000 }\n      );\n      const showOrbitsValue = this._getSettingValue('scene.satellites.showOrbits', true) !== false;\n      const orbitSamplesValue = this._resolveNumber(\n        this._getSettingValue('scene.satellites.orbitSamples', 120),\n        120,\n        { min: 32, max: 360 }\n      );\n      const orbitWindowValue = this._resolveNumber(\n        this._getSettingValue('scene.satellites.orbitWindowMinutes', 120),\n        120,\n        { min: 10, max: 240 }\n      );\n\n      const providerOptions = [\n        { label: 'SatNOGS TLE (open)', value: 'satnogs' },\n        { label: 'KeepTrack V2 (bulk catalog)', value: 'keeptrack' },\n        { label: 'CelesTrak GP (groups)', value: 'celestrak' },\n        { label: 'McCants TLE ZIP', value: 'mccants' },\n        { label: 'TLE API (community)', value: 'tle_api' },\n        { label: 'Local Snapshot (state vectors)', value: 'local_snapshot' },\n      ];\n\n      const providerModes = {\n        keeptrack: [\n          { label: 'Catalog (bulk)', value: 'catalog' },\n          { label: 'By NORAD ID', value: 'id' },\n        ],\n        celestrak: [\n          { label: 'Group (active, starlink, ...)', value: 'group' },\n          { label: 'By NORAD ID', value: 'id' },\n          { label: 'By Name', value: 'name' },\n        ],\n        satnogs: [\n          { label: 'TLE Catalog', value: 'tle' },\n        ],\n        mccants: [\n          { label: 'Integrated (inttles.zip)', value: 'integrated' },\n          { label: 'Classified (classfd.zip)', value: 'classified' },\n        ],\n        tle_api: [\n          { label: 'Search', value: 'search' },\n          { label: 'By NORAD ID', value: 'id' },\n          { label: 'Catalog', value: 'catalog' },\n        ],\n        local_snapshot: [\n          { label: 'Catalog (snapshot)', value: 'catalog' },\n          { label: 'By NORAD ID', value: 'id' },\n          { label: 'Search (name/id)', value: 'search' },\n          { label: 'Group (country/type)', value: 'group' },\n        ],\n      };\n\n      let currentProvider = providerValue;\n      let currentMode = queryModeValue;\n      let currentQueryValue = queryValue;\n      let currentMaxSatellites = maxSatellitesValue;\n      let currentConeAngle = coneAngleValue;\n\n      const { wrapper: enabledToggle, input: satellitesEnabledInput } = createToggle('Enable Satellites', satellitesEnabled, (checked) => {\n        this._emitChange('satellitesEnabled', checked);\n      });\n      this._bindSettingToggle('scene.satellites.enabled', satellitesEnabledInput, false);\n      content.appendChild(enabledToggle);\n\n      const note = document.createElement('div');\n      note.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin: 8px 0;';\n      note.textContent = 'Satellite catalogs are fetched server-side and cached for all users.';\n      this._satelliteCatalogStatus=note;\n      content.appendChild(note);\n\n      const satelliteListGroup = document.createElement('div');\n      satelliteListGroup.className = 'config-group';\n\n      const satelliteListTitle = document.createElement('div');\n      satelliteListTitle.className = 'config-group-title';\n      satelliteListTitle.textContent = 'Tracked Satellites';\n      satelliteListGroup.appendChild(satelliteListTitle);\n\n      const { group: satelliteSelectGroup, select: satelliteSelect } = createSelect({\n        label: 'Satellite',\n        value: '',\n        options: [{ label: 'No satellites in scene', value: '' }],\n        onChange: (val) => {\n          const entry = this._satelliteEntriesById.get(val) || null;\n          this._renderSatelliteDetails(entry);\n        },\n      });\n      satelliteSelect.disabled = true;\n      satelliteListGroup.appendChild(satelliteSelectGroup);\n\n      const { panel: satelliteDetailsPanel, metrics: satelliteDetailsMetrics } = this._createDetailPanel(\n        'No satellites in scene.'\n      );\n      satelliteListGroup.appendChild(satelliteDetailsPanel);\n\n      this._satelliteListSelect = satelliteSelect;\n      this._satelliteDetailsEl = satelliteDetailsMetrics;\n\n      content.appendChild(satelliteListGroup);\n      content.appendChild(createDivider());\n\n      const { group: providerGroup, select: providerSelect } = createSelect({\n        label: 'Provider',\n        value: currentProvider,\n        options: providerOptions,\n        onChange: (val) => {\n          currentProvider = val;\n          this._emitChange('satellitesProvider', val);\n          renderModeControls();\n        },\n      });\n      this._bindSettingSelect('scene.satellites.provider', providerSelect, currentProvider, {\n        onSync: (val) => {\n          if (currentProvider === val) return;\n          currentProvider = val;\n          renderModeControls();\n        }\n      });\n      content.appendChild(providerGroup);\n      content.appendChild(createDivider());\n\n      const modeContainer = document.createElement('div');\n      const controlsContainer = document.createElement('div');\n\n      const renderModeControls = () => {\n        modeContainer.innerHTML = '';\n        controlsContainer.innerHTML = '';\n\n        currentMode = String(this._getSettingValue('scene.satellites.queryMode', currentMode) || currentMode);\n        currentQueryValue = String(this._getSettingValue('scene.satellites.queryValue', currentQueryValue) || '');\n        currentConeAngle = this._resolveNumber(\n          this._getSettingValue('scene.satellites.coneAngleDeg', currentConeAngle),\n          currentConeAngle,\n          { min: 30, max: 180 }\n        );\n        currentMaxSatellites = this._resolveNumber(\n          this._getSettingValue('scene.satellites.maxSatellites', currentMaxSatellites),\n          currentMaxSatellites,\n          { min: 10, max: 1000 }\n        );\n\n        const modes = providerModes[currentProvider] || providerModes.satnogs;\n        if (!modes.find((m) => m.value === currentMode)) {\n          currentMode = modes[0].value;\n          this._emitChange('satellitesQueryMode', currentMode);\n        }\n\n        const { group: modeGroup, select: modeSelect } = createSelect({\n          label: 'Endpoint',\n          value: currentMode,\n          options: modes,\n          onChange: (val) => {\n            currentMode = val;\n            this._emitChange('satellitesQueryMode', val);\n            renderModeControls();\n          },\n        });\n        this._bindSettingSelect('scene.satellites.queryMode', modeSelect, currentMode, {\n          onSync: (val) => {\n            if (currentMode === val) return;\n            currentMode = val;\n            renderModeControls();\n          }\n        });\n        modeContainer.appendChild(modeGroup);\n\n        const needsQueryValue = currentProvider==='unified'||['group', 'id', 'name', 'search'].includes(currentMode);\n        if (needsQueryValue) {\n          const { group: queryGroup, input: queryInput } = createInput({\n            label: currentProvider==='unified'?'Search entire catalog':'Query Value',\n            placeholder: currentProvider==='unified'?'Name, NORAD or JCAT ID':currentMode === 'group' ? 'active' : '25544',\n            value: currentQueryValue,\n            onChange: (val) => {\n              currentQueryValue = val.trim();\n              this._emitChange('satellitesQueryValue', currentQueryValue);\n            },\n          });\n          this._bindSettingInput('scene.satellites.queryValue', queryInput, currentQueryValue, {\n            onSync: (val) => {\n              currentQueryValue = val;\n            }\n          });\n          queryInput.dataset.setting = 'satellitesQueryValue';\n          controlsContainer.appendChild(queryGroup);\n        }\n\n        const { group: coneGroup, range: coneRange, valueDisplay: coneValueDisplay } = createRangeSlider({\n          label: 'View Cone (deg)',\n          min: 30,\n          max: 180,\n          step: 1,\n          value: currentConeAngle,\n          onChange: (val) => {\n            currentConeAngle = val;\n            this._emitChange('satellitesConeAngle', val);\n          },\n        });\n        this._bindSettingRange('scene.satellites.coneAngleDeg', coneRange, currentConeAngle, {\n          valueDisplay: coneValueDisplay,\n          onSync: (val) => {\n            currentConeAngle = val;\n          }\n        });\n        coneRange.dataset.setting = 'satellitesConeAngle';\n        if(currentProvider!=='unified')controlsContainer.appendChild(coneGroup);\n\n        const { group: maxGroup, range: maxRange, valueDisplay: maxValueDisplay } = createRangeSlider({\n          label: 'Max Satellites',\n          min: 10,\n          max: 1000,\n          step: 10,\n          value: currentMaxSatellites,\n          onChange: (val) => {\n            currentMaxSatellites = val;\n            this._emitChange('satellitesMaxSatellites', val);\n          },\n        });\n        this._bindSettingRange('scene.satellites.maxSatellites', maxRange, currentMaxSatellites, {\n          valueDisplay: maxValueDisplay,\n          onSync: (val) => {\n            currentMaxSatellites = val;\n          }\n        });\n        maxRange.dataset.setting = 'satellitesMaxSatellites';\n        if(currentProvider!=='unified')controlsContainer.appendChild(maxGroup);\n      };\n\n      renderModeControls();\n      content.appendChild(modeContainer);\n      content.appendChild(controlsContainer);\n      content.appendChild(createDivider());\n\n      const { group: pollGroup, range: pollRange, valueDisplay: pollValueDisplay } = createRangeSlider({\n        label: 'Poll Interval (ms)',\n        min: 60000,\n        max: 3600000,\n        step: 60000,\n        value: pollIntervalValue,\n        onChange: (val) => this._emitChange('satellitesPollInterval', val),\n      });\n      this._bindSettingRange('scene.satellites.pollIntervalMs', pollRange, pollIntervalValue, { valueDisplay: pollValueDisplay });\n      pollRange.dataset.setting = 'satellitesPollInterval';\n      content.appendChild(pollGroup);\n\n      const { group: staleGroup, range: staleRange, valueDisplay: staleValueDisplay } = createRangeSlider({\n        label: 'Stale After (ms)',\n        min: 60000,\n        max: 172800000,\n        step: 60000,\n        value: staleAfterValue,\n        onChange: (val) => this._emitChange('satellitesStaleMs', val),\n      });\n      this._bindSettingRange('scene.satellites.staleAfterMs', staleRange, staleAfterValue, { valueDisplay: staleValueDisplay });\n      staleRange.dataset.setting = 'satellitesStaleMs';\n      content.appendChild(staleGroup);\n\n      content.appendChild(createDivider());\n\n      const { group: modelScaleGroup, range: modelScaleRange, valueDisplay: modelScaleValueDisplay } = createRangeSlider({\n        label: 'Marker Scale',\n        min: 10,\n        max: 2000,\n        step: 10,\n        value: modelScaleValue,\n        onChange: (val) => this._emitChange('satellitesModelScale', val),\n      });\n      this._bindSettingRange('scene.satellites.modelScale', modelScaleRange, modelScaleValue, { valueDisplay: modelScaleValueDisplay });\n      modelScaleRange.dataset.setting = 'satellitesModelScale';\n      content.appendChild(modelScaleGroup);\n\n      const { group: altitudeGroup, range: altitudeRange, valueDisplay: altitudeValueDisplay } = createRangeSlider({\n        label: 'Altitude Offset (m)',\n        min: -10000,\n        max: 100000,\n        step: 50,\n        value: altitudeOffsetValue,\n        onChange: (val) => this._emitChange('satellitesAltitudeOffset', val),\n      });\n      this._bindSettingRange('scene.satellites.altitudeOffsetM', altitudeRange, altitudeOffsetValue, { valueDisplay: altitudeValueDisplay });\n      altitudeRange.dataset.setting = 'satellitesAltitudeOffset';\n      content.appendChild(altitudeGroup);\n\n      content.appendChild(createDivider());\n\n      const { wrapper: orbitToggle, input: showOrbitsInput } = createToggle('Show Orbits', showOrbitsValue, (checked) => {\n        this._emitChange('satellitesShowOrbits', checked);\n      });\n      this._bindSettingToggle('scene.satellites.showOrbits', showOrbitsInput, true);\n      content.appendChild(orbitToggle);\n\n      const { group: orbitSamplesGroup, range: orbitSamplesRange, valueDisplay: orbitSamplesValueDisplay } = createRangeSlider({\n        label: 'Orbit Samples',\n        min: 32,\n        max: 360,\n        step: 8,\n        value: orbitSamplesValue,\n        onChange: (val) => this._emitChange('satellitesOrbitSamples', val),\n      });\n      this._bindSettingRange('scene.satellites.orbitSamples', orbitSamplesRange, orbitSamplesValue, { valueDisplay: orbitSamplesValueDisplay });\n      orbitSamplesRange.dataset.setting = 'satellitesOrbitSamples';\n      content.appendChild(orbitSamplesGroup);\n\n      const { group: orbitWindowGroup, range: orbitWindowRange, valueDisplay: orbitWindowValueDisplay } = createRangeSlider({\n        label: 'Orbit Window (min)',\n        min: 10,\n        max: 240,\n        step: 5,\n        value: orbitWindowValue,\n        onChange: (val) => this._emitChange('satellitesOrbitWindow', val),\n      });\n      this._bindSettingRange('scene.satellites.orbitWindowMinutes', orbitWindowRange, orbitWindowValue, { valueDisplay: orbitWindowValueDisplay });\n      orbitWindowRange.dataset.setting = 'satellitesOrbitWindow';\n      content.appendChild(orbitWindowGroup);\n\n      return content;\n    }, {\n      getValue: () => this._getSettingValue('scene.satellites.enabled', false) !== false,\n      setValue: (val) => this._applyScenePatch(buildLabelCategoryControlPatch('satellites', val))\n    });\n\n    // Maritime Section\n    this._addSection(container, 'maritime', 'Maritime', false, () => {\n      const content = document.createElement('div');\n      const maritimeEnabled = this._getSettingValue('scene.maritime.enabled', false) === true;\n      const providerValue = String(this._getSettingValue('scene.maritime.provider', 'digitraffic') || 'digitraffic');\n      const queryModeValue = String(this._getSettingValue('scene.maritime.queryMode', 'latest') || 'latest');\n      const queryValue = String(this._getSettingValue('scene.maritime.queryValue', '') || '');\n      const radiusNmValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.radiusNm', 80),\n        80,\n        { min: 1, max: 250 }\n      );\n      const coneAngleValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.coneAngleDeg', 180),\n        180,\n        { min: 60, max: 180 }\n      );\n      const maxVesselsValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.maxVessels', 200),\n        200,\n        { min: 10, max: 1000 }\n      );\n      const pollIntervalValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.pollIntervalMs', 60000),\n        60000,\n        { min: 5000, max: 300000 }\n      );\n      const staleAfterValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.staleAfterMs', 600000),\n        600000,\n        { min: 10000, max: 3600000 }\n      );\n      const predictionValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.predictionMaxMs', 60000),\n        60000,\n        { min: 0, max: 300000 }\n      );\n      const lookbackMinutesValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.lookbackMinutes', 30),\n        30,\n        { min: 5, max: 360 }\n      );\n      const modelScaleValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.modelScale', 1),\n        1,\n        { min: 0.1, max: 10 }\n      );\n      const headingOffsetValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.headingOffsetDeg', 0),\n        0,\n        { min: -180, max: 180 }\n      );\n      const altitudeOffsetValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.altitudeOffsetM', 0),\n        0,\n        { min: -50, max: 200 }\n      );\n      const smoothingValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.smoothingMs', 1500),\n        1500,\n        { min: 0, max: 5000 }\n      );\n      const showPathsValue = this._getSettingValue('scene.maritime.showPaths', false) === true;\n      const pathHoursValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.pathHours', 24),\n        24,\n        { min: 1, max: 24 }\n      );\n      const pathMaxPointsValue = this._resolveNumber(\n        this._getSettingValue('scene.maritime.pathMaxPoints', 120),\n        120,\n        { min: 10, max: 1000 }\n      );\n\n      const providerOptions = [\n        { label: 'NOAA ERDDAP AIS (US)', value: 'noaa_erddap' },\n        { label: 'NOAA NAIS Daily ZIP (US)', value: 'noaa_nais' },\n        { label: 'Digitraffic (Finland AIS)', value: 'digitraffic' },\n        { label: 'Kystdatahuset (Norway AIS)', value: 'kystdatahuset' },\n        { label: 'Marinesia (MMSI lookup)', value: 'marinesia' },\n      ];\n\n      const providerModes = {\n        noaa_erddap: [\n          { label: 'BBox (ERDDAP)', value: 'bbox' },\n        ],\n        noaa_nais: [\n          { label: 'BBox (Daily ZIP)', value: 'bbox' },\n        ],\n        digitraffic: [\n          { label: 'Latest (regional)', value: 'latest' },\n        ],\n        kystdatahuset: [\n          { label: 'BBox (Time Window)', value: 'bbox' },\n          { label: 'MMSI (Time Window)', value: 'mmsi' },\n        ],\n        marinesia: [\n          { label: 'MMSI (Single/List)', value: 'mmsi' },\n        ],\n      };\n\n      let currentProvider = providerValue;\n      let currentMode = queryModeValue;\n      let currentQueryValue = queryValue;\n      let currentRadiusNm = radiusNmValue;\n      let currentConeAngle = coneAngleValue;\n      let currentMaxVessels = maxVesselsValue;\n\n      const { wrapper: enabledToggle, input: maritimeEnabledInput } = createToggle('Enable Maritime', maritimeEnabled, (checked) => {\n        this._emitChange('maritimeEnabled', checked);\n      });\n      this._bindSettingToggle('scene.maritime.enabled', maritimeEnabledInput, false);\n      content.appendChild(enabledToggle);\n\n      const note = document.createElement('div');\n      note.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin: 8px 0;';\n      note.textContent = 'AIS feeds are fetched server-side and cached for all users.';\n      content.appendChild(note);\n\n      const vesselListGroup = document.createElement('div');\n      vesselListGroup.className = 'config-group';\n\n      const vesselListTitle = document.createElement('div');\n      vesselListTitle.className = 'config-group-title';\n      vesselListTitle.textContent = 'Tracked Vessels';\n      vesselListGroup.appendChild(vesselListTitle);\n\n      const { group: vesselSelectGroup, select: vesselSelect } = createSelect({\n        label: 'Vessel',\n        value: '',\n        options: [{ label: 'No vessels in scene', value: '' }],\n        onChange: (val) => {\n          const entry = this._maritimeEntriesById.get(val) || null;\n          this._renderMaritimeDetails(entry);\n        },\n      });\n      vesselSelect.disabled = true;\n      vesselListGroup.appendChild(vesselSelectGroup);\n\n      const { panel: vesselDetailsPanel, metrics: vesselDetailsMetrics } = this._createDetailPanel(\n        'No vessels in scene.'\n      );\n      vesselListGroup.appendChild(vesselDetailsPanel);\n\n      this._maritimeListSelect = vesselSelect;\n      this._maritimeDetailsEl = vesselDetailsMetrics;\n\n      content.appendChild(vesselListGroup);\n      content.appendChild(createDivider());\n\n      const { group: providerGroup, select: providerSelect } = createSelect({\n        label: 'Provider',\n        value: currentProvider,\n        options: providerOptions,\n        onChange: (val) => {\n          currentProvider = val;\n          this._emitChange('maritimeProvider', val);\n          renderModeControls();\n        },\n      });\n      this._bindSettingSelect('scene.maritime.provider', providerSelect, currentProvider, {\n        onSync: (val) => {\n          if (currentProvider === val) return;\n          currentProvider = val;\n          renderModeControls();\n        }\n      });\n      content.appendChild(providerGroup);\n      content.appendChild(createDivider());\n\n      const modeContainer = document.createElement('div');\n      const controlsContainer = document.createElement('div');\n\n      const renderModeControls = () => {\n        modeContainer.innerHTML = '';\n        controlsContainer.innerHTML = '';\n\n        currentMode = String(this._getSettingValue('scene.maritime.queryMode', currentMode) || currentMode);\n        currentQueryValue = String(this._getSettingValue('scene.maritime.queryValue', currentQueryValue) || '');\n        currentRadiusNm = this._resolveNumber(\n          this._getSettingValue('scene.maritime.radiusNm', currentRadiusNm),\n          currentRadiusNm,\n          { min: 1, max: 250 }\n        );\n        currentConeAngle = this._resolveNumber(\n          this._getSettingValue('scene.maritime.coneAngleDeg', currentConeAngle),\n          currentConeAngle,\n          { min: 60, max: 180 }\n        );\n        currentMaxVessels = this._resolveNumber(\n          this._getSettingValue('scene.maritime.maxVessels', currentMaxVessels),\n          currentMaxVessels,\n          { min: 10, max: 1000 }\n        );\n\n        const modes = providerModes[currentProvider] || providerModes.digitraffic;\n        if (!modes.find((m) => m.value === currentMode)) {\n          currentMode = modes[0].value;\n          this._emitChange('maritimeQueryMode', currentMode);\n        }\n\n        const { group: modeGroup, select: modeSelect } = createSelect({\n          label: 'Endpoint',\n          value: currentMode,\n          options: modes,\n          onChange: (val) => {\n            currentMode = val;\n            this._emitChange('maritimeQueryMode', val);\n            renderModeControls();\n          },\n        });\n        this._bindSettingSelect('scene.maritime.queryMode', modeSelect, currentMode, {\n          onSync: (val) => {\n            if (currentMode === val) return;\n            currentMode = val;\n            renderModeControls();\n          }\n        });\n        modeContainer.appendChild(modeGroup);\n\n        let needsQueryValue = ['mmsi'].includes(currentMode);\n        let queryLabel = 'MMSI List';\n        let queryPlaceholder = '258500000, 367123456';\n        if (!needsQueryValue && currentProvider === 'noaa_nais') {\n          needsQueryValue = true;\n          queryLabel = 'Date (YYYY-MM-DD)';\n          queryPlaceholder = '2024-06-01';\n        } else if (!needsQueryValue && currentProvider === 'noaa_erddap') {\n          needsQueryValue = true;\n          queryLabel = 'Dataset (AIS2024_AIS or year)';\n          queryPlaceholder = 'AIS2024_AIS';\n        }\n        if (needsQueryValue) {\n          const { group: queryGroup, input: queryInput } = createInput({\n            label: queryLabel,\n            placeholder: queryPlaceholder,\n            value: currentQueryValue,\n            onChange: (val) => {\n              currentQueryValue = val.trim();\n              this._emitChange('maritimeQueryValue', currentQueryValue);\n            },\n          });\n          this._bindSettingInput('scene.maritime.queryValue', queryInput, currentQueryValue, {\n            onSync: (val) => {\n              currentQueryValue = val;\n            }\n          });\n          queryInput.dataset.setting = 'maritimeQueryValue';\n          controlsContainer.appendChild(queryGroup);\n        }\n\n        const usesRadius = ['bbox', 'latest'].includes(currentMode);\n        if (usesRadius) {\n          const { group: radiusGroup, range: radiusRange, valueDisplay: radiusValueDisplay } = createRangeSlider({\n            label: 'Radius (nm)',\n            min: 1,\n            max: 250,\n            step: 1,\n            value: currentRadiusNm,\n            onChange: (val) => {\n              currentRadiusNm = val;\n              this._emitChange('maritimeRadiusNm', val);\n            },\n          });\n          this._bindSettingRange('scene.maritime.radiusNm', radiusRange, currentRadiusNm, {\n            valueDisplay: radiusValueDisplay,\n            onSync: (val) => {\n              currentRadiusNm = val;\n            }\n          });\n          radiusRange.dataset.setting = 'maritimeRadiusNm';\n          controlsContainer.appendChild(radiusGroup);\n        }\n\n        if (currentProvider === 'kystdatahuset') {\n          const { group: lookbackGroup, range: lookbackRange, valueDisplay: lookbackValueDisplay } = createRangeSlider({\n            label: 'Lookback (min)',\n            min: 5,\n            max: 360,\n            step: 5,\n            value: lookbackMinutesValue,\n            onChange: (val) => this._emitChange('maritimeLookbackMinutes', val),\n          });\n          this._bindSettingRange('scene.maritime.lookbackMinutes', lookbackRange, lookbackMinutesValue, { valueDisplay: lookbackValueDisplay });\n          lookbackRange.dataset.setting = 'maritimeLookbackMinutes';\n          controlsContainer.appendChild(lookbackGroup);\n        }\n\n        const { group: coneGroup, range: coneRange, valueDisplay: coneValueDisplay } = createRangeSlider({\n          label: 'View Cone (deg)',\n          min: 60,\n          max: 180,\n          step: 1,\n          value: currentConeAngle,\n          onChange: (val) => {\n            currentConeAngle = val;\n            this._emitChange('maritimeConeAngle', val);\n          },\n        });\n        this._bindSettingRange('scene.maritime.coneAngleDeg', coneRange, currentConeAngle, {\n          valueDisplay: coneValueDisplay,\n          onSync: (val) => {\n            currentConeAngle = val;\n          }\n        });\n        coneRange.dataset.setting = 'maritimeConeAngle';\n        controlsContainer.appendChild(coneGroup);\n\n        const { group: maxGroup, range: maxRange, valueDisplay: maxValueDisplay } = createRangeSlider({\n          label: 'Max Vessels',\n          min: 10,\n          max: 1000,\n          step: 10,\n          value: currentMaxVessels,\n          onChange: (val) => {\n            currentMaxVessels = val;\n            this._emitChange('maritimeMaxVessels', val);\n          },\n        });\n        this._bindSettingRange('scene.maritime.maxVessels', maxRange, currentMaxVessels, {\n          valueDisplay: maxValueDisplay,\n          onSync: (val) => {\n            currentMaxVessels = val;\n          }\n        });\n        maxRange.dataset.setting = 'maritimeMaxVessels';\n        controlsContainer.appendChild(maxGroup);\n      };\n\n      renderModeControls();\n      content.appendChild(modeContainer);\n      content.appendChild(controlsContainer);\n      content.appendChild(createDivider());\n\n      const { group: pollGroup, range: pollRange, valueDisplay: pollValueDisplay } = createRangeSlider({\n        label: 'Poll Interval (ms)',\n        min: 5000,\n        max: 300000,\n        step: 5000,\n        value: pollIntervalValue,\n        onChange: (val) => this._emitChange('maritimePollInterval', val),\n      });\n      this._bindSettingRange('scene.maritime.pollIntervalMs', pollRange, pollIntervalValue, { valueDisplay: pollValueDisplay });\n      pollRange.dataset.setting = 'maritimePollInterval';\n      content.appendChild(pollGroup);\n\n      const { group: staleGroup, range: staleRange, valueDisplay: staleValueDisplay } = createRangeSlider({\n        label: 'Stale After (ms)',\n        min: 10000,\n        max: 3600000,\n        step: 10000,\n        value: staleAfterValue,\n        onChange: (val) => this._emitChange('maritimeStaleMs', val),\n      });\n      this._bindSettingRange('scene.maritime.staleAfterMs', staleRange, staleAfterValue, { valueDisplay: staleValueDisplay });\n      staleRange.dataset.setting = 'maritimeStaleMs';\n      content.appendChild(staleGroup);\n\n      const { group: predictGroup, range: predictRange, valueDisplay: predictValueDisplay } = createRangeSlider({\n        label: 'Prediction Max (ms)',\n        min: 0,\n        max: 300000,\n        step: 5000,\n        value: predictionValue,\n        onChange: (val) => this._emitChange('maritimePredictionMs', val),\n      });\n      this._bindSettingRange('scene.maritime.predictionMaxMs', predictRange, predictionValue, { valueDisplay: predictValueDisplay });\n      predictRange.dataset.setting = 'maritimePredictionMs';\n      content.appendChild(predictGroup);\n\n      content.appendChild(createDivider());\n\n      const { group: scaleGroup, range: scaleRange, valueDisplay: scaleValueDisplay } = createRangeSlider({\n        label: 'Marker Scale',\n        min: 0.1,\n        max: 10,\n        step: 0.1,\n        value: modelScaleValue,\n        onChange: (val) => this._emitChange('maritimeModelScale', val),\n      });\n      this._bindSettingRange('scene.maritime.modelScale', scaleRange, modelScaleValue, { valueDisplay: scaleValueDisplay });\n      scaleRange.dataset.setting = 'maritimeModelScale';\n      content.appendChild(scaleGroup);\n\n      const { group: headingGroup, range: headingRange, valueDisplay: headingValueDisplay } = createRangeSlider({\n        label: 'Heading Offset (deg)',\n        min: -180,\n        max: 180,\n        step: 1,\n        value: headingOffsetValue,\n        onChange: (val) => this._emitChange('maritimeHeadingOffset', val),\n      });\n      this._bindSettingRange('scene.maritime.headingOffsetDeg', headingRange, headingOffsetValue, { valueDisplay: headingValueDisplay });\n      headingRange.dataset.setting = 'maritimeHeadingOffset';\n      content.appendChild(headingGroup);\n\n      const { group: altitudeGroup, range: altitudeRange, valueDisplay: altitudeValueDisplay } = createRangeSlider({\n        label: 'Altitude Offset (m)',\n        min: -50,\n        max: 200,\n        step: 1,\n        value: altitudeOffsetValue,\n        onChange: (val) => this._emitChange('maritimeAltitudeOffset', val),\n      });\n      this._bindSettingRange('scene.maritime.altitudeOffsetM', altitudeRange, altitudeOffsetValue, { valueDisplay: altitudeValueDisplay });\n      altitudeRange.dataset.setting = 'maritimeAltitudeOffset';\n      content.appendChild(altitudeGroup);\n\n      const { group: smoothingGroup, range: smoothingRange, valueDisplay: smoothingValueDisplay } = createRangeSlider({\n        label: 'Smoothing (ms)',\n        min: 0,\n        max: 5000,\n        step: 100,\n        value: smoothingValue,\n        onChange: (val) => this._emitChange('maritimeSmoothingMs', val),\n      });\n      this._bindSettingRange('scene.maritime.smoothingMs', smoothingRange, smoothingValue, { valueDisplay: smoothingValueDisplay });\n      smoothingRange.dataset.setting = 'maritimeSmoothingMs';\n      content.appendChild(smoothingGroup);\n\n      content.appendChild(createDivider());\n\n      const { wrapper: pathToggle, input: maritimePathsInput } = createToggle('Show Vessel Paths', showPathsValue, (checked) => {\n        this._emitChange('maritimeShowPaths', checked);\n      });\n      this._bindSettingToggle('scene.maritime.showPaths', maritimePathsInput, false);\n      content.appendChild(pathToggle);\n\n      const { group: pathHoursGroup, range: pathHoursRange, valueDisplay: pathHoursValueDisplay } = createRangeSlider({\n        label: 'Path Window (hrs)',\n        min: 1,\n        max: 24,\n        step: 1,\n        value: pathHoursValue,\n        onChange: (val) => this._emitChange('maritimePathHours', val),\n      });\n      this._bindSettingRange('scene.maritime.pathHours', pathHoursRange, pathHoursValue, { valueDisplay: pathHoursValueDisplay });\n      pathHoursRange.dataset.setting = 'maritimePathHours';\n      content.appendChild(pathHoursGroup);\n\n      const { group: pathPointsGroup, range: pathPointsRange, valueDisplay: pathPointsValueDisplay } = createRangeSlider({\n        label: 'Path Points',\n        min: 10,\n        max: 256,\n        step: 10,\n        value: pathMaxPointsValue,\n        onChange: (val) => this._emitChange('maritimePathMaxPoints', val),\n      });\n      this._bindSettingRange('scene.maritime.pathMaxPoints', pathPointsRange, pathMaxPointsValue, { valueDisplay: pathPointsValueDisplay });\n      pathPointsRange.dataset.setting = 'maritimePathMaxPoints';\n      content.appendChild(pathPointsGroup);\n\n      return content;\n    }, {\n      getValue: () => this._getSettingValue('scene.maritime.enabled', false) === true,\n      setValue: (val) => this._applyScenePatch(buildLabelCategoryControlPatch('maritime', val))\n    });\n\n    // Incidents Section\n    this._addSection(container, 'incidents', 'Incidents', false, () => {\n      const content = document.createElement('div');\n      const incidentsEnabled = this._getSettingValue('scene.incidents.enabled', false) === true;\n      const radiusMValue = this._resolveNumber(\n        this._getSettingValue('scene.incidents.radiusM', 150000),\n        150000,\n        { min: 5000, max: 500000 }\n      );\n      const maxIncidentsValue = this._resolveNumber(\n        this._getSettingValue('scene.incidents.maxIncidents', 200),\n        200,\n        { min: 10, max: 1000 }\n      );\n      const pollIntervalValue = this._resolveNumber(\n        this._getSettingValue('scene.incidents.pollIntervalMs', 60000),\n        60000,\n        { min: 5000, max: 300000 }\n      );\n      const spireHeightValue = this._resolveNumber(\n        this._getSettingValue(\n          'scene.incidents.spireHeightM',\n          this._getSettingValue('scene.incidents.markerScaleM', 60)\n        ),\n        60,\n        { min: 5, max: 300 }\n      );\n      const spireRadiusValue = this._resolveNumber(\n        this._getSettingValue('scene.incidents.spireRadiusM', 4),\n        4,\n        { min: 0.5, max: 40 }\n      );\n      const labelScaleFallback = Math.max(1, spireHeightValue * 0.2);\n      const labelScaleValue = this._resolveNumber(\n        this._getSettingValue('scene.incidents.labelScaleM', labelScaleFallback),\n        labelScaleFallback,\n        { min: 1, max: 100 }\n      );\n      const includeRecentValue = this._getSettingValue('scene.incidents.includeRecent', false) === true;\n      const includeAlertsValue = this._getSettingValue('scene.incidents.includeAlerts', false) === true;\n      const publicOnlyValue = this._getSettingValue('scene.incidents.publicOnly', false) === true;\n      const hideMedicalValue = this._getSettingValue('scene.incidents.hideMedical', false) === true;\n      const showLabelsValue = this._getSettingValue('scene.incidents.showLabels', true) === true;\n      const labelViewConeValue = this._resolveNumber(\n        this._getSettingValue('scene.incidents.labelViewConeDeg', 60),\n        60,\n        { min: 5, max: 180 }\n      );\n      const autoZipEnabledValue = this._getSettingValue('scene.incidents.autoZipEnabled', true) !== false;\n      const agencyIds = this._getIncidentAgencyIds();\n\n      const { wrapper: enabledToggle, input: incidentsEnabledInput } = createToggle('Enable Incidents', incidentsEnabled, (checked) => {\n        this._emitChange('incidentsEnabled', checked);\n      });\n      this._bindSettingToggle('scene.incidents.enabled', incidentsEnabledInput, false);\n      content.appendChild(enabledToggle);\n\n      const { wrapper: autoToggle, input: autoZipInput } = createToggle('Auto Detect Agencies (ZIP)', autoZipEnabledValue, (checked) => {\n        this._emitChange('incidentsAutoZip', checked);\n        this._setIncidentAutoEnabled(checked);\n      });\n      this._bindSettingToggle('scene.incidents.autoZipEnabled', autoZipInput, true, (checked) => {\n        this._setIncidentAutoEnabled(checked);\n      });\n      content.appendChild(autoToggle);\n\n      const note = document.createElement('div');\n      note.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin: 8px 0;';\n      note.textContent = 'Search and select PulsePoint agencies to show incident markers.';\n      content.appendChild(note);\n\n      this._setIncidentAutoEnabled(autoZipEnabledValue);\n\n      const incidentListGroup = document.createElement('div');\n      incidentListGroup.className = 'config-group';\n\n      const incidentListTitle = document.createElement('div');\n      incidentListTitle.className = 'config-group-title';\n      incidentListTitle.textContent = 'Tracked Incidents';\n      incidentListGroup.appendChild(incidentListTitle);\n\n      const { group: incidentSelectGroup, select: incidentSelect } = createSelect({\n        label: 'Incident',\n        value: '',\n        options: [{ label: 'No incidents in scene', value: '' }],\n        onChange: (val) => {\n          const entry = this._incidentEntriesById.get(val) || null;\n          this._renderIncidentDetails(entry);\n        },\n      });\n      incidentSelect.disabled = true;\n      incidentListGroup.appendChild(incidentSelectGroup);\n\n      const { panel: incidentDetailsPanel, metrics: incidentDetailsMetrics } = this._createDetailPanel(\n        'No incidents in scene.'\n      );\n      incidentListGroup.appendChild(incidentDetailsPanel);\n\n      this._incidentListSelect = incidentSelect;\n      this._incidentDetailsEl = incidentDetailsMetrics;\n\n      content.appendChild(incidentListGroup);\n\n      const incidentRecentGroup = document.createElement('div');\n      incidentRecentGroup.className = 'config-group';\n\n      const incidentRecentTitle = document.createElement('div');\n      incidentRecentTitle.className = 'config-group-title';\n      incidentRecentTitle.textContent = 'Recent Incidents';\n      incidentRecentGroup.appendChild(incidentRecentTitle);\n\n      const incidentRecentList = document.createElement('div');\n      incidentRecentList.style.cssText = 'display: grid; gap: 6px;';\n      this._incidentRecentList = incidentRecentList;\n      incidentRecentGroup.appendChild(incidentRecentList);\n      this._renderIncidentRecentList([]);\n\n      content.appendChild(incidentRecentGroup);\n      content.appendChild(createDivider());\n\n      const agencyGroup = document.createElement('div');\n      agencyGroup.className = 'config-group';\n\n      const agencyTitle = document.createElement('div');\n      agencyTitle.className = 'config-group-title';\n      agencyTitle.textContent = 'Agency Discovery';\n      agencyGroup.appendChild(agencyTitle);\n\n      const searchRow = document.createElement('div');\n      searchRow.style.cssText = 'display: flex; gap: 8px; align-items: flex-end;';\n\n      const { group: searchGroup, input: searchInput } = createInput({\n        label: 'Search',\n        placeholder: 'Agency, city, or ZIP',\n        value: '',\n      });\n      searchGroup.style.flex = '1';\n      searchInput.addEventListener('keydown', (e) => {\n        if (e.key === 'Enter') {\n          e.preventDefault();\n          this._searchIncidentAgencies(searchInput.value);\n        }\n      });\n      this._incidentSearchInput = searchInput;\n\n      const searchBtn = createButton('Search', {\n        variant: 'secondary',\n        size: 'sm',\n        onClick: () => this._searchIncidentAgencies(searchInput.value),\n      });\n      searchBtn.style.cssText += 'min-width: 64px; height: 32px;';\n\n      searchRow.appendChild(searchGroup);\n      searchRow.appendChild(searchBtn);\n      agencyGroup.appendChild(searchRow);\n\n      const results = document.createElement('div');\n      results.style.cssText = 'margin-top: 8px; display: grid; gap: 6px; max-height: 160px; overflow-y: auto;';\n      this._incidentSearchResults = results;\n      agencyGroup.appendChild(results);\n      this._setIncidentSearchMessage('Search to discover agencies.');\n\n      const selectedTitle = document.createElement('div');\n      selectedTitle.className = 'config-group-title';\n      selectedTitle.textContent = 'Selected Agencies';\n      selectedTitle.style.marginTop = '12px';\n      agencyGroup.appendChild(selectedTitle);\n\n      const selectedList = document.createElement('div');\n      selectedList.style.cssText = 'display: grid; gap: 6px;';\n      this._incidentSelectedList = selectedList;\n      agencyGroup.appendChild(selectedList);\n\n      this._renderIncidentSelectedAgencies(agencyIds);\n      this._requestIncidentAgencyDetails(agencyIds);\n\n      content.appendChild(agencyGroup);\n      content.appendChild(createDivider());\n\n      const { wrapper: recentToggle, input: includeRecentInput } = createToggle('Include Recent', includeRecentValue, (checked) => {\n        this._emitChange('incidentsIncludeRecent', checked);\n      });\n      this._bindSettingToggle('scene.incidents.includeRecent', includeRecentInput, false);\n      content.appendChild(recentToggle);\n\n      const { wrapper: alertsToggle, input: includeAlertsInput } = createToggle('Include Alerts', includeAlertsValue, (checked) => {\n        this._emitChange('incidentsIncludeAlerts', checked);\n      });\n      this._bindSettingToggle('scene.incidents.includeAlerts', includeAlertsInput, false);\n      content.appendChild(alertsToggle);\n\n      const { wrapper: publicToggle, input: publicOnlyInput } = createToggle('Public Only', publicOnlyValue, (checked) => {\n        this._emitChange('incidentsPublicOnly', checked);\n      });\n      this._bindSettingToggle('scene.incidents.publicOnly', publicOnlyInput, false);\n      content.appendChild(publicToggle);\n\n      const { wrapper: medicalToggle, input: hideMedicalInput } = createToggle('Hide Medical Calls', hideMedicalValue, (checked) => {\n        this._emitChange('incidentsHideMedical', checked);\n      });\n      this._bindSettingToggle('scene.incidents.hideMedical', hideMedicalInput, false);\n      content.appendChild(medicalToggle);\n\n      let labelConeRange = null;\n      let labelScaleRange = null;\n      const { wrapper: labelToggle, input: showLabelsInput } = createToggle('Show Labels', showLabelsValue, (checked) => {\n        this._emitChange('incidentsShowLabels', checked);\n        if (labelConeRange) labelConeRange.disabled = !checked;\n        if (labelScaleRange) labelScaleRange.disabled = !checked;\n      });\n      this._bindSettingToggle('scene.incidents.showLabels', showLabelsInput, true, (checked) => {\n        if (labelConeRange) labelConeRange.disabled = !checked;\n        if (labelScaleRange) labelScaleRange.disabled = !checked;\n      });\n      content.appendChild(labelToggle);\n\n      const { group: labelConeGroup, range: labelConeRangeInput, valueDisplay: labelConeValueDisplay } = createRangeSlider({\n        label: 'Label View Cone (deg)',\n        min: 5,\n        max: 180,\n        step: 1,\n        value: labelViewConeValue,\n        onChange: (val) => this._emitChange('incidentsLabelCone', val),\n      });\n      this._bindSettingRange('scene.incidents.labelViewConeDeg', labelConeRangeInput, labelViewConeValue, {\n        valueDisplay: labelConeValueDisplay\n      });\n      labelConeRangeInput.dataset.setting = 'incidentsLabelCone';\n      labelConeRangeInput.disabled = !showLabelsValue;\n      labelConeRange = labelConeRangeInput;\n      content.appendChild(labelConeGroup);\n\n      const { group: labelScaleGroup, range: labelScaleRangeInput, valueDisplay: labelScaleValueDisplay } = createRangeSlider({\n        label: 'Label Size (m)',\n        min: 1,\n        max: 100,\n        step: 1,\n        value: labelScaleValue,\n        onChange: (val) => this._emitChange('incidentsLabelScale', val),\n      });\n      this._bindSettingRange('scene.incidents.labelScaleM', labelScaleRangeInput, labelScaleValue, {\n        valueDisplay: labelScaleValueDisplay\n      });\n      labelScaleRangeInput.dataset.setting = 'incidentsLabelScale';\n      labelScaleRangeInput.disabled = !showLabelsValue;\n      labelScaleRange = labelScaleRangeInput;\n      content.appendChild(labelScaleGroup);\n\n      content.appendChild(createDivider());\n\n      const { group: radiusGroup, range: radiusRange, valueDisplay: radiusValueDisplay } = createRangeSlider({\n        label: 'Radius (m)',\n        min: 5000,\n        max: 500000,\n        step: 5000,\n        value: radiusMValue,\n        onChange: (val) => this._emitChange('incidentsRadius', val),\n      });\n      this._bindSettingRange('scene.incidents.radiusM', radiusRange, radiusMValue, { valueDisplay: radiusValueDisplay });\n      radiusRange.dataset.setting = 'incidentsRadius';\n      content.appendChild(radiusGroup);\n\n      const { group: maxGroup, range: maxRange, valueDisplay: maxValueDisplay } = createRangeSlider({\n        label: 'Max Incidents',\n        min: 10,\n        max: 1000,\n        step: 10,\n        value: maxIncidentsValue,\n        onChange: (val) => this._emitChange('incidentsMax', val),\n      });\n      this._bindSettingRange('scene.incidents.maxIncidents', maxRange, maxIncidentsValue, { valueDisplay: maxValueDisplay });\n      maxRange.dataset.setting = 'incidentsMax';\n      content.appendChild(maxGroup);\n\n      const { group: pollGroup, range: pollRange, valueDisplay: pollValueDisplay } = createRangeSlider({\n        label: 'Poll Interval (ms)',\n        min: 5000,\n        max: 300000,\n        step: 5000,\n        value: pollIntervalValue,\n        onChange: (val) => this._emitChange('incidentsPollInterval', val),\n      });\n      this._bindSettingRange('scene.incidents.pollIntervalMs', pollRange, pollIntervalValue, { valueDisplay: pollValueDisplay });\n      pollRange.dataset.setting = 'incidentsPollInterval';\n      content.appendChild(pollGroup);\n\n      const { group: heightGroup, range: heightRange, valueDisplay: heightValueDisplay } = createRangeSlider({\n        label: 'Spire Height (m)',\n        min: 5,\n        max: 300,\n        step: 1,\n        value: spireHeightValue,\n        onChange: (val) => this._emitChange('incidentsSpireHeight', val),\n      });\n      this._bindSettingRange('scene.incidents.spireHeightM', heightRange, null, {\n        valueDisplay: heightValueDisplay,\n        transform: (val) => {\n          if (Number.isFinite(val)) return val;\n          const legacy = this._getSettingValue('scene.incidents.markerScaleM', spireHeightValue);\n          return Number.isFinite(legacy) ? legacy : spireHeightValue;\n        }\n      });\n      heightRange.dataset.setting = 'incidentsSpireHeight';\n      content.appendChild(heightGroup);\n\n      const { group: spireRadiusGroup, range: spireRadiusRange, valueDisplay: spireRadiusValueDisplay } = createRangeSlider({\n        label: 'Spire Radius (m)',\n        min: 0.5,\n        max: 40,\n        step: 0.5,\n        value: spireRadiusValue,\n        onChange: (val) => this._emitChange('incidentsSpireRadius', val),\n      });\n      this._bindSettingRange('scene.incidents.spireRadiusM', spireRadiusRange, spireRadiusValue, { valueDisplay: spireRadiusValueDisplay });\n      spireRadiusRange.dataset.setting = 'incidentsSpireRadius';\n      content.appendChild(spireRadiusGroup);\n\n      return content;\n    }, {\n      getValue: () => this._getSettingValue('scene.incidents.enabled', true) !== false,\n      setValue: (val) => this._applyScenePatch(buildLabelCategoryControlPatch('incidents', val))\n    });\n\n    // Sensors & Signals Section\n    this._addSection(container, 'sensors', 'Sensors & Signals', false, () => {\n      const content = document.createElement('div');\n      const sensorsEnabled = this._getSettingValue('scene.sensors.enabled', false) === true;\n\n      const { wrapper: enabledToggle, input: sensorsEnabledInput } = createToggle('Enable Sensors', sensorsEnabled, (checked) => {\n        this._emitChange('sensorsEnabled', checked);\n      });\n      this._bindSettingToggle('scene.sensors.enabled', sensorsEnabledInput, false);\n      content.appendChild(enabledToggle);\n\n      const note = document.createElement('div');\n      note.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin: 8px 0;';\n      note.textContent = '50+ public geospatial data sources — seismic, weather, fire, ocean, radiation, conflict, telecom, ecology, and more.';\n      content.appendChild(note);\n\n      content.appendChild(createDivider());\n\n      // Group sources by category — ordered by operational priority\n      const categoryOrder = [\n        'seismic', 'volcanic', 'fire', 'weather', 'space', 'natural_event',\n        'ocean', 'water', 'atmosphere', 'fireball', 'radiation', 'air_quality',\n        'aviation', 'conflict', 'humanitarian', 'disaster',\n        'telecom', 'energy', 'ecology', 'boundaries',\n        'sanctions', 'solar', 'imagery', 'network',\n      ];\n      for (const catId of categoryOrder) {\n        const catMeta = SENSOR_CATEGORIES[catId];\n        if (!catMeta) continue;\n        const sources = getSensorsByCategory(catId);\n        if (!sources.length) continue;\n\n        const catColor = '#' + (catMeta.color || 0xffffff).toString(16).padStart(6, '0');\n\n        // Collapsible category group — collapsed by default to reduce scroll\n        const catGroup = document.createElement('div');\n        catGroup.style.cssText = 'margin: 4px 0;';\n\n        const catHeader = document.createElement('div');\n        catHeader.style.cssText = `display: flex; align-items: center; gap: 6px; padding: 6px 4px; font-size: 11px; font-weight: 600; color: ${catColor}; cursor: pointer; user-select: none; border-radius: 4px; transition: background 0.15s;`;\n        catHeader.addEventListener('mouseenter', () => { catHeader.style.background = 'rgba(255,255,255,0.04)'; });\n        catHeader.addEventListener('mouseleave', () => { catHeader.style.background = 'transparent'; });\n\n        const catArrow = document.createElement('span');\n        catArrow.style.cssText = 'font-size: 9px; color: rgba(255,255,255,0.4); flex-shrink: 0; transition: transform 0.15s;';\n        catArrow.textContent = '\\u25B6'; // Right arrow (collapsed)\n        catHeader.appendChild(catArrow);\n\n        const catDot = document.createElement('span');\n        catDot.style.cssText = `width: 8px; height: 8px; border-radius: 50%; background: ${catColor}; flex-shrink: 0;`;\n        catHeader.appendChild(catDot);\n        catHeader.appendChild(document.createTextNode(catMeta.label));\n\n        const catCount = document.createElement('span');\n        catCount.style.cssText = 'font-size: 9px; color: rgba(255,255,255,0.3); margin-left: auto;';\n        catCount.textContent = `${sources.length}`;\n        catHeader.appendChild(catCount);\n\n        catGroup.appendChild(catHeader);\n\n        const catBody = document.createElement('div');\n        catBody.style.cssText = 'display: none; padding-left: 4px;'; // Collapsed by default\n\n        catHeader.addEventListener('click', () => {\n          const isOpen = catBody.style.display !== 'none';\n          catBody.style.display = isOpen ? 'none' : 'block';\n          catArrow.textContent = isOpen ? '\\u25B6' : '\\u25BC';\n          catArrow.style.color = isOpen ? 'rgba(255,255,255,0.4)' : catColor;\n        });\n\n        content.appendChild(catGroup);\n\n        for (const source of sources) {\n          const sourceEnabled = this._getSettingValue(`scene.sensors.sources.${source.id}.enabled`, false) === true;\n\n          const row = document.createElement('div');\n          row.style.cssText = 'display: flex; align-items: center; gap: 8px; padding: 4px 0 4px 14px;';\n\n          const statusDot = document.createElement('span');\n          statusDot.className = 'sensor-status-dot';\n          statusDot.style.cssText = `width: 6px; height: 6px; border-radius: 50%; background: ${sourceEnabled ? '#4caf50' : '#666'}; flex-shrink: 0;`;\n          row.appendChild(statusDot);\n\n          const { wrapper: srcToggle, input: srcInput } = createToggle(source.label, sourceEnabled, (checked) => {\n            this._emitChange(`sensor_${source.id}`, checked);\n            const sourcesPatch = {};\n            sourcesPatch[source.id] = { enabled: checked };\n            this._applyScenePatch({ sensors: { sources: sourcesPatch } });\n            statusDot.style.background = checked ? '#4caf50' : '#666';\n          });\n          srcToggle.style.flex = '1';\n          srcToggle.style.marginBottom = '0';\n          this._sensorSourceToggles.set(source.id, srcInput);\n          row.appendChild(srcToggle);\n\n          // Transport badge\n          if (source.transport === 'websocket') {\n            const wsBadge = document.createElement('span');\n            wsBadge.className = 'sensor-ws-status';\n            wsBadge.style.cssText = 'font-size: 9px; font-weight: 600; color: #666; flex-shrink: 0;';\n            row.appendChild(wsBadge);\n          }\n\n          // Event count\n          const countEl = document.createElement('span');\n          countEl.className = 'sensor-event-count';\n          countEl.style.cssText = 'font-size: 9px; color: rgba(255, 255, 255, 0.4); flex-shrink: 0; min-width: 50px; text-align: right;';\n          row.appendChild(countEl);\n\n          // Tier badge\n          const tierBadge = document.createElement('span');\n          tierBadge.style.cssText = `font-size: 8px; padding: 1px 4px; border-radius: 3px; flex-shrink: 0; background: ${source.tier === 1 ? 'rgba(76, 175, 80, 0.2)' : 'rgba(255, 152, 0, 0.2)'}; color: ${source.tier === 1 ? '#81c784' : '#ffb74d'};`;\n          tierBadge.textContent = source.tier === 1 ? 'T1' : 'T2';\n          row.appendChild(tierBadge);\n\n          // Info toggle button\n          const infoBtn = document.createElement('span');\n          infoBtn.className = 'sensor-info-toggle';\n          infoBtn.style.cssText = 'font-size: 10px; cursor: pointer; color: rgba(255,255,255,0.3); flex-shrink: 0; user-select: none; transition: color 0.15s;';\n          infoBtn.textContent = '\\u25B6';\n          infoBtn.title = 'Show API details';\n          row.appendChild(infoBtn);\n\n          catBody.appendChild(row);\n\n          // Expandable info panel (hidden by default)\n          const infoPanel = document.createElement('div');\n          infoPanel.className = 'sensor-info-panel';\n          infoPanel.style.cssText = 'display: none; margin: 0 0 6px 20px; padding: 6px 8px; background: rgba(0,0,0,0.3); border-radius: 4px; border-left: 2px solid rgba(255,255,255,0.1); font-size: 9px; color: rgba(255,255,255,0.5); line-height: 1.6;';\n          infoPanel.innerHTML = '<span style=\"color: rgba(255,255,255,0.3);\">No data yet</span>';\n          catBody.appendChild(infoPanel);\n\n          infoBtn.addEventListener('click', (e) => {\n            e.stopPropagation();\n            const open = infoPanel.style.display !== 'none';\n            infoPanel.style.display = open ? 'none' : 'block';\n            infoBtn.textContent = open ? '\\u25B6' : '\\u25BC';\n            infoBtn.style.color = open ? 'rgba(255,255,255,0.3)' : 'rgba(255,255,255,0.6)';\n          });\n\n          this._sensorStatusEls.set(source.id, row);\n        }\n\n        catGroup.appendChild(catBody);\n      }\n\n      return content;\n    }, {\n      getValue: () => this._getSettingValue('scene.sensors.enabled', false) === true,\n      setValue: (val) => this._applyScenePatch(buildLabelCategoryControlPatch('sensors', val))\n    });\n\n    // LoRa / Meshtastic Section\n    this._addSection(container, 'meshtastic', 'LoRa / Meshtastic', false, () => {\n      const content = document.createElement('div');\n\n      // Enable toggle\n      const meshEnabled = this._getSettingValue('scene.meshtastic.enabled', false) === true;\n      const { wrapper: enableToggle, input: meshEnabledInput } = createToggle('Enable Meshtastic HTTP source', meshEnabled, (checked) => {\n        this._emitChange('meshtasticEnabled', checked);\n      });\n      this._bindSettingToggle('scene.meshtastic.enabled', meshEnabledInput, false);\n      content.appendChild(enableToggle);\n\n      const desc = document.createElement('div');\n      desc.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin: 8px 0;';\n      desc.textContent = 'Connect through Web Serial or opt into the HTTP source here. Sensors & mesh in the scene-label rail is the sole globe/minimap visibility control.';\n      content.appendChild(desc);\n\n      content.appendChild(createDivider());\n\n      // Connection status\n      const statusEl = document.createElement('div');\n      statusEl.style.cssText = 'font-size: 11px; color: rgba(255, 255, 255, 0.5); margin: 8px 0; font-family: \"IBM Plex Mono\", monospace;';\n      statusEl.textContent = 'Status: Disconnected';\n      content.appendChild(statusEl);\n      this._meshtasticStatusEl = statusEl;\n\n      // Connect via Web Serial button\n      const serialBtn = createButton('Connect via USB Serial', {\n        onClick: () => this._connectMeshtasticSerial(),\n      });\n      content.appendChild(serialBtn);\n\n      const deviceSettingsHost = document.createElement('div');\n      content.appendChild(deviceSettingsHost);\n      this._meshtasticDeviceSettingsHost = deviceSettingsHost;\n\n      // API URL input\n      const { group: apiUrlGroup, input: apiUrlInput } = createInput({\n        label: 'API Server URL',\n        placeholder: 'http://localhost:5555',\n        onChange: (value) => this._emitChange('meshtasticApiUrl', value),\n      });\n      content.appendChild(apiUrlGroup);\n\n      // Fetch from API button\n      const fetchBtn = createButton('Fetch Nodes from API', {\n        onClick: () => this._fetchMeshtasticNodes(apiUrlInput?.value || 'http://localhost:5555'),\n      });\n      content.appendChild(fetchBtn);\n\n      content.appendChild(createDivider());\n\n      // Node list and roster filters\n      const rosterHost = document.createElement('div');\n      content.appendChild(rosterHost);\n      this._meshtasticRosterHost = rosterHost;\n      const nodeListHeader = document.createElement('div');\n      nodeListHeader.style.cssText = 'display:flex;align-items:center;gap:6px;margin:8px 0 4px;';\n      const nodeListTitle = document.createElement('div');\n      nodeListTitle.style.cssText = 'font-size:10px;color:rgba(255,255,255,0.4);text-transform:uppercase;letter-spacing:0.1em;';\n      nodeListTitle.textContent = 'Mesh Nodes';\n      const nodeCount = document.createElement('span');\n      nodeCount.style.cssText = 'margin-left:auto;font-size:9px;color:rgba(255,255,255,0.35);font-family:\"IBM Plex Mono\",monospace;';\n      nodeCount.textContent = '0';\n      const broadcastButton = createButton('Broadcast', {\n        onClick: () => this._openMeshtasticThread({ id: 'broadcast', user: 'Mesh broadcast' }),\n      });\n      broadcastButton.style.cssText += 'padding:3px 5px;font-size:8px;';\n      const nodeFilter = document.createElement('select');\n      nodeFilter.className = 'nca-sidebar-select nca-sidebar-select--compact';\n      nodeFilter.setAttribute('aria-label', 'Filter mesh nodes');\n      for (const [value, label] of [['all', 'All'], ['live', 'Live'], ['positioned', 'GPS']]) {\n        const option = document.createElement('option');\n        option.value = value;\n        option.textContent = label;\n        nodeFilter.appendChild(option);\n      }\n      nodeFilter.value = this._meshtasticNodeFilter;\n      nodeFilter.addEventListener('change', () => {\n        this._meshtasticNodeFilter = nodeFilter.value;\n        this._updateMeshtasticNodeList(this._meshtasticNodesCache);\n      });\n      nodeListHeader.append(nodeListTitle, nodeCount, broadcastButton, nodeFilter);\n      rosterHost.appendChild(nodeListHeader);\n      this._meshtasticNodeCountEl = nodeCount;\n\n      const nodeSearch = document.createElement('input');\n      nodeSearch.type = 'search';\n      nodeSearch.className = 'nca-sidebar-input nca-meshtastic-search';\n      nodeSearch.placeholder = 'Search name, ID, hardware, or role';\n      nodeSearch.setAttribute('aria-label', 'Search mesh nodes');\n      nodeSearch.autocomplete = 'off';\n      nodeSearch.spellcheck = false;\n      nodeSearch.value = this._meshtasticNodeSearch;\n      nodeSearch.addEventListener('input', () => {\n        this._meshtasticNodeSearch = nodeSearch.value;\n        this._updateMeshtasticNodeList(this._meshtasticNodesCache);\n      });\n      rosterHost.appendChild(nodeSearch);\n\n      const nodeFilterGrid = document.createElement('div');\n      nodeFilterGrid.style.cssText = 'display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr) minmax(0,.8fr);gap:6px;margin-bottom:6px;';\n      const createRosterFilter = (labelText, ariaLabel, options, currentValue, onChange, numeric = true) => {\n        const label = document.createElement('label');\n        label.style.cssText = 'display:grid;gap:2px;font-size:8px;color:rgba(255,255,255,0.35);text-transform:uppercase;letter-spacing:0.08em;';\n        label.append(document.createTextNode(labelText));\n        const select = document.createElement('select');\n        select.className = 'nca-sidebar-select';\n        select.setAttribute('aria-label', ariaLabel);\n        for (const [value, optionLabel] of options) {\n          const option = document.createElement('option');\n          option.value = String(value);\n          option.textContent = optionLabel;\n          select.appendChild(option);\n        }\n        select.value = currentValue == null ? '' : String(currentValue);\n        select.addEventListener('change', () => onChange(numeric\n          ? (select.value === '' ? null : Number(select.value))\n          : select.value));\n        label.appendChild(select);\n        return label;\n      };\n      nodeFilterGrid.append(\n        createRosterFilter('Sort', 'Sort mesh nodes', [\n          ['closest', 'Closest → farthest'],\n          ['signal', 'Signal strong → weak'],\n          ['recent', 'Most recent'],\n          ['hops', 'Fewest → most hops'],\n          ['battery', 'Battery high → low'],\n          ['name', 'Name A–Z'],\n        ], this._meshtasticNodeSort, (value) => {\n          this._meshtasticNodeSort = value;\n          this._updateMeshtasticNodeList(this._meshtasticNodesCache);\n        }, false),\n        createRosterFilter('Last heard', 'Filter mesh nodes by recency', [\n          [0, 'Any time'],\n          [300, 'Last 5 min'],\n          [900, 'Last 15 min'],\n          [3600, 'Last hour'],\n          [21600, 'Last 6 hours'],\n          [86400, 'Last 24 hours'],\n          [604800, 'Last 7 days'],\n        ], this._meshtasticNodeRecencySeconds, (value) => {\n          this._meshtasticNodeRecencySeconds = value;\n          this._updateMeshtasticNodeList(this._meshtasticNodesCache);\n        }),\n        createRosterFilter('Max hops', 'Filter mesh nodes by maximum hops', [\n          ['', 'Any'], [0, 'Direct'], [1, '≤ 1'], [2, '≤ 2'], [3, '≤ 3'],\n          [4, '≤ 4'], [5, '≤ 5'], [6, '≤ 6'], [7, '≤ 7'],\n        ], this._meshtasticNodeMaxHops, (value) => {\n          this._meshtasticNodeMaxHops = value;\n          this._updateMeshtasticNodeList(this._meshtasticNodesCache);\n        }),\n      );\n      rosterHost.appendChild(nodeFilterGrid);\n\n      const nodeList = document.createElement('div');\n      nodeList.style.cssText = 'max-height: 200px; overflow-y: auto; scrollbar-width: none;';\n      rosterHost.appendChild(nodeList);\n      this._meshtasticNodeList = nodeList;\n\n      // Empty state\n      const emptyState = document.createElement('div');\n      emptyState.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.3); font-style: italic; padding: 8px 0;';\n      emptyState.textContent = 'No nodes detected. Connect a device or fetch from API.';\n      nodeList.appendChild(emptyState);\n      this._meshtasticEmptyState = emptyState;\n\n      const threadHost = document.createElement('div');\n      content.appendChild(threadHost);\n      this._meshtasticThreadHost = threadHost;\n\n      // Listen for meshtastic events\n      if (this.eventBus) {\n        this._meshtasticEventUnsubscribe?.();\n        const onNodes = (data) => this._updateMeshtasticNodeList(data?.nodes || []);\n        const onMsg = () => this._updateMeshtasticNodeList(this._meshtasticNodesCache);\n        const onLabelHover = (event) => {\n          this._meshtasticHoveredNodeId = meshtasticNodeIdFromLabelHover(event?.detail);\n          syncMeshtasticNodeListHover(\n            this._meshtasticNodeList,\n            this._meshtasticHoveredNodeId,\n            { scroll: true },\n          );\n        };\n        const onConnected = () => {\n          if (!this._meshtasticStatusEl) return;\n          this._meshtasticStatusEl.textContent = 'Status: Connected';\n          this._meshtasticStatusEl.style.color = '#4ade80';\n        };\n        const onDisconnected = () => {\n          if (!this._meshtasticStatusEl) return;\n          this._meshtasticStatusEl.textContent = 'Status: Disconnected';\n          this._meshtasticStatusEl.style.color = 'rgba(255,255,255,0.5)';\n        };\n        if (typeof this.eventBus.on === 'function') {\n          const bindings = [\n            ['meshtastic:nodes', onNodes],\n            ['meshtastic:message', onMsg],\n            ['meshtastic:connected', onConnected],\n            ['meshtastic:disconnected', onDisconnected],\n          ];\n          for (const [event, handler] of bindings) this.eventBus.on(event, handler);\n          this._meshtasticEventUnsubscribe = () => {\n            for (const [event, handler] of bindings) this.eventBus?.off?.(event, handler);\n            document.removeEventListener?.('noclip:scene-label-hover', onLabelHover);\n            this._meshtasticThreadView?.destroy?.();\n            this._meshtasticThreadView = null;\n            this._meshtasticDeviceSettings?.destroy?.();\n            this._meshtasticDeviceSettings = null;\n          };\n          document.addEventListener?.('noclip:scene-label-hover', onLabelHover);\n        }\n      }\n\n      void Promise.all([\n        import('../meshtastic/MeshtasticService.js'),\n        import('../meshtastic/MeshtasticDeviceSettings.js'),\n      ]).then(([{ getMeshtasticService }, { MeshtasticDeviceSettings }]) => {\n        const service = getMeshtasticService({ eventBus: this.eventBus });\n        this._meshtasticService = service;\n        this._meshtasticDeviceSettings?.destroy?.();\n        this._meshtasticDeviceSettings = new MeshtasticDeviceSettings({\n          host: deviceSettingsHost,\n          service,\n        });\n        this._updateMeshtasticNodeList(service.nodes);\n        if (service.isConnected && this._meshtasticStatusEl) {\n          this._meshtasticStatusEl.textContent = 'Status: Connected';\n          this._meshtasticStatusEl.style.color = '#4ade80';\n        }\n      }).catch(() => {});\n\n      return content;\n    }, {\n      getValue: () => this._getSettingValue('scene.meshtastic.enabled', false) === true,\n      setValue: (val) => this._applyScenePatch({ meshtastic: { enabled: val } })\n    });\n\n    // Radio Scanner / OpenMHz Section\n    this._addSection(container, 'radio', 'Radio Scanner', false, () => {\n      const content = document.createElement('div');\n      // Hidden search anchor so sidebar search can find this section\n      const searchAnchor = document.createElement('span');\n      searchAnchor.dataset.settingKey = 'scene.radio.enabled';\n      searchAnchor.dataset.settingLabel = 'Radio Scanner OpenMHz Police Fire EMS';\n      searchAnchor.style.display = 'none';\n      content.appendChild(searchAnchor);\n\n      const desc = document.createElement('div');\n      desc.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin: 8px 0;';\n      desc.textContent = 'Listen to live public safety radio via OpenMHz. Auto-connects to the nearest system based on your camera location.';\n      content.appendChild(desc);\n\n      // Status\n      const statusEl = document.createElement('div');\n      statusEl.style.cssText = 'font-size: 11px; color: rgba(255, 255, 255, 0.5); margin: 8px 0; font-family: \"IBM Plex Mono\", monospace;';\n      statusEl.textContent = 'Status: Disconnected';\n      content.appendChild(statusEl);\n      this._radioStatusEl = statusEl;\n\n      // System info\n      const sysInfoEl = document.createElement('div');\n      sysInfoEl.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.3); margin: 4px 0;';\n      content.appendChild(sysInfoEl);\n      this._radioSysInfoEl = sysInfoEl;\n\n      content.appendChild(createDivider());\n\n      // Auto-connect button\n      const connectBtn = createButton('Auto-Connect Nearest', {\n        onClick: () => this._radioAutoConnect(),\n      });\n      content.appendChild(connectBtn);\n\n      // System select (populated after systems load)\n      const { group: sysSelectGroup, select: sysSelect } = createSelect({\n        label: 'System',\n        options: [{ value: '', label: 'Loading systems...' }],\n        onChange: (val) => {\n          if (val) this._radioSetSystem(val);\n        },\n      });\n      content.appendChild(sysSelectGroup);\n      this._radioSystemSelect = sysSelect;\n      const loadSystemsOnce = () => {\n        if (this._radioSystemsLoadRequested) return;\n        this._radioSystemsLoadRequested = true;\n        this._radioLoadSystems();\n      };\n      sysSelect.addEventListener('focus', loadSystemsOnce, { once: true });\n      sysSelect.addEventListener('pointerdown', loadSystemsOnce, { once: true });\n\n      content.appendChild(createDivider());\n\n      // Audio player controls\n      const playerRow = document.createElement('div');\n      playerRow.style.cssText = 'display: flex; gap: 6px; align-items: center; margin: 8px 0;';\n\n      const playBtn = createButton('▶ Play', {\n        onClick: () => this._radioTogglePlay(),\n      });\n      playBtn.style.cssText += 'min-width: 70px;';\n      playerRow.appendChild(playBtn);\n      this._radioPlayBtn = playBtn;\n\n      const nowPlayingEl = document.createElement('div');\n      nowPlayingEl.style.cssText = 'flex: 1; font-size: 10px; color: rgba(255, 255, 255, 0.5); font-family: \"IBM Plex Mono\", monospace; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;';\n      nowPlayingEl.textContent = 'No audio';\n      playerRow.appendChild(nowPlayingEl);\n      this._radioNowPlayingEl = nowPlayingEl;\n\n      content.appendChild(playerRow);\n\n      // Transcribe toggle\n      const transcribeRow = document.createElement('div');\n      transcribeRow.style.cssText = 'display: flex; gap: 6px; align-items: center; margin: 4px 0 8px;';\n      const transcribeBtn = createButton('Transcribe', {\n        onClick: () => this._radioToggleTranscribe(),\n      });\n      transcribeBtn.style.cssText += 'min-width: 90px;';\n      transcribeRow.appendChild(transcribeBtn);\n      this._radioTranscribeBtn = transcribeBtn;\n      this._radioTranscribeActive = false;\n\n      const transcribeHint = document.createElement('div');\n      transcribeHint.style.cssText = 'font-size: 9px; color: rgba(255,255,255,0.3); flex: 1;';\n      transcribeHint.textContent = 'Whisper ASR — parse addresses & fly to';\n      transcribeRow.appendChild(transcribeHint);\n      content.appendChild(transcribeRow);\n\n      // Transcript display\n      const transcriptEl = document.createElement('div');\n      transcriptEl.style.cssText = 'display: none; margin: 0 0 8px; padding: 6px 8px; background: rgba(255, 255, 255,0.04); border: 1px solid rgba(255, 255, 255,0.15); border-radius: 4px; font-size: 10px; font-family: \"IBM Plex Mono\", monospace; color: rgba(255,255,255,0.6); line-height: 1.5; max-height: 120px; overflow-y: auto; scrollbar-width: none;';\n      content.appendChild(transcriptEl);\n      this._radioTranscriptEl = transcriptEl;\n\n      // Call list\n      const callListTitle = document.createElement('div');\n      callListTitle.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.4); text-transform: uppercase; letter-spacing: 0.1em; margin: 8px 0 4px;';\n      callListTitle.textContent = 'Recent Calls';\n      content.appendChild(callListTitle);\n\n      const callList = document.createElement('div');\n      callList.style.cssText = 'max-height: 200px; overflow-y: auto; scrollbar-width: none;';\n      content.appendChild(callList);\n      this._radioCallList = callList;\n      this._radioCallRows = new Map();\n      this._radioCallRowsByKey = new Map();\n\n      // Listen for events\n      if (this.eventBus) {\n        const on = (evt, fn) => {\n          if (typeof this.eventBus.on === 'function') this.eventBus.on(evt, fn);\n        };\n        on('openmhz:connected', (data) => {\n          if (this._radioStatusEl) {\n            this._radioStatusEl.textContent = 'Status: Connected';\n            this._radioStatusEl.style.color = '#4ade80';\n          }\n          if (this._radioSysInfoEl && data?.system) {\n            this._radioSysInfoEl.textContent = `${data.system.name} — ${data.system.city}, ${data.system.state}`;\n          }\n        });\n        on('openmhz:system-changing', () => {\n          this._radioCallList?.replaceChildren();\n          this._radioCallRows?.clear();\n          this._radioCallRowsByKey?.clear();\n        });\n        on('openmhz:calls', (data) => {\n          this._radioUpdateCallList(data?.calls || []);\n        });\n        on('openmhz:playing', (data) => {\n          if (this._radioNowPlayingEl && data?.call) {\n            this._radioNowPlayingEl.textContent = `${data.call.talkgroupName || 'TG ' + data.call.talkgroupNum}`;\n          }\n          if (this._radioPlayBtn) this._radioPlayBtn.textContent = '⏸ Pause';\n        });\n        on('openmhz:stopped', () => {\n          if (this._radioNowPlayingEl) this._radioNowPlayingEl.textContent = 'Stopped';\n          if (this._radioPlayBtn) this._radioPlayBtn.textContent = '▶ Play';\n        });\n        on('openmhz:transcription', (data) => this._radioUpdateTranscriptionState(data));\n      }\n\n      return content;\n    });\n\n    // Labels Section\n    this._addSection(container, 'labels', 'Labels', false, () => {\n      const content = document.createElement('div');\n\n      // Master enable toggle\n      const masterValue = this._getSettingValue('scene.labels.enabled', true) === true;\n      let aircraftInput = null;\n      let maritimeInput = null;\n      let satelliteInput = null;\n      let buildingsInput = null;\n      let incidentsInput = null;\n      let infraInput = null;\n      let viewConeRange = null;\n      let scaleRange = null;\n      let maxVisibleRange = null;\n\n      const _setSubcontrols = (checked) => {\n        if (aircraftInput) aircraftInput.disabled = !checked;\n        if (maritimeInput) maritimeInput.disabled = !checked;\n        if (satelliteInput) satelliteInput.disabled = !checked;\n        if (buildingsInput) buildingsInput.disabled = !checked;\n        if (incidentsInput) incidentsInput.disabled = !checked;\n        if (infraInput) infraInput.disabled = !checked;\n        if (viewConeRange) viewConeRange.disabled = !checked;\n        if (scaleRange) scaleRange.disabled = !checked;\n        if (maxVisibleRange) maxVisibleRange.disabled = !checked;\n      };\n\n      const { wrapper: masterToggle, input: masterInput } = createToggle(\n        'Show Labels', masterValue, (checked) => {\n          this._emitChange('labelsEnabled', checked);\n          _setSubcontrols(checked);\n        }\n      );\n      this._bindSettingToggle('scene.labels.enabled', masterInput, true, _setSubcontrols);\n      content.appendChild(masterToggle);\n\n      // Per-type toggles\n      const aircraftValue = this._getSettingValue('scene.labels.categories.aircraft', true) === true;\n      const { wrapper: aircraftToggle, input: aircraftIn } = createToggle(\n        'Aircraft', aircraftValue, (checked) => this._emitChange('labelsAircraft', checked)\n      );\n      aircraftInput = aircraftIn;\n      aircraftInput.disabled = !masterValue;\n      this._bindSettingToggle('scene.labels.categories.aircraft', aircraftInput, true);\n      content.appendChild(aircraftToggle);\n\n      const maritimeValue = this._getSettingValue('scene.labels.categories.maritime', true) === true;\n      const { wrapper: maritimeToggle, input: maritimeIn } = createToggle(\n        'Maritime', maritimeValue, (checked) => this._emitChange('labelsMaritime', checked)\n      );\n      maritimeInput = maritimeIn;\n      maritimeInput.disabled = !masterValue;\n      this._bindSettingToggle('scene.labels.categories.maritime', maritimeInput, true);\n      content.appendChild(maritimeToggle);\n\n      const satelliteValue = this._getSettingValue('scene.labels.categories.satellites', true) === true;\n      const { wrapper: satelliteToggle, input: satelliteIn } = createToggle(\n        'Satellites', satelliteValue, (checked) => this._emitChange('labelsSatellites', checked)\n      );\n      satelliteInput = satelliteIn;\n      satelliteInput.disabled = !masterValue;\n      this._bindSettingToggle('scene.labels.categories.satellites', satelliteInput, true);\n      content.appendChild(satelliteToggle);\n\n      const buildingsValue = this._getSettingValue('scene.labels.categories.buildings', true) === true;\n      const { wrapper: buildingsToggle, input: buildingsIn } = createToggle(\n        'Buildings', buildingsValue, (checked) => this._emitChange('labelsBuildings', checked)\n      );\n      buildingsInput = buildingsIn;\n      buildingsInput.disabled = !masterValue;\n      this._bindSettingToggle('scene.labels.categories.buildings', buildingsInput, true);\n      content.appendChild(buildingsToggle);\n\n      const incidentsValue = this._getSettingValue('scene.labels.categories.incidents', true) === true;\n      const { wrapper: incidentsToggle, input: incidentsIn } = createToggle(\n        'Incidents', incidentsValue, (checked) => this._emitChange('labelsIncidents', checked)\n      );\n      incidentsInput = incidentsIn;\n      incidentsInput.disabled = !masterValue;\n      this._bindSettingToggle('scene.labels.categories.incidents', incidentsInput, true);\n      content.appendChild(incidentsToggle);\n\n      const infraValue = this._getSettingValue('scene.labels.categories.infrastructure', true) === true;\n      const { wrapper: infraToggle, input: infraIn } = createToggle(\n        'Infrastructure', infraValue, (checked) => this._emitChange('labelsInfrastructure', checked)\n      );\n      infraInput = infraIn;\n      infraInput.disabled = !masterValue;\n      this._bindSettingToggle('scene.labels.categories.infrastructure', infraInput, true);\n      content.appendChild(infraToggle);\n\n      content.appendChild(createDivider());\n\n      // View cone slider\n      const viewConeValue = this._resolveNumber(\n        this._getSettingValue('scene.labels.viewConeDeg', 60), 60, { min: 5, max: 180 }\n      );\n      const { group: viewConeGroup, range: viewConeRangeInput, valueDisplay: viewConeDisplay } = createRangeSlider({\n        label: 'View Cone (deg)',\n        min: 5, max: 180, step: 1,\n        value: viewConeValue,\n        onChange: (val) => this._emitChange('labelsViewCone', val),\n      });\n      this._bindSettingRange('scene.labels.viewConeDeg', viewConeRangeInput, viewConeValue, { valueDisplay: viewConeDisplay });\n      viewConeRangeInput.disabled = !masterValue;\n      viewConeRange = viewConeRangeInput;\n      content.appendChild(viewConeGroup);\n\n      // Scale multiplier slider\n      const scaleValue = this._resolveNumber(\n        this._getSettingValue('scene.labels.scaleMultiplier', 1), 1, { min: 0.5, max: 3 }\n      );\n      const { group: scaleGroup, range: scaleRangeInput, valueDisplay: scaleDisplay } = createRangeSlider({\n        label: 'Label Scale',\n        min: 0.5, max: 3, step: 0.1,\n        value: scaleValue,\n        onChange: (val) => this._emitChange('labelsScale', val),\n      });\n      this._bindSettingRange('scene.labels.scaleMultiplier', scaleRangeInput, scaleValue, { valueDisplay: scaleDisplay });\n      scaleRangeInput.disabled = !masterValue;\n      scaleRange = scaleRangeInput;\n      content.appendChild(scaleGroup);\n\n      // Max visible slider\n      const maxVisibleValue = this._resolveNumber(\n        this._getSettingValue('scene.labels.maxVisible', 50), 50, { min: 10, max: 200 }\n      );\n      const { group: maxVisibleGroup, range: maxVisibleRangeInput, valueDisplay: maxVisibleDisplay } = createRangeSlider({\n        label: 'Max Visible',\n        min: 10, max: 200, step: 5,\n        value: maxVisibleValue,\n        onChange: (val) => this._emitChange('labelsMaxVisible', val),\n      });\n      this._bindSettingRange('scene.labels.maxVisible', maxVisibleRangeInput, maxVisibleValue, { valueDisplay: maxVisibleDisplay });\n      maxVisibleRangeInput.disabled = !masterValue;\n      maxVisibleRange = maxVisibleRangeInput;\n      content.appendChild(maxVisibleGroup);\n\n      return content;\n    }, {\n      getValue: () => this._getSettingValue('scene.labels.enabled', true) !== false,\n      setValue: (val) => this._applyScenePatch({ labels: { enabled: val } })\n    });\n\n    // Pathfinding Section\n    this._addSection(container, 'pathfinding', 'Pathfinding', false, () => {\n      const content = document.createElement('div');\n      const groupLabelStyle = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n\n      // Grid settings\n      const gridLabel = document.createElement('div');\n      gridLabel.style.cssText = groupLabelStyle;\n      gridLabel.textContent = 'Grid Resolution';\n      content.appendChild(gridLabel);\n\n      const lateralMaxDegValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.lateralMaxDeg', 5),\n        5,\n        { min: 1, max: 20 }\n      );\n      const stepsSValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.stepsS', 64),\n        64,\n        { min: 8, max: 256 }\n      );\n      const stepsTValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.stepsT', 17),\n        17,\n        { min: 3, max: 33 }\n      );\n\n      const gridSettings = [\n        { key: 'pathLateralMaxDeg', path: 'scene.pathfinding.lateralMaxDeg', label: 'Lateral Max (°)', min: 1, max: 20, step: 0.5, value: lateralMaxDegValue },\n        { key: 'pathStepsS', path: 'scene.pathfinding.stepsS', label: 'Steps S', min: 8, max: 256, step: 1, value: stepsSValue },\n        { key: 'pathStepsT', path: 'scene.pathfinding.stepsT', label: 'Steps T', min: 3, max: 33, step: 1, value: stepsTValue },\n      ];\n\n      gridSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      // Cost weights\n      const costLabel = document.createElement('div');\n      costLabel.style.cssText = groupLabelStyle;\n      costLabel.textContent = 'Slope Costs';\n      content.appendChild(costLabel);\n\n      const uphillValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.costs.uphill', 4),\n        4,\n        { min: 0, max: 30 }\n      );\n      const downhillValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.costs.downhill', 1.1),\n        1.1,\n        { min: 0, max: 10 }\n      );\n      const elevDeltaValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.costs.elevDelta', 3.3),\n        3.3,\n        { min: 0, max: 10 }\n      );\n      const slopeSqValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.costs.slopeSq', 0),\n        0,\n        { min: 0, max: 20 }\n      );\n\n      const slopeSettings = [\n        { key: 'pathUphill', path: 'scene.pathfinding.costs.uphill', label: 'Uphill', min: 0, max: 30, step: 0.1, value: uphillValue },\n        { key: 'pathDownhill', path: 'scene.pathfinding.costs.downhill', label: 'Downhill', min: 0, max: 10, step: 0.1, value: downhillValue },\n        { key: 'pathElevDelta', path: 'scene.pathfinding.costs.elevDelta', label: 'Elev Delta', min: 0, max: 10, step: 0.1, value: elevDeltaValue },\n        { key: 'pathSlopeSq', path: 'scene.pathfinding.costs.slopeSq', label: 'Slope²', min: 0, max: 20, step: 0.1, value: slopeSqValue },\n      ];\n\n      slopeSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      // Movement costs\n      const moveLabel = document.createElement('div');\n      moveLabel.style.cssText = groupLabelStyle;\n      moveLabel.textContent = 'Movement Costs';\n      content.appendChild(moveLabel);\n\n      const lateralValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.costs.lateral', 2),\n        2,\n        { min: 0, max: 5 }\n      );\n      const distanceValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.costs.distance', 4),\n        4,\n        { min: 0, max: 5 }\n      );\n\n      const moveSettings = [\n        { key: 'pathLateral', path: 'scene.pathfinding.costs.lateral', label: 'Lateral', min: 0, max: 5, step: 0.05, value: lateralValue },\n        { key: 'pathDistance', path: 'scene.pathfinding.costs.distance', label: 'Distance', min: 0, max: 5, step: 0.05, value: distanceValue },\n      ];\n\n      moveSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      // Terrain costs\n      const terrainLabel = document.createElement('div');\n      terrainLabel.style.cssText = groupLabelStyle;\n      terrainLabel.textContent = 'Terrain Costs';\n      content.appendChild(terrainLabel);\n\n      const highValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.costs.high', 1.1),\n        1.1,\n        { min: 0, max: 3 }\n      );\n      const roughValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.costs.rough', 1.75),\n        1.75,\n        { min: 0, max: 3 }\n      );\n\n      const terrainSettings = [\n        { key: 'pathHigh', path: 'scene.pathfinding.costs.high', label: 'High Terrain', min: 0, max: 3, step: 0.05, value: highValue },\n        { key: 'pathRough', path: 'scene.pathfinding.costs.rough', label: 'Rough Terrain', min: 0, max: 3, step: 0.05, value: roughValue },\n      ];\n\n      terrainSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      // Path smoothing\n      const smoothValue = this._resolveNumber(\n        this._getSettingValue('scene.pathfinding.smooth', 3),\n        3,\n        { min: 0, max: 6 }\n      );\n\n      const { group: smoothGroup, range: smoothRange, valueDisplay: smoothValueDisplay } = createRangeSlider({\n        label: 'Path Smoothing',\n        min: 0,\n        max: 6,\n        step: 1,\n        value: smoothValue,\n        onChange: (val) => this._emitChange('pathSmooth', val),\n      });\n      this._bindSettingRange('scene.pathfinding.smooth', smoothRange, smoothValue, { valueDisplay: smoothValueDisplay });\n      content.appendChild(smoothGroup);\n\n      return content;\n    });\n\n    // NKN Section\n    // Motion Tracking Section\n    this._addSection(container, 'tracking', 'Motion Tracking', false, () => {\n      const content = document.createElement('div');\n\n      // Manual tracking toggle\n      const { wrapper: manualToggle, input: manualInput } = createToggle('Track Camera Movement', false, (checked) => {\n        const api = this.scene?.api?.tracking;\n        if (checked) {\n          api?.start?.('manual');\n        } else {\n          api?.stop?.('manual');\n        }\n      });\n      content.appendChild(manualToggle);\n\n      // GPS tracking toggle\n      const { wrapper: gpsToggle, input: gpsInput } = createToggle('Track GPS Position', false, (checked) => {\n        const api = this.scene?.api?.tracking;\n        if (checked) {\n          api?.start?.('gps');\n        } else {\n          api?.stop?.('gps');\n        }\n      });\n      content.appendChild(gpsToggle);\n\n      content.appendChild(createDivider());\n\n      // Trail legend + visibility\n      const legendGroup = document.createElement('div');\n      legendGroup.className = 'config-group';\n      const legendTitle = document.createElement('div');\n      legendTitle.className = 'config-group-title';\n      legendTitle.textContent = 'Trail Display';\n      legendGroup.appendChild(legendTitle);\n\n      // Manual trail legend + toggle\n      const manualLegend = document.createElement('div');\n      manualLegend.className = 'nca-trail-legend';\n      manualLegend.innerHTML = '<span class=\"nca-trail-swatch nca-trail-swatch-manual\"></span> Camera Trail';\n      legendGroup.appendChild(manualLegend);\n      const { wrapper: manualTrailToggle } = createToggle('Show Camera Trail', true, (checked) => {\n        this.scene?.api?.tracking?.showTrail?.('manual', checked);\n      });\n      legendGroup.appendChild(manualTrailToggle);\n\n      // GPS trail legend + toggle\n      const gpsLegend = document.createElement('div');\n      gpsLegend.className = 'nca-trail-legend';\n      gpsLegend.innerHTML = '<span class=\"nca-trail-swatch nca-trail-swatch-gps\"></span> GPS Trail';\n      legendGroup.appendChild(gpsLegend);\n      const { wrapper: gpsTrailToggle } = createToggle('Show GPS Trail', true, (checked) => {\n        this.scene?.api?.tracking?.showTrail?.('gps', checked);\n      });\n      legendGroup.appendChild(gpsTrailToggle);\n      content.appendChild(legendGroup);\n\n      content.appendChild(createDivider());\n\n      // Session cards (live-updating)\n      const sessionsContainer = document.createElement('div');\n      sessionsContainer.className = 'config-group';\n      const sessionsTitle = document.createElement('div');\n      sessionsTitle.className = 'config-group-title';\n      sessionsTitle.textContent = 'Sessions';\n      sessionsContainer.appendChild(sessionsTitle);\n\n      const sessionsList = document.createElement('div');\n      sessionsContainer.appendChild(sessionsList);\n      content.appendChild(sessionsContainer);\n\n      const updateSessions = () => {\n        const sessions = this.scene?.api?.tracking?.getSessions?.() || [];\n        if (sessions.length === 0) {\n          patchStableHtml(sessionsList, '<div style=\"font-size: 11px; color: rgba(255,255,255,0.4);\">No sessions yet. Start tracking to record your path.</div>');\n        } else {\n          patchStableHtml(sessionsList,sessions.map(s => {\n            const typeLabel = s.type === 'gps' ? 'GPS' : 'Camera';\n            const statusClass = s.active ? 'recording' : 'completed';\n            const statusLabel = s.active ? 'REC' : 'Done';\n            const duration = s.active\n              ? Math.round((Date.now() - s.startedAt) / 1000) + 's'\n              : (s.endedAt ? Math.round((s.endedAt - s.startedAt) / 1000) + 's' : '--');\n            return `<div class=\"nca-session-card\" data-session-id=\"${s.id||s.startedAt}\">\n              <div class=\"nca-session-card-header\">\n                <span class=\"nca-session-card-type\">${typeLabel}</span>\n                <span class=\"nca-session-card-status ${statusClass}\">${s.active ? '<span class=\"nca-tracking-dot\"></span> ' : ''}${statusLabel}</span>\n              </div>\n              <div class=\"nca-session-card-meta\">${s.sampleCount} samples &middot; ${duration}</div>\n            </div>`;\n          }).join(''));\n        }\n        prepareDesktopSidebarPanel(content);\n      };\n      this._trackingSessionsTimer=setInterval(()=>{if(content.isConnected&&content.getClientRects().length)updateSessions();},2000);\n      updateSessions(); // Initial render\n\n      content.appendChild(createDivider());\n\n      // Clear trails button\n      content.appendChild(createButton('Clear All Trails', {\n        variant: 'danger', size: 'sm',\n        onClick: () => {\n          this.scene?.api?.tracking?.clearTrails?.();\n        }\n      }));\n\n      return content;\n    });\n\n    this._addSection(container, 'nkn', 'NKN', false, () => {\n      const content = document.createElement('div');\n      const nknEnabled = this._getSettingValue('nkn.enabled', false) === true;\n      const relayFallback = localStorage.getItem('nkn.globe.relay') || '';\n      const datasetFallback = localStorage.getItem('nkn.globe.dataset') || 'mapzen';\n      const relayValue = this._getSettingValue('nkn.relay', relayFallback) || DEFAULT_NKN_FORWARDER;\n      const datasetValue = this._getSettingValue('nkn.dataset', datasetFallback) || 'mapzen';\n      const addrValue = this._nknAddressCache || localStorage.getItem('nkn.globe.addr') || '';\n\n      const { wrapper: enabledToggle, input: nknInput } = createToggle('Enable NKN', nknEnabled, (checked) => {\n        this._emitChange('nknEnabled', checked);\n      });\n      this._bindSettingToggle('nkn.enabled', nknInput, false);\n      content.appendChild(enabledToggle);\n      content.appendChild(createDivider());\n\n      const relayGroup = document.createElement('div');\n      relayGroup.className = 'config-group';\n      const { group: relayInputGroup, input: relayInput } = createInput({\n        label: 'Forwarder address',\n        placeholder: 'forwarder.… or pubkey',\n        value: relayValue,\n        onChange: (val) => this._emitChange('nknRelay', val.trim()),\n      });\n      this._bindSettingInput('nkn.relay', relayInput, relayValue);\n      relayInput.dataset.setting = 'nknRelay';\n      relayGroup.appendChild(relayInputGroup);\n      content.appendChild(relayGroup);\n\n      const datasetGroup = document.createElement('div');\n      datasetGroup.className = 'config-group';\n      const { group: datasetInputGroup, input: datasetInput } = createInput({\n        label: 'Dataset key',\n        placeholder: 'mapzen',\n        value: datasetValue,\n        onChange: (val) => this._emitChange('nknDataset', val.trim()),\n      });\n      this._bindSettingInput('nkn.dataset', datasetInput, datasetValue);\n      datasetInput.dataset.setting = 'nknDataset';\n      datasetGroup.appendChild(datasetInputGroup);\n      content.appendChild(datasetGroup);\n\n      const addrGroup = document.createElement('div');\n      addrGroup.className = 'config-group';\n      const { group: addrInputGroup, input: addrInput } = createInput({\n        label: 'My NKN address',\n        placeholder: 'Not connected',\n        value: addrValue,\n      });\n      addrInput.readOnly = true;\n      addrInput.dataset.setting = 'nknAddress';\n      addrGroup.appendChild(addrInputGroup);\n      content.appendChild(addrGroup);\n\n      return content;\n    }, {\n      getValue: () => this._getSettingValue('nkn.enabled', false) === true,\n      setValue: (val) => this._applyScenePatch({ nkn: { enabled: val } })\n    });\n\n    // Elevation Section (Debug)\n    this._addSection(container, 'elevation', 'Elevation', false, () => {\n      const content = document.createElement('div');\n      const batchSizeValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.elevation.batchSize', 500),\n        500,\n        { min: 1, max: 512 }\n      );\n      const maxConcurrentValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.elevation.maxConcurrent', 12),\n        12,\n        { min: 1, max: 50 }\n      );\n      const minIntervalValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.elevation.minIntervalMs', 30),\n        30,\n        { min: 0, max: 500 }\n      );\n      const surfaceMinLevelValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.elevation.surfaceMinLevel', 1),\n        1,\n        { min: 0, max: 6 }\n      );\n      const maxVertexRecordsValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.elevation.maxVertexRecords', 400000),\n        400000,\n        { min: 1000, max: 1000000 }\n      );\n      const ringNearMetersValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.elevation.ringNearMeters', 10000),\n        10000,\n        { min: 1000, max: 200000 }\n      );\n      const ringMidMetersValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.elevation.ringMidMeters', 40000),\n        40000,\n        { min: 1000, max: 500000 }\n      );\n      const ringNearKmValue = ringNearMetersValue / 1000;\n      const ringMidKmValue = ringMidMetersValue / 1000;\n      const ringBudgetNearValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.elevation.ringBudgetNear', 60),\n        60,\n        { min: 0, max: 100 }\n      );\n      const ringBudgetMidValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.elevation.ringBudgetMid', 25),\n        25,\n        { min: 0, max: 100 }\n      );\n      const fetchModeValue = String(\n        this._getSettingValue('scene.terrain.elevation.fetchMode', 'centric') || 'centric'\n      ).toLowerCase() === 'classic'\n        ? 'classic'\n        : 'centric';\n\n      const groupLabelStyle = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n\n      const { group: fetchModeGroup, select: fetchModeSelect } = createSelect({\n        label: 'Fetch Mode',\n        value: fetchModeValue,\n        options: [\n          { value: 'centric', label: 'Centric (Center-Out)' },\n          { value: 'classic', label: 'Classic (Balanced)' }\n        ],\n        onChange: (val) => this._emitChange('elevFetchMode', val)\n      });\n      this._bindSettingSelect('scene.terrain.elevation.fetchMode', fetchModeSelect, fetchModeValue);\n      content.appendChild(fetchModeGroup);\n      content.appendChild(createDivider());\n\n      const elevSettings = [\n        { key: 'batchSize', path: 'scene.terrain.elevation.batchSize', label: 'Batch Size', min: 1, max: 512, step: 1, value: batchSizeValue },\n        { key: 'maxConcurrent', path: 'scene.terrain.elevation.maxConcurrent', label: 'Max Concurrent', min: 1, max: 50, step: 1, value: maxConcurrentValue },\n        { key: 'minInterval', path: 'scene.terrain.elevation.minIntervalMs', label: 'Min Interval (ms)', min: 0, max: 500, step: 10, value: minIntervalValue },\n      ];\n\n      elevSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      // Traffic control\n      const trafficLabel = document.createElement('div');\n      trafficLabel.style.cssText = groupLabelStyle;\n      trafficLabel.textContent = 'Traffic Control';\n      content.appendChild(trafficLabel);\n\n      const maxKBPerMinuteSetting = this._getSettingValue('scene.terrain.elevation.maxKBPerMinute', null);\n      const maxKBPerMinValue = this._resolveNumber(\n        Number.isFinite(maxKBPerMinuteSetting)\n          ? maxKBPerMinuteSetting\n          : this._getSettingValue('scene.terrain.elevation.maxKBPerMin', 0),\n        0,\n        { min: 0, max: 65535 }\n      );\n\n      const { group: trafficGroup, range: trafficRange, valueDisplay: trafficValueDisplay } = createRangeSlider({\n        label: 'Max KB/min (0=unlimited)',\n        min: 0,\n        max: 65535,\n        step: 16,\n        value: maxKBPerMinValue,\n        onChange: (val) => this._emitChange('maxKBPerMin', val),\n      });\n      this._bindSettingRange('scene.terrain.elevation.maxKBPerMinute', trafficRange, null, {\n        valueDisplay: trafficValueDisplay,\n        transform: (val) => {\n          if (Number.isFinite(val)) return val;\n          const legacy = this._getSettingValue('scene.terrain.elevation.maxKBPerMin', maxKBPerMinValue);\n          return Number.isFinite(legacy) ? legacy : maxKBPerMinValue;\n        }\n      });\n      content.appendChild(trafficGroup);\n\n      content.appendChild(createDivider());\n\n      // Queue reset\n      const queueLabel = document.createElement('div');\n      queueLabel.style.cssText = groupLabelStyle;\n      queueLabel.textContent = 'Queue Reset';\n      content.appendChild(queueLabel);\n\n      const queueResetDistanceM = this._getSettingValue('scene.terrain.elevation.queueResetDistanceM', null);\n      const queueResetKmValue = this._resolveNumber(\n        Number.isFinite(queueResetDistanceM)\n          ? queueResetDistanceM / 1000\n          : this._getSettingValue('scene.terrain.elevation.queueResetKm', 100),\n        100,\n        { min: 10, max: 2000 }\n      );\n      const queueResetAngleDeg = this._getSettingValue('scene.terrain.elevation.queueResetAngleDeg', null);\n      const queueResetAngleValue = this._resolveNumber(\n        Number.isFinite(queueResetAngleDeg)\n          ? queueResetAngleDeg\n          : this._getSettingValue('scene.terrain.elevation.queueResetAngle', 15),\n        15,\n        { min: 1, max: 45 }\n      );\n\n      const queueSettings = [\n        { key: 'elevQueueResetKm', path: 'scene.terrain.elevation.queueResetDistanceM', label: 'Distance (km)', min: 10, max: 2000, step: 10, value: queueResetKmValue },\n        { key: 'elevQueueResetAngle', path: 'scene.terrain.elevation.queueResetAngleDeg', label: 'Angle (°)', min: 1, max: 45, step: 1, value: queueResetAngleValue },\n      ];\n\n      queueSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        const transform = setting.key === 'elevQueueResetKm'\n          ? (val) => {\n            if (Number.isFinite(val)) return val / 1000;\n            const legacy = this._getSettingValue('scene.terrain.elevation.queueResetKm', queueResetKmValue);\n            return Number.isFinite(legacy) ? legacy : queueResetKmValue;\n          }\n          : (val) => {\n            if (Number.isFinite(val)) return val;\n            const legacy = this._getSettingValue('scene.terrain.elevation.queueResetAngle', queueResetAngleValue);\n            return Number.isFinite(legacy) ? legacy : queueResetAngleValue;\n          };\n        this._bindSettingRange(setting.path, range, null, { valueDisplay, transform });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      const detailLabel = document.createElement('div');\n      detailLabel.style.cssText = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n      detailLabel.textContent = 'Elevation Detail';\n      content.appendChild(detailLabel);\n\n      const detailSettings = [\n        { key: 'elevSurfaceMinLevel', path: 'scene.terrain.elevation.surfaceMinLevel', label: 'Surface Min LOD', min: 0, max: 6, step: 1, value: surfaceMinLevelValue },\n        { key: 'elevMaxVertexRecords', path: 'scene.terrain.elevation.maxVertexRecords', label: 'Max Cached Vertices', min: 1000, max: 1000000, step: 1000, value: maxVertexRecordsValue },\n      ];\n\n      detailSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      content.appendChild(createDivider());\n\n      const ringLabel = document.createElement('div');\n      ringLabel.style.cssText = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n      ringLabel.textContent = 'Ring Coverage';\n      content.appendChild(ringLabel);\n\n      const ringSettings = [\n        { key: 'elevRingNearKm', path: 'scene.terrain.elevation.ringNearMeters', label: 'Near Radius (km)', min: 1, max: 50, step: 0.5, value: ringNearKmValue },\n        { key: 'elevRingMidKm', path: 'scene.terrain.elevation.ringMidMeters', label: 'Mid Radius (km)', min: 5, max: 200, step: 1, value: ringMidKmValue },\n        { key: 'elevRingBudgetNear', path: 'scene.terrain.elevation.ringBudgetNear', label: 'Near Budget (%)', min: 0, max: 100, step: 1, value: ringBudgetNearValue },\n        { key: 'elevRingBudgetMid', path: 'scene.terrain.elevation.ringBudgetMid', label: 'Mid Budget (%)', min: 0, max: 100, step: 1, value: ringBudgetMidValue },\n      ];\n\n      ringSettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        let transform = null;\n        if (setting.key === 'elevRingNearKm') {\n          transform = (val) => {\n            if (Number.isFinite(val)) return val / 1000;\n            const legacy = this._getSettingValue('scene.terrain.elevation.ringNearKm', ringNearKmValue);\n            return Number.isFinite(legacy) ? legacy : ringNearKmValue;\n          };\n        } else if (setting.key === 'elevRingMidKm') {\n          transform = (val) => {\n            if (Number.isFinite(val)) return val / 1000;\n            const legacy = this._getSettingValue('scene.terrain.elevation.ringMidKm', ringMidKmValue);\n            return Number.isFinite(legacy) ? legacy : ringMidKmValue;\n          };\n        }\n        this._bindSettingRange(setting.path, range, null, { valueDisplay, transform });\n        content.appendChild(group);\n      });\n\n      return content;\n    });\n\n    // Imagery Section (Debug)\n    this._addSection(container, 'imagery', 'Imagery', false, () => {\n      const content = document.createElement('div');\n      const imageryEnabled = !!this._getSettingValue('scene.terrain.imagery.enabled', true);\n      const maxZoomValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.imagery.maxZoom', 20),\n        20,\n        { min: 1, max: 22 }\n      );\n      const maxAtlasTilesValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.imagery.config.maxAtlasTiles', 5),\n        5,\n        { min: 1, max: 16 }\n      );\n      const padTilesValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.imagery.config.padTiles', 1),\n        1,\n        { min: 0, max: 2 }\n      );\n      const tileCacheValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.imagery.config.maxTileCacheMB', 100),\n        100,\n        { min: 10, max: 500 }\n      );\n      const atlasCacheValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.imagery.config.maxAtlasCacheMB', 200),\n        200,\n        { min: 50, max: 1000 }\n      );\n\n      const { wrapper: imageryToggle, input: imageryInput } = createToggle('Imagery Enabled', imageryEnabled, (checked) => {\n        this._emitChange('imageryEnabled', checked);\n      });\n      this._bindSettingToggle('scene.terrain.imagery.enabled', imageryInput, true);\n      content.appendChild(imageryToggle);\n\n      // Imagery Resolution Boost - independent of terrain LOD\n      const resolutionBoostValue = this._resolveNumber(\n        this._getSettingValue('scene.terrain.imagery.resolutionBoost', 0),\n        0,\n        { min: 0, max: 4 }\n      );\n      const { group: resolutionBoostGroup, range: resolutionBoostRange, valueDisplay: resolutionBoostValueDisplay } = createRangeSlider({\n        label: 'Resolution Boost',\n        min: 0,\n        max: 4,\n        step: 1,\n        value: resolutionBoostValue,\n        onChange: (val) => this._emitChange('imageryResolutionBoost', val),\n      });\n      this._bindSettingRange('scene.terrain.imagery.resolutionBoost', resolutionBoostRange, resolutionBoostValue, {\n        valueDisplay: resolutionBoostValueDisplay\n      });\n      const boostNote = document.createElement('div');\n      boostNote.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin-top: 4px; margin-bottom: 12px;';\n      boostNote.textContent = 'Increases imagery resolution for nearby tiles (0 = auto, 4 = max)';\n      content.appendChild(resolutionBoostGroup);\n      content.appendChild(boostNote);\n\n      content.appendChild(createDivider());\n\n      // Wayback Imagery Version Dropdown\n      const versionLabel = document.createElement('div');\n      versionLabel.style.cssText = 'font-size: 11px; color: #888; margin-bottom: 6px; font-weight: 500;';\n      versionLabel.textContent = 'Wayback Imagery Date | Powered by Esri';\n      content.appendChild(versionLabel);\n\n      const versionSelectWrapper = document.createElement('div');\n      versionSelectWrapper.style.cssText = 'margin-bottom: 12px;';\n\n      const versionSelect = document.createElement('select');\n      versionSelect.id = 'wayback-version-select';\n      versionSelect.style.cssText = `\n        width: 100%;\n        padding: 8px 12px;\n        background: rgba(255, 255, 255, 0.05);\n        border: 1px solid rgba(255, 255, 255, 0.1);\n        border-radius: 6px;\n        color: #fff;\n        font-size: 12px;\n        cursor: pointer;\n        outline: none;\n        transition: border-color 0.2s, background 0.2s;\n      `;\n      versionSelect.addEventListener('focus', () => {\n        versionSelect.style.borderColor = 'rgba(255, 255, 255, 0.3)';\n        versionSelect.style.background = 'rgba(255, 255, 255, 0.08)';\n      });\n      versionSelect.addEventListener('blur', () => {\n        versionSelect.style.borderColor = 'rgba(255, 255, 255, 0.1)';\n        versionSelect.style.background = 'rgba(255, 255, 255, 0.05)';\n      });\n\n      // Loading placeholder\n      const loadingOption = document.createElement('option');\n      loadingOption.value = '';\n      loadingOption.textContent = 'Loading imagery dates...';\n      versionSelect.appendChild(loadingOption);\n\n      versionSelect.addEventListener('change', () => {\n        const selectedVersion = versionSelect.value;\n        if (selectedVersion) {\n          this._emitChange('imageryVersion', selectedVersion);\n        }\n      });\n\n      versionSelectWrapper.appendChild(versionSelect);\n      content.appendChild(versionSelectWrapper);\n\n      // Timeline slider for quick navigation\n      const timelineWrapper = document.createElement('div');\n      timelineWrapper.style.cssText = 'margin-bottom: 16px;';\n\n      const timelineLabel = document.createElement('div');\n      timelineLabel.id = 'wayback-timeline-label';\n      timelineLabel.style.cssText = 'font-size: 10px; color: #666; text-align: center; margin-bottom: 4px;';\n      timelineLabel.textContent = 'Use slider to browse imagery history';\n      timelineWrapper.appendChild(timelineLabel);\n\n      const timelineSlider = document.createElement('input');\n      timelineSlider.type = 'range';\n      timelineSlider.id = 'wayback-timeline-slider';\n      timelineSlider.min = '0';\n      timelineSlider.max = '0';\n      timelineSlider.value = '0';\n      timelineSlider.style.cssText = `\n        width: 100%;\n        height: 4px;\n        -webkit-appearance: none;\n        background: rgba(255, 255, 255, 0.1);\n        border-radius: 2px;\n        outline: none;\n        cursor: pointer;\n      `;\n      timelineSlider.disabled = true;\n\n      timelineSlider.addEventListener('input', () => {\n        const idx = parseInt(timelineSlider.value, 10);\n        const versions = this._waybackVersions || [];\n        const v = versions[idx];\n        if (v) {\n          timelineLabel.textContent = v.label;\n          versionSelect.value = v.id;\n          this._emitChange('imageryVersion', v.id);\n        }\n      });\n\n      timelineWrapper.appendChild(timelineSlider);\n      content.appendChild(timelineWrapper);\n\n      // Auto-populate versions from ImageryManager\n      this._initWaybackVersionDropdown(versionSelect, timelineSlider, timelineLabel);\n      this._bindSettingSelect('scene.terrain.imagery.versionId', versionSelect, '', {\n        onSync: (val) => {\n          const versions = this._waybackVersions || [];\n          const idx = versions.findIndex((entry) => entry.id === val);\n          if (idx >= 0) {\n            timelineSlider.value = String(idx);\n            timelineLabel.textContent = versions[idx].label;\n          }\n        }\n      });\n\n      content.appendChild(createDivider());\n\n      // Bulk Wayback download (zoom levels 0-5)\n      const bulkLabel = document.createElement('div');\n      bulkLabel.style.cssText = 'font-size: 11px; color: #888; margin-bottom: 6px; font-weight: 500;';\n      bulkLabel.textContent = 'Bulk Wayback Download';\n      content.appendChild(bulkLabel);\n\n      const { group: bulkZoomGroup, range: bulkZoomRange, valueDisplay: bulkZoomValueDisplay } = createRangeSlider({\n        label: 'Download Zoom Level',\n        min: 0,\n        max: 5,\n        step: 1,\n        value: this._imageryBulkZoom,\n        onChange: (val) => {\n          this._imageryBulkZoom = Math.max(0, Math.min(5, Math.floor(val)));\n          if (bulkZoomValueDisplay) bulkZoomValueDisplay.textContent = String(this._imageryBulkZoom);\n        }\n      });\n      content.appendChild(bulkZoomGroup);\n\n      const bulkActions = document.createElement('div');\n      bulkActions.style.cssText = 'display: flex; gap: 8px; margin: 8px 0 6px;';\n\n      const bulkDownloadBtn = createButton('Download Zoom', {\n        variant: 'primary',\n        size: 'sm',\n        onClick: () => this._startImageryBulkDownload()\n      });\n      const bulkCancelBtn = createButton('Cancel', {\n        variant: 'secondary',\n        size: 'sm',\n        onClick: () => this._cancelImageryBulkDownload()\n      });\n      const bulkSaveBtn = createButton('Save Pack', {\n        variant: 'secondary',\n        size: 'sm',\n        onClick: () => this._saveImageryBulkDownload()\n      });\n\n      this._imageryBulkDownloadBtn = bulkDownloadBtn;\n      this._imageryBulkCancelBtn = bulkCancelBtn;\n      this._imageryBulkSaveBtn = bulkSaveBtn;\n      this._imageryBulkCancelBtn.disabled = true;\n      this._imageryBulkSaveBtn.disabled = true;\n\n      bulkActions.appendChild(bulkDownloadBtn);\n      bulkActions.appendChild(bulkCancelBtn);\n      bulkActions.appendChild(bulkSaveBtn);\n      content.appendChild(bulkActions);\n\n      const bulkStatus = document.createElement('div');\n      bulkStatus.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.6); margin-bottom: 6px;';\n      bulkStatus.textContent = 'Ready to download Wayback tiles.';\n      this._imageryBulkStatusEl = bulkStatus;\n      content.appendChild(bulkStatus);\n\n      const bulkProgress = document.createElement('div');\n      bulkProgress.style.cssText = 'height: 6px; width: 100%; background: rgba(255, 255, 255, 0.08); border-radius: 4px; overflow: hidden;';\n      const bulkProgressFill = document.createElement('div');\n      bulkProgressFill.style.cssText = 'height: 100%; width: 0%; background: rgba(95, 195, 255, 0.8); transition: width 0.2s ease;';\n      bulkProgress.appendChild(bulkProgressFill);\n      this._imageryBulkProgressFill = bulkProgressFill;\n      content.appendChild(bulkProgress);\n\n      const bulkNote = document.createElement('div');\n      bulkNote.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.45); margin-top: 6px; margin-bottom: 10px;';\n      bulkNote.textContent = 'Downloads Wayback tiles into the local cache; “Save Pack” exports a .tar archive.';\n      content.appendChild(bulkNote);\n\n      const imagerySettings = [\n        { key: 'imageryMaxZoom', path: 'scene.terrain.imagery.maxZoom', label: 'Max Zoom Level', min: 1, max: 22, step: 1, value: maxZoomValue },\n        { key: 'imageryMaxAtlasTiles', path: 'scene.terrain.imagery.config.maxAtlasTiles', label: 'Atlas Size (tiles)', min: 1, max: 16, step: 1, value: maxAtlasTilesValue },\n        { key: 'imageryPadTiles', path: 'scene.terrain.imagery.config.padTiles', label: 'Atlas Padding', min: 0, max: 2, step: 1, value: padTilesValue },\n        { key: 'imageryTileCacheMB', path: 'scene.terrain.imagery.config.maxTileCacheMB', label: 'Tile Cache (MB)', min: 10, max: 500, step: 10, value: tileCacheValue },\n        { key: 'imageryAtlasCacheMB', path: 'scene.terrain.imagery.config.maxAtlasCacheMB', label: 'Atlas Cache (MB)', min: 50, max: 1000, step: 50, value: atlasCacheValue },\n      ];\n\n      imagerySettings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      return content;\n    }, {\n      getValue: () => !!this._getSettingValue('scene.terrain.imagery.enabled', true),\n      setValue: (val) => this._applyScenePatch({ terrain: { imagery: { enabled: val } } })\n    });\n\n    // Photogrammetry Section (Debug)\n    this._addSection(container, 'photogrammetry', 'Photogrammetry', false, () => {\n      const content = document.createElement('div');\n\n      const enabledValue = !!this._getSettingValue('scene.terrain.photogrammetry.enabled', false);\n      const ring0OnlyValue = this._getSettingValue('scene.terrain.photogrammetry.ring0Only', true) !== false;\n      const invertValue = !!this._getSettingValue('scene.terrain.photogrammetry.invertHeight', false);\n      const autoSunValue = this._getSettingValue('scene.terrain.photogrammetry.autoSun', true) !== false;\n\n      const { wrapper: photoToggle, input: photoInput } = createToggle('Photogrammetry Enabled', enabledValue, (checked) => {\n        this._emitChange('photogramEnabled', checked);\n      });\n      this._bindSettingToggle('scene.terrain.photogrammetry.enabled', photoInput, false);\n      content.appendChild(photoToggle);\n\n      const { wrapper: ringToggle, input: ringInput } = createToggle('Ring 0 Only', ring0OnlyValue, (checked) => {\n        this._emitChange('photogramRing0Only', checked);\n      });\n      this._bindSettingToggle('scene.terrain.photogrammetry.ring0Only', ringInput, true);\n      content.appendChild(ringToggle);\n\n      const { wrapper: invertToggle, input: invertInput } = createToggle('Invert Height', invertValue, (checked) => {\n        this._emitChange('photogramInvert', checked);\n      });\n      this._bindSettingToggle('scene.terrain.photogrammetry.invertHeight', invertInput, false);\n      content.appendChild(invertToggle);\n\n      const { wrapper: autoSunToggle, input: autoSunInput } = createToggle('Auto Sun From Image', autoSunValue, (checked) => {\n        this._emitChange('photogramAutoSun', checked);\n      });\n      this._bindSettingToggle('scene.terrain.photogrammetry.autoSun', autoSunInput, true);\n      content.appendChild(autoSunToggle);\n\n      content.appendChild(createDivider());\n\n      const normalizeModeValue = String(this._getSettingValue('scene.terrain.photogrammetry.normalizeMode', 'tile') || 'tile');\n      const { group: normalizeGroup, select: normalizeSelect } = createSelect({\n        label: 'Normalize Mode',\n        value: normalizeModeValue,\n        options: [\n          { label: 'Tile', value: 'tile' },\n          { label: 'Global', value: 'global' },\n          { label: 'None', value: 'none' },\n        ],\n        onChange: (val) => this._emitChange('photogramNormalizeMode', val),\n      });\n      this._bindSettingSelect('scene.terrain.photogrammetry.normalizeMode', normalizeSelect, normalizeModeValue);\n      content.appendChild(normalizeGroup);\n\n      const settings = [\n        { key: 'photogramMapResolution', path: 'scene.terrain.photogrammetry.mapResolution', label: 'Map Resolution', min: 128, max: 1024, step: 128, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.mapResolution', 512), 512, { min: 128, max: 1024 }) },\n        { key: 'photogramPyramidLevels', path: 'scene.terrain.photogrammetry.pyramidLevels', label: 'Pyramid Levels', min: 1, max: 4, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.pyramidLevels', 3), 3, { min: 1, max: 4 }) },\n        { key: 'photogramIllumBlur', path: 'scene.terrain.photogrammetry.illumBlurRadius', label: 'Illum Blur Radius', min: 4, max: 96, step: 2, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.illumBlurRadius', 34), 34, { min: 4, max: 96 }) },\n        { key: 'photogramDisp', path: 'scene.terrain.photogrammetry.displacementScale', label: 'Displacement Scale', min: 0, max: 4, step: 0.01, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.displacementScale', 1.35), 1.35, { min: 0, max: 4 }) },\n        { key: 'photogramOffsetClamp', path: 'scene.terrain.photogrammetry.offsetClampMeters', label: 'Offset Clamp (m)', min: 0, max: 5, step: 0.1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.offsetClampMeters', 0), 0, { min: 0, max: 5 }) },\n        { key: 'photogramDetail', path: 'scene.terrain.photogrammetry.detailGain', label: 'Micro Detail Gain', min: 0, max: 3, step: 0.01, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.detailGain', 1.1), 1.1, { min: 0, max: 3 }) },\n        { key: 'photogramShadowMicro', path: 'scene.terrain.photogrammetry.shadowMicro', label: 'Shadow→Height (Micro)', min: -2, max: 2, step: 0.01, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.shadowMicro', 0.35), 0.35, { min: -2, max: 2 }) },\n        { key: 'photogramDirMicro', path: 'scene.terrain.photogrammetry.dirMicro', label: 'Directional Emboss', min: 0, max: 3, step: 0.01, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.dirMicro', 0.85), 0.85, { min: 0, max: 3 }) },\n        { key: 'photogramCanopyScale', path: 'scene.terrain.photogrammetry.canopyScale', label: 'Canopy Scale', min: 0, max: 6, step: 0.01, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.canopyScale', 2.6), 2.6, { min: 0, max: 6 }) },\n        { key: 'photogramVegThr', path: 'scene.terrain.photogrammetry.vegThreshold', label: 'Veg Threshold', min: 0, max: 1, step: 0.01, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.vegThreshold', 0.35), 0.35, { min: 0, max: 1 }) },\n        { key: 'photogramShadowThr', path: 'scene.terrain.photogrammetry.shadowThreshold', label: 'Shadow Threshold', min: 0, max: 1, step: 0.01, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.shadowThreshold', 0.22), 0.22, { min: 0, max: 1 }) },\n        { key: 'photogramMaxShadow', path: 'scene.terrain.photogrammetry.maxShadowLenPx', label: 'Max Shadow Len (px)', min: 8, max: 160, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.maxShadowLenPx', 72), 72, { min: 8, max: 160 }) },\n        { key: 'photogramCanopyBlur', path: 'scene.terrain.photogrammetry.canopyBlurPx', label: 'Canopy Blur', min: 1, max: 48, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.canopyBlurPx', 18), 18, { min: 1, max: 48 }) },\n        { key: 'photogramDome', path: 'scene.terrain.photogrammetry.domeStrength', label: 'Canopy Dome', min: 0, max: 3, step: 0.01, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.domeStrength', 0.55), 0.55, { min: 0, max: 3 }) },\n        { key: 'photogramSmooth', path: 'scene.terrain.photogrammetry.smoothPasses', label: 'Smoothing Passes', min: 0, max: 8, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.smoothPasses', 2), 2, { min: 0, max: 8 }) },\n        { key: 'photogramSunAz', path: 'scene.terrain.photogrammetry.sunAzimuthDeg', label: 'Sun Azimuth', min: 0, max: 360, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.sunAzimuthDeg', 50), 50, { min: 0, max: 360 }) },\n        { key: 'photogramSunEl', path: 'scene.terrain.photogrammetry.sunElevationDeg', label: 'Sun Elevation', min: 5, max: 85, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.sunElevationDeg', 35), 35, { min: 5, max: 85 }) },\n        { key: 'photogramTiles', path: 'scene.terrain.photogrammetry.tilesPerAxis', label: 'Tiles (N×N)', min: 1, max: 8, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.tilesPerAxis', 4), 4, { min: 1, max: 8 }) },\n        { key: 'photogramSubdiv', path: 'scene.terrain.photogrammetry.subdivPerTile', label: 'Subdiv Per Tile', min: 16, max: 256, step: 16, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.subdivPerTile', 160), 160, { min: 16, max: 256 }) },\n        { key: 'photogramMaxSubdiv', path: 'scene.terrain.photogrammetry.maxSubdiv', label: 'Max Subdiv', min: 32, max: 512, step: 16, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.maxSubdiv', 256), 256, { min: 32, max: 512 }) },\n        { key: 'photogramMinZoom', path: 'scene.terrain.photogrammetry.minImageryZoom', label: 'Min Imagery Zoom', min: 0, max: 22, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.minImageryZoom', 18), 18, { min: 0, max: 22 }) },\n        { key: 'photogramMinElevComplete', path: 'scene.terrain.photogrammetry.minElevationCompletion', label: 'Min Elevation Complete', min: 0, max: 1, step: 0.05, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.minElevationCompletion', 0.85), 0.85, { min: 0, max: 1 }) },\n        { key: 'photogramEdgeFade', path: 'scene.terrain.photogrammetry.edgeFade', label: 'Edge Fade', min: 0, max: 0.3, step: 0.01, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.edgeFade', 0.08), 0.08, { min: 0, max: 0.3 }) },\n        { key: 'photogramMaxJobs', path: 'scene.terrain.photogrammetry.maxJobsPerFrame', label: 'Jobs Per Frame', min: 1, max: 4, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.maxJobsPerFrame', 1), 1, { min: 1, max: 4 }) },\n        { key: 'photogramMaxConcurrent', path: 'scene.terrain.photogrammetry.maxConcurrentJobs', label: 'Concurrent Jobs', min: 1, max: 4, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.maxConcurrentJobs', 1), 1, { min: 1, max: 4 }) },\n        { key: 'photogramMaxMs', path: 'scene.terrain.photogrammetry.maxProcessingMs', label: 'Processing Budget (ms)', min: 1, max: 50, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.maxProcessingMs', 12), 12, { min: 1, max: 50 }) },\n        { key: 'photogramCacheMax', path: 'scene.terrain.photogrammetry.cacheMaxTiles', label: 'Cache Max Tiles', min: 0, max: 200, step: 1, value: this._resolveNumber(this._getSettingValue('scene.terrain.photogrammetry.cacheMaxTiles', 48), 48, { min: 0, max: 200 }) },\n      ];\n\n      settings.forEach((setting) => {\n        const { group, range, valueDisplay } = createRangeSlider({\n          label: setting.label,\n          min: setting.min,\n          max: setting.max,\n          step: setting.step,\n          value: setting.value,\n          onChange: (val) => this._emitChange(setting.key, val),\n        });\n        this._bindSettingRange(setting.path, range, setting.value, { valueDisplay });\n        content.appendChild(group);\n      });\n\n      const note = document.createElement('div');\n      note.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin-top: 6px;';\n      note.textContent = 'Photogrammetry runs on ring 0 tiles after imagery is applied.';\n      content.appendChild(note);\n\n      return content;\n    }, {\n      getValue: () => !!this._getSettingValue('scene.terrain.photogrammetry.enabled', false),\n      setValue: (val) => this._applyScenePatch({ terrain: { photogrammetry: { enabled: val } } })\n    });\n\n    // Cache Monitor Section\n    this._addSection(container, 'cacheMonitor', 'Cache Monitor', false, () => {\n      const content = document.createElement('div');\n      const cacheContainer = document.createElement('div');\n      cacheContainer.id = 'cache-metrics';\n\n      const metrics = [\n        { label: 'Elevation Cache', value: '--' },\n        { label: 'Imagery Tile Cache', value: '--' },\n        { label: 'Imagery Atlas Cache', value: '--' },\n      ];\n\n      metrics.forEach(({ label, value }) => {\n        const metric = createMetric(label, value);\n        metric.dataset.metric = label;\n        cacheContainer.appendChild(metric);\n      });\n\n      content.appendChild(cacheContainer);\n      return content;\n    });\n\n    // Weather Section (Debug)\n    this._addSection(container, 'weather', 'Weather', false, () => {\n      const content = document.createElement('div');\n      const weatherEnabled = !!this._getSettingValue('scene.weather.enabled', true);\n      const weatherAuto = !!this._getSettingValue('scene.weather.autoTarget', true);\n\n      const { wrapper: weatherToggle, input: weatherInput } = createToggle('Weather System', weatherEnabled, (checked) => {\n        this._emitChange('weatherEnabled', checked);\n      });\n      this._bindSettingToggle('scene.weather.enabled', weatherInput, true);\n      content.appendChild(weatherToggle);\n\n      const { wrapper: autoToggle, input: weatherAutoInput } = createToggle('Auto-fetch Weather', weatherAuto, (checked) => {\n        this._emitChange('weatherAuto', checked);\n      });\n      this._bindSettingToggle('scene.weather.autoTarget', weatherAutoInput, true);\n      content.appendChild(autoToggle);\n\n      content.appendChild(createDivider());\n\n      // Weather info display\n      const weatherInfo = document.createElement('div');\n      weatherInfo.className = 'config-metrics';\n      weatherInfo.id = 'weather-info';\n      content.appendChild(weatherInfo);\n\n      return content;\n    }, {\n      getValue: () => !!this._getSettingValue('scene.weather.enabled', true),\n      setValue: (val) => this._applyScenePatch({ weather: { enabled: val } })\n    });\n\n    // Camera Debug Section\n    this._addSection(container, 'cameraDebug', 'Camera Debug', false, () => {\n      const content = document.createElement('div');\n      const groupLabelStyle = 'font-size: 11px; color: #888; margin-bottom: 8px; font-weight: 500;';\n\n      const note = document.createElement('div');\n      note.style.cssText = 'font-size: 10px; color: rgba(255, 255, 255, 0.5); margin-bottom: 12px;';\n      note.textContent = 'Experimental camera transform debugging options.';\n      content.appendChild(note);\n\n      // Rotation controls\n      const rotLabel = document.createElement('div');\n      rotLabel.style.cssText = groupLabelStyle;\n      rotLabel.textContent = 'Rotation';\n      content.appendChild(rotLabel);\n\n      const rotationToggles = [\n        { key: 'flipRotation180', label: 'Add 180° to rotation.y', setting: 'scene.debug.flipRotation180' },\n        { key: 'invertQuaternion', label: 'Invert world quaternion', setting: 'scene.debug.invertQuaternion' },\n      ];\n\n      rotationToggles.forEach((toggle) => {\n        const value = !!this._getSettingValue(toggle.setting, false);\n        const { wrapper, input } = createToggle(toggle.label, value, (checked) => {\n          this._emitChange(toggle.key, checked);\n        });\n        this._bindSettingToggle(toggle.setting, input, false);\n        content.appendChild(wrapper);\n      });\n\n      content.appendChild(createDivider());\n\n      // Sun position controls\n      const sunLabel = document.createElement('div');\n      sunLabel.style.cssText = groupLabelStyle;\n      sunLabel.textContent = 'Sun Position';\n      content.appendChild(sunLabel);\n\n      const sunToggles = [\n        { key: 'negateSunX', label: 'Negate sun X in rotation', setting: 'scene.debug.negateSunX' },\n        { key: 'negateSunZ', label: 'Negate sun Z in rotation', setting: 'scene.debug.negateSunZ' },\n      ];\n\n      sunToggles.forEach((toggle) => {\n        const value = !!this._getSettingValue(toggle.setting, false);\n        const { wrapper, input } = createToggle(toggle.label, value, (checked) => {\n          this._emitChange(toggle.key, checked);\n        });\n        this._bindSettingToggle(toggle.setting, input, false);\n        content.appendChild(wrapper);\n      });\n\n      content.appendChild(createDivider());\n\n      // Focus direction controls\n      const focusLabel = document.createElement('div');\n      focusLabel.style.cssText = groupLabelStyle;\n      focusLabel.textContent = 'Focus Direction';\n      content.appendChild(focusLabel);\n\n      const focusToggles = [\n        { key: 'invertFocusDir', label: 'Negate entire viewFocusDir', setting: 'scene.debug.invertFocusDir' },\n        { key: 'negateFocusX', label: 'Negate viewFocusDir.x only', setting: 'scene.debug.negateFocusX' },\n        { key: 'negateFocusZ', label: 'Negate viewFocusDir.z only', setting: 'scene.debug.negateFocusZ' },\n      ];\n\n      focusToggles.forEach((toggle) => {\n        const value = !!this._getSettingValue(toggle.setting, false);\n        const { wrapper, input } = createToggle(toggle.label, value, (checked) => {\n          this._emitChange(toggle.key, checked);\n        });\n        this._bindSettingToggle(toggle.setting, input, false);\n        content.appendChild(wrapper);\n      });\n\n      content.appendChild(createDivider());\n\n      // Camera controls\n      const camLabel = document.createElement('div');\n      camLabel.style.cssText = groupLabelStyle;\n      camLabel.textContent = 'Camera Transform';\n      content.appendChild(camLabel);\n\n      const camToggles = [\n        { key: 'invertCameraDir', label: 'Negate camera look direction', setting: 'scene.debug.invertCameraDir' },\n        { key: 'invertCameraPos', label: 'Negate entire camera position', setting: 'scene.debug.invertCameraPos' },\n        { key: 'negateCamPosX', label: 'Negate camera.position.x', setting: 'scene.debug.negateCamPosX' },\n        { key: 'negateCamPosZ', label: 'Negate camera.position.z', setting: 'scene.debug.negateCamPosZ' },\n      ];\n\n      camToggles.forEach((toggle) => {\n        const value = !!this._getSettingValue(toggle.setting, false);\n        const { wrapper, input } = createToggle(toggle.label, value, (checked) => {\n          this._emitChange(toggle.key, checked);\n        });\n        this._bindSettingToggle(toggle.setting, input, false);\n        content.appendChild(wrapper);\n      });\n\n      return content;\n    });\n\n    // Debug Section\n    this._addSection(container, 'debug', 'Debug', false, () => {\n      const content = document.createElement('div');\n\n      const debugSettings = this._getSettingValue('scene.debug', {}) || {};\n      const hasStatePersist = typeof debugSettings.statePersist === 'boolean';\n      const statePersistEnabled = hasStatePersist ? debugSettings.statePersist : true;\n      const raycastLinePrecisionValue = this._resolveNumber(\n        this._getSettingValue('scene.debug.raycastLinePrecision', 1),\n        1,\n        { min: 0, max: 100 }\n      );\n\n      const { wrapper: persistToggle, input: persistInput } = createToggle('Persist View State', statePersistEnabled, (checked) => {\n        this._emitChange('statePersist', checked);\n      });\n      this._bindSettingToggle('scene.debug.statePersist', persistInput, true);\n      content.appendChild(persistToggle);\n\n      content.appendChild(createDivider());\n\n      const { group: raycastLinePrecisionGroup, range: raycastLinePrecisionRange, valueDisplay: raycastLinePrecisionValueDisplay } = createRangeSlider({\n        label: 'Raycast Line Precision (m)',\n        min: 0,\n        max: 100,\n        step: 0.1,\n        value: raycastLinePrecisionValue,\n        onChange: (val) => this._emitChange('raycastLinePrecision', val),\n      });\n      this._bindSettingRange('scene.debug.raycastLinePrecision', raycastLinePrecisionRange, raycastLinePrecisionValue, {\n        valueDisplay: raycastLinePrecisionValueDisplay\n      });\n      content.appendChild(raycastLinePrecisionGroup);\n\n      content.appendChild(createDivider());\n\n      // ── Cache & Storage ──\n      const cacheGroup = document.createElement('div');\n      cacheGroup.className = 'config-group';\n      const cacheTitle = document.createElement('div');\n      cacheTitle.className = 'config-group-title';\n      cacheTitle.textContent = 'Cache & Storage';\n      cacheGroup.appendChild(cacheTitle);\n\n      const cacheRow = document.createElement('div');\n      cacheRow.style.display = 'flex';\n      cacheRow.style.gap = '8px';\n      cacheRow.style.flexWrap = 'wrap';\n\n      cacheRow.appendChild(createButton('Clear Cache & Reload', {\n        variant: 'danger', size: 'sm',\n        onClick: () => {\n          if (confirm('Clear all cached data and reload? Settings will be preserved.')) {\n            try { caches?.keys?.().then(keys => keys.forEach(k => caches.delete(k))); } catch { /* no SW caches */ }\n            location.reload();\n          }\n        }\n      }));\n\n      cacheRow.appendChild(createButton('Full Reset & Reload', {\n        variant: 'danger', size: 'sm',\n        onClick: () => {\n          if (confirm('Clear ALL data (settings + cache) and reload?')) {\n            try { localStorage.clear(); } catch { /* ignore */ }\n            try { sessionStorage.clear(); } catch { /* ignore */ }\n            try { caches?.keys?.().then(keys => keys.forEach(k => caches.delete(k))); } catch { /* no SW caches */ }\n            location.reload();\n          }\n        }\n      }));\n\n      cacheGroup.appendChild(cacheRow);\n      content.appendChild(cacheGroup);\n\n      content.appendChild(createDivider());\n\n      // ── Settings (mirror of Overview) ──\n      const settingsGroup = document.createElement('div');\n      settingsGroup.className = 'config-group';\n      const settingsTitle = document.createElement('div');\n      settingsTitle.className = 'config-group-title';\n      settingsTitle.textContent = 'Settings';\n      settingsGroup.appendChild(settingsTitle);\n\n      const settingsRow = document.createElement('div');\n      settingsRow.style.display = 'flex';\n      settingsRow.style.gap = '8px';\n      settingsRow.style.flexWrap = 'wrap';\n\n      settingsRow.appendChild(createButton('Export', { variant: 'secondary', size: 'sm', onClick: () => this.onExport?.() }));\n      settingsRow.appendChild(createButton('Import', { variant: 'secondary', size: 'sm', onClick: () => this._triggerImport() }));\n      settingsRow.appendChild(createButton('Reset', { variant: 'danger', size: 'sm', onClick: () => this.onReset?.() }));\n\n      settingsGroup.appendChild(settingsRow);\n      content.appendChild(settingsGroup);\n\n      return content;\n    });\n\n    this._startLightingLiveUpdates();\n  }\n\n  // ── Meshtastic helper methods ─────────────────────────────────────\n\n  async _connectMeshtasticSerial() {\n    try {\n      const { getMeshtasticService } = await import('../meshtastic/MeshtasticService.js');\n      const svc = getMeshtasticService({ eventBus: this.eventBus });\n      await svc.connectSerial();\n      this._updateMeshtasticNodeList(svc.nodes);\n    } catch (err) {\n      console.warn('[Meshtastic] Serial connect failed:', err);\n      if (this._meshtasticStatusEl) {\n        this._meshtasticStatusEl.textContent = 'Status: ' + (err.message || 'Connection failed');\n        this._meshtasticStatusEl.style.color = '#ef4444';\n      }\n    }\n  }\n\n  async _fetchMeshtasticNodes(baseUrl = '') {\n    try {\n      const { getMeshtasticService } = await import('../meshtastic/MeshtasticService.js');\n      const svc = getMeshtasticService({ eventBus: this.eventBus });\n      const nodes = baseUrl\n        ? await svc.connectHttp(baseUrl)\n        : await svc.fetchNodes();\n      this._updateMeshtasticNodeList(nodes);\n    } catch (err) {\n      console.warn('[Meshtastic] Fetch failed:', err);\n    }\n  }\n\n  async _openMeshtasticThread(node) {\n    try {\n      const [{ getMeshtasticService }, { MeshtasticThreadView }] = await Promise.all([\n        import('../meshtastic/MeshtasticService.js'),\n        import('../meshtastic/MeshtasticThreadView.js'),\n      ]);\n      const service = getMeshtasticService({ eventBus: this.eventBus });\n      this._meshtasticService = service;\n      if (!this._meshtasticThreadView) {\n        this._meshtasticThreadView = new MeshtasticThreadView({\n          host: this._meshtasticThreadHost,\n          service,\n          originProvider: () => this._getMeshtasticRosterOrigin(),\n          onBack: () => {\n            if (this._meshtasticRosterHost) this._meshtasticRosterHost.hidden = false;\n            this._updateMeshtasticNodeList(this._meshtasticNodesCache);\n          },\n        });\n      }\n      if (this._meshtasticRosterHost) this._meshtasticRosterHost.hidden = true;\n      await this._meshtasticThreadView.open(node?.id || 'broadcast', { node });\n    } catch (error) {\n      console.warn('[Meshtastic] Unable to open node thread:', error);\n      if (this._meshtasticRosterHost) this._meshtasticRosterHost.hidden = false;\n    }\n  }\n\n  _getMeshtasticRosterOrigin() {\n    const sceneOrigin = this.scene?._currentPlayerLatLon?.();\n    if (Number.isFinite(sceneOrigin?.lat) && Number.isFinite(sceneOrigin?.lon)) {\n      return sceneOrigin;\n    }\n    const hudStore = getHudInfoStore();\n    const latValue = hudStore?.getData?.('nav.lat');\n    const lonValue = hudStore?.getData?.('nav.lon');\n    const lat = latValue === '' || latValue == null ? null : Number(latValue);\n    const lon = lonValue === '' || lonValue == null ? null : Number(lonValue);\n    return Number.isFinite(lat) && Number.isFinite(lon) ? { lat, lon } : null;\n  }\n\n  _updateMeshtasticNodeList(nodes) {\n    if (Array.isArray(nodes)) {\n      for (const node of nodes) {\n        if (!node?.id) continue;\n        const previous = this._meshtasticNodesById.get(node.id);\n        if (!previous) {\n          this._meshtasticNodesById.set(node.id, node);\n          continue;\n        }\n\n        const merged = { ...previous, ...node };\n        for (const field of ['hardware', 'role', 'snr', 'hopsAway', 'lat', 'lon', 'altitude', 'batteryLevel']) {\n          if (node[field] == null) merged[field] = previous[field] ?? null;\n        }\n        merged.lastHeard = Math.max(previous.lastHeard || 0, node.lastHeard || 0);\n        this._meshtasticNodesById.set(node.id, merged);\n      }\n    }\n    this._meshtasticNodesCache = Array.from(this._meshtasticNodesById.values());\n    const nowSeconds = Date.now() / 1000;\n    const origin = this._getMeshtasticRosterOrigin();\n\n    if (!this._meshtasticNodeList) return;\n    const visibleNodes = filterMeshtasticNodes(this._meshtasticNodesCache,\n      this._meshtasticNodeFilter,\n      nowSeconds,\n      {\n        origin,\n        maxAgeSeconds: this._meshtasticNodeRecencySeconds,\n        maxHops: this._meshtasticNodeMaxHops,\n        sortBy: this._meshtasticNodeSort,\n        searchQuery: this._meshtasticNodeSearch,\n      },\n    );\n    this._meshtasticNodeList.replaceChildren();\n    if (this._meshtasticNodeCountEl) {\n      this._meshtasticNodeCountEl.textContent = `${visibleNodes.length}/${this._meshtasticNodesCache.length}`;\n    }\n    if (visibleNodes.length === 0) {\n      if (this._meshtasticEmptyState) {\n        this._meshtasticEmptyState.textContent = this._meshtasticNodesCache.length\n          ? 'No nodes match these filters.'\n          : 'No nodes detected. Connect a device or fetch from API.';\n        this._meshtasticNodeList.appendChild(this._meshtasticEmptyState);\n      }\n      return;\n    }\n    for (const node of visibleNodes) {\n      const row = document.createElement('div');\n      row.style.cssText = 'display:grid;grid-template-columns:minmax(0,1fr) auto;gap:5px;padding:5px 0;border-bottom:1px solid rgba(255,255,255,0.06);font-size:10px;';\n      const copy = document.createElement('div');\n      copy.style.minWidth = '0';\n      const title = document.createElement('div');\n      title.style.cssText = 'overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,0.8);';\n      const dot = document.createElement('span');\n      dot.textContent = '● ';\n      dot.style.color = isMeshtasticNodeLive(node) ? '#4ade80' : '#fbbf24';\n      title.append(dot, document.createTextNode(meshtasticNodeTitle(node)));\n      const summary = document.createElement('div');\n      summary.style.cssText = 'margin-top:2px;color:rgba(255,255,255,0.35);font-size:9px;line-height:1.35;';\n      summary.textContent = meshtasticNodeSummary(node, nowSeconds, origin);\n      copy.append(title, summary);\n\n      const actions = document.createElement('div');\n      actions.style.cssText = 'display:flex;align-items:center;gap:3px;';\n      const makeAction = (label, handler, disabled = false) => {\n        const button = document.createElement('button');\n        button.type = 'button';\n        button.textContent = label;\n        button.disabled = disabled;\n        button.style.cssText = `padding:2px 5px;border:1px solid rgba(255,255,255,0.15);background:transparent;color:${disabled ? 'rgba(255,255,255,0.25)' : 'rgba(255,255,255,0.65)'};border-radius:3px;cursor:${disabled ? 'default' : 'pointer'};font:9px \"IBM Plex Mono\",monospace;text-transform:uppercase;`;\n        if (!disabled) button.addEventListener('click', handler);\n        return button;\n      };\n      actions.append(\n        makeAction('Go', () => this._goToLatLon(node.lat, node.lon), !hasMeshtasticPosition(node)),\n        makeAction(\n          this._meshtasticService?.getUnreadCount?.(node.id)\n            ? `Msg ${this._meshtasticService.getUnreadCount(node.id)}`\n            : 'Msg',\n          () => void this._openMeshtasticThread(node),\n          !node?.id,\n        ),\n      );\n      row.append(copy, actions);\n      bindMeshtasticNodeRowHover(row, node.id, this.eventBus, this._meshtasticNodeList);\n      this._meshtasticNodeList.appendChild(row);\n    }\n    syncMeshtasticNodeListHover(\n      this._meshtasticNodeList,\n      this._meshtasticHoveredNodeId,\n      { scroll: false },\n    );\n  }\n\n  // ── Radio Scanner (OpenMHz) helper methods ───────────────────────\n\n  async _radioLoadSystems() {\n    try {\n      const { getOpenMhzService } = await import('../radio/OpenMhzService.js');\n      const svc = getOpenMhzService({ eventBus: this.eventBus });\n      this._radioApplyTranscriptionEnabled(svc.isTranscriptionEnabled());\n      const systems = await svc.getSystems();\n      if (this._radioSystemSelect && systems?.length) {\n        this._radioSystemSelect.innerHTML = '';\n        const opt0 = document.createElement('option');\n        opt0.value = '';\n        opt0.textContent = `Select system (${systems.length} available)`;\n        this._radioSystemSelect.appendChild(opt0);\n        for (const sys of systems.filter(s => s.active).slice(0, 200)) {\n          const opt = document.createElement('option');\n          opt.value = sys.shortName;\n          opt.textContent = `${sys.name} — ${sys.city || ''}, ${sys.state || ''}`;\n          this._radioSystemSelect.appendChild(opt);\n        }\n      }\n    } catch (err) {\n      console.warn('[Radio] Failed to load systems:', err);\n      if (this._radioStatusEl) {\n        this._radioStatusEl.textContent = 'Status: Failed to load systems (Cloudflare may be blocking)';\n        this._radioStatusEl.style.color = '#ef4444';\n      }\n    }\n  }\n\n  async _radioAutoConnect() {\n    try {\n      const { getOpenMhzService } = await import('../radio/OpenMhzService.js');\n      const svc = getOpenMhzService({ eventBus: this.eventBus });\n      if (this._radioStatusEl) {\n        this._radioStatusEl.textContent = 'Status: Connecting...';\n        this._radioStatusEl.style.color = '#ffffff';\n      }\n      // Get camera lat/lon from HUD store (correct, accounts for planet rotation)\n      let lat = 0, lon = 0;\n      try {\n        const { getHudInfoStore } = await import('../../modules/hud-info-store.js');\n        const store = getHudInfoStore();\n        lat = parseFloat(store?.getData?.('nav.lat')) || 0;\n        lon = parseFloat(store?.getData?.('nav.lon')) || 0;\n      } catch {}\n      const system = await svc.autoConnect(lat, lon);\n      if (system) {\n        if (this._radioSystemSelect) this._radioSystemSelect.value = system.shortName;\n        svc.startAutoPlay();\n      } else {\n        if (this._radioStatusEl) {\n          this._radioStatusEl.textContent = 'Status: No systems found near you';\n          this._radioStatusEl.style.color = '#ef4444';\n        }\n      }\n    } catch (err) {\n      console.warn('[Radio] Auto-connect failed:', err);\n    }\n  }\n\n  async _radioSetSystem(shortName) {\n    try {\n      const { getOpenMhzService } = await import('../radio/OpenMhzService.js');\n      const svc = getOpenMhzService({ eventBus: this.eventBus });\n      if (this._radioStatusEl) {\n        this._radioStatusEl.textContent = 'Status: Connecting...';\n        this._radioStatusEl.style.color = '#ffffff';\n      }\n      await svc.setActiveSystem(shortName);\n      if (this._radioStatusEl) {\n        this._radioStatusEl.textContent = 'Status: Connected';\n        this._radioStatusEl.style.color = '#4ade80';\n      }\n      const info = svc.getActiveSystemInfo();\n      if (this._radioSysInfoEl && info) {\n        this._radioSysInfoEl.textContent = `${info.name} — ${info.city || ''}, ${info.state || ''}`;\n      }\n    } catch (err) {\n      console.warn('[Radio] Set system failed:', err);\n    }\n  }\n\n  async _radioTogglePlay() {\n    try {\n      const { getOpenMhzService } = await import('../radio/OpenMhzService.js');\n      const svc = getOpenMhzService({ eventBus: this.eventBus });\n      if (svc.isPlaying()) {\n        svc.stopAutoPlay();\n      } else {\n        svc.startAutoPlay();\n      }\n    } catch {}\n  }\n\n  _radioUpdateCallList(newCalls) {\n    if (!this._radioCallList) return;\n    for (const call of newCalls) {\n      const el = document.createElement('div');\n      el.style.cssText = 'padding: 3px 0; border-bottom: 1px solid rgba(255,255,255,0.06); font-size: 10px; cursor: pointer;';\n      el._openMhzCall = call;\n      el.addEventListener('mouseenter', () => { el.style.background = 'rgba(255,255,255,0.04)'; });\n      el.addEventListener('mouseleave', () => { el.style.background = 'transparent'; });\n      el.addEventListener('click', async () => {\n        const { getOpenMhzService } = await import('../radio/OpenMhzService.js');\n        getOpenMhzService().playCall(call);\n      });\n      const time = call.time ? new Date(call.time).toLocaleTimeString() : '';\n      const dur = call.len ? `${call.len}s` : '';\n      const title = document.createElement('span');\n      title.style.color = 'rgba(255, 255, 255,0.8)';\n      title.textContent = call.talkgroupName || `TG ${call.talkgroupNum}`;\n      const meta = document.createElement('span');\n      meta.style.cssText = 'color:rgba(255,255,255,0.3);margin-left:6px;';\n      meta.textContent = [time, dur].filter(Boolean).join(' ');\n      const status = document.createElement('div');\n      status.style.cssText = 'display:none;margin-top:2px;color:rgba(255,255,255,0.4);font-size:9px;';\n      const transcript = document.createElement('div');\n      transcript.style.cssText = 'display:none;margin-top:3px;padding:4px 6px;border-left:1px solid rgba(255,255,255,0.18);color:rgba(255,255,255,0.62);line-height:1.4;cursor:default;';\n      transcript.addEventListener('click', (event) => event.stopPropagation());\n      el.append(title, meta, status, transcript);\n      this._radioCallList.insertBefore(el, this._radioCallList.firstChild);\n      const entry = { call, el, status, transcript, callKey: '' };\n      this._radioCallRows.set(call, entry);\n      void import('../radio/OpenMhzService.js').then(({ getOpenMhzService }) => {\n        const svc = getOpenMhzService({ eventBus: this.eventBus });\n        entry.callKey = svc.getCallKey(call);\n        if (entry.callKey) this._radioCallRowsByKey.set(entry.callKey, entry);\n        const saved = svc.getTranscription(entry.callKey);\n        if (saved) this._radioUpdateTranscriptionState(saved);\n      });\n    }\n    // Keep last 50 DOM entries\n    while (this._radioCallList.children.length > 50) {\n      const last = this._radioCallList.lastChild;\n      const entry = this._radioCallRows.get(last?._openMhzCall);\n      if (entry?.callKey) this._radioCallRowsByKey.delete(entry.callKey);\n      if (last?._openMhzCall) this._radioCallRows.delete(last._openMhzCall);\n      this._radioCallList.removeChild(last);\n    }\n  }\n\n  async _radioToggleTranscribe() {\n    try {\n      const { getOpenMhzService } = await import('../radio/OpenMhzService.js');\n      const svc = getOpenMhzService({ eventBus: this.eventBus });\n      svc.setTranscriptionEnabled(!svc.isTranscriptionEnabled());\n      this._radioApplyTranscriptionEnabled(svc.isTranscriptionEnabled());\n    } catch (error) {\n      console.warn('[Radio] Failed to toggle transcription:', error);\n    }\n  }\n\n  _radioApplyTranscriptionEnabled(enabled) {\n    this._radioTranscribeActive = !!enabled;\n    if (this._radioTranscribeBtn) {\n      this._radioTranscribeBtn.textContent = this._radioTranscribeActive ? 'Transcribe ON' : 'Transcribe';\n      this._radioTranscribeBtn.style.borderColor = this._radioTranscribeActive ? '#ffffff' : '';\n      this._radioTranscribeBtn.style.color = this._radioTranscribeActive ? '#ffffff' : '';\n    }\n    if (!this._radioTranscribeActive && this._radioTranscriptEl) {\n      this._radioTranscriptEl.style.display = 'none';\n    }\n  }\n\n  _radioUpdateTranscriptionState(data) {\n    if (!data) return;\n    if (data.state === 'enabled') {\n      this._radioApplyTranscriptionEnabled(data.enabled);\n      return;\n    }\n    const entry = this._radioCallRows?.get(data.call)\n      || this._radioCallRowsByKey?.get(data.callKey);\n    if (entry) {\n      const labels = {\n        queued: 'Queued for ASR',\n        transcribing: 'Transcribing…',\n        cancelled: 'Transcription cancelled',\n        error: `Transcription failed: ${data.error || 'unknown error'}`,\n      };\n      if (data.state === 'complete') {\n        entry.status.style.display = 'none';\n        entry.transcript.style.display = 'block';\n        this._radioRenderTranscript(entry.transcript, data.call, data.text, data.addresses, false);\n      } else if (labels[data.state]) {\n        entry.status.textContent = labels[data.state];\n        entry.status.style.display = 'block';\n      }\n    }\n    if (data.state === 'transcribing' && this._radioTranscriptEl) {\n      this._radioTranscriptEl.style.display = 'block';\n      this._radioTranscriptEl.textContent = 'Transcribing…';\n    } else if (data.state === 'error' && this._radioTranscriptEl) {\n      this._radioTranscriptEl.style.display = 'block';\n      this._radioTranscriptEl.textContent = `Transcription failed: ${data.error || 'unknown error'}`;\n    } else if (data.state === 'complete') {\n      this._radioShowTranscript(data.call, data.text, data.addresses);\n    }\n  }\n\n  _radioShowTranscript(call, text, addresses) {\n    const el = this._radioTranscriptEl;\n    if (!el) return;\n    el.style.display = 'block';\n    this._radioRenderTranscript(el, call, text, addresses, true);\n  }\n\n  _radioRenderTranscript(el, call, text, addresses, includeHeader) {\n    el.replaceChildren();\n    const tgName = call?.talkgroupName || (call ? 'TG ' + call.talkgroupNum : '');\n    if (includeHeader && tgName) {\n      const header = document.createElement('div');\n      header.style.cssText = 'color:rgba(255,255,255,0.3);font-size:9px;text-transform:uppercase;margin-bottom:3px;';\n      header.textContent = tgName;\n      el.appendChild(header);\n    }\n    const copy = document.createElement('div');\n    copy.style.marginBottom = '4px';\n    copy.textContent = text || '(no speech detected)';\n    el.appendChild(copy);\n    if (addresses?.length) {\n      const addressList = document.createElement('div');\n      addressList.style.cssText = 'margin-top:4px;border-top:1px solid rgba(255,255,255,0.15);padding-top:4px;';\n      for (const addr of addresses) {\n        const link = document.createElement('button');\n        link.type = 'button';\n        link.className = 'radio-addr-link';\n        link.style.cssText = 'display:block;border:0;background:none;color:#ffffff;cursor:pointer;padding:2px 0;text-decoration:underline;font:inherit;text-align:left;';\n        link.textContent = addr;\n        link.addEventListener('click', (event) => {\n          event.stopPropagation();\n          this._radioGoToAddress(addr);\n        });\n        addressList.appendChild(link);\n      }\n      el.appendChild(addressList);\n    }\n  }\n\n  async _radioGoToAddress(address) {\n    try {\n      const { searchPlaces } = await import('../../modules/geocoding-service.js');\n      const { getOpenMhzService } = await import('../radio/OpenMhzService.js');\n      const sysInfo = getOpenMhzService().getActiveSystemInfo();\n      const locality = sysInfo ? `${sysInfo.city || ''} ${sysInfo.state || ''}`.trim() : '';\n      const query = locality ? `${address}, ${locality}` : address;\n      const results = await searchPlaces(query, { limit: 1 });\n      if (results?.length > 0) {\n        const lat = parseFloat(results[0].lat);\n        const lon = parseFloat(results[0].lon);\n        this._goToLatLon(lat, lon);\n      }\n    } catch (err) {\n      console.warn('[Radio] Geocode failed:', err);\n    }\n  }\n\n  _createSettingsPanel() {\n    const panel = document.createElement('div');\n    panel.className = 'nca-settings-panel';\n    return panel;\n  }\n\n  _createSettingsGroup(title, options = {}) {\n    const group = document.createElement('div');\n    group.className = 'config-group nca-settings-group';\n\n    if (title) {\n      const titleEl = document.createElement('div');\n      titleEl.className = 'config-group-title nca-settings-group-title';\n      titleEl.textContent = title;\n      group.appendChild(titleEl);\n    }\n\n    if (options.description) {\n      const description = document.createElement('div');\n      description.className = 'nca-settings-group-description';\n      description.textContent = options.description;\n      group.appendChild(description);\n    }\n\n    const controls = document.createElement('div');\n    controls.className = 'nca-settings-group-controls';\n    group.appendChild(controls);\n\n    return group;\n  }\n\n  _appendSettingControl(group, control) {\n    if (!group || !control) return null;\n    if (control.classList) {\n      control.classList.add('nca-setting-control');\n    }\n    const controls = group.querySelector?.('.nca-settings-group-controls') || group;\n    controls.appendChild(control);\n    return control;\n  }\n\n  _createSettingNote(text) {\n    const note = document.createElement('div');\n    note.className = 'nca-setting-note';\n    note.textContent = text;\n    return note;\n  }\n\n  _getGeoBoundaryService() {\n    if (!this._geoBoundaryService) {\n      this._geoBoundaryService = new GeoBoundaryService();\n    }\n    return this._geoBoundaryService;\n  }\n\n  _buildAdminLayersSection() {\n    const panel = this._createSettingsPanel();\n    const normalizeLevel = (value, fallback = 0) => {\n      const parsed = Number.parseInt(value, 10);\n      if (!Number.isFinite(parsed)) return fallback;\n      return Math.min(3, Math.max(0, parsed));\n    };\n    const normalizeCountry = (value) => {\n      const next = String(value || '').trim().toUpperCase();\n      return /^[A-Z]{3}$/.test(next) ? next : '';\n    };\n    const depthOptions = [\n      { label: 'ADM0 only', value: '0' },\n      { label: 'ADM1', value: '1' },\n      { label: 'ADM2', value: '2' },\n      { label: 'ADM3', value: '3' },\n    ];\n    const setSelectOptions = (select, options, value) => {\n      select.innerHTML = '';\n      options.forEach((option) => {\n        const optionEl = document.createElement('option');\n        optionEl.value = option.value;\n        optionEl.textContent = option.label;\n        select.appendChild(optionEl);\n      });\n      select.value = value;\n    };\n\n    const geoJsonEnabled = this._getSettingValue('scene.debug.geoJson', true) !== false;\n    const geoJsonAutoDepth = !!this._getSettingValue('scene.debug.geoJsonAutoDepth', false);\n    const geoJsonMaxDepth = normalizeLevel(this._getSettingValue('scene.debug.geoJsonMaxAdminLevel', 3), 3);\n    const geoJsonAdminLevel = normalizeLevel(this._getSettingValue('scene.debug.geoJsonAdminLevel', 0), 0);\n    const geoJsonCountry = normalizeCountry(this._getSettingValue('scene.debug.geoJsonCountry', ''));\n    const geoJsonAurora = this._getSettingValue('scene.debug.geoJsonAurora', true) !== false;\n    const geoJsonLabels = this._getSettingValue('scene.debug.geoJsonLabels', true) !== false;\n    const geoJsonLabelScaleCapAlt = this._resolveNumber(\n      this._getSettingValue('scene.debug.geoJsonLabelScaleCapAltM', 3_000_000),\n      3_000_000,\n      { min: 0, max: 20_000_000 }\n    );\n    const geoJsonLabelScaleReleaseAlt = this._resolveNumber(\n      this._getSettingValue('scene.debug.geoJsonLabelScaleReleaseAltM', 12_000_000),\n      12_000_000,\n      { min: 0, max: 20_000_000 }\n    );\n    const geoJsonLabelBorderRetireAlt = this._resolveNumber(\n      this._getSettingValue('scene.debug.geoJsonLabelBorderRetireAltM', 3_000_000),\n      3_000_000,\n      { min: 0, max: 20_000_000 }\n    );\n    const geoJsonFarMaxAlt = this._resolveNumber(\n      this._getSettingValue('scene.debug.geoJsonFarMaxAdminLevelAltM', 12_000_000),\n      12_000_000,\n      { min: 0, max: 20_000_000 }\n    );\n    const geoJsonFarMaxLevel = normalizeLevel(this._getSettingValue('scene.debug.geoJsonFarMaxAdminLevel', 0), 0);\n\n    let updateManualDisabled = () => {};\n    let applyManualSelection = () => {};\n    let countryLoadSeq = 0;\n\n    const visibilityGroup = this._createSettingsGroup('Layer', {\n      description: 'Direct GeoJSON boundary visibility and automatic local ADM depth.',\n    });\n    const { wrapper: enabledToggle, input: enabledInput } = createToggle('Borders enabled', geoJsonEnabled, (checked) => {\n      this._emitChange('geojson', checked);\n    });\n    this._bindSettingToggle('scene.debug.geoJson', enabledInput, true);\n    this._appendSettingControl(visibilityGroup, enabledToggle);\n\n    const { wrapper: autoDepthToggle, input: autoDepthInput } = createToggle('Auto ADM depth', geoJsonAutoDepth, (checked) => {\n      updateManualDisabled();\n      this._emitChange('geojsonAutoDepth', checked);\n      if (!checked) applyManualSelection();\n    });\n    this._bindSettingToggle('scene.debug.geoJsonAutoDepth', autoDepthInput, false, () => updateManualDisabled());\n    this._appendSettingControl(visibilityGroup, autoDepthToggle);\n\n    const { group: maxDepthGroup, select: maxDepthSelect } = createSelect({\n      label: 'Max ADM depth',\n      value: String(geoJsonMaxDepth),\n      options: depthOptions,\n      onChange: (val) => this._emitChange('geojsonMaxDepth', normalizeLevel(val, 3)),\n    });\n    this._bindSettingSelect('scene.debug.geoJsonMaxAdminLevel', maxDepthSelect, String(geoJsonMaxDepth), {\n      transform: (value) => String(normalizeLevel(value, 3)),\n      onSync: () => updateManualDisabled(),\n    });\n    this._appendSettingControl(visibilityGroup, maxDepthGroup);\n    this._appendSettingControl(\n      visibilityGroup,\n      this._createSettingNote('Auto depth loads the current-region ADM layers from the camera viewshed.')\n    );\n    panel.appendChild(visibilityGroup);\n\n    const manualGroup = this._createSettingsGroup('Manual Administration Layer', {\n      description: 'Choose a fixed ADM file when automatic depth is disabled.',\n    });\n    const { group: adminLevelGroup, select: adminLevelSelect } = createSelect({\n      label: 'Admin level',\n      value: String(geoJsonAdminLevel),\n      options: depthOptions,\n      onChange: async (val) => {\n        await populateCountries(val, countrySelect.value);\n        applyManualSelection();\n      },\n    });\n    this._bindSettingSelect('scene.debug.geoJsonAdminLevel', adminLevelSelect, String(geoJsonAdminLevel), {\n      transform: (value) => String(normalizeLevel(value, 0)),\n      onSync: (val) => {\n        void populateCountries(val, this._getSettingValue('scene.debug.geoJsonCountry', countrySelect.value));\n      },\n    });\n    this._appendSettingControl(manualGroup, adminLevelGroup);\n\n    const { group: countryGroup, select: countrySelect } = createSelect({\n      label: 'Country',\n      value: geoJsonCountry,\n      options: [{ label: 'Loading countries...', value: '' }],\n      onChange: () => applyManualSelection(),\n    });\n    countrySelect.dataset.baseDisabled = 'true';\n    this._bindSettingSelect('scene.debug.geoJsonCountry', countrySelect, geoJsonCountry, {\n      transform: (value) => normalizeCountry(value),\n      onSync: (val) => {\n        const level = normalizeLevel(adminLevelSelect.value, geoJsonAdminLevel);\n        if (level > 0) void populateCountries(level, val);\n      },\n    });\n    this._appendSettingControl(manualGroup, countryGroup);\n    this._appendSettingControl(\n      manualGroup,\n      this._createSettingNote('Manual mode writes geoJsonAdminLevel, geoJsonCountry, and geoJsonSource without changing the scene API.')\n    );\n    panel.appendChild(manualGroup);\n\n    const populateCountries = async (levelValue, selectedIso3 = countrySelect.value) => {\n      const level = normalizeLevel(levelValue, 0);\n      const selected = normalizeCountry(selectedIso3);\n      const seq = ++countryLoadSeq;\n      if (level <= 0) {\n        setSelectOptions(countrySelect, [{ label: 'All countries (ADM0)', value: '' }], '');\n        countrySelect.dataset.baseDisabled = 'true';\n        updateManualDisabled();\n        return;\n      }\n\n      countrySelect.dataset.baseDisabled = 'true';\n      setSelectOptions(countrySelect, [{ label: 'Loading countries...', value: '' }], '');\n      updateManualDisabled();\n\n      try {\n        const countries = await this._getGeoBoundaryService().getCountries(level);\n        if (seq !== countryLoadSeq) return;\n        const options = (Array.isArray(countries) ? countries : [])\n          .map((country) => ({\n            iso3: normalizeCountry(country?.iso3),\n            name: country?.name || normalizeCountry(country?.iso3),\n          }))\n          .filter((country) => country.iso3);\n\n        if (!options.length) {\n          setSelectOptions(countrySelect, [{ label: `No ADM${level} countries available`, value: '' }], '');\n          countrySelect.dataset.baseDisabled = 'true';\n          updateManualDisabled();\n          return;\n        }\n\n        const countryOptions = [\n          { label: 'Select country', value: '' },\n          ...options.map((country) => ({\n            label: `${country.name} (${country.iso3})`,\n            value: country.iso3,\n          })),\n        ];\n        const nextValue = options.some((country) => country.iso3 === selected) ? selected : '';\n        setSelectOptions(countrySelect, countryOptions, nextValue);\n        countrySelect.dataset.baseDisabled = 'false';\n      } catch (error) {\n        console.warn('[ConfigSidebar] Failed to load GeoJSON countries', error);\n        if (seq !== countryLoadSeq) return;\n        setSelectOptions(countrySelect, [{ label: `ADM${level} countries unavailable`, value: '' }], '');\n        countrySelect.dataset.baseDisabled = 'true';\n      }\n      updateManualDisabled();\n    };\n\n    const getManualSelection = () => {\n      const adminLevel = normalizeLevel(adminLevelSelect.value, 0);\n      if (adminLevel <= 0) {\n        return { adminLevel: 0, country: null, source: 'world.geojson' };\n      }\n      const country = normalizeCountry(countrySelect.value);\n      if (!country) return null;\n      return {\n        adminLevel,\n        country,\n        source: `ADM${adminLevel}/${country}.geojson`,\n      };\n    };\n\n    updateManualDisabled = () => {\n      const autoOn = !!autoDepthInput.checked;\n      maxDepthSelect.disabled = !autoOn;\n      adminLevelSelect.disabled = autoOn;\n      countrySelect.disabled = autoOn || countrySelect.dataset.baseDisabled === 'true';\n      manualGroup.classList.toggle('is-disabled', autoOn);\n    };\n\n    applyManualSelection = () => {\n      if (autoDepthInput.checked) return;\n      const selection = getManualSelection();\n      if (!selection) return;\n      this._emitChange('geojsonSelection', selection);\n    };\n\n    const displayGroup = this._createSettingsGroup('Display');\n    const { wrapper: labelsToggle, input: labelsInput } = createToggle('Border labels', geoJsonLabels, (checked) => {\n      this._emitChange('geojsonLabels', checked);\n    });\n    this._bindSettingToggle('scene.debug.geoJsonLabels', labelsInput, true);\n    this._appendSettingControl(displayGroup, labelsToggle);\n\n    const { wrapper: auroraToggle, input: auroraInput } = createToggle('Aurora border effect', geoJsonAurora, (checked) => {\n      this._emitChange('geojsonAurora', checked);\n    });\n    this._bindSettingToggle('scene.debug.geoJsonAurora', auroraInput, true);\n    this._appendSettingControl(displayGroup, auroraToggle);\n    panel.appendChild(displayGroup);\n\n    const advancedGroup = this._createSettingsGroup('Advanced Falloff');\n    const { group: labelCapGroup, range: labelCapRange, valueDisplay: labelCapDisplay } = createRangeSlider({\n      label: 'Label scale cap (m)',\n      min: 0,\n      max: 20_000_000,\n      step: 100_000,\n      value: geoJsonLabelScaleCapAlt,\n      onChange: (val) => this._emitChange('geojsonLabelScaleCapAlt', val),\n    });\n    this._bindSettingRange('scene.debug.geoJsonLabelScaleCapAltM', labelCapRange, geoJsonLabelScaleCapAlt, {\n      valueDisplay: labelCapDisplay,\n    });\n    this._appendSettingControl(advancedGroup, labelCapGroup);\n\n    const { group: labelReleaseGroup, range: labelReleaseRange, valueDisplay: labelReleaseDisplay } = createRangeSlider({\n      label: 'Label scale release (m)',\n      min: 0,\n      max: 20_000_000,\n      step: 100_000,\n      value: geoJsonLabelScaleReleaseAlt,\n      onChange: (val) => this._emitChange('geojsonLabelScaleReleaseAlt', val),\n    });\n    this._bindSettingRange('scene.debug.geoJsonLabelScaleReleaseAltM', labelReleaseRange, geoJsonLabelScaleReleaseAlt, {\n      valueDisplay: labelReleaseDisplay,\n    });\n    this._appendSettingControl(advancedGroup, labelReleaseGroup);\n\n    const { group: labelBorderRetireGroup, range: labelBorderRetireRange, valueDisplay: labelBorderRetireDisplay } = createRangeSlider({\n      label: 'Border retire altitude (m)',\n      min: 0,\n      max: 20_000_000,\n      step: 100_000,\n      value: geoJsonLabelBorderRetireAlt,\n      onChange: (val) => this._emitChange('geojsonLabelBorderRetireAlt', val),\n    });\n    this._bindSettingRange('scene.debug.geoJsonLabelBorderRetireAltM', labelBorderRetireRange, geoJsonLabelBorderRetireAlt, {\n      valueDisplay: labelBorderRetireDisplay,\n    });\n    this._appendSettingControl(advancedGroup, labelBorderRetireGroup);\n\n    const { group: farAltGroup, range: farAltRange, valueDisplay: farAltDisplay } = createRangeSlider({\n      label: 'Far ADM cap altitude (m)',\n      min: 0,\n      max: 20_000_000,\n      step: 100_000,\n      value: geoJsonFarMaxAlt,\n      onChange: (val) => this._emitChange('geojsonFarMaxLevelAlt', val),\n    });\n    this._bindSettingRange('scene.debug.geoJsonFarMaxAdminLevelAltM', farAltRange, geoJsonFarMaxAlt, {\n      valueDisplay: farAltDisplay,\n    });\n    this._appendSettingControl(advancedGroup, farAltGroup);\n\n    const { group: farLevelGroup, select: farLevelSelect } = createSelect({\n      label: 'Far-altitude ADM cap',\n      value: String(geoJsonFarMaxLevel),\n      options: depthOptions,\n      onChange: (val) => this._emitChange('geojsonFarMaxLevel', normalizeLevel(val, 0)),\n    });\n    this._bindSettingSelect('scene.debug.geoJsonFarMaxAdminLevel', farLevelSelect, String(geoJsonFarMaxLevel), {\n      transform: (value) => String(normalizeLevel(value, 0)),\n    });\n    this._appendSettingControl(advancedGroup, farLevelGroup);\n    panel.appendChild(advancedGroup);\n\n    void populateCountries(geoJsonAdminLevel, geoJsonCountry);\n    updateManualDisabled();\n\n    return panel;\n  }\n\n  _addSection(container, id, title, defaultOpen, contentBuilder, toggleConfig = null) {\n    // Restore open/closed state from localStorage (overrides defaultOpen)\n    const STORAGE_KEY = 'noclip.sidebar.sections';\n    let savedStates = {};\n    try { savedStates = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}'); } catch {}\n    const isOpen = savedStates.hasOwnProperty(id) ? !!savedStates[id] : defaultOpen;\n\n    const { section, contentWrapper } = createCollapsible(title, '', isOpen);\n    section.id = `config-section-${id}`;\n\n    // Persist open/close state on toggle\n    const header = section.querySelector('.nc-collapsible-header');\n    if (header) {\n      header.addEventListener('click', () => {\n        // Read after the toggle has been applied by createCollapsible's own handler\n        requestAnimationFrame(() => {\n          const nowOpen = section.classList.contains('open');\n          try {\n            const states = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');\n            states[id] = nowOpen;\n            localStorage.setItem(STORAGE_KEY, JSON.stringify(states));\n          } catch {}\n        });\n      });\n    }\n\n    const content = contentBuilder();\n    contentWrapper.appendChild(content);\n    for (const binding of this._settingBindings) {\n      if (binding.sectionId || !binding.input) continue;\n      if (binding.input === content || content.contains(binding.input)) {\n        binding.sectionId = id;\n      }\n    }\n\n    container.appendChild(section);\n\n    // Add quick toggle button if config provided\n    let toggleBtn = null;\n    if (toggleConfig) {\n      const header = section.querySelector('.nc-collapsible-header');\n      if (header) {\n        toggleBtn = document.createElement('button');\n        toggleBtn.className = 'nc-section-toggle';\n        toggleBtn.type = 'button';\n        toggleBtn.title = `Toggle ${title}`;\n        toggleBtn.innerHTML = `<span class=\"toggle-indicator\"></span>`;\n\n        // Set initial state\n        const updateToggleState = () => {\n          const enabled = toggleConfig.getValue();\n          toggleBtn.classList.toggle('enabled', enabled);\n          toggleBtn.title = enabled ? `Disable ${title}` : `Enable ${title}`;\n        };\n        updateToggleState();\n\n        // Handle click (stop propagation to prevent collapsible toggle)\n        toggleBtn.addEventListener('click', (e) => {\n          e.stopPropagation();\n          const current = toggleConfig.getValue();\n          toggleConfig.setValue(!current);\n          updateToggleState();\n        });\n\n        // Insert before the caret icon\n        const icon = header.querySelector('.nc-collapsible-icon');\n        if (icon) {\n          header.insertBefore(toggleBtn, icon);\n        } else {\n          header.appendChild(toggleBtn);\n        }\n\n        // Store update function for external sync\n        section._updateToggleState = updateToggleState;\n      }\n    }\n\n    this.sections.set(id, { section, contentWrapper, toggleBtn });\n\n    if (id === 'navigation') {\n      const header = section.querySelector('.nc-collapsible-header');\n      if (header) {\n        header.addEventListener('click', () => {\n          if (!section.classList.contains('open')) return;\n          this._refreshMiniMap();\n        });\n      }\n    }\n  }\n\n  _buildFooter(footer) {\n    // Version info\n    const version = document.createElement('div');\n    version.style.fontSize = '10px';\n    version.style.color = 'rgba(255, 255, 255, 0.4)';\n    version.style.width = '100%';\n    version.textContent = 'NoClip Earth v0.1.0';\n    footer.appendChild(version);\n  }\n\n  _bindEvents() {\n    if (this.toggleBtn) {\n      this.toggleBtn.addEventListener('click', () => this.toggle());\n    }\n\n    this.element.querySelector('.config-sidebar-close').addEventListener('click', () => {\n      this.close();\n      if (this.onRequestClose) {\n        this.onRequestClose();\n      }\n    });\n  }\n\n  _triggerImport() {\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.accept = '.json';\n    input.onchange = (e) => {\n      const file = e.target.files?.[0];\n      if (file && this.onImport) {\n        this.onImport(file);\n      }\n    };\n    input.click();\n  }\n\n  _emitChange(key, value) {\n    if (this._isSyncing) return;\n    if (this._applySettingChange(key, value)) return;\n    if (this.onSettingChange) {\n      this.onSettingChange(key, value);\n    }\n  }\n\n  /**\n   * Navigate to a specific lat/lon location\n   */\n  _goToLatLon(lat, lon) {\n    // Clamp values\n    lat = Math.max(-90, Math.min(90, lat));\n    lon = ((lon + 180) % 360 + 360) % 360 - 180; // Wrap to [-180, 180]\n\n    // Get surface controller\n    const surfaceController = this.uiController?.surfaceController\n      || this.scene?._surfaceController\n      || null;\n\n    if (surfaceController?.initializeSurfaceModeFromLatLon) {\n      // Preserve current yaw/pitch if available\n      const yaw = surfaceController.surfaceState?.yaw ?? 0;\n      const pitch = surfaceController.surfaceState?.pitch ?? 0;\n      surfaceController.initializeSurfaceModeFromLatLon(lat, lon, null, yaw, pitch, null);\n\n      const focusDir = surfaceController.surfaceState?.up;\n      if (this.scene?.api?.camera?.beginSurfaceTravel) {\n        this.scene.api.camera.beginSurfaceTravel(focusDir, 'config-goto-latlon');\n      } else if (this.scene?._handleSurfaceEnter) {\n        this.scene._handleSurfaceEnter({ reason: 'config-goto-latlon', focusDir });\n      } else {\n        this.uiController?.handleSurfaceEnter?.({ reason: 'goto-latlon' });\n      }\n    } else {\n      console.warn('[ConfigSidebar] Cannot go to lat/lon - no surface controller available');\n    }\n  }\n\n  /**\n   * Handle search input with debouncing\n   */\n  _onSearchInput(query) {\n    this._searchEpoch = (this._searchEpoch || 0) + 1;\n    this._geocodingService?.cancel?.();\n    getPlaceSearchStore().clear(this);\n    if (this._searchDebounceTimer) {\n      clearTimeout(this._searchDebounceTimer);\n    }\n\n    if (!query || query.trim().length < 2) {\n      this._clearSearchResults();\n      return;\n    }\n\n    // Match the reference search debounce.\n    this._searchDebounceTimer = setTimeout(() => {\n      this._performSearch(query);\n    }, 260);\n  }\n\n  /**\n   * Perform geocoding search\n   */\n  async _performSearch(query, options = {}) {\n    const epoch = this._searchEpoch = (this._searchEpoch || 0) + 1;\n    if (!query || !query.trim()) {\n      this._clearSearchResults();\n      return [];\n    }\n\n    if (!this._geocodingService) {\n      this._geocodingService = getGeocodingService();\n    }\n\n    const limit = Number.isFinite(options.limit) ? Math.max(1, Math.floor(options.limit)) : 8;\n\n    // Show loading state\n    if (this._searchResults) {\n      this._searchResults.style.display = 'block';\n      this._searchResults.innerHTML = '<div style=\"color: rgba(255,255,255,0.5); font-size: 11px; padding: 8px;\">Searching...</div>';\n    }\n\n    try {\n      const results = await this._geocodingService.search(query, { limit });\n      if (epoch !== this._searchEpoch) return [];\n      this._lastSearchResults = Array.isArray(results) ? results : [];\n\n      if (!results || results.length === 0) {\n        if (this._searchResults) this._searchResults.textContent = lookupNotice(results) || 'No local matches found';\n        this._updateMiniMapSearchMarkers([]);\n        if (options.syncPinned) {\n          this._renderPinnedSearchResults([]);\n        }\n        return [];\n      }\n\n      this._renderSearchResults(results);\n      this._updateMiniMapSearchMarkers(results);\n      if (options.syncPinned) {\n        this._renderPinnedSearchResults(results);\n      }\n      return results;\n\n    } catch (err) {\n      if (epoch !== this._searchEpoch || err?.name === 'AbortError') return [];\n      console.error('[ConfigSidebar] Search error:', err);\n      if (this._searchResults) {\n        this._searchResults.innerHTML = '<div style=\"color: #f87171; font-size: 11px; padding: 8px;\">Search failed</div>';\n      }\n      this._lastSearchResults = [];\n      if (options.syncPinned) {\n        this._renderPinnedSearchResults([]);\n      }\n      return [];\n    }\n  }\n\n  /**\n   * Render search results in the sidebar\n   */\n  _renderSearchResults(results) {\n    if (!this._searchResults) return;\n\n    this._searchResults.innerHTML = '';\n    this._searchResults.style.display = 'block';\n    if (!this._offPlaceSearchList) this._offPlaceSearchList = bindPlaceSearchList(this._searchResults,\n      { owner: this, selector: '.search-result-item', indexAttribute: 'data-index' });\n    const notice = lookupNotice(results);\n    if (notice) {\n      const message = document.createElement('div'); message.className = 'search-coverage-notice';\n      message.textContent = notice; this._searchResults.appendChild(message);\n    }\n\n    results.forEach((result, index) => {\n      const formatted = formatResultForDisplay(result);\n      if (!formatted) return;\n\n      const item = document.createElement('div');\n      item.className = 'search-result-item';\n      item.dataset.index = String(index); item.tabIndex = 0; item.setAttribute('role', 'button');\n      item.addEventListener('keydown', event => { if (event.key === 'Enter') this._selectSearchResult(result, item); });\n      item.style.cssText = `\n        padding: 8px 10px;\n        cursor: pointer;\n        border-bottom: 1px solid rgba(255,255,255,0.08);\n        transition: background 0.15s;\n      `;\n      item.addEventListener('mouseenter', () => {\n        item.style.background = 'rgba(255,255,255,0.08)';\n      });\n      item.addEventListener('mouseleave', () => {\n        item.style.background = this._selectedSearchResult === result ? 'rgba(74,144,217,0.2)' : 'transparent';\n      });\n      item.addEventListener('click', () => {\n        this._selectSearchResult(result, item);\n      });\n\n      const primaryText = document.createElement('div');\n      primaryText.style.cssText = 'font-size: 12px; color: #fff; font-weight: 500;';\n      primaryText.textContent = formatted.primary;\n\n      const secondaryText = document.createElement('div');\n      secondaryText.style.cssText = 'font-size: 10px; color: rgba(255,255,255,0.5); margin-top: 2px;';\n      secondaryText.textContent = formatted.secondary || formatted.coordinates;\n\n      const typeTag = document.createElement('span');\n      typeTag.style.cssText = 'font-size: 9px; color: rgba(255,255,255,0.4); background: rgba(255,255,255,0.1); padding: 1px 4px; border-radius: 3px; margin-left: 6px;';\n      typeTag.textContent = formatted.type;\n      primaryText.appendChild(typeTag);\n\n      item.appendChild(primaryText);\n      item.appendChild(secondaryText);\n      this._searchResults.appendChild(item);\n    });\n    getPlaceSearchStore().setResults(this, results, { onSelect: result => this._selectSearchResult(result) });\n  }\n\n  /**\n   * Select a search result\n   */\n  _selectSearchResult(result, itemElement) {\n    this._selectedSearchResult = result;\n\n    // Highlight selected item\n    const items = this._searchResults?.querySelectorAll('.search-result-item') || [];\n    items.forEach((item) => {\n      item.style.background = 'transparent';\n    });\n    if (itemElement) {\n      itemElement.style.background = 'rgba(74,144,217,0.2)';\n    }\n\n    // Highlight on minimap\n    this._highlightSearchResultOnMap(result);\n\n    // Show go-to button or go directly\n    this._goToSearchResult(result);\n  }\n\n  /**\n   * Navigate to search result\n   */\n  _goToSearchResult(result) {\n    if (!result || !Number.isFinite(result.lat) || !Number.isFinite(result.lon)) {\n      return;\n    }\n\n    this._navigateToPlaceSearchResult(result);\n\n    // Clear search after navigation\n    const epoch = this._searchEpoch;\n    setTimeout(() => {\n      if (epoch !== this._searchEpoch) return;\n      this._clearSearchResults();\n      if (this._searchInput) {\n        this._searchInput.value = '';\n      }\n    }, 500);\n  }\n\n  /**\n   * Clear search results\n   */\n  _clearSearchResults() {\n    this._searchEpoch = (this._searchEpoch || 0) + 1;\n    this._geocodingService?.cancel?.();\n    if (this._searchResults) {\n      this._searchResults.innerHTML = '';\n      this._searchResults.style.display = 'none';\n    }\n    this._selectedSearchResult = null;\n    this._lastSearchResults = [];\n    this._updateMiniMapSearchMarkers([]);\n  }\n\n  /**\n   * Update search result markers on the minimap\n   */\n  _updateMiniMapSearchMarkers(results) {\n    // Shared renderer projects the active top/sidebar/NAV search to every map\n    // and the surface without a second Leaflet layer or unsolicited recenter.\n    if (!results?.length) getPlaceSearchStore().clear(this);\n  }\n\n  /**\n   * Highlight a specific search result on the map\n   */\n  _highlightSearchResultOnMap(result) {\n    // Full-screen navigation owns its one camera update and current zoom.\n    if (globalThis.window?.__noclipMapMode === '2d') return;\n    if (!this._miniMap?._map || !result) return;\n\n    // Center map on the result\n    if (Number.isFinite(result.lat) && Number.isFinite(result.lon)) {\n      this._miniMap._map.setView([result.lat, result.lon], 14, { animate: true });\n    }\n  }\n\n  _navigateToPlaceSearchResult(result) {\n    const widget = globalThis.window?.__noclipMiniMap?.miniMapWidget || this._miniMap;\n    if (globalThis.window?.__noclipMapMode === '2d' && widget?._map) {\n      widget.disableGpsLock?.({ reason: 'search-selection', resetBearing: false });\n      widget._manualMode = true;\n      widget._map.setView([result.lat, result.lon], Math.max(14, widget._map.getZoom()), { animate: true });\n      return;\n    }\n    this._goToLatLon(result.lat, result.lon);\n  }\n\n  _getIncidentApi() {\n    if (!this._incidentApi) {\n      this._incidentApi = getIncidentApiService();\n    }\n    return this._incidentApi;\n  }\n\n  _getIncidentAgencyIds() {\n    const raw = this._getSettingValue('scene.incidents.agencyIds', []);\n    if (Array.isArray(raw)) {\n      return raw.map((entry) => String(entry).trim()).filter(Boolean);\n    }\n    if (typeof raw === 'string') {\n      return raw.split(',').map((entry) => entry.trim()).filter(Boolean);\n    }\n    return [];\n  }\n\n  _setIncidentAutoEnabled(enabled) {\n    const next = enabled === true;\n    if (this._incidentAutoEnabled === next) return;\n    this._incidentAutoEnabled = next;\n    if (next) {\n      this._startIncidentAutoTimer();\n      this._runIncidentAutoDiscover({ force: true });\n    } else {\n      this._stopIncidentAutoTimer();\n    }\n  }\n\n  /**\n   * Keep incident agency discovery available to every control surface.\n   * Historically this lifecycle started only when the desktop Incidents\n   * settings section happened to render, so phone users could enable the feed\n   * without ever resolving a PulsePoint agency for their current location.\n   */\n  setIncidentAutoDiscoveryEnabled(enabled) {\n    this._setIncidentAutoEnabled(enabled);\n  }\n\n  _startIncidentAutoTimer() {\n    if (this._incidentAutoTimer) return;\n    this._incidentAutoTimer = setInterval(() => {\n      this._runIncidentAutoDiscover();\n    }, 15000);\n  }\n\n  _stopIncidentAutoTimer() {\n    if (!this._incidentAutoTimer) return;\n    clearInterval(this._incidentAutoTimer);\n    this._incidentAutoTimer = null;\n  }\n\n  async _runIncidentAutoDiscover({ force = false } = {}) {\n    if (!this._incidentAutoEnabled) return;\n    if (this._incidentAutoInFlight) return;\n\n    const hudStore = getHudInfoStore();\n    const lat = hudStore?.getData?.('nav.lat');\n    const lon = hudStore?.getData?.('nav.lon');\n    if (!Number.isFinite(lat) || !Number.isFinite(lon)) return;\n\n    const now = Date.now();\n    const minIntervalMs = 30000;\n    const minMoveM = 2000;\n\n    if (!force) {\n      if (this._incidentAutoLastAt && (now - this._incidentAutoLastAt) < minIntervalMs) return;\n      if (Number.isFinite(this._incidentAutoLastLat) && Number.isFinite(this._incidentAutoLastLon)) {\n        const dLat = (lat - this._incidentAutoLastLat) * 111000;\n        const dLon = (lon - this._incidentAutoLastLon) * 111000 * Math.cos(lat * Math.PI / 180);\n        const distM = Math.sqrt(dLat * dLat + dLon * dLon);\n        if (distM < minMoveM) return;\n      }\n    }\n\n    this._incidentAutoInFlight = true;\n    const seq = ++this._incidentAutoSeq;\n    try {\n      const result = await reverseGeocode(lat, lon, { zoom: 16 });\n      if (seq !== this._incidentAutoSeq) return;\n      const zip = result?.address?.postcode || result?.address?.postal_code || result?.address?.zip || '';\n      const normalizedZip = String(zip || '').trim();\n      if (!normalizedZip) return;\n      if (!force && normalizedZip === this._incidentAutoLastZip) {\n        this._incidentAutoLastAt = now;\n        this._incidentAutoLastLat = lat;\n        this._incidentAutoLastLon = lon;\n        return;\n      }\n\n      const agencies = await this._getIncidentApi().searchAgencies(normalizedZip);\n      if (seq !== this._incidentAutoSeq) return;\n      const agencyIds = Array.isArray(agencies)\n        ? agencies.map((agency) => String(agency?.agencyId || '').trim()).filter(Boolean)\n        : [];\n      if (!agencyIds.length) {\n        this._incidentAutoLastZip = normalizedZip;\n        this._incidentAutoLastAt = now;\n        this._incidentAutoLastLat = lat;\n        this._incidentAutoLastLon = lon;\n        return;\n      }\n\n      agencies.forEach((agency) => {\n        if (!agency?.agencyId) return;\n        const label = agency.label || agency.agencyId;\n        this._incidentAgencyMap.set(agency.agencyId, label);\n      });\n\n      const currentIds = this._getIncidentAgencyIds();\n      const manualIds = currentIds.filter((id) => !this._incidentAutoAgencyIds.has(id));\n      this._incidentAutoAgencyIds = new Set(agencyIds);\n\n      const combinedSet = new Set([...manualIds, ...agencyIds]);\n      const combined = Array.from(combinedSet);\n      this._emitChange('incidentsAgencyIds', combined);\n      this._renderIncidentSelectedAgencies(combined);\n\n      this._incidentAutoLastZip = normalizedZip;\n      this._incidentAutoLastAt = now;\n      this._incidentAutoLastLat = lat;\n      this._incidentAutoLastLon = lon;\n    } catch (error) {\n      console.warn('[ConfigSidebar] Incident auto-discovery failed', error);\n      // Prevent repeated geocode retries from hammering failing upstream/proxy paths.\n      this._incidentAutoLastAt = now;\n      this._incidentAutoLastLat = lat;\n      this._incidentAutoLastLon = lon;\n    } finally {\n      this._incidentAutoInFlight = false;\n    }\n  }\n\n  _setIncidentSearchMessage(message) {\n    if (!this._incidentSearchResults) return;\n    this._incidentSearchCache = [];\n    this._incidentSearchResults.innerHTML = '';\n    const note = document.createElement('div');\n    note.style.cssText = 'font-size: 11px; color: rgba(255, 255, 255, 0.55);';\n    note.textContent = message;\n    this._incidentSearchResults.appendChild(note);\n  }\n\n  _renderIncidentSearchResults(results = []) {\n    if (!this._incidentSearchResults) return;\n    const container = this._incidentSearchResults;\n    this._incidentSearchCache = Array.isArray(results) ? results : [];\n    container.innerHTML = '';\n\n    if (!results.length) {\n      this._setIncidentSearchMessage('No agencies found.');\n      return;\n    }\n\n    const selectedIds = new Set(this._getIncidentAgencyIds());\n\n    results.forEach((entry) => {\n      if (!entry?.agencyId) return;\n      const row = document.createElement('div');\n      row.style.cssText = 'display: flex; gap: 8px; align-items: center; justify-content: space-between; padding: 6px 8px; background: rgba(255,255,255,0.06); border-radius: 6px;';\n\n      const label = document.createElement('div');\n      label.style.cssText = 'flex: 1; font-size: 11px; color: #fff;';\n      const detail = entry.detail ? ` - ${entry.detail}` : '';\n      label.textContent = `${entry.label || entry.agencyId} (${entry.agencyId})${detail}`;\n      row.appendChild(label);\n\n      const alreadySelected = selectedIds.has(entry.agencyId);\n      const addBtn = createButton(alreadySelected ? 'Added' : 'Add', {\n        variant: 'secondary',\n        size: 'sm',\n        disabled: alreadySelected,\n        onClick: () => {\n          const current = this._getIncidentAgencyIds();\n          if (current.includes(entry.agencyId)) return;\n          const nextIds = [...current, entry.agencyId];\n          this._incidentAgencyMap.set(entry.agencyId, entry.label || entry.agencyId);\n          this._emitChange('incidentsAgencyIds', nextIds);\n          this._renderIncidentSelectedAgencies(nextIds);\n          this._renderIncidentSearchResults(results);\n        },\n      });\n      addBtn.style.cssText += 'height: 22px;';\n      row.appendChild(addBtn);\n\n      container.appendChild(row);\n    });\n  }\n\n  _renderIncidentSelectedAgencies(agencyIds = []) {\n    if (!this._incidentSelectedList) return;\n    const list = this._incidentSelectedList;\n    list.innerHTML = '';\n\n    if (!agencyIds.length) {\n      const empty = document.createElement('div');\n      empty.style.cssText = 'font-size: 11px; color: rgba(255, 255, 255, 0.55);';\n      empty.textContent = 'No agencies selected.';\n      list.appendChild(empty);\n      return;\n    }\n\n    agencyIds.forEach((agencyId) => {\n      const row = document.createElement('div');\n      row.style.cssText = 'display: flex; gap: 8px; align-items: center; justify-content: space-between; padding: 6px 8px; background: rgba(255,255,255,0.06); border-radius: 6px;';\n\n      const label = document.createElement('div');\n      label.style.cssText = 'flex: 1; font-size: 11px; color: #fff;';\n      const name = this._incidentAgencyMap.get(agencyId);\n      label.textContent = name ? `${name} (${agencyId})` : agencyId;\n      row.appendChild(label);\n\n      const removeBtn = createButton('Remove', {\n        variant: 'ghost',\n        size: 'sm',\n        onClick: () => {\n          const nextIds = agencyIds.filter((id) => id !== agencyId);\n          this._emitChange('incidentsAgencyIds', nextIds);\n          this._renderIncidentSelectedAgencies(nextIds);\n          if (this._incidentSearchCache?.length) {\n            this._renderIncidentSearchResults(this._incidentSearchCache);\n          }\n        },\n      });\n      removeBtn.style.cssText += 'height: 22px;';\n      row.appendChild(removeBtn);\n\n      list.appendChild(row);\n    });\n  }\n\n  async _requestIncidentAgencyDetails(agencyIds = []) {\n    const ids = Array.isArray(agencyIds) ? agencyIds.filter(Boolean) : [];\n    if (!ids.length) return;\n    const seq = ++this._incidentAgencyLoadSeq;\n    try {\n      const agencies = await this._getIncidentApi().getAgencies(ids);\n      if (seq !== this._incidentAgencyLoadSeq) return;\n      agencies.forEach((agency) => {\n        if (!agency?.agencyId) return;\n        const label = agency.shortName || agency.name || agency.agencyId;\n        this._incidentAgencyMap.set(agency.agencyId, label);\n      });\n      this._renderIncidentSelectedAgencies(ids);\n    } catch (error) {\n      if (seq !== this._incidentAgencyLoadSeq) return;\n      this._renderIncidentSelectedAgencies(ids);\n    }\n  }\n\n  async _searchIncidentAgencies(query) {\n    const trimmed = typeof query === 'string' ? query.trim() : '';\n    if (trimmed.length < 2) {\n      this._setIncidentSearchMessage('Enter at least 2 characters to search.');\n      return;\n    }\n\n    const seq = ++this._incidentSearchSeq;\n    this._setIncidentSearchMessage('Searching...');\n\n    try {\n      const results = await this._getIncidentApi().searchAgencies(trimmed);\n      if (seq !== this._incidentSearchSeq) return;\n      this._renderIncidentSearchResults(results);\n    } catch (error) {\n      if (seq !== this._incidentSearchSeq) return;\n      this._setIncidentSearchMessage('Search failed.');\n    }\n  }\n\n  /**\n   * Update a metric display\n   */\n  updateMetric(containerId, label, value) {\n    const container = this.element.querySelector(`#${containerId}`);\n    if (!container) return;\n\n    let metric = container.querySelector(`[data-metric=\"${label}\"]`);\n    if (!metric) {\n      metric = createMetric(label, value);\n      metric.dataset.metric = label;\n      container.appendChild(metric);\n    } else {\n      metric.querySelector('.nc-metric-value').textContent = value;\n    }\n  }\n\n  updateComputationStats(payload = {}) {\n    if (!this.element) return;\n    const models = Array.isArray(payload?.models) ? payload.models : [];\n    const tickets = payload?.tickets || {};\n    const totalQueued = models.reduce((sum, model) => sum + (Number(model?.queue) || 0), 0);\n    const totalInFlight = models.reduce((sum, model) => sum + (Number(model?.inFlight) || 0), 0);\n    const memoryValues = models.map((model) => model?.memoryMb).filter((value) => Number.isFinite(value));\n    const memoryMb = memoryValues.length ? Math.max(...memoryValues) : null;\n\n    this.updateMetric('computation-metrics', 'Tickets ASR', String(tickets.asr ?? 0));\n    this.updateMetric('computation-metrics', 'Tickets TTS', String(tickets.tts ?? 0));\n    this.updateMetric('computation-metrics', 'Active Jobs', String(totalInFlight));\n    this.updateMetric('computation-metrics', 'Queued', String(totalQueued));\n    this.updateMetric('computation-metrics', 'Memory', this._formatMemory(memoryMb));\n    this.updateMetric('computation-metrics', 'Last Ticket', this._formatShortTime(tickets.lastAt));\n\n    this._renderComputationModels(models);\n  }\n\n  _renderComputationModels(models = []) {\n    if (!this._computationModelList) return;\n    const list = this._computationModelList;\n    const empty = this._computationEmptyEl;\n    const keys = new Set(models.map((model) => this._getComputationKey(model)));\n\n    if (empty) {\n      empty.style.display = models.length ? 'none' : '';\n    }\n\n    for (const [key, el] of this._computationModelEls.entries()) {\n      if (!keys.has(key)) {\n        el.remove();\n        this._computationModelEls.delete(key);\n      }\n    }\n\n    models.forEach((model) => {\n      const key = this._getComputationKey(model);\n      let card = this._computationModelEls.get(key);\n      if (!card) {\n        card = this._createComputationModelCard(model);\n        this._computationModelEls.set(key, card);\n        list.appendChild(card);\n      }\n      this._updateComputationModelCard(card, model);\n    });\n  }\n\n  _getComputationKey(model) {\n    const kind = String(model?.kind || 'model');\n    const id = String(model?.id || model?.label || 'unknown');\n    return `${kind}:${id}`;\n  }\n\n  _createComputationModelCard(model) {\n    const card = document.createElement('div');\n    card.className = 'computation-model-card';\n    card.dataset.modelKey = this._getComputationKey(model);\n\n    const header = document.createElement('div');\n    header.className = 'computation-model-header';\n\n    const titleWrap = document.createElement('div');\n    const title = document.createElement('div');\n    title.className = 'computation-model-title';\n    title.dataset.modelField = 'title';\n    title.textContent = model?.label || model?.id || 'Model';\n    const sub = document.createElement('div');\n    sub.className = 'computation-model-sub';\n    sub.dataset.modelField = 'kind';\n    sub.textContent = String(model?.kind || 'model').toUpperCase();\n    titleWrap.appendChild(title);\n    titleWrap.appendChild(sub);\n\n    const state = document.createElement('div');\n    state.className = 'computation-model-state';\n    state.dataset.modelField = 'state';\n    state.textContent = 'Idle';\n\n    header.appendChild(titleWrap);\n    header.appendChild(state);\n\n    const meta = document.createElement('div');\n    meta.className = 'computation-model-meta';\n\n    const queue = document.createElement('span');\n    queue.dataset.modelField = 'queue';\n    const inflight = document.createElement('span');\n    inflight.dataset.modelField = 'inflight';\n    const avg = document.createElement('span');\n    avg.dataset.modelField = 'avg';\n    const memory = document.createElement('span');\n    memory.dataset.modelField = 'memory';\n\n    meta.appendChild(queue);\n    meta.appendChild(inflight);\n    meta.appendChild(avg);\n    meta.appendChild(memory);\n\n    const graphs = document.createElement('div');\n    graphs.className = 'computation-model-graphs';\n    [\n      { key: 'compute', label: 'Compute' },\n      { key: 'queue', label: 'Queue' },\n      { key: 'memory', label: 'Memory' },\n    ].forEach(({ key, label }) => {\n      const graph = document.createElement('div');\n      graph.className = 'computation-graph';\n      graph.dataset.modelGraph = key;\n\n      const graphLabel = document.createElement('div');\n      graphLabel.className = 'computation-graph-label';\n      graphLabel.textContent = label;\n\n      const canvas = document.createElement('canvas');\n      canvas.className = 'computation-graph-canvas';\n      canvas.dataset.modelGraphCanvas = key;\n\n      graph.appendChild(graphLabel);\n      graph.appendChild(canvas);\n      graphs.appendChild(graph);\n    });\n\n    card.appendChild(header);\n    card.appendChild(meta);\n    card.appendChild(graphs);\n\n    return card;\n  }\n\n  _updateComputationModelCard(card, model) {\n    if (!card || !model) return;\n    const title = card.querySelector('[data-model-field=\"title\"]');\n    if (title) title.textContent = model.label || model.id || 'Model';\n    const kind = card.querySelector('[data-model-field=\"kind\"]');\n    if (kind) kind.textContent = String(model.kind || 'model').toUpperCase();\n    const state = card.querySelector('[data-model-field=\"state\"]');\n    if (state) {\n      const stateValue = String(model.state || 'idle').toLowerCase();\n      state.textContent = stateValue;\n      state.classList.toggle('ready', stateValue === 'ready');\n      state.classList.toggle('loading', stateValue === 'loading');\n      state.classList.toggle('error', stateValue === 'error');\n    }\n    const queue = card.querySelector('[data-model-field=\"queue\"]');\n    if (queue) queue.textContent = `Queue ${Number(model.queue) || 0}`;\n    const inflight = card.querySelector('[data-model-field=\"inflight\"]');\n    if (inflight) inflight.textContent = `In-flight ${Number(model.inFlight) || 0}`;\n    const avg = card.querySelector('[data-model-field=\"avg\"]');\n    if (avg) avg.textContent = `Avg ${this._formatDuration(model.avgDurationMs)}`;\n    const memory = card.querySelector('[data-model-field=\"memory\"]');\n    if (memory) memory.textContent = `Mem ${this._formatMemory(model.memoryMb)}`;\n\n    const computeCanvas = card.querySelector('[data-model-graph-canvas=\"compute\"]');\n    this._drawSparkline(computeCanvas, model?.history?.computeMs || [], '#60a5fa', { min: 0 });\n    const queueCanvas = card.querySelector('[data-model-graph-canvas=\"queue\"]');\n    this._drawSparkline(queueCanvas, model?.history?.queue || [], '#f59e0b', { min: 0 });\n    const memoryCanvas = card.querySelector('[data-model-graph-canvas=\"memory\"]');\n    this._drawSparkline(memoryCanvas, model?.history?.memoryMb || [], '#34d399', { min: 0 });\n  }\n\n  _drawSparkline(canvas, values, { color, min } = {}) {\n    if (!canvas) return;\n    const ctx = canvas.getContext('2d');\n    if (!ctx) return;\n    const width = canvas.clientWidth || 120;\n    const height = canvas.clientHeight || 36;\n    const dpr = window.devicePixelRatio || 1;\n    if (canvas.width !== Math.round(width * dpr) || canvas.height !== Math.round(height * dpr)) {\n      canvas.width = Math.round(width * dpr);\n      canvas.height = Math.round(height * dpr);\n    }\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n    ctx.clearRect(0, 0, width, height);\n\n    const points = Array.isArray(values) ? values.filter((v) => Number.isFinite(v)) : [];\n    if (points.length < 2) return;\n    const minVal = Number.isFinite(min) ? min : Math.min(...points);\n    const maxVal = Math.max(minVal + 1, Math.max(...points));\n    const step = width / (points.length - 1);\n\n    ctx.beginPath();\n    points.forEach((value, index) => {\n      const x = index * step;\n      const t = (value - minVal) / (maxVal - minVal);\n      const y = height - t * height;\n      if (index === 0) {\n        ctx.moveTo(x, y);\n      } else {\n        ctx.lineTo(x, y);\n      }\n    });\n    ctx.strokeStyle = color || '#94a3b8';\n    ctx.lineWidth = 1.5;\n    ctx.stroke();\n  }\n\n  _formatDuration(value) {\n    if (!Number.isFinite(value) || value <= 0) return '--';\n    if (value < 1000) return `${value.toFixed(0)} ms`;\n    return `${(value / 1000).toFixed(2)} s`;\n  }\n\n  _formatMemory(value) {\n    if (!Number.isFinite(value) || value <= 0) return '--';\n    return `${Number(value).toFixed(1)} MB`;\n  }\n\n  _formatShortTime(value) {\n    if (!value) return '--';\n    const date = value instanceof Date ? value : new Date(value);\n    if (Number.isNaN(date.getTime())) return '--';\n    return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n  }\n\n  /**\n   * Update a setting value in the UI\n   */\n  updateSettingValue(key, value) {\n    // Find and update the relevant control\n    const input = this.element.querySelector(`[data-setting=\"${key}\"]`);\n    if (input) {\n      if (input.type === 'checkbox') {\n        input.checked = value;\n      } else {\n        input.value = value;\n      }\n    }\n  }\n\n  _scrollToElement(target) {\n    if (!target || !this.element) return;\n    const body = this.element.querySelector('.config-sidebar-body');\n    if (!body) return;\n    const bodyRect = body.getBoundingClientRect();\n    const targetRect = target.getBoundingClientRect();\n    const offsetTop = targetRect.top - bodyRect.top + body.scrollTop;\n    body.scrollTo({ top: Math.max(0, offsetTop - 8), behavior: 'smooth' });\n  }\n\n  openSection(id, anchorId = null) {\n    const entry = this.sections.get(id);\n    if (!entry) return;\n    entry.section.classList.add('open');\n    const target = anchorId\n      ? entry.section.querySelector(`#${anchorId}`)\n      : entry.section;\n    this._scrollToElement(target || entry.section);\n  }\n\n  scrollToAnchor(anchorId) {\n    if (!anchorId) return;\n    const target = this.element?.querySelector?.(`#${anchorId}`);\n    this._scrollToElement(target);\n  }\n\n  open() {\n    this.isOpen = true;\n    this.element.classList.add('open');\n    this.toggleBtn?.classList.add('active');\n    this._refreshMiniMap();\n  }\n\n  close() {\n    this.isOpen = false;\n    this.element.classList.remove('open');\n    this.toggleBtn?.classList.remove('active');\n  }\n\n  toggle() {\n    if (this.isOpen) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Widget Pinning\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  _getPinIconSvg() {\n    return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n      <path d=\"M12 17v5\"/>\n      <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\"/>\n    </svg>`;\n  }\n\n  _loadWidgetPins() {\n    this._widgetPinsLoaded = false;\n    this._widgetPinsRestoreAttempts = 0;\n    this._restoreWidgetPins();\n  }\n\n  _restoreWidgetPins() {\n    if (this._widgetPinsLoaded) return;\n    if (!this.settings?.getSection) {\n      this._scheduleWidgetPinRestore();\n      return;\n    }\n\n    const hudSection = this.settings.getSection('hud');\n    if (!hudSection) {\n      this._scheduleWidgetPinRestore();\n      return;\n    }\n\n    const widgetPins = this.settings.getSection('hud.widgetPins') || {};\n    const validCorners = ['top-left', 'top-right', 'bottom-left', 'bottom-right'];\n    const minimapCorner = validCorners.includes(widgetPins.minimap) ? widgetPins.minimap : null;\n    const searchCorner = validCorners.includes(widgetPins.search) ? widgetPins.search : null;\n\n    if (!minimapCorner && this._pinnedMinimapCorner) {\n      this._unpinWidget('minimap', { persist: false });\n    }\n    if (!searchCorner && this._pinnedSearchCorner) {\n      this._unpinWidget('search', { persist: false });\n    }\n\n    const minimapReady = minimapCorner\n      ? !!document.getElementById(`hud-${minimapCorner}`)\n      : true;\n    const searchReady = searchCorner\n      ? !!document.getElementById(`hud-${searchCorner}`)\n      : true;\n\n    if (!minimapReady || !searchReady) {\n      this._scheduleWidgetPinRestore();\n      return;\n    }\n\n    if (minimapCorner && this._pinnedMinimapCorner !== minimapCorner) {\n      this._pinWidgetToCorner('minimap', minimapCorner, { persist: false });\n    }\n    if (searchCorner && this._pinnedSearchCorner !== searchCorner) {\n      this._pinWidgetToCorner('search', searchCorner, { persist: false });\n    }\n\n    this._widgetPinsLoaded = true;\n  }\n\n  _scheduleWidgetPinRestore() {\n    if (this._widgetPinsLoaded) return;\n    if (this._widgetPinsRestoreTimer) return;\n    if (this._widgetPinsRestoreAttempts >= 60) return;\n    this._widgetPinsRestoreAttempts += 1;\n    this._widgetPinsRestoreTimer = setTimeout(() => {\n      this._widgetPinsRestoreTimer = null;\n      this._restoreWidgetPins();\n    }, 250);\n  }\n\n  _persistWidgetPins() {\n    if (this.settings?.update) {\n      this.settings.update({\n        hud: {\n          widgetPins: {\n            minimap: this._pinnedMinimapCorner || null,\n            search: this._pinnedSearchCorner || null\n          }\n        }\n      }, { apply: false });\n    }\n  }\n\n  _openWidgetPinModal(type) {\n    this._widgetPinModalType = type;\n    const currentCorner = type === 'minimap' ? this._pinnedMinimapCorner : this._pinnedSearchCorner;\n    const modal = getHudPinModal();\n    modal.open({\n      title: type === 'minimap' ? 'Pin Mini Map' : 'Pin Search',\n      currentCorner: currentCorner || null,\n      onSelect: (corner) => {\n        const current = type === 'minimap' ? this._pinnedMinimapCorner : this._pinnedSearchCorner;\n        if (current === corner) {\n          this._unpinWidget(type);\n          return;\n        }\n        this._pinWidgetToCorner(type, corner);\n      },\n      onUnpin: () => {\n        this._unpinWidget(type);\n      },\n      onClose: () => {\n        this._widgetPinModalType = null;\n      }\n    });\n  }\n\n  _pinWidgetToCorner(type, corner, { persist = true } = {}) {\n    const hudStack = this._getHudWidgetStack(corner);\n    if (!hudStack) return;\n\n    if (type === 'minimap') {\n      // Remove existing pinned minimap if any\n      if (this._pinnedMinimapWidget) {\n        this._pinnedMinimapWidget.destroy?.();\n        this._pinnedMinimapWidget = null;\n      }\n      if (this._pinnedMinimap) {\n        this._pinnedMinimap.remove();\n        this._pinnedMinimap = null;\n      }\n      this._pinnedMinimapCorner = corner;\n      this._pinnedMinimapExpanded = false;\n      this._renderPinnedMinimap(hudStack);\n      // Update pin button state\n      if (this._miniMapPinBtn) {\n        this._miniMapPinBtn.classList.add('active');\n        this._miniMapPinBtn.title = `Pinned to ${this._formatCornerLabel(corner)}`;\n      }\n    } else if (type === 'search') {\n      // Remove existing pinned search if any\n      if (this._pinnedSearch) {\n        this._pinnedSearch.remove();\n        this._pinnedSearch = null;\n      }\n      this._pinnedSearchCorner = corner;\n      this._renderPinnedSearch(hudStack);\n      // Update pin button state\n      if (this._searchPinBtn) {\n        this._searchPinBtn.classList.add('active');\n        this._searchPinBtn.title = `Pinned to ${this._formatCornerLabel(corner)}`;\n      }\n    }\n    // Persist to settings\n    if (persist) {\n      this._persistWidgetPins();\n    }\n  }\n\n  _unpinWidget(type, { persist = true } = {}) {\n    if (type === 'minimap') {\n      if (this._pinnedMinimapWidget) {\n        this._pinnedMinimapWidget.destroy?.();\n        this._pinnedMinimapWidget = null;\n      }\n      if (this._pinnedMinimap) {\n        this._pinnedMinimap.remove();\n        this._pinnedMinimap = null;\n      }\n      this._pinnedMinimapCorner = null;\n      this._pinnedMinimapExpanded = false;\n      if (this._miniMapPinBtn) {\n        this._miniMapPinBtn.classList.remove('active');\n        this._miniMapPinBtn.title = 'Pin to HUD corner';\n      }\n    } else if (type === 'search') {\n      if (this._pinnedSearch) {\n        this._pinnedSearch.remove();\n        this._pinnedSearch = null;\n      }\n      this._pinnedSearchCorner = null;\n      if (this._searchPinBtn) {\n        this._searchPinBtn.classList.remove('active');\n        this._searchPinBtn.title = 'Pin to HUD corner';\n      }\n    }\n    // Persist to settings\n    if (persist) {\n      this._persistWidgetPins();\n    }\n  }\n\n  _formatCornerLabel(corner) {\n    switch (corner) {\n      case 'top-left': return 'Top Left';\n      case 'top-right': return 'Top Right';\n      case 'bottom-left': return 'Bottom Left';\n      case 'bottom-right': return 'Bottom Right';\n      default: return 'HUD';\n    }\n  }\n\n  _getHudWidgetStack(corner) {\n    const hudStack = document.getElementById(`hud-${corner}`);\n    if (!hudStack) return null;\n    let widgetStack = hudStack.querySelector(':scope > .hud-widget-stack');\n    if (!widgetStack) {\n      widgetStack = document.createElement('div');\n      widgetStack.className = 'hud-widget-stack';\n      const isTop = corner?.startsWith?.('top');\n      if (isTop && hudStack.firstChild) {\n        hudStack.insertBefore(widgetStack, hudStack.firstChild);\n      } else {\n        hudStack.appendChild(widgetStack);\n      }\n    }\n    return widgetStack;\n  }\n\n  _renderPinnedMinimap(container) {\n    const wrapper = document.createElement('div');\n    wrapper.className = 'pinned-minimap collapsed';\n\n    // Close button (overlaid, shows on hover)\n    const closeBtn = document.createElement('button');\n    closeBtn.className = 'pinned-minimap-close';\n    closeBtn.innerHTML = '×';\n    closeBtn.title = 'Unpin';\n    closeBtn.addEventListener('click', (e) => {\n      e.stopPropagation();\n      this._unpinWidget('minimap');\n    });\n    wrapper.appendChild(closeBtn);\n\n    // Map host - full height, no header\n    const mapHost = document.createElement('div');\n    mapHost.className = 'nc-mini-map-host';\n    mapHost.style.cssText = 'height: 100%;';\n    wrapper.appendChild(mapHost);\n\n    // Add to container - position at viewport edge\n    // Top corners: prepend (first in flex = closest to top)\n    // Bottom corners: append (last in flex = closest to bottom)\n    const isTop = this._pinnedMinimapCorner?.startsWith('top');\n    if (isTop && container.firstChild) {\n      container.insertBefore(wrapper, container.firstChild);\n    } else {\n      container.appendChild(wrapper);\n    }\n    this._pinnedMinimap = wrapper;\n\n    // Initialize minimap in pinned container\n    void loadMiniMapWidgetClass()\n      .then((MiniMapWidget) => {\n        if (!this._pinnedMinimap || !mapHost.isConnected) return;\n        this._pinnedMinimapWidget = new MiniMapWidget({\n          container: mapHost,\n          scene: this.scene,\n          uiController: this.uiController,\n          compact: true,\n          showStatus: false,\n          showActions: false,\n          showControls: false,\n          showPeers: false\n        });\n      })\n      .catch((err) => {\n        console.warn('[ConfigSidebar] Pinned minimap load failed', err);\n      });\n\n    // Expand/collapse on click (but not on close button)\n    wrapper.addEventListener('click', (e) => {\n      if (e.target.closest('.pinned-minimap-close')) return;\n      this._togglePinnedMinimapSize();\n    });\n  }\n\n  _togglePinnedMinimapSize() {\n    if (!this._pinnedMinimap) return;\n    this._pinnedMinimapExpanded = !this._pinnedMinimapExpanded;\n    this._pinnedMinimap.classList.toggle('collapsed', !this._pinnedMinimapExpanded);\n    this._pinnedMinimap.classList.toggle('expanded', this._pinnedMinimapExpanded);\n    // Invalidate the Leaflet map size after transition\n    setTimeout(() => {\n      this._pinnedMinimapWidget?._map?.invalidateSize?.();\n    }, 300);\n  }\n\n  _renderPinnedSearch(container) {\n    const wrapper = document.createElement('div');\n    wrapper.className = 'pinned-search';\n\n    // Close button (overlaid, shows on hover)\n    const closeBtn = document.createElement('button');\n    closeBtn.className = 'pinned-search-close';\n    closeBtn.innerHTML = '×';\n    closeBtn.title = 'Unpin';\n    closeBtn.addEventListener('click', (e) => {\n      e.stopPropagation();\n      this._unpinWidget('search');\n    });\n    wrapper.appendChild(closeBtn);\n\n    // Search input - clean, no label\n    const input = document.createElement('input');\n    input.type = 'text';\n    input.placeholder = 'Search places or ask a question...';\n    input.addEventListener('input', () => this._onPinnedSearchInput(input.value));\n    input.addEventListener('keydown', (e) => {\n      if (e.key === 'Enter') {\n        e.preventDefault();\n        // Enter always sends to agent — typing auto-searches locations,\n        // clicking a result navigates there, Enter asks the AI\n        this._askAgent(input.value);\n      } else if (e.key === 'Escape') {\n        this._clearPinnedSearchResults();\n      }\n    });\n    this._pinnedSearchInput = input;\n    wrapper.appendChild(input);\n\n    // Results container\n    const results = document.createElement('div');\n    results.className = 'pinned-search-results';\n    this._pinnedSearchResults = results;\n    wrapper.appendChild(results);\n\n    // Add to container - position at viewport edge\n    // Top corners: prepend (first in flex = closest to top)\n    // Bottom corners: append (last in flex = closest to bottom)\n    const isTop = this._pinnedSearchCorner?.startsWith('top');\n    if (isTop && container.firstChild) {\n      container.insertBefore(wrapper, container.firstChild);\n    } else {\n      container.appendChild(wrapper);\n    }\n    this._pinnedSearch = wrapper;\n  }\n\n  _onPinnedSearchInput(query) {\n    this._pinnedSearchEpoch = (this._pinnedSearchEpoch || 0) + 1;\n    getPlaceSearchStore().clear(this._pinnedPlaceSearchOwner);\n    this._geocodingService?.cancel?.();\n    // Debounce the search\n    if (this._pinnedSearchDebounce) {\n      clearTimeout(this._pinnedSearchDebounce);\n    }\n    if (!query || query.length < 2) {\n      this._clearPinnedSearchResults();\n      return;\n    }\n    this._pinnedSearchDebounce = setTimeout(() => {\n      this._performPinnedSearch(query);\n    }, 260);\n  }\n\n  /**\n   * Unified search: auto-detect whether the query is a location search or an agent question.\n   *\n   * Location signals: coordinates, place names, short queries (1-3 words), numbers\n   * Agent signals: question words (how, what, why, can, show me, turn on, enable, disable),\n   *   sentences with verbs, queries > 4 words that aren't place-like\n   */\n  async _performUnifiedSearch(query) {\n    if (!query || query.length < 2) return;\n    const q = query.trim().toLowerCase();\n\n    // Heuristic: is this a question or command for the agent?\n    const agentPatterns = [\n      /^(how|what|why|where is|when|who|can you|could you|please|show me|turn on|turn off|enable|disable|toggle|set |change |make |adjust |increase|decrease|zoom|fly to|go to|navigate)\\b/i,\n      /\\?$/,  // Ends with question mark\n      /^(help|explain|describe|tell me|list|find|search for|look for)\\b/i,\n    ];\n\n    const isAgentQuery = agentPatterns.some(p => p.test(q));\n    const wordCount = q.split(/\\s+/).length;\n\n    // If it looks like an agent query OR is a long multi-word sentence (not a place name)\n    if (isAgentQuery || (wordCount > 5 && !/\\d{1,3}\\.\\d+/.test(q))) {\n      await this._askAgent(query);\n    } else {\n      // Default: treat as location search\n      await this._performPinnedSearch(query);\n    }\n  }\n\n  /**\n   * Send query to the public agent endpoint (no auth required, rate limited).\n   * Falls back to authenticated endpoint if user is logged in.\n   */\n  async _askAgent(query) {\n    this._pinnedSearchEpoch = (this._pinnedSearchEpoch || 0) + 1;\n    clearTimeout(this._pinnedSearchDebounce);\n    this._geocodingService?.cancel?.();\n    if (!this._pinnedSearchResults) return;\n    this._pinnedSearchResults.innerHTML = '';\n\n    // Show loading\n    const loadingEl = document.createElement('div');\n    loadingEl.style.cssText = 'color: rgba(255, 255, 255,0.7); font-size: 11px; padding: 8px; font-family: \"IBM Plex Mono\", monospace;';\n    loadingEl.textContent = 'Thinking...';\n    this._pinnedSearchResults.appendChild(loadingEl);\n\n    try {\n      const apiBase = getBackendApiBase();\n      const auth = getAuthService();\n      const token = auth?.accessToken;\n\n      let response;\n      if (token) {\n        // Authenticated — use full agent endpoint\n        // Get or create session\n        let sessionId = localStorage.getItem('noclip.chat.agentSession');\n        if (!sessionId) {\n          const sessResp = await auth.authenticatedFetch(`${apiBase}/chat/agent/sessions`, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({ title: 'Search Agent' }),\n          });\n          if (sessResp.ok) {\n            const sess = await sessResp.json();\n            sessionId = sess.session?.sessionId || sess.session?.id;\n            if (sessionId) localStorage.setItem('noclip.chat.agentSession', sessionId);\n          }\n        }\n        if (sessionId) {\n          const msgResp = await auth.authenticatedFetch(`${apiBase}/chat/agent/sessions/${sessionId}/messages`, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({ content: query }),\n          });\n          if (msgResp.ok) {\n            const data = await msgResp.json();\n            response = { reply: data.assistant?.content || data.reply || 'No response' };\n          }\n        }\n      }\n\n      if (!response) {\n        // Unauthenticated — use public endpoint\n        const resp = await auth.authenticatedFetch(`${apiBase}/chat/public/ask`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ content: query }),\n        });\n        const data = await resp.json();\n        if (resp.status === 429) {\n          response = { reply: data.message, isRateLimited: true };\n        } else {\n          response = { reply: data.reply || data.message || 'No response', remaining: data.remaining };\n        }\n      }\n\n      // Display response\n      this._pinnedSearchResults.innerHTML = '';\n      const replyEl = document.createElement('div');\n      replyEl.style.cssText = 'padding: 8px 10px; font-size: 11px; line-height: 1.5; color: rgba(255,255,255,0.8); max-height: 300px; overflow-y: auto; scrollbar-width: none;';\n      replyEl.textContent = response.reply;\n      this._pinnedSearchResults.appendChild(replyEl);\n\n      if (response.isRateLimited) {\n        const loginHint = document.createElement('div');\n        loginHint.style.cssText = 'padding: 6px 10px; font-size: 10px; color: #ffffff; border-top: 1px solid rgba(255,255,255,0.1); margin-top: 6px;';\n        loginHint.textContent = 'Log in or create an account for more queries.';\n        this._pinnedSearchResults.appendChild(loginHint);\n      } else if (response.remaining != null) {\n        const remainEl = document.createElement('div');\n        remainEl.style.cssText = 'padding: 4px 10px; font-size: 9px; color: rgba(255,255,255,0.3);';\n        remainEl.textContent = `${response.remaining} free queries remaining this hour`;\n        this._pinnedSearchResults.appendChild(remainEl);\n      }\n    } catch (err) {\n      this._pinnedSearchResults.innerHTML = '';\n      const errEl = document.createElement('div');\n      errEl.style.cssText = 'padding: 8px; font-size: 11px; color: rgba(239,68,68,0.7);';\n      errEl.textContent = 'Agent unavailable. Try a location search instead.';\n      this._pinnedSearchResults.appendChild(errEl);\n    }\n  }\n\n  async _performPinnedSearch(query) {\n    const epoch = this._pinnedSearchEpoch = (this._pinnedSearchEpoch || 0) + 1;\n    if (!query || query.length < 2) return;\n    if (!this._geocodingService) {\n      const { GeocodingService } = await import('../../modules/geocoding-service.js');\n      this._geocodingService = new GeocodingService();\n    }\n    if (epoch !== this._pinnedSearchEpoch) return;\n    try {\n      const results = await this._geocodingService.search(query);\n      if (epoch !== this._pinnedSearchEpoch) return;\n      this._renderPinnedSearchResults(results);\n    } catch (err) {\n      if (epoch !== this._pinnedSearchEpoch || err?.name === 'AbortError') return;\n      if (this._pinnedSearchResults) this._pinnedSearchResults.textContent = 'Local Mapsource search is temporarily unavailable.';\n      console.warn('[ConfigSidebar] Pinned search error:', err);\n    }\n  }\n\n  _renderPinnedSearchResults(results) {\n    if (!this._pinnedSearchResults) return;\n    this._pinnedSearchResults.innerHTML = '';\n    this._pinnedSearchResultsList = results || [];\n    this._pinnedPlaceSearchOwner ||= {};\n    this._offPinnedSearchList ||= bindPlaceSearchList(this._pinnedSearchResults, { owner: this._pinnedPlaceSearchOwner,\n      selector: '.search-result-item', indexAttribute: 'data-index' });\n    const notice = lookupNotice(results);\n    if (notice) {\n      const message = document.createElement('div'); message.className = 'search-coverage-notice';\n      message.textContent = notice; this._pinnedSearchResults.appendChild(message);\n    }\n\n    if (!results || results.length === 0) {\n      getPlaceSearchStore().clear(this._pinnedPlaceSearchOwner);\n      if (!notice) this._pinnedSearchResults.textContent = 'No local matches found';\n      return;\n    }\n\n    results.slice(0, 6).forEach((result, index) => {\n      const formatted = formatResultForDisplay(result);\n      if (!formatted) return;\n\n      const item = document.createElement('div');\n      item.className = 'search-result-item';\n      item.style.cssText = `\n        padding: 8px 10px;\n        cursor: pointer;\n        border-bottom: 1px solid rgba(255,255,255,0.08);\n        transition: background 0.15s;\n      `;\n\n      item.addEventListener('mouseenter', () => {\n        item.style.background = 'rgba(255,255,255,0.08)';\n      });\n      item.addEventListener('mouseleave', () => {\n        item.style.background = this._selectedPinnedResult === result ? 'rgba(74,144,217,0.2)' : 'transparent';\n      });\n      item.addEventListener('click', () => {\n        this._selectPinnedSearchResult(result, item);\n      });\n\n      const primaryText = document.createElement('div');\n      primaryText.style.cssText = 'font-size: 12px; color: #fff; font-weight: 500;';\n      primaryText.textContent = formatted.primary;\n\n      const typeTag = document.createElement('span');\n      typeTag.style.cssText = 'font-size: 9px; color: rgba(255,255,255,0.4); background: rgba(255,255,255,0.1); padding: 1px 4px; border-radius: 3px; margin-left: 6px;';\n      typeTag.textContent = formatted.type;\n      primaryText.appendChild(typeTag);\n\n      const secondaryText = document.createElement('div');\n      secondaryText.style.cssText = 'font-size: 10px; color: rgba(255,255,255,0.5); margin-top: 2px;';\n      secondaryText.textContent = formatted.secondary || formatted.coordinates;\n\n      item.appendChild(primaryText);\n      item.appendChild(secondaryText);\n      this._pinnedSearchResults.appendChild(item);\n      item.dataset.index = String(index); item.tabIndex = 0; item.setAttribute('role', 'button');\n      item.addEventListener('keydown', event => { if (event.key === 'Enter') this._selectPinnedSearchResult(result, item); });\n    });\n    getPlaceSearchStore().setResults(this._pinnedPlaceSearchOwner, results.slice(0, 6), { onSelect: result => this._selectPinnedSearchResult(result) });\n  }\n\n  _selectPinnedSearchResult(result, itemElement) {\n    this._selectedPinnedResult = result;\n\n    // Highlight selected item\n    const items = this._pinnedSearchResults?.querySelectorAll('.search-result-item') || [];\n    items.forEach((item) => {\n      item.style.background = 'transparent';\n    });\n    if (itemElement) {\n      itemElement.style.background = 'rgba(74,144,217,0.2)';\n    }\n\n    // Highlight on minimap if available\n    this._highlightSearchResultOnMap?.(result);\n\n    // Navigate to result\n    if (result && Number.isFinite(result.lat) && Number.isFinite(result.lon)) {\n      this._navigateToPlaceSearchResult(result);\n\n      // Clear search after navigation\n      const epoch = this._pinnedSearchEpoch;\n      setTimeout(() => {\n        if (epoch !== this._pinnedSearchEpoch) return;\n        this._clearPinnedSearchResults();\n        if (this._pinnedSearchInput) {\n          this._pinnedSearchInput.value = '';\n        }\n      }, 500);\n    }\n  }\n\n  _clearPinnedSearchResults() {\n    getPlaceSearchStore().clear(this._pinnedPlaceSearchOwner);\n    this._pinnedSearchEpoch = (this._pinnedSearchEpoch || 0) + 1;\n    clearTimeout(this._pinnedSearchDebounce);\n    this._geocodingService?.cancel?.();\n    if (this._pinnedSearchResults) {\n      this._pinnedSearchResults.innerHTML = '';\n    }\n    this._selectedPinnedResult = null;\n    this._pinnedSearchResultsList = [];\n  }\n\n  async searchPlacesFromAgent(query, options = {}) {\n    const trimmed = String(query || '').trim();\n    if (!trimmed) return [];\n    if (this._searchInput) {\n      this._searchInput.value = trimmed;\n    }\n    if (this._pinnedSearchInput) {\n      this._pinnedSearchInput.value = trimmed;\n    }\n    const results = await this._performSearch(trimmed, {\n      limit: options.limit,\n      syncPinned: true,\n    });\n    return Array.isArray(results) ? results : [];\n  }\n\n  getSearchResults() {\n    return Array.isArray(this._lastSearchResults) ? [...this._lastSearchResults] : [];\n  }\n\n  selectSearchResult(result) {\n    if (!result) return false;\n    const items = this._searchResults?.querySelectorAll('.search-result-item') || [];\n    const index = this._lastSearchResults.indexOf(result);\n    const itemEl = index >= 0 ? items[index] || null : null;\n    this._selectSearchResult(result, itemEl);\n    return true;\n  }\n\n  selectSearchResultByIndex(index) {\n    const results = this._lastSearchResults || [];\n    if (!results.length) return null;\n    const idx = Math.max(0, Math.floor(index) - 1);\n    const result = results[idx];\n    if (!result) return null;\n    this.selectSearchResult(result);\n    return result;\n  }\n\n  selectSearchResultByPlaceId(placeId) {\n    const id = String(placeId || '').trim();\n    if (!id) return null;\n    const result = (this._lastSearchResults || []).find((entry) => {\n      const entryId = entry?.placeId ?? entry?.place_id ?? '';\n      return String(entryId) === id;\n    });\n    if (!result) return null;\n    this.selectSearchResult(result);\n    return result;\n  }\n\n  destroy() {\n    this._flightStatusOff?.();this._flightStatusOff=null;\n    clearInterval(this._trackingSessionsTimer);this._trackingSessionsTimer=null;\n    this._offPinnedSearchList?.(); this._offPinnedSearchList = null;\n    this._offPlaceSearchList?.(); this._offPlaceSearchList = null;\n    getPlaceSearchStore().clear(this);\n    this._stopSpeakPttCapture();\n    this._meshtasticEventUnsubscribe?.();\n    this._meshtasticEventUnsubscribe = null;\n    this._speakPttInput = null;\n    this._speakPttRecordBtn = null;\n    if (this._lightingLiveInterval) {\n      clearInterval(this._lightingLiveInterval);\n      this._lightingLiveInterval = null;\n    }\n    if (this._incidentAutoTimer) {\n      clearInterval(this._incidentAutoTimer);\n      this._incidentAutoTimer = null;\n    }\n    if (this._settingsUnsub) {\n      this._settingsUnsub();\n      this._settingsUnsub = null;\n    }\n    if (this._widgetPinsRestoreTimer) {\n      clearTimeout(this._widgetPinsRestoreTimer);\n      this._widgetPinsRestoreTimer = null;\n    }\n    // Clean up pinned widgets\n    this._pinnedMinimapWidget?.destroy?.();\n    this._pinnedMinimap?.remove();\n    this._pinnedSearch?.remove();\n    this.toggleBtn?.remove();\n    this.element?.remove();\n    this._miniMap?.destroy();\n    this._incidentMarkerLayer = null;\n  }\n}\n\n// Singleton\nlet configSidebarInstance = null;\n\nexport function getConfigSidebar(options = {}) {\n  if (!configSidebarInstance) {\n    configSidebarInstance = new ConfigSidebar(options);\n  }\n  return configSidebarInstance;\n}\n"],"file":"assets/66614499192c/config-sidebar-CaDLOH-M.js"}