@babylonjs/inspector 9.26.0 → 9.26.2

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 (41) hide show
  1. package/lib/browser-CANgtOiM.js.map +1 -1
  2. package/lib/components/properties/boundProperty.d.ts +27 -0
  3. package/lib/components/properties/metadataProperties.d.ts +5 -1
  4. package/lib/contexts/propertyContext.d.ts +1 -1
  5. package/lib/{extensionsListService-DVpZa3gV.js → extensionsListService-GhHoWP21.js} +4 -4
  6. package/lib/{extensionsListService-DVpZa3gV.js.map → extensionsListService-GhHoWP21.js.map} +1 -1
  7. package/lib/gif-5DieAkSF.js.map +1 -1
  8. package/lib/{index-C5ggNiyY.js → index-DHNtmMzT.js} +282 -91
  9. package/lib/index-DHNtmMzT.js.map +1 -0
  10. package/lib/index.js +4 -4
  11. package/lib/lite/components/properties/cameraProperties.d.ts +11 -0
  12. package/lib/lite/components/properties/lightProperties.d.ts +33 -0
  13. package/lib/lite/components/properties/sceneNodeProperties.d.ts +8 -0
  14. package/lib/lite/{extensionsListService-xgITNk9y.js → extensionsListService-D1JivcAu.js} +2 -4
  15. package/lib/lite/{extensionsListService-xgITNk9y.js.map → extensionsListService-D1JivcAu.js.map} +1 -1
  16. package/lib/lite/{index-DmQN3QdU.js → index-D8vFySa7.js} +1616 -213
  17. package/lib/lite/index-D8vFySa7.js.map +1 -0
  18. package/lib/lite/index.js +2 -4
  19. package/lib/lite/index.js.map +1 -1
  20. package/lib/lite/renderingLayerUtils.d.ts +12 -0
  21. package/lib/lite/sceneEntityUtils.d.ts +19 -0
  22. package/lib/lite/services/panes/properties/cameraPropertiesService.d.ts +3 -0
  23. package/lib/lite/services/panes/properties/lightPropertiesService.d.ts +3 -0
  24. package/lib/lite/services/panes/properties/sceneNodePropertiesService.d.ts +3 -0
  25. package/lib/lite/services/panes/properties/shadowGeneratorPropertiesService.d.ts +4 -0
  26. package/lib/lite/services/panes/properties/spriteLayerPropertiesService.d.ts +4 -0
  27. package/lib/lite/services/panes/scene/cameraExplorerService.d.ts +7 -0
  28. package/lib/lite/services/panes/scene/lightExplorerService.d.ts +6 -0
  29. package/lib/lite/services/panes/scene/meshExplorerService.d.ts +4 -1
  30. package/lib/lite/services/panes/scene/renderingLayerExplorerService.d.ts +24 -0
  31. package/lib/lite/services/panes/scene/sceneSelectionUtils.d.ts +3 -0
  32. package/lib/lite/services/panes/scene/shadowGeneratorExplorerService.d.ts +6 -0
  33. package/lib/lite/services/panes/scene/spriteLayerExplorerService.d.ts +1 -0
  34. package/lib/lite/services/panes/scene/textLayerExplorerService.d.ts +1 -3
  35. package/lib/{quickCreateToolsService-0rVa_CjZ.js → quickCreateToolsService-COtk9VE9.js} +5 -5
  36. package/lib/{quickCreateToolsService-0rVa_CjZ.js.map → quickCreateToolsService-COtk9VE9.js.map} +1 -1
  37. package/lib/{reflectorService-pyDncbYA.js → reflectorService-fcsir8s0.js} +5 -5
  38. package/lib/{reflectorService-pyDncbYA.js.map → reflectorService-fcsir8s0.js.map} +1 -1
  39. package/package.json +1 -1
  40. package/lib/index-C5ggNiyY.js.map +0 -1
  41. package/lib/lite/index-DmQN3QdU.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D8vFySa7.js","sources":["../../../../../../../../../../dev/sharedUiComponents/src/modularTool/misc/observableCollection.ts","../../../../../../../../../../dev/inspector-v2/src/services/panes/explorer/explorerService.ts","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/fluentToolWrapper.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/utils.ts","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/tooltip.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/button.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/components/errorBoundary.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hooks/eventHooks.ts","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hooks/keyboardHooks.ts","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/accordion.contexts.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/accordion.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/contexts/settingsContext.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/hooks/observableHooks.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/hooks/settingsHooks.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/globalSettings.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/components/uxContextProvider.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/components/extensibleAccordion.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/components/pane.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/settingsStore.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/themes/babylonTheme.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/themeService.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/hooks/resourceHooks.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/hooks/themeHooks.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/components/theme.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/components/teachingMoment.tsx","../../../../../../../../../../dev/inspector-v2/src/contexts/propertyContext.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/extensibility/builtInsExtensionFeed.ts","../../../../../../../../../../dev/inspector-v2/src/instrumentation/propertyInstrumentation.ts","../../../../../../../../../../dev/inspector-v2/src/contexts/watcherContext.ts","../../../../../../../../../../dev/inspector-v2/src/instrumentation/functionInstrumentation.ts","../../../../../../../../../../dev/inspector-v2/src/hooks/instrumentationHooks.ts","../../../../../../../../../../dev/inspector-v2/src/hooks/pollingHooks.ts","../../../../../../../../../../dev/inspector-v2/src/services/globalSettings.ts","../../../../../../../../../../dev/inspector-v2/src/hooks/settingsHooks.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/contexts/teachingMomentsContext.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/hooks/teachingMomentHooks.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/modularity/serviceDefinition.ts","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/toast.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/popupWindow.ts","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/childWindow.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/collapse.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/shellService.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/settingsService.tsx","../../../../../../../../../../dev/sharedUiComponents/src/copyCommandToClipboard.ts","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/link.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/toggleButton.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/infoLabel.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/propertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/switch.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/switchPropertyLine.tsx","../../../../../../../../../../dev/inspector-v2/src/services/selectionService.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hooks/transientStateHooks.ts","../../../../../../../../../../dev/inspector-v2/src/components/properties/propertiesPane.tsx","../../../../../../../../../../dev/inspector-v2/src/services/panes/properties/propertiesService.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/reactContextService.ts","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/dropdown.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/dropdownPropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/spinButton.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/slider.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/syncedSlider.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/syncedSliderPropertyLine.tsx","../../../../../../../../../../dev/inspector-v2/src/services/watcherService.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/extensibility/extensionManager.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/misc/graphUtils.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/modularity/serviceContainer.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/dialogService.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/toastService.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/contexts/dialogContext.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/contexts/extensionManagerContext.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/themeSelectorService.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/modularTool.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/cli/bridgeCommandRegistry.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/cli/bridgeConnectionStatus.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/cli/bridgeService.ts","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/modularBridge.ts","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/checkbox.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/comboBox.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/draggable.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/entitySelector.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/lazyComponent.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/buttonLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/list.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/messageBar.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/popover.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/positionedPopover.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/searchBar.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/searchBox.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/textarea.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/textInput.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/uploadButton.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/fileUploadLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/pane.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/booleanBadgePropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/checkboxPropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/comboBoxPropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/hexPropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/inputPropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/linkPropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/spinButtonPropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/stringifiedPropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/textAreaPropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/textPropertyLine.tsx","../../../../../../../../../../dev/sharedUiComponents/src/modularTool/services/shellSettingsService.tsx","../../../../../../../../../../dev/inspector-v2/src/inspectorHost.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/engineContext.ts","../../../../../../../../../../dev/inspector-v2/src/components/explorer/explorerModel.ts","../../../../../../../../../../dev/inspector-v2/src/components/explorer/explorerDragDrop.ts","../../../../../../../../../../dev/inspector-v2/src/components/explorer/explorer.tsx","../../../../../../../../../../dev/inspector-v2/src/services/panes/explorer/explorerPane.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/explorerDisplayInfo.ts","../../../../../../../../../../dev/inspector-v2/src/lite/engineExplorerService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/engineSelectionService.ts","../../../../../../../../../../dev/inspector-v2/src/hooks/compoundPropertyHooks.ts","../../../../../../../../../../dev/inspector-v2/src/components/properties/generateCopyString.ts","../../../../../../../../../../dev/inspector-v2/src/components/properties/boundProperty.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/enginePropertiesService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/sceneEntityUtils.ts","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/vectorPropertyLineCore.tsx","../../../../../../../../../../dev/sharedUiComponents/src/lite/fluent/hoc/propertyLines/vectorPropertyLine.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/components/properties/cameraProperties.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/cameraPropertiesService.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/hoc/propertyLines/colorPropertyLineCore.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/primitives/structuralColorPicker.tsx","../../../../../../../../../../dev/sharedUiComponents/src/lite/fluent/hoc/propertyLines/colorPropertyLine.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/components/properties/lightProperties.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/lightPropertiesService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/materialPropertiesService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/meshPropertiesService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/renderingContextPropertiesService.tsx","../../../../../../../../../../dev/inspector-v2/src/components/properties/metadataProperties.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/components/properties/sceneNodeProperties.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/sceneNodePropertiesService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/sceneExplorerSection.ts","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/shadowGeneratorPropertiesService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/renderingLayerUtils.ts","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/spriteLayerPropertiesService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/textLayerPropertiesService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/properties/texturePropertiesService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/sceneSelectionUtils.ts","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/cameraExplorerService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/lightExplorerService.tsx","../../../../../../../../../../dev/sharedUiComponents/src/fluent/icons.ts","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/sceneResources.ts","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/materialExplorerService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/meshExplorerService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/shadowGeneratorExplorerService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/renderingLayerExplorerService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/spriteLayerExplorerService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/textLayerExplorerService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/services/panes/scene/textureExplorerService.tsx","../../../../../../../../../../dev/inspector-v2/src/lite/inspector.tsx"],"sourcesContent":["import { type IDisposable, type IReadonlyObservable } from \"core/index\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\n/**\r\n * A read-only view of a collection whose changes can be observed.\r\n */\r\nexport interface IReadonlyObservableCollection<T> {\r\n /**\r\n * An observable that notifies observers when the collection changes.\r\n */\r\n readonly observable: IReadonlyObservable<void>;\r\n\r\n /**\r\n * The items in the collection.\r\n */\r\n readonly items: readonly T[];\r\n}\r\n\r\n/**\r\n * A collection of items that can be observed for changes.\r\n */\r\nexport class ObservableCollection<T> implements IReadonlyObservableCollection<T>, IDisposable {\r\n private readonly _items: T[] = [];\r\n private readonly _keys: symbol[] = [];\r\n private readonly _observable = new Observable<void>();\r\n private _isDisposed = false;\r\n\r\n /**\r\n * An observable that notifies observers when the collection changes.\r\n */\r\n public get observable(): IReadonlyObservable<void> {\r\n return this._observable;\r\n }\r\n\r\n /**\r\n * The items in the collection.\r\n */\r\n public get items(): readonly T[] {\r\n return this._items;\r\n }\r\n\r\n /**\r\n * Adds an item to the collection.\r\n * @param item The item to add.\r\n * @returns A disposable that removes the item from the collection when disposed.\r\n */\r\n public add(item: T): IDisposable {\r\n if (this._isDisposed) {\r\n throw new Error(\"Observable collection is disposed.\");\r\n }\r\n\r\n const key = Symbol();\r\n this._items.push(item);\r\n this._keys.push(key);\r\n this._observable.notifyObservers();\r\n\r\n return {\r\n dispose: () => {\r\n const index = this._keys.indexOf(key);\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n this._items.splice(index, 1);\r\n this._keys.splice(index, 1);\r\n this._observable.notifyObservers();\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Removes all items and observers and rejects subsequent additions.\r\n */\r\n public dispose(): void {\r\n if (this._isDisposed) {\r\n return;\r\n }\r\n\r\n this._isDisposed = true;\r\n this._items.length = 0;\r\n this._keys.length = 0;\r\n this._observable.notifyObservers();\r\n this._observable.clear();\r\n }\r\n}\r\n","import { type IDisposable, type IReadonlyObservable } from \"core/index\";\r\n\r\nimport { type ExplorerCommandProvider, type ExplorerNodeDescription } from \"../../../components/explorer/explorerModel\";\r\nimport { type IReadonlyObservableCollection, ObservableCollection } from \"shared-ui-components/modularTool/misc/observableCollection\";\r\nimport { type IService } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\n/**\r\n * The unique identity symbol for the product-neutral Explorer service.\r\n * @experimental\r\n */\r\nexport const ExplorerServiceIdentity = Symbol(\"Explorer\");\r\n\r\n/**\r\n * Contributes Explorer nodes beneath compatible entity-backed parent nodes.\r\n *\r\n * Providers return ordinary {@link ExplorerNodeDescription}s, so each contribution may contain arbitrary\r\n * nested groups and items. Providers attach by parent entity rather than node id because structural groups\r\n * are presentation details owned by product adapters.\r\n * @experimental\r\n */\r\nexport type ExplorerNodeProvider<T extends object> = Readonly<{\r\n /** Controls this provider's position relative to other providers attached to the same parent. */\r\n order?: number;\r\n /** Returns whether this provider supports the parent entity. */\r\n predicate: (parent: unknown) => parent is T;\r\n /** Gets the Explorer nodes contributed beneath the parent entity. */\r\n getNodes: (parent: T) => readonly ExplorerNodeDescription[];\r\n /** Optionally notifies when the nodes returned by this provider may have changed. */\r\n onChanged?: IReadonlyObservable<unknown>;\r\n}>;\r\n\r\n/**\r\n * Allows hierarchy and commands to be contributed to an Explorer without depending on a product-specific API.\r\n *\r\n * The item/group terminology intentionally matches `ExplorerNodeKind`. Product adapters may expose\r\n * domain-specific aliases (such as entity/section), but a generic Explorer group is not necessarily a scene section.\r\n * @experimental\r\n */\r\nexport interface IExplorerService extends IService<typeof ExplorerServiceIdentity> {\r\n /**\r\n * Adds a provider that contributes nodes beneath compatible entity-backed Explorer nodes.\r\n * @param provider The node provider to add.\r\n * @returns A disposable that removes the node provider.\r\n */\r\n addNodeProvider<T extends object>(provider: ExplorerNodeProvider<T>): IDisposable;\r\n\r\n /**\r\n * Adds a command that can be executed on Explorer item nodes.\r\n * @param command The command provider to add.\r\n * @returns A disposable that removes the command provider.\r\n */\r\n addItemCommand<T extends object>(command: ExplorerCommandProvider<T>): IDisposable;\r\n\r\n /**\r\n * Adds a context-menu command that can be executed on Explorer group nodes.\r\n * @param command The command provider to add.\r\n * @returns A disposable that removes the command provider.\r\n */\r\n addGroupCommand<T extends string>(command: ExplorerCommandProvider<T, \"contextMenu\">): IDisposable;\r\n}\r\n\r\n/**\r\n * The shared Explorer service implementation and the command collections consumed by an Explorer pane.\r\n * @internal\r\n */\r\nexport type ExplorerServiceState = IExplorerService &\r\n Readonly<{\r\n nodeProviders: IReadonlyObservableCollection<ExplorerNodeProvider<object>>;\r\n itemCommandProviders: IReadonlyObservableCollection<ExplorerCommandProvider<object>>;\r\n groupCommandProviders: IReadonlyObservableCollection<ExplorerCommandProvider<string, \"contextMenu\">>;\r\n dispose: () => void;\r\n }>;\r\n\r\n/**\r\n * Creates the product-neutral Explorer contribution service.\r\n * @returns The service implementation and its observable contribution collections.\r\n * @internal\r\n */\r\nexport function CreateExplorerService(): ExplorerServiceState {\r\n const nodeProviders = new ObservableCollection<ExplorerNodeProvider<object>>();\r\n const itemCommands = new ObservableCollection<ExplorerCommandProvider<object>>();\r\n const groupCommands = new ObservableCollection<ExplorerCommandProvider<string, \"contextMenu\">>();\r\n\r\n return {\r\n nodeProviders,\r\n itemCommandProviders: itemCommands,\r\n groupCommandProviders: groupCommands,\r\n addNodeProvider: (provider) => nodeProviders.add(provider as unknown as ExplorerNodeProvider<object>),\r\n addItemCommand: (command) => itemCommands.add(command as unknown as ExplorerCommandProvider<object>),\r\n addGroupCommand: (command) => groupCommands.add(command as unknown as ExplorerCommandProvider<string, \"contextMenu\">),\r\n dispose: () => {\r\n nodeProviders.dispose();\r\n itemCommands.dispose();\r\n groupCommands.dispose();\r\n },\r\n };\r\n}\r\n\r\nfunction ExtendNodeDescription(description: ExplorerNodeDescription, providers: readonly ExplorerNodeProvider<object>[]): ExplorerNodeDescription {\r\n const getChildren = description.getChildren;\r\n if (!getChildren && !description.entity) {\r\n return description;\r\n }\r\n\r\n return {\r\n ...description,\r\n getChildren: () => GetExplorerNodeChildren(description.entity, getChildren?.() ?? [], providers),\r\n };\r\n}\r\n\r\n/**\r\n * Combines product-owned children with shared provider contributions and recursively enables contributions\r\n * beneath every entity-backed descendant.\r\n * @param parent The entity represented by the parent node, if any.\r\n * @param children The children owned by the product adapter.\r\n * @param providers The shared node providers registered with the Explorer.\r\n * @returns The combined child node descriptions.\r\n * @internal\r\n */\r\nexport function GetExplorerNodeChildren(\r\n parent: object | undefined,\r\n children: readonly ExplorerNodeDescription[],\r\n providers: readonly ExplorerNodeProvider<object>[]\r\n): readonly ExplorerNodeDescription[] {\r\n const contributedChildren = parent\r\n ? providers\r\n .filter((provider) => provider.predicate(parent))\r\n .sort((left, right) => (left.order ?? 0) - (right.order ?? 0))\r\n .flatMap((provider) => provider.getNodes(parent))\r\n : [];\r\n\r\n return [...children, ...contributedChildren].map((description) => ExtendNodeDescription(description, providers));\r\n}\r\n","import { type PropsWithChildren, type FunctionComponent, createContext } from \"react\";\r\nimport { type Theme, FluentProvider, webDarkTheme } from \"@fluentui/react-components\";\r\n\r\nexport type UiSize = \"small\" | \"medium\";\r\nexport type ToolHostProps = {\r\n /**\r\n * Will ensure all of the controls within the tool are of the same scale\r\n */\r\n size?: UiSize;\r\n\r\n /**\r\n * Allows host to pass in a theme\r\n */\r\n customTheme?: Theme;\r\n\r\n /**\r\n * Can be set to true to disable the copy button in the tool's property lines. Default is false (copy enabled)\r\n */\r\n disableCopy?: boolean;\r\n\r\n /**\r\n * Name of the tool displayed in the UX\r\n */\r\n toolName: string;\r\n\r\n /**\r\n * Override the qsp detection for fluent\r\n */\r\n useFluent?: boolean;\r\n};\r\n\r\nexport const ToolContext = createContext({ useFluent: false as boolean, disableCopy: false as boolean, toolName: \"\" as string, size: undefined as UiSize | undefined } as const);\r\n\r\n/**\r\n * For tools which are ready to move over the fluent, wrap the root of the tool (or the panel which you want fluentized) with this component\r\n * Today we will only enable fluent if the URL has the `newUX` query parameter is truthy\r\n * @param props\r\n * @returns\r\n */\r\nexport const FluentToolWrapper: FunctionComponent<PropsWithChildren<ToolHostProps>> = (props) => {\r\n const url = new URL(window.location.href);\r\n const useFluentFromUrl = url.searchParams.has(\"newUX\") || url.hash.includes(\"newUX\");\r\n const useFluent = props.useFluent ?? useFluentFromUrl;\r\n const contextValue = {\r\n useFluent,\r\n disableCopy: !!props.disableCopy,\r\n toolName: props.toolName,\r\n size: props.size,\r\n };\r\n return useFluent ? (\r\n <FluentProvider theme={props.customTheme || webDarkTheme}>\r\n <ToolContext.Provider value={contextValue}>{props.children}</ToolContext.Provider>\r\n </FluentProvider>\r\n ) : (\r\n <ToolContext.Provider value={contextValue}>{props.children}</ToolContext.Provider>\r\n );\r\n};\r\n","import { makeStyles, tokens, type GriffelStyle } from \"@fluentui/react-components\";\r\n\r\nimport { type KeyboardEvent, type FocusEvent } from \"react\";\r\n\r\nexport const TokenMap = {\r\n px2: tokens.borderRadiusSmall,\r\n px4: tokens.borderRadiusMedium,\r\n px6: tokens.borderRadiusLarge,\r\n px8: tokens.borderRadiusXLarge,\r\n px10: tokens.fontSizeBase100,\r\n px12: tokens.fontSizeBase200,\r\n px14: tokens.fontSizeBase300,\r\n px16: tokens.fontSizeBase400,\r\n px20: tokens.fontSizeBase500,\r\n px24: tokens.fontSizeBase600,\r\n px28: tokens.lineHeightBase500,\r\n px32: tokens.lineHeightBase600,\r\n px36: tokens.lineHeightHero700,\r\n px40: tokens.lineHeightHero800,\r\n};\r\n\r\nexport const CustomTokens = {\r\n valueWidth: \"150px\",\r\n lineHeight: TokenMap.px36,\r\n lineHeightSmall: TokenMap.px28,\r\n dividerGap: TokenMap.px10,\r\n dividerGapSmall: TokenMap.px4,\r\n labelMinWidth: \"50px\",\r\n sliderMinWidth: \"30px\",\r\n sliderMaxWidth: \"80px\",\r\n rightAlignOffset: `-${TokenMap.px8}`,\r\n};\r\n\r\nexport const UniformWidthStyling: GriffelStyle = { width: CustomTokens.valueWidth, boxSizing: \"border-box\" };\r\nexport const useInputStyles = makeStyles({\r\n inputSlot: { textAlign: \"right\" },\r\n invalid: { backgroundColor: tokens.colorPaletteRedBackground2 },\r\n container: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\", // align items vertically\r\n minWidth: 0, // Allow shrinking\r\n },\r\n inputFill: {\r\n width: \"100%\",\r\n minWidth: 0,\r\n },\r\n});\r\n\r\nexport function HandleOnBlur(event: FocusEvent<HTMLInputElement>) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n}\r\n\r\nexport function HandleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\r\n event.stopPropagation(); // Prevent event propagation\r\n\r\n // Prevent Enter key from causing form submission or value reversion\r\n if (event.key === \"Enter\") {\r\n event.preventDefault();\r\n }\r\n}\r\n\r\n/**\r\n * Fluent's CalculatePrecision function\r\n * https://github.com/microsoft/fluentui/blob/dcbf775d37938eacffa37922fc0b43a3cdd5753f/packages/utilities/src/math.ts#L91C1\r\n *\r\n * Calculates a number's precision based on the number of trailing\r\n * zeros if the number does not have a decimal indicated by a negative\r\n * precision. Otherwise, it calculates the number of digits after\r\n * the decimal point indicated by a positive precision.\r\n *\r\n * @param value - the value to determine the precision of\r\n * @returns the calculated precision\r\n */\r\nexport function CalculatePrecision(value: number) {\r\n /**\r\n * Group 1:\r\n * [1-9]([0]+$) matches trailing zeros\r\n * Group 2:\r\n * \\.([0-9]*) matches all digits after a decimal point.\r\n */ const groups = /[1-9]([0]+$)|\\.([0-9]*)/.exec(String(value));\r\n if (!groups) {\r\n return 0;\r\n }\r\n if (groups[1]) {\r\n return -groups[1].length;\r\n }\r\n if (groups[2]) {\r\n return groups[2].length;\r\n }\r\n return 0;\r\n}\r\n\r\nconst HEX_REGEX = RegExp(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$/);\r\nexport function ValidateColorHex(val: string) {\r\n return val != \"\" && HEX_REGEX.test(val);\r\n}\r\n","import { type Nullable } from \"core/index\";\r\n\r\nimport { type ReactElement, forwardRef } from \"react\";\r\n\r\nimport { Tooltip as FluentTooltip, type TooltipProps as FluentTooltipProps } from \"@fluentui/react-components\";\r\n\r\n/**\r\n * Props for the Tooltip primitive.\r\n */\r\nexport type TooltipProps = {\r\n /** The tooltip content. If null/empty, the tooltip is not rendered. */\r\n content?: Nullable<string | ReactElement>;\r\n /** Optional positioning passed through to the underlying FluentTooltip. */\r\n positioning?: FluentTooltipProps[\"positioning\"];\r\n /** The element that the tooltip is attached to. */\r\n children: ReactElement;\r\n};\r\n\r\n// forwardRef wrapper to avoid \"function components cannot be given refs\" warning\r\n// FluentTooltip handles ref forwarding to children internally via applyTriggerPropsToChildren\r\nexport const Tooltip = forwardRef<HTMLElement, TooltipProps>((props, _ref) => {\r\n const { content, positioning, children } = props;\r\n\r\n if (!content) {\r\n return children;\r\n }\r\n\r\n return (\r\n <FluentTooltip relationship=\"description\" content={content} positioning={positioning}>\r\n {children}\r\n </FluentTooltip>\r\n );\r\n});\r\n\r\nTooltip.displayName = \"Tooltip\";\r\n","import { Button as FluentButton, makeStyles, Spinner } from \"@fluentui/react-components\";\r\nimport { type MouseEvent, forwardRef, useCallback, useContext, useState } from \"react\";\r\nimport { type FluentIcon } from \"@fluentui/react-icons\";\r\nimport { type BasePrimitiveProps } from \"./primitive\";\r\nimport { ToolContext } from \"../hoc/fluentToolWrapper\";\r\nimport { TokenMap } from \"./utils\";\r\nimport { Tooltip } from \"./tooltip\";\r\n\r\nconst useButtonStyles = makeStyles({\r\n smallIcon: {\r\n fontSize: TokenMap.px16,\r\n },\r\n mediumIcon: {\r\n fontSize: TokenMap.px20,\r\n },\r\n});\r\n\r\nexport type ButtonProps = BasePrimitiveProps & {\r\n /** Callback invoked when the button is clicked. */\r\n onClick?: (e?: MouseEvent<HTMLButtonElement>) => unknown | Promise<unknown>;\r\n /** Optional icon rendered inside the button. */\r\n icon?: FluentIcon;\r\n /** Fluent button appearance. */\r\n appearance?: \"subtle\" | \"transparent\" | \"primary\" | \"secondary\";\r\n /** Optional visible button label. */\r\n label?: string;\r\n /** Optional accessible label when the visible label is absent or insufficient. */\r\n ariaLabel?: string;\r\n};\r\n\r\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>((props, ref) => {\r\n const { size } = useContext(ToolContext);\r\n const classes = useButtonStyles();\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const { icon: Icon, label, onClick, disabled, className, title, ariaLabel, ...buttonProps } = props;\r\n\r\n const [isOnClickBusy, setIsOnClickBusy] = useState(false);\r\n const handleOnClick = useCallback(\r\n async (e: MouseEvent<HTMLButtonElement>) => {\r\n const result = onClick?.(e);\r\n if (result instanceof Promise) {\r\n setIsOnClickBusy(true);\r\n try {\r\n await result;\r\n } finally {\r\n setIsOnClickBusy(false);\r\n }\r\n }\r\n },\r\n [onClick]\r\n );\r\n\r\n const iconClass = size === \"small\" ? classes.smallIcon : classes.mediumIcon;\r\n\r\n return (\r\n <Tooltip content={title ?? \"\"}>\r\n <FluentButton\r\n ref={ref}\r\n iconPosition=\"after\"\r\n {...buttonProps}\r\n className={className}\r\n size={size}\r\n aria-label={ariaLabel ?? (!label ? title : undefined)}\r\n icon={isOnClickBusy ? <Spinner size=\"extra-tiny\" /> : Icon && <Icon className={iconClass} />}\r\n onClick={handleOnClick}\r\n disabled={disabled || isOnClickBusy}\r\n >\r\n {label && props.label}\r\n </FluentButton>\r\n </Tooltip>\r\n );\r\n});\r\n\r\nButton.displayName = \"Button\";\r\n","import { type ErrorInfo, type ReactNode, Component } from \"react\";\r\n\r\nimport { makeStyles, tokens } from \"@fluentui/react-components\";\r\nimport { ErrorCircleRegular } from \"@fluentui/react-icons\";\r\nimport { Button } from \"shared-ui-components/fluent/primitives/button\";\r\nimport { TokenMap } from \"shared-ui-components/fluent/primitives/utils\";\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: TokenMap.px20,\r\n backgroundColor: tokens.colorNeutralBackground1,\r\n color: tokens.colorNeutralForeground1,\r\n // Claim the full row of the flex parent (e.g. shellService's central-content row)\r\n // so the centered children sit in the middle of the available area, not at the left edge.\r\n flex: 1,\r\n height: \"100%\",\r\n minHeight: \"100px\",\r\n },\r\n icon: {\r\n fontSize: \"48px\",\r\n color: tokens.colorPaletteRedForeground1,\r\n marginBottom: TokenMap.px12,\r\n },\r\n title: {\r\n fontSize: TokenMap.px16,\r\n fontWeight: \"600\",\r\n marginBottom: TokenMap.px8,\r\n },\r\n message: {\r\n fontSize: TokenMap.px12,\r\n color: tokens.colorNeutralForeground2,\r\n marginBottom: TokenMap.px16,\r\n textAlign: \"center\",\r\n maxWidth: \"300px\",\r\n },\r\n details: {\r\n fontSize: TokenMap.px10,\r\n color: tokens.colorNeutralForeground3,\r\n fontFamily: \"monospace\",\r\n whiteSpace: \"pre-wrap\",\r\n maxHeight: \"100px\",\r\n overflow: \"auto\",\r\n padding: TokenMap.px8,\r\n backgroundColor: tokens.colorNeutralBackground3,\r\n borderRadius: TokenMap.px4,\r\n marginTop: TokenMap.px8,\r\n maxWidth: \"100%\",\r\n },\r\n});\r\n\r\n/**\r\n * Props for the {@link ErrorBoundary} component.\r\n */\r\ntype ErrorBoundaryProps = {\r\n /** Child components to render */\r\n children: ReactNode;\r\n /** Optional fallback UI to show on error */\r\n fallback?: ReactNode;\r\n /** Optional callback when an error occurs */\r\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\r\n /** Optional name for identifying this boundary in logs */\r\n name?: string;\r\n};\r\n\r\ntype ErrorBoundaryState = {\r\n hasError: boolean;\r\n error: Error | null;\r\n errorInfo: ErrorInfo | null;\r\n};\r\n\r\n/**\r\n * Error boundary component that catches JavaScript errors in child components\r\n * and displays a fallback UI instead of crashing the entire application.\r\n */\r\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = { hasError: false, error: null, errorInfo: null };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\r\n return { hasError: true, error };\r\n }\r\n\r\n override componentDidCatch(error: Error, errorInfo: ErrorInfo) {\r\n this.setState({ errorInfo });\r\n\r\n // Log the error\r\n const boundaryName = this.props.name || \"ErrorBoundary\";\r\n // eslint-disable-next-line no-console\r\n console.error(`[${boundaryName}] Error caught:`, error, errorInfo);\r\n\r\n // Call optional error callback\r\n this.props.onError?.(error, errorInfo);\r\n }\r\n\r\n private _handleRetry = () => {\r\n this.setState({ hasError: false, error: null, errorInfo: null });\r\n };\r\n\r\n override render() {\r\n if (this.state.hasError) {\r\n // If a custom fallback is provided, use it\r\n if (this.props.fallback) {\r\n return this.props.fallback;\r\n }\r\n\r\n // Default fallback UI\r\n return <ErrorFallback error={this.state.error} onRetry={this._handleRetry} />;\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n\r\ntype ErrorFallbackProps = {\r\n error: Error | null;\r\n onRetry: () => void;\r\n};\r\n\r\nfunction ErrorFallback({ error, onRetry }: ErrorFallbackProps) {\r\n const styles = useStyles();\r\n\r\n return (\r\n <div className={styles.root}>\r\n <ErrorCircleRegular className={styles.icon} />\r\n <div className={styles.title}>Something went wrong</div>\r\n <div className={styles.message}>An error occurred in this component. You can try again or continue using other parts of the tool.</div>\r\n <Button label=\"Try Again\" appearance=\"primary\" onClick={onRetry} />\r\n {error && <div className={styles.details}>{error.message}</div>}\r\n </div>\r\n );\r\n}\r\n","import { useFluent } from \"@fluentui/react-components\";\r\nimport { useEffect } from \"react\";\r\n\r\nexport type WindowOptions = {\r\n current?: boolean;\r\n primary?: boolean;\r\n};\r\n\r\nexport function useEventListener<EventT extends keyof DocumentEventMap>(\r\n source: \"document\",\r\n eventName: EventT,\r\n handler: (e: DocumentEventMap[EventT]) => void,\r\n options?: WindowOptions\r\n): void;\r\nexport function useEventListener<EventT extends keyof WindowEventMap>(\r\n source: \"window\",\r\n eventName: EventT,\r\n handler: (e: WindowEventMap[EventT]) => void,\r\n options?: WindowOptions\r\n): void;\r\nexport function useEventListener(source: \"document\" | \"window\", eventName: string, handler: (e: Event) => void, options?: WindowOptions): void {\r\n const watchCurrent = options?.current ?? true;\r\n const watchPrimary = options?.primary ?? true;\r\n\r\n const { targetDocument: currentDocument } = useFluent();\r\n\r\n const currentSource = !watchCurrent ? null : source === \"window\" ? currentDocument?.defaultView : currentDocument;\r\n const primarySource = !watchPrimary ? null : source === \"window\" ? window : document;\r\n\r\n for (const eventSource of [currentSource, primarySource]) {\r\n useEffect(() => {\r\n if (eventSource && handler) {\r\n eventSource.addEventListener(eventName, handler);\r\n return () => {\r\n eventSource.removeEventListener(eventName, handler);\r\n };\r\n }\r\n return undefined;\r\n }, [eventSource, eventName, handler]);\r\n }\r\n}\r\n","import { type WindowOptions, useEventListener } from \"./eventHooks\";\r\n\r\nimport { useCallback, useState } from \"react\";\r\n\r\ntype KeyCallbacks = {\r\n onKeyDown?: (e: KeyboardEvent) => void;\r\n onKeyUp?: (e: KeyboardEvent) => void;\r\n};\r\n\r\nexport function useKeyListener(callbacks: KeyCallbacks, options?: WindowOptions) {\r\n const callbackMap = new Map<\"keydown\" | \"keyup\", ((e: KeyboardEvent) => void) | undefined>([\r\n [\"keydown\", callbacks.onKeyDown],\r\n [\"keyup\", callbacks.onKeyUp],\r\n ]);\r\n\r\n for (const eventType of [\"keydown\", \"keyup\"] as const) {\r\n const handler = callbackMap.get(eventType);\r\n if (handler) {\r\n // Ignore repeated events from holding down a key.\r\n const guardedHandler = (e: KeyboardEvent) => {\r\n if (!e.repeat) {\r\n handler(e);\r\n }\r\n };\r\n\r\n useEventListener(\"document\", eventType, guardedHandler, options);\r\n }\r\n }\r\n}\r\n\r\ntype KeyStateOptions = WindowOptions & {\r\n preventDefault?: boolean;\r\n};\r\n\r\nexport function useKeyState(key: string, options?: KeyStateOptions): boolean {\r\n const [isPressed, setIsPressed] = useState(false);\r\n\r\n useKeyListener(\r\n {\r\n onKeyDown: useCallback(\r\n (e: KeyboardEvent) => {\r\n if (e.key === key) {\r\n if (options?.preventDefault) {\r\n e.preventDefault();\r\n }\r\n setIsPressed(true);\r\n }\r\n },\r\n [key, options?.preventDefault]\r\n ),\r\n onKeyUp: useCallback(\r\n (e: KeyboardEvent) => {\r\n if (e.key === key) {\r\n if (options?.preventDefault) {\r\n e.preventDefault();\r\n }\r\n setIsPressed(false);\r\n }\r\n },\r\n [key, options?.preventDefault]\r\n ),\r\n },\r\n options\r\n );\r\n\r\n useEventListener(\r\n \"window\",\r\n \"blur\",\r\n useCallback(() => setIsPressed(false), []),\r\n options\r\n ); // Reset state on window blur to avoid stuck keys\r\n\r\n return isPressed;\r\n}\r\n","import { type RefObject, createContext, useContext, useEffect, useMemo, useReducer, useRef } from \"react\";\nimport { type AccordionProps, type AccordionSectionBlockProps, type AccordionSectionItemProps } from \"./accordion\";\n\n// ============================================================================\n// Storage Helpers\n// ============================================================================\n\nconst STORAGE_KEY_ROOT = \"Babylon/Accordion\";\nconst InMemoryStorage = new Map<string, string>();\n// eslint-disable-next-line no-console\nconst Warn = (message: string): void => globalThis.console?.warn?.(message);\n\nconst ReadStoredString = (key: string): string => {\n try {\n return globalThis.localStorage?.getItem(key) ?? InMemoryStorage.get(key) ?? \"\";\n } catch {\n return InMemoryStorage.get(key) ?? \"\";\n }\n};\n\nconst WriteStoredString = (key: string, value: string): void => {\n try {\n if (globalThis.localStorage) {\n globalThis.localStorage.setItem(key, value);\n return;\n }\n } catch {\n // Fall through to in-memory persistence when localStorage is unavailable.\n }\n InMemoryStorage.set(key, value);\n};\n\nconst ReadFromStorage = <T,>(path: string, initial: T): T => {\n try {\n const stored = ReadStoredString(`${STORAGE_KEY_ROOT}/${path}`);\n return stored ? JSON.parse(stored) : initial;\n } catch {\n return initial;\n }\n};\n\nconst WriteToStorage = (path: string, data: unknown): void => {\n WriteStoredString(`${STORAGE_KEY_ROOT}/${path}`, JSON.stringify(data));\n};\n\n// ============================================================================\n// State Types\n// ============================================================================\n\n/**\n * Immutable state for the Accordion.\n */\nexport type AccordionState = {\n /** IDs of pinned items (persisted to localStorage). */\n pinnedIds: string[];\n /** IDs of hidden items (persisted to localStorage). */\n hiddenIds: string[];\n /** Current search/filter term. */\n searchTerm: string;\n /** Whether edit mode is active (shows pin/hide controls). */\n editMode: boolean;\n};\n\n/**\n * Actions that can be dispatched to update accordion state.\n */\nexport type AccordionAction =\n | { type: \"SET_SEARCH_TERM\"; term: string }\n | { type: \"SET_EDIT_MODE\"; enabled: boolean }\n | { type: \"TOGGLE_PINNED\"; itemId: string }\n | { type: \"TOGGLE_HIDDEN\"; itemId: string }\n | { type: \"MOVE_PINNED_UP\"; itemId: string }\n | { type: \"REMOVE_STALE_IDS\"; activeIds: Set<string> }\n | { type: \"SHOW_ALL\" }\n | { type: \"HIDE_ALL_VISIBLE\"; visibleItemIds: string[] };\n\n/**\n * Feature flags for the Accordion (immutable after initialization).\n */\nexport type AccordionFeatures = {\n /** Whether pinning is enabled. */\n pinning: boolean;\n /** Whether hiding is enabled. */\n hiding: boolean;\n /** Whether search is enabled. */\n search: boolean;\n};\n\n// ============================================================================\n// Reducer\n// ============================================================================\n\nconst AccordionReducer = (state: AccordionState, action: AccordionAction): AccordionState => {\n switch (action.type) {\n case \"SET_SEARCH_TERM\":\n return { ...state, searchTerm: action.term };\n\n case \"SET_EDIT_MODE\":\n return { ...state, editMode: action.enabled };\n\n case \"TOGGLE_PINNED\": {\n const isPinned = state.pinnedIds.includes(action.itemId);\n return {\n ...state,\n pinnedIds: isPinned ? state.pinnedIds.filter((id) => id !== action.itemId) : [...state.pinnedIds, action.itemId],\n };\n }\n\n case \"TOGGLE_HIDDEN\": {\n const isHidden = state.hiddenIds.includes(action.itemId);\n return {\n ...state,\n hiddenIds: isHidden ? state.hiddenIds.filter((id) => id !== action.itemId) : [...state.hiddenIds, action.itemId],\n };\n }\n\n case \"MOVE_PINNED_UP\": {\n const index = state.pinnedIds.indexOf(action.itemId);\n if (index <= 0) {\n return state;\n }\n const newPinnedIds = [...state.pinnedIds];\n [newPinnedIds[index - 1], newPinnedIds[index]] = [newPinnedIds[index], newPinnedIds[index - 1]];\n return { ...state, pinnedIds: newPinnedIds };\n }\n\n case \"REMOVE_STALE_IDS\": {\n const pinnedIds = state.pinnedIds.filter((id) => action.activeIds.has(id));\n const hiddenIds = state.hiddenIds.filter((id) => action.activeIds.has(id));\n if (pinnedIds.length === state.pinnedIds.length && hiddenIds.length === state.hiddenIds.length) {\n return state;\n }\n return { ...state, pinnedIds, hiddenIds };\n }\n\n case \"SHOW_ALL\":\n return { ...state, hiddenIds: [] };\n\n case \"HIDE_ALL_VISIBLE\":\n return {\n ...state,\n hiddenIds: [...new Set([...state.hiddenIds, ...action.visibleItemIds])],\n };\n\n default:\n return state;\n }\n};\n\n// ============================================================================\n// Accordion Context\n// ============================================================================\n\n/**\n * Context value for the Accordion component.\n */\nexport type AccordionContextValue = {\n /** The unique ID of the Accordion instance. */\n accordionId: string;\n /** State for the Accordion, managed via dispatch function. */\n state: AccordionState;\n /** Dispatch function to update state. */\n dispatch: React.Dispatch<AccordionAction>;\n /** Feature flags. */\n features: AccordionFeatures;\n /** Ref for the pinned items portal container. */\n pinnedContainerRef: RefObject<HTMLDivElement>;\n /** Map of registered item IDs to labels (for duplicate detection and section empty checks). */\n registeredItemIds: Map<string, string>;\n};\n\nexport const AccordionContext = createContext<AccordionContextValue | undefined>(undefined);\n\n/**\n * Hook to create and manage the AccordionContext value.\n *\n * @param props - AccordionProps\n * @returns AccordionContextValue, or undefined if no features are enabled or no uniqueId is provided.\n */\nexport function useAccordionContext(props: AccordionProps): AccordionContextValue | undefined {\n const { uniqueId: accordionId, enablePinnedItems, enableHiddenItems, enableSearchItems } = props;\n\n const features: AccordionFeatures = useMemo(\n () => ({\n pinning: enablePinnedItems ?? false,\n hiding: enableHiddenItems ?? false,\n search: enableSearchItems ?? false,\n }),\n [enablePinnedItems, enableHiddenItems, enableSearchItems]\n );\n\n const hasFeatures = features.pinning || features.hiding || features.search;\n\n // Initialize state from localStorage\n const initialState = useMemo((): AccordionState => {\n if (!accordionId || !hasFeatures) {\n return { pinnedIds: [], hiddenIds: [], searchTerm: \"\", editMode: false };\n }\n return {\n pinnedIds: features.pinning ? ReadFromStorage<string[]>(`Pinned/${accordionId}`, []) : [],\n hiddenIds: features.hiding ? ReadFromStorage<string[]>(`Hidden/${accordionId}`, []) : [],\n searchTerm: \"\",\n editMode: false,\n };\n }, [accordionId, hasFeatures, features.pinning, features.hiding]);\n\n const [state, dispatch] = useReducer(AccordionReducer, initialState);\n\n const pinnedContainerRef = useRef<HTMLDivElement>(null);\n const registeredItemIds = useRef<Map<string, string>>(new Map());\n\n // Persist pinnedIds to localStorage when they change\n useEffect(() => {\n if (accordionId && features.pinning) {\n WriteToStorage(`Pinned/${accordionId}`, state.pinnedIds);\n }\n }, [accordionId, features.pinning, state.pinnedIds]);\n\n // Persist hiddenIds to localStorage when they change\n useEffect(() => {\n if (accordionId && features.hiding) {\n WriteToStorage(`Hidden/${accordionId}`, state.hiddenIds);\n }\n }, [accordionId, features.hiding, state.hiddenIds]);\n\n // Clean stale IDs from localStorage on mount. Parent effects run after\n // children's, so all items will have registered by the time this fires.\n useEffect(() => {\n if (accordionId && hasFeatures) {\n dispatch({ type: \"REMOVE_STALE_IDS\", activeIds: new Set(registeredItemIds.current.keys()) });\n }\n }, [accordionId, hasFeatures]);\n\n // Return undefined if no accordionId or no features enabled\n if (!accordionId || !hasFeatures) {\n return undefined;\n }\n\n return {\n accordionId,\n state,\n dispatch,\n features,\n pinnedContainerRef,\n registeredItemIds: registeredItemIds.current,\n };\n}\n\n// ============================================================================\n// Section Context\n// ============================================================================\n\n/**\n * Context value for an AccordionSectionBlock.\n */\nexport type AccordionSectionBlockContextValue = {\n /** The section ID. */\n sectionId: string;\n};\n\nexport const AccordionSectionBlockContext = createContext<AccordionSectionBlockContextValue | undefined>(undefined);\n\n/**\n * Hook to create the AccordionSectionBlockContext value.\n *\n * @param props - AccordionSectionBlockProps\n * @returns AccordionSectionBlockContextValue and isEmpty state\n */\nexport function useAccordionSectionBlockContext(props: AccordionSectionBlockProps): {\n context: AccordionSectionBlockContextValue;\n isEmpty: boolean;\n} {\n const { sectionId } = props;\n const context = useMemo(() => ({ sectionId }), [sectionId]);\n const isEmpty = useIsSectionEmpty(sectionId);\n\n return { context, isEmpty };\n}\n\n// ============================================================================\n// Item Depth Context (to detect nested AccordionSectionItems)\n// ============================================================================\n\n/**\n * Context to track whether we're inside an AccordionSectionItem.\n * Used to prevent nested items from being individually manageable.\n */\nexport const AccordionItemDepthContext = createContext<boolean>(false);\n\n// ============================================================================\n// Item Context Hook\n// ============================================================================\n\n/**\n * Derived item state, computed from the accordion state during render.\n */\nexport type AccordionItemState = {\n /** The globally unique item ID. */\n itemUniqueId: string;\n /** Whether this item is nested inside another AccordionSectionItem. */\n isNested: boolean;\n /** Whether this item is pinned. */\n isPinned: boolean;\n /** Whether this item is hidden. */\n isHidden: boolean;\n /** Whether this item matches the current search term. */\n isMatch: boolean;\n /** The index of this item in the pinned list (for ordering). */\n pinnedIndex: number;\n /** Whether this pinned item can be moved up (is not first in the pinned list). */\n canMoveUp: boolean;\n /** Whether edit mode is active. */\n inEditMode: boolean;\n /** Callbacks to modify state. */\n actions: {\n togglePinned: () => void;\n toggleHidden: () => void;\n movePinnedUp: () => void;\n };\n};\n\n/**\n * Hook to compute item state from accordion context.\n *\n * @param props - AccordionSectionItemProps\n * @returns AccordionItemState, or undefined if no accordion context or nested item.\n */\nexport function useAccordionSectionItemState(props: AccordionSectionItemProps): AccordionItemState | undefined {\n const { uniqueId: itemId, label: itemLabel, staticItem } = props;\n\n const accordionCtx = useContext(AccordionContext);\n const sectionCtx = useContext(AccordionSectionBlockContext);\n const isNested = useContext(AccordionItemDepthContext);\n\n // Build the globally unique item ID\n const itemUniqueId = useMemo(() => {\n if (!accordionCtx || !sectionCtx) {\n return \"\";\n }\n return `${accordionCtx.accordionId}/${sectionCtx.sectionId}/${itemId}`;\n }, [accordionCtx?.accordionId, sectionCtx?.sectionId, itemId]);\n\n // Debug: warn if itemId changes (should be stable)\n const prevItemIdRef = useRef(itemId);\n useEffect(() => {\n if (accordionCtx && prevItemIdRef.current !== itemId) {\n Warn(\n `Accordion: The uniqueId \"${itemId}\" in section \"${sectionCtx?.sectionId}\" has changed from \"${prevItemIdRef.current}\". ` +\n `Each item must have a unique, stable ID for pin/hide persistence to work correctly.`\n );\n }\n prevItemIdRef.current = itemId;\n }, [accordionCtx, itemId, sectionCtx?.sectionId]);\n\n // Register item and detect duplicates (skip nested items, as children of other AccordionSectionItem should not participate in pin/hide/search).\n useEffect(() => {\n if (!accordionCtx || !itemUniqueId || isNested) {\n return;\n }\n const { registeredItemIds } = accordionCtx;\n if (registeredItemIds.has(itemUniqueId)) {\n Warn(\n `Accordion: Duplicate uniqueId \"${itemId}\" detected in section \"${sectionCtx?.sectionId}\". ` +\n `Each item must have a unique ID within its section for pin/hide persistence to work correctly.`\n );\n }\n registeredItemIds.set(itemUniqueId, itemLabel ?? itemId);\n return () => {\n registeredItemIds.delete(itemUniqueId);\n };\n }, [accordionCtx, itemUniqueId, itemId, itemLabel, sectionCtx?.sectionId, isNested]);\n\n // If no context, static item, or nested, return undefined\n if (!accordionCtx || staticItem) {\n return undefined;\n }\n\n const { state, dispatch, features } = accordionCtx;\n const { pinnedIds, hiddenIds, searchTerm, editMode } = state;\n\n // Compute derived state\n const isPinned = features.pinning && pinnedIds.includes(itemUniqueId);\n const isHidden = features.hiding && hiddenIds.includes(itemUniqueId);\n const pinnedIndex = isPinned ? pinnedIds.indexOf(itemUniqueId) : -1;\n\n const canMoveUp = isPinned && pinnedIndex > 0;\n\n // Search matching\n const searchText = (itemLabel ?? itemId).toLowerCase();\n const isMatch = !features.search || !searchTerm || searchText.includes(searchTerm.toLowerCase());\n\n return {\n itemUniqueId,\n isNested,\n isPinned,\n isHidden,\n isMatch,\n pinnedIndex,\n canMoveUp,\n inEditMode: editMode,\n actions: {\n togglePinned: () => dispatch({ type: \"TOGGLE_PINNED\", itemId: itemUniqueId }),\n toggleHidden: () => dispatch({ type: \"TOGGLE_HIDDEN\", itemId: itemUniqueId }),\n movePinnedUp: () => dispatch({ type: \"MOVE_PINNED_UP\", itemId: itemUniqueId }),\n },\n };\n}\n/**\n * Hook to determine if a section is empty (has no visible items).\n * Derived from accordion state + globally registered items filtered by section prefix.\n *\n * @param sectionId - The section ID to check.\n * @returns Whether the section has no visible items.\n */\nfunction useIsSectionEmpty(sectionId: string): boolean {\n const accordionCtx = useContext(AccordionContext);\n\n if (!accordionCtx) {\n return false;\n }\n\n const { state, features, accordionId, registeredItemIds } = accordionCtx;\n const { pinnedIds, hiddenIds, searchTerm, editMode } = state;\n\n if (editMode) {\n return false;\n }\n\n const sectionPrefix = `${accordionId}/${sectionId}/`;\n let hasItems = false;\n\n for (const [itemId, itemLabel] of registeredItemIds) {\n if (!itemId.startsWith(sectionPrefix)) {\n continue;\n }\n hasItems = true;\n const isPinned = features.pinning && pinnedIds.includes(itemId);\n const isHidden = features.hiding && hiddenIds.includes(itemId);\n const searchText = (itemLabel || itemId).toLowerCase();\n const isMatch = !features.search || !searchTerm || searchText.includes(searchTerm.toLowerCase());\n if (!isPinned && !isHidden && isMatch) {\n return false;\n }\n }\n\n return hasItems;\n}\n","import {\r\n type AccordionPanelProps,\r\n type AccordionToggleData,\r\n type AccordionToggleEvent,\r\n type AccordionProps as FluentAccordionProps,\r\n AccordionHeader,\r\n AccordionItem,\r\n AccordionPanel,\r\n Divider,\r\n Accordion as FluentAccordion,\r\n MessageBar,\r\n MessageBarBody,\r\n Portal,\r\n SearchBox,\r\n Subtitle2Stronger,\r\n makeStyles,\r\n tokens,\r\n} from \"@fluentui/react-components\";\r\nimport {\r\n type ForwardRefExoticComponent,\r\n type FunctionComponent,\r\n type PropsWithChildren,\r\n type RefAttributes,\r\n Children,\r\n forwardRef,\r\n isValidElement,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\n\r\nimport { ArrowCircleUpRegular, CheckmarkFilled, EditRegular, EyeFilled, EyeOffRegular, FilterRegular, PinFilled, PinRegular } from \"@fluentui/react-icons\";\r\n\r\nimport { ToolContext } from \"../hoc/fluentToolWrapper\";\r\nimport { useKeyState } from \"../hooks/keyboardHooks\";\r\nimport {\r\n AccordionContext,\r\n AccordionItemDepthContext,\r\n AccordionSectionBlockContext,\r\n useAccordionContext,\r\n useAccordionSectionBlockContext,\r\n useAccordionSectionItemState,\r\n} from \"./accordion.contexts\";\r\nimport { Button } from \"./button\";\r\nimport { CustomTokens } from \"./utils\";\r\n\r\nconst useStyles = makeStyles({\r\n accordion: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n height: \"100%\",\r\n },\r\n accordionBody: {\r\n overflowX: \"hidden\",\r\n overflowY: \"auto\",\r\n paddingBottom: tokens.spacingVerticalM, // bottom padding since there is no divider at the bottom\r\n },\r\n divider: {\r\n paddingTop: CustomTokens.dividerGap,\r\n paddingBottom: CustomTokens.dividerGap,\r\n },\r\n dividerSmall: {\r\n paddingTop: CustomTokens.dividerGapSmall,\r\n paddingBottom: CustomTokens.dividerGapSmall,\r\n },\r\n panelDiv: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n },\r\n highlightDiv: {\r\n borderRadius: tokens.borderRadiusLarge,\r\n animationDuration: \"1s\",\r\n animationTimingFunction: \"ease-in-out\",\r\n animationIterationCount: \"5\",\r\n animationFillMode: \"forwards\",\r\n animationName: {\r\n from: {\r\n boxShadow: `inset 0 0 4px ${tokens.colorTransparentBackground}`,\r\n },\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n \"50%\": {\r\n boxShadow: `inset 0 0 12px ${tokens.colorBrandBackground}`,\r\n },\r\n to: {\r\n boxShadow: `inset 0 0 4px ${tokens.colorTransparentBackground}`,\r\n },\r\n },\r\n },\r\n menuBar: {\r\n display: \"flex\",\r\n padding: `0 ${tokens.spacingHorizontalM}`,\r\n },\r\n menuBarControls: {\r\n display: \"flex\",\r\n flexGrow: 1,\r\n justifyContent: \"end\",\r\n },\r\n sectionItemContainer: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n alignItems: \"center\",\r\n },\r\n sectionItemContent: {\r\n flexGrow: 1,\r\n minWidth: 0, // Allow content to shrink below its intrinsic width when buttons are shown\r\n overflow: \"hidden\",\r\n },\r\n sectionItemButtons: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n alignItems: \"center\",\r\n marginRight: tokens.spacingHorizontalXS,\r\n },\r\n pinnedContainer: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n pinnedContainerEmpty: {\r\n \"&:not(:only-child)\": {\r\n display: \"none\",\r\n },\r\n },\r\n searchBox: {\r\n width: \"100%\",\r\n maxWidth: \"none\",\r\n },\r\n sectionBlockEmpty: {\r\n display: \"none\",\r\n },\r\n});\r\n\r\n/**\r\n * Renders the menu bar and control buttons.\r\n *\r\n * @returns `div`, or `undefined` if all features are disabled.\r\n */\r\nconst AccordionMenuBar: FunctionComponent = () => {\r\n AccordionMenuBar.displayName = \"AccordionMenuBar\";\r\n const classes = useStyles();\r\n const accordionCtx = useContext(AccordionContext);\r\n\r\n if (!accordionCtx) {\r\n return null;\r\n }\r\n\r\n const { state, dispatch, features } = accordionCtx;\r\n const { editMode } = state;\r\n\r\n return (\r\n <div className={classes.menuBar}>\r\n <AccordionSearchBox />\r\n <div className={classes.menuBarControls}>\r\n {features.hiding && editMode && (\r\n <>\r\n <Button title=\"Show all\" icon={EyeFilled} appearance=\"transparent\" onClick={() => dispatch({ type: \"SHOW_ALL\" })} />\r\n <Button\r\n title=\"Hide all\"\r\n icon={EyeOffRegular}\r\n appearance=\"transparent\"\r\n onClick={() => {\r\n // Hide all visible (non-hidden) items using the registered item IDs\r\n const { registeredItemIds, state: currentState } = accordionCtx;\r\n const visibleItemIds = Array.from(registeredItemIds.keys()).filter((id) => !currentState.hiddenIds.includes(id));\r\n dispatch({ type: \"HIDE_ALL_VISIBLE\", visibleItemIds });\r\n }}\r\n />\r\n </>\r\n )}\r\n {(features.pinning || features.hiding) && (\r\n <Button\r\n title=\"Edit mode\"\r\n icon={editMode ? CheckmarkFilled : EditRegular}\r\n appearance={editMode ? \"primary\" : \"transparent\"}\r\n onClick={() => dispatch({ type: \"SET_EDIT_MODE\", enabled: !editMode })}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n * Props: `AccordionSectionBlock`.\r\n */\r\nexport type AccordionSectionBlockProps = {\r\n /** The ID of the `AccordionSectionBlock`, unique within the `Accordion` instance. */\r\n sectionId: string;\r\n};\r\n\r\n/**\r\n * Wrapper component that must encapsulate the section headers and panels.\r\n * - Stores the section ID for use in `AccordionSectionItem`.\r\n *\r\n * @param props - `AccordionSectionBlockProps`\r\n * @returns `AccordionSectionBlockContext.Provider`, or `AccordionItem` if all features are disabled.\r\n */\r\nconst AccordionSectionBlock: FunctionComponent<PropsWithChildren<AccordionSectionBlockProps>> = (props) => {\r\n AccordionSectionBlock.displayName = \"AccordionSectionBlock\";\r\n const { children, sectionId } = props;\r\n const classes = useStyles();\r\n const accordionCtx = useContext(AccordionContext);\r\n const { context: sectionContext, isEmpty } = useAccordionSectionBlockContext(props);\r\n\r\n if (accordionCtx) {\r\n return (\r\n <AccordionSectionBlockContext.Provider value={sectionContext}>\r\n {/* Always render children so items stay registered in registeredItemIds;\r\n hiding via CSS prevents the oscillation that occurs when unmounting\r\n causes items to unregister, making the section appear non-empty again. */}\r\n <AccordionItem value={sectionId} className={isEmpty ? classes.sectionBlockEmpty : undefined}>\r\n {children}\r\n </AccordionItem>\r\n </AccordionSectionBlockContext.Provider>\r\n );\r\n }\r\n\r\n return <AccordionItem value={sectionId}>{children}</AccordionItem>;\r\n};\r\n\r\n/**\r\n * Props: `AccordionSectionItem`.\r\n */\r\nexport type AccordionSectionItemProps = {\r\n /** The ID of the `AccordionSectionItem`, unique within the `AccordionSectionBlock` instance. */\r\n uniqueId: string;\r\n /** The searchable text label for the item. */\r\n label?: string;\r\n /** Whether the item is not interactable. */\r\n staticItem?: boolean;\r\n};\r\n\r\n/**\r\n * Wrapper component that must encapsulate individual items.\r\n * - Renders the pin button and tracks the pinned state of the item.\r\n * - Renders the hide button and tracks the hidden state of the item.\r\n * - Filters items based on the current search term.\r\n *\r\n * @param props - `AccordionSectionItemProps`\r\n * @returns `Portal` if pinned; `null` if hidden/filtered; `children` otherwise.\r\n */\r\nexport const AccordionSectionItem: FunctionComponent<PropsWithChildren<AccordionSectionItemProps>> = (props) => {\r\n AccordionSectionItem.displayName = \"AccordionSectionItem\";\r\n const { children, staticItem } = props;\r\n const classes = useStyles();\r\n const accordionCtx = useContext(AccordionContext);\r\n const itemState = useAccordionSectionItemState(props);\r\n const [ctrlMode, setCtrlMode] = useState(false);\r\n const ctrlPressed = useKeyState(\"Control\");\r\n const [mouseOver, setMouseOver] = useState(false);\r\n\r\n useEffect(() => {\r\n setCtrlMode(ctrlPressed && mouseOver);\r\n }, [ctrlPressed, mouseOver]);\r\n\r\n // Override disableCopy so copy buttons appear when ctrl+hovering on this item or when edit mode is active\r\n const parentToolContext = useContext(ToolContext);\r\n const editMode = accordionCtx?.state.editMode ?? false;\r\n const showCopy = ctrlMode || editMode;\r\n const itemToolContext = useMemo(() => (showCopy ? { ...parentToolContext, disableCopy: false } : parentToolContext), [parentToolContext, showCopy]);\r\n\r\n // If static item or no context, just render children\r\n if (staticItem || !accordionCtx || !itemState) {\r\n return <>{children}</>;\r\n }\r\n\r\n const { pinnedContainerRef, features } = accordionCtx;\r\n const { isNested, isPinned, isHidden, isMatch, pinnedIndex, canMoveUp, inEditMode, actions } = itemState;\r\n\r\n // Nested items just render children (don't show controls)\r\n if (isNested) {\r\n return <>{children}</>;\r\n }\r\n\r\n // If hidden (and not in edit mode) or doesn't match search, don't render\r\n if ((isHidden && !inEditMode) || !isMatch) {\r\n return null;\r\n }\r\n\r\n const pinnedContainer = isPinned ? pinnedContainerRef.current : null;\r\n const showControls = inEditMode || ctrlMode;\r\n\r\n const itemElement = (\r\n <ToolContext.Provider value={itemToolContext}>\r\n <div\r\n className={classes.sectionItemContainer}\r\n style={isPinned ? { order: pinnedIndex } : undefined}\r\n onMouseMove={() => setMouseOver(true)}\r\n onMouseLeave={() => setMouseOver(false)}\r\n >\r\n {showControls && (\r\n <div className={classes.sectionItemButtons}>\r\n {features.hiding && (\r\n <Button title={isHidden ? \"Unhide\" : \"Hide\"} icon={isHidden ? EyeOffRegular : EyeFilled} appearance=\"transparent\" onClick={actions.toggleHidden} />\r\n )}\r\n {features.pinning && (\r\n <>\r\n <Button title={isPinned ? \"Unpin\" : \"Pin\"} icon={isPinned ? PinFilled : PinRegular} appearance=\"transparent\" onClick={actions.togglePinned} />\r\n {isPinned && <Button icon={ArrowCircleUpRegular} appearance=\"transparent\" disabled={!canMoveUp} onClick={actions.movePinnedUp} />}\r\n </>\r\n )}\r\n </div>\r\n )}\r\n <AccordionItemDepthContext.Provider value={true}>\r\n <div className={classes.sectionItemContent}>{children}</div>\r\n </AccordionItemDepthContext.Provider>\r\n </div>\r\n </ToolContext.Provider>\r\n );\r\n\r\n return pinnedContainer ? <Portal mountNode={pinnedContainer}>{itemElement}</Portal> : itemElement;\r\n};\r\n\r\n/**\r\n * Renders the Pinned section container and defines the portal target for the pinned items.\r\n *\r\n * @returns `div`\r\n */\r\nconst AccordionPinnedContainer: FunctionComponent = () => {\r\n AccordionPinnedContainer.displayName = \"AccordionPinnedContainer\";\r\n const classes = useStyles();\r\n const accordionCtx = useContext(AccordionContext);\r\n\r\n return (\r\n <div ref={accordionCtx?.pinnedContainerRef} className={classes.pinnedContainer}>\r\n <MessageBar className={classes.pinnedContainerEmpty}>\r\n <MessageBarBody>No pinned items</MessageBarBody>\r\n </MessageBar>\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n * Renders the search box for filtering items.\r\n *\r\n * @returns `SearchBox`, or `null` if the feature is disabled.\r\n */\r\nconst AccordionSearchBox: FunctionComponent = () => {\r\n AccordionSearchBox.displayName = \"AccordionSearchBox\";\r\n const classes = useStyles();\r\n const accordionCtx = useContext(AccordionContext);\r\n\r\n if (!accordionCtx?.features.search) {\r\n return null;\r\n }\r\n\r\n const { state, dispatch } = accordionCtx;\r\n\r\n return (\r\n <SearchBox\r\n className={classes.searchBox}\r\n appearance=\"underline\"\r\n contentBefore={<FilterRegular />}\r\n placeholder=\"Filter\"\r\n value={state.searchTerm}\r\n onChange={(_, data) => dispatch({ type: \"SET_SEARCH_TERM\", term: data.value })}\r\n />\r\n );\r\n};\r\n\r\n/**\r\n * Props: `AccordionSection`.\r\n */\r\nexport type AccordionSectionProps = {\r\n /** The text label shown in the section header. */\r\n title: string;\r\n /** Indicates whether the `AccordionSection` is initially collapsed. */\r\n collapseByDefault?: boolean;\r\n};\r\n\r\n/**\r\n * Wrapper component that must encapsulate the section body.\r\n *\r\n * @param props - `AccordionSectionProps`\r\n * @returns `div`\r\n */\r\nexport const AccordionSection: FunctionComponent<PropsWithChildren<AccordionSectionProps>> = (props) => {\r\n AccordionSection.displayName = \"AccordionSection\";\r\n const classes = useStyles();\r\n\r\n return <div className={classes.panelDiv}>{props.children}</div>;\r\n};\r\n\r\n/**\r\n * Props: `Accordion`.\r\n */\r\nexport type AccordionProps = {\r\n /** The unique ID of the `Accordion` instance. */\r\n uniqueId?: string;\r\n /** The list of sections to be highlighted. */\r\n highlightSections?: readonly string[];\r\n /** Enables the pinned items feature. */\r\n enablePinnedItems?: boolean;\r\n /** Enables the hidden items feature. */\r\n enableHiddenItems?: boolean;\r\n /** Enables the search items feature. */\r\n enableSearchItems?: boolean;\r\n};\r\n\r\nconst StringAccordion = FluentAccordion as ForwardRefExoticComponent<FluentAccordionProps<string> & RefAttributes<HTMLDivElement>>;\r\n\r\nexport const Accordion = forwardRef<HTMLDivElement, PropsWithChildren<AccordionProps>>((props, ref) => {\r\n Accordion.displayName = \"Accordion\";\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { children, highlightSections, uniqueId, enablePinnedItems, enableHiddenItems, enableSearchItems, ...rest } = props;\r\n const classes = useStyles();\r\n const { size } = useContext(ToolContext);\r\n const accordionCtx = useAccordionContext(props);\r\n const hasPinning = accordionCtx?.features.pinning ?? false;\r\n\r\n const pinnedSectionElement = useMemo(() => {\r\n return (\r\n hasPinning && (\r\n <AccordionSection title=\"Pinned\" collapseByDefault={false}>\r\n <AccordionPinnedContainer />\r\n </AccordionSection>\r\n )\r\n );\r\n }, [hasPinning]);\r\n\r\n // Prevents sections contents from unmounting when closed, allowing their elements to be used in the Pinned section.\r\n const preventUnmountMotion: AccordionPanelProps[\"collapseMotion\"] = useMemo(() => {\r\n // https://github.com/microsoft/fluentui/issues/34309#issuecomment-2824364945\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n return hasPinning ? { children: (Component, props) => <Component {...props} unmountOnExit={false} /> } : undefined;\r\n }, [hasPinning]);\r\n\r\n const validChildren = useMemo(() => {\r\n return (\r\n Children.map([pinnedSectionElement, children], (child) => {\r\n if (isValidElement(child)) {\r\n const childProps = child.props as Partial<AccordionSectionProps>;\r\n if (childProps.title) {\r\n return {\r\n title: childProps.title,\r\n collapseByDefault: childProps.collapseByDefault,\r\n content: child,\r\n };\r\n }\r\n }\r\n return null;\r\n })?.filter(Boolean) ?? []\r\n );\r\n }, [children]);\r\n\r\n // Tracks open items, and used to tell the Accordion which sections should be expanded.\r\n const [openItems, setOpenItems] = useState(validChildren.filter((child) => !child.collapseByDefault).map((child) => child.title));\r\n\r\n // Tracks closed items, which is needed so that when the children change, we only update the open/closed state\r\n // (depending on the collapseByDefault prop) for items that have not been explicitly opened or closed.\r\n const [closedItems, setClosedItems] = useState(validChildren.filter((child) => child.collapseByDefault).map((child) => child.title));\r\n\r\n const internalOpenItemsRef = useRef<string[] | undefined>(openItems);\r\n\r\n // When highlight sections is requested, we temporarily override the open items, but if highlight sections is cleared,\r\n // then we revert back to the normal open items tracking.\r\n useLayoutEffect(() => {\r\n if (highlightSections) {\r\n internalOpenItemsRef.current = [...openItems];\r\n setOpenItems([...highlightSections]);\r\n } else {\r\n setOpenItems([...(internalOpenItemsRef.current ?? [])]);\r\n internalOpenItemsRef.current = undefined;\r\n }\r\n }, [highlightSections]);\r\n\r\n useEffect(() => {\r\n for (const defaultOpenItem of validChildren.filter((child) => !child.collapseByDefault).map((child) => child.title)) {\r\n // If a child is not marked as collapseByDefault, then it should be opened by default, and\r\n // it is only \"default\" if it hasn't already been explicitly added to the opened or closed list.\r\n if (!closedItems.includes(defaultOpenItem) && !openItems.includes(defaultOpenItem)) {\r\n setOpenItems((prev) => [...prev, defaultOpenItem]);\r\n }\r\n }\r\n }, [validChildren]);\r\n\r\n const onToggle = useCallback((event: AccordionToggleEvent, data: AccordionToggleData<string>) => {\r\n if (data.openItems.includes(data.value)) {\r\n setOpenItems((prev) => [...prev, data.value]);\r\n setClosedItems((prev) => prev.filter((item) => item !== data.value));\r\n } else {\r\n setClosedItems((prev) => [...prev, data.value]);\r\n setOpenItems((prev) => prev.filter((item) => item !== data.value));\r\n }\r\n }, []);\r\n\r\n return (\r\n <StringAccordion ref={ref} className={classes.accordion} collapsible multiple onToggle={onToggle} openItems={openItems} {...rest}>\r\n <AccordionContext.Provider value={accordionCtx}>\r\n <AccordionMenuBar />\r\n <div className={classes.accordionBody}>\r\n {validChildren.map((child, index) => {\r\n const isHighlighted = highlightSections?.includes(child.title);\r\n return (\r\n <AccordionSectionBlock key={child.content.key ?? child.title} sectionId={child.title}>\r\n <div className={isHighlighted ? classes.highlightDiv : undefined}>\r\n <AccordionHeader size={size}>\r\n <Subtitle2Stronger>{child.title}</Subtitle2Stronger>\r\n </AccordionHeader>\r\n <AccordionPanel collapseMotion={preventUnmountMotion}>\r\n <div className={classes.panelDiv}>{child.content}</div>\r\n </AccordionPanel>\r\n </div>\r\n {index < validChildren.length - 1 && <Divider inset={true} className={size === \"small\" ? classes.dividerSmall : classes.divider} />}\r\n </AccordionSectionBlock>\r\n );\r\n })}\r\n </div>\r\n </AccordionContext.Provider>\r\n </StringAccordion>\r\n );\r\n});\r\n","import { type ISettingsStore } from \"../services/settingsStore\";\r\n\r\nimport { createContext, useContext } from \"react\";\r\n\r\nexport const SettingsStoreContext = createContext<ISettingsStore | undefined>(undefined);\r\n\r\nexport function useSettingsStore() {\r\n return useContext(SettingsStoreContext);\r\n}\r\n","import { type IReadonlyObservable } from \"core/index\";\r\n\r\nimport { type IReadonlyObservableCollection } from \"../misc/observableCollection\";\r\n\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\n/**\r\n * Returns the current value of the accessor and updates it when the specified event is fired on the specified element.\r\n * @param accessor A function that returns the current value.\r\n * @param element The element to listen for the event on.\r\n * @param eventNames The names of the events to listen for.\r\n * @returns The current value of the accessor.\r\n * * @remarks If the accessor function is not idempotent (e.g. it returns a different array or object instance each time it is called),\r\n * then there is a good chance it should be wrapped in a `useCallback` to prevent unnecessary re-renders or re-render infinite loops.\r\n */\r\nexport function useEventfulState<T>(accessor: () => T, element: HTMLElement | null | undefined, ...eventNames: string[]): T {\r\n const [current, setCurrent] = useState(accessor);\r\n\r\n useEffect(() => {\r\n setCurrent(accessor);\r\n if (element) {\r\n const removers = eventNames.map((eventName) => {\r\n const handler = () => {\r\n setCurrent(accessor());\r\n };\r\n\r\n element.addEventListener(eventName, handler);\r\n\r\n return () => {\r\n element.removeEventListener(eventName, handler);\r\n };\r\n });\r\n\r\n return () => {\r\n removers.forEach((remove) => remove());\r\n };\r\n }\r\n\r\n return undefined;\r\n }, [accessor, element, ...eventNames]);\r\n\r\n return current;\r\n}\r\n\r\n/**\r\n * Returns the current value of the accessor and updates it when any of the specified observables change.\r\n * @param accessor A function that returns the current value.\r\n * @param observables The observables to listen for changes on.\r\n * @returns The current value of the accessor.\r\n * @remarks Prefer this hook when the source already exposes precise change observables. Pair it\r\n * with a polling observable only when a fixed refresh cadence is intentional; use the source\r\n * system's adapter hook when refresh policy is configurable elsewhere.\r\n *\r\n * If the accessor function is not idempotent (e.g. it returns a different array or object instance\r\n * each time it is called), then there is a good chance it should be wrapped in a `useCallback` to\r\n * prevent unnecessary re-renders or re-render infinite loops.\r\n */\r\nexport function useObservableState<T>(accessor: () => T, ...observables: Array<IReadonlyObservable | null | undefined>): T {\r\n const [current, setCurrent] = useState(accessor);\r\n\r\n useEffect(() => {\r\n setCurrent(accessor);\r\n const observers = observables.map((observable) => {\r\n if (observable) {\r\n const observer = observable.add(() => {\r\n setCurrent(accessor());\r\n });\r\n\r\n return observer;\r\n }\r\n return null;\r\n });\r\n\r\n return () => {\r\n observers.forEach((observer) => observer?.remove());\r\n };\r\n }, [accessor, ...observables]);\r\n\r\n return current;\r\n}\r\n\r\n/**\r\n * Returns a copy of the items in the collection and updates it when the collection changes.\r\n * @param collection The collection to observe.\r\n * @returns A copy of the items in the collection.\r\n */\r\nexport function useObservableCollection<T>(collection: IReadonlyObservableCollection<T>) {\r\n const itemsRef = useRef([...collection.items]);\r\n return useObservableState(\r\n useCallback(() => {\r\n if (itemsRef.current.length !== collection.items.length || !itemsRef.current.every((item, index) => item === collection.items[index])) {\r\n itemsRef.current = [...collection.items];\r\n }\r\n return itemsRef.current;\r\n }, [collection]),\r\n collection.observable\r\n );\r\n}\r\n\r\n/**\r\n * Returns a copy of the items in the collection sorted by the order property and updates it when the collection changes.\r\n * @param collection The collection to observe.\r\n * @returns A copy of the items in the collection sorted by the order property.\r\n */\r\nexport function useOrderedObservableCollection<T extends Readonly<{ order?: number }>>(collection: IReadonlyObservableCollection<T>) {\r\n const items = useObservableCollection(collection);\r\n const sortedItems = useMemo(() => items.sort((a, b) => (a.order ?? 0) - (b.order ?? 0)), [items]);\r\n return sortedItems;\r\n}\r\n","import { type Dispatch, type SetStateAction, useCallback, useEffect, useMemo } from \"react\";\r\n\r\nimport { type SettingDescriptor } from \"../services/settingsStore\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { useSettingsStore } from \"../contexts/settingsContext\";\r\nimport { useObservableState } from \"./observableHooks\";\r\n\r\n/**\r\n * Hook that reads and writes a setting from the settings store.\r\n * @param descriptor The setting descriptor that identifies the setting and its default value.\r\n * @returns A tuple of [currentValue, setValue, resetValue] similar to React's useState.\r\n */\r\nexport function useSetting<T>(descriptor: SettingDescriptor<T>): [T, Dispatch<SetStateAction<T>>, () => void] {\r\n const settingsStore = useSettingsStore();\r\n\r\n // Only watch for this specific setting to change. Otherwise, any time any setting changes we would\r\n // call readSetting again, which if it is an object, it will be a new instance, which can cause\r\n // unnecessary re-renders in consumers of this hook.\r\n const settingObservable = useMemo(() => new Observable<void>(), []);\r\n useEffect(() => {\r\n if (settingsStore) {\r\n const observer = settingsStore.onChanged.add((key) => {\r\n if (key === descriptor.key) {\r\n settingObservable.notifyObservers();\r\n }\r\n });\r\n\r\n return () => {\r\n observer.remove();\r\n };\r\n }\r\n\r\n return undefined;\r\n }, [settingsStore, descriptor.key]);\r\n\r\n const value = useObservableState(\r\n useCallback(() => settingsStore?.readSetting<T>(descriptor) ?? descriptor.defaultValue, [settingsStore, descriptor.key, descriptor.defaultValue]),\r\n settingObservable\r\n );\r\n\r\n const setValue = useCallback(\r\n (newValue: SetStateAction<T>): void => {\r\n const value = typeof newValue === \"function\" ? (newValue as (prev: T) => T)(settingsStore?.readSetting<T>(descriptor) ?? descriptor.defaultValue) : newValue;\r\n settingsStore?.writeSetting<T>(descriptor, value);\r\n },\r\n [settingsStore, descriptor.key, descriptor.defaultValue]\r\n );\r\n\r\n const resetValue = useCallback((): void => settingsStore?.writeSetting<T>(descriptor, descriptor.defaultValue), [settingsStore, descriptor.key, descriptor.defaultValue]);\r\n\r\n if (!settingsStore) {\r\n throw new Error(\"Settings store is not available in context.\");\r\n }\r\n\r\n return [value, setValue, resetValue] as const;\r\n}\r\n","import { type SettingDescriptor } from \"./settingsStore\";\r\n\r\nexport const CompactModeSettingDescriptor: SettingDescriptor<boolean> = {\r\n key: \"CompactMode\",\r\n defaultValue: !matchMedia(\"(pointer: coarse)\").matches,\r\n};\r\n\r\nexport const DisableCopySettingDescriptor: SettingDescriptor<boolean> = {\r\n key: \"DisableCopy\",\r\n defaultValue: false,\r\n};\r\n","import { type ContextType, type FunctionComponent, type PropsWithChildren, useMemo } from \"react\";\r\n\r\nimport { ToolContext } from \"shared-ui-components/fluent/hoc/fluentToolWrapper\";\r\nimport { useSetting } from \"../hooks/settingsHooks\";\r\nimport { CompactModeSettingDescriptor, DisableCopySettingDescriptor } from \"../services/globalSettings\";\r\n\r\nexport const UXContextProvider: FunctionComponent<PropsWithChildren> = (props) => {\r\n const [compactMode] = useSetting(CompactModeSettingDescriptor);\r\n const [disableCopy] = useSetting(DisableCopySettingDescriptor);\r\n\r\n const toolsContext = useMemo(() => {\r\n return {\r\n toolName: \"\",\r\n size: compactMode ? \"small\" : \"medium\",\r\n disableCopy,\r\n useFluent: true,\r\n } satisfies ContextType<typeof ToolContext>;\r\n }, [compactMode, disableCopy]);\r\n\r\n return <ToolContext.Provider value={toolsContext}>{props.children}</ToolContext.Provider>;\r\n};\r\n","import { type ComponentType, type PropsWithChildren, type Ref, Children, isValidElement, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport { type AccordionProps, type AccordionSectionProps, Accordion, AccordionSection } from \"shared-ui-components/fluent/primitives/accordion\";\r\n\r\nimport { makeStyles } from \"@fluentui/react-components\";\r\n\r\nimport { UXContextProvider } from \"./uxContextProvider\";\r\n\r\nfunction AsReadonlyArray<T>(array: T[]): readonly T[] {\r\n return array;\r\n}\r\n\r\n/**\r\n * Describes a section within a dynamic accordion that can be added at runtime.\r\n */\r\nexport type DynamicAccordionSection = Readonly<{\r\n /**\r\n * A unique identity for the section, which can be referenced by section content.\r\n */\r\n identity: string;\r\n\r\n /**\r\n * An optional order for the section, relative to other sections.\r\n * Defaults to 0.\r\n */\r\n order?: number;\r\n\r\n /**\r\n * An optional flag indicating whether the section should be collapsed by default.\r\n * Defaults to false.\r\n */\r\n collapseByDefault?: boolean;\r\n}>;\r\n\r\n/**\r\n * Describes content that belongs to a section within a dynamic accordion.\r\n */\r\nexport type DynamicAccordionSectionContent<ContextT> = Readonly<{\r\n /**\r\n * A unique key for the the content.\r\n */\r\n key: string;\r\n\r\n /**\r\n * The section this content belongs to.\r\n */\r\n section: string;\r\n\r\n /**\r\n * An optional order for the content within the section.\r\n * Defaults to 0.\r\n */\r\n order?: number;\r\n\r\n /**\r\n * The React component that will be rendered for this content.\r\n */\r\n component: ComponentType<{ context: ContextT }>;\r\n}>;\r\n\r\nconst useStyles = makeStyles({\r\n rootDiv: {\r\n flex: 1,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n});\r\n\r\n/**\r\n * Imperative handle for controlling section highlights on the extensible accordion.\r\n */\r\nexport type SectionsImperativeRef = {\r\n /**\r\n * Highlights the specified sections, collapsing all others until the context changes.\r\n * @param sections The identity strings of the sections to highlight.\r\n */\r\n highlightSections: (sections: readonly string[]) => void;\r\n};\r\n\r\n/**\r\n * An accordion component that supports dynamically adding sections and section content at runtime.\r\n * Combines statically defined children sections with dynamically registered sections and content.\r\n * @param props The accordion props including sections, section content, context, and an optional imperative ref.\r\n * @returns The extensible accordion component.\r\n */\r\nexport function ExtensibleAccordion<ContextT = unknown>(\r\n props: PropsWithChildren<\r\n {\r\n sections: readonly DynamicAccordionSection[];\r\n sectionContent: readonly DynamicAccordionSectionContent<ContextT>[];\r\n context: ContextT;\r\n sectionsRef?: Ref<SectionsImperativeRef>;\r\n } & AccordionProps\r\n >\r\n) {\r\n const classes = useStyles();\r\n\r\n const { children, sections, sectionContent, context, sectionsRef, ...rest } = props;\r\n\r\n const defaultSections = useMemo(() => {\r\n const defaultSections: DynamicAccordionSection[] = [];\r\n if (children) {\r\n Children.forEach(children, (child) => {\r\n if (isValidElement(child)) {\r\n const childProps = child.props as AccordionSectionProps;\r\n defaultSections.push({\r\n identity: childProps.title,\r\n collapseByDefault: childProps.collapseByDefault,\r\n });\r\n }\r\n });\r\n }\r\n return AsReadonlyArray(defaultSections);\r\n }, [children]);\r\n\r\n // Cache stable component wrappers for static (children-based) sections so that\r\n // React does not unmount/remount them on every re-render. The components read\r\n // the latest child element from `elements` so they always render fresh content.\r\n const staticComponentCacheRef = useRef<{\r\n elements: Map<string, React.ReactNode>;\r\n components: Map<string, ComponentType<{ context: ContextT }>>;\r\n }>({ elements: new Map(), components: new Map() });\r\n\r\n const defaultSectionContent = useMemo(() => {\r\n const cache = staticComponentCacheRef.current;\r\n cache.elements.clear();\r\n const defaultSectionContent: DynamicAccordionSectionContent<ContextT>[] = [];\r\n if (children) {\r\n Children.forEach(children, (child, index) => {\r\n if (isValidElement(child)) {\r\n const childProps = child.props as AccordionSectionProps;\r\n const key = child.key ?? childProps.title;\r\n\r\n // Update the element so the stable component renders the latest content.\r\n cache.elements.set(key, child);\r\n\r\n // Create a stable component wrapper only once per key.\r\n if (!cache.components.has(key)) {\r\n const capturedKey = key;\r\n cache.components.set(capturedKey, () => <>{cache.elements.get(capturedKey)}</>);\r\n }\r\n\r\n defaultSectionContent.push({\r\n key,\r\n section: defaultSections[index].identity,\r\n component: cache.components.get(key)!,\r\n });\r\n }\r\n });\r\n }\r\n return AsReadonlyArray(defaultSectionContent);\r\n }, [children, defaultSections]);\r\n\r\n const mergedSectionContent = useMemo(() => {\r\n return AsReadonlyArray(\r\n [...defaultSectionContent, ...sectionContent].map((content, index) => {\r\n return {\r\n ...content,\r\n key: `${content.key}-${index}`,\r\n order: content.order ?? index,\r\n } as const;\r\n })\r\n );\r\n }, [defaultSectionContent, sectionContent]);\r\n\r\n const mergedSections = useMemo(() => {\r\n const mergedSections = [...defaultSections.map((s) => ({ ...s, isDefault: true as const })), ...sections.map((s) => ({ ...s, isDefault: false as const }))];\r\n\r\n // Check for implicit sections (e.g. sections that were not explicitly defined, but referenced by content).\r\n const implicitSections: DynamicAccordionSection[] = [];\r\n for (const sectionContent of mergedSectionContent) {\r\n if (!mergedSections.some((s) => s.identity === sectionContent.section) && !implicitSections.some((s) => s.identity === sectionContent.section)) {\r\n implicitSections.push({ identity: sectionContent.section });\r\n }\r\n }\r\n\r\n return AsReadonlyArray(\r\n [...implicitSections.map((s) => ({ ...s, isDefault: false as const })), ...mergedSections].map((section, index) => {\r\n return {\r\n ...section,\r\n order: section.order ?? index,\r\n collapseByDefault: section.collapseByDefault ?? false,\r\n } as const;\r\n })\r\n );\r\n }, [defaultSections, sections, mergedSectionContent]);\r\n\r\n const visibleSections = useMemo(() => {\r\n if (!context) {\r\n return [];\r\n }\r\n\r\n const sortedSections = [...mergedSections].sort((a, b) => {\r\n // Default sections always come before non-default sections.\r\n if (a.isDefault !== b.isDefault) {\r\n return a.isDefault ? -1 : 1;\r\n }\r\n return a.order - b.order;\r\n });\r\n\r\n return sortedSections\r\n .map((section) => {\r\n // Get a flat list of the section content, preserving the key so it can be used when each component for each section is rendered.\r\n const contentForSection = mergedSectionContent.filter((content) => content.section === section.identity);\r\n\r\n // If there is no content for this section, we skip it.\r\n if (contentForSection.length === 0) {\r\n return null; // No content for this section\r\n }\r\n\r\n // Sort the content for this section by order, defaulting to 0 if not specified.\r\n contentForSection.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n\r\n // Return the section with its identity, collapseByDefault flag, and the content components to render.\r\n return {\r\n identity: section.identity,\r\n collapseByDefault: section.collapseByDefault ?? false,\r\n components: contentForSection.map((content) => <content.component key={content.key} context={context} />),\r\n };\r\n })\r\n .filter((section) => section !== null);\r\n }, [mergedSections, mergedSectionContent, context]);\r\n\r\n const [highlightSections, setHighlightSections] = useState<readonly string[]>();\r\n\r\n // When the context changes, clear any existing highlights.\r\n useLayoutEffect(() => {\r\n setHighlightSections(undefined);\r\n }, [context]);\r\n\r\n // This just assigns the returned object to any type of React ref, whether it is\r\n // a mutable ref with a 'current' property or whether it is a callback, useImperativeHandle\r\n // will deal with it.\r\n useImperativeHandle(sectionsRef, () => {\r\n return {\r\n highlightSections: (sectionsToHighlight: readonly string[]) => {\r\n if (sectionsToHighlight.length > 0) {\r\n setHighlightSections(sectionsToHighlight);\r\n }\r\n },\r\n };\r\n }, []);\r\n\r\n return (\r\n <div className={classes.rootDiv}>\r\n {visibleSections.length > -1 && (\r\n <UXContextProvider>\r\n <Accordion highlightSections={highlightSections} {...rest}>\r\n {...visibleSections.map((section) => {\r\n return (\r\n <AccordionSection key={section.identity} title={section.identity} collapseByDefault={section.collapseByDefault}>\r\n {section.components}\r\n </AccordionSection>\r\n );\r\n })}\r\n </Accordion>\r\n </UXContextProvider>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { type ComponentProps, forwardRef } from \"react\";\r\n\r\nimport { makeStyles, mergeClasses, tokens } from \"@fluentui/react-components\";\r\n\r\nconst useStyles = makeStyles({\r\n paneRootDiv: {\r\n display: \"flex\",\r\n flex: 1,\r\n flexDirection: \"column\",\r\n padding: `0 ${tokens.spacingHorizontalM}`,\r\n },\r\n});\r\n\r\n/**\r\n * Used to apply common styles to panes.\r\n */\r\nexport const SidePaneContainer = forwardRef<HTMLDivElement, ComponentProps<\"div\">>((props, ref) => {\r\n const { className, ...rest } = props;\r\n const classes = useStyles();\r\n\r\n return (\r\n <div className={mergeClasses(classes.paneRootDiv, className)} ref={ref} {...rest}>\r\n {props.children}\r\n </div>\r\n );\r\n});\r\n","import { type IReadonlyObservable } from \"core/index\";\r\nimport { type IService } from \"../modularity/serviceDefinition\";\r\n\r\nimport { DataStorage } from \"core/Misc/dataStorage\";\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\n/**\r\n * The unique identity symbol for the settings store service.\r\n */\r\nexport const SettingsStoreIdentity = Symbol(\"SettingsStore\");\r\n\r\n/**\r\n * Describes a setting by its key and default value.\r\n */\r\nexport type SettingDescriptor<T> = {\r\n /**\r\n * The unique key used to identify this setting in the store.\r\n */\r\n readonly key: string;\r\n\r\n /**\r\n * The default value to use when the setting has not been explicitly set.\r\n */\r\n readonly defaultValue: T;\r\n};\r\n\r\n/**\r\n * Provides a key-value store for persisting user settings.\r\n */\r\nexport interface ISettingsStore extends IService<typeof SettingsStoreIdentity> {\r\n /**\r\n * An observable that notifies when a setting has changed, providing the key of the changed setting.\r\n */\r\n onChanged: IReadonlyObservable<string>;\r\n\r\n /**\r\n * Reads a setting from the store.\r\n * @param descriptor The descriptor of the setting to read.\r\n * @returns The current value of the setting, or the default value if it has not been set.\r\n */\r\n readSetting<T>(descriptor: SettingDescriptor<T>): T;\r\n\r\n /**\r\n * Writes a setting to the store.\r\n * @param descriptor The descriptor of the setting to write.\r\n * @param value The value to write.\r\n */\r\n writeSetting<T>(descriptor: SettingDescriptor<T>, value: T): void;\r\n}\r\n\r\nfunction GetKey(namespace: string, settingKey: string) {\r\n return `Babylon/${namespace}/${settingKey}`;\r\n}\r\n\r\n/**\r\n * Default implementation of {@link ISettingsStore} that persists settings using browser local storage.\r\n */\r\nexport class SettingsStore implements ISettingsStore {\r\n private readonly _onChanged = new Observable<Readonly<string>>();\r\n\r\n /**\r\n * Creates a new settings store.\r\n * @param _namespace A namespace used to scope the settings keys to avoid collisions with other stores.\r\n */\r\n public constructor(private readonly _namespace: string) {}\r\n\r\n public get onChanged(): IReadonlyObservable<Readonly<string>> {\r\n return this._onChanged;\r\n }\r\n\r\n public readSetting<T>(descriptor: SettingDescriptor<T>): T {\r\n const key = GetKey(this._namespace, descriptor.key);\r\n return DataStorage.ReadJson(key, descriptor.defaultValue);\r\n }\r\n\r\n public writeSetting<T>(descriptor: SettingDescriptor<T>, value: T): void {\r\n const key = GetKey(this._namespace, descriptor.key);\r\n DataStorage.WriteJson(key, value);\r\n this._onChanged.notifyObservers(descriptor.key);\r\n }\r\n}\r\n","import { type BrandVariants, type Theme, createDarkTheme, createLightTheme } from \"@fluentui/react-components\";\r\n\r\n// Generated from https://react.fluentui.dev/?path=/docs/theme-theme-designer--docs\r\n// Key color: #3A94FC\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nconst BabylonRamp: BrandVariants = {\r\n 10: \"#020305\",\r\n 20: \"#121721\",\r\n 30: \"#1A263A\",\r\n 40: \"#1F314F\",\r\n 50: \"#243E64\",\r\n 60: \"#294B7B\",\r\n 70: \"#2D5892\",\r\n 80: \"#3166AA\",\r\n 90: \"#3473C3\",\r\n 100: \"#3782DC\",\r\n 110: \"#3990F6\",\r\n 120: \"#5A9EFD\",\r\n 130: \"#7BACFE\",\r\n 140: \"#96BAFF\",\r\n 150: \"#AFC9FF\",\r\n 160: \"#C6D8FF\",\r\n};\r\n/* eslint-enable @typescript-eslint/naming-convention */\r\n\r\nconst BaseLightTheme = createLightTheme(BabylonRamp);\r\nexport const LightTheme: Theme = {\r\n ...BaseLightTheme,\r\n // Reduce the max contrast between foreground and background by just replacing the most intense foreground color with the second most intense one.\r\n colorNeutralForeground1: BaseLightTheme.colorNeutralForeground2,\r\n};\r\n\r\nconst BaseDarkTheme = createDarkTheme(BabylonRamp);\r\nexport const DarkTheme: Theme = {\r\n ...BaseDarkTheme,\r\n // Reduce the max contrast between foreground and background by just replacing the most intense foreground color with the second most intense one.\r\n colorNeutralForeground1: BaseDarkTheme.colorNeutralForeground2,\r\n};\r\n","import { type Theme } from \"@fluentui/react-components\";\r\n\r\nimport { type IDisposable, type IObserver, type IReadonlyObservable } from \"core/index\";\r\nimport { type IService, type ServiceDefinition } from \"../modularity/serviceDefinition\";\r\nimport { type ISettingsStore, type SettingDescriptor, SettingsStoreIdentity } from \"./settingsStore\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { DarkTheme, LightTheme } from \"../themes/babylonTheme\";\r\n\r\n/**\r\n * Represents the theme mode preference.\r\n */\r\nexport type ThemeMode = \"system\" | \"light\" | \"dark\";\r\n\r\n/**\r\n * The setting descriptor for persisting the theme mode preference.\r\n */\r\nexport const ThemeModeSettingDescriptor: SettingDescriptor<ThemeMode> = {\r\n key: \"ThemeMode\",\r\n defaultValue: \"system\",\r\n};\r\n\r\n/**\r\n * Resolves the current theme based on user preference and system settings.\r\n * Listens for changes to both the persisted theme mode and the OS-level dark mode preference.\r\n */\r\nexport class ThemeResolver implements IDisposable {\r\n private readonly _darkModeMediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\r\n private readonly _onChanged = new Observable<void>();\r\n private readonly _onDarkModeMediaQueryChange = () => this._onChanged.notifyObservers();\r\n private readonly _settingsStoreObserver: IObserver;\r\n\r\n public constructor(private readonly _settingsStore: ISettingsStore) {\r\n this._darkModeMediaQuery.addEventListener(\"change\", this._onDarkModeMediaQueryChange);\r\n this._settingsStoreObserver = this._settingsStore.onChanged.add((key) => {\r\n if (key === ThemeModeSettingDescriptor.key) {\r\n this._onChanged.notifyObservers();\r\n }\r\n });\r\n }\r\n\r\n public get onChanged(): IReadonlyObservable<void> {\r\n return this._onChanged;\r\n }\r\n\r\n public get mode(): ThemeMode {\r\n return this._settingsStore.readSetting(ThemeModeSettingDescriptor);\r\n }\r\n\r\n public set mode(value: ThemeMode) {\r\n if (value !== this.mode) {\r\n this._settingsStore.writeSetting(ThemeModeSettingDescriptor, value);\r\n }\r\n }\r\n\r\n public get isDark() {\r\n const themeMode = this.mode;\r\n return themeMode === \"dark\" || (themeMode === \"system\" && this._darkModeMediaQuery.matches);\r\n }\r\n\r\n public toggle() {\r\n this.mode = this.isDark ? \"light\" : \"dark\";\r\n }\r\n\r\n public dispose() {\r\n this._onChanged.clear();\r\n this._darkModeMediaQuery.removeEventListener(\"change\", this._onDarkModeMediaQueryChange);\r\n this._settingsStoreObserver.remove();\r\n }\r\n}\r\n\r\n/**\r\n * The unique identity symbol for the theme service.\r\n */\r\nexport const ThemeServiceIdentity = Symbol(\"ThemeService\");\r\n\r\n/**\r\n * Exposes the current theme used by the application.\r\n */\r\nexport interface IThemeService extends IService<typeof ThemeServiceIdentity> {\r\n /**\r\n * Whether the current theme is the dark variant or not.\r\n */\r\n readonly isDark: boolean;\r\n\r\n /**\r\n * The current theme mode, which can be either \"light\", \"dark\" or \"system\". When set to \"system\", the theme will match the user's OS-level preference and update automatically when it changes.\r\n */\r\n mode: ThemeMode;\r\n\r\n /**\r\n * Toggles the theme mode between light and dark. If the current mode is \"system\", it will toggle based on the current OS-level preference.\r\n */\r\n toggle(): void;\r\n\r\n /**\r\n * The current theme used by the application.\r\n */\r\n readonly theme: Theme;\r\n\r\n /**\r\n * Observable that fires whenever the theme changes.\r\n */\r\n readonly onChanged: IReadonlyObservable<void>;\r\n}\r\n\r\nexport const ThemeServiceDefinition: ServiceDefinition<[IThemeService], [ISettingsStore]> = {\r\n friendlyName: \"Theme Service\",\r\n produces: [ThemeServiceIdentity],\r\n consumes: [SettingsStoreIdentity],\r\n factory: (settingsStore) => {\r\n const themeResolver = new ThemeResolver(settingsStore);\r\n return Object.assign(themeResolver, {\r\n get theme() {\r\n return themeResolver.isDark ? DarkTheme : LightTheme;\r\n },\r\n });\r\n },\r\n};\r\n","import { type DependencyList, useRef, useEffect, useState } from \"react\";\r\nimport { type IDisposable } from \"core/index\";\r\n\r\n/**\r\n * Custom hook to manage a resource with automatic disposal. The resource is created once initially, and recreated\r\n * if the factory function or any dependency changes. Whenever the resource is recreated, the previous instance is\r\n * disposed. The final instance is disposed when the component using this hook unmounts.\r\n * @param factory A function that creates the resource.\r\n * @param deps An optional dependency list. When any dependency changes, the resource is disposed and recreated.\r\n * @returns The created resource.\r\n */\r\nexport function useResource<T extends IDisposable | null | undefined>(factory: () => T, deps?: DependencyList): T {\r\n const resourceRef = useRef<T>();\r\n const factoryRef = useRef(factory);\r\n const depsRef = useRef(deps);\r\n const initializedRef = useRef(false);\r\n\r\n // Initialize resource synchronously on first call, when factory changes, or when deps change\r\n if (!initializedRef.current || factoryRef.current !== factory || !DepsEqual(depsRef.current, deps)) {\r\n // Dispose old resource if it exists\r\n resourceRef.current?.dispose();\r\n\r\n // Create new resource\r\n resourceRef.current = factory();\r\n initializedRef.current = true;\r\n }\r\n\r\n // Update refs to capture latest values\r\n factoryRef.current = factory;\r\n depsRef.current = deps;\r\n\r\n // Cleanup effect for component unmount\r\n useEffect(() => {\r\n return () => {\r\n resourceRef.current?.dispose();\r\n resourceRef.current = undefined;\r\n };\r\n }, []);\r\n\r\n return resourceRef.current as T;\r\n}\r\n\r\n/**\r\n * Custom hook to manage an asynchronous resource with automatic disposal. The resource is created once initially, and recreated\r\n * if the factory function or any dependency changes. Whenever the resource is recreated, the previous instance is\r\n * disposed. The final instance is disposed when the component using this hook unmounts.\r\n * @param factory A function that creates the resource.\r\n * @param deps An optional dependency list. When any dependency changes, the resource is disposed and recreated.\r\n * @returns The created resource.\r\n */\r\nexport function useAsyncResource<T extends IDisposable | null | undefined>(factory: (abortSignal: AbortSignal) => Promise<T>, deps?: DependencyList): T | undefined {\r\n const [resource, setResource] = useState<T | undefined>();\r\n const factoryRef = useRef(factory);\r\n\r\n // Update refs to capture latest values\r\n factoryRef.current = factory;\r\n\r\n useEffect(() => {\r\n const abortController = new AbortController();\r\n\r\n // Dispose old resource if it exists\r\n resource?.dispose();\r\n setResource(undefined);\r\n\r\n // Create new resource\r\n void (async () => {\r\n try {\r\n const newVal = await factory(abortController.signal);\r\n if (!abortController.signal.aborted) {\r\n setResource(newVal); // This will trigger a re-render so the new resource is returned to caller\r\n } else {\r\n newVal?.dispose();\r\n }\r\n } catch (error) {\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n return;\r\n }\r\n }\r\n })();\r\n\r\n return () => {\r\n abortController.abort();\r\n resource?.dispose();\r\n setResource(undefined);\r\n };\r\n }, [factory, ...(deps ?? [])]);\r\n\r\n return resource;\r\n}\r\n\r\n/**\r\n * Compares two dependency lists for equality.\r\n * @param a The first dependency list.\r\n * @param b The second dependency list.\r\n * @returns True if the dependency lists are equal.\r\n */\r\nfunction DepsEqual(a: DependencyList | undefined, b: DependencyList | undefined): boolean {\r\n if (a === b) {\r\n return true;\r\n }\r\n if (a === undefined || b === undefined) {\r\n return false;\r\n }\r\n if (a.length !== b.length) {\r\n return false;\r\n }\r\n for (let i = 0; i < a.length; i++) {\r\n if (!Object.is(a[i], b[i])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n","import { type ThemeMode, ThemeModeSettingDescriptor, ThemeResolver } from \"../services/themeService\";\r\n\r\nimport { useCallback } from \"react\";\r\n\r\nimport { useSettingsStore } from \"../contexts/settingsContext\";\r\nimport { DarkTheme, LightTheme } from \"../themes/babylonTheme\";\r\nimport { useObservableState } from \"./observableHooks\";\r\nimport { useResource } from \"./resourceHooks\";\r\n\r\n/**\r\n * Hook that provides the current theme mode state and controls for changing it.\r\n * @returns An object with the current dark mode state, theme mode, and functions to set or toggle the theme.\r\n */\r\nexport function useThemeMode() {\r\n const settingsStore = useSettingsStore();\r\n const themeResolver = useResource(useCallback(() => (settingsStore ? new ThemeResolver(settingsStore) : undefined), [settingsStore]));\r\n\r\n const state = useObservableState(\r\n useCallback(\r\n () =>\r\n ({\r\n isDarkMode: themeResolver?.isDark ?? false,\r\n themeMode: themeResolver?.mode ?? ThemeModeSettingDescriptor.defaultValue,\r\n setThemeMode: (mode: ThemeMode) => {\r\n if (themeResolver) {\r\n themeResolver.mode = mode;\r\n }\r\n },\r\n toggleThemeMode: () => themeResolver?.toggle(),\r\n }) as const,\r\n [themeResolver]\r\n ),\r\n themeResolver?.onChanged\r\n );\r\n\r\n if (!themeResolver) {\r\n throw new Error(\"Settings store is not available in context.\");\r\n }\r\n\r\n return state;\r\n}\r\n\r\n/**\r\n * Hook that returns the current Fluent UI theme based on the active theme mode.\r\n * @param invert If true, inverts the theme (returns light theme in dark mode and vice versa). Defaults to false.\r\n * @returns The current Fluent UI theme object.\r\n */\r\nexport function useTheme(invert = false) {\r\n const { isDarkMode } = useThemeMode();\r\n return isDarkMode !== invert ? DarkTheme : LightTheme;\r\n}\r\n","import {\r\n type FluentProviderProps,\r\n type GriffelRenderer,\r\n FluentProvider,\r\n RendererProvider,\r\n createDOMRenderer,\r\n makeStyles,\r\n mergeClasses,\r\n tokens,\r\n useFluent,\r\n} from \"@fluentui/react-components\";\r\nimport { type FunctionComponent, useMemo } from \"react\";\r\n\r\nimport { useTheme } from \"../hooks/themeHooks\";\r\n\r\n// Fluent doesn't apply styling to scrollbars by default, so provide our own reasonable default.\r\nconst useStyles = makeStyles({\r\n root: {\r\n scrollbarColor: `${tokens.colorNeutralForeground3} ${tokens.colorTransparentBackground}`,\r\n },\r\n});\r\n\r\n/**\r\n * A themed Fluent UI provider that applies the current theme mode (light or dark).\r\n * @param props Fluent provider props, plus an optional `invert` flag to swap the theme.\r\n * When `targetDocument` is provided and differs from the inherited Fluent\r\n * document (e.g. when rendering into a popup window), a Griffel renderer\r\n * scoped to that document is created so styles are injected into it.\r\n * When omitted, `targetDocument` is inherited from the ambient Fluent\r\n * context so nested Theme components do not lose cross-window targeting.\r\n * @returns The themed Fluent UI provider component.\r\n */\r\nexport const Theme: FunctionComponent<FluentProviderProps & { invert?: boolean }> = (props) => {\r\n // NOTE: We do not want to applyStylesToPortals by default. It makes classes flow into portals\r\n // (like popovers), and if those styles do things like disable overflow, they can completely\r\n // break any UI within the portal. Therefore, default to false.\r\n const { invert = false, applyStylesToPortals = false, className, targetDocument: explicitTargetDocument, ...rest } = props;\r\n const theme = useTheme(invert);\r\n const classes = useStyles();\r\n\r\n // Resolve the target document from the explicit prop or fall back to the ambient Fluent context.\r\n // This makes nested <Theme> components automatically inherit cross-window targeting from a\r\n // top-level <Theme targetDocument={popupDocument}> wrapper.\r\n const inheritedTargetDocument = useFluent().targetDocument;\r\n const resolvedTargetDocument = explicitTargetDocument ?? inheritedTargetDocument;\r\n\r\n // Only create a new Griffel renderer when the resolved document differs from the inherited\r\n // one. In the common (main-window, no nesting) case, this leaves Fluent's default renderer\r\n // and renderer provider in place — matching the original behaviour exactly.\r\n const renderer = useMemo<GriffelRenderer | undefined>(() => {\r\n if (resolvedTargetDocument && resolvedTargetDocument !== inheritedTargetDocument) {\r\n return createDOMRenderer(resolvedTargetDocument);\r\n }\r\n return undefined;\r\n }, [resolvedTargetDocument, inheritedTargetDocument]);\r\n\r\n const fluent = (\r\n <FluentProvider\r\n theme={theme}\r\n className={mergeClasses(classes.root, className)}\r\n applyStylesToPortals={applyStylesToPortals}\r\n targetDocument={resolvedTargetDocument}\r\n {...rest}\r\n >\r\n {props.children}\r\n </FluentProvider>\r\n );\r\n\r\n if (renderer && resolvedTargetDocument) {\r\n return (\r\n <RendererProvider renderer={renderer} targetDocument={resolvedTargetDocument}>\r\n {fluent}\r\n </RendererProvider>\r\n );\r\n }\r\n\r\n return fluent;\r\n};\r\n","import { type FunctionComponent } from \"react\";\r\nimport { type MakePopoverTeachingMoment } from \"../hooks/teachingMomentHooks\";\r\n\r\nimport { makeStyles, TeachingPopover, TeachingPopoverBody, TeachingPopoverHeader, TeachingPopoverSurface } from \"@fluentui/react-components\";\r\n\r\nconst useStyles = makeStyles({\r\n extensionTeachingPopover: {\r\n maxWidth: \"320px\",\r\n },\r\n});\r\n\r\n/**\r\n * The state returned by the teaching moment hook.\r\n */\r\ntype TeachingMomentState = ReturnType<ReturnType<typeof MakePopoverTeachingMoment>>;\r\n\r\n/**\r\n * Props for the {@link TeachingMoment} component.\r\n */\r\ntype TeachingMomentProps = Pick<TeachingMomentState, \"shouldDisplay\" | \"positioningRef\" | \"onOpenChange\"> & {\r\n title: string;\r\n description: string;\r\n};\r\n\r\n/**\r\n * A component that displays a teaching moment popover.\r\n * @param props Props for the teaching moment popover.\r\n * @returns The teaching moment popover.\r\n */\r\nexport const TeachingMoment: FunctionComponent<TeachingMomentProps> = ({ shouldDisplay, positioningRef, onOpenChange, title, description }) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <TeachingPopover appearance=\"brand\" open={shouldDisplay} positioning={{ positioningRef }} onOpenChange={onOpenChange}>\r\n <TeachingPopoverSurface className={classes.extensionTeachingPopover}>\r\n <TeachingPopoverHeader>{title}</TeachingPopoverHeader>\r\n <TeachingPopoverBody>{description}</TeachingPopoverBody>\r\n </TeachingPopoverSurface>\r\n </TeachingPopover>\r\n );\r\n};\r\n","import { type Observable } from \"core/index\";\r\n\r\nimport { createContext, useCallback, useContext } from \"react\";\r\n\r\n/**\r\n * Describes a property change event, including the entity, the property key, and the old and new values.\r\n */\r\nexport type PropertyChangeInfo = {\r\n /** The entity whose property was changed. */\r\n readonly entity: unknown;\r\n /** The key of the property that was changed. */\r\n readonly propertyKey: PropertyKey;\r\n /** The value of the property before the change. */\r\n readonly oldValue: unknown;\r\n /** The value of the property after the change. */\r\n readonly newValue: unknown;\r\n};\r\n\r\n/**\r\n * Context that provides an observable for property change notifications within the inspector.\r\n */\r\nexport type PropertyContext = {\r\n /** An observable that fires whenever a property is changed through the inspector UI. */\r\n readonly onPropertyChanged: Observable<PropertyChangeInfo>;\r\n};\r\n\r\n/**\r\n * React context for accessing the property change observable.\r\n */\r\nexport const PropertyContext = createContext<PropertyContext | undefined>(undefined);\r\n\r\n/**\r\n * Hook that returns a callback to notify the property context when a property has been changed.\r\n * @returns A function that accepts (entity, propertyKey, oldValue, newValue) and notifies observers.\r\n */\r\nexport function usePropertyChangedNotifier() {\r\n const propertyContext = useContext(PropertyContext);\r\n return useCallback(\r\n (entity: unknown, propertyKey: PropertyKey, oldValue: unknown, newValue: unknown) => {\r\n propertyContext?.onPropertyChanged.notifyObservers({ entity, propertyKey, oldValue, newValue });\r\n },\r\n [propertyContext]\r\n );\r\n}\r\n","import { type IExtensionFeed, type ExtensionMetadata, type IExtensionMetadataQuery, type ExtensionModule } from \"./extensionFeed\";\r\n\r\nexport type BuiltInExtension = ExtensionMetadata & {\r\n /**\r\n * Gets the extension module, typically dynamically importing the extension.\r\n * @returns The extension module (e.g. a collection of ServiceDefinitions).\r\n */\r\n getExtensionModuleAsync(): Promise<ExtensionModule>;\r\n};\r\n\r\n/**\r\n * A simple extension feed implementation that provides a fixed set of \"built in\" extensions.\r\n * \"Built in\" in this context means extensions that are known at bundling time, and included\r\n * in the bundle. Each extension can be dynamically imported so they are split into separate\r\n * bundle chunks and downloaded only when first installed.\r\n */\r\nexport class BuiltInsExtensionFeed implements IExtensionFeed {\r\n private readonly _extensions: readonly BuiltInExtension[];\r\n\r\n public constructor(\r\n public readonly name: string,\r\n extensions: Iterable<BuiltInExtension>\r\n ) {\r\n this._extensions = Array.from(extensions);\r\n }\r\n\r\n public async queryExtensionsAsync(filter?: string): Promise<IExtensionMetadataQuery> {\r\n const filteredExtensions = filter ? this._extensions.filter((extension) => extension.name.includes(filter)) : this._extensions;\r\n return {\r\n totalCount: filteredExtensions.length,\r\n getExtensionMetadataAsync: async (index: number, count: number) => {\r\n return filteredExtensions.slice(index, index + count);\r\n },\r\n };\r\n }\r\n\r\n public async getExtensionModuleAsync(name: string): Promise<ExtensionModule | undefined> {\r\n const extension = this._extensions.find((ext) => ext.name === name);\r\n return extension ? await extension.getExtensionModuleAsync() : undefined;\r\n }\r\n}\r\n","import { type IDisposable, type Nullable } from \"core/index\";\r\n\r\n/**\r\n * Gets the property descriptor for a property on an object, including inherited properties.\r\n * @param target The object containing the property.\r\n * @param propertyKey The key of the property to get the descriptor for.\r\n * @returns The owner of the property (which may be different from the target in the case of inheritance) along with the property descriptor, or null if the property is not found.\r\n */\r\nexport function GetPropertyDescriptor<T extends object>(target: T, propertyKey: keyof T): Nullable<[owner: object, descriptor: PropertyDescriptor]> {\r\n let propertyOwner: object | null = target;\r\n let propertyDescriptor: PropertyDescriptor | undefined;\r\n while (propertyOwner) {\r\n if ((propertyDescriptor = Reflect.getOwnPropertyDescriptor(propertyOwner, propertyKey))) {\r\n break;\r\n }\r\n propertyOwner = Reflect.getPrototypeOf(propertyOwner);\r\n }\r\n\r\n if (propertyOwner && propertyDescriptor) {\r\n return [propertyOwner, propertyDescriptor];\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Checks if a property is readonly.\r\n * @param propertyDescriptor The property descriptor to check.\r\n * @returns True if the property is readonly, false otherwise.\r\n */\r\nexport function IsPropertyReadonly(propertyDescriptor: PropertyDescriptor): boolean {\r\n // If the property is not writable, it is readonly.\r\n return propertyDescriptor.writable === false || (propertyDescriptor.writable === undefined && !propertyDescriptor.set);\r\n}\r\n\r\n/**\r\n * Hooks that can be registered on a property to intercept its setter.\r\n */\r\nexport type PropertyHooks<T = unknown> = {\r\n /**\r\n * This function will be called after the hooked property is set.\r\n * @param value The new value that was set on the property.\r\n */\r\n afterSet?: (value: T) => void;\r\n};\r\n\r\ntype PropertyInterception = {\r\n readonly hooks: PropertyHooks<unknown>[];\r\n readonly propertyOwner: object;\r\n readonly propertyDescriptor: PropertyDescriptor;\r\n readonly wasPropertyDefined: boolean;\r\n};\r\n\r\nconst InterceptorHooksMaps = new WeakMap<object, Map<PropertyKey, PropertyInterception>>();\r\n\r\n/**\r\n * Intercepts a property on an object and allows you to add hooks that will be called when the property is get or set.\r\n * @param target The object containing the property to intercept.\r\n * @param propertyKey The key of the property to intercept.\r\n * @param hooks The hooks to call when the property is get or set.\r\n * @returns A disposable that removes the hooks when disposed and returns the object to its original state.\r\n */\r\n// This overload only matches when K is a specific literal key (not a union like keyof T)\r\nexport function InterceptProperty<T extends object, K extends keyof T>(\r\n target: T,\r\n propertyKey: string extends K ? never : number extends K ? never : symbol extends K ? never : K,\r\n hooks: PropertyHooks<NonNullable<T[K]>>\r\n): IDisposable;\r\n// Fallback overload for generic/dynamic cases where the property type cannot be inferred\r\nexport function InterceptProperty<T extends object>(target: T, propertyKey: keyof T, hooks: PropertyHooks): IDisposable;\r\n/** @internal */\r\nexport function InterceptProperty<T extends object>(target: T, propertyKey: keyof T, hooks: PropertyHooks): IDisposable {\r\n let hooksMap = InterceptorHooksMaps.get(target);\r\n let interception = hooksMap?.get(propertyKey);\r\n\r\n if (!interception) {\r\n // Find the property descriptor and note the owning object (might be inherited through the prototype chain).\r\n const ownerAndDescriptor = GetPropertyDescriptor(target, propertyKey);\r\n\r\n // If the property does not exist, we'll define one transiently directly on the target object.\r\n const [propertyOwner, propertyDescriptor] = ownerAndDescriptor ?? [\r\n target,\r\n {\r\n configurable: true,\r\n enumerable: true,\r\n writable: true,\r\n value: undefined,\r\n },\r\n ];\r\n\r\n if (!ownerAndDescriptor) {\r\n Reflect.defineProperty(propertyOwner, propertyKey, propertyDescriptor);\r\n } else {\r\n // If the property is not configurable, it cannot be intercepted.\r\n if (!propertyDescriptor.configurable) {\r\n throw new Error(`Property \"${propertyKey.toString()}\" of object \"${target}\" is not configurable.`);\r\n }\r\n\r\n // If the property is not writable, it cannot be intercepted, but it cannot be mutated anyway so there is no need to intercept it.\r\n if (IsPropertyReadonly(propertyDescriptor)) {\r\n return {\r\n dispose: () => {},\r\n };\r\n }\r\n }\r\n\r\n const hooksForKey: PropertyHooks<unknown>[] = [];\r\n let { get: getValue, set: setValue } = propertyDescriptor;\r\n\r\n // We already checked that the property is writable, so if there is no setter, then it must be a value property.\r\n // In this case, getValue can return the direct value, and setValue can set the direct value.\r\n if (!setValue) {\r\n getValue = () => propertyDescriptor.value;\r\n setValue = (value: any) => (propertyDescriptor.value = value);\r\n }\r\n\r\n if (\r\n // Replace the property with a new one that calls the hooks in addition to the original getter and setter.\r\n !Reflect.defineProperty(target, propertyKey, {\r\n configurable: true,\r\n get: getValue\r\n ? function (this: unknown) {\r\n return getValue!.call(this);\r\n }\r\n : undefined,\r\n set: function (this: unknown, newValue: unknown) {\r\n setValue.call(this, newValue);\r\n for (const { afterSet } of hooksForKey!) {\r\n afterSet?.(newValue);\r\n }\r\n },\r\n })\r\n ) {\r\n throw new Error(`Failed to define new property \"${propertyKey.toString()}\" on object \"${target}\".`);\r\n }\r\n\r\n if (!hooksMap) {\r\n InterceptorHooksMaps.set(target, (hooksMap = new Map()));\r\n }\r\n hooksMap.set(\r\n propertyKey,\r\n (interception = {\r\n hooks: hooksForKey,\r\n propertyOwner,\r\n propertyDescriptor,\r\n wasPropertyDefined: !!ownerAndDescriptor,\r\n })\r\n );\r\n }\r\n if (!hooksMap) {\r\n throw new Error(`Property \"${propertyKey.toString()}\" of object \"${target}\" was not registered for interception.`);\r\n }\r\n const { hooks: hooksForKey, propertyOwner, propertyDescriptor, wasPropertyDefined } = interception;\r\n hooksForKey.push(hooks as PropertyHooks<unknown>);\r\n\r\n let isDisposed = false;\r\n return {\r\n dispose: () => {\r\n if (!isDisposed) {\r\n // Remove the hooks from the hooks array for the property key.\r\n hooksForKey.splice(hooksForKey.indexOf(hooks as PropertyHooks<unknown>), 1);\r\n\r\n // If there are no more hooks for the property key, remove the property from the hooks map.\r\n if (hooksForKey.length === 0) {\r\n hooksMap.delete(propertyKey);\r\n\r\n // If there are no more hooks for the target object, remove the hooks map from the WeakMap.\r\n if (hooksMap.size === 0) {\r\n InterceptorHooksMaps.delete(target);\r\n }\r\n\r\n const shouldRestorePropertyDescriptor =\r\n // Restore a property that was originally owned by the target,\r\n // or retain a transient property when a value was assigned while it was intercepted.\r\n propertyOwner === target && (wasPropertyDefined || target[propertyKey] !== undefined);\r\n\r\n if (shouldRestorePropertyDescriptor) {\r\n if (!Reflect.defineProperty(target, propertyKey, propertyDescriptor)) {\r\n throw new Error(`Failed to restore original property descriptor \"${propertyKey.toString()}\" on object \"${target}\".`);\r\n }\r\n } else {\r\n if (!Reflect.deleteProperty(target, propertyKey)) {\r\n throw new Error(`Failed to delete transient property descriptor \"${propertyKey.toString()}\" on object \"${target}\".`);\r\n }\r\n }\r\n }\r\n\r\n isDisposed = true;\r\n }\r\n },\r\n };\r\n}\r\n","import { type IDisposable } from \"core/index\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type IWatcherService } from \"../services/watcherService\";\r\n\r\nimport { createContext, useContext, useEffect, useState } from \"react\";\r\n\r\nimport { InterceptProperty } from \"../instrumentation/propertyInstrumentation\";\r\n\r\nconst DefaultRefreshObservable = new Observable<void>();\r\n\r\nconst DefaultWatcher: IWatcherService = {\r\n watchProperty<T extends object>(target: T, propertyKey: keyof T, onChanged: (value: unknown) => void): IDisposable {\r\n return InterceptProperty(target, propertyKey, {\r\n afterSet: (value) => onChanged(value),\r\n });\r\n },\r\n watchValue<T>(getValue: () => T, onChanged: (value: T) => void, equals: (left: T, right: T) => boolean = Object.is): IDisposable {\r\n let previousValue = getValue();\r\n const observer = DefaultRefreshObservable.add(() => {\r\n const currentValue = getValue();\r\n if (!equals(previousValue, currentValue)) {\r\n previousValue = currentValue;\r\n onChanged(currentValue);\r\n }\r\n });\r\n\r\n return {\r\n dispose: () => observer.remove(),\r\n };\r\n },\r\n refresh: () => DefaultRefreshObservable.notifyObservers(),\r\n};\r\n\r\nexport const WatcherContext = createContext<IWatcherService>(DefaultWatcher);\r\n\r\nexport function useWatcher() {\r\n return useContext(WatcherContext);\r\n}\r\n\r\n/**\r\n * Reads a computed value and keeps it synchronized with Watcher refreshes.\r\n * @param target The object from which the value is computed.\r\n * @param getValue A stable function that computes the value from the target.\r\n * @returns The latest computed value.\r\n * @remarks Use this for inspected values that should honor the Preferred Watch Mode. Use\r\n * `useObservableState` directly when the source exposes a precise change observable, or combine\r\n * `usePollingObservable` with `useObservableState` for telemetry that intentionally uses a fixed\r\n * cadence independent of Watch Mode.\r\n */\r\nexport function useWatchedValue<Target, Value>(target: Target, getValue: (target: Target) => Value): Value {\r\n const watcher = useWatcher();\r\n const [value, setValue] = useState(() => getValue(target));\r\n\r\n useEffect(() => {\r\n setValue(getValue(target));\r\n const registration = watcher.watchValue(() => getValue(target), setValue);\r\n return () => registration.dispose();\r\n }, [watcher, target, getValue]);\r\n\r\n return value;\r\n}\r\n","import { type IDisposable } from \"core/index\";\r\n\r\n/**\r\n * Hooks that can be registered on a function to intercept its execution.\r\n */\r\nexport type FunctionHooks<Args extends unknown[] = unknown[]> = {\r\n /**\r\n * This function will be called after the hooked function is called.\r\n * @param args The arguments that were passed to the original function.\r\n */\r\n afterCall?: (...args: Args) => void;\r\n};\r\n\r\nconst InterceptorHooksMaps = new WeakMap<object, Map<PropertyKey, FunctionHooks<unknown[]>[]>>();\r\n\r\n/**\r\n * Intercepts a function on an object and allows you to add hooks that will be called during function execution.\r\n * @param target The object containing the function to intercept.\r\n * @param propertyKey The key of the property that is a function (this is the function that will be intercepted).\r\n * @param hooks The hooks to call during the function execution.\r\n * @returns A disposable that removes the hooks when disposed and returns the object to its original state.\r\n */\r\n// This overload only matches when K is a specific literal key (not a union like keyof T)\r\nexport function InterceptFunction<T extends object, K extends keyof T>(\r\n target: T,\r\n propertyKey: string extends K ? never : number extends K ? never : symbol extends K ? never : K,\r\n hooks: NonNullable<T[K]> extends (...args: infer Args) => unknown ? FunctionHooks<Args> : FunctionHooks\r\n): IDisposable;\r\n// Fallback overload for generic/dynamic cases where the function type cannot be inferred\r\nexport function InterceptFunction<T extends object>(target: T, propertyKey: keyof T, hooks: FunctionHooks): IDisposable;\r\n/** @internal */\r\nexport function InterceptFunction<T extends object>(target: T, propertyKey: keyof T, hooks: FunctionHooks): IDisposable {\r\n if (!hooks.afterCall) {\r\n throw new Error(\"At least one hook must be provided.\");\r\n }\r\n\r\n const originalFunction = Reflect.get(target, propertyKey, target) as (...args: any) => any;\r\n if (typeof originalFunction !== \"function\") {\r\n throw new Error(`Property \"${propertyKey.toString()}\" of object \"${target}\" is not a function.`);\r\n }\r\n\r\n // Make sure the property is configurable and writable, otherwise it is immutable and cannot be intercepted.\r\n const propertyDescriptor = Reflect.getOwnPropertyDescriptor(target, propertyKey);\r\n if (propertyDescriptor) {\r\n if (!propertyDescriptor.configurable) {\r\n throw new Error(`Property \"${propertyKey.toString()}\" of object \"${target}\" is not configurable.`);\r\n }\r\n\r\n if (propertyDescriptor.writable === false || (propertyDescriptor.writable === undefined && !propertyDescriptor.set)) {\r\n throw new Error(`Property \"${propertyKey.toString()}\" of object \"${target}\" is readonly.`);\r\n }\r\n }\r\n\r\n // Get or create the hooks map for the target object.\r\n let hooksMap = InterceptorHooksMaps.get(target);\r\n if (!hooksMap) {\r\n InterceptorHooksMaps.set(target, (hooksMap = new Map()));\r\n }\r\n\r\n // Get or create the hooks array for the property key.\r\n let hooksForKey = hooksMap.get(propertyKey);\r\n if (!hooksForKey) {\r\n hooksMap.set(propertyKey, (hooksForKey = []));\r\n if (\r\n // Replace the function with a new one that calls the hooks in addition to the original function.\r\n !Reflect.set(target, propertyKey, function (this: unknown, ...args: unknown[]) {\r\n const result = Reflect.apply(originalFunction, this, args);\r\n for (const { afterCall } of hooksForKey!) {\r\n afterCall?.(...args);\r\n }\r\n return result;\r\n })\r\n ) {\r\n throw new Error(`Failed to define new function \"${propertyKey.toString()}\" on object \"${target}\".`);\r\n }\r\n }\r\n hooksForKey.push(hooks as FunctionHooks<unknown[]>);\r\n\r\n let isDisposed = false;\r\n return {\r\n dispose: () => {\r\n if (!isDisposed) {\r\n // Remove the hooks from the hooks array for the property key.\r\n hooksForKey.splice(hooksForKey.indexOf(hooks), 1);\r\n\r\n // If there are no more hooks for the property key, remove the property from the hooks map.\r\n if (hooksForKey.length === 0) {\r\n hooksMap.delete(propertyKey);\r\n\r\n // If there are no more hooks for the target object, remove the hooks map from the WeakMap.\r\n if (hooksMap.size === 0) {\r\n InterceptorHooksMaps.delete(target);\r\n }\r\n\r\n if (propertyDescriptor) {\r\n // If we have a property descriptor, it means the property was defined directly on the target object,\r\n // in which case we replaced it and the original property descriptor needs to be restored.\r\n if (!Reflect.defineProperty(target, propertyKey, propertyDescriptor)) {\r\n throw new Error(`Failed to restore original function \"${propertyKey.toString()}\" on object \"${target}\".`);\r\n }\r\n } else {\r\n // Otherwise, the property was inherited through the prototype chain, and so we can simply delete it from\r\n // the target object to allow it to fall back to the prototype chain as it did originally.\r\n if (!Reflect.deleteProperty(target, propertyKey)) {\r\n throw new Error(`Failed to delete transient function \"${propertyKey.toString()}\" on object \"${target}\".`);\r\n }\r\n }\r\n }\r\n\r\n isDisposed = true;\r\n }\r\n },\r\n };\r\n}\r\n","import { type IDisposable, type IReadonlyObservable, type Nullable } from \"core/index\";\r\n\r\nimport { useEffect, useMemo } from \"react\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\nimport { useWatcher } from \"../contexts/watcherContext\";\r\nimport { InterceptFunction } from \"../instrumentation/functionInstrumentation\";\r\n\r\n/**\r\n * Provides an observable that fires when a specified function/property is called/set.\r\n * @param type The type of the interceptor, either \"function\" or \"property\".\r\n * @param target The object containing the function/property to intercept.\r\n * @param propertyKey The key of the function/property to intercept.\r\n * @returns An observable that fires when the function/property is called/set.\r\n */\r\nexport function useInterceptObservable<T extends object>(type: \"function\" | \"property\", target: T | null | undefined, propertyKey: keyof T): IReadonlyObservable<void> {\r\n // Create a cached observable. It effectively has the lifetime of the component that uses this hook.\r\n const observable = useMemo(() => new Observable<void>(), []);\r\n\r\n const watcher = useWatcher();\r\n\r\n // Whenever the type, target, or property key changes, we need to set up a new interceptor.\r\n useEffect(() => {\r\n let interceptToken: Nullable<IDisposable> = null;\r\n\r\n if (target) {\r\n if (type === \"function\") {\r\n interceptToken = InterceptFunction(target, propertyKey, {\r\n afterCall: () => {\r\n observable.notifyObservers();\r\n },\r\n });\r\n } else if (type === \"property\") {\r\n interceptToken = watcher.watchProperty(target, propertyKey, () => observable.notifyObservers());\r\n } else {\r\n throw new Error(`Unknown interceptor type: ${type}`);\r\n }\r\n }\r\n\r\n // When the effect is cleaned up, we need to dispose of the interceptor.\r\n return () => {\r\n interceptToken?.dispose();\r\n };\r\n }, [type, target, propertyKey, observable]);\r\n\r\n return observable;\r\n}\r\n","import { type IReadonlyObservable } from \"core/index\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { useEffect, useMemo } from \"react\";\r\n\r\n/**\r\n * Creates a polling observable that notifies its observers at a specified interval.\r\n * @param delay The polling interval in milliseconds.\r\n * @returns A readonly observable that can be used to subscribe to polling notifications.\r\n * @remarks Combine this with `useObservableState` for telemetry and statistics that intentionally\r\n * refresh at a fixed cadence. For inspected values that should honor the user's Preferred Watch\r\n * Mode, use `useWatchedValue` instead.\r\n */\r\nexport function usePollingObservable(delay: number): IReadonlyObservable<void> {\r\n const observable = useMemo(() => new Observable<void>(), []);\r\n\r\n useEffect(() => {\r\n const intervalId = setInterval(() => {\r\n observable.notifyObservers();\r\n }, delay);\r\n\r\n return () => {\r\n clearInterval(intervalId);\r\n };\r\n }, [delay, observable]);\r\n\r\n return observable;\r\n}\r\n","import { type SettingDescriptor } from \"shared-ui-components/modularTool/services/settingsStore\";\r\n\r\nexport { CompactModeSettingDescriptor, DisableCopySettingDescriptor } from \"shared-ui-components/modularTool/services/globalSettings\";\r\n\r\n// These are all \"global\" settings that aren't produced/owned by a specific service,\r\n// so we just add them by default directly in the SettingsService.\r\n\r\nexport const UseDegreesSettingDescriptor: SettingDescriptor<boolean> = {\r\n key: \"UseDegrees\",\r\n defaultValue: true,\r\n};\r\n\r\nexport const UseEulerSettingDescriptor: SettingDescriptor<boolean> = {\r\n key: \"UseEuler\",\r\n defaultValue: true,\r\n};\r\n","import { useCallback } from \"react\";\r\n\r\nimport { useSetting } from \"shared-ui-components/modularTool/hooks/settingsHooks\";\r\nimport { UseDegreesSettingDescriptor } from \"../services/globalSettings\";\r\n\r\nconst RadiansToDegrees = 180 / Math.PI;\r\n\r\nfunction WrapAngle(angle: number) {\r\n angle %= Math.PI * 2;\r\n if (angle < 0) {\r\n angle += Math.PI * 2;\r\n }\r\n return angle;\r\n}\r\n\r\n/**\r\n * Gets functions used to convert to/from display values for angles based on the current settings.\r\n * @returns A tuple containing the functions to convert to and from display values.\r\n */\r\nexport function useAngleConverters() {\r\n const [useDegrees] = useSetting(UseDegreesSettingDescriptor);\r\n\r\n const toDisplayValue = useCallback(\r\n (angle: number, wrap = false) => {\r\n if (wrap) {\r\n angle = WrapAngle(angle);\r\n }\r\n return useDegrees ? angle * RadiansToDegrees : angle;\r\n },\r\n [useDegrees]\r\n );\r\n\r\n const fromDisplayValue = useCallback(\r\n (angle: number, wrap = false) => {\r\n angle = useDegrees ? angle / RadiansToDegrees : angle;\r\n if (wrap) {\r\n angle = WrapAngle(angle);\r\n }\r\n return angle;\r\n },\r\n [useDegrees]\r\n );\r\n\r\n return [toDisplayValue, fromDisplayValue, useDegrees] as const;\r\n}\r\n","import { createContext, useContext } from \"react\";\r\n\r\ntype TeachingMomentsContext = {\r\n /**\r\n * When true, all teaching moments are suppressed regardless of any caller-supplied\r\n * `suppress` argument and regardless of whether the user has previously dismissed\r\n * the teaching moment.\r\n */\r\n disabled: boolean;\r\n};\r\n\r\nexport const TeachingMomentsContext = createContext<TeachingMomentsContext>({ disabled: false });\r\n\r\n/**\r\n * Returns the teaching moments context provided by the surrounding modular tool framework.\r\n * @returns The current teaching moments context.\r\n */\r\nexport function useTeachingMomentsContext(): TeachingMomentsContext {\r\n return useContext(TeachingMomentsContext);\r\n}\r\n","import { type Nullable } from \"core/index\";\r\n\r\nimport { type OnOpenChangeData, type PositioningImperativeRef } from \"@fluentui/react-components\";\r\n\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useSetting } from \"./settingsHooks\";\r\nimport { useTeachingMomentsContext } from \"../contexts/teachingMomentsContext\";\r\n\r\nimport { AsyncLock } from \"core/Misc/asyncLock\";\r\nimport { Deferred } from \"core/Misc/deferred\";\r\n\r\nconst SequencerLock = new AsyncLock();\r\n\r\n/**\r\n * Creates a hook for managing teaching moment state.\r\n * @param name The unique name of the teaching moment.\r\n * @returns A hook that returns the teaching moment state.\r\n */\r\nexport function MakeTeachingMoment(name: string) {\r\n return (suppress?: boolean) => {\r\n const { disabled } = useTeachingMomentsContext();\r\n suppress = suppress || disabled;\r\n const [hasDisplayed, setHasDisplayed, resetDisplayed] = useSetting({ key: `TeachingMoments/${name}`, defaultValue: false });\r\n const [shouldDisplay, setShouldDisplay] = useState(false);\r\n\r\n const deferredRef = useRef<Deferred<void>>();\r\n\r\n useEffect(() => {\r\n if (!hasDisplayed && !suppress && !deferredRef.current) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n SequencerLock.lockAsync(async () => {\r\n deferredRef.current = new Deferred<void>();\r\n setShouldDisplay(true);\r\n // Just hold the lock until the hook cleanup, which is effectively component unmount (e.g. the teaching moment is dismissed).\r\n await deferredRef.current.promise;\r\n });\r\n }\r\n\r\n return () => {\r\n deferredRef.current?.resolve();\r\n };\r\n }, [hasDisplayed, suppress]);\r\n\r\n const onDismissed = useCallback(() => {\r\n setHasDisplayed(true);\r\n deferredRef.current?.resolve();\r\n deferredRef.current = undefined;\r\n setShouldDisplay(false);\r\n }, []);\r\n\r\n return {\r\n shouldDisplay,\r\n onDismissed,\r\n reset: resetDisplayed,\r\n } as const;\r\n };\r\n}\r\n\r\n/**\r\n * Creates a hook for managing teaching moment state for a dialog.\r\n * @param name The unique name of the teaching moment.\r\n * @returns A hook that returns the teaching moment state for a dialog.\r\n */\r\nexport function MakeDialogTeachingMoment(name: string) {\r\n const useTeachingMoment = MakeTeachingMoment(name);\r\n\r\n return (suppress?: boolean) => {\r\n const { shouldDisplay, onDismissed, reset } = useTeachingMoment(suppress);\r\n\r\n const onOpenChange = useCallback((e: unknown, data: OnOpenChangeData) => {\r\n if (!data.open) {\r\n onDismissed();\r\n }\r\n }, []);\r\n\r\n return {\r\n shouldDisplay,\r\n onOpenChange,\r\n reset,\r\n } as const;\r\n };\r\n}\r\n\r\n/**\r\n * Creates a hook for managing teaching moment state for a popover.\r\n * @param name The unique name of the teaching moment.\r\n * @returns A hook that returns the teaching moment state for a popover.\r\n */\r\nexport function MakePopoverTeachingMoment(name: string) {\r\n const useDialogTeachingMoment = MakeDialogTeachingMoment(name);\r\n\r\n return (suppress?: boolean) => {\r\n const [target, setTarget] = useState<Nullable<HTMLElement>>(null);\r\n const [positioningRef, setPositioningRef] = useState<Nullable<PositioningImperativeRef>>(null);\r\n\r\n const { shouldDisplay, onOpenChange, reset } = useDialogTeachingMoment(suppress || !target || !positioningRef);\r\n\r\n useEffect(() => {\r\n if (target && positioningRef) {\r\n positioningRef.setTarget(target);\r\n }\r\n }, [target, positioningRef]);\r\n\r\n return {\r\n shouldDisplay,\r\n positioningRef: setPositioningRef,\r\n targetRef: setTarget,\r\n onOpenChange,\r\n reset,\r\n } as const;\r\n };\r\n}\r\n","import { type IDisposable } from \"core/index\";\r\n\r\n/**\r\n * A helper to create a service factory function from a class constructor.\r\n * @param constructor The class to create a factory function for.\r\n * @returns A factory function that creates an instance of the class.\r\n */\r\nexport function ConstructorFactory<Class extends new (...args: any) => any>(constructor: Class): (...args: ConstructorParameters<Class>) => InstanceType<Class> {\r\n return (...args: ConstructorParameters<Class>) => new constructor(...args);\r\n}\r\n\r\n// This allows us to map from a service contract back to a contract identity.\r\nconst Contract = Symbol();\r\n/**\r\n * This interface must be implemented by all service contracts.\r\n */\r\nexport interface IService<ContractIdentity extends symbol> {\r\n /**\r\n * @internal\r\n */\r\n readonly [Contract]?: ContractIdentity;\r\n}\r\n\r\n// This utility type extracts the service identity (unique symbol type) from a service contract. That is, it extracts T from IService<T>.\r\ntype ExtractContractIdentity<ServiceContract extends IService<symbol>> = ServiceContract extends IService<infer ContractIdentity> ? ContractIdentity : never;\r\n\r\n// This utility type extracts the contract identities from an array of service contracts. That is, it extracts [T1, T2, ...] from [IService<T1>, IService<T2>, ...].\r\ntype ExtractContractIdentities<ServiceContracts extends IService<symbol>[]> = {\r\n [Index in keyof ServiceContracts]: ExtractContractIdentity<ServiceContracts[Index]>;\r\n};\r\n\r\n// This utility type converts a union of types into an intersection of types. That is, it converts T1 | T2 | ... into T1 & T2 & ...\r\n// This is specifically used to determine the type that a service factory function returns when it produces multiple services.\r\ntype UnionToIntersection<Union> = (Union extends any ? (k: Union) => void : never) extends (k: infer Intersection) => void ? Intersection : never;\r\n\r\n/**\r\n * A factory function responsible for creating a service instance.\r\n * Consumed services are passed as arguments to the factory function.\r\n * The returned value must implement all produced services, and may implement IDisposable.\r\n * If no services are produced, the returned value may implement IDisposable, otherwise it may return void.\r\n */\r\nexport type ServiceFactory<Produces extends IService<symbol>[], Consumes extends IService<symbol>[]> = (\r\n ...dependencies: [...Consumes]\r\n) => Produces extends [] ? Partial<IDisposable> | void : Partial<IDisposable> & UnionToIntersection<Produces[number]>;\r\n\r\n/**\r\n * Defines a service, which is a logical unit that consumes other services (dependencies), and optionally produces services that can be consumed by other services (dependents).\r\n */\r\nexport type ServiceDefinition<Produces extends IService<symbol>[] = [], Consumes extends IService<symbol>[] = []> = {\r\n /**\r\n * A human readable name for the service to help with debugging.\r\n */\r\n friendlyName: string;\r\n\r\n /**\r\n * A function that instantiates the service.\r\n */\r\n factory: ServiceFactory<Produces, Consumes>;\r\n} & (Produces extends []\r\n ? {\r\n /**\r\n * An empty list or undefined, since the type specification has indicated no contracts are produced.\r\n */\r\n produces?: [];\r\n }\r\n : {\r\n /**\r\n * The list of contract identities that this service produces for consumption by other services.\r\n */\r\n produces: ExtractContractIdentities<Produces>;\r\n }) &\r\n (Consumes extends []\r\n ? {\r\n /**\r\n * An empty list or undefined, since the type specification has indicated that no other services are consumed.\r\n */\r\n consumes?: [];\r\n }\r\n : {\r\n /**\r\n * The list of contract identities of other services that this service consumes.\r\n */\r\n consumes: ExtractContractIdentities<Consumes>;\r\n });\r\n","import { type FunctionComponent, type PropsWithChildren, type Ref, createContext, useCallback, useContext, useImperativeHandle } from \"react\";\r\n\r\nimport { type ToastIntent, FluentProvider, Toast, Toaster, ToastTitle, useFluent, useId, useToastController } from \"@fluentui/react-components\";\r\n\r\n/**\r\n * Options for showing a toast notification.\r\n */\r\nexport type ToastOptions = {\r\n /**\r\n * The intent of the toast notification. Defaults to \"info\".\r\n */\r\n intent?: ToastIntent;\r\n};\r\n\r\ntype ToastContextType = {\r\n showToast: (message: string, options?: ToastOptions) => void;\r\n};\r\n\r\n/**\r\n * Imperative handle exposed by {@link ToastProvider} via its `imperativeRef` prop.\r\n */\r\nexport type ToastHandle = {\r\n /**\r\n * Shows a toast notification with the given message.\r\n * @param message The message to display.\r\n * @param options Optional toast configuration.\r\n */\r\n showToast: (message: string, options?: ToastOptions) => void;\r\n};\r\n\r\nconst ToastContext = createContext<ToastContextType>({ showToast: () => {} });\r\n\r\nexport type ToastProviderProps = PropsWithChildren<{\r\n /**\r\n * A ref that exposes the {@link ToastHandle} imperative API.\r\n */\r\n imperativeRef?: Ref<ToastHandle>;\r\n}>;\r\n\r\n/**\r\n * Provides toast notification functionality to child components via context and an optional imperative ref.\r\n * @returns The toast provider component tree.\r\n */\r\nexport const ToastProvider: FunctionComponent<ToastProviderProps> = ({ children, imperativeRef }) => {\r\n const toasterId = useId(\"toaster\");\r\n const { dispatchToast } = useToastController(toasterId);\r\n const { targetDocument } = useFluent();\r\n\r\n const showToast = useCallback(\r\n (message: string, options?: ToastOptions) => {\r\n dispatchToast(\r\n <Toast>\r\n <ToastTitle>{message}</ToastTitle>\r\n </Toast>,\r\n { intent: options?.intent ?? \"info\", timeout: 2000 }\r\n );\r\n },\r\n [dispatchToast]\r\n );\r\n\r\n useImperativeHandle(imperativeRef, () => ({ showToast }), [showToast]);\r\n\r\n return (\r\n <ToastContext.Provider value={{ showToast }}>\r\n {children}\r\n <FluentProvider applyStylesToPortals targetDocument={targetDocument}>\r\n <Toaster toasterId={toasterId} position=\"bottom\" />\r\n </FluentProvider>\r\n </ToastContext.Provider>\r\n );\r\n};\r\n\r\n/**\r\n * Hook to show toast notifications.\r\n * @returns Object with showToast function that accepts a message string\r\n */\r\nexport function useToast() {\r\n return useContext(ToastContext);\r\n}\r\n","import { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Options for opening a popup browser window via {@link OpenPopupWindow}.\r\n */\r\nexport type PopupWindowOptions = {\r\n /**\r\n * Title set on the popup document.\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Default width of the popup in pixels.\r\n * @remarks Ignored if `id` is provided and a previously saved width exists.\r\n */\r\n defaultWidth?: number;\r\n\r\n /**\r\n * Default height of the popup in pixels.\r\n * @remarks Ignored if `id` is provided and a previously saved height exists.\r\n */\r\n defaultHeight?: number;\r\n\r\n /**\r\n * Default screen-X position of the popup in pixels.\r\n * @remarks Ignored if `id` is provided and a previously saved position exists.\r\n */\r\n defaultLeft?: number;\r\n\r\n /**\r\n * Default screen-Y position of the popup in pixels.\r\n * @remarks Ignored if `id` is provided and a previously saved position exists.\r\n */\r\n defaultTop?: number;\r\n\r\n /**\r\n * Optional unique identity. When provided, the popup's bounds are saved to and\r\n * restored from `localStorage` under the key `Babylon/Settings/PopupWindow/{id}/Bounds`.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Optional callback invoked when the popup is closed externally — e.g. the user dismisses\r\n * the popup, or the browser tab/window itself is unloaded. NOT called when the consumer\r\n * closes the popup via {@link PopupWindowHandle.dispose} (the consumer already knows about\r\n * that closure).\r\n */\r\n onClose?: () => void;\r\n};\r\n\r\n/**\r\n * Handle returned from {@link OpenPopupWindow}.\r\n */\r\nexport type PopupWindowHandle = {\r\n /**\r\n * The popup `Window` object. May become `closed` if the user dismisses the popup.\r\n */\r\n readonly popupWindow: Window;\r\n\r\n /**\r\n * A flex container element appended to the popup body. Render the tool into this element.\r\n */\r\n readonly hostElement: HTMLDivElement;\r\n\r\n /**\r\n * Closes the popup window and removes any listeners installed on the parent.\r\n * Safe to call multiple times.\r\n */\r\n dispose: () => void;\r\n};\r\n\r\nconst StorageKeyPrefix = \"Babylon/Settings/PopupWindow\";\r\n\r\ntype SavedBounds = { left: number; top: number; width: number; height: number };\r\n\r\nfunction LoadSavedBounds(id: string): Partial<SavedBounds> | null {\r\n const stored = localStorage.getItem(`${StorageKeyPrefix}/${id}/Bounds`);\r\n if (!stored) {\r\n return null;\r\n }\r\n try {\r\n const parsed = JSON.parse(stored) as Partial<SavedBounds>;\r\n return parsed;\r\n } catch {\r\n Logger.Warn(`Could not parse saved bounds for popup window with id ${id}`);\r\n return null;\r\n }\r\n}\r\n\r\nfunction SaveBounds(id: string, bounds: SavedBounds) {\r\n try {\r\n localStorage.setItem(`${StorageKeyPrefix}/${id}/Bounds`, JSON.stringify(bounds));\r\n } catch {\r\n // Storage may be full / disabled — bounds simply won't persist.\r\n }\r\n}\r\n\r\nfunction ResolveBounds(options: PopupWindowOptions): SavedBounds {\r\n const saved = options.id ? LoadSavedBounds(options.id) : null;\r\n\r\n const width = options.defaultWidth ?? saved?.width ?? Math.floor(window.innerWidth * (2 / 3));\r\n const height = options.defaultHeight ?? saved?.height ?? Math.floor(window.innerHeight * (2 / 3));\r\n const left = options.defaultLeft ?? saved?.left ?? Math.floor(window.screenX + (window.innerWidth - width) / 2);\r\n const top = options.defaultTop ?? saved?.top ?? Math.floor(window.screenY + (window.innerHeight - height) / 2);\r\n\r\n // When the caller passes explicit width/height/left/top, always honour them; otherwise fall\r\n // back to the (saved or computed) values above. The order above already gives explicit\r\n // options precedence, so just build the resulting bounds now.\r\n return { left, top, width, height };\r\n}\r\n\r\nfunction ToFeaturesString(bounds: SavedBounds): string {\r\n return `width=${bounds.width},height=${bounds.height},left=${bounds.left},top=${bounds.top},location=no`;\r\n}\r\n\r\n/**\r\n * Opens a new browser popup window suitable for hosting a Fluent-based modular tool.\r\n *\r\n * The popup body is configured for full-bleed flex layout and a host `<div>` is appended\r\n * for the tool to render into. Fluent style targeting (Griffel `RendererProvider`,\r\n * `FluentProvider` with `targetDocument`) is the caller's responsibility — typically wired\r\n * up by `MakeModularTool`, which derives `targetDocument` from `containerElement.ownerDocument`.\r\n *\r\n * **Must be called synchronously in response to a user interaction** (e.g. button click) —\r\n * otherwise the browser will block the popup as a scripted popup.\r\n *\r\n * @param options Window options. See {@link PopupWindowOptions}.\r\n * @returns A handle to the popup window and its host element, plus a `dispose` to close it.\r\n * `null` if the popup was blocked by the browser.\r\n */\r\nexport function OpenPopupWindow(options: PopupWindowOptions = {}): PopupWindowHandle | null {\r\n const bounds = ResolveBounds(options);\r\n\r\n const popupWindow = window.open(\"\", \"\", ToFeaturesString(bounds));\r\n if (!popupWindow) {\r\n return null;\r\n }\r\n\r\n if (options.title) {\r\n popupWindow.document.title = options.title;\r\n }\r\n\r\n const popupBody = popupWindow.document.body;\r\n popupBody.style.width = \"100%\";\r\n popupBody.style.height = \"100%\";\r\n popupBody.style.margin = \"0\";\r\n popupBody.style.padding = \"0\";\r\n popupBody.style.display = \"flex\";\r\n popupBody.style.overflow = \"hidden\";\r\n\r\n const hostElement = popupWindow.document.createElement(\"div\");\r\n hostElement.style.display = \"flex\";\r\n hostElement.style.flexDirection = \"column\";\r\n hostElement.style.flexGrow = \"1\";\r\n hostElement.style.width = \"100%\";\r\n hostElement.style.height = \"100%\";\r\n hostElement.style.margin = \"0\";\r\n hostElement.style.padding = \"0\";\r\n hostElement.style.overflow = \"hidden\";\r\n popupBody.appendChild(hostElement);\r\n\r\n // Track the most recently observed window bounds. In some browsers (e.g. Firefox), accessing\r\n // properties like screenX on a closed window throws, so we cache the last known good values\r\n // to use as a fallback when saving after the window has already been closed.\r\n const getBounds = (): SavedBounds => ({\r\n left: popupWindow.screenX,\r\n top: popupWindow.screenY,\r\n width: popupWindow.innerWidth,\r\n height: popupWindow.innerHeight,\r\n });\r\n let lastBounds = bounds;\r\n\r\n const onPopupBeforeUnload = () => {\r\n try {\r\n lastBounds = getBounds();\r\n } catch {\r\n // Use the cached lastBounds.\r\n }\r\n };\r\n popupWindow.addEventListener(\"beforeunload\", onPopupBeforeUnload);\r\n\r\n let disposed = false;\r\n // Internal cleanup: tears down listeners, persists bounds, closes the popup.\r\n // Does NOT invoke `options.onClose` — that's reserved for popup unload events\r\n // that originate from outside our own teardown (e.g. user dismissed the popup).\r\n const cleanup = () => {\r\n if (disposed) {\r\n return;\r\n }\r\n disposed = true;\r\n\r\n if (options.id) {\r\n try {\r\n if (!popupWindow.closed) {\r\n lastBounds = getBounds();\r\n }\r\n } catch {\r\n // Use the cached lastBounds.\r\n }\r\n SaveBounds(options.id, lastBounds);\r\n }\r\n\r\n popupWindow.removeEventListener(\"beforeunload\", onPopupBeforeUnload);\r\n // Remove the unload listener so that any pending unload event triggered by our\r\n // own popupWindow.close() below cannot reach back into onPopupUnload after we've\r\n // already torn down. This avoids a race where, during a programmatic open-while-open\r\n // swap, the old popup's unload would otherwise fire onClose and clear React state\r\n // pointing at the new popup.\r\n popupWindow.removeEventListener(\"unload\", onPopupUnload);\r\n window.removeEventListener(\"unload\", onParentUnload);\r\n\r\n if (!popupWindow.closed) {\r\n popupWindow.close();\r\n }\r\n };\r\n\r\n const onPopupUnload = () => {\r\n if (disposed) {\r\n // Already torn down programmatically; the popup is just finishing its unload.\r\n return;\r\n }\r\n cleanup();\r\n // Notify the consumer only for externally-triggered closures (user dismissed the popup,\r\n // tab/browser closed). Programmatic disposal calls cleanup() directly and intentionally\r\n // skips this so callers don't get a re-entrant onClose for the close they themselves issued.\r\n options.onClose?.();\r\n };\r\n popupWindow.addEventListener(\"unload\", onPopupUnload, { once: true });\r\n\r\n // If the parent window is unloaded (page refresh / navigation), don't leave the popup orphaned.\r\n const onParentUnload = () => {\r\n if (!popupWindow.closed) {\r\n popupWindow.close();\r\n }\r\n };\r\n window.addEventListener(\"unload\", onParentUnload, { once: true });\r\n\r\n return {\r\n popupWindow,\r\n hostElement,\r\n dispose: cleanup,\r\n };\r\n}\r\n","import { type GriffelRenderer, createDOMRenderer, FluentProvider, Portal, RendererProvider } from \"@fluentui/react-components\";\r\nimport { type FunctionComponent, type PropsWithChildren, type Ref, useCallback, useEffect, useImperativeHandle, useState } from \"react\";\r\n\r\nimport { ToastProvider } from \"../primitives/toast\";\r\nimport { OpenPopupWindow, type PopupWindowHandle } from \"./popupWindow\";\r\n\r\nexport type ChildWindowOptions = {\r\n /**\r\n * The default width of the child window in pixels.\r\n * @remarks Ignored if the ChildWindow was passed an id and previous bounds were saved.\r\n */\r\n defaultWidth?: number;\r\n\r\n /**\r\n * The default height of the child window in pixels.\r\n * @remarks Ignored if the ChildWindow was passed an id and previous bounds were saved.\r\n */\r\n defaultHeight?: number;\r\n\r\n /**\r\n * The default left position of the child window in pixels.\r\n * @remarks Ignored if the ChildWindow was passed an id and previous bounds were saved.\r\n */\r\n defaultLeft?: number;\r\n\r\n /**\r\n * The default top position of the child window in pixels.\r\n * @remarks Ignored if the ChildWindow was passed an id and previous bounds were saved.\r\n */\r\n defaultTop?: number;\r\n\r\n /**\r\n * The title of the child window.\r\n * @remarks If not provided, the id will be used instead (if any).\r\n */\r\n title?: string;\r\n};\r\n\r\nexport type ChildWindow = {\r\n /**\r\n * Opens the child window.\r\n * @param options Options for opening the child window.\r\n */\r\n open: (options?: ChildWindowOptions) => void;\r\n\r\n /**\r\n * Closes the child window.\r\n */\r\n close: () => void;\r\n};\r\n\r\nexport type ChildWindowProps = {\r\n /**\r\n * An optional unique identity for the child window.\r\n * @remarks If provided, the child window's bounds will be saved/restored using this identity.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Called when the open state of the child window changes.\r\n * @param isOpen Whether the child window is open.\r\n */\r\n onOpenChange?: (isOpen: boolean) => void;\r\n\r\n /**\r\n * A ref that exposes the ChildWindow imperative API.\r\n */\r\n imperativeRef?: Ref<ChildWindow>;\r\n};\r\n\r\n/**\r\n * Allows displaying a child window that can contain child components.\r\n * @param props Props for the child window.\r\n * @returns The child window component.\r\n */\r\nexport const ChildWindow: FunctionComponent<PropsWithChildren<ChildWindowProps>> = (props) => {\r\n const { id, children, onOpenChange, imperativeRef: imperativeRef } = props;\r\n\r\n const [windowState, setWindowState] = useState<{ mountNode: HTMLElement; renderer: GriffelRenderer }>();\r\n const [popupHandle, setPopupHandle] = useState<PopupWindowHandle>();\r\n\r\n // This function is just for creating the child window itself. It is a function because\r\n // it must be called synchronously in response to a user interaction (e.g. button click),\r\n // otherwise the browser will block it as a scripted popup.\r\n const createWindow = useCallback(\r\n (options: ChildWindowOptions = {}) => {\r\n const handle = OpenPopupWindow({\r\n id,\r\n title: options.title ?? id,\r\n defaultWidth: options.defaultWidth,\r\n defaultHeight: options.defaultHeight,\r\n defaultLeft: options.defaultLeft,\r\n defaultTop: options.defaultTop,\r\n onClose: () => {\r\n // Triggered when the popup is closed for any reason (user dismissal, parent unload,\r\n // or programmatic dispose). Clear the popup handle so the effect cleanup runs and\r\n // `onOpenChange(false)` is propagated up the tree (which lets a parent shell re-dock\r\n // a previously-undocked pane). teardown() is idempotent so calling dispose() again\r\n // from the effect cleanup is a safe no-op.\r\n setPopupHandle(undefined);\r\n },\r\n });\r\n\r\n if (handle) {\r\n setPopupHandle((current) => {\r\n // Close any existing child window before adopting the new one.\r\n current?.dispose();\r\n return handle;\r\n });\r\n }\r\n },\r\n [id]\r\n );\r\n\r\n useImperativeHandle(imperativeRef, () => {\r\n return {\r\n open: createWindow,\r\n close: () => {\r\n setPopupHandle((current) => {\r\n current?.dispose();\r\n return undefined;\r\n });\r\n },\r\n };\r\n }, [createWindow]);\r\n\r\n // This side effect runs any time the popup handle changes. It does the rest of the child window\r\n // setup work, including creating resources and state needed to properly render the content of the child window.\r\n useEffect(() => {\r\n if (!popupHandle) {\r\n return undefined;\r\n }\r\n\r\n const popupDocument = popupHandle.popupWindow.document;\r\n\r\n // Use the popup's hostElement as the React mount point. OpenPopupWindow configures it as a\r\n // flex column that fills the popup body, so the FluentProvider (also a flex column with\r\n // flex-grow: 1) inside it can fill the available space.\r\n setWindowState({ mountNode: popupHandle.hostElement, renderer: createDOMRenderer(popupDocument) });\r\n onOpenChange?.(true);\r\n\r\n return () => {\r\n // Tear down the popup. The cached handle's dispose() handles bounds saving and\r\n // listener cleanup; React state is reset so the Portal/Provider tree unmounts.\r\n popupHandle.dispose();\r\n setWindowState(undefined);\r\n onOpenChange?.(false);\r\n };\r\n }, [popupHandle]);\r\n\r\n if (!windowState) {\r\n return null;\r\n }\r\n\r\n const { mountNode, renderer } = windowState;\r\n\r\n return (\r\n // Portal targets the body of the child window.\r\n <Portal mountNode={mountNode}>\r\n {/* RenderProvider manages Fluent style/class state. */}\r\n <RendererProvider renderer={renderer} targetDocument={mountNode.ownerDocument}>\r\n {/* Fluent Provider is needed for managing other Fluent state and applying the current theme mode. */}\r\n <FluentProvider\r\n style={{\r\n display: \"flex\",\r\n flexGrow: 1,\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n applyStylesToPortals={false}\r\n targetDocument={mountNode.ownerDocument}\r\n >\r\n <ToastProvider>{children}</ToastProvider>\r\n </FluentProvider>\r\n </RendererProvider>\r\n </Portal>\r\n );\r\n};\r\n","import { makeStyles } from \"@fluentui/react-components\";\r\nimport { Collapse as FluentCollapse } from \"@fluentui/react-motion-components-preview\";\r\nimport { type FunctionComponent, type PropsWithChildren } from \"react\";\r\n\r\ntype CollapseProps = {\r\n visible: boolean;\r\n orientation?: \"horizontal\" | \"vertical\";\r\n};\r\n\r\nconst useCollapseStyles = makeStyles({\r\n collapseContent: {\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n },\r\n horizontal: {\r\n flexDirection: \"row\",\r\n },\r\n vertical: {\r\n flexDirection: \"column\",\r\n },\r\n});\r\n\r\n/**\r\n * Wraps the passed in children with a fluent collapse component, handling smooth animation when visible prop changes\r\n * NOTE: When passing in children, prefer react fragment over empty div to avoid bloating the react tree with an unnecessary div\r\n * @param props\r\n * @returns\r\n */\r\nexport const Collapse: FunctionComponent<PropsWithChildren<CollapseProps>> = (props) => {\r\n Collapse.displayName = \"Collapse\";\r\n const classes = useCollapseStyles();\r\n\r\n // Since portalling breaks DOM hierarchy, `unmountOnExit` is required to ensure descendants are unmounted when the logical ancestor collapses.\r\n // If this is a breaking change, the alternative would be creating a context to pass the `visible` state down to the descendants.\r\n\r\n return (\r\n <FluentCollapse visible={props.visible} orientation={props.orientation} unmountOnExit>\r\n <div className={`${classes.collapseContent} ${props.orientation === \"horizontal\" ? classes.horizontal : classes.vertical}`}>{props.children}</div>\r\n </FluentCollapse>\r\n );\r\n};\r\n","import { useResizeHandle, type UseResizeHandleParams } from \"@fluentui-contrib/react-resize-handle\";\r\nimport {\r\n type MenuTriggerProps,\r\n Button,\r\n Divider,\r\n Toolbar as FluentToolbar,\r\n makeStyles,\r\n Menu,\r\n MenuGroup,\r\n MenuGroupHeader,\r\n MenuItem,\r\n MenuList,\r\n MenuPopover,\r\n MenuTrigger,\r\n mergeClasses,\r\n SplitButton,\r\n Subtitle2Stronger,\r\n tokens,\r\n ToolbarRadioButton,\r\n} from \"@fluentui/react-components\";\r\nimport { type ComponentType, type FunctionComponent, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport { type IDisposable, type Nullable } from \"core/index\";\r\nimport { type IService, type ServiceDefinition } from \"../modularity/serviceDefinition\";\r\nimport { type SettingDescriptor } from \"./settingsStore\";\r\n\r\nimport {\r\n LayoutColumnTwoFocusLeftFilled,\r\n LayoutColumnTwoFocusRightFilled,\r\n LayoutColumnTwoSplitLeftFocusBottomLeftFilled,\r\n LayoutColumnTwoSplitLeftFocusTopLeftFilled,\r\n LayoutColumnTwoSplitRightFocusBottomRightFilled,\r\n LayoutColumnTwoSplitRightFocusTopRightFilled,\r\n MoreHorizontalRegular,\r\n PanelLeftContractRegular,\r\n PanelLeftExpandRegular,\r\n PanelRightContractRegular,\r\n PanelRightExpandRegular,\r\n PictureInPictureEnterRegular,\r\n} from \"@fluentui/react-icons\";\r\nimport { Fade as FluentFade } from \"@fluentui/react-motion-components-preview\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { ChildWindow } from \"shared-ui-components/fluent/hoc/childWindow\";\r\nimport { Collapse } from \"shared-ui-components/fluent/primitives/collapse\";\r\nimport { Tooltip } from \"shared-ui-components/fluent/primitives/tooltip\";\r\nimport { ErrorBoundary } from \"../components/errorBoundary\";\r\nimport { TeachingMoment } from \"../components/teachingMoment\";\r\nimport { Theme } from \"../components/theme\";\r\nimport { useOrderedObservableCollection } from \"../hooks/observableHooks\";\r\nimport { useSetting } from \"../hooks/settingsHooks\";\r\nimport { MakePopoverTeachingMoment } from \"../hooks/teachingMomentHooks\";\r\nimport { ObservableCollection } from \"../misc/observableCollection\";\r\n\r\n/**\r\n * Setting descriptor for persisting side pane dock location overrides.\r\n */\r\nexport const SidePaneDockOverridesSettingDescriptor: SettingDescriptor<\r\n Record<string, Readonly<{ horizontalLocation: HorizontalLocation; verticalLocation: VerticalLocation }> | undefined>\r\n> = {\r\n key: \"SidePaneDockOverrides\",\r\n defaultValue: {},\r\n};\r\n\r\n/**\r\n * Setting descriptor for persisting the left side pane width adjustment.\r\n */\r\nexport const LeftSidePaneWidthAdjustSettingDescriptor: SettingDescriptor<number> = {\r\n key: \"Shell/LeftPane/WidthAdjust\",\r\n defaultValue: 0,\r\n};\r\n\r\n/**\r\n * Setting descriptor for persisting the left side pane height adjustment.\r\n */\r\nexport const LeftSidePaneHeightAdjustSettingDescriptor: SettingDescriptor<number> = {\r\n key: \"Shell/LeftPane/HeightAdjust\",\r\n defaultValue: 0,\r\n};\r\n\r\n/**\r\n * Setting descriptor for persisting the right side pane width adjustment.\r\n */\r\nexport const RightSidePaneWidthAdjustSettingDescriptor: SettingDescriptor<number> = {\r\n key: \"Shell/RightPane/WidthAdjust\",\r\n defaultValue: 0,\r\n};\r\n\r\n/**\r\n * Setting descriptor for persisting the right side pane height adjustment.\r\n */\r\nexport const RightSidePaneHeightAdjustSettingDescriptor: SettingDescriptor<number> = {\r\n key: \"Shell/RightPane/HeightAdjust\",\r\n defaultValue: 0,\r\n};\r\n\r\n/**\r\n * Represents a horizontal location in the shell layout.\r\n */\r\nexport type HorizontalLocation = \"left\" | \"right\";\r\n\r\n/**\r\n * Represents a vertical location in the shell layout.\r\n */\r\nexport type VerticalLocation = \"top\" | \"bottom\";\r\n\r\ntype TeachingMomentInfo = boolean | { readonly title: string; readonly description: string };\r\n\r\ntype DockLocation = `${VerticalLocation}-${HorizontalLocation}` | `full-${HorizontalLocation}`;\r\n\r\n/**\r\n * Describes an item that can be added to one of the shell's toolbars.\r\n */\r\nexport type ToolbarItemDefinition = {\r\n /**\r\n * A unique key for the toolbar item.\r\n */\r\n key: string;\r\n\r\n /**\r\n * The component to render for the toolbar item.\r\n */\r\n component: ComponentType;\r\n\r\n /**\r\n * An optional order for the toolbar item, relative to other items.\r\n * Defaults to 0.\r\n */\r\n order?: number;\r\n\r\n /**\r\n * The horizontal location of the toolbar item.\r\n * Can be either \"left\" or \"right\".\r\n * In \"compact\" toolbar mode, \"left\" and \"right\" mean the \"compact\" toolbars at the top/bottom of the left/right side panes.\r\n * In \"full\" toolbar mode, \"left\" and \"right\" mean the left side and right side of the full width toolbars above/below the side panes.\r\n */\r\n horizontalLocation: HorizontalLocation;\r\n\r\n /**\r\n * The vertical location of the toolbar item.\r\n * Can be either \"top\" or \"bottom\".\r\n */\r\n verticalLocation: VerticalLocation;\r\n\r\n /**\r\n * An optional display name for the toolbar item, used for teaching moments, tooltips, etc.\r\n */\r\n displayName?: string;\r\n\r\n /**\r\n * An optional teaching moment info. The default assumes the toolbar item was added by an extension and provides a generic title and description based on the display name or id, which is helpful for discoverability of new items.\r\n * Set this to false to suppress the teaching moment, which may be desirable for built in items or items that are added in a non-dynamic way.\r\n * Set it to an object with a title and description to provide a custom teaching moment, which may be desirable if the generic title and description are not sufficient.\r\n * Teaching moments are more helpful for dynamically added items, possibly from extensions.\r\n */\r\n teachingMoment?: TeachingMomentInfo;\r\n};\r\n\r\n/**\r\n * Describes a side pane that can be added to the shell's left or right side.\r\n */\r\nexport type SidePaneDefinition = {\r\n /**\r\n * A unique key for the side pane.\r\n */\r\n key: string;\r\n\r\n /**\r\n * An icon component to render for the pane tab.\r\n */\r\n icon: ComponentType;\r\n\r\n /**\r\n * The component to render for the side pane's content.\r\n */\r\n content: ComponentType;\r\n\r\n /**\r\n * An optional order for the side pane, relative to other panes.\r\n * Defaults to 0.\r\n */\r\n order?: number;\r\n\r\n /**\r\n * The horizontal location of the side pane.\r\n * Can be either \"left\" or \"right\".\r\n */\r\n horizontalLocation: HorizontalLocation;\r\n\r\n /**\r\n * The vertical location of the side pane.\r\n * Can be either \"top\" or \"bottom\".\r\n */\r\n verticalLocation: VerticalLocation;\r\n\r\n /**\r\n * The title of the side pane, displayed as a standardized header at the top of the pane.\r\n */\r\n title: string;\r\n\r\n /**\r\n * An optional teaching moment info. The default assumes the side pane was added by an extension and provides a generic title and description based on the display name or id, which is helpful for discoverability of new items.\r\n * Set this to false to suppress the teaching moment, which may be desirable for built in items or items that are added in a non-dynamic way.\r\n * Set it to an object with a title and description to provide a custom teaching moment, which may be desirable if the generic title and description are not sufficient.\r\n * Teaching moments are more helpful for dynamically added panes, possibly from extensions.\r\n */\r\n teachingMoment?: TeachingMomentInfo;\r\n\r\n /**\r\n * Keep the pane mounted even when it is not visible. This is useful if you don't want the\r\n * user to lose the complex visual state when switching between tabs.\r\n */\r\n keepMounted?: boolean;\r\n};\r\n\r\ntype RegisteredSidePane = {\r\n readonly key: string;\r\n select(): void;\r\n};\r\n\r\ntype SidePaneContainer = {\r\n readonly isDocked: boolean;\r\n dock(): void;\r\n undock(): void;\r\n readonly isCollapsed: boolean;\r\n collapse(): void;\r\n expand(): void;\r\n};\r\n\r\n/**\r\n * Describes content that can be added to the shell's central area (between the side panes and toolbars - e.g. the main content).\r\n */\r\nexport type CentralContentDefinition = {\r\n /**\r\n * A unique key for the central content.\r\n */\r\n key: string;\r\n\r\n /**\r\n * The component to render for the central content.\r\n */\r\n component: ComponentType;\r\n\r\n /**\r\n * An optional order for content, relative to other central content.\r\n * Defaults to 0.\r\n */\r\n order?: number;\r\n};\r\n\r\n/**\r\n * The unique identity symbol for the root component service.\r\n */\r\nexport const RootComponentServiceIdentity = Symbol(\"RootComponent\");\r\n\r\n/**\r\n * Exposes a top level component that should be rendered as the React root.\r\n */\r\nexport interface IRootComponentService extends IService<typeof RootComponentServiceIdentity> {\r\n /**\r\n * The root component that should be rendered as the React root.\r\n */\r\n readonly rootComponent: ComponentType;\r\n}\r\n\r\n/**\r\n * The unique identity symbol for the shell service.\r\n */\r\nexport const ShellServiceIdentity = Symbol(\"ShellService\");\r\n\r\n/**\r\n * Provides a shell for the application, including toolbars, side panes, and central content.\r\n * This service allows adding toolbar items, side panes, and central content dynamically.\r\n */\r\nexport interface IShellService extends IService<typeof ShellServiceIdentity> {\r\n /**\r\n * Adds a new item to one of the shell's toolbars.\r\n * @param item Defines the item to add.\r\n */\r\n addToolbarItem(item: Readonly<ToolbarItemDefinition>): IDisposable;\r\n\r\n /**\r\n * Adds a new side pane to the shell.\r\n * @param pane Defines the side pane to add.\r\n */\r\n addSidePane(pane: Readonly<SidePaneDefinition>): IDisposable;\r\n\r\n /**\r\n * Adds new central content to the shell.\r\n * @param content Defines the content area to add.\r\n */\r\n addCentralContent(content: Readonly<CentralContentDefinition>): IDisposable;\r\n\r\n /**\r\n * The left side pane container.\r\n */\r\n readonly leftSidePaneContainer: Nullable<SidePaneContainer>;\r\n\r\n /**\r\n * The right side pane container.\r\n */\r\n readonly rightSidePaneContainer: Nullable<SidePaneContainer>;\r\n\r\n /**\r\n * The side panes currently present in the shell.\r\n */\r\n readonly sidePanes: readonly RegisteredSidePane[];\r\n}\r\n\r\ntype ToolbarMode = \"full\" | \"compact\";\r\n\r\n/**\r\n * Options for configuring the shell service.\r\n */\r\nexport type ShellServiceOptions = {\r\n /**\r\n * The default width of the left side pane.\r\n */\r\n leftPaneDefaultWidth?: number;\r\n\r\n /**\r\n * The minimum width of the left side pane.\r\n */\r\n leftPaneMinWidth?: number;\r\n\r\n /**\r\n * The default width of the right side pane.\r\n */\r\n rightPaneDefaultWidth?: number;\r\n\r\n /**\r\n * The minimum width of the right side pane.\r\n */\r\n rightPaneMinWidth?: number;\r\n\r\n /**\r\n * The mode of the toolbars.\r\n * Can be either \"full\" (default) or \"compact\".\r\n * In \"full\" mode, toolbars are displayed above and below the side panes.\r\n * In \"compact\" mode, toolbars are displayed at the top and bottom of the left and right side panes.\r\n */\r\n toolbarMode?: ToolbarMode;\r\n\r\n /**\r\n * Whether the left side pane should start collapsed. Default is false.\r\n */\r\n leftPaneDefaultCollapsed?: boolean;\r\n\r\n /**\r\n * Whether the right side pane should start collapsed. Default is false.\r\n */\r\n rightPaneDefaultCollapsed?: boolean;\r\n\r\n /**\r\n * A function that can remap the default location of side panes.\r\n * @param sidePane The side pane to remap.\r\n * @returns The new location for the side pane.\r\n */\r\n sidePaneRemapper?: (sidePane: Readonly<SidePaneDefinition>) => Nullable<{ horizontalLocation: HorizontalLocation; verticalLocation: VerticalLocation }>;\r\n};\r\n\r\nconst useStyles = makeStyles({\r\n mainView: {\r\n flex: 1,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n backgroundColor: tokens.colorTransparentBackground,\r\n },\r\n verticallyCentralContent: {\r\n flexGrow: 1,\r\n display: \"flex\",\r\n overflow: \"hidden\",\r\n backgroundColor: tokens.colorTransparentBackground,\r\n },\r\n barDiv: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n flex: \"0 0 auto\",\r\n height: \"36px\",\r\n backgroundColor: tokens.colorNeutralBackground2,\r\n pointerEvents: \"auto\",\r\n },\r\n bar: {\r\n display: \"flex\",\r\n flex: \"1\",\r\n overflow: \"hidden\",\r\n padding: `${tokens.spacingVerticalXXS} ${tokens.spacingHorizontalXXS}`,\r\n borderBottom: `1px solid ${tokens.colorNeutralStroke2}`,\r\n backgroundColor: tokens.colorNeutralBackground2,\r\n },\r\n barTop: {\r\n borderTopWidth: 0,\r\n },\r\n barBottom: {\r\n borderTop: `1px solid ${tokens.colorNeutralStroke2}`,\r\n },\r\n barLeft: {\r\n marginRight: \"auto\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n flexDirection: \"row\",\r\n columnGap: tokens.spacingHorizontalSNudge,\r\n },\r\n barRight: {\r\n marginLeft: \"auto\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n flexDirection: \"row-reverse\",\r\n columnGap: tokens.spacingHorizontalSNudge,\r\n },\r\n barItem: {\r\n display: \"flex\",\r\n },\r\n paneTabListDiv: {\r\n backgroundColor: tokens.colorNeutralBackground1,\r\n flex: \"0 0 auto\",\r\n display: \"flex\",\r\n },\r\n paneTabListDivLeft: {\r\n flexDirection: \"row-reverse\",\r\n },\r\n paneTabListDivRight: {\r\n flexDirection: \"row\",\r\n },\r\n paneCollapseButton: {\r\n padding: `0 0 0 ${tokens.spacingHorizontalXS}`,\r\n borderBottom: `1px solid ${tokens.colorNeutralStroke2}`,\r\n backgroundColor: tokens.colorNeutralBackground2,\r\n },\r\n paneCollapseButtonWithLeftBorder: {\r\n borderLeft: `1px solid ${tokens.colorNeutralStroke2}`,\r\n },\r\n paneCollapseButtonWithRightBorder: {\r\n borderRight: `1px solid ${tokens.colorNeutralStroke2}`,\r\n },\r\n collapseMenuPopover: {\r\n minWidth: 0,\r\n },\r\n pane: {\r\n backgroundColor: tokens.colorNeutralBackground2,\r\n display: \"flex\",\r\n flex: 1,\r\n alignItems: \"stretch\",\r\n overflow: \"hidden\",\r\n },\r\n paneLeft: {\r\n flexDirection: \"row\",\r\n },\r\n paneRight: {\r\n flexDirection: \"row-reverse\",\r\n },\r\n paneContainer: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n // Side panes hold the width requested by their `style.width` (or saved/dragged value)\r\n // and never give it up to a neighboring pane growing. Without this, dragging the left\r\n // pane wider would also squeeze the right pane (proportional flex-shrink). The central\r\n // content (`flex-grow: 1`) is the only flex item that absorbs the change.\r\n flexShrink: 0,\r\n overflowX: \"hidden\",\r\n overflowY: \"hidden\",\r\n zIndex: 1,\r\n pointerEvents: \"auto\",\r\n },\r\n paneContent: {\r\n display: \"flex\",\r\n flexGrow: 1,\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n },\r\n unselectedPane: {\r\n display: \"none\",\r\n },\r\n paneHeaderDiv: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n alignItems: \"center\",\r\n height: \"36px\",\r\n backgroundColor: tokens.colorNeutralBackground1,\r\n color: tokens.colorNeutralForeground1,\r\n },\r\n paneHeaderText: {\r\n flex: 1,\r\n },\r\n paneHeaderTextNoIcon: {\r\n marginLeft: tokens.spacingHorizontalM,\r\n },\r\n paneHeaderIcon: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n height: \"100%\",\r\n aspectRatio: \"1\",\r\n fontSize: \"20px\",\r\n },\r\n paneHeaderButton: {\r\n color: \"inherit\",\r\n },\r\n paneDivider: {\r\n flex: \"0 0 auto\",\r\n marginTop: tokens.spacingVerticalM,\r\n margin: \"0\",\r\n minHeight: tokens.spacingVerticalM,\r\n cursor: \"ns-resize\",\r\n alignItems: \"end\",\r\n },\r\n tabToolbar: {\r\n padding: 0,\r\n borderLeft: `1px solid ${tokens.colorNeutralStroke2}`,\r\n borderRight: `1px solid ${tokens.colorNeutralStroke2}`,\r\n },\r\n tab: {\r\n display: \"flex\",\r\n height: \"100%\",\r\n boxSizing: \"border-box\",\r\n justifyContent: \"center\",\r\n border: `1px solid ${tokens.colorNeutralStroke2}`,\r\n borderTop: \"none\",\r\n },\r\n firstTab: {\r\n borderLeftColor: \"transparent\",\r\n },\r\n lastTab: {\r\n borderRightColor: \"transparent\",\r\n },\r\n selectedTab: {\r\n borderBottom: \"none\",\r\n },\r\n unselectedTab: {\r\n borderLeftColor: \"transparent\",\r\n borderRightColor: \"transparent\",\r\n },\r\n tabRadioButton: {\r\n backgroundColor: \"transparent\",\r\n borderRadius: 0,\r\n },\r\n resizer: {\r\n width: \"8px\",\r\n cursor: \"ew-resize\",\r\n zIndex: 1000,\r\n },\r\n resizerLeft: {\r\n marginRight: \"-8px\",\r\n transform: \"translateX(-8px)\",\r\n },\r\n resizerRight: {\r\n marginLeft: \"-8px\",\r\n transform: \"translateX(8px)\",\r\n },\r\n centralContent: {\r\n position: \"relative\",\r\n flexGrow: 1,\r\n display: \"flex\",\r\n overflow: \"hidden\",\r\n backgroundColor: tokens.colorTransparentBackground,\r\n \"> *\": {\r\n pointerEvents: \"auto\",\r\n },\r\n },\r\n expandButtonContainer: {\r\n position: \"absolute\",\r\n },\r\n expandButtonContainerLeft: {\r\n left: 0,\r\n },\r\n expandButtonContainerRight: {\r\n right: 0,\r\n },\r\n expandButton: {},\r\n});\r\n\r\nconst DockMenu: FunctionComponent<\r\n Pick<MenuTriggerProps, \"children\"> & { openOnContext?: boolean; sidePaneId: string; dockOptions: Map<DockLocation, (sidePaneKey: string) => void> }\r\n> = (props) => {\r\n const { openOnContext, sidePaneId, dockOptions, children } = props;\r\n\r\n const dockLeft = dockOptions.get(\"full-left\");\r\n const dockTopLeft = dockOptions.get(\"top-left\");\r\n const dockBottomLeft = dockOptions.get(\"bottom-left\");\r\n const dockRight = dockOptions.get(\"full-right\");\r\n const dockTopRight = dockOptions.get(\"top-right\");\r\n const dockBottomRight = dockOptions.get(\"bottom-right\");\r\n\r\n return (\r\n <Menu openOnContext={openOnContext}>\r\n <MenuTrigger disableButtonEnhancement>{children}</MenuTrigger>\r\n <Theme>\r\n <MenuPopover>\r\n <MenuList>\r\n <MenuGroup>\r\n <MenuGroupHeader>Dock</MenuGroupHeader>\r\n {dockLeft && (\r\n <MenuItem icon={<LayoutColumnTwoFocusLeftFilled />} onClick={() => dockLeft(sidePaneId)}>\r\n Left\r\n </MenuItem>\r\n )}\r\n {dockTopLeft && (\r\n <MenuItem icon={<LayoutColumnTwoSplitLeftFocusTopLeftFilled />} onClick={() => dockTopLeft(sidePaneId)}>\r\n Top Left\r\n </MenuItem>\r\n )}\r\n {dockBottomLeft && (\r\n <MenuItem icon={<LayoutColumnTwoSplitLeftFocusBottomLeftFilled />} onClick={() => dockBottomLeft(sidePaneId)}>\r\n Bottom Left\r\n </MenuItem>\r\n )}\r\n {dockRight && (\r\n <MenuItem icon={<LayoutColumnTwoFocusRightFilled />} onClick={() => dockRight(sidePaneId)}>\r\n Right\r\n </MenuItem>\r\n )}\r\n {dockTopRight && (\r\n <MenuItem icon={<LayoutColumnTwoSplitRightFocusTopRightFilled />} onClick={() => dockTopRight(sidePaneId)}>\r\n Top Right\r\n </MenuItem>\r\n )}\r\n {dockBottomRight && (\r\n <MenuItem icon={<LayoutColumnTwoSplitRightFocusBottomRightFilled />} onClick={() => dockBottomRight(sidePaneId)}>\r\n Bottom Right\r\n </MenuItem>\r\n )}\r\n </MenuGroup>\r\n </MenuList>\r\n </MenuPopover>\r\n </Theme>\r\n </Menu>\r\n );\r\n};\r\n\r\nconst PaneHeader: FunctionComponent<{ id: string; title: string; icon?: ComponentType; dockOptions: Map<DockLocation, (sidePaneKey: string) => void> }> = (props) => {\r\n const { id, title, dockOptions } = props;\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n <div className={classes.paneHeaderDiv}>\r\n {props.icon && (\r\n <div className={classes.paneHeaderIcon}>\r\n <props.icon />\r\n </div>\r\n )}\r\n <Subtitle2Stronger className={mergeClasses(classes.paneHeaderText, !props.icon && classes.paneHeaderTextNoIcon)}>{title}</Subtitle2Stronger>\r\n <DockMenu sidePaneId={id} dockOptions={dockOptions}>\r\n <Button className={classes.paneHeaderButton} appearance=\"transparent\" icon={<MoreHorizontalRegular />} />\r\n </DockMenu>\r\n </div>\r\n );\r\n};\r\n\r\n// This is a wrapper for an item in a toolbar that simply adds a teaching moment, which is useful for dynamically added items, possibly from extensions.\r\nconst ToolbarItem: FunctionComponent<{\r\n verticalLocation: VerticalLocation;\r\n horizontalLocation: HorizontalLocation;\r\n id: string;\r\n component: ComponentType;\r\n displayName?: string;\r\n teachingMoment?: TeachingMomentInfo;\r\n}> = (props) => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const { verticalLocation, horizontalLocation, id, component: Component, displayName } = props;\r\n const classes = useStyles();\r\n\r\n const useTeachingMoment = useMemo(() => MakePopoverTeachingMoment(`Bar/${verticalLocation}/${horizontalLocation}/${displayName ?? id}`), [displayName, id]);\r\n const teachingMoment = useTeachingMoment(props.teachingMoment === false);\r\n\r\n const title = typeof props.teachingMoment === \"object\" ? props.teachingMoment.title : (displayName ?? id);\r\n const description = typeof props.teachingMoment === \"object\" ? props.teachingMoment.description : `The \"${displayName ?? id}\" extension can be accessed here.`;\r\n\r\n return (\r\n <>\r\n <TeachingMoment {...teachingMoment} shouldDisplay={teachingMoment.shouldDisplay} title={title} description={description} />\r\n <div className={classes.barItem} ref={teachingMoment.targetRef}>\r\n <Component />\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\n// TODO: Handle overflow, possibly via https://react.fluentui.dev/?path=/docs/components-overflow--docs with priority.\r\n// This component just renders a toolbar with left aligned toolbar items on the left and right aligned toolbar items on the right.\r\nconst Toolbar: FunctionComponent<{ location: VerticalLocation; components: Readonly<ToolbarItemDefinition[]> }> = ({ location, components }) => {\r\n const classes = useStyles();\r\n\r\n const leftComponents = useMemo(() => components.filter((entry) => entry.horizontalLocation === \"left\"), [components]);\r\n const rightComponents = useMemo(() => components.filter((entry) => entry.horizontalLocation === \"right\"), [components]);\r\n\r\n return (\r\n <div className={`${classes.bar} ${location === \"top\" ? classes.barTop : classes.barBottom}`}>\r\n <div className={classes.barLeft}>\r\n {leftComponents.map((entry) => (\r\n <ToolbarItem\r\n key={entry.key}\r\n verticalLocation={location}\r\n horizontalLocation={entry.horizontalLocation}\r\n id={entry.key}\r\n component={entry.component}\r\n displayName={entry.displayName}\r\n teachingMoment={entry.teachingMoment}\r\n />\r\n ))}\r\n </div>\r\n <div className={classes.barRight}>\r\n {rightComponents.map((entry) => (\r\n <ToolbarItem\r\n key={entry.key}\r\n verticalLocation={location}\r\n horizontalLocation={entry.horizontalLocation}\r\n id={entry.key}\r\n component={entry.component}\r\n displayName={entry.displayName}\r\n teachingMoment={entry.teachingMoment}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// This is a wrapper for a tab in a side pane that simply adds a teaching moment, which is useful for dynamically added items, possibly from extensions.\r\nconst SidePaneTab: FunctionComponent<\r\n { location: HorizontalLocation; id: string; isSelected: boolean; isFirst: boolean; isLast: boolean; dockOptions: Map<DockLocation, (sidePaneKey: string) => void> } & Pick<\r\n Readonly<SidePaneDefinition>,\r\n \"title\" | \"icon\" | \"teachingMoment\"\r\n >\r\n> = (props) => {\r\n const {\r\n location,\r\n id,\r\n isSelected,\r\n isFirst,\r\n isLast,\r\n dockOptions,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n icon: Icon,\r\n title,\r\n } = props;\r\n const classes = useStyles();\r\n const useTeachingMoment = useMemo(() => MakePopoverTeachingMoment(`Pane/${location}/${title ?? id}`), [title, id]);\r\n const teachingMoment = useTeachingMoment(props.teachingMoment === false);\r\n\r\n const tabClass = mergeClasses(\r\n classes.tab,\r\n isSelected ? classes.selectedTab : classes.unselectedTab,\r\n isFirst ? classes.firstTab : undefined,\r\n isLast ? classes.lastTab : undefined\r\n );\r\n\r\n return (\r\n <>\r\n <TeachingMoment\r\n {...teachingMoment}\r\n shouldDisplay={teachingMoment.shouldDisplay}\r\n title={typeof props.teachingMoment === \"object\" ? props.teachingMoment.title : (title ?? \"Extension\")}\r\n description={typeof props.teachingMoment === \"object\" ? props.teachingMoment.description : `The \"${title ?? id}\" extension can be accessed here.`}\r\n />\r\n <div className={tabClass}>\r\n <DockMenu openOnContext sidePaneId={id} dockOptions={dockOptions}>\r\n <Tooltip content={title ?? id}>\r\n <ToolbarRadioButton\r\n ref={teachingMoment.targetRef}\r\n appearance=\"transparent\"\r\n className={classes.tabRadioButton}\r\n name=\"selectedTab\"\r\n value={id}\r\n icon={{\r\n children: <Icon />,\r\n }}\r\n />\r\n </Tooltip>\r\n </DockMenu>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\n// This hook provides a side pane container and the tab list.\r\n// In \"compact\" mode, the tab list is integrated into the pane itself.\r\n// In \"full\" mode, the returned tab list is later injected into the toolbar.\r\nfunction usePane(\r\n location: HorizontalLocation,\r\n defaultWidth: number,\r\n minWidth: number,\r\n sidePanes: SidePaneDefinition[],\r\n onSelectSidePane: Observable<string>,\r\n dockOperations: Map<DockLocation, (sidePaneKey: string) => void>,\r\n toolbarMode: ToolbarMode,\r\n topBarItems: Readonly<ToolbarItemDefinition[]>,\r\n bottomBarItems: Readonly<ToolbarItemDefinition[]>,\r\n initialCollapsed: boolean\r\n) {\r\n const classes = useStyles();\r\n\r\n const [topSelectedTab, setTopSelectedTab] = useState<SidePaneDefinition>();\r\n const [bottomSelectedTab, setBottomSelectedTab] = useState<SidePaneDefinition>();\r\n const [collapsed, setCollapsed] = useState(initialCollapsed);\r\n const childWindow = useRef<ChildWindow>(null);\r\n const [isChildWindowOpen, setIsChildWindowOpen] = useState(false);\r\n const paneContainerRef = useRef<HTMLDivElement>(null);\r\n\r\n const onExpandCollapseClick = useCallback(() => {\r\n setCollapsed((collapsed) => !collapsed);\r\n }, []);\r\n\r\n const [paneWidthSetting, setPaneWidthSetting] = useSetting(location === \"left\" ? LeftSidePaneWidthAdjustSettingDescriptor : RightSidePaneWidthAdjustSettingDescriptor);\r\n const [paneHeightSetting, setPaneHeightSetting] = useSetting(location === \"left\" ? LeftSidePaneHeightAdjustSettingDescriptor : RightSidePaneHeightAdjustSettingDescriptor);\r\n\r\n // Keep setting values in refs so the composed ref callbacks below can read the latest values\r\n // without causing the callbacks to be recreated (which would cause unnecessary ref detach/reattach).\r\n const paneWidthSettingRef = useRef(paneWidthSetting);\r\n paneWidthSettingRef.current = paneWidthSetting;\r\n const paneHeightSettingRef = useRef(paneHeightSetting);\r\n paneHeightSettingRef.current = paneHeightSetting;\r\n\r\n const currentSidePanes = useMemo(() => sidePanes.filter((entry) => entry.horizontalLocation === location), [sidePanes, location]);\r\n const topPanes = useMemo(() => currentSidePanes.filter((entry) => entry.verticalLocation === \"top\"), [currentSidePanes]);\r\n const bottomPanes = useMemo(() => currentSidePanes.filter((entry) => entry.verticalLocation === \"bottom\"), [currentSidePanes]);\r\n\r\n const getValidDockOperations = useCallback(\r\n (verticalLocation: VerticalLocation) => {\r\n const validDockOperations = new Map(dockOperations);\r\n\r\n // Can't re-dock to the current location.\r\n validDockOperations.delete(`${verticalLocation}-${location}`);\r\n\r\n // Full would mean there are no bottom panes, so this is also re-docking to the current location.\r\n validDockOperations.delete(`full-${location}`);\r\n\r\n // If there is only one pane left, it can't be docked to the bottom (as this would leave no top panes).\r\n if (currentSidePanes.length === 1) {\r\n validDockOperations.delete(`bottom-${location}`);\r\n }\r\n\r\n return validDockOperations;\r\n },\r\n [location, dockOperations, currentSidePanes]\r\n );\r\n\r\n const validTopDockOptions = useMemo(() => getValidDockOperations(\"top\"), [getValidDockOperations]);\r\n const validBottomDockOptions = useMemo(() => getValidDockOperations(\"bottom\"), [getValidDockOperations]);\r\n\r\n // Selects a default top tab (during initialization or if the selected tab is removed).\r\n useEffect(() => {\r\n if ((topSelectedTab && !topPanes.includes(topSelectedTab)) || (!topSelectedTab && topPanes.length > 0)) {\r\n setTopSelectedTab(topPanes[0]);\r\n } else if (topSelectedTab && topPanes.length === 0) {\r\n setTopSelectedTab(undefined);\r\n }\r\n }, [topSelectedTab, topPanes]);\r\n\r\n // Selects a default bottom tab (during initialization or if the selected tab is removed).\r\n useEffect(() => {\r\n if ((bottomSelectedTab && !bottomPanes.includes(bottomSelectedTab)) || (!bottomSelectedTab && bottomPanes.length > 0)) {\r\n setBottomSelectedTab(bottomPanes[0]);\r\n } else if (bottomSelectedTab && bottomPanes.length === 0) {\r\n setBottomSelectedTab(undefined);\r\n }\r\n }, [bottomSelectedTab, bottomPanes]);\r\n\r\n // Selects a tab when explicitly requested.\r\n useEffect(() => {\r\n const observer = onSelectSidePane.add((key) => {\r\n const topPane = topPanes.find((entry) => entry.key === key);\r\n if (topPane) {\r\n setTopSelectedTab(topPane);\r\n setCollapsed(false);\r\n }\r\n\r\n const bottomPane = bottomPanes.find((entry) => entry.key === key);\r\n if (bottomPane) {\r\n setBottomSelectedTab(bottomPane);\r\n setCollapsed(false);\r\n }\r\n });\r\n\r\n return () => observer.remove();\r\n }, [topPanes, bottomPanes, onSelectSidePane]);\r\n\r\n const setUndocked = useCallback(\r\n (undocked: boolean) => {\r\n if (!undocked) {\r\n childWindow.current?.close();\r\n } else {\r\n const paneContainer = paneContainerRef.current;\r\n if (!paneContainer) {\r\n // It shouldn't be possible to get here and have this ref be null, but just in case,\r\n // bail out of the undock operation.\r\n childWindow.current?.close();\r\n } else {\r\n // This is the extra buffer needed on top of minWidth to account for window chrome to avoid a horizontal scrollbar.\r\n const widthBuffer = 4;\r\n // This offsets the window's top position to account for window chrome/title bar.\r\n const topOffset = 100;\r\n\r\n // Create the child window with approximately the same location and size as the side pane.\r\n const bounds = paneContainer.getBoundingClientRect();\r\n\r\n childWindow.current?.open({\r\n defaultWidth: Math.max(bounds.width, minWidth + widthBuffer),\r\n defaultHeight: bounds.height - topOffset,\r\n defaultTop: bounds.top + window.screenY + topOffset,\r\n defaultLeft: bounds.left + window.screenX,\r\n title: location === \"left\" ? \"Left\" : \"Right\",\r\n });\r\n }\r\n }\r\n },\r\n [childWindow, location]\r\n );\r\n\r\n const expandCollapseButton = useMemo(() => {\r\n const expandCollapseIcon =\r\n location === \"left\" ? collapsed ? <PanelLeftExpandRegular /> : <PanelLeftContractRegular /> : collapsed ? <PanelRightExpandRegular /> : <PanelRightContractRegular />;\r\n\r\n return (\r\n <Menu positioning=\"below-end\">\r\n <MenuTrigger disableButtonEnhancement={true}>\r\n {(triggerProps) => (\r\n <Tooltip content={collapsed ? \"Show Side Pane\" : \"Hide Side Pane\"}>\r\n <SplitButton\r\n className={mergeClasses(\r\n classes.paneCollapseButton,\r\n toolbarMode === \"compact\"\r\n ? location === \"left\"\r\n ? classes.paneCollapseButtonWithRightBorder\r\n : classes.paneCollapseButtonWithLeftBorder\r\n : undefined\r\n )}\r\n menuButton={triggerProps}\r\n primaryActionButton={{ onClick: onExpandCollapseClick }}\r\n size=\"small\"\r\n appearance=\"transparent\"\r\n icon={expandCollapseIcon}\r\n />\r\n </Tooltip>\r\n )}\r\n </MenuTrigger>\r\n <MenuPopover className={classes.collapseMenuPopover}>\r\n <MenuList>\r\n <MenuItem icon={<PictureInPictureEnterRegular />} onClick={() => setUndocked(true)}>\r\n Undock\r\n </MenuItem>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n );\r\n }, [collapsed, onExpandCollapseClick, location]);\r\n\r\n const createPaneTabList = useCallback(\r\n (\r\n paneComponents: SidePaneDefinition[],\r\n toolbarMode: \"full\" | \"compact\",\r\n selectedTab: SidePaneDefinition | undefined,\r\n setSelectedTab: (tab: SidePaneDefinition | undefined) => void,\r\n dockOptions: Map<DockLocation, (sidePaneKey: string) => void>\r\n ) => {\r\n return (\r\n <>\r\n {paneComponents.length > 0 && (\r\n <div className={`${classes.paneTabListDiv} ${location === \"left\" || toolbarMode === \"compact\" ? classes.paneTabListDivLeft : classes.paneTabListDivRight}`}>\r\n {/* Only render the tab list if there is more than tab. It's kind of pointless to show a tab list with just one tab. */}\r\n {paneComponents.length > 1 && (\r\n <>\r\n <FluentToolbar\r\n className={classes.tabToolbar}\r\n checkedValues={{ selectedTab: [selectedTab?.key ?? \"\"] }}\r\n onCheckedValueChange={(event, data) => {\r\n const tab = paneComponents.find((entry) => entry.key === data.checkedItems[0]);\r\n setSelectedTab(tab);\r\n setCollapsed(false);\r\n }}\r\n >\r\n {paneComponents.map((entry, index) => {\r\n const isSelected = selectedTab?.key === entry.key;\r\n return (\r\n <SidePaneTab\r\n key={entry.key}\r\n location={location}\r\n id={entry.key}\r\n title={entry.title}\r\n icon={entry.icon}\r\n teachingMoment={entry.teachingMoment}\r\n isSelected={isSelected && !collapsed}\r\n isFirst={index === 0}\r\n isLast={index === paneComponents.length - 1}\r\n dockOptions={dockOptions}\r\n />\r\n );\r\n })}\r\n </FluentToolbar>\r\n </>\r\n )}\r\n\r\n {/* When the toolbar mode is \"full\", we add an extra button that allows the side panes to be collapsed. */}\r\n {toolbarMode === \"full\" && (\r\n <Collapse visible={!isChildWindowOpen} orientation=\"horizontal\">\r\n {expandCollapseButton}\r\n </Collapse>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n );\r\n },\r\n [location, collapsed, isChildWindowOpen, expandCollapseButton]\r\n );\r\n\r\n // This memos the TabList to make it easy for the JSX to be inserted at the top of the pane (in \"compact\" mode) or returned to the caller to be used in the toolbar (in \"full\" mode).\r\n const topPaneTabList = useMemo(\r\n () => createPaneTabList(topPanes, toolbarMode, topSelectedTab, setTopSelectedTab, validTopDockOptions),\r\n [createPaneTabList, topPanes, toolbarMode, topSelectedTab]\r\n );\r\n const bottomPaneTabList = useMemo(\r\n () => createPaneTabList(bottomPanes, \"compact\", bottomSelectedTab, setBottomSelectedTab, validBottomDockOptions),\r\n [createPaneTabList, bottomPanes, bottomSelectedTab]\r\n );\r\n\r\n // Memoize the resize onChange handlers so the Fluent hook's element ref callbacks remain stable across renders.\r\n // The contrib hook's returned elementRef callback transitively depends on onChange, so an inline arrow here would\r\n // force the composed refs below to be recreated every render, defeating the ref-stability optimization.\r\n const onPaneWidthChange = useCallback<NonNullable<UseResizeHandleParams[\"onChange\"]>>(\r\n (_event, data) => {\r\n // Whenever the width is adjusted, store the value.\r\n setPaneWidthSetting(data.value);\r\n },\r\n [setPaneWidthSetting]\r\n );\r\n const onPaneHeightChange = useCallback<NonNullable<UseResizeHandleParams[\"onChange\"]>>(\r\n (_event, data) => {\r\n // Whenever the height is adjusted, store the value.\r\n setPaneHeightSetting(data.value);\r\n },\r\n [setPaneHeightSetting]\r\n );\r\n\r\n // This manages the CSS variable that controls the width of the side pane.\r\n const paneWidthAdjustCSSVar = \"--pane-width-adjust\";\r\n const {\r\n elementRef: paneHorizontalResizeElementRef,\r\n handleRef: paneHorizontalResizeHandleRef,\r\n setValue: setPaneWidthAdjust,\r\n } = useResizeHandle({\r\n growDirection: location === \"left\" ? \"end\" : \"start\",\r\n relative: true,\r\n variableName: paneWidthAdjustCSSVar,\r\n variableTarget: \"element\",\r\n minValue: minWidth - defaultWidth,\r\n onChange: onPaneWidthChange,\r\n });\r\n\r\n // This manages the CSS variable that controls the height of the bottom pane.\r\n const paneHeightAdjustCSSVar = \"--pane-height-adjust\";\r\n const {\r\n elementRef: paneVerticalResizeElementRef,\r\n handleRef: paneVerticalResizeHandleRef,\r\n setValue: setPaneHeightAdjust,\r\n } = useResizeHandle({\r\n growDirection: \"up\",\r\n relative: true,\r\n variableName: paneHeightAdjustCSSVar,\r\n variableTarget: \"element\",\r\n onChange: onPaneHeightChange,\r\n });\r\n\r\n // Compose the Fluent hook's element ref callbacks with logic to apply stored settings when elements mount.\r\n // This is necessary because on the initial render, side pane elements may not be in the DOM yet (no panes\r\n // registered). The Fluent hook's setValue will silently fail when the element doesn't exist (in relative mode,\r\n // it measures the element before/after and reverts if unchanged, which always happens when the element is null).\r\n // By composing the ref callback, we ensure the stored value is applied immediately after the element mounts.\r\n //\r\n // We also set the CSS variable directly as a fallback. The hook preserves its internal currentValue across\r\n // re-mounts, so when (for example) the user undocks a resized pane and then re-docks it, currentValue already\r\n // equals the persisted setting and the hook's setValue short-circuits — but the freshly-mounted DOM node has no\r\n // inline CSS variable, so the pane visually reverts to the default width until the user drags. Setting the\r\n // variable directly closes that gap. The order is important: setValue first (handles the first-mount case where\r\n // currentValue starts at 0), then the direct setProperty as a redundant fallback for the no-op case.\r\n const composedHorizontalElementRef = useCallback(\r\n (node: HTMLElement | null) => {\r\n paneHorizontalResizeElementRef(node);\r\n if (node) {\r\n setPaneWidthAdjust(paneWidthSettingRef.current);\r\n node.style.setProperty(paneWidthAdjustCSSVar, `${paneWidthSettingRef.current}px`);\r\n }\r\n },\r\n [paneHorizontalResizeElementRef, setPaneWidthAdjust]\r\n );\r\n const composedVerticalElementRef = useCallback(\r\n (node: HTMLElement | null) => {\r\n paneVerticalResizeElementRef(node);\r\n if (node) {\r\n setPaneHeightAdjust(paneHeightSettingRef.current);\r\n node.style.setProperty(paneHeightAdjustCSSVar, `${paneHeightSettingRef.current}px`);\r\n }\r\n },\r\n [paneVerticalResizeElementRef, setPaneHeightAdjust]\r\n );\r\n\r\n // Handle external setting changes (e.g. settings reset) after elements are already mounted.\r\n useLayoutEffect(() => {\r\n setPaneWidthAdjust(paneWidthSetting);\r\n setPaneHeightAdjust(paneHeightSetting);\r\n }, [paneWidthSetting, paneHeightSetting]);\r\n\r\n // This effect closes the window if all panes have been removed.\r\n useEffect(() => {\r\n if (isChildWindowOpen && topPanes.length === 0 && bottomPanes.length === 0) {\r\n childWindow.current?.close();\r\n }\r\n }, [childWindow, isChildWindowOpen, topPanes, bottomPanes]);\r\n\r\n // This memoizes the pane itself, which may or may not include the tab list, depending on the toolbar mode.\r\n const corePane = useMemo(() => {\r\n return (\r\n <>\r\n {/* If toolbar mode is \"compact\" then the top toolbar is embedded at the top of the pane. */}\r\n {toolbarMode === \"compact\" && (topPanes.length > 1 || topBarItems.length > 0 || (!isChildWindowOpen && (topPanes.length > 0 || bottomPanes.length > 0))) && (\r\n <>\r\n <div className={classes.barDiv}>\r\n {/* The tablist gets merged in with the toolbar. */}\r\n {!isChildWindowOpen && location === \"left\" && expandCollapseButton}\r\n {topPaneTabList}\r\n <Toolbar location=\"top\" components={topBarItems} />\r\n {!isChildWindowOpen && location === \"right\" && expandCollapseButton}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* Render the top pane content. */}\r\n {topPanes.length > 0 && (\r\n <div className={classes.paneContent}>\r\n {topSelectedTab && (\r\n <>\r\n <PaneHeader\r\n id={topSelectedTab.key}\r\n title={topSelectedTab.title}\r\n icon={topPanes.length > 1 ? undefined : topSelectedTab.icon}\r\n dockOptions={validTopDockOptions}\r\n />\r\n {/* Render all panes to retain their state even when they are not selected, but only display the selected pane. */}\r\n {topPanes\r\n .filter((pane) => pane.key === topSelectedTab.key || pane.keepMounted)\r\n .map((pane) => (\r\n <div key={pane.key} className={mergeClasses(classes.paneContent, pane.key !== topSelectedTab.key ? classes.unselectedPane : undefined)}>\r\n <ErrorBoundary name={pane.title}>\r\n <pane.content />\r\n </ErrorBoundary>\r\n </div>\r\n ))}\r\n </>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* If we have both top and bottom panes, show a divider. This divider is also the resizer for the bottom pane. */}\r\n {topPanes.length > 0 && bottomPanes.length > 0 && <Divider ref={paneVerticalResizeHandleRef} className={classes.paneDivider} />}\r\n\r\n {/* Render the bottom pane tablist. */}\r\n {bottomPanes.length > 1 && (\r\n <>\r\n <div className={classes.barDiv}>{bottomPaneTabList}</div>\r\n </>\r\n )}\r\n\r\n {/* Render the bottom pane content. This is the element that can be resized vertically. */}\r\n {bottomPanes.length > 0 && (\r\n <div\r\n ref={composedVerticalElementRef}\r\n className={classes.paneContent}\r\n style={{ height: `clamp(200px, calc(45% + var(${paneHeightAdjustCSSVar}, 0px)), 100% - 300px)`, flex: \"0 0 auto\" }}\r\n >\r\n {bottomSelectedTab && (\r\n <>\r\n <PaneHeader\r\n id={bottomSelectedTab.key}\r\n title={bottomSelectedTab.title}\r\n icon={bottomPanes.length > 1 ? undefined : bottomSelectedTab.icon}\r\n dockOptions={validBottomDockOptions}\r\n />\r\n {/* Render all panes to retain their state even when they are not selected, but only display the selected pane. */}\r\n {bottomPanes\r\n .filter((pane) => pane.key === bottomSelectedTab.key || pane.keepMounted)\r\n .map((pane) => (\r\n <div key={pane.key} className={mergeClasses(classes.paneContent, pane.key !== bottomSelectedTab.key ? classes.unselectedPane : undefined)}>\r\n <ErrorBoundary name={pane.title}>\r\n <pane.content />\r\n </ErrorBoundary>\r\n </div>\r\n ))}\r\n </>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* If toolbar mode is \"compact\" then the bottom toolbar is embedded at the bottom of the pane. */}\r\n {toolbarMode === \"compact\" && bottomBarItems.length > 0 && (\r\n <>\r\n <div className={classes.barDiv}>\r\n <Toolbar location=\"bottom\" components={bottomBarItems} />\r\n </div>\r\n </>\r\n )}\r\n </>\r\n );\r\n }, [\r\n topPanes,\r\n topSelectedTab,\r\n validTopDockOptions,\r\n bottomPanes,\r\n bottomSelectedTab,\r\n validBottomDockOptions,\r\n topBarItems,\r\n bottomBarItems,\r\n topPaneTabList,\r\n bottomPaneTabList,\r\n isChildWindowOpen,\r\n ]);\r\n\r\n // This deals with docked vs undocked state, where undocked is rendered into a separate window via a portal.\r\n const pane = useMemo(() => {\r\n return (\r\n <>\r\n {/* If there is no window state, then we are docked, so render the resizable div and the collapse container. */}\r\n {!isChildWindowOpen && (\r\n <div ref={paneContainerRef} className={classes.paneContainer}>\r\n {(topPanes.length > 0 || bottomPanes.length > 0) && (\r\n <div className={`${classes.pane} ${location === \"left\" ? classes.paneLeft : classes.paneRight}`}>\r\n <Collapse orientation=\"horizontal\" visible={!collapsed}>\r\n <div\r\n ref={composedHorizontalElementRef}\r\n className={classes.paneContainer}\r\n style={{ width: `clamp(${minWidth}px, calc(${defaultWidth}px + var(${paneWidthAdjustCSSVar}, 0px)), 1000px)` }}\r\n >\r\n {corePane}\r\n </div>\r\n </Collapse>\r\n {/* This is the resizer (width) for the pane container. */}\r\n <div\r\n ref={paneHorizontalResizeHandleRef}\r\n className={`${classes.resizer} ${location === \"left\" ? classes.resizerLeft : classes.resizerRight}`}\r\n style={{ pointerEvents: `${collapsed ? \"none\" : \"auto\"}` }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n <ChildWindow imperativeRef={childWindow} onOpenChange={(isOpen) => setIsChildWindowOpen(isOpen)}>\r\n {corePane}\r\n </ChildWindow>\r\n </>\r\n );\r\n }, [collapsed, corePane]);\r\n\r\n const hasPanes = topPanes.length > 0 || bottomPanes.length > 0;\r\n\r\n return [topPaneTabList, pane, collapsed, setCollapsed, isChildWindowOpen, setUndocked, hasPanes] as const;\r\n}\r\n\r\nexport function MakeShellServiceDefinition({\r\n leftPaneDefaultWidth = 350,\r\n leftPaneMinWidth = 350,\r\n rightPaneDefaultWidth = 350,\r\n rightPaneMinWidth = 350,\r\n leftPaneDefaultCollapsed = false,\r\n rightPaneDefaultCollapsed = false,\r\n toolbarMode = \"full\",\r\n sidePaneRemapper = undefined,\r\n}: ShellServiceOptions = {}): ServiceDefinition<[IShellService, IRootComponentService], []> {\r\n return {\r\n friendlyName: \"Shell Service\",\r\n produces: [ShellServiceIdentity, RootComponentServiceIdentity],\r\n factory: () => {\r\n const toolbarItemCollection = new ObservableCollection<Readonly<ToolbarItemDefinition>>();\r\n const sidePaneCollection = new ObservableCollection<Readonly<SidePaneDefinition>>();\r\n const centralContentCollection = new ObservableCollection<Readonly<CentralContentDefinition>>();\r\n\r\n const onSelectSidePane = new Observable<string>(undefined, true);\r\n\r\n const onDockChanged = new Observable<{ location: HorizontalLocation; dock: boolean }>(undefined, true);\r\n const onCollapseChanged = new Observable<{ location: HorizontalLocation; collapsed: boolean }>();\r\n const leftSidePaneContainerState = {\r\n isPresent: false,\r\n isDocked: true,\r\n dock: () => onDockChanged.notifyObservers({ location: \"left\", dock: true }),\r\n undock: () => onDockChanged.notifyObservers({ location: \"left\", dock: false }),\r\n isCollapsed: leftPaneDefaultCollapsed,\r\n collapse: () => onCollapseChanged.notifyObservers({ location: \"left\", collapsed: true }),\r\n expand: () => onCollapseChanged.notifyObservers({ location: \"left\", collapsed: false }),\r\n };\r\n const rightSidePaneContainerState = {\r\n isPresent: false,\r\n isDocked: true,\r\n dock: () => onDockChanged.notifyObservers({ location: \"right\", dock: true }),\r\n undock: () => onDockChanged.notifyObservers({ location: \"right\", dock: false }),\r\n isCollapsed: rightPaneDefaultCollapsed,\r\n collapse: () => onCollapseChanged.notifyObservers({ location: \"right\", collapsed: true }),\r\n expand: () => onCollapseChanged.notifyObservers({ location: \"right\", collapsed: false }),\r\n };\r\n\r\n const rootComponent: FunctionComponent = () => {\r\n const classes = useStyles();\r\n\r\n const [sidePaneDockOverrides, setSidePaneDockOverrides] = useSetting(SidePaneDockOverridesSettingDescriptor);\r\n\r\n // This function returns a promise that resolves after the dock change takes effect so that\r\n // we can then select the re-docked pane.\r\n const pendingPaneReselects = useRef<string[]>([]);\r\n const updateSidePaneDockOverride = useCallback(\r\n (key: string, horizontalLocation: HorizontalLocation, verticalLocation: VerticalLocation) => {\r\n setSidePaneDockOverrides((current) => ({\r\n ...current,\r\n [key]: { horizontalLocation, verticalLocation },\r\n }));\r\n\r\n pendingPaneReselects.current.push(key);\r\n },\r\n [setSidePaneDockOverrides]\r\n );\r\n\r\n const toolbarItems = useOrderedObservableCollection(toolbarItemCollection);\r\n\r\n const sidePanes = useOrderedObservableCollection(sidePaneCollection);\r\n const coercedSidePaneCache = useRef(new Map<string, SidePaneDefinition>());\r\n const coercedSidePanes = useMemo(() => {\r\n // First pass - apply overrides and respect the side pane mode.\r\n const coercedSidePanes = sidePanes\r\n .map((sidePaneDefinition) => {\r\n let coercedSidePane = coercedSidePaneCache.current.get(sidePaneDefinition.key);\r\n if (!coercedSidePane) {\r\n coercedSidePane = { ...sidePaneDefinition };\r\n coercedSidePaneCache.current.set(sidePaneDefinition.key, coercedSidePane);\r\n }\r\n\r\n const override = sidePaneDockOverrides[sidePaneDefinition.key];\r\n if (override) {\r\n // Override (user manually re-docked) has the highest priority.\r\n coercedSidePane.horizontalLocation = override.horizontalLocation;\r\n coercedSidePane.verticalLocation = override.verticalLocation;\r\n } else if (sidePaneRemapper) {\r\n // A side pane remapper has the next highest priority.\r\n const remapping = sidePaneRemapper(sidePaneDefinition);\r\n if (!remapping) {\r\n coercedSidePane = undefined;\r\n } else {\r\n coercedSidePane.horizontalLocation = remapping.horizontalLocation;\r\n coercedSidePane.verticalLocation = remapping.verticalLocation;\r\n }\r\n } else {\r\n // Otherwise use the default defined location.\r\n coercedSidePane.horizontalLocation = sidePaneDefinition.horizontalLocation;\r\n coercedSidePane.verticalLocation = sidePaneDefinition.verticalLocation;\r\n }\r\n\r\n return coercedSidePane;\r\n })\r\n .filter((sidePane): sidePane is SidePaneDefinition => !!sidePane);\r\n\r\n // Second pass - correct any invalid state, specifically if there are only bottom panes, force them to be top panes.\r\n for (const side of [\"left\", \"right\"] as const) {\r\n const topPanes = coercedSidePanes.filter((entry) => entry.horizontalLocation === side && entry.verticalLocation === \"top\");\r\n const bottomPanes = coercedSidePanes.filter((entry) => entry.horizontalLocation === side && entry.verticalLocation === \"bottom\");\r\n if (bottomPanes.length > 0 && topPanes.length === 0) {\r\n for (const pane of bottomPanes) {\r\n pane.verticalLocation = \"top\";\r\n updateSidePaneDockOverride(pane.key, side, \"top\");\r\n }\r\n }\r\n }\r\n\r\n // Cleanup any cached panes that are no longer present.\r\n for (const key of coercedSidePaneCache.current.keys()) {\r\n if (!coercedSidePanes.some((entry) => entry.key === key)) {\r\n coercedSidePaneCache.current.delete(key);\r\n }\r\n }\r\n\r\n return coercedSidePanes;\r\n }, [sidePanes, sidePaneDockOverrides, updateSidePaneDockOverride, sidePaneRemapper]);\r\n\r\n useEffect(() => {\r\n for (const paneKey of pendingPaneReselects.current.splice(0)) {\r\n onSelectSidePane.notifyObservers(paneKey);\r\n }\r\n }, [coercedSidePanes]);\r\n\r\n const sidePaneDockOperations = useMemo(() => {\r\n const sidePaneDockOperations = new Map<DockLocation, (sidePaneKey: string) => void>();\r\n for (const side of [\"left\", \"right\"] as const) {\r\n const currentSidePanes = coercedSidePanes.filter((entry) => entry.horizontalLocation === side);\r\n\r\n const dockTop = (sidePaneKey: string) => {\r\n updateSidePaneDockOverride(sidePaneKey, side, \"top\");\r\n };\r\n const dockBottom = (sidePaneKey: string) => {\r\n updateSidePaneDockOverride(sidePaneKey, side, \"bottom\");\r\n };\r\n\r\n if (currentSidePanes.some((entry) => entry.verticalLocation === \"bottom\")) {\r\n // If there are bottom panes, there must also be top panes, and so top and bottom are valid locations.\r\n sidePaneDockOperations.set(`top-${side}`, dockTop);\r\n sidePaneDockOperations.set(`bottom-${side}`, dockBottom);\r\n } else if (currentSidePanes.length > 0) {\r\n // If there are only top panes, then full and bottom are valid locations.\r\n sidePaneDockOperations.set(`full-${side}`, dockTop);\r\n sidePaneDockOperations.set(`bottom-${side}`, dockBottom);\r\n } else {\r\n // If there are no panes, then only full is a valid location.\r\n sidePaneDockOperations.set(`full-${side}`, dockTop);\r\n }\r\n }\r\n return sidePaneDockOperations;\r\n }, [coercedSidePanes]);\r\n\r\n const hasLeftPanes = coercedSidePanes.some((entry) => entry.horizontalLocation === \"left\");\r\n const hasRightPanes = coercedSidePanes.some((entry) => entry.horizontalLocation === \"right\");\r\n\r\n useEffect(() => {\r\n leftSidePaneContainerState.isPresent = hasLeftPanes;\r\n rightSidePaneContainerState.isPresent = hasRightPanes;\r\n\r\n return () => {\r\n leftSidePaneContainerState.isPresent = false;\r\n rightSidePaneContainerState.isPresent = false;\r\n };\r\n }, [hasLeftPanes, hasRightPanes]);\r\n\r\n // If we are in compact toolbar mode, we may need to move toolbar items from the left to the right or vice versa,\r\n // depending on whether there are any side panes on that side.\r\n const coerceToolBarItemHorizontalLocation = useMemo(\r\n () => (item: Readonly<ToolbarItemDefinition>) => {\r\n let horizontalLocation = item.horizontalLocation;\r\n // Coercion is only needed in compact toolbar mode since there might not be a left or right pane.\r\n if (toolbarMode === \"compact\") {\r\n if (horizontalLocation === \"left\" && !hasLeftPanes) {\r\n horizontalLocation = \"right\";\r\n }\r\n if (horizontalLocation === \"right\" && !hasRightPanes) {\r\n horizontalLocation = \"left\";\r\n }\r\n }\r\n return horizontalLocation;\r\n },\r\n [toolbarMode, hasLeftPanes, hasRightPanes]\r\n );\r\n\r\n const topToolBarItems = useMemo(() => toolbarItems.filter((entry) => entry.verticalLocation === \"top\"), [toolbarItems]);\r\n const bottomToolBarItems = useMemo(() => toolbarItems.filter((entry) => entry.verticalLocation === \"bottom\"), [toolbarItems]);\r\n\r\n const topBarLeftItems = useMemo(\r\n () => topToolBarItems.filter((entry) => coerceToolBarItemHorizontalLocation(entry) === \"left\"),\r\n [topToolBarItems, coerceToolBarItemHorizontalLocation]\r\n );\r\n const topBarRightItems = useMemo(\r\n () => topToolBarItems.filter((entry) => coerceToolBarItemHorizontalLocation(entry) === \"right\"),\r\n [topToolBarItems, coerceToolBarItemHorizontalLocation]\r\n );\r\n const bottomBarLeftItems = useMemo(\r\n () => bottomToolBarItems.filter((entry) => coerceToolBarItemHorizontalLocation(entry) === \"left\"),\r\n [bottomToolBarItems, coerceToolBarItemHorizontalLocation]\r\n );\r\n const bottomBarRightItems = useMemo(\r\n () => bottomToolBarItems.filter((entry) => coerceToolBarItemHorizontalLocation(entry) === \"right\"),\r\n [bottomToolBarItems, coerceToolBarItemHorizontalLocation]\r\n );\r\n\r\n const centralContents = useOrderedObservableCollection(centralContentCollection);\r\n\r\n const [leftPaneTabList, leftPane, leftPaneCollapsed, setLeftPaneCollapsed, leftPaneUndocked, setLeftPaneUndocked, leftPaneHasPanes] = usePane(\r\n \"left\",\r\n leftPaneDefaultWidth,\r\n leftPaneMinWidth,\r\n coercedSidePanes,\r\n onSelectSidePane,\r\n sidePaneDockOperations,\r\n toolbarMode,\r\n topBarLeftItems,\r\n bottomBarLeftItems,\r\n leftPaneDefaultCollapsed\r\n );\r\n\r\n useEffect(() => {\r\n // Propagate shorter lived React component state out to longer lived service state.\r\n leftSidePaneContainerState.isDocked = !leftPaneUndocked;\r\n }, [leftPaneUndocked]);\r\n\r\n useEffect(() => {\r\n // Propagate shorter lived React component state out to longer lived service state.\r\n leftSidePaneContainerState.isCollapsed = leftPaneCollapsed;\r\n }, [leftPaneCollapsed]);\r\n\r\n const [rightPaneTabList, rightPane, rightPaneCollapsed, setRightPaneCollapsed, rightPaneUndocked, setRightPaneUndocked, rightPaneHasPanes] = usePane(\r\n \"right\",\r\n rightPaneDefaultWidth,\r\n rightPaneMinWidth,\r\n coercedSidePanes,\r\n onSelectSidePane,\r\n sidePaneDockOperations,\r\n toolbarMode,\r\n topBarRightItems,\r\n bottomBarRightItems,\r\n rightPaneDefaultCollapsed\r\n );\r\n\r\n useEffect(() => {\r\n // Propagate shorter lived React component state out to longer lived service state.\r\n rightSidePaneContainerState.isDocked = !rightPaneUndocked;\r\n }, [rightPaneUndocked]);\r\n\r\n useEffect(() => {\r\n // Propagate shorter lived React component state out to longer lived service state.\r\n rightSidePaneContainerState.isCollapsed = rightPaneCollapsed;\r\n }, [rightPaneCollapsed]);\r\n\r\n useEffect(() => {\r\n // If at the service level dock state change is requested, propagate to the React component state.\r\n const observer = onDockChanged.add(({ location, dock }) => {\r\n if (location === \"left\") {\r\n setLeftPaneUndocked(!dock);\r\n } else {\r\n setRightPaneUndocked(!dock);\r\n }\r\n });\r\n\r\n return () => {\r\n observer.remove();\r\n leftSidePaneContainerState.isDocked = true;\r\n rightSidePaneContainerState.isDocked = true;\r\n };\r\n }, [setLeftPaneUndocked, setRightPaneUndocked]);\r\n\r\n useEffect(() => {\r\n // If at the service level collapse state change is requested, propagate to the React component state.\r\n const observer = onCollapseChanged.add(({ location, collapsed }) => {\r\n if (location === \"left\") {\r\n setLeftPaneCollapsed(collapsed);\r\n } else {\r\n setRightPaneCollapsed(collapsed);\r\n }\r\n });\r\n\r\n return () => {\r\n observer.remove();\r\n leftSidePaneContainerState.isCollapsed = false;\r\n rightSidePaneContainerState.isCollapsed = false;\r\n };\r\n }, [setLeftPaneCollapsed, setRightPaneCollapsed]);\r\n\r\n return (\r\n <div className={classes.mainView}>\r\n {/* Only render the top toolbar if the toolbar mode is \"full\". Otherwise it will be embedded at the top of the side panes. */}\r\n {toolbarMode === \"full\" && (\r\n <>\r\n <div className={classes.barDiv}>\r\n {leftPaneTabList}\r\n <Toolbar location=\"top\" components={topToolBarItems} />\r\n {rightPaneTabList}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* This renders the side panes and the main/central content. */}\r\n <div className={classes.verticallyCentralContent}>\r\n {/* Render the left pane container. */}\r\n {leftPane}\r\n\r\n {/* Render the main/central content. */}\r\n <div className={classes.centralContent}>\r\n {centralContents.map((entry) => (\r\n <ErrorBoundary key={entry.key} name={entry.key}>\r\n <entry.component />\r\n </ErrorBoundary>\r\n ))}\r\n {toolbarMode === \"compact\" && (\r\n <>\r\n <FluentFade visible={leftPaneCollapsed && leftPaneHasPanes} delay={50} duration={100} unmountOnExit>\r\n <div className={mergeClasses(classes.expandButtonContainer, classes.expandButtonContainerLeft)}>\r\n <Tooltip content=\"Show Side Pane\">\r\n <Button className={classes.expandButton} icon={<PanelLeftExpandRegular />} onClick={() => setLeftPaneCollapsed(false)} />\r\n </Tooltip>\r\n </div>\r\n </FluentFade>\r\n <FluentFade visible={rightPaneCollapsed && rightPaneHasPanes} delay={50} duration={100} unmountOnExit>\r\n <div className={mergeClasses(classes.expandButtonContainer, classes.expandButtonContainerRight)}>\r\n <Tooltip content=\"Show Side Pane\">\r\n <Button className={classes.expandButton} icon={<PanelRightExpandRegular />} onClick={() => setRightPaneCollapsed(false)} />\r\n </Tooltip>\r\n </div>\r\n </FluentFade>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Render the right pane container. */}\r\n {rightPane}\r\n </div>\r\n\r\n {/* Only render the bottom toolbar if the toolbar mode is \"full\". Otherwise it will be embedded at the bottom of the side panes. */}\r\n {toolbarMode === \"full\" && (\r\n <>\r\n <div className={classes.barDiv}>\r\n <Toolbar location=\"bottom\" components={bottomToolBarItems} />\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n };\r\n rootComponent.displayName = \"Shell Service Root\";\r\n\r\n return {\r\n addToolbarItem: (entry) => {\r\n if (!entry.component.displayName) {\r\n entry.component.displayName = `${entry.key} | ${entry.verticalLocation} ${entry.horizontalLocation} bar item`;\r\n }\r\n\r\n return toolbarItemCollection.add(entry);\r\n },\r\n addSidePane: (entry) => {\r\n if (!entry.content.displayName) {\r\n entry.content.displayName = `${entry.key} | ${entry.horizontalLocation} pane`;\r\n }\r\n\r\n return sidePaneCollection.add(entry);\r\n },\r\n addCentralContent: (entry) => centralContentCollection.add(entry),\r\n get leftSidePaneContainer() {\r\n return leftSidePaneContainerState.isPresent ? leftSidePaneContainerState : null;\r\n },\r\n get rightSidePaneContainer() {\r\n return rightSidePaneContainerState.isPresent ? rightSidePaneContainerState : null;\r\n },\r\n onDockChanged,\r\n get sidePanes() {\r\n return [...sidePaneCollection.items].map((sidePaneDefinition) => {\r\n return {\r\n key: sidePaneDefinition.key,\r\n select: () => onSelectSidePane.notifyObservers(sidePaneDefinition.key),\r\n };\r\n });\r\n },\r\n rootComponent,\r\n };\r\n },\r\n };\r\n}\r\n","import { type IDisposable } from \"core/index\";\r\nimport { type DynamicAccordionSection, type DynamicAccordionSectionContent, ExtensibleAccordion } from \"../components/extensibleAccordion\";\r\nimport { type IService, type ServiceDefinition } from \"../modularity/serviceDefinition\";\r\nimport { type IShellService, ShellServiceIdentity } from \"./shellService\";\r\n\r\nimport { SettingsRegular } from \"@fluentui/react-icons\";\r\n\r\nimport { useObservableCollection, useOrderedObservableCollection } from \"../hooks/observableHooks\";\r\nimport { ObservableCollection } from \"../misc/observableCollection\";\r\n\r\n/**\r\n * The unique identity symbol for the settings service.\r\n */\r\nexport const SettingsServiceIdentity = Symbol(\"SettingsService\");\r\n\r\n/**\r\n * Allows new sections or content to be added to the Settings pane.\r\n */\r\nexport interface ISettingsService extends IService<typeof SettingsServiceIdentity> {\r\n /**\r\n * Adds a new section to the settings pane.\r\n * @param section A description of the section to add.\r\n */\r\n addSection(section: DynamicAccordionSection): IDisposable;\r\n\r\n /**\r\n * Adds content to one or more sections in the settings pane.\r\n * @param content A description of the content to add.\r\n */\r\n addSectionContent(content: DynamicAccordionSectionContent<unknown>): IDisposable;\r\n}\r\n\r\nexport const SettingsServiceDefinition: ServiceDefinition<[ISettingsService], [IShellService]> = {\r\n friendlyName: \"Settings\",\r\n consumes: [ShellServiceIdentity],\r\n produces: [SettingsServiceIdentity],\r\n factory: (shellService) => {\r\n const sectionsCollection = new ObservableCollection<DynamicAccordionSection>();\r\n const sectionContentCollection = new ObservableCollection<DynamicAccordionSectionContent<unknown>>();\r\n\r\n const registration = shellService.addSidePane({\r\n key: \"Settings\",\r\n title: \"Settings\",\r\n icon: SettingsRegular,\r\n horizontalLocation: \"right\",\r\n verticalLocation: \"top\",\r\n order: 500,\r\n teachingMoment: false,\r\n content: () => {\r\n const sections = useOrderedObservableCollection(sectionsCollection);\r\n const sectionContent = useObservableCollection(sectionContentCollection);\r\n\r\n return <ExtensibleAccordion sections={sections} sectionContent={sectionContent} context={true} />;\r\n },\r\n });\r\n\r\n return {\r\n addSection: (section) => sectionsCollection.add(section),\r\n addSectionContent: (content) => sectionContentCollection.add(content),\r\n dispose: () => {\r\n registration.dispose();\r\n },\r\n };\r\n },\r\n};\r\n","// Check if BABYLON namespace exists\r\nlet BabylonNamespace = \"\";\r\nconst GlobalObject = typeof global !== \"undefined\" ? global : typeof window !== \"undefined\" ? window : undefined;\r\nif (typeof GlobalObject !== \"undefined\") {\r\n if (typeof (<any>GlobalObject).BABYLON !== \"undefined\") {\r\n BabylonNamespace = \"BABYLON.\";\r\n }\r\n}\r\n\r\n// Inspired by previous copyToClipboard() function which was copying Color3\r\n// Copies strCommand to clipboard\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function copyCommandToClipboard(strCommand: string) {\r\n const element = document.createElement(\"div\");\r\n element.textContent = strCommand;\r\n document.body.appendChild(element);\r\n\r\n if (window.getSelection) {\r\n const range = document.createRange();\r\n range.selectNode(element);\r\n window.getSelection()!.removeAllRanges();\r\n window.getSelection()!.addRange(range);\r\n }\r\n\r\n document.execCommand(\"copy\");\r\n element.remove();\r\n}\r\n\r\n// Return the class name of the considered target\r\n// babylonNamespace is either \"\" (ES6) or \"BABYLON.\"\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function getClassNameWithNamespace(obj: unknown): { className: string; babylonNamespace: string } {\r\n if ((typeof obj !== \"object\" && typeof obj !== \"function\") || obj === null) {\r\n return { className: \"Unknown\", babylonNamespace: \"\" };\r\n }\r\n\r\n const candidate = obj as { getClassName?: () => string; constructor?: { name?: string } };\r\n let className = candidate.getClassName?.() ?? candidate.constructor?.name ?? \"Unknown\";\r\n if (className.includes(\"BABYLON.\")) {\r\n className = className.split(\"BABYLON.\")[1];\r\n }\r\n return { className, babylonNamespace: BabylonNamespace };\r\n}\r\n","import { type PropsWithChildren, forwardRef } from \"react\";\r\n\r\nimport { type ImmutablePrimitiveProps } from \"./primitive\";\r\n\r\nimport { Body1, Caption1, Link as FluentLink } from \"@fluentui/react-components\";\r\n\r\nexport type LinkProps = ImmutablePrimitiveProps<string> & {\r\n /**\r\n * Used if you want to handle the link click yourself\r\n */\r\n onLink?: () => void;\r\n /**\r\n * The URL the link points to\r\n */\r\n url?: string;\r\n /**\r\n * Defines whether to open the link in current tab or new tab. Default is new\r\n */\r\n target?: \"current\" | \"new\";\r\n\r\n /**Force link size */\r\n size?: \"small\" | \"medium\";\r\n};\r\n\r\nexport const Link = forwardRef<HTMLAnchorElement, PropsWithChildren<LinkProps>>((props, ref) => {\r\n const { target, url, onLink, size, ...rest } = props;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const TextComponent = size === \"small\" ? Caption1 : Body1;\r\n\r\n return (\r\n <FluentLink ref={ref} inline target={target === \"current\" ? \"_self\" : \"_blank\"} rel=\"noopener noreferrer\" href={url} onClick={onLink ?? undefined} {...rest}>\r\n {props.children}\r\n <TextComponent>{props.value}</TextComponent>\r\n </FluentLink>\r\n );\r\n});\r\nLink.displayName = \"Link\";\r\n","import { ToggleButton as FluentToggleButton, makeStyles, type TooltipProps } from \"@fluentui/react-components\";\r\nimport { type ButtonProps } from \"./button\";\r\nimport { useCallback, useContext, useEffect, useState, type FunctionComponent } from \"react\";\r\nimport { type FluentIcon } from \"@fluentui/react-icons\";\r\nimport { ToolContext } from \"../hoc/fluentToolWrapper\";\r\nimport { Tooltip } from \"./tooltip\";\r\n\r\nconst useStyles = makeStyles({\r\n button: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n});\r\n\r\ntype ToggleButtonProps = Omit<ButtonProps, \"icon\" | \"onClick\"> & {\r\n value: boolean;\r\n checkedIcon: FluentIcon;\r\n uncheckedIcon?: FluentIcon;\r\n onChange: (checked: boolean) => void;\r\n titlePositioning?: TooltipProps[\"positioning\"];\r\n};\r\n\r\n/**\r\n * Toggles between two states using a button with icons.\r\n * If no disabledIcon is provided, the button will toggle between visual enabled/disabled states without an icon change\r\n *\r\n * @param props\r\n * @returns\r\n */\r\nexport const ToggleButton: FunctionComponent<ToggleButtonProps> = (props) => {\r\n ToggleButton.displayName = \"ToggleButton\";\r\n const { value, onChange, title, appearance = \"subtle\", ariaLabel } = props;\r\n const { size } = useContext(ToolContext);\r\n const classes = useStyles();\r\n const [checked, setChecked] = useState(value);\r\n const toggle = useCallback(() => {\r\n setChecked((prevChecked) => {\r\n const enabled = !prevChecked;\r\n onChange(enabled);\r\n return enabled;\r\n });\r\n }, [onChange]);\r\n\r\n useEffect(() => {\r\n setChecked(props.value);\r\n }, [props.value]);\r\n\r\n return (\r\n <Tooltip content={title ?? \"\"} positioning={props.titlePositioning}>\r\n <FluentToggleButton\r\n className={classes.button}\r\n size={size}\r\n aria-label={ariaLabel ?? title}\r\n icon={checked ? <props.checkedIcon /> : props.uncheckedIcon ? <props.uncheckedIcon /> : <props.checkedIcon />}\r\n appearance={appearance}\r\n checked={checked}\r\n onClick={toggle}\r\n />\r\n </Tooltip>\r\n );\r\n};\r\n","import { type FunctionComponent, type MouseEvent, type MouseEventHandler, useCallback } from \"react\";\r\nimport { Body1Strong, InfoLabel as FluentInfoLabel, makeStyles, mergeClasses } from \"@fluentui/react-components\";\r\nimport { useKeyState } from \"../hooks/keyboardHooks\";\r\n\r\nexport type InfoLabelProps = {\r\n htmlFor: string; // required ID of the element whose label we are applying\r\n info?: JSX.Element;\r\n label: string;\r\n className?: string;\r\n /**\r\n * When true, applies flex layout styling to the label slot for proper truncation in flex containers\r\n */\r\n flexLabel?: boolean;\r\n /**\r\n * Handler for right-click context menu. Also triggers on Ctrl+click.\r\n */\r\n onContextMenu?: MouseEventHandler;\r\n};\r\nexport type InfoLabelParentProps = Omit<InfoLabelProps, \"htmlFor\">;\r\nconst useInfoLabelStyles = makeStyles({\r\n infoPopup: {\r\n whiteSpace: \"normal\",\r\n wordBreak: \"break-word\",\r\n },\r\n labelSlot: {\r\n display: \"flex\",\r\n minWidth: 0,\r\n },\r\n labelText: {\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n },\r\n copyable: {\r\n cursor: \"pointer\",\r\n },\r\n});\r\n/**\r\n * Renders a label with an optional popup containing more info\r\n * @param props\r\n * @returns\r\n */\r\nexport const InfoLabel: FunctionComponent<InfoLabelProps> = (props) => {\r\n InfoLabel.displayName = \"InfoLabel\";\r\n const classes = useInfoLabelStyles();\r\n\r\n const ctrlPressed = useKeyState(\"Control\");\r\n\r\n const infoContent = props.info ? <div className={classes.infoPopup}>{props.info}</div> : undefined;\r\n\r\n const showCopyCursor = ctrlPressed && props.onContextMenu;\r\n\r\n // Handle Ctrl+click as context menu action\r\n const handleClick = useCallback(\r\n (e: MouseEvent) => {\r\n if (e.ctrlKey && props.onContextMenu) {\r\n props.onContextMenu(e);\r\n }\r\n },\r\n [props.onContextMenu]\r\n );\r\n\r\n return infoContent ? (\r\n <FluentInfoLabel\r\n htmlFor={props.htmlFor}\r\n info={infoContent}\r\n className={mergeClasses(props.className, showCopyCursor ? classes.copyable : undefined)}\r\n label={props.flexLabel ? { className: classes.labelSlot } : undefined}\r\n onContextMenu={props.onContextMenu}\r\n onClick={handleClick}\r\n >\r\n <Body1Strong className={classes.labelText}>{props.label}</Body1Strong>\r\n </FluentInfoLabel>\r\n ) : (\r\n <div className={mergeClasses(props.className, showCopyCursor ? classes.copyable : undefined)} onContextMenu={props.onContextMenu} onClick={handleClick}>\r\n <Body1Strong className={classes.labelText}>{props.label}</Body1Strong>\r\n </div>\r\n );\r\n};\r\n","import { Body1, Checkbox, makeStyles, tokens, mergeClasses } from \"@fluentui/react-components\";\r\nimport {\r\n ChevronCircleDown20Regular,\r\n ChevronCircleDown16Regular,\r\n ChevronCircleRight16Regular,\r\n ChevronCircleRight20Regular,\r\n CopyRegular,\r\n Copy16Regular,\r\n} from \"@fluentui/react-icons\";\r\nimport {\r\n type FunctionComponent,\r\n type HTMLProps,\r\n type PropsWithChildren,\r\n type MouseEvent,\r\n useContext,\r\n useState,\r\n forwardRef,\r\n cloneElement,\r\n isValidElement,\r\n useRef,\r\n useCallback,\r\n} from \"react\";\r\nimport { type AccordionSectionItemProps, AccordionSectionItem } from \"../../primitives/accordion\";\r\nimport { Collapse } from \"../../primitives/collapse\";\r\nimport { copyCommandToClipboard } from \"../../../copyCommandToClipboard\";\r\nimport { ToolContext } from \"../fluentToolWrapper\";\r\nimport { type PrimitiveProps } from \"../../primitives/primitive\";\r\nimport { Link } from \"../../primitives/link\";\r\nimport { ToggleButton } from \"../../primitives/toggleButton\";\r\nimport { Button } from \"../../primitives/button\";\r\nimport { CustomTokens, TokenMap } from \"../../primitives/utils\";\r\nimport { InfoLabel } from \"../../primitives/infoLabel\";\r\nimport { Tooltip } from \"../../primitives/tooltip\";\r\nimport { useToast } from \"../../primitives/toast\";\r\n\r\nconst usePropertyLineStyles = makeStyles({\r\n baseLine: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-start\",\r\n width: \"100%\",\r\n },\r\n infoLabel: {\r\n display: \"flex\",\r\n flex: \"1 1 0\", // grow=1, shrink =1, basis = 0 initial size before\r\n minWidth: CustomTokens.labelMinWidth,\r\n overflow: \"hidden\",\r\n textAlign: \"left\",\r\n },\r\n rightContent: {\r\n flex: \"0 1 auto\",\r\n minWidth: 0,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-end\",\r\n },\r\n childWrapper: {\r\n minWidth: 0,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n },\r\n infoPopup: {\r\n whiteSpace: \"normal\",\r\n wordBreak: \"break-word\",\r\n },\r\n copy: {\r\n marginRight: CustomTokens.rightAlignOffset, // Accounts for the padding baked into fluent button / ensures propertyLine looks visually aligned at the right\r\n },\r\n expandedContentDiv: {\r\n overflow: \"hidden\",\r\n paddingLeft: tokens.spacingHorizontalM,\r\n },\r\n checkbox: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n marginRight: tokens.spacingHorizontalXS,\r\n },\r\n checkboxIndicator: {\r\n margin: TokenMap.px2,\r\n width: TokenMap.px12,\r\n height: TokenMap.px12,\r\n },\r\n});\r\n\r\ntype BasePropertyLineProps = {\r\n /**\r\n * The name of the property to display in the property line.\r\n */\r\n label: string;\r\n /**\r\n * The ID of the property line to be used when the label cannot be used as a persistent ID.\r\n *\r\n * Note that when a property line is used within an accordion section, this ID must be unique within that section in order\r\n * for property pinning and filtering to work correctly. If not, error will be shown in console.\r\n */\r\n uniqueId?: string;\r\n /**\r\n * Optional description for the property, shown on hover of the info icon\r\n */\r\n description?: string;\r\n /**\r\n * Optional function returning a string to copy to clipboard.\r\n */\r\n onCopy?: () => string;\r\n /**\r\n * Link to the documentation for this property, available from the info icon either linked from the description (if provided) or default 'docs' text\r\n */\r\n docLink?: string;\r\n};\r\n\r\n// Only require value/onChange/defaultValue props if nullable is true\r\ntype NullableProperty<ValueT> = {\r\n nullable: true;\r\n ignoreNullable: false;\r\n value: ValueT;\r\n onChange: (value: ValueT) => void;\r\n defaultValue?: ValueT;\r\n};\r\n\r\ntype IgnoreNullable<ValueT> = {\r\n ignoreNullable: true;\r\n nullable: false;\r\n value: ValueT;\r\n onChange: (value: ValueT) => void;\r\n defaultValue: ValueT;\r\n};\r\n\r\ntype NonNullableProperty = {\r\n nullable?: false;\r\n ignoreNullable?: false;\r\n};\r\n\r\n// Only expect optional expandByDefault prop if expandedContent is defined\r\ntype ExpandableProperty = {\r\n /**\r\n * If supplied, an 'expand' icon will be shown which, when clicked, renders this component within the property line.\r\n */\r\n expandedContent: JSX.Element;\r\n\r\n /**\r\n * If true, the expanded content will be shown by default.\r\n */\r\n expandByDefault?: boolean;\r\n};\r\n\r\n// If expanded content is undefined, don't expect expandByDefault prop\r\ntype NonExpandableProperty = {\r\n expandedContent?: undefined;\r\n};\r\n\r\nexport type PropertyLineProps<ValueT> = BasePropertyLineProps &\r\n (NullableProperty<ValueT> | NonNullableProperty | IgnoreNullable<ValueT>) &\r\n (ExpandableProperty | NonExpandableProperty);\r\n\r\n/**\r\n * A reusable component that renders a property line with a label and child content, and an optional description, copy button, and expandable section.\r\n *\r\n * @param props - The properties for the PropertyLine component.\r\n * @returns A React element representing the property line.\r\n *\r\n */\r\nexport const PropertyLine = forwardRef<HTMLDivElement, PropsWithChildren<PropertyLineProps<any>>>((props, ref) => {\r\n PropertyLine.displayName = \"PropertyLine\";\r\n const { size } = useContext(ToolContext);\r\n const classes = usePropertyLineStyles();\r\n const { label, uniqueId, onCopy, expandedContent, children, nullable, ignoreNullable } = props;\r\n\r\n const [expanded, setExpanded] = useState(\"expandByDefault\" in props ? props.expandByDefault : false);\r\n const cachedVal = useRef(nullable ? props.value : null);\r\n\r\n const { showToast } = useToast();\r\n\r\n const handleCopy = useCallback(() => {\r\n if (onCopy) {\r\n copyCommandToClipboard(onCopy());\r\n showToast(\"Copied property to clipboard\");\r\n }\r\n }, [onCopy, showToast]);\r\n\r\n const handleContextMenu = useCallback(\r\n (e: MouseEvent) => {\r\n e.preventDefault();\r\n handleCopy();\r\n },\r\n [handleCopy]\r\n );\r\n\r\n const description = props.docLink ? <Link url={props.docLink} value={props.description ?? \"Docs\"} /> : props.description ? <Body1>{props.description}</Body1> : undefined;\r\n\r\n // Process children to handle nullable state -- creating component in disabled state with default value in lieu of null value\r\n const processedChildren =\r\n (nullable || ignoreNullable) && isValidElement(children)\r\n ? cloneElement(children, {\r\n ...children.props,\r\n disabled: children.props.disabled || (nullable && props.value == null),\r\n value: props.value ?? props.defaultValue,\r\n defaultValue: undefined, // Don't pass defaultValue to children as there is no guarantee how this will be used and we can't mix controlled + uncontrolled state\r\n })\r\n : children;\r\n\r\n return (\r\n <LineContainer ref={ref} uniqueId={uniqueId ?? label} label={label}>\r\n <div className={classes.baseLine}>\r\n <InfoLabel className={classes.infoLabel} htmlFor=\"property\" info={description} label={label} flexLabel onContextMenu={onCopy ? handleContextMenu : undefined} />\r\n <div className={classes.rightContent} id=\"property\">\r\n {expandedContent && (\r\n <ToggleButton\r\n title=\"Expand/Collapse property\"\r\n appearance=\"transparent\"\r\n checkedIcon={size === \"small\" ? ChevronCircleDown16Regular : ChevronCircleDown20Regular}\r\n uncheckedIcon={size === \"small\" ? ChevronCircleRight16Regular : ChevronCircleRight20Regular}\r\n value={expanded === true}\r\n onChange={setExpanded}\r\n />\r\n )}\r\n\r\n {nullable && !ignoreNullable && (\r\n // If this is a nullableProperty and ignoreNullable was not sent, display a checkbox used to toggle null ('checked' means 'non null')\r\n <Tooltip content={props.value == null ? \"Enable property\" : \"Disable property (set to null)\"}>\r\n <Checkbox\r\n className={classes.checkbox}\r\n indicator={{ className: classes.checkboxIndicator }}\r\n checked={!(props.value == null)}\r\n onChange={(_, data) => {\r\n if (data.checked) {\r\n // if checked this means we are returning to non-null, use cached value if exists. If no cached value, use default value\r\n cachedVal.current != null ? props.onChange(cachedVal.current) : props.onChange(props.defaultValue);\r\n } else {\r\n // if moving to un-checked state, this means moving to null value. Cache the old value and tell props.onChange(null)\r\n cachedVal.current = props.value;\r\n props.onChange(null);\r\n }\r\n }}\r\n />\r\n </Tooltip>\r\n )}\r\n <div className={classes.childWrapper}>{processedChildren}</div>\r\n {onCopy && <CopyButton onCopy={handleCopy} />}\r\n </div>\r\n </div>\r\n {expandedContent && (\r\n <Collapse visible={!!expanded}>\r\n <div className={classes.expandedContentDiv}>{expandedContent}</div>\r\n </Collapse>\r\n )}\r\n </LineContainer>\r\n );\r\n});\r\n\r\nconst useLineStyles = makeStyles({\r\n container: {\r\n width: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\", // Stack line + expanded content\r\n minHeight: CustomTokens.lineHeight,\r\n boxSizing: \"border-box\",\r\n justifyContent: \"center\",\r\n paddingTop: tokens.spacingVerticalXXS,\r\n paddingBottom: tokens.spacingVerticalXXS,\r\n borderTop: `1px solid transparent`,\r\n borderBottom: `1px solid transparent`,\r\n \":hover\": {\r\n borderTopColor: tokens.colorNeutralStroke2,\r\n borderBottomColor: tokens.colorNeutralStroke2,\r\n },\r\n },\r\n containerSmall: {\r\n minHeight: CustomTokens.lineHeightSmall,\r\n },\r\n});\r\n\r\nexport const LineContainer = forwardRef<HTMLDivElement, PropsWithChildren<HTMLProps<HTMLDivElement> & AccordionSectionItemProps>>((props, ref) => {\r\n const { size } = useContext(ToolContext);\r\n const { children, uniqueId, label, ...rest } = props;\r\n const classes = useLineStyles();\r\n\r\n return (\r\n <AccordionSectionItem uniqueId={uniqueId} label={label}>\r\n <div ref={ref} className={mergeClasses(classes.container, size == \"small\" ? classes.containerSmall : undefined)} {...rest}>\r\n {children}\r\n </div>\r\n </AccordionSectionItem>\r\n );\r\n});\r\n\r\n/**\r\n * Copy button that reads ToolContext at its own position in the tree.\r\n * This allows AccordionSectionItem's ToolContext.Provider override (e.g. ctrl+hover) to control visibility.\r\n * @returns The copy button element.\r\n */\r\nconst CopyButton: FunctionComponent<{ onCopy: () => void }> = ({ onCopy }) => {\r\n const { disableCopy, size } = useContext(ToolContext);\r\n const classes = usePropertyLineStyles();\r\n\r\n if (disableCopy) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Tooltip content=\"Copy to Clipboard\">\r\n <Button className={classes.copy} appearance=\"transparent\" icon={size === \"small\" ? Copy16Regular : CopyRegular} onClick={onCopy} />\r\n </Tooltip>\r\n );\r\n};\r\n\r\nexport const PlaceholderPropertyLine: FunctionComponent<PrimitiveProps<any> & PropertyLineProps<any>> = (props) => {\r\n return (\r\n <PropertyLine {...props}>\r\n <Body1>{props.value}</Body1>\r\n </PropertyLine>\r\n );\r\n};\r\n","import { type SwitchOnChangeData, makeStyles, Switch as FluentSwitch, mergeClasses } from \"@fluentui/react-components\";\r\nimport { type ChangeEvent, type FunctionComponent, useContext, useEffect, useState } from \"react\";\r\nimport { type PrimitiveProps } from \"./primitive\";\r\n\r\nimport { ToolContext } from \"../hoc/fluentToolWrapper\";\r\n\r\nconst useSwitchStyles = makeStyles({\r\n switch: {\r\n marginLeft: \"auto\",\r\n },\r\n switchSmall: {\r\n transform: `scale(.85)`, // workaround since we cannot resize fluent switch\r\n transformOrigin: \"right\",\r\n },\r\n indicator: {\r\n margin: 0, // Remove the default right margin so the switch aligns well on the right side inside panels like the properties pane.\r\n },\r\n});\r\n\r\nexport type SwitchProps = PrimitiveProps<boolean>;\r\n\r\n/**\r\n * This is a primitive fluent boolean switch component whose only knowledge is the shared styling across all tools\r\n * @param props\r\n * @returns Switch component\r\n */\r\nexport const Switch: FunctionComponent<SwitchProps> = (props) => {\r\n Switch.displayName = \"Switch\";\r\n const { size } = useContext(ToolContext);\r\n const classes = useSwitchStyles();\r\n const [checked, setChecked] = useState(() => props.value ?? false);\r\n\r\n useEffect(() => {\r\n if (props.value != undefined) {\r\n setChecked(props.value); // Update local state when props.checked changes\r\n }\r\n }, [props.value]);\r\n\r\n const onChange = (event: ChangeEvent<HTMLInputElement>, _: SwitchOnChangeData) => {\r\n props.onChange && props.onChange(event.target.checked);\r\n setChecked(event.target.checked);\r\n };\r\n\r\n return (\r\n <FluentSwitch\r\n className={mergeClasses(classes.switch, size === \"small\" && classes.switchSmall)}\r\n indicator={{ className: classes.indicator }}\r\n checked={checked}\r\n disabled={props.disabled}\r\n onChange={onChange}\r\n />\r\n );\r\n};\r\n","import { PropertyLine, type PropertyLineProps } from \"./propertyLine\";\r\nimport { type FunctionComponent } from \"react\";\r\nimport { Switch, type SwitchProps } from \"../../primitives/switch\";\r\n\r\n/**\r\n * Wraps a switch in a property line\r\n * @param props - The properties for the switch and property line\r\n * @returns A React element representing the property line with a switch\r\n */\r\nexport const SwitchPropertyLine: FunctionComponent<PropertyLineProps<boolean> & SwitchProps> = (props) => {\r\n SwitchPropertyLine.displayName = \"SwitchPropertyLine\";\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { label, ...switchProps } = props;\r\n // Ensure the label gets passed to the PropertyLine component and not to the underlying switch\r\n return (\r\n <PropertyLine {...props}>\r\n <Switch {...switchProps} />\r\n </PropertyLine>\r\n );\r\n};\r\n","import { type IDisposable, type IReadonlyObservable, type Nullable } from \"core/index\";\r\nimport { type IService, type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\nimport { type ISettingsService, SettingsServiceIdentity } from \"shared-ui-components/modularTool/services/settingsService\";\r\nimport { type ISettingsStore, type SettingDescriptor, SettingsStoreIdentity } from \"shared-ui-components/modularTool/services/settingsStore\";\r\nimport { type IShellService, ShellServiceIdentity } from \"shared-ui-components/modularTool/services/shellService\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { SwitchPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/switchPropertyLine\";\r\nimport { useSetting } from \"shared-ui-components/modularTool/hooks/settingsHooks\";\r\nimport { InterceptFunction } from \"../instrumentation/functionInstrumentation\";\r\n\r\n/**\r\n * The unique identity symbol for the selection service.\r\n */\r\nexport const SelectionServiceIdentity = Symbol(\"SelectionService\");\r\n\r\n/**\r\n * Tracks the currently selected entity.\r\n */\r\nexport interface ISelectionService extends IService<typeof SelectionServiceIdentity> {\r\n /**\r\n * Gets or sets the currently selected entity.\r\n */\r\n selectedEntity: Nullable<object>;\r\n\r\n /**\r\n * An observable that notifies when the selected entity changes.\r\n */\r\n readonly onSelectedEntityChanged: IReadonlyObservable<void>;\r\n}\r\n\r\nconst ShowPropertiesOnSelectionSettingDescriptor: SettingDescriptor<boolean> = {\r\n key: \"ShowPropertiesOnSelection\",\r\n defaultValue: true,\r\n};\r\n\r\n/**\r\n * Tracks the currently selected entity. This service is product agnostic: it starts with no selection,\r\n * and each product decides which entity (if any) is selected by default.\r\n */\r\nexport const SelectionServiceDefinition: ServiceDefinition<[ISelectionService], [IShellService, ISettingsStore, ISettingsService]> = {\r\n friendlyName: \"Selection Service\",\r\n produces: [SelectionServiceIdentity],\r\n consumes: [ShellServiceIdentity, SettingsStoreIdentity, SettingsServiceIdentity],\r\n factory: (shellService, settingsStore, settingsService) => {\r\n settingsService.addSectionContent({\r\n key: \"Selection Service Settings\",\r\n section: \"UI\",\r\n component: () => {\r\n const [showPropertiesOnEntitySelection, setShowPropertiesOnEntitySelection] = useSetting(ShowPropertiesOnSelectionSettingDescriptor);\r\n\r\n return (\r\n <SwitchPropertyLine\r\n label=\"Show Properties on Selection\"\r\n description=\"Automatically open the properties pane when an entity is selected.\"\r\n value={showPropertiesOnEntitySelection}\r\n onChange={(checked) => {\r\n setShowPropertiesOnEntitySelection(checked);\r\n }}\r\n />\r\n );\r\n },\r\n });\r\n\r\n let selectedEntityState: Nullable<object> = null;\r\n const selectedEntityObservable = new Observable<void>();\r\n let disposedHook: Nullable<IDisposable> = null;\r\n\r\n const setSelectedItem = (item: Nullable<object>) => {\r\n if (item !== selectedEntityState) {\r\n disposedHook?.dispose();\r\n disposedHook = null;\r\n\r\n selectedEntityState = item;\r\n selectedEntityObservable.notifyObservers();\r\n\r\n if (item) {\r\n const disposable = item as Partial<IDisposable>;\r\n if (typeof disposable.dispose === \"function\") {\r\n disposedHook = InterceptFunction(disposable, \"dispose\", { afterCall: () => setSelectedItem(null) });\r\n }\r\n }\r\n\r\n // Expose the selected entity through a global variable. This is an Inspector v1 feature that people have found useful.\r\n (globalThis as Record<string, unknown>).debugNode = item;\r\n\r\n // Automatically open the properties pane when an entity is selected.\r\n if (item && settingsStore.readSetting(ShowPropertiesOnSelectionSettingDescriptor)) {\r\n shellService.sidePanes.find((pane) => pane.key === \"Properties\")?.select();\r\n }\r\n }\r\n };\r\n\r\n return {\r\n get selectedEntity() {\r\n return selectedEntityState;\r\n },\r\n set selectedEntity(item: Nullable<object>) {\r\n setSelectedItem(item);\r\n },\r\n onSelectedEntityChanged: selectedEntityObservable,\r\n dispose: () => selectedEntityObservable.clear(),\r\n };\r\n },\r\n};\r\n","import { useCallback, useRef, useState } from \"react\";\r\n\r\n/**\r\n * A hook that provides a transient state value and a \"pulse\" function to set it.\r\n * The transient value is meant to be consumed immediately after being set, and will be cleared on the next render.\r\n * @typeParam T The type of the transient value.\r\n * @returns A tuple containing the transient value and a function to \"pulse\" the state.\r\n */\r\nexport function useImpulse<T>(): [T | undefined, (value: T) => void] {\r\n const impulseRef = useRef<T | undefined>(undefined);\r\n const [, setVersion] = useState(0);\r\n\r\n const pulse = useCallback((value: T) => {\r\n impulseRef.current = value;\r\n setVersion((v) => v + 1);\r\n }, []);\r\n\r\n // Consume the impulse value and clear it\r\n const value = impulseRef.current;\r\n impulseRef.current = undefined;\r\n\r\n return [value, pulse];\r\n}\r\n","import { Body1Strong, makeStyles, tokens } from \"@fluentui/react-components\";\r\n\r\nimport { ExtensibleAccordion } from \"shared-ui-components/modularTool/components/extensibleAccordion\";\r\n\r\nconst useStyles = makeStyles({\r\n placeholderDiv: {\r\n padding: `${tokens.spacingVerticalM} ${tokens.spacingHorizontalM}`,\r\n },\r\n});\r\n\r\nexport const PropertiesPane: typeof ExtensibleAccordion<unknown> = (props) => {\r\n const classes = useStyles();\r\n\r\n const entity = props.context;\r\n\r\n return entity != null ? (\r\n <ExtensibleAccordion {...props} />\r\n ) : (\r\n <div className={classes.placeholderDiv}>\r\n <Body1Strong italic>No entity selected.</Body1Strong>\r\n </div>\r\n );\r\n};\r\n","import { type IDisposable, type IReadonlyObservable } from \"core/index\";\r\nimport { type DynamicAccordionSection, type DynamicAccordionSectionContent, type SectionsImperativeRef } from \"shared-ui-components/modularTool/components/extensibleAccordion\";\r\nimport { type PropertyChangeInfo, PropertyContext } from \"../../../contexts/propertyContext\";\r\nimport { type IService, type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\nimport { type ISelectionService, SelectionServiceIdentity } from \"../../selectionService\";\r\nimport { type IShellService, ShellServiceIdentity } from \"shared-ui-components/modularTool/services/shellService\";\r\n\r\nimport { DocumentTextRegular } from \"@fluentui/react-icons\";\r\nimport { useEffect, useMemo, useRef } from \"react\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { useImpulse } from \"shared-ui-components/fluent/hooks/transientStateHooks\";\r\nimport { PropertiesPane } from \"../../../components/properties/propertiesPane\";\r\nimport { useObservableCollection, useObservableState, useOrderedObservableCollection } from \"shared-ui-components/modularTool/hooks/observableHooks\";\r\nimport { ObservableCollection } from \"shared-ui-components/modularTool/misc/observableCollection\";\r\n\r\n/**\r\n * The unique identity symbol for the properties service.\r\n */\r\nexport const PropertiesServiceIdentity = Symbol(\"PropertiesService\");\r\n\r\ntype PropertiesSectionContent<EntityT> = {\r\n /**\r\n * A unique key for the the content.\r\n */\r\n key: string;\r\n\r\n /**\r\n * A predicate function to determine if the content applies to the given entity.\r\n */\r\n predicate: (entity: unknown) => entity is EntityT;\r\n} & {\r\n content: readonly Omit<DynamicAccordionSectionContent<EntityT>, \"key\">[];\r\n};\r\n\r\n/**\r\n * Allows new sections or content to be added to the properties pane.\r\n */\r\nexport interface IPropertiesService extends IService<typeof PropertiesServiceIdentity> {\r\n /**\r\n * Adds a new section (e.g. \"General\", \"Transforms\", etc.).\r\n * @param section A description of the section to add.\r\n */\r\n addSection(section: DynamicAccordionSection): IDisposable;\r\n\r\n /**\r\n * Adds content to one or more sections.\r\n * @param content A description of the content to add.\r\n */\r\n addSectionContent<EntityT>(content: PropertiesSectionContent<EntityT>): IDisposable;\r\n\r\n /**\r\n * Highlights the specified sections temporarily to draw the user's attention to them.\r\n * @remarks All other sections are collapsed (but can be expanded by the user) until a different entity is selected.\r\n * @param sectionIds The identities of the sections to highlight.\r\n */\r\n highlightSections(sectionIds: readonly string[]): void;\r\n\r\n /**\r\n * An observable that notifies when a property has been changed by the user.\r\n * @remarks This observable only fires for changes made through the properties pane.\r\n */\r\n readonly onPropertyChanged: IReadonlyObservable<PropertyChangeInfo>;\r\n}\r\n\r\n/**\r\n * Provides a properties pane that enables displaying and editing properties of an entity such as a mesh or a texture.\r\n */\r\nexport const PropertiesServiceDefinition: ServiceDefinition<[IPropertiesService], [IShellService, ISelectionService]> = {\r\n friendlyName: \"Properties Editor\",\r\n produces: [PropertiesServiceIdentity],\r\n consumes: [ShellServiceIdentity, SelectionServiceIdentity],\r\n factory: (shellService, selectionService) => {\r\n const sectionsCollection = new ObservableCollection<DynamicAccordionSection>();\r\n const sectionContentCollection = new ObservableCollection<PropertiesSectionContent<unknown>>();\r\n const onPropertyChanged = new Observable<PropertyChangeInfo>();\r\n const onHighlightSectionsRequested = new Observable<readonly string[]>(undefined, true);\r\n\r\n const registration = shellService.addSidePane({\r\n key: \"Properties\",\r\n title: \"Properties\",\r\n icon: DocumentTextRegular,\r\n horizontalLocation: \"right\",\r\n verticalLocation: \"top\",\r\n order: 100,\r\n teachingMoment: false,\r\n keepMounted: true,\r\n content: () => {\r\n const sections = useOrderedObservableCollection(sectionsCollection);\r\n const sectionContent = useObservableCollection(sectionContentCollection);\r\n const entity = useObservableState(() => selectionService.selectedEntity, selectionService.onSelectedEntityChanged);\r\n const applicableContent = useMemo(\r\n () =>\r\n entity\r\n ? sectionContent\r\n .filter((section) => section.predicate(entity))\r\n .flatMap((section) => {\r\n return section.content.map((content) => {\r\n return {\r\n key: section.key,\r\n section: content.section,\r\n order: content.order,\r\n component: content.component,\r\n };\r\n });\r\n })\r\n : [],\r\n [sectionContent, entity]\r\n );\r\n\r\n const sectionsRef = useRef<SectionsImperativeRef>(null);\r\n\r\n // The selected entity may be set at the same time as a highlight is requested.\r\n // To account for this, we need to wait for one React render to complete before\r\n // requesting the section highlight.\r\n const [pendingHighlight, pulsePendingHighlightSections] = useImpulse<readonly string[]>();\r\n\r\n useEffect(() => {\r\n const observer = onHighlightSectionsRequested.add((sectionIds) => {\r\n // Now this UI component is observing, so we don't need to cache pending requests anymore.\r\n onHighlightSectionsRequested.notifyIfTriggered = false;\r\n onHighlightSectionsRequested.cleanLastNotifiedState();\r\n pulsePendingHighlightSections(sectionIds);\r\n });\r\n\r\n return () => {\r\n observer.remove();\r\n // Now this UI component is no longer observing, so we need to cache pending requests again.\r\n onHighlightSectionsRequested.notifyIfTriggered = true;\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (pendingHighlight && sectionsRef.current) {\r\n sectionsRef.current.highlightSections(pendingHighlight);\r\n }\r\n }, [pendingHighlight]);\r\n\r\n return (\r\n <PropertyContext.Provider value={{ onPropertyChanged }}>\r\n <PropertiesPane\r\n uniqueId=\"Properties\"\r\n sections={sections}\r\n sectionContent={applicableContent}\r\n context={entity}\r\n sectionsRef={sectionsRef}\r\n enablePinnedItems\r\n enableHiddenItems\r\n enableSearchItems\r\n />\r\n </PropertyContext.Provider>\r\n );\r\n },\r\n });\r\n\r\n return {\r\n addSection: (section) => sectionsCollection.add(section),\r\n addSectionContent: (content) => sectionContentCollection.add(content as PropertiesSectionContent<unknown>),\r\n onPropertyChanged,\r\n highlightSections: (sectionIds: readonly string[]) => onHighlightSectionsRequested.notifyObservers(sectionIds),\r\n dispose: () => registration.dispose(),\r\n };\r\n },\r\n};\r\n","import { type Context } from \"react\";\r\n\r\nimport { type IDisposable } from \"core/index\";\r\nimport { type IService } from \"../modularity/serviceDefinition\";\r\n\r\n/**\r\n * The unique identity symbol for the react context service.\r\n */\r\nexport const ReactContextServiceIdentity = Symbol(\"ReactContextService\");\r\n\r\nexport type ReactContextHandle<T> = IDisposable & {\r\n updateValue: (newValue: T) => void;\r\n};\r\n\r\n/**\r\n * ReactContextService allows global React contexts to be added/removed/updated.\r\n */\r\nexport interface IReactContextService extends IService<typeof ReactContextServiceIdentity> {\r\n addContext<T>(provider: Context<T>[\"Provider\"], initialValue: T, options?: { order?: number }): ReactContextHandle<T>;\r\n}\r\n","import { Dropdown as FluentDropdown, makeStyles, mergeClasses, Option, useId } from \"@fluentui/react-components\";\r\nimport { useContext, useEffect, useState, type FunctionComponent } from \"react\";\r\nimport { type PrimitiveProps } from \"./primitive\";\r\nimport { InfoLabel } from \"./infoLabel\";\r\nimport { ToolContext } from \"../hoc/fluentToolWrapper\";\r\n\r\nconst useDropdownStyles = makeStyles({\r\n dropdown: {\r\n minWidth: 0,\r\n width: \"100%\",\r\n },\r\n container: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\", // align items vertically\r\n },\r\n dropdownText: { textAlign: \"end\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\", overflowX: \"hidden\" },\r\n});\r\n\r\nexport type AcceptedDropdownValue = string | number;\r\nexport type DropdownOption<T extends AcceptedDropdownValue> = {\r\n /**\r\n * Defines the visible part of the option\r\n */\r\n label: string;\r\n /**\r\n * Defines the value part of the option\r\n */\r\n value: T;\r\n};\r\n\r\nexport type DropdownProps<V extends AcceptedDropdownValue> = PrimitiveProps<V> & {\r\n options: readonly DropdownOption<V>[];\r\n};\r\n\r\n/**\r\n * Renders a fluent UI dropdown component for the options passed in, and an additional 'Not Defined' option if null is set to true\r\n * This component can handle both null and undefined values\r\n * @param props\r\n * @returns dropdown component\r\n */\r\nexport const Dropdown: FunctionComponent<DropdownProps<AcceptedDropdownValue>> = (props) => {\r\n Dropdown.displayName = \"Dropdown\";\r\n const classes = useDropdownStyles();\r\n const { options, value } = props;\r\n const [defaultVal, setDefaultVal] = useState(props.value);\r\n const { size } = useContext(ToolContext);\r\n\r\n useEffect(() => {\r\n setDefaultVal(value);\r\n }, [props.value]);\r\n const id = useId(\"dropdown\");\r\n\r\n const mergedClassName = mergeClasses(classes.container, props.className);\r\n\r\n const optionLabel = options.find((o) => o.value === defaultVal)?.label;\r\n\r\n return (\r\n <div className={mergedClassName}>\r\n {props.infoLabel && <InfoLabel {...props.infoLabel} htmlFor={id} />}\r\n <FluentDropdown\r\n id={id}\r\n disabled={props.disabled}\r\n size={size}\r\n className={classes.dropdown}\r\n button={<span className={classes.dropdownText}>{optionLabel}</span>}\r\n onOptionSelect={(evt, data) => {\r\n const value = typeof props.value === \"number\" ? Number(data.optionValue) : data.optionValue;\r\n if (value !== undefined) {\r\n setDefaultVal(value);\r\n props.onChange(value);\r\n }\r\n }}\r\n selectedOptions={[defaultVal.toString()]}\r\n value={optionLabel}\r\n >\r\n {options.map((option: DropdownOption<AcceptedDropdownValue>) => (\r\n <Option key={option.label} value={option.value.toString()} disabled={false}>\r\n {option.label}\r\n </Option>\r\n ))}\r\n </FluentDropdown>\r\n </div>\r\n );\r\n};\r\n\r\nexport const NumberDropdown = Dropdown as FunctionComponent<DropdownProps<number>>;\r\nexport const StringDropdown = Dropdown as FunctionComponent<DropdownProps<string>>;\r\n","import { makeStyles } from \"@fluentui/react-components\";\r\nimport { Dropdown, type AcceptedDropdownValue, type DropdownProps } from \"../../primitives/dropdown\";\r\nimport { PropertyLine, type PropertyLineProps } from \"./propertyLine\";\r\nimport { forwardRef, type FunctionComponent } from \"react\";\r\nimport { UniformWidthStyling } from \"../../primitives/utils\";\r\n\r\nconst useStyles = makeStyles({\r\n dropdown: {\r\n ...UniformWidthStyling,\r\n },\r\n});\r\n\r\ntype DropdownPropertyLineProps<V extends AcceptedDropdownValue> = DropdownProps<V> & PropertyLineProps<V>;\r\n\r\n/**\r\n * Wraps a dropdown in a property line\r\n * @param props - PropertyLineProps and DropdownProps\r\n * @returns property-line wrapped dropdown\r\n */\r\n\r\nexport const DropdownPropertyLine = forwardRef<HTMLDivElement, DropdownPropertyLineProps<AcceptedDropdownValue>>((props, ref) => {\r\n DropdownPropertyLine.displayName = \"DropdownPropertyLine\";\r\n const classes = useStyles();\r\n return (\r\n <PropertyLine {...props} ref={ref}>\r\n <Dropdown {...props} className={classes.dropdown} />\r\n </PropertyLine>\r\n );\r\n});\r\n\r\n/**\r\n * Dropdown component for number values.\r\n */\r\nexport const NumberDropdownPropertyLine = DropdownPropertyLine as FunctionComponent<DropdownPropertyLineProps<number>>;\r\n/**\r\n * Dropdown component for string values\r\n */\r\nexport const StringDropdownPropertyLine = DropdownPropertyLine as FunctionComponent<DropdownPropertyLineProps<string>>;\r\n","import { type ChangeEvent, type FocusEvent, type KeyboardEvent, type PointerEvent, forwardRef, useCallback, useContext, useEffect, useRef, useState } from \"react\";\r\n\r\nimport { type PrimitiveProps } from \"./primitive\";\r\n\r\nimport { Input, makeStyles, mergeClasses, tokens, useId, useMergedRefs } from \"@fluentui/react-components\";\r\nimport { ArrowBidirectionalUpDownFilled } from \"@fluentui/react-icons\";\r\n\r\nimport { ToolContext } from \"../hoc/fluentToolWrapper\";\r\nimport { useKeyState } from \"../hooks/keyboardHooks\";\r\nimport { InfoLabel } from \"./infoLabel\";\r\nimport { CalculatePrecision, HandleKeyDown, HandleOnBlur, useInputStyles } from \"./utils\";\r\n\r\nfunction CoerceStepValue(step: number, isFineKeyPressed: boolean, isCourseKeyPressed: boolean): number {\r\n // When the fine key is pressed, decrease step by a factor of 10.\r\n if (isFineKeyPressed) {\r\n return step * 0.1;\r\n }\r\n\r\n // When the course key is pressed, increase step by a factor of 10.\r\n if (isCourseKeyPressed) {\r\n return step * 10;\r\n }\r\n\r\n return step;\r\n}\r\n\r\n// Parse the raw input into a number, supporting plain numeric values and arbitrary math expressions\r\n// (e.g. \"10*60\" for 10 minutes in seconds).\r\n// First, try Number() so plain numeric input works even under a strict Content-Security-Policy that\r\n// disallows eval/Function. Only fall back to the Function constructor for non-numeric inputs that may\r\n// be expressions. Empty/whitespace input returns NaN so validateValue rejects it rather than committing\r\n// 0 (which is what Number(\"\") would otherwise return).\r\n// Non-finite results (NaN, +/-Infinity) are rejected from both paths so callers don't have to handle them.\r\nfunction EvaluateExpression(rawValue: string): number {\r\n rawValue = rawValue.trim();\r\n if (rawValue.length === 0) {\r\n return NaN;\r\n }\r\n\r\n const value = Number(rawValue);\r\n if (Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n try {\r\n const result = Number(Function(`\"use strict\";return (${rawValue})`)());\r\n return Number.isFinite(result) ? result : NaN;\r\n } catch {\r\n return NaN;\r\n }\r\n}\r\n\r\nexport type SpinButtonProps = PrimitiveProps<number> & {\r\n min?: number;\r\n max?: number;\r\n /** Determines how much the spinbutton increments with the arrow keys. Note this also determines the precision value (# of decimals in display value)\r\n * i.e. if step = 1, precision = 0. step = 0.0089, precision = 4. step = 300, precision = 2. step = 23.00, precision = 2. */\r\n step?: number;\r\n unit?: string;\r\n forceInt?: boolean;\r\n validator?: (value: number) => boolean;\r\n /** Optional fixed precision (number of decimal digits). Overrides the automatically computed display precision. */\r\n precision?: number;\r\n /** Optional className for the input element */\r\n inputClassName?: string;\r\n /** When true, hides the drag-to-scrub button */\r\n disableDragButton?: boolean;\r\n};\r\n\r\nconst useStyles = makeStyles({\r\n icon: {\r\n \"&:hover\": {\r\n color: tokens.colorBrandForeground1,\r\n },\r\n },\r\n});\r\n\r\n/**\r\n * A numeric input with a vertical drag-to-scrub icon (ArrowsBidirectionalRegular rotated 90°).\r\n * Click-and-drag up/down on the icon to increment/decrement the value.\r\n */\r\nexport const SpinButton = forwardRef<HTMLInputElement, SpinButtonProps>((props, ref) => {\r\n SpinButton.displayName = \"SpinButton2\";\r\n const inputClasses = useInputStyles();\r\n const classes = useStyles();\r\n const { size } = useContext(ToolContext);\r\n\r\n const { min, max } = props;\r\n const baseStep = props.step ?? 1;\r\n\r\n // Local ref for the input element so we can blur it programmatically (e.g. when a drag starts while editing).\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n const mergedRef = useMergedRefs(ref, inputRef);\r\n\r\n // Modifier keys for step coercion.\r\n const isAltKeyPressed = useKeyState(\"Alt\", { preventDefault: true });\r\n const isShiftKeyPressed = useKeyState(\"Shift\");\r\n\r\n const step = CoerceStepValue(baseStep, isAltKeyPressed, isShiftKeyPressed);\r\n const stepPrecision = Math.max(0, CalculatePrecision(step));\r\n\r\n const [value, setValue] = useState<number>(props.value ?? 0);\r\n const lastCommittedValue = useRef(props.value);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const scrubStartYRef = useRef(0);\r\n const scrubStartValueRef = useRef(0);\r\n const lastPointerYRef = useRef(0);\r\n const [isHovered, setIsHovered] = useState(false);\r\n\r\n // Editing state: when the user is typing, we show their raw text rather than the formatted value.\r\n const [isEditing, setIsEditing] = useState(false);\r\n const [editText, setEditText] = useState(\"\");\r\n\r\n const valuePrecision = Math.max(0, CalculatePrecision(value));\r\n // Display precision: controls how many decimals are shown in the formatted displayValue. Cap at 4 to avoid wild numbers.\r\n // If a fixed precision prop is provided, use it instead.\r\n const displayPrecision = props.precision ?? Math.min(4, Math.max(stepPrecision, valuePrecision));\r\n\r\n // Format a number for display: toFixed, then trim trailing zeros and period unless a fixed precision is specified.\r\n const formatValue = useCallback(\r\n (v: number) => {\r\n const fixed = v.toFixed(displayPrecision);\r\n if (props.precision !== undefined) {\r\n return fixed;\r\n }\r\n return fixed.replace(/(\\.\\d*?)0+$/, \"$1\").replace(/\\.$/, \"\");\r\n },\r\n [displayPrecision, props.precision]\r\n );\r\n\r\n useEffect(() => {\r\n if (!isDragging && props.value !== lastCommittedValue.current) {\r\n lastCommittedValue.current = props.value;\r\n setValue(props.value ?? 0);\r\n }\r\n }, [props.value, isDragging]);\r\n\r\n const validateValue = useCallback(\r\n (numericValue: number): boolean => {\r\n const outOfBounds = (min !== undefined && numericValue < min) || (max !== undefined && numericValue > max);\r\n const failsValidator = props.validator && !props.validator(numericValue);\r\n const failsIntCheck = props.forceInt ? !Number.isInteger(numericValue) : false;\r\n const invalid = !!outOfBounds || !!failsValidator || isNaN(numericValue) || !!failsIntCheck;\r\n return !invalid;\r\n },\r\n [min, max, props.validator, props.forceInt]\r\n );\r\n\r\n // Constrain a value to the valid range by clamping to [min, max].\r\n const constrainValue = useCallback((v: number) => Math.min(max ?? Infinity, Math.max(min ?? -Infinity, v)), [min, max]);\r\n\r\n const tryCommitValue = useCallback(\r\n (currVal: number) => {\r\n if (validateValue(currVal) && currVal !== lastCommittedValue.current) {\r\n lastCommittedValue.current = currVal;\r\n props.onChange(currVal);\r\n }\r\n },\r\n [validateValue, props.onChange]\r\n );\r\n\r\n const handleInputChange = useCallback((_: ChangeEvent, data: { value: string }) => {\r\n // Just update the raw text — no evaluation or commit until Enter/blur.\r\n setEditText(data.value);\r\n }, []);\r\n\r\n // Evaluate the current edit text and commit the value. Returns the clamped value if valid, or undefined.\r\n const commitEditText = useCallback(\r\n (text: string): number | undefined => {\r\n const numericValue = EvaluateExpression(text);\r\n if (!isNaN(numericValue) && validateValue(numericValue)) {\r\n const constrained = constrainValue(numericValue);\r\n setValue(constrained);\r\n tryCommitValue(constrained);\r\n return constrained;\r\n }\r\n return undefined;\r\n },\r\n [validateValue, constrainValue, tryCommitValue]\r\n );\r\n\r\n const handleIconPointerDown = useCallback(\r\n (e: PointerEvent<Element>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n // If the input was being edited, commit the current text and blur the input\r\n // so the focus state stays consistent after the drag ends.\r\n let startValue = value;\r\n if (isEditing) {\r\n const committed = commitEditText(editText);\r\n if (committed !== undefined) {\r\n startValue = committed;\r\n }\r\n setIsEditing(false);\r\n }\r\n // Blur the active element to ensure we can observe document level modifier keys.\r\n (inputRef.current?.ownerDocument.activeElement as Partial<HTMLElement>)?.blur?.();\r\n setIsDragging(true);\r\n scrubStartYRef.current = e.clientY;\r\n scrubStartValueRef.current = startValue;\r\n e.currentTarget.setPointerCapture(e.pointerId);\r\n },\r\n [value, isEditing, editText, commitEditText]\r\n );\r\n\r\n // When the step size changes during a drag (e.g. Shift/Alt pressed or released), reset the scrub reference point\r\n // to the current value and pointer position so only future movement uses the new step.\r\n useEffect(() => {\r\n if (isDragging) {\r\n scrubStartValueRef.current = value;\r\n scrubStartYRef.current = lastPointerYRef.current;\r\n }\r\n }, [step]);\r\n\r\n const handleIconPointerMove = useCallback(\r\n (e: PointerEvent) => {\r\n if (!isDragging) {\r\n return;\r\n }\r\n lastPointerYRef.current = e.clientY;\r\n // Dragging up (negative dy) should increment, dragging down should decrement.\r\n // Scale delta by step but round to display precision (not step) for smooth fine-grained control.\r\n const dy = scrubStartYRef.current - e.clientY;\r\n // 5 is just a number that \"feels right\" for the drag sensitivity — it determines how far the user needs to drag to change the value by 1 step.\r\n const delta = (dy * step) / 5;\r\n const raw = scrubStartValueRef.current + delta;\r\n const precisionFactor = Math.pow(10, displayPrecision);\r\n const rounded = Math.round(raw * precisionFactor) / precisionFactor;\r\n const constrained = constrainValue(rounded);\r\n setValue(constrained);\r\n tryCommitValue(constrained);\r\n },\r\n [isDragging, step, displayPrecision, constrainValue, tryCommitValue]\r\n );\r\n\r\n const handleIconPointerUp = useCallback((e: PointerEvent<Element>) => {\r\n setIsDragging(false);\r\n e.currentTarget.releasePointerCapture(e.pointerId);\r\n }, []);\r\n\r\n const handleKeyDown = useCallback(\r\n (event: KeyboardEvent<HTMLInputElement>) => {\r\n // Commit on Enter and blur the input if the value is valid.\r\n if (event.key === \"Enter\") {\r\n const committed = commitEditText(event.currentTarget.value);\r\n if (committed !== undefined) {\r\n inputRef.current?.blur();\r\n }\r\n }\r\n\r\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\r\n event.preventDefault();\r\n const direction = event.key === \"ArrowUp\" ? 1 : -1;\r\n const newValue = constrainValue(Math.round((value + direction * step) / step) * step);\r\n setValue(newValue);\r\n tryCommitValue(newValue);\r\n // Update edit text to reflect the new value so the user sees the change\r\n setEditText(formatValue(newValue));\r\n }\r\n\r\n // Ignore modifier keys so the useKeyState calls above can still observe them.\r\n if (event.key !== \"Alt\" && event.key !== \"Shift\") {\r\n HandleKeyDown(event);\r\n }\r\n },\r\n [value, step, constrainValue, tryCommitValue, commitEditText, formatValue]\r\n );\r\n\r\n const id = useId(\"spin-button2\");\r\n\r\n // Real-time validation: when editing, validate the expression; otherwise validate the committed value.\r\n // (validateValue already handles NaN, so no separate isNaN check needed.)\r\n const isInputInvalid = !validateValue(isEditing ? EvaluateExpression(editText) : value);\r\n\r\n const mergedClassName = mergeClasses(inputClasses.inputFill, isInputInvalid ? inputClasses.invalid : \"\");\r\n const inputSlotClassName = mergeClasses(inputClasses.inputSlot, props.inputClassName);\r\n\r\n const formattedValue = formatValue(value);\r\n\r\n const handleFocus = useCallback(() => {\r\n setIsEditing(true);\r\n setEditText(formattedValue);\r\n }, [formattedValue]);\r\n\r\n const handleBlur = useCallback(\r\n (event: FocusEvent<HTMLInputElement>) => {\r\n // Skip blur handling if a drag just started (icon pointerDown already committed).\r\n if (isDragging) {\r\n return;\r\n }\r\n commitEditText(event.target.value);\r\n setIsEditing(false);\r\n HandleOnBlur(event);\r\n },\r\n [commitEditText, isDragging]\r\n );\r\n\r\n const contentBefore =\r\n !props.disableDragButton && !props.disabled && (isHovered || isDragging) && !isInputInvalid ? (\r\n <ArrowBidirectionalUpDownFilled\r\n className={classes.icon}\r\n style={{ cursor: isDragging ? \"ns-resize\" : \"pointer\" }}\r\n onPointerDown={handleIconPointerDown}\r\n onPointerMove={handleIconPointerMove}\r\n onPointerUp={handleIconPointerUp}\r\n />\r\n ) : undefined;\r\n\r\n const input = (\r\n <div\r\n className={props.infoLabel ? undefined : props.className}\r\n onPointerEnter={(e) => e.pointerType === \"mouse\" && setIsHovered(true)}\r\n onPointerLeave={() => {\r\n if (!isDragging) {\r\n setIsHovered(false);\r\n }\r\n }}\r\n >\r\n <Input\r\n ref={mergedRef}\r\n id={id}\r\n appearance=\"outline\"\r\n size={size}\r\n className={mergedClassName}\r\n input={{ className: inputSlotClassName }}\r\n value={isEditing ? editText : formattedValue}\r\n disabled={props.disabled}\r\n onChange={handleInputChange}\r\n onFocus={handleFocus}\r\n onKeyDown={handleKeyDown}\r\n onBlur={handleBlur}\r\n contentBefore={contentBefore}\r\n contentAfter={props.unit}\r\n />\r\n </div>\r\n );\r\n\r\n return props.infoLabel ? (\r\n <div className={mergeClasses(inputClasses.container, props.className)}>\r\n <InfoLabel {...props.infoLabel} htmlFor={id} />\r\n {input}\r\n </div>\r\n ) : (\r\n input\r\n );\r\n});\r\n","import { type SliderOnChangeData, Slider as FluentSlider } from \"@fluentui/react-components\";\r\nimport { type ChangeEvent, type FunctionComponent, useEffect, useState, useRef, useContext } from \"react\";\r\nimport { type PrimitiveProps } from \"./primitive\";\r\nimport { ToolContext } from \"../hoc/fluentToolWrapper\";\r\n\r\nexport type SliderProps = PrimitiveProps<number> & {\r\n /** Minimum value for the slider */\r\n min?: number;\r\n /** Maximum value for the slider */\r\n max?: number;\r\n /** Step size for the slider */\r\n step?: number;\r\n /** When true, onChange is only called when the user releases the slider, not during drag */\r\n notifyOnlyOnRelease?: boolean;\r\n /** Optional pointer down handler */\r\n onPointerDown?: () => void;\r\n /** Optional pointer up handler */\r\n onPointerUp?: () => void;\r\n};\r\n\r\n/**\r\n * A slider primitive that wraps the Fluent UI Slider with step scaling, drag tracking, and optional notify-on-release behavior.\r\n * Follows the same pattern as other primitives (e.g. Switch) — no wrapper divs, just the Fluent component with logic.\r\n * @param props\r\n * @returns Slider component\r\n */\r\nexport const Slider: FunctionComponent<SliderProps> = (props) => {\r\n Slider.displayName = \"Slider\";\r\n const { size } = useContext(ToolContext);\r\n const [value, setValue] = useState<number>(props.value ?? 0);\r\n const pendingValueRef = useRef<number>(undefined);\r\n const isDraggingRef = useRef(false);\r\n\r\n // NOTE: The Fluent slider will add tick marks if the step prop is anything other than undefined.\r\n // To avoid this, we scale the min/max based on the step so we can always make step undefined.\r\n // The actual step size in the Fluent slider is 1 when it is set to undefined.\r\n const min = props.min ?? 0;\r\n const max = props.max ?? 100;\r\n const step = props.step ?? 1;\r\n\r\n useEffect(() => {\r\n !isDraggingRef.current && setValue(props.value ?? 0); // Update local state when props.value changes as long as user is not actively dragging\r\n }, [props.value]);\r\n\r\n const handleSliderChange = (_: ChangeEvent<HTMLInputElement>, data: SliderOnChangeData) => {\r\n const newValue = data.value * step;\r\n setValue(newValue);\r\n\r\n if (props.notifyOnlyOnRelease) {\r\n // Store the value but don't notify parent yet\r\n pendingValueRef.current = newValue;\r\n } else {\r\n // Notify parent as slider changes\r\n props.onChange(newValue);\r\n }\r\n };\r\n\r\n const handleSliderPointerDown = () => {\r\n isDraggingRef.current = true;\r\n };\r\n\r\n const handleSliderPointerUp = () => {\r\n if (props.notifyOnlyOnRelease && isDraggingRef.current && pendingValueRef.current !== undefined) {\r\n props.onChange(pendingValueRef.current);\r\n pendingValueRef.current = undefined;\r\n }\r\n isDraggingRef.current = false;\r\n };\r\n\r\n return (\r\n <FluentSlider\r\n className={props.className}\r\n size={size}\r\n min={min / step}\r\n max={max / step}\r\n step={undefined}\r\n value={value / step}\r\n disabled={props.disabled}\r\n onChange={handleSliderChange}\r\n onPointerDown={() => {\r\n handleSliderPointerDown();\r\n props.onPointerDown?.();\r\n }}\r\n onPointerUp={() => {\r\n handleSliderPointerUp();\r\n props.onPointerUp?.();\r\n }}\r\n />\r\n );\r\n};\r\n","import { type FunctionComponent, useEffect, useState, useRef } from \"react\";\r\nimport { makeStyles, mergeClasses } from \"@fluentui/react-components\";\r\nimport { SpinButton } from \"./spinButton\";\r\nimport { Slider } from \"./slider\";\r\nimport { type PrimitiveProps } from \"./primitive\";\r\nimport { InfoLabel } from \"./infoLabel\";\r\n\r\nconst useSyncedSliderStyles = makeStyles({\r\n container: { display: \"flex\", minWidth: 0 },\r\n syncedSlider: {\r\n flex: \"1 1 0\",\r\n flexDirection: \"row\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n minWidth: 0,\r\n },\r\n // Default: 50/50 split between slider and spinbutton\r\n slider: {\r\n flex: \"1 1 0\",\r\n minWidth: 0,\r\n },\r\n spinButton: {\r\n flex: \"1 1 0\",\r\n minWidth: 0,\r\n },\r\n spinButtonInput: {\r\n minWidth: \"0\",\r\n },\r\n // compact/growSlider overrides for standalone (non-PropertyLine) usage\r\n compactSlider: {\r\n flex: \"1 1 auto\",\r\n minWidth: \"50px\",\r\n maxWidth: \"75px\",\r\n },\r\n growSlider: {\r\n flex: \"1 1 auto\",\r\n minWidth: \"50px\",\r\n },\r\n compactSpinButton: {\r\n width: \"65px\",\r\n minWidth: \"65px\",\r\n maxWidth: \"65px\",\r\n },\r\n compactSpinButtonInput: {\r\n minWidth: \"0\",\r\n },\r\n});\r\n\r\nexport type SyncedSliderProps = PrimitiveProps<number> & {\r\n /** Minimum value for the slider */\r\n min?: number;\r\n /** Maximum value for the slider */\r\n max?: number;\r\n /** Step size for the slider */\r\n step?: number;\r\n /** Optional fixed precision (number of decimal digits). Overrides the automatically computed display precision. */\r\n precision?: number;\r\n /** Displayed in the ux to indicate unit of measurement */\r\n unit?: string;\r\n /** When true, onChange is only called when the user releases the slider, not during drag */\r\n notifyOnlyOnRelease?: boolean;\r\n /** When true, slider grows to fill space and SpinButton is fixed at 65px */\r\n compact?: boolean;\r\n /** When true, slider grows to fill all available space (no maxWidth constraint) */\r\n growSlider?: boolean;\r\n};\r\n\r\n/**\r\n * Component which synchronizes a slider and an input field, allowing the user to change the value using either control\r\n * @param props\r\n * @returns SyncedSlider component\r\n */\r\nexport const SyncedSliderInput: FunctionComponent<SyncedSliderProps> = (props) => {\r\n SyncedSliderInput.displayName = \"SyncedSliderInput\";\r\n const { infoLabel, ...passthroughProps } = props;\r\n const classes = useSyncedSliderStyles();\r\n const [value, setValue] = useState<number>(props.value ?? 0);\r\n const pendingValueRef = useRef<number>(undefined);\r\n const isDraggingRef = useRef(false);\r\n\r\n useEffect(() => {\r\n !isDraggingRef.current && setValue(props.value ?? 0); // Update local state when props.value changes as long as user is not actively dragging\r\n }, [props.value]);\r\n\r\n const handleSliderChange = (newValue: number) => {\r\n setValue(newValue);\r\n\r\n if (props.notifyOnlyOnRelease) {\r\n // Store the value but don't notify parent yet\r\n pendingValueRef.current = newValue;\r\n } else {\r\n // Notify parent as slider changes\r\n props.onChange(newValue);\r\n }\r\n };\r\n\r\n const handleSliderPointerDown = () => {\r\n isDraggingRef.current = true;\r\n };\r\n\r\n const handleSliderPointerUp = () => {\r\n if (props.notifyOnlyOnRelease && isDraggingRef.current && pendingValueRef.current !== undefined) {\r\n props.onChange(pendingValueRef.current);\r\n pendingValueRef.current = undefined;\r\n }\r\n isDraggingRef.current = false;\r\n };\r\n\r\n const handleInputChange = (value: number) => {\r\n setValue(value);\r\n props.onChange(value); // Input always updates immediately\r\n };\r\n\r\n const hasSlider = props.min !== undefined && props.max !== undefined;\r\n const useCompactSizing = props.compact || props.growSlider;\r\n\r\n const getSliderClassName = () => {\r\n if (props.growSlider) {\r\n return classes.growSlider;\r\n }\r\n if (props.compact) {\r\n return classes.compactSlider;\r\n }\r\n return classes.slider;\r\n };\r\n\r\n return (\r\n <div className={mergeClasses(classes.container, props.className)}>\r\n {infoLabel && <InfoLabel {...infoLabel} htmlFor={\"syncedSlider\"} />}\r\n <div id=\"syncedSlider\" className={classes.syncedSlider}>\r\n {hasSlider && (\r\n <Slider\r\n className={getSliderClassName()}\r\n value={value}\r\n onChange={handleSliderChange}\r\n min={props.min}\r\n max={props.max}\r\n step={props.step}\r\n disabled={props.disabled}\r\n onPointerDown={handleSliderPointerDown}\r\n onPointerUp={handleSliderPointerUp}\r\n />\r\n )}\r\n <SpinButton\r\n {...passthroughProps}\r\n className={useCompactSizing ? classes.compactSpinButton : classes.spinButton}\r\n inputClassName={useCompactSizing ? classes.compactSpinButtonInput : classes.spinButtonInput}\r\n value={value}\r\n onChange={handleInputChange}\r\n step={props.step}\r\n disabled={props.disabled}\r\n disableDragButton\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import { PropertyLine, type PropertyLineProps } from \"./propertyLine\";\r\nimport { SyncedSliderInput, type SyncedSliderProps } from \"../../primitives/syncedSlider\";\r\nimport { forwardRef } from \"react\";\r\nimport { makeStyles, mergeClasses } from \"@fluentui/react-components\";\r\nimport { UniformWidthStyling } from \"../../primitives/utils\";\r\n\r\nconst useStyles = makeStyles({\r\n uniformWidth: {\r\n ...UniformWidthStyling,\r\n },\r\n});\r\n\r\ntype SyncedSliderPropertyProps = SyncedSliderProps & PropertyLineProps<number>;\r\n/**\r\n * Renders a simple wrapper around the SyncedSliderInput\r\n * @param props\r\n * @returns\r\n */\r\nexport const SyncedSliderPropertyLine = forwardRef<HTMLDivElement, SyncedSliderPropertyProps>((props, ref): React.ReactElement => {\r\n SyncedSliderPropertyLine.displayName = \"SyncedSliderPropertyLine\";\r\n const classes = useStyles();\r\n const { label, description, ...sliderProps } = props;\r\n return (\r\n <PropertyLine ref={ref} {...props}>\r\n <SyncedSliderInput {...sliderProps} className={mergeClasses(classes.uniformWidth, props.className)} />\r\n </PropertyLine>\r\n );\r\n});\r\n","import { type IDisposable, type Nullable } from \"core/index\";\nimport { type DropdownOption } from \"shared-ui-components/fluent/primitives/dropdown\";\nimport { type IService, type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\nimport { type ISettingsService, SettingsServiceIdentity } from \"shared-ui-components/modularTool/services/settingsService\";\nimport { type ISettingsStore, type SettingDescriptor, SettingsStoreIdentity } from \"shared-ui-components/modularTool/services/settingsStore\";\nimport { type IShellService, ShellServiceIdentity } from \"shared-ui-components/modularTool/services/shellService\";\nimport { type IReactContextService, type ReactContextHandle, ReactContextServiceIdentity } from \"shared-ui-components/modularTool/services/reactContextService\";\n\nimport { ArrowClockwiseRegular } from \"@fluentui/react-icons\";\n\nimport { Observable } from \"core/Misc/observable\";\nimport { DropdownPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/dropdownPropertyLine\";\nimport { SyncedSliderPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/syncedSliderPropertyLine\";\nimport { Button } from \"shared-ui-components/fluent/primitives/button\";\nimport { Collapse } from \"shared-ui-components/fluent/primitives/collapse\";\nimport { WatcherContext } from \"../contexts/watcherContext\";\nimport { useSetting } from \"shared-ui-components/modularTool/hooks/settingsHooks\";\nimport { InterceptProperty } from \"../instrumentation/propertyInstrumentation\";\nimport { DefaultToolbarItemOrder } from \"./defaultToolbarMetadata\";\n\ntype InterceptSettings = {\n mode: \"intercept\";\n};\n\ntype PollingSettings = {\n mode: \"polling\";\n interval: number;\n};\n\ntype ManualSettings = {\n mode: \"manual\";\n};\n\ntype WatcherSettings = InterceptSettings | PollingSettings | ManualSettings;\n\nconst WatcherSettingDescriptor: SettingDescriptor<WatcherSettings> = {\n key: \"WatcherSettings\",\n defaultValue: {\n mode: \"intercept\",\n },\n};\n\ntype WatcherServiceOptions = {\n /**\n * The watcher settings used when no settings have been persisted.\n */\n defaultSettings?: WatcherSettings;\n\n /**\n * The watcher modes supported by this Inspector target.\n */\n supportedModes?: readonly WatcherSettings[\"mode\"][];\n\n /**\n * The fallback interval for computed values when interception is the preferred mode.\n */\n computedValuePollingInterval?: number;\n};\n\n/**\n * The unique identity symbol for the watcher service.\n */\nexport const WatcherServiceIdentity = Symbol(\"WatcherService\");\n\n/**\n * Watches for property changes on objects, using either interception, polling, or manual refresh.\n */\nexport interface IWatcherService extends IService<typeof WatcherServiceIdentity> {\n /**\n * Watches a property on an object and calls the callback whenever it changes.\n * @param target The object containing the property to watch.\n * @param propertyKey The key of the property to watch.\n * @param onChanged A callback that is called with the new value when the property changes.\n * @returns A disposable that stops watching when disposed.\n */\n watchProperty<T extends object, K extends keyof T>(\n target: T,\n propertyKey: string extends K ? never : number extends K ? never : symbol extends K ? never : K,\n onChanged: (value: NonNullable<T[K]>) => void\n ): IDisposable;\n\n /**\n * Watches a property on an object and calls the callback whenever it changes.\n * @param target The object containing the property to watch.\n * @param propertyKey The key of the property to watch.\n * @param onChanged A callback that is called with the new value when the property changes.\n * @returns A disposable that stops watching when disposed.\n */\n watchProperty<T extends object>(target: T, propertyKey: keyof T, onChanged: (value: unknown) => void): IDisposable;\n\n /**\n * Watches a computed value and calls the callback whenever it changes. Computed values use fallback\n * polling when interception is preferred, the configured interval in polling mode, and explicit\n * refreshes in manual mode.\n * @param getValue A function that returns the current value.\n * @param onChanged A callback that is called with the new value when it changes.\n * @param equals An optional equality comparison. Defaults to {@link Object.is}.\n * @returns A disposable that stops watching when disposed.\n */\n watchValue<T>(getValue: () => T, onChanged: (value: T) => void, equals?: (left: T, right: T) => boolean): IDisposable;\n\n /**\n * Manually triggers a refresh of all watched properties.\n */\n refresh(): void;\n}\n\nconst AllWatchModes = [\n { label: \"Interception\", value: \"intercept\" },\n { label: \"Polling\", value: \"polling\" },\n { label: \"Manual\", value: \"manual\" },\n] as const satisfies DropdownOption<WatcherSettings[\"mode\"]>[];\n\n/**\n * Creates the watcher services for a specific Inspector target.\n * @param options Options that control the default and supported watcher modes.\n * @returns Service definitions for watching values, configuring the watcher, and manually refreshing it.\n */\nexport function MakeWatcherServiceDefinitions(options: WatcherServiceOptions = {}) {\n const supportedModes = options.supportedModes ?? AllWatchModes.map((option) => option.value);\n const defaultSettings = options.defaultSettings ?? WatcherSettingDescriptor.defaultValue;\n const computedValuePollingInterval = options.computedValuePollingInterval ?? 250;\n const settingDescriptor: SettingDescriptor<WatcherSettings> = {\n key: WatcherSettingDescriptor.key,\n defaultValue: defaultSettings,\n };\n const normalizeSettings = (settings: WatcherSettings) => (supportedModes.includes(settings.mode) ? settings : defaultSettings);\n\n const watcherServiceDefinition: ServiceDefinition<[IWatcherService], [ISettingsStore, IReactContextService]> = {\n friendlyName: \"Watcher Service\",\n produces: [WatcherServiceIdentity],\n consumes: [SettingsStoreIdentity, ReactContextServiceIdentity],\n factory: (settingsStore, reactContextService) => {\n const refreshObservable = new Observable<void>();\n const propertyWatchers = new Set<{ setMode: (mode: WatcherSettings[\"mode\"]) => void; dispose: () => void }>();\n const computedValueWatchers = new Set<IDisposable>();\n let pollingHandle: Nullable<number> = null;\n let activePollingInterval: Nullable<number> = null;\n let isDisposed = false;\n let currentSettings = normalizeSettings(settingsStore.readSetting(settingDescriptor));\n\n const updatePolling = () => {\n let desiredPollingInterval: Nullable<number> = null;\n if (!isDisposed) {\n if (currentSettings.mode === \"polling\") {\n desiredPollingInterval = currentSettings.interval;\n } else if (currentSettings.mode === \"intercept\" && computedValueWatchers.size > 0) {\n desiredPollingInterval = computedValuePollingInterval;\n }\n }\n\n if (desiredPollingInterval === activePollingInterval) {\n return;\n }\n if (pollingHandle !== null) {\n clearInterval(pollingHandle);\n pollingHandle = null;\n }\n\n if (desiredPollingInterval !== null) {\n pollingHandle = window.setInterval(() => {\n refreshObservable.notifyObservers();\n }, desiredPollingInterval);\n }\n activePollingInterval = desiredPollingInterval;\n };\n\n const applySettings = () => {\n currentSettings = normalizeSettings(settingsStore.readSetting(settingDescriptor));\n updatePolling();\n\n for (const watcher of propertyWatchers) {\n watcher.setMode(currentSettings.mode);\n }\n };\n\n const settingsStoreObserver = settingsStore.onChanged.add((key: string) => {\n if (key === settingDescriptor.key) {\n applySettings();\n }\n });\n\n applySettings();\n\n const watcherService: IWatcherService & Partial<IDisposable> = {\n watchProperty<T extends object>(target: T, propertyKey: keyof T, onChanged: (value: unknown) => void): IDisposable {\n let previousValue: unknown = target[propertyKey];\n let interceptToken: Nullable<IDisposable> = null;\n let refreshObserver: Nullable<ReturnType<typeof refreshObservable.add>> = null;\n let isIntercepting: Nullable<boolean> = null;\n let isDisposed = false;\n\n const notifyIfChanged = () => {\n const currentValue = target[propertyKey];\n if (!Object.is(previousValue, currentValue)) {\n previousValue = currentValue;\n onChanged(currentValue);\n }\n };\n\n const propertyWatcher = {\n setMode: (mode: WatcherSettings[\"mode\"]) => {\n const shouldIntercept = mode === \"intercept\";\n if (shouldIntercept === isIntercepting) {\n return;\n }\n\n interceptToken?.dispose();\n interceptToken = null;\n refreshObserver?.remove();\n refreshObserver = null;\n\n if (shouldIntercept) {\n notifyIfChanged();\n interceptToken = InterceptProperty(target, propertyKey, {\n afterSet: (value) => {\n previousValue = value;\n onChanged(value);\n },\n });\n } else {\n refreshObserver = refreshObservable.add(notifyIfChanged);\n }\n isIntercepting = shouldIntercept;\n },\n dispose: () => {\n if (!isDisposed) {\n interceptToken?.dispose();\n refreshObserver?.remove();\n propertyWatchers.delete(propertyWatcher);\n isDisposed = true;\n }\n },\n };\n\n propertyWatcher.setMode(currentSettings.mode);\n propertyWatchers.add(propertyWatcher);\n\n return propertyWatcher;\n },\n watchValue<T>(getValue: () => T, onChanged: (value: T) => void, equals: (left: T, right: T) => boolean = Object.is): IDisposable {\n let previousValue = getValue();\n const observer = refreshObservable.add(() => {\n const currentValue = getValue();\n if (!equals(previousValue, currentValue)) {\n previousValue = currentValue;\n onChanged(currentValue);\n }\n });\n let isWatcherDisposed = false;\n const computedValueWatcher = {\n dispose: () => {\n if (!isWatcherDisposed) {\n observer.remove();\n computedValueWatchers.delete(computedValueWatcher);\n updatePolling();\n isWatcherDisposed = true;\n }\n },\n };\n computedValueWatchers.add(computedValueWatcher);\n updatePolling();\n\n return computedValueWatcher;\n },\n refresh: () => {\n refreshObservable.notifyObservers();\n },\n dispose: () => {\n isDisposed = true;\n contextHandle.dispose();\n\n for (const watcher of [...propertyWatchers]) {\n watcher.dispose();\n }\n for (const watcher of [...computedValueWatchers]) {\n watcher.dispose();\n }\n\n if (pollingHandle !== null) {\n clearInterval(pollingHandle);\n pollingHandle = null;\n }\n activePollingInterval = null;\n\n refreshObservable.clear();\n settingsStoreObserver.remove();\n },\n };\n\n // Register the WatcherContext provider so React components can access the watcher service.\n const contextHandle: ReactContextHandle<IWatcherService> = reactContextService.addContext(WatcherContext.Provider, watcherService);\n\n return watcherService;\n },\n };\n\n const watchModes = AllWatchModes.filter((option) => supportedModes.includes(option.value));\n\n const watcherSettingsServiceDefinition: ServiceDefinition<[], [ISettingsService]> = {\n friendlyName: \"Watcher Settings Service\",\n consumes: [SettingsServiceIdentity],\n factory: (settingsService) => {\n const settingsRegistration = settingsService.addSectionContent({\n key: \"watcherSettings\",\n section: \"UI\",\n component: () => {\n const [storedWatcherSettings, setWatcherSettings] = useSetting(settingDescriptor);\n const watcherSettings = normalizeSettings(storedWatcherSettings);\n\n return (\n <>\n <DropdownPropertyLine\n label=\"Preferred Watch Mode\"\n description={`Specifies how Inspector prefers to watch values for changes. \"Interception\" sees interceptable property changes instantly and uses polling as a fallback for computed values. \"Polling\" has less performance impact on complex scenes, but changes are only detected at the specified interval. \"Manual\" requires the \"Refresh\" button in the toolbar to be pressed.`}\n options={watchModes}\n value={watcherSettings.mode}\n onChange={(value) =>\n setWatcherSettings((prev) => {\n return { interval: 250, ...prev, mode: value } as WatcherSettings;\n })\n }\n />\n <Collapse visible={watcherSettings.mode === \"polling\"}>\n <SyncedSliderPropertyLine\n label=\"Polling Interval\"\n description=\"A smaller polling interval will detect changes faster but may impact performance more.\"\n min={30}\n max={1000}\n step={10}\n unit=\"ms\"\n value={watcherSettings.mode === \"polling\" ? watcherSettings.interval : NaN}\n onChange={(value) =>\n setWatcherSettings((prev) => {\n return { ...prev, interval: value };\n })\n }\n />\n </Collapse>\n </>\n );\n },\n });\n\n return {\n dispose: () => {\n settingsRegistration.dispose();\n },\n };\n },\n };\n\n const watcherRefreshToolbarServiceDefinition: ServiceDefinition<[], [IWatcherService, ISettingsStore, IShellService]> = {\n friendlyName: \"Watcher Refresh Toolbar Service\",\n consumes: [WatcherServiceIdentity, SettingsStoreIdentity, ShellServiceIdentity],\n factory: (watcherService, settingsStore, shellService) => {\n let toolbarItemRegistration: Nullable<IDisposable> = null;\n\n const updateToolbar = () => {\n const settings = normalizeSettings(settingsStore.readSetting(settingDescriptor));\n\n if (settings.mode === \"manual\") {\n if (!toolbarItemRegistration) {\n toolbarItemRegistration = shellService.addToolbarItem({\n key: \"Watcher Refresh\",\n displayName: \"Refresh Properties\",\n verticalLocation: \"bottom\",\n horizontalLocation: \"right\",\n order: DefaultToolbarItemOrder.RefreshProperties,\n teachingMoment: {\n title: \"Refresh Properties\",\n description:\n \"Press this button to manually refresh all UI bound to scene state. This is only available when Property Watch Mode is set to Manual in the settings pane.\",\n },\n component: () => {\n return (\n <Button\n appearance=\"subtle\"\n icon={ArrowClockwiseRegular}\n title=\"Update all UI (e.g. Scene Explorer, Properties, etc.) bound to properties of entities (Meshes, Materials, etc.)\"\n onClick={() => watcherService.refresh()}\n />\n );\n },\n });\n }\n } else {\n toolbarItemRegistration?.dispose();\n toolbarItemRegistration = null;\n }\n };\n\n updateToolbar();\n\n const settingsStoreObserver = settingsStore.onChanged.add((key: string) => {\n if (key === settingDescriptor.key) {\n updateToolbar();\n }\n });\n\n return {\n dispose: () => {\n toolbarItemRegistration?.dispose();\n toolbarItemRegistration = null;\n settingsStoreObserver.remove();\n },\n };\n },\n };\n\n return {\n watcherServiceDefinition,\n watcherSettingsServiceDefinition,\n watcherRefreshToolbarServiceDefinition,\n } as const;\n}\n","import { type IDisposable, type Nullable } from \"core/index\";\r\nimport { type ServiceContainer } from \"../modularity/serviceContainer\";\r\nimport { type IExtensionFeed, type ExtensionMetadata, type ExtensionModule } from \"./extensionFeed\";\r\n\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Represents a loaded extension.\r\n */\r\nexport interface IExtension {\r\n /**\r\n * The metadata for the extension.\r\n */\r\n readonly metadata: ExtensionMetadata;\r\n\r\n /**\r\n * Whether the extension is currently being installed, uninstalled, enabled, or disabled.\r\n */\r\n readonly isStateChanging: boolean;\r\n\r\n /**\r\n * Whether the extension is enabled.\r\n */\r\n readonly isInstalled: boolean;\r\n\r\n /**\r\n * Installs the extension.\r\n */\r\n installAsync(): Promise<void>;\r\n\r\n /**\r\n * Uninstalls the extension.\r\n */\r\n uninstallAsync(): Promise<void>;\r\n\r\n /**\r\n * Adds a handler that is called when the state of the extension changes.\r\n * @param handler The handler to add.\r\n * @returns A disposable that removes the handler when disposed.\r\n */\r\n addStateChangedHandler(handler: () => void): IDisposable;\r\n}\r\n\r\n/**\r\n * Provides information about an extension installation failure.\r\n */\r\nexport type InstallFailedInfo = {\r\n /**\r\n * The metadata of the extension that failed to install.\r\n */\r\n extension: ExtensionMetadata;\r\n\r\n /**\r\n * The error that occurred during the installation.\r\n */\r\n error: unknown;\r\n};\r\n\r\ntype InstalledExtension = {\r\n metadata: ExtensionMetadata;\r\n feed: IExtensionFeed;\r\n isStateChanging: boolean;\r\n extensionModule?: ExtensionModule;\r\n registrationToken?: IDisposable;\r\n};\r\n\r\nconst InstalledExtensionsKey = \"Extensions/InstalledExtensions\";\r\n\r\nconst ExtensionInstalledKeyPrefix = \"Extensions/IsExtensionInstalled\";\r\nfunction GetExtensionInstalledKey(name: string): string {\r\n return `${ExtensionInstalledKeyPrefix}/${name}`;\r\n}\r\n\r\n/**\r\n * Represents a query for loaded extensions.\r\n */\r\nexport interface IExtensionQuery {\r\n /**\r\n * The total number of extensions that satisfy the query.\r\n */\r\n readonly totalCount: number;\r\n\r\n /**\r\n * Fetches a range of extensions from the query.\r\n * @param index The index of the first extension to fetch.\r\n * @param count The number of extensions to fetch.\r\n * @returns A promise that resolves to the extensions.\r\n */\r\n getExtensionsAsync(index: number, count: number): Promise<IExtension[]>;\r\n}\r\n\r\nfunction GetExtensionIdentity(feed: string, name: string) {\r\n return `${feed}/${name}`;\r\n}\r\n\r\n/**\r\n * Manages the installation, uninstallation, enabling, and disabling of extensions.\r\n */\r\nexport class ExtensionManager implements IDisposable {\r\n private readonly _installedExtensions = new Map<string, InstalledExtension>();\r\n\r\n private readonly _stateChangedHandlers = new Map<string, Set<() => void>>();\r\n\r\n private constructor(\r\n private readonly _namespace: string,\r\n private readonly _serviceContainer: ServiceContainer,\r\n private readonly _feeds: readonly IExtensionFeed[],\r\n private readonly _onInstallFailed: (info: InstallFailedInfo) => void\r\n ) {}\r\n\r\n /**\r\n * Creates a new instance of the ExtensionManager.\r\n * This will automatically rehydrate previously installed and enabled extensions.\r\n * @param namespace The namespace to use for storing extension state in local storage.\r\n * @param serviceContainer The service container to use.\r\n * @param feeds The extension feeds to include.\r\n * @param onInstallFailed A callback that is called when an extension installation fails.\r\n * @returns A promise that resolves to the new instance of the ExtensionManager.\r\n */\r\n public static async CreateAsync(\r\n namespace: string,\r\n serviceContainer: ServiceContainer,\r\n feeds: readonly IExtensionFeed[],\r\n onInstallFailed: (info: InstallFailedInfo) => void\r\n ): Promise<ExtensionManager> {\r\n namespace = `Babylon/${namespace}`;\r\n\r\n const extensionManager = new ExtensionManager(namespace, serviceContainer, feeds, onInstallFailed);\r\n\r\n // Rehydrate installed extensions.\r\n const installedExtensionNames = JSON.parse(localStorage.getItem(`${namespace}/${InstalledExtensionsKey}`) ?? \"[]\") as string[];\r\n for (const installedExtensionName of installedExtensionNames) {\r\n const installedExtensionRaw = localStorage.getItem(`${namespace}/${GetExtensionInstalledKey(installedExtensionName)}`);\r\n if (installedExtensionRaw) {\r\n const installedExtensionData = JSON.parse(installedExtensionRaw) as {\r\n feed: string;\r\n metadata: ExtensionMetadata;\r\n };\r\n\r\n const feed = feeds.find((feed) => feed.name === installedExtensionData.feed);\r\n if (feed) {\r\n const installedExtension = extensionManager._createInstalledExtension(installedExtensionData.metadata, feed);\r\n extensionManager._installedExtensions.set(installedExtension.metadata.name, installedExtension);\r\n }\r\n }\r\n }\r\n\r\n // Load installed and enabled extensions.\r\n const enablePromises: Promise<void>[] = [];\r\n for (const extension of extensionManager._installedExtensions.values()) {\r\n enablePromises.push(\r\n (async () => {\r\n try {\r\n await extensionManager._enableAsync(extension.metadata, false, false);\r\n } catch {\r\n // If enabling the extension fails, uninstall it. The extension install fail callback will still be called,\r\n // so the owner of the ExtensionManager instance can decide what to do with the error.\r\n await extensionManager._uninstallAsync(extension.metadata, false);\r\n }\r\n })()\r\n );\r\n }\r\n\r\n await Promise.all(enablePromises);\r\n\r\n return extensionManager;\r\n }\r\n\r\n /**\r\n * Gets the names of the feeds that are included in the extension manager.\r\n * @returns The names of the feeds.\r\n */\r\n public get feedNames() {\r\n return this._feeds.map((feed) => feed.name);\r\n }\r\n\r\n /**\r\n * Queries the extension manager for extensions.\r\n * @param filter The filter to apply to the query.\r\n * @param feeds The feeds to include in the query.\r\n * @param installedOnly Whether to only include installed extensions.\r\n * @returns A promise that resolves to the extension query.\r\n */\r\n public async queryExtensionsAsync(filter = \"\", feeds: string[] = this.feedNames, installedOnly = false): Promise<IExtensionQuery> {\r\n if (installedOnly) {\r\n const installedExtensions = Array.from(this._installedExtensions.values()).filter((installedExtension) => feeds.includes(installedExtension.feed.name));\r\n return {\r\n totalCount: installedExtensions.length,\r\n getExtensionsAsync: async (index, count) => {\r\n return installedExtensions.slice(index, index + count).map((installedExtension) => this._createExtension(installedExtension.metadata, installedExtension.feed));\r\n },\r\n };\r\n }\r\n\r\n const queries = await Promise.all(\r\n this._feeds.filter((feed) => feeds.includes(feed.name)).map(async (feed) => Object.assign(await feed.queryExtensionsAsync(filter), { feed }))\r\n );\r\n const totalCount = queries.reduce((sum, query) => sum + query.totalCount, 0);\r\n\r\n return {\r\n totalCount,\r\n getExtensionsAsync: async (index, count) => {\r\n const extensions = new Array<IExtension>();\r\n let remaining = count;\r\n\r\n for (const query of queries) {\r\n if (remaining <= 0) {\r\n break;\r\n }\r\n\r\n if (index >= query.totalCount) {\r\n index -= query.totalCount;\r\n continue;\r\n }\r\n\r\n // This is intentionally sequential as we are querying for results until the count of results is met.\r\n // eslint-disable-next-line no-await-in-loop\r\n const metadataSlice = await query.getExtensionMetadataAsync(index, remaining);\r\n extensions.push(...metadataSlice.map((metadata) => this._createExtension(metadata, query.feed)));\r\n remaining -= metadataSlice.length;\r\n index = 0;\r\n }\r\n\r\n return extensions;\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Disposes the extension manager.\r\n */\r\n public dispose() {\r\n for (const installedExtension of this._installedExtensions.values()) {\r\n // eslint-disable-next-line github/no-then\r\n this._disableAsync(installedExtension.metadata, false).catch((error) => {\r\n Logger.Warn(`Failed to disable extension ${installedExtension.metadata.name}: ${error}`);\r\n });\r\n }\r\n\r\n this._stateChangedHandlers.clear();\r\n }\r\n\r\n private _getInstalledExtensionStorageKey(metadata: ExtensionMetadata, feed: IExtensionFeed): string {\r\n return `${this._namespace}/${GetExtensionInstalledKey(GetExtensionIdentity(feed.name, metadata.name))}`;\r\n }\r\n\r\n private _updateInstalledExtensionsStorage() {\r\n localStorage.setItem(\r\n `${this._namespace}/${InstalledExtensionsKey}`,\r\n JSON.stringify(Array.from(this._installedExtensions.values()).map((extension) => GetExtensionIdentity(extension.feed.name, extension.metadata.name)))\r\n );\r\n }\r\n\r\n private async _installAsync(metadata: ExtensionMetadata, feed: IExtensionFeed, isNestedStateChange: boolean): Promise<InstalledExtension> {\r\n let installedExtension = this._installedExtensions.get(metadata.name);\r\n\r\n if (!installedExtension) {\r\n installedExtension = this._createInstalledExtension(metadata, feed);\r\n installedExtension.isStateChanging = true;\r\n this._installedExtensions.set(metadata.name, installedExtension);\r\n\r\n try {\r\n // Enable the extension.\r\n await this._enableAsync(metadata, true, true);\r\n } catch (error) {\r\n this._installedExtensions.delete(metadata.name);\r\n throw error;\r\n } finally {\r\n !isNestedStateChange && (installedExtension.isStateChanging = false);\r\n }\r\n\r\n // Mark the extension as being installed.\r\n localStorage.setItem(\r\n this._getInstalledExtensionStorageKey(metadata, feed),\r\n JSON.stringify({\r\n feed: feed.name,\r\n metadata,\r\n })\r\n );\r\n this._updateInstalledExtensionsStorage();\r\n }\r\n\r\n return installedExtension;\r\n }\r\n\r\n private async _uninstallAsync(metadata: ExtensionMetadata, isNestedStateChange: boolean): Promise<void> {\r\n const installedExtension = this._installedExtensions.get(metadata.name);\r\n if (installedExtension && (isNestedStateChange || !installedExtension.isStateChanging)) {\r\n try {\r\n !isNestedStateChange && (installedExtension.isStateChanging = true);\r\n\r\n // Disable the extension.\r\n await this._disableAsync(metadata, true);\r\n\r\n // Remove the extension from in memory.\r\n this._installedExtensions.delete(metadata.name);\r\n\r\n // Mark the extension as being uninstalled.\r\n localStorage.removeItem(this._getInstalledExtensionStorageKey(metadata, installedExtension.feed));\r\n this._updateInstalledExtensionsStorage();\r\n } finally {\r\n !isNestedStateChange && (installedExtension.isStateChanging = false);\r\n }\r\n }\r\n }\r\n\r\n private async _enableAsync(metadata: ExtensionMetadata, isInitialInstall: boolean, isNestedStateChange: boolean): Promise<void> {\r\n const installedExtension = this._installedExtensions.get(metadata.name);\r\n if (installedExtension && (isNestedStateChange || !installedExtension.isStateChanging)) {\r\n try {\r\n !isNestedStateChange && (installedExtension.isStateChanging = true);\r\n\r\n // If we haven't done so already, load the extension module.\r\n if (!installedExtension.extensionModule) {\r\n installedExtension.extensionModule = await installedExtension.feed.getExtensionModuleAsync(metadata.name);\r\n }\r\n\r\n if (!installedExtension.extensionModule) {\r\n throw new Error(`Unable to load extension module for \"${metadata.name}\" from feed \"${installedExtension.feed.name}\".`);\r\n }\r\n\r\n // Register the ServiceDefinitions.\r\n let servicesRegistrationToken: Nullable<IDisposable> = null;\r\n if (installedExtension.extensionModule.default.serviceDefinitions) {\r\n servicesRegistrationToken = this._serviceContainer.addServices(...installedExtension.extensionModule.default.serviceDefinitions);\r\n }\r\n\r\n // Create a registration token to for dispose.\r\n installedExtension.registrationToken = {\r\n dispose: () => {\r\n servicesRegistrationToken?.dispose();\r\n },\r\n };\r\n } catch (error: unknown) {\r\n this._onInstallFailed({\r\n extension: metadata,\r\n error,\r\n });\r\n throw error;\r\n } finally {\r\n !isNestedStateChange && (installedExtension.isStateChanging = false);\r\n }\r\n }\r\n }\r\n\r\n private async _disableAsync(metadata: ExtensionMetadata, isNestedStateChange: boolean): Promise<void> {\r\n const installedExtension = this._installedExtensions.get(metadata.name);\r\n if (installedExtension && (isNestedStateChange || !installedExtension.isStateChanging)) {\r\n try {\r\n !isNestedStateChange && (installedExtension.isStateChanging = true);\r\n\r\n // Unregister the service registrations.\r\n installedExtension.registrationToken?.dispose();\r\n } finally {\r\n !isNestedStateChange && (installedExtension.isStateChanging = false);\r\n }\r\n }\r\n }\r\n\r\n private _addStateChangedHandler(metadata: ExtensionMetadata, handler: () => void): IDisposable {\r\n let stateChangedHandlers = this._stateChangedHandlers.get(metadata.name);\r\n if (!stateChangedHandlers) {\r\n this._stateChangedHandlers.set(metadata.name, (stateChangedHandlers = new Set()));\r\n }\r\n\r\n stateChangedHandlers.add(handler);\r\n\r\n return {\r\n dispose: () => {\r\n stateChangedHandlers.delete(handler);\r\n if (stateChangedHandlers.size === 0) {\r\n this._stateChangedHandlers.delete(metadata.name);\r\n }\r\n },\r\n };\r\n }\r\n\r\n private _createExtension(metadata: ExtensionMetadata, feed: IExtensionFeed): IExtension {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const extensionManager = this;\r\n return {\r\n metadata,\r\n get isStateChanging() {\r\n return extensionManager._installedExtensions.get(metadata.name)?.isStateChanging ?? false;\r\n },\r\n get isInstalled() {\r\n return extensionManager._installedExtensions.has(metadata.name);\r\n },\r\n installAsync: async () => {\r\n await extensionManager._installAsync(metadata, feed, false);\r\n },\r\n uninstallAsync: async () => await extensionManager._uninstallAsync(metadata, false),\r\n addStateChangedHandler: (handler: () => void) => extensionManager._addStateChangedHandler(metadata, handler),\r\n };\r\n }\r\n\r\n private _createInstalledExtension(metadata: ExtensionMetadata, feed: IExtensionFeed): InstalledExtension {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const extensionManager = this;\r\n let isStateChanging = false;\r\n return {\r\n metadata,\r\n feed,\r\n get isStateChanging() {\r\n return isStateChanging;\r\n },\r\n set isStateChanging(value) {\r\n if (value !== isStateChanging) {\r\n isStateChanging = value;\r\n extensionManager._stateChangedHandlers.get(this.metadata.name)?.forEach((handler) => handler());\r\n }\r\n },\r\n };\r\n }\r\n}\r\n","/**\r\n * Performs a topological sort on a graph.\r\n * @param graph The set of nodes that make up the graph.\r\n * @param getAdjacentNodes A function that returns the adjacent nodes for a given node.\r\n * @param onSortedNode A function that is called for each node in the sorted order.\r\n * @remarks\r\n * This function allocates. Do not use it in the hot path. Instead use an instance of GraphUtils.\r\n */\r\nexport function SortGraph<NodeT>(graph: Iterable<NodeT>, getAdjacentNodes: (node: NodeT) => Iterable<NodeT>, onSortedNode: (node: NodeT) => void) {\r\n const sorter = new GraphUtils<NodeT>();\r\n sorter.sort(graph, getAdjacentNodes, onSortedNode);\r\n}\r\n\r\n/**\r\n * Traverses a graph.\r\n * @param graph The set of nodes that make up the graph.\r\n * @param getAdjacentNodes A function that returns the adjacent nodes for a given node.\r\n * @param onBeforeTraverse A function that is called before traversing each node.\r\n * @param onAfterTraverse A function that is called after traversing each node.\r\n * @remarks\r\n * This function allocates. Do not use it in the hot path. Instead use an instance of GraphUtils.\r\n */\r\nexport function TraverseGraph<NodeT>(\r\n graph: Iterable<NodeT>,\r\n getAdjacentNodes: (node: NodeT) => Iterable<NodeT> | null | undefined,\r\n onBeforeTraverse?: (node: NodeT) => void,\r\n onAfterTraverse?: (node: NodeT) => void\r\n) {\r\n const traverser = new GraphUtils<NodeT>();\r\n traverser.traverse(graph, getAdjacentNodes, onBeforeTraverse, onAfterTraverse);\r\n}\r\n\r\n/**\r\n * A utility class for performing graph operations.\r\n * @remarks\r\n * The class allocates new objects, but each operation (e.g. sort, traverse) is allocation free. This is useful when used in the hot path.\r\n */\r\nexport class GraphUtils<DefaultNodeT = unknown> {\r\n // Tracks three states:\r\n // 1. No entry for the node - this means the node has not been encountered yet during any traversal\r\n // 2. Entry with value false - this means the node is currently being traversed (needed to detect cycles)\r\n // 3. Entry with value true - this means the node has already been fully traversed (and cycles were not detected)\r\n private readonly _traversalState = new Map<DefaultNodeT, boolean>();\r\n private _isTraversing = false;\r\n\r\n /**\r\n * Performs a topological sort on a graph.\r\n * @param graph The set of nodes that make up the graph.\r\n * @param getAdjacentNodes A function that returns the adjacent nodes for a given node.\r\n * @param onSortedNode A function that is called for each node in the sorted order.\r\n */\r\n public sort<NodeT extends DefaultNodeT>(graph: Iterable<NodeT>, getAdjacentNodes: (node: NodeT) => Iterable<NodeT>, onSortedNode: (node: NodeT) => void) {\r\n this.traverse(graph, getAdjacentNodes, undefined, onSortedNode);\r\n }\r\n\r\n /**\r\n * Traverses a graph.\r\n * @param graph The set of nodes that make up the graph.\r\n * @param getAdjacentNodes A function that returns the adjacent nodes for a given node.\r\n * @param onBeforeTraverse A function that is called before traversing each node.\r\n * @param onAfterTraverse A function that is called after traversing each node.\r\n */\r\n public traverse<NodeT extends DefaultNodeT>(\r\n graph: Iterable<NodeT>,\r\n getAdjacentNodes: (node: NodeT) => Iterable<NodeT> | null | undefined,\r\n onBeforeTraverse?: (node: NodeT) => void,\r\n onAfterTraverse?: (node: NodeT) => void\r\n ) {\r\n // Since the traversal state is re-used, disallow re-entrancy through the getAdjacentNodes or onBeforeTraverse or onAfterTraverse callbacks.\r\n if (this._isTraversing) {\r\n throw new Error(\"This TopologicalSorter instance is already traversing.\");\r\n }\r\n\r\n this._isTraversing = true;\r\n\r\n try {\r\n for (const node of graph) {\r\n this._traverseCore(node, getAdjacentNodes, onBeforeTraverse, onAfterTraverse);\r\n }\r\n } finally {\r\n this._isTraversing = false;\r\n this._traversalState.clear();\r\n }\r\n }\r\n\r\n private _traverseCore<NodeT extends DefaultNodeT>(\r\n node: NodeT,\r\n getAdjacentNodes: (node: NodeT) => Iterable<NodeT> | null | undefined,\r\n onBeforeTraverse?: (node: NodeT) => void,\r\n onAfterTraverse?: (node: NodeT) => void\r\n ) {\r\n if (this._traversalState.get(node) !== true) {\r\n if (this._traversalState.get(node) === false) {\r\n throw new Error(\"Graph has cycle.\");\r\n }\r\n\r\n this._traversalState.set(node, false);\r\n onBeforeTraverse?.(node);\r\n\r\n const adjacentNodes = getAdjacentNodes(node);\r\n if (adjacentNodes) {\r\n for (const adjacentNode of adjacentNodes) {\r\n this._traverseCore(adjacentNode, getAdjacentNodes, onBeforeTraverse, onAfterTraverse);\r\n }\r\n }\r\n\r\n this._traversalState.set(node, true);\r\n onAfterTraverse?.(node);\r\n }\r\n }\r\n}\r\n","import { type IDisposable } from \"core/index\";\r\n\r\nimport { type IService, type ServiceDefinition } from \"./serviceDefinition\";\r\n\r\nimport { SortGraph } from \"../misc/graphUtils\";\r\n\r\n// Service definitions should strongly typed when they are defined to avoid programming errors. However, they are tracked internally\r\n// in a weakly typed manner so they can be handled generically.\r\nexport type WeaklyTypedServiceDefinition = Omit<ServiceDefinition<IService<symbol>[] | [], IService<symbol>[] | []>, \"factory\"> & {\r\n /**\r\n * A factory function responsible for creating a service instance.\r\n */\r\n factory: (...args: any) => ReturnType<ServiceDefinition<IService<symbol>[] | [], IService<symbol>[] | []>[\"factory\"]>;\r\n};\r\n\r\n// This sorts a set of service definitions based on their dependencies (e.g. a topological sort).\r\nfunction SortServiceDefinitions(serviceDefinitions: WeaklyTypedServiceDefinition[]) {\r\n const sortedServiceDefinitions: typeof serviceDefinitions = [];\r\n SortGraph(\r\n serviceDefinitions,\r\n function* (serviceDefinition) {\r\n // Check each dependency.\r\n for (const contractIdentity of serviceDefinition.consumes ?? []) {\r\n // If another service definition produces the dependency contract, return it as an adjacent node for the purpose of sorting.\r\n yield* serviceDefinitions.filter((otherServiceDefinition) => (otherServiceDefinition.produces ?? []).includes(contractIdentity));\r\n }\r\n },\r\n sortedServiceDefinitions.push.bind(sortedServiceDefinitions)\r\n );\r\n return sortedServiceDefinitions;\r\n}\r\n\r\n/**\r\n * A service container manages the lifetimes of a set of services.\r\n * It takes care of instantiating the services in the correct order based on their dependencies,\r\n * passing dependencies through to services, and disposing of services when the container is disposed.\r\n */\r\nexport class ServiceContainer implements IDisposable {\r\n private _isDisposed = false;\r\n private readonly _serviceDefinitions = new Map<symbol, WeaklyTypedServiceDefinition>();\r\n private readonly _serviceDependents = new Map<WeaklyTypedServiceDefinition, Set<WeaklyTypedServiceDefinition>>();\r\n private readonly _serviceInstances = new Map<WeaklyTypedServiceDefinition, (IService<symbol> & Partial<IDisposable>) | void>();\r\n private readonly _children = new Set<ServiceContainer>();\r\n\r\n /**\r\n * Creates a new ServiceContainer.\r\n * @param _friendlyName A human-readable name for debugging.\r\n * @param _parent An optional parent container. Dependencies not found locally will be resolved from the parent.\r\n */\r\n public constructor(\r\n private readonly _friendlyName: string,\r\n private readonly _parent?: ServiceContainer\r\n ) {\r\n _parent?._children.add(this);\r\n }\r\n\r\n /**\r\n * Adds a set of service definitions to the service container.\r\n * The services are sorted based on their dependencies.\r\n * @param serviceDefinitions The service definitions to register.\r\n * @returns A disposable that will remove the service definitions from the service container.\r\n */\r\n public addServices(...serviceDefinitions: WeaklyTypedServiceDefinition[]): IDisposable {\r\n if (this._isDisposed) {\r\n throw new Error(\"ServiceContainer is disposed.\");\r\n }\r\n\r\n const sortedServiceDefinitions = SortServiceDefinitions(serviceDefinitions);\r\n\r\n const dispose = () => {\r\n for (const serviceDefinition of sortedServiceDefinitions.reverse()) {\r\n this._removeService(serviceDefinition);\r\n }\r\n };\r\n\r\n try {\r\n for (const serviceDefinition of sortedServiceDefinitions) {\r\n this._addService(serviceDefinition);\r\n }\r\n } catch (error: unknown) {\r\n dispose();\r\n throw error;\r\n }\r\n\r\n return {\r\n dispose,\r\n };\r\n }\r\n\r\n /**\r\n * Registers a service definition in the service container.\r\n * @param serviceDefinition The service definition to register.\r\n * @returns A disposable that will remove the service definition from the service container.\r\n */\r\n public addService<Produces extends IService<symbol>[] = [], Consumes extends IService<symbol>[] = []>(serviceDefinition: ServiceDefinition<Produces, Consumes>): IDisposable {\r\n return this.addServices(serviceDefinition);\r\n }\r\n\r\n private _addService(service: WeaklyTypedServiceDefinition) {\r\n if (this._isDisposed) {\r\n throw new Error(`'${this._friendlyName}' container is disposed.`);\r\n }\r\n\r\n service.produces?.forEach((contract) => {\r\n if (this._serviceDefinitions.has(contract)) {\r\n throw new Error(`A service producing the contract '${contract.toString()}' has already been added to this '${this._friendlyName}' container.`);\r\n }\r\n });\r\n\r\n service.produces?.forEach((contract) => {\r\n this._serviceDefinitions.set(contract, service);\r\n });\r\n\r\n const dependencies = service.consumes?.map((contract) => this._resolveDependency(contract, service)) ?? [];\r\n\r\n this._serviceInstances.set(service, service.factory(...dependencies));\r\n }\r\n\r\n /**\r\n * Resolves a dependency by contract identity for a consuming service.\r\n * Checks local services first, then walks up the parent chain.\r\n * Registers the consumer as a dependent in whichever container owns the dependency.\r\n * @param contract The contract identity to resolve.\r\n * @param consumer The service definition that consumes this dependency.\r\n * @returns The resolved service instance.\r\n */\r\n private _resolveDependency(contract: symbol, consumer: WeaklyTypedServiceDefinition): IService<symbol> & Partial<IDisposable> {\r\n const definition = this._serviceDefinitions.get(contract);\r\n if (definition) {\r\n const instance = this._serviceInstances.get(definition);\r\n if (!instance) {\r\n throw new Error(`Service '${contract.toString()}' has not been instantiated in the '${this._friendlyName}' container.`);\r\n }\r\n\r\n let dependentDefinitions = this._serviceDependents.get(definition);\r\n if (!dependentDefinitions) {\r\n this._serviceDependents.set(definition, (dependentDefinitions = new Set()));\r\n }\r\n dependentDefinitions.add(consumer);\r\n\r\n return instance;\r\n }\r\n\r\n if (this._parent) {\r\n return this._parent._resolveDependency(contract, consumer);\r\n }\r\n\r\n throw new Error(`Service '${contract.toString()}' has not been registered in the '${this._friendlyName}' container.`);\r\n }\r\n\r\n /**\r\n * Removes a consumer from the dependent set for a given contract, checking locally first then the parent chain.\r\n * @param contract The contract identity.\r\n * @param consumer The service definition to remove as a dependent.\r\n */\r\n private _removeDependentFromChain(contract: symbol, consumer: WeaklyTypedServiceDefinition): void {\r\n const definition = this._serviceDefinitions.get(contract);\r\n if (definition) {\r\n const dependentDefinitions = this._serviceDependents.get(definition);\r\n if (dependentDefinitions) {\r\n dependentDefinitions.delete(consumer);\r\n if (dependentDefinitions.size === 0) {\r\n this._serviceDependents.delete(definition);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n this._parent?._removeDependentFromChain(contract, consumer);\r\n }\r\n\r\n private _removeService(service: WeaklyTypedServiceDefinition) {\r\n if (this._isDisposed) {\r\n throw new Error(`'${this._friendlyName}' container is disposed.`);\r\n }\r\n\r\n const serviceDependents = this._serviceDependents.get(service);\r\n if (serviceDependents && serviceDependents.size > 0) {\r\n throw new Error(\r\n `Service '${service.friendlyName}' has dependents: ${Array.from(serviceDependents)\r\n .map((dependent) => dependent.friendlyName)\r\n .join(\", \")}`\r\n );\r\n }\r\n\r\n // NOTE: The service instance could be undefined, as the service factory for a service that does not produce any contracts is not required to return an actual service instance.\r\n const serviceInstance = this._serviceInstances.get(service);\r\n this._serviceInstances.delete(service);\r\n serviceInstance?.dispose?.();\r\n\r\n service.produces?.forEach((contract) => {\r\n this._serviceDefinitions.delete(contract);\r\n });\r\n\r\n // Remove this service as a dependent from each of its consumed dependencies (local or in parent chain).\r\n service.consumes?.forEach((contract) => {\r\n this._removeDependentFromChain(contract, service);\r\n });\r\n }\r\n\r\n /**\r\n * Disposes the service container and all contained services.\r\n * Throws if this container is still a parent of any live child containers.\r\n */\r\n public dispose() {\r\n if (this._children.size > 0) {\r\n throw new Error(`'${this._friendlyName}' container cannot be disposed because it has ${this._children.size} active child container(s).`);\r\n }\r\n\r\n Array.from(this._serviceInstances.keys()).reverse().forEach(this._removeService.bind(this));\r\n this._serviceInstances.clear();\r\n this._serviceDependents.clear();\r\n this._serviceDefinitions.clear();\r\n this._parent?._children.delete(this);\r\n this._isDisposed = true;\r\n }\r\n}\r\n","import { type IService } from \"../modularity/serviceDefinition\";\r\n\r\nimport { type ToastIntent } from \"@fluentui/react-components\";\r\n\r\nexport type DialogOptions = {\r\n type: \"alert\";\r\n intent?: ToastIntent;\r\n title: string;\r\n content?: JSX.Element;\r\n};\r\n\r\n/**\r\n * The unique identity symbol for the dialog service.\r\n */\r\nexport const DialogServiceIdentity = Symbol(\"DialogService\");\r\n\r\n/**\r\n * Provides the ability to show dialog from non-React code (e.g. Observable callbacks).\r\n */\r\nexport interface IDialogService extends IService<typeof DialogServiceIdentity> {\r\n /**\r\n * Shows a dialog with the given content.\r\n * @param options The dialog options to display.\r\n */\r\n showDialog(options: DialogOptions): void;\r\n}\r\n","import { type IService } from \"../modularity/serviceDefinition\";\r\nimport { type ToastOptions } from \"shared-ui-components/fluent/primitives/toast\";\r\n\r\n/**\r\n * The unique identity symbol for the toast service.\r\n */\r\nexport const ToastServiceIdentity = Symbol(\"ToastService\");\r\n\r\n/**\r\n * Provides the ability to show toast notifications from non-React code (e.g. Observable callbacks).\r\n */\r\nexport interface IToastService extends IService<typeof ToastServiceIdentity> {\r\n /**\r\n * Shows a toast notification with the given message.\r\n * @param message The message to display.\r\n * @param options Optional toast configuration such as intent.\r\n */\r\n showToast(message: string, options?: ToastOptions): void;\r\n}\r\n","import { createContext, useContext } from \"react\";\r\n\r\nimport { type DialogOptions } from \"../services/dialogService\";\r\n\r\ntype DialogContext = {\r\n showDialog: (options: DialogOptions) => void;\r\n};\r\n\r\nexport const DialogContext = createContext<DialogContext>({ showDialog: (options: DialogOptions) => alert(options.title) });\r\n\r\n/**\r\n * Returns the showDialog function provided by the surrounding modular tool framework.\r\n * If called outside of a DialogContext provider, falls back to the default context\r\n * value, whose showDialog implementation invokes the browser's blocking `alert` with\r\n * the dialog title.\r\n * @returns A function that displays a dialog when called.\r\n */\r\nexport function useDialog(): DialogContext {\r\n return useContext(DialogContext);\r\n}\r\n","import { type ExtensionManager } from \"../extensibility/extensionManager\";\r\n\r\nimport { createContext, useContext } from \"react\";\r\n\r\nexport type ExtensionManagerContext = {\r\n readonly extensionManager: ExtensionManager;\r\n};\r\n\r\nexport const ExtensionManagerContext = createContext<ExtensionManagerContext | undefined>(undefined);\r\n\r\nexport function useExtensionManager() {\r\n return useContext(ExtensionManagerContext)?.extensionManager;\r\n}\r\n","import {\r\n type MenuButtonProps,\r\n type MenuCheckedValueChangeData,\r\n type MenuCheckedValueChangeEvent,\r\n makeStyles,\r\n Menu,\r\n MenuItemRadio,\r\n MenuList,\r\n MenuPopover,\r\n MenuTrigger,\r\n SplitButton,\r\n Tooltip,\r\n} from \"@fluentui/react-components\";\r\nimport { type ServiceDefinition } from \"../modularity/serviceDefinition\";\r\nimport { type IShellService, ShellServiceIdentity } from \"./shellService\";\r\nimport { type ThemeMode } from \"./themeService\";\r\n\r\nimport { WeatherMoonRegular, WeatherSunnyRegular } from \"@fluentui/react-icons\";\r\nimport { useCallback } from \"react\";\r\n\r\nimport { useThemeMode } from \"../hooks/themeHooks\";\r\n\r\nconst useStyles = makeStyles({\r\n themeButton: {\r\n margin: 0,\r\n },\r\n themeMenuPopover: {\r\n minWidth: 0,\r\n },\r\n});\r\n\r\nexport const ThemeSelectorServiceDefinition: ServiceDefinition<[], [IShellService]> = {\r\n friendlyName: \"ThemeSelector\",\r\n consumes: [ShellServiceIdentity],\r\n factory: (shellService) => {\r\n const registration = shellService.addToolbarItem({\r\n key: \"ThemeSelector\",\r\n horizontalLocation: \"right\",\r\n verticalLocation: \"top\",\r\n teachingMoment: false,\r\n order: -300,\r\n component: () => {\r\n const classes = useStyles();\r\n\r\n const { isDarkMode, themeMode, setThemeMode } = useThemeMode();\r\n\r\n const onSelectedThemeChange = useCallback((e: MenuCheckedValueChangeEvent, data: MenuCheckedValueChangeData) => {\r\n setThemeMode(data.checkedItems.includes(\"System\") ? \"system\" : (data.checkedItems[0].toLocaleLowerCase() as ThemeMode));\r\n }, []);\r\n\r\n const toggleTheme = useCallback(() => {\r\n setThemeMode(isDarkMode ? \"light\" : \"dark\");\r\n }, [isDarkMode]);\r\n\r\n return (\r\n <Menu positioning=\"below-end\" checkedValues={{ theme: [themeMode] }} onCheckedValueChange={onSelectedThemeChange}>\r\n <MenuTrigger disableButtonEnhancement={true}>\r\n {(triggerProps: MenuButtonProps) => (\r\n <Tooltip content=\"Select Theme\" relationship=\"label\">\r\n <SplitButton\r\n className={classes.themeButton}\r\n menuButton={triggerProps}\r\n primaryActionButton={{ onClick: toggleTheme }}\r\n size=\"small\"\r\n appearance=\"transparent\"\r\n shape=\"circular\"\r\n icon={isDarkMode ? <WeatherSunnyRegular /> : <WeatherMoonRegular />}\r\n ></SplitButton>\r\n </Tooltip>\r\n )}\r\n </MenuTrigger>\r\n\r\n <MenuPopover className={classes.themeMenuPopover}>\r\n <MenuList>\r\n <MenuItemRadio name=\"theme\" value={\"system\" satisfies ThemeMode}>\r\n System\r\n </MenuItemRadio>\r\n <MenuItemRadio name=\"theme\" value={\"light\" satisfies ThemeMode}>\r\n Light\r\n </MenuItemRadio>\r\n <MenuItemRadio name=\"theme\" value={\"dark\" satisfies ThemeMode}>\r\n Dark\r\n </MenuItemRadio>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n );\r\n },\r\n });\r\n\r\n return {\r\n dispose: () => registration.dispose(),\r\n };\r\n },\r\n};\r\n","import {\r\n type ComponentType,\r\n type Context,\r\n type FunctionComponent,\r\n type PropsWithChildren,\r\n type ReactNode,\r\n createElement,\r\n Suspense,\r\n useCallback,\r\n useEffect,\r\n useReducer,\r\n useState,\r\n} from \"react\";\r\n\r\nimport { type IExtensionFeed } from \"./extensibility/extensionFeed\";\r\nimport { type IExtension, type InstallFailedInfo, ExtensionManager } from \"./extensibility/extensionManager\";\r\nimport { type WeaklyTypedServiceDefinition, ServiceContainer } from \"./modularity/serviceContainer\";\r\nimport { type ISettingsStore, SettingsStore, SettingsStoreIdentity } from \"./services/settingsStore\";\r\nimport { type IRootComponentService, type ShellServiceOptions, MakeShellServiceDefinition, RootComponentServiceIdentity } from \"./services/shellService\";\r\nimport { type ThemeMode, ThemeModeSettingDescriptor, ThemeServiceDefinition } from \"./services/themeService\";\r\n\r\nimport {\r\n Body1,\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogBody,\r\n DialogContent,\r\n DialogSurface,\r\n DialogTitle,\r\n List,\r\n ListItem,\r\n makeStyles,\r\n Spinner,\r\n tokens,\r\n} from \"@fluentui/react-components\";\r\nimport { CheckmarkCircleRegular, ErrorCircleRegular, InfoRegular, WarningRegular } from \"@fluentui/react-icons\";\r\nimport { createRoot } from \"react-dom/client\";\r\n\r\nimport { Deferred } from \"core/Misc/deferred\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { type ToastHandle, type ToastOptions, ToastProvider } from \"shared-ui-components/fluent/primitives/toast\";\r\nimport { type DialogOptions, type IDialogService, DialogServiceIdentity } from \"./services/dialogService\";\r\nimport { type IToastService, ToastServiceIdentity } from \"./services/toastService\";\r\nimport { Theme } from \"./components/theme\";\r\nimport { DialogContext } from \"./contexts/dialogContext\";\r\nimport { ExtensionManagerContext } from \"./contexts/extensionManagerContext\";\r\nimport { SettingsStoreContext } from \"./contexts/settingsContext\";\r\nimport { TeachingMomentsContext } from \"./contexts/teachingMomentsContext\";\r\nimport { type IReactContextService, type ReactContextHandle, ReactContextServiceIdentity } from \"./services/reactContextService\";\r\nimport { ThemeSelectorServiceDefinition } from \"./services/themeSelectorService\";\r\n\r\nconst useStyles = makeStyles({\r\n app: {\r\n colorScheme: \"light dark\",\r\n flexGrow: 1,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n backgroundColor: tokens.colorTransparentBackground,\r\n },\r\n spinner: {\r\n flexGrow: 1,\r\n animationDuration: \"1s\",\r\n animationName: {\r\n from: { opacity: 0 },\r\n to: { opacity: 1 },\r\n },\r\n },\r\n extensionErrorTitleDiv: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n alignItems: \"center\",\r\n gap: tokens.spacingHorizontalS,\r\n },\r\n extensionErrorIcon: {\r\n color: tokens.colorPaletteRedForeground1,\r\n },\r\n dialogTitle: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n alignItems: \"center\",\r\n gap: tokens.spacingHorizontalS,\r\n },\r\n dialogIconSuccess: {\r\n color: tokens.colorStatusSuccessForeground1,\r\n },\r\n dialogIconError: {\r\n color: tokens.colorStatusDangerForeground1,\r\n },\r\n dialogIconWarning: {\r\n color: tokens.colorStatusWarningForeground1,\r\n },\r\n dialogIconInfo: {\r\n color: tokens.colorBrandForeground1,\r\n },\r\n});\r\n\r\ntype ReactContextEntry = {\r\n provider: Context<any>[\"Provider\"];\r\n value: unknown;\r\n order: number;\r\n};\r\n\r\ntype ReactContextAction =\r\n { type: \"add\"; entry: ReactContextEntry } | { type: \"remove\"; provider: Context<any>[\"Provider\"] } | { type: \"update\"; provider: Context<any>[\"Provider\"]; value: unknown };\r\n\r\ntype DialogQueueAction = { type: \"enqueue\"; options: DialogOptions } | { type: \"dequeue\" };\r\n\r\nconst ReactContextsWrapper: FunctionComponent<PropsWithChildren<{ contexts: readonly Readonly<ReactContextEntry>[] }>> = ({ contexts, children }) => {\r\n return <>{contexts.reduceRight<ReactNode>((acc, entry) => createElement(entry.provider, { value: entry.value }, acc), children)}</>;\r\n};\r\n\r\nexport type ModularToolOptions = {\r\n /**\r\n * The namespace for the tool, used for scoping persisted settings and other storage.\r\n */\r\n namespace: string;\r\n\r\n /**\r\n * The container element where the tool will be rendered.\r\n */\r\n containerElement: HTMLElement;\r\n\r\n /**\r\n * The service definitions to be registered with the tool.\r\n */\r\n serviceDefinitions: readonly WeaklyTypedServiceDefinition[];\r\n\r\n /**\r\n * The theme mode to use. If not specified, the default is \"system\", which uses the system/browser preference, and the last used mode is persisted.\r\n */\r\n themeMode?: ThemeMode;\r\n\r\n /**\r\n * Whether to show the theme selector in the toolbar. Default is true.\r\n */\r\n showThemeSelector?: boolean;\r\n\r\n /**\r\n * The extension feeds that provide optional extensions the user can install.\r\n */\r\n extensionFeeds?: readonly IExtensionFeed[];\r\n\r\n /**\r\n * An optional parent ServiceContainer. Dependencies not found in the tool's own container\r\n * will be resolved from this parent.\r\n */\r\n parentContainer?: ServiceContainer;\r\n\r\n /**\r\n * When true, all teaching moments are disabled and will not be shown.\r\n */\r\n disableTeachingMoments?: boolean;\r\n} & ShellServiceOptions;\r\n\r\n/**\r\n * Creates a modular tool with a base set of common tool services, including the toolbar/side pane basic UI layout.\r\n * @param options The options for the tool.\r\n * @returns A token that can be used to dispose of the tool.\r\n */\r\nexport function MakeModularTool(options: ModularToolOptions) {\r\n const { namespace, containerElement, serviceDefinitions, themeMode, showThemeSelector = true, extensionFeeds = [], parentContainer, disableTeachingMoments = false } = options;\r\n\r\n const teachingMomentsContextValue = { disabled: disableTeachingMoments };\r\n\r\n // Create the settings store immediately as it will be exposed to services and through React context.\r\n const settingsStore = new SettingsStore(namespace);\r\n\r\n // If a theme mode is provided, just write the setting so it is the active theme.\r\n if (themeMode) {\r\n settingsStore.writeSetting(ThemeModeSettingDescriptor, themeMode);\r\n }\r\n\r\n // This deferred resolves once the React effect cleanup (which disposes the ServiceContainer) is complete.\r\n const disposeDeferred = new Deferred<void>();\r\n\r\n const modularToolRootComponent: FunctionComponent = () => {\r\n const classes = useStyles();\r\n const [requiredExtensions, setRequiredExtensions] = useState<string[]>();\r\n const [requiredExtensionsDeferred, setRequiredExtensionsDeferred] = useState<Deferred<boolean>>();\r\n const [extensionInstallError, setExtensionInstallError] = useState<InstallFailedInfo>();\r\n\r\n const [toastHandle, setToastHandle] = useState<ToastHandle | null>(null);\r\n const [toastQueue, setToastQueue] = useState<{ message: string; options?: ToastOptions }[]>([]);\r\n\r\n useEffect(() => {\r\n if (toastHandle && toastQueue.length > 0) {\r\n for (const { message, options } of toastQueue) {\r\n toastHandle.showToast(message, options);\r\n }\r\n setToastQueue([]);\r\n }\r\n }, [toastHandle, toastQueue]);\r\n\r\n // Queue of dialogs to display. We show one at a time (the one at the head of the queue).\r\n const [dialogQueue, dispatchDialogQueue] = useReducer((state: readonly DialogOptions[], action: DialogQueueAction): readonly DialogOptions[] => {\r\n switch (action.type) {\r\n case \"enqueue\":\r\n return [...state, action.options];\r\n case \"dequeue\":\r\n return state.slice(1);\r\n }\r\n }, []);\r\n\r\n const showDialog = useCallback((dialogOptions: DialogOptions) => {\r\n dispatchDialogQueue({ type: \"enqueue\", options: dialogOptions });\r\n }, []);\r\n\r\n const onDismissDialog = useCallback(() => {\r\n dispatchDialogQueue({ type: \"dequeue\" });\r\n }, []);\r\n\r\n const [rootComponentService, setRootComponentService] = useState<IRootComponentService>();\r\n\r\n const [contexts, updateContexts] = useReducer(\r\n (state: ReactContextEntry[], action: ReactContextAction): ReactContextEntry[] => {\r\n switch (action.type) {\r\n case \"add\":\r\n return [...state, action.entry].sort((a, b) => a.order - b.order);\r\n case \"remove\":\r\n return state.filter((e) => e.provider !== action.provider);\r\n case \"update\":\r\n return state.map((e) => (e.provider === action.provider ? { ...e, value: action.value } : e));\r\n }\r\n },\r\n [\r\n // Static contexts seeded into the wrapper so they don't add JSX nesting below.\r\n // Negative orders keep them as the outermost providers (lowest order = outermost via reduceRight).\r\n { provider: TeachingMomentsContext.Provider, value: teachingMomentsContextValue, order: -2 },\r\n { provider: SettingsStoreContext.Provider, value: settingsStore, order: -1 },\r\n { provider: ExtensionManagerContext.Provider, value: undefined, order: 0 },\r\n ]\r\n );\r\n\r\n // This is the main async initialization.\r\n useEffect(() => {\r\n const initializeExtensionManagerAsync = async () => {\r\n const serviceContainer = new ServiceContainer(\"ModularToolContainer\", parentContainer);\r\n\r\n // Expose the settings store as a service so other services can read/write settings.\r\n serviceContainer.addService<[ISettingsStore], []>({\r\n friendlyName: \"Settings Store\",\r\n produces: [SettingsStoreIdentity],\r\n factory: () => settingsStore,\r\n });\r\n\r\n // Expose the react context service so other services can add React context providers.\r\n serviceContainer.addService<[IReactContextService], []>({\r\n friendlyName: \"React Context Service\",\r\n produces: [ReactContextServiceIdentity],\r\n factory: (): IReactContextService => ({\r\n addContext<T>(provider: Context<T>[\"Provider\"], initialValue: T, options?: { order?: number }): ReactContextHandle<T> {\r\n updateContexts({ type: \"add\", entry: { provider: provider, value: initialValue, order: options?.order ?? 0 } });\r\n return {\r\n updateValue: (newValue: T) => {\r\n updateContexts({ type: \"update\", provider: provider, value: newValue });\r\n },\r\n dispose: () => {\r\n updateContexts({ type: \"remove\", provider: provider });\r\n },\r\n };\r\n },\r\n }),\r\n });\r\n\r\n // Expose the toast service so non-React code (e.g. Observable callbacks) can show toasts.\r\n serviceContainer.addService<[IToastService], []>({\r\n friendlyName: \"Toast Service\",\r\n produces: [ToastServiceIdentity],\r\n factory: (): IToastService => ({\r\n showToast: (message, options) => {\r\n setToastQueue((prev) => [...prev, { message, options }]);\r\n },\r\n }),\r\n });\r\n\r\n // Expose the dialog service so non-React code (e.g. Observable callbacks) can show dialogs.\r\n serviceContainer.addService<[IDialogService], []>({\r\n friendlyName: \"Dialog Service\",\r\n produces: [DialogServiceIdentity],\r\n factory: (): IDialogService => ({ showDialog }),\r\n });\r\n\r\n // Register the shell service (top level toolbar/side pane UI layout).\r\n serviceContainer.addService(MakeShellServiceDefinition(options));\r\n\r\n // Register a service that simply consumes the services we need before first render.\r\n serviceContainer.addService<[], [IRootComponentService]>({\r\n friendlyName: \"Service Bootstrapper\",\r\n consumes: [RootComponentServiceIdentity],\r\n factory: (rootComponent) => {\r\n // Use function syntax for the state setter since the root component may be a function component.\r\n setRootComponentService(() => rootComponent);\r\n return {\r\n dispose: () => setRootComponentService(undefined),\r\n };\r\n },\r\n });\r\n\r\n // Register the theme service (exposes the current theme to other services).\r\n serviceContainer.addService(ThemeServiceDefinition);\r\n\r\n // Register the theme selector service (for selecting the theme) if theming is configured.\r\n if (showThemeSelector) {\r\n serviceContainer.addService(ThemeSelectorServiceDefinition);\r\n }\r\n\r\n // Register the extension list service (for browsing/installing extensions) if extension feeds are provided.\r\n if (extensionFeeds.length > 0) {\r\n const { ExtensionListServiceDefinition } = await import(\"./services/extensionsListService\");\r\n serviceContainer.addService(ExtensionListServiceDefinition);\r\n }\r\n\r\n // Register all external services (that make up a unique tool).\r\n serviceContainer.addServices(...serviceDefinitions);\r\n\r\n // Create the extension manager, passing along the registry for runtime changes to the registered services.\r\n const extensionManager = await ExtensionManager.CreateAsync(namespace, serviceContainer, extensionFeeds, setExtensionInstallError);\r\n\r\n // Check query params for required extensions. This lets users share links with sets of extensions.\r\n const queryParams = new URLSearchParams(window.location.search);\r\n const requiredExtensions = queryParams.getAll(\"babylon.requiredExtension\");\r\n const uninstalledExtensions: IExtension[] = [];\r\n for (const requiredExtension of requiredExtensions) {\r\n // These could possibly be parallelized to speed things up, but it's more complex so let's wait and see if we need it.\r\n // eslint-disable-next-line no-await-in-loop\r\n const query = await extensionManager.queryExtensionsAsync(requiredExtension);\r\n // eslint-disable-next-line no-await-in-loop\r\n const extensions = await query.getExtensionsAsync(0, query.totalCount);\r\n for (const extension of extensions) {\r\n if (!extension.isInstalled) {\r\n uninstalledExtensions.push(extension);\r\n }\r\n }\r\n }\r\n\r\n // Check if any required extensions are uninstalled or disabled. If so, show a dialog to the user.\r\n if (uninstalledExtensions.length > 0) {\r\n setRequiredExtensions(uninstalledExtensions.map((extension) => extension.metadata.name));\r\n const deferred = new Deferred<boolean>();\r\n setRequiredExtensionsDeferred(deferred);\r\n if (await deferred.promise) {\r\n for (const extension of uninstalledExtensions) {\r\n // This could possibly be parallelized to speed things up, but it's more complex so let's wait and see if we need it.\r\n // eslint-disable-next-line no-await-in-loop\r\n await extension.installAsync();\r\n }\r\n }\r\n }\r\n\r\n // Set the contexts.\r\n updateContexts({ type: \"update\", provider: ExtensionManagerContext.Provider, value: { extensionManager } });\r\n\r\n return () => {\r\n extensionManager.dispose();\r\n serviceContainer.dispose();\r\n serviceContainer.dispose();\r\n };\r\n };\r\n\r\n const disposePromise = initializeExtensionManagerAsync();\r\n\r\n return () => {\r\n disposePromise\r\n // eslint-disable-next-line github/no-then\r\n .then((dispose) => dispose())\r\n // eslint-disable-next-line github/no-then\r\n .catch((error) => {\r\n Logger.Error(`Failed to dispose of the modular tool: ${error}`);\r\n })\r\n .finally(() => disposeDeferred.resolve());\r\n };\r\n }, []);\r\n\r\n const onAcceptRequiredExtensions = useCallback(() => {\r\n setRequiredExtensions(undefined);\r\n requiredExtensionsDeferred?.resolve(true);\r\n }, [setRequiredExtensions, requiredExtensionsDeferred]);\r\n\r\n const onRejectRequiredExtensions = useCallback(() => {\r\n setRequiredExtensions(undefined);\r\n requiredExtensionsDeferred?.resolve(false);\r\n }, [setRequiredExtensions, requiredExtensionsDeferred]);\r\n\r\n const onAcknowledgedExtensionInstallError = useCallback(() => {\r\n setExtensionInstallError(undefined);\r\n }, [setExtensionInstallError]);\r\n\r\n // The dialog at the head of the queue, if any, is the one currently being displayed.\r\n const currentDialog = dialogQueue[0];\r\n const currentDialogIcon = (() => {\r\n switch (currentDialog?.intent) {\r\n case \"success\":\r\n return <CheckmarkCircleRegular className={classes.dialogIconSuccess} />;\r\n case \"error\":\r\n return <ErrorCircleRegular className={classes.dialogIconError} />;\r\n case \"warning\":\r\n return <WarningRegular className={classes.dialogIconWarning} />;\r\n case \"info\":\r\n case undefined:\r\n return <InfoRegular className={classes.dialogIconInfo} />;\r\n }\r\n })();\r\n\r\n // Show a spinner until a main view has been set.\r\n if (!rootComponentService) {\r\n return (\r\n <ReactContextsWrapper contexts={contexts}>\r\n <Theme className={classes.app} targetDocument={targetDocument}>\r\n <Spinner className={classes.spinner} />\r\n </Theme>\r\n </ReactContextsWrapper>\r\n );\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const Content: ComponentType = rootComponentService.rootComponent;\r\n\r\n return (\r\n <ReactContextsWrapper contexts={contexts}>\r\n <Theme className={classes.app} targetDocument={targetDocument}>\r\n <ToastProvider imperativeRef={setToastHandle}>\r\n <Dialog open={!!requiredExtensions} modalType=\"alert\">\r\n <DialogSurface>\r\n <DialogBody>\r\n <DialogTitle>Required Extensions</DialogTitle>\r\n <DialogContent>\r\n Opening this URL requires the following extensions to be installed and enabled:\r\n <ul>\r\n {requiredExtensions?.map((name) => (\r\n <li key={name}>{name}</li>\r\n ))}\r\n </ul>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button appearance=\"primary\" onClick={onAcceptRequiredExtensions}>\r\n Install & Enable\r\n </Button>\r\n <Button appearance=\"secondary\" onClick={onRejectRequiredExtensions}>\r\n No Thanks\r\n </Button>\r\n </DialogActions>\r\n </DialogBody>\r\n </DialogSurface>\r\n </Dialog>\r\n <Dialog open={!!extensionInstallError} modalType=\"alert\">\r\n <DialogSurface>\r\n <DialogBody>\r\n <DialogTitle>\r\n <div className={classes.extensionErrorTitleDiv}>\r\n Extension Install Error\r\n <ErrorCircleRegular className={classes.extensionErrorIcon} />\r\n </div>\r\n </DialogTitle>\r\n <DialogContent>\r\n <List>\r\n <ListItem>\r\n <Body1>{`Extension \"${extensionInstallError?.extension.name}\" failed to install and was removed.`}</Body1>\r\n </ListItem>\r\n <ListItem>\r\n <Body1>{`${extensionInstallError?.error}`}</Body1>\r\n </ListItem>\r\n </List>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button appearance=\"primary\" onClick={onAcknowledgedExtensionInstallError}>\r\n Close\r\n </Button>\r\n </DialogActions>\r\n </DialogBody>\r\n </DialogSurface>\r\n </Dialog>\r\n <Dialog open={!!currentDialog} modalType=\"alert\">\r\n <DialogSurface>\r\n <DialogBody>\r\n <DialogTitle>\r\n <div className={classes.dialogTitle}>\r\n {currentDialogIcon}\r\n {currentDialog?.title}\r\n </div>\r\n </DialogTitle>\r\n {currentDialog?.content && <DialogContent>{currentDialog.content}</DialogContent>}\r\n <DialogActions>\r\n <Button appearance=\"primary\" onClick={onDismissDialog}>\r\n OK\r\n </Button>\r\n </DialogActions>\r\n </DialogBody>\r\n </DialogSurface>\r\n </Dialog>\r\n <Suspense fallback={<Spinner className={classes.spinner} />}>\r\n <DialogContext.Provider value={{ showDialog }}>\r\n <Content />\r\n </DialogContext.Provider>\r\n </Suspense>\r\n </ToastProvider>\r\n </Theme>\r\n </ReactContextsWrapper>\r\n );\r\n }\r\n };\r\n\r\n // Derive the target document from the container element. When the container is in a popup\r\n // window (or other document distinct from the main one), this is what makes Fluent inject\r\n // styles and render portals into the correct document.\r\n const containerOwnerDocument = containerElement.ownerDocument;\r\n const targetDocument = containerOwnerDocument && containerOwnerDocument !== document ? containerOwnerDocument : undefined;\r\n\r\n // Set the container element to be a flex container so that the tool can be displayed properly.\r\n const originalContainerElementDisplay = containerElement.style.display;\r\n containerElement.style.display = \"flex\";\r\n\r\n // Create and render the react root component.\r\n const reactRoot = createRoot(containerElement);\r\n reactRoot.render(createElement(modularToolRootComponent));\r\n\r\n let disposed = false;\r\n return {\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n dispose: () => {\r\n // Unmount and restore the original container element display.\r\n if (!disposed) {\r\n disposed = true;\r\n reactRoot.unmount();\r\n containerElement.style.display = originalContainerElementDisplay;\r\n }\r\n // The promise resolves once the React effect cleanup\r\n // (which disposes the ServiceContainer) has completed.\r\n return disposeDeferred.promise;\r\n },\r\n };\r\n}\r\n","import { type IDisposable } from \"core/index\";\r\nimport { type IService } from \"../../modularity/serviceDefinition\";\r\n\r\n/**\r\n * The type of a bridge command argument, which determines how\r\n * the CLI processes the value before sending it to the browser.\r\n * @experimental\r\n * @internal\r\n */\r\nexport type BridgeCommandArgType = \"string\" | \"file\";\r\n\r\n/**\r\n * Describes an argument for a bridge command.\r\n * @experimental\r\n * @internal\r\n */\r\nexport type BridgeCommandArg = {\r\n /**\r\n * The name of the argument.\r\n */\r\n name: string;\r\n\r\n /**\r\n * A description of the argument.\r\n */\r\n description: string;\r\n\r\n /**\r\n * Whether the argument is required.\r\n */\r\n required?: boolean;\r\n\r\n /**\r\n * The type of the argument. Defaults to \"string\".\r\n * When set to \"file\", the CLI reads the file at the given path\r\n * and passes its contents as the argument value.\r\n */\r\n type?: BridgeCommandArgType;\r\n};\r\n\r\n/**\r\n * Describes a command that can be invoked from the bridge.\r\n * @experimental\r\n * @internal\r\n */\r\nexport type BridgeCommandDescriptor = {\r\n /**\r\n * A unique identifier for the command.\r\n */\r\n id: string;\r\n\r\n /**\r\n * A human-readable description of what the command does.\r\n */\r\n description: string;\r\n\r\n /**\r\n * The arguments that this command accepts.\r\n */\r\n args?: BridgeCommandArg[];\r\n\r\n /**\r\n * Executes the command with the given arguments and returns a result string.\r\n * @param args A map of argument names to their values.\r\n * @returns A promise that resolves to the result string.\r\n */\r\n executeAsync: (args: Record<string, string>) => Promise<string>;\r\n};\r\n\r\n/**\r\n * The service identity for the bridge command registry.\r\n * @experimental\r\n * @internal\r\n */\r\nexport const BridgeCommandRegistryIdentity = Symbol(\"BridgeCommandRegistry\");\r\n\r\n/**\r\n * A registry for commands that can be invoked from the bridge.\r\n * @experimental\r\n * @internal\r\n */\r\nexport interface IBridgeCommandRegistry extends IService<typeof BridgeCommandRegistryIdentity> {\r\n /**\r\n * Registers a command that can be invoked from the bridge.\r\n * @param descriptor The command descriptor.\r\n * @returns A disposable token that unregisters the command when disposed.\r\n */\r\n addCommand(descriptor: BridgeCommandDescriptor): IDisposable;\r\n}\r\n","import { type IReadonlyObservable } from \"core/index\";\r\nimport { type IService } from \"../../modularity/serviceDefinition\";\r\n\r\n/**\r\n * The service identity for the CLI connection status.\r\n * @experimental\r\n * @internal\r\n */\r\nexport const CliConnectionStatusIdentity = Symbol(\"CliConnectionStatus\");\r\n\r\n/**\r\n * Provides the connection status and enable/disable control for the CLI bridge.\r\n * @experimental\r\n * @internal\r\n */\r\nexport interface ICliConnectionStatus extends IService<typeof CliConnectionStatusIdentity> {\r\n /**\r\n * Whether the bridge is enabled. When true, the bridge actively tries to\r\n * maintain a WebSocket connection. When false, the bridge is disconnected\r\n * and idle.\r\n */\r\n isEnabled: boolean;\r\n\r\n /**\r\n * Whether the bridge WebSocket is currently connected.\r\n */\r\n readonly isConnected: boolean;\r\n\r\n /**\r\n * Observable that fires when either {@link isEnabled} or {@link isConnected} changes.\r\n */\r\n readonly onConnectionStatusChanged: IReadonlyObservable<void>;\r\n}\r\n","import { type IDisposable } from \"core/index\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type BrowserRequest, type BrowserResponse, type CommandInfo } from \"./protocol\";\r\nimport { type ServiceDefinition } from \"../../modularity/serviceDefinition\";\r\nimport { type ICliConnectionStatus, CliConnectionStatusIdentity } from \"./bridgeConnectionStatus\";\r\nimport { type IBridgeCommandRegistry, type BridgeCommandDescriptor, BridgeCommandRegistryIdentity } from \"./bridgeCommandRegistry\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Options for the CLI bridge service.\r\n * @experimental\r\n * @internal\r\n */\r\nexport type BridgeServiceOptions = {\r\n /**\r\n * The WebSocket port for the bridge's browser port.\r\n */\r\n port: number;\r\n\r\n /**\r\n * The session display name sent to the bridge.\r\n * Can be a getter to provide a dynamic value that is re-read\r\n * each time the bridge queries session information.\r\n */\r\n name: string;\r\n\r\n /**\r\n * Whether to automatically enable connecting when the service is created.\r\n */\r\n autoEnable: boolean;\r\n};\r\n\r\n/**\r\n * Creates the service definition for the CLI Bridge Service.\r\n * @param options The options for connecting to the bridge.\r\n * @returns A service definition that produces an IBridgeCommandRegistry and ICliConnectionStatus.\r\n * @experimental\r\n * @internal\r\n */\r\nexport function MakeBridgeServiceDefinition(options: BridgeServiceOptions): ServiceDefinition<[IBridgeCommandRegistry, ICliConnectionStatus], []> {\r\n return {\r\n friendlyName: \"CLI Bridge Service\",\r\n produces: [BridgeCommandRegistryIdentity, CliConnectionStatusIdentity],\r\n factory: () => {\r\n const commands = new Map<string, BridgeCommandDescriptor>();\r\n let ws: WebSocket | null = null;\r\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n let disposed = false;\r\n let enabled = options.autoEnable;\r\n let connected = false;\r\n const onConnectionStatusChanged = new Observable<void>();\r\n\r\n function notifyStatusChanged() {\r\n onConnectionStatusChanged.notifyObservers();\r\n }\r\n\r\n function setConnected(value: boolean) {\r\n if (connected !== value) {\r\n connected = value;\r\n notifyStatusChanged();\r\n }\r\n }\r\n\r\n function sendToBridge(message: BrowserRequest) {\r\n ws?.send(JSON.stringify(message));\r\n }\r\n\r\n function connect() {\r\n if (disposed || !enabled) {\r\n return;\r\n }\r\n\r\n // Close any existing WebSocket to avoid orphaned connections that\r\n // keep a stale session alive on the bridge.\r\n if (ws) {\r\n const oldWs = ws;\r\n oldWs.onopen = null;\r\n oldWs.onclose = null;\r\n oldWs.onmessage = null;\r\n oldWs.onerror = null;\r\n oldWs.close();\r\n ws = null;\r\n }\r\n\r\n try {\r\n // NOTE: The browser unconditionally logs a console error for failed WebSocket\r\n // connections at the network level. This cannot be suppressed from JavaScript.\r\n ws = new WebSocket(`ws://127.0.0.1:${options.port}`);\r\n } catch {\r\n ws = null;\r\n setConnected(false);\r\n Logger.Warn(`CLIBridgeService: Failed to create WebSocket connection on port ${options.port}.`);\r\n scheduleReconnect();\r\n return;\r\n }\r\n\r\n ws.onopen = () => {\r\n setConnected(true);\r\n sendToBridge({ type: \"register\", name: options.name });\r\n };\r\n\r\n ws.onmessage = (event) => {\r\n try {\r\n const message = JSON.parse(event.data as string);\r\n void handleMessage(message);\r\n } catch {\r\n Logger.Warn(\"CLIBridgeService: Failed to parse message from bridge.\");\r\n }\r\n };\r\n\r\n ws.onclose = () => {\r\n ws = null;\r\n setConnected(false);\r\n scheduleReconnect();\r\n };\r\n\r\n ws.onerror = () => {\r\n // onclose will fire after onerror, which handles reconnection.\r\n };\r\n }\r\n\r\n function disconnect() {\r\n if (reconnectTimer !== null) {\r\n clearTimeout(reconnectTimer);\r\n reconnectTimer = null;\r\n }\r\n if (ws) {\r\n ws.onclose = null;\r\n ws.close();\r\n ws = null;\r\n }\r\n setConnected(false);\r\n }\r\n\r\n function scheduleReconnect() {\r\n if (disposed || !enabled || reconnectTimer !== null) {\r\n return;\r\n }\r\n reconnectTimer = setTimeout(() => {\r\n reconnectTimer = null;\r\n connect();\r\n }, 3000);\r\n }\r\n\r\n async function handleMessage(message: BrowserResponse) {\r\n switch (message.type) {\r\n case \"listCommands\": {\r\n const commandList: CommandInfo[] = Array.from(commands.values()).map((cmd) => ({\r\n id: cmd.id,\r\n description: cmd.description,\r\n args: cmd.args,\r\n }));\r\n sendToBridge({\r\n type: \"commandListResponse\",\r\n requestId: message.requestId,\r\n commands: commandList,\r\n });\r\n break;\r\n }\r\n case \"getInfo\": {\r\n sendToBridge({\r\n type: \"infoResponse\",\r\n requestId: message.requestId,\r\n name: options.name,\r\n });\r\n break;\r\n }\r\n case \"execCommand\": {\r\n const command = commands.get(message.commandId);\r\n if (!command) {\r\n sendToBridge({\r\n type: \"commandResponse\",\r\n requestId: message.requestId,\r\n error: `Unknown command: ${message.commandId}`,\r\n });\r\n break;\r\n }\r\n try {\r\n const result = await command.executeAsync(message.args);\r\n sendToBridge({\r\n type: \"commandResponse\",\r\n requestId: message.requestId,\r\n result,\r\n });\r\n } catch (error: unknown) {\r\n sendToBridge({\r\n type: \"commandResponse\",\r\n requestId: message.requestId,\r\n error: String(error),\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (enabled) {\r\n connect();\r\n }\r\n\r\n const registry: IBridgeCommandRegistry & ICliConnectionStatus & IDisposable = {\r\n addCommand(descriptor: BridgeCommandDescriptor): IDisposable {\r\n if (commands.has(descriptor.id)) {\r\n throw new Error(`Command '${descriptor.id}' is already registered.`);\r\n }\r\n commands.set(descriptor.id, descriptor);\r\n return {\r\n dispose: () => {\r\n commands.delete(descriptor.id);\r\n },\r\n };\r\n },\r\n get isEnabled() {\r\n return enabled;\r\n },\r\n set isEnabled(value: boolean) {\r\n if (enabled !== value) {\r\n enabled = value;\r\n if (enabled) {\r\n connect();\r\n } else {\r\n disconnect();\r\n }\r\n notifyStatusChanged();\r\n }\r\n },\r\n get isConnected() {\r\n return connected;\r\n },\r\n onConnectionStatusChanged,\r\n dispose: () => {\r\n disposed = true;\r\n enabled = false;\r\n disconnect();\r\n commands.clear();\r\n onConnectionStatusChanged.clear();\r\n },\r\n };\r\n\r\n return registry;\r\n },\r\n };\r\n}\r\n","import { type IDisposable } from \"core/index\";\r\nimport { type WeaklyTypedServiceDefinition, ServiceContainer } from \"./modularity/serviceContainer\";\r\nimport { MakeBridgeServiceDefinition } from \"./services/cli/bridgeService\";\r\n\r\nconst DefaultPort = 4400;\r\n\r\n/**\r\n * Options for creating a modular bridge container.\r\n * @experimental\r\n * @internal\r\n */\r\nexport type ModularBridgeOptions = {\r\n /**\r\n * WebSocket port for the bridge's browser port. Defaults to 4400.\r\n */\r\n port?: number;\r\n\r\n /**\r\n * Session display name reported to the bridge. Defaults to `document.title`.\r\n */\r\n name?: string;\r\n\r\n /**\r\n * Whether the bridge should automatically enable trying to connect.\r\n * Defaults to true.\r\n */\r\n autoEnable?: boolean;\r\n\r\n /**\r\n * Additional service definitions to register with the bridge container.\r\n */\r\n serviceDefinitions?: readonly WeaklyTypedServiceDefinition[];\r\n};\r\n\r\n/**\r\n * A token returned by {@link MakeModularBridge} that owns the headless\r\n * {@link ServiceContainer}. Dispose it to tear down the bridge and all services.\r\n * @experimental\r\n * @internal\r\n */\r\nexport type ModularBridgeToken = IDisposable & {\r\n /**\r\n * The headless ServiceContainer that hosts the bridge.\r\n */\r\n readonly serviceContainer: ServiceContainer;\r\n\r\n /**\r\n * Whether this token has been disposed.\r\n */\r\n readonly isDisposed: boolean;\r\n};\r\n\r\n/**\r\n * Creates a headless {@link ServiceContainer} that hosts a bridge service.\r\n *\r\n * The returned token owns the container. Dispose it to tear down the bridge.\r\n *\r\n * @param options Optional configuration for the bridge.\r\n * @returns A {@link ModularBridgeToken} that owns the container.\r\n * @experimental\r\n * @internal\r\n */\r\nexport function MakeModularBridge(options?: ModularBridgeOptions): ModularBridgeToken {\r\n const serviceContainer = new ServiceContainer(\"ModularBridgeContainer\");\r\n\r\n const bridgeDefinition = MakeBridgeServiceDefinition({\r\n port: options?.port ?? DefaultPort,\r\n get name() {\r\n return options?.name ?? (typeof document !== \"undefined\" ? document.title : \"Babylon.js Scene\");\r\n },\r\n autoEnable: options?.autoEnable ?? true,\r\n });\r\n\r\n const allDefinitions: WeaklyTypedServiceDefinition[] = [bridgeDefinition];\r\n if (options?.serviceDefinitions) {\r\n allDefinitions.push(...options.serviceDefinitions);\r\n }\r\n\r\n serviceContainer.addServices(...allDefinitions);\r\n\r\n let disposed = false;\r\n\r\n return {\r\n get serviceContainer() {\r\n return serviceContainer;\r\n },\r\n get isDisposed() {\r\n return disposed;\r\n },\r\n dispose() {\r\n disposed = true;\r\n serviceContainer.dispose();\r\n },\r\n };\r\n}\r\n","import { type CheckboxOnChangeData, Checkbox as FluentCheckbox, makeStyles } from \"@fluentui/react-components\";\r\nimport { type ChangeEvent, type FunctionComponent, useEffect, useState } from \"react\";\r\n\r\nimport { type PrimitiveProps } from \"./primitive\";\r\n\r\nconst useCheckboxStyles = makeStyles({\r\n indicator: {\r\n margin: 0,\r\n },\r\n});\r\n/**\r\n * This is a primitive fluent checkbox that can both read and write checked state\r\n * @param props\r\n * @returns Checkbox component\r\n */\r\nexport const Checkbox: FunctionComponent<PrimitiveProps<boolean>> = (props) => {\r\n Checkbox.displayName = \"Checkbox\";\r\n const [checked, setChecked] = useState(() => props.value ?? false);\r\n const classes = useCheckboxStyles();\r\n useEffect(() => {\r\n if (props.value != undefined) {\r\n setChecked(props.value); // Update local state when props.checked changes\r\n }\r\n }, [props.value]);\r\n\r\n const onChange = (ev: ChangeEvent<HTMLInputElement>, _: CheckboxOnChangeData) => {\r\n props.onChange(ev.target.checked);\r\n setChecked(ev.target.checked);\r\n };\r\n\r\n return <FluentCheckbox checked={checked} onChange={onChange} indicator={{ className: classes.indicator }} />;\r\n};\r\n","import { useState, useContext, useEffect, forwardRef } from \"react\";\r\nimport { Combobox as FluentComboBox, makeStyles, useComboboxFilter, useId, Option, type OptionOnSelectData, type SelectionEvents } from \"@fluentui/react-components\";\r\nimport { ToolContext } from \"../hoc/fluentToolWrapper\";\r\nimport { CustomTokens } from \"./utils\";\r\nimport { type PrimitiveProps } from \"./primitive\";\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n display: \"grid\",\r\n gridTemplateRows: \"repeat(1fr)\",\r\n justifyItems: \"start\",\r\n gap: \"2px\",\r\n maxWidth: \"400px\",\r\n },\r\n comboBox: {\r\n width: CustomTokens.valueWidth,\r\n minWidth: CustomTokens.valueWidth,\r\n boxSizing: \"border-box\",\r\n },\r\n input: {\r\n minWidth: 0,\r\n },\r\n listbox: {\r\n width: \"fit-content\",\r\n minWidth: \"fit-content\",\r\n maxWidth: \"350px\",\r\n },\r\n});\r\n\r\n/**\r\n * An option object for the ComboBox with separate label and value.\r\n */\r\nexport type ComboBoxOption = {\r\n /**\r\n * Defines the visible part of the option\r\n */\r\n label: string;\r\n /**\r\n * Defines the value part of the option\r\n */\r\n value: string;\r\n};\r\n\r\nexport type ComboBoxProps = PrimitiveProps<string> & {\r\n /**\r\n * Label for the ComboBox\r\n */\r\n label: string;\r\n /**\r\n * Options to display as label/value pairs\r\n */\r\n options: ComboBoxOption[];\r\n /**\r\n * The default open state when open is uncontrolled\r\n */\r\n defaultOpen?: boolean;\r\n};\r\n\r\n/**\r\n * Wrapper around a Fluent ComboBox that allows for filtering options.\r\n * @param props\r\n * @returns\r\n */\r\nexport const ComboBox = forwardRef<HTMLInputElement, ComboBoxProps>((props, ref) => {\r\n ComboBox.displayName = \"ComboBox\";\r\n const comboId = useId();\r\n const styles = useStyles();\r\n const { size } = useContext(ToolContext);\r\n\r\n // Find the label for the current value\r\n const getLabel = (value: string) => props.options.find((opt) => opt.value === value)?.label ?? \"\";\r\n\r\n const [query, setQuery] = useState(getLabel(props.value ?? \"\"));\r\n\r\n useEffect(() => {\r\n setQuery(getLabel(props.value ?? \"\"));\r\n }, [props.value, props.options]);\r\n\r\n // Convert to Fluent's { children, value } format\r\n const normalizedOptions = props.options.map((opt) => ({ children: opt.label, value: opt.value }));\r\n\r\n const children = useComboboxFilter(query, normalizedOptions, {\r\n noOptionsMessage: \"No items match your search.\",\r\n optionToReactKey: (option) => option.value,\r\n optionToText: (option) => option.children,\r\n renderOption: (option) => (\r\n <Option key={option.value} value={option.value} text={option.children}>\r\n {option.children}\r\n </Option>\r\n ),\r\n });\r\n\r\n const onOptionSelect = (_e: SelectionEvents, data: OptionOnSelectData) => {\r\n setQuery(data.optionText ?? \"\");\r\n data.optionValue && props.onChange(data.optionValue);\r\n };\r\n\r\n return (\r\n <div className={styles.root}>\r\n <label id={comboId}>{props.label}</label>\r\n <FluentComboBox\r\n ref={ref}\r\n defaultOpen={props.defaultOpen}\r\n size={size}\r\n root={{ className: styles.comboBox }}\r\n input={{ className: styles.input }}\r\n listbox={{ className: styles.listbox }}\r\n onOptionSelect={onOptionSelect}\r\n aria-labelledby={comboId}\r\n placeholder=\"Search..\"\r\n onChange={(ev) => setQuery(ev.target.value)}\r\n value={query}\r\n >\r\n {children}\r\n </FluentComboBox>\r\n </div>\r\n );\r\n});\r\n","import { makeStyles, tokens } from \"@fluentui/react-components\";\r\nimport { DeleteFilled } from \"@fluentui/react-icons\";\r\n\r\nexport type DraggableLineProps = {\r\n format: string;\r\n data: string;\r\n tooltip: string;\r\n label: string;\r\n onDelete?: () => void;\r\n};\r\n\r\nconst useDraggableStyles = makeStyles({\r\n draggable: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n position: \"relative\",\r\n columnGap: tokens.spacingHorizontalS,\r\n cursor: \"grab\",\r\n textAlign: \"center\",\r\n boxSizing: \"border-box\",\r\n margin: `${tokens.spacingVerticalXS} 0px`,\r\n padding: `${tokens.spacingVerticalSNudge} ${tokens.spacingHorizontalMNudge}`,\r\n\r\n // Button-like styling\r\n backgroundColor: tokens.colorNeutralBackground1,\r\n border: `${tokens.strokeWidthThin} solid ${tokens.colorNeutralStroke1}`,\r\n borderRadius: tokens.borderRadiusMedium,\r\n color: tokens.colorNeutralForeground1,\r\n fontSize: tokens.fontSizeBase300,\r\n fontFamily: tokens.fontFamilyBase,\r\n fontWeight: tokens.fontWeightRegular,\r\n lineHeight: tokens.lineHeightBase300,\r\n minHeight: \"32px\",\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n \":hover\": {\r\n backgroundColor: tokens.colorNeutralBackground1Hover,\r\n },\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n \":active\": {\r\n backgroundColor: tokens.colorNeutralBackground1Pressed,\r\n },\r\n },\r\n icon: {\r\n pointerEvents: \"auto\", // re‑enable interaction\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n position: \"absolute\",\r\n right: tokens.spacingHorizontalSNudge,\r\n color: tokens.colorNeutralForeground2,\r\n cursor: \"pointer\",\r\n fontSize: tokens.fontSizeBase400,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n \":hover\": {\r\n color: tokens.colorNeutralForeground2Hover,\r\n },\r\n },\r\n});\r\n\r\nexport const DraggableLine: React.FunctionComponent<DraggableLineProps> = (props) => {\r\n DraggableLine.displayName = \"DraggableLine\";\r\n const classes = useDraggableStyles();\r\n return (\r\n <div\r\n className={classes.draggable}\r\n title={props.tooltip}\r\n draggable={true}\r\n onDragStart={(event) => {\r\n event.dataTransfer.setData(props.format, props.data);\r\n }}\r\n >\r\n {props.label}\r\n {props.onDelete && <DeleteFilled className={classes.icon} onClick={props.onDelete} />}\r\n </div>\r\n );\r\n};\r\n","import { type Nullable } from \"core/types\";\r\nimport { type ImmutablePrimitiveProps, type PrimitiveProps } from \"./primitive\";\r\n\r\nimport { makeStyles, tokens, Tooltip } from \"@fluentui/react-components\";\r\nimport { LinkDismissRegular, LinkEditRegular } from \"@fluentui/react-icons\";\r\nimport { useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport { Button } from \"./button\";\r\nimport { ComboBox } from \"./comboBox\";\r\nimport { Link } from \"./link\";\r\nimport { useImpulse } from \"../hooks/transientStateHooks\";\r\n\r\ntype Entity = { uniqueId: number };\r\n\r\n/**\r\n * Props for the EntitySelector component\r\n */\r\nexport type EntitySelectorProps<T extends Entity> = (PrimitiveProps<Nullable<T>> | ImmutablePrimitiveProps<Nullable<T>>) & {\r\n /**\r\n * Function to get the list of entities to choose from\r\n */\r\n getEntities: () => T[];\r\n /**\r\n * Function to get the display name from an entity\r\n */\r\n getName: (entity: T) => string;\r\n /**\r\n * Optional filter function to filter which entities are shown\r\n */\r\n filter?: (entity: T) => boolean;\r\n /**\r\n * Callback when the entity link is clicked\r\n */\r\n onLink: (entity: T) => void;\r\n /**\r\n * Optional default value that enables clearing the current linked entity\r\n */\r\n defaultValue?: Nullable<T>;\r\n};\r\n\r\nconst useStyles = makeStyles({\r\n linkDiv: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n alignItems: \"center\",\r\n gap: tokens.spacingHorizontalS,\r\n minWidth: 0,\r\n overflow: \"hidden\",\r\n },\r\n link: {\r\n minWidth: 0,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n },\r\n});\r\n\r\n/**\r\n * A generic primitive component with a ComboBox for selecting from a list of entities.\r\n * Supports entities with duplicate names by using uniqueId for identity.\r\n * @param props ChooseEntityProps\r\n * @returns EntitySelector component\r\n */\r\nexport function EntitySelector<T extends Entity>(props: EntitySelectorProps<T>): JSX.Element {\r\n const { value, onLink, getEntities, getName, filter, defaultValue } = props;\r\n\r\n const onChange = (props as PrimitiveProps<Nullable<T>>).onChange as PrimitiveProps<Nullable<T>>[\"onChange\"] | undefined;\r\n\r\n const classes = useStyles();\r\n\r\n const comboBoxRef = useRef<HTMLInputElement>(null);\r\n\r\n // Build options with uniqueId as key\r\n const options = useMemo(() => {\r\n return getEntities()\r\n .filter((e) => e.uniqueId !== undefined && (!filter || filter(e)))\r\n .map((entity) => ({\r\n label: getName(entity)?.toString() || \"\",\r\n value: entity.uniqueId.toString(),\r\n }))\r\n .sort((a, b) => a.label.localeCompare(b.label));\r\n }, [getEntities, getName, filter]);\r\n\r\n const [isEditing, setIsEditing] = useState(false);\r\n\r\n const [enteringEditMode, pulseEnteringEditMode] = useImpulse<true>();\r\n\r\n useEffect(() => {\r\n if (enteringEditMode) {\r\n comboBoxRef.current?.focus();\r\n }\r\n }, [enteringEditMode]);\r\n\r\n const handleEntitySelect = (key: string) => {\r\n const entity = getEntities().find((e) => e.uniqueId.toString() === key);\r\n onChange?.(entity ?? null);\r\n setIsEditing(false);\r\n };\r\n\r\n // Get current entity key for display\r\n const currentKey = value ? value.uniqueId.toString() : \"\";\r\n\r\n if (value && !isEditing) {\r\n // If there is a value and we are not editing, show the link view\r\n return (\r\n <div className={classes.linkDiv}>\r\n <Tooltip content={getName(value)} relationship=\"label\">\r\n <Link className={classes.link} value={getName(value)} onLink={() => onLink(value)} />\r\n </Tooltip>\r\n {/* Only allow changing the linked entity if an onChange handler is provided */}\r\n {onChange &&\r\n (defaultValue !== undefined ? (\r\n // If the defaultValue is specified, then allow resetting to the default\r\n <Tooltip content=\"Unlink\" relationship=\"label\">\r\n <Button\r\n icon={LinkDismissRegular}\r\n onClick={() => {\r\n pulseEnteringEditMode(true);\r\n onChange(defaultValue);\r\n }}\r\n />\r\n </Tooltip>\r\n ) : (\r\n // Otherwise, just allow editing to a new value\r\n <Tooltip content=\"Edit Link\" relationship=\"label\">\r\n <Button\r\n icon={LinkEditRegular}\r\n onClick={() => {\r\n pulseEnteringEditMode(true);\r\n setIsEditing(true);\r\n }}\r\n />\r\n </Tooltip>\r\n ))}\r\n </div>\r\n );\r\n } else {\r\n // Otherwise, show the ComboBox for selection\r\n return <ComboBox ref={comboBoxRef} defaultOpen={enteringEditMode} label=\"\" options={options} value={currentKey} onChange={handleEntitySelect} />;\r\n }\r\n}\r\nEntitySelector.displayName = \"EntitySelector\";\r\n","import { type SpinnerProps, Spinner } from \"@fluentui/react-components\";\r\nimport { type ComponentProps, type ComponentType, type ElementRef, type Ref, forwardRef, lazy, Suspense } from \"react\";\r\n\r\ntype LazyComponentProps = {\r\n spinnerSize?: SpinnerProps[\"size\"];\r\n spinnerLabel?: string;\r\n};\r\n\r\n/**\r\n * Creates a lazy component wrapper that only calls the async function to get the underlying component when the lazy component is actually mounted.\r\n * This allows deferring imports until they are needed. While the underlying component is being loaded, a spinner is displayed.\r\n * @param getComponentAsync A function that returns a promise resolving to the component.\r\n * @param defaultProps Options for the loading spinner.\r\n * @returns A React component that displays a spinner while loading the async component.\r\n */\r\nexport function MakeLazyComponent<ComponentT extends ComponentType<any>>(getComponentAsync: () => Promise<ComponentT>, defaultProps?: LazyComponentProps) {\r\n type WrappedComponentProps = ComponentProps<ComponentT> & LazyComponentProps;\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const LazyComponent = lazy(async () => {\r\n const component = await getComponentAsync();\r\n return { default: component };\r\n });\r\n\r\n return forwardRef<ElementRef<typeof Spinner | ComponentT>, WrappedComponentProps>((props, ref) => {\r\n const { spinnerSize = defaultProps?.spinnerSize, spinnerLabel = defaultProps?.spinnerLabel, ...rest } = props;\r\n\r\n const componentProps = { ...rest, ref };\r\n\r\n return (\r\n <Suspense fallback={<Spinner ref={ref as Ref<ElementRef<typeof Spinner>>} size={spinnerSize} label={spinnerLabel} />}>\r\n <LazyComponent {...(componentProps as ComponentProps<ComponentT>)} />\r\n </Suspense>\r\n );\r\n });\r\n}\r\n","import { LineContainer } from \"./propertyLines/propertyLine\";\r\nimport { type FunctionComponent } from \"react\";\r\nimport { Button, type ButtonProps } from \"../primitives/button\";\r\n\r\ntype ButtonLineProps = Omit<ButtonProps, \"label\"> & {\r\n label: string; // Require a label when button is the entire line (by default, label is optional on a button)\r\n uniqueId?: string; // The ID of the property line to be used when the label cannot be used as a persistent ID.\r\n};\r\n\r\n/**\r\n * Wraps a button with a label in a line container\r\n * @param props Button props plus a label\r\n * @returns A button inside a line\r\n */\r\nexport const ButtonLine: FunctionComponent<ButtonLineProps> = (props) => {\r\n ButtonLine.displayName = \"ButtonLine\";\r\n\r\n const { uniqueId, ...buttonProps } = props;\r\n\r\n return (\r\n <LineContainer uniqueId={uniqueId ?? props.label}>\r\n <Button {...buttonProps} />\r\n </LineContainer>\r\n );\r\n};\r\n","import { type ReactElement, type ReactNode, useMemo } from \"react\";\r\n\r\nimport { Body1Strong, makeStyles, tokens } from \"@fluentui/react-components\";\r\nimport { AddRegular, CopyRegular, DeleteRegular } from \"@fluentui/react-icons\";\r\n\r\nimport { ButtonLine } from \"../hoc/buttonLine\";\r\n\r\nconst useListStyles = makeStyles({\r\n item: {\r\n width: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"row\", // Arrange items horizontally\r\n alignItems: \"center\", // Center items vertically\r\n gap: tokens.spacingHorizontalS, // Add space between elements\r\n borderBottom: `${tokens.strokeWidthThin} solid ${tokens.colorNeutralStroke1}`,\r\n },\r\n itemId: {\r\n width: tokens.spacingHorizontalM,\r\n },\r\n itemContent: {\r\n flex: 1, // Take up remaining space\r\n minWidth: 0, // Prevent flex item from overflowing\r\n },\r\n iconContainer: {\r\n display: \"flex\",\r\n gap: tokens.spacingHorizontalXS, // Small gap between icons\r\n alignItems: \"center\",\r\n flexShrink: 0, // Prevent shrinking\r\n },\r\n list: {\r\n padding: tokens.spacingVerticalS,\r\n },\r\n});\r\n\r\n/**\r\n * Represents an item in a list\r\n */\r\nexport type ListItem<T> = {\r\n /** Unique identifier for the item */\r\n id: number;\r\n /** The data associated with the item */\r\n data: T;\r\n /** Value to use for sorting the list */\r\n sortBy: number;\r\n};\r\n\r\ntype ListProps<T> = {\r\n items: ListItem<T>[];\r\n renderItem: (item: ListItem<T>, index: number) => ReactNode;\r\n onDelete?: (item: ListItem<T>, index: number) => void;\r\n onAdd?: (item?: ListItem<T>) => void;\r\n addButtonLabel?: string;\r\n};\r\n\r\n/**\r\n * For cases where you may want to add / remove items from a list via a trash can button / copy button, this HOC can be used\r\n * @returns A React component that renders a list of items with add/delete functionality\r\n * @param props - The properties for the List component\r\n */\r\nexport function List<T>(props: ListProps<T>): ReactElement {\r\n const { items, renderItem, onDelete, onAdd, addButtonLabel = \"Add new item\" } = props;\r\n const classes = useListStyles();\r\n\r\n const sortedItems = useMemo(() => [...items].sort((a, b) => a.sortBy - b.sortBy), [items]);\r\n\r\n return (\r\n <div>\r\n {onAdd && <ButtonLine label={addButtonLabel} icon={AddRegular} onClick={() => onAdd()} />}\r\n\r\n <div className={classes.list}>\r\n {sortedItems.map((item: ListItem<T>, index: number) => (\r\n <div key={item.id} className={classes.item}>\r\n <Body1Strong className={classes.itemId}>#{index}</Body1Strong>\r\n <div className={classes.itemContent}>{renderItem(item, items.indexOf(sortedItems[index]))}</div>\r\n {(onAdd || onDelete) && (\r\n <div className={classes.iconContainer}>\r\n {onAdd && <CopyRegular onClick={() => onAdd(item)} />}\r\n {onDelete && <DeleteRegular onClick={() => onDelete(item, items.indexOf(sortedItems[index]))} />}\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { MessageBar as FluentMessageBar, MessageBarTitle, MessageBarBody, makeStyles, tokens } from \"@fluentui/react-components\";\r\nimport { type FunctionComponent } from \"react\";\r\nimport { Link } from \"./link\";\r\nimport { AccordionSectionItem } from \"./accordion\";\r\n\r\nconst useClasses = makeStyles({\r\n container: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: tokens.spacingVerticalS, // 8px\r\n },\r\n});\r\n\r\ntype MessageBarProps = {\r\n message: string;\r\n title?: string;\r\n docLink?: string;\r\n intent: \"info\" | \"success\" | \"warning\" | \"error\";\r\n staticItem?: boolean;\r\n};\r\n\r\nexport const MessageBar: FunctionComponent<MessageBarProps> = (props) => {\r\n MessageBar.displayName = \"MessageBar\";\r\n const { message, title, intent, docLink, staticItem } = props;\r\n const classes = useClasses();\r\n\r\n return (\r\n <AccordionSectionItem uniqueId={title ?? message} staticItem={staticItem ?? true}>\r\n <div className={classes.container}>\r\n <FluentMessageBar intent={intent} layout=\"multiline\">\r\n <MessageBarBody>\r\n {title && <MessageBarTitle>{title}</MessageBarTitle>}\r\n {message}\r\n {docLink && (\r\n <>\r\n {\" - \"}\r\n <Link url={docLink} value=\"Learn More\" />\r\n </>\r\n )}\r\n </MessageBarBody>\r\n </FluentMessageBar>\r\n </div>\r\n </AccordionSectionItem>\r\n );\r\n};\r\n","import { type PropsWithChildren, type ReactElement, forwardRef, useState } from \"react\";\r\nimport { Popover as FluentPopover, PopoverTrigger, PopoverSurface, makeStyles, tokens, type PositioningShorthand } from \"@fluentui/react-components\";\r\nimport { type FluentIcon } from \"@fluentui/react-icons\";\r\nimport { Button } from \"./button\";\r\n\r\nconst useStyles = makeStyles({\r\n surface: {\r\n maxWidth: \"400px\",\r\n },\r\n content: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: tokens.spacingVerticalM,\r\n padding: tokens.spacingHorizontalL,\r\n minWidth: \"300px\",\r\n },\r\n});\r\n\r\ntype PopoverWithIconProps = {\r\n icon: FluentIcon;\r\n trigger?: never;\r\n};\r\n\r\ntype PopoverWithTriggerProps = {\r\n icon?: never;\r\n trigger: ReactElement;\r\n};\r\n\r\ntype PopoverBaseProps = {\r\n /** Controlled open state */\r\n open?: boolean;\r\n /** Callback when open state changes */\r\n onOpenChange?: (open: boolean) => void;\r\n /** Positioning of the popover */\r\n positioning?: PositioningShorthand;\r\n /** Custom class for the surface */\r\n surfaceClassName?: string;\r\n};\r\n\r\ntype PopoverProps = PopoverBaseProps & (PopoverWithIconProps | PopoverWithTriggerProps);\r\n\r\nexport const Popover = forwardRef<HTMLButtonElement, PropsWithChildren<PopoverProps>>((props, ref) => {\r\n const { children, open: controlledOpen, onOpenChange, positioning, surfaceClassName } = props;\r\n const [internalOpen, setInternalOpen] = useState(false);\r\n const classes = useStyles();\r\n\r\n const isControlled = controlledOpen !== undefined;\r\n const popoverOpen = isControlled ? controlledOpen : internalOpen;\r\n\r\n const handleOpenChange = (_: unknown, data: { open: boolean }) => {\r\n if (!isControlled) {\r\n setInternalOpen(data.open);\r\n }\r\n onOpenChange?.(data.open);\r\n };\r\n\r\n return (\r\n <FluentPopover\r\n open={popoverOpen}\r\n onOpenChange={handleOpenChange}\r\n positioning={\r\n positioning ?? {\r\n align: \"start\",\r\n overflowBoundary: document.body,\r\n autoSize: true,\r\n }\r\n }\r\n >\r\n <PopoverTrigger disableButtonEnhancement>\r\n {props.trigger ?? <Button ref={ref} icon={props.icon} onClick={() => handleOpenChange(null, { open: true })} />}\r\n </PopoverTrigger>\r\n <PopoverSurface className={surfaceClassName ?? classes.surface}>\r\n <div className={classes.content}>{children}</div>\r\n </PopoverSurface>\r\n </FluentPopover>\r\n );\r\n});\r\n\r\nPopover.displayName = \"Popover\";\r\n","import { Popover, PopoverSurface, PopoverTrigger, type OnOpenChangeData, type OpenPopoverEvents } from \"@fluentui/react-components\";\r\nimport { type FunctionComponent, type PropsWithChildren, useState, useEffect } from \"react\";\r\n\r\ntype PositionedPopoverProps = {\r\n x: number;\r\n y: number;\r\n visible: boolean;\r\n hide: () => void;\r\n};\r\n\r\n/**\r\n * PositionedPopover component that shows a popover at specific coordinates\r\n * @param props - The component props\r\n * @returns The positioned popover component\r\n */\r\nexport const PositionedPopover: FunctionComponent<PropsWithChildren<PositionedPopoverProps>> = (props) => {\r\n PositionedPopover.displayName = \"PositionedPopover\";\r\n const [open, setOpen] = useState(false);\r\n\r\n useEffect(() => {\r\n setOpen(props.visible);\r\n }, [props.visible, props.x, props.y]);\r\n\r\n const handleOpenChange = (_: OpenPopoverEvents, data: OnOpenChangeData) => {\r\n setOpen(data.open);\r\n\r\n if (!data.open) {\r\n props.hide();\r\n }\r\n };\r\n\r\n return (\r\n <Popover\r\n open={open}\r\n onOpenChange={handleOpenChange}\r\n positioning={{\r\n position: \"below\", // Places the popover directly below the trigger element\r\n autoSize: \"height-always\", //Automatically adjusts the popover height to fit within the viewport\r\n fallbackPositions: [\"above\", \"after\", \"before\"], //If the primary position doesn't fit, automatically tries these positions in order\r\n }}\r\n withArrow={false} // Removes arrow that points to trigger element\r\n >\r\n <PopoverTrigger>\r\n {/* Use the invisible div as the trigger location*/}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: `${props.x}px`,\r\n top: `${props.y}px`,\r\n visibility: \"hidden\",\r\n }}\r\n />\r\n </PopoverTrigger>\r\n <PopoverSurface>{props.children}</PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n","import { Field, SearchBox as FluentSearchBox, makeStyles, type InputOnChangeData, type SearchBoxChangeEvent } from \"@fluentui/react-components\";\r\nimport { forwardRef } from \"react\";\r\n\r\ntype SearchProps = {\r\n onChange: (val: string) => void;\r\n placeholder?: string;\r\n};\r\nconst useStyles = makeStyles({\r\n search: {\r\n minWidth: \"50px\",\r\n },\r\n});\r\n\r\nexport const SearchBar = forwardRef<HTMLInputElement, SearchProps>((props, ref) => {\r\n SearchBar.displayName = \"SearchBar\";\r\n\r\n const classes = useStyles();\r\n const onChange: (ev: SearchBoxChangeEvent, data: InputOnChangeData) => void = (_, data) => {\r\n props.onChange(data.value);\r\n };\r\n\r\n return (\r\n <Field>\r\n <FluentSearchBox ref={ref} className={classes.search} placeholder={props.placeholder} onChange={onChange} />\r\n </Field>\r\n );\r\n});\r\n","import { makeStyles, tokens } from \"@fluentui/react-components\";\r\nimport { SearchBar } from \"./searchBar\";\r\nimport { type FunctionComponent, useState, useEffect } from \"react\";\r\n\r\ntype SearchBoxProps = {\r\n items: string[];\r\n onItemSelected: (item: string) => void;\r\n title?: string;\r\n};\r\n\r\nconst useSearchBoxStyles = makeStyles({\r\n searchBox: {\r\n width: \"300px\",\r\n height: \"400px\",\r\n backgroundColor: tokens.colorNeutralBackground1,\r\n border: `${tokens.strokeWidthThick} solid ${tokens.colorNeutralStroke1}`,\r\n borderRadius: tokens.borderRadiusMedium,\r\n boxShadow: tokens.shadow16,\r\n display: \"grid\",\r\n gridTemplateRows: \"auto auto 1fr\",\r\n overflow: \"hidden\", // Prevent content overflow\r\n },\r\n title: {\r\n borderBottom: `${tokens.strokeWidthThin} solid ${tokens.colorNeutralStroke2}`,\r\n margin: tokens.spacingVerticalXS,\r\n paddingBottom: tokens.spacingVerticalXS,\r\n color: tokens.colorNeutralForeground1,\r\n gridRow: \"1\",\r\n fontSize: tokens.fontSizeBase300,\r\n fontWeight: tokens.fontWeightSemibold,\r\n },\r\n filterContainer: {\r\n margin: tokens.spacingVerticalXS,\r\n paddingBottom: tokens.spacingVerticalXS,\r\n gridRow: \"2\",\r\n },\r\n list: {\r\n gridRow: \"3\",\r\n overflowY: \"auto\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n maxHeight: \"100%\",\r\n },\r\n listItem: {\r\n marginLeft: tokens.spacingHorizontalXS,\r\n marginRight: tokens.spacingHorizontalXS,\r\n cursor: \"pointer\",\r\n color: tokens.colorNeutralForeground1,\r\n marginTop: tokens.spacingVerticalXXS,\r\n marginBottom: tokens.spacingVerticalXXS,\r\n padding: tokens.spacingVerticalXS,\r\n borderRadius: tokens.borderRadiusSmall,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n \":hover\": {\r\n backgroundColor: tokens.colorNeutralBackground2Hover,\r\n },\r\n },\r\n listItemSelected: {\r\n backgroundColor: tokens.colorBrandBackground,\r\n color: tokens.colorNeutralForegroundOnBrand,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n \":hover\": {\r\n backgroundColor: tokens.colorBrandBackgroundHover,\r\n },\r\n },\r\n});\r\n\r\n/**\r\n * SearchBox component that displays a popup with search functionality\r\n * @param props - The component props\r\n * @returns The search box component\r\n */\r\nexport const SearchBox: FunctionComponent<SearchBoxProps> = (props) => {\r\n SearchBox.displayName = \"SearchBox\";\r\n\r\n const classes = useSearchBoxStyles();\r\n const [selectedIndex, setSelectedIndex] = useState(0);\r\n const [items, setItems] = useState(props.items);\r\n // In future could replace this with a fluent component like menuList or comboBox depending on desired UX\r\n const onKeyDown = (evt: React.KeyboardEvent) => {\r\n if (items.length === 0) {\r\n return;\r\n }\r\n if (evt.code === \"Enter\") {\r\n props.onItemSelected(items[selectedIndex]);\r\n return;\r\n }\r\n\r\n if (evt.code === \"ArrowDown\") {\r\n setSelectedIndex((prev) => Math.min(prev + 1, items.length - 1));\r\n return;\r\n }\r\n\r\n if (evt.code === \"ArrowUp\") {\r\n setSelectedIndex((prev) => Math.max(prev - 1, 0));\r\n return;\r\n }\r\n };\r\n\r\n const onFilterChange = (filter: string) => {\r\n const filteredItems = props.items.filter((item) => item.toLowerCase().includes(filter.toLowerCase()));\r\n setItems(filteredItems);\r\n };\r\n\r\n useEffect(() => {\r\n setItems(props.items);\r\n }, [props.items]);\r\n\r\n return (\r\n <div className={classes.searchBox} onKeyDown={onKeyDown}>\r\n {props.title ? <div className={classes.title}>{props.title}</div> : null}\r\n <div className={classes.filterContainer}>\r\n <SearchBar onChange={onFilterChange} placeholder=\"Search...\" />\r\n </div>\r\n <div role=\"listbox\" className={classes.list}>\r\n {items.map((item, index) => (\r\n <div\r\n role=\"option\"\r\n key={item}\r\n className={`${classes.listItem} ${index === selectedIndex ? classes.listItemSelected : \"\"}`}\r\n onClick={() => props.onItemSelected(item)}\r\n >\r\n {item}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import { type TextareaOnChangeData, Textarea as FluentTextarea, makeStyles } from \"@fluentui/react-components\";\r\nimport { type FunctionComponent, type KeyboardEvent, type ChangeEvent } from \"react\";\r\nimport { type PrimitiveProps } from \"./primitive\";\r\n\r\nconst useInputStyles = makeStyles({\r\n textarea: {\r\n minHeight: \"100px\",\r\n maxHeight: \"500px\",\r\n },\r\n});\r\n\r\nexport type TextareaProps = PrimitiveProps<string> & {\r\n placeholder?: string;\r\n};\r\n\r\n/**\r\n * This is a texarea box that stops propagation of change/keydown events\r\n * @param props\r\n * @returns\r\n */\r\nexport const Textarea: FunctionComponent<TextareaProps> = (props) => {\r\n Textarea.displayName = \"Textarea\";\r\n\r\n const classes = useInputStyles();\r\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>, _data: TextareaOnChangeData) => {\r\n event.stopPropagation(); // Prevent event propagation\r\n if (props.onChange) {\r\n props.onChange(event.target.value); // Call the original onChange handler passed as prop\r\n }\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\r\n event.stopPropagation(); // Prevent event propagation\r\n };\r\n\r\n return <FluentTextarea {...props} textarea={{ className: classes.textarea }} onChange={handleChange} onKeyDown={handleKeyDown} />;\r\n};\r\n","import { type FunctionComponent, type KeyboardEvent, type ChangeEvent, type FocusEvent, useContext, useEffect, useRef, useState } from \"react\";\r\nimport { type InputOnChangeData, Input as FluentInput, mergeClasses, useId } from \"@fluentui/react-components\";\r\nimport { type PrimitiveProps } from \"./primitive\";\r\nimport { InfoLabel } from \"./infoLabel\";\r\nimport { HandleKeyDown, HandleOnBlur, useInputStyles } from \"./utils\";\r\nimport { ToolContext } from \"../hoc/fluentToolWrapper\";\r\n\r\nexport type TextInputProps = PrimitiveProps<string> & {\r\n validator?: (value: string) => boolean;\r\n validateOnlyOnBlur?: boolean;\r\n};\r\n\r\nexport const TextInput: FunctionComponent<TextInputProps> = (props) => {\r\n TextInput.displayName = \"TextInput\";\r\n const classes = useInputStyles();\r\n const [value, setValue] = useState(props.value);\r\n const lastCommittedValue = useRef(props.value);\r\n const { size } = useContext(ToolContext);\r\n useEffect(() => {\r\n if (props.value !== lastCommittedValue.current) {\r\n setValue(props.value); // Update local state when props.value changes\r\n lastCommittedValue.current = props.value;\r\n }\r\n }, [props.value]);\r\n\r\n const validateValue = (val: string): boolean => {\r\n if (!props.validator) {\r\n return true;\r\n }\r\n return props.validator(val);\r\n };\r\n\r\n const tryCommitValue = (currVal: string) => {\r\n // Only commit if valid and different from last committed value\r\n if (validateValue(currVal) && currVal !== lastCommittedValue.current) {\r\n lastCommittedValue.current = currVal;\r\n props.onChange(currVal);\r\n }\r\n };\r\n\r\n const handleChange = (event: ChangeEvent<HTMLInputElement>, data: InputOnChangeData) => {\r\n event.stopPropagation();\r\n setValue(data.value);\r\n if (!props.validateOnlyOnBlur) {\r\n tryCommitValue(data.value);\r\n }\r\n };\r\n\r\n const handleKeyUp = (event: KeyboardEvent<HTMLInputElement>) => {\r\n event.stopPropagation();\r\n if (!props.validateOnlyOnBlur) {\r\n tryCommitValue(event.currentTarget.value);\r\n }\r\n };\r\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\r\n HandleKeyDown(event);\r\n // When validateOnlyOnBlur is set, also commit on Enter for better UX\r\n if (event.key === \"Enter\" && props.validateOnlyOnBlur) {\r\n tryCommitValue(event.currentTarget.value);\r\n }\r\n };\r\n\r\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\r\n HandleOnBlur(event);\r\n if (props.validateOnlyOnBlur) {\r\n tryCommitValue(event.currentTarget.value);\r\n }\r\n };\r\n\r\n const mergedClassName = mergeClasses(classes.inputFill, !validateValue(value) ? classes.invalid : \"\");\r\n\r\n const id = useId(\"input-button\");\r\n return (\r\n <div className={mergeClasses(classes.container, props.className)}>\r\n {props.infoLabel && <InfoLabel {...props.infoLabel} htmlFor={id} />}\r\n <FluentInput\r\n {...props}\r\n input={{ className: classes.inputSlot }}\r\n id={id}\r\n size={size}\r\n value={value}\r\n onChange={handleChange}\r\n onKeyUp={handleKeyUp}\r\n onKeyDown={handleKeyDown}\r\n onBlur={handleBlur}\r\n className={mergedClassName}\r\n />\r\n </div>\r\n );\r\n};\r\n","import { type FunctionComponent, useRef } from \"react\";\r\nimport { ArrowUploadRegular } from \"@fluentui/react-icons\";\r\nimport { Button, type ButtonProps } from \"./button\";\r\n\r\ntype UploadButtonProps = Omit<ButtonProps, \"onClick\" | \"icon\"> & {\r\n /**\r\n * Callback when files are selected\r\n */\r\n onUpload: (files: FileList) => void;\r\n /**\r\n * File types to accept (e.g., \".jpg, .png, .dds\")\r\n */\r\n accept?: string;\r\n /**\r\n * Text label to display on the button (optional)\r\n */\r\n label?: string;\r\n};\r\n\r\n/**\r\n * A button that triggers a file upload dialog.\r\n * Combines a Button with a hidden file input.\r\n * @param props UploadButtonProps\r\n * @returns UploadButton component\r\n */\r\nexport const UploadButton: FunctionComponent<UploadButtonProps> = (props) => {\r\n const { onUpload, accept, label, ...buttonProps } = props;\r\n UploadButton.displayName = \"UploadButton\";\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const handleClick = () => {\r\n inputRef.current?.click();\r\n };\r\n\r\n const handleChange = (evt: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = evt.target.files;\r\n if (files && files.length) {\r\n onUpload(files);\r\n }\r\n evt.target.value = \"\";\r\n };\r\n\r\n return (\r\n <>\r\n <Button icon={ArrowUploadRegular} title={label ?? \"Upload\"} label={label} onClick={handleClick} {...buttonProps} />\r\n <input ref={inputRef} type=\"file\" accept={accept} style={{ display: \"none\" }} onChange={handleChange} />\r\n </>\r\n );\r\n};\r\n","import { type FunctionComponent } from \"react\";\r\nimport { LineContainer } from \"./propertyLines/propertyLine\";\r\nimport { UploadButton } from \"../primitives/uploadButton\";\r\nimport { type ButtonProps } from \"../primitives/button\";\r\n\r\ntype FileUploadLineProps = Omit<ButtonProps, \"onClick\" | \"label\"> & {\r\n onClick: (files: FileList) => void;\r\n label: string; // Require a label when button is the entire line (by default, label is optional on an UploadButton\r\n accept: string;\r\n};\r\n\r\n/**\r\n * A full-width line with an upload button.\r\n * For just the button without the line wrapper, use UploadButton directly.\r\n * @returns An UploadButton wrapped in a LineContainer\r\n */\r\nexport const FileUploadLine: FunctionComponent<FileUploadLineProps> = ({ onClick, label, accept, ...buttonProps }) => {\r\n FileUploadLine.displayName = \"FileUploadLine\";\r\n\r\n return (\r\n <LineContainer uniqueId={`${label}_upload`} label={label}>\r\n <UploadButton onUpload={onClick} accept={accept} label={label} {...buttonProps} />\r\n </LineContainer>\r\n );\r\n};\r\n","import { Body1Strong, makeStyles, tokens } from \"@fluentui/react-components\";\r\nimport { type FluentIcon } from \"@fluentui/react-icons\";\r\nimport { type FunctionComponent, type PropsWithChildren } from \"react\";\r\n\r\nconst useStyles = makeStyles({\r\n rootDiv: {\r\n flex: 1,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n icon: {\r\n width: tokens.fontSizeBase400,\r\n height: tokens.fontSizeBase400,\r\n verticalAlign: \"middle\",\r\n },\r\n header: {\r\n height: tokens.fontSizeBase400,\r\n fontSize: tokens.fontSizeBase400,\r\n textAlign: \"center\",\r\n verticalAlign: \"middle\",\r\n },\r\n});\r\n\r\nexport type PaneProps = {\r\n title: string;\r\n icon?: FluentIcon;\r\n};\r\nexport const Pane: FunctionComponent<PropsWithChildren<PaneProps>> = (props) => {\r\n const classes = useStyles();\r\n return (\r\n <div className={classes.rootDiv}>\r\n <div className={classes.header}>\r\n {props.icon ? (\r\n <props.icon className={classes.icon} />\r\n ) : (\r\n <img className={classes.icon} id=\"logo\" src=\"https://www.babylonjs.com/Assets/logo-babylonjs-social-twitter.png\" />\r\n )}\r\n <Body1Strong id=\"title\">{props.title}</Body1Strong>\r\n </div>\r\n {props.children}\r\n </div>\r\n );\r\n};\r\n","import { PresenceBadge } from \"@fluentui/react-components\";\r\nimport { type FunctionComponent } from \"react\";\r\nimport { PropertyLine, type PropertyLineProps } from \"./propertyLine\";\r\nimport { type ImmutablePrimitiveProps } from \"../../primitives/primitive\";\r\n/**\r\n * Displays an icon indicating enabled (green check) or disabled (red cross) state\r\n * @param props - The properties for the PropertyLine, including the boolean value to display.\r\n * @returns A PropertyLine component with a PresenceBadge indicating the boolean state.\r\n */\r\nexport const BooleanBadgePropertyLine: FunctionComponent<PropertyLineProps<boolean> & ImmutablePrimitiveProps<boolean>> = (props) => {\r\n BooleanBadgePropertyLine.displayName = \"BooleanBadgePropertyLine\";\r\n // For now assume BooleanBadge is used for readonly properties and disable copy. In future we could enable with a different copy string\r\n return (\r\n <PropertyLine {...props} onCopy={undefined}>\r\n <PresenceBadge status={props.value ? \"available\" : \"do-not-disturb\"} outOfOffice={true} />\r\n </PropertyLine>\r\n );\r\n};\r\n","import { PropertyLine, type PropertyLineProps } from \"./propertyLine\";\r\nimport { type PrimitiveProps } from \"../../primitives/primitive\";\r\nimport { type FunctionComponent } from \"react\";\r\nimport { Checkbox } from \"../../primitives/checkbox\";\r\n\r\n/**\r\n * Wraps a checkbox in a property line\r\n * @param props - PropertyLineProps and CheckboxProps\r\n * @returns property-line wrapped checkbox\r\n */\r\nexport const CheckboxPropertyLine: FunctionComponent<PropertyLineProps<boolean> & PrimitiveProps<boolean>> = (props) => {\r\n CheckboxPropertyLine.displayName = \"CheckboxPropertyLine\";\r\n return (\r\n <PropertyLine {...props}>\r\n <Checkbox {...props} />\r\n </PropertyLine>\r\n );\r\n};\r\n","import { type FunctionComponent } from \"react\";\r\nimport { type PropertyLineProps, PropertyLine } from \"./propertyLine\";\r\nimport { type ComboBoxProps, ComboBox } from \"../../primitives/comboBox\";\r\n\r\ntype ComboBoxPropertyLineProps = ComboBoxProps & PropertyLineProps<string>;\r\n\r\n/**\r\n * A property line with a filterable ComboBox\r\n * @param props - ComboBoxProps & PropertyLineProps\r\n * @returns property-line wrapped ComboBox component\r\n */\r\nexport const ComboBoxPropertyLine: FunctionComponent<ComboBoxPropertyLineProps> = (props) => {\r\n ComboBoxPropertyLine.displayName = \"ComboBoxPropertyLine\";\r\n\r\n return (\r\n <PropertyLine {...props}>\r\n <ComboBox {...props} />\r\n </PropertyLine>\r\n );\r\n};\r\n","import { PropertyLine } from \"./propertyLine\";\r\nimport { useEffect, useState, type FunctionComponent } from \"react\";\r\nimport { type NumberInputPropertyLineProps } from \"./inputPropertyLine\";\r\nimport { TextInput } from \"../../primitives/textInput\";\r\n\r\nexport type HexPropertyLineProps = NumberInputPropertyLineProps & {\r\n numBits?: 32 | 24 | 16 | 8;\r\n};\r\n\r\nconst MaskValidatorFn = (valueString: string) => {\r\n if (valueString.substring(0, 2) != \"0x\") {\r\n if (valueString.substring(0, 1) != \"0\") {\r\n valueString = \"0x\" + valueString;\r\n } else {\r\n valueString = \"0x\" + valueString.substring(1);\r\n }\r\n }\r\n\r\n const valueSubstr = valueString.substring(2);\r\n if (valueSubstr != \"\" && /^[0-9A-Fa-f]+$/g.test(valueSubstr) == false) {\r\n return false;\r\n }\r\n\r\n if (valueString.length > 10) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst GetHexValFromNumber = (val: number, numBits?: number): string => {\r\n const numDigits = (numBits ?? 32) >> 2;\r\n let valueAsHex = val.toString(16);\r\n let hex0String = \"\";\r\n for (let i = 0; i < numDigits - valueAsHex.length; i++) {\r\n // padding the '0's\r\n hex0String = \"0\" + hex0String;\r\n }\r\n const finalHexValue = hex0String + valueAsHex;\r\n valueAsHex = \"0x\" + finalHexValue.substring(finalHexValue.length - numDigits);\r\n return valueAsHex;\r\n};\r\n\r\n/**\r\n * Takes a number representing a Hex value and converts it to a hex string then wraps the TextInput in a PropertyLine\r\n * @param props - PropertyLineProps\r\n * @returns property-line wrapped textbox that converts to/from hex number representation\r\n */\r\nexport const HexPropertyLine: FunctionComponent<HexPropertyLineProps> = (props) => {\r\n HexPropertyLine.displayName = \"HexPropertyLine\";\r\n const [hexVal, setHexVal] = useState(GetHexValFromNumber(props.value, props.numBits));\r\n\r\n const onStrValChange = (val: string) => {\r\n const numBits = props.numBits ?? 32;\r\n setHexVal(val);\r\n props.onChange(parseInt(val) & (2 ** numBits - 1));\r\n };\r\n\r\n useEffect(() => {\r\n setHexVal(GetHexValFromNumber(props.value, props.numBits));\r\n }, []);\r\n\r\n return (\r\n <PropertyLine {...props}>\r\n <TextInput {...props} validator={MaskValidatorFn} value={hexVal} onChange={onStrValChange} validateOnlyOnBlur={true} />\r\n </PropertyLine>\r\n );\r\n};\r\n","import { PropertyLine, type PropertyLineProps } from \"./propertyLine\";\r\nimport { type FunctionComponent } from \"react\";\r\nimport { type TextInputProps, TextInput } from \"../../primitives/textInput\";\r\nimport { type SpinButtonProps, SpinButton } from \"../../primitives/spinButton\";\r\nimport { makeStyles, mergeClasses } from \"@fluentui/react-components\";\r\nimport { UniformWidthStyling } from \"../../primitives/utils\";\r\n\r\nconst useStyles = makeStyles({\r\n uniformWidth: {\r\n ...UniformWidthStyling,\r\n },\r\n});\r\n\r\n/**\r\n * Wraps a text input in a property line\r\n * @param props - PropertyLineProps and InputProps\r\n * @returns property-line wrapped input component\r\n */\r\nexport const TextInputPropertyLine: FunctionComponent<TextInputProps & PropertyLineProps<string>> = (props) => {\r\n TextInputPropertyLine.displayName = \"TextInputPropertyLine\";\r\n const classes = useStyles();\r\n return (\r\n <PropertyLine {...props}>\r\n <TextInput {...props} className={mergeClasses(classes.uniformWidth, props.className)} />\r\n </PropertyLine>\r\n );\r\n};\r\n\r\nexport type NumberInputPropertyLineProps = SpinButtonProps & PropertyLineProps<number>;\r\n/**\r\n * Wraps a number input in a property line\r\n * To force integer values, use forceInt param (this is distinct from the 'step' param, which will still allow submitting an integer value. forceInt will not)\r\n * @param props - PropertyLineProps and InputProps\r\n * @returns property-line wrapped input component\r\n */\r\nexport const NumberInputPropertyLine: FunctionComponent<NumberInputPropertyLineProps> = (props) => {\r\n NumberInputPropertyLine.displayName = \"NumberInputPropertyLine\";\r\n const classes = useStyles();\r\n return (\r\n <PropertyLine {...props}>\r\n <SpinButton {...props} className={mergeClasses(classes.uniformWidth, props.className)} />\r\n </PropertyLine>\r\n );\r\n};\r\n","import { PropertyLine, type PropertyLineProps } from \"./propertyLine\";\r\nimport { Link, type LinkProps } from \"../../primitives/link\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\n/**\r\n * Wraps a link in a property line\r\n * @param props - PropertyLineProps and LinkProps\r\n * @returns property-line wrapped link\r\n */\r\nexport const LinkPropertyLine: FunctionComponent<PropertyLineProps<string> & LinkProps> = (props) => {\r\n LinkPropertyLine.displayName = \"LinkPropertyLine\";\r\n return (\r\n <PropertyLine {...props}>\r\n <Link {...props} />\r\n </PropertyLine>\r\n );\r\n};\r\n","import { PropertyLine, type PropertyLineProps } from \"./propertyLine\";\r\nimport { type FunctionComponent } from \"react\";\r\nimport { SpinButton, type SpinButtonProps } from \"../../primitives/spinButton\";\r\nimport { makeStyles, mergeClasses } from \"@fluentui/react-components\";\r\nimport { UniformWidthStyling } from \"../../primitives/utils\";\r\n\r\nconst useStyles = makeStyles({\r\n uniformWidth: {\r\n ...UniformWidthStyling,\r\n },\r\n});\r\n\r\nexport const SpinButtonPropertyLine: FunctionComponent<PropertyLineProps<number> & SpinButtonProps> = (props) => {\r\n SpinButtonPropertyLine.displayName = \"SpinButtonPropertyLine\";\r\n const classes = useStyles();\r\n return (\r\n <PropertyLine {...props}>\r\n <SpinButton {...props} className={mergeClasses(classes.uniformWidth, props.className)} />\r\n </PropertyLine>\r\n );\r\n};\r\n","import { type ImmutablePrimitiveProps } from \"../../primitives/primitive\";\r\nimport { type PropertyLineProps, PropertyLine } from \"./propertyLine\";\r\nimport { type FunctionComponent } from \"react\";\r\nimport { Body1 } from \"@fluentui/react-components\";\r\n\r\ntype StringifiedPropertyLineProps = PropertyLineProps<number> &\r\n ImmutablePrimitiveProps<number> & {\r\n precision?: number;\r\n units?: string;\r\n };\r\n\r\n/**\r\n * Expects a numerical value and converts it toFixed(if precision is supplied) or toLocaleString\r\n * Can pass optional units to be appending to the end of the string\r\n * @param props\r\n * @returns\r\n */\r\nexport const StringifiedPropertyLine: FunctionComponent<StringifiedPropertyLineProps> = (props) => {\r\n StringifiedPropertyLine.displayName = \"StringifiedPropertyLine\";\r\n const value = props.precision !== undefined ? props.value?.toFixed(props.precision) : props.value?.toLocaleString();\r\n const withUnits = props.units ? `${value} ${props.units}` : value;\r\n return (\r\n <PropertyLine {...props}>\r\n <Body1 title={props.title}>{withUnits ?? \"\"}</Body1>\r\n </PropertyLine>\r\n );\r\n};\r\n","import { PropertyLine, type PropertyLineProps } from \"./propertyLine\";\r\nimport { type FunctionComponent } from \"react\";\r\nimport { Textarea, type TextareaProps } from \"../../primitives/textarea\";\r\n/**\r\n * Wraps textarea in a property line\r\n * @param props - PropertyLineProps and TextProps\r\n * @returns property-line wrapped text\r\n */\r\nexport const TextAreaPropertyLine: FunctionComponent<PropertyLineProps<string> & TextareaProps> = (props) => {\r\n TextAreaPropertyLine.displayName = \"TextAreaPropertyLine\";\r\n return (\r\n <PropertyLine {...props}>\r\n <Textarea {...props} />\r\n </PropertyLine>\r\n );\r\n};\r\n","import { Body1 } from \"@fluentui/react-components\";\r\nimport { PropertyLine, type PropertyLineProps } from \"./propertyLine\";\r\nimport { type ImmutablePrimitiveProps } from \"../../primitives/primitive\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\n/**\r\n * Wraps text in a property line\r\n * @param props - PropertyLineProps and TextProps\r\n * @returns property-line wrapped text\r\n */\r\nexport const TextPropertyLine: FunctionComponent<PropertyLineProps<string> & ImmutablePrimitiveProps<string>> = (props) => {\r\n TextPropertyLine.displayName = \"TextPropertyLine\";\r\n const { value, title } = props;\r\n return (\r\n <PropertyLine {...props}>\r\n <Body1 title={title}>{value ?? \"\"}</Body1>\r\n </PropertyLine>\r\n );\r\n};\r\n","import { type ServiceDefinition } from \"../modularity/serviceDefinition\";\r\nimport { type ISettingsService, SettingsServiceIdentity } from \"./settingsService\";\r\n\r\nimport { ButtonLine } from \"shared-ui-components/fluent/hoc/buttonLine\";\r\nimport { useSetting } from \"../hooks/settingsHooks\";\r\nimport {\r\n SidePaneDockOverridesSettingDescriptor,\r\n LeftSidePaneWidthAdjustSettingDescriptor,\r\n LeftSidePaneHeightAdjustSettingDescriptor,\r\n RightSidePaneHeightAdjustSettingDescriptor,\r\n RightSidePaneWidthAdjustSettingDescriptor,\r\n} from \"./shellService\";\r\n\r\nexport const ShellSettingsServiceDefinition: ServiceDefinition<[], [ISettingsService]> = {\r\n friendlyName: \"Shell Settings Service\",\r\n consumes: [SettingsServiceIdentity],\r\n factory: (settingsService) => {\r\n const settingRegistration = settingsService.addSectionContent({\r\n key: \"Shell Settings\",\r\n section: \"UI\",\r\n component: () => {\r\n const [, , resetSidePaneDockOverrides] = useSetting(SidePaneDockOverridesSettingDescriptor);\r\n const [, , resetLeftPaneWidthAdjust] = useSetting(LeftSidePaneWidthAdjustSettingDescriptor);\r\n const [, , resetLeftPaneHeightAdjust] = useSetting(LeftSidePaneHeightAdjustSettingDescriptor);\r\n const [, , resetRightPaneWidthAdjust] = useSetting(RightSidePaneWidthAdjustSettingDescriptor);\r\n const [, , resetRightPaneHeightAdjust] = useSetting(RightSidePaneHeightAdjustSettingDescriptor);\r\n return (\r\n <ButtonLine\r\n label=\"Reset Layout\"\r\n onClick={() => {\r\n resetSidePaneDockOverrides();\r\n resetLeftPaneWidthAdjust();\r\n resetLeftPaneHeightAdjust();\r\n resetRightPaneWidthAdjust();\r\n resetRightPaneHeightAdjust();\r\n }}\r\n />\r\n );\r\n },\r\n });\r\n\r\n return {\r\n dispose: () => {\r\n settingRegistration.dispose();\r\n },\r\n };\r\n },\r\n};\r\n","import { useEffect, useRef } from \"react\";\n\nimport { AsyncLock } from \"core/Misc/asyncLock\";\nimport { Logger } from \"core/Misc/logger\";\nimport { Observable } from \"core/Misc/observable\";\nimport { type WeaklyTypedServiceDefinition, type ServiceContainer } from \"shared-ui-components/modularTool/modularity/serviceContainer\";\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\nimport { MakeModularTool, type ModularToolOptions } from \"shared-ui-components/modularTool/modularTool\";\nimport { type IShellService, ShellServiceIdentity } from \"shared-ui-components/modularTool/services/shellService\";\n\nimport { type InspectorOptions, type InspectorToken } from \"./inspector.common\";\n\ntype DisposeAction = () => void | Promise<void>;\n\ntype InspectorProductConfiguration = {\n serviceDefinitions: readonly WeaklyTypedServiceDefinition[];\n parentContainer?: ServiceContainer;\n extensionFeeds?: ModularToolOptions[\"extensionFeeds\"];\n dispose?: DisposeAction;\n};\n\ntype InspectorHostConfiguration = {\n renderingCanvas: HTMLCanvasElement | null;\n resize: () => void;\n startAutoResize?: () => DisposeAction;\n initialize: (options: Readonly<Partial<InspectorOptions>>) => InspectorProductConfiguration;\n registerTargetDisposed?: (disposeInspector: () => void) => DisposeAction;\n};\n\nconst InspectorTokens = new WeakMap<object, InspectorToken>();\nconst InspectorLock = new AsyncLock();\n\n/**\n * Hosts a product-specific Inspector configuration using the shared Inspector lifecycle and layout.\n * @param target The object associated with this Inspector instance.\n * @param options Inspector hosting and modular tool options.\n * @param configuration Product-specific services and engine lifecycle behavior.\n * @returns A token that can be disposed to hide Inspector.\n */\nexport function _ShowInspector(target: object, options: Partial<InspectorOptions>, configuration: InspectorHostConfiguration): InspectorToken {\n void InspectorTokens.get(target)?.dispose();\n\n let disposeAsync = async () => {\n if (InspectorTokens.get(target) === inspectorToken) {\n InspectorTokens.delete(target);\n }\n };\n let isDisposed = false;\n const onDisposed = new Observable<void>();\n const inspectorToken = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n async dispose(): Promise<void> {\n await InspectorLock.lockAsync(async () => {\n if (isDisposed) {\n return;\n }\n\n await disposeAsync();\n isDisposed = true;\n onDisposed.notifyObservers();\n onDisposed.clear();\n });\n },\n get isDisposed() {\n return isDisposed;\n },\n get onDisposed() {\n return onDisposed;\n },\n } as const satisfies InspectorToken;\n\n InspectorTokens.set(target, inspectorToken);\n\n options = {\n autoResizeEngine: true,\n layoutMode: \"overlay\",\n ...options,\n };\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n InspectorLock.lockAsync(() => {\n const { renderingCanvas } = configuration;\n let parentElement = options.containerElement ?? null;\n\n if (!parentElement) {\n parentElement = renderingCanvas;\n while (parentElement) {\n const rootNode = parentElement.getRootNode();\n if (rootNode instanceof ShadowRoot) {\n parentElement = rootNode.host.parentElement;\n } else {\n break;\n }\n }\n\n if (renderingCanvas && parentElement === renderingCanvas) {\n parentElement = renderingCanvas.parentElement;\n }\n\n parentElement ??= document.body;\n }\n\n if (!parentElement) {\n Logger.Warn(\"Unable to find a parent element to host Inspector.\");\n return;\n }\n\n const disposeActions: DisposeAction[] = [];\n let disposed = false;\n disposeAsync = async () => {\n if (disposed) {\n return;\n }\n disposed = true;\n\n for (const disposeAction of disposeActions.reverse()) {\n const result = disposeAction();\n if (result) {\n // eslint-disable-next-line no-await-in-loop\n await result;\n }\n }\n };\n\n disposeActions.push(() => {\n if (options.autoResizeEngine) {\n configuration.resize();\n }\n });\n\n const productConfiguration = configuration.initialize(options);\n if (productConfiguration.dispose) {\n disposeActions.push(productConfiguration.dispose);\n }\n\n const serviceDefinitions: WeaklyTypedServiceDefinition[] = [];\n const containerElement = document.createElement(\"div\");\n containerElement.id = \"babylon-inspector-container\";\n containerElement.style.position = \"absolute\";\n containerElement.style.inset = \"0\";\n containerElement.style.display = \"flex\";\n containerElement.style.pointerEvents = \"none\";\n\n if (options.layoutMode === \"inline\") {\n const canvasContainerDisplay = parentElement.style.display;\n const canvasContainerChildren = [...parentElement.childNodes];\n parentElement.replaceChildren();\n\n disposeActions.push(() => {\n parentElement.replaceChildren(...canvasContainerChildren);\n });\n\n const canvasInjectorServiceDefinition: ServiceDefinition<[], [IShellService]> = {\n friendlyName: \"Canvas Injector\",\n consumes: [ShellServiceIdentity],\n factory: (shellService) => {\n const registration = shellService.addCentralContent({\n key: \"Canvas Injector\",\n component: () => {\n const canvasContainerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n canvasContainerRef.current?.replaceChildren(...canvasContainerChildren);\n }, []);\n\n return <div ref={canvasContainerRef} style={{ display: canvasContainerDisplay, position: \"absolute\", inset: \"0\" }} />;\n },\n });\n\n return {\n dispose: () => registration.dispose(),\n };\n },\n };\n\n serviceDefinitions.push(canvasInjectorServiceDefinition);\n }\n\n parentElement.appendChild(containerElement);\n disposeActions.push(() => {\n parentElement.removeChild(containerElement);\n });\n\n if (options.autoResizeEngine && configuration.startAutoResize) {\n disposeActions.push(configuration.startAutoResize());\n }\n\n const modularTool = MakeModularTool({\n namespace: \"Inspector\",\n containerElement,\n parentContainer: productConfiguration.parentContainer,\n serviceDefinitions: [...serviceDefinitions, ...productConfiguration.serviceDefinitions, ...(options.serviceDefinitions ?? [])],\n themeMode: options.themeMode,\n showThemeSelector: options.showThemeSelector,\n extensionFeeds: productConfiguration.extensionFeeds,\n toolbarMode: \"compact\",\n sidePaneRemapper: options.sidePaneRemapper,\n leftPaneDefaultCollapsed: options.leftPaneDefaultCollapsed,\n rightPaneDefaultCollapsed: options.rightPaneDefaultCollapsed,\n disableTeachingMoments: options.disableTeachingMoments,\n });\n disposeActions.push(async () => await modularTool.dispose());\n\n if (configuration.registerTargetDisposed) {\n disposeActions.push(\n configuration.registerTargetDisposed(() => {\n void inspectorToken.dispose();\n })\n );\n }\n\n disposeActions.push(() => {\n if (InspectorTokens.get(target) === inspectorToken) {\n InspectorTokens.delete(target);\n }\n });\n });\n\n return inspectorToken;\n}\n","import { type EngineContext } from \"@babylonjs/lite\";\r\n\r\nimport { type IService } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\n/**\r\n * The unique identity symbol for the Babylon Lite engine context service.\r\n */\r\nexport const EngineContextIdentity = Symbol(\"EngineContext\");\r\n\r\n/**\r\n * EngineContext provides the Babylon Lite engine being inspected. It is the Babylon Lite counterpart of\r\n * `ISceneContext` (which provides the current `Scene` to Babylon.js Inspector services), and it is the\r\n * shared dependency for all Babylon Lite specific Inspector services.\r\n *\r\n * The engine is fixed for the lifetime of the Inspector session (a new Inspector is created for each\r\n * engine), so unlike `ISceneContext` there is no change observable.\r\n */\r\nexport interface IEngineContext extends IService<typeof EngineContextIdentity> {\r\n /**\r\n * Gets the Babylon Lite engine being inspected.\r\n */\r\n readonly engine: EngineContext;\r\n}\r\n","import { type ComponentType } from \"react\";\r\n\r\nimport { type IDisposable, type IReadonlyObservable } from \"core/index\";\r\n\r\nimport { UniqueIdGenerator } from \"core/Misc/uniqueIdGenerator\";\r\n\r\n/**\r\n * The value used to uniquely identify a node within the Explorer tree (e.g. for expansion state).\r\n * This matches the Fluent `TreeItemValue` type.\r\n * @experimental\r\n */\r\nexport type ExplorerNodeValue = string | number;\r\n\r\n/**\r\n * Information about how to display a node in the Explorer tree.\r\n * @experimental\r\n */\r\nexport type ExplorerDisplayInfo = Partial<IDisposable> &\r\n Readonly<{\r\n /**\r\n * The name of the node to display in the Explorer tree.\r\n */\r\n name: string;\r\n\r\n /**\r\n * An observable that notifies when the display info (such as the name) changes.\r\n */\r\n onChange?: IReadonlyObservable<void>;\r\n\r\n /**\r\n * An optional validation error message for this node. When present, the node's\r\n * icon is replaced with a warning icon whose tooltip displays this message.\r\n */\r\n validationError?: string;\r\n }>;\r\n\r\n/**\r\n * Configuration for drag-and-drop behavior within a branch of the Explorer tree.\r\n * The configuration applies to the node it is specified on as well as all of its descendants.\r\n * @experimental\r\n */\r\nexport type ExplorerDragDropConfig<T> = Readonly<{\r\n /**\r\n * Determines whether an entity can be dragged.\r\n * @param entity The entity to check.\r\n * @returns True if the entity can be dragged, false otherwise.\r\n */\r\n canDrag: (entity: T) => boolean;\r\n\r\n /**\r\n * Determines whether an entity can be dropped onto a target.\r\n * @param draggedEntity The entity being dragged.\r\n * @param targetEntity The potential drop target entity, or null if dropping onto the branch root.\r\n * @returns True if the drop is allowed, false otherwise.\r\n */\r\n canDrop: (draggedEntity: T, targetEntity: T | null) => boolean;\r\n\r\n /**\r\n * Called when a drag-and-drop operation completes.\r\n * @param draggedEntity The entity that was dragged.\r\n * @param targetEntity The entity it was dropped onto, or null if dropped onto the branch root.\r\n */\r\n onDrop: (draggedEntity: T, targetEntity: T | null) => void;\r\n}>;\r\n\r\ntype InlineCommand = {\r\n /**\r\n * An icon component to render for the command. Required for inline commands.\r\n */\r\n icon: ComponentType;\r\n\r\n /**\r\n * The mode of the command. Inline commands are shown directly in the tree item layout. Inline by default.\r\n */\r\n mode?: \"inline\";\r\n};\r\n\r\ntype ContextMenuCommand = {\r\n /**\r\n * An icon component to render for the command. Optional for context menu commands.\r\n */\r\n icon?: ComponentType;\r\n\r\n /**\r\n * The mode of the command. Context menu commands are shown in the context menu for the tree item.\r\n */\r\n mode: \"contextMenu\";\r\n};\r\n\r\n/**\r\n * The supported command modes (inline or context menu).\r\n * @experimental\r\n */\r\nexport type ExplorerCommandMode = NonNullable<(InlineCommand | ContextMenuCommand)[\"mode\"]>;\r\n\r\ntype ActionCommand = {\r\n readonly type: \"action\";\r\n\r\n /**\r\n * The function that executes the command.\r\n */\r\n execute(): unknown | Promise<unknown>;\r\n};\r\n\r\ntype ToggleCommand = {\r\n readonly type: \"toggle\";\r\n\r\n /**\r\n * A boolean indicating if the command is enabled.\r\n */\r\n isEnabled: boolean;\r\n};\r\n\r\n/**\r\n * The supported command types (action or toggle).\r\n * @experimental\r\n */\r\nexport type ExplorerCommandType = (ActionCommand | ToggleCommand)[\"type\"];\r\n\r\n/**\r\n * Describes a command that can be executed on a node in the Explorer.\r\n * @experimental\r\n */\r\nexport type ExplorerCommand<ModeT extends ExplorerCommandMode = ExplorerCommandMode, TypeT extends ExplorerCommandType = ExplorerCommandType> = Partial<IDisposable> &\r\n Readonly<{\r\n /**\r\n * The display name of the command (e.g. \"Delete\", \"Rename\", etc.).\r\n */\r\n displayName: string;\r\n\r\n /**\r\n * An optional array of hotkeys that trigger the command.\r\n */\r\n hotKey?: {\r\n keyCode: string;\r\n control?: boolean;\r\n alt?: boolean;\r\n shift?: boolean;\r\n meta?: boolean;\r\n };\r\n\r\n /**\r\n * An observable that notifies when the command state changes.\r\n */\r\n onChange?: IReadonlyObservable<unknown>;\r\n }> &\r\n (ModeT extends \"inline\" ? InlineCommand : ContextMenuCommand) &\r\n (TypeT extends \"action\" ? ActionCommand : ToggleCommand);\r\n\r\n/**\r\n * Provides a command for a specific context (an entity or a group name) in the Explorer.\r\n * @experimental\r\n */\r\nexport type ExplorerCommandProvider<ContextT, ModeT extends ExplorerCommandMode = ExplorerCommandMode, TypeT extends ExplorerCommandType = ExplorerCommandType> = Readonly<{\r\n /**\r\n * An optional order for the command, relative to other commands.\r\n * Defaults to 0.\r\n */\r\n order?: number;\r\n\r\n /**\r\n * A predicate function that determines if the command is applicable to the given context.\r\n */\r\n predicate: (context: unknown) => context is ContextT;\r\n\r\n /**\r\n * Gets the command information for the given context.\r\n */\r\n getCommand: (context: ContextT) => ExplorerCommand<ModeT, TypeT>;\r\n}>;\r\n\r\n/**\r\n * The visual treatment used for a node in the Explorer tree.\r\n * - \"root\": The single top level node representing the object being inspected (e.g. a Scene or an Engine).\r\n * - \"group\": A heading style node (e.g. \"Nodes\", \"Materials\", \"Auxiliary Surfaces\").\r\n * - \"item\": A standard node representing an entity within the tree (e.g. a mesh or a material).\r\n * @experimental\r\n */\r\nexport type ExplorerNodeKind = \"root\" | \"group\" | \"item\";\r\n\r\n/**\r\n * Describes a single node of the Explorer tree.\r\n *\r\n * This is the generic (product agnostic) model the Explorer renders. Each node describes its own\r\n * presentation and enumerates its own children, which means an Explorer hierarchy can be arbitrarily\r\n * deep and fully heterogeneous (nodes of different kinds, backed by unrelated entity types, can be\r\n * freely nested within each other).\r\n * @experimental\r\n */\r\nexport type ExplorerNodeDescription = Readonly<{\r\n /**\r\n * An identifier for the node that is stable across rebuilds and unique among its siblings.\r\n */\r\n id: string;\r\n\r\n /**\r\n * The visual treatment used for this node. Defaults to \"item\".\r\n */\r\n kind?: ExplorerNodeKind;\r\n\r\n /**\r\n * The entity represented by this node, if any.\r\n * Nodes with an entity are selectable and are always displayed.\r\n * Nodes without an entity are purely structural, are not selectable, and are only displayed when they have visible children.\r\n */\r\n entity?: object;\r\n\r\n /**\r\n * Gets the display information for this node.\r\n * This is ideally \"live\" display info (e.g. updates to the display info are taken into account and communicated via the observable).\r\n * This means in many cases the display info will need to be disposed when it is no longer needed so observable registrations can be removed.\r\n */\r\n getDisplayInfo: () => ExplorerDisplayInfo;\r\n\r\n /**\r\n * An optional icon component to render for the node.\r\n */\r\n icon?: ComponentType<{ entity: object }>;\r\n\r\n /**\r\n * Enumerates the children of this node. Children may be of any kind and may describe entirely different entity types.\r\n */\r\n getChildren?: () => readonly ExplorerNodeDescription[];\r\n\r\n /**\r\n * Optional configuration for drag-and-drop behavior within this node.\r\n * Descendants inherit this configuration unless they specify their own.\r\n * If not provided (and not inherited), drag-and-drop is disabled for the node.\r\n */\r\n dragDropConfig?: ExplorerDragDropConfig<object>;\r\n\r\n /**\r\n * A function that returns observables that notify when descendants of this node are added.\r\n */\r\n getAddedObservables?: () => readonly IReadonlyObservable<unknown>[];\r\n\r\n /**\r\n * A function that returns observables that notify when descendants of this node are removed.\r\n */\r\n getRemovedObservables?: () => readonly IReadonlyObservable<object>[];\r\n\r\n /**\r\n * A function that returns observables that notify when descendants of this node are moved (e.g. re-parented).\r\n */\r\n getMovedObservables?: () => readonly IReadonlyObservable<unknown>[];\r\n}>;\r\n\r\n/**\r\n * A materialized node of the Explorer tree, produced by {@link BuildExplorerTree}.\r\n */\r\nexport type ExplorerNode = {\r\n /**\r\n * The visual treatment used for this node.\r\n */\r\n readonly kind: ExplorerNodeKind;\r\n\r\n /**\r\n * The value that uniquely identifies this node within the tree (e.g. for expansion state).\r\n */\r\n readonly value: ExplorerNodeValue;\r\n\r\n /**\r\n * The one based depth of this node within the tree (used for indentation and accessibility).\r\n */\r\n readonly depth: number;\r\n\r\n /**\r\n * The parent of this node, or undefined for top level nodes.\r\n */\r\n readonly parent?: ExplorerNode;\r\n\r\n /**\r\n * The visible children of this node.\r\n */\r\n readonly children: ExplorerNode[];\r\n\r\n /**\r\n * The entity represented by this node, or undefined if this node is purely structural.\r\n */\r\n readonly entity?: object;\r\n\r\n /**\r\n * An optional icon component to render for the node.\r\n */\r\n readonly icon?: ComponentType<{ entity: object }>;\r\n\r\n /**\r\n * Gets the (possibly live) display info for this node.\r\n */\r\n readonly getDisplayInfo: () => ExplorerDisplayInfo;\r\n\r\n /**\r\n * The drag-and-drop configuration that applies to this node (either its own or inherited from an ancestor).\r\n */\r\n readonly dragDropConfig?: ExplorerDragDropConfig<object>;\r\n};\r\n\r\n/**\r\n * The result of materializing a set of {@link ExplorerNodeDescription}s into a tree.\r\n */\r\nexport type ExplorerTree = {\r\n /**\r\n * The visible top level nodes, in the order they were described.\r\n */\r\n readonly nodes: readonly ExplorerNode[];\r\n\r\n /**\r\n * All visible nodes, keyed by their tree value.\r\n */\r\n readonly nodesByValue: ReadonlyMap<ExplorerNodeValue, ExplorerNode>;\r\n\r\n /**\r\n * All visible nodes that represent an entity, keyed by that entity. An entity can occur in\r\n * multiple branches, so each value contains every occurrence in tree order.\r\n */\r\n readonly nodesByEntity: ReadonlyMap<object, readonly ExplorerNode[]>;\r\n\r\n /**\r\n * The observables (gathered from every described node, including nodes that are not currently visible)\r\n * that notify when the topology of the tree changes.\r\n */\r\n readonly changeObservables: {\r\n readonly added: readonly IReadonlyObservable<unknown>[];\r\n readonly removed: readonly IReadonlyObservable<object>[];\r\n readonly moved: readonly IReadonlyObservable<unknown>[];\r\n };\r\n};\r\n\r\ntype MaterializedExplorerNode = Omit<ExplorerNode, \"value\" | \"children\"> & {\r\n value: ExplorerNodeValue;\r\n children: MaterializedExplorerNode[];\r\n};\r\n\r\nconst SyntheticEntityIds = new WeakMap<object, number>();\r\n\r\n/**\r\n * Gets a stable identifier for an entity. If the entity has a numeric `uniqueId` property it is used,\r\n * otherwise a synthetic id is generated and cached for the lifetime of the entity.\r\n * @param entity The entity to get an identifier for.\r\n * @returns A stable numeric identifier for the entity.\r\n */\r\nexport function GetEntityId(entity: object): number {\r\n if (\"uniqueId\" in entity && typeof entity.uniqueId === \"number\") {\r\n return entity.uniqueId;\r\n }\r\n\r\n let id = SyntheticEntityIds.get(entity);\r\n if (!id) {\r\n SyntheticEntityIds.set(entity, (id = UniqueIdGenerator.UniqueId));\r\n }\r\n return id;\r\n}\r\n\r\n/**\r\n * Determines whether a node should be displayed in the Explorer tree.\r\n * Nodes that represent an entity are always displayed (they are selectable and meaningful on their own),\r\n * while purely structural nodes are only displayed when they have at least one visible child.\r\n * @param node A node with an optional entity and a set of already filtered (visible) children.\r\n * @returns True if the node should be displayed, false otherwise.\r\n */\r\nexport function ShouldDisplayNode(node: { readonly entity?: object; readonly children: readonly unknown[] }): boolean {\r\n return node.entity !== undefined || node.children.length > 0;\r\n}\r\n\r\n/**\r\n * Gets the children of a node in display order. The declared order is preserved unless alphabetical\r\n * sorting is enabled, in which case item nodes are sorted without moving structural nodes.\r\n * @param node The node whose children should be ordered.\r\n * @param sortItems Whether item nodes should be sorted alphabetically by display name.\r\n * @returns The ordered children of the node.\r\n */\r\nexport function GetOrderedChildren(node: ExplorerNode, sortItems: boolean): readonly ExplorerNode[] {\r\n if (!sortItems) {\r\n return node.children;\r\n }\r\n\r\n const sortedItems = node.children.filter((child) => child.kind === \"item\");\r\n if (sortedItems.length < 2) {\r\n return node.children;\r\n }\r\n\r\n sortedItems.sort((left, right) => {\r\n const leftDisplayInfo = left.getDisplayInfo();\r\n const rightDisplayInfo = right.getDisplayInfo();\r\n const comparison = leftDisplayInfo.name.localeCompare(rightDisplayInfo.name);\r\n leftDisplayInfo.dispose?.();\r\n rightDisplayInfo.dispose?.();\r\n return comparison;\r\n });\r\n\r\n let itemIndex = 0;\r\n return node.children.map((child) => (child.kind === \"item\" ? sortedItems[itemIndex++] : child));\r\n}\r\n\r\n/**\r\n * Materializes a set of node descriptions into an Explorer tree.\r\n *\r\n * Nodes are visited recursively so that arbitrarily nested, heterogeneous hierarchies are supported.\r\n * Structural nodes (nodes without an entity) that end up with no visible children are omitted from the\r\n * resulting tree, but their change observables are still gathered so the tree can be rebuilt when they\r\n * gain children.\r\n * @param descriptions The top level node descriptions.\r\n * @returns The materialized tree, along with lookup maps and the gathered change observables.\r\n */\r\nexport function BuildExplorerTree(descriptions: readonly ExplorerNodeDescription[]): ExplorerTree {\r\n const nodes: MaterializedExplorerNode[] = [];\r\n const nodesByValue = new Map<ExplorerNodeValue, MaterializedExplorerNode>();\r\n const nodesByEntity = new Map<object, MaterializedExplorerNode[]>();\r\n const nodePaths = new Map<MaterializedExplorerNode, string>();\r\n const added: IReadonlyObservable<unknown>[] = [];\r\n const removed: IReadonlyObservable<object>[] = [];\r\n const moved: IReadonlyObservable<unknown>[] = [];\r\n\r\n const buildNode = (description: ExplorerNodeDescription, parent: MaterializedExplorerNode | undefined, parentPath: string): MaterializedExplorerNode | undefined => {\r\n // Change observables are gathered even for nodes that end up hidden so that a hidden node\r\n // (e.g. an empty section) can become visible as soon as it gains a child.\r\n added.push(...(description.getAddedObservables?.() ?? []));\r\n removed.push(...(description.getRemovedObservables?.() ?? []));\r\n moved.push(...(description.getMovedObservables?.() ?? []));\r\n\r\n const path = parentPath ? `${parentPath}/${description.id}` : description.id;\r\n const node: MaterializedExplorerNode = {\r\n kind: description.kind ?? \"item\",\r\n // Values for entity-backed nodes are finalized after all occurrences have been counted.\r\n value: path,\r\n depth: (parent?.depth ?? 0) + 1,\r\n parent,\r\n children: [],\r\n entity: description.entity,\r\n icon: description.icon,\r\n getDisplayInfo: description.getDisplayInfo,\r\n dragDropConfig: description.dragDropConfig ?? parent?.dragDropConfig,\r\n };\r\n\r\n for (const childDescription of description.getChildren?.() ?? []) {\r\n const child = buildNode(childDescription, node, path);\r\n if (child) {\r\n node.children.push(child);\r\n }\r\n }\r\n\r\n if (!ShouldDisplayNode(node)) {\r\n return undefined;\r\n }\r\n\r\n nodePaths.set(node, path);\r\n if (node.entity) {\r\n const entityNodes = nodesByEntity.get(node.entity);\r\n if (entityNodes) {\r\n entityNodes.push(node);\r\n } else {\r\n nodesByEntity.set(node.entity, [node]);\r\n }\r\n }\r\n\r\n return node;\r\n };\r\n\r\n for (const description of descriptions) {\r\n const node = buildNode(description, undefined, \"\");\r\n if (node) {\r\n nodes.push(node);\r\n }\r\n }\r\n\r\n const registerNode = (node: MaterializedExplorerNode) => {\r\n const path = nodePaths.get(node)!;\r\n const entityNodes = node.entity ? nodesByEntity.get(node.entity)! : undefined;\r\n const preferredValue = node.entity ? (entityNodes!.length === 1 ? GetEntityId(node.entity) : `${GetEntityId(node.entity)}:${path}`) : path;\r\n let value: ExplorerNodeValue = preferredValue;\r\n let suffix = 2;\r\n while (nodesByValue.has(value)) {\r\n value = `${preferredValue}#${suffix++}`;\r\n }\r\n\r\n node.value = value;\r\n nodesByValue.set(value, node);\r\n node.children.forEach(registerNode);\r\n };\r\n nodes.forEach(registerNode);\r\n\r\n return { nodes, nodesByValue, nodesByEntity, changeObservables: { added, removed, moved } };\r\n}\r\n\r\n/**\r\n * Options that control which nodes of an Explorer tree are visible.\r\n */\r\nexport type ExplorerVisibilityOptions = Readonly<{\r\n /**\r\n * The values of the nodes that are currently expanded.\r\n */\r\n openItems: ReadonlySet<ExplorerNodeValue>;\r\n\r\n /**\r\n * A lower case filter string. When non-empty, the expansion state is ignored and only matching\r\n * nodes (and their ancestors) are visible.\r\n */\r\n filter: string;\r\n\r\n /**\r\n * Whether item nodes should be sorted alphabetically by display name.\r\n */\r\n sortItems: boolean;\r\n}>;\r\n\r\n/**\r\n * Computes the flattened, ordered list of nodes that should currently be rendered.\r\n *\r\n * Only nodes that represent an entity participate in filter matching. Purely structural nodes\r\n * (e.g. the \"Nodes\" or \"Materials\" sections) become visible when one of their descendants matches.\r\n * The root node is always visible.\r\n * @param nodes The top level nodes of the tree.\r\n * @param options Options controlling expansion, filtering, and sorting.\r\n * @returns The nodes to render, in tree order.\r\n */\r\nexport function GetVisibleExplorerNodes(nodes: readonly ExplorerNode[], options: ExplorerVisibilityOptions): readonly ExplorerNode[] {\r\n const { openItems, filter, sortItems } = options;\r\n\r\n // Tracks the nodes in the order they were traversed (which is what the flat tree expects).\r\n const traversedNodes: ExplorerNode[] = [];\r\n // Tracks the nodes that are visible based on either the open state or the filter.\r\n const visibleNodes = new Set<ExplorerNode>();\r\n\r\n const traverse = (node: ExplorerNode) => {\r\n traversedNodes.push(node);\r\n\r\n if (node.kind === \"root\") {\r\n // The root node is always visible, even while filtering.\r\n visibleNodes.add(node);\r\n } else if (!filter) {\r\n // If there is no filter and we made it this far, then the node's parent is in an open state and this node is visible.\r\n visibleNodes.add(node);\r\n } else if (node.entity) {\r\n // Only selectable (entity backed) nodes participate in filter matching. Structural nodes\r\n // become visible via the ancestor walk below when one of their descendants matches.\r\n const displayInfo = node.getDisplayInfo();\r\n const isMatch = displayInfo.name.toLocaleLowerCase().includes(filter);\r\n displayInfo.dispose?.();\r\n\r\n if (isMatch) {\r\n // Include the matching node and its ancestors so the matching branch remains visible.\r\n for (let current: ExplorerNode | undefined = node; current && !visibleNodes.has(current); current = current.parent) {\r\n visibleNodes.add(current);\r\n }\r\n }\r\n }\r\n\r\n // When a filter is present, always traverse the full tree (e.g. ignore the open item state).\r\n if (filter || openItems.has(node.value)) {\r\n for (const child of GetOrderedChildren(node, sortItems)) {\r\n traverse(child);\r\n }\r\n }\r\n };\r\n\r\n for (const node of nodes) {\r\n traverse(node);\r\n }\r\n\r\n // Filter the traversal ordered nodes by those that should actually be visible.\r\n return traversedNodes.filter((node) => visibleNodes.has(node));\r\n}\r\n\r\n/**\r\n * Expands or collapses a node and all of its descendants.\r\n * @param node The node to expand or collapse.\r\n * @param open True to expand, false to collapse.\r\n * @param openItems The mutable set of expanded node values to update.\r\n */\r\nexport function ExpandOrCollapseAll(node: ExplorerNode, open: boolean, openItems: Set<ExplorerNodeValue>) {\r\n if (open) {\r\n openItems.add(node.value);\r\n } else {\r\n openItems.delete(node.value);\r\n }\r\n\r\n for (const child of node.children) {\r\n ExpandOrCollapseAll(child, open, openItems);\r\n }\r\n}\r\n\r\n/**\r\n * Gets the values of all ancestors of the node representing the specified entity, which is what must be\r\n * expanded for that entity to be revealed.\r\n * @param tree The tree to search.\r\n * @param entity The entity to reveal.\r\n * @returns The values of the ancestor nodes, or an empty array if the entity is not present in the tree.\r\n */\r\nexport function GetAncestorValues(tree: ExplorerTree, entity: object): readonly ExplorerNodeValue[] {\r\n const values: ExplorerNodeValue[] = [];\r\n const seenValues = new Set<ExplorerNodeValue>();\r\n for (const occurrence of tree.nodesByEntity.get(entity) ?? []) {\r\n for (let node = occurrence.parent; node; node = node.parent) {\r\n if (!seenValues.has(node.value)) {\r\n seenValues.add(node.value);\r\n values.push(node.value);\r\n }\r\n }\r\n }\r\n return values;\r\n}\r\n","import { type DragEvent, useCallback, useRef, useState } from \"react\";\r\n\r\nimport { type Nullable } from \"core/index\";\r\n\r\nimport { tokens } from \"@fluentui/react-components\";\r\n\r\nimport { type ExplorerDragDropConfig } from \"./explorerModel\";\r\n\r\n/**\r\n * Props for drop-only event handlers on a group node.\r\n */\r\nexport type DropProps = {\r\n onDragOver: (e: DragEvent) => void;\r\n onDragLeave: (e: DragEvent) => void;\r\n onDrop: (e: DragEvent) => void;\r\n};\r\n\r\n/**\r\n * Props for drag-drop event handlers on a tree item.\r\n */\r\nexport type DragDropProps = {\r\n draggable: boolean;\r\n onDragStart: (e: DragEvent) => void;\r\n onDragEnd: (e: DragEvent) => void;\r\n} & DropProps;\r\n\r\nconst NoOpGroupDropProps: DropProps = {\r\n onDragOver: () => {},\r\n onDragLeave: () => {},\r\n onDrop: () => {},\r\n};\r\n\r\nconst NoOpDragProps: DragDropProps = Object.assign(\r\n {\r\n draggable: false,\r\n onDragStart: () => {},\r\n onDragEnd: () => {},\r\n },\r\n NoOpGroupDropProps\r\n);\r\n\r\n/**\r\n * Options for the drag-drop hook.\r\n */\r\nexport type ExplorerDragDropOptions = {\r\n /** Called after a successful drop with the dragged entity and target (entity or null for the branch root). */\r\n onDrop?: (draggedEntity: object, targetEntity: object | null) => void;\r\n};\r\n\r\n/**\r\n * Hook that provides drag-drop functionality for the explorer.\r\n * Uses vanilla HTML5 drag and drop APIs.\r\n * @param options Optional callbacks for drag-drop events.\r\n * @returns State and props factory for drag-drop functionality.\r\n */\r\nexport function useExplorerDragDrop(options?: ExplorerDragDropOptions) {\r\n // Global drag state - HTML5 drag/drop doesn't allow reading dataTransfer in dragover events.\r\n const activeDragState = useRef<{\r\n entity: object;\r\n config: ExplorerDragDropConfig<object>;\r\n } | null>(null);\r\n\r\n const [draggedEntity, setDraggedEntity] = useState<object>();\r\n const [dropTarget, setDropTarget] = useState<object>();\r\n const [dropTargetIsRoot, setDropTargetIsRoot] = useState(false);\r\n\r\n // Ref to track current valid drop for the onDrop handler\r\n const pendingDropRef = useRef<Nullable<{ target: object | null; dragged: object; config: ExplorerDragDropConfig<object> }>>(null);\r\n\r\n const resetState = useCallback(() => {\r\n setDraggedEntity(undefined);\r\n setDropTarget(undefined);\r\n setDropTargetIsRoot(false);\r\n pendingDropRef.current = null;\r\n }, []);\r\n\r\n const createDragProps = useCallback(\r\n (entity: object, getName: () => string, dragDropConfig?: ExplorerDragDropConfig<object>): DragDropProps => {\r\n // No drag-drop if the node doesn't support it\r\n if (!dragDropConfig) {\r\n return NoOpDragProps;\r\n }\r\n\r\n // Check if entity can be dragged\r\n if (!dragDropConfig.canDrag(entity)) {\r\n return NoOpDragProps;\r\n }\r\n\r\n const onDragStart = (e: DragEvent) => {\r\n activeDragState.current = { entity, config: dragDropConfig };\r\n setDraggedEntity(entity);\r\n\r\n e.dataTransfer.effectAllowed = \"move\";\r\n e.dataTransfer.setData(\"text/plain\", getName());\r\n\r\n // Create custom drag image (required for Safari preview)\r\n const element = e.currentTarget as HTMLElement;\r\n const computedStyle = getComputedStyle(element);\r\n const dragImage = document.createElement(\"div\");\r\n dragImage.textContent = getName();\r\n Object.assign(dragImage.style, {\r\n position: \"absolute\",\r\n top: \"-1000px\",\r\n background: tokens.colorNeutralBackground1,\r\n borderRadius: tokens.borderRadiusMedium,\r\n font: computedStyle.font,\r\n color: computedStyle.color,\r\n boxShadow: tokens.shadow8,\r\n pointerEvents: \"none\",\r\n whiteSpace: \"nowrap\",\r\n });\r\n document.body.appendChild(dragImage);\r\n e.dataTransfer.setDragImage(dragImage, -16, 0);\r\n setTimeout(() => document.body.removeChild(dragImage), 0);\r\n };\r\n\r\n const onDragEnd = () => {\r\n activeDragState.current = null;\r\n resetState();\r\n };\r\n\r\n const onDragOver = (e: DragEvent) => {\r\n if (!activeDragState.current) {\r\n return;\r\n }\r\n\r\n const { entity: dragged, config } = activeDragState.current;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.dataTransfer.dropEffect = \"move\";\r\n\r\n // Check if this is a valid drop target\r\n if (!config.canDrop(dragged, entity)) {\r\n setDropTarget(undefined);\r\n pendingDropRef.current = null;\r\n return;\r\n }\r\n\r\n setDropTarget(entity);\r\n pendingDropRef.current = { target: entity, dragged, config };\r\n };\r\n\r\n const onDragLeave = (e: DragEvent) => {\r\n // Ignore if leaving to a child element (still within the same drop target)\r\n const relatedTarget = e.relatedTarget as Node | null;\r\n if (relatedTarget && e.currentTarget instanceof Node && e.currentTarget.contains(relatedTarget)) {\r\n return;\r\n }\r\n if (pendingDropRef.current?.target === entity) {\r\n setDropTarget(undefined);\r\n }\r\n };\r\n\r\n const onDropHandler = (e: DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const pending = pendingDropRef.current;\r\n if (pending) {\r\n pending.config.onDrop(pending.dragged, pending.target);\r\n options?.onDrop?.(pending.dragged, pending.target);\r\n }\r\n\r\n activeDragState.current = null;\r\n resetState();\r\n };\r\n\r\n return {\r\n draggable: true,\r\n onDragStart,\r\n onDragEnd,\r\n onDragOver,\r\n onDragLeave,\r\n onDrop: onDropHandler,\r\n };\r\n },\r\n [resetState, options]\r\n );\r\n\r\n /**\r\n * Creates drag-drop props for a group node that accepts drops to move entities to the branch root.\r\n * @param dragDropConfig The drag-drop configuration for the group node.\r\n */\r\n const createGroupDropProps = useCallback(\r\n (dragDropConfig: ExplorerDragDropConfig<object> | undefined): DropProps => {\r\n // No drop handling if the node doesn't support drag-drop\r\n if (!dragDropConfig) {\r\n return NoOpGroupDropProps;\r\n }\r\n\r\n const onDragOver = (e: DragEvent) => {\r\n if (!activeDragState.current) {\r\n return;\r\n }\r\n\r\n const { entity: dragged, config } = activeDragState.current;\r\n\r\n // Only accept drops from the same drag-drop config\r\n if (config !== dragDropConfig) {\r\n return;\r\n }\r\n\r\n // Check if drop to the branch root is allowed\r\n if (!config.canDrop(dragged, null)) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.dataTransfer.dropEffect = \"move\";\r\n\r\n setDropTarget(undefined);\r\n setDropTargetIsRoot(true);\r\n pendingDropRef.current = { target: null, dragged, config };\r\n };\r\n\r\n const onDragLeave = (e: DragEvent) => {\r\n // Ignore if leaving to a child element (still within the same drop target)\r\n const relatedTarget = e.relatedTarget as Node | null;\r\n if (relatedTarget && e.currentTarget instanceof Node && e.currentTarget.contains(relatedTarget)) {\r\n return;\r\n }\r\n if (pendingDropRef.current?.target === null) {\r\n setDropTargetIsRoot(false);\r\n }\r\n };\r\n\r\n const onDropHandler = (e: DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const pending = pendingDropRef.current;\r\n if (pending && pending.target === null) {\r\n pending.config.onDrop(pending.dragged, null);\r\n options?.onDrop?.(pending.dragged, null);\r\n }\r\n\r\n activeDragState.current = null;\r\n resetState();\r\n };\r\n\r\n return {\r\n onDragOver,\r\n onDragLeave,\r\n onDrop: onDropHandler,\r\n };\r\n },\r\n [resetState, options]\r\n );\r\n\r\n return {\r\n draggedEntity,\r\n dropTarget,\r\n dropTargetIsRoot,\r\n createDragProps,\r\n createGroupDropProps,\r\n };\r\n}\r\n","import { type ScrollToInterface, VirtualizerScrollView } from \"@fluentui-contrib/react-virtualizer\";\r\nimport {\r\n type MenuCheckedValueChangeData,\r\n type MenuCheckedValueChangeEvent,\r\n type TreeItemValue,\r\n type TreeItemLayoutProps,\r\n type TreeOpenChangeData,\r\n type TreeOpenChangeEvent,\r\n Body1,\r\n Body1Strong,\r\n Button,\r\n FlatTree,\r\n FlatTreeItem,\r\n makeStyles,\r\n Menu,\r\n MenuDivider,\r\n MenuItem,\r\n MenuItemCheckbox,\r\n MenuList,\r\n MenuPopover,\r\n MenuTrigger,\r\n mergeClasses,\r\n SearchBox,\r\n tokens,\r\n Tooltip,\r\n TreeItemLayout,\r\n treeItemLevelToken,\r\n typographyStyles,\r\n useFluent,\r\n} from \"@fluentui/react-components\";\r\nimport {\r\n type FluentIcon,\r\n ArrowCollapseAllRegular,\r\n ArrowExpandAllRegular,\r\n ChevronRightRegular,\r\n createFluentIcon,\r\n FilterRegular,\r\n GlobeRegular,\r\n TextSortAscendingRegular,\r\n WarningRegular,\r\n} from \"@fluentui/react-icons\";\r\nimport { Fade } from \"@fluentui/react-motion-components-preview\";\r\nimport { type FocusEvent, type FunctionComponent, type KeyboardEvent, type PointerEvent, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport { type IDisposable, type Nullable } from \"core/index\";\r\nimport {\r\n type ExplorerCommand,\r\n type ExplorerCommandProvider,\r\n type ExplorerNode,\r\n type ExplorerNodeDescription,\r\n BuildExplorerTree,\r\n ExpandOrCollapseAll,\r\n GetAncestorValues,\r\n GetVisibleExplorerNodes,\r\n} from \"./explorerModel\";\r\nimport { type DragDropProps, type DropProps, useExplorerDragDrop } from \"./explorerDragDrop\";\r\n\r\nimport { ToggleButton } from \"shared-ui-components/fluent/primitives/toggleButton\";\r\nimport { CustomTokens } from \"shared-ui-components/fluent/primitives/utils\";\r\nimport { useObservableState } from \"shared-ui-components/modularTool/hooks/observableHooks\";\r\nimport { useResource } from \"shared-ui-components/modularTool/hooks/resourceHooks\";\r\nimport { useSetting } from \"shared-ui-components/modularTool/hooks/settingsHooks\";\r\nimport { CompactModeSettingDescriptor } from \"../../services/globalSettings\";\r\n\r\nconst useStyles = makeStyles({\r\n rootDiv: {\r\n flex: 1,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n toolbarDiv: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n paddingLeft: tokens.spacingHorizontalM,\r\n paddingRight: tokens.spacingHorizontalM,\r\n },\r\n searchBox: {\r\n flex: 1,\r\n padding: 0,\r\n maxWidth: \"none\",\r\n },\r\n tree: {\r\n rowGap: 0,\r\n overflow: \"hidden\",\r\n flex: 1,\r\n paddingLeft: tokens.spacingHorizontalM,\r\n paddingRight: tokens.spacingHorizontalM,\r\n },\r\n scrollView: {\r\n overflowX: \"hidden\",\r\n // Create a little padding and negative margin to keep correct alignment but make\r\n // room for the focus ring so it doesn't get clipped.\r\n paddingLeft: tokens.spacingHorizontalXXS,\r\n paddingRight: tokens.spacingHorizontalXXS,\r\n marginLeft: `calc(-1 * ${tokens.spacingHorizontalXXS})`,\r\n marginRight: `calc(-1 * ${tokens.spacingHorizontalXXS})`,\r\n },\r\n treeItem: {\r\n // Ensure focused items render their focus ring above adjacent selected/hovered items\r\n \"&:focus\": {\r\n zIndex: 1,\r\n },\r\n },\r\n rootTreeItemLayout: {\r\n padding: 0,\r\n },\r\n treeItemLayoutAside: {\r\n gap: 0,\r\n paddingLeft: tokens.spacingHorizontalS,\r\n paddingRight: tokens.spacingHorizontalS,\r\n },\r\n treeItemLayoutMain: {\r\n flex: \"1 1 0\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n },\r\n treeItemLayoutCompact: {\r\n minHeight: CustomTokens.lineHeightSmall,\r\n maxHeight: CustomTokens.lineHeightSmall,\r\n },\r\n // RootTreeItem supplies the visual root, so its children begin at one indentation level.\r\n treeItemLayout: {\r\n paddingLeft: `calc((var(${treeItemLevelToken}, 1) - 1) * ${tokens.spacingHorizontalL})`,\r\n },\r\n leadingSlot: {\r\n width: tokens.spacingHorizontalXXL,\r\n minWidth: tokens.spacingHorizontalXXL,\r\n maxWidth: tokens.spacingHorizontalXXL,\r\n height: tokens.spacingVerticalXXL,\r\n minHeight: tokens.spacingVerticalXXL,\r\n maxHeight: tokens.spacingVerticalXXL,\r\n padding: 0,\r\n position: \"relative\",\r\n },\r\n leadingLayer: {\r\n position: \"absolute\",\r\n inset: 0,\r\n },\r\n leadingIcon: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n color: tokens.colorNeutralForeground2,\r\n fontSize: tokens.fontSizeBase500,\r\n lineHeight: tokens.lineHeightBase500,\r\n },\r\n leadingChevron: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: tokens.fontSizeBase200,\r\n },\r\n leadingChevronOpen: {\r\n transform: \"rotate(90deg)\",\r\n },\r\n leadingChevronClosedRtl: {\r\n transform: \"rotate(180deg)\",\r\n },\r\n treeItemDragging: {\r\n opacity: 0.5,\r\n },\r\n treeItemDropTarget: {\r\n outline: `${tokens.strokeWidthThick} solid ${tokens.colorBrandForeground1}`,\r\n outlineOffset: `-${tokens.strokeWidthThick}`,\r\n },\r\n});\r\n\r\nconst LeadingIconFadeDuration = 50;\r\nconst LeadingIconFadeDelay = 25;\r\n\r\nfunction useBranchIconInteraction(enabled: boolean) {\r\n const [isPointerHovered, setIsPointerHovered] = useState(false);\r\n const [isKeyboardFocusVisible, setIsKeyboardFocusVisible] = useState(false);\r\n\r\n const onPointerEnter = useCallback(\r\n (_event: PointerEvent<HTMLDivElement>) => {\r\n if (enabled) {\r\n setIsPointerHovered(true);\r\n }\r\n },\r\n [enabled]\r\n );\r\n const onPointerLeave = useCallback(\r\n (_event: PointerEvent<HTMLDivElement>) => {\r\n if (enabled) {\r\n setIsPointerHovered(false);\r\n }\r\n },\r\n [enabled]\r\n );\r\n const onFocus = useCallback(\r\n (event: FocusEvent<HTMLDivElement>) => {\r\n if (enabled && event.currentTarget === event.target) {\r\n setIsKeyboardFocusVisible(event.currentTarget.matches(\":focus-visible\") || event.currentTarget.hasAttribute(\"data-fui-focus-visible\"));\r\n }\r\n },\r\n [enabled]\r\n );\r\n const onBlur = useCallback(\r\n (event: FocusEvent<HTMLDivElement>) => {\r\n if (enabled && event.currentTarget === event.target) {\r\n setIsKeyboardFocusVisible(false);\r\n }\r\n },\r\n [enabled]\r\n );\r\n\r\n return {\r\n showChevron: enabled && (isPointerHovered || isKeyboardFocusVisible),\r\n treeItemInteractionProps: {\r\n onPointerEnter,\r\n onPointerLeave,\r\n onFocus,\r\n onBlur,\r\n },\r\n };\r\n}\r\n\r\ntype ExplorerTreeItemLayoutProps = Omit<TreeItemLayoutProps, \"expandIcon\"> & {\r\n isBranch: boolean;\r\n isOpen: boolean;\r\n icon?: ReactNode;\r\n showChevron: boolean;\r\n select?: () => void;\r\n};\r\n\r\nconst ExplorerTreeItemLayout: FunctionComponent<ExplorerTreeItemLayoutProps> = (props) => {\r\n const { isBranch, isOpen, icon, showChevron, select, ...layoutProps } = props;\r\n const classes = useStyles();\r\n const { dir } = useFluent();\r\n const hasIcon = !!icon;\r\n const chevron = (\r\n <div className={mergeClasses(classes.leadingChevron, isOpen ? classes.leadingChevronOpen : dir === \"rtl\" && classes.leadingChevronClosedRtl)}>\r\n <ChevronRightRegular />\r\n </div>\r\n );\r\n\r\n return (\r\n <TreeItemLayout\r\n {...layoutProps}\r\n expandIcon={{\r\n className: classes.leadingSlot,\r\n onClick: isBranch ? undefined : select,\r\n children:\r\n isBranch && hasIcon ? (\r\n <>\r\n <Fade visible={!showChevron} duration={LeadingIconFadeDuration} delay={LeadingIconFadeDelay} exitDelay={0} easing=\"linear\">\r\n <div className={mergeClasses(classes.leadingLayer, classes.leadingIcon)}>{icon}</div>\r\n </Fade>\r\n <Fade visible={showChevron} duration={LeadingIconFadeDuration} delay={LeadingIconFadeDelay} exitDelay={0} easing=\"linear\">\r\n <div\r\n className={mergeClasses(\r\n classes.leadingLayer,\r\n classes.leadingChevron,\r\n isOpen ? classes.leadingChevronOpen : dir === \"rtl\" && classes.leadingChevronClosedRtl\r\n )}\r\n >\r\n <ChevronRightRegular />\r\n </div>\r\n </Fade>\r\n </>\r\n ) : hasIcon ? (\r\n <div className={classes.leadingIcon}>{icon}</div>\r\n ) : isBranch ? (\r\n chevron\r\n ) : undefined,\r\n }}\r\n />\r\n );\r\n};\r\n\r\nfunction GetCommandHotKeyDescription(command: ExplorerCommand): string {\r\n if (!command.hotKey) {\r\n return \"\";\r\n }\r\n const hotKey = command.hotKey;\r\n return `${hotKey.control ? \"Ctrl+\" : \"\"}${hotKey.alt ? \"Alt+\" : \"\"}${hotKey.shift ? \"Shift+\" : \"\"}${hotKey.meta ? \"Meta+\" : \"\"}${hotKey.keyCode}`;\r\n}\r\n\r\nfunction GetCommandDescription(command: ExplorerCommand): string {\r\n return command.hotKey ? `${command.displayName} (${GetCommandHotKeyDescription(command)})` : command.displayName;\r\n}\r\n\r\nfunction useCommandContextMenuState(commands: readonly ExplorerCommand<\"contextMenu\">[]) {\r\n const [checkedContextMenuItems, setCheckedContextMenuItems] = useState({ toggleCommands: [] as string[] });\r\n\r\n useEffect(() => {\r\n const updateCheckedItems = () => {\r\n const checkedItems: string[] = [];\r\n for (const command of commands) {\r\n if (command.type === \"toggle\" && command.isEnabled) {\r\n checkedItems.push(command.displayName);\r\n }\r\n }\r\n setCheckedContextMenuItems({ toggleCommands: checkedItems });\r\n };\r\n\r\n updateCheckedItems();\r\n\r\n const observers = commands\r\n .map((command) => command.onChange)\r\n .filter((onChange) => !!onChange)\r\n .map((onChange) => onChange.add(updateCheckedItems));\r\n\r\n return () => {\r\n for (const observer of observers) {\r\n observer.remove();\r\n }\r\n };\r\n }, [commands]);\r\n\r\n const onContextMenuCheckedValueChange = useCallback(\r\n (e: MenuCheckedValueChangeEvent, data: MenuCheckedValueChangeData) => {\r\n for (const command of commands) {\r\n if (command.type === \"toggle\") {\r\n command.isEnabled = data.checkedItems.includes(command.displayName);\r\n }\r\n }\r\n },\r\n [commands]\r\n );\r\n\r\n const contextMenuItems = commands.map((command) =>\r\n command.type === \"action\" ? (\r\n <MenuItem\r\n key={command.displayName}\r\n icon={command.icon ? <command.icon /> : undefined}\r\n secondaryContent={GetCommandHotKeyDescription(command)}\r\n onClick={() => command.execute()}\r\n >\r\n {command.displayName}\r\n </MenuItem>\r\n ) : (\r\n <MenuItemCheckbox\r\n key={command.displayName}\r\n // Don't show both a checkmark and an icon. null means no checkmark, undefined means default (checkmark).\r\n checkmark={command.icon ? null : undefined}\r\n icon={command.icon ? <command.icon /> : undefined}\r\n secondaryContent={GetCommandHotKeyDescription(command)}\r\n name=\"toggleCommands\"\r\n value={command.displayName}\r\n >\r\n {command.displayName}\r\n </MenuItemCheckbox>\r\n )\r\n );\r\n\r\n return [checkedContextMenuItems, onContextMenuCheckedValueChange, contextMenuItems] as const;\r\n}\r\n\r\nconst useTruncatingBody1Styles = makeStyles({\r\n container: {\r\n display: \"block\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n minWidth: 0,\r\n ...typographyStyles.body1,\r\n },\r\n});\r\n\r\nconst TruncatingBody1: FunctionComponent<{ text: string }> = (props) => {\r\n const { text } = props;\r\n const classes = useTruncatingBody1Styles();\r\n const ref = useRef<HTMLSpanElement | null>(null);\r\n const [isTruncated, setIsTruncated] = useState(false);\r\n const [isHovered, setIsHovered] = useState(false);\r\n\r\n useEffect(() => {\r\n const element = ref.current;\r\n if (!element) {\r\n return undefined;\r\n }\r\n\r\n const update = () => {\r\n setIsTruncated(element.scrollWidth > element.clientWidth);\r\n };\r\n\r\n update();\r\n\r\n const observer = new ResizeObserver(update);\r\n observer.observe(element);\r\n return () => observer.disconnect();\r\n }, [text]);\r\n\r\n return (\r\n <Tooltip content={text} positioning=\"after\" relationship=\"description\" visible={isTruncated && isHovered} onVisibleChange={(_, data) => setIsHovered(data.visible)}>\r\n {/*\r\n Body1 isn't used here: it doesn't forward refs (so we can't measure the rendered element)\r\n and it reapplies its own white-space styling that overrides ours when wrapped, which would\r\n break truncation for names containing spaces. Instead, render a single ref'd <span> styled\r\n with Fluent typography tokens so we get the same look while keeping full control over\r\n truncation and overflow measurement.\r\n */}\r\n <span ref={ref} className={classes.container}>\r\n {text}\r\n </span>\r\n </Tooltip>\r\n );\r\n};\r\n\r\nconst ActionCommand: FunctionComponent<{ command: ExplorerCommand<\"inline\", \"action\"> }> = (props) => {\r\n const { command } = props;\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const [Icon, execute] = useObservableState(\r\n useCallback(() => [command.icon, command.execute] as const, [command]),\r\n command.onChange\r\n );\r\n\r\n return (\r\n <Tooltip content={GetCommandDescription(command)} relationship=\"label\" positioning=\"after\">\r\n <Button icon={<Icon />} appearance=\"subtle\" onClick={() => execute()} />\r\n </Tooltip>\r\n );\r\n};\r\n\r\nconst ToggleCommand: FunctionComponent<{ command: ExplorerCommand<\"inline\", \"toggle\"> }> = (props) => {\r\n const { command } = props;\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const [Icon, isEnabled] = useObservableState(\r\n useCallback(() => [command.icon, command.isEnabled] as const, [command]),\r\n command.onChange\r\n );\r\n\r\n // TODO-iv2: Consolidate icon prop passing approach for inspector and shared components\r\n return (\r\n <ToggleButton\r\n appearance=\"transparent\"\r\n title={GetCommandDescription(command)}\r\n titlePositioning=\"after\"\r\n checkedIcon={Icon as FluentIcon}\r\n value={isEnabled}\r\n onChange={(val: boolean) => (command.isEnabled = val)}\r\n />\r\n );\r\n};\r\n\r\n// This \"placeholder\" command has a blank icon and is a no-op. It is used for aside\r\n// alignment when some toggle commands are enabled. See more details on the commands\r\n// for setting the aside state.\r\nconst PlaceHolderCommand: ExplorerCommand<\"inline\", \"action\"> = {\r\n type: \"action\",\r\n displayName: \"\",\r\n icon: createFluentIcon(\"Placeholder\", \"1em\", \"\"),\r\n execute: () => {\r\n /* No-op */\r\n },\r\n};\r\n\r\nfunction MakeInlineCommandElement(command: ExplorerCommand<\"inline\">, isPlaceholder: boolean): JSX.Element {\r\n if (isPlaceholder) {\r\n // Placeholders are not visible and not interacted with, so they are always ActionCommand\r\n // components, just to ensure the exact right amount of space is taken up.\r\n return <ActionCommand key={command.displayName} command={PlaceHolderCommand} />;\r\n }\r\n\r\n return command.type === \"action\" ? <ActionCommand key={command.displayName} command={command} /> : <ToggleCommand key={command.displayName} command={command} />;\r\n}\r\n\r\n/**\r\n * Resolves the (possibly live) display info for a node.\r\n * @param node The node to resolve the display info for.\r\n * @returns The display info, guaranteed to have a dispose function.\r\n */\r\nfunction useNodeDisplayInfo(node: ExplorerNode) {\r\n return useResource(\r\n useCallback(() => {\r\n const displayInfo = node.getDisplayInfo();\r\n if (!displayInfo.dispose) {\r\n displayInfo.dispose = () => {\r\n /* No-op */\r\n };\r\n }\r\n return displayInfo as typeof displayInfo & IDisposable;\r\n }, [node])\r\n );\r\n}\r\n\r\nconst RootTreeItem: FunctionComponent<{\r\n node: ExplorerNode;\r\n isSelected: boolean;\r\n isOpen: boolean;\r\n select?: () => void;\r\n isFiltering: boolean;\r\n expandAll: () => void;\r\n collapseAll: () => void;\r\n}> = (props) => {\r\n const { node, isSelected, isOpen, select, isFiltering, expandAll, collapseAll } = props;\r\n\r\n const classes = useStyles();\r\n const [compactMode] = useSetting(CompactModeSettingDescriptor);\r\n const treeItemLayoutClass = mergeClasses(classes.rootTreeItemLayout, compactMode ? classes.treeItemLayoutCompact : undefined);\r\n\r\n const displayInfo = useNodeDisplayInfo(node);\r\n const name = useObservableState(() => displayInfo.name, displayInfo.onChange);\r\n const hasChildren = node.children.length > 0;\r\n const isBranch = !isFiltering && hasChildren;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const Icon = node.icon;\r\n const icon = Icon && node.entity ? <Icon entity={node.entity} /> : <GlobeRegular />;\r\n const { showChevron, treeItemInteractionProps } = useBranchIconInteraction(isBranch && !!icon);\r\n const actions = useMemo(\r\n () =>\r\n hasChildren\r\n ? [\r\n MakeInlineCommandElement(\r\n {\r\n type: \"action\",\r\n displayName: \"Expand All\",\r\n icon: () => <ArrowExpandAllRegular />,\r\n execute: expandAll,\r\n },\r\n false\r\n ),\r\n ]\r\n : [],\r\n [hasChildren, expandAll]\r\n );\r\n\r\n return (\r\n <Menu openOnContext>\r\n <MenuTrigger disableButtonEnhancement>\r\n <FlatTreeItem\r\n className={classes.treeItem}\r\n key={node.value}\r\n value={node.value}\r\n // Disable manual expand/collapse when a filter is active.\r\n itemType={isBranch ? \"branch\" : \"leaf\"}\r\n parentValue={node.parent?.value}\r\n aria-level={node.depth}\r\n aria-setsize={1}\r\n aria-posinset={1}\r\n onClick={select}\r\n {...treeItemInteractionProps}\r\n >\r\n <ExplorerTreeItemLayout\r\n isBranch={isBranch}\r\n isOpen={isOpen}\r\n icon={icon}\r\n showChevron={showChevron}\r\n select={select}\r\n className={treeItemLayoutClass}\r\n style={isSelected ? { backgroundColor: tokens.colorNeutralBackground1Selected } : undefined}\r\n actions={{ children: actions }}\r\n >\r\n <Body1Strong wrap={false} truncate>\r\n {name}\r\n </Body1Strong>\r\n </ExplorerTreeItemLayout>\r\n </FlatTreeItem>\r\n </MenuTrigger>\r\n <MenuPopover hidden={!hasChildren}>\r\n <MenuList>\r\n <MenuItem icon={<ArrowExpandAllRegular />} onClick={expandAll}>\r\n <Body1>Expand All</Body1>\r\n </MenuItem>\r\n <MenuItem icon={<ArrowCollapseAllRegular />} onClick={collapseAll}>\r\n <Body1>Collapse All</Body1>\r\n </MenuItem>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n );\r\n};\r\n\r\nconst GroupTreeItem: FunctionComponent<\r\n {\r\n node: ExplorerNode;\r\n isFiltering: boolean;\r\n commandProviders: readonly ExplorerCommandProvider<string, \"contextMenu\">[];\r\n expandAll: () => void;\r\n collapseAll: () => void;\r\n isSelected: boolean;\r\n isOpen: boolean;\r\n select?: () => void;\r\n isDropTarget: boolean;\r\n } & DropProps\r\n> = (props) => {\r\n const { node, isFiltering, commandProviders, expandAll, collapseAll, isSelected, isOpen, select, isDropTarget, ...dropProps } = props;\r\n\r\n const classes = useStyles();\r\n const [compactMode] = useSetting(CompactModeSettingDescriptor);\r\n\r\n const displayInfo = useNodeDisplayInfo(node);\r\n const name = useObservableState(() => displayInfo.name, displayInfo.onChange);\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const Icon = node.icon;\r\n\r\n // Get the commands that apply to this group.\r\n const commands = useResource(\r\n useCallback(() => {\r\n const commands = [...commandProviders].filter((provider) => provider.predicate(name)).map((provider) => provider.getCommand(name));\r\n\r\n return Object.assign(commands, {\r\n dispose: () => commands.forEach((command) => command.dispose?.()),\r\n });\r\n }, [name, commandProviders])\r\n );\r\n\r\n const hasChildren = node.children.length > 0;\r\n const isBranch = !isFiltering && hasChildren;\r\n const icon = Icon && node.entity ? <Icon entity={node.entity} /> : undefined;\r\n const { showChevron, treeItemInteractionProps } = useBranchIconInteraction(isBranch && !!icon);\r\n\r\n const [checkedContextMenuItems, onContextMenuCheckedValueChange, contextMenuItems] = useCommandContextMenuState(commands);\r\n\r\n return (\r\n <Menu openOnContext checkedValues={checkedContextMenuItems} onCheckedValueChange={onContextMenuCheckedValueChange}>\r\n <MenuTrigger disableButtonEnhancement>\r\n <FlatTreeItem\r\n className={mergeClasses(classes.treeItem, isDropTarget && classes.treeItemDropTarget)}\r\n key={node.value}\r\n value={node.value}\r\n // Disable manual expand/collapse when a filter is active.\r\n itemType={isBranch ? \"branch\" : \"leaf\"}\r\n parentValue={node.parent?.value}\r\n aria-level={node.depth}\r\n aria-setsize={1}\r\n aria-posinset={1}\r\n onClick={select}\r\n style={{ [treeItemLevelToken]: node.depth }}\r\n {...dropProps}\r\n {...treeItemInteractionProps}\r\n >\r\n <ExplorerTreeItemLayout\r\n isBranch={isBranch}\r\n isOpen={isOpen}\r\n icon={icon}\r\n showChevron={showChevron}\r\n select={select}\r\n className={mergeClasses(classes.treeItemLayout, compactMode ? classes.treeItemLayoutCompact : undefined)}\r\n style={isSelected ? { backgroundColor: tokens.colorNeutralBackground1Selected } : undefined}\r\n >\r\n <Body1Strong wrap={false} truncate>\r\n {name.substring(0, 100)}\r\n </Body1Strong>\r\n </ExplorerTreeItemLayout>\r\n </FlatTreeItem>\r\n </MenuTrigger>\r\n <MenuPopover hidden={!hasChildren && commands.length === 0}>\r\n <MenuList>\r\n {hasChildren && (\r\n <>\r\n <MenuItem onClick={expandAll}>\r\n <Body1>Expand All</Body1>\r\n </MenuItem>\r\n <MenuItem onClick={collapseAll}>\r\n <Body1>Collapse All</Body1>\r\n </MenuItem>\r\n </>\r\n )}\r\n {hasChildren && commands.length > 0 && <MenuDivider />}\r\n {contextMenuItems}\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n );\r\n};\r\n\r\nconst ItemTreeItem: FunctionComponent<\r\n {\r\n node: ExplorerNode;\r\n entity: object;\r\n isSelected: boolean;\r\n select: () => void;\r\n isFiltering: boolean;\r\n commandProviders: readonly ExplorerCommandProvider<object>[];\r\n expandAll: () => void;\r\n collapseAll: () => void;\r\n isDragging: boolean;\r\n isDropTarget: boolean;\r\n isOpen: boolean;\r\n } & DragDropProps\r\n> = (props) => {\r\n const { node, entity, isSelected, select, isFiltering, commandProviders, expandAll, collapseAll, isDragging, isDropTarget, isOpen, ...dragProps } = props;\r\n\r\n const classes = useStyles();\r\n const [compactMode] = useSetting(CompactModeSettingDescriptor);\r\n\r\n const hasChildren = node.children.length > 0;\r\n const isBranch = !isFiltering && hasChildren;\r\n\r\n const displayInfo = useNodeDisplayInfo(node);\r\n\r\n const name = useObservableState(() => displayInfo.name, displayInfo.onChange);\r\n\r\n // Get the commands that apply to this entity.\r\n const commands = useResource(\r\n useCallback(() => {\r\n const commands: readonly ExplorerCommand[] = [...commandProviders]\r\n .filter((provider) => provider.predicate(entity))\r\n .map((provider) => {\r\n return {\r\n order: provider.order,\r\n command: provider.getCommand(entity),\r\n };\r\n })\r\n .sort((a, b) => {\r\n // Action commands always come before toggle commands, because toggle commands will remain\r\n // visible when they are enabled, even when the pointer is not hovering the item, and we\r\n // don't want a bunch of blank space.\r\n if (a.command.type !== b.command.type) {\r\n return a.command.type === \"action\" ? -1 : 1;\r\n }\r\n\r\n // Within each group of command types, sort by order (default 0) ascending.\r\n return (a.order ?? 0) - (b.order ?? 0);\r\n })\r\n .map((entry) => entry.command);\r\n\r\n return Object.assign(commands, {\r\n dispose: () => commands.forEach((command) => command.dispose?.()),\r\n });\r\n }, [entity, commandProviders])\r\n );\r\n\r\n const inlineCommands = useMemo(() => commands.filter((command): command is ExplorerCommand<\"inline\"> => command.mode !== \"contextMenu\"), [commands]);\r\n\r\n // TreeItemLayout actions (totally unrelated to \"Action\" type commands) are only visible when the item is focused or has pointer hover.\r\n const actions = useMemo(() => {\r\n const defaultCommands: ExplorerCommand<\"inline\">[] = [];\r\n if (hasChildren) {\r\n defaultCommands.push({\r\n type: \"action\",\r\n displayName: \"Expand All\",\r\n icon: () => <ArrowExpandAllRegular />,\r\n execute: () => expandAll(),\r\n });\r\n }\r\n\r\n return [...defaultCommands, ...inlineCommands].map((command) => MakeInlineCommandElement(command, false));\r\n }, [inlineCommands, hasChildren, expandAll]);\r\n\r\n // TreeItemLayout asides are always visible.\r\n const [aside, setAside] = useState<readonly JSX.Element[]>([]);\r\n\r\n // This useEffect keeps the aside up-to-date. What should always show is any enabled toggle command, along with\r\n // placeholders to the right to keep the position of the actions consistent.\r\n useEffect(() => {\r\n const updateAside = () => {\r\n let isAnyCommandEnabled = false;\r\n const aside: JSX.Element[] = [];\r\n for (const command of inlineCommands) {\r\n isAnyCommandEnabled ||= command.type === \"toggle\" && command.isEnabled;\r\n if (isAnyCommandEnabled) {\r\n aside.push(MakeInlineCommandElement(command, command.type !== \"toggle\" || !command.isEnabled));\r\n }\r\n }\r\n setAside(aside);\r\n };\r\n\r\n updateAside();\r\n\r\n const observers = inlineCommands\r\n .map((command) => command.onChange)\r\n .filter((onChange) => !!onChange)\r\n .map((onChange) => onChange.add(updateAside));\r\n\r\n return () => {\r\n for (const observer of observers) {\r\n observer.remove();\r\n }\r\n };\r\n }, [inlineCommands]);\r\n\r\n const contextMenuCommands = useMemo(() => commands.filter((command): command is ExplorerCommand<\"contextMenu\"> => command.mode === \"contextMenu\"), [commands]);\r\n\r\n const [checkedContextMenuItems, onContextMenuCheckedValueChange, contextMenuItems] = useCommandContextMenuState(contextMenuCommands);\r\n\r\n const onKeyDown = useCallback(\r\n (evt: KeyboardEvent) => {\r\n const command = commands.find((command) => {\r\n const hotKey = command.hotKey;\r\n if (hotKey) {\r\n if (\r\n evt.code.toLowerCase() === hotKey.keyCode.toLowerCase() &&\r\n !!hotKey.control === evt.ctrlKey &&\r\n !!hotKey.alt === evt.altKey &&\r\n !!hotKey.shift === evt.shiftKey &&\r\n !!hotKey.meta === evt.metaKey\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n if (command) {\r\n if (command.type === \"action\") {\r\n command.execute();\r\n } else {\r\n command.isEnabled = !command.isEnabled;\r\n }\r\n }\r\n },\r\n [commands]\r\n );\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const Icon = node.icon;\r\n const icon = displayInfo.validationError ? (\r\n <Tooltip content={displayInfo.validationError} relationship=\"description\">\r\n <WarningRegular />\r\n </Tooltip>\r\n ) : Icon ? (\r\n <Icon entity={entity} />\r\n ) : null;\r\n const { showChevron, treeItemInteractionProps } = useBranchIconInteraction(isBranch && !!icon);\r\n\r\n return (\r\n <Menu openOnContext checkedValues={checkedContextMenuItems} onCheckedValueChange={onContextMenuCheckedValueChange}>\r\n <MenuTrigger disableButtonEnhancement>\r\n <FlatTreeItem\r\n className={mergeClasses(classes.treeItem, isDragging && classes.treeItemDragging, isDropTarget && classes.treeItemDropTarget)}\r\n key={node.value}\r\n value={node.value}\r\n // Disable manual expand/collapse when a filter is active.\r\n itemType={isBranch ? \"branch\" : \"leaf\"}\r\n parentValue={node.parent?.value}\r\n aria-level={node.depth}\r\n aria-setsize={1}\r\n aria-posinset={1}\r\n onClick={select}\r\n onKeyDown={onKeyDown}\r\n style={{ [treeItemLevelToken]: node.depth }}\r\n {...dragProps}\r\n {...treeItemInteractionProps}\r\n >\r\n <ExplorerTreeItemLayout\r\n isBranch={isBranch}\r\n isOpen={isOpen}\r\n icon={icon}\r\n showChevron={showChevron}\r\n select={select}\r\n className={mergeClasses(classes.treeItemLayout, compactMode ? classes.treeItemLayoutCompact : undefined, isDropTarget && classes.treeItemDropTarget)}\r\n style={isSelected ? { backgroundColor: tokens.colorNeutralBackground1Selected } : undefined}\r\n actions={actions}\r\n aside={{\r\n // Match the gap and padding of the actions.\r\n className: classes.treeItemLayoutAside,\r\n children: aside,\r\n }}\r\n main={{\r\n // Prevent the \"main\" content (the Body1 below) from growing too large and pushing the actions/aside out of view.\r\n className: classes.treeItemLayoutMain,\r\n }}\r\n >\r\n <TruncatingBody1 text={name} />\r\n </ExplorerTreeItemLayout>\r\n </FlatTreeItem>\r\n </MenuTrigger>\r\n <MenuPopover hidden={!hasChildren && contextMenuCommands.length === 0}>\r\n <MenuList>\r\n {hasChildren && (\r\n <>\r\n <MenuItem icon={<ArrowExpandAllRegular />} onClick={expandAll}>\r\n <Body1>Expand All</Body1>\r\n </MenuItem>\r\n <MenuItem icon={<ArrowCollapseAllRegular />} onClick={collapseAll}>\r\n <Body1>Collapse All</Body1>\r\n </MenuItem>\r\n </>\r\n )}\r\n {hasChildren && contextMenuCommands.length > 0 && <MenuDivider />}\r\n {contextMenuItems}\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n );\r\n};\r\n\r\n/**\r\n * A generic, recursive tree explorer.\r\n *\r\n * The Explorer is intentionally product agnostic: it renders whatever hierarchy is described by the\r\n * {@link ExplorerNodeDescription}s returned from `getNodes`, which means nodes of different kinds backed by\r\n * completely unrelated entity types can be arbitrarily nested within each other.\r\n * @param props The props describing the hierarchy to render, the available commands, and the selection state.\r\n * @returns The explorer tree component.\r\n */\r\nexport const Explorer: FunctionComponent<{\r\n /**\r\n * Enumerates the top level nodes of the tree. This is re-invoked whenever the tree needs to be rebuilt\r\n * (e.g. when one of the change observables of the described nodes fires), so it should always reflect\r\n * the current state of the hierarchy. It must be referentially stable (e.g. wrapped in `useCallback`).\r\n */\r\n getNodes: () => readonly ExplorerNodeDescription[];\r\n\r\n /**\r\n * Command providers for nodes that represent an entity.\r\n */\r\n itemCommandProviders: readonly ExplorerCommandProvider<object>[];\r\n\r\n /**\r\n * Command providers for group nodes. The provider context is the group's display name.\r\n */\r\n groupCommandProviders: readonly ExplorerCommandProvider<string, \"contextMenu\">[];\r\n\r\n /**\r\n * The currently selected entity.\r\n */\r\n selectedEntity?: Nullable<object>;\r\n\r\n /**\r\n * Called when the selected entity changes.\r\n */\r\n setSelectedEntity?: (entity: Nullable<object>) => void;\r\n\r\n /**\r\n * The accessible label of the tree.\r\n */\r\n ariaLabel?: string;\r\n}> = (props) => {\r\n const classes = useStyles();\r\n\r\n const { getNodes, itemCommandProviders, groupCommandProviders, selectedEntity = null, ariaLabel = \"Scene Explorer Tree\" } = props;\r\n\r\n const [treeVersion, setTreeVersion] = useState(0);\r\n const tree = useMemo(() => BuildExplorerTree(getNodes()), [getNodes, treeVersion]);\r\n const previousTreeRef = useRef(tree);\r\n const initialRootValues = tree.nodes.filter((node) => node.kind === \"root\").map((node) => node.value);\r\n const initializedRootValues = useRef(new Set(initialRootValues));\r\n const [openItems, setOpenItems] = useState(new Set<TreeItemValue>(initialRootValues));\r\n const scrollViewRef = useRef<ScrollToInterface>(null);\r\n // We only want to scroll to the selected item if it was externally selected (outside of the Explorer).\r\n const previousSelectedEntity = useRef(selectedEntity);\r\n const setSelectedEntity = useCallback(\r\n (entity: Nullable<object>) => {\r\n previousSelectedEntity.current = entity;\r\n props.setSelectedEntity?.(entity);\r\n },\r\n [props.setSelectedEntity]\r\n );\r\n\r\n const [itemsFilter, setItemsFilter] = useState(\"\");\r\n const [isSorted, setIsSorted] = useSetting({ key: \"SceneExplorer/IsSorted\", defaultValue: false });\r\n\r\n // Drag-drop state\r\n const { draggedEntity, dropTarget, dropTargetIsRoot, createDragProps, createGroupDropProps } = useExplorerDragDrop({\r\n onDrop: (draggedEntity, targetEntity) => {\r\n // Expand the target so user can see the dropped item (if not dropping to root)\r\n if (targetEntity) {\r\n setOpenItems((prev) => {\r\n const next = new Set(prev);\r\n for (const node of tree.nodesByEntity.get(targetEntity) ?? []) {\r\n next.add(node.value);\r\n }\r\n return next;\r\n });\r\n }\r\n // Select the dragged entity\r\n setSelectedEntity(draggedEntity);\r\n },\r\n });\r\n\r\n useEffect(() => {\r\n const previousTree = previousTreeRef.current;\r\n previousTreeRef.current = tree;\r\n if (selectedEntity && previousTree?.nodesByEntity.has(selectedEntity) && !tree.nodesByEntity.has(selectedEntity)) {\r\n setSelectedEntity(null);\r\n }\r\n }, [tree, selectedEntity, setSelectedEntity]);\r\n\r\n useEffect(() => {\r\n setOpenItems((currentOpenItems) => {\r\n let updatedOpenItems: Set<TreeItemValue> | undefined;\r\n for (const node of tree.nodes) {\r\n if (node.kind === \"root\" && !initializedRootValues.current.has(node.value)) {\r\n initializedRootValues.current.add(node.value);\r\n updatedOpenItems ??= new Set(currentOpenItems);\r\n updatedOpenItems.add(node.value);\r\n }\r\n }\r\n return updatedOpenItems ?? currentOpenItems;\r\n });\r\n }, [tree]);\r\n\r\n useEffect(() => {\r\n const onItemAdded = () => {\r\n setTreeVersion((version) => version + 1);\r\n };\r\n\r\n const onItemRemoved = (item: object) => {\r\n setTreeVersion((version) => version + 1);\r\n\r\n const itemNodes = tree.nodesByEntity.get(item);\r\n if (itemNodes?.length === 1 && openItems.delete(itemNodes[0].value)) {\r\n setOpenItems(new Set(openItems));\r\n }\r\n };\r\n\r\n const addObservers = tree.changeObservables.added.map((observable) => observable.add(onItemAdded));\r\n const removeObservers = tree.changeObservables.removed.map((observable) => observable.add(onItemRemoved));\r\n const moveObservers = tree.changeObservables.moved.map((observable) => observable.add(onItemAdded));\r\n\r\n return () => {\r\n for (const observer of addObservers) {\r\n observer.remove();\r\n }\r\n for (const observer of removeObservers) {\r\n observer.remove();\r\n }\r\n for (const observer of moveObservers) {\r\n observer.remove();\r\n }\r\n };\r\n }, [tree, openItems]);\r\n\r\n const visibleNodes = useMemo(\r\n () => GetVisibleExplorerNodes(tree.nodes, { openItems, filter: itemsFilter.toLocaleLowerCase(), sortItems: isSorted }),\r\n [tree, openItems, itemsFilter, isSorted]\r\n );\r\n\r\n const selectEntity = useCallback(\r\n (entity: Nullable<object>) => {\r\n if (entity) {\r\n const ancestorValues = GetAncestorValues(tree, entity);\r\n if (ancestorValues.length > 0) {\r\n const newOpenItems = new Set<TreeItemValue>(openItems);\r\n for (const ancestorValue of ancestorValues) {\r\n newOpenItems.add(ancestorValue);\r\n }\r\n setOpenItems(newOpenItems);\r\n }\r\n\r\n if (tree.nodesByEntity.has(entity)) {\r\n setIsScrollToPending(true);\r\n }\r\n }\r\n\r\n previousSelectedEntity.current = entity;\r\n },\r\n [tree, openItems]\r\n );\r\n\r\n const [isScrollToPending, setIsScrollToPending] = useState(false);\r\n\r\n useEffect(() => {\r\n if (selectedEntity && selectedEntity !== previousSelectedEntity.current) {\r\n selectEntity(selectedEntity);\r\n }\r\n }, [selectedEntity, selectEntity]);\r\n\r\n useEffect(() => {\r\n // When the component first mounts, select the currently selected entity to ensure it is visible.\r\n selectEntity(selectedEntity);\r\n }, []);\r\n\r\n // We need to wait for a render to complete before we can scroll to the item, hence the isScrollToPending.\r\n useEffect(() => {\r\n if (isScrollToPending) {\r\n const selectedItemIndex = visibleNodes.findIndex((node) => node.entity === selectedEntity);\r\n if (selectedItemIndex >= 0 && scrollViewRef.current) {\r\n scrollViewRef.current.scrollTo(selectedItemIndex, \"smooth\");\r\n setIsScrollToPending(false);\r\n }\r\n }\r\n }, [isScrollToPending, selectedEntity, visibleNodes]);\r\n\r\n const onOpenChange = useCallback(\r\n (event: TreeOpenChangeEvent, data: TreeOpenChangeData) => {\r\n // This makes it so we only consider a click on the chevron to be expanding/collapsing an item, not clicking anywhere on the item.\r\n if (data.type !== \"Click\" && data.type !== \"Enter\") {\r\n // Shift or Ctrl mean expand/collapse all descendants.\r\n if (event.shiftKey || event.ctrlKey) {\r\n const node = tree.nodesByValue.get(data.value);\r\n if (node) {\r\n ExpandOrCollapseAll(node, data.open, data.openItems);\r\n }\r\n }\r\n setOpenItems(data.openItems);\r\n }\r\n },\r\n [setOpenItems, tree]\r\n );\r\n\r\n const expandAll = (node: ExplorerNode) => {\r\n ExpandOrCollapseAll(node, true, openItems);\r\n setOpenItems(new Set(openItems));\r\n };\r\n\r\n const collapseAll = (node: ExplorerNode) => {\r\n ExpandOrCollapseAll(node, false, openItems);\r\n setOpenItems(new Set(openItems));\r\n };\r\n\r\n return (\r\n <div className={classes.rootDiv}>\r\n <div className={classes.toolbarDiv}>\r\n <SearchBox\r\n className={classes.searchBox}\r\n appearance=\"underline\"\r\n contentBefore={<FilterRegular />}\r\n placeholder=\"Filter\"\r\n value={itemsFilter}\r\n onChange={(_, data) => setItemsFilter(data.value)}\r\n />\r\n <ToggleButton\r\n title=\"Sort Entities Alphabetically\"\r\n appearance=\"transparent\"\r\n checkedIcon={TextSortAscendingRegular}\r\n value={isSorted}\r\n onChange={() => setIsSorted((isSorted) => !isSorted)}\r\n />\r\n </div>\r\n <FlatTree className={classes.tree} openItems={openItems} onOpenChange={onOpenChange} aria-label={ariaLabel}>\r\n <VirtualizerScrollView imperativeRef={scrollViewRef} numItems={visibleNodes.length} itemSize={32} container={{ className: classes.scrollView }}>\r\n {(index: number) => {\r\n const node = visibleNodes[index];\r\n const entity = node.entity;\r\n\r\n if (node.kind === \"root\") {\r\n return (\r\n <RootTreeItem\r\n key={node.value}\r\n node={node}\r\n isSelected={!!entity && selectedEntity === entity}\r\n isOpen={openItems.has(node.value)}\r\n select={entity ? () => setSelectedEntity(entity) : undefined}\r\n isFiltering={!!itemsFilter}\r\n expandAll={() => expandAll(node)}\r\n collapseAll={() => collapseAll(node)}\r\n />\r\n );\r\n } else if (node.kind === \"item\" && entity) {\r\n const getName = () => {\r\n const displayInfo = node.getDisplayInfo();\r\n const name = displayInfo.name;\r\n displayInfo.dispose?.();\r\n return name;\r\n };\r\n const dragProps = createDragProps(entity, getName, node.dragDropConfig);\r\n\r\n return (\r\n <ItemTreeItem\r\n key={node.value}\r\n node={node}\r\n entity={entity}\r\n isSelected={selectedEntity === entity}\r\n select={() => setSelectedEntity(entity)}\r\n isFiltering={!!itemsFilter}\r\n commandProviders={itemCommandProviders}\r\n expandAll={() => expandAll(node)}\r\n collapseAll={() => collapseAll(node)}\r\n isDragging={draggedEntity === entity}\r\n isDropTarget={dropTarget === entity}\r\n isOpen={openItems.has(node.value)}\r\n {...dragProps}\r\n />\r\n );\r\n } else {\r\n return (\r\n <GroupTreeItem\r\n key={node.value}\r\n node={node}\r\n isFiltering={!!itemsFilter}\r\n commandProviders={groupCommandProviders}\r\n expandAll={() => expandAll(node)}\r\n collapseAll={() => collapseAll(node)}\r\n isSelected={!!entity && selectedEntity === entity}\r\n isOpen={openItems.has(node.value)}\r\n select={entity ? () => setSelectedEntity(entity) : undefined}\r\n isDropTarget={dropTargetIsRoot && !!node.dragDropConfig}\r\n {...createGroupDropProps(node.dragDropConfig)}\r\n />\r\n );\r\n }\r\n }}\r\n </VirtualizerScrollView>\r\n </FlatTree>\r\n </div>\r\n );\r\n};\r\n","import { type IDisposable, type IReadonlyObservable, type Nullable } from \"core/index\";\r\n\r\nimport { type ComponentType, type FunctionComponent, useCallback, useEffect, useState } from \"react\";\r\n\r\nimport { type ExplorerCommandProvider, type ExplorerNodeDescription } from \"../../../components/explorer/explorerModel\";\r\nimport { Explorer } from \"../../../components/explorer/explorer\";\r\nimport { GetExplorerNodeChildren, type ExplorerNodeProvider } from \"./explorerService\";\r\nimport { type ISelectionService } from \"../../selectionService\";\r\nimport { type IShellService } from \"shared-ui-components/modularTool/services/shellService\";\r\n\r\nimport { CubeTreeRegular } from \"@fluentui/react-icons\";\r\n\r\nimport { useObservableCollection, useObservableState, useOrderedObservableCollection } from \"shared-ui-components/modularTool/hooks/observableHooks\";\r\nimport { type IReadonlyObservableCollection, ObservableCollection } from \"shared-ui-components/modularTool/misc/observableCollection\";\r\n\r\n/**\r\n * Describes an Explorer side pane, including the services it needs and the hierarchy it displays.\r\n *\r\n * This is intentionally not a service: products (such as the Full/BJS Inspector's Scene Explorer or the\r\n * Babylon Lite engine explorer) own their pane directly and use this to share the common pane plumbing.\r\n * @internal\r\n */\r\nexport type ExplorerPaneOptions = Readonly<{\r\n /**\r\n * The unique key of the side pane.\r\n */\r\n key: string;\r\n\r\n /**\r\n * The title displayed on the side pane.\r\n */\r\n title: string;\r\n\r\n /**\r\n * Gets the root object of the hierarchy (e.g. a Scene for the Full Inspector, or an engine for\r\n * the Babylon Lite Inspector). It is displayed as the root node, and nothing is rendered while\r\n * it is null. This is re-evaluated whenever `onRootChanged` notifies.\r\n */\r\n getRoot: () => Nullable<object>;\r\n\r\n /**\r\n * The name displayed for the root node (e.g. \"Scene\" or \"Engine\").\r\n */\r\n rootLabel: string;\r\n\r\n /**\r\n * An optional icon component to render for the root node.\r\n */\r\n rootIcon?: ComponentType<{ entity: object }>;\r\n\r\n /**\r\n * An optional observable that notifies when the object returned by `getRoot` changes. Products\r\n * with a fixed root (such as the Babylon Lite Inspector, which inspects a single engine for the\r\n * lifetime of the pane) can omit it.\r\n */\r\n onRootChanged?: IReadonlyObservable<unknown>;\r\n\r\n /**\r\n * Enumerates the top level nodes of the hierarchy (excluding the root node, which represents the\r\n * object being inspected and is added automatically). This is re-invoked whenever the Explorer\r\n * rebuilds its tree, so it should always reflect the current state.\r\n */\r\n getNodes: () => readonly ExplorerNodeDescription[];\r\n\r\n /**\r\n * An optional observable that notifies when the set of nodes returned by `getNodes` changes\r\n * (e.g. a new top level node was added). Changes within an already described node are\r\n * communicated through that node's own change observables instead.\r\n */\r\n onNodesChanged?: IReadonlyObservable<void>;\r\n\r\n /**\r\n * Optional providers that contribute nodes beneath compatible entity-backed nodes.\r\n */\r\n nodeProviders?: IReadonlyObservableCollection<ExplorerNodeProvider<object>>;\r\n\r\n /**\r\n * Optional command providers for nodes that represent an entity.\r\n */\r\n itemCommandProviders?: IReadonlyObservableCollection<ExplorerCommandProvider<object>>;\r\n\r\n /**\r\n * Optional command providers for group nodes (the command context is the group's display name).\r\n */\r\n groupCommandProviders?: IReadonlyObservableCollection<ExplorerCommandProvider<string, \"contextMenu\">>;\r\n}>;\r\n\r\n// Rebuilds the tree when the owner reports that its set of top level nodes changed.\r\nfunction useNodesVersion(onNodesChanged: IReadonlyObservable<void> | undefined): number {\r\n const [version, setVersion] = useState(0);\r\n\r\n useEffect(() => {\r\n const observer = onNodesChanged?.add(() => setVersion((version) => version + 1));\r\n\r\n return () => {\r\n observer?.remove();\r\n };\r\n }, [onNodesChanged]);\r\n\r\n return version;\r\n}\r\n\r\nfunction useNodeProvidersVersion(providers: IReadonlyObservableCollection<ExplorerNodeProvider<object>>): number {\r\n const [version, setVersion] = useState(0);\r\n\r\n useEffect(() => {\r\n let providerObservers = providers.items.map((provider) => provider.onChanged?.add(() => setVersion((version) => version + 1)));\r\n const collectionObserver = providers.observable.add(() => {\r\n providerObservers.forEach((observer) => observer?.remove());\r\n providerObservers = providers.items.map((provider) => provider.onChanged?.add(() => setVersion((version) => version + 1)));\r\n });\r\n\r\n return () => {\r\n collectionObserver.remove();\r\n providerObservers.forEach((observer) => observer?.remove());\r\n };\r\n }, [providers]);\r\n\r\n return version;\r\n}\r\n\r\ntype ExplorerPaneProps = Readonly<{\r\n selectionService: ISelectionService;\r\n getRoot: () => Nullable<object>;\r\n rootLabel: string;\r\n rootIcon?: ComponentType<{ entity: object }>;\r\n onRootChanged?: IReadonlyObservable<unknown>;\r\n getNodes: () => readonly ExplorerNodeDescription[];\r\n onNodesChanged?: IReadonlyObservable<void>;\r\n nodeProviders: IReadonlyObservableCollection<ExplorerNodeProvider<object>>;\r\n itemCommandProviders: IReadonlyObservableCollection<ExplorerCommandProvider<object>>;\r\n groupCommandProviders: IReadonlyObservableCollection<ExplorerCommandProvider<string, \"contextMenu\">>;\r\n}>;\r\n\r\nconst ExplorerPane: FunctionComponent<ExplorerPaneProps> = (props) => {\r\n const { selectionService, getRoot, rootLabel, rootIcon, onRootChanged, getNodes, onNodesChanged, nodeProviders, itemCommandProviders, groupCommandProviders } = props;\r\n\r\n const currentNodeProviders = useObservableCollection(nodeProviders);\r\n const itemCommands = useOrderedObservableCollection(itemCommandProviders);\r\n const groupCommands = useOrderedObservableCollection(groupCommandProviders);\r\n const nodesVersion = useNodesVersion(onNodesChanged);\r\n const nodeProvidersVersion = useNodeProvidersVersion(nodeProviders);\r\n const root = useObservableState(\r\n useCallback(() => getRoot(), [getRoot]),\r\n onRootChanged\r\n );\r\n const entity = useObservableState(() => selectionService.selectedEntity, selectionService.onSelectedEntityChanged);\r\n\r\n const getExplorerNodes = useCallback(() => {\r\n if (!root) {\r\n return [];\r\n }\r\n\r\n // The root node represents the object being inspected (e.g. a Scene or an Engine).\r\n const rootNode: ExplorerNodeDescription = {\r\n id: \"root\",\r\n kind: \"root\",\r\n entity: root,\r\n icon: rootIcon,\r\n getDisplayInfo: () => ({ name: rootLabel }),\r\n getChildren: () => GetExplorerNodeChildren(root, getNodes(), currentNodeProviders),\r\n };\r\n\r\n return [rootNode];\r\n }, [rootLabel, rootIcon, getNodes, nodesVersion, nodeProvidersVersion, currentNodeProviders, root]);\r\n\r\n return (\r\n <>\r\n {root && (\r\n <Explorer\r\n getNodes={getExplorerNodes}\r\n itemCommandProviders={itemCommands}\r\n groupCommandProviders={groupCommands}\r\n selectedEntity={entity}\r\n setSelectedEntity={(entity) => (selectionService.selectedEntity = entity)}\r\n />\r\n )}\r\n </>\r\n );\r\n};\r\n\r\n/**\r\n * Registers an Explorer side pane that enables browsing a hierarchy and executing commands on its entities.\r\n * @param shellService The shell service the pane is added to.\r\n * @param selectionService The selection service used to read and update the selected entity.\r\n * @param options Options describing the pane, its root object, and the hierarchy it displays.\r\n * @returns A disposable that removes the pane.\r\n * @internal\r\n */\r\nexport function CreateExplorerPaneRegistration(shellService: IShellService, selectionService: ISelectionService, options: ExplorerPaneOptions): IDisposable {\r\n const { key, title, getRoot, rootLabel, rootIcon, onRootChanged, getNodes, onNodesChanged } = options;\r\n\r\n // These are created once per pane so the identities passed to the hooks below are stable.\r\n const nodeProviders = options.nodeProviders ?? new ObservableCollection<ExplorerNodeProvider<object>>();\r\n const itemCommandProviders = options.itemCommandProviders ?? new ObservableCollection<ExplorerCommandProvider<object>>();\r\n const groupCommandProviders = options.groupCommandProviders ?? new ObservableCollection<ExplorerCommandProvider<string, \"contextMenu\">>();\r\n\r\n return shellService.addSidePane({\r\n key,\r\n title,\r\n icon: CubeTreeRegular,\r\n horizontalLocation: \"left\",\r\n verticalLocation: \"top\",\r\n teachingMoment: false,\r\n keepMounted: true,\r\n content: () => (\r\n <ExplorerPane\r\n selectionService={selectionService}\r\n getRoot={getRoot}\r\n rootLabel={rootLabel}\r\n rootIcon={rootIcon}\r\n onRootChanged={onRootChanged}\r\n getNodes={getNodes}\r\n onNodesChanged={onNodesChanged}\r\n nodeProviders={nodeProviders}\r\n itemCommandProviders={itemCommandProviders}\r\n groupCommandProviders={groupCommandProviders}\r\n />\r\n ),\r\n });\r\n}\r\n","import { Observable } from \"core/Misc/observable\";\r\n\r\nimport { type ExplorerDisplayInfo } from \"../components/explorer/explorerModel\";\r\nimport { type IWatcherService } from \"../services/watcherService\";\r\n\r\n/**\r\n * Creates live Explorer display info for an entity whose name is mutable.\r\n * @param watcherService The service used to observe name changes.\r\n * @param entity The named entity.\r\n * @param getDisplayName Gets the current display name, including any fallback.\r\n * @returns Disposable display info that updates when the entity name changes.\r\n */\r\nexport function CreateWatchedNameDisplayInfo<T extends { name?: string }>(watcherService: IWatcherService, entity: T, getDisplayName: () => string): ExplorerDisplayInfo {\r\n const onChange = new Observable<void>();\r\n const nameWatcher = watcherService.watchProperty(entity, \"name\", () => onChange.notifyObservers());\r\n\r\n return {\r\n get name() {\r\n return getDisplayName();\r\n },\r\n onChange,\r\n dispose: () => {\r\n nameWatcher.dispose();\r\n onChange.clear();\r\n },\r\n };\r\n}\r\n","import { getRenderingContextKind, getRenderingContexts, type EngineContext, type RenderingContext, type SceneContext, type SurfaceContext } from \"@babylonjs/lite\";\r\nimport { tokens } from \"@fluentui/react-components\";\r\nimport { EngineRegular, GlobeRegular, PersonSquareRegular, TextFieldRegular, WindowRegular } from \"@fluentui/react-icons\";\r\nimport { createElement, type ComponentType, type FunctionComponent } from \"react\";\r\n\r\nimport { type IDisposable } from \"core/index\";\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\nimport { type ExplorerDisplayInfo, type ExplorerNodeDescription } from \"../components/explorer/explorerModel\";\r\nimport { type IService, type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\nimport { type IShellService, ShellServiceIdentity } from \"shared-ui-components/modularTool/services/shellService\";\r\nimport { ObservableCollection } from \"shared-ui-components/modularTool/misc/observableCollection\";\r\n\r\nimport { CreateExplorerPaneRegistration } from \"../services/panes/explorer/explorerPane\";\r\nimport { CreateExplorerService, type IExplorerService, ExplorerServiceIdentity } from \"../services/panes/explorer/explorerService\";\r\nimport { type ISelectionService, SelectionServiceIdentity } from \"../services/selectionService\";\r\nimport { type IWatcherService, WatcherServiceIdentity } from \"../services/watcherService\";\r\nimport { type IEngineContext, EngineContextIdentity } from \"./engineContext\";\r\nimport { CreateWatchedNameDisplayInfo } from \"./explorerDisplayInfo\";\r\n\r\n/**\r\n * The unique identity symbol for the Babylon Lite engine explorer service.\r\n * @experimental\r\n */\r\nexport const EngineExplorerServiceIdentity = Symbol(\"EngineExplorer\");\r\n\r\n/**\r\n * Contributes child nodes beneath a compatible Babylon Lite rendering context.\r\n * @experimental\r\n */\r\nexport type RenderingContextNodeProvider<T extends RenderingContext> = Readonly<{\r\n /** Controls this provider's position relative to other providers. */\r\n order?: number;\r\n /** Returns whether this provider supports the rendering context. */\r\n predicate: (context: RenderingContext) => context is T;\r\n /** Gets the Explorer nodes contributed beneath the rendering context. */\r\n getNodes: (context: T) => readonly ExplorerNodeDescription[];\r\n /** Gets the object identities used to detect changes in the contributed nodes. */\r\n getSnapshot: (context: T) => readonly object[];\r\n}>;\r\n\r\n/**\r\n * Overrides presentation for a Babylon Lite rendering context node.\r\n * @experimental\r\n */\r\nexport type RenderingContextPresentation<T extends RenderingContext = RenderingContext> = Readonly<{\r\n /** Gets display information for the rendering context node. */\r\n getDisplayInfo?: () => ExplorerDisplayInfo;\r\n /** Overrides the icon rendered for the node. The icon receives the Rendering Context subtype matched by the provider. */\r\n icon?: ComponentType<{ entity: T }>;\r\n}>;\r\n\r\n/**\r\n * Contributes presentation for a compatible Babylon Lite rendering context.\r\n * @experimental\r\n */\r\nexport type RenderingContextPresentationProvider<T extends RenderingContext> = Readonly<{\r\n /** Returns whether this provider supports the rendering context. */\r\n predicate: (context: RenderingContext) => context is T;\r\n /** Gets partial presentation that overrides the built-in rendering context presentation. */\r\n getPresentation: (context: T) => RenderingContextPresentation<T>;\r\n}>;\r\n\r\n/**\r\n * Allows product-specific services to contribute hierarchy beneath Babylon Lite rendering contexts.\r\n * @experimental\r\n */\r\nexport interface IEngineExplorerService extends IService<typeof EngineExplorerServiceIdentity> {\r\n /**\r\n * Adds a provider that contributes child nodes beneath compatible rendering contexts.\r\n * @param provider The node provider to add.\r\n * @returns A disposable that removes the provider.\r\n */\r\n addRenderingContextNodeProvider<T extends RenderingContext>(provider: RenderingContextNodeProvider<T>): IDisposable;\r\n\r\n /**\r\n * Adds a provider that controls how compatible rendering context nodes are presented.\r\n * The last registered matching provider takes precedence.\r\n * @param provider The presentation provider to add.\r\n * @returns A disposable that removes the provider.\r\n */\r\n addRenderingContextPresentationProvider<T extends RenderingContext>(provider: RenderingContextPresentationProvider<T>): IDisposable;\r\n}\r\n\r\ntype UntypedRenderingContextNodeProvider = RenderingContextNodeProvider<RenderingContext>;\r\ntype UntypedRenderingContextPresentationProvider = Readonly<{\r\n predicate: (context: RenderingContext) => boolean;\r\n getPresentation: (context: RenderingContext) => Partial<Pick<ExplorerNodeDescription, \"getDisplayInfo\" | \"icon\">>;\r\n}>;\r\n\r\nfunction UntypeRenderingContextNodeProvider<T extends RenderingContext>(provider: RenderingContextNodeProvider<T>): UntypedRenderingContextNodeProvider {\r\n return {\r\n order: provider.order,\r\n predicate: (context): context is RenderingContext => provider.predicate(context),\r\n getNodes: (context) => (provider.predicate(context) ? provider.getNodes(context) : []),\r\n getSnapshot: (context) => (provider.predicate(context) ? provider.getSnapshot(context) : []),\r\n };\r\n}\r\n\r\n// The predicate validates the subtype before the presentation is requested. Wrapping the icon then\r\n// preserves its typed context without casting it to the generic Explorer icon contract, which accepts any object.\r\nfunction UntypeRenderingContextPresentationProvider<T extends RenderingContext>(provider: RenderingContextPresentationProvider<T>): UntypedRenderingContextPresentationProvider {\r\n return {\r\n predicate: provider.predicate,\r\n getPresentation: (context) => {\r\n if (!provider.predicate(context)) {\r\n return {};\r\n }\r\n\r\n const presentation = provider.getPresentation(context);\r\n const iconComponent = presentation.icon;\r\n return {\r\n ...(presentation.getDisplayInfo ? { getDisplayInfo: presentation.getDisplayInfo } : {}),\r\n ...(\"icon\" in presentation ? { icon: iconComponent ? () => createElement(iconComponent, { entity: context }) : undefined } : {}),\r\n };\r\n },\r\n };\r\n}\r\n\r\nconst RenderingContextDisplayNames = new Map<string, string>([\r\n [\"scene\", \"Scene\"],\r\n [\"frame-graph-context\", \"Frame Graph\"],\r\n [\"effect-renderer\", \"Effect Renderer\"],\r\n [\"sprite-renderer\", \"Sprite Renderer\"],\r\n [\"text-renderer\", \"Text Renderer\"],\r\n]);\r\n\r\nconst EngineIcon: FunctionComponent = () => <EngineRegular />;\r\nconst SceneIcon: FunctionComponent = () => <GlobeRegular />;\r\nconst SpriteRendererIcon: FunctionComponent = () => <PersonSquareRegular color={tokens.colorPalettePeachForeground2} />;\r\nconst TextRendererIcon: FunctionComponent = () => <TextFieldRegular />;\r\nconst SurfaceIcon: FunctionComponent = () => <WindowRegular />;\r\n\r\nconst NodeIds = new WeakMap<object, number>();\r\nlet NextNodeId = 0;\r\n\r\nfunction GetNodeId(context: object): string {\r\n let id = NodeIds.get(context);\r\n if (id === undefined) {\r\n id = NextNodeId++;\r\n NodeIds.set(context, id);\r\n }\r\n return id.toString();\r\n}\r\n\r\ntype ProviderTopologySnapshot = Readonly<{\r\n provider: UntypedRenderingContextNodeProvider;\r\n entities: readonly object[];\r\n}>;\r\n\r\ntype RenderingContextTopologySnapshot = Readonly<{\r\n context: RenderingContext;\r\n providers: readonly ProviderTopologySnapshot[];\r\n}>;\r\n\r\ntype SurfaceTopologySnapshot = Readonly<{\r\n readonly surface: SurfaceContext;\r\n readonly renderingContexts: readonly RenderingContextTopologySnapshot[];\r\n}>;\r\n\r\ntype TopologySnapshot = readonly SurfaceTopologySnapshot[];\r\n\r\nfunction AreTopologySnapshotsEqual(left: TopologySnapshot, right: TopologySnapshot): boolean {\r\n if (left.length !== right.length) {\r\n return false;\r\n }\r\n\r\n for (let surfaceIndex = 0; surfaceIndex < left.length; surfaceIndex++) {\r\n const leftSurface = left[surfaceIndex];\r\n const rightSurface = right[surfaceIndex];\r\n if (leftSurface.surface !== rightSurface.surface || leftSurface.renderingContexts.length !== rightSurface.renderingContexts.length) {\r\n return false;\r\n }\r\n\r\n for (let contextIndex = 0; contextIndex < leftSurface.renderingContexts.length; contextIndex++) {\r\n const leftContext = leftSurface.renderingContexts[contextIndex];\r\n const rightContext = rightSurface.renderingContexts[contextIndex];\r\n if (leftContext.context !== rightContext.context || leftContext.providers.length !== rightContext.providers.length) {\r\n return false;\r\n }\r\n\r\n for (let providerIndex = 0; providerIndex < leftContext.providers.length; providerIndex++) {\r\n const leftProvider = leftContext.providers[providerIndex];\r\n const rightProvider = rightContext.providers[providerIndex];\r\n if (leftProvider.provider !== rightProvider.provider || leftProvider.entities.length !== rightProvider.entities.length) {\r\n return false;\r\n }\r\n\r\n for (let entityIndex = 0; entityIndex < leftProvider.entities.length; entityIndex++) {\r\n if (leftProvider.entities[entityIndex] !== rightProvider.entities[entityIndex]) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction GetBuiltInRenderingContextDisplayName(context: RenderingContext): string {\r\n const kind = getRenderingContextKind(context);\r\n if (kind === \"scene\") {\r\n return (context as SceneContext).name || \"Scene\";\r\n }\r\n return RenderingContextDisplayNames.get(kind) ?? kind;\r\n}\r\n\r\nfunction GetBuiltInRenderingContextIcon(context: RenderingContext): FunctionComponent | undefined {\r\n switch (getRenderingContextKind(context)) {\r\n case \"scene\":\r\n return SceneIcon;\r\n case \"sprite-renderer\":\r\n return SpriteRendererIcon;\r\n case \"text-renderer\":\r\n return TextRendererIcon;\r\n default:\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction GetApplicableProviders(context: RenderingContext, providers: readonly UntypedRenderingContextNodeProvider[]): readonly UntypedRenderingContextNodeProvider[] {\r\n return providers.filter((provider) => provider.predicate(context)).sort((left, right) => (left.order ?? 0) - (right.order ?? 0));\r\n}\r\n\r\n// Presentation resolution is runtime behavior rather than type adaptation: start with a generic fallback,\r\n// apply the known built-in presentation, then let the last registered matching provider partially override it.\r\nfunction GetRenderingContextPresentation(\r\n context: RenderingContext,\r\n watcherService: IWatcherService,\r\n providers: readonly UntypedRenderingContextPresentationProvider[]\r\n): Required<Pick<ExplorerNodeDescription, \"getDisplayInfo\">> & Pick<ExplorerNodeDescription, \"icon\"> {\r\n const isScene = getRenderingContextKind(context) === \"scene\";\r\n const fallbackPresentation = {\r\n getDisplayInfo: () => ({ name: getRenderingContextKind(context) }),\r\n icon: undefined,\r\n };\r\n const builtInPresentation = {\r\n getDisplayInfo: () =>\r\n isScene\r\n ? CreateWatchedNameDisplayInfo(watcherService, context as SceneContext, () => GetBuiltInRenderingContextDisplayName(context))\r\n : { name: GetBuiltInRenderingContextDisplayName(context) },\r\n icon: GetBuiltInRenderingContextIcon(context),\r\n };\r\n let provider: UntypedRenderingContextPresentationProvider | undefined;\r\n for (let index = providers.length - 1; index >= 0; index--) {\r\n if (providers[index].predicate(context)) {\r\n provider = providers[index];\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n ...fallbackPresentation,\r\n ...builtInPresentation,\r\n ...provider?.getPresentation(context),\r\n };\r\n}\r\n\r\nfunction CreateRenderingContextNode(\r\n context: RenderingContext,\r\n watcherService: IWatcherService,\r\n presentationProviders: readonly UntypedRenderingContextPresentationProvider[]\r\n): ExplorerNodeDescription {\r\n const presentation = GetRenderingContextPresentation(context, watcherService, presentationProviders);\r\n return {\r\n id: `rendering-context-${GetNodeId(context)}`,\r\n kind: \"item\",\r\n entity: context,\r\n ...presentation,\r\n };\r\n}\r\n\r\nfunction CreateSurfaceNode(\r\n engine: EngineContext,\r\n surface: SurfaceContext,\r\n watcherService: IWatcherService,\r\n presentationProviders: readonly UntypedRenderingContextPresentationProvider[]\r\n): ExplorerNodeDescription {\r\n return {\r\n id: `surface-${GetNodeId(surface)}`,\r\n kind: \"item\",\r\n entity: surface,\r\n icon: SurfaceIcon,\r\n getDisplayInfo: () => ({ name: `Surface ${engine.surfaces.indexOf(surface) + 1}` }),\r\n getChildren: () => getRenderingContexts(surface).map((context) => CreateRenderingContextNode(context, watcherService, presentationProviders)),\r\n };\r\n}\r\n\r\nfunction CreateEngineNodes(\r\n engine: EngineContext,\r\n watcherService: IWatcherService,\r\n presentationProviders: readonly UntypedRenderingContextPresentationProvider[]\r\n): readonly ExplorerNodeDescription[] {\r\n // The engine itself is the primary surface, and it is already represented by the Explorer root node,\r\n // so its rendering contexts are contributed as children of the root.\r\n const nodes: ExplorerNodeDescription[] = getRenderingContexts(engine).map((context) => CreateRenderingContextNode(context, watcherService, presentationProviders));\r\n\r\n if (engine.surfaces.length > 1) {\r\n nodes.push({\r\n id: \"auxiliary-surfaces\",\r\n kind: \"group\",\r\n getDisplayInfo: () => ({ name: \"Auxiliary Surfaces\" }),\r\n getChildren: () => engine.surfaces.slice(1).map((surface) => CreateSurfaceNode(engine, surface, watcherService, presentationProviders)),\r\n });\r\n }\r\n\r\n return nodes;\r\n}\r\n\r\n/**\r\n * Owns the \"Explorer\" pane of the Babylon Lite Inspector, which displays the engine hierarchy\r\n * (rendering contexts of the primary surface, and any auxiliary surfaces and their contexts).\r\n */\r\nexport const EngineExplorerServiceDefinition: ServiceDefinition<[IEngineExplorerService, IExplorerService], [IEngineContext, IShellService, ISelectionService, IWatcherService]> = {\r\n friendlyName: \"Babylon Lite Engine Explorer\",\r\n produces: [EngineExplorerServiceIdentity, ExplorerServiceIdentity],\r\n consumes: [EngineContextIdentity, ShellServiceIdentity, SelectionServiceIdentity, WatcherServiceIdentity],\r\n factory: (engineContext, shellService, selectionService, watcherService) => {\r\n const engine = engineContext.engine;\r\n const nodeProviders = new ObservableCollection<UntypedRenderingContextNodeProvider>();\r\n const presentationProviders = new ObservableCollection<UntypedRenderingContextPresentationProvider>();\r\n const explorerService = CreateExplorerService();\r\n const isRenderingContext = (entity: object): entity is RenderingContext =>\r\n engine.surfaces.some((surface) => getRenderingContexts(surface).includes(entity as RenderingContext));\r\n const getTopologySnapshot = (): TopologySnapshot =>\r\n engine.surfaces.map((surface) => ({\r\n surface,\r\n renderingContexts: getRenderingContexts(surface).map((context) => ({\r\n context,\r\n providers: GetApplicableProviders(context, nodeProviders.items).map((provider) => ({\r\n provider,\r\n entities: [...provider.getSnapshot(context)],\r\n })),\r\n })),\r\n }));\r\n\r\n const onNodesChanged = new Observable<void>();\r\n const paneRegistration = CreateExplorerPaneRegistration(shellService, selectionService, {\r\n key: \"Explorer\",\r\n title: \"Explorer\",\r\n getRoot: () => engine,\r\n rootLabel: \"Engine\",\r\n rootIcon: EngineIcon,\r\n getNodes: () => CreateEngineNodes(engine, watcherService, presentationProviders.items),\r\n onNodesChanged,\r\n nodeProviders: explorerService.nodeProviders,\r\n itemCommandProviders: explorerService.itemCommandProviders,\r\n groupCommandProviders: explorerService.groupCommandProviders,\r\n });\r\n\r\n const topologyWatcher = watcherService.watchValue(getTopologySnapshot, () => onNodesChanged.notifyObservers(), AreTopologySnapshotsEqual);\r\n const nodeProvidersObserver = nodeProviders.observable.add(() => onNodesChanged.notifyObservers());\r\n const presentationProvidersObserver = presentationProviders.observable.add(() => onNodesChanged.notifyObservers());\r\n\r\n // Lite keeps its rendering-context vocabulary while adapting hierarchy and commands onto the generic\r\n // entity-attached service. Structural groups such as \"Auxiliary Surfaces\" remain adapter-owned Explorer groups.\r\n return {\r\n addRenderingContextNodeProvider: (provider) => {\r\n const untypedProvider = UntypeRenderingContextNodeProvider(provider);\r\n const topologyRegistration = nodeProviders.add(untypedProvider);\r\n const explorerRegistration = explorerService.addNodeProvider({\r\n order: provider.order,\r\n predicate: (parent): parent is RenderingContext =>\r\n typeof parent === \"object\" && parent !== null && isRenderingContext(parent) && untypedProvider.predicate(parent),\r\n getNodes: untypedProvider.getNodes,\r\n });\r\n let isRegistered = true;\r\n return {\r\n dispose: () => {\r\n if (!isRegistered) {\r\n return;\r\n }\r\n\r\n isRegistered = false;\r\n topologyRegistration.dispose();\r\n explorerRegistration.dispose();\r\n },\r\n };\r\n },\r\n addRenderingContextPresentationProvider: (provider) => presentationProviders.add(UntypeRenderingContextPresentationProvider(provider)),\r\n addNodeProvider: explorerService.addNodeProvider,\r\n addItemCommand: explorerService.addItemCommand,\r\n addGroupCommand: explorerService.addGroupCommand,\r\n dispose: () => {\r\n nodeProvidersObserver.remove();\r\n presentationProvidersObserver.remove();\r\n topologyWatcher.dispose();\r\n paneRegistration.dispose();\r\n nodeProviders.dispose();\r\n presentationProviders.dispose();\r\n explorerService.dispose();\r\n onNodesChanged.clear();\r\n },\r\n };\r\n },\r\n};\r\n","import { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { type ISelectionService, SelectionServiceIdentity } from \"../services/selectionService\";\r\nimport { type IEngineContext, EngineContextIdentity } from \"./engineContext\";\r\n\r\n/**\r\n * Selects the engine by default when the Babylon Lite Inspector starts.\r\n *\r\n * The selection service itself is product agnostic (it starts with no selection), so this Babylon Lite\r\n * specific service owns the notion of \"the engine is what is selected when nothing else is\". It does not\r\n * produce a service contract: it only wires the engine context to the selection service at startup.\r\n */\r\nexport const EngineSelectionServiceDefinition: ServiceDefinition<[], [IEngineContext, ISelectionService]> = {\r\n friendlyName: \"Babylon Lite Engine Selection\",\r\n consumes: [EngineContextIdentity, SelectionServiceIdentity],\r\n factory: (engineContext, selectionService) => {\r\n // Only set the default selection if nothing was deliberately selected before this service was created.\r\n if (!selectionService.selectedEntity) {\r\n selectionService.selectedEntity = engineContext.engine;\r\n }\r\n },\r\n};\r\n","import { useCallback } from \"react\";\r\n\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { Quaternion, Vector3 } from \"core/Maths/math.vector\";\r\nimport { useInterceptObservable } from \"./instrumentationHooks\";\r\nimport { useObservableState } from \"shared-ui-components/modularTool/hooks/observableHooks\";\r\n\r\ntype PropertyKeys<TargetT, PropertyT> = { [PropertyKeyT in keyof TargetT]: TargetT[PropertyKeyT] extends PropertyT | null | undefined ? PropertyKeyT : never }[keyof TargetT];\r\n\r\nexport function useProperty<TargetT extends object, PropertyKeyT extends keyof TargetT>(target: TargetT, propertyKey: PropertyKeyT): TargetT[PropertyKeyT];\r\nexport function useProperty<TargetT extends object, PropertyKeyT extends keyof TargetT>(\r\n target: TargetT | null | undefined,\r\n propertyKey: PropertyKeyT\r\n): TargetT[PropertyKeyT] | undefined;\r\n/**\r\n * Translates a property value to react state, updating the state whenever the property changes.\r\n * @param target The object containing the property to observe.\r\n * @param propertyKey The key of the property to observe.\r\n * @returns The current value of the property, or null if the target is null or undefined.\r\n */\r\nexport function useProperty<TargetT extends object, PropertyKeyT extends keyof TargetT>(target: TargetT | null | undefined, propertyKey: PropertyKeyT) {\r\n return useObservableState(\r\n useCallback(() => (target ? target[propertyKey] : undefined), [target, propertyKey]),\r\n useInterceptObservable(\"property\", target, propertyKey)\r\n );\r\n}\r\n\r\nexport function useVector3Property<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Vector3>>(target: TargetT, propertyKey: PropertyKeyT): TargetT[PropertyKeyT];\r\nexport function useVector3Property<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Vector3>>(\r\n target: TargetT | null | undefined,\r\n propertyKey: PropertyKeyT\r\n): TargetT[PropertyKeyT] | undefined;\r\n/**\r\n * Translates a Vector3 property value to react state, updating the state whenever the property changes or when the x/y/z components of the Vector3 change.\r\n * @param target The object containing the property to observe.\r\n * @param propertyKey The key of the property to observe.\r\n * @returns The current value of the property, or null if the target is null or undefined.\r\n */\r\nexport function useVector3Property<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Vector3>>(target: TargetT | null | undefined, propertyKey: PropertyKeyT) {\r\n const vector = useProperty(target, propertyKey);\r\n useProperty(vector as Vector3 | null | undefined, \"_x\");\r\n useProperty(vector as Vector3 | null | undefined, \"_y\");\r\n useProperty(vector as Vector3 | null | undefined, \"_z\");\r\n return vector;\r\n}\r\n\r\nexport function useColor3Property<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Color3>>(target: TargetT, propertyKey: PropertyKeyT): TargetT[PropertyKeyT];\r\nexport function useColor3Property<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Color3>>(\r\n target: TargetT | null | undefined,\r\n propertyKey: PropertyKeyT\r\n): TargetT[PropertyKeyT] | undefined;\r\n/**\r\n * Translates a Color3 property value to react state, updating the state whenever the property changes or when the r/g/b components of the Color3 change.\r\n * @param target The object containing the property to observe.\r\n * @param propertyKey The key of the property to observe.\r\n * @returns The current value of the property, or null if the target is null or undefined.\r\n */\r\nexport function useColor3Property<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Color3>>(target: TargetT | null | undefined, propertyKey: PropertyKeyT) {\r\n const color = useProperty(target, propertyKey);\r\n useProperty(color as Color3 | null | undefined, \"r\");\r\n useProperty(color as Color3 | null | undefined, \"g\");\r\n useProperty(color as Color3 | null | undefined, \"b\");\r\n return color;\r\n}\r\n\r\nexport function useColor4Property<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Color4>>(target: TargetT, propertyKey: PropertyKeyT): TargetT[PropertyKeyT];\r\nexport function useColor4Property<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Color4>>(\r\n target: TargetT | null | undefined,\r\n propertyKey: PropertyKeyT\r\n): TargetT[PropertyKeyT] | null;\r\n/**\r\n * Translates a Color4 property value to react state, updating the state whenever the property changes or when the r/g/b components of the Color4 change.\r\n * @param target The object containing the property to observe.\r\n * @param propertyKey The key of the property to observe.\r\n * @returns The current value of the property, or null if the target is null or undefined.\r\n */\r\nexport function useColor4Property<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Color4>>(target: TargetT | null | undefined, propertyKey: PropertyKeyT) {\r\n const color = useProperty(target, propertyKey);\r\n useProperty(color as Color3 | null | undefined, \"r\");\r\n useProperty(color as Color3 | null | undefined, \"g\");\r\n useProperty(color as Color3 | null | undefined, \"b\");\r\n useProperty(color as Color4 | null | undefined, \"a\");\r\n return color;\r\n}\r\n\r\nexport function useQuaternionProperty<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Quaternion>>(\r\n target: TargetT,\r\n propertyKey: PropertyKeyT\r\n): TargetT[PropertyKeyT];\r\nexport function useQuaternionProperty<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Quaternion>>(\r\n target: TargetT | null | undefined,\r\n propertyKey: PropertyKeyT\r\n): TargetT[PropertyKeyT] | undefined;\r\n/**\r\n * Translates a Quaternion property value to react state, updating the state whenever the property changes or when the x/y/z/w components of the Quaternion change.\r\n * @param target The object containing the property to observe.\r\n * @param propertyKey The key of the property to observe.\r\n * @returns The current value of the property, or null if the target is null or undefined.\r\n */\r\nexport function useQuaternionProperty<TargetT extends object, PropertyKeyT extends PropertyKeys<TargetT, Quaternion>>(\r\n target: TargetT | null | undefined,\r\n propertyKey: PropertyKeyT\r\n) {\r\n const quaternion = useProperty(target, propertyKey);\r\n useProperty(quaternion as Quaternion | null | undefined, \"_x\");\r\n useProperty(quaternion as Quaternion | null | undefined, \"_y\");\r\n useProperty(quaternion as Quaternion | null | undefined, \"_z\");\r\n useProperty(quaternion as Quaternion | null | undefined, \"_w\");\r\n\r\n return quaternion;\r\n}\r\n\r\n/**\r\n * Creates a hook for a concrete value. For example, if the value is a Vector3,\r\n * it will return a hook that can intercept a change to the Vector3 property or\r\n * any of its components (x, y, z).\r\n * @param value The current value of a property that will be hooked.\r\n * @returns A hook function that can be used to observe changes to the property.\r\n */\r\nexport function MakePropertyHook(value: unknown) {\r\n if (value instanceof Vector3) {\r\n return useVector3Property;\r\n } else if (value instanceof Quaternion) {\r\n return useQuaternionProperty;\r\n } else if (value instanceof Color3) {\r\n return useColor3Property;\r\n } else if (value instanceof Color4) {\r\n return useColor4Property;\r\n } else {\r\n return useProperty;\r\n }\r\n}\r\n","import { getClassNameWithNamespace } from \"shared-ui-components/copyCommandToClipboard\";\r\n\r\n/**\r\n * Generates a string representation of a value for clipboard copy.\r\n * Handles primitives, vectors, colors, quaternions, and other Babylon.js types.\r\n * @param value - The value to convert to a string\r\n * @returns A string that can be used to recreate the value\r\n */\r\nexport function GenerateCopyString(value: unknown): string {\r\n if (value === null) {\r\n return \"null\";\r\n }\r\n if (value === undefined) {\r\n return \"undefined\";\r\n }\r\n\r\n // Primitives\r\n if (typeof value === \"string\") {\r\n return `\"${value}\"`;\r\n }\r\n if (typeof value === \"number\" || typeof value === \"boolean\") {\r\n return String(value);\r\n }\r\n\r\n // Objects with getClassName (Babylon types like Vector3, Color3, Quaternion, etc.)\r\n if (typeof value === \"object\" && value !== null) {\r\n const obj = value as Record<string, unknown>;\r\n\r\n // Check for Babylon.js types with getClassName\r\n if (typeof obj.getClassName === \"function\") {\r\n const className = obj.getClassName() as string;\r\n const { babylonNamespace } = getClassNameWithNamespace(value);\r\n\r\n // Vector2, Vector3, Vector4\r\n if (className === \"Vector2\") {\r\n return `new ${babylonNamespace}Vector2(${obj.x}, ${obj.y})`;\r\n }\r\n if (className === \"Vector3\") {\r\n return `new ${babylonNamespace}Vector3(${obj.x}, ${obj.y}, ${obj.z})`;\r\n }\r\n if (className === \"Vector4\") {\r\n return `new ${babylonNamespace}Vector4(${obj.x}, ${obj.y}, ${obj.z}, ${obj.w})`;\r\n }\r\n\r\n // Quaternion\r\n if (className === \"Quaternion\") {\r\n return `new ${babylonNamespace}Quaternion(${obj.x}, ${obj.y}, ${obj.z}, ${obj.w})`;\r\n }\r\n\r\n // Color3, Color4 — HEX is a direct 0-1→0-255 conversion of the stored values (property-space)\r\n if (className === \"Color3\") {\r\n const hexString = ColorToHex(obj.r as number, obj.g as number, obj.b as number, 1);\r\n return `new ${babylonNamespace}Color3(${obj.r}, ${obj.g}, ${obj.b}) // (HEX: ${hexString})`;\r\n }\r\n if (className === \"Color4\") {\r\n const hexString = ColorToHex(obj.r as number, obj.g as number, obj.b as number, obj.a as number);\r\n return `new ${babylonNamespace}Color4(${obj.r}, ${obj.g}, ${obj.b}, ${obj.a}) // (HEX: ${hexString})`;\r\n }\r\n\r\n // Matrix - output as array\r\n if (className === \"Matrix\" && typeof obj.toArray === \"function\") {\r\n const arr = obj.toArray() as number[];\r\n return `${babylonNamespace}Matrix.FromArray([${arr.join(\", \")}])`;\r\n }\r\n\r\n // For other Babylon types with a name property (like nodes, materials, etc.)\r\n if (typeof obj.name === \"string\") {\r\n return `\"${obj.name}\"`;\r\n }\r\n\r\n // Fallback: use className\r\n return `[${className}]`;\r\n }\r\n\r\n // Plain objects or arrays\r\n if (Array.isArray(value)) {\r\n return `[${value.map(GenerateCopyString).join(\", \")}]`;\r\n }\r\n\r\n // Fallback for other objects\r\n return JSON.stringify(value);\r\n }\r\n\r\n return String(value);\r\n}\r\n\r\n/**\r\n * Converts color component values (0-1) directly to a hex string.\r\n * No gamma correction is applied — the hex represents the property's stored color space.\r\n * @param r - Red component (0-1)\r\n * @param g - Green component (0-1)\r\n * @param b - Blue component (0-1)\r\n * @param a - Alpha component (0-1)\r\n * @returns Hex string in format #RRGGBBAA\r\n */\r\nfunction ColorToHex(r: number, g: number, b: number, a: number): string {\r\n const toByte = (c: number) => Math.round(Math.min(255, Math.max(0, c * 255)));\r\n const rHex = toByte(r).toString(16).padStart(2, \"0\").toUpperCase();\r\n const gHex = toByte(g).toString(16).padStart(2, \"0\").toUpperCase();\r\n const bHex = toByte(b).toString(16).padStart(2, \"0\").toUpperCase();\r\n const aHex = toByte(a).toString(16).padStart(2, \"0\").toUpperCase();\r\n return `#${rHex}${gHex}${bHex}${aHex}`;\r\n}\r\n","import { type ComponentProps, type ComponentType, forwardRef, useMemo } from \"react\";\r\n\r\nimport { ErrorBoundary } from \"shared-ui-components/modularTool/components/errorBoundary\";\r\nimport { usePropertyChangedNotifier } from \"../../contexts/propertyContext\";\r\nimport { useWatchedValue } from \"../../contexts/watcherContext\";\r\nimport { MakePropertyHook, useProperty } from \"../../hooks/compoundPropertyHooks\";\r\nimport { GetPropertyDescriptor } from \"../../instrumentation/propertyInstrumentation\";\r\nimport { getClassNameWithNamespace } from \"shared-ui-components/copyCommandToClipboard\";\r\nimport { GenerateCopyString } from \"./generateCopyString\";\r\n\r\n/**\r\n * Helper type to check if a type includes null or undefined\r\n */\r\ntype IsNullable<T> = null extends T ? true : undefined extends T ? true : false;\r\n\r\n/**\r\n * Base props for BoundProperty\r\n */\r\ntype BaseBoundPropertyProps<TargetT extends object, PropertyKeyT extends keyof TargetT, ComponentT extends ComponentType<any>> = Omit<\r\n ComponentProps<ComponentT>,\r\n \"value\" | \"onChange\" | \"nullable\" | \"defaultValue\" | \"ignoreNullable\"\r\n> & {\r\n component: ComponentT;\r\n target: TargetT | null | undefined;\r\n propertyKey: PropertyKeyT;\r\n /** Optional propertyPath used to generate the copyString if path to property is not equal to entity.target */\r\n propertyPath?: string;\r\n convertTo?: (value: TargetT[PropertyKeyT]) => TargetT[PropertyKeyT];\r\n convertFrom?: (value: TargetT[PropertyKeyT]) => TargetT[PropertyKeyT];\r\n};\r\n\r\n/**\r\n * Enhanced BoundProperty props that enforces strict nullable handling\r\n */\r\nexport type BoundPropertyProps<TargetT extends object, PropertyKeyT extends keyof TargetT, ComponentT extends ComponentType<any>> = BaseBoundPropertyProps<\r\n TargetT,\r\n PropertyKeyT,\r\n ComponentT\r\n> &\r\n (IsNullable<TargetT[PropertyKeyT]> extends true\r\n ? // Pass null explicitly to skip nullable handling entirely - value passes through as-is\r\n | {\r\n defaultValue: null;\r\n nullable?: never;\r\n ignoreNullable?: never;\r\n }\r\n | (ComponentProps<ComponentT> extends { nullable?: boolean }\r\n ? // Component supports nullable UI and thus requires a defaultValue to be sent with nullable = {true}\r\n | {\r\n nullable: true;\r\n defaultValue: NonNullable<TargetT[PropertyKeyT]>;\r\n ignoreNullable?: never;\r\n }\r\n | {\r\n ignoreNullable: true;\r\n defaultValue: NonNullable<TargetT[PropertyKeyT]>;\r\n nullable?: never;\r\n }\r\n : // Component doesn't support nullable UI - only allow defaultValue: null\r\n never)\r\n : {});\r\n\r\nfunction BoundPropertyCoreImpl<TargetT extends object, PropertyKeyT extends keyof TargetT, ComponentT extends ComponentType<any>>(\r\n props: Omit<BoundPropertyProps<TargetT, PropertyKeyT, ComponentT>, \"target\"> & { target: TargetT },\r\n ref?: any\r\n) {\r\n const { target, propertyKey } = props;\r\n\r\n // Get the value of the property. If it changes, it will cause a re-render, which is needed to\r\n // re-evaluate which specific hook will catch all the nested property changes we want to observe.\r\n const value = useProperty(target, propertyKey);\r\n\r\n // Determine which specific property hook to use based on the value's type.\r\n const useSpecificProperty = useMemo(() => MakePropertyHook(value), [value]);\r\n\r\n const notifyPropertyChanged = usePropertyChangedNotifier();\r\n\r\n // Create an inline nested component that changes when the desired specific hook type changes (since hooks can't be conditional).\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const SpecificComponent = useMemo(() => {\r\n return (props: ComponentProps<ComponentT>) => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const { target, propertyKey, propertyPath, convertTo, convertFrom, component: Component, ...rest } = props;\r\n\r\n // Hook the property, using the specific hook that also catches changes to nested properties as well (like x/y/z on a Vector3 for example).\r\n const value = useSpecificProperty(target, propertyKey);\r\n const convertedValue = convertTo ? convertTo(value) : value;\r\n\r\n const onChange = useMemo(() => {\r\n const propertyDescriptor = GetPropertyDescriptor(target, propertyKey)?.[1];\r\n if ((propertyDescriptor && (propertyDescriptor.set || propertyDescriptor.writable)) || (!propertyDescriptor && Object.isExtensible(target))) {\r\n return (val: TargetT[PropertyKeyT]) => {\r\n const oldValue = target[propertyKey];\r\n const newValue = convertFrom ? convertFrom(val) : val;\r\n target[propertyKey] = newValue;\r\n notifyPropertyChanged(target, propertyKey, oldValue, newValue);\r\n };\r\n }\r\n return undefined;\r\n }, [target, propertyKey, convertFrom, notifyPropertyChanged]);\r\n\r\n const propsToSend = {\r\n // will be overriden if custom onCopy is passed in\r\n onCopy: () => {\r\n if (propertyPath) {\r\n return GetOnCopyString(value, propertyPath);\r\n }\r\n const { className, babylonNamespace } = getClassNameWithNamespace(target);\r\n return `${GetOnCopyString(value, String(propertyKey))} // (debugNode as ${babylonNamespace}${className})`;\r\n },\r\n ...rest,\r\n ref,\r\n value: convertedValue as TargetT[PropertyKeyT],\r\n onChange,\r\n };\r\n\r\n return <Component {...(propsToSend as ComponentProps<ComponentT>)} />;\r\n };\r\n }, [useSpecificProperty, notifyPropertyChanged]);\r\n\r\n return <SpecificComponent {...(props as ComponentProps<ComponentT>)} />;\r\n}\r\n\r\nconst BoundPropertyCore = CreateGenericForwardRef(BoundPropertyCoreImpl);\r\n\r\nfunction BoundPropertyImpl<TargetT extends object, PropertyKeyT extends keyof TargetT, ComponentT extends ComponentType<any>>(\r\n props: BoundPropertyProps<TargetT, PropertyKeyT, ComponentT>,\r\n ref?: any\r\n) {\r\n const { target, ...rest } = props;\r\n\r\n // If target is null, don't render anything.\r\n if (!target) {\r\n return null;\r\n }\r\n\r\n // Target is guaranteed to be non-null here, pass to core implementation.\r\n return (\r\n <ErrorBoundary name={`BoundProperty:${String(props.propertyKey)}`}>\r\n <BoundPropertyCore {...rest} target={target} ref={ref} />\r\n </ErrorBoundary>\r\n );\r\n}\r\n\r\n// Custom generic forwardRef function (this is needed because using forwardRef with BoundPropertyImpl does not properly resolve Generic types)\r\nfunction CreateGenericForwardRef<T extends (...args: any[]) => any>(render: T) {\r\n return forwardRef(render as any) as unknown as T;\r\n}\r\n\r\n/**\r\n * Intercepts the passed in component's target[propertyKey] with useInterceptObservable and sets component state using useObservableState.\r\n * Renders the passed in component with value as the new observableState value and onChange as a callback to set the target[propertyKey] value.\r\n *\r\n * NOTE: BoundProperty has strict nullable enforcement!\r\n *\r\n * If Target[PropertyKey] is Nullable, caller has three options:\r\n * 1. `nullable: true` + `defaultValue: NonNullable<T>` - Shows enable/disable checkbox UI\r\n * 2. `ignoreNullable: true` + `defaultValue: NonNullable<T>` - Shows disabled state when null\r\n * 3. `defaultValue: null` - Skips nullable handling entirely, passes value through as-is\r\n *\r\n * @param props BoundPropertyProps with strict nullable validation\r\n * @returns JSX element\r\n */\r\nexport const BoundProperty = CreateGenericForwardRef(BoundPropertyImpl);\r\n\r\ntype ComponentValue<ComponentT extends ComponentType<any>> = ComponentProps<ComponentT> extends { value: infer ValueT } ? ValueT : never;\r\n\r\nexport type ComputedPropertyProps<TargetT extends object, ComponentT extends ComponentType<any>> = Omit<ComponentProps<ComponentT>, \"value\" | \"onChange\"> & {\r\n component: ComponentT;\r\n target: TargetT;\r\n getValue: (target: TargetT) => ComponentValue<ComponentT>;\r\n};\r\n\r\n/**\r\n * Renders a read-only property-line component with a computed value that follows the Preferred\r\n * Watch Mode. Use {@link BoundProperty} instead for an editable `target[propertyKey]`.\r\n * @param props The target, computed getter, and property-line component props.\r\n * @returns The property-line component with its current computed value.\r\n */\r\nexport function ComputedProperty<TargetT extends object, ComponentT extends ComponentType<any>>(props: ComputedPropertyProps<TargetT, ComponentT>) {\r\n const {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n component: Component,\r\n target,\r\n getValue,\r\n ...rest\r\n } = props;\r\n const value = useWatchedValue(target, getValue);\r\n\r\n return <Component {...({ ...rest, value } as ComponentProps<ComponentT>)} />;\r\n}\r\n\r\nexport type DerivedPropertyProps<TargetT extends object, ComponentT extends ComponentType<any>> = Omit<ComponentProps<ComponentT>, \"value\" | \"onChange\"> & {\r\n component: ComponentT;\r\n target: TargetT;\r\n getValue: (target: TargetT) => ComponentValue<ComponentT>;\r\n setValue: (target: TargetT, value: ComponentValue<ComponentT>) => void;\r\n} & (\r\n | {\r\n propertyPath?: never;\r\n getPropertyOwner?: never;\r\n propertyKey?: never;\r\n }\r\n | {\r\n /** Property path relative to `globalThis.debugNode`, used by Copy to Clipboard. */\r\n propertyPath: string;\r\n /** Gets the object whose property is changed by `setValue`. */\r\n getPropertyOwner: (target: TargetT) => object;\r\n /** The key changed on the object returned by `getPropertyOwner`. */\r\n propertyKey: PropertyKey;\r\n }\r\n );\r\n\r\n/**\r\n * Renders an editable property-line component for a value derived from a target.\r\n *\r\n * This is useful for method-backed values, readonly object references, or values whose UI\r\n * representation differs from their stored representation. The getter follows the Preferred\r\n * Watch Mode, while the setter owns the runtime-specific write-back.\r\n * @param props The target, derived getter, write-back function, and property-line component props.\r\n * @returns The editable derived property-line component.\r\n */\r\nexport function DerivedProperty<TargetT extends object, ComponentT extends ComponentType<any>>(props: DerivedPropertyProps<TargetT, ComponentT>) {\r\n const {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n component: Component,\r\n target,\r\n getValue,\r\n setValue,\r\n propertyPath,\r\n getPropertyOwner,\r\n propertyKey,\r\n ...rest\r\n } = props;\r\n const value = useWatchedValue(target, getValue);\r\n const notifyPropertyChanged = usePropertyChangedNotifier();\r\n const getStoredProperty = () => {\r\n if (!getPropertyOwner || propertyKey === undefined) {\r\n return undefined;\r\n }\r\n const propertyTarget = getPropertyOwner(target);\r\n return {\r\n propertyTarget,\r\n value: Reflect.get(propertyTarget, propertyKey),\r\n };\r\n };\r\n\r\n return (\r\n <Component\r\n {...({\r\n ...(propertyPath ? { onCopy: () => GetOnCopyString(getStoredProperty()?.value, propertyPath) } : {}),\r\n ...rest,\r\n value,\r\n onChange: (changedValue: ComponentValue<ComponentT>) => {\r\n const oldStoredProperty = getStoredProperty();\r\n setValue(target, changedValue);\r\n const newStoredProperty = getStoredProperty();\r\n if (newStoredProperty && oldStoredProperty && propertyKey !== undefined) {\r\n notifyPropertyChanged(newStoredProperty.propertyTarget, propertyKey, oldStoredProperty.value, newStoredProperty.value);\r\n }\r\n },\r\n } as ComponentProps<ComponentT>)}\r\n />\r\n );\r\n}\r\n\r\n/**\r\n * Mutually exclusive propertyPath or functionPath - one required\r\n */\r\ntype RequiredPropertyPath = { propertyPath: string; functionPath?: never } | { functionPath: string; propertyPath?: never };\r\n/**\r\n * Props for Property component - a simpler version of BoundProperty that only handles onCopy functionality\r\n * Pass in the full propertyPath from entity to property (e.g. \"meshes[0].position.x\") to ensure copyString is accurate\r\n * Use functionPath for function-based properties (e.g. \"setEnabled\" generates \"debugNode.setEnabled(value)\")\r\n */\r\nexport type PropertyProps<ComponentT extends ComponentType<any>> = Omit<ComponentProps<ComponentT>, \"onCopy\"> & {\r\n component: ComponentT;\r\n} & RequiredPropertyPath;\r\n\r\nfunction GetOnCopyString(value: unknown, propertyPath: string) {\r\n const valueStr = GenerateCopyString(value);\r\n return `globalThis.debugNode.${propertyPath} = ${valueStr};`;\r\n}\r\n\r\nfunction GetOnCopyStringFunc(value: unknown, functionPath: string) {\r\n const valueStr = GenerateCopyString(value);\r\n return `globalThis.debugNode.${functionPath}(${valueStr});`;\r\n}\r\n\r\nfunction PropertyImpl<ComponentT extends ComponentType<any>>(props: PropertyProps<ComponentT>, ref?: any) {\r\n const {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n component: Component,\r\n propertyPath,\r\n functionPath,\r\n value,\r\n ...rest\r\n } = props as PropertyProps<ComponentT> & { value?: unknown; propertyPath?: string; functionPath?: string };\r\n\r\n const propsToSend = {\r\n onCopy: () => (functionPath ? GetOnCopyStringFunc(value, functionPath) : GetOnCopyString(value, propertyPath!)),\r\n ...rest,\r\n ref,\r\n value,\r\n };\r\n\r\n return <Component {...(propsToSend as ComponentProps<ComponentT>)} />;\r\n}\r\n\r\n/**\r\n * A simpler version of BoundProperty that only provides the onCopy functionality.\r\n * Does not bind the value/onChange - those must be provided by the caller.\r\n * Use this when you need copy support but have custom value/onChange handling.\r\n *\r\n * @param props PropertyProps with propertyName for copy support\r\n * @returns JSX element\r\n */\r\nexport const Property = CreateGenericForwardRef(PropertyImpl);\r\n","import { type EngineContext, type SurfaceContext } from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { BooleanBadgePropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/booleanBadgePropertyLine\";\r\nimport { StringifiedPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/stringifiedPropertyLine\";\r\nimport { TextPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/textPropertyLine\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { BoundProperty, ComputedProperty } from \"../../../../components/properties/boundProperty\";\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\nimport { type IEngineContext, EngineContextIdentity } from \"../../../engineContext\";\r\n\r\nconst GetSurfaceCount = (engine: EngineContext) => engine.surfaces.length;\r\nconst GetCanvasWidth = (surface: SurfaceContext) => surface.canvas.width;\r\nconst GetCanvasHeight = (surface: SurfaceContext) => surface.canvas.height;\r\nconst GetFormat = (surface: SurfaceContext) => surface.format;\r\nconst GetMsaaSamples = (surface: SurfaceContext) => surface.msaaSamples;\r\nconst GetMaxDevicePixelRatio = (surface: SurfaceContext) => (Number.isFinite(surface.maxDevicePixelRatio) ? surface.maxDevicePixelRatio.toLocaleString() : \"Unbounded\");\r\n\r\nconst EngineProperties: FunctionComponent<{ engine: EngineContext }> = (props) => {\r\n const { engine } = props;\r\n\r\n return (\r\n <>\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"Surface Count\" target={engine} getValue={GetSurfaceCount} />\r\n <BoundProperty component={StringifiedPropertyLine} label=\"Draw Calls\" target={engine} propertyKey=\"drawCallCount\" />\r\n <BoundProperty component={StringifiedPropertyLine} label=\"GPU Frame Time\" target={engine} propertyKey=\"gpuFrameTimeMs\" precision={2} units=\"ms\" />\r\n <BoundProperty component={BooleanBadgePropertyLine} label=\"High Precision Matrices\" target={engine} propertyKey=\"useHighPrecisionMatrix\" />\r\n <BoundProperty component={BooleanBadgePropertyLine} label=\"Floating Origin\" target={engine} propertyKey=\"useFloatingOrigin\" />\r\n </>\r\n );\r\n};\r\n\r\nconst SurfaceProperties: FunctionComponent<{ surface: SurfaceContext }> = (props) => {\r\n const { surface } = props;\r\n\r\n return (\r\n <>\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"Canvas Width\" target={surface} getValue={GetCanvasWidth} units=\"px\" />\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"Canvas Height\" target={surface} getValue={GetCanvasHeight} units=\"px\" />\r\n <ComputedProperty component={TextPropertyLine} label=\"Format\" target={surface} getValue={GetFormat} />\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"MSAA Samples\" target={surface} getValue={GetMsaaSamples} />\r\n <ComputedProperty component={TextPropertyLine} label=\"Max Device Pixel Ratio\" target={surface} getValue={GetMaxDevicePixelRatio} />\r\n </>\r\n );\r\n};\r\n\r\nexport const EnginePropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService, IEngineContext]> = {\r\n friendlyName: \"Babylon Lite Engine Properties\",\r\n consumes: [PropertiesServiceIdentity, EngineContextIdentity],\r\n factory: (propertiesService, engineContext) => {\r\n const engine = engineContext.engine;\r\n const engineRegistration = propertiesService.addSectionContent({\r\n key: \"Babylon Lite Engine Properties\",\r\n predicate: (entity: unknown): entity is EngineContext => entity === engine,\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <EngineProperties engine={context} />,\r\n },\r\n ],\r\n });\r\n const surfaceRegistration = propertiesService.addSectionContent({\r\n key: \"Babylon Lite Surface Properties\",\r\n predicate: (entity: unknown): entity is SurfaceContext => entity !== engine && engine.surfaces.includes(entity as SurfaceContext),\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <SurfaceProperties surface={context} />,\r\n },\r\n ],\r\n });\r\n\r\n return {\r\n dispose: () => {\r\n engineRegistration.dispose();\r\n surfaceRegistration.dispose();\r\n },\r\n };\r\n },\r\n};\r\n","import {\r\n getRenderingContextKind,\r\n getRenderingContexts,\r\n type ArcRotateCamera,\r\n type Camera,\r\n type DirectionalLight,\r\n type EngineContext,\r\n type FreeCamera,\r\n type HemisphericLight,\r\n type LightBase,\r\n type Mesh,\r\n type ObservableQuat,\r\n type ObservableVec3,\r\n type PointLight,\r\n type Quat,\r\n type SceneContext,\r\n type SceneNode,\r\n type ShadowGenerator,\r\n type SpotLight,\r\n type Vec3,\r\n} from \"@babylonjs/lite\";\r\n\r\nexport function GetSceneContexts(engine: EngineContext): readonly SceneContext[] {\r\n return engine.surfaces.flatMap((surface) => getRenderingContexts(surface).filter((context): context is SceneContext => getRenderingContextKind(context) === \"scene\"));\r\n}\r\n\r\nexport function IsSceneNode(entity: unknown): entity is SceneNode {\r\n return (\r\n typeof entity === \"object\" &&\r\n entity !== null &&\r\n \"name\" in entity &&\r\n \"children\" in entity &&\r\n \"position\" in entity &&\r\n \"rotationQuaternion\" in entity &&\r\n \"scaling\" in entity &&\r\n \"parent\" in entity\r\n );\r\n}\r\n\r\nexport function IsMesh(entity: unknown): entity is Mesh {\r\n return IsSceneNode(entity) && \"material\" in entity && \"receiveShadows\" in entity;\r\n}\r\n\r\nexport function IsCamera(entity: unknown): entity is Camera {\r\n return typeof entity === \"object\" && entity !== null && \"fov\" in entity && \"nearPlane\" in entity && \"farPlane\" in entity && \"children\" in entity && \"worldMatrix\" in entity;\r\n}\r\n\r\nexport function IsArcRotateCamera(entity: unknown): entity is ArcRotateCamera {\r\n return IsCamera(entity) && \"alpha\" in entity && \"beta\" in entity && \"radius\" in entity && \"target\" in entity;\r\n}\r\n\r\nexport function IsFreeCamera(entity: unknown): entity is FreeCamera {\r\n return IsCamera(entity) && \"position\" in entity && \"target\" in entity && \"speed\" in entity;\r\n}\r\n\r\nexport function IsLight(entity: unknown): entity is LightBase {\r\n return typeof entity === \"object\" && entity !== null && \"lightType\" in entity && \"children\" in entity && \"parent\" in entity && \"worldMatrix\" in entity;\r\n}\r\n\r\nexport function IsDirectionalLight(entity: unknown): entity is DirectionalLight {\r\n return IsLight(entity) && entity.lightType === \"directional\";\r\n}\r\n\r\nexport function IsPointLight(entity: unknown): entity is PointLight {\r\n return IsLight(entity) && entity.lightType === \"point\";\r\n}\r\n\r\nexport function IsSpotLight(entity: unknown): entity is SpotLight {\r\n return IsLight(entity) && entity.lightType === \"spot\";\r\n}\r\n\r\nexport function IsHemisphericLight(entity: unknown): entity is HemisphericLight {\r\n return IsLight(entity) && entity.lightType === \"hemispheric\";\r\n}\r\n\r\nexport function GetSceneNodes(scene: SceneContext): readonly SceneNode[] {\r\n const nodes = new Set<SceneNode>();\r\n const addNode = (node: SceneNode) => {\r\n if (nodes.has(node)) {\r\n return;\r\n }\r\n\r\n nodes.add(node);\r\n for (const child of node.children) {\r\n addNode(child);\r\n }\r\n };\r\n\r\n for (const mesh of scene.meshes) {\r\n let root: SceneNode = mesh;\r\n while (IsSceneNode(root.parent)) {\r\n root = root.parent;\r\n }\r\n addNode(root);\r\n }\r\n\r\n return [...nodes];\r\n}\r\n\r\nexport function GetSceneNodeRoots(scene: SceneContext): readonly SceneNode[] {\r\n const nodes = GetSceneNodes(scene);\r\n const nodeSet = new Set(nodes);\r\n return nodes.filter((node) => !IsSceneNode(node.parent) || !nodeSet.has(node.parent));\r\n}\r\n\r\nexport function IsSceneNodeDescendantOf(node: SceneNode, ancestor: object): boolean {\r\n let parent = node.parent;\r\n while (typeof parent === \"object\" && parent !== null) {\r\n if (parent === ancestor) {\r\n return true;\r\n }\r\n if (!IsSceneNode(parent)) {\r\n return false;\r\n }\r\n parent = parent.parent;\r\n }\r\n return false;\r\n}\r\n\r\nexport function SetVector3Value(target: Vec3, value: Vec3 | readonly [number, number, number]): void {\r\n const x = \"x\" in value ? value.x : value[0];\r\n const y = \"x\" in value ? value.y : value[1];\r\n const z = \"x\" in value ? value.z : value[2];\r\n const observableTarget = target as Partial<ObservableVec3>;\r\n\r\n if (typeof observableTarget.set === \"function\") {\r\n observableTarget.set(x, y, z);\r\n } else {\r\n target.x = x;\r\n target.y = y;\r\n target.z = z;\r\n }\r\n}\r\n\r\nexport function SetQuaternionValue(target: Quat, value: Quat | readonly [number, number, number, number]): void {\r\n const x = \"x\" in value ? value.x : value[0];\r\n const y = \"x\" in value ? value.y : value[1];\r\n const z = \"x\" in value ? value.z : value[2];\r\n const w = \"x\" in value ? value.w : value[3];\r\n const observableTarget = target as Partial<ObservableQuat>;\r\n\r\n if (typeof observableTarget.set === \"function\") {\r\n observableTarget.set(x, y, z, w);\r\n } else {\r\n target.x = x;\r\n target.y = y;\r\n target.z = z;\r\n target.w = w;\r\n }\r\n}\r\n\r\nexport function GetLightDisplayName(light: LightBase, index: number): string {\r\n const typeName = `${light.lightType.charAt(0).toUpperCase()}${light.lightType.slice(1)}`;\r\n return `${typeName} Light ${index + 1}`;\r\n}\r\n\r\nexport function GetShadowGeneratorDisplayName(scene: SceneContext, shadowGenerator: ShadowGenerator): string {\r\n const lightIndex = scene.lights.findIndex((light) => light.shadowGenerator === shadowGenerator);\r\n return lightIndex === -1 ? `Shadow Generator ${scene.shadowGenerators.indexOf(shadowGenerator) + 1}` : `${GetLightDisplayName(scene.lights[lightIndex], lightIndex)} Shadows`;\r\n}\r\n","import { Body1 } from \"@fluentui/react-components\";\r\nimport { useEffect, useState } from \"react\";\r\n\r\nimport { type PrimitiveProps } from \"../../primitives/primitive\";\r\nimport { CalculatePrecision } from \"../../primitives/utils\";\r\nimport { NumberInputPropertyLine } from \"./inputPropertyLine\";\r\nimport { type PropertyLineProps, PropertyLine } from \"./propertyLine\";\r\nimport { TextPropertyLine } from \"./textPropertyLine\";\r\n\r\nexport type TensorComponent = \"x\" | \"y\" | \"z\" | \"w\";\r\n\r\nexport type TensorValue2 = Readonly<{ x: number; y: number }>;\r\nexport type TensorValue3 = TensorValue2 & Readonly<{ z: number }>;\r\nexport type TensorValue4 = TensorValue3 & Readonly<{ w: number }>;\r\n\r\nexport type TensorPropertyLineProps<ValueT> = PropertyLineProps<ValueT> &\r\n PrimitiveProps<ValueT> & {\r\n min?: number;\r\n max?: number;\r\n unit?: string;\r\n step?: number;\r\n precision?: number;\r\n valueConverter?: {\r\n from: (value: number) => number;\r\n to: (value: number) => number;\r\n };\r\n };\r\n\r\nexport type TensorValueAdapter<ValueT> = Readonly<{\r\n components: readonly TensorComponent[];\r\n getComponent: (value: ValueT, component: TensorComponent) => number;\r\n withComponent: (value: ValueT, component: TensorComponent, componentValue: number) => ValueT;\r\n}>;\r\n\r\ntype ControlledTensorPropertyLineProps<ValueT> = TensorPropertyLineProps<ValueT> &\r\n Readonly<{\r\n adapter: TensorValueAdapter<ValueT>;\r\n }>;\r\n\r\n/**\r\n * Runtime-neutral controlled editor for two-, three-, and four-component numeric values.\r\n * @param props The value, change callback, component adapter, and property-line presentation.\r\n * @returns The tensor property line.\r\n */\r\nexport const ControlledTensorPropertyLine = <ValueT,>(props: ControlledTensorPropertyLineProps<ValueT>) => {\r\n const { adapter, min, max, unit, step, precision, valueConverter } = props;\r\n const converted = (value: number) => (valueConverter ? valueConverter.from(value) : value);\r\n const formatted = (value: number) => converted(value).toFixed(precision ?? (step !== undefined ? Math.max(0, CalculatePrecision(step)) : 2));\r\n const [value, setValue] = useState(props.value);\r\n\r\n useEffect(() => {\r\n setValue(props.value);\r\n }, [props.value, props.expandedContent]);\r\n\r\n const onComponentChange = (componentValue: number, component: TensorComponent) => {\r\n const storedValue = valueConverter ? valueConverter.to(componentValue) : componentValue;\r\n const newValue = adapter.withComponent(value, component, storedValue);\r\n setValue(newValue);\r\n props.onChange(newValue);\r\n };\r\n\r\n const summary = adapter.components.map((component) => formatted(adapter.getComponent(props.value, component))).join(\", \");\r\n\r\n return (\r\n <PropertyLine\r\n {...props}\r\n expandedContent={\r\n <>\r\n {props.expandedContent}\r\n <TensorSliders\r\n value={value}\r\n adapter={adapter}\r\n min={min}\r\n max={max}\r\n unit={unit}\r\n step={step}\r\n precision={precision}\r\n converted={converted}\r\n onChange={onComponentChange}\r\n />\r\n </>\r\n }\r\n >\r\n <Body1>{`[${summary}]`}</Body1>\r\n </PropertyLine>\r\n );\r\n};\r\n\r\ntype TensorSlidersProps<ValueT> = Readonly<{\r\n value: ValueT;\r\n adapter: TensorValueAdapter<ValueT>;\r\n min?: number;\r\n max?: number;\r\n unit?: string;\r\n step?: number;\r\n precision?: number;\r\n converted: (value: number) => number;\r\n onChange: (value: number, component: TensorComponent) => void;\r\n}>;\r\n\r\nconst TensorSliders = <ValueT,>(props: TensorSlidersProps<ValueT>) => {\r\n const { value, adapter, min, max, unit, step, precision, converted, onChange } = props;\r\n\r\n return (\r\n <>\r\n {adapter.components.map((component) => (\r\n <NumberInputPropertyLine\r\n key={component}\r\n label={component.toUpperCase()}\r\n value={converted(adapter.getComponent(value, component))}\r\n min={min}\r\n max={max}\r\n onChange={(componentValue) => onChange(componentValue, component)}\r\n unit={unit}\r\n step={step}\r\n precision={precision}\r\n />\r\n ))}\r\n </>\r\n );\r\n};\r\n\r\nexport const RadiansToDegreesConverter = {\r\n from: (value: number) => (value * 180) / Math.PI,\r\n to: (value: number) => (value * Math.PI) / 180,\r\n};\r\n\r\ntype ControlledRotationVectorPropertyLineProps<ValueT> = TensorPropertyLineProps<ValueT> &\r\n Readonly<{\r\n adapter: TensorValueAdapter<ValueT>;\r\n useDegrees?: boolean;\r\n }>;\r\n\r\n/**\r\n * Runtime-neutral controlled Euler rotation editor.\r\n * @param props The rotation value, runtime adapter, and display options.\r\n * @returns The rotation property line.\r\n */\r\nexport const ControlledRotationVectorPropertyLine = <ValueT,>(props: ControlledRotationVectorPropertyLineProps<ValueT>) => {\r\n const { useDegrees, ...rest } = props;\r\n\r\n return (\r\n <ControlledTensorPropertyLine\r\n {...rest}\r\n unit={useDegrees ? \"°\" : \"rad\"}\r\n valueConverter={useDegrees ? RadiansToDegreesConverter : undefined}\r\n step={useDegrees ? 1 : 0.01}\r\n precision={useDegrees ? 1 : 2}\r\n />\r\n );\r\n};\r\n\r\nexport type QuaternionValueAdapter<QuaternionT, EulerT> = Readonly<{\r\n quaternion: TensorValueAdapter<QuaternionT>;\r\n euler: TensorValueAdapter<EulerT>;\r\n fromEuler: (value: EulerT, source: QuaternionT) => QuaternionT;\r\n toEuler: (value: QuaternionT) => EulerT;\r\n}>;\r\n\r\ntype ControlledQuaternionPropertyLineProps<QuaternionT, EulerT> = TensorPropertyLineProps<QuaternionT> &\r\n Readonly<{\r\n adapter: QuaternionValueAdapter<QuaternionT, EulerT>;\r\n useDegrees?: boolean;\r\n useEuler?: boolean;\r\n }>;\r\n\r\n/**\r\n * Runtime-neutral controlled quaternion editor with optional Euler presentation.\r\n * @param props The quaternion value, runtime conversion adapter, and display options.\r\n * @returns The quaternion or Euler property line.\r\n */\r\nexport const ControlledQuaternionPropertyLine = <QuaternionT, EulerT>(props: ControlledQuaternionPropertyLineProps<QuaternionT, EulerT>) => {\r\n const { adapter, useEuler, useDegrees, ...rest } = props;\r\n const [quaternion, setQuaternion] = useState(props.value);\r\n\r\n useEffect(() => {\r\n setQuaternion(props.value);\r\n }, [props.value]);\r\n\r\n const onQuaternionChange = (value: QuaternionT) => {\r\n setQuaternion(value);\r\n props.onChange(value);\r\n };\r\n\r\n if (useEuler) {\r\n const quaternionSummary = adapter.quaternion.components.map((component) => adapter.quaternion.getComponent(quaternion, component).toFixed(4)).join(\", \");\r\n\r\n return (\r\n <ControlledTensorPropertyLine\r\n {...rest}\r\n nullable={false}\r\n ignoreNullable={false}\r\n value={adapter.toEuler(quaternion)}\r\n adapter={adapter.euler}\r\n valueConverter={useDegrees ? RadiansToDegreesConverter : undefined}\r\n onChange={(value) => onQuaternionChange(adapter.fromEuler(value, quaternion))}\r\n unit={useDegrees ? \"°\" : \"rad\"}\r\n step={useDegrees ? 1 : 0.01}\r\n precision={useDegrees ? 1 : 2}\r\n expandedContent={<TextPropertyLine label=\"Quaternion\" value={`[${quaternionSummary}]`} />}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <ControlledTensorPropertyLine\r\n {...rest}\r\n nullable={false}\r\n value={quaternion}\r\n adapter={adapter.quaternion}\r\n onChange={onQuaternionChange}\r\n unit={useDegrees ? \"°\" : \"rad\"}\r\n step={useDegrees ? 1 : 0.01}\r\n precision={useDegrees ? 1 : 2}\r\n />\r\n );\r\n};\r\n","import { eulerToQuat, quatToEulerXYZ, type Quat, type Vec2, type Vec3, type Vec4 } from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport {\r\n ControlledQuaternionPropertyLine,\r\n ControlledRotationVectorPropertyLine,\r\n ControlledTensorPropertyLine,\r\n type QuaternionValueAdapter,\r\n type TensorComponent,\r\n type TensorPropertyLineProps as RuntimeNeutralTensorPropertyLineProps,\r\n type TensorValueAdapter,\r\n} from \"shared-ui-components/fluent/hoc/propertyLines/vectorPropertyLineCore\";\r\n\r\nexport type Vector2Value = Vec2 | readonly [number, number];\r\nexport type Vector3Value = Vec3 | readonly [number, number, number];\r\nexport type Vector4Value = Vec4 | readonly [number, number, number, number];\r\nexport type QuaternionValue = Quat | readonly [number, number, number, number];\r\n\r\nexport type TensorPropertyLineProps<ValueT extends Vector2Value | Vector3Value | Vector4Value | QuaternionValue> = RuntimeNeutralTensorPropertyLineProps<ValueT>;\r\n\r\nconst ComponentIndices: Readonly<Record<TensorComponent, number>> = {\r\n x: 0,\r\n y: 1,\r\n z: 2,\r\n w: 3,\r\n};\r\n\r\ntype TupleValue = readonly [number, number] | readonly [number, number, number] | readonly [number, number, number, number];\r\n\r\nfunction IsNumberTuple(value: Vector2Value | Vector3Value | Vector4Value | QuaternionValue): value is TupleValue {\r\n return Array.isArray(value);\r\n}\r\n\r\nfunction GetComponent(value: Vector2Value | Vector3Value | Vector4Value | QuaternionValue, component: TensorComponent): number {\r\n if (IsNumberTuple(value)) {\r\n return value[ComponentIndices[component]];\r\n }\r\n switch (component) {\r\n case \"x\":\r\n return value.x;\r\n case \"y\":\r\n return value.y;\r\n case \"z\":\r\n return \"z\" in value ? value.z : 0;\r\n case \"w\":\r\n return \"w\" in value ? value.w : 0;\r\n }\r\n}\r\n\r\nconst Vector2Adapter: TensorValueAdapter<Vector2Value> = {\r\n components: [\"x\", \"y\"],\r\n getComponent: GetComponent,\r\n withComponent: (value, component, componentValue) =>\r\n IsNumberTuple(value) ? [component === \"x\" ? componentValue : value[0], component === \"y\" ? componentValue : value[1]] : { ...value, [component]: componentValue },\r\n};\r\nconst Vector3Adapter: TensorValueAdapter<Vector3Value> = {\r\n components: [\"x\", \"y\", \"z\"],\r\n getComponent: GetComponent,\r\n withComponent: (value, component, componentValue) =>\r\n IsNumberTuple(value)\r\n ? [component === \"x\" ? componentValue : value[0], component === \"y\" ? componentValue : value[1], component === \"z\" ? componentValue : value[2]]\r\n : { ...value, [component]: componentValue },\r\n};\r\nconst Vector4Adapter: TensorValueAdapter<Vector4Value> = {\r\n components: [\"x\", \"y\", \"z\", \"w\"],\r\n getComponent: GetComponent,\r\n withComponent: (value, component, componentValue) =>\r\n IsNumberTuple(value)\r\n ? [\r\n component === \"x\" ? componentValue : value[0],\r\n component === \"y\" ? componentValue : value[1],\r\n component === \"z\" ? componentValue : value[2],\r\n component === \"w\" ? componentValue : value[3],\r\n ]\r\n : { ...value, [component]: componentValue },\r\n};\r\nconst QuaternionTensorAdapter: TensorValueAdapter<QuaternionValue> = {\r\n components: [\"x\", \"y\", \"z\", \"w\"],\r\n getComponent: GetComponent,\r\n withComponent: (value, component, componentValue) =>\r\n IsNumberTuple(value)\r\n ? [\r\n component === \"x\" ? componentValue : value[0],\r\n component === \"y\" ? componentValue : value[1],\r\n component === \"z\" ? componentValue : value[2],\r\n component === \"w\" ? componentValue : value[3],\r\n ]\r\n : { ...value, [component]: componentValue },\r\n};\r\n\r\n/**\r\n * Converts a Lite Euler value to a quaternion while preserving tuple versus structural representation.\r\n * @param value The Euler value in radians.\r\n * @param source The source quaternion whose representation should be preserved.\r\n * @returns The converted quaternion.\r\n */\r\nexport function CreateQuaternionFromEuler(value: Vector3Value, source: QuaternionValue): QuaternionValue {\r\n const [x, y, z] = \"x\" in value ? [value.x, value.y, value.z] : value;\r\n const quaternion = eulerToQuat(x, y, z);\r\n return \"x\" in source ? { x: quaternion[0], y: quaternion[1], z: quaternion[2], w: quaternion[3] } : quaternion;\r\n}\r\n\r\nconst QuaternionAdapter: QuaternionValueAdapter<QuaternionValue, Vector3Value> = {\r\n quaternion: QuaternionTensorAdapter,\r\n euler: Vector3Adapter,\r\n fromEuler: CreateQuaternionFromEuler,\r\n toEuler: (value) => {\r\n const [x, y, z, w] = \"x\" in value ? [value.x, value.y, value.z, value.w] : value;\r\n return quatToEulerXYZ(x, y, z, w);\r\n },\r\n};\r\n\r\ntype RotationVectorPropertyLineProps = TensorPropertyLineProps<Vector3Value> & {\r\n useDegrees?: boolean;\r\n};\r\n\r\ntype QuaternionPropertyLineProps = TensorPropertyLineProps<QuaternionValue> & {\r\n useDegrees?: boolean;\r\n useEuler?: boolean;\r\n};\r\n\r\nexport const Vector2PropertyLine: FunctionComponent<TensorPropertyLineProps<Vector2Value>> = (props) => <ControlledTensorPropertyLine {...props} adapter={Vector2Adapter} />;\r\nexport const Vector3PropertyLine: FunctionComponent<TensorPropertyLineProps<Vector3Value>> = (props) => <ControlledTensorPropertyLine {...props} adapter={Vector3Adapter} />;\r\nexport const Vector4PropertyLine: FunctionComponent<TensorPropertyLineProps<Vector4Value>> = (props) => <ControlledTensorPropertyLine {...props} adapter={Vector4Adapter} />;\r\nexport const RotationVectorPropertyLine: FunctionComponent<RotationVectorPropertyLineProps> = (props) => (\r\n <ControlledRotationVectorPropertyLine {...props} adapter={Vector3Adapter} />\r\n);\r\nexport const QuaternionPropertyLine: FunctionComponent<QuaternionPropertyLineProps> = (props) => <ControlledQuaternionPropertyLine {...props} adapter={QuaternionAdapter} />;\r\n","import { type ArcRotateCamera, type Camera, type FreeCamera, type Vec3 } from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { NumberInputPropertyLine, TextInputPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/inputPropertyLine\";\r\nimport { SyncedSliderPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/syncedSliderPropertyLine\";\r\n\r\nimport { BoundProperty, DerivedProperty } from \"../../../components/properties/boundProperty\";\r\nimport { useAngleConverters } from \"../../../hooks/settingsHooks\";\r\nimport { SetVector3Value } from \"../../sceneEntityUtils\";\r\nimport { Vector3PropertyLine } from \"shared-ui-components/lite/fluent/hoc/propertyLines/vectorPropertyLine\";\r\n\r\nfunction GetPosition(camera: FreeCamera): readonly [number, number, number] {\r\n return [camera.position.x, camera.position.y, camera.position.z];\r\n}\r\n\r\nfunction GetTarget(camera: ArcRotateCamera | FreeCamera): readonly [number, number, number] {\r\n return [camera.target.x, camera.target.y, camera.target.z];\r\n}\r\n\r\nfunction SetFreeCameraPosition(camera: FreeCamera, value: Vec3 | readonly [number, number, number]): void {\r\n SetVector3Value(camera.position, value);\r\n}\r\n\r\nfunction SetCameraTarget(camera: ArcRotateCamera | FreeCamera, value: Vec3 | readonly [number, number, number]): void {\r\n SetVector3Value(camera.target, value);\r\n}\r\n\r\nexport const CameraGeneralProperties: FunctionComponent<{ camera: Camera }> = (props) => {\r\n const { camera } = props;\r\n const [toDisplayAngle, fromDisplayAngle, useDegrees] = useAngleConverters();\r\n\r\n return (\r\n <>\r\n <BoundProperty component={TextInputPropertyLine} label=\"Name\" target={camera} propertyKey=\"name\" ignoreNullable defaultValue=\"\" />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Near Plane\" target={camera} propertyKey=\"nearPlane\" />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Far Plane\" target={camera} propertyKey=\"farPlane\" />\r\n <BoundProperty\r\n component={SyncedSliderPropertyLine}\r\n label=\"FOV\"\r\n target={camera}\r\n propertyKey=\"fov\"\r\n min={toDisplayAngle(0.1)}\r\n max={toDisplayAngle(Math.PI)}\r\n step={toDisplayAngle(0.01)}\r\n unit={useDegrees ? \"°\" : \"rad\"}\r\n convertTo={toDisplayAngle}\r\n convertFrom={fromDisplayAngle}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport const FreeCameraTransformProperties: FunctionComponent<{ camera: FreeCamera }> = (props) => {\r\n const { camera } = props;\r\n\r\n return (\r\n <>\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Position\" target={camera} getValue={GetPosition} setValue={SetFreeCameraPosition} />\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Target\" target={camera} getValue={GetTarget} setValue={SetCameraTarget} />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Speed\" target={camera} propertyKey=\"speed\" />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Inertia\" target={camera} propertyKey=\"inertia\" min={0} max={1} />\r\n </>\r\n );\r\n};\r\n\r\nexport const ArcRotateCameraTransformProperties: FunctionComponent<{ camera: ArcRotateCamera }> = (props) => {\r\n const { camera } = props;\r\n const [toDisplayAngle, fromDisplayAngle, useDegrees] = useAngleConverters();\r\n\r\n return (\r\n <>\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Target\" target={camera} getValue={GetTarget} setValue={SetCameraTarget} />\r\n <BoundProperty\r\n component={NumberInputPropertyLine}\r\n label=\"Alpha\"\r\n target={camera}\r\n propertyKey=\"alpha\"\r\n unit={useDegrees ? \"°\" : \"rad\"}\r\n convertTo={toDisplayAngle}\r\n convertFrom={fromDisplayAngle}\r\n />\r\n <BoundProperty\r\n component={NumberInputPropertyLine}\r\n label=\"Beta\"\r\n target={camera}\r\n propertyKey=\"beta\"\r\n unit={useDegrees ? \"°\" : \"rad\"}\r\n convertTo={toDisplayAngle}\r\n convertFrom={fromDisplayAngle}\r\n />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Radius\" target={camera} propertyKey=\"radius\" min={0} />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Inertia\" target={camera} propertyKey=\"inertia\" min={0} max={1} />\r\n </>\r\n );\r\n};\r\n","import { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { ArcRotateCameraTransformProperties, CameraGeneralProperties, FreeCameraTransformProperties } from \"../../../components/properties/cameraProperties\";\r\nimport { IsArcRotateCamera, IsCamera, IsFreeCamera } from \"../../../sceneEntityUtils\";\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\n\r\nexport const CameraPropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService]> = {\r\n friendlyName: \"Babylon Lite Camera Properties\",\r\n consumes: [PropertiesServiceIdentity],\r\n factory: (propertiesService) => {\r\n const cameraRegistration = propertiesService.addSectionContent({\r\n key: \"Babylon Lite Camera Properties\",\r\n predicate: IsCamera,\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <CameraGeneralProperties camera={context} />,\r\n },\r\n ],\r\n });\r\n const freeCameraRegistration = propertiesService.addSectionContent({\r\n key: \"Babylon Lite Free Camera Properties\",\r\n predicate: IsFreeCamera,\r\n content: [\r\n {\r\n section: \"Transform\",\r\n component: ({ context }) => <FreeCameraTransformProperties camera={context} />,\r\n },\r\n ],\r\n });\r\n const arcRotateCameraRegistration = propertiesService.addSectionContent({\r\n key: \"Babylon Lite Arc Rotate Camera Properties\",\r\n predicate: IsArcRotateCamera,\r\n content: [\r\n {\r\n section: \"Transform\",\r\n component: ({ context }) => <ArcRotateCameraTransformProperties camera={context} />,\r\n },\r\n ],\r\n });\r\n\r\n return {\r\n dispose: () => {\r\n arcRotateCameraRegistration.dispose();\r\n freeCameraRegistration.dispose();\r\n cameraRegistration.dispose();\r\n },\r\n };\r\n },\r\n};\r\n","import { createElement, type ComponentType, type FunctionComponent, type Ref, useEffect, useState } from \"react\";\r\n\r\nimport { type StructuralColor, type StructuralColorAdapter } from \"../../primitives/structuralColorPicker\";\r\nimport { type PrimitiveProps } from \"../../primitives/primitive\";\r\nimport { type PropertyLineProps, PropertyLine } from \"./propertyLine\";\r\nimport { SyncedSliderPropertyLine } from \"./syncedSliderPropertyLine\";\r\n\r\nexport type ColorPropertyLineAdapter<ValueT> = StructuralColorAdapter<ValueT> &\r\n Readonly<{\r\n picker: ComponentType<PrimitiveProps<ValueT> & { isLinearMode?: boolean }>;\r\n }>;\r\n\r\nexport type ControlledColorPropertyLineProps<ValueT> = PrimitiveProps<ValueT> &\r\n PropertyLineProps<ValueT> &\r\n Readonly<{\r\n adapter: ColorPropertyLineAdapter<ValueT>;\r\n isLinearMode?: boolean;\r\n propertyLineRef?: Ref<HTMLDivElement>;\r\n }>;\r\n\r\n/**\r\n * Runtime-neutral controlled color editor with RGB or RGBA sliders and an injected picker.\r\n * @param props The controlled color, runtime adapter, and property-line presentation.\r\n * @returns The color property line.\r\n */\r\nexport const ControlledColorPropertyLine = <ValueT,>(props: ControlledColorPropertyLineProps<ValueT>) => {\r\n const { adapter, value, onChange, propertyLineRef } = props;\r\n const [currentValue, setCurrentValue] = useState(value);\r\n\r\n useEffect(() => {\r\n setCurrentValue(value);\r\n }, [value]);\r\n\r\n const handleChange = (newValue: ValueT) => {\r\n setCurrentValue(newValue);\r\n onChange(newValue);\r\n };\r\n\r\n const onSliderChange = (componentValue: number, component: keyof StructuralColor) => {\r\n const color = adapter.getColor(currentValue);\r\n handleChange(\r\n adapter.createColor(\r\n {\r\n ...color,\r\n [component]: component === \"a\" ? componentValue : componentValue / 255,\r\n },\r\n currentValue\r\n )\r\n );\r\n };\r\n\r\n const color = adapter.getColor(currentValue);\r\n return (\r\n <PropertyLine ref={propertyLineRef} {...props} expandedContent={<ColorSliders color={color} onSliderChange={onSliderChange} />}>\r\n {createElement(adapter.picker, {\r\n value: currentValue,\r\n onChange: handleChange,\r\n isLinearMode: props.isLinearMode,\r\n disabled: props.disabled,\r\n className: props.className,\r\n style: props.style,\r\n title: props.title,\r\n })}\r\n </PropertyLine>\r\n );\r\n};\r\n\r\ntype ColorSlidersProps = Readonly<{\r\n color: StructuralColor;\r\n onSliderChange: (value: number, component: keyof StructuralColor) => void;\r\n}>;\r\n\r\nconst ColorSliders: FunctionComponent<ColorSlidersProps> = (props) => {\r\n const { color, onSliderChange } = props;\r\n\r\n return (\r\n <>\r\n <SyncedSliderPropertyLine label=\"R\" value={color.r * 255} min={0} max={255} onChange={(value) => onSliderChange(value, \"r\")} />\r\n <SyncedSliderPropertyLine label=\"G\" value={color.g * 255} min={0} max={255} onChange={(value) => onSliderChange(value, \"g\")} />\r\n <SyncedSliderPropertyLine label=\"B\" value={color.b * 255} min={0} max={255} onChange={(value) => onSliderChange(value, \"b\")} />\r\n {color.a === undefined ? undefined : (\r\n <SyncedSliderPropertyLine label=\"A\" value={color.a} min={0} max={1} step={0.01} onChange={(value) => onSliderChange(value, \"a\")} />\r\n )}\r\n </>\r\n );\r\n};\r\n","import {\r\n AlphaSlider,\r\n ColorArea,\r\n ColorPicker as FluentColorPicker,\r\n type ColorPickerProps as FluentColorPickerProps,\r\n ColorSlider,\r\n ColorSwatch,\r\n makeStyles,\r\n tokens,\r\n} from \"@fluentui/react-components\";\r\nimport { useContext, useEffect, useMemo, useState } from \"react\";\r\n\r\nimport { ToolContext } from \"../hoc/fluentToolWrapper\";\r\nimport { Popover } from \"./popover\";\r\nimport { type PrimitiveProps } from \"./primitive\";\r\n\r\nexport type StructuralColor = Readonly<{ r: number; g: number; b: number; a?: number }>;\r\n\r\nexport type StructuralColorAdapter<ValueT> = Readonly<{\r\n getColor: (value: ValueT) => StructuralColor;\r\n createColor: (color: StructuralColor, source: ValueT) => ValueT;\r\n}>;\r\n\r\nexport type StructuralColorPickerProps<ValueT> = PrimitiveProps<ValueT> &\r\n Readonly<{\r\n adapter: StructuralColorAdapter<ValueT>;\r\n isLinearMode?: boolean;\r\n }>;\r\n\r\nconst useStyles = makeStyles({\r\n picker: {\r\n width: \"350px\",\r\n height: \"350px\",\r\n },\r\n trigger: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n },\r\n});\r\n\r\nfunction LinearChannelToGamma(value: number): number {\r\n return value <= 0.0031308 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;\r\n}\r\n\r\nfunction GammaChannelToLinear(value: number): number {\r\n return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\r\n}\r\n\r\nfunction ConvertColorSpace(color: StructuralColor, convertChannel: (value: number) => number): StructuralColor {\r\n return {\r\n r: convertChannel(color.r),\r\n g: convertChannel(color.g),\r\n b: convertChannel(color.b),\r\n ...(\"a\" in color ? { a: color.a } : {}),\r\n };\r\n}\r\n\r\nfunction RgbToHsv(color: StructuralColor): { h: number; s: number; v: number; a?: number } {\r\n const max = Math.max(color.r, color.g, color.b);\r\n const min = Math.min(color.r, color.g, color.b);\r\n const delta = max - min;\r\n let hue = 0;\r\n\r\n if (delta !== 0) {\r\n if (max === color.r) {\r\n hue = 60 * (((color.g - color.b) / delta) % 6);\r\n } else if (max === color.g) {\r\n hue = 60 * ((color.b - color.r) / delta + 2);\r\n } else {\r\n hue = 60 * ((color.r - color.g) / delta + 4);\r\n }\r\n }\r\n\r\n return {\r\n h: hue < 0 ? hue + 360 : hue,\r\n s: max === 0 ? 0 : delta / max,\r\n v: max,\r\n ...(\"a\" in color ? { a: color.a } : {}),\r\n };\r\n}\r\n\r\nfunction HsvToRgb(hue: number, saturation: number, value: number, alpha?: number): StructuralColor {\r\n const chroma = value * saturation;\r\n const hueSector = hue / 60;\r\n const intermediate = chroma * (1 - Math.abs((hueSector % 2) - 1));\r\n const offset = value - chroma;\r\n let red = 0;\r\n let green = 0;\r\n let blue = 0;\r\n\r\n if (hueSector < 1) {\r\n red = chroma;\r\n green = intermediate;\r\n } else if (hueSector < 2) {\r\n red = intermediate;\r\n green = chroma;\r\n } else if (hueSector < 3) {\r\n green = chroma;\r\n blue = intermediate;\r\n } else if (hueSector < 4) {\r\n green = intermediate;\r\n blue = chroma;\r\n } else if (hueSector < 5) {\r\n red = intermediate;\r\n blue = chroma;\r\n } else {\r\n red = chroma;\r\n blue = intermediate;\r\n }\r\n\r\n return {\r\n r: red + offset,\r\n g: green + offset,\r\n b: blue + offset,\r\n ...(alpha !== undefined ? { a: alpha } : {}),\r\n };\r\n}\r\n\r\nfunction ColorToHex(color: StructuralColor): string {\r\n const channelToHex = (value: number) =>\r\n Math.round(Math.min(1, Math.max(0, value)) * 255)\r\n .toString(16)\r\n .padStart(2, \"0\");\r\n return `#${channelToHex(color.r)}${channelToHex(color.g)}${channelToHex(color.b)}${color.a === undefined ? \"\" : channelToHex(color.a)}`;\r\n}\r\n\r\n/**\r\n * Runtime-neutral color picker for structural RGB and RGBA values.\r\n * @param props The controlled value, adapter, color-space mode, and change callback.\r\n * @returns A color swatch that opens the Fluent color picker.\r\n */\r\nexport const StructuralColorPickerPopup = <ValueT,>(props: StructuralColorPickerProps<ValueT>) => {\r\n const { value, onChange, adapter, isLinearMode, ...rest } = props;\r\n const classes = useStyles();\r\n const { size } = useContext(ToolContext);\r\n const [currentValue, setCurrentValue] = useState(value);\r\n\r\n useEffect(() => {\r\n setCurrentValue(value);\r\n }, [value]);\r\n\r\n const storedColor = adapter.getColor(currentValue);\r\n const gammaColor = useMemo(() => (isLinearMode ? ConvertColorSpace(storedColor, LinearChannelToGamma) : storedColor), [storedColor, isLinearMode]);\r\n const hexColor = ColorToHex(gammaColor);\r\n\r\n const handleColorPickerChange: FluentColorPickerProps[\"onColorChange\"] = (_event, data) => {\r\n const changedGammaColor = HsvToRgb(data.color.h, data.color.s, data.color.v, storedColor.a === undefined ? undefined : (data.color.a ?? storedColor.a));\r\n const changedStoredColor = isLinearMode ? ConvertColorSpace(changedGammaColor, GammaChannelToLinear) : changedGammaColor;\r\n const changedValue = adapter.createColor(changedStoredColor, currentValue);\r\n setCurrentValue(changedValue);\r\n onChange(changedValue);\r\n };\r\n\r\n return (\r\n <Popover\r\n trigger={\r\n <ColorSwatch\r\n {...rest}\r\n className={classes.trigger}\r\n borderColor={tokens.colorNeutralShadowKeyDarker}\r\n size={size === \"small\" ? \"extra-small\" : \"small\"}\r\n shape=\"rounded\"\r\n color={hexColor}\r\n value={hexColor.slice(1)}\r\n />\r\n }\r\n >\r\n <FluentColorPicker className={classes.picker} color={RgbToHsv(gammaColor)} onColorChange={handleColorPickerChange}>\r\n {/* Fluent's API requires the native ARIA attribute spelling. */}\r\n {/* eslint-disable-next-line @typescript-eslint/naming-convention */}\r\n <ColorArea inputX={{ \"aria-label\": \"Saturation\" }} inputY={{ \"aria-label\": \"Brightness\" }} />\r\n <ColorSlider aria-label=\"Hue\" />\r\n {storedColor.a !== undefined ? <AlphaSlider aria-label=\"Alpha\" /> : undefined}\r\n </FluentColorPicker>\r\n </Popover>\r\n );\r\n};\r\n","import { type Color3, type Color4 } from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { ControlledColorPropertyLine, type ColorPropertyLineAdapter } from \"shared-ui-components/fluent/hoc/propertyLines/colorPropertyLineCore\";\r\nimport { type PropertyLineProps } from \"shared-ui-components/fluent/hoc/propertyLines/propertyLine\";\r\nimport { StructuralColorPickerPopup, type StructuralColorPickerProps, type StructuralColor } from \"shared-ui-components/fluent/primitives/structuralColorPicker\";\r\n\r\nexport type Color3Value = Color3 | readonly [number, number, number];\r\nexport type Color4Value = Color4 | readonly [number, number, number, number];\r\n\r\nexport type ColorPickerProps<ValueT extends Color3Value | Color4Value> = Omit<StructuralColorPickerProps<ValueT>, \"adapter\">;\r\nexport type ColorPropertyLineProps<ValueT extends Color3Value | Color4Value> = ColorPickerProps<ValueT> & PropertyLineProps<ValueT>;\r\n\r\nfunction IsColor4Value(value: Color3Value | Color4Value): value is Color4Value {\r\n return \"r\" in value ? \"a\" in value : value.length === 4;\r\n}\r\n\r\nfunction GetStructuralColor(value: Color3Value | Color4Value): StructuralColor {\r\n if (!(\"r\" in value)) {\r\n return {\r\n r: value[0],\r\n g: value[1],\r\n b: value[2],\r\n ...(value.length === 4 ? { a: value[3] } : {}),\r\n };\r\n }\r\n return value;\r\n}\r\n\r\nfunction CreateColor3Value(color: StructuralColor, source: Color3Value): Color3Value {\r\n if (!(\"r\" in source)) {\r\n return [color.r, color.g, color.b];\r\n }\r\n return {\r\n r: color.r,\r\n g: color.g,\r\n b: color.b,\r\n };\r\n}\r\n\r\nfunction CreateColor4Value(color: StructuralColor, source: Color4Value): Color4Value {\r\n if (!(\"r\" in source)) {\r\n return [color.r, color.g, color.b, color.a ?? source[3]];\r\n }\r\n return {\r\n r: color.r,\r\n g: color.g,\r\n b: color.b,\r\n a: color.a ?? source.a,\r\n };\r\n}\r\n\r\nconst Picker: FunctionComponent<ColorPickerProps<Color3Value | Color4Value>> = (props) => (\r\n <StructuralColorPickerPopup\r\n {...props}\r\n adapter={{\r\n getColor: GetStructuralColor,\r\n createColor: (color, source) => (IsColor4Value(source) ? CreateColor4Value(color, source) : CreateColor3Value(color, source)),\r\n }}\r\n />\r\n);\r\n\r\nconst Adapter: ColorPropertyLineAdapter<Color3Value | Color4Value> = {\r\n picker: Picker,\r\n getColor: GetStructuralColor,\r\n createColor: (color, source) => (IsColor4Value(source) ? CreateColor4Value(color, source) : CreateColor3Value(color, source)),\r\n};\r\n\r\nexport const Color3PropertyLine: FunctionComponent<ColorPropertyLineProps<Color3Value>> = (props) => (\r\n <ControlledColorPropertyLine {...props} adapter={Adapter as ColorPropertyLineAdapter<Color3Value>} />\r\n);\r\nexport const Color4PropertyLine: FunctionComponent<ColorPropertyLineProps<Color4Value>> = (props) => (\r\n <ControlledColorPropertyLine {...props} adapter={Adapter as ColorPropertyLineAdapter<Color4Value>} />\r\n);\r\n","import { type DirectionalLight, type HemisphericLight, type LightBase, type PointLight, type SpotLight, type Vec3 } from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { NumberInputPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/inputPropertyLine\";\r\nimport { TextPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/textPropertyLine\";\r\n\r\nimport { BoundProperty, DerivedProperty } from \"../../../components/properties/boundProperty\";\r\nimport { SetVector3Value } from \"../../sceneEntityUtils\";\r\nimport { Color3PropertyLine, type Color3Value } from \"shared-ui-components/lite/fluent/hoc/propertyLines/colorPropertyLine\";\r\nimport { Vector3PropertyLine } from \"shared-ui-components/lite/fluent/hoc/propertyLines/vectorPropertyLine\";\r\n\r\ntype DirtyVector = Vec3 & { set(x: number, y: number, z: number): void };\r\ntype LightPropertyTarget = ({ direction: DirtyVector } | { position: DirtyVector }) & object;\r\ntype ColoredLight = DirectionalLight | PointLight | SpotLight;\r\ntype EditableLight = ColoredLight | HemisphericLight;\r\ntype RangedLight = PointLight | SpotLight;\r\n\r\nfunction GetVector3(value: Vec3): readonly [number, number, number] {\r\n return [value.x, value.y, value.z];\r\n}\r\n\r\n/**\r\n * Updates a plain Babylon Lite light property and marks its GPU light data dirty through a public observable transform.\r\n * @param light The light to update.\r\n * @param propertyKey The property to update.\r\n * @param value The new property value.\r\n */\r\nexport function SetLightProperty<T extends LightPropertyTarget, K extends keyof T>(light: T, propertyKey: K, value: T[K]): void {\r\n light[propertyKey] = value;\r\n const dirtyVector = \"direction\" in light ? light.direction : light.position;\r\n dirtyVector.set(dirtyVector.x, dirtyVector.y, dirtyVector.z);\r\n}\r\n\r\nfunction GetDiffuse(light: ColoredLight): ColoredLight[\"diffuse\"] {\r\n return light.diffuse;\r\n}\r\n\r\nfunction ToColorTuple(value: Color3Value): [number, number, number] {\r\n return \"r\" in value ? [value.r, value.g, value.b] : [value[0], value[1], value[2]];\r\n}\r\n\r\nfunction SetDiffuse(light: ColoredLight, value: Color3Value): void {\r\n SetLightProperty(light, \"diffuse\", ToColorTuple(value));\r\n}\r\n\r\nfunction GetSpecular(light: ColoredLight): ColoredLight[\"specular\"] {\r\n return light.specular;\r\n}\r\n\r\nfunction SetSpecular(light: ColoredLight, value: Color3Value): void {\r\n SetLightProperty(light, \"specular\", ToColorTuple(value));\r\n}\r\n\r\nfunction GetIntensity(light: EditableLight): number {\r\n return light.intensity;\r\n}\r\n\r\nfunction SetIntensity(light: EditableLight, value: number): void {\r\n SetLightProperty(light, \"intensity\", value);\r\n}\r\n\r\nfunction GetRange(light: RangedLight): number {\r\n return light.range;\r\n}\r\n\r\nfunction SetRange(light: RangedLight, value: number): void {\r\n SetLightProperty(light, \"range\", value);\r\n}\r\n\r\nfunction GetExponent(light: SpotLight): number {\r\n return light.exponent;\r\n}\r\n\r\nfunction SetExponent(light: SpotLight, value: number): void {\r\n SetLightProperty(light, \"exponent\", value);\r\n}\r\n\r\nfunction GetDiffuseColor(light: HemisphericLight): HemisphericLight[\"diffuseColor\"] {\r\n return light.diffuseColor;\r\n}\r\n\r\nfunction SetDiffuseColor(light: HemisphericLight, value: Color3Value): void {\r\n SetLightProperty(light, \"diffuseColor\", ToColorTuple(value));\r\n}\r\n\r\nfunction GetSpecularColor(light: HemisphericLight): HemisphericLight[\"specularColor\"] {\r\n return light.specularColor;\r\n}\r\n\r\nfunction SetSpecularColor(light: HemisphericLight, value: Color3Value): void {\r\n SetLightProperty(light, \"specularColor\", ToColorTuple(value));\r\n}\r\n\r\nfunction GetGroundColor(light: HemisphericLight): HemisphericLight[\"groundColor\"] {\r\n return light.groundColor;\r\n}\r\n\r\nfunction SetGroundColor(light: HemisphericLight, value: Color3Value): void {\r\n SetLightProperty(light, \"groundColor\", ToColorTuple(value));\r\n}\r\n\r\nexport const LightGeneralProperties: FunctionComponent<{ light: LightBase }> = (props) => {\r\n const { light } = props;\r\n return <TextPropertyLine label=\"Type\" value={light.lightType} />;\r\n};\r\n\r\nexport const DirectionalLightSetupProperties: FunctionComponent<{ light: DirectionalLight }> = (props) => {\r\n const { light } = props;\r\n return (\r\n <>\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Position\" target={light.position} getValue={GetVector3} setValue={SetVector3Value} />\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Direction\" target={light.direction} getValue={GetVector3} setValue={SetVector3Value} />\r\n <DerivedProperty component={Color3PropertyLine} label=\"Diffuse\" target={light} getValue={GetDiffuse} setValue={SetDiffuse} isLinearMode />\r\n <DerivedProperty component={Color3PropertyLine} label=\"Specular\" target={light} getValue={GetSpecular} setValue={SetSpecular} isLinearMode />\r\n <DerivedProperty component={NumberInputPropertyLine} label=\"Intensity\" target={light} getValue={GetIntensity} setValue={SetIntensity} />\r\n </>\r\n );\r\n};\r\n\r\nexport const PointLightSetupProperties: FunctionComponent<{ light: PointLight }> = (props) => {\r\n const { light } = props;\r\n return (\r\n <>\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Position\" target={light.position} getValue={GetVector3} setValue={SetVector3Value} />\r\n <DerivedProperty component={Color3PropertyLine} label=\"Diffuse\" target={light} getValue={GetDiffuse} setValue={SetDiffuse} isLinearMode />\r\n <DerivedProperty component={Color3PropertyLine} label=\"Specular\" target={light} getValue={GetSpecular} setValue={SetSpecular} isLinearMode />\r\n <DerivedProperty component={NumberInputPropertyLine} label=\"Intensity\" target={light} getValue={GetIntensity} setValue={SetIntensity} />\r\n <DerivedProperty component={NumberInputPropertyLine} label=\"Range\" target={light} getValue={GetRange} setValue={SetRange} />\r\n </>\r\n );\r\n};\r\n\r\nexport const SpotLightSetupProperties: FunctionComponent<{ light: SpotLight }> = (props) => {\r\n const { light } = props;\r\n return (\r\n <>\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Position\" target={light.position} getValue={GetVector3} setValue={SetVector3Value} />\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Direction\" target={light.direction} getValue={GetVector3} setValue={SetVector3Value} />\r\n <DerivedProperty component={Color3PropertyLine} label=\"Diffuse\" target={light} getValue={GetDiffuse} setValue={SetDiffuse} isLinearMode />\r\n <DerivedProperty component={Color3PropertyLine} label=\"Specular\" target={light} getValue={GetSpecular} setValue={SetSpecular} isLinearMode />\r\n <DerivedProperty component={NumberInputPropertyLine} label=\"Intensity\" target={light} getValue={GetIntensity} setValue={SetIntensity} />\r\n <DerivedProperty component={NumberInputPropertyLine} label=\"Range\" target={light} getValue={GetRange} setValue={SetRange} />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Angle\" target={light} propertyKey=\"angle\" unit=\"rad\" min={0} max={Math.PI} />\r\n <DerivedProperty component={NumberInputPropertyLine} label=\"Exponent\" target={light} getValue={GetExponent} setValue={SetExponent} min={0} />\r\n </>\r\n );\r\n};\r\n\r\nexport const HemisphericLightSetupProperties: FunctionComponent<{ light: HemisphericLight }> = (props) => {\r\n const { light } = props;\r\n return (\r\n <>\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Direction\" target={light.direction} getValue={GetVector3} setValue={SetVector3Value} />\r\n <DerivedProperty component={Color3PropertyLine} label=\"Diffuse\" target={light} getValue={GetDiffuseColor} setValue={SetDiffuseColor} isLinearMode />\r\n <DerivedProperty component={Color3PropertyLine} label=\"Specular\" target={light} getValue={GetSpecularColor} setValue={SetSpecularColor} isLinearMode />\r\n <DerivedProperty component={Color3PropertyLine} label=\"Ground\" target={light} getValue={GetGroundColor} setValue={SetGroundColor} isLinearMode />\r\n <DerivedProperty component={NumberInputPropertyLine} label=\"Intensity\" target={light} getValue={GetIntensity} setValue={SetIntensity} />\r\n </>\r\n );\r\n};\r\n","import { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport {\r\n DirectionalLightSetupProperties,\r\n HemisphericLightSetupProperties,\r\n LightGeneralProperties,\r\n PointLightSetupProperties,\r\n SpotLightSetupProperties,\r\n} from \"../../../components/properties/lightProperties\";\r\nimport { IsDirectionalLight, IsHemisphericLight, IsLight, IsPointLight, IsSpotLight } from \"../../../sceneEntityUtils\";\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\n\r\nexport const LightPropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService]> = {\r\n friendlyName: \"Babylon Lite Light Properties\",\r\n consumes: [PropertiesServiceIdentity],\r\n factory: (propertiesService) => {\r\n const registrations = [\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Light Properties\",\r\n predicate: IsLight,\r\n content: [{ section: \"General\", component: ({ context }) => <LightGeneralProperties light={context} /> }],\r\n }),\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Directional Light Properties\",\r\n predicate: IsDirectionalLight,\r\n content: [{ section: \"Setup\", component: ({ context }) => <DirectionalLightSetupProperties light={context} /> }],\r\n }),\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Point Light Properties\",\r\n predicate: IsPointLight,\r\n content: [{ section: \"Setup\", component: ({ context }) => <PointLightSetupProperties light={context} /> }],\r\n }),\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Spot Light Properties\",\r\n predicate: IsSpotLight,\r\n content: [{ section: \"Setup\", component: ({ context }) => <SpotLightSetupProperties light={context} /> }],\r\n }),\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Hemispheric Light Properties\",\r\n predicate: IsHemisphericLight,\r\n content: [{ section: \"Setup\", component: ({ context }) => <HemisphericLightSetupProperties light={context} /> }],\r\n }),\r\n ];\r\n\r\n return {\r\n dispose: () => registrations.forEach((registration) => registration.dispose()),\r\n };\r\n },\r\n};\r\n","import { getMaterialFamily, type Material } from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { TextInputPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/inputPropertyLine\";\r\nimport { TextPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/textPropertyLine\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { BoundProperty } from \"../../../../components/properties/boundProperty\";\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\n\r\nfunction IsMaterial(entity: unknown): entity is Material {\r\n return typeof entity === \"object\" && entity !== null && getMaterialFamily(entity as Material) !== undefined;\r\n}\r\n\r\nconst MaterialProperties: FunctionComponent<{ material: Material }> = (props) => {\r\n const { material } = props;\r\n\r\n return (\r\n <>\r\n <BoundProperty component={TextInputPropertyLine} label=\"Name\" target={material} propertyKey=\"name\" ignoreNullable defaultValue=\"\" />\r\n <TextPropertyLine label=\"Family\" value={getMaterialFamily(material) ?? \"Unknown\"} />\r\n </>\r\n );\r\n};\r\n\r\nexport const MaterialPropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService]> = {\r\n friendlyName: \"Babylon Lite Material Properties\",\r\n consumes: [PropertiesServiceIdentity],\r\n factory: (propertiesService) =>\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Material Properties\",\r\n predicate: IsMaterial,\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <MaterialProperties material={context} />,\r\n },\r\n ],\r\n }),\r\n};\r\n","import { type Mesh } from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { SwitchPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/switchPropertyLine\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { BoundProperty } from \"../../../../components/properties/boundProperty\";\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\nimport { IsMesh } from \"../../../sceneEntityUtils\";\r\n\r\nconst MeshGeneralProperties: FunctionComponent<{ mesh: Mesh }> = (props) => {\r\n const { mesh } = props;\r\n\r\n return <BoundProperty component={SwitchPropertyLine} label=\"Receive Shadows\" target={mesh} propertyKey=\"receiveShadows\" />;\r\n};\r\n\r\nexport const MeshPropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService]> = {\r\n friendlyName: \"Babylon Lite Mesh Properties\",\r\n consumes: [PropertiesServiceIdentity],\r\n factory: (propertiesService) =>\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Mesh Properties\",\r\n predicate: IsMesh,\r\n content: [\r\n {\r\n section: \"Rendering\",\r\n component: ({ context }) => <MeshGeneralProperties mesh={context} />,\r\n },\r\n ],\r\n }),\r\n};\r\n","import {\r\n getRenderingContextKind,\r\n getRenderingContexts,\r\n type EngineContext,\r\n type RenderingContext,\r\n type SceneContext,\r\n type SpriteRenderer,\r\n type TextRenderer,\r\n} from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { NumberInputPropertyLine, TextInputPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/inputPropertyLine\";\r\nimport { StringifiedPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/stringifiedPropertyLine\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { BoundProperty, ComputedProperty } from \"../../../../components/properties/boundProperty\";\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\nimport { type IEngineContext, EngineContextIdentity } from \"../../../engineContext\";\r\n\r\nconst GetMeshCount = (scene: SceneContext) => scene.meshes.length;\r\nconst GetLightCount = (scene: SceneContext) => scene.lights.length;\r\nconst GetAnimationGroupCount = (scene: SceneContext) => scene.animationGroups.length;\r\nconst GetShadowGeneratorCount = (scene: SceneContext) => scene.shadowGenerators.length;\r\nconst GetTextLayerCount = (renderer: TextRenderer) => renderer.layers.length;\r\nconst GetSpriteLayerCount = (renderer: SpriteRenderer) => renderer.layers.length;\r\n\r\nfunction IsRegisteredRenderingContext(engine: EngineContext, entity: unknown): entity is RenderingContext {\r\n return typeof entity === \"object\" && entity !== null && engine.surfaces.some((surface) => getRenderingContexts(surface).includes(entity as RenderingContext));\r\n}\r\n\r\nconst SceneProperties: FunctionComponent<{ scene: SceneContext }> = (props) => {\r\n const { scene } = props;\r\n\r\n return (\r\n <>\r\n <BoundProperty component={TextInputPropertyLine} label=\"Name\" target={scene} propertyKey=\"name\" ignoreNullable defaultValue=\"\" />\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"Mesh Count\" target={scene} getValue={GetMeshCount} />\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"Light Count\" target={scene} getValue={GetLightCount} />\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"Animation Group Count\" target={scene} getValue={GetAnimationGroupCount} />\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"Shadow Generator Count\" target={scene} getValue={GetShadowGeneratorCount} />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Fixed Delta (ms)\" target={scene} propertyKey=\"fixedDeltaMs\" min={0} step={1} />\r\n </>\r\n );\r\n};\r\n\r\nconst TextRendererProperties: FunctionComponent<{ renderer: TextRenderer }> = (props) => {\r\n const { renderer } = props;\r\n\r\n return <ComputedProperty component={StringifiedPropertyLine} label=\"Layer Count\" target={renderer} getValue={GetTextLayerCount} />;\r\n};\r\n\r\nconst SpriteRendererProperties: FunctionComponent<{ renderer: SpriteRenderer }> = (props) => {\r\n const { renderer } = props;\r\n\r\n return <ComputedProperty component={StringifiedPropertyLine} label=\"Layer Count\" target={renderer} getValue={GetSpriteLayerCount} />;\r\n};\r\n\r\nexport const RenderingContextPropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService, IEngineContext]> = {\r\n friendlyName: \"Babylon Lite Rendering Context Properties\",\r\n consumes: [PropertiesServiceIdentity, EngineContextIdentity],\r\n factory: (propertiesService, engineContext) => {\r\n const engine = engineContext.engine;\r\n const sceneRegistration = propertiesService.addSectionContent({\r\n key: \"Babylon Lite Scene Properties\",\r\n predicate: (entity: unknown): entity is SceneContext => {\r\n if (!IsRegisteredRenderingContext(engine, entity)) {\r\n return false;\r\n }\r\n return getRenderingContextKind(entity) === \"scene\";\r\n },\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <SceneProperties scene={context} />,\r\n },\r\n ],\r\n });\r\n const textRendererRegistration = propertiesService.addSectionContent({\r\n key: \"Babylon Lite Text Renderer Properties\",\r\n predicate: (entity: unknown): entity is TextRenderer => IsRegisteredRenderingContext(engine, entity) && getRenderingContextKind(entity) === \"text-renderer\",\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <TextRendererProperties renderer={context} />,\r\n },\r\n ],\r\n });\r\n const spriteRendererRegistration = propertiesService.addSectionContent({\r\n key: \"Babylon Lite Sprite Renderer Properties\",\r\n predicate: (entity: unknown): entity is SpriteRenderer => IsRegisteredRenderingContext(engine, entity) && getRenderingContextKind(entity) === \"sprite-renderer\",\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <SpriteRendererProperties renderer={context} />,\r\n },\r\n ],\r\n });\r\n\r\n return {\r\n dispose: () => {\r\n sceneRegistration.dispose();\r\n textRendererRegistration.dispose();\r\n spriteRendererRegistration.dispose();\r\n },\r\n };\r\n },\r\n};\r\n","import { type FunctionComponent, useContext, useEffect, useMemo, useState } from \"react\";\r\n\r\nimport { Body1, Button, makeStyles, tokens, Tooltip } from \"@fluentui/react-components\";\r\nimport { ArrowUndoRegular, BracesDismiss16Regular, BracesRegular, SaveRegular } from \"@fluentui/react-icons\";\r\n\r\nimport { ButtonLine } from \"shared-ui-components/fluent/hoc/buttonLine\";\r\nimport { ToolContext } from \"shared-ui-components/fluent/hoc/fluentToolWrapper\";\r\nimport { LineContainer } from \"shared-ui-components/fluent/hoc/propertyLines/propertyLine\";\r\nimport { SwitchPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/switchPropertyLine\";\r\nimport { TextPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/textPropertyLine\";\r\nimport { Collapse } from \"shared-ui-components/fluent/primitives/collapse\";\r\nimport { Textarea } from \"shared-ui-components/fluent/primitives/textarea\";\r\nimport { useProperty } from \"../../hooks/compoundPropertyHooks\";\r\n\r\ntype MetadataTypes = \"null\" | \"string\" | \"object\" | \"JSON\";\r\n\r\nconst PrettyJSONIndent = 2;\r\n\r\nfunction IsParsable(metadata: unknown): metadata is string {\r\n try {\r\n const parsed = JSON.parse(metadata as string);\r\n return !!parsed && !IsString(parsed);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Checks if the input is a string.\r\n * @param input - any input to check\r\n * @returns boolean - true if the input is a string, false otherwise\r\n */\r\nfunction IsString(input: unknown): input is string {\r\n return typeof input === \"string\" || input instanceof String;\r\n}\r\n\r\n/**\r\n * Checks recursively for functions on an object and returns `false` if any are found.\r\n * @param o any object, string or number\r\n * @returns boolean\r\n */\r\nfunction ObjectCanSafelyStringify(o: unknown): boolean {\r\n if (typeof o === \"function\") {\r\n return false;\r\n }\r\n if (o === null || o === true || o === false || typeof o === \"number\" || IsString(o)) {\r\n return true;\r\n }\r\n\r\n if (typeof o === \"object\") {\r\n if (Object.values(o).length === 0) {\r\n return true;\r\n }\r\n return Object.values(o as Record<string, unknown>).every((value) => ObjectCanSafelyStringify(value));\r\n }\r\n\r\n if (Array.isArray(o)) {\r\n return o.every((value) => ObjectCanSafelyStringify(value));\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction GetMetadataEntityType(metadata: unknown): MetadataTypes {\r\n if (metadata == null) {\r\n return \"null\";\r\n } else if (IsString(metadata)) {\r\n return \"string\";\r\n } else if (!ObjectCanSafelyStringify(metadata)) {\r\n return \"object\";\r\n } else {\r\n return \"JSON\";\r\n }\r\n}\r\n\r\nfunction HasGltfExtras(metadata: string) {\r\n return IsParsable(metadata) && !!JSON.parse(metadata).gltf;\r\n}\r\n\r\nfunction StringifyMetadata(metadata: unknown, format: boolean) {\r\n if (IsString(metadata)) {\r\n return metadata;\r\n }\r\n\r\n if (metadata) {\r\n // Try JSON.stringify even for objects with functions — it safely omits\r\n // function-valued and undefined properties. Only fall back to String()\r\n // for cases that actually throw (e.g. circular references).\r\n try {\r\n return JSON.stringify(metadata, undefined, format ? PrettyJSONIndent : undefined);\r\n } catch {\r\n return String(metadata);\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction Restringify(value: string, format: boolean) {\r\n return IsParsable(value) ? JSON.stringify(JSON.parse(value), undefined, format ? PrettyJSONIndent : undefined) : value;\r\n}\r\n\r\nfunction PopulateGLTFExtras(metadata: string) {\r\n if (!metadata) {\r\n metadata = \"{}\";\r\n }\r\n\r\n if (!IsParsable(metadata)) {\r\n return metadata;\r\n }\r\n\r\n try {\r\n const parsedJson = JSON.parse(metadata);\r\n if (parsedJson) {\r\n if (Reflect.has(parsedJson, \"gltf\")) {\r\n if (!Reflect.has(parsedJson.gltf, \"extras\")) {\r\n parsedJson.gltf.extras = {};\r\n }\r\n } else {\r\n parsedJson.gltf = { extras: {} };\r\n }\r\n }\r\n\r\n return JSON.stringify(parsedJson);\r\n } catch {\r\n return metadata;\r\n }\r\n}\r\n\r\nfunction SaveMetadata(entity: IMetadataContainer, metadata: string) {\r\n if (IsParsable(metadata)) {\r\n entity.metadata = JSON.parse(metadata);\r\n } else {\r\n entity.metadata = metadata;\r\n }\r\n}\r\n\r\n/**\r\n * An inspected entity that can carry user-defined metadata.\r\n */\r\nexport interface IMetadataContainer {\r\n /** User-defined metadata associated with the inspected entity. */\r\n metadata?: unknown;\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n mainDiv: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: tokens.spacingVerticalXS,\r\n },\r\n buttonDiv: {\r\n display: \"grid\",\r\n gridAutoFlow: \"column\",\r\n gridTemplateColumns: \"1fr auto auto auto\",\r\n gap: tokens.spacingHorizontalXS,\r\n },\r\n});\r\n\r\n/**\r\n * Component to display metadata properties of an entity.\r\n * @param props - The properties for the component.\r\n * @returns A React component that displays metadata properties.\r\n */\r\nexport const MetadataProperties: FunctionComponent<{ entity: IMetadataContainer }> = (props) => {\r\n const { entity } = props;\r\n\r\n const classes = useStyles();\r\n\r\n const { size } = useContext(ToolContext);\r\n\r\n const metadata = useProperty(entity, \"metadata\");\r\n const stringifiedMetadata = useMemo(() => StringifyMetadata(metadata, false) ?? \"\", [metadata]);\r\n const metadataType = useMemo(() => GetMetadataEntityType(metadata), [metadata]);\r\n const canPreventObjectCorruption = metadataType === \"object\";\r\n\r\n const [preventObjectCorruption, setPreventObjectCorruption] = useState(false);\r\n const isReadonly = canPreventObjectCorruption && preventObjectCorruption;\r\n\r\n const [editedMetadata, setEditedMetadata] = useState(stringifiedMetadata);\r\n useEffect(() => {\r\n setEditedMetadata(stringifiedMetadata);\r\n }, [stringifiedMetadata]);\r\n\r\n const isEditedMetadataJSON = useMemo(() => IsParsable(editedMetadata), [editedMetadata]);\r\n const unformattedEditedMetadata = useMemo(() => Restringify(editedMetadata, false), [editedMetadata]);\r\n\r\n return (\r\n <>\r\n <TextPropertyLine label=\"Property Type\" value={metadataType} />\r\n <Collapse visible={canPreventObjectCorruption}>\r\n <SwitchPropertyLine label=\"Prevent Object Corruption\" value={isReadonly} onChange={setPreventObjectCorruption} />\r\n </Collapse>\r\n <LineContainer uniqueId=\"MetadataTextarea\">\r\n <Textarea disabled={isReadonly} value={editedMetadata} onChange={setEditedMetadata} />\r\n </LineContainer>\r\n <ButtonLine\r\n label=\"Populate glTF extras\"\r\n disabled={!!editedMetadata && (!IsParsable(editedMetadata) || HasGltfExtras(editedMetadata))}\r\n onClick={() => {\r\n const isFormatted = Restringify(editedMetadata, true) === editedMetadata;\r\n let withGLTFExtras = PopulateGLTFExtras(editedMetadata);\r\n if (isFormatted) {\r\n withGLTFExtras = Restringify(withGLTFExtras, true);\r\n }\r\n setEditedMetadata(withGLTFExtras);\r\n }}\r\n />\r\n <LineContainer uniqueId=\"MetadataButtonDiv\">\r\n <div className={classes.buttonDiv}>\r\n {/* TODO: gehalper - need to update our Button primitive to accommodate these scenarios. */}\r\n <Button size={size} icon={<SaveRegular />} disabled={stringifiedMetadata === unformattedEditedMetadata} onClick={() => SaveMetadata(entity, editedMetadata)}>\r\n <Body1>Save</Body1>\r\n </Button>\r\n <Tooltip content=\"Undo Changes\" relationship=\"label\">\r\n <Button\r\n size={size}\r\n icon={<ArrowUndoRegular />}\r\n disabled={stringifiedMetadata === unformattedEditedMetadata}\r\n onClick={() => setEditedMetadata(stringifiedMetadata)}\r\n />\r\n </Tooltip>\r\n <Tooltip content=\"Format (Pretty Print)\" relationship=\"label\">\r\n <Button size={size} icon={<BracesRegular />} disabled={!isEditedMetadataJSON} onClick={() => setEditedMetadata(Restringify(editedMetadata, true))}></Button>\r\n </Tooltip>\r\n <Tooltip content=\"Clear Formatting (Undo Pretty Print)\" relationship=\"label\">\r\n <Button\r\n size={size}\r\n icon={<BracesDismiss16Regular />}\r\n disabled={!isEditedMetadataJSON}\r\n onClick={() => setEditedMetadata(Restringify(editedMetadata, false))}\r\n />\r\n </Tooltip>\r\n </div>\r\n </LineContainer>\r\n </>\r\n );\r\n};\r\n","import { setSubtreeVisible, type SceneNode } from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { TextInputPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/inputPropertyLine\";\r\nimport { SwitchPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/switchPropertyLine\";\r\nimport { useSetting } from \"shared-ui-components/modularTool/hooks/settingsHooks\";\r\n\r\nimport { BoundProperty, DerivedProperty } from \"../../../components/properties/boundProperty\";\r\nimport { UseDegreesSettingDescriptor, UseEulerSettingDescriptor } from \"../../../services/globalSettings\";\r\nimport { SetQuaternionValue, SetVector3Value } from \"../../sceneEntityUtils\";\r\nimport { QuaternionPropertyLine, Vector3PropertyLine } from \"shared-ui-components/lite/fluent/hoc/propertyLines/vectorPropertyLine\";\r\n\r\nfunction GetPosition(node: SceneNode): readonly [number, number, number] {\r\n return [node.position.x, node.position.y, node.position.z];\r\n}\r\n\r\nfunction GetRotation(node: SceneNode): readonly [number, number, number, number] {\r\n return [node.rotationQuaternion.x, node.rotationQuaternion.y, node.rotationQuaternion.z, node.rotationQuaternion.w];\r\n}\r\n\r\nfunction GetScaling(node: SceneNode): readonly [number, number, number] {\r\n return [node.scaling.x, node.scaling.y, node.scaling.z];\r\n}\r\n\r\nfunction GetVisibility(node: SceneNode): boolean {\r\n return node.visible !== false;\r\n}\r\n\r\nfunction SetVisibility(node: SceneNode, visible: boolean): void {\r\n setSubtreeVisible(node, visible);\r\n}\r\n\r\nfunction SetPosition(node: SceneNode, value: Parameters<typeof SetVector3Value>[1]): void {\r\n SetVector3Value(node.position, value);\r\n}\r\n\r\nfunction SetRotation(node: SceneNode, value: Parameters<typeof SetQuaternionValue>[1]): void {\r\n SetQuaternionValue(node.rotationQuaternion, value);\r\n}\r\n\r\nfunction SetScaling(node: SceneNode, value: Parameters<typeof SetVector3Value>[1]): void {\r\n SetVector3Value(node.scaling, value);\r\n}\r\n\r\nexport const SceneNodeGeneralProperties: FunctionComponent<{ node: SceneNode }> = (props) => {\r\n const { node } = props;\r\n\r\n return (\r\n <>\r\n <BoundProperty component={TextInputPropertyLine} label=\"Name\" target={node} propertyKey=\"name\" />\r\n <DerivedProperty component={SwitchPropertyLine} label=\"Visible\" target={node} getValue={GetVisibility} setValue={SetVisibility} />\r\n </>\r\n );\r\n};\r\n\r\nexport const SceneNodeTransformProperties: FunctionComponent<{ node: SceneNode }> = (props) => {\r\n const { node } = props;\r\n const [useDegrees] = useSetting(UseDegreesSettingDescriptor);\r\n const [useEuler] = useSetting(UseEulerSettingDescriptor);\r\n\r\n return (\r\n <>\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Position\" target={node} getValue={GetPosition} setValue={SetPosition} />\r\n <DerivedProperty\r\n component={QuaternionPropertyLine}\r\n label=\"Rotation\"\r\n target={node}\r\n getValue={GetRotation}\r\n setValue={SetRotation}\r\n useDegrees={useDegrees}\r\n useEuler={useEuler}\r\n />\r\n <DerivedProperty component={Vector3PropertyLine} label=\"Scaling\" target={node} getValue={GetScaling} setValue={SetScaling} step={0.1} />\r\n </>\r\n );\r\n};\r\n","import { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { MetadataProperties } from \"../../../../components/properties/metadataProperties\";\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\nimport { IsSceneNode } from \"../../../sceneEntityUtils\";\r\nimport { SceneNodeGeneralProperties, SceneNodeTransformProperties } from \"../../../components/properties/sceneNodeProperties\";\r\n\r\nexport const SceneNodePropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService]> = {\r\n friendlyName: \"Babylon Lite Scene Node Properties\",\r\n consumes: [PropertiesServiceIdentity],\r\n factory: (propertiesService) =>\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Scene Node Properties\",\r\n predicate: IsSceneNode,\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <SceneNodeGeneralProperties node={context} />,\r\n },\r\n {\r\n section: \"Transform\",\r\n component: ({ context }) => <SceneNodeTransformProperties node={context} />,\r\n },\r\n {\r\n section: \"Metadata\",\r\n component: ({ context }) => <MetadataProperties entity={context} />,\r\n },\r\n ],\r\n }),\r\n};\r\n","import { getRenderingContextKind, type RenderingContext, type SceneContext } from \"@babylonjs/lite\";\r\nimport { type ComponentType } from \"react\";\r\n\r\nimport { type ExplorerDisplayInfo, type ExplorerNodeDescription, GetEntityId } from \"../../../../components/explorer/explorerModel\";\r\n\r\n/**\r\n * Returns whether a rendering context is a scene context.\r\n * @param context The rendering context to test.\r\n * @returns Whether the context is a scene context.\r\n */\r\nexport function IsSceneContext(context: RenderingContext): context is SceneContext {\r\n return getRenderingContextKind(context) === \"scene\";\r\n}\r\n\r\n/**\r\n * Creates an Explorer section containing the supplied scene entities.\r\n * @param id The stable section identifier.\r\n * @param displayName The section's display name.\r\n * @param entities The entities displayed by the section.\r\n * @param getEntityDisplayInfo Gets the display information for an entity.\r\n * @param entityIcon The optional icon component for the entities.\r\n * @returns The Explorer node description for the section.\r\n */\r\nexport function CreateSceneExplorerSectionNode<T extends object>(\r\n id: string,\r\n displayName: string,\r\n entities: readonly T[],\r\n getEntityDisplayInfo: (entity: T, index: number) => ExplorerDisplayInfo,\r\n entityIcon?: ComponentType<{ entity: object }>\r\n): ExplorerNodeDescription {\r\n return {\r\n id,\r\n kind: \"group\",\r\n getDisplayInfo: () => ({ name: displayName }),\r\n getChildren: () =>\r\n entities.map((entity, index) => ({\r\n id: GetEntityId(entity).toString(),\r\n kind: \"item\",\r\n entity,\r\n icon: entityIcon,\r\n getDisplayInfo: () => getEntityDisplayInfo(entity, index),\r\n })),\r\n };\r\n}\r\n","import { getRenderingContexts, type SceneContext, type ShadowGenerator } from \"@babylonjs/lite\";\r\n\r\nimport { TextPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/textPropertyLine\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { EngineContextIdentity, type IEngineContext } from \"../../../engineContext\";\r\nimport { GetShadowGeneratorDisplayName } from \"../../../sceneEntityUtils\";\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\nimport { IsSceneContext } from \"../scene/sceneExplorerSection\";\r\n\r\nfunction GetScenes(engineContext: IEngineContext): readonly SceneContext[] {\r\n return engineContext.engine.surfaces.flatMap((surface) => getRenderingContexts(surface).filter(IsSceneContext));\r\n}\r\n\r\nexport const ShadowGeneratorPropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService, IEngineContext]> = {\r\n friendlyName: \"Babylon Lite Shadow Generator Properties\",\r\n consumes: [PropertiesServiceIdentity, EngineContextIdentity],\r\n factory: (propertiesService, engineContext) =>\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Shadow Generator Properties\",\r\n predicate: (entity: unknown): entity is ShadowGenerator =>\r\n typeof entity === \"object\" && entity !== null && GetScenes(engineContext).some((scene) => scene.shadowGenerators.includes(entity)),\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => {\r\n const scene = GetScenes(engineContext).find((candidate) => candidate.shadowGenerators.includes(context));\r\n return <TextPropertyLine label=\"Identity\" value={scene ? GetShadowGeneratorDisplayName(scene, context) : \"Shadow Generator\"} />;\r\n },\r\n },\r\n ],\r\n }),\r\n};\r\n","import { getRenderingContextKind, getRenderingContexts, type EngineContext, type RenderingContext } from \"@babylonjs/lite\";\r\n\r\ntype OrderedRenderingLayer = object & {\r\n order: number;\r\n};\r\n\r\ntype LayerRenderingContext<LayerT extends object> = RenderingContext & {\r\n readonly layers: readonly LayerT[];\r\n};\r\n\r\ntype LayerOrderMarker = {\r\n order: number;\r\n marker: object;\r\n};\r\n\r\nconst LayerOrderMarkers = new WeakMap<OrderedRenderingLayer, LayerOrderMarker>();\r\n\r\nfunction GetLayerOrderMarker(layer: OrderedRenderingLayer): object {\r\n const existing = LayerOrderMarkers.get(layer);\r\n if (existing?.order === layer.order) {\r\n return existing.marker;\r\n }\r\n\r\n const marker = {};\r\n LayerOrderMarkers.set(layer, { order: layer.order, marker });\r\n return marker;\r\n}\r\n\r\nexport function GetOrderedRenderingLayers<LayerT extends OrderedRenderingLayer>(layers: readonly LayerT[]): readonly LayerT[] {\r\n return layers\r\n .map((layer, index) => ({ layer, index }))\r\n .sort((left, right) => left.layer.order - right.layer.order || left.index - right.index)\r\n .map(({ layer }) => layer);\r\n}\r\n\r\nexport function GetRenderingLayerSnapshot<LayerT extends OrderedRenderingLayer>(layers: readonly LayerT[]): readonly object[] {\r\n return layers.flatMap((layer) => [layer, GetLayerOrderMarker(layer)]);\r\n}\r\n\r\nexport function GetRenderingLayerOwners<LayerT extends object, ContextT extends LayerRenderingContext<LayerT>>(\r\n engine: EngineContext,\r\n contextKind: string,\r\n layer: LayerT\r\n): readonly ContextT[] {\r\n return engine.surfaces.flatMap((surface) =>\r\n getRenderingContexts(surface).filter(\r\n (context): context is ContextT => getRenderingContextKind(context) === contextKind && (context as LayerRenderingContext<LayerT>).layers.includes(layer)\r\n )\r\n );\r\n}\r\n\r\nexport function GetRenderingLayerDisplayName<LayerT extends OrderedRenderingLayer, ContextT extends LayerRenderingContext<LayerT>>(\r\n engine: EngineContext,\r\n contextKind: string,\r\n layer: LayerT,\r\n layerTypeName: string\r\n): string {\r\n const owners = GetRenderingLayerOwners<LayerT, ContextT>(engine, contextKind, layer);\r\n const index = owners.length === 1 ? GetOrderedRenderingLayers(owners[0].layers).indexOf(layer) : -1;\r\n return index === -1 ? layerTypeName : `${layerTypeName} ${index + 1}`;\r\n}\r\n","import {\r\n getRenderingContextKind,\r\n getRenderingContexts,\r\n spriteBlendAdditive,\r\n spriteBlendAlpha,\r\n spriteBlendMultiply,\r\n spriteBlendOneOne,\r\n spriteBlendOpaque,\r\n spriteBlendPremultiplied,\r\n type EngineContext,\r\n type Sprite2DLayer,\r\n type SpriteBlendMode,\r\n type SpriteRenderer,\r\n} from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { NumberInputPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/inputPropertyLine\";\r\nimport { StringifiedPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/stringifiedPropertyLine\";\r\nimport { SwitchPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/switchPropertyLine\";\r\nimport { TextPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/textPropertyLine\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { BoundProperty, ComputedProperty, DerivedProperty } from \"../../../../components/properties/boundProperty\";\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\nimport { type IEngineContext, EngineContextIdentity } from \"../../../engineContext\";\r\nimport { GetRenderingLayerDisplayName } from \"../../../renderingLayerUtils\";\r\n\r\nconst SpriteLayerDisplayNameGetters = new WeakMap<EngineContext, (layer: Sprite2DLayer) => string>();\r\n\r\nfunction GetSpriteLayerDisplayNameGetter(engine: EngineContext): (layer: Sprite2DLayer) => string {\r\n let getter = SpriteLayerDisplayNameGetters.get(engine);\r\n if (!getter) {\r\n getter = (layer) => GetRenderingLayerDisplayName<Sprite2DLayer, SpriteRenderer>(engine, \"sprite-renderer\", layer, \"Sprite Layer\");\r\n SpriteLayerDisplayNameGetters.set(engine, getter);\r\n }\r\n return getter;\r\n}\r\n\r\nfunction GetSpriteCount(layer: Sprite2DLayer): number {\r\n return layer.count;\r\n}\r\n\r\nfunction GetViewPositionX(layer: Sprite2DLayer): number {\r\n return layer.view.positionPx[0];\r\n}\r\n\r\nfunction SetViewPositionX(layer: Sprite2DLayer, value: number): void {\r\n layer.view.positionPx[0] = value;\r\n}\r\n\r\nfunction GetViewPositionY(layer: Sprite2DLayer): number {\r\n return layer.view.positionPx[1];\r\n}\r\n\r\nfunction SetViewPositionY(layer: Sprite2DLayer, value: number): void {\r\n layer.view.positionPx[1] = value;\r\n}\r\n\r\nfunction GetViewPosition(layer: Sprite2DLayer): Sprite2DLayer[\"view\"][\"positionPx\"] {\r\n return layer.view.positionPx;\r\n}\r\n\r\nfunction GetViewZoom(layer: Sprite2DLayer): number {\r\n return layer.view.zoom;\r\n}\r\n\r\nfunction SetViewZoom(layer: Sprite2DLayer, value: number): void {\r\n layer.view.zoom = value;\r\n}\r\n\r\nfunction IsNonZero(value: number): boolean {\r\n return value !== 0;\r\n}\r\n\r\nfunction GetView(layer: Sprite2DLayer): Sprite2DLayer[\"view\"] {\r\n return layer.view;\r\n}\r\n\r\nfunction GetViewRotation(layer: Sprite2DLayer): number {\r\n return layer.view.rotation;\r\n}\r\n\r\nfunction SetViewRotation(layer: Sprite2DLayer, value: number): void {\r\n layer.view.rotation = value;\r\n}\r\n\r\nfunction GetPivotX(layer: Sprite2DLayer): number {\r\n return layer.pivot[0];\r\n}\r\n\r\nfunction SetPivotX(layer: Sprite2DLayer, value: number): void {\r\n layer.pivot[0] = value;\r\n}\r\n\r\nfunction GetPivotY(layer: Sprite2DLayer): number {\r\n return layer.pivot[1];\r\n}\r\n\r\nfunction SetPivotY(layer: Sprite2DLayer, value: number): void {\r\n layer.pivot[1] = value;\r\n}\r\n\r\nfunction GetPivot(layer: Sprite2DLayer): Sprite2DLayer[\"pivot\"] {\r\n return layer.pivot;\r\n}\r\n\r\nfunction GetSpriteBlendModeName(blendMode: SpriteBlendMode): string {\r\n switch (blendMode) {\r\n case spriteBlendAlpha:\r\n return \"Alpha\";\r\n case spriteBlendPremultiplied:\r\n return \"Premultiplied\";\r\n case spriteBlendAdditive:\r\n return \"Additive\";\r\n case spriteBlendMultiply:\r\n return \"Multiply\";\r\n case spriteBlendOneOne:\r\n return \"One-One\";\r\n case spriteBlendOpaque:\r\n return \"Opaque\";\r\n default:\r\n return \"Unsupported descriptor\";\r\n }\r\n}\r\n\r\nfunction IsRegisteredSpriteLayer(engine: EngineContext, entity: unknown): entity is Sprite2DLayer {\r\n if (typeof entity !== \"object\" || entity === null) {\r\n return false;\r\n }\r\n\r\n return engine.surfaces.some((surface) =>\r\n getRenderingContexts(surface).some(\r\n (context) => getRenderingContextKind(context) === \"sprite-renderer\" && (context as SpriteRenderer).layers.includes(entity as Sprite2DLayer)\r\n )\r\n );\r\n}\r\n\r\nconst SpriteLayerProperties: FunctionComponent<{ engine: EngineContext; layer: Sprite2DLayer }> = (props) => {\r\n const { engine, layer } = props;\r\n\r\n return (\r\n <>\r\n <ComputedProperty component={TextPropertyLine} label=\"Name\" target={layer} getValue={GetSpriteLayerDisplayNameGetter(engine)} />\r\n <BoundProperty component={SwitchPropertyLine} label=\"Visible\" target={layer} propertyKey=\"visible\" />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Order\" target={layer} propertyKey=\"order\" />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Opacity\" target={layer} propertyKey=\"opacity\" min={0} max={1} step={0.01} />\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"Sprite Count\" target={layer} getValue={GetSpriteCount} />\r\n <TextPropertyLine label=\"Depth Mode\" value={layer.depth} />\r\n <TextPropertyLine label=\"Blend Mode\" value={GetSpriteBlendModeName(layer.blendMode)} />\r\n <DerivedProperty\r\n component={NumberInputPropertyLine}\r\n label=\"View Position X\"\r\n target={layer}\r\n getValue={GetViewPositionX}\r\n setValue={SetViewPositionX}\r\n propertyPath=\"view.positionPx[0]\"\r\n getPropertyOwner={GetViewPosition}\r\n propertyKey={0}\r\n step={1}\r\n unit=\"px\"\r\n />\r\n <DerivedProperty\r\n component={NumberInputPropertyLine}\r\n label=\"View Position Y\"\r\n target={layer}\r\n getValue={GetViewPositionY}\r\n setValue={SetViewPositionY}\r\n propertyPath=\"view.positionPx[1]\"\r\n getPropertyOwner={GetViewPosition}\r\n propertyKey={1}\r\n step={1}\r\n unit=\"px\"\r\n />\r\n <DerivedProperty\r\n component={NumberInputPropertyLine}\r\n label=\"View Zoom\"\r\n target={layer}\r\n getValue={GetViewZoom}\r\n setValue={SetViewZoom}\r\n propertyPath=\"view.zoom\"\r\n getPropertyOwner={GetView}\r\n propertyKey=\"zoom\"\r\n validator={IsNonZero}\r\n step={0.1}\r\n />\r\n <DerivedProperty\r\n component={NumberInputPropertyLine}\r\n label=\"View Rotation\"\r\n target={layer}\r\n getValue={GetViewRotation}\r\n setValue={SetViewRotation}\r\n propertyPath=\"view.rotation\"\r\n getPropertyOwner={GetView}\r\n propertyKey=\"rotation\"\r\n step={0.01}\r\n unit=\"rad\"\r\n />\r\n <DerivedProperty\r\n component={NumberInputPropertyLine}\r\n label=\"Pivot X\"\r\n target={layer}\r\n getValue={GetPivotX}\r\n setValue={SetPivotX}\r\n propertyPath=\"pivot[0]\"\r\n getPropertyOwner={GetPivot}\r\n propertyKey={0}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n />\r\n <DerivedProperty\r\n component={NumberInputPropertyLine}\r\n label=\"Pivot Y\"\r\n target={layer}\r\n getValue={GetPivotY}\r\n setValue={SetPivotY}\r\n propertyPath=\"pivot[1]\"\r\n getPropertyOwner={GetPivot}\r\n propertyKey={1}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n />\r\n <TextPropertyLine label=\"Default Depth\" value=\"Not applicable to renderer-owned layers.\" />\r\n <TextPropertyLine label=\"Atlas Frames\" value={layer.atlas.frames.length.toString()} />\r\n <TextPropertyLine label=\"Atlas Size\" value={`${layer.atlas.textureSizePx[0]} x ${layer.atlas.textureSizePx[1]} px`} />\r\n <TextPropertyLine label=\"Premultiplied Alpha\" value={layer.atlas.premultipliedAlpha ? \"True\" : \"False\"} />\r\n </>\r\n );\r\n};\r\n\r\nexport const SpriteLayerPropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService, IEngineContext]> = {\r\n friendlyName: \"Babylon Lite Sprite Layer Properties\",\r\n consumes: [PropertiesServiceIdentity, EngineContextIdentity],\r\n factory: (propertiesService, engineContext) =>\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Sprite Layer Properties\",\r\n predicate: (entity: unknown): entity is Sprite2DLayer => IsRegisteredSpriteLayer(engineContext.engine, entity),\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <SpriteLayerProperties engine={engineContext.engine} layer={context} />,\r\n },\r\n ],\r\n }),\r\n};\r\n","import { getRenderingContextKind, getRenderingContexts, type EngineContext, type TextLayer, type TextRenderer } from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { NumberInputPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/inputPropertyLine\";\r\nimport { StringifiedPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/stringifiedPropertyLine\";\r\nimport { SwitchPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/switchPropertyLine\";\r\nimport { TextPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/textPropertyLine\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { BoundProperty, ComputedProperty, DerivedProperty } from \"../../../../components/properties/boundProperty\";\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\nimport { type IEngineContext, EngineContextIdentity } from \"../../../engineContext\";\r\nimport { GetRenderingLayerDisplayName } from \"../../../renderingLayerUtils\";\r\n\r\nconst TextLayerDisplayNameGetters = new WeakMap<EngineContext, (layer: TextLayer) => string>();\r\n\r\nfunction GetTextLayerDisplayNameGetter(engine: EngineContext): (layer: TextLayer) => string {\r\n let getter = TextLayerDisplayNameGetters.get(engine);\r\n if (!getter) {\r\n getter = (layer) => GetRenderingLayerDisplayName<TextLayer, TextRenderer>(engine, \"text-renderer\", layer, \"Text Layer\");\r\n TextLayerDisplayNameGetters.set(engine, getter);\r\n }\r\n return getter;\r\n}\r\n\r\nfunction GetRunCount(layer: TextLayer): number {\r\n return layer.data.runs.length;\r\n}\r\n\r\nfunction GetPositionX(layer: TextLayer): number {\r\n return layer.positionPx.x;\r\n}\r\n\r\nfunction SetPositionX(layer: TextLayer, value: number): void {\r\n layer.positionPx.x = value;\r\n}\r\n\r\nfunction GetPositionY(layer: TextLayer): number {\r\n return layer.positionPx.y;\r\n}\r\n\r\nfunction SetPositionY(layer: TextLayer, value: number): void {\r\n layer.positionPx.y = value;\r\n}\r\n\r\nfunction GetPosition(layer: TextLayer): TextLayer[\"positionPx\"] {\r\n return layer.positionPx;\r\n}\r\n\r\nfunction GetGlyphCount(layer: TextLayer): number {\r\n return layer.data.runs.reduce((count, run) => count + run.glyphs.length, 0);\r\n}\r\n\r\nfunction IsRegisteredTextLayer(engine: EngineContext, entity: unknown): entity is TextLayer {\r\n if (typeof entity !== \"object\" || entity === null) {\r\n return false;\r\n }\r\n\r\n return engine.surfaces.some((surface) =>\r\n getRenderingContexts(surface).some((context) => getRenderingContextKind(context) === \"text-renderer\" && (context as TextRenderer).layers.includes(entity as TextLayer))\r\n );\r\n}\r\n\r\nconst TextLayerProperties: FunctionComponent<{ engine: EngineContext; layer: TextLayer }> = (props) => {\r\n const { engine, layer } = props;\r\n\r\n return (\r\n <>\r\n <ComputedProperty component={TextPropertyLine} label=\"Name\" target={layer} getValue={GetTextLayerDisplayNameGetter(engine)} />\r\n <BoundProperty component={SwitchPropertyLine} label=\"Visible\" target={layer} propertyKey=\"visible\" />\r\n <DerivedProperty\r\n component={NumberInputPropertyLine}\r\n label=\"Position X\"\r\n target={layer}\r\n getValue={GetPositionX}\r\n setValue={SetPositionX}\r\n propertyPath=\"positionPx.x\"\r\n getPropertyOwner={GetPosition}\r\n propertyKey=\"x\"\r\n step={1}\r\n unit=\"px\"\r\n />\r\n <DerivedProperty\r\n component={NumberInputPropertyLine}\r\n label=\"Position Y\"\r\n target={layer}\r\n getValue={GetPositionY}\r\n setValue={SetPositionY}\r\n propertyPath=\"positionPx.y\"\r\n getPropertyOwner={GetPosition}\r\n propertyKey=\"y\"\r\n step={1}\r\n unit=\"px\"\r\n />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Rotation\" target={layer} propertyKey=\"rotationRad\" step={0.01} unit=\"rad\" />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Scale\" target={layer} propertyKey=\"scale\" step={0.1} />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Order\" target={layer} propertyKey=\"order\" />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Opacity\" target={layer} propertyKey=\"opacity\" min={0} max={1} step={0.01} />\r\n <BoundProperty component={NumberInputPropertyLine} label=\"Coverage Gamma\" target={layer} propertyKey=\"coverageGamma\" step={0.1} />\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"Run Count\" target={layer} getValue={GetRunCount} />\r\n <ComputedProperty component={StringifiedPropertyLine} label=\"Glyph Count\" target={layer} getValue={GetGlyphCount} />\r\n </>\r\n );\r\n};\r\n\r\nexport const TextLayerPropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService, IEngineContext]> = {\r\n friendlyName: \"Babylon Lite Text Layer Properties\",\r\n consumes: [PropertiesServiceIdentity, EngineContextIdentity],\r\n factory: (propertiesService, engineContext) =>\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Text Layer Properties\",\r\n predicate: (entity: unknown): entity is TextLayer => IsRegisteredTextLayer(engineContext.engine, entity),\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <TextLayerProperties engine={engineContext.engine} layer={context} />,\r\n },\r\n ],\r\n }),\r\n};\r\n","import { type Texture2D } from \"@babylonjs/lite\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { BooleanBadgePropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/booleanBadgePropertyLine\";\r\nimport { StringifiedPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/stringifiedPropertyLine\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { type IPropertiesService, PropertiesServiceIdentity } from \"../../../../services/panes/properties/propertiesService\";\r\n\r\nfunction IsTexture2D(entity: unknown): entity is Texture2D {\r\n if (typeof entity !== \"object\" || entity === null) {\r\n return false;\r\n }\r\n\r\n const texture = entity as Partial<Texture2D>;\r\n return typeof texture.width === \"number\" && typeof texture.height === \"number\" && texture.texture !== undefined && texture.view !== undefined && texture.sampler !== undefined;\r\n}\r\n\r\nconst TextureProperties: FunctionComponent<{ texture: Texture2D }> = (props) => {\r\n const { texture } = props;\r\n\r\n return (\r\n <>\r\n <StringifiedPropertyLine label=\"Width\" value={texture.width} units=\"px\" />\r\n <StringifiedPropertyLine label=\"Height\" value={texture.height} units=\"px\" />\r\n <BooleanBadgePropertyLine label=\"Invert Y\" value={texture.invertY ?? false} />\r\n </>\r\n );\r\n};\r\n\r\nexport const TexturePropertiesServiceDefinition: ServiceDefinition<[], [IPropertiesService]> = {\r\n friendlyName: \"Babylon Lite Texture Properties\",\r\n consumes: [PropertiesServiceIdentity],\r\n factory: (propertiesService) =>\r\n propertiesService.addSectionContent({\r\n key: \"Babylon Lite Texture Properties\",\r\n predicate: IsTexture2D,\r\n content: [\r\n {\r\n section: \"General\",\r\n component: ({ context }) => <TextureProperties texture={context} />,\r\n },\r\n ],\r\n }),\r\n};\r\n","import { GetSceneContexts, GetSceneNodeRoots, IsSceneNode, IsSceneNodeDescendantOf } from \"../../../sceneEntityUtils\";\r\nimport { type IEngineContext } from \"../../../engineContext\";\r\nimport { type ISelectionService } from \"../../../../services/selectionService\";\r\n\r\nexport function ClearRemovedSelection(selectionService: ISelectionService, engineContext: IEngineContext, selectionWasRemoved: boolean): void {\r\n const selectedEntity = selectionService.selectedEntity;\r\n if (\r\n selectionWasRemoved &&\r\n !GetSceneContexts(engineContext.engine).some((scene) =>\r\n GetSceneNodeRoots(scene).some((root) => root === selectedEntity || (IsSceneNode(selectedEntity) && IsSceneNodeDescendantOf(selectedEntity, root)))\r\n )\r\n ) {\r\n selectionService.selectedEntity = null;\r\n }\r\n}\r\n","import { removeFromScene, type Camera } from \"@babylonjs/lite\";\r\nimport { tokens } from \"@fluentui/react-components\";\r\nimport { CameraRegular, DeleteRegular } from \"@fluentui/react-icons\";\r\n\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { EngineExplorerServiceIdentity, type IEngineExplorerService } from \"../../../engineExplorerService\";\r\nimport { EngineContextIdentity, type IEngineContext } from \"../../../engineContext\";\r\nimport { CreateWatchedNameDisplayInfo } from \"../../../explorerDisplayInfo\";\r\nimport { GetSceneContexts, IsCamera, IsSceneNode, IsSceneNodeDescendantOf } from \"../../../sceneEntityUtils\";\r\nimport { ExplorerServiceIdentity, type IExplorerService } from \"../../../../services/panes/explorer/explorerService\";\r\nimport { SelectionServiceIdentity, type ISelectionService } from \"../../../../services/selectionService\";\r\nimport { WatcherServiceIdentity, type IWatcherService } from \"../../../../services/watcherService\";\r\nimport { CreateSceneExplorerSectionNode, IsSceneContext } from \"./sceneExplorerSection\";\r\nimport { ClearRemovedSelection } from \"./sceneSelectionUtils\";\r\n\r\nconst CameraIcon = () => <CameraRegular color={tokens.colorPaletteGreenForeground2} />;\r\n\r\nexport const CameraExplorerServiceDefinition: ServiceDefinition<[], [IEngineExplorerService, IExplorerService, IWatcherService, ISelectionService, IEngineContext]> = {\r\n friendlyName: \"Babylon Lite Camera Explorer\",\r\n consumes: [EngineExplorerServiceIdentity, ExplorerServiceIdentity, WatcherServiceIdentity, SelectionServiceIdentity, EngineContextIdentity],\r\n factory: (engineExplorerService, explorerService, watcherService, selectionService, engineContext) => {\r\n const providerRegistration = engineExplorerService.addRenderingContextNodeProvider({\r\n order: 10,\r\n predicate: IsSceneContext,\r\n getNodes: (scene) => {\r\n return [\r\n CreateSceneExplorerSectionNode(\r\n \"cameras\",\r\n \"Cameras\",\r\n scene.camera ? [scene.camera] : [],\r\n (camera: Camera) => CreateWatchedNameDisplayInfo(watcherService, camera, () => camera.name || \"Camera\"),\r\n CameraIcon\r\n ),\r\n ];\r\n },\r\n getSnapshot: (scene) => (scene.camera ? [scene.camera] : []),\r\n });\r\n const removeRegistration = explorerService.addItemCommand({\r\n predicate: (entity): entity is Camera => IsCamera(entity) && GetSceneContexts(engineContext.engine).filter((scene) => scene.camera === entity).length === 1,\r\n order: 10000,\r\n getCommand: (camera) => ({\r\n type: \"action\",\r\n mode: \"contextMenu\",\r\n displayName: \"Remove from Scene\",\r\n icon: DeleteRegular,\r\n hotKey: { keyCode: \"Delete\" },\r\n execute: () => {\r\n const owningScenes = GetSceneContexts(engineContext.engine).filter((candidate) => candidate.camera === camera);\r\n if (owningScenes.length === 1) {\r\n const selectedEntity = selectionService.selectedEntity;\r\n const selectionWasRemoved = selectedEntity === camera || (IsSceneNode(selectedEntity) && IsSceneNodeDescendantOf(selectedEntity, camera));\r\n removeFromScene(owningScenes[0], camera);\r\n ClearRemovedSelection(selectionService, engineContext, selectionWasRemoved);\r\n }\r\n },\r\n }),\r\n });\r\n\r\n return {\r\n dispose: () => {\r\n removeRegistration.dispose();\r\n providerRegistration.dispose();\r\n },\r\n };\r\n },\r\n};\r\n","import { removeFromScene, type LightBase } from \"@babylonjs/lite\";\r\nimport { tokens } from \"@fluentui/react-components\";\r\nimport { DeleteRegular, LightbulbRegular } from \"@fluentui/react-icons\";\r\n\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { EngineExplorerServiceIdentity, type IEngineExplorerService } from \"../../../engineExplorerService\";\r\nimport { EngineContextIdentity, type IEngineContext } from \"../../../engineContext\";\r\nimport { GetLightDisplayName, GetSceneContexts, IsLight, IsSceneNode, IsSceneNodeDescendantOf } from \"../../../sceneEntityUtils\";\r\nimport { ExplorerServiceIdentity, type IExplorerService } from \"../../../../services/panes/explorer/explorerService\";\r\nimport { SelectionServiceIdentity, type ISelectionService } from \"../../../../services/selectionService\";\r\nimport { CreateSceneExplorerSectionNode, IsSceneContext } from \"./sceneExplorerSection\";\r\nimport { ClearRemovedSelection } from \"./sceneSelectionUtils\";\r\n\r\nconst LightIcon = () => <LightbulbRegular color={tokens.colorPaletteYellowForeground2} />;\r\n\r\nexport const LightExplorerServiceDefinition: ServiceDefinition<[], [IEngineExplorerService, IExplorerService, ISelectionService, IEngineContext]> = {\r\n friendlyName: \"Babylon Lite Light Explorer\",\r\n consumes: [EngineExplorerServiceIdentity, ExplorerServiceIdentity, SelectionServiceIdentity, EngineContextIdentity],\r\n factory: (engineExplorerService, explorerService, selectionService, engineContext) => {\r\n const providerRegistration = engineExplorerService.addRenderingContextNodeProvider({\r\n order: 20,\r\n predicate: IsSceneContext,\r\n getNodes: (scene) => {\r\n return [CreateSceneExplorerSectionNode(\"lights\", \"Lights\", scene.lights, (light: LightBase, index) => ({ name: GetLightDisplayName(light, index) }), LightIcon)];\r\n },\r\n getSnapshot: (scene) => scene.lights,\r\n });\r\n const removeRegistration = explorerService.addItemCommand({\r\n predicate: (entity): entity is LightBase => IsLight(entity) && GetSceneContexts(engineContext.engine).filter((scene) => scene.lights.includes(entity)).length === 1,\r\n order: 10000,\r\n getCommand: (light) => ({\r\n type: \"action\",\r\n mode: \"contextMenu\",\r\n displayName: \"Remove from Scene\",\r\n icon: DeleteRegular,\r\n hotKey: { keyCode: \"Delete\" },\r\n execute: () => {\r\n const owningScenes = GetSceneContexts(engineContext.engine).filter((candidate) => candidate.lights.includes(light));\r\n if (owningScenes.length === 1) {\r\n const selectedEntity = selectionService.selectedEntity;\r\n const selectionWasRemoved =\r\n selectedEntity === light || selectedEntity === light.shadowGenerator || (IsSceneNode(selectedEntity) && IsSceneNodeDescendantOf(selectedEntity, light));\r\n removeFromScene(owningScenes[0], light);\r\n ClearRemovedSelection(selectionService, engineContext, selectionWasRemoved);\r\n }\r\n },\r\n }),\r\n });\r\n\r\n return {\r\n dispose: () => {\r\n removeRegistration.dispose();\r\n providerRegistration.dispose();\r\n },\r\n };\r\n },\r\n};\r\n","import { createFluentIcon } from \"@fluentui/react-icons\";\r\n\r\nexport const MeshIcon = createFluentIcon(\r\n \"Mesh\",\r\n \"1em\",\r\n '<g transform=\"scale(1.25)\"><path d=\"M14.03,3.54l-5.11-2.07c-.61-.25-1.27-.25-1.88,0L1.93,3.54c-.57.23-.94.78-.94,1.39v6.15c0,.61.37,1.16.94,1.39l5.11,2.07c.3.12.62.18.94.18s.64-.06.94-.18l5.12-2.07c.57-.23.94-.78.94-1.39v-6.15c0-.61-.37-1.16-.94-1.39ZM13.97,7.71l-2.11.86v-2.71l2.11-.86v2.71ZM1.99,5l2.11.86v2.71l-2.11-.86v-2.71ZM11.35,4.98l-2.04-.83,1.78-.72,2.04.83-1.78.72ZM10.02,5.52l-2.04.83-2.04-.83,2.04-.83,2.04.83ZM4.6,4.98l-1.78-.72,2.04-.83,1.78.72-2.04.83ZM5.1,6.26l2.38.96v2.71l-2.38-.96v-2.71ZM8.48,7.22l2.38-.96v2.71l-2.38.96v-2.71ZM7.41,2.39c.18-.07.37-.11.56-.11s.38.04.56.11l1.22.49-1.78.72-1.79-.72,1.22-.49ZM1.99,11.07v-2.29l2.11.86v2.62l-1.8-.73c-.19-.08-.31-.26-.31-.46ZM5.1,12.67v-2.62l2.38.96v2.61s-.04,0-.06-.01l-2.31-.94ZM8.54,13.61s-.04,0-.06.01v-2.61l2.38-.96v2.62l-2.31.94ZM13.66,11.54l-1.8.73v-2.62l2.11-.86v2.29c0,.2-.12.39-.31.46Z\"/></g>'\r\n);\r\n\r\nexport const TranslateIcon = createFluentIcon(\r\n \"Translate\",\r\n \"1em\",\r\n '<g transform=\"scale(0.833)\"><path d=\"M20.16,12.98l-2.75-2.75c-.29-.29-.77-.29-1.06,0-.29.29-.29.77,0,1.06l1.47,1.47h-6.69v-6.69l1.47,1.47c.29.29.77.29,1.06,0,.29-.29.29-.77,0-1.06l-2.75-2.75c-.14-.14-.33-.22-.53-.22s-.39.08-.53.22l-2.75,2.75c-.29.29-.29.77,0,1.06.29.29.77.29,1.06,0l1.47-1.47v7.13l-3.52,3.52v-2.08c0-.41-.34-.75-.75-.75s-.75.34-.75.75v3.89c0,.2.08.39.22.53.14.14.33.22.53.22h3.89c.41,0,.75-.34.75-.75s-.34-.75-.75-.75h-2.08s3.52-3.52,3.52-3.52h7.13l-1.47,1.47c-.29.29-.29.77,0,1.06s.77.29,1.06,0l2.75-2.75c.14-.14.22-.33.22-.53s-.08-.39-.22-.53Z\" /></g>'\r\n);\r\n\r\nexport const MaterialIcon = createFluentIcon(\r\n \"Material\",\r\n \"1em\",\r\n '<g transform=\"scale(1.25)\"><path d=\"M14.74,6.3c-.09-.36-.38-.64-.75-.72-.04-.09-.08-.18-.12-.27.1-.15.16-.32.16-.51,0-.18-.05-.34-.13-.48-1.23-1.97-3.41-3.28-5.9-3.28C4.16,1.04,1.04,4.16,1.04,7.99c0,.39.23.72.57.88.02.12.03.25.06.37-.18.18-.3.42-.3.7,0,.11.02.21.06.31.94,2.74,3.53,4.71,6.58,4.71,3.84,0,6.96-3.12,6.96-6.96,0-.59-.08-1.16-.22-1.7ZM2.07,8.58c-.02-.19-.03-.39-.03-.58,0-3.29,2.67-5.96,5.96-5.96,2.23,0,4.17,1.23,5.2,3.05.05.18-.07.45-.3.75-.57-.73-1.45-1.21-2.45-1.21-1.72,0-3.12,1.4-3.12,3.11,0,.33.07.65.16.95-3.05.82-5.17.52-5.42-.11ZM12.56,7.75c0,1.17-.95,2.11-2.11,2.11s-2.12-.95-2.12-2.11.95-2.11,2.12-2.11,2.11.95,2.11,2.11ZM8,13.96c-2.6,0-4.81-1.68-5.62-4.01.5.16,1.11.24,1.79.24,1.15,0,2.49-.22,3.79-.59.57.76,1.47,1.26,2.49,1.26,1.72,0,3.11-1.4,3.11-3.11,0-.34-.07-.65-.17-.96.13-.13.24-.26.34-.39.14.51.22,1.04.22,1.6,0,3.29-2.67,5.96-5.96,5.96Z\"/></g>'\r\n);\r\n\r\nexport const FlatTangentIcon = createFluentIcon(\r\n \"FlatTangent\",\r\n \"20\",\r\n '<g transform=\"scale(0.5)\"><path d=\"M28,18.5a1.51,1.51,0,0,0-1.41,1H11.5v1H26.59a1.5,1.5,0,1,0,1.41-2Z\"/></g>'\r\n);\r\n\r\nexport const LinearTangentIcon = createFluentIcon(\r\n \"LinearTangent\",\r\n \"20\",\r\n '<g transform=\"scale(0.5)\"><path d=\"M26,14a1.49,1.49,0,0,0-2.4,1.69l-10,10,.71.71,10-10A1.49,1.49,0,0,0,26,14Z\"/></g>'\r\n);\r\n\r\nexport const BreakTangentIcon = createFluentIcon(\r\n \"BreakTangent\",\r\n \"20\",\r\n '<g transform=\"scale(0.5)\"><path d=\"M27.11,13.05a1.49,1.49,0,0,0-2.05.53,1.47,1.47,0,0,0,.14,1.72l-4.78,8L20,22.92l-.42.42-4.78-8a1.47,1.47,0,0,0,.14-1.72,1.49,1.49,0,0,0-2-.53,1.5,1.5,0,0,0,1,2.76l4.91,8.26-1,1L20,27.16,22.12,25l-1-1,4.91-8.26a1.5,1.5,0,0,0,1.05-2.76Z\"/></g>'\r\n);\r\n\r\nexport const UnifyTangentIcon = createFluentIcon(\r\n \"UnifyTangent\",\r\n \"20\",\r\n '<g transform=\"scale(0.5)\"><path d=\"M27.94,18.28a1.49,1.49,0,0,0-1.41,1h-5l-1.62-1.63-1.62,1.63h-5a1.5,1.5,0,1,0,0,1h5l1.62,1.62,1.62-1.62h5a1.5,1.5,0,1,0,1.41-2Z\"/></g>'\r\n);\r\n\r\nexport const StepTangentIcon = createFluentIcon(\r\n \"StepTangent\",\r\n \"20\",\r\n '<g transform=\"scale(0.5)\"><path d=\"M29,16.71a1.5,1.5,0,1,0-2,1.41v5.67H11v1H28V18.12A1.51,1.51,0,0,0,29,16.71Z\"/></g>'\r\n);\r\n","import { getMaterialTextures, type Material, type SceneContext, type Texture2D } from \"@babylonjs/lite\";\r\n\r\n/**\r\n * Gets the unique materials referenced by a scene's meshes.\r\n * @param scene The scene to inspect.\r\n * @returns The referenced materials in mesh order.\r\n */\r\nexport function GetSceneMaterials(scene: SceneContext): readonly Material[] {\r\n return [...new Set(scene.meshes.map((mesh) => mesh.material))];\r\n}\r\n\r\n/**\r\n * Gets the unique textures referenced by a scene's materials.\r\n * @param scene The scene to inspect.\r\n * @returns The referenced textures in material order.\r\n */\r\nexport function GetSceneTextures(scene: SceneContext): readonly Texture2D[] {\r\n return [...new Set(GetSceneMaterials(scene).flatMap((material) => getMaterialTextures(material)))];\r\n}\r\n","import { getMaterialFamily, type Material } from \"@babylonjs/lite\";\r\nimport { tokens } from \"@fluentui/react-components\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\nimport { MaterialIcon } from \"shared-ui-components/fluent/icons\";\r\n\r\nimport { type IEngineExplorerService, EngineExplorerServiceIdentity } from \"../../../engineExplorerService\";\r\nimport { CreateWatchedNameDisplayInfo } from \"../../../explorerDisplayInfo\";\r\nimport { type IWatcherService, WatcherServiceIdentity } from \"../../../../services/watcherService\";\r\nimport { CreateSceneExplorerSectionNode, IsSceneContext } from \"./sceneExplorerSection\";\r\nimport { GetSceneMaterials } from \"./sceneResources\";\r\n\r\nfunction GetMaterialDisplayName(material: Material): string {\r\n const family = getMaterialFamily(material);\r\n return material.name ?? (family ? `${family.charAt(0).toUpperCase()}${family.slice(1)} Material` : \"Material\");\r\n}\r\n\r\nexport const MaterialExplorerServiceDefinition: ServiceDefinition<[], [IEngineExplorerService, IWatcherService]> = {\r\n friendlyName: \"Babylon Lite Material Explorer\",\r\n consumes: [EngineExplorerServiceIdentity, WatcherServiceIdentity],\r\n factory: (engineExplorerService, watcherService) =>\r\n engineExplorerService.addRenderingContextNodeProvider({\r\n order: 100,\r\n predicate: IsSceneContext,\r\n getNodes: (scene) => [\r\n CreateSceneExplorerSectionNode(\r\n \"materials\",\r\n \"Materials\",\r\n GetSceneMaterials(scene),\r\n (material) => CreateWatchedNameDisplayInfo(watcherService, material, () => GetMaterialDisplayName(material)),\r\n () => <MaterialIcon color={tokens.colorPaletteMarigoldForeground2} />\r\n ),\r\n ],\r\n getSnapshot: GetSceneMaterials,\r\n }),\r\n};\r\n","import { removeFromScene, setParent, setSubtreeVisible, type SceneContext, type SceneNode } from \"@babylonjs/lite\";\r\nimport { tokens } from \"@fluentui/react-components\";\r\nimport { DeleteRegular, EyeOffRegular, EyeRegular, MyLocationRegular } from \"@fluentui/react-icons\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\nimport { MeshIcon } from \"shared-ui-components/fluent/icons\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type ExplorerNodeDescription, GetEntityId } from \"../../../../components/explorer/explorerModel\";\r\nimport { type IEngineExplorerService, EngineExplorerServiceIdentity } from \"../../../engineExplorerService\";\r\nimport { EngineContextIdentity, type IEngineContext } from \"../../../engineContext\";\r\nimport { CreateWatchedNameDisplayInfo } from \"../../../explorerDisplayInfo\";\r\nimport { GetSceneContexts, GetSceneNodeRoots, IsMesh, IsSceneNode, IsSceneNodeDescendantOf } from \"../../../sceneEntityUtils\";\r\nimport { ExplorerServiceIdentity, type IExplorerService } from \"../../../../services/panes/explorer/explorerService\";\r\nimport { type ISelectionService, SelectionServiceIdentity } from \"../../../../services/selectionService\";\r\nimport { type IWatcherService, WatcherServiceIdentity } from \"../../../../services/watcherService\";\r\nimport { IsSceneContext } from \"./sceneExplorerSection\";\r\nimport { ClearRemovedSelection } from \"./sceneSelectionUtils\";\r\n\r\ntype NodeTopologyMarker = {\r\n parent: object | null;\r\n marker: object;\r\n};\r\n\r\nconst NodeTopologyMarkers = new WeakMap<SceneNode, NodeTopologyMarker>();\r\n\r\nfunction GetNodeTopologyMarker(node: SceneNode): object {\r\n const parent = IsSceneNode(node.parent) ? node.parent : null;\r\n const existing = NodeTopologyMarkers.get(node);\r\n if (existing?.parent === parent) {\r\n return existing.marker;\r\n }\r\n\r\n const marker = {};\r\n NodeTopologyMarkers.set(node, { parent, marker });\r\n return marker;\r\n}\r\n\r\nfunction CreateNodeDescription(node: SceneNode, watcherService: IWatcherService): ExplorerNodeDescription {\r\n return {\r\n id: GetEntityId(node).toString(),\r\n kind: \"item\",\r\n entity: node,\r\n icon: () => (IsMesh(node) ? <MeshIcon color={tokens.colorPaletteBlueForeground2} /> : <MyLocationRegular color={tokens.colorPaletteBlueForeground2} />),\r\n getDisplayInfo: () => CreateWatchedNameDisplayInfo(watcherService, node, () => node.name || (IsMesh(node) ? \"Unnamed Mesh\" : \"Unnamed Transform Node\")),\r\n getChildren: () => node.children.filter(IsSceneNode).map((child) => CreateNodeDescription(child, watcherService)),\r\n };\r\n}\r\n\r\nfunction IsNodeInScene(scene: SceneContext, node: SceneNode): boolean {\r\n return GetSceneNodeRoots(scene).some((root) => root === node || IsSceneNodeDescendantOf(node, root));\r\n}\r\n\r\nexport const MeshExplorerServiceDefinition: ServiceDefinition<[], [IEngineExplorerService, IExplorerService, IWatcherService, ISelectionService, IEngineContext]> = {\r\n friendlyName: \"Babylon Lite Scene Node Explorer\",\r\n consumes: [EngineExplorerServiceIdentity, ExplorerServiceIdentity, WatcherServiceIdentity, SelectionServiceIdentity, EngineContextIdentity],\r\n factory: (engineExplorerService, explorerService, watcherService, selectionService, engineContext) => {\r\n const providerRegistration = engineExplorerService.addRenderingContextNodeProvider({\r\n order: 0,\r\n predicate: IsSceneContext,\r\n getNodes: (scene) => {\r\n return [\r\n {\r\n id: \"nodes\",\r\n kind: \"group\",\r\n getDisplayInfo: () => ({ name: \"Nodes\" }),\r\n getChildren: () => GetSceneNodeRoots(scene).map((node) => CreateNodeDescription(node, watcherService)),\r\n dragDropConfig: {\r\n canDrag: (entity) => IsSceneNode(entity) && IsNodeInScene(scene, entity),\r\n canDrop: (draggedEntity, targetEntity) =>\r\n IsSceneNode(draggedEntity) &&\r\n IsNodeInScene(scene, draggedEntity) &&\r\n (targetEntity === null ||\r\n (IsSceneNode(targetEntity) &&\r\n IsNodeInScene(scene, targetEntity) &&\r\n draggedEntity !== targetEntity &&\r\n !IsSceneNodeDescendantOf(targetEntity, draggedEntity))) &&\r\n draggedEntity.parent !== targetEntity,\r\n onDrop: (draggedEntity, targetEntity) => {\r\n if (IsSceneNode(draggedEntity) && (targetEntity === null || IsSceneNode(targetEntity))) {\r\n setParent(draggedEntity, targetEntity);\r\n }\r\n },\r\n },\r\n },\r\n ];\r\n },\r\n getSnapshot: (scene) =>\r\n GetSceneNodeRoots(scene)\r\n .flatMap((root) => [root, ...GetNodeDescendants(root)])\r\n .flatMap((node) => [node, GetNodeTopologyMarker(node)]),\r\n });\r\n\r\n const visibilityRegistration = explorerService.addItemCommand({\r\n predicate: (entity): entity is SceneNode => IsSceneNode(entity) && GetOwningScenes(engineContext, entity).length > 0,\r\n order: 1100,\r\n getCommand: (node) => {\r\n const onChange = new Observable<void>();\r\n const visibilityWatcher = watcherService.watchValue(\r\n () => node.visible !== false,\r\n () => onChange.notifyObservers()\r\n );\r\n\r\n return {\r\n type: \"toggle\",\r\n mode: \"contextMenu\",\r\n get displayName() {\r\n return node.visible === false ? \"Show Node\" : \"Hide Node\";\r\n },\r\n icon: () => (node.visible === false ? <EyeOffRegular /> : <EyeRegular />),\r\n get isEnabled() {\r\n return node.visible !== false;\r\n },\r\n set isEnabled(visible: boolean) {\r\n setSubtreeVisible(node, visible);\r\n },\r\n onChange,\r\n dispose: () => {\r\n visibilityWatcher.dispose();\r\n onChange.clear();\r\n },\r\n };\r\n },\r\n });\r\n\r\n const removeRegistration = explorerService.addItemCommand({\r\n predicate: (entity): entity is SceneNode => IsSceneNode(entity) && GetOwningScenes(engineContext, entity).length === 1,\r\n order: 10000,\r\n getCommand: (node) => ({\r\n type: \"action\",\r\n mode: \"contextMenu\",\r\n displayName: \"Remove from Scene\",\r\n icon: DeleteRegular,\r\n hotKey: { keyCode: \"Delete\" },\r\n execute: () => {\r\n const owningScenes = GetOwningScenes(engineContext, node);\r\n const [scene] = owningScenes;\r\n if (scene && owningScenes.length === 1) {\r\n const selectedEntity = selectionService.selectedEntity;\r\n const selectionWasRemoved = selectedEntity === node || (IsSceneNode(selectedEntity) && IsSceneNodeDescendantOf(selectedEntity, node));\r\n if (node.parent) {\r\n setParent(node, null);\r\n }\r\n removeFromScene(scene, node);\r\n ClearRemovedSelection(selectionService, engineContext, selectionWasRemoved);\r\n }\r\n },\r\n }),\r\n });\r\n\r\n return {\r\n dispose: () => {\r\n removeRegistration.dispose();\r\n visibilityRegistration.dispose();\r\n providerRegistration.dispose();\r\n },\r\n };\r\n },\r\n};\r\n\r\nfunction GetNodeDescendants(node: SceneNode): readonly SceneNode[] {\r\n return node.children.filter(IsSceneNode).flatMap((child) => [child, ...GetNodeDescendants(child)]);\r\n}\r\n\r\nfunction GetOwningScenes(engineContext: IEngineContext, node: SceneNode): readonly SceneContext[] {\r\n return GetSceneContexts(engineContext.engine).filter((scene) => GetSceneNodeRoots(scene).some((root) => root === node || IsSceneNodeDescendantOf(node, root)));\r\n}\r\n","import { removeFromScene, type ShadowGenerator } from \"@babylonjs/lite\";\r\nimport { tokens } from \"@fluentui/react-components\";\r\nimport { DeleteRegular, WeatherMoonRegular } from \"@fluentui/react-icons\";\r\n\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { EngineExplorerServiceIdentity, type IEngineExplorerService } from \"../../../engineExplorerService\";\r\nimport { EngineContextIdentity, type IEngineContext } from \"../../../engineContext\";\r\nimport { GetSceneContexts, GetShadowGeneratorDisplayName } from \"../../../sceneEntityUtils\";\r\nimport { ExplorerServiceIdentity, type IExplorerService } from \"../../../../services/panes/explorer/explorerService\";\r\nimport { SelectionServiceIdentity, type ISelectionService } from \"../../../../services/selectionService\";\r\nimport { CreateSceneExplorerSectionNode, IsSceneContext } from \"./sceneExplorerSection\";\r\n\r\nconst ShadowGeneratorIcon = () => <WeatherMoonRegular color={tokens.colorPaletteYellowForeground2} />;\r\n\r\nexport const ShadowGeneratorExplorerServiceDefinition: ServiceDefinition<[], [IEngineExplorerService, IExplorerService, ISelectionService, IEngineContext]> = {\r\n friendlyName: \"Babylon Lite Shadow Generator Explorer\",\r\n consumes: [EngineExplorerServiceIdentity, ExplorerServiceIdentity, SelectionServiceIdentity, EngineContextIdentity],\r\n factory: (engineExplorerService, explorerService, selectionService, engineContext) => {\r\n const providerRegistration = engineExplorerService.addRenderingContextNodeProvider({\r\n order: 30,\r\n predicate: IsSceneContext,\r\n getNodes: (scene) => {\r\n return [\r\n CreateSceneExplorerSectionNode(\r\n \"shadow-generators\",\r\n \"Shadow Generators\",\r\n scene.shadowGenerators,\r\n (shadowGenerator: ShadowGenerator) => ({ name: GetShadowGeneratorDisplayName(scene, shadowGenerator) }),\r\n ShadowGeneratorIcon\r\n ),\r\n ];\r\n },\r\n getSnapshot: (scene) => scene.shadowGenerators,\r\n });\r\n const removeRegistration = explorerService.addItemCommand({\r\n predicate: (entity): entity is ShadowGenerator =>\r\n typeof entity === \"object\" &&\r\n entity !== null &&\r\n GetSceneContexts(engineContext.engine).filter((scene) => scene.shadowGenerators.some((shadowGenerator) => shadowGenerator === entity)).length === 1,\r\n order: 10000,\r\n getCommand: (shadowGenerator) => ({\r\n type: \"action\",\r\n mode: \"contextMenu\",\r\n displayName: \"Remove from Scene\",\r\n icon: DeleteRegular,\r\n hotKey: { keyCode: \"Delete\" },\r\n execute: () => {\r\n const owningScenes = GetSceneContexts(engineContext.engine).filter((candidate) => candidate.shadowGenerators.includes(shadowGenerator));\r\n if (owningScenes.length === 1) {\r\n if (selectionService.selectedEntity === shadowGenerator) {\r\n selectionService.selectedEntity = null;\r\n }\r\n removeFromScene(owningScenes[0], shadowGenerator);\r\n }\r\n },\r\n }),\r\n });\r\n\r\n return {\r\n dispose: () => {\r\n removeRegistration.dispose();\r\n providerRegistration.dispose();\r\n },\r\n };\r\n },\r\n};\r\n","import { getRenderingContextKind, type RenderingContext } from \"@babylonjs/lite\";\r\nimport { EyeOffRegular, EyeRegular } from \"@fluentui/react-icons\";\r\nimport { type ComponentType } from \"react\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { type ExplorerNodeDescription, GetEntityId } from \"../../../../components/explorer/explorerModel\";\r\nimport { type IExplorerService, ExplorerServiceIdentity } from \"../../../../services/panes/explorer/explorerService\";\r\nimport { type IWatcherService, WatcherServiceIdentity } from \"../../../../services/watcherService\";\r\nimport { type IEngineContext, EngineContextIdentity } from \"../../../engineContext\";\r\nimport { type IEngineExplorerService, EngineExplorerServiceIdentity } from \"../../../engineExplorerService\";\r\nimport { GetOrderedRenderingLayers, GetRenderingLayerOwners, GetRenderingLayerSnapshot } from \"../../../renderingLayerUtils\";\r\n\r\ntype RenderingLayer = object & {\r\n order: number;\r\n visible: boolean;\r\n};\r\n\r\ntype LayerRenderingContext<LayerT extends RenderingLayer> = RenderingContext & {\r\n readonly layers: readonly LayerT[];\r\n};\r\n\r\ntype RenderingLayerExplorerOptions<ContextT extends LayerRenderingContext<LayerT>, LayerT extends RenderingLayer> = Readonly<{\r\n friendlyName: string;\r\n contextKind: string;\r\n layerTypeName: string;\r\n icon: ComponentType<{ entity: object }>;\r\n}>;\r\n\r\nexport function CreateRenderingLayerExplorerServiceDefinition<ContextT extends LayerRenderingContext<LayerT>, LayerT extends RenderingLayer>(\r\n options: RenderingLayerExplorerOptions<ContextT, LayerT>\r\n): ServiceDefinition<[], [IEngineExplorerService, IExplorerService, IWatcherService, IEngineContext]> {\r\n const { friendlyName, contextKind, layerTypeName, icon } = options;\r\n\r\n return {\r\n friendlyName,\r\n consumes: [EngineExplorerServiceIdentity, ExplorerServiceIdentity, WatcherServiceIdentity, EngineContextIdentity],\r\n factory: (engineExplorerService, explorerService, watcherService, engineContext) => {\r\n const getOwners = (layer: LayerT) => GetRenderingLayerOwners<LayerT, ContextT>(engineContext.engine, contextKind, layer);\r\n const providerRegistration = engineExplorerService.addRenderingContextNodeProvider({\r\n predicate: (context): context is ContextT => getRenderingContextKind(context) === contextKind,\r\n getNodes: (context): readonly ExplorerNodeDescription[] =>\r\n GetOrderedRenderingLayers(context.layers).map((layer, index) => ({\r\n id: `${contextKind}-layer-${GetEntityId(layer)}`,\r\n kind: \"item\",\r\n entity: layer,\r\n icon,\r\n getDisplayInfo: () => ({ name: `${layerTypeName} ${index + 1}` }),\r\n })),\r\n getSnapshot: (context) => GetRenderingLayerSnapshot(context.layers),\r\n });\r\n const visibilityRegistration = explorerService.addItemCommand({\r\n predicate: (entity): entity is LayerT => typeof entity === \"object\" && entity !== null && getOwners(entity as LayerT).length > 0,\r\n order: 1100,\r\n getCommand: (layer) => {\r\n const onChange = new Observable<void>();\r\n const visibilityWatcher = watcherService.watchProperty(layer, \"visible\", () => onChange.notifyObservers());\r\n\r\n return {\r\n type: \"toggle\",\r\n mode: \"contextMenu\",\r\n get displayName() {\r\n return layer.visible ? `Hide ${layerTypeName}` : `Show ${layerTypeName}`;\r\n },\r\n icon: () => (layer.visible ? <EyeRegular /> : <EyeOffRegular />),\r\n get isEnabled() {\r\n return layer.visible;\r\n },\r\n set isEnabled(visible: boolean) {\r\n layer.visible = visible;\r\n },\r\n onChange,\r\n dispose: () => {\r\n visibilityWatcher.dispose();\r\n onChange.clear();\r\n },\r\n };\r\n },\r\n });\r\n\r\n return {\r\n dispose: () => {\r\n visibilityRegistration.dispose();\r\n providerRegistration.dispose();\r\n },\r\n };\r\n },\r\n };\r\n}\r\n","import { type Sprite2DLayer, type SpriteRenderer } from \"@babylonjs/lite\";\r\nimport { tokens } from \"@fluentui/react-components\";\r\nimport { LayerDiagonalPersonRegular } from \"@fluentui/react-icons\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { CreateRenderingLayerExplorerServiceDefinition } from \"./renderingLayerExplorerService\";\r\n\r\nconst SpriteLayerIcon: FunctionComponent<{ entity: object }> = () => <LayerDiagonalPersonRegular color={tokens.colorPalettePeachForeground2} />;\r\n\r\nexport const SpriteLayerExplorerServiceDefinition = CreateRenderingLayerExplorerServiceDefinition<SpriteRenderer, Sprite2DLayer>({\r\n friendlyName: \"Babylon Lite Sprite Layer Explorer\",\r\n contextKind: \"sprite-renderer\",\r\n layerTypeName: \"Sprite Layer\",\r\n icon: SpriteLayerIcon,\r\n});\r\n","import { type TextLayer, type TextRenderer } from \"@babylonjs/lite\";\r\nimport { TextTRegular } from \"@fluentui/react-icons\";\r\nimport { type FunctionComponent } from \"react\";\r\n\r\nimport { CreateRenderingLayerExplorerServiceDefinition } from \"./renderingLayerExplorerService\";\r\n\r\nconst TextLayerIcon: FunctionComponent<{ entity: object }> = () => <TextTRegular />;\r\n\r\nexport const TextLayerExplorerServiceDefinition = CreateRenderingLayerExplorerServiceDefinition<TextRenderer, TextLayer>({\r\n friendlyName: \"Babylon Lite Text Layer Explorer\",\r\n contextKind: \"text-renderer\",\r\n layerTypeName: \"Text Layer\",\r\n icon: TextLayerIcon,\r\n});\r\n","import { type Texture2D } from \"@babylonjs/lite\";\r\nimport { tokens } from \"@fluentui/react-components\";\r\nimport { ImageRegular } from \"@fluentui/react-icons\";\r\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\r\n\r\nimport { type IEngineExplorerService, EngineExplorerServiceIdentity } from \"../../../engineExplorerService\";\r\nimport { CreateSceneExplorerSectionNode, IsSceneContext } from \"./sceneExplorerSection\";\r\nimport { GetSceneTextures } from \"./sceneResources\";\r\n\r\nfunction GetTextureDisplayName(texture: Texture2D, index: number): string {\r\n return `Texture ${index + 1} (${texture.width} x ${texture.height})`;\r\n}\r\n\r\nexport const TextureExplorerServiceDefinition: ServiceDefinition<[], [IEngineExplorerService]> = {\r\n friendlyName: \"Babylon Lite Texture Explorer\",\r\n consumes: [EngineExplorerServiceIdentity],\r\n factory: (engineExplorerService) =>\r\n engineExplorerService.addRenderingContextNodeProvider({\r\n order: 200,\r\n predicate: IsSceneContext,\r\n getNodes: (scene) => [\r\n CreateSceneExplorerSectionNode(\r\n \"textures\",\r\n \"Textures\",\r\n GetSceneTextures(scene),\r\n (texture, index) => ({ name: GetTextureDisplayName(texture, index) }),\r\n () => <ImageRegular color={tokens.colorPaletteGrapeForeground2} />\r\n ),\r\n ],\r\n getSnapshot: GetSceneTextures,\r\n }),\r\n};\r\n","import { type EngineContext, resizeEngine } from \"@babylonjs/lite\";\nimport { type WeaklyTypedServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceContainer\";\nimport { type ServiceDefinition } from \"shared-ui-components/modularTool/modularity/serviceDefinition\";\nimport { SettingsServiceDefinition } from \"shared-ui-components/modularTool/services/settingsService\";\nimport { ShellSettingsServiceDefinition } from \"shared-ui-components/modularTool/services/shellSettingsService\";\n\nimport { type InspectorOptions, type InspectorToken } from \"../inspector.common\";\nimport { _ShowInspector } from \"../inspectorHost\";\nimport { PropertiesServiceDefinition } from \"../services/panes/properties/propertiesService\";\nimport { SelectionServiceDefinition } from \"../services/selectionService\";\nimport { MakeWatcherServiceDefinitions } from \"../services/watcherService\";\nimport { type IEngineContext, EngineContextIdentity } from \"./engineContext\";\nimport { EngineExplorerServiceDefinition } from \"./engineExplorerService\";\nimport { EngineSelectionServiceDefinition } from \"./engineSelectionService\";\nimport { EnginePropertiesServiceDefinition } from \"./services/panes/properties/enginePropertiesService\";\nimport { CameraPropertiesServiceDefinition } from \"./services/panes/properties/cameraPropertiesService\";\nimport { LightPropertiesServiceDefinition } from \"./services/panes/properties/lightPropertiesService\";\nimport { MaterialPropertiesServiceDefinition } from \"./services/panes/properties/materialPropertiesService\";\nimport { MeshPropertiesServiceDefinition } from \"./services/panes/properties/meshPropertiesService\";\nimport { RenderingContextPropertiesServiceDefinition } from \"./services/panes/properties/renderingContextPropertiesService\";\nimport { SceneNodePropertiesServiceDefinition } from \"./services/panes/properties/sceneNodePropertiesService\";\nimport { ShadowGeneratorPropertiesServiceDefinition } from \"./services/panes/properties/shadowGeneratorPropertiesService\";\nimport { SpriteLayerPropertiesServiceDefinition } from \"./services/panes/properties/spriteLayerPropertiesService\";\nimport { TextLayerPropertiesServiceDefinition } from \"./services/panes/properties/textLayerPropertiesService\";\nimport { TexturePropertiesServiceDefinition } from \"./services/panes/properties/texturePropertiesService\";\nimport { CameraExplorerServiceDefinition } from \"./services/panes/scene/cameraExplorerService\";\nimport { LightExplorerServiceDefinition } from \"./services/panes/scene/lightExplorerService\";\nimport { MaterialExplorerServiceDefinition } from \"./services/panes/scene/materialExplorerService\";\nimport { MeshExplorerServiceDefinition } from \"./services/panes/scene/meshExplorerService\";\nimport { ShadowGeneratorExplorerServiceDefinition } from \"./services/panes/scene/shadowGeneratorExplorerService\";\nimport { SpriteLayerExplorerServiceDefinition } from \"./services/panes/scene/spriteLayerExplorerService\";\nimport { TextLayerExplorerServiceDefinition } from \"./services/panes/scene/textLayerExplorerService\";\nimport { TextureExplorerServiceDefinition } from \"./services/panes/scene/textureExplorerService\";\n\n/**\n * Shows Inspector for a Babylon Lite engine.\n * @param engine The Babylon Lite engine to inspect.\n * @param options Optional configuration for Inspector.\n * @returns An {@link InspectorToken} that can be disposed to hide Inspector.\n */\nexport function ShowInspector(engine: EngineContext, options: Partial<InspectorOptions> = {}): InspectorToken {\n const renderingCanvas = engine.canvas instanceof HTMLCanvasElement ? engine.canvas : null;\n\n return _ShowInspector(engine, options, {\n renderingCanvas,\n resize: () => resizeEngine(engine),\n startAutoResize: renderingCanvas\n ? () => {\n const resizeObserver = new ResizeObserver(() => resizeEngine(engine));\n resizeObserver.observe(renderingCanvas);\n return () => resizeObserver.disconnect();\n }\n : undefined,\n initialize: (resolvedOptions) => {\n const { watcherServiceDefinition, watcherSettingsServiceDefinition, watcherRefreshToolbarServiceDefinition } = MakeWatcherServiceDefinitions({\n defaultSettings: {\n mode: \"polling\",\n interval: 250,\n },\n supportedModes: [\"polling\", \"manual\"],\n });\n const engineContextServiceDefinition: ServiceDefinition<[IEngineContext], []> = {\n friendlyName: \"Babylon Lite Engine Context\",\n produces: [EngineContextIdentity],\n factory: () => ({\n engine,\n }),\n };\n\n const serviceDefinitions: WeaklyTypedServiceDefinition[] = [\n engineContextServiceDefinition,\n watcherServiceDefinition,\n EngineExplorerServiceDefinition,\n MeshExplorerServiceDefinition,\n CameraExplorerServiceDefinition,\n LightExplorerServiceDefinition,\n ShadowGeneratorExplorerServiceDefinition,\n MaterialExplorerServiceDefinition,\n TextureExplorerServiceDefinition,\n TextLayerExplorerServiceDefinition,\n SpriteLayerExplorerServiceDefinition,\n PropertiesServiceDefinition,\n EnginePropertiesServiceDefinition,\n RenderingContextPropertiesServiceDefinition,\n SceneNodePropertiesServiceDefinition,\n MeshPropertiesServiceDefinition,\n CameraPropertiesServiceDefinition,\n LightPropertiesServiceDefinition,\n ShadowGeneratorPropertiesServiceDefinition,\n MaterialPropertiesServiceDefinition,\n TexturePropertiesServiceDefinition,\n TextLayerPropertiesServiceDefinition,\n SpriteLayerPropertiesServiceDefinition,\n SettingsServiceDefinition,\n watcherSettingsServiceDefinition,\n ShellSettingsServiceDefinition,\n watcherRefreshToolbarServiceDefinition,\n SelectionServiceDefinition,\n EngineSelectionServiceDefinition,\n ];\n\n return {\n serviceDefinitions,\n extensionFeeds: resolvedOptions.extensionFeeds,\n };\n },\n });\n}\n"],"names":["useInputStyles","_jsx","FluentTooltip","FluentButton","useStyles","_jsxs","_Fragment","MessageBar","SearchBox","FluentAccordion","InterceptorHooksMaps","FluentCollapse","Button","FluentToolbar","FluentFade","FluentLink","FluentToggleButton","FluentInfoLabel","Checkbox","FluentSwitch","FluentDropdown","FluentSlider","Tooltip","List","FluentCheckbox","FluentComboBox","FluentMessageBar","FluentPopover","Popover","FluentSearchBox","FluentTextarea","FluentInput","ColorToHex","GetPosition","FluentColorPicker"],"mappings":"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"}