@babylonjs/inspector 8.53.0 → 8.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { createContext, forwardRef, useContext, useState, useCallback, Component, useMemo, useEffect, useRef, useReducer, Children, isValidElement, useLayoutEffect, cloneElement, useImperativeHandle, createElement, Suspense, memo, Fragment as Fragment$1, lazy } from 'react';
3
- import { tokens, makeStyles, Tooltip as Tooltip$1, Button as Button$1, Spinner, Link as Link$1, Caption1, Body1, useFluent, Accordion as Accordion$1, AccordionHeader, Subtitle2Stronger, AccordionPanel, Divider, MessageBar as MessageBar$1, MessageBarBody, AccordionItem, SearchBox as SearchBox$1, Portal, ToggleButton as ToggleButton$1, InfoLabel as InfoLabel$1, mergeClasses, Body1Strong, useId, useToastController, Toast, ToastTitle, FluentProvider, Toaster, Checkbox as Checkbox$1, createLightTheme, createDarkTheme, TeachingPopover, TeachingPopoverSurface, TeachingPopoverHeader, TeachingPopoverBody, Switch as Switch$1, createDOMRenderer, RendererProvider, Menu, MenuTrigger, SplitButton, MenuPopover, MenuList, MenuItem, Toolbar as Toolbar$1, ToolbarRadioButton, MenuGroup, MenuGroupHeader, treeItemLevelToken, FlatTree, FlatTreeItem, TreeItemLayout, MenuDivider, MenuItemCheckbox, useMergedRefs, Input, Dropdown as Dropdown$1, Option, Popover as Popover$1, PopoverTrigger, PopoverSurface, ColorPicker, ColorArea, ColorSlider, AlphaSlider, ColorSwatch, PresenceBadge, Slider as Slider$1, MenuItemRadio, Dialog, DialogSurface, DialogBody, DialogTitle, DialogContent, DialogActions, List as List$1, ListItem, Badge, Label, MessageBarTitle, Subtitle2, useComboboxFilter, Combobox, Textarea as Textarea$1, ToolbarButton, ToolbarDivider, Field } from '@fluentui/react-components';
3
+ import { tokens, makeStyles, Tooltip as Tooltip$1, Button as Button$1, Spinner, Link as Link$1, Caption1, Body1, useFluent, Accordion as Accordion$1, AccordionHeader, Subtitle2Stronger, AccordionPanel, Divider, MessageBar as MessageBar$1, MessageBarBody, AccordionItem, SearchBox as SearchBox$1, Portal, ToggleButton as ToggleButton$1, InfoLabel as InfoLabel$1, Body1Strong, mergeClasses, useId, useToastController, Toast, ToastTitle, FluentProvider, Toaster, Checkbox as Checkbox$1, createLightTheme, createDarkTheme, TeachingPopover, TeachingPopoverSurface, TeachingPopoverHeader, TeachingPopoverBody, Switch as Switch$1, createDOMRenderer, RendererProvider, Menu, MenuTrigger, SplitButton, MenuPopover, MenuList, MenuItem, Toolbar as Toolbar$1, ToolbarRadioButton, MenuGroup, MenuGroupHeader, treeItemLevelToken, FlatTree, FlatTreeItem, TreeItemLayout, MenuDivider, MenuItemCheckbox, useMergedRefs, Input, Dropdown as Dropdown$1, Option, Popover as Popover$1, PopoverTrigger, PopoverSurface, ColorPicker, ColorArea, ColorSlider, AlphaSlider, ColorSwatch, PresenceBadge, Slider as Slider$1, MenuItemRadio, Dialog, DialogSurface, DialogBody, DialogTitle, DialogContent, DialogActions, List as List$1, ListItem, Badge, Label, MessageBarTitle, Subtitle2, useComboboxFilter, Combobox, Textarea as Textarea$1, ToolbarButton, ToolbarDivider, Field } from '@fluentui/react-components';
4
4
  import { ErrorCircleRegular, EyeFilled, EyeOffRegular, CheckmarkFilled, EditRegular, FilterRegular, PinFilled, PinRegular, ArrowCircleUpRegular, ChevronCircleRight16Regular, ChevronCircleRight20Regular, ChevronCircleDown16Regular, ChevronCircleDown20Regular, Copy16Regular, CopyRegular, PanelLeftExpandRegular, PanelRightExpandRegular, PanelLeftContractRegular, PanelRightContractRegular, PictureInPictureEnterRegular, MoreHorizontalRegular, LayoutColumnTwoFocusLeftFilled, LayoutColumnTwoSplitLeftFocusTopLeftFilled, LayoutColumnTwoSplitLeftFocusBottomLeftFilled, LayoutColumnTwoFocusRightFilled, LayoutColumnTwoSplitRightFocusTopRightFilled, LayoutColumnTwoSplitRightFocusBottomRightFilled, SettingsRegular, DocumentTextRegular, createFluentIcon, TextSortAscendingRegular, GlobeRegular, ArrowExpandAllRegular, ArrowCollapseAllRegular, CubeTreeRegular, BugRegular, ArrowUploadRegular, ArrowBidirectionalUpDownFilled, ArrowDownloadRegular, StopRegular, RecordRegular, DataBarHorizontalRegular, WrenchRegular, ArrowClockwiseRegular, WeatherSunnyRegular, WeatherMoonRegular, ArrowRotateClockwiseRegular, ArrowExpandRegular, SelectObjectRegular, CubeRegular, CameraRegular, AddRegular, DeleteRegular, FullScreenMaximizeRegular, ChevronDownRegular, ChevronRightRegular, CircleSmallFilled, SaveRegular, PreviousRegular, ArrowPreviousRegular, TriangleLeftRegular, RecordStopRegular, PlayRegular, ArrowNextRegular, NextRegular, PauseRegular, LinkDismissRegular, LinkEditRegular, ArrowUndoRegular, BracesRegular, BracesDismiss16Regular, EyeRegular, CloudArrowUpRegular, CloudArrowDownRegular, EyeOffFilled, ArrowMoveFilled, StopFilled, PlayFilled, LockOpenRegular, LockClosedRegular, ResizeRegular, ChevronUpRegular, ArrowResetRegular, CircleHalfFillRegular, EyedropperRegular, PaintBucketRegular, InkStrokeRegular, StackRegular, FilmstripRegular, PauseFilled, WeatherSunnyLowFilled, LayerRegular, FrameRegular, AppGenericRegular, RectangleLandscapeRegular, BorderOutsideRegular, BorderNoneRegular, MyLocationRegular, LightbulbRegular, VideoFilled, VideoRegular, FlashlightRegular, FlashlightOffRegular, DropRegular, BlurRegular, PipelineRegular, PersonWalkingRegular, DataLineRegular, SoundWaveCircleRegular, PersonSquareRegular, LayerDiagonalPersonRegular, ImageEditRegular, ImageRegular, TargetRegular, PersonFeedbackRegular, BranchRegular, DeleteFilled } from '@fluentui/react-icons';
5
5
  import { Color3, Color4 } from '@babylonjs/core/Maths/math.color.js';
6
6
  import { Vector3, Quaternion, Matrix, Vector2, Vector4, TmpVectors } from '@babylonjs/core/Maths/math.vector.js';
@@ -37,7 +37,7 @@ import { PerformanceViewerCollector } from '@babylonjs/core/Misc/PerformanceView
37
37
  import { AbstractEngine } from '@babylonjs/core/Engines/abstractEngine.js';
38
38
  import { Bone } from '@babylonjs/core/Bones/bone.js';
39
39
  import { Camera } from '@babylonjs/core/Cameras/camera.js';
40
- import { FrameGraphUtils, FindMainCamera, FindMainObjectRenderer } from '@babylonjs/core/FrameGraph/frameGraphUtils.js';
40
+ import { FrameGraphUtils, FindMainObjectRenderer, FindMainCamera } from '@babylonjs/core/FrameGraph/frameGraphUtils.js';
41
41
  import { CameraGizmo } from '@babylonjs/core/Gizmos/cameraGizmo.js';
42
42
  import { GizmoManager } from '@babylonjs/core/Gizmos/gizmoManager.js';
43
43
  import { LightGizmo } from '@babylonjs/core/Gizmos/lightGizmo.js';
@@ -79,7 +79,7 @@ import { Engine } from '@babylonjs/core/Engines/engine.js';
79
79
  import { ParticleSystem } from '@babylonjs/core/Particles/particleSystem.js';
80
80
  import { GradientBlockColorStep } from '@babylonjs/core/Materials/Node/Blocks/gradientBlock.js';
81
81
  import { NodeMaterialBlockConnectionPointTypes } from '@babylonjs/core/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes.js';
82
- import { FactorGradient, Color3Gradient, ColorGradient } from '@babylonjs/core/Misc/gradients.js';
82
+ import { Color3Gradient, ColorGradient, FactorGradient } from '@babylonjs/core/Misc/gradients.js';
83
83
  import { ReadFile } from '@babylonjs/core/Misc/fileTools.js';
84
84
  import { CubeTexture } from '@babylonjs/core/Materials/Textures/cubeTexture.js';
85
85
  import { Mesh } from '@babylonjs/core/Meshes/mesh.js';
@@ -276,7 +276,7 @@ const Button = forwardRef((props, ref) => {
276
276
  });
277
277
  Button.displayName = "Button";
278
278
 
