@mml-io/3d-web-experience-client 0.26.1 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/build/AvatarType.d.ts.map +1 -0
  2. package/build/ClientEventEmitter.d.ts +32 -0
  3. package/build/ClientEventEmitter.d.ts.map +1 -0
  4. package/build/DefaultAvatarSelectionPlugin.d.ts +36 -0
  5. package/build/DefaultAvatarSelectionPlugin.d.ts.map +1 -0
  6. package/build/DefaultChatPlugin.d.ts +44 -0
  7. package/build/DefaultChatPlugin.d.ts.map +1 -0
  8. package/build/DefaultHUDPlugin.d.ts +18 -0
  9. package/build/DefaultHUDPlugin.d.ts.map +1 -0
  10. package/build/DefaultRespawnButtonPlugin.d.ts +13 -0
  11. package/build/DefaultRespawnButtonPlugin.d.ts.map +1 -0
  12. package/build/DefaultVirtualJoystickPlugin.d.ts +16 -0
  13. package/build/DefaultVirtualJoystickPlugin.d.ts.map +1 -0
  14. package/build/Networked3dWebExperienceClient.d.ts +113 -17
  15. package/build/Networked3dWebExperienceClient.d.ts.map +1 -1
  16. package/build/WorldConnection.d.ts +142 -0
  17. package/build/WorldConnection.d.ts.map +1 -0
  18. package/build/index.d.ts +10 -0
  19. package/build/index.d.ts.map +1 -1
  20. package/build/index.js +2593 -1256
  21. package/build/index.js.map +4 -4
  22. package/build/plugins.d.ts +16 -0
  23. package/build/plugins.d.ts.map +1 -0
  24. package/package.json +25 -12
  25. package/build/avatar-selection-ui/AvatarSelectionUI.d.ts +0 -21
  26. package/build/avatar-selection-ui/AvatarSelectionUI.d.ts.map +0 -1
  27. package/build/avatar-selection-ui/AvatarType.d.ts.map +0 -1
  28. package/build/avatar-selection-ui/components/AvatarPanel/AvatarSectionUIComponent.d.ts +0 -15
  29. package/build/avatar-selection-ui/components/AvatarPanel/AvatarSectionUIComponent.d.ts.map +0 -1
  30. package/build/avatar-selection-ui/index.d.ts +0 -3
  31. package/build/avatar-selection-ui/index.d.ts.map +0 -1
  32. package/build/chat-ui/TextChatUI.d.ts +0 -26
  33. package/build/chat-ui/TextChatUI.d.ts.map +0 -1
  34. package/build/chat-ui/components/ChatPanel/TextChatUIComponent.d.ts +0 -10
  35. package/build/chat-ui/components/ChatPanel/TextChatUIComponent.d.ts.map +0 -1
  36. package/build/chat-ui/components/Input/InputBox.d.ts +0 -10
  37. package/build/chat-ui/components/Input/InputBox.d.ts.map +0 -1
  38. package/build/chat-ui/components/Message/Message.d.ts +0 -10
  39. package/build/chat-ui/components/Message/Message.d.ts.map +0 -1
  40. package/build/chat-ui/components/Messages/Messages.d.ts +0 -13
  41. package/build/chat-ui/components/Messages/Messages.d.ts.map +0 -1
  42. package/build/chat-ui/helpers.d.ts +0 -4
  43. package/build/chat-ui/helpers.d.ts.map +0 -1
  44. package/build/chat-ui/index.d.ts +0 -2
  45. package/build/chat-ui/index.d.ts.map +0 -1
  46. package/build/index.css +0 -875
  47. package/build/index.css.map +0 -7
  48. package/build/src/Networked3dWebExperience.module.css.d.ts +0 -4
  49. package/build/src/Networked3dWebExperience.module.d.css.ts +0 -4
  50. package/build/src/avatar-selection-ui/components/AvatarPanel/AvatarSelectionUIComponent.module.css.d.ts +0 -26
  51. package/build/src/avatar-selection-ui/components/AvatarPanel/AvatarSelectionUIComponent.module.d.css.ts +0 -26
  52. package/build/src/chat-ui/components/ChatPanel/TextChatUIComponent.module.css.d.ts +0 -15
  53. package/build/src/chat-ui/components/ChatPanel/TextChatUIComponent.module.d.css.ts +0 -15
  54. package/build/src/chat-ui/components/Input/InputBox.module.css.d.ts +0 -7
  55. package/build/src/chat-ui/components/Input/InputBox.module.d.css.ts +0 -7
  56. package/build/src/chat-ui/components/Message/Message.module.css.d.ts +0 -5
  57. package/build/src/chat-ui/components/Message/Message.module.d.css.ts +0 -5
  58. package/build/src/chat-ui/components/Messages/Messages.module.css.d.ts +0 -5
  59. package/build/src/chat-ui/components/Messages/Messages.module.d.css.ts +0 -5
  60. /package/build/{avatar-selection-ui/AvatarType.d.ts → AvatarType.d.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/Networked3dWebExperienceClient.ts", "../src/avatar-selection-ui/AvatarSelectionUI.tsx", "../src/avatar-selection-ui/components/AvatarPanel/AvatarSectionUIComponent.tsx", "../src/avatar-selection-ui/icons/Avatar.svg", "esbuild-css-modules-plugin-ns-js::src/avatar-selection-ui/components/AvatarPanel/AvatarSelectionUIComponent.module.css:injector.js", "../src/avatar-selection-ui/components/AvatarPanel/AvatarSelectionUIComponent.module.css", "../src/chat-ui/TextChatUI.tsx", "../src/chat-ui/components/ChatPanel/TextChatUIComponent.tsx", "../src/chat-ui/helpers.tsx", "../src/chat-ui/icons/Chat.svg", "../src/chat-ui/icons/Pin.svg", "../src/chat-ui/components/Input/InputBox.tsx", "../src/chat-ui/icons/PaperPlane.svg", "esbuild-css-modules-plugin-ns-js::src/chat-ui/components/Input/InputBox.module.css:injector.js", "../src/chat-ui/components/Input/InputBox.module.css", "../src/chat-ui/components/Messages/Messages.tsx", "../src/chat-ui/components/Message/Message.tsx", "esbuild-css-modules-plugin-ns-js::src/chat-ui/components/Message/Message.module.css:injector.js", "../src/chat-ui/components/Message/Message.module.css", "esbuild-css-modules-plugin-ns-js::src/chat-ui/components/Messages/Messages.module.css:injector.js", "../src/chat-ui/components/Messages/Messages.module.css", "esbuild-css-modules-plugin-ns-js::src/chat-ui/components/ChatPanel/TextChatUIComponent.module.css:injector.js", "../src/chat-ui/components/ChatPanel/TextChatUIComponent.module.css", "esbuild-css-modules-plugin-ns-js::src/Networked3dWebExperience.module.css:injector.js", "../src/Networked3dWebExperience.module.css"],
4
- "sourcesContent": ["import {\n AnimationConfig,\n CameraManager,\n CameraTransform,\n CharacterDescription,\n CharacterState,\n CollisionsManager,\n EnvironmentConfiguration,\n ErrorScreen,\n EulXYZ,\n Key,\n KeyInputManager,\n LoadingScreen,\n LoadingScreenConfig,\n SpawnConfiguration,\n SpawnConfigurationState,\n Vect3,\n VirtualJoystick,\n Quat,\n getSpawnData,\n IRenderer,\n RenderState,\n CharacterManager,\n MMLDocumentConfiguration,\n TweakPane,\n createDefaultCharacterControllerValues,\n createDefaultCameraValues,\n RendererConfig,\n} from \"@mml-io/3d-web-client-core\";\nimport { ThreeJSWorldRenderer } from \"@mml-io/3d-web-threejs\";\nimport {\n FROM_SERVER_CHAT_MESSAGE_TYPE,\n FROM_CLIENT_CHAT_MESSAGE_TYPE,\n ClientChatMessage,\n UserData,\n UserNetworkingClient,\n UserNetworkingClientUpdate,\n WebsocketStatus,\n parseServerChatMessage,\n DeltaNetV01ServerErrors,\n NetworkUpdate,\n SERVER_BROADCAST_MESSAGE_TYPE,\n ServerBroadcastMessage,\n parseServerBroadcastMessage,\n} from \"@mml-io/3d-web-user-networking\";\nimport { LoadingProgressManager, registerCustomElementsToWindow } from \"@mml-io/mml-web\";\n\nimport { AvatarSelectionUI, AvatarConfiguration } from \"./avatar-selection-ui\";\nimport { StringToHslOptions, TextChatUI, TextChatUIProps } from \"./chat-ui\";\nimport styles from \"./Networked3dWebExperience.module.css\";\n\nexport type Networked3dWebExperienceClientConfig = {\n userNetworkAddress: string;\n sessionToken: string;\n authToken?: string | null;\n chatVisibleByDefault?: boolean;\n userNameToColorOptions?: StringToHslOptions;\n animationConfig: AnimationConfig;\n voiceChatAddress?: string;\n updateURLLocation?: boolean;\n onServerBroadcast?: (broadcast: ServerBroadcastMessage) => void;\n loadingScreen?: LoadingScreenConfig;\n createRenderer?: (options: CreateRendererOptions) => IRenderer;\n} & UpdatableConfig;\n\nexport type UpdatableConfig = {\n enableChat?: boolean;\n mmlDocuments?: { [key: string]: MMLDocumentConfiguration };\n environmentConfiguration?: EnvironmentConfiguration;\n spawnConfiguration?: SpawnConfiguration;\n avatarConfiguration?: AvatarConfiguration;\n allowCustomDisplayName?: boolean;\n enableTweakPane?: boolean;\n allowOrbitalCamera?: boolean;\n postProcessingEnabled?: boolean;\n};\n\nexport type CreateRendererOptions = {\n targetElement: HTMLElement;\n coreCameraManager: CameraManager;\n collisionsManager: CollisionsManager;\n config: RendererConfig;\n tweakPane: TweakPane;\n mmlTargetWindow: Window;\n mmlTargetElement: HTMLElement;\n loadingProgressManager: LoadingProgressManager;\n mmlDocuments: { [key: string]: MMLDocumentConfiguration };\n mmlAuthToken: string | null;\n onInitialized: () => void;\n};\n\nfunction normalizeSpawnConfiguration(spawnConfig?: SpawnConfiguration): SpawnConfigurationState {\n return {\n spawnPosition: {\n x: spawnConfig?.spawnPosition?.x ?? 0,\n y: spawnConfig?.spawnPosition?.y ?? 0,\n z: spawnConfig?.spawnPosition?.z ?? 0,\n },\n spawnPositionVariance: {\n x: spawnConfig?.spawnPositionVariance?.x ?? 0,\n y: spawnConfig?.spawnPositionVariance?.y ?? 0,\n z: spawnConfig?.spawnPositionVariance?.z ?? 0,\n },\n spawnYRotation: spawnConfig?.spawnYRotation ?? 0,\n respawnTrigger: {\n minX: spawnConfig?.respawnTrigger?.minX ?? Number.NEGATIVE_INFINITY,\n maxX: spawnConfig?.respawnTrigger?.maxX ?? Number.POSITIVE_INFINITY,\n minY: spawnConfig?.respawnTrigger?.minY ?? -100,\n maxY: spawnConfig?.respawnTrigger?.maxY ?? Number.POSITIVE_INFINITY,\n minZ: spawnConfig?.respawnTrigger?.minZ ?? Number.NEGATIVE_INFINITY,\n maxZ: spawnConfig?.respawnTrigger?.maxZ ?? Number.POSITIVE_INFINITY,\n },\n enableRespawnButton: spawnConfig?.enableRespawnButton ?? false,\n };\n}\n\nexport class Networked3dWebExperienceClient {\n private element: HTMLDivElement;\n private canvasHolder: HTMLDivElement;\n\n private renderer: IRenderer;\n private rendererConfig: RendererConfig;\n\n private cameraManager: CameraManager;\n private collisionsManager: CollisionsManager;\n private characterManager: CharacterManager;\n private keyInputManager = new KeyInputManager();\n private virtualJoystick: VirtualJoystick;\n\n private clientId: number | null = null;\n private networkClient: UserNetworkingClient;\n private remoteUserStates = new Map<number, UserNetworkingClientUpdate>();\n private userProfiles = new Map<number, UserData>();\n\n private textChatUI: TextChatUI | null = null;\n private avatarSelectionUI: AvatarSelectionUI | null = null;\n private tweakPane: TweakPane;\n\n private spawnConfiguration: SpawnConfigurationState;\n private cameraValues = createDefaultCameraValues();\n private characterControllerValues = createDefaultCharacterControllerValues();\n\n private initialLoadCompleted = false;\n private loadingProgressManager = new LoadingProgressManager();\n private loadingScreen: LoadingScreen;\n private errorScreen?: ErrorScreen;\n private respawnButton: HTMLDivElement | null = null;\n\n // Frame timing\n private currentRequestAnimationFrame: number | null = null;\n private lastUpdateTimeMs: number = 0;\n private frameCounter: number = 0;\n private readonly targetFPS: number = 60;\n private readonly fixedDeltaTime: number = 1 / this.targetFPS;\n private accumulatedTime: number = 0;\n\n private cachedCameraTransform: CameraTransform = {\n position: new Vect3(),\n rotation: { x: 0, y: 0, z: 0 },\n fov: 0,\n };\n\n constructor(\n private holderElement: HTMLElement,\n private config: Networked3dWebExperienceClientConfig,\n ) {\n this.element = document.createElement(\"div\");\n this.element.style.position = \"absolute\";\n this.element.style.width = \"100%\";\n this.element.style.height = \"100%\";\n this.holderElement.appendChild(this.element);\n\n this.canvasHolder = document.createElement(\"div\");\n this.canvasHolder.style.position = \"absolute\";\n this.canvasHolder.style.width = \"100%\";\n this.canvasHolder.style.height = \"100%\";\n this.element.appendChild(this.canvasHolder);\n\n this.collisionsManager = new CollisionsManager();\n this.cameraManager = new CameraManager(this.canvasHolder, this.collisionsManager);\n\n this.virtualJoystick = new VirtualJoystick(this.element, {\n radius: 70,\n innerRadius: 20,\n mouseSupport: false,\n });\n\n this.tweakPane = new TweakPane(\n this.canvasHolder,\n {\n cameraValues: this.cameraValues,\n characterControllerValues: this.characterControllerValues,\n },\n config.enableTweakPane ?? false,\n );\n\n this.spawnConfiguration = normalizeSpawnConfiguration(this.config.spawnConfiguration);\n\n const spawnData = getSpawnData(this.spawnConfiguration, true);\n const spawnRotation = new Quat().setFromEulerXYZ(spawnData.spawnRotation);\n\n const initialNetworkLoadRef = {};\n this.loadingProgressManager.addLoadingAsset(initialNetworkLoadRef, \"network\", \"network\");\n this.networkClient = new UserNetworkingClient(\n {\n url: this.config.userNetworkAddress,\n sessionToken: this.config.sessionToken,\n websocketFactory: (url: string) => new WebSocket(url, \"delta-net-v0.1\"),\n statusUpdateCallback: (status: WebsocketStatus) => {\n console.log(`Websocket status: ${status}`);\n if (status === WebsocketStatus.Disconnected || status === WebsocketStatus.Reconnecting) {\n this.characterManager.clear();\n this.remoteUserStates.clear();\n this.clientId = null;\n }\n },\n assignedIdentity: (clientId: number) => {\n console.log(`Assigned ID: ${clientId}`);\n this.clientId = clientId;\n // Set the local client ID early to prevent the local character from being\n // spawned as a remote character when network updates arrive before loading completes\n this.characterManager.setLocalClientId(clientId);\n if (this.initialLoadCompleted) {\n const spawnData = getSpawnData(this.spawnConfiguration, true);\n this.spawnCharacter(spawnData);\n } else {\n this.loadingProgressManager.completedLoadingAsset(initialNetworkLoadRef);\n }\n },\n onUpdate: (update: NetworkUpdate): void => {\n this.onNetworkUpdate(update);\n },\n onServerError: (error: { message: string; errorType: string }) => {\n switch (error.errorType) {\n case DeltaNetV01ServerErrors.USER_AUTHENTICATION_FAILED_ERROR_TYPE:\n this.disposeWithError(error.message);\n break;\n case DeltaNetV01ServerErrors.USER_NETWORKING_CONNECTION_LIMIT_REACHED_ERROR_TYPE:\n this.disposeWithError(error.message);\n break;\n case DeltaNetV01ServerErrors.USER_NETWORKING_SERVER_SHUTDOWN_ERROR_TYPE:\n this.disposeWithError(error.message || \"Server shutdown\");\n break;\n default:\n console.error(`Unhandled server error: ${error.message}`);\n this.disposeWithError(error.message);\n }\n },\n onCustomMessage: (customType: number, contents: string) => {\n if (customType === SERVER_BROADCAST_MESSAGE_TYPE) {\n const serverBroadcastMessage = parseServerBroadcastMessage(contents);\n if (serverBroadcastMessage instanceof Error) {\n console.error(`Invalid server broadcast message: ${contents}`);\n } else {\n this.config.onServerBroadcast?.(serverBroadcastMessage);\n }\n } else if (customType === FROM_SERVER_CHAT_MESSAGE_TYPE) {\n const serverChatMessage = parseServerChatMessage(contents);\n if (serverChatMessage instanceof Error) {\n console.error(`Invalid server chat message: ${contents}`);\n } else {\n this.handleChatMessage(serverChatMessage.fromUserId, serverChatMessage.message);\n }\n } else {\n console.warn(`Did not recognize custom message type ${customType}`);\n }\n },\n },\n {\n username: null,\n characterDescription: null,\n colors: null,\n },\n {\n position: spawnData.spawnPosition,\n rotation: {\n quaternionY: spawnRotation.y,\n quaternionW: spawnRotation.w,\n },\n state: 0,\n },\n );\n\n if (this.config.allowOrbitalCamera) {\n this.keyInputManager.createKeyBinding(Key.C, () => {\n if (document.activeElement === document.body) {\n this.cameraManager.toggleFlyCamera();\n this.renderer.fitContainer();\n }\n });\n }\n\n this.characterManager = new CharacterManager({\n collisionsManager: this.collisionsManager,\n cameraManager: this.cameraManager,\n keyInputManager: this.keyInputManager,\n virtualJoystick: this.virtualJoystick,\n remoteUserStates: this.remoteUserStates,\n sendUpdate: (characterState: CharacterState) => {\n this.networkClient.sendUpdate(characterState);\n },\n sendLocalCharacterColors: (colors: Array<[number, number, number]>) => {\n this.networkClient.updateColors(colors);\n },\n spawnConfiguration: this.spawnConfiguration,\n characterControllerValues: this.characterControllerValues,\n characterResolve: (clientId: number) => {\n return this.resolveCharacterData(clientId);\n },\n updateURLLocation: this.config.updateURLLocation !== false,\n });\n\n if (this.spawnConfiguration.enableRespawnButton) {\n this.respawnButton = this.createRespawnButton();\n this.element.appendChild(this.respawnButton);\n }\n\n this.loadingScreen = new LoadingScreen(this.loadingProgressManager, this.config.loadingScreen);\n this.element.append(this.loadingScreen.element);\n\n this.loadingProgressManager.addProgressCallback(() => {\n const [, completed] = this.loadingProgressManager.toRatio();\n if (completed && !this.initialLoadCompleted) {\n this.initialLoadCompleted = true;\n this.connectToTextChat();\n this.mountAvatarSelectionUI();\n this.spawnCharacter(spawnData);\n }\n });\n\n registerCustomElementsToWindow(window);\n this.rendererConfig = {\n animationConfig: config.animationConfig,\n environmentConfiguration: config.environmentConfiguration,\n postProcessingEnabled: config.postProcessingEnabled,\n spawnSun: true,\n enableTweakPane: config.enableTweakPane,\n };\n\n if (this.config.createRenderer) {\n this.renderer = this.config.createRenderer({\n targetElement: this.canvasHolder,\n coreCameraManager: this.cameraManager,\n collisionsManager: this.collisionsManager,\n config: this.rendererConfig,\n tweakPane: this.tweakPane,\n mmlTargetWindow: window,\n mmlTargetElement: document.body,\n loadingProgressManager: this.loadingProgressManager,\n mmlDocuments: this.config.mmlDocuments ?? {},\n mmlAuthToken: this.config.authToken ?? null,\n onInitialized: () => {\n this.loadingProgressManager.setInitialLoad(true);\n },\n });\n } else {\n // Default to ThreeJS renderer\n this.renderer = new ThreeJSWorldRenderer({\n targetElement: this.canvasHolder,\n coreCameraManager: this.cameraManager,\n collisionsManager: this.collisionsManager,\n config: this.rendererConfig,\n tweakPane: this.tweakPane,\n mmlTargetWindow: window,\n mmlTargetElement: document.body,\n loadingProgressManager: this.loadingProgressManager,\n mmlDocuments: this.config.mmlDocuments ?? {},\n mmlAuthToken: this.config.authToken ?? null,\n });\n this.loadingProgressManager.setInitialLoad(true);\n }\n\n if (this.characterManager.localController) {\n this.characterManager.setupTweakPane(this.tweakPane);\n }\n\n const resizeObserver = new ResizeObserver(() => {\n this.renderer.fitContainer();\n });\n resizeObserver.observe(this.element);\n }\n\n public updateConfig(config: Partial<UpdatableConfig>) {\n this.config = {\n ...this.config,\n ...config,\n };\n\n // Update renderer config if any renderer-related config changed\n const rendererConfigUpdate: Partial<RendererConfig> = {};\n if (config.environmentConfiguration !== undefined) {\n rendererConfigUpdate.environmentConfiguration = config.environmentConfiguration;\n }\n if (config.postProcessingEnabled !== undefined) {\n rendererConfigUpdate.postProcessingEnabled = config.postProcessingEnabled;\n }\n if (config.enableTweakPane !== undefined) {\n rendererConfigUpdate.enableTweakPane = config.enableTweakPane;\n }\n\n if (Object.keys(rendererConfigUpdate).length > 0) {\n this.rendererConfig = {\n ...this.rendererConfig,\n ...rendererConfigUpdate,\n };\n this.renderer.updateConfig(rendererConfigUpdate);\n }\n\n if (this.avatarSelectionUI) {\n if (config.avatarConfiguration) {\n this.avatarSelectionUI.updateAvatarConfig(config.avatarConfiguration);\n }\n this.avatarSelectionUI.updateAllowCustomDisplayName(config.allowCustomDisplayName || false);\n }\n\n if (config.allowOrbitalCamera !== undefined) {\n if (config.allowOrbitalCamera === false) {\n this.keyInputManager.removeKeyBinding(Key.C);\n if (this.cameraManager.isFlyCameraOn() === true) {\n this.cameraManager.toggleFlyCamera();\n }\n } else if (config.allowOrbitalCamera === true) {\n this.keyInputManager.createKeyBinding(Key.C, () => {\n if (document.activeElement === document.body) {\n this.cameraManager.toggleFlyCamera();\n this.renderer.fitContainer();\n }\n });\n }\n }\n\n if (config.enableChat) {\n if (!config.enableChat && this.textChatUI !== null) {\n this.textChatUI.dispose();\n this.textChatUI = null;\n } else {\n this.connectToTextChat();\n }\n }\n\n this.spawnConfiguration = normalizeSpawnConfiguration(config.spawnConfiguration);\n if (this.characterManager.localController) {\n this.characterManager.localController.updateSpawnConfig(this.spawnConfiguration);\n }\n if (this.spawnConfiguration.enableRespawnButton && !this.respawnButton) {\n this.respawnButton = this.createRespawnButton();\n this.element.appendChild(this.respawnButton);\n } else if (!this.spawnConfiguration.enableRespawnButton && this.respawnButton) {\n this.respawnButton.remove();\n this.respawnButton = null;\n }\n\n if (config.mmlDocuments !== undefined) {\n this.renderer.setMMLConfiguration(config.mmlDocuments, this.config.authToken ?? null);\n }\n }\n\n static createFullscreenHolder(): HTMLDivElement {\n document.body.style.margin = \"0\";\n document.body.style.overflow = \"hidden\";\n\n const holder = document.createElement(\"div\");\n holder.style.position = \"absolute\";\n holder.style.width = \"100%\";\n holder.style.height = \"100%\";\n holder.style.overflow = \"hidden\";\n document.body.appendChild(holder);\n return holder;\n }\n\n private createRespawnButton(): HTMLDivElement {\n const respawnButton = document.createElement(\"div\");\n respawnButton.className = styles.respawnButton;\n respawnButton.textContent = \"RESPAWN\";\n respawnButton.addEventListener(\"click\", () => {\n this.characterManager.localController?.resetPosition();\n });\n return respawnButton;\n }\n\n private resolveCharacterData(clientId: number): UserData {\n const user = this.userProfiles.get(clientId)!;\n\n if (!user) {\n throw new Error(`Failed to resolve user for clientId ${clientId}`);\n }\n\n return {\n username: user.username,\n characterDescription: user.characterDescription,\n colors: user.colors,\n };\n }\n\n private onNetworkUpdate(update: NetworkUpdate): void {\n const { removedUserIds, addedUserIds, updatedUsers } = update;\n for (const clientId of removedUserIds) {\n this.userProfiles.delete(clientId);\n this.remoteUserStates.delete(clientId);\n }\n for (const [clientId, userData] of addedUserIds) {\n this.userProfiles.set(clientId, userData.userState);\n this.remoteUserStates.set(clientId, userData.components);\n }\n for (const [clientId, userDataUpdate] of updatedUsers) {\n const userState = userDataUpdate.userState;\n if (userState) {\n if (userState.username !== undefined) {\n this.userProfiles.get(clientId)!.username = userState.username;\n }\n if (userState.characterDescription !== undefined) {\n this.userProfiles.get(clientId)!.characterDescription = userState.characterDescription;\n }\n if (userState.colors !== undefined) {\n this.userProfiles.get(clientId)!.colors = userState.colors;\n }\n this.characterManager.networkCharacterInfoUpdated(clientId);\n }\n this.remoteUserStates.set(clientId, userDataUpdate.components);\n }\n }\n\n private sendIdentityUpdateToServer(\n displayName: string,\n characterDescription: CharacterDescription,\n ) {\n if (!this.clientId) {\n throw new Error(\"Client ID not set\");\n }\n\n this.networkClient.updateUsername(displayName);\n this.networkClient.updateCharacterDescription(characterDescription);\n }\n\n private handleChatMessage(fromUserId: number, message: string) {\n if (this.textChatUI === null) {\n return;\n }\n\n if (fromUserId === 0) {\n this.textChatUI.addTextMessage(\"System\", message);\n } else {\n const user = this.userProfiles.get(fromUserId);\n if (!user) {\n console.error(`User not found for clientId ${fromUserId}`);\n return;\n }\n const username = user.username ?? `Unknown User ${fromUserId}`;\n this.textChatUI.addTextMessage(username, message);\n this.renderer.addChatBubble(fromUserId, message);\n }\n }\n\n private connectToTextChat() {\n if (this.clientId === null) {\n return;\n }\n\n if (this.config.enableChat && this.textChatUI === null) {\n const user = this.userProfiles.get(this.clientId);\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n const textChatUISettings: TextChatUIProps = {\n holderElement: this.canvasHolder,\n sendMessageToServerMethod: (message: string) => {\n this.renderer.onChatMessage(message);\n\n this.networkClient.sendCustomMessage(\n FROM_CLIENT_CHAT_MESSAGE_TYPE,\n JSON.stringify({ message } satisfies ClientChatMessage),\n );\n },\n visibleByDefault: this.config.chatVisibleByDefault,\n stringToHslOptions: this.config.userNameToColorOptions,\n };\n this.textChatUI = new TextChatUI(textChatUISettings);\n this.textChatUI.init();\n }\n }\n\n private mountAvatarSelectionUI() {\n if (this.clientId === null) {\n throw new Error(\"Client ID not set\");\n }\n const ownIdentity = this.userProfiles.get(this.clientId);\n if (!ownIdentity) {\n throw new Error(\"Own identity not found\");\n }\n this.avatarSelectionUI = new AvatarSelectionUI({\n holderElement: this.element,\n visibleByDefault: false,\n displayName: ownIdentity.username ?? `Unknown User ${this.clientId}`,\n characterDescription: ownIdentity.characterDescription ?? {\n meshFileUrl: \"\",\n },\n sendIdentityUpdateToServer: this.sendIdentityUpdateToServer.bind(this),\n availableAvatars: this.config.avatarConfiguration?.availableAvatars ?? [],\n allowCustomAvatars: this.config.avatarConfiguration?.allowCustomAvatars,\n allowCustomDisplayName: this.config.allowCustomDisplayName || false,\n });\n this.avatarSelectionUI.init();\n }\n\n public update(): void {\n const currentTimeMs = performance.now();\n\n this.currentRequestAnimationFrame = requestAnimationFrame(() => {\n this.update();\n });\n\n // Calculate elapsed time since last frame\n const elapsedMs = currentTimeMs - this.lastUpdateTimeMs;\n this.lastUpdateTimeMs = currentTimeMs;\n\n // Clamp elapsed time to prevent spiral of death (e.g., after tab switch)\n const elapsedSeconds = Math.min(elapsedMs / 1000, 0.1);\n\n // Accumulate time for fixed timestep physics\n this.accumulatedTime += elapsedSeconds;\n\n // Track if any physics updates occurred this frame\n let physicsUpdated = false;\n const updatedCharacterDescriptions: number[] = [];\n const removedUserIds: number[] = [];\n\n // Run physics at fixed timestep - this ensures deterministic behavior\n // regardless of display refresh rate (60Hz, 120Hz, 144Hz, etc.)\n while (this.accumulatedTime >= this.fixedDeltaTime) {\n this.frameCounter++;\n\n // Update character manager with fixed timestep\n const result = this.characterManager.update(this.fixedDeltaTime, this.frameCounter);\n\n // Merge results from all physics steps\n for (const id of result.updatedCharacterDescriptions) {\n if (!updatedCharacterDescriptions.includes(id)) {\n updatedCharacterDescriptions.push(id);\n }\n }\n for (const id of result.removedUserIds) {\n if (!removedUserIds.includes(id)) {\n removedUserIds.push(id);\n }\n }\n\n this.accumulatedTime -= this.fixedDeltaTime;\n physicsUpdated = true;\n }\n\n // Only render if physics was updated (limits render rate to physics rate)\n if (!physicsUpdated) {\n return;\n }\n\n // Update camera manager (computes camera position/rotation from target, input, etc.)\n // Will be synced to renderer's camera in renderer.render()\n this.cameraManager.update();\n\n // Update TweakPane character data if visible (skip expensive operations when hidden)\n if (this.tweakPane.guiVisible && this.characterManager.localController) {\n this.tweakPane.updateCharacterData(this.characterManager.localController);\n }\n\n // Build render state - getAllCharacterStates() returns a cached Map\n const allCharacterStates = this.characterManager.getAllCharacterStates();\n\n // Read camera state after update\n const cameraState = this.cameraManager.getCameraState();\n const cameraRotation = new EulXYZ().setFromQuaternion(cameraState.rotation);\n this.cachedCameraTransform.position.set(\n cameraState.position.x,\n cameraState.position.y,\n cameraState.position.z,\n );\n this.cachedCameraTransform.rotation.x = cameraRotation.x;\n this.cachedCameraTransform.rotation.y = cameraRotation.y;\n this.cachedCameraTransform.rotation.z = cameraRotation.z;\n this.cachedCameraTransform.fov = cameraState.fov;\n\n const renderState: RenderState = {\n characters: allCharacterStates,\n updatedCharacterDescriptions,\n removedUserIds,\n cameraTransform: this.cachedCameraTransform,\n localCharacterId: this.characterManager.getLocalClientId(),\n deltaTimeSeconds: this.fixedDeltaTime,\n };\n\n // Render the actual frame using the associated renderer\n this.renderer.render(renderState);\n }\n\n private spawnCharacter({\n spawnPosition,\n spawnRotation,\n cameraPosition,\n }: {\n spawnPosition: Vect3;\n spawnRotation: EulXYZ;\n cameraPosition: Vect3;\n }) {\n if (this.clientId === null) {\n throw new Error(\"Client ID not set\");\n }\n\n const ownIdentity = this.userProfiles.get(this.clientId);\n if (!ownIdentity) {\n throw new Error(\"Own identity not found\");\n }\n\n this.characterManager.spawnLocalCharacter(this.clientId!, spawnPosition, spawnRotation);\n\n this.characterManager.setupTweakPane(this.tweakPane);\n\n if (cameraPosition !== null) {\n const cameraState = this.cameraManager.getMainCameraState();\n cameraState.position.set(cameraPosition.x, cameraPosition.y, cameraPosition.z);\n const target = new Vect3().add(spawnPosition).add(CharacterManager.headTargetOffset);\n this.cameraManager.setTarget(target);\n this.cameraManager.reverseUpdateFromPositions(cameraState.position, cameraState.rotation);\n }\n }\n\n private disposeWithError(message: string) {\n this.dispose();\n this.errorScreen = new ErrorScreen(\"An error occurred\", message);\n this.element.append(this.errorScreen.element);\n }\n\n public dispose() {\n this.characterManager.dispose();\n this.networkClient.stop();\n this.textChatUI?.dispose();\n this.tweakPane.dispose();\n this.renderer.dispose();\n if (this.currentRequestAnimationFrame !== null) {\n cancelAnimationFrame(this.currentRequestAnimationFrame);\n this.currentRequestAnimationFrame = null;\n }\n this.cameraManager.dispose();\n this.loadingScreen.dispose();\n this.errorScreen?.dispose();\n }\n}\n", "import * as React from \"react\";\nimport { forwardRef } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { createRoot, Root } from \"react-dom/client\";\n\nimport { AvatarConfiguration, AvatarType } from \"./AvatarType\";\nimport { AvatarSelectionUIComponent } from \"./components/AvatarPanel/AvatarSectionUIComponent\";\n\nconst ForwardedAvatarSelectionUIComponent = forwardRef(AvatarSelectionUIComponent);\n\nexport type AvatarSelectionUIProps = {\n holderElement: HTMLElement;\n visibleByDefault?: boolean;\n displayName: string;\n characterDescription: AvatarType;\n allowCustomDisplayName: boolean;\n sendIdentityUpdateToServer: (displayName: string, characterDescription: AvatarType) => void;\n} & AvatarConfiguration;\n\nexport class AvatarSelectionUI {\n private root: Root;\n\n private wrapper = document.createElement(\"div\");\n\n constructor(private config: AvatarSelectionUIProps) {\n this.config.holderElement.appendChild(this.wrapper);\n this.root = createRoot(this.wrapper);\n }\n\n private onUpdateUserAvatar = (avatar: AvatarType) => {\n this.config.characterDescription = avatar;\n this.config.sendIdentityUpdateToServer(this.config.displayName, avatar);\n };\n\n private onUpdateDisplayName = (displayName: string) => {\n this.config.displayName = displayName;\n this.config.sendIdentityUpdateToServer(displayName, this.config.characterDescription);\n };\n\n public updateAvatarConfig(avatarConfig: AvatarConfiguration) {\n this.config = {\n ...this.config,\n ...avatarConfig,\n };\n this.init();\n }\n\n public updateAllowCustomDisplayName(allowCustomDisplayName: boolean) {\n this.config = {\n ...this.config,\n allowCustomDisplayName,\n };\n this.init();\n }\n\n init() {\n flushSync(() =>\n this.root.render(\n <ForwardedAvatarSelectionUIComponent\n onUpdateUserAvatar={this.onUpdateUserAvatar}\n onUpdateDisplayName={this.onUpdateDisplayName}\n visibleByDefault={this.config.visibleByDefault}\n displayName={this.config.displayName}\n characterDescription={this.config.characterDescription}\n availableAvatars={this.config.availableAvatars}\n allowCustomAvatars={this.config.allowCustomAvatars || false}\n allowCustomDisplayName={this.config.allowCustomDisplayName || false}\n />,\n ),\n );\n }\n}\n", "import React, {\n ForwardRefRenderFunction,\n KeyboardEvent,\n MouseEvent,\n useRef,\n useState,\n} from \"react\";\n\nimport { AvatarType } from \"../../AvatarType\";\nimport AvatarIcon from \"../../icons/Avatar.svg\";\n\nimport styles from \"./AvatarSelectionUIComponent.module.css\";\n\ntype AvatarSelectionUIProps = {\n onUpdateUserAvatar: (avatar: AvatarType) => void;\n visibleByDefault?: boolean;\n availableAvatars: AvatarType[];\n\n characterDescription: AvatarType;\n allowCustomAvatars: boolean;\n\n displayName: string;\n allowCustomDisplayName: boolean;\n onUpdateDisplayName: (displayNameValue: string) => void;\n};\n\nenum CustomAvatarType {\n meshFileUrl,\n mmlUrl,\n mml,\n}\n\nfunction SelectedPill() {\n return <span className={styles.selectedPill}>Selected</span>;\n}\n\nexport const AvatarSelectionUIComponent: ForwardRefRenderFunction<any, AvatarSelectionUIProps> = (\n props: AvatarSelectionUIProps,\n) => {\n const visibleByDefault: boolean = props.visibleByDefault ?? false;\n const [isVisible, setIsVisible] = useState<boolean>(visibleByDefault);\n const [selectedAvatar, setSelectedAvatar] = useState<AvatarType | undefined>(\n props.characterDescription,\n );\n const [customAvatarType, setCustomAvatarType] = useState<CustomAvatarType>(\n CustomAvatarType.mmlUrl,\n );\n const [customAvatarValue, setCustomAvatarValue] = useState<string>(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const [displayNameValue, setDisplayNameValue] = useState<string>(props.displayName);\n const displayNameRef = useRef<HTMLInputElement>(null);\n\n const handleRootClick = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n const selectAvatar = (avatar: AvatarType) => {\n setSelectedAvatar(avatar);\n props.onUpdateUserAvatar(avatar);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setCustomAvatarValue(e.target.value);\n };\n\n const handleDisplayNameChange = (\n e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n setDisplayNameValue(e.target.value);\n };\n\n const setDisplayName = () => {\n if (!displayNameValue) {\n return;\n }\n props.onUpdateDisplayName(displayNameValue);\n };\n\n const addCustomAvatar = () => {\n if (!customAvatarValue) {\n return;\n }\n\n let newSelectedAvatar: AvatarType;\n switch (customAvatarType) {\n case CustomAvatarType.mml:\n newSelectedAvatar = {\n mmlCharacterString: customAvatarValue,\n };\n break;\n case CustomAvatarType.mmlUrl:\n newSelectedAvatar = {\n mmlCharacterUrl: customAvatarValue,\n };\n break;\n case CustomAvatarType.meshFileUrl:\n newSelectedAvatar = {\n meshFileUrl: customAvatarValue,\n };\n break;\n }\n\n setSelectedAvatar(newSelectedAvatar);\n props.onUpdateUserAvatar(newSelectedAvatar);\n };\n\n const handleKeyPress = (e: KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n e.stopPropagation();\n };\n\n const handleAvatarInputKeyPress = (e: KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n e.stopPropagation();\n if (e.key === \"Enter\") {\n addCustomAvatar();\n }\n };\n\n const handleDisplayNameKeyPress = (e: KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n e.stopPropagation();\n if (e.key === \"Enter\") {\n setDisplayName();\n }\n };\n\n const handleTypeSwitch = (type: CustomAvatarType) => {\n setCustomAvatarType(type);\n setCustomAvatarValue(\"\");\n };\n\n const getPlaceholderByType = (type: CustomAvatarType) => {\n switch (type) {\n case CustomAvatarType.meshFileUrl:\n return \"https://.../avatar.glb\";\n case CustomAvatarType.mmlUrl:\n return \"https://.../avatar.html\";\n case CustomAvatarType.mml:\n return '<m-character src=\"https://link-to-avatar\">\\n</m-character';\n }\n };\n\n if (\n !props.availableAvatars.length &&\n !props.allowCustomAvatars &&\n !props.allowCustomDisplayName\n ) {\n return null;\n }\n\n let recognizedAvatar = false;\n\n return (\n <>\n <div className={styles.menuButton} onClick={handleRootClick}>\n {!isVisible && (\n <div className={styles.openTab} onClick={() => setIsVisible(true)}>\n <img src={`data:image/svg+xml;utf8,${encodeURIComponent(AvatarIcon)}`} />\n </div>\n )}\n {isVisible && (\n <button className={styles.closeButton} onClick={(e) => setIsVisible(false)}>\n X\n </button>\n )}\n </div>\n {isVisible && (\n <div className={`${styles.avatarSelectionContainer}`}>\n {props.allowCustomDisplayName && (\n <div className={styles.displayNameSection}>\n <div className={styles.sectionHeading}>Display Name</div>\n <div className={styles.displayNameInputSection}>\n <input\n ref={displayNameRef}\n className={styles.input}\n value={displayNameValue}\n onKeyDown={handleDisplayNameKeyPress}\n onChange={handleDisplayNameChange}\n placeholder={\"Enter your display name\"}\n />\n <button\n className={styles.setButton}\n disabled={!displayNameValue}\n type=\"button\"\n onClick={setDisplayName}\n >\n Set\n </button>\n </div>\n </div>\n )}\n {!!props.availableAvatars.length && (\n <div className={styles.avatarSelectionSection}>\n <div className={styles.sectionHeading}>Choose your Avatar</div>\n <div className={styles.avatarSelectionUi}>\n {props.availableAvatars.map((avatar, index) => {\n const isSelected =\n (selectedAvatar?.meshFileUrl &&\n selectedAvatar?.meshFileUrl === avatar.meshFileUrl) ||\n (selectedAvatar?.mmlCharacterUrl &&\n selectedAvatar?.mmlCharacterUrl === avatar.mmlCharacterUrl) ||\n (selectedAvatar?.mmlCharacterString &&\n selectedAvatar?.mmlCharacterString === avatar.mmlCharacterString);\n\n if (isSelected) {\n recognizedAvatar = true;\n }\n\n return (\n <div\n key={index}\n className={styles.avatarSelectionUiAvatar}\n onClick={() => selectAvatar(avatar)}\n >\n <div className={styles.avatarSelectionUiAvatarImgContainer}>\n {isSelected && <SelectedPill />}\n {avatar.thumbnailUrl ? (\n <img\n className={styles.avatarSelectionUiAvatarImage}\n src={avatar.thumbnailUrl}\n alt={avatar.name}\n />\n ) : (\n <div className={styles.avatarSelectionNoImage}>\n <img\n alt={avatar.name}\n src={`data:image/svg+xml;utf8,${encodeURIComponent(AvatarIcon)}`}\n />\n </div>\n )}\n <p>{avatar.name}</p>\n <span className={styles.tooltipText}>{avatar.name}</span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n )}\n {props.allowCustomAvatars && (\n <div className={styles.customAvatarSection}>\n <div className={styles.sectionHeading}>Custom Avatar</div>\n <div className={styles.radioGroup}>\n <div className={styles.radioItem}>\n <input\n type=\"radio\"\n id=\"html\"\n name=\"customAvatarType\"\n onChange={() => handleTypeSwitch(CustomAvatarType.mmlUrl)}\n checked={customAvatarType === CustomAvatarType.mmlUrl}\n />\n <label htmlFor=\"html\">MML URL</label>\n </div>\n <div className={styles.radioItem}>\n <input\n type=\"radio\"\n id=\"mml\"\n name=\"customAvatarType\"\n onChange={() => handleTypeSwitch(CustomAvatarType.mml)}\n checked={customAvatarType === CustomAvatarType.mml}\n />\n <label htmlFor=\"mml\">MML</label>\n </div>\n <div className={styles.radioItem}>\n <input\n type=\"radio\"\n id=\"glb\"\n name=\"customAvatarType\"\n onChange={() => handleTypeSwitch(CustomAvatarType.meshFileUrl)}\n checked={customAvatarType === CustomAvatarType.meshFileUrl}\n />\n <label htmlFor=\"glb\">Mesh URL</label>\n </div>\n {!recognizedAvatar && <SelectedPill />}\n </div>\n <div className={styles.customAvatarInputSection}>\n {customAvatarType === CustomAvatarType.mml ? (\n <textarea\n ref={textareaRef}\n className={styles.input}\n value={customAvatarValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyPress}\n placeholder={getPlaceholderByType(customAvatarType)}\n rows={4}\n />\n ) : (\n <input\n ref={inputRef}\n className={styles.input}\n value={customAvatarValue}\n onKeyDown={handleAvatarInputKeyPress}\n onChange={handleInputChange}\n placeholder={getPlaceholderByType(customAvatarType)}\n />\n )}\n <button\n className={styles.setButton}\n disabled={!customAvatarValue}\n type=\"button\"\n onClick={addCustomAvatar}\n >\n Set\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </>\n );\n};\n", "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d=\"M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512l388.6 0c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304l-91.4 0z\"/></svg>\n", "\nconst content = __content_placeholder__;\nconst digest = __digest_placeholder__; \nconst inject = () => {\n setTimeout(() => {\n if (!globalThis.document) {\n return;\n }\n let root = globalThis.document.querySelector(\"head\");\n if (root && root.shadowRoot) {\n root = root.shadowRoot;\n }\n if (!root) {\n root = globalThis.document.head;\n }\n let container = root.querySelector(\"#_\" + digest);\n if (!container) {\n container = globalThis.document.createElement(\"style\");\n container.id = \"_\" + digest;\n const text = globalThis.document.createTextNode(content);\n container.appendChild(text);\n root.appendChild(container);\n }\n }, 0);\n};\n\nexport { inject };\n ", "import \"esbuild-css-modules-plugin-ns-css:src/avatar-selection-ui/components/AvatarPanel/AvatarSelectionUIComponent.module.css\";\n\nimport { inject } from \"esbuild-css-modules-plugin-ns-js:src/avatar-selection-ui/components/AvatarPanel/AvatarSelectionUIComponent.module.css:injector.js\";\nexport default new Proxy({\n \"avatarSelectionContainer\": \"AvatarSelectionUIComponent-module__avatarSelectionContainer_VjZ7cq__0261\",\n \"avatarSelectionNoImage\": \"AvatarSelectionUIComponent-module__avatarSelectionNoImage_VjZ7cq__0261\",\n \"avatarSelectionSection\": \"AvatarSelectionUIComponent-module__avatarSelectionSection_VjZ7cq__0261\",\n \"avatarSelectionUi\": \"AvatarSelectionUIComponent-module__avatarSelectionUi_VjZ7cq__0261\",\n \"avatarSelectionUiAvatar\": \"AvatarSelectionUIComponent-module__avatarSelectionUiAvatar_VjZ7cq__0261\",\n \"avatarSelectionUiAvatarImage\": \"AvatarSelectionUIComponent-module__avatarSelectionUiAvatarImage_VjZ7cq__0261\",\n \"avatarSelectionUiAvatarImgContainer\": \"AvatarSelectionUIComponent-module__avatarSelectionUiAvatarImgContainer_VjZ7cq__0261\",\n \"avatarSelectionUiCloseButton\": \"AvatarSelectionUIComponent-module__avatarSelectionUiCloseButton_VjZ7cq__0261\",\n \"avatarSelectionUiHeader\": \"AvatarSelectionUIComponent-module__avatarSelectionUiHeader_VjZ7cq__0261\",\n \"closeButton\": \"AvatarSelectionUIComponent-module__closeButton_VjZ7cq__0261\",\n \"customAvatarInputSection\": \"AvatarSelectionUIComponent-module__customAvatarInputSection_VjZ7cq__0261\",\n \"customAvatarSection\": \"AvatarSelectionUIComponent-module__customAvatarSection_VjZ7cq__0261\",\n \"displayNameInputSection\": \"AvatarSelectionUIComponent-module__displayNameInputSection_VjZ7cq__0261\",\n \"displayNameSection\": \"AvatarSelectionUIComponent-module__displayNameSection_VjZ7cq__0261\",\n \"input\": \"AvatarSelectionUIComponent-module__input_VjZ7cq__0261\",\n \"menuButton\": \"AvatarSelectionUIComponent-module__menuButton_VjZ7cq__0261\",\n \"openTab\": \"AvatarSelectionUIComponent-module__openTab_VjZ7cq__0261\",\n \"radioGroup\": \"AvatarSelectionUIComponent-module__radioGroup_VjZ7cq__0261\",\n \"radioItem\": \"AvatarSelectionUIComponent-module__radioItem_VjZ7cq__0261\",\n \"sectionHeading\": \"AvatarSelectionUIComponent-module__sectionHeading_VjZ7cq__0261\",\n \"selectedPill\": \"AvatarSelectionUIComponent-module__selectedPill_VjZ7cq__0261\",\n \"setButton\": \"AvatarSelectionUIComponent-module__setButton_VjZ7cq__0261\",\n \"tooltipText\": \"AvatarSelectionUIComponent-module__tooltipText_VjZ7cq__0261\"\n}, {\n get: function(source, key) {\n inject();\n return source[key];\n }\n});\n ", "import { createRef, forwardRef } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { createRoot, Root } from \"react-dom/client\";\n\nimport { ChatUIComponent } from \"./components/ChatPanel/TextChatUIComponent\";\n\nexport type StringToHslOptions = {\n hueThresholds?: [number, number][];\n saturationThresholds?: [number, number][];\n lightnessThresholds?: [number, number][];\n};\n\nconst DEFAULT_HUE_RANGES: [number, number][] = [[10, 350]];\nconst DEFAULT_SATURATION_RANGES: [number, number][] = [[60, 100]];\nconst DEFAULT_LIGHTNESS_RANGES: [number, number][] = [[65, 75]];\n\nexport const DEFAULT_HSL_OPTIONS: StringToHslOptions = {\n hueThresholds: DEFAULT_HUE_RANGES,\n saturationThresholds: DEFAULT_SATURATION_RANGES,\n lightnessThresholds: DEFAULT_LIGHTNESS_RANGES,\n};\n\nconst ForwardedChatUIComponent = forwardRef(ChatUIComponent);\n\nexport type ChatUIInstance = {\n addMessage: (username: string, message: string) => void;\n};\n\nexport type TextChatUIProps = {\n holderElement: HTMLElement;\n sendMessageToServerMethod: (message: string) => void;\n visibleByDefault?: boolean;\n stringToHslOptions?: StringToHslOptions;\n};\n\nexport class TextChatUI {\n private root: Root;\n private appRef = createRef<ChatUIInstance>();\n\n public addTextMessage(username: string, message: string) {\n if (this.appRef.current) {\n this.appRef.current.addMessage(username, message);\n }\n }\n\n private wrapper = document.createElement(\"div\");\n\n constructor(private config: TextChatUIProps) {\n this.config.holderElement.appendChild(this.wrapper);\n this.root = createRoot(this.wrapper);\n }\n\n dispose() {\n this.root.unmount();\n this.wrapper.remove();\n }\n\n init() {\n flushSync(() =>\n this.root.render(\n <ForwardedChatUIComponent\n ref={this.appRef}\n sendMessageToServer={this.config.sendMessageToServerMethod}\n visibleByDefault={this.config.visibleByDefault}\n stringToHslOptions={this.config.stringToHslOptions}\n />,\n ),\n );\n }\n}\n", "import {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n ForwardRefRenderFunction,\n MouseEvent,\n} from \"react\";\n\nimport { useClickOutside } from \"../../helpers\";\nimport ChatIcon from \"../../icons/Chat.svg\";\nimport PinButton from \"../../icons/Pin.svg\";\nimport { StringToHslOptions, type ChatUIInstance } from \"../../TextChatUI\";\nimport { InputBox } from \"../Input/InputBox\";\nimport { Messages } from \"../Messages/Messages\";\n\nimport styles from \"./TextChatUIComponent.module.css\";\ntype ChatUIProps = {\n sendMessageToServer: (message: string) => void;\n visibleByDefault?: boolean;\n stringToHslOptions?: StringToHslOptions;\n};\n\nconst MAX_MESSAGES = 50;\nconst SECONDS_TO_FADE_OUT = 6;\nconst AUTO_SCROLL_RESET_DELAY_MS = 100;\n\nexport const ChatUIComponent: ForwardRefRenderFunction<ChatUIInstance, ChatUIProps> = (\n props: ChatUIProps,\n ref,\n) => {\n const visibleByDefault: boolean = props.visibleByDefault ?? true;\n const [messages, setMessages] = useState<Array<{ username: string; message: string }>>([]);\n const [isVisible, setIsVisible] = useState<boolean>(visibleByDefault);\n const [isSticky, setSticky] = useState<boolean>(visibleByDefault);\n const [isFocused, setIsFocused] = useState(false);\n const [isOpenHovered, setOpenHovered] = useState(false);\n const [shouldAutoScroll, setShouldAutoScroll] = useState(false);\n\n const [panelStyle, setPanelStyle] = useState(styles.fadeOut);\n const [stickyStyle, setStickyStyle] = useState(styles.stickyButton);\n\n const stickyButtonRef = useRef<HTMLDivElement>(null);\n const closeButtonRef = useRef<HTMLDivElement>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const inputBoxRef = useRef<{ focusInput: () => void } | null>(null);\n\n const startHideTimeout = useCallback(() => {\n if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = setTimeout(() => {\n if (isVisible) {\n setIsVisible(false);\n }\n }, SECONDS_TO_FADE_OUT * 1000);\n }, [isVisible]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n if (!isVisible) setIsVisible(true);\n setIsFocused(true);\n if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);\n if (inputBoxRef.current) inputBoxRef.current.focusInput();\n }\n },\n [isVisible],\n );\n\n const handleBlur = useCallback(() => {\n if (isFocused) setIsFocused(false);\n startHideTimeout();\n if (closeButtonRef.current) closeButtonRef.current.focus();\n }, [isFocused, startHideTimeout]);\n\n const hide = () => {\n setIsVisible(false);\n setIsFocused(false);\n if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);\n };\n\n const handleRootClick = (e: MouseEvent) => {\n e.stopPropagation();\n setOpenHovered(true);\n if (!isVisible) setIsVisible(true);\n };\n\n const handleStickyButton = (e: MouseEvent) => {\n e.stopPropagation();\n setSticky(!isSticky);\n };\n\n const handleWheel = (e: React.WheelEvent) => {\n e.stopPropagation();\n };\n\n const handleMouseLeave = () => {\n setOpenHovered(false);\n if (!isFocused && !isSticky && isVisible) {\n startHideTimeout();\n }\n };\n\n const handleMouseEnter = () => {\n setOpenHovered(true);\n if (!isVisible) setIsVisible(true);\n };\n\n const chatPanelRef = useClickOutside(() => {\n if (isFocused) {\n setIsFocused(false);\n startHideTimeout();\n }\n });\n\n useEffect(() => {\n if (isVisible && isSticky) {\n if (chatPanelRef.current) chatPanelRef.current.style.zIndex = \"100\";\n }\n setPanelStyle(isVisible || isFocused || isSticky ? styles.fadeIn : styles.fadeOut);\n setStickyStyle(\n isSticky\n ? styles.stickyButtonEnabled\n : isOpenHovered\n ? styles.stickyButton\n : styles.stickyButtonFadeOut,\n );\n if (chatPanelRef.current && chatPanelRef.current.style.zIndex !== \"100\") {\n // we just want to change the z-index after the browser has the chance\n // to apply the CSS to the SVG icons\n setTimeout(() => {\n if (chatPanelRef.current) chatPanelRef.current.style.zIndex = \"100\";\n }, 2000);\n }\n }, [isVisible, isSticky, isFocused, chatPanelRef, isOpenHovered]);\n\n const appendMessages = (username: string, message: string) => {\n setMessages((prev) => {\n const newMessages = [...prev, { username, message }];\n return newMessages.length > MAX_MESSAGES ? newMessages.slice(-MAX_MESSAGES) : newMessages;\n });\n };\n\n useImperativeHandle(ref, () => ({\n addMessage: (username: string, message: string) => {\n appendMessages(username, message);\n if (!isVisible) setIsVisible(true);\n startHideTimeout();\n },\n }));\n\n const handleSendMessage = (message: string) => {\n setShouldAutoScroll(true);\n props.sendMessageToServer(message);\n // Reset after a short delay\n setTimeout(() => setShouldAutoScroll(false), AUTO_SCROLL_RESET_DELAY_MS);\n };\n\n const setFocus = () => setIsFocused(true);\n\n useEffect(() => {\n window.addEventListener(\"keydown\", handleKeyDown, false);\n window.addEventListener(\"blur\", handleBlur, false);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown, false);\n window.removeEventListener(\"blur\", handleBlur, false);\n };\n }, [handleBlur, handleKeyDown]);\n\n return (\n <div className={styles.textChatUi}>\n <div\n className={styles.uiHover}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleRootClick}\n >\n <div className={styles.openTab} onClick={hide}>\n <img src={`data:image/svg+xml;utf8,${encodeURIComponent(ChatIcon)}`} />\n </div>\n <div ref={stickyButtonRef} className={stickyStyle} onClick={handleStickyButton}>\n <img src={`data:image/svg+xml;utf8,${encodeURIComponent(PinButton)}`} />\n </div>\n </div>\n <div\n ref={chatPanelRef}\n style={{ zIndex: -1 }}\n id=\"text-chat-wrapper\"\n className={`${styles.textChat} ${panelStyle}`}\n onWheel={handleWheel}\n >\n <div className={styles.messagesWrapper}>\n <Messages\n messages={messages}\n stringToHslOptions={props.stringToHslOptions}\n shouldAutoScroll={shouldAutoScroll}\n />\n </div>\n <InputBox\n ref={inputBoxRef}\n onSendMessage={handleSendMessage}\n hide={hide}\n setFocus={setFocus}\n />\n </div>\n </div>\n );\n};\n", "import { useEffect, useLayoutEffect, useRef } from \"react\";\n\ntype ClickAwayCallback = (event: MouseEvent | TouchEvent) => void;\n\nexport function useClickOutside(cb: ClickAwayCallback) {\n const ref = useRef<HTMLDivElement>(null);\n const refCb = useRef<ClickAwayCallback>(cb);\n\n useLayoutEffect(() => {\n refCb.current = cb;\n });\n\n useEffect(() => {\n const handler = (e: MouseEvent | TouchEvent) => {\n const element = ref.current;\n if (element && !element.contains(e.target as Node)) {\n refCb.current(e);\n }\n };\n\n document.addEventListener(\"mousedown\", handler);\n document.addEventListener(\"touchstart\", handler);\n\n return () => {\n document.removeEventListener(\"mousedown\", handler);\n document.removeEventListener(\"touchstart\", handler);\n };\n }, []);\n\n return ref;\n}\n", "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d=\"M88.2 309.1c9.8-18.3 6.8-40.8-7.5-55.8C59.4 230.9 48 204 48 176c0-63.5 63.8-128 160-128s160 64.5 160 128s-63.8 128-160 128c-13.1 0-25.8-1.3-37.8-3.6c-10.4-2-21.2-.6-30.7 4.2c-4.1 2.1-8.3 4.1-12.6 6c-16 7.2-32.9 13.5-49.9 18c2.8-4.6 5.4-9.1 7.9-13.6c1.1-1.9 2.2-3.9 3.2-5.9zM0 176c0 41.8 17.2 80.1 45.9 110.3c-.9 1.7-1.9 3.5-2.8 5.1c-10.3 18.4-22.3 36.5-36.6 52.1c-6.6 7-8.3 17.2-4.6 25.9C5.8 378.3 14.4 384 24 384c43 0 86.5-13.3 122.7-29.7c4.8-2.2 9.6-4.5 14.2-6.8c15.1 3 30.9 4.5 47.1 4.5c114.9 0 208-78.8 208-176S322.9 0 208 0S0 78.8 0 176zM432 480c16.2 0 31.9-1.6 47.1-4.5c4.6 2.3 9.4 4.6 14.2 6.8C529.5 498.7 573 512 616 512c9.6 0 18.2-5.7 22-14.5c3.8-8.8 2-19-4.6-25.9c-14.2-15.6-26.2-33.7-36.6-52.1c-.9-1.7-1.9-3.4-2.8-5.1C622.8 384.1 640 345.8 640 304c0-94.4-87.9-171.5-198.2-175.8c4.1 15.2 6.2 31.2 6.2 47.8l0 .6c87.2 6.7 144 67.5 144 127.4c0 28-11.4 54.9-32.7 77.2c-14.3 15-17.3 37.6-7.5 55.8c1.1 2 2.2 4 3.2 5.9c2.5 4.5 5.2 9 7.9 13.6c-17-4.5-33.9-10.7-49.9-18c-4.3-1.9-8.5-3.9-12.6-6c-9.5-4.8-20.3-6.2-30.7-4.2c-12.1 2.4-24.7 3.6-37.8 3.6c-61.7 0-110-26.5-136.8-62.3c-16 5.4-32.8 9.4-50 11.8C279 439.8 350 480 432 480z\"/></svg>", "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\"><!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d=\"M32 32C32 14.3 46.3 0 64 0H320c17.7 0 32 14.3 32 32s-14.3 32-32 32H290.5l11.4 148.2c36.7 19.9 65.7 53.2 79.5 94.7l1 3c3.3 9.8 1.6 20.5-4.4 28.8s-15.7 13.3-26 13.3H32c-10.3 0-19.9-4.9-26-13.3s-7.7-19.1-4.4-28.8l1-3c13.8-41.5 42.8-74.8 79.5-94.7L93.5 64H64C46.3 64 32 49.7 32 32zM160 384h64v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V384z\"/></svg>", "import { forwardRef, KeyboardEvent, useImperativeHandle, useRef, useState } from \"react\";\n\nimport SendButton from \"../../icons/PaperPlane.svg\";\n\nimport styles from \"./InputBox.module.css\";\n\ntype InputBoxProps = {\n onSendMessage: (message: string) => void;\n hide: () => void;\n setFocus: () => void;\n};\n\nexport const InputBox = forwardRef<{ focusInput: () => void } | null, InputBoxProps>(\n ({ onSendMessage, hide, setFocus }, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const [inputValue, setInputValue] = useState(\"\");\n\n useImperativeHandle(ref, () => ({\n focusInput: () => {\n if (inputRef.current) inputRef.current.focus();\n },\n }));\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n };\n\n const handleSendClick = () => {\n if (inputValue.trim() !== \"\") {\n onSendMessage(inputValue.trim());\n setInputValue(\"\");\n }\n };\n\n const handleKeyPress = (e: KeyboardEvent<HTMLInputElement>) => {\n e.stopPropagation();\n if (e.key === \"Enter\") {\n if (inputRef.current?.value.trim().length === 0) {\n if (buttonRef.current) buttonRef.current.focus();\n hide();\n return;\n }\n handleSendClick();\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <input\n ref={inputRef}\n type=\"text\"\n placeholder=\"Type your message here...\"\n value={inputValue}\n onChange={handleInputChange}\n className={styles.chatInput}\n onKeyDown={handleKeyPress}\n onFocus={setFocus}\n />\n <button ref={buttonRef} onClick={handleSendClick} className={styles.sendButton}>\n <div className={styles.svgIcon}>\n <img src={`data:image/svg+xml;utf8,${encodeURIComponent(SendButton)}`} />\n </div>\n </button>\n </div>\n );\n },\n);\nInputBox.displayName = \"InputBox\";\n", "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d=\"M498.1 5.6c10.1 7 15.4 19.1 13.5 31.2l-64 416c-1.5 9.7-7.4 18.2-16 23s-18.9 5.4-28 1.6L284 427.7l-68.5 74.1c-8.9 9.7-22.9 12.9-35.2 8.1S160 493.2 160 480V396.4c0-4 1.5-7.8 4.2-10.7L331.8 202.8c5.8-6.3 5.6-16-.4-22s-15.7-6.4-22-.7L106 360.8 17.7 316.6C7.1 311.3 .3 300.7 0 288.9s5.9-22.8 16.1-28.7l448-256c10.7-6.1 23.9-5.5 34 1.4z\"/></svg>", "\nconst content = __content_placeholder__;\nconst digest = __digest_placeholder__; \nconst inject = () => {\n setTimeout(() => {\n if (!globalThis.document) {\n return;\n }\n let root = globalThis.document.querySelector(\"head\");\n if (root && root.shadowRoot) {\n root = root.shadowRoot;\n }\n if (!root) {\n root = globalThis.document.head;\n }\n let container = root.querySelector(\"#_\" + digest);\n if (!container) {\n container = globalThis.document.createElement(\"style\");\n container.id = \"_\" + digest;\n const text = globalThis.document.createTextNode(content);\n container.appendChild(text);\n root.appendChild(container);\n }\n }, 0);\n};\n\nexport { inject };\n ", "import \"esbuild-css-modules-plugin-ns-css:src/chat-ui/components/Input/InputBox.module.css\";\n\nimport { inject } from \"esbuild-css-modules-plugin-ns-js:src/chat-ui/components/Input/InputBox.module.css:injector.js\";\nexport default new Proxy({\n \"chatInput\": \"InputBox-module__chatInput_adOgOW__0261\",\n \"inputWrapper\": \"InputBox-module__inputWrapper_adOgOW__0261\",\n \"sendButton\": \"InputBox-module__sendButton_adOgOW__0261\",\n \"svgIcon\": \"InputBox-module__svgIcon_adOgOW__0261\"\n}, {\n get: function(source, key) {\n inject();\n return source[key];\n }\n});\n ", "import { FC, useEffect, useRef, useState } from \"react\";\n\nimport { StringToHslOptions } from \"../../TextChatUI\";\nimport Message from \"../Message/Message\";\n\nimport styles from \"./Messages.module.css\";\n\ntype MessagesProps = {\n messages: Array<{ username: string; message: string }>;\n stringToHslOptions?: StringToHslOptions;\n shouldAutoScroll?: boolean;\n};\n\nconst SCROLL_THRESHOLD_PX = 10; // Threshold to consider \"at bottom\" for scroll position\n\nexport const Messages: FC<MessagesProps> = ({ messages, stringToHslOptions, shouldAutoScroll }) => {\n const messagesEndRef = useRef<null | HTMLDivElement>(null);\n const containerRef = useRef<null | HTMLDivElement>(null);\n const [unreadCount, setUnreadCount] = useState(0);\n const [lastReadMessageIndex, setLastReadMessageIndex] = useState(0);\n const [wasAtBottom, setWasAtBottom] = useState(true);\n\n const isAtBottom = () => {\n if (!containerRef.current) return true;\n const { scrollTop, scrollHeight, clientHeight } = containerRef.current;\n return Math.abs(scrollHeight - clientHeight - scrollTop) < SCROLL_THRESHOLD_PX;\n };\n\n const handleScroll = () => {\n const atBottom = isAtBottom();\n setWasAtBottom(atBottom);\n\n // Mark messages as read when scrolled to bottom\n if (atBottom && unreadCount > 0) {\n setUnreadCount(0);\n setLastReadMessageIndex(messages.length - 1);\n }\n };\n\n const scrollToBottom = () => {\n if (messagesEndRef.current) {\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n setUnreadCount(0);\n setLastReadMessageIndex(messages.length - 1);\n setWasAtBottom(true);\n };\n\n useEffect(() => {\n if (messages.length === 0) return;\n\n // Should auto-scroll if user sent message or was at bottom\n const shouldScroll = shouldAutoScroll || wasAtBottom;\n\n if (shouldScroll) {\n // Use setTimeout to ensure DOM is updated, then check if we need to scroll\n setTimeout(() => {\n if (!isAtBottom()) {\n if (messagesEndRef.current) {\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }\n setWasAtBottom(true);\n }, 0);\n setUnreadCount(0);\n setLastReadMessageIndex(messages.length - 1);\n } else {\n // User is scrolled up and this is someone else's message\n const newUnreadCount = messages.length - 1 - lastReadMessageIndex;\n setUnreadCount(newUnreadCount);\n }\n }, [messages, shouldAutoScroll, wasAtBottom, lastReadMessageIndex]);\n\n return (\n <>\n <div ref={containerRef} className={styles.messagesContainer} onScroll={handleScroll}>\n {messages.map((msg, index) => (\n <Message\n key={index}\n username={msg.username}\n message={msg.message}\n stringToHslOptions={stringToHslOptions}\n />\n ))}\n <div ref={messagesEndRef}></div>\n </div>\n {unreadCount > 0 && (\n <button className={styles.newMessagesButton} onClick={scrollToBottom}>\n {unreadCount} new message{unreadCount !== 1 ? \"s\" : \"\"}\n </button>\n )}\n </>\n );\n};\n", "import { FC, useState, useEffect, useCallback } from \"react\";\n\nimport { DEFAULT_HSL_OPTIONS, StringToHslOptions } from \"../../TextChatUI\";\n\nimport styles from \"./Message.module.css\";\n\nfunction ReverseHash(input: string): number {\n // Hash has an initial value of 5381. As bit shifting is used, output can be any signed 32 bit Integer.\n const stringLength = input.length;\n let hash = 5381;\n\n for (let i = stringLength - 1; i >= 0; i--) {\n hash = (hash << 5) + hash + input.charCodeAt(i);\n }\n\n return hash;\n}\n\nfunction generateValueFromThresholds(hash: number, thresholds: [number, number][]): number {\n const selectedThreshold = thresholds[hash % thresholds.length];\n const min = Math.min(...selectedThreshold);\n const max = Math.max(...selectedThreshold);\n\n const thresholdRange = Math.abs(max - min);\n return (hash % thresholdRange) + min;\n}\n\nfunction hslForString(\n input: string,\n options: StringToHslOptions = DEFAULT_HSL_OPTIONS,\n): [number, number, number] {\n // Because JS bit shifting only operates on 32-Bit signed Integers,\n // in the case of overflow where a negative hash is inappropriate,\n // the absolute value has to be taken. This 'halves' our theoretical\n // hash distribution. This may require an alternate approach if\n // collisions are too frequent.\n let hash = Math.abs(ReverseHash(\"lightness: \" + input));\n\n const lightness = options.lightnessThresholds\n ? generateValueFromThresholds(hash, options.lightnessThresholds)\n : generateValueFromThresholds(hash, DEFAULT_HSL_OPTIONS.lightnessThresholds!);\n\n hash = Math.abs(ReverseHash(\"saturation:\" + input));\n const saturation = options.saturationThresholds\n ? generateValueFromThresholds(hash, options.saturationThresholds)\n : generateValueFromThresholds(hash, DEFAULT_HSL_OPTIONS.saturationThresholds!);\n\n hash = Math.abs(ReverseHash(\"hue:\" + input));\n const hue = options.hueThresholds\n ? generateValueFromThresholds(hash, options.hueThresholds)\n : generateValueFromThresholds(hash, DEFAULT_HSL_OPTIONS.hueThresholds!);\n\n return [hue, saturation, lightness];\n}\n\ntype MessageProps = {\n username: string;\n message: string;\n stringToHslOptions?: StringToHslOptions;\n};\n\nconst Message: FC<MessageProps> = ({ username, message, stringToHslOptions }) => {\n const [userColors, setUserColors] = useState<Map<string, string>>(new Map());\n\n const generateColorForUsername = useCallback((): string => {\n const [hue, saturation, lightness] = hslForString(username, stringToHslOptions);\n return `hsl(${hue}, ${saturation}%, ${lightness}%)`;\n }, [stringToHslOptions, username]);\n\n useEffect(() => {\n if (!userColors.has(username)) {\n const color = generateColorForUsername();\n setUserColors(new Map(userColors).set(username, color));\n }\n }, [username, userColors, generateColorForUsername]);\n\n const userColor = userColors.get(username) || \"hsl(0, 0%, 0%)\";\n\n return (\n <div className={styles.messageContainer}>\n <span className={styles.userName} style={{ color: userColor }}>\n {username}\n </span>\n : {message}\n </div>\n );\n};\n\nexport default Message;\n", "\nconst content = __content_placeholder__;\nconst digest = __digest_placeholder__; \nconst inject = () => {\n setTimeout(() => {\n if (!globalThis.document) {\n return;\n }\n let root = globalThis.document.querySelector(\"head\");\n if (root && root.shadowRoot) {\n root = root.shadowRoot;\n }\n if (!root) {\n root = globalThis.document.head;\n }\n let container = root.querySelector(\"#_\" + digest);\n if (!container) {\n container = globalThis.document.createElement(\"style\");\n container.id = \"_\" + digest;\n const text = globalThis.document.createTextNode(content);\n container.appendChild(text);\n root.appendChild(container);\n }\n }, 0);\n};\n\nexport { inject };\n ", "import \"esbuild-css-modules-plugin-ns-css:src/chat-ui/components/Message/Message.module.css\";\n\nimport { inject } from \"esbuild-css-modules-plugin-ns-js:src/chat-ui/components/Message/Message.module.css:injector.js\";\nexport default new Proxy({\n \"messageContainer\": \"Message-module__messageContainer_ikOQiq__0261\",\n \"userName\": \"Message-module__userName_ikOQiq__0261\"\n}, {\n get: function(source, key) {\n inject();\n return source[key];\n }\n});\n ", "\nconst content = __content_placeholder__;\nconst digest = __digest_placeholder__; \nconst inject = () => {\n setTimeout(() => {\n if (!globalThis.document) {\n return;\n }\n let root = globalThis.document.querySelector(\"head\");\n if (root && root.shadowRoot) {\n root = root.shadowRoot;\n }\n if (!root) {\n root = globalThis.document.head;\n }\n let container = root.querySelector(\"#_\" + digest);\n if (!container) {\n container = globalThis.document.createElement(\"style\");\n container.id = \"_\" + digest;\n const text = globalThis.document.createTextNode(content);\n container.appendChild(text);\n root.appendChild(container);\n }\n }, 0);\n};\n\nexport { inject };\n ", "import \"esbuild-css-modules-plugin-ns-css:src/chat-ui/components/Messages/Messages.module.css\";\n\nimport { inject } from \"esbuild-css-modules-plugin-ns-js:src/chat-ui/components/Messages/Messages.module.css:injector.js\";\nexport default new Proxy({\n \"messagesContainer\": \"Messages-module__messagesContainer_LXaUUW__0261\",\n \"newMessagesButton\": \"Messages-module__newMessagesButton_LXaUUW__0261\"\n}, {\n get: function(source, key) {\n inject();\n return source[key];\n }\n});\n ", "\nconst content = __content_placeholder__;\nconst digest = __digest_placeholder__; \nconst inject = () => {\n setTimeout(() => {\n if (!globalThis.document) {\n return;\n }\n let root = globalThis.document.querySelector(\"head\");\n if (root && root.shadowRoot) {\n root = root.shadowRoot;\n }\n if (!root) {\n root = globalThis.document.head;\n }\n let container = root.querySelector(\"#_\" + digest);\n if (!container) {\n container = globalThis.document.createElement(\"style\");\n container.id = \"_\" + digest;\n const text = globalThis.document.createTextNode(content);\n container.appendChild(text);\n root.appendChild(container);\n }\n }, 0);\n};\n\nexport { inject };\n ", "import \"esbuild-css-modules-plugin-ns-css:src/chat-ui/components/ChatPanel/TextChatUIComponent.module.css\";\n\nimport { inject } from \"esbuild-css-modules-plugin-ns-js:src/chat-ui/components/ChatPanel/TextChatUIComponent.module.css:injector.js\";\nexport default new Proxy({\n \"closeButton\": \"TextChatUIComponent-module__closeButton_gFDdcW__0261\",\n \"controls\": \"TextChatUIComponent-module__controls_gFDdcW__0261\",\n \"fadeIn\": \"TextChatUIComponent-module__fadeIn_gFDdcW__0261\",\n \"fadeOut\": \"TextChatUIComponent-module__fadeOut_gFDdcW__0261\",\n \"messagesWrapper\": \"TextChatUIComponent-module__messagesWrapper_gFDdcW__0261\",\n \"openTab\": \"TextChatUIComponent-module__openTab_gFDdcW__0261\",\n \"stickyButton\": \"TextChatUIComponent-module__stickyButton_gFDdcW__0261\",\n \"stickyButtonEnabled\": \"TextChatUIComponent-module__stickyButtonEnabled_gFDdcW__0261\",\n \"stickyButtonFadeOut\": \"TextChatUIComponent-module__stickyButtonFadeOut_gFDdcW__0261\",\n \"textChat\": \"TextChatUIComponent-module__textChat_gFDdcW__0261\",\n \"textChatUi\": \"TextChatUIComponent-module__textChatUi_gFDdcW__0261\",\n \"uiHover\": \"TextChatUIComponent-module__uiHover_gFDdcW__0261\"\n}, {\n get: function(source, key) {\n inject();\n return source[key];\n }\n});\n ", "\nconst content = __content_placeholder__;\nconst digest = __digest_placeholder__; \nconst inject = () => {\n setTimeout(() => {\n if (!globalThis.document) {\n return;\n }\n let root = globalThis.document.querySelector(\"head\");\n if (root && root.shadowRoot) {\n root = root.shadowRoot;\n }\n if (!root) {\n root = globalThis.document.head;\n }\n let container = root.querySelector(\"#_\" + digest);\n if (!container) {\n container = globalThis.document.createElement(\"style\");\n container.id = \"_\" + digest;\n const text = globalThis.document.createTextNode(content);\n container.appendChild(text);\n root.appendChild(container);\n }\n }, 0);\n};\n\nexport { inject };\n ", "import \"esbuild-css-modules-plugin-ns-css:src/Networked3dWebExperience.module.css\";\n\nimport { inject } from \"esbuild-css-modules-plugin-ns-js:src/Networked3dWebExperience.module.css:injector.js\";\nexport default new Proxy({\n \"respawnButton\": \"Networked3dWebExperience-module__respawnButton_7g9l0W__0261\"\n}, {\n get: function(source, key) {\n inject();\n return source[key];\n }\n});\n "],
5
- "mappings": "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",
6
- "names": ["jsx", "forwardRef", "flushSync", "createRoot", "useCallback", "useEffect", "useImperativeHandle", "useRef", "useState", "useRef", "forwardRef", "useRef", "useState", "content", "digest", "inject", "inject", "jsx", "jsxs", "forwardRef", "useRef", "useState", "useEffect", "useRef", "useState", "useState", "useEffect", "content", "digest", "inject", "inject", "jsx", "jsxs", "useState", "useEffect", "Message_default", "content", "digest", "inject", "inject", "Fragment", "jsx", "jsxs", "useRef", "useState", "useEffect", "Message_default", "content", "digest", "inject", "inject", "jsx", "jsxs", "useState", "useRef", "useCallback", "useEffect", "useImperativeHandle", "jsx", "forwardRef", "createRoot", "flushSync", "content", "digest", "inject", "inject", "spawnData"]
3
+ "sources": ["../src/Networked3dWebExperienceClient.ts", "../src/ClientEventEmitter.ts", "../src/DefaultRespawnButtonPlugin.ts", "../src/DefaultVirtualJoystickPlugin.ts", "../src/WorldConnection.ts", "../src/DefaultChatPlugin.ts", "../src/DefaultAvatarSelectionPlugin.ts", "../src/DefaultHUDPlugin.ts"],
4
+ "sourcesContent": ["import {\n AnimationConfig,\n CameraManager,\n CameraTransform,\n CharacterDescription,\n CharacterState,\n CollisionsManager,\n EnvironmentConfiguration,\n ErrorScreen,\n EulXYZ,\n Key,\n KeyInputManager,\n LoadingScreen,\n LoadingScreenConfig,\n SpawnConfiguration,\n SpawnConfigurationState,\n normalizeSpawnConfiguration,\n Vect3,\n InputProvider,\n Quat,\n getSpawnData,\n IRenderer,\n RenderState,\n CharacterManager,\n MMLDocumentConfiguration,\n TweakPane,\n createDefaultCharacterControllerValues,\n createDefaultCameraValues,\n RendererConfig,\n} from \"@mml-io/3d-web-client-core\";\nimport {\n experienceClientSubProtocols,\n type ServerBroadcastMessage,\n} from \"@mml-io/3d-web-experience-protocol\";\nimport { ThreeJSWorldRenderer } from \"@mml-io/3d-web-threejs\";\nimport {\n UserData,\n UserNetworkingClientUpdate,\n NetworkUpdate,\n} from \"@mml-io/3d-web-user-networking\";\nimport { LoadingProgressManager, registerCustomElementsToWindow } from \"@mml-io/mml-web\";\n\nimport { AvatarConfiguration } from \"./AvatarType\";\nimport { ClientEventEmitter } from \"./ClientEventEmitter\";\nimport { DefaultRespawnButtonPlugin } from \"./DefaultRespawnButtonPlugin\";\nimport { DefaultVirtualJoystickPlugin } from \"./DefaultVirtualJoystickPlugin\";\nimport type { UIPlugin } from \"./plugins\";\nimport { WorldConnection, type WorldEvent } from \"./WorldConnection\";\n\nexport type Networked3dWebExperienceClientConfig = {\n userNetworkAddress: string;\n sessionToken: string;\n animationConfig: AnimationConfig;\n voiceChatAddress?: string;\n updateURLLocation?: boolean;\n onServerBroadcast?: (broadcast: ServerBroadcastMessage) => void;\n loadingScreen?: LoadingScreenConfig;\n createRenderer?: (options: CreateRendererOptions) => IRenderer;\n waitForWorldConfig?: boolean;\n /** Virtual joystick for touch/mobile input. Defaults to built-in joystick. Pass `null` to disable. */\n virtualJoystickPlugin?: UIPlugin | null;\n /** Respawn button overlay. Defaults to built-in button. Pass `null` to disable. */\n respawnButtonPlugin?: UIPlugin | null;\n /**\n * Additional UI plugins mounted alongside the built-in plugins.\n * Use this to add arbitrary overlay UI (HUD, minimap, voice\n * controls, etc.) that participates in the standard plugin lifecycle.\n */\n plugins?: UIPlugin[];\n} & UpdatableConfig;\n\n/**\n * The subset of the client config that can be updated at runtime, either via\n * `updateConfig()` or delivered from the server as the JSON payload of a\n * `FROM_SERVER_WORLD_CONFIG_MESSAGE_TYPE` message.\n *\n * The server-side equivalent is `WorldConfigPayload` from\n * `@mml-io/3d-web-experience-protocol`.\n */\nexport type UpdatableConfig = {\n enableChat?: boolean;\n mmlDocuments?: { [key: string]: MMLDocumentConfiguration };\n environmentConfiguration?: EnvironmentConfiguration;\n spawnConfiguration?: SpawnConfiguration;\n avatarConfiguration?: AvatarConfiguration;\n allowCustomDisplayName?: boolean;\n enableTweakPane?: boolean;\n allowOrbitalCamera?: boolean;\n postProcessingEnabled?: boolean;\n hud?:\n | false\n | {\n minimap?: boolean;\n playerList?: boolean;\n respawnButton?: boolean;\n [key: string]: boolean | undefined;\n };\n};\n\nexport type CreateRendererOptions = {\n targetElement: HTMLElement;\n coreCameraManager: CameraManager;\n collisionsManager: CollisionsManager;\n config: RendererConfig;\n tweakPane: TweakPane;\n mmlTargetWindow: Window;\n mmlTargetElement: HTMLElement;\n loadingProgressManager: LoadingProgressManager;\n mmlDocuments: { [key: string]: MMLDocumentConfiguration };\n mmlAuthToken: string | null;\n onInitialized: () => void;\n};\n\nexport class Networked3dWebExperienceClient extends ClientEventEmitter {\n private element: HTMLDivElement;\n private canvasHolder: HTMLDivElement;\n\n private renderer: IRenderer;\n private rendererConfig: RendererConfig;\n\n private cameraManager: CameraManager;\n private collisionsManager: CollisionsManager;\n private characterManager: CharacterManager;\n private keyInputManager = new KeyInputManager();\n private resizeObserver: ResizeObserver;\n\n private connectionId: number | null = null;\n private worldConnection: WorldConnection;\n private remoteUserStates = new Map<number, UserNetworkingClientUpdate>();\n private userProfiles = new Map<number, UserData>();\n\n private virtualJoystickPlugin: UIPlugin | null;\n private respawnButtonPlugin: UIPlugin | null;\n private plugins: UIPlugin[];\n private tweakPane: TweakPane;\n\n private spawnConfiguration: SpawnConfigurationState;\n private cameraValues = createDefaultCameraValues();\n private characterControllerValues = createDefaultCharacterControllerValues();\n\n private initialLoadCompleted = false;\n private pendingChatMessages: {\n username: string;\n message: string;\n fromConnectionId: number;\n userId: string;\n isLocal: boolean;\n }[] = [];\n private latestConfig: Partial<UpdatableConfig> = {};\n private loadingProgressManager = new LoadingProgressManager();\n private loadingScreen: LoadingScreen;\n private errorScreen?: ErrorScreen;\n\n private mmlAuthToken: string | null = null;\n private rendererInitialized = false;\n private worldConfigReceived = false;\n private worldConfigTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private disposed = false;\n private static readonly WORLD_CONFIG_TIMEOUT_MS = 10_000;\n private static readonly MAX_PENDING_CHAT_MESSAGES = 100;\n\n // Frame timing\n private currentRequestAnimationFrame: number | null = null;\n private lastUpdateTimeMs: number = 0;\n private frameCounter: number = 0;\n private readonly targetFPS: number = 60;\n private readonly fixedDeltaTime: number = 1 / this.targetFPS;\n private accumulatedTime: number = 0;\n\n private cachedCameraTransform: CameraTransform = {\n position: new Vect3(),\n rotation: { x: 0, y: 0, z: 0 },\n fov: 0,\n };\n\n constructor(\n private holderElement: HTMLElement,\n private config: Networked3dWebExperienceClientConfig,\n ) {\n super();\n this.virtualJoystickPlugin =\n config.virtualJoystickPlugin === null\n ? null\n : (config.virtualJoystickPlugin ?? new DefaultVirtualJoystickPlugin());\n this.respawnButtonPlugin =\n config.respawnButtonPlugin === null\n ? null\n : (config.respawnButtonPlugin ?? new DefaultRespawnButtonPlugin());\n this.plugins = config.plugins ?? [];\n this.element = document.createElement(\"div\");\n this.element.style.position = \"absolute\";\n this.element.style.width = \"100%\";\n this.element.style.height = \"100%\";\n this.holderElement.appendChild(this.element);\n\n this.canvasHolder = document.createElement(\"div\");\n this.canvasHolder.style.position = \"absolute\";\n this.canvasHolder.style.width = \"100%\";\n this.canvasHolder.style.height = \"100%\";\n this.element.appendChild(this.canvasHolder);\n\n this.collisionsManager = new CollisionsManager();\n this.cameraManager = new CameraManager(this.canvasHolder, this.collisionsManager);\n\n this.tweakPane = new TweakPane(\n this.canvasHolder,\n {\n cameraValues: this.cameraValues,\n characterControllerValues: this.characterControllerValues,\n },\n config.enableTweakPane ?? false,\n );\n\n this.spawnConfiguration = normalizeSpawnConfiguration(this.config.spawnConfiguration);\n\n const spawnData = getSpawnData(this.spawnConfiguration, true);\n const spawnRotation = new Quat().setFromEulerXYZ(spawnData.spawnRotation);\n\n const initialNetworkLoadRef = {};\n if (!this.config.waitForWorldConfig) {\n this.loadingProgressManager.addLoadingAsset(initialNetworkLoadRef, \"network\", \"network\");\n }\n this.worldConnection = new WorldConnection({\n url: this.config.userNetworkAddress,\n sessionToken: this.config.sessionToken,\n websocketFactory: (url: string) => new WebSocket(url, [...experienceClientSubProtocols]),\n initialUserState: { userId: \"\", username: null, characterDescription: null, colors: null },\n initialPosition: spawnData.spawnPosition,\n initialRotation: { eulerY: 2 * Math.atan2(spawnRotation.y, spawnRotation.w) },\n });\n\n this.worldConnection.addEventListener((event: WorldEvent) => {\n switch (event.type) {\n case \"disconnected\":\n case \"reconnecting\":\n this.characterManager.clear();\n this.remoteUserStates.clear();\n this.connectionId = null;\n this.pendingChatMessages = [];\n break;\n\n case \"identity_assigned\":\n console.log(`Assigned ID: ${event.connectionId}`);\n this.connectionId = event.connectionId;\n // Set the local connection ID early to prevent the local character from being\n // spawned as a remote character when network updates arrive before loading completes\n this.characterManager.setLocalConnectionId(event.connectionId);\n if (this.initialLoadCompleted) {\n this.spawnCharacter(getSpawnData(this.spawnConfiguration, true));\n } else if (!this.config.waitForWorldConfig) {\n this.loadingProgressManager.completedLoadingAsset(initialNetworkLoadRef);\n }\n break;\n\n case \"server_error\":\n this.disposeWithError(event.message);\n break;\n\n case \"session_config\":\n if (event.config.authToken !== undefined) {\n this.mmlAuthToken = event.config.authToken;\n if (this.rendererInitialized && this.config.mmlDocuments) {\n this.renderer.setMMLConfiguration(this.config.mmlDocuments, this.mmlAuthToken);\n }\n }\n break;\n\n case \"world_config\": {\n if (this.worldConfigTimeoutId !== null) {\n clearTimeout(this.worldConfigTimeoutId);\n this.worldConfigTimeoutId = null;\n }\n const parsedConfig = event.config;\n // WorldConfigPayload types (environmentConfiguration,\n // spawnConfiguration, avatarConfiguration) are structurally\n // compatible with their client-core / experience-client\n // counterparts, so no casts are needed.\n const updatable: UpdatableConfig = {};\n if (parsedConfig.enableChat !== undefined) {\n updatable.enableChat = parsedConfig.enableChat;\n }\n if (parsedConfig.mmlDocuments !== undefined) {\n updatable.mmlDocuments = parsedConfig.mmlDocuments;\n }\n if (parsedConfig.environmentConfiguration !== undefined) {\n updatable.environmentConfiguration = parsedConfig.environmentConfiguration;\n }\n if (parsedConfig.spawnConfiguration !== undefined) {\n updatable.spawnConfiguration = parsedConfig.spawnConfiguration;\n }\n if (parsedConfig.avatarConfiguration !== undefined) {\n updatable.avatarConfiguration = parsedConfig.avatarConfiguration;\n }\n if (parsedConfig.allowCustomDisplayName !== undefined) {\n updatable.allowCustomDisplayName = parsedConfig.allowCustomDisplayName;\n }\n if (parsedConfig.enableTweakPane !== undefined) {\n updatable.enableTweakPane = parsedConfig.enableTweakPane;\n }\n if (parsedConfig.allowOrbitalCamera !== undefined) {\n updatable.allowOrbitalCamera = parsedConfig.allowOrbitalCamera;\n }\n if (parsedConfig.postProcessingEnabled !== undefined) {\n updatable.postProcessingEnabled = parsedConfig.postProcessingEnabled;\n }\n if (parsedConfig.hud !== undefined) {\n updatable.hud = parsedConfig.hud;\n }\n this.updateConfig(updatable);\n // Mark config as received regardless of parse success so the\n // client is not blocked indefinitely \u2014 it will use defaults.\n this.worldConfigReceived = true;\n this.checkReadyForInitialLoad();\n break;\n }\n\n case \"server_broadcast\":\n this.config.onServerBroadcast?.({\n broadcastType: event.broadcastType,\n payload: event.payload,\n });\n break;\n\n case \"chat\":\n this.handleChatMessage(\n event.message.fromConnectionId,\n event.message.userId,\n event.message.message,\n );\n break;\n\n case \"network_update\":\n this.onNetworkUpdate(event.update);\n break;\n }\n });\n\n if (this.config.allowOrbitalCamera) {\n this.keyInputManager.createKeyBinding(Key.C, () => {\n if (document.activeElement === document.body) {\n this.cameraManager.toggleFlyCamera();\n this.renderer.fitContainer();\n }\n });\n }\n\n this.characterManager = new CharacterManager({\n collisionsManager: this.collisionsManager,\n cameraManager: this.cameraManager,\n keyInputManager: this.keyInputManager,\n remoteUserStates: this.remoteUserStates,\n sendUpdate: (characterState: CharacterState) => {\n this.worldConnection.sendUpdate(characterState);\n },\n sendLocalCharacterColors: (colors: Array<[number, number, number]>) => {\n this.worldConnection.updateColors(colors);\n },\n spawnConfiguration: this.spawnConfiguration,\n characterControllerValues: this.characterControllerValues,\n characterResolve: (connectionId: number) => {\n return this.resolveCharacterData(connectionId);\n },\n updateURLLocation: this.config.updateURLLocation !== false,\n });\n\n this.loadingScreen = new LoadingScreen(this.loadingProgressManager, this.config.loadingScreen);\n this.element.append(this.loadingScreen.element);\n\n this.loadingProgressManager.addProgressCallback(() => {\n const [, completed] = this.loadingProgressManager.toRatio();\n if (completed && !this.initialLoadCompleted) {\n this.initialLoadCompleted = true;\n if (this.connectionId === null || this.disposed) return;\n\n for (const plugin of this.getAllPlugins()) {\n plugin.mount(this.element, this);\n }\n\n // Deliver config to plugins after mount. If no world config has been\n // received yet, this delivers {} which lets plugins create with defaults.\n this.emit(\"configChanged\", this.latestConfig);\n for (const plugin of this.getAllPlugins()) {\n plugin.onConfigChanged?.(this.latestConfig);\n }\n\n this.spawnCharacter(getSpawnData(this.spawnConfiguration, true));\n this.emit(\"ready\");\n\n // Replay chat messages that arrived before plugins were mounted\n for (const chatEvent of this.pendingChatMessages) {\n this.emit(\"chat\", chatEvent);\n }\n this.pendingChatMessages = [];\n }\n });\n\n registerCustomElementsToWindow(window);\n this.rendererConfig = {\n animationConfig: config.animationConfig,\n environmentConfiguration: config.environmentConfiguration,\n postProcessingEnabled: config.postProcessingEnabled,\n spawnSun: true,\n enableTweakPane: config.enableTweakPane,\n };\n\n const mmlDocumentsForRenderer = this.config.waitForWorldConfig\n ? {}\n : (this.config.mmlDocuments ?? {});\n\n if (this.config.createRenderer) {\n this.renderer = this.config.createRenderer({\n targetElement: this.canvasHolder,\n coreCameraManager: this.cameraManager,\n collisionsManager: this.collisionsManager,\n config: this.rendererConfig,\n tweakPane: this.tweakPane,\n mmlTargetWindow: window,\n mmlTargetElement: document.body,\n loadingProgressManager: this.loadingProgressManager,\n mmlDocuments: mmlDocumentsForRenderer,\n mmlAuthToken: this.mmlAuthToken,\n onInitialized: () => {\n this.rendererInitialized = true;\n if (this.config.waitForWorldConfig) {\n this.checkReadyForInitialLoad();\n } else {\n this.loadingProgressManager.setInitialLoad(true);\n }\n },\n });\n } else {\n // Default to ThreeJS renderer\n this.renderer = new ThreeJSWorldRenderer({\n targetElement: this.canvasHolder,\n coreCameraManager: this.cameraManager,\n collisionsManager: this.collisionsManager,\n config: this.rendererConfig,\n tweakPane: this.tweakPane,\n mmlTargetWindow: window,\n mmlTargetElement: document.body,\n loadingProgressManager: this.loadingProgressManager,\n mmlDocuments: mmlDocumentsForRenderer,\n mmlAuthToken: this.mmlAuthToken,\n });\n this.rendererInitialized = true;\n if (this.config.waitForWorldConfig) {\n this.checkReadyForInitialLoad();\n } else {\n this.loadingProgressManager.setInitialLoad(true);\n }\n }\n\n if (this.characterManager.localController) {\n this.characterManager.setupTweakPane(this.tweakPane);\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.renderer.fitContainer();\n });\n this.resizeObserver.observe(this.element);\n\n // Populate initial latestConfig from constructor values so plugins\n // receive config even before any server world_config arrives.\n if (this.config.hud !== undefined) {\n this.latestConfig.hud = this.config.hud;\n }\n if (this.config.enableChat !== undefined) {\n this.latestConfig.enableChat = this.config.enableChat;\n }\n }\n\n public updateConfig(config: Partial<UpdatableConfig>) {\n this.config = {\n ...this.config,\n ...config,\n };\n\n // Update renderer config if any renderer-related config changed\n const rendererConfigUpdate: Partial<RendererConfig> = {};\n if (config.environmentConfiguration !== undefined) {\n rendererConfigUpdate.environmentConfiguration = config.environmentConfiguration;\n }\n if (config.postProcessingEnabled !== undefined) {\n rendererConfigUpdate.postProcessingEnabled = config.postProcessingEnabled;\n }\n if (config.enableTweakPane !== undefined) {\n rendererConfigUpdate.enableTweakPane = config.enableTweakPane;\n }\n\n if (Object.keys(rendererConfigUpdate).length > 0) {\n this.rendererConfig = {\n ...this.rendererConfig,\n ...rendererConfigUpdate,\n };\n this.renderer.updateConfig(rendererConfigUpdate);\n }\n\n if (config.allowOrbitalCamera !== undefined) {\n if (config.allowOrbitalCamera === false) {\n this.keyInputManager.removeKeyBinding(Key.C);\n if (this.cameraManager.isFlyCameraOn() === true) {\n this.cameraManager.toggleFlyCamera();\n }\n } else if (config.allowOrbitalCamera === true) {\n this.keyInputManager.createKeyBinding(Key.C, () => {\n if (document.activeElement === document.body) {\n this.cameraManager.toggleFlyCamera();\n this.renderer.fitContainer();\n }\n });\n }\n }\n\n if (config.spawnConfiguration !== undefined) {\n this.spawnConfiguration = normalizeSpawnConfiguration(config.spawnConfiguration);\n if (this.characterManager.localController) {\n this.characterManager.localController.updateSpawnConfig(this.spawnConfiguration);\n }\n }\n\n if (config.mmlDocuments !== undefined) {\n this.renderer.setMMLConfiguration(config.mmlDocuments, this.mmlAuthToken);\n }\n\n this.latestConfig = { ...this.latestConfig, ...config };\n this.emit(\"configChanged\", config);\n\n if (this.initialLoadCompleted) {\n for (const plugin of this.getAllPlugins()) {\n plugin.onConfigChanged?.(config);\n }\n }\n }\n\n static createFullscreenHolder(): HTMLDivElement {\n document.body.style.margin = \"0\";\n document.body.style.overflow = \"hidden\";\n\n const holder = document.createElement(\"div\");\n holder.style.position = \"absolute\";\n holder.style.width = \"100%\";\n holder.style.height = \"100%\";\n holder.style.overflow = \"hidden\";\n document.body.appendChild(holder);\n return holder;\n }\n\n private getAllPlugins(): UIPlugin[] {\n const result: UIPlugin[] = [];\n if (this.virtualJoystickPlugin) result.push(this.virtualJoystickPlugin);\n if (this.respawnButtonPlugin) result.push(this.respawnButtonPlugin);\n result.push(...this.plugins);\n return result;\n }\n\n private checkReadyForInitialLoad(): void {\n if (this.rendererInitialized && this.worldConfigReceived) {\n if (this.worldConfigTimeoutId !== null) {\n clearTimeout(this.worldConfigTimeoutId);\n this.worldConfigTimeoutId = null;\n }\n this.loadingProgressManager.setInitialLoad(true);\n } else if (this.rendererInitialized && !this.worldConfigReceived) {\n // Start a timeout so the client is not stuck indefinitely if the\n // server never sends a world config message.\n if (this.worldConfigTimeoutId === null) {\n this.worldConfigTimeoutId = setTimeout(() => {\n this.worldConfigTimeoutId = null;\n if (this.disposed) return;\n if (!this.worldConfigReceived) {\n console.warn(\n `World config not received within ${Networked3dWebExperienceClient.WORLD_CONFIG_TIMEOUT_MS}ms \u2014 proceeding with default configuration`,\n );\n this.worldConfigReceived = true;\n this.loadingProgressManager.setInitialLoad(true);\n }\n }, Networked3dWebExperienceClient.WORLD_CONFIG_TIMEOUT_MS);\n }\n }\n }\n\n private resolveCharacterData(connectionId: number): UserData {\n const user = this.userProfiles.get(connectionId);\n if (!user) {\n throw new Error(`Failed to resolve user for connectionId ${connectionId}`);\n }\n\n return {\n userId: user.userId,\n username: user.username,\n characterDescription: user.characterDescription,\n colors: user.colors,\n };\n }\n\n private onNetworkUpdate(update: NetworkUpdate): void {\n const { removedConnectionIds, addedConnectionIds, updatedUsers } = update;\n for (const connId of removedConnectionIds) {\n const profile = this.userProfiles.get(connId);\n this.emit(\"userLeft\", {\n connectionId: connId,\n userId: profile?.userId ?? \"\",\n username: profile?.username ?? null,\n });\n this.userProfiles.delete(connId);\n this.remoteUserStates.delete(connId);\n }\n for (const [connId, userData] of addedConnectionIds) {\n this.userProfiles.set(connId, userData.userState);\n this.remoteUserStates.set(connId, userData.components);\n if (connId !== this.connectionId) {\n this.emit(\"userJoined\", {\n connectionId: connId,\n userId: userData.userState.userId ?? \"\",\n username: userData.userState.username ?? null,\n });\n }\n }\n for (const [connId, userDataUpdate] of updatedUsers) {\n const userState = userDataUpdate.userState;\n if (userState) {\n const profile = this.userProfiles.get(connId);\n if (profile) {\n if (userState.userId !== undefined) {\n profile.userId = userState.userId;\n }\n if (userState.username !== undefined) {\n profile.username = userState.username;\n }\n if (userState.characterDescription !== undefined) {\n profile.characterDescription = userState.characterDescription;\n }\n if (userState.colors !== undefined) {\n profile.colors = userState.colors;\n }\n this.characterManager.networkCharacterInfoUpdated(connId);\n }\n }\n this.remoteUserStates.set(connId, userDataUpdate.components);\n }\n }\n\n private sendIdentityUpdateToServer(\n displayName: string,\n characterDescription: CharacterDescription,\n ) {\n if (this.connectionId === null) {\n throw new Error(\"Connection ID not set\");\n }\n\n this.worldConnection.updateUsername(displayName);\n this.worldConnection.updateCharacterDescription(characterDescription);\n }\n\n private handleChatMessage(fromConnectionId: number, userId: string, message: string) {\n const isLocal = fromConnectionId === this.connectionId;\n let username = \"System\";\n\n if (fromConnectionId !== 0) {\n const user = this.userProfiles.get(fromConnectionId);\n // Use a fallback username if the profile hasn't synced yet (race between\n // chat messages arriving via custom messages and user profiles arriving\n // via delta-net state sync).\n username = user?.username ?? `User ${fromConnectionId}`;\n this.renderer.addChatBubble(fromConnectionId, message);\n }\n\n const chatEvent = { username, message, fromConnectionId, userId, isLocal };\n if (!this.initialLoadCompleted) {\n this.pendingChatMessages.push(chatEvent);\n if (\n this.pendingChatMessages.length > Networked3dWebExperienceClient.MAX_PENDING_CHAT_MESSAGES\n ) {\n this.pendingChatMessages.shift();\n }\n return;\n }\n this.emit(\"chat\", chatEvent);\n }\n\n public update(): void {\n const currentTimeMs = performance.now();\n\n this.currentRequestAnimationFrame = requestAnimationFrame(() => {\n this.update();\n });\n\n // Calculate elapsed time since last frame\n const elapsedMs = currentTimeMs - this.lastUpdateTimeMs;\n this.lastUpdateTimeMs = currentTimeMs;\n\n // Clamp elapsed time to prevent spiral of death (e.g., after tab switch)\n const elapsedSeconds = Math.min(elapsedMs / 1000, 0.1);\n\n // Accumulate time for fixed timestep physics\n this.accumulatedTime += elapsedSeconds;\n\n // Track if any physics updates occurred this frame\n let physicsUpdated = false;\n const updatedCharacterDescriptions: number[] = [];\n const removedConnectionIds: number[] = [];\n\n // Run physics at fixed timestep - this ensures deterministic behavior\n // regardless of display refresh rate (60Hz, 120Hz, 144Hz, etc.)\n while (this.accumulatedTime >= this.fixedDeltaTime) {\n this.frameCounter++;\n\n // Update character manager with fixed timestep\n const result = this.characterManager.update(this.fixedDeltaTime, this.frameCounter);\n\n // Merge results from all physics steps\n for (const id of result.updatedCharacterDescriptions) {\n if (!updatedCharacterDescriptions.includes(id)) {\n updatedCharacterDescriptions.push(id);\n }\n }\n for (const id of result.removedConnectionIds) {\n if (!removedConnectionIds.includes(id)) {\n removedConnectionIds.push(id);\n }\n }\n\n this.accumulatedTime -= this.fixedDeltaTime;\n physicsUpdated = true;\n }\n\n // Only render if physics was updated (limits render rate to physics rate)\n if (!physicsUpdated) {\n return;\n }\n\n // Update camera manager (computes camera position/rotation from target, input, etc.)\n // Will be synced to renderer's camera in renderer.render()\n this.cameraManager.update();\n\n // Update TweakPane character data if visible (skip expensive operations when hidden)\n if (this.tweakPane.guiVisible && this.characterManager.localController) {\n this.tweakPane.updateCharacterData(this.characterManager.localController);\n }\n\n // Build render state - getAllCharacterStates() returns a cached Map\n const allCharacterStates = this.characterManager.getAllCharacterStates();\n\n // Read camera state after update\n const cameraState = this.cameraManager.getCameraState();\n const cameraRotation = new EulXYZ().setFromQuaternion(cameraState.rotation);\n this.cachedCameraTransform.position.set(\n cameraState.position.x,\n cameraState.position.y,\n cameraState.position.z,\n );\n this.cachedCameraTransform.rotation.x = cameraRotation.x;\n this.cachedCameraTransform.rotation.y = cameraRotation.y;\n this.cachedCameraTransform.rotation.z = cameraRotation.z;\n this.cachedCameraTransform.fov = cameraState.fov;\n\n const renderState: RenderState = {\n characters: allCharacterStates,\n updatedCharacterDescriptions,\n removedConnectionIds,\n cameraTransform: this.cachedCameraTransform,\n localCharacterId: this.characterManager.getLocalConnectionId(),\n deltaTimeSeconds: this.fixedDeltaTime,\n };\n\n // Render the actual frame using the associated renderer\n this.renderer.render(renderState);\n }\n\n private spawnCharacter({\n spawnPosition,\n spawnRotation,\n cameraPosition,\n }: {\n spawnPosition: Vect3;\n spawnRotation: EulXYZ;\n cameraPosition: Vect3;\n }) {\n if (this.connectionId === null) {\n throw new Error(\"Connection ID not set\");\n }\n\n const ownIdentity = this.userProfiles.get(this.connectionId);\n if (!ownIdentity) {\n throw new Error(\"Own identity not found\");\n }\n\n this.characterManager.spawnLocalCharacter(this.connectionId, spawnPosition, spawnRotation);\n\n this.characterManager.setupTweakPane(this.tweakPane);\n\n if (cameraPosition !== null) {\n const cameraState = this.cameraManager.getMainCameraState();\n cameraState.position.set(cameraPosition.x, cameraPosition.y, cameraPosition.z);\n const target = new Vect3().add(spawnPosition).add(CharacterManager.headTargetOffset);\n this.cameraManager.setTarget(target);\n this.cameraManager.reverseUpdateFromPositions(cameraState.position, cameraState.rotation);\n }\n }\n\n private disposeWithError(message: string) {\n this.dispose();\n this.errorScreen = new ErrorScreen(\"An error occurred\", message);\n this.element.append(this.errorScreen.element);\n }\n\n // ---------------------------------------------------------------------------\n // Public API \u2014 these methods allow wrapper code (e.g. the CLI client or\n // custom scripts) to inspect and interact with the running experience.\n // ---------------------------------------------------------------------------\n\n /**\n * Add a plugin at runtime. If the experience has already loaded, the plugin\n * is mounted immediately and receives the latest config. Otherwise it will\n * be mounted alongside the other plugins when loading completes.\n */\n public addPlugin(plugin: UIPlugin): void {\n this.plugins.push(plugin);\n if (this.initialLoadCompleted && !this.disposed) {\n plugin.mount(this.element, this);\n if (Object.keys(this.latestConfig).length > 0) {\n plugin.onConfigChanged?.(this.latestConfig);\n }\n }\n }\n\n /**\n * Remove a previously added plugin. Calls `dispose()` on the plugin if the\n * experience has already loaded (i.e. it was mounted).\n */\n public removePlugin(plugin: UIPlugin): void {\n const index = this.plugins.indexOf(plugin);\n if (index === -1) return;\n this.plugins.splice(index, 1);\n if (this.initialLoadCompleted) {\n plugin.dispose();\n }\n }\n\n /** Set an additional input provider (e.g. virtual joystick) for character control. */\n public setAdditionalInputProvider(inputProvider: InputProvider): void {\n this.characterManager.setAdditionalInputProvider(inputProvider);\n }\n\n /** Returns the current spawn configuration (position, respawn trigger, etc.). */\n public getSpawnConfiguration(): SpawnConfigurationState {\n return this.spawnConfiguration;\n }\n\n /** Returns the local client's connection ID, or null before authentication. */\n public getConnectionId(): number | null {\n return this.connectionId;\n }\n\n /** Returns position and username of the local character, or null if not yet spawned. */\n public getLocalCharacterState(): {\n connectionId: number;\n userId: string;\n position: { x: number; y: number; z: number };\n username: string;\n } | null {\n if (this.connectionId === null) return null;\n const localController = this.characterManager.localController;\n if (!localController) return null;\n const state = localController.networkState;\n const profile = this.userProfiles.get(this.connectionId);\n return {\n connectionId: this.connectionId,\n userId: profile?.userId ?? \"\",\n position: { x: state.position.x, y: state.position.y, z: state.position.z },\n username: profile?.username ?? \"\",\n };\n }\n\n /**\n * Returns all connected users (including local). Each entry contains\n * the user's connection ID, userId, position, and username.\n */\n public getCharacterStates(): Map<\n number,\n {\n connectionId: number;\n userId: string;\n position: { x: number; y: number; z: number };\n username: string;\n isLocal: boolean;\n }\n > {\n const result = new Map<\n number,\n {\n connectionId: number;\n userId: string;\n position: { x: number; y: number; z: number };\n username: string;\n isLocal: boolean;\n }\n >();\n\n // Local\n if (this.connectionId !== null) {\n const local = this.getLocalCharacterState();\n if (local) {\n result.set(this.connectionId, { ...local, isLocal: true });\n }\n }\n\n // Remote (skip local player \u2014 already added above with authoritative position)\n for (const [connId, update] of this.remoteUserStates) {\n if (connId === this.connectionId) continue;\n const profile = this.userProfiles.get(connId);\n result.set(connId, {\n connectionId: connId,\n userId: profile?.userId ?? \"\",\n position: {\n x: update.position?.x ?? 0,\n y: update.position?.y ?? 0,\n z: update.position?.z ?? 0,\n },\n username: profile?.username ?? \"\",\n isLocal: false,\n });\n }\n\n return result;\n }\n\n /** Update the character's avatar. */\n public selectAvatar(characterDescription: CharacterDescription): void {\n if (this.connectionId === null) return;\n const profile = this.userProfiles.get(this.connectionId);\n const displayName = profile?.username ?? \"\";\n this.sendIdentityUpdateToServer(displayName, characterDescription);\n }\n\n /** Update the character's display name. */\n public setDisplayName(name: string): void {\n if (this.connectionId === null) return;\n const profile = this.userProfiles.get(this.connectionId);\n if (!profile?.characterDescription) return;\n this.sendIdentityUpdateToServer(name, profile.characterDescription);\n }\n\n /** Respawn the local character at the configured spawn point. */\n public respawn(): void {\n this.characterManager.localController?.resetPosition();\n }\n\n /** Send a chat message. */\n public sendChatMessage(message: string): void {\n if (this.connectionId === null) return;\n\n // Show the message immediately in the local UI (same as the UI-initiated path)\n this.renderer.onChatMessage(message);\n\n this.worldConnection.sendChatMessage(message);\n }\n\n /** Access the underlying world connection. */\n public getWorldConnection(): WorldConnection {\n return this.worldConnection;\n }\n\n /** Access the renderer. */\n public getRenderer(): IRenderer {\n return this.renderer;\n }\n\n /** Access the character manager (local/remote character state, spawning). */\n public getCharacterManager(): CharacterManager {\n return this.characterManager;\n }\n\n /** Access the camera manager. */\n public getCameraManager(): CameraManager {\n return this.cameraManager;\n }\n\n /** Look up a user's profile (username, avatar, colors) by connection ID. */\n public getUserProfile(connectionId: number): UserData | null {\n return this.userProfiles.get(connectionId) ?? null;\n }\n\n /** Get all user profiles. */\n public getUserProfiles(): ReadonlyMap<number, UserData> {\n return this.userProfiles;\n }\n\n public dispose() {\n this.disposed = true;\n this.resizeObserver.disconnect();\n if (this.worldConfigTimeoutId !== null) {\n clearTimeout(this.worldConfigTimeoutId);\n this.worldConfigTimeoutId = null;\n }\n this.characterManager.dispose();\n this.worldConnection.stop();\n for (const plugin of this.getAllPlugins()) {\n plugin.dispose();\n }\n this.tweakPane.dispose();\n this.renderer.dispose();\n if (this.currentRequestAnimationFrame !== null) {\n cancelAnimationFrame(this.currentRequestAnimationFrame);\n this.currentRequestAnimationFrame = null;\n }\n this.cameraManager.dispose();\n this.loadingScreen.dispose();\n this.errorScreen?.dispose();\n this.emit(\"disposed\");\n this.clearAllHandlers();\n }\n}\n", "import type { UpdatableConfig } from \"./Networked3dWebExperienceClient\";\n\nexport type ClientEventMap = {\n chat: {\n username: string;\n message: string;\n fromConnectionId: number;\n userId: string;\n isLocal: boolean;\n };\n userJoined: { connectionId: number; userId: string; username: string | null };\n userLeft: { connectionId: number; userId: string; username: string | null };\n configChanged: Partial<UpdatableConfig>;\n ready: void;\n disposed: void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventHandler = (...args: any[]) => void;\n\nexport class ClientEventEmitter {\n private handlers = new Map<keyof ClientEventMap, Set<EventHandler>>();\n\n on<K extends keyof ClientEventMap>(event: K, handler: (data: ClientEventMap[K]) => void): void {\n let set = this.handlers.get(event);\n if (!set) {\n set = new Set();\n this.handlers.set(event, set);\n }\n set.add(handler as EventHandler);\n }\n\n off<K extends keyof ClientEventMap>(event: K, handler: (data: ClientEventMap[K]) => void): void {\n this.handlers.get(event)?.delete(handler as EventHandler);\n }\n\n protected emit<K extends keyof ClientEventMap>(\n event: K,\n ...args: ClientEventMap[K] extends void ? [] : [ClientEventMap[K]]\n ): void {\n const set = this.handlers.get(event);\n if (!set) return;\n for (const handler of [...set]) {\n handler(...args);\n }\n }\n\n /** Remove all registered event handlers. Called during dispose to prevent leaks. */\n protected clearAllHandlers(): void {\n this.handlers.clear();\n }\n}\n", "import type {\n Networked3dWebExperienceClient,\n UpdatableConfig,\n} from \"./Networked3dWebExperienceClient\";\nimport type { UIPlugin } from \"./plugins\";\n\nexport class DefaultRespawnButtonPlugin implements UIPlugin {\n private client: Networked3dWebExperienceClient | null = null;\n private container: HTMLElement | null = null;\n private button: HTMLDivElement | null = null;\n\n mount(container: HTMLElement, client: Networked3dWebExperienceClient): void {\n this.client = client;\n this.container = container;\n }\n\n onConfigChanged(config: Partial<UpdatableConfig>): void {\n if (config.hud === undefined) return;\n const enabled = config.hud !== false && config.hud.respawnButton === true;\n if (enabled && !this.button) {\n this.show();\n } else if (!enabled && this.button) {\n this.hide();\n }\n }\n\n dispose(): void {\n this.hide();\n this.client = null;\n this.container = null;\n }\n\n private show(): void {\n if (this.button) return;\n this.button = document.createElement(\"div\");\n this.button.textContent = \"RESPAWN\";\n Object.assign(this.button.style, {\n position: \"absolute\",\n top: \"12px\",\n left: \"12px\",\n zIndex: \"102\",\n padding: \"12px\",\n borderRadius: \"8px\",\n border: \"1px solid rgba(255, 255, 255, 0.2)\",\n color: \"rgba(255, 255, 255, 0.9)\",\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.4))\",\n backdropFilter: \"blur(10px)\",\n WebkitBackdropFilter: \"blur(10px)\",\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif\",\n fontSize: \"14px\",\n fontWeight: \"500\",\n letterSpacing: \"0.5px\",\n boxShadow: \"0 4px 24px rgba(0, 0, 0, 0.4)\",\n cursor: \"pointer\",\n transition: \"all 0.2s ease-in-out\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n userSelect: \"none\",\n });\n\n this.button.addEventListener(\"mouseenter\", () => {\n if (!this.button) return;\n this.button.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6))\";\n this.button.style.borderColor = \"rgba(255, 255, 255, 0.3)\";\n this.button.style.transform = \"translateY(-1px)\";\n this.button.style.boxShadow = \"0 6px 28px rgba(0, 0, 0, 0.5)\";\n });\n this.button.addEventListener(\"mouseleave\", () => {\n if (!this.button) return;\n this.button.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.4))\";\n this.button.style.borderColor = \"rgba(255, 255, 255, 0.2)\";\n this.button.style.transform = \"\";\n this.button.style.boxShadow = \"0 4px 24px rgba(0, 0, 0, 0.4)\";\n });\n this.button.addEventListener(\"pointerdown\", () => {\n if (!this.button) return;\n this.button.style.transform = \"translateY(0)\";\n this.button.style.boxShadow = \"0 2px 12px rgba(0, 0, 0, 0.3)\";\n });\n this.button.addEventListener(\"pointerup\", () => {\n if (!this.button) return;\n this.button.style.transform = \"translateY(-1px)\";\n this.button.style.boxShadow = \"0 6px 28px rgba(0, 0, 0, 0.5)\";\n });\n\n this.button.addEventListener(\"click\", () => {\n this.client?.respawn();\n });\n\n (this.container ?? document.body).appendChild(this.button);\n }\n\n private hide(): void {\n this.button?.remove();\n this.button = null;\n }\n}\n", "import { VirtualJoystick } from \"@mml-io/3d-web-client-core\";\n\nimport type { Networked3dWebExperienceClient } from \"./Networked3dWebExperienceClient\";\nimport type { UIPlugin } from \"./plugins\";\n\nexport type VirtualJoystickPluginOptions = {\n radius?: number;\n innerRadius?: number;\n mouseSupport?: boolean;\n};\n\nexport class DefaultVirtualJoystickPlugin implements UIPlugin {\n private wrapper: HTMLDivElement | null = null;\n private joystick: VirtualJoystick | null = null;\n\n constructor(private options: VirtualJoystickPluginOptions = {}) {}\n\n mount(container: HTMLElement, client: Networked3dWebExperienceClient): void {\n this.wrapper = document.createElement(\"div\");\n container.appendChild(this.wrapper);\n\n this.joystick = new VirtualJoystick(this.wrapper, {\n radius: this.options.radius ?? 70,\n innerRadius: this.options.innerRadius ?? 20,\n mouseSupport: this.options.mouseSupport ?? false,\n });\n\n client.setAdditionalInputProvider(this.joystick);\n }\n\n dispose(): void {\n this.wrapper?.remove();\n this.wrapper = null;\n this.joystick = null;\n }\n}\n", "import {\n experienceProtocolToDeltaNetSubProtocol,\n FROM_CLIENT_CHAT_MESSAGE_TYPE,\n FROM_SERVER_CHAT_MESSAGE_TYPE,\n FROM_SERVER_BROADCAST_MESSAGE_TYPE,\n FROM_SERVER_SESSION_CONFIG_MESSAGE_TYPE,\n FROM_SERVER_WORLD_CONFIG_MESSAGE_TYPE,\n parseServerBroadcastMessage,\n parseServerChatMessage,\n parseSessionConfigPayload,\n parseWorldConfigPayload,\n type SessionConfigPayload,\n type WorldConfigPayload,\n} from \"@mml-io/3d-web-experience-protocol\";\nimport {\n UserNetworkingClient,\n type UserNetworkingClientUpdate,\n type CharacterDescription,\n type UserData,\n type NetworkUpdate,\n WebsocketStatus,\n DeltaNetServerErrors,\n} from \"@mml-io/3d-web-user-networking\";\n\nexport type { SessionConfigPayload, WorldConfigPayload } from \"@mml-io/3d-web-experience-protocol\";\n\nexport type OtherUser = {\n userId: string;\n username: string | null;\n characterDescription: CharacterDescription | null;\n colors: Array<[number, number, number]> | null;\n position: { x: number; y: number; z: number };\n};\n\nexport type ChatMessage = {\n fromConnectionId: number;\n userId: string;\n username: string;\n message: string;\n timestamp: number;\n};\n\nexport type WorldEvent =\n | { type: \"connected\" }\n | { type: \"disconnected\" }\n | { type: \"reconnecting\" }\n | { type: \"identity_assigned\"; connectionId: number }\n | { type: \"server_error\"; errorType: string; message: string }\n | { type: \"chat\"; message: ChatMessage }\n | {\n type: \"user_joined\";\n connectionId: number;\n userId: string;\n username: string | null;\n position: { x: number; y: number; z: number };\n }\n | { type: \"user_left\"; connectionId: number; userId: string; username: string | null }\n | { type: \"session_config\"; config: SessionConfigPayload }\n | { type: \"world_config\"; config: WorldConfigPayload }\n | { type: \"server_broadcast\"; broadcastType: string; payload: Record<string, unknown> }\n | { type: \"network_update\"; update: NetworkUpdate };\n\nexport type WorldConnectionConfig = {\n url: string;\n sessionToken: string;\n websocketFactory: (url: string) => WebSocket;\n initialUserState?: UserData;\n initialPosition?: { x: number; y: number; z: number };\n initialRotation?: { eulerY: number };\n};\n\nconst MAX_CHAT_HISTORY = 100;\n\nexport class WorldConnection {\n private client: UserNetworkingClient;\n private otherUsers = new Map<number, OtherUser>();\n private chatHistory: ChatMessage[] = [];\n private eventListeners: Array<(event: WorldEvent) => void> = [];\n private myConnectionId: number | null = null;\n private connected = false;\n private username: string | null;\n\n private connectPromise: Promise<void>;\n private resolveConnect!: () => void;\n private rejectConnect!: (err: Error) => void;\n private connectSettled = false;\n\n private worldConfigResolve: ((config: WorldConfigPayload) => void) | null = null;\n private worldConfigPromise: Promise<WorldConfigPayload> | null = null;\n private latestWorldConfig: WorldConfigPayload | null = null;\n\n constructor(config: WorldConnectionConfig) {\n this.connectPromise = new Promise((resolve, reject) => {\n this.resolveConnect = resolve;\n this.rejectConnect = reject;\n });\n // Prevent unhandled rejection if stop() is called before waitForConnection()\n this.connectPromise.catch(() => {});\n\n const initialUserState: UserData = config.initialUserState ?? {\n userId: \"\",\n username: null,\n characterDescription: null,\n colors: null,\n };\n this.username = initialUserState.username;\n\n const initialPosition = config.initialPosition ?? { x: 0, y: 0, z: 0 };\n const initialRotation = config.initialRotation ?? { eulerY: 0 };\n\n this.client = new UserNetworkingClient(\n {\n url: config.url,\n sessionToken: config.sessionToken,\n websocketFactory: config.websocketFactory,\n statusUpdateCallback: (status: WebsocketStatus) => {\n if (status === WebsocketStatus.Connected) {\n this.connected = true;\n console.log(\"[world] Connected to server\");\n if (!this.connectSettled) {\n this.connectSettled = true;\n this.resolveConnect();\n }\n this.emitEvent({ type: \"connected\" });\n } else if (\n status === WebsocketStatus.Disconnected ||\n status === WebsocketStatus.Reconnecting\n ) {\n this.connected = false;\n this.otherUsers.clear();\n this.myConnectionId = null;\n // Reset world config state so that a fresh config is required\n // after reconnection. Without this, waitForWorldConfig() would\n // immediately return the stale config from the previous session.\n this.latestWorldConfig = null;\n this.worldConfigPromise = null;\n this.worldConfigResolve = null;\n console.log(\n `[world] ${status === WebsocketStatus.Disconnected ? \"Disconnected from\" : \"Reconnecting to\"} server`,\n );\n if (status === WebsocketStatus.Disconnected && !this.connectSettled) {\n this.connectSettled = true;\n this.client.stop();\n this.rejectConnect(\n new Error(\"WebSocket disconnected before connection was established\"),\n );\n }\n if (status === WebsocketStatus.Reconnecting) {\n this.emitEvent({ type: \"reconnecting\" });\n }\n this.emitEvent({ type: \"disconnected\" });\n }\n },\n assignedIdentity: (connectionId: number) => {\n this.myConnectionId = connectionId;\n console.log(`[world] Assigned connection ID: ${connectionId}`);\n this.emitEvent({ type: \"identity_assigned\", connectionId });\n },\n onServerError: (error: { message: string; errorType: string }) => {\n console.error(`[world] Server error (${error.errorType}): ${error.message}`);\n this.emitEvent({\n type: \"server_error\",\n errorType: error.errorType,\n message: error.message,\n });\n if (!this.connectSettled) {\n this.connectSettled = true;\n switch (error.errorType) {\n case DeltaNetServerErrors.USER_AUTHENTICATION_FAILED_ERROR_TYPE:\n this.rejectConnect(new Error(`Authentication failed: ${error.message}`));\n break;\n case DeltaNetServerErrors.USER_NETWORKING_CONNECTION_LIMIT_REACHED_ERROR_TYPE:\n this.rejectConnect(new Error(`Connection limit reached: ${error.message}`));\n break;\n case DeltaNetServerErrors.USER_NETWORKING_SERVER_SHUTDOWN_ERROR_TYPE:\n console.error(\"[world] Server shutting down\");\n this.rejectConnect(new Error(`Server shutting down: ${error.message}`));\n break;\n default:\n this.rejectConnect(new Error(error.message));\n }\n } else {\n if (\n error.errorType === DeltaNetServerErrors.USER_NETWORKING_SERVER_SHUTDOWN_ERROR_TYPE\n ) {\n console.error(\"[world] Server shutting down\");\n }\n }\n },\n onCustomMessage: (customType: number, contents: string) => {\n if (customType === FROM_SERVER_CHAT_MESSAGE_TYPE) {\n const parsed = parseServerChatMessage(contents);\n if (parsed instanceof Error) {\n console.error(\"[world] Invalid chat message:\", parsed.message);\n return;\n }\n let username: string;\n if (parsed.fromConnectionId === this.myConnectionId) {\n username = this.username ?? `User ${parsed.fromConnectionId}`;\n } else {\n const user = this.otherUsers.get(parsed.fromConnectionId);\n username = user?.username ?? `User ${parsed.fromConnectionId}`;\n }\n const chatMsg: ChatMessage = {\n fromConnectionId: parsed.fromConnectionId,\n userId: parsed.userId,\n username,\n message: parsed.message,\n timestamp: Date.now(),\n };\n this.chatHistory.push(chatMsg);\n if (this.chatHistory.length > MAX_CHAT_HISTORY) {\n this.chatHistory.shift();\n }\n console.log(`[chat] ${username}: ${parsed.message}`);\n\n this.emitEvent({ type: \"chat\", message: chatMsg });\n } else if (customType === FROM_SERVER_SESSION_CONFIG_MESSAGE_TYPE) {\n const parsedConfig = parseSessionConfigPayload(contents);\n if (parsedConfig instanceof Error) {\n console.error(\"[world] Invalid session config message:\", parsedConfig.message);\n } else {\n console.log(\"[world] Received session config from server\");\n this.emitEvent({ type: \"session_config\", config: parsedConfig });\n }\n } else if (customType === FROM_SERVER_WORLD_CONFIG_MESSAGE_TYPE) {\n const parsedConfig = parseWorldConfigPayload(contents);\n if (parsedConfig instanceof Error) {\n console.error(\"[world] Invalid world config message:\", parsedConfig.message);\n } else {\n console.log(\"[world] Received world config from server\");\n this.latestWorldConfig = parsedConfig;\n if (this.worldConfigResolve) {\n this.worldConfigResolve(parsedConfig);\n this.worldConfigResolve = null;\n }\n this.emitEvent({ type: \"world_config\", config: parsedConfig });\n }\n } else if (customType === FROM_SERVER_BROADCAST_MESSAGE_TYPE) {\n const broadcastMessage = parseServerBroadcastMessage(contents);\n if (broadcastMessage instanceof Error) {\n console.error(`[world] Invalid server broadcast message: ${contents}`);\n } else {\n console.log(\n `[world] Server broadcast (${broadcastMessage.broadcastType}):`,\n broadcastMessage.payload,\n );\n this.emitEvent({\n type: \"server_broadcast\",\n broadcastType: broadcastMessage.broadcastType,\n payload: broadcastMessage.payload,\n });\n }\n } else {\n console.warn(`[world] Unrecognised custom message type ${customType}`);\n }\n },\n resolveProtocol: experienceProtocolToDeltaNetSubProtocol,\n onUpdate: (update: NetworkUpdate) => {\n for (const id of update.removedConnectionIds) {\n const leaving = this.otherUsers.get(id);\n this.otherUsers.delete(id);\n if (id !== this.myConnectionId) {\n this.emitEvent({\n type: \"user_left\",\n connectionId: id,\n userId: leaving?.userId ?? \"\",\n username: leaving?.username ?? null,\n });\n }\n }\n\n for (const [id, added] of update.addedConnectionIds) {\n if (id === this.myConnectionId) continue;\n const position = {\n x: added.components.position.x,\n y: added.components.position.y,\n z: added.components.position.z,\n };\n const userState = added.userState;\n this.otherUsers.set(id, {\n userId: userState?.userId ?? \"\",\n username: userState?.username ?? null,\n characterDescription: userState?.characterDescription ?? null,\n colors: userState?.colors ?? null,\n position,\n });\n this.emitEvent({\n type: \"user_joined\",\n connectionId: id,\n userId: userState?.userId ?? \"\",\n username: userState?.username ?? null,\n position,\n });\n }\n\n for (const [id, updated] of update.updatedUsers) {\n if (id === this.myConnectionId) continue;\n const existing = this.otherUsers.get(id);\n if (existing) {\n if (updated.userState?.userId !== undefined) {\n existing.userId = updated.userState.userId;\n }\n if (updated.userState?.username !== undefined) {\n existing.username = updated.userState.username;\n }\n if (updated.userState?.characterDescription !== undefined) {\n existing.characterDescription = updated.userState.characterDescription;\n }\n if (updated.userState?.colors !== undefined) {\n existing.colors = updated.userState.colors;\n }\n existing.position = {\n x: updated.components.position.x,\n y: updated.components.position.y,\n z: updated.components.position.z,\n };\n } else {\n this.otherUsers.set(id, {\n userId: updated.userState?.userId ?? \"\",\n username: updated.userState?.username ?? null,\n characterDescription: updated.userState?.characterDescription ?? null,\n colors: updated.userState?.colors ?? null,\n position: {\n x: updated.components.position.x,\n y: updated.components.position.y,\n z: updated.components.position.z,\n },\n });\n }\n }\n\n this.emitEvent({ type: \"network_update\", update });\n },\n },\n initialUserState,\n {\n position: initialPosition,\n rotation: initialRotation,\n state: 0,\n },\n );\n }\n\n stop(): void {\n this.client.stop();\n this.eventListeners = [];\n\n // Settle any pending promises so callers are not left hanging.\n if (!this.connectSettled) {\n this.connectSettled = true;\n this.rejectConnect(new Error(\"WorldConnection stopped\"));\n }\n this.worldConfigResolve = null;\n this.worldConfigPromise = null;\n }\n\n /**\n * Returns a promise that settles once for the **initial** connection attempt.\n * It resolves when the first `Connected` status is received, or rejects if\n * the connection fails before being established.\n *\n * This promise does **not** re-settle on reconnection. To react to\n * subsequent connection/disconnection events, use {@link addEventListener}\n * and listen for `\"connected\"` / `\"disconnected\"` / `\"reconnecting\"` events.\n */\n waitForConnection(): Promise<void> {\n return this.connectPromise;\n }\n\n /**\n * Wait for the server to send a world config message.\n *\n * The server pushes this over WebSocket after authentication. If the config\n * has already been received, the returned promise resolves immediately with\n * the cached value (so callers never miss a config that arrived before they\n * called this method).\n *\n * Multiple concurrent callers share a single internal promise that resolves\n * when the config arrives. Each caller gets an independent timeout --- if the\n * timeout fires, that caller receives `null` but other callers with longer\n * timeouts (or the shared promise itself) are unaffected.\n *\n * @returns The world config, or `null` if the timeout expires first.\n */\n waitForWorldConfig(timeoutMs: number = 10000): Promise<WorldConfigPayload | null> {\n if (this.latestWorldConfig) {\n return Promise.resolve(this.latestWorldConfig);\n }\n\n if (!this.worldConfigPromise) {\n this.worldConfigPromise = new Promise<WorldConfigPayload>((resolve) => {\n this.worldConfigResolve = resolve;\n });\n }\n\n return new Promise<WorldConfigPayload | null>((resolve) => {\n const timer = setTimeout(() => {\n resolve(null);\n }, timeoutMs);\n\n this.worldConfigPromise!.then((config) => {\n clearTimeout(timer);\n resolve(config);\n });\n });\n }\n\n getWorldConfig(): WorldConfigPayload | null {\n return this.latestWorldConfig;\n }\n\n sendUpdate(update: UserNetworkingClientUpdate): void {\n if (this.connected) {\n this.client.sendUpdate(update);\n }\n }\n\n getOtherUsers(): Array<{ connectionId: number } & OtherUser> {\n const result: Array<{ connectionId: number } & OtherUser> = [];\n for (const [connectionId, user] of this.otherUsers) {\n result.push({ connectionId, ...user });\n }\n return result;\n }\n\n getConnectionId(): number | null {\n return this.myConnectionId;\n }\n\n getUsername(): string | null {\n return this.username;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n sendChatMessage(message: string): void {\n if (!this.connected) return;\n this.client.sendCustomMessage(FROM_CLIENT_CHAT_MESSAGE_TYPE, JSON.stringify({ message }));\n }\n\n sendCustomMessage(customType: number, contents: string): void {\n if (!this.connected) return;\n this.client.sendCustomMessage(customType, contents);\n }\n\n updateUsername(username: string): void {\n this.username = username;\n this.client.updateUsername(username);\n }\n\n updateCharacterDescription(characterDescription: CharacterDescription): void {\n this.client.updateCharacterDescription(characterDescription);\n }\n\n updateColors(colors: Array<[number, number, number]>): void {\n this.client.updateColors(colors);\n }\n\n getChatHistory(since?: number): ChatMessage[] {\n if (since !== undefined) {\n return this.chatHistory.filter((m) => m.timestamp >= since);\n }\n return [...this.chatHistory];\n }\n\n addEventListener(listener: (event: WorldEvent) => void): void {\n this.eventListeners.push(listener);\n }\n\n removeEventListener(listener: (event: WorldEvent) => void): void {\n const idx = this.eventListeners.indexOf(listener);\n if (idx !== -1) this.eventListeners.splice(idx, 1);\n }\n\n private emitEvent(event: WorldEvent): void {\n for (const listener of [...this.eventListeners]) {\n listener(event);\n }\n }\n}\n", "import type {\n Networked3dWebExperienceClient,\n UpdatableConfig,\n} from \"./Networked3dWebExperienceClient\";\nimport type { UIPlugin } from \"./plugins\";\n\ntype ChatMessage = {\n id: number;\n username: string;\n message: string;\n distance: number | null;\n fromConnectionId: number;\n isLocal: boolean;\n timestamp: number;\n};\n\nconst MAX_MESSAGES = 200;\nconst NEAR_DISTANCE = 10;\nconst FAR_DISTANCE = 100;\nconst FILTER_THRESHOLDS = [0, 15, 30, 60]; // 0 = off\n\nconst PASSIVE_MAX = 5;\nconst PASSIVE_LINGER_MS = 8000;\nconst PASSIVE_FADE_MS = 600;\n\nconst ACCENT = \"#ffffff\";\nconst PANEL_BG = \"rgba(10, 14, 23, 0.85)\";\nconst BORDER = \"1px solid rgba(255,255,255,0.08)\";\nconst BORDER_RADIUS = \"8px\";\n\nfunction getDistanceColor(distance: number): string {\n if (distance <= 15) return \"#ffffff\";\n if (distance <= 50) return \"#7a8ba6\";\n return \"#4a5568\";\n}\n\nfunction getProximityOpacity(distance: number): number {\n if (distance <= NEAR_DISTANCE) return 1.0;\n if (distance >= FAR_DISTANCE) return 0.35;\n return 1.0 - ((distance - NEAR_DISTANCE) / (FAR_DISTANCE - NEAR_DISTANCE)) * 0.65;\n}\n\nfunction getProximityFontSize(distance: number): number {\n if (distance <= NEAR_DISTANCE) return 14;\n if (distance >= FAR_DISTANCE) return 11;\n return 14 - ((distance - NEAR_DISTANCE) / (FAR_DISTANCE - NEAR_DISTANCE)) * 3;\n}\n\nexport class DefaultChatPlugin implements UIPlugin {\n private container: HTMLDivElement | null = null;\n private scrollStyle: HTMLStyleElement | null = null;\n private client: Networked3dWebExperienceClient | null = null;\n private enabled = true;\n\n private messages: ChatMessage[] = [];\n private nextId = 0;\n private panelOpen = false;\n private unreadCount = 0;\n private filterIndex = 0;\n private proximityMode = false;\n private userScrolledUp = false;\n\n // DOM references\n private toggleBtn!: HTMLDivElement;\n private unreadBadge!: HTMLSpanElement;\n private passiveArea!: HTMLDivElement;\n private panel!: HTMLDivElement;\n private messageArea!: HTMLDivElement;\n private input!: HTMLInputElement;\n private filterPill!: HTMLSpanElement;\n private proxPill!: HTMLSpanElement;\n private globalKeydownHandler: ((e: KeyboardEvent) => void) | null = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private chatHandler: ((msg: any) => void) | null = null;\n\n mount(_container: HTMLElement, client: Networked3dWebExperienceClient): void {\n this.client = client;\n\n this.container = document.createElement(\"div\");\n Object.assign(this.container.style, {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"none\",\n zIndex: \"10001\",\n fontFamily: \"'Segoe UI', system-ui, -apple-system, sans-serif\",\n fontSize: \"13px\",\n color: \"#e0e0e0\",\n });\n _container.appendChild(this.container);\n\n this.buildToggleButton();\n this.buildPassiveArea();\n this.buildPanel();\n\n this.chatHandler = (msg) => {\n const distance = msg.isLocal ? 0 : this.calculateDistance(msg.fromConnectionId);\n this.addMessageToUI(msg.username, msg.message, distance, msg.fromConnectionId, msg.isLocal);\n };\n client.on(\"chat\", this.chatHandler);\n }\n\n onConfigChanged(config: Partial<UpdatableConfig>): void {\n if (config.enableChat === undefined || !this.container) return;\n this.enabled = config.enableChat;\n this.container.style.display = this.enabled ? \"\" : \"none\";\n if (!this.enabled && this.panelOpen) {\n this.setPanelOpen(false);\n }\n }\n\n dispose(): void {\n if (this.globalKeydownHandler) {\n document.removeEventListener(\"keydown\", this.globalKeydownHandler);\n this.globalKeydownHandler = null;\n }\n if (this.chatHandler && this.client) {\n this.client.off(\"chat\", this.chatHandler);\n this.chatHandler = null;\n }\n this.scrollStyle?.remove();\n this.container?.remove();\n this.container = null;\n this.client = null;\n }\n\n private buildToggleButton(): void {\n this.toggleBtn = document.createElement(\"div\");\n this.toggleBtn.dataset.testid = \"chat-toggle\";\n Object.assign(this.toggleBtn.style, {\n position: \"absolute\",\n bottom: \"12px\",\n left: \"12px\",\n width: \"44px\",\n height: \"44px\",\n borderRadius: \"50%\",\n background: PANEL_BG,\n border: BORDER,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n boxShadow: \"0 4px 24px rgba(0,0,0,0.4)\",\n transition: \"all 0.15s ease\",\n color: ACCENT,\n fontSize: \"20px\",\n userSelect: \"none\",\n });\n this.toggleBtn.textContent = \"\\u{1F4AC}\";\n this.container!.appendChild(this.toggleBtn);\n\n this.unreadBadge = document.createElement(\"span\");\n Object.assign(this.unreadBadge.style, {\n position: \"absolute\",\n top: \"-4px\",\n right: \"-4px\",\n background: ACCENT,\n color: \"#0a0e17\",\n fontSize: \"10px\",\n fontWeight: \"700\",\n borderRadius: \"50%\",\n width: \"18px\",\n height: \"18px\",\n display: \"none\",\n alignItems: \"center\",\n justifyContent: \"center\",\n lineHeight: \"18px\",\n textAlign: \"center\",\n });\n this.toggleBtn.appendChild(this.unreadBadge);\n\n this.toggleBtn.addEventListener(\"click\", () => this.setPanelOpen(true));\n }\n\n private buildPassiveArea(): void {\n this.passiveArea = document.createElement(\"div\");\n this.passiveArea.dataset.testid = \"chat-passive-area\";\n Object.assign(this.passiveArea.style, {\n position: \"absolute\",\n bottom: \"64px\",\n left: \"12px\",\n width: \"360px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n pointerEvents: \"none\",\n });\n this.container!.appendChild(this.passiveArea);\n }\n\n private buildPanel(): void {\n this.panel = document.createElement(\"div\");\n this.panel.dataset.testid = \"chat-panel\";\n Object.assign(this.panel.style, {\n position: \"absolute\",\n bottom: \"12px\",\n left: \"12px\",\n width: \"360px\",\n maxHeight: \"440px\",\n display: \"none\",\n flexDirection: \"column\",\n background: PANEL_BG,\n border: BORDER,\n borderRadius: BORDER_RADIUS,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n boxShadow: \"0 4px 24px rgba(0,0,0,0.4)\",\n pointerEvents: \"auto\",\n overflow: \"hidden\",\n });\n this.container!.appendChild(this.panel);\n\n // Header\n const header = document.createElement(\"div\");\n Object.assign(header.style, {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"10px 12px\",\n borderBottom: BORDER,\n flexShrink: \"0\",\n });\n this.panel.appendChild(header);\n\n const headerLeft = document.createElement(\"div\");\n Object.assign(headerLeft.style, { display: \"flex\", alignItems: \"center\", gap: \"10px\" });\n header.appendChild(headerLeft);\n\n const chatLabel = document.createElement(\"span\");\n chatLabel.textContent = \"CHAT\";\n Object.assign(chatLabel.style, {\n fontWeight: \"600\",\n fontSize: \"12px\",\n letterSpacing: \"0.5px\",\n textTransform: \"uppercase\",\n color: ACCENT,\n });\n headerLeft.appendChild(chatLabel);\n\n const headerRight = document.createElement(\"div\");\n Object.assign(headerRight.style, { display: \"flex\", alignItems: \"center\", gap: \"6px\" });\n header.appendChild(headerRight);\n\n const pillBase: Record<string, string> = {\n fontSize: \"10px\",\n padding: \"2px 8px\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n userSelect: \"none\",\n transition: \"all 0.15s ease\",\n fontWeight: \"600\",\n letterSpacing: \"0.3px\",\n };\n\n this.filterPill = document.createElement(\"span\");\n Object.assign(this.filterPill.style, {\n ...pillBase,\n border: \"1px solid rgba(255,255,255,0.08)\",\n background: \"transparent\",\n color: \"rgba(255,255,255,0.4)\",\n });\n this.filterPill.textContent = \"ALL\";\n this.filterPill.title = \"Filter by distance\";\n headerRight.appendChild(this.filterPill);\n\n this.proxPill = document.createElement(\"span\");\n Object.assign(this.proxPill.style, {\n ...pillBase,\n border: \"1px solid rgba(255,255,255,0.08)\",\n background: \"transparent\",\n color: \"rgba(255,255,255,0.4)\",\n });\n this.proxPill.textContent = \"PROX\";\n this.proxPill.title = \"Proximity prominence\";\n headerRight.appendChild(this.proxPill);\n\n const closeBtn = document.createElement(\"span\");\n Object.assign(closeBtn.style, {\n ...pillBase,\n border: \"none\",\n background: \"transparent\",\n color: \"rgba(255,255,255,0.3)\",\n fontSize: \"14px\",\n padding: \"0 4px\",\n cursor: \"pointer\",\n marginLeft: \"4px\",\n });\n closeBtn.textContent = \"\\u2715\";\n closeBtn.title = \"Close chat\";\n headerRight.appendChild(closeBtn);\n\n // Message area\n this.messageArea = document.createElement(\"div\");\n Object.assign(this.messageArea.style, {\n flex: \"1\",\n overflowY: \"auto\",\n padding: \"4px 0\",\n minHeight: \"0\",\n maxHeight: \"340px\",\n });\n this.scrollStyle = document.createElement(\"style\");\n this.scrollStyle.textContent = `\n .default-chat-messages::-webkit-scrollbar { width: 4px; }\n .default-chat-messages::-webkit-scrollbar-track { background: transparent; }\n .default-chat-messages::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.15); border-radius: 2px; }\n `;\n document.head.appendChild(this.scrollStyle);\n this.messageArea.className = \"default-chat-messages\";\n this.panel.appendChild(this.messageArea);\n\n // Input area\n const inputArea = document.createElement(\"div\");\n Object.assign(inputArea.style, {\n display: \"flex\",\n padding: \"8px 12px\",\n gap: \"8px\",\n borderTop: BORDER,\n flexShrink: \"0\",\n });\n this.panel.appendChild(inputArea);\n\n this.input = document.createElement(\"input\");\n this.input.dataset.testid = \"chat-input\";\n this.input.type = \"text\";\n this.input.placeholder = \"Type a message...\";\n this.input.maxLength = 500;\n Object.assign(this.input.style, {\n flex: \"1\",\n background: \"rgba(255,255,255,0.06)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n borderRadius: \"6px\",\n padding: \"6px 10px\",\n color: \"#e0e0e0\",\n fontSize: \"13px\",\n fontFamily: \"'Segoe UI', system-ui, -apple-system, sans-serif\",\n outline: \"none\",\n });\n inputArea.appendChild(this.input);\n\n const sendBtn = document.createElement(\"button\");\n sendBtn.dataset.testid = \"chat-send\";\n sendBtn.textContent = \"\\u27A4\";\n Object.assign(sendBtn.style, {\n background: ACCENT,\n border: \"none\",\n borderRadius: \"6px\",\n width: \"32px\",\n height: \"32px\",\n color: \"#0a0e17\",\n fontSize: \"14px\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: \"0\",\n transition: \"opacity 0.15s ease\",\n });\n inputArea.appendChild(sendBtn);\n\n // Event handlers\n closeBtn.addEventListener(\"click\", () => this.setPanelOpen(false));\n\n this.filterPill.addEventListener(\"click\", () => {\n this.filterIndex = (this.filterIndex + 1) % FILTER_THRESHOLDS.length;\n this.updateFilterPill();\n this.rerenderMessages();\n });\n\n this.proxPill.addEventListener(\"click\", () => {\n this.proximityMode = !this.proximityMode;\n this.updateProxPill();\n this.rerenderMessages();\n });\n\n this.messageArea.addEventListener(\"scroll\", () => {\n const threshold = 30;\n const diff =\n this.messageArea.scrollHeight - this.messageArea.scrollTop - this.messageArea.clientHeight;\n this.userScrolledUp = diff >= threshold;\n });\n\n this.input.addEventListener(\"keydown\", (e) => {\n e.stopPropagation();\n if (e.key === \"Enter\" && this.input.value.trim()) {\n this.sendMessage(this.input.value.trim());\n this.input.value = \"\";\n }\n if (e.key === \"Escape\") {\n this.input.blur();\n this.setPanelOpen(false);\n }\n });\n this.input.addEventListener(\"keyup\", (e) => e.stopPropagation());\n this.input.addEventListener(\"keypress\", (e) => e.stopPropagation());\n\n sendBtn.addEventListener(\"click\", () => {\n if (this.input.value.trim()) {\n this.sendMessage(this.input.value.trim());\n this.input.value = \"\";\n }\n this.input.focus();\n });\n\n this.globalKeydownHandler = (e: KeyboardEvent) => {\n if (!this.enabled) return;\n // Only capture Enter when no other input/textarea is focused, to avoid\n // interfering with other plugins (e.g. avatar name input).\n const active = document.activeElement;\n const isInputFocused =\n active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement;\n if (e.key === \"Enter\" && !isInputFocused) {\n e.preventDefault();\n if (!this.panelOpen) this.setPanelOpen(true);\n setTimeout(() => this.input.focus(), 0);\n }\n };\n document.addEventListener(\"keydown\", this.globalKeydownHandler);\n }\n\n private sendMessage(text: string): void {\n this.client?.sendChatMessage(text);\n }\n\n private calculateDistance(fromConnectionId: number): number | null {\n if (!this.client) return null;\n const states = this.client.getCharacterStates();\n let localPos: { x: number; y: number; z: number } | null = null;\n let senderPos: { x: number; y: number; z: number } | null = null;\n for (const s of states.values()) {\n if (s.isLocal) localPos = s.position;\n if (s.connectionId === fromConnectionId) senderPos = s.position;\n }\n if (!localPos || !senderPos) return null;\n const dx = senderPos.x - localPos.x;\n const dz = senderPos.z - localPos.z;\n return Math.sqrt(dx * dx + dz * dz);\n }\n\n private setPanelOpen(open: boolean): void {\n this.panelOpen = open;\n this.panel.style.display = open ? \"flex\" : \"none\";\n this.toggleBtn.style.display = open ? \"none\" : \"flex\";\n this.passiveArea.style.display = open ? \"none\" : \"flex\";\n if (open) {\n this.unreadCount = 0;\n this.updateUnreadBadge();\n this.scrollToBottom(true);\n }\n }\n\n private updateUnreadBadge(): void {\n if (this.unreadCount > 0 && !this.panelOpen) {\n this.unreadBadge.textContent = this.unreadCount > 9 ? \"9+\" : String(this.unreadCount);\n this.unreadBadge.style.display = \"flex\";\n } else {\n this.unreadBadge.style.display = \"none\";\n }\n }\n\n private updateFilterPill(): void {\n const threshold = FILTER_THRESHOLDS[this.filterIndex];\n if (threshold === 0) {\n this.filterPill.textContent = \"ALL\";\n Object.assign(this.filterPill.style, {\n background: \"transparent\",\n color: \"rgba(255,255,255,0.4)\",\n borderColor: \"rgba(255,255,255,0.08)\",\n });\n } else {\n this.filterPill.textContent = `< ${threshold}m`;\n Object.assign(this.filterPill.style, {\n background: \"rgba(255,255,255,0.08)\",\n color: ACCENT,\n borderColor: \"rgba(255,255,255,0.15)\",\n });\n }\n }\n\n private updateProxPill(): void {\n if (this.proximityMode) {\n Object.assign(this.proxPill.style, {\n background: \"rgba(255,255,255,0.08)\",\n color: ACCENT,\n borderColor: \"rgba(255,255,255,0.15)\",\n });\n } else {\n Object.assign(this.proxPill.style, {\n background: \"transparent\",\n color: \"rgba(255,255,255,0.4)\",\n borderColor: \"rgba(255,255,255,0.08)\",\n });\n }\n }\n\n private shouldShowMessage(msg: ChatMessage): boolean {\n const threshold = FILTER_THRESHOLDS[this.filterIndex];\n if (threshold === 0) return true;\n if (msg.fromConnectionId === 0) return true;\n if (msg.isLocal) return true;\n if (msg.distance === null) return false;\n return msg.distance <= threshold;\n }\n\n private scrollToBottom(force = false): void {\n if (force || !this.userScrolledUp) {\n this.messageArea.scrollTop = this.messageArea.scrollHeight;\n }\n }\n\n private createMessageElement(msg: ChatMessage): HTMLElement {\n const row = document.createElement(\"div\");\n Object.assign(row.style, {\n padding: \"3px 12px\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n transition: \"opacity 0.15s ease\",\n });\n\n if (this.proximityMode && msg.distance !== null && msg.fromConnectionId !== 0) {\n row.style.opacity = String(getProximityOpacity(msg.distance));\n row.style.fontSize = `${getProximityFontSize(msg.distance)}px`;\n }\n\n const badge = document.createElement(\"span\");\n Object.assign(badge.style, {\n fontSize: \"9px\",\n padding: \"1px 5px\",\n borderRadius: \"4px\",\n fontWeight: \"600\",\n flexShrink: \"0\",\n minWidth: \"32px\",\n textAlign: \"center\",\n lineHeight: \"16px\",\n marginTop: \"2px\",\n });\n\n if (msg.fromConnectionId === 0) {\n badge.textContent = \"SYS\";\n badge.style.color = \"#f0c040\";\n badge.style.background = \"rgba(240,192,64,0.12)\";\n } else if (msg.isLocal) {\n badge.textContent = \"YOU\";\n badge.style.color = ACCENT;\n badge.style.background = \"rgba(255,255,255,0.08)\";\n } else if (msg.distance !== null) {\n badge.textContent = `${Math.round(msg.distance)}m`;\n const c = getDistanceColor(msg.distance);\n badge.style.color = c;\n badge.style.background = c + \"1f\";\n } else {\n badge.textContent = \"?\";\n badge.style.color = \"rgba(255,255,255,0.3)\";\n badge.style.background = \"rgba(255,255,255,0.05)\";\n }\n row.appendChild(badge);\n\n const content = document.createElement(\"span\");\n Object.assign(content.style, { wordBreak: \"break-word\", lineHeight: \"1.4\" });\n\n const usernameSpan = document.createElement(\"span\");\n usernameSpan.textContent = msg.username;\n Object.assign(usernameSpan.style, {\n fontWeight: \"600\",\n color: msg.isLocal ? ACCENT : \"#ffffff\",\n marginRight: \"6px\",\n });\n content.appendChild(usernameSpan);\n content.appendChild(document.createTextNode(msg.message));\n row.appendChild(content);\n\n return row;\n }\n\n private rerenderMessages(): void {\n this.messageArea.innerHTML = \"\";\n for (const msg of this.messages) {\n const el = this.createMessageElement(msg);\n if (!this.shouldShowMessage(msg)) el.style.display = \"none\";\n this.messageArea.appendChild(el);\n }\n this.scrollToBottom(true);\n }\n\n private addPassiveMessage(msg: ChatMessage): void {\n const el = document.createElement(\"div\");\n Object.assign(el.style, {\n padding: \"3px 10px\",\n background: \"rgba(10, 14, 23, 0.6)\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n lineHeight: \"1.4\",\n opacity: \"0\",\n transition: `opacity ${PASSIVE_FADE_MS}ms ease`,\n whiteSpace: \"normal\",\n wordBreak: \"break-word\",\n });\n\n const usernameSpan = document.createElement(\"span\");\n usernameSpan.textContent = msg.username;\n Object.assign(usernameSpan.style, {\n fontWeight: \"600\",\n color: msg.isLocal ? ACCENT : \"#ffffff\",\n marginRight: \"6px\",\n });\n el.appendChild(usernameSpan);\n el.appendChild(document.createTextNode(msg.message));\n\n this.passiveArea.appendChild(el);\n requestAnimationFrame(() => {\n el.style.opacity = \"0.9\";\n });\n\n while (this.passiveArea.children.length > PASSIVE_MAX) {\n this.passiveArea.removeChild(this.passiveArea.firstChild!);\n }\n\n setTimeout(() => {\n el.style.opacity = \"0\";\n setTimeout(() => {\n if (el.parentNode === this.passiveArea) this.passiveArea.removeChild(el);\n }, PASSIVE_FADE_MS);\n }, PASSIVE_LINGER_MS);\n }\n\n private addMessageToUI(\n username: string,\n message: string,\n distance: number | null,\n fromConnectionId: number,\n isLocal: boolean,\n ): void {\n const msg: ChatMessage = {\n id: this.nextId++,\n username,\n message,\n distance,\n fromConnectionId,\n isLocal,\n timestamp: Date.now(),\n };\n\n this.messages.push(msg);\n if (this.messages.length > MAX_MESSAGES) {\n this.messages.shift();\n if (this.messageArea.firstChild) this.messageArea.removeChild(this.messageArea.firstChild);\n }\n\n const el = this.createMessageElement(msg);\n if (!this.shouldShowMessage(msg)) el.style.display = \"none\";\n this.messageArea.appendChild(el);\n this.scrollToBottom();\n\n if (!this.panelOpen) {\n this.unreadCount++;\n this.updateUnreadBadge();\n this.addPassiveMessage(msg);\n }\n }\n}\n", "import type { AvatarType } from \"./AvatarType\";\nimport type { Networked3dWebExperienceClient } from \"./Networked3dWebExperienceClient\";\nimport type { UIPlugin } from \"./plugins\";\n\nconst ACCENT = \"#ffffff\";\nconst PANEL_BG = \"rgba(10, 14, 23, 0.85)\";\nconst BORDER = \"1px solid rgba(255,255,255,0.08)\";\nconst BORDER_RADIUS = \"8px\";\n\nenum CustomAvatarType {\n meshFileUrl = \"meshFileUrl\",\n mmlUrl = \"mmlUrl\",\n mml = \"mml\",\n}\n\nexport class DefaultAvatarSelectionPlugin implements UIPlugin {\n private container: HTMLDivElement | null = null;\n private scrollStyle: HTMLStyleElement | null = null;\n private client: Networked3dWebExperienceClient | null = null;\n\n private panelOpen = false;\n private selectedIndex = -1;\n private avatars: AvatarType[] = [];\n private allowCustomAvatars = false;\n private allowCustomDisplayName = false;\n private customAvatarType: CustomAvatarType = CustomAvatarType.mmlUrl;\n\n // DOM references\n private toggleBtn!: HTMLDivElement;\n private panel!: HTMLDivElement;\n private grid!: HTMLDivElement;\n private nameInput: HTMLInputElement | null = null;\n private customInput: HTMLInputElement | HTMLTextAreaElement | null = null;\n private customSection: HTMLDivElement | null = null;\n private escapeHandler: ((e: KeyboardEvent) => void) | null = null;\n\n mount(_container: HTMLElement, client: Networked3dWebExperienceClient): void {\n this.client = client;\n\n this.container = document.createElement(\"div\");\n Object.assign(this.container.style, {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"none\",\n zIndex: \"10001\",\n fontFamily: \"'Segoe UI', system-ui, -apple-system, sans-serif\",\n fontSize: \"13px\",\n color: \"#e0e0e0\",\n });\n _container.appendChild(this.container);\n\n this.buildToggleButton();\n this.buildPanel();\n }\n\n onConfigChanged(config: Record<string, unknown>): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cfg = config as any;\n let needsRebuild = false;\n if (cfg.avatarConfiguration) {\n this.avatars = (cfg.avatarConfiguration.availableAvatars ?? []) as AvatarType[];\n this.allowCustomAvatars = cfg.avatarConfiguration.allowCustomAvatars ?? false;\n needsRebuild = true;\n }\n if (cfg.allowCustomDisplayName !== undefined) {\n this.allowCustomDisplayName = cfg.allowCustomDisplayName || false;\n needsRebuild = true;\n }\n if (needsRebuild) {\n this.rebuildPanel();\n }\n }\n\n dispose(): void {\n if (this.escapeHandler) {\n document.removeEventListener(\"keydown\", this.escapeHandler);\n this.escapeHandler = null;\n }\n this.scrollStyle?.remove();\n this.container?.remove();\n this.container = null;\n this.client = null;\n }\n\n private buildToggleButton(): void {\n this.toggleBtn = document.createElement(\"div\");\n Object.assign(this.toggleBtn.style, {\n position: \"absolute\",\n top: \"12px\",\n right: \"12px\",\n width: \"44px\",\n height: \"44px\",\n borderRadius: \"50%\",\n background: PANEL_BG,\n border: BORDER,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n boxShadow: \"0 4px 24px rgba(0,0,0,0.4)\",\n transition: \"all 0.15s ease\",\n color: ACCENT,\n fontSize: \"20px\",\n userSelect: \"none\",\n });\n this.toggleBtn.textContent = \"\\u{1F464}\";\n this.toggleBtn.title = \"Avatar & Display Name\";\n this.container!.appendChild(this.toggleBtn);\n\n this.toggleBtn.addEventListener(\"click\", () => this.setPanelOpen(true));\n }\n\n private rebuildPanel(): void {\n const wasOpen = this.panelOpen;\n this.panel.remove();\n this.scrollStyle?.remove();\n this.buildPanel();\n if (wasOpen) this.setPanelOpen(true);\n }\n\n private buildPanel(): void {\n this.panel = document.createElement(\"div\");\n Object.assign(this.panel.style, {\n position: \"absolute\",\n top: \"12px\",\n right: \"12px\",\n width: \"340px\",\n maxHeight: \"calc(100vh - 24px)\",\n display: \"none\",\n flexDirection: \"column\",\n background: PANEL_BG,\n border: BORDER,\n borderRadius: BORDER_RADIUS,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n boxShadow: \"0 4px 24px rgba(0,0,0,0.4)\",\n pointerEvents: \"auto\",\n overflow: \"hidden\",\n });\n this.container!.appendChild(this.panel);\n\n // Header\n const header = document.createElement(\"div\");\n Object.assign(header.style, {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"10px 12px\",\n borderBottom: BORDER,\n flexShrink: \"0\",\n });\n this.panel.appendChild(header);\n\n const headerLabel = document.createElement(\"span\");\n headerLabel.textContent = \"AVATAR\";\n Object.assign(headerLabel.style, {\n fontWeight: \"600\",\n fontSize: \"12px\",\n letterSpacing: \"0.5px\",\n textTransform: \"uppercase\",\n color: ACCENT,\n });\n header.appendChild(headerLabel);\n\n const closeBtn = document.createElement(\"span\");\n Object.assign(closeBtn.style, {\n fontSize: \"14px\",\n color: \"rgba(255,255,255,0.3)\",\n cursor: \"pointer\",\n padding: \"0 4px\",\n userSelect: \"none\",\n });\n closeBtn.textContent = \"\\u2715\";\n closeBtn.title = \"Close\";\n header.appendChild(closeBtn);\n closeBtn.addEventListener(\"click\", () => this.setPanelOpen(false));\n\n // Display name input (conditional)\n this.nameInput = null;\n if (this.allowCustomDisplayName) {\n const nameSection = document.createElement(\"div\");\n Object.assign(nameSection.style, {\n padding: \"8px 12px\",\n borderBottom: BORDER,\n flexShrink: \"0\",\n });\n this.panel.appendChild(nameSection);\n\n const nameLabel = document.createElement(\"div\");\n nameLabel.textContent = \"Display Name\";\n Object.assign(nameLabel.style, {\n fontSize: \"10px\",\n fontWeight: \"600\",\n letterSpacing: \"0.5px\",\n textTransform: \"uppercase\",\n color: \"rgba(255,255,255,0.4)\",\n marginBottom: \"6px\",\n });\n nameSection.appendChild(nameLabel);\n\n this.nameInput = document.createElement(\"input\");\n this.nameInput.type = \"text\";\n this.nameInput.placeholder = \"Enter display name...\";\n this.nameInput.maxLength = 30;\n Object.assign(this.nameInput.style, {\n width: \"100%\",\n boxSizing: \"border-box\",\n background: \"rgba(255,255,255,0.06)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n borderRadius: \"6px\",\n padding: \"6px 10px\",\n color: \"#e0e0e0\",\n fontSize: \"13px\",\n fontFamily: \"'Segoe UI', system-ui, -apple-system, sans-serif\",\n outline: \"none\",\n });\n nameSection.appendChild(this.nameInput);\n\n this.nameInput.addEventListener(\"keydown\", (e) => e.stopPropagation());\n this.nameInput.addEventListener(\"keyup\", (e) => e.stopPropagation());\n this.nameInput.addEventListener(\"keypress\", (e) => e.stopPropagation());\n }\n\n // Avatar grid\n const gridScroll = document.createElement(\"div\");\n Object.assign(gridScroll.style, {\n flex: \"1\",\n overflowY: \"auto\",\n padding: \"8px\",\n minHeight: \"0\",\n });\n this.scrollStyle = document.createElement(\"style\");\n this.scrollStyle.textContent = `\n .default-avatar-grid::-webkit-scrollbar { width: 4px; }\n .default-avatar-grid::-webkit-scrollbar-track { background: transparent; }\n .default-avatar-grid::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.15); border-radius: 2px; }\n `;\n document.head.appendChild(this.scrollStyle);\n gridScroll.className = \"default-avatar-grid\";\n this.panel.appendChild(gridScroll);\n\n this.grid = document.createElement(\"div\");\n Object.assign(this.grid.style, {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(70px, 1fr))\",\n gap: \"6px\",\n });\n gridScroll.appendChild(this.grid);\n\n // Custom avatar section (conditional)\n this.customInput = null;\n this.customSection = null;\n if (this.allowCustomAvatars) {\n this.customSection = document.createElement(\"div\");\n Object.assign(this.customSection.style, {\n padding: \"8px 12px\",\n borderTop: BORDER,\n flexShrink: \"0\",\n });\n this.panel.appendChild(this.customSection);\n\n const customLabel = document.createElement(\"div\");\n customLabel.textContent = \"Custom Avatar\";\n Object.assign(customLabel.style, {\n fontSize: \"10px\",\n fontWeight: \"600\",\n letterSpacing: \"0.5px\",\n textTransform: \"uppercase\",\n color: \"rgba(255,255,255,0.4)\",\n marginBottom: \"6px\",\n });\n this.customSection.appendChild(customLabel);\n\n this.buildCustomAvatarTypeSelector(this.customSection);\n this.buildCustomAvatarInput(this.customSection);\n }\n\n // Apply button\n const applyArea = document.createElement(\"div\");\n Object.assign(applyArea.style, {\n padding: \"8px 12px\",\n borderTop: BORDER,\n flexShrink: \"0\",\n });\n this.panel.appendChild(applyArea);\n\n const applyBtn = document.createElement(\"button\");\n applyBtn.textContent = \"Apply\";\n Object.assign(applyBtn.style, {\n width: \"100%\",\n background: ACCENT,\n border: \"none\",\n borderRadius: \"6px\",\n padding: \"8px\",\n color: \"#0a0e17\",\n fontSize: \"13px\",\n fontWeight: \"600\",\n cursor: \"pointer\",\n transition: \"opacity 0.15s ease\",\n fontFamily: \"'Segoe UI', system-ui, -apple-system, sans-serif\",\n });\n applyArea.appendChild(applyBtn);\n applyBtn.addEventListener(\"click\", () => this.applyChanges());\n\n // Escape to close\n this.escapeHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && this.panelOpen) this.setPanelOpen(false);\n };\n document.addEventListener(\"keydown\", this.escapeHandler);\n\n this.renderGrid();\n }\n\n private renderGrid(): void {\n this.grid.innerHTML = \"\";\n\n this.avatars.forEach((avatar, idx) => {\n const cell = document.createElement(\"div\");\n const isSelected = idx === this.selectedIndex;\n Object.assign(cell.style, {\n aspectRatio: \"1\",\n borderRadius: \"6px\",\n border: isSelected ? `2px solid ${ACCENT}` : \"2px solid rgba(255,255,255,0.06)\",\n background: isSelected ? \"rgba(255,255,255,0.08)\" : \"rgba(255,255,255,0.04)\",\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n transition: \"all 0.1s ease\",\n position: \"relative\",\n });\n\n if (avatar.thumbnailUrl) {\n const img = document.createElement(\"img\");\n img.src = avatar.thumbnailUrl;\n Object.assign(img.style, {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n borderRadius: \"4px\",\n });\n img.onerror = () => {\n img.remove();\n this.addTextLabel(cell, avatar, idx);\n };\n cell.appendChild(img);\n } else {\n this.addTextLabel(cell, avatar, idx);\n }\n\n cell.addEventListener(\"click\", () => {\n this.selectedIndex = idx;\n this.renderGrid();\n });\n cell.addEventListener(\"mouseenter\", () => {\n if (idx !== this.selectedIndex) {\n cell.style.borderColor = \"rgba(255,255,255,0.15)\";\n cell.style.background = \"rgba(255,255,255,0.06)\";\n }\n });\n cell.addEventListener(\"mouseleave\", () => {\n if (idx !== this.selectedIndex) {\n cell.style.borderColor = \"rgba(255,255,255,0.06)\";\n cell.style.background = \"rgba(255,255,255,0.04)\";\n }\n });\n\n this.grid.appendChild(cell);\n });\n }\n\n private buildCustomAvatarTypeSelector(parent: HTMLElement): void {\n const radioGroup = document.createElement(\"div\");\n Object.assign(radioGroup.style, {\n display: \"flex\",\n gap: \"12px\",\n marginBottom: \"8px\",\n });\n parent.appendChild(radioGroup);\n\n const types: { type: CustomAvatarType; label: string }[] = [\n { type: CustomAvatarType.mmlUrl, label: \"MML URL\" },\n { type: CustomAvatarType.mml, label: \"MML\" },\n { type: CustomAvatarType.meshFileUrl, label: \"Mesh URL\" },\n ];\n\n for (const { type, label } of types) {\n const item = document.createElement(\"label\");\n Object.assign(item.style, {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n cursor: \"pointer\",\n fontSize: \"12px\",\n color: \"rgba(255,255,255,0.7)\",\n });\n\n const radio = document.createElement(\"input\");\n radio.type = \"radio\";\n radio.name = \"default-avatar-custom-type\";\n radio.checked = this.customAvatarType === type;\n radio.addEventListener(\"change\", () => {\n this.customAvatarType = type;\n this.rebuildCustomInput();\n });\n\n item.appendChild(radio);\n item.appendChild(document.createTextNode(label));\n radioGroup.appendChild(item);\n }\n }\n\n private getCustomPlaceholder(): string {\n switch (this.customAvatarType) {\n case CustomAvatarType.meshFileUrl:\n return \"https://example.com/avatar.glb\";\n case CustomAvatarType.mmlUrl:\n return \"https://example.com/avatar.html\";\n case CustomAvatarType.mml:\n return '<m-character src=\"https://...\">\\n</m-character>';\n }\n }\n\n private buildCustomAvatarInput(parent: HTMLElement): void {\n const inputStyle: Partial<CSSStyleDeclaration> = {\n width: \"100%\",\n boxSizing: \"border-box\",\n background: \"rgba(255,255,255,0.06)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n borderRadius: \"6px\",\n padding: \"6px 10px\",\n color: \"#e0e0e0\",\n fontSize: \"12px\",\n fontFamily: \"'Segoe UI', system-ui, -apple-system, sans-serif\",\n outline: \"none\",\n resize: \"vertical\",\n };\n\n if (this.customAvatarType === CustomAvatarType.mml) {\n const textarea = document.createElement(\"textarea\");\n textarea.rows = 4;\n textarea.placeholder = this.getCustomPlaceholder();\n Object.assign(textarea.style, inputStyle);\n this.customInput = textarea;\n } else {\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.placeholder = this.getCustomPlaceholder();\n Object.assign(input.style, inputStyle);\n this.customInput = input;\n }\n\n this.customInput.addEventListener(\"input\", () => {\n if (this.customInput!.value.trim()) {\n this.selectedIndex = -1;\n this.renderGrid();\n }\n });\n this.customInput.addEventListener(\"keydown\", (e) => e.stopPropagation());\n this.customInput.addEventListener(\"keyup\", (e) => e.stopPropagation());\n this.customInput.addEventListener(\"keypress\", (e) => e.stopPropagation());\n\n parent.appendChild(this.customInput);\n }\n\n private rebuildCustomInput(): void {\n if (!this.customSection) return;\n // Remove old input\n this.customInput?.remove();\n this.buildCustomAvatarInput(this.customSection);\n }\n\n private addTextLabel(cell: HTMLElement, avatar: AvatarType, idx: number): void {\n const label = document.createElement(\"span\");\n label.textContent = avatar.name || `#${idx + 1}`;\n Object.assign(label.style, {\n fontSize: \"10px\",\n color: \"rgba(255,255,255,0.5)\",\n textAlign: \"center\",\n padding: \"4px\",\n wordBreak: \"break-word\",\n });\n cell.appendChild(label);\n }\n\n private setPanelOpen(open: boolean): void {\n this.panelOpen = open;\n this.panel.style.display = open ? \"flex\" : \"none\";\n this.toggleBtn.style.display = open ? \"none\" : \"flex\";\n if (open) this.syncCurrentState();\n }\n\n private syncCurrentState(): void {\n if (!this.client) return;\n const connectionId = this.client.getConnectionId();\n if (connectionId === null) return;\n const profile = this.client.getUserProfile(connectionId);\n if (!profile) return;\n\n if (this.nameInput && profile.username) {\n this.nameInput.value = profile.username;\n }\n\n const desc = profile.characterDescription;\n this.selectedIndex = this.avatars.findIndex(\n (a) =>\n (a.meshFileUrl && a.meshFileUrl === desc?.meshFileUrl) ||\n (a.mmlCharacterUrl && a.mmlCharacterUrl === desc?.mmlCharacterUrl) ||\n (a.mmlCharacterString && a.mmlCharacterString === desc?.mmlCharacterString),\n );\n\n if (this.customInput && this.selectedIndex === -1 && desc) {\n if (desc.mmlCharacterString) {\n this.customAvatarType = CustomAvatarType.mml;\n this.rebuildCustomInput();\n this.customInput.value = desc.mmlCharacterString;\n } else if (desc.mmlCharacterUrl) {\n this.customAvatarType = CustomAvatarType.mmlUrl;\n this.rebuildCustomInput();\n this.customInput.value = desc.mmlCharacterUrl;\n } else if (desc.meshFileUrl) {\n this.customAvatarType = CustomAvatarType.meshFileUrl;\n this.rebuildCustomInput();\n this.customInput.value = desc.meshFileUrl;\n }\n }\n this.renderGrid();\n }\n\n private applyChanges(): void {\n if (!this.client) return;\n\n // Determine avatar\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let characterDescription: Record<string, any> | null = null;\n if (this.selectedIndex >= 0 && this.selectedIndex < this.avatars.length) {\n const avatar = this.avatars[this.selectedIndex];\n if (avatar.meshFileUrl) {\n characterDescription = { meshFileUrl: avatar.meshFileUrl };\n } else if (avatar.mmlCharacterUrl) {\n characterDescription = { mmlCharacterUrl: avatar.mmlCharacterUrl };\n } else if (avatar.mmlCharacterString) {\n characterDescription = { mmlCharacterString: avatar.mmlCharacterString };\n }\n } else if (this.customInput?.value.trim()) {\n const value = this.customInput.value.trim();\n switch (this.customAvatarType) {\n case CustomAvatarType.mml:\n characterDescription = { mmlCharacterString: value };\n break;\n case CustomAvatarType.mmlUrl:\n characterDescription = { mmlCharacterUrl: value };\n break;\n case CustomAvatarType.meshFileUrl:\n characterDescription = { meshFileUrl: value };\n break;\n }\n }\n\n if (characterDescription) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.client.selectAvatar(characterDescription as any);\n }\n\n // Update display name\n if (this.nameInput) {\n const newName = this.nameInput.value.trim();\n if (newName) this.client.setDisplayName(newName);\n }\n\n this.setPanelOpen(false);\n }\n}\n", "import type {\n Networked3dWebExperienceClient,\n UpdatableConfig,\n} from \"./Networked3dWebExperienceClient\";\nimport type { UIPlugin } from \"./plugins\";\n\ntype CharacterState = {\n connectionId: number;\n userId: string;\n position: { x: number; y: number; z: number };\n username: string;\n isLocal: boolean;\n};\n\ntype GetCharacterStates = () => Map<number, CharacterState>;\n\nconst WORLD_HALF = 105;\nconst MINIMAP_SIZE = 180;\nconst VIEW_RADIUS = WORLD_HALF;\nconst GRID_SPACING = 30;\nconst PLAYER_LIST_UPDATE_MS = 500;\nconst MINIMAP_UPDATE_MS = 100;\n\nconst ACCENT = \"#ffffff\";\nconst PANEL_BG = \"rgba(10, 14, 23, 0.85)\";\nconst BORDER = \"1px solid rgba(255,255,255,0.08)\";\nconst BORDER_RADIUS = \"8px\";\n\nexport type DefaultHUDPluginOptions = {\n minimap?: boolean;\n playerList?: boolean;\n};\n\nfunction createHUD(\n mountTarget: HTMLElement,\n client: Networked3dWebExperienceClient,\n options: DefaultHUDPluginOptions = {},\n): { dispose: () => void } {\n const showMinimap = options.minimap !== false;\n const showPlayerList = options.playerList !== false;\n\n const getCharacterStates: GetCharacterStates = () => client.getCharacterStates();\n\n /**\n * Compute the camera's orbit angle around the local character by looking at\n * the vector from the character to the camera position. This gives the\n * direction the camera is looking FROM, which is what the minimap needs to\n * orient correctly.\n */\n const getCameraYaw = (): number => {\n const camPos = client.getCameraManager().getCameraPosition();\n const states = getCharacterStates();\n const local = Array.from(states.values()).find((p) => p.isLocal);\n if (!local) return 0;\n return Math.atan2(camPos.x - local.position.x, camPos.z - local.position.z);\n };\n\n const container = document.createElement(\"div\");\n Object.assign(container.style, {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"none\",\n zIndex: \"10000\",\n fontFamily: \"'Segoe UI', system-ui, -apple-system, sans-serif\",\n fontSize: \"13px\",\n color: \"#e0e0e0\",\n });\n mountTarget.appendChild(container);\n\n const SMALL_SCREEN_PX = 768;\n\n // Bottom-right group: toggle button + player list + minimap\n const group = document.createElement(\"div\");\n Object.assign(group.style, {\n position: \"absolute\",\n bottom: \"12px\",\n right: \"12px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n pointerEvents: \"none\",\n alignItems: \"flex-end\",\n });\n container.appendChild(group);\n\n // --- HUD toggle (visible on small screens, or when manually collapsed) ---\n let hudExpanded = window.innerWidth >= SMALL_SCREEN_PX;\n\n const hudToggle = document.createElement(\"div\");\n Object.assign(hudToggle.style, {\n width: \"36px\",\n height: \"36px\",\n borderRadius: \"50%\",\n background: PANEL_BG,\n border: BORDER,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n boxShadow: \"0 4px 24px rgba(0,0,0,0.4)\",\n fontSize: \"14px\",\n color: ACCENT,\n userSelect: \"none\",\n flexShrink: \"0\",\n });\n hudToggle.title = \"Toggle HUD\";\n hudToggle.textContent = \"\\u{1F5FA}\"; // map emoji\n group.appendChild(hudToggle);\n\n // Content wrapper for the collapsible panels\n const hudContent = document.createElement(\"div\");\n Object.assign(hudContent.style, {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n pointerEvents: \"none\",\n });\n group.appendChild(hudContent);\n\n function setHudExpanded(expanded: boolean) {\n hudExpanded = expanded;\n hudContent.style.display = expanded ? \"flex\" : \"none\";\n hudToggle.style.display = expanded && window.innerWidth >= SMALL_SCREEN_PX ? \"none\" : \"flex\";\n }\n\n hudToggle.addEventListener(\"click\", () => setHudExpanded(!hudExpanded));\n const resizeHandler = () => {\n const isSmall = window.innerWidth < SMALL_SCREEN_PX;\n // Show the toggle button on small screens even when expanded (so user can collapse)\n hudToggle.style.display = !hudExpanded || isSmall ? \"flex\" : \"none\";\n };\n window.addEventListener(\"resize\", resizeHandler);\n setHudExpanded(hudExpanded);\n\n // =========================================================\n // Player List\n // =========================================================\n let highlightedPlayerId: number | null = null;\n let playerListInterval: ReturnType<typeof setInterval> | null = null;\n\n if (showPlayerList) {\n const playerList = document.createElement(\"div\");\n Object.assign(playerList.style, {\n width: `${MINIMAP_SIZE}px`,\n background: PANEL_BG,\n border: BORDER,\n borderRadius: BORDER_RADIUS,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n pointerEvents: \"auto\",\n overflow: \"hidden\",\n boxShadow: \"0 4px 24px rgba(0,0,0,0.4)\",\n });\n hudContent.appendChild(playerList);\n\n const header = document.createElement(\"div\");\n Object.assign(header.style, {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"10px 12px\",\n cursor: \"pointer\",\n userSelect: \"none\",\n borderBottom: BORDER,\n });\n playerList.appendChild(header);\n\n const headerTitle = document.createElement(\"span\");\n headerTitle.textContent = \"Players (0)\";\n Object.assign(headerTitle.style, {\n fontWeight: \"600\",\n fontSize: \"12px\",\n letterSpacing: \"0.5px\",\n textTransform: \"uppercase\",\n color: ACCENT,\n });\n header.appendChild(headerTitle);\n\n const chevron = document.createElement(\"span\");\n chevron.textContent = \"\\u25B2\";\n Object.assign(chevron.style, {\n fontSize: \"10px\",\n color: \"rgba(255,255,255,0.4)\",\n transition: \"transform 0.2s ease\",\n });\n header.appendChild(chevron);\n\n const listBody = document.createElement(\"div\");\n // Reserve space for: bottom margin (16px) + minimap (180px) + gap (6px) +\n // player list header (~38px) + top/bottom border (2px) + some breathing room\n const reservedPx = 16 + MINIMAP_SIZE + 6 + 40 + 2 + 16;\n Object.assign(listBody.style, {\n maxHeight: `calc(100vh - ${reservedPx}px)`,\n overflowY: \"auto\",\n padding: \"4px 0\",\n });\n playerList.appendChild(listBody);\n\n let collapsed = false;\n header.addEventListener(\"click\", () => {\n collapsed = !collapsed;\n listBody.style.display = collapsed ? \"none\" : \"block\";\n chevron.style.transform = collapsed ? \"rotate(180deg)\" : \"rotate(0deg)\";\n if (collapsed) highlightedPlayerId = null;\n });\n\n listBody.addEventListener(\"mouseleave\", () => {\n highlightedPlayerId = null;\n });\n\n function updatePlayerList() {\n const states = getCharacterStates();\n const players = Array.from(states.values()).sort((a, b) => {\n if (a.isLocal !== b.isLocal) return a.isLocal ? -1 : 1;\n return (a.username || \"\").localeCompare(b.username || \"\");\n });\n\n headerTitle.textContent = `Players (${players.length})`;\n\n const names = players\n .map((p) => `${p.connectionId}:${p.username || \"\"}:${p.isLocal}`)\n .join(\",\");\n if (listBody.dataset.hash === names) return;\n listBody.dataset.hash = names;\n\n listBody.innerHTML = \"\";\n for (const player of players) {\n const row = document.createElement(\"div\");\n Object.assign(row.style, {\n padding: \"5px 12px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n cursor: player.isLocal ? \"default\" : \"pointer\",\n transition: \"background 0.1s ease\",\n });\n\n if (!player.isLocal) {\n row.addEventListener(\"mouseenter\", () => {\n highlightedPlayerId = player.connectionId;\n row.style.background = \"rgba(255,255,255,0.06)\";\n });\n row.addEventListener(\"mouseleave\", () => {\n highlightedPlayerId = null;\n row.style.background = \"\";\n });\n row.addEventListener(\"click\", () => {\n // Rotate the camera to face the clicked player\n const currentStates = getCharacterStates();\n const local = Array.from(currentStates.values()).find((p) => p.isLocal);\n const target = currentStates.get(player.connectionId);\n if (local && target) {\n const dx = target.position.x - local.position.x;\n const dz = target.position.z - local.position.z;\n const angleToTarget = Math.atan2(dz, dx);\n client.getCameraManager().setOrbitAngle(angleToTarget + Math.PI);\n }\n });\n }\n\n const dot = document.createElement(\"span\");\n Object.assign(dot.style, {\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n background: player.isLocal ? ACCENT : \"#7a8ba6\",\n flexShrink: \"0\",\n });\n row.appendChild(dot);\n\n const name = document.createElement(\"span\");\n name.textContent = player.username || \"Unknown\";\n Object.assign(name.style, {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n color: player.isLocal ? \"#ffffff\" : \"#b0bec5\",\n fontWeight: player.isLocal ? \"600\" : \"400\",\n fontSize: \"12px\",\n });\n row.appendChild(name);\n\n if (player.isLocal) {\n const youBadge = document.createElement(\"span\");\n youBadge.textContent = \"you\";\n Object.assign(youBadge.style, {\n fontSize: \"9px\",\n color: ACCENT,\n background: \"rgba(255,255,255,0.08)\",\n padding: \"1px 5px\",\n borderRadius: \"4px\",\n marginLeft: \"auto\",\n fontWeight: \"600\",\n letterSpacing: \"0.5px\",\n textTransform: \"uppercase\",\n flexShrink: \"0\",\n });\n row.appendChild(youBadge);\n }\n\n listBody.appendChild(row);\n }\n }\n\n playerListInterval = setInterval(updatePlayerList, PLAYER_LIST_UPDATE_MS);\n updatePlayerList();\n }\n\n // =========================================================\n // Minimap\n // =========================================================\n let minimapRafId: number | null = null;\n\n if (showMinimap) {\n let cameraOriented = true;\n\n const minimapContainer = document.createElement(\"div\");\n Object.assign(minimapContainer.style, {\n position: \"relative\",\n width: `${MINIMAP_SIZE}px`,\n height: `${MINIMAP_SIZE}px`,\n background: PANEL_BG,\n border: BORDER,\n borderRadius: BORDER_RADIUS,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n pointerEvents: \"auto\",\n overflow: \"hidden\",\n boxShadow: \"0 4px 24px rgba(0,0,0,0.4)\",\n });\n hudContent.appendChild(minimapContainer);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = MINIMAP_SIZE * 2;\n canvas.height = MINIMAP_SIZE * 2;\n Object.assign(canvas.style, {\n width: `${MINIMAP_SIZE}px`,\n height: `${MINIMAP_SIZE}px`,\n display: \"block\",\n });\n minimapContainer.appendChild(canvas);\n\n const ctx = canvas.getContext(\"2d\")!;\n const S = canvas.width;\n const C = S / 2;\n let frameScale = S / (VIEW_RADIUS * 2);\n\n // Orientation toggle\n const toggleBtn = document.createElement(\"div\");\n Object.assign(toggleBtn.style, {\n position: \"absolute\",\n top: \"6px\",\n right: \"6px\",\n width: \"22px\",\n height: \"22px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(255,255,255,0.08)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n userSelect: \"none\",\n fontSize: \"11px\",\n fontWeight: \"700\",\n color: ACCENT,\n zIndex: \"2\",\n lineHeight: \"1\",\n });\n toggleBtn.title = \"Toggle north-oriented / camera-oriented\";\n toggleBtn.textContent = \"C\";\n minimapContainer.appendChild(toggleBtn);\n\n toggleBtn.addEventListener(\"click\", () => {\n cameraOriented = !cameraOriented;\n toggleBtn.textContent = cameraOriented ? \"C\" : \"N\";\n });\n\n // Coordinate display\n const coordLabel = document.createElement(\"div\");\n Object.assign(coordLabel.style, {\n position: \"absolute\",\n bottom: \"5px\",\n left: \"7px\",\n fontSize: \"10px\",\n fontFamily: \"'SF Mono', 'Cascadia Code', 'Consolas', monospace\",\n color: \"rgba(255,255,255,0.45)\",\n zIndex: \"2\",\n pointerEvents: \"none\",\n textShadow: \"0 1px 3px rgba(0,0,0,0.8)\",\n });\n coordLabel.textContent = \"0, 0\";\n minimapContainer.appendChild(coordLabel);\n\n function offsetToCanvas(dx: number, dz: number, rotation: number): [number, number] {\n let rx: number, ry: number;\n if (rotation !== 0) {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n rx = dx * cos - dz * sin;\n ry = dx * sin + dz * cos;\n } else {\n rx = dx;\n ry = dz;\n }\n return [C + rx * frameScale, C + ry * frameScale];\n }\n\n function drawGrid(playerX: number, playerZ: number, rotation: number, viewRadius: number) {\n ctx.strokeStyle = \"rgba(255,255,255,0.05)\";\n ctx.lineWidth = 1;\n const visibleRange = viewRadius * 1.42;\n\n const minGX = Math.floor((playerX - visibleRange) / GRID_SPACING) * GRID_SPACING;\n const maxGX = Math.ceil((playerX + visibleRange) / GRID_SPACING) * GRID_SPACING;\n const minGZ = Math.floor((playerZ - visibleRange) / GRID_SPACING) * GRID_SPACING;\n const maxGZ = Math.ceil((playerZ + visibleRange) / GRID_SPACING) * GRID_SPACING;\n\n for (let wx = minGX; wx <= maxGX; wx += GRID_SPACING) {\n const dx = wx - playerX;\n const [x1, y1] = offsetToCanvas(dx, -visibleRange, rotation);\n const [x2, y2] = offsetToCanvas(dx, visibleRange, rotation);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n }\n for (let wz = minGZ; wz <= maxGZ; wz += GRID_SPACING) {\n const dz = wz - playerZ;\n const [x1, y1] = offsetToCanvas(-visibleRange, dz, rotation);\n const [x2, y2] = offsetToCanvas(visibleRange, dz, rotation);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n }\n\n // Origin crosshair\n ctx.strokeStyle = \"rgba(255,255,255,0.1)\";\n const [ox1, oy1] = offsetToCanvas(-playerX, -visibleRange, rotation);\n const [ox2, oy2] = offsetToCanvas(-playerX, visibleRange, rotation);\n ctx.beginPath();\n ctx.moveTo(ox1, oy1);\n ctx.lineTo(ox2, oy2);\n ctx.stroke();\n\n const [zx1, zy1] = offsetToCanvas(-visibleRange, -playerZ, rotation);\n const [zx2, zy2] = offsetToCanvas(visibleRange, -playerZ, rotation);\n ctx.beginPath();\n ctx.moveTo(zx1, zy1);\n ctx.lineTo(zx2, zy2);\n ctx.stroke();\n }\n\n function drawNorthIndicator(rotation: number, viewRadius: number) {\n const [nx, ny] = offsetToCanvas(0, -viewRadius * 0.88, rotation);\n if (nx < 0 || nx > S || ny < 0 || ny > S) return;\n ctx.fillStyle = \"rgba(255,255,255,0.35)\";\n ctx.font = \"bold 18px 'Segoe UI', system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(\"N\", nx, ny);\n }\n\n function updateMinimap() {\n const states = getCharacterStates();\n ctx.clearRect(0, 0, S, S);\n\n ctx.strokeStyle = \"rgba(255,255,255,0.06)\";\n ctx.lineWidth = 2;\n ctx.strokeRect(1, 1, S - 2, S - 2);\n\n const local = Array.from(states.values()).find((p) => p.isLocal) ?? null;\n const playerX = local?.position.x ?? 0;\n const playerZ = local?.position.z ?? 0;\n\n let effectiveViewRadius = VIEW_RADIUS;\n if (highlightedPlayerId !== null) {\n const highlighted = states.get(highlightedPlayerId);\n if (highlighted) {\n const dx = highlighted.position.x - playerX;\n const dz = highlighted.position.z - playerZ;\n const dist = Math.sqrt(dx * dx + dz * dz);\n if (dist > VIEW_RADIUS * 0.85) {\n effectiveViewRadius = dist * 1.25;\n }\n }\n }\n frameScale = S / (effectiveViewRadius * 2);\n\n const cameraYaw = getCameraYaw();\n const rotation = cameraOriented ? cameraYaw : 0;\n\n drawGrid(playerX, playerZ, rotation, effectiveViewRadius);\n drawNorthIndicator(rotation, effectiveViewRadius);\n\n const players = Array.from(states.values());\n const remotes = players.filter((p) => !p.isLocal);\n\n for (const p of remotes) {\n const dx = p.position.x - playerX;\n const dz = p.position.z - playerZ;\n const [mx, my] = offsetToCanvas(dx, dz, rotation);\n if (mx < -10 || mx > S + 10 || my < -10 || my > S + 10) continue;\n\n const isHighlighted = p.connectionId === highlightedPlayerId;\n\n if (isHighlighted) {\n ctx.beginPath();\n ctx.moveTo(C, C);\n ctx.lineTo(mx, my);\n ctx.strokeStyle = \"rgba(255, 255, 255, 0.15)\";\n ctx.lineWidth = 2;\n ctx.setLineDash([6, 4]);\n ctx.stroke();\n ctx.setLineDash([]);\n\n ctx.beginPath();\n ctx.arc(mx, my, 14, 0, Math.PI * 2);\n ctx.fillStyle = \"rgba(255, 255, 255, 0.1)\";\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(mx, my, 9, 0, Math.PI * 2);\n ctx.strokeStyle = ACCENT;\n ctx.lineWidth = 2;\n ctx.stroke();\n\n ctx.beginPath();\n ctx.arc(mx, my, 6, 0, Math.PI * 2);\n ctx.fillStyle = ACCENT;\n ctx.fill();\n } else {\n ctx.beginPath();\n ctx.arc(mx, my, 5, 0, Math.PI * 2);\n ctx.fillStyle = \"#7a8ba6\";\n ctx.fill();\n }\n }\n\n // Local player \u2014 center\n ctx.beginPath();\n ctx.arc(C, C, 12, 0, Math.PI * 2);\n ctx.fillStyle = \"rgba(255, 255, 255, 0.12)\";\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(C, C, 7, 0, Math.PI * 2);\n ctx.fillStyle = ACCENT;\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(C, C, 3, 0, Math.PI * 2);\n ctx.fillStyle = \"#ffffff\";\n ctx.fill();\n\n coordLabel.textContent = `${Math.round(playerX)}, ${Math.round(playerZ)}`;\n }\n\n // Tooltip on hover\n const tooltip = document.createElement(\"div\");\n Object.assign(tooltip.style, {\n position: \"absolute\",\n background: \"rgba(0,0,0,0.85)\",\n color: \"#fff\",\n padding: \"3px 7px\",\n borderRadius: \"4px\",\n fontSize: \"10px\",\n pointerEvents: \"none\",\n display: \"none\",\n whiteSpace: \"nowrap\",\n zIndex: \"3\",\n });\n minimapContainer.appendChild(tooltip);\n\n canvas.addEventListener(\"mousemove\", (e) => {\n const states = getCharacterStates();\n const rect = canvas.getBoundingClientRect();\n const scaleX = canvas.width / rect.width;\n const scaleY = canvas.height / rect.height;\n const cx = (e.clientX - rect.left) * scaleX;\n const cy = (e.clientY - rect.top) * scaleY;\n\n const local = Array.from(states.values()).find((p) => p.isLocal) ?? null;\n const playerX = local?.position.x ?? 0;\n const playerZ = local?.position.z ?? 0;\n const rotation = cameraOriented ? getCameraYaw() : 0;\n\n let found: string | null = null;\n for (const p of states.values()) {\n const dx = p.position.x - playerX;\n const dz = p.position.z - playerZ;\n const [mx, my] = p.isLocal ? [C, C] : offsetToCanvas(dx, dz, rotation);\n const ddx = cx - mx;\n const ddy = cy - my;\n if (ddx * ddx + ddy * ddy < 15 * 15) {\n found = p.username || \"Unknown\";\n break;\n }\n }\n\n if (found) {\n tooltip.textContent = found;\n tooltip.style.display = \"block\";\n tooltip.style.left = `${e.clientX - rect.left + 10}px`;\n tooltip.style.top = `${e.clientY - rect.top - 20}px`;\n } else {\n tooltip.style.display = \"none\";\n }\n });\n\n canvas.addEventListener(\"mouseleave\", () => {\n tooltip.style.display = \"none\";\n });\n\n let lastMinimapUpdate = 0;\n function minimapLoop(now: number) {\n if (now - lastMinimapUpdate >= MINIMAP_UPDATE_MS) {\n updateMinimap();\n lastMinimapUpdate = now;\n }\n minimapRafId = requestAnimationFrame(minimapLoop);\n }\n minimapRafId = requestAnimationFrame(minimapLoop);\n updateMinimap();\n }\n\n return {\n dispose() {\n if (playerListInterval !== null) clearInterval(playerListInterval);\n if (minimapRafId !== null) cancelAnimationFrame(minimapRafId);\n window.removeEventListener(\"resize\", resizeHandler);\n container.remove();\n },\n };\n}\n\nexport class DefaultHUDPlugin implements UIPlugin {\n private hud: { dispose: () => void } | null = null;\n private container: HTMLElement | null = null;\n private client: Networked3dWebExperienceClient | null = null;\n private currentMinimap = true;\n private currentPlayerList = true;\n // Tracks whether the HUD has been explicitly configured or default-created,\n // so that later partial config updates without a `hud` key are no-ops.\n private hudInitialized = false;\n\n mount(container: HTMLElement, client: Networked3dWebExperienceClient): void {\n this.container = container;\n this.client = client;\n }\n\n onConfigChanged(config: Partial<UpdatableConfig>): void {\n if (config.hud === undefined) {\n // No HUD config specified \u2014 only create with defaults on first config pass\n if (!this.hudInitialized && !this.hud && this.container && this.client) {\n this.hudInitialized = true;\n this.hud = createHUD(this.container, this.client, {\n minimap: this.currentMinimap,\n playerList: this.currentPlayerList,\n });\n }\n return;\n }\n\n this.hudInitialized = true;\n\n if (config.hud === false) {\n this.hud?.dispose();\n this.hud = null;\n return;\n }\n\n const newMinimap = config.hud.minimap !== false;\n const newPlayerList = config.hud.playerList !== false;\n\n if (\n newMinimap !== this.currentMinimap ||\n newPlayerList !== this.currentPlayerList ||\n !this.hud\n ) {\n this.hud?.dispose();\n this.currentMinimap = newMinimap;\n this.currentPlayerList = newPlayerList;\n if (this.container && this.client) {\n this.hud = createHUD(this.container, this.client, {\n minimap: this.currentMinimap,\n playerList: this.currentPlayerList,\n });\n }\n }\n }\n\n dispose(): void {\n this.hud?.dispose();\n this.hud = null;\n this.container = null;\n this.client = null;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ACCENT", "PANEL_BG", "BORDER", "BORDER_RADIUS", "PANEL_BG", "BORDER", "ACCENT", "BORDER_RADIUS", "ACCENT", "PANEL_BG", "BORDER", "BORDER_RADIUS"]
7
7
  }