279
- const useStyles$U = makeStyles({
279
+ const useStyles$V = makeStyles({
280
280
  root: {
281
281
  display: "flex",
282
282
  flexDirection: "column",
@@ -357,11 +357,18 @@ class ErrorBoundary extends Component {
357
357
  }
358
358
  }
359
359
  function ErrorFallback({ error, onRetry }) {
360
- const styles = useStyles$U();
360
+ const styles = useStyles$V();
361
361
  return (jsxs("div", { className: styles.root, children: [jsx(ErrorCircleRegular, { className: styles.icon }), jsx("div", { className: styles.title, children: "Something went wrong" }), jsx("div", { className: styles.message, children: "An error occurred in this component. You can try again or continue using other parts of the tool." }), jsx(Button, { label: "Try Again", appearance: "primary", onClick: onRetry }), error && jsx("div", { className: styles.details, children: error.message })] }));
362
362
  }
363
363
 
364
+ /**
365
+ * React context for accessing the property change observable.
366
+ */
364
367
  const PropertyContext = createContext(undefined);
368
+ /**
369
+ * Hook that returns a callback to notify the property context when a property has been changed.
370
+ * @returns A function that accepts (entity, propertyKey, oldValue, newValue) and notifies observers.
371
+ */
365
372
  function usePropertyChangedNotifier() {
366
373
  const propertyContext = useContext(PropertyContext);
367
374
  return useCallback((entity, propertyKey, oldValue, newValue) => {
@@ -1354,7 +1361,7 @@ function useIsSectionEmpty(sectionId) {
1354
1361
  return hasItems;
1355
1362
  }
1356
1363
 
1357
- const useStyles$T = makeStyles({
1364
+ const useStyles$U = makeStyles({
1358
1365
  accordion: {
1359
1366
  display: "flex",
1360
1367
  flexDirection: "column",
@@ -1399,6 +1406,7 @@ const useStyles$T = makeStyles({
1399
1406
  },
1400
1407
  menuBar: {
1401
1408
  display: "flex",
1409
+ padding: `0 ${tokens.spacingHorizontalM}`,
1402
1410
  },
1403
1411
  menuBarControls: {
1404
1412
  display: "flex",
@@ -1442,7 +1450,7 @@ const useStyles$T = makeStyles({
1442
1450
  */
1443
1451
  const AccordionMenuBar = () => {
1444
1452
  AccordionMenuBar.displayName = "AccordionMenuBar";
1445
- const classes = useStyles$T();
1453
+ const classes = useStyles$U();
1446
1454
  const accordionCtx = useContext(AccordionContext);
1447
1455
  if (!accordionCtx) {
1448
1456
  return null;
@@ -1485,7 +1493,7 @@ const AccordionSectionBlock = (props) => {
1485
1493
  const AccordionSectionItem = (props) => {
1486
1494
  AccordionSectionItem.displayName = "AccordionSectionItem";
1487
1495
  const { children, staticItem } = props;
1488
- const classes = useStyles$T();
1496
+ const classes = useStyles$U();
1489
1497
  const accordionCtx = useContext(AccordionContext);
1490
1498
  const itemState = useAccordionSectionItemState(props);
1491
1499
  const [ctrlMode, setCtrlMode] = useState(false);
@@ -1525,7 +1533,7 @@ const AccordionSectionItem = (props) => {
1525
1533
  */
1526
1534
  const AccordionPinnedContainer = () => {
1527
1535
  AccordionPinnedContainer.displayName = "AccordionPinnedContainer";
1528
- const classes = useStyles$T();
1536
+ const classes = useStyles$U();
1529
1537
  const accordionCtx = useContext(AccordionContext);
1530
1538
  return (jsx("div", { ref: accordionCtx?.pinnedContainerRef, className: classes.pinnedContainer, children: jsx(MessageBar$1, { className: classes.pinnedContainerEmpty, children: jsx(MessageBarBody, { children: "No pinned items" }) }) }));
1531
1539
  };
@@ -1536,7 +1544,7 @@ const AccordionPinnedContainer = () => {
1536
1544
  */
1537
1545
  const AccordionSearchBox = () => {
1538
1546
  AccordionSearchBox.displayName = "AccordionSearchBox";
1539
- const classes = useStyles$T();
1547
+ const classes = useStyles$U();
1540
1548
  const accordionCtx = useContext(AccordionContext);
1541
1549
  if (!accordionCtx?.features.search) {
1542
1550
  return null;
@@ -1552,7 +1560,7 @@ const AccordionSearchBox = () => {
1552
1560
  */
1553
1561
  const AccordionSection = (props) => {
1554
1562
  AccordionSection.displayName = "AccordionSection";
1555
- const classes = useStyles$T();
1563
+ const classes = useStyles$U();
1556
1564
  return jsx("div", { className: classes.panelDiv, children: props.children });
1557
1565
  };
1558
1566
  const StringAccordion = Accordion$1;
@@ -1560,7 +1568,7 @@ const Accordion = forwardRef((props, ref) => {
1560
1568
  Accordion.displayName = "Accordion";
1561
1569
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1562
1570
  const { children, highlightSections, uniqueId, enablePinnedItems, enableHiddenItems, enableSearchItems, ...rest } = props;
1563
- const classes = useStyles$T();
1571
+ const classes = useStyles$U();
1564
1572
  const { size } = useContext(ToolContext);
1565
1573
  const accordionCtx = useAccordionContext(props);
1566
1574
  const hasPinning = accordionCtx?.features.pinning ?? false;
@@ -1657,7 +1665,7 @@ const Collapse = (props) => {
1657
1665
  return (jsx(Collapse$1, { visible: props.visible, orientation: props.orientation, unmountOnExit: true, children: jsx("div", { className: `${classes.collapseContent} ${props.orientation === "horizontal" ? classes.horizontal : classes.vertical}`, children: props.children }) }));
1658
1666
  };
1659
1667
 
1660
- const useStyles$S = makeStyles({
1668
+ const useStyles$T = makeStyles({
1661
1669
  button: {
1662
1670
  display: "flex",
1663
1671
  alignItems: "center",
@@ -1675,7 +1683,7 @@ const ToggleButton = (props) => {
1675
1683
  ToggleButton.displayName = "ToggleButton";
1676
1684
  const { value, onChange, title, appearance = "subtle" } = props;
1677
1685
  const { size } = useContext(ToolContext);
1678
- const classes = useStyles$S();
1686
+ const classes = useStyles$T();
1679
1687
  const [checked, setChecked] = useState(value);
1680
1688
  const toggle = useCallback(() => {
1681
1689
  setChecked((prevChecked) => {
@@ -1937,6 +1945,11 @@ const DisableCopySettingDescriptor = {
1937
1945
  defaultValue: false,
1938
1946
  };
1939
1947
 
1948
+ /**
1949
+ * Hook that reads and writes a setting from the settings store.
1950
+ * @param descriptor The setting descriptor that identifies the setting and its default value.
1951
+ * @returns A tuple of [currentValue, setValue, resetValue] similar to React's useState.
1952
+ */
1940
1953
  function useSetting(descriptor) {
1941
1954
  const settingsStore = useSettingsStore();
1942
1955
  // Only watch for this specific setting to change. Otherwise, any time any setting changes we would
@@ -2014,7 +2027,7 @@ const UXContextProvider = (props) => {
2014
2027
  function AsReadonlyArray(array) {
2015
2028
  return array;
2016
2029
  }
2017
- const useStyles$R = makeStyles({
2030
+ const useStyles$S = makeStyles({
2018
2031
  rootDiv: {
2019
2032
  flex: 1,
2020
2033
  overflow: "hidden",
@@ -2022,8 +2035,14 @@ const useStyles$R = makeStyles({
2022
2035
  flexDirection: "column",
2023
2036
  },
2024
2037
  });
2038
+ /**
2039
+ * An accordion component that supports dynamically adding sections and section content at runtime.
2040
+ * Combines statically defined children sections with dynamically registered sections and content.
2041
+ * @param props The accordion props including sections, section content, context, and an optional imperative ref.
2042
+ * @returns The extensible accordion component.
2043
+ */
2025
2044
  function ExtensibleAccordion(props) {
2026
- const classes = useStyles$R();
2045
+ const classes = useStyles$S();
2027
2046
  const { children, sections, sectionContent, context, sectionsRef, ...rest } = props;
2028
2047
  const defaultSections = useMemo(() => {
2029
2048
  const defaultSections = [];
@@ -2148,7 +2167,7 @@ function ExtensibleAccordion(props) {
2148
2167
  })] }) })) }));
2149
2168
  }
2150
2169
 
2151
- const useStyles$Q = makeStyles({
2170
+ const useStyles$R = makeStyles({
2152
2171
  paneRootDiv: {
2153
2172
  display: "flex",
2154
2173
  flex: 1,
@@ -2161,7 +2180,7 @@ const useStyles$Q = makeStyles({
2161
2180
  */
2162
2181
  const SidePaneContainer = forwardRef((props, ref) => {
2163
2182
  const { className, ...rest } = props;
2164
- const classes = useStyles$Q();
2183
+ const classes = useStyles$R();
2165
2184
  return (jsx("div", { className: mergeClasses(classes.paneRootDiv, className), ref: ref, ...rest, children: props.children }));
2166
2185
  });
2167
2186
 
@@ -2200,11 +2219,21 @@ const DarkTheme = {
2200
2219
  colorNeutralForeground1: BaseDarkTheme.colorNeutralForeground2,
2201
2220
  };
2202
2221
 
2222
+ /**
2223
+ * The unique identity symbol for the settings store service.
2224
+ */
2203
2225
  const SettingsStoreIdentity = Symbol("SettingsStore");
2204
2226
  function GetKey(namespace, settingKey) {
2205
2227
  return `Babylon/${namespace}/${settingKey}`;
2206
2228
  }
2229
+ /**
2230
+ * Default implementation of {@link ISettingsStore} that persists settings using browser local storage.
2231
+ */
2207
2232
  class SettingsStore {
2233
+ /**
2234
+ * Creates a new settings store.
2235
+ * @param _namespace A namespace used to scope the settings keys to avoid collisions with other stores.
2236
+ */
2208
2237
  constructor(_namespace) {
2209
2238
  this._namespace = _namespace;
2210
2239
  this._onChanged = new Observable();
@@ -2223,10 +2252,17 @@ class SettingsStore {
2223
2252
  }
2224
2253
  }
2225
2254
 
2255
+ /**
2256
+ * The setting descriptor for persisting the theme mode preference.
2257
+ */
2226
2258
  const ThemeModeSettingDescriptor = {
2227
2259
  key: "ThemeMode",
2228
2260
  defaultValue: "system",
2229
2261
  };
2262
+ /**
2263
+ * Resolves the current theme based on user preference and system settings.
2264
+ * Listens for changes to both the persisted theme mode and the OS-level dark mode preference.
2265
+ */
2230
2266
  class ThemeResolver {
2231
2267
  constructor(_settingsStore) {
2232
2268
  this._settingsStore = _settingsStore;
@@ -2264,6 +2300,9 @@ class ThemeResolver {
2264
2300
  this._settingsStoreObserver.remove();
2265
2301
  }
2266
2302
  }
2303
+ /**
2304
+ * The unique identity symbol for the theme service.
2305
+ */
2267
2306
  const ThemeServiceIdentity = Symbol("ThemeService");
2268
2307
  const ThemeServiceDefinition = {
2269
2308
  friendlyName: "Theme Service",
@@ -2379,6 +2418,10 @@ function DepsEqual(a, b) {
2379
2418
  return true;
2380
2419
  }
2381
2420
 
2421
+ /**
2422
+ * Hook that provides the current theme mode state and controls for changing it.
2423
+ * @returns An object with the current dark mode state, theme mode, and functions to set or toggle the theme.
2424
+ */
2382
2425
  function useThemeMode() {
2383
2426
  const settingsStore = useSettingsStore();
2384
2427
  const themeResolver = useResource(useCallback(() => (settingsStore ? new ThemeResolver(settingsStore) : undefined), [settingsStore]));
@@ -2397,18 +2440,35 @@ function useThemeMode() {
2397
2440
  }
2398
2441
  return state;
2399
2442
  }
2443
+ /**
2444
+ * Hook that returns the current Fluent UI theme based on the active theme mode.
2445
+ * @param invert If true, inverts the theme (returns light theme in dark mode and vice versa). Defaults to false.
2446
+ * @returns The current Fluent UI theme object.
2447
+ */
2400
2448
  function useTheme(invert = false) {
2401
2449
  const { isDarkMode } = useThemeMode();
2402
2450
  return isDarkMode !== invert ? DarkTheme : LightTheme;
2403
2451
  }
2404
2452
 
2453
+ // Fluent doesn't apply styling to scrollbars by default, so provide our own reasonable default.
2454
+ const useStyles$Q = makeStyles({
2455
+ root: {
2456
+ scrollbarColor: `${tokens.colorNeutralForeground3} ${tokens.colorTransparentBackground}`,
2457
+ },
2458
+ });
2459
+ /**
2460
+ * A themed Fluent UI provider that applies the current theme mode (light or dark).
2461
+ * @param props Fluent provider props, plus an optional `invert` flag to swap the theme.
2462
+ * @returns The themed Fluent UI provider component.
2463
+ */
2405
2464
  const Theme = (props) => {
2406
- // NOTE: We do not want to applyStylesToPortals by default. If makes classes flow into portals
2465
+ // NOTE: We do not want to applyStylesToPortals by default. It makes classes flow into portals
2407
2466
  // (like popovers), and if those styles do things like disable overflow, they can completely
2408
2467
  // break any UI within the portal. Therefore, default to false.
2409
- const { invert = false, applyStylesToPortals = false, ...rest } = props;
2468
+ const { invert = false, applyStylesToPortals = false, className, ...rest } = props;
2410
2469
  const theme = useTheme(invert);
2411
- return (jsx(FluentProvider, { theme: theme, applyStylesToPortals: applyStylesToPortals, ...rest, children: props.children }));
2470
+ const classes = useStyles$Q();
2471
+ return (jsx(FluentProvider, { theme: theme, className: mergeClasses(classes.root, className), applyStylesToPortals: applyStylesToPortals, ...rest, children: props.children }));
2412
2472
  };
2413
2473
 
2414
2474
  const useStyles$P = makeStyles({
@@ -2683,7 +2743,10 @@ const SwitchPropertyLine = (props) => {
2683
2743
  return (jsx(PropertyLine, { ...props, children: jsx(Switch, { ...switchProps }) }));
2684
2744
  };
2685
2745
 
2686
- const SceneContextIdentity = Symbol("SceneScontext");
2746
+ /**
2747
+ * The unique identity symbol for the scene context service.
2748
+ */
2749
+ const SceneContextIdentity = Symbol("SceneContext");
2687
2750
 
2688
2751
  function ToFeaturesString(options) {
2689
2752
  const { defaultWidth, defaultHeight, defaultLeft, defaultTop } = options;
@@ -2911,27 +2974,48 @@ function useResizeHandle(params) {
2911
2974
  };
2912
2975
  }
2913
2976
 
2977
+ /**
2978
+ * Setting descriptor for persisting side pane dock location overrides.
2979
+ */
2914
2980
  const SidePaneDockOverridesSettingDescriptor = {
2915
2981
  key: "SidePaneDockOverrides",
2916
2982
  defaultValue: {},
2917
2983
  };
2984
+ /**
2985
+ * Setting descriptor for persisting the left side pane width adjustment.
2986
+ */
2918
2987
  const LeftSidePaneWidthAdjustSettingDescriptor = {
2919
2988
  key: "Shell/LeftPane/WidthAdjust",
2920
2989
  defaultValue: 0,
2921
2990
  };
2991
+ /**
2992
+ * Setting descriptor for persisting the left side pane height adjustment.
2993
+ */
2922
2994
  const LeftSidePaneHeightAdjustSettingDescriptor = {
2923
2995
  key: "Shell/LeftPane/HeightAdjust",
2924
2996
  defaultValue: 0,
2925
2997
  };
2998
+ /**
2999
+ * Setting descriptor for persisting the right side pane width adjustment.
3000
+ */
2926
3001
  const RightSidePaneWidthAdjustSettingDescriptor = {
2927
3002
  key: "Shell/RightPane/WidthAdjust",
2928
3003
  defaultValue: 0,
2929
3004
  };
3005
+ /**
3006
+ * Setting descriptor for persisting the right side pane height adjustment.
3007
+ */
2930
3008
  const RightSidePaneHeightAdjustSettingDescriptor = {
2931
3009
  key: "Shell/RightPane/HeightAdjust",
2932
3010
  defaultValue: 0,
2933
3011
  };
3012
+ /**
3013
+ * The unique identity symbol for the root component service.
3014
+ */
2934
3015
  const RootComponentServiceIdentity = Symbol("RootComponent");
3016
+ /**
3017
+ * The unique identity symbol for the shell service.
3018
+ */
2935
3019
  const ShellServiceIdentity = Symbol("ShellService");
2936
3020
  const useStyles$N = makeStyles({
2937
3021
  mainView: {
@@ -3047,8 +3131,18 @@ const useStyles$N = makeStyles({
3047
3131
  },
3048
3132
  paneHeaderText: {
3049
3133
  flex: 1,
3134
+ },
3135
+ paneHeaderTextNoIcon: {
3050
3136
  marginLeft: tokens.spacingHorizontalM,
3051
3137
  },
3138
+ paneHeaderIcon: {
3139
+ display: "flex",
3140
+ alignItems: "center",
3141
+ justifyContent: "center",
3142
+ height: "100%",
3143
+ aspectRatio: "1",
3144
+ fontSize: "20px",
3145
+ },
3052
3146
  paneHeaderButton: {
3053
3147
  color: "inherit",
3054
3148
  },
@@ -3137,7 +3231,7 @@ const DockMenu = (props) => {
3137
3231
  const PaneHeader = (props) => {
3138
3232
  const { id, title, dockOptions } = props;
3139
3233
  const classes = useStyles$N();
3140
- return (jsxs("div", { className: classes.paneHeaderDiv, children: [jsx(Subtitle2Stronger, { className: classes.paneHeaderText, children: title }), jsx(DockMenu, { sidePaneId: id, dockOptions: dockOptions, children: jsx(Button$1, { className: classes.paneHeaderButton, appearance: "transparent", icon: jsx(MoreHorizontalRegular, {}) }) })] }));
3234
+ return (jsxs("div", { className: classes.paneHeaderDiv, children: [props.icon && (jsx("div", { className: classes.paneHeaderIcon, children: jsx(props.icon, {}) })), jsx(Subtitle2Stronger, { className: mergeClasses(classes.paneHeaderText, !props.icon && classes.paneHeaderTextNoIcon), children: title }), jsx(DockMenu, { sidePaneId: id, dockOptions: dockOptions, children: jsx(Button$1, { className: classes.paneHeaderButton, appearance: "transparent", icon: jsx(MoreHorizontalRegular, {}) }) })] }));
3141
3235
  };
3142
3236
  // 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.
3143
3237
  const ToolbarItem = (props) => {
@@ -3317,9 +3411,9 @@ function usePane(location, defaultWidth, minWidth, sidePanes, onSelectSidePane,
3317
3411
  }, [childWindow, isChildWindowOpen, topPanes, bottomPanes]);
3318
3412
  // This memoizes the pane itself, which may or may not include the tab list, depending on the toolbar mode.
3319
3413
  const corePane = useMemo(() => {
3320
- return (jsxs(Fragment, { children: [toolbarMode === "compact" && (topPanes.length > 1 || topBarItems.length > 0) && (jsx(Fragment, { children: jsxs("div", { className: classes.barDiv, children: [!isChildWindowOpen && location === "left" && expandCollapseButton, topPaneTabList, jsx(Toolbar, { location: "top", components: topBarItems }), !isChildWindowOpen && location === "right" && expandCollapseButton] }) })), topPanes.length > 0 && (jsx("div", { className: classes.paneContent, children: topSelectedTab && (jsxs(Fragment, { children: [jsx(PaneHeader, { id: topSelectedTab.key, title: topSelectedTab.title, dockOptions: validTopDockOptions }), topPanes
3414
+ return (jsxs(Fragment, { children: [toolbarMode === "compact" && (topPanes.length > 1 || topBarItems.length > 0) && (jsx(Fragment, { children: jsxs("div", { className: classes.barDiv, children: [!isChildWindowOpen && location === "left" && expandCollapseButton, topPaneTabList, jsx(Toolbar, { location: "top", components: topBarItems }), !isChildWindowOpen && location === "right" && expandCollapseButton] }) })), topPanes.length > 0 && (jsx("div", { className: classes.paneContent, children: topSelectedTab && (jsxs(Fragment, { children: [jsx(PaneHeader, { id: topSelectedTab.key, title: topSelectedTab.title, icon: topPanes.length > 1 ? undefined : topSelectedTab.icon, dockOptions: validTopDockOptions }), topPanes
3321
3415
  .filter((pane) => pane.key === topSelectedTab.key || pane.keepMounted)
3322
- .map((pane) => (jsx("div", { className: mergeClasses(classes.paneContent, pane.key !== topSelectedTab.key ? classes.unselectedPane : undefined), children: jsx(ErrorBoundary, { name: pane.title, children: jsx(pane.content, {}) }) }, pane.key)))] })) })), topPanes.length > 0 && bottomPanes.length > 0 && jsx(Divider, { ref: paneVerticalResizeHandleRef, className: classes.paneDivider }), bottomPanes.length > 1 && (jsx(Fragment, { children: jsx("div", { className: classes.barDiv, children: bottomPaneTabList }) })), bottomPanes.length > 0 && (jsx("div", { ref: paneVerticalResizeElementRef, className: classes.paneContent, style: { height: `clamp(200px, calc(45% + var(${paneHeightAdjustCSSVar}, 0px)), 100% - 300px)`, flex: "0 0 auto" }, children: bottomSelectedTab && (jsxs(Fragment, { children: [jsx(PaneHeader, { id: bottomSelectedTab.key, title: bottomSelectedTab.title, dockOptions: validBottomDockOptions }), bottomPanes
3416
+ .map((pane) => (jsx("div", { className: mergeClasses(classes.paneContent, pane.key !== topSelectedTab.key ? classes.unselectedPane : undefined), children: jsx(ErrorBoundary, { name: pane.title, children: jsx(pane.content, {}) }) }, pane.key)))] })) })), topPanes.length > 0 && bottomPanes.length > 0 && jsx(Divider, { ref: paneVerticalResizeHandleRef, className: classes.paneDivider }), bottomPanes.length > 1 && (jsx(Fragment, { children: jsx("div", { className: classes.barDiv, children: bottomPaneTabList }) })), bottomPanes.length > 0 && (jsx("div", { ref: paneVerticalResizeElementRef, className: classes.paneContent, style: { height: `clamp(200px, calc(45% + var(${paneHeightAdjustCSSVar}, 0px)), 100% - 300px)`, flex: "0 0 auto" }, children: bottomSelectedTab && (jsxs(Fragment, { children: [jsx(PaneHeader, { id: bottomSelectedTab.key, title: bottomSelectedTab.title, icon: bottomPanes.length > 1 ? undefined : bottomSelectedTab.icon, dockOptions: validBottomDockOptions }), bottomPanes
3323
3417
  .filter((pane) => pane.key === bottomSelectedTab.key || pane.keepMounted)
3324
3418
  .map((pane) => (jsx("div", { className: mergeClasses(classes.paneContent, pane.key !== bottomSelectedTab.key ? classes.unselectedPane : undefined), children: jsx(ErrorBoundary, { name: pane.title, children: jsx(pane.content, {}) }) }, pane.key)))] })) })), toolbarMode === "compact" && bottomBarItems.length > 0 && (jsx(Fragment, { children: jsx("div", { className: classes.barDiv, children: jsx(Toolbar, { location: "bottom", components: bottomBarItems }) }) }))] }));
3325
3419
  }, [
@@ -3592,6 +3686,9 @@ function MakeShellServiceDefinition({ leftPaneDefaultWidth = 350, leftPaneMinWid
3592
3686
  };
3593
3687
  }
3594
3688
 
3689
+ /**
3690
+ * The unique identity symbol for the settings service.
3691
+ */
3595
3692
  const SettingsServiceIdentity = Symbol("SettingsService");
3596
3693
  const SettingsServiceDefinition = {
3597
3694
  friendlyName: "Settings",
@@ -3637,7 +3734,10 @@ const SettingsServiceDefinition = {
3637
3734
  },
3638
3735
  };
3639
3736
 
3640
- const SelectionServiceIdentity = Symbol("PropertiesService");
3737
+ /**
3738
+ * The unique identity symbol for the selection service.
3739
+ */
3740
+ const SelectionServiceIdentity = Symbol("SelectionService");
3641
3741
  const ShowPropertiesOnSelectionSettingDescriptor = {
3642
3742
  key: "ShowPropertiesOnSelection",
3643
3743
  defaultValue: true,
@@ -3645,8 +3745,8 @@ const ShowPropertiesOnSelectionSettingDescriptor = {
3645
3745
  const SelectionServiceDefinition = {
3646
3746
  friendlyName: "Selection Service",
3647
3747
  produces: [SelectionServiceIdentity],
3648
- consumes: [ShellServiceIdentity, SettingsStoreIdentity, SettingsServiceIdentity],
3649
- factory: (shellService, settingsStore, settingsService) => {
3748
+ consumes: [ShellServiceIdentity, SettingsStoreIdentity, SettingsServiceIdentity, SceneContextIdentity],
3749
+ factory: (shellService, settingsStore, settingsService, sceneContext) => {
3650
3750
  settingsService.addSectionContent({
3651
3751
  key: "Selection Service Settings",
3652
3752
  section: "UI",
@@ -3680,6 +3780,8 @@ const SelectionServiceDefinition = {
3680
3780
  }
3681
3781
  }
3682
3782
  };
3783
+ // Set the scene as the default selected entity.
3784
+ setSelectedItem(sceneContext.currentScene);
3683
3785
  return {
3684
3786
  get selectedEntity() {
3685
3787
  return selectedEntityState;
@@ -3693,6 +3795,9 @@ const SelectionServiceDefinition = {
3693
3795
  },
3694
3796
  };
3695
3797
 
3798
+ /**
3799
+ * The unique identity symbol for the properties service.
3800
+ */
3696
3801
  const PropertiesServiceIdentity = Symbol("PropertiesService");
3697
3802
  /**
3698
3803
  * Provides a properties pane that enables displaying and editing properties of an entity such as a mesh or a texture.
@@ -4649,6 +4754,9 @@ const SceneExplorer = (props) => {
4649
4754
  } }) })] }));
4650
4755
  };
4651
4756
 
4757
+ /**
4758
+ * The unique identity symbol for the scene explorer service.
4759
+ */
4652
4760
  const SceneExplorerServiceIdentity = Symbol("SceneExplorer");
4653
4761
  /**
4654
4762
  * Provides a scene explorer pane that enables browsing the scene graph and executing commands on entities.
@@ -4813,6 +4921,9 @@ const DebugPane = (props) => {
4813
4921
  return (jsxs(ExtensibleAccordion, { ...props, children: [jsxs(AccordionSection, { title: "Helpers", children: [jsx(SwitchPropertyLine, { label: "Grid", description: "Display a ground grid.", value: !!scene.reservedDataStore.gridMesh, onChange: () => SwitchGrid(scene) }), jsx(SwitchPropertyLine, { label: "Physics", description: "Display physic debug info.", value: !!scene.reservedDataStore.physicsViewer, onChange: () => SwitchPhysicsViewers(scene) }), jsx(SwitchPropertyLine, { label: "Names", description: "Display mesh names.", value: !!scene.reservedDataStore.textRenderersHook, onChange: () => void SwitchNameViewerAsync(scene) })] }), jsxs(AccordionSection, { title: "Texture Channels", children: [jsx(BoundProperty, { component: SwitchPropertyLine, label: "Diffuse", target: StandardMaterial, propertyKey: "DiffuseTextureEnabled" }, "Diffuse"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Ambient", target: StandardMaterial, propertyKey: "AmbientTextureEnabled" }, "Ambient"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Specular", target: StandardMaterial, propertyKey: "SpecularTextureEnabled" }, "Specular"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Emissive", target: StandardMaterial, propertyKey: "EmissiveTextureEnabled" }, "Emissive"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Bump", target: StandardMaterial, propertyKey: "BumpTextureEnabled" }, "Bump"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Opacity", target: StandardMaterial, propertyKey: "OpacityTextureEnabled" }, "Opacity"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Reflection", target: StandardMaterial, propertyKey: "ReflectionTextureEnabled" }, "Reflection"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Refraction", target: StandardMaterial, propertyKey: "RefractionTextureEnabled" }, "Refraction"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Color Grading", target: StandardMaterial, propertyKey: "ColorGradingTextureEnabled" }, "ColorGrading"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Lightmap", target: StandardMaterial, propertyKey: "LightmapTextureEnabled" }, "Lightmap"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Fresnel", target: StandardMaterial, propertyKey: "FresnelEnabled" }, "Fresnel"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Detail", target: MaterialFlags, propertyKey: "DetailTextureEnabled" }, "Detail"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Decal", target: MaterialFlags, propertyKey: "DecalMapEnabled" }, "Decal")] }), jsxs(AccordionSection, { title: "Features", children: [jsx(BoundProperty, { component: SwitchPropertyLine, label: "Animations", target: scene, propertyKey: "animationsEnabled" }, "Animations"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Physics", target: scene, propertyKey: "physicsEnabled" }, "Physics"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Collisions", target: scene, propertyKey: "collisionsEnabled" }, "Collisions"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Fog", target: scene, propertyKey: "fogEnabled" }, "Fog"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Lens Flares", target: scene, propertyKey: "lensFlaresEnabled" }, "Lens flares"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Lights", target: scene, propertyKey: "lightsEnabled" }, "Lights"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Particles", target: scene, propertyKey: "particlesEnabled" }, "Particles"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Post-processes", target: scene, propertyKey: "postProcessesEnabled" }, "Post-processes"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Probes", target: scene, propertyKey: "probesEnabled" }, "Probes"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Textures", target: scene, propertyKey: "texturesEnabled" }, "Textures"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Procedural Textures", target: scene, propertyKey: "proceduralTexturesEnabled" }, "Procedural textures"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Render Targets", target: scene, propertyKey: "renderTargetsEnabled" }, "Render targets"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Shadows", target: scene, propertyKey: "shadowsEnabled" }, "Shadows"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Skeletons", target: scene, propertyKey: "skeletonsEnabled" }, "Skeletons"), jsx(BoundProperty, { component: SwitchPropertyLine, label: "Sprites", target: scene, propertyKey: "spritesEnabled" }, "Sprites")] })] }));
4814
4922
  };
4815
4923
 
4924
+ /**
4925
+ * The unique identity symbol for the debug service.
4926
+ */
4816
4927
  const DebugServiceIdentity = Symbol("DebugService");
4817
4928
  const DebugServiceDefinition = {
4818
4929
  friendlyName: "Debug",
@@ -6925,6 +7036,9 @@ const SystemStats = ({ context: scene }) => {
6925
7036
  return (jsxs(Fragment, { children: [jsx(TextPropertyLine, { label: "Resolution", value: resolution }, "Resolution"), jsx(StringifiedPropertyLine, { label: "Hardware Scaling Level", value: hardwareScalingLevel }, "HardwareScalingLevel"), jsx(TextPropertyLine, { label: "Engine", value: engine.description }, "Engine"), jsx(BooleanBadgePropertyLine, { label: "StdDerivatives", value: caps.standardDerivatives }, "StdDerivatives"), jsx(BooleanBadgePropertyLine, { label: "Compressed Textures", value: caps.s3tc !== undefined }, "CompressedTextures"), jsx(BooleanBadgePropertyLine, { label: "Hardware Instances", value: caps.instancedArrays }, "HardwareInstances"), jsx(BooleanBadgePropertyLine, { label: "Texture Float", value: caps.textureFloat }, "TextureFloat"), jsx(BooleanBadgePropertyLine, { label: "Texture Half Float", value: caps.textureHalfFloat }, "TextureHalfFloat"), jsx(BooleanBadgePropertyLine, { label: "Render to Texture Float", value: caps.textureFloatRender }, "RenderToTextureFloat"), jsx(BooleanBadgePropertyLine, { label: "Render to Texture Half Float", value: caps.textureHalfFloatRender }, "RenderToTextureHalfFloat"), jsx(BooleanBadgePropertyLine, { label: "32bits Indices", value: caps.uintIndices }, "32bitsIndices"), jsx(BooleanBadgePropertyLine, { label: "Fragment Depth", value: caps.fragmentDepthSupported }, "FragmentDepth"), jsx(BooleanBadgePropertyLine, { label: "High Precision Shaders", value: caps.highPrecisionShaderSupported }, "HighPrecisionShaders"), jsx(BooleanBadgePropertyLine, { label: "Draw Buffers", value: caps.drawBuffersExtension }, "DrawBuffers"), jsx(BooleanBadgePropertyLine, { label: "Vertex Array Object", value: caps.vertexArrayObject }, "VertexArrayObject"), jsx(BooleanBadgePropertyLine, { label: "Timer Query", value: caps.timerQuery !== undefined }, "TimerQuery"), jsx(BooleanBadgePropertyLine, { label: "Stencil", value: engine.isStencilEnable }, "Stencil"), jsx(BooleanBadgePropertyLine, { label: "Parallel Shader Compilation", value: caps.parallelShaderCompile != null }, "ParallelShaderCompilation"), jsx(StringifiedPropertyLine, { label: "Max Textures Units", value: caps.maxTexturesImageUnits }, "MaxTexturesUnits"), jsx(StringifiedPropertyLine, { label: "Max Textures Size", value: caps.maxTextureSize }, "MaxTexturesSize"), jsx(StringifiedPropertyLine, { label: "Max Anisotropy", value: caps.maxAnisotropy }, "MaxAnisotropy"), jsx(TextPropertyLine, { label: "Driver", value: engine.extractDriverInfo() }, "Driver")] }));
6926
7037
  };
6927
7038
 
7039
+ /**
7040
+ * The unique identity symbol for the stats service.
7041
+ */
6928
7042
  const StatsServiceIdentity = Symbol("StatsService");
6929
7043
  /**
6930
7044
  * Provides a scene stats pane.
@@ -7005,6 +7119,9 @@ const ToolsPane = (props) => {
7005
7119
  return jsx(ExtensibleAccordion, { ...props });
7006
7120
  };
7007
7121
 
7122
+ /**
7123
+ * The unique identity symbol for the tools service.
7124
+ */
7008
7125
  const ToolsServiceIdentity = Symbol("ToolsService");
7009
7126
  /**
7010
7127
  * A collection of usually optional, dynamic extensions.
@@ -7230,6 +7347,9 @@ const WatcherSettingDescriptor = {
7230
7347
  mode: "intercept",
7231
7348
  },
7232
7349
  };
7350
+ /**
7351
+ * The unique identity symbol for the watcher service.
7352
+ */
7233
7353
  const WatcherServiceIdentity = Symbol("WatcherService");
7234
7354
  const WatcherServiceDefinition = {
7235
7355
  friendlyName: "Watcher Service",
@@ -7375,6 +7495,9 @@ const WatcherRefreshToolbarServiceDefinition = {
7375
7495
  },
7376
7496
  };
7377
7497
 
7498
+ /**
7499
+ * The unique identity symbol for the gizmo service.
7500
+ */
7378
7501
  const GizmoServiceIdentity = Symbol("GizmoService");
7379
7502
  const GizmoServiceDefinition = {
7380
7503
  friendlyName: "Gizmo Service",
@@ -7656,7 +7779,7 @@ const DefaultInspectorExtensionFeed = new BuiltInsExtensionFeed("Inspector", [
7656
7779
  keywords: ["creation", "tools"],
7657
7780
  ...BabylonWebResources,
7658
7781
  author: { name: "Babylon.js", forumUserName: "" },
7659
- getExtensionModuleAsync: async () => await import('./quickCreateToolsService-DeZ7ZJOC.js'),
7782
+ getExtensionModuleAsync: async () => await import('./quickCreateToolsService-DnszM-9c.js'),
7660
7783
  },
7661
7784
  {
7662
7785
  name: "Reflector",
@@ -7664,7 +7787,7 @@ const DefaultInspectorExtensionFeed = new BuiltInsExtensionFeed("Inspector", [
7664
7787
  keywords: ["reflector", "bridge", "sync", "sandbox", "tools"],
7665
7788
  ...BabylonWebResources,
7666
7789
  author: { name: "Babylon.js", forumUserName: "" },
7667
- getExtensionModuleAsync: async () => await import('./reflectorService-DE0Ic3N5.js'),
7790
+ getExtensionModuleAsync: async () => await import('./reflectorService-Dis4AcAP.js'),
7668
7791
  },
7669
7792
  ]);
7670
7793
 
@@ -8393,7 +8516,7 @@ function MakeModularTool(options) {
8393
8516
  }
8394
8517
  // Register the extension list service (for browsing/installing extensions) if extension feeds are provided.
8395
8518
  if (extensionFeeds.length > 0) {
8396
- const { ExtensionListServiceDefinition } = await import('./extensionsListService-CAOSDkIg.js');
8519
+ const { ExtensionListServiceDefinition } = await import('./extensionsListService-ClgMe11V.js');
8397
8520
  await serviceContainer.addServiceAsync(ExtensionListServiceDefinition);
8398
8521
  }
8399
8522
  // Register all external services (that make up a unique tool).
@@ -8534,11 +8657,10 @@ const GizmoToolbar = (props) => {
8534
8657
  const onCameraGizmoChange = useCallback((e, data) => {
8535
8658
  const value = data.checkedItems[0];
8536
8659
  gizmoService.gizmoCamera = value === "-1" ? null : (cameras.find((camera) => camera.uniqueId.toString() === value) ?? null);
8537
- }, [gizmoService]);
8660
+ }, [gizmoService, cameras]);
8538
8661
  return (jsxs(Fragment, { children: [jsx(ToggleButton, { title: "Translate", checkedIcon: TranslateIcon, value: gizmoMode === "translate", onChange: () => updateGizmoMode("translate") }), jsx(ToggleButton, { title: "Rotate", checkedIcon: ArrowRotateClockwiseRegular, value: gizmoMode === "rotate", onChange: () => updateGizmoMode("rotate") }), jsx(ToggleButton, { title: "Scale", checkedIcon: ArrowExpandRegular, value: gizmoMode === "scale", onChange: () => updateGizmoMode("scale") }), jsx(ToggleButton, { title: "Bounding Box", checkedIcon: SelectObjectRegular, value: gizmoMode === "boundingBox", onChange: () => updateGizmoMode("boundingBox") }), jsx(Collapse, { visible: !!gizmoMode, orientation: "horizontal", children: jsxs(Menu, { positioning: "below-end", checkedValues: { coordinatesMode: [coordinatesMode.toString()] }, onCheckedValueChange: onCoordinatesModeChange, children: [jsx(MenuTrigger, { disableButtonEnhancement: true, children: (triggerProps) => (jsx(Tooltip$1, { content: "Coordinates Mode", relationship: "label", children: jsx(SplitButton, { className: classes.coordinatesModeButton, menuButton: triggerProps, primaryActionButton: {
8539
8662
  onClick: toggleCoordinatesMode,
8540
- }, size: "small", appearance: "transparent", shape: "rounded", icon: coordinatesMode === 1 /* GizmoCoordinatesMode.Local */ ? jsx(CubeRegular, {}) : jsx(GlobeRegular, {}) }) })) }), jsx(MenuPopover, { className: classes.coordinatesModeMenu, children: jsxs(MenuList, { children: [jsx(MenuItemRadio, { name: "coordinatesMode", value: 1 /* GizmoCoordinatesMode.Local */.toString(), children: "Local" }), jsx(MenuItemRadio, { name: "coordinatesMode", value: 0 /* GizmoCoordinatesMode.World */.toString(), children: "World" })] }) })] }) }), jsx(Collapse, { visible: !!gizmoMode, orientation: "horizontal", children: jsxs(Menu, { positioning: "below-end", checkedValues: { cameraGizmo: [cameraGizmo?.uniqueId.toString() ?? "-1"] }, onCheckedValueChange: onCameraGizmoChange, children: [jsx(MenuTrigger, { disableButtonEnhancement: true, children: (triggerProps) => (jsx(Tooltip$1, { content: "Camera Gizmo", relationship: "label", children: jsx(SplitButton, { className: classes.cameraGizmoButton, menuButton: triggerProps, size: "small", appearance: "transparent", shape: "rounded", icon: jsx(CameraRegular, {}) }) })) }), jsx(MenuPopover, { className: classes.cameraGizmoMenu, children: jsxs(MenuList, { children: [jsx(MenuItemRadio, { name: "cameraGizmo", value: "-1", children: "Automatic" }), sceneContext.currentScene &&
8541
- sceneContext.currentScene.activeCameras?.map((camera, index) => (jsx(MenuItemRadio, { name: "cameraGizmo", value: camera.uniqueId.toString(), children: camera.name }, camera.uniqueId)))] }) })] }) })] }));
8663
+ }, size: "small", appearance: "transparent", shape: "rounded", icon: coordinatesMode === 1 /* GizmoCoordinatesMode.Local */ ? jsx(CubeRegular, {}) : jsx(GlobeRegular, {}) }) })) }), jsx(MenuPopover, { className: classes.coordinatesModeMenu, children: jsxs(MenuList, { children: [jsx(MenuItemRadio, { name: "coordinatesMode", value: 1 /* GizmoCoordinatesMode.Local */.toString(), children: "Local" }), jsx(MenuItemRadio, { name: "coordinatesMode", value: 0 /* GizmoCoordinatesMode.World */.toString(), children: "World" })] }) })] }) }), jsx(Collapse, { visible: !!gizmoMode && !!cameras && cameras.length > 1, orientation: "horizontal", children: jsxs(Menu, { positioning: "below-end", checkedValues: { cameraGizmo: [cameraGizmo?.uniqueId.toString() ?? "-1"] }, onCheckedValueChange: onCameraGizmoChange, children: [jsx(MenuTrigger, { disableButtonEnhancement: true, children: (triggerProps) => (jsx(Tooltip$1, { content: "Camera Gizmo", relationship: "label", children: jsx(SplitButton, { className: classes.cameraGizmoButton, menuButton: triggerProps, size: "small", appearance: "transparent", shape: "rounded", icon: jsx(CameraRegular, {}) }) })) }), jsx(MenuPopover, { className: classes.cameraGizmoMenu, children: jsxs(MenuList, { children: [jsx(MenuItemRadio, { name: "cameraGizmo", value: "-1", children: "Automatic" }), cameras?.map((camera) => (jsx(MenuItemRadio, { name: "cameraGizmo", value: camera.uniqueId.toString(), children: camera.name }, camera.uniqueId)))] }) })] }) })] }));
8542
8664
  };
8543
8665
 
8544
8666
  const GizmoToolbarServiceDefinition = {
@@ -11967,7 +12089,7 @@ const RangeFrameBar = ({ width }) => {
11967
12089
  const x = frameToX(displayFrame);
11968
12090
  return jsx("line", { className: styles.activeFrameLine, x1: x, y1: 0, x2: x, y2: 40 });
11969
12091
  }, [displayFrame, frameToX, styles.activeFrameLine]);
11970
- const viewBox = `${ -10} 0 ${viewWidth + OFFSET_X * 4} 40`;
12092
+ const viewBox = `${-OFFSET_X} 0 ${viewWidth + OFFSET_X * 4} 40`;
11971
12093
  return (jsx("div", { className: styles.root, onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: handlePointerUp, onPointerCancel: handlePointerUp, children: jsxs("svg", { ref: svgRef, className: styles.svg, viewBox: viewBox, children: [frameTicks.map((frame, i) => {
11972
12094
  const x = frameToX(frame);
11973
12095
  return (jsxs("g", { children: [jsx("line", { className: styles.tickLine, x1: x, y1: 22, x2: x, y2: 40 }), jsx("text", { className: styles.tickLabel, x: x, y: 14, children: Math.round(frame) })] }, `tick-${frame}-${i}`));
@@ -14917,10 +15039,13 @@ function StringifyMetadata(metadata, format) {
14917
15039
  return metadata;
14918
15040
  }
14919
15041
  if (metadata) {
14920
- if (ObjectCanSafelyStringify(metadata)) {
14921
- return JSON.stringify(metadata, undefined, undefined);
15042
+ // Try JSON.stringify even for objects with functions — it safely omits
15043
+ // function-valued and undefined properties. Only fall back to String()
15044
+ // for cases that actually throw (e.g. circular references).
15045
+ try {
15046
+ return JSON.stringify(metadata, undefined, format ? PrettyJSONIndent : undefined);
14922
15047
  }
14923
- else {
15048
+ catch {
14924
15049
  return String(metadata);
14925
15050
  }
14926
15051
  }
@@ -14985,12 +15110,15 @@ const MetadataProperties = (props) => {
14985
15110
  const classes = useStyles$h();
14986
15111
  const { size } = useContext(ToolContext);
14987
15112
  const metadata = useProperty(entity, "metadata");
14988
- const stringifiedMetadata = useMemo(() => StringifyMetadata(metadata) ?? "", [metadata]);
15113
+ const stringifiedMetadata = useMemo(() => StringifyMetadata(metadata, false) ?? "", [metadata]);
14989
15114
  const metadataType = useMemo(() => GetMetadataEntityType(metadata), [metadata]);
14990
15115
  const canPreventObjectCorruption = metadataType === "object";
14991
15116
  const [preventObjectCorruption, setPreventObjectCorruption] = useState(false);
14992
15117
  const isReadonly = canPreventObjectCorruption && preventObjectCorruption;
14993
15118
  const [editedMetadata, setEditedMetadata] = useState(stringifiedMetadata);
15119
+ useEffect(() => {
15120
+ setEditedMetadata(stringifiedMetadata);
15121
+ }, [stringifiedMetadata]);
14994
15122
  const isEditedMetadataJSON = useMemo(() => IsParsable(editedMetadata), [editedMetadata]);
14995
15123
  const unformattedEditedMetadata = useMemo(() => Restringify(editedMetadata, false), [editedMetadata]);
14996
15124
  return (jsxs(Fragment, { children: [jsx(TextPropertyLine, { label: "Property Type", value: metadataType }), jsx(Collapse, { visible: canPreventObjectCorruption, children: jsx(SwitchPropertyLine, { label: "Prevent Object Corruption", value: isReadonly, onChange: setPreventObjectCorruption }) }), jsx(LineContainer, { uniqueId: "MetadataTextarea", children: jsx(Textarea, { disabled: isReadonly, value: editedMetadata, onChange: setEditedMetadata }) }), jsx(ButtonLine, { label: "Populate glTF extras", disabled: !!editedMetadata && (!IsParsable(editedMetadata) || HasGltfExtras(editedMetadata)), onClick: () => {
@@ -15344,7 +15472,10 @@ const MeshMorphTargetsProperties = (props) => {
15344
15472
  if (morphTargets.length === 0) {
15345
15473
  return null;
15346
15474
  }
15347
- return (jsx(Fragment, { children: morphTargets.map((target, index) => (jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: target.name || `Target ${index}`, description: `Influence of morph target "${target.name || `Target ${index}`}"`, target: target, propertyKey: "influence", min: 0, max: 1, step: 0.01 }, index))) }));
15475
+ return (jsx(Fragment, { children: morphTargets.map((target, index) => {
15476
+ const targetName = target.name || `Target ${index}`;
15477
+ return (jsx(BoundProperty, { component: NumberInputPropertyLine, label: targetName, description: `Influence of morph target "${targetName}"`, target: target, propertyKey: "influence", step: 0.01 }, index));
15478
+ }) }));
15348
15479
  };
15349
15480
 
15350
15481
  const NodeGeneralProperties = (props) => {
@@ -17227,7 +17358,8 @@ const SceneRenderingProperties = (props) => {
17227
17358
  const { scene, selectionService } = props;
17228
17359
  const envTexture = useProperty(scene, "environmentTexture");
17229
17360
  const fogMode = useProperty(scene, "fogMode");
17230
- return (jsxs(Fragment, { children: [jsx(NumberDropdownPropertyLine, { options: [
17361
+ const useOIT = useProperty(scene, "useOrderIndependentTransparency");
17362
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SwitchPropertyLine, label: "OIT", description: "Order Independent Transparency", target: scene, propertyKey: "useOrderIndependentTransparency" }), jsx(Collapse, { visible: useOIT, children: useOIT && scene.depthPeelingRenderer && (jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "passCount", description: "Render the number of transparent layers", target: scene.depthPeelingRenderer, propertyKey: "passCount", min: 2, max: 8, step: 1 })) }), jsx(NumberDropdownPropertyLine, { options: [
17231
17363
  { label: "Point", value: 0 },
17232
17364
  { label: "Wireframe", value: 1 },
17233
17365
  { label: "Solid", value: 2 },
@@ -19861,7 +19993,7 @@ const AnimationGroupExplorerServiceDefinition = {
19861
19993
  },
19862
19994
  };
19863
19995
  },
19864
- entityIcon: ({ entity }) => (entity instanceof AnimationGroup ? jsx(StackRegular, {}) : jsx(FilmstripRegular, {})),
19996
+ entityIcon: ({ entity }) => entity instanceof AnimationGroup ? jsx(StackRegular, { color: tokens.colorPaletteBlueForeground2 }) : jsx(FilmstripRegular, { color: tokens.colorPaletteBlueForeground2 }),
19865
19997
  getEntityAddedObservables: () => [scene.onNewAnimationGroupAddedObservable],
19866
19998
  getEntityRemovedObservables: () => [scene.onAnimationGroupRemovedObservable],
19867
19999
  });
@@ -19939,7 +20071,7 @@ const AtmosphereExplorerServiceDefinition = {
19939
20071
  },
19940
20072
  };
19941
20073
  },
19942
- entityIcon: () => jsx(WeatherSunnyLowFilled, {}),
20074
+ entityIcon: () => jsx(WeatherSunnyLowFilled, { color: tokens.colorPaletteYellowForeground2 }),
19943
20075
  // TODO in order for inspector UX to display atmosphere created after inspector is created
19944
20076
  getEntityAddedObservables: () => [],
19945
20077
  getEntityRemovedObservables: () => [],
@@ -20010,7 +20142,7 @@ const EffectLayerExplorerServiceDefinition = {
20010
20142
  },
20011
20143
  };
20012
20144
  },
20013
- entityIcon: () => jsx(LayerRegular, {}),
20145
+ entityIcon: () => jsx(LayerRegular, { color: tokens.colorPaletteRedForeground2 }),
20014
20146
  getEntityAddedObservables: () => [scene.onNewEffectLayerAddedObservable],
20015
20147
  getEntityRemovedObservables: () => [scene.onEffectLayerRemovedObservable],
20016
20148
  });
@@ -20048,7 +20180,7 @@ const FrameGraphExplorerServiceDefinition = {
20048
20180
  },
20049
20181
  };
20050
20182
  },
20051
- entityIcon: () => jsx(FrameRegular, {}),
20183
+ entityIcon: () => jsx(FrameRegular, { color: tokens.colorPaletteGreenForeground2 }),
20052
20184
  getEntityAddedObservables: () => [scene.onNewFrameGraphAddedObservable],
20053
20185
  getEntityRemovedObservables: () => [scene.onFrameGraphRemovedObservable],
20054
20186
  });
@@ -20180,7 +20312,7 @@ const GuiExplorerServiceDefinition = {
20180
20312
  },
20181
20313
  };
20182
20314
  },
20183
- entityIcon: ({ entity }) => (IsAdvancedDynamicTexture(entity) ? jsx(AppGenericRegular, {}) : jsx(RectangleLandscapeRegular, {})),
20315
+ entityIcon: ({ entity }) => IsAdvancedDynamicTexture(entity) ? (jsx(AppGenericRegular, { color: tokens.colorPaletteLilacForeground2 })) : (jsx(RectangleLandscapeRegular, { color: tokens.colorPaletteSeafoamForeground2 })),
20184
20316
  getEntityAddedObservables: () => [guiEntityAddedObservable],
20185
20317
  getEntityRemovedObservables: () => [guiEntityRemovedObservable],
20186
20318
  });
@@ -20285,7 +20417,7 @@ const MaterialExplorerServiceDefinition = {
20285
20417
  },
20286
20418
  };
20287
20419
  },
20288
- entityIcon: () => jsx(MaterialIcon, {}),
20420
+ entityIcon: () => jsx(MaterialIcon, { color: tokens.colorPaletteMarigoldForeground2 }),
20289
20421
  getEntityAddedObservables: () => [scene.onNewMaterialAddedObservable],
20290
20422
  getEntityRemovedObservables: () => [scene.onMaterialRemovedObservable],
20291
20423
  });
@@ -20367,7 +20499,7 @@ const NodeExplorerServiceDefinition = {
20367
20499
  },
20368
20500
  };
20369
20501
  },
20370
- entityIcon: ({ entity: node }) => node instanceof AbstractMesh ? (jsx(MeshIcon, {})) : node instanceof TransformNode ? (jsx(MyLocationRegular, {})) : node instanceof Camera ? (jsx(CameraRegular, {})) : node instanceof Light ? (jsx(LightbulbRegular, {})) : (jsx(Fragment, {})),
20502
+ entityIcon: ({ entity: node }) => node instanceof AbstractMesh ? (jsx(MeshIcon, { color: tokens.colorPaletteBlueForeground2 })) : node instanceof TransformNode ? (jsx(MyLocationRegular, { color: tokens.colorPaletteBlueForeground2 })) : node instanceof Camera ? (jsx(CameraRegular, { color: tokens.colorPaletteGreenForeground2 })) : node instanceof Light ? (jsx(LightbulbRegular, { color: tokens.colorPaletteYellowForeground2 })) : (jsx(Fragment, {})),
20371
20503
  getEntityAddedObservables: () => [
20372
20504
  scene.onNewMeshAddedObservable,
20373
20505
  scene.onNewTransformNodeAddedObservable,
@@ -20633,7 +20765,7 @@ const ParticleSystemExplorerServiceDefinition = {
20633
20765
  },
20634
20766
  };
20635
20767
  },
20636
- entityIcon: () => jsx(DropRegular, {}),
20768
+ entityIcon: () => jsx(DropRegular, { color: tokens.colorPaletteCranberryForeground2 }),
20637
20769
  getEntityAddedObservables: () => [scene.onNewParticleSystemAddedObservable],
20638
20770
  getEntityRemovedObservables: () => [scene.onParticleSystemRemovedObservable],
20639
20771
  });
@@ -20685,7 +20817,7 @@ const PostProcessExplorerServiceDefinition = {
20685
20817
  },
20686
20818
  };
20687
20819
  },
20688
- entityIcon: () => jsx(BlurRegular, {}),
20820
+ entityIcon: () => jsx(BlurRegular, { color: tokens.colorPaletteRedForeground2 }),
20689
20821
  getEntityAddedObservables: () => [scene.onNewPostProcessAddedObservable],
20690
20822
  getEntityRemovedObservables: () => [scene.onPostProcessRemovedObservable],
20691
20823
  });
@@ -20717,7 +20849,7 @@ const RenderingPipelineExplorerServiceDefinition = {
20717
20849
  },
20718
20850
  };
20719
20851
  },
20720
- entityIcon: () => jsx(PipelineRegular, {}),
20852
+ entityIcon: () => jsx(PipelineRegular, { color: tokens.colorPaletteRedForeground2 }),
20721
20853
  getEntityAddedObservables: () => [scene.postProcessRenderPipelineManager.onNewPipelineAddedObservable],
20722
20854
  getEntityRemovedObservables: () => [scene.postProcessRenderPipelineManager.onPipelineRemovedObservable],
20723
20855
  });
@@ -20759,7 +20891,7 @@ const SkeletonExplorerServiceDefinition = {
20759
20891
  },
20760
20892
  };
20761
20893
  },
20762
- entityIcon: ({ entity: skeletonOrBone }) => (skeletonOrBone instanceof Skeleton ? jsx(PersonWalkingRegular, {}) : jsx(DataLineRegular, {})),
20894
+ entityIcon: ({ entity: skeletonOrBone }) => skeletonOrBone instanceof Skeleton ? (jsx(PersonWalkingRegular, { color: tokens.colorPaletteAnchorForeground2 })) : (jsx(DataLineRegular, { color: tokens.colorPaletteBeigeForeground2 })),
20763
20895
  getEntityAddedObservables: () => [scene.onNewSkeletonAddedObservable],
20764
20896
  getEntityRemovedObservables: () => [scene.onSkeletonRemovedObservable],
20765
20897
  getEntityMovedObservables: () => [boneMovedObservable],
@@ -20820,7 +20952,7 @@ const SoundExplorerServiceDefinition = {
20820
20952
  },
20821
20953
  };
20822
20954
  },
20823
- entityIcon: () => jsx(SoundWaveCircleRegular, {}),
20955
+ entityIcon: () => jsx(SoundWaveCircleRegular, { color: tokens.colorPaletteForestForeground2 }),
20824
20956
  getEntityAddedObservables: () => [soundAddedObservable],
20825
20957
  getEntityRemovedObservables: () => [soundRemovedObservable],
20826
20958
  });
@@ -20864,7 +20996,7 @@ const SpriteManagerExplorerServiceDefinition = {
20864
20996
  },
20865
20997
  };
20866
20998
  },
20867
- entityIcon: ({ entity: spriteEntity }) => (spriteEntity instanceof Sprite ? jsx(PersonSquareRegular, {}) : jsx(LayerDiagonalPersonRegular, {})),
20999
+ entityIcon: ({ entity: spriteEntity }) => spriteEntity instanceof Sprite ? (jsx(PersonSquareRegular, { color: tokens.colorPalettePeachForeground2 })) : (jsx(LayerDiagonalPersonRegular, { color: tokens.colorPalettePeachForeground2 })),
20868
21000
  getEntityAddedObservables: () => [scene.onNewSpriteManagerAddedObservable],
20869
21001
  getEntityRemovedObservables: () => [scene.onSpriteManagerRemovedObservable],
20870
21002
  });
@@ -20936,7 +21068,7 @@ const TextureExplorerServiceDefinition = {
20936
21068
  },
20937
21069
  };
20938
21070
  },
20939
- entityIcon: ({ entity: texture }) => (texture instanceof DynamicTexture ? jsx(ImageEditRegular, {}) : jsx(ImageRegular, {})),
21071
+ entityIcon: ({ entity: texture }) => texture instanceof DynamicTexture ? jsx(ImageEditRegular, { color: tokens.colorPaletteGrapeForeground2 }) : jsx(ImageRegular, { color: tokens.colorPaletteGrapeForeground2 }),
20940
21072
  getEntityAddedObservables: () => [scene.onNewTextureAddedObservable],
20941
21073
  getEntityRemovedObservables: () => [scene.onTextureRemovedObservable],
20942
21074
  });
@@ -20964,7 +21096,7 @@ const EquirectangularCaptureTool = ({ scene }) => {
20964
21096
  };
20965
21097
 
20966
21098
  const GIFCaptureTool = MakeLazyComponent(async () => {
20967
- const gif = (await import('./gif-D_8cJm3S.js').then(function (n) { return n.g; })).default;
21099
+ const gif = (await import('./gif-CdXfT-By.js').then(function (n) { return n.g; })).default;
20968
21100
  // TODO: Figure out how to grab this from NPM package instead of CDN
20969
21101
  const workerContent = await Tools.LoadFileAsync("https://cdn.jsdelivr.net/gh//terikon/gif.js.optimized@0.1.6/dist/gif.worker.js");
20970
21102
  const workerBlob = new Blob([workerContent], { type: "application/javascript" });
@@ -21656,6 +21788,12 @@ const InspectorTokens = new WeakMap();
21656
21788
  // This async lock is used to sequentialize all calls to ShowInspector and dispose of existing inspectors.
21657
21789
  // This is needed because each time Inspector is shown or hidden, it is potentially mutating the same DOM element.
21658
21790
  const InspectorLock = new AsyncLock();
21791
+ /**
21792
+ * Shows the inspector for the specified scene.
21793
+ * @param scene The scene to inspect.
21794
+ * @param options Optional configuration for the inspector.
21795
+ * @returns An {@link InspectorToken} that can be disposed to hide the inspector.
21796
+ */
21659
21797
  function ShowInspector(scene, options = {}) {
21660
21798
  // Dispose of any existing inspector for this scene.
21661
21799
  InspectorTokens.get(scene)?.dispose();
@@ -22686,5 +22824,5 @@ const TextAreaPropertyLine = (props) => {
22686
22824
  // Attach Inspector v2 to Scene.debugLayer as a side effect for back compat.
22687
22825
  AttachDebugLayer();
22688
22826
 
22689
- export { useEventfulState as $, Accordion as A, Button as B, CheckboxPropertyLine as C, DebugServiceIdentity as D, ErrorBoundary as E, ExtensibleAccordion as F, GizmoServiceIdentity as G, Theme as H, Inspector as I, TeachingMoment as J, PropertyContext as K, LinkToEntity as L, MessageBar as M, NumberInputPropertyLine as N, usePropertyChangedNotifier as O, Popover as P, BuiltInsExtensionFeed as Q, useVector3Property as R, SpinButtonPropertyLine as S, TextInputPropertyLine as T, useColor3Property as U, Vector3PropertyLine as V, WatcherServiceIdentity as W, useColor4Property as X, useQuaternionProperty as Y, MakePropertyHook as Z, useInterceptObservable as _, useProperty as a, Color3GradientList as a$, useObservableCollection as a0, useOrderedObservableCollection as a1, usePollingObservable as a2, useResource as a3, useAsyncResource as a4, useSetting as a5, useAngleConverters as a6, MakeTeachingMoment as a7, MakeDialogTeachingMoment as a8, MakePopoverTeachingMoment as a9, FactorGradientComponent as aA, Color3GradientComponent as aB, Color4GradientComponent as aC, ColorStepGradientComponent as aD, InfoLabel as aE, MakeLazyComponent as aF, List as aG, MaterialSelector as aH, NodeSelector as aI, PositionedPopover as aJ, SearchBar as aK, SearchBox as aL, SkeletonSelector as aM, Slider as aN, SpinButton as aO, Switch as aP, SyncedSliderInput as aQ, Textarea as aR, TextInput as aS, TextureSelector as aT, ToastProvider as aU, ToggleButton as aV, Tooltip as aW, UploadButton as aX, ChildWindow as aY, FileUploadLine as aZ, FactorGradientList as a_, useThemeMode as aa, useTheme as ab, InterceptFunction as ac, GetPropertyDescriptor as ad, IsPropertyReadonly as ae, InterceptProperty as af, ObservableCollection as ag, ConstructorFactory as ah, SelectionServiceDefinition as ai, SettingsStore as aj, ShowInspector as ak, useKeyListener as al, useKeyState as am, useEventListener as an, AccordionSectionItem as ao, Checkbox as ap, Collapse as aq, ColorPickerPopup as ar, InputHexField as as, InputHsvField as at, ComboBox as au, DraggableLine as av, Dropdown as aw, NumberDropdown as ax, StringDropdown as ay, EntitySelector as az, ShellServiceIdentity as b, Color4GradientList as b0, Pane as b1, TextureUpload as b2, BooleanBadgePropertyLine as b3, Color3PropertyLine as b4, Color4PropertyLine as b5, ComboBoxPropertyLine as b6, HexPropertyLine as b7, LinkPropertyLine as b8, PropertyLine as b9, LineContainer as ba, PlaceholderPropertyLine as bb, StringifiedPropertyLine as bc, SwitchPropertyLine as bd, SyncedSliderPropertyLine as be, TextAreaPropertyLine as bf, TextPropertyLine as bg, RotationVectorPropertyLine as bh, QuaternionPropertyLine as bi, Vector2PropertyLine as bj, Vector4PropertyLine as bk, SceneContextIdentity as c, SelectionServiceIdentity as d, useObservableState as e, AccordionSection as f, ButtonLine as g, ToolsServiceIdentity as h, useExtensionManager as i, Link as j, SidePaneContainer as k, PropertiesServiceIdentity as l, SceneExplorerServiceIdentity as m, SettingsServiceIdentity as n, StatsServiceIdentity as o, ThemeServiceIdentity as p, SettingsStoreIdentity as q, ConvertOptions as r, AttachDebugLayer as s, DetachDebugLayer as t, useToast as u, NumberDropdownPropertyLine as v, StringDropdownPropertyLine as w, BoundProperty as x, Property as y, LinkToEntityPropertyLine as z };
22690
- //# sourceMappingURL=index-Ddfh2kw4.js.map
22827
+ export { HexPropertyLine as $, Accordion as A, Button as B, CheckboxPropertyLine as C, ColorStepGradientComponent as D, ComboBox as E, ComboBoxPropertyLine as F, ConstructorFactory as G, ConvertOptions as H, DebugServiceIdentity as I, DetachDebugLayer as J, DraggableLine as K, LinkToEntity as L, MessageBar as M, NumberInputPropertyLine as N, Dropdown as O, Popover as P, EntitySelector as Q, ErrorBoundary as R, SpinButtonPropertyLine as S, TextInputPropertyLine as T, ExtensibleAccordion as U, Vector3PropertyLine as V, FactorGradientComponent as W, FactorGradientList as X, FileUploadLine as Y, GetPropertyDescriptor as Z, GizmoServiceIdentity as _, useProperty as a, Vector2PropertyLine as a$, InfoLabel as a0, InputHexField as a1, InputHsvField as a2, Inspector as a3, InterceptFunction as a4, InterceptProperty as a5, IsPropertyReadonly as a6, LineContainer as a7, LinkPropertyLine as a8, LinkToEntityPropertyLine as a9, SettingsStoreIdentity as aA, ShowInspector as aB, SidePaneContainer as aC, SkeletonSelector as aD, Slider as aE, SpinButton as aF, StatsServiceIdentity as aG, StringDropdown as aH, StringDropdownPropertyLine as aI, StringifiedPropertyLine as aJ, Switch as aK, SwitchPropertyLine as aL, SyncedSliderInput as aM, SyncedSliderPropertyLine as aN, TeachingMoment as aO, TextAreaPropertyLine as aP, TextInput as aQ, TextPropertyLine as aR, Textarea as aS, TextureSelector as aT, TextureUpload as aU, Theme as aV, ThemeServiceIdentity as aW, ToastProvider as aX, ToggleButton as aY, Tooltip as aZ, UploadButton as a_, List as aa, MakeDialogTeachingMoment as ab, MakeLazyComponent as ac, MakePopoverTeachingMoment as ad, MakePropertyHook as ae, MakeTeachingMoment as af, MaterialSelector as ag, NodeSelector as ah, NumberDropdown as ai, NumberDropdownPropertyLine as aj, ObservableCollection as ak, Pane as al, PlaceholderPropertyLine as am, PositionedPopover as an, PropertiesServiceIdentity as ao, Property as ap, PropertyContext as aq, PropertyLine as ar, QuaternionPropertyLine as as, RotationVectorPropertyLine as at, SceneExplorerServiceIdentity as au, SearchBar as av, SearchBox as aw, SelectionServiceDefinition as ax, SettingsServiceIdentity as ay, SettingsStore as az, ShellServiceIdentity as b, Vector4PropertyLine as b0, WatcherServiceIdentity as b1, useAngleConverters as b2, useAsyncResource as b3, useColor3Property as b4, useColor4Property as b5, useEventListener as b6, useEventfulState as b7, useInterceptObservable as b8, useKeyListener as b9, useKeyState as ba, useObservableCollection as bb, useOrderedObservableCollection as bc, usePollingObservable as bd, usePropertyChangedNotifier as be, useQuaternionProperty as bf, useResource as bg, useSetting as bh, useTheme as bi, useThemeMode as bj, useVector3Property as bk, SceneContextIdentity as c, SelectionServiceIdentity as d, useObservableState as e, AccordionSection as f, ButtonLine as g, ToolsServiceIdentity as h, useExtensionManager as i, Link as j, AccordionSectionItem as k, AttachDebugLayer as l, BooleanBadgePropertyLine as m, BoundProperty as n, BuiltInsExtensionFeed as o, Checkbox as p, ChildWindow as q, Collapse as r, Color3GradientComponent as s, Color3GradientList as t, useToast as u, Color3PropertyLine as v, Color4GradientComponent as w, Color4GradientList as x, Color4PropertyLine as y, ColorPickerPopup as z };
22828
+ //# sourceMappingURL=index-DBHYgAua.js.map