@mavonengine/editor 0.0.7 → 0.0.9

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 (35) hide show
  1. package/dist/Editor/UI/ActivityBar.d.ts +1 -1
  2. package/dist/Editor/UI/Assets/AssetStats.d.ts +3 -3
  3. package/dist/Editor/UI/Assets/Assets.d.ts +1 -1
  4. package/dist/Editor/UI/Assets/AudioPlayer.d.ts +1 -1
  5. package/dist/Editor/UI/Assets/ModelViewer.d.ts +3 -3
  6. package/dist/Editor/UI/Assets/ParticleViewer.d.ts +3 -3
  7. package/dist/Editor/UI/Assets/TextureViewer.d.ts +5 -4
  8. package/dist/Editor/UI/CanvasPanel.d.ts +1 -1
  9. package/dist/Editor/UI/CanvasToolbar.d.ts +1 -1
  10. package/dist/Editor/UI/Controllers/ControllerDebug.d.ts +1 -0
  11. package/dist/Editor/UI/Controllers/GamepadDiagram.d.ts +5 -0
  12. package/dist/Editor/UI/Controllers/useGamepads.d.ts +6 -0
  13. package/dist/Editor/UI/DockArea.d.ts +17 -0
  14. package/dist/Editor/UI/Editor.d.ts +1 -1
  15. package/dist/Editor/UI/PanelHeader.d.ts +1 -1
  16. package/dist/Editor/UI/PropertiesPanel.d.ts +1 -1
  17. package/dist/Editor/UI/SceneExplorer.d.ts +1 -1
  18. package/dist/Editor/UI/ScenePanel.d.ts +1 -0
  19. package/dist/Editor/UI/ShadeModeButtons.d.ts +1 -1
  20. package/dist/Editor/UI/StatusBar.d.ts +1 -1
  21. package/dist/Editor/UI/TabBar.d.ts +1 -1
  22. package/dist/Editor/UI/Window.d.ts +1 -1
  23. package/dist/Editor/builtinPrefabs.d.ts +4 -0
  24. package/dist/Editor/demoScene.d.ts +7 -0
  25. package/dist/Editor/panels.d.ts +22 -0
  26. package/dist/Editor/recordPrefabUsage.d.ts +7 -0
  27. package/dist/Editor.css +2 -1
  28. package/dist/Editor.d.ts +29 -5
  29. package/dist/Editor.mjs +1654 -9
  30. package/dist/global-l94NfB94.mjs +22 -0
  31. package/dist/mount-CnirMLg0.mjs +35603 -0
  32. package/dist/panels-BqmX3eap.mjs +45 -0
  33. package/package.json +20 -20
  34. package/dist/Editor-BZKTiLdQ.mjs +0 -1329
  35. package/dist/mount-DicE86w2.mjs +0 -40697
@@ -1 +1 @@
1
- export default function ActivityBar(): import("react/jsx-runtime").JSX.Element;
1
+ export default function ActivityBar(): import("react").JSX.Element;
@@ -2,7 +2,7 @@ interface Stat {
2
2
  label: string;
3
3
  value: string;
4
4
  }
5
- declare const _default: ({ stats }: {
6
- stats: Stat[];
7
- }) => import("react/jsx-runtime").JSX.Element;
8
5
  export default _default;
6
+ declare function _default({ stats }: {
7
+ stats: Stat[];
8
+ }): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
- declare const _default: () => import("react/jsx-runtime").JSX.Element;
2
1
  export default _default;
2
+ declare function _default(): import("react").JSX.Element;
@@ -1,5 +1,5 @@
1
1
  interface Props {
2
2
  buffer: AudioBuffer;
3
3
  }
4
- declare const _default: ({ buffer }: Props) => import("react/jsx-runtime").JSX.Element;
5
4
  export default _default;
5
+ declare function _default({ buffer }: Props): import("react").JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import type { AnimationClip, Object3D } from 'three';
2
- declare const _default: ({ model, animations }: {
2
+ export default _default;
3
+ declare function _default({ model, animations }: {
3
4
  model: Object3D;
4
5
  animations?: AnimationClip[];
5
- }) => import("react/jsx-runtime").JSX.Element;
6
- export default _default;
6
+ }): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- declare const _default: ({ particleName }: {
2
- particleName: string;
3
- }) => import("react/jsx-runtime").JSX.Element;
4
1
  export default _default;
2
+ declare function _default({ particleName }: {
3
+ particleName: string;
4
+ }): import("react").JSX.Element;
@@ -1,6 +1,7 @@
1
1
  import type { CubeTexture, Texture } from 'three';
2
- export declare function getTextureUrl(texture: Texture | CubeTexture): string;
3
- declare const _default: ({ texture }: {
4
- texture: Texture | CubeTexture;
5
- }) => import("react/jsx-runtime").JSX.Element;
2
+ export type RawImage = HTMLImageElement | HTMLCanvasElement | ImageBitmap;
3
+ export declare function getTextureUrl(texture: Texture<RawImage> | CubeTexture<HTMLImageElement>): string;
6
4
  export default _default;
5
+ declare function _default({ texture }: {
6
+ texture: Texture<RawImage> | CubeTexture<HTMLImageElement>;
7
+ }): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
- declare const _default: () => import("react/jsx-runtime").JSX.Element;
2
1
  export default _default;
2
+ declare function _default(): import("react").JSX.Element;
@@ -4,4 +4,4 @@ export declare const SHADE_MODES: {
4
4
  label: string;
5
5
  paths: string[];
6
6
  }[];
7
- export default function CanvasToolbar(): import("react/jsx-runtime").JSX.Element;
7
+ export default function CanvasToolbar(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export default function ControllerDebug(): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { GamepadState } from '@mavonengine/core/GamepadManager';
2
+ export default function GamepadDiagram({ gamepad, deadzone }: {
3
+ gamepad: GamepadState;
4
+ deadzone: number;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import type { GamepadState } from '@mavonengine/core/GamepadManager';
2
+ /**
3
+ * Connected controllers from the running game.
4
+ * Re-renders on connect / disconnect, and every animation frame when `live` is set.
5
+ */
6
+ export declare function useGamepads(live?: boolean): GamepadState[];
@@ -0,0 +1,17 @@
1
+ import type { EditorPanelLocation } from '@mavonengine/core/Types/IEditor';
2
+ import type { ReactNode } from 'react';
3
+ export interface BuiltinPanel {
4
+ id: string;
5
+ title: string;
6
+ element: ReactNode;
7
+ /** Wrap in the padded, scrolling panel body. Default true */
8
+ padded?: boolean;
9
+ }
10
+ /**
11
+ * One dock of the editor (left, bottom or right): its built-in panels and the custom ones registered for it, as tabs.
12
+ * Built-in panels stay mounted while hidden so they keep their state; custom panels mount when their tab is shown.
13
+ */
14
+ export default function DockArea({ location, builtins }: {
15
+ location: EditorPanelLocation;
16
+ builtins: BuiltinPanel[];
17
+ }): import("react").JSX.Element;
@@ -1,3 +1,3 @@
1
1
  import './global.css';
2
- declare function Editor(): import("react/jsx-runtime").JSX.Element;
2
+ declare function Editor(): import("react").JSX.Element;
3
3
  export default Editor;
@@ -1,3 +1,3 @@
1
1
  export default function PanelHeader({ title }: {
2
2
  title: string;
3
- }): import("react/jsx-runtime").JSX.Element;
3
+ }): import("react").JSX.Element;
@@ -1 +1 @@
1
- export default function PropertiesPanel(): import("react/jsx-runtime").JSX.Element;
1
+ export default function PropertiesPanel(): import("react").JSX.Element;
@@ -1 +1 @@
1
- export default function SceneExplorer(): import("react/jsx-runtime").JSX.Element;
1
+ export default function SceneExplorer(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export default function ScenePanel(): import("react").JSX.Element;
@@ -6,5 +6,5 @@ interface Props {
6
6
  activeClass: string;
7
7
  size?: number;
8
8
  }
9
- export default function ShadeModeButtons({ shadeMode, onChange, btnClass, activeClass, size }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export default function ShadeModeButtons({ shadeMode, onChange, btnClass, activeClass, size }: Props): import("react").JSX.Element;
10
10
  export {};
@@ -1 +1 @@
1
- export default function StatusBar(): import("react/jsx-runtime").JSX.Element;
1
+ export default function StatusBar(): import("react").JSX.Element;
@@ -1 +1 @@
1
- export default function TabBar(): import("react/jsx-runtime").JSX.Element;
1
+ export default function TabBar(): import("react").JSX.Element;
@@ -11,5 +11,5 @@ interface Props {
11
11
  storageKey?: string;
12
12
  onClose(): void;
13
13
  }
14
- declare const _default: ({ title, children, defaultX, defaultY, defaultWidth, defaultHeight, minWidth, minHeight, storageKey, onClose }: Props) => import("react").ReactPortal;
15
14
  export default _default;
15
+ declare function _default({ title, children, defaultX, defaultY, defaultWidth, defaultHeight, minWidth, minHeight, storageKey, onClose }: Props): import("react").ReactPortal;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Register the prefabs that come with the engine. Plugins add theirs with `ctx.registerPrefab()`.
3
+ */
4
+ export declare function registerBuiltinPrefabs(): void;
@@ -0,0 +1,7 @@
1
+ import type { SceneData } from '@mavonengine/core/Scene/types';
2
+ /** The scene the editor opens and saves when the game loaded none */
3
+ export declare const DEFAULT_SCENE_NAME = "main";
4
+ /**
5
+ * Some shapes on a ground plane, to have something to look at in a new project
6
+ */
7
+ export declare function demoScene(): SceneData;
@@ -0,0 +1,22 @@
1
+ import type { EditorPanel, EditorPanelLocation } from '@mavonengine/core/Types/IEditor';
2
+ import type IEditor from '@mavonengine/core/Types/IEditor';
3
+ import type { ComponentType } from 'react';
4
+ export type { EditorPanelLocation };
5
+ /**
6
+ * A panel for the editor. Same as core's `EditorPanel`, with `component` typed as a React component.
7
+ */
8
+ export interface EditorPanelDefinition extends Omit<EditorPanel, 'component'> {
9
+ component?: ComponentType<{
10
+ editor: IEditor;
11
+ }>;
12
+ }
13
+ /**
14
+ * Dock a panel in the editor. Works before the editor boots too, e.g. next to `Editor.registerListener()`.
15
+ * Returns a function that removes it again.
16
+ */
17
+ export declare function registerEditorPanel(panel: EditorPanelDefinition | EditorPanel): () => void;
18
+ export declare function unregisterEditorPanel(id: string): void;
19
+ /** Every registered panel, for `useSyncExternalStore` */
20
+ export declare function getEditorPanels(): EditorPanelDefinition[];
21
+ export declare function subscribeEditorPanels(listener: () => void): () => void;
22
+ export declare function panelsAt(all: EditorPanelDefinition[], location: EditorPanelLocation): EditorPanelDefinition[];
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tell the dev server that the project uses a plugin prefab, so its assets ship in the release.
3
+ * The server adds it to the plugin's `prefabs` in mavonengine.json. Sent once per prefab per session.
4
+ */
5
+ export declare function recordPrefabUsage(plugin: string, prefab: string, fetchFn?: typeof fetch): Promise<void>;
6
+ /** For tests */
7
+ export declare function resetRecordedPrefabs(): void;
package/dist/Editor.css CHANGED
@@ -1 +1,2 @@
1
- :root{--bg-primary: #1A1A1A;--bg-secondary: #222222;--bg-panel: #2A2A2A;--bg-input: #1E1E1E;--bg-viewport: #111111;--bg-header: #1A1A1A;--bg-toolbar: #252525;--bg-hover: #333333;--bg-selected: #2C3E50;--bg-active: #3A3A3A;--bg-statusbar: #007ACC;--text-primary: #E0E0E0;--text-secondary: #888888;--text-muted: #666666;--text-label: #AAAAAA;--text-bright: #FFFFFF;--border-primary: #333333;--border-subtle: #2A2A2A;--border-active: #555555;--accent-blue: #007ACC;--accent-green: #4EC9B0;--accent-orange: #CE9178;--accent-yellow: #DCDCAA;--accent-red: #F44747;--accent-purple: #C586C0;--icon-default: #AAAAAA;--icon-active: #FFFFFF;--icon-accent: #007ACC;--font-ui: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-mono: "Space Mono", "SF Mono", "Fira Code", monospace;--font-size-xs: 10px;--font-size-sm: 11px;--font-size-md: 12px;--font-size-lg: 13px;--font-size-xl: 14px;--font-size-title: 16px;--spacing-xs: 2px;--spacing-sm: 4px;--spacing-md: 8px;--spacing-lg: 12px;--spacing-xl: 16px;--spacing-2xl: 24px;--radius-none: 0px;--radius-sm: 2px;--radius-md: 4px;--radius-lg: 6px}html,body,#root,#ui{height:100%;margin:0;overflow:hidden}*{box-sizing:border-box}[data-panel-resize-handle-id]{background-color:var(--border-primary);transition:background-color .15s ease}[data-panel-resize-handle-id]:hover,[data-panel-resize-handle-id][data-resize-handle-active]{background-color:var(--accent-blue)}._activityBar_4dnwm_1{width:40px;min-width:40px;height:100%;background-color:var(--bg-header);display:flex;flex-direction:column;align-items:center;padding:var(--spacing-md) 0;gap:var(--spacing-xs);border-right:1px solid var(--border-primary)}._icon_4dnwm_14{width:28px;height:28px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:var(--radius-sm);transition:background-color .1s ease}._icon_4dnwm_14:hover{background-color:var(--bg-hover)}._icon_4dnwm_14._active_4dnwm_29{background-color:var(--accent-blue)}._icon_4dnwm_14 svg{width:16px;height:16px}._window_ybolb_1{background-color:var(--bg-secondary)!important;border:1px solid var(--border-primary)!important;border-radius:var(--radius-md)!important;color:var(--text-primary);font-family:var(--font-ui);font-size:var(--font-size-lg);display:flex!important;flex-direction:column!important;overflow:hidden!important;z-index:1000;box-shadow:0 8px 32px #0009!important}._handle_ybolb_15{height:28px;min-height:28px;background-color:var(--bg-header);border-bottom:1px solid var(--border-primary);border-radius:var(--radius-md) var(--radius-md) 0 0;cursor:grab;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:flex-end;padding:0 var(--spacing-md)}._handle_ybolb_15:active{cursor:grabbing}._title_ybolb_33{flex:1;font-size:var(--font-size-md);color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 var(--spacing-md);-webkit-user-select:none;user-select:none}._body_ybolb_44{flex:1;overflow:auto;padding:var(--spacing-lg);min-height:0}._close_ybolb_51{background:none;border:none;color:var(--text-muted);font-size:var(--font-size-xl);cursor:pointer;padding:2px 6px;border-radius:var(--radius-sm);line-height:1;flex-shrink:0}._close_ybolb_51:hover{color:var(--text-primary);background-color:var(--bg-hover)}._assetsPanel_5ux7f_1{display:flex;flex-direction:column;flex:1;overflow:hidden}._toolbar_5ux7f_8{display:flex;align-items:center;gap:var(--spacing-md);padding:0 var(--spacing-md);height:24px;flex-shrink:0}._searchWrapper_5ux7f_17{flex:1;position:relative;display:flex;align-items:center}._search_5ux7f_17{width:100%;height:20px;padding:0 20px 0 var(--spacing-md);background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);color:var(--text-primary);font-family:var(--font-ui);font-size:var(--font-size-xs);outline:none;box-sizing:border-box}._search_5ux7f_17::placeholder{color:var(--text-muted)}._search_5ux7f_17:focus{border-color:var(--accent-blue)}._searchClear_5ux7f_46{position:absolute;right:4px;background:none;border:none;color:var(--text-muted);font-size:10px;cursor:pointer;padding:0;line-height:1;display:flex;align-items:center}._searchClear_5ux7f_46:hover{color:var(--text-primary)}._categorySelect_5ux7f_64{height:20px;padding:0 var(--spacing-sm);background-color:var(--bg-active);border:none;border-radius:9px;color:var(--text-primary);font-family:var(--font-ui);font-size:var(--font-size-xs);outline:none;cursor:pointer;flex-shrink:0}._categorySelect_5ux7f_64:focus{border-color:var(--accent-blue)}._assets_5ux7f_1{flex:1;overflow:auto;padding:var(--spacing-lg);display:flex;flex-wrap:wrap;gap:var(--spacing-lg);align-content:flex-start;align-items:flex-start}._assetRow_5ux7f_93{display:flex;flex-direction:column;align-items:center;gap:var(--spacing-sm);padding:var(--spacing-sm);border-radius:var(--radius-sm);font-family:var(--font-ui);font-size:var(--font-size-xs);color:var(--text-secondary);cursor:grab;max-width:80px;word-break:break-word;text-align:center}._assetRow_5ux7f_93:hover{background-color:var(--bg-hover)}._assetRow_5ux7f_93 img{width:64px;height:64px;object-fit:contain;border-radius:var(--radius-sm);border:1px solid var(--border-primary);background-color:var(--bg-input)}._texturePreview_5ux7f_122{width:64px;height:64px;object-fit:contain;border-radius:var(--radius-sm);border:1px solid var(--border-primary);background-image:linear-gradient(45deg,#2a2a2a 25%,transparent 25%),linear-gradient(-45deg,#2a2a2a 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#2a2a2a 75%),linear-gradient(-45deg,transparent 75%,#2a2a2a 75%);background-size:8px 8px;background-position:0 0,0 4px,4px -4px,-4px 0;background-color:var(--bg-input)}._assetIcon_5ux7f_138{width:64px;height:64px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);border:1px solid var(--border-primary);background-color:var(--bg-input);cursor:grab}._assetIcon_5ux7f_138 svg{width:24px;height:24px;color:var(--text-muted)}._stats_1gd9h_1{display:flex;flex-direction:column;gap:var(--spacing-md);flex-shrink:0;width:90px;border-left:1px solid var(--border-primary);padding:0 var(--spacing-lg);justify-content:center}._stat_1gd9h_1{display:flex;flex-direction:column;gap:1px}._label_1gd9h_18{font-family:var(--font-ui);font-size:var(--font-size-xs);color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}._value_1gd9h_26{font-family:var(--font-mono);font-size:var(--font-size-md);color:var(--text-primary);font-variant-numeric:tabular-nums}._player_nqeb9_1{display:flex;flex-direction:row;gap:0;height:100%}._main_nqeb9_8{display:flex;flex-direction:column;gap:var(--spacing-lg);flex:1;min-width:0}._waveform_nqeb9_16{flex:1;min-height:0}._controls_nqeb9_21{display:flex;align-items:center;gap:var(--spacing-md);flex-shrink:0}._playButton_nqeb9_28{background:none;border:1px solid var(--border-primary);border-radius:var(--radius-sm);color:var(--text-primary);font-size:var(--font-size-xl);cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;flex-shrink:0}._playButton_nqeb9_28:hover{background-color:var(--bg-hover)}._time_nqeb9_47{font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-muted);font-variant-numeric:tabular-nums}._wrapper_65zj4_1{position:relative;display:flex;flex-direction:column;width:100%;height:100%}._canvas_65zj4_9{width:100%;height:100%;background-color:var(--bg-viewport)}._toolbar_65zj4_15{display:flex;align-items:center;height:32px;padding:0 var(--spacing-md);gap:var(--spacing-sm);background-color:var(--bg-toolbar);border-bottom:1px solid var(--border-primary);flex-shrink:0}._toolBtn_65zj4_26{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:var(--radius-sm);background:none;color:var(--icon-default);cursor:pointer;transition:background-color .1s ease,color .1s ease;padding:0}._toolBtn_65zj4_26:hover{background-color:var(--bg-hover);color:var(--icon-active)}._toolBtn_65zj4_26._active_65zj4_46{background-color:var(--accent-blue);color:var(--icon-active)}._separator_65zj4_51{width:1px;height:16px;background-color:var(--border-primary);flex-shrink:0}._toolbarRight_65zj4_58{position:absolute;top:2px;right:var(--spacing-md);display:flex;gap:var(--spacing-sm);z-index:10;pointer-events:all;align-items:flex-start}._overlayDropdown_65zj4_69{position:absolute;top:calc(100% + 6px);right:0;background-color:var(--bg-panel);border:1px solid var(--border-primary);border-radius:var(--radius-md);padding:var(--spacing-lg);min-width:180px;z-index:20;display:flex;flex-direction:column;gap:var(--spacing-sm);font-family:var(--font-ui);font-size:var(--font-size-lg)}._overlaySection_65zj4_86{font-size:var(--font-size-sm);color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em;margin-top:6px;margin-bottom:2px}._overlaySection_65zj4_86:first-child{margin-top:0}._overlayRow_65zj4_99{display:flex;align-items:center;gap:var(--spacing-md);font-size:var(--font-size-lg);color:var(--text-primary);cursor:pointer;padding:2px 0;-webkit-user-select:none;user-select:none}._overlayRow_65zj4_99:hover{color:var(--text-bright)}._overlayRow_65zj4_99 input[type=checkbox]{accent-color:var(--accent-blue);width:14px;height:14px;cursor:pointer;flex-shrink:0}._viewer_8mn40_1{display:flex;flex-direction:row;height:100%;max-height:100%;overflow:hidden}._canvasWrapper_8mn40_9{position:relative;flex:1;min-width:0;min-height:0}._toolbar_8mn40_16{position:absolute;top:var(--spacing-md);left:var(--spacing-md);display:flex;gap:var(--spacing-sm);background-color:var(--bg-panel);border:1px solid var(--border-primary);border-radius:var(--radius-md);padding:var(--spacing-sm);z-index:10}._animBar_8mn40_29{position:absolute;bottom:30px;left:var(--spacing-md);z-index:10;display:flex;align-items:center;gap:var(--spacing-md);background-color:var(--bg-panel);border:1px solid var(--border-primary);border-radius:var(--radius-md);padding:var(--spacing-sm) var(--spacing-md)}._scrubber_8mn40_43{position:absolute;bottom:0;left:0;width:100%;height:20px;z-index:10;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;cursor:pointer;margin:0;padding:0}._scrubber_8mn40_43::-webkit-slider-runnable-track{background:var(--bg-panel);border-top:1px solid var(--border-primary);height:4px}._scrubber_8mn40_43::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;border-radius:50%;background:var(--accent-blue);cursor:pointer;margin-top:-4px}._scrubber_8mn40_43::-moz-range-track{background:var(--bg-panel);border-top:1px solid var(--border-primary);height:4px}._scrubber_8mn40_43::-moz-range-thumb{width:12px;height:12px;border-radius:50%;background:var(--accent-blue);cursor:pointer;border:none}._animSelect_8mn40_89{background:none;border:none;color:var(--text-primary);font-family:var(--font-ui);font-size:var(--font-size-md);cursor:pointer;outline:none;max-width:200px}._animSelect_8mn40_89:hover{border-color:var(--border-active)}._animLoopLabel_8mn40_104{display:flex;align-items:center;gap:5px;color:var(--text-primary);font-family:var(--font-ui);font-size:var(--font-size-md);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}._viewer_76hio_1{display:flex;flex-direction:row;height:100%;max-height:100%;overflow:hidden}._imageWrapper_76hio_9{flex:1;min-width:0;min-height:0;position:relative;overflow:hidden;background-image:linear-gradient(45deg,#2a2a2a 25%,transparent 25%),linear-gradient(-45deg,#2a2a2a 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#2a2a2a 75%),linear-gradient(-45deg,transparent 75%,#2a2a2a 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0;background-color:var(--bg-input)}._zoomInner_76hio_25{position:absolute;top:0;right:0;bottom:0;left:0;transform-origin:0 0;display:flex;align-items:center;justify-content:center}._image_76hio_9{max-width:100%;max-height:100%;object-fit:contain;-webkit-user-select:none;user-select:none;pointer-events:none}._zoomReset_76hio_42{position:absolute;bottom:var(--spacing-md);right:var(--spacing-md);background:var(--bg-panel);border:1px solid var(--border-primary);border-radius:var(--radius-sm);color:var(--text-primary);font-size:var(--font-size-sm);font-family:var(--font-mono);padding:2px 6px;cursor:pointer;z-index:10;-webkit-user-select:none;user-select:none}._zoomReset_76hio_42:hover{background:var(--bg-hover)}._cubeCross_76hio_62{display:grid;grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(3,1fr);gap:2px;width:100%;height:100%;padding:var(--spacing-md);box-sizing:border-box;-webkit-user-select:none;user-select:none;pointer-events:none}._cubeFace_76hio_75{position:relative;background-image:linear-gradient(45deg,#2a2a2a 25%,transparent 25%),linear-gradient(-45deg,#2a2a2a 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#2a2a2a 75%),linear-gradient(-45deg,transparent 75%,#2a2a2a 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0;background-color:var(--bg-input);overflow:hidden}._cubeFace_76hio_75 img{width:100%;height:100%;object-fit:contain;display:block}._faceLabel_76hio_95{position:absolute;bottom:3px;left:4px;font-size:9px;font-family:var(--font-mono);color:#ffffffa6;pointer-events:none;text-shadow:0 1px 2px rgba(0,0,0,.8)}._cubeEmpty_76hio_106{background:transparent}._noPreview_76hio_110{color:var(--text-muted);font-size:var(--font-size-md);font-family:var(--font-ui);-webkit-user-select:none;user-select:none}._root_ngf3k_1{display:flex;flex-direction:column;height:100%;background-color:var(--bg-primary)}._main_ngf3k_8{display:flex;flex:1;overflow:hidden}._editor_ngf3k_14{flex:1;height:100%;background-color:var(--bg-primary)}._panel_ngf3k_20{font-family:var(--font-ui);font-size:var(--font-size-lg);color:var(--text-primary);background-color:var(--bg-secondary)}._panelContent_ngf3k_27{display:flex;flex-direction:column;height:100%;overflow:hidden}._panelBody_ngf3k_34{flex:1;overflow:auto;padding:var(--spacing-md)}._middleGroup_ngf3k_40{flex:1}._panelHeader_25fch_1{height:28px;min-height:28px;display:flex;align-items:center;padding:0 var(--spacing-md);background-color:var(--bg-header);font-family:var(--font-ui);font-size:var(--font-size-xs);font-weight:600;letter-spacing:2px;text-transform:uppercase;color:var(--text-secondary);-webkit-user-select:none;user-select:none}._container_1jjbp_1{display:flex;flex-direction:column;gap:4px}._nameRow_1jjbp_8{display:flex;align-items:center;height:32px;padding:0 12px;gap:8px;background-color:var(--bg-panel);border-bottom:1px solid var(--border-primary)}._nameIcon_1jjbp_18{width:16px;height:16px;flex-shrink:0}._nameText_1jjbp_24{font-family:var(--font-ui);font-size:var(--font-size-xl);font-weight:600;color:var(--text-bright)}._sectionHeader_1jjbp_32{display:flex;align-items:center;height:24px;padding:0 8px;gap:4px;cursor:pointer;-webkit-user-select:none;user-select:none}._sectionHeader_1jjbp_32:hover{background-color:var(--bg-hover)}._sectionArrow_1jjbp_46{width:10px;height:10px;flex-shrink:0;color:var(--text-secondary);transition:transform .1s ease}._sectionArrow_1jjbp_46._collapsed_1jjbp_54{transform:rotate(-90deg)}._sectionTitle_1jjbp_58{font-family:var(--font-ui);font-size:var(--font-size-sm);font-weight:600;color:var(--text-primary)}._divider_1jjbp_66{height:1px;background-color:var(--border-primary);margin:0}._propertyRow3_1jjbp_73{display:flex;align-items:center;height:24px;padding:0 8px;gap:8px}._propertyLabel_1jjbp_81{font-family:var(--font-ui);font-size:var(--font-size-sm);color:var(--text-secondary);width:60px;flex-shrink:0}._valueInput_1jjbp_89{width:52px;height:20px;padding:0 6px;background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-primary);outline:none;box-sizing:border-box}._valueInput_1jjbp_89:focus{border-color:var(--accent-blue)}._checkboxRow_1jjbp_108{display:flex;align-items:center;height:24px;padding:0 8px;gap:6px}._checkbox_1jjbp_108{width:14px;height:14px;accent-color:var(--accent-blue);cursor:pointer;flex-shrink:0}._checkboxLabel_1jjbp_124{font-family:var(--font-ui);font-size:var(--font-size-sm);color:var(--text-secondary);cursor:pointer}._propertyRow_1jjbp_73{display:flex;align-items:center;height:24px;padding:0 8px;gap:8px}._propertyLabelWide_1jjbp_140{font-family:var(--font-ui);font-size:var(--font-size-sm);color:var(--text-secondary);width:80px;flex-shrink:0}._valueDisplay_1jjbp_148{display:flex;align-items:center;height:20px;padding:0 6px;background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-primary);min-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._valueInputWide_1jjbp_165{flex:1;height:20px;padding:0 6px;background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-primary);outline:none;box-sizing:border-box}._valueInputWide_1jjbp_165:focus{border-color:var(--accent-blue)}._sliderRow_1jjbp_184{display:flex;align-items:center;height:24px;padding:0 8px;gap:8px}._sliderTrack_1jjbp_192{flex:1;height:4px;background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:2px;position:relative;cursor:pointer}._sliderFill_1jjbp_202{position:absolute;top:0;left:0;height:100%;background-color:var(--accent-blue);border-radius:2px;pointer-events:none}._sliderThumb_1jjbp_212{position:absolute;top:50%;width:10px;height:10px;background-color:var(--text-bright);border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;box-shadow:0 1px 3px #0006}._sliderInput_1jjbp_224{width:48px;height:20px;padding:0 4px;background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-primary);outline:none;box-sizing:border-box;text-align:right}._sliderInput_1jjbp_224:focus{border-color:var(--accent-blue)}._draggableInput_1jjbp_244{width:52px;height:20px;padding:0 6px;background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-primary);outline:none;box-sizing:border-box;cursor:ew-resize}._draggableInput_1jjbp_244:focus{border-color:var(--accent-blue);cursor:text}._empty_1jjbp_265{padding:16px 8px;color:var(--text-muted);font-family:var(--font-ui);font-size:var(--font-size-md);font-style:italic}._colorInput_1jjbp_274{width:32px;height:20px;padding:1px 2px;border:1px solid var(--border-primary);border-radius:var(--radius-sm);background-color:var(--bg-input);cursor:pointer;box-sizing:border-box}._prefabSection_1jjbp_286{display:flex;flex-direction:column;gap:4px}._container_1n3qk_1{font-family:var(--font-ui);font-size:var(--font-size-md);-webkit-user-select:none;user-select:none;padding:var(--spacing-sm) 0}._row_1n3qk_8{display:flex;align-items:center;height:24px;cursor:pointer;gap:var(--spacing-sm);border-radius:var(--radius-sm);padding-right:var(--spacing-md)}._row_1n3qk_8:hover{background-color:var(--bg-hover)}._selected_1n3qk_22,._selected_1n3qk_22:hover{background-color:var(--bg-selected)}._arrow_1n3qk_30{width:12px;font-size:10px;color:var(--text-secondary);cursor:pointer;flex-shrink:0;text-align:center}._typeIcon_1n3qk_39{width:14px;height:14px;flex-shrink:0;display:flex;align-items:center;justify-content:center}._typeIcon_1n3qk_39 svg{width:14px;height:14px}._name_1n3qk_53{color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-md)}._empty_1n3qk_61{padding:var(--spacing-md);color:var(--text-muted);font-style:italic;font-family:var(--font-ui);font-size:var(--font-size-md)}._statusBar_1ffi6_1{height:22px;min-height:22px;background-color:var(--bg-statusbar);display:flex;align-items:center;justify-content:space-between;padding:0 var(--spacing-md);font-size:var(--font-size-xs);color:var(--text-bright)}._section_1ffi6_13{display:flex;gap:var(--spacing-xl);align-items:center}._stat_1ffi6_1{display:flex;gap:var(--spacing-sm);font-family:var(--font-mono)}._statLabel_1ffi6_25{opacity:.7;font-family:var(--font-mono)}._branch_1ffi6_30{font-family:var(--font-ui);font-weight:500}._engineName_1ffi6_35{font-family:var(--font-ui);font-weight:600}
1
+ :root{--bg-primary:#1a1a1a;--bg-secondary:#222;--bg-panel:#2a2a2a;--bg-input:#1e1e1e;--bg-viewport:#111;--bg-header:#1a1a1a;--bg-toolbar:#252525;--bg-hover:#333;--bg-selected:#2c3e50;--bg-active:#3a3a3a;--bg-statusbar:#007acc;--text-primary:#e0e0e0;--text-secondary:#888;--text-muted:#666;--text-label:#aaa;--text-bright:#fff;--border-primary:#333;--border-subtle:#2a2a2a;--border-active:#555;--accent-blue:#007acc;--accent-green:#4ec9b0;--accent-orange:#ce9178;--accent-yellow:#dcdcaa;--accent-red:#f44747;--accent-purple:#c586c0;--icon-default:#aaa;--icon-active:#fff;--icon-accent:#007acc;--font-ui:"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-mono:"Space Mono", "SF Mono", "Fira Code", monospace;--font-size-xs:10px;--font-size-sm:11px;--font-size-md:12px;--font-size-lg:13px;--font-size-xl:14px;--font-size-title:16px;--spacing-xs:2px;--spacing-sm:4px;--spacing-md:8px;--spacing-lg:12px;--spacing-xl:16px;--spacing-2xl:24px;--radius-none:0px;--radius-sm:2px;--radius-md:4px;--radius-lg:6px}html,body,#root,#ui{height:100%;margin:0;overflow:hidden}*{box-sizing:border-box}[data-panel-resize-handle-id]{background-color:var(--border-primary);transition:background-color .15s}[data-panel-resize-handle-id]:hover,[data-panel-resize-handle-id][data-resize-handle-active]{background-color:var(--accent-blue)}._activityBar_4dnwm_1{background-color:var(--bg-header);width:40px;min-width:40px;height:100%;padding:var(--spacing-md) 0;align-items:center;gap:var(--spacing-xs);border-right:1px solid var(--border-primary);flex-direction:column;display:flex}._icon_4dnwm_14{cursor:pointer;border-radius:var(--radius-sm);justify-content:center;align-items:center;width:28px;height:28px;transition:background-color .1s;display:flex}._icon_4dnwm_14:hover{background-color:var(--bg-hover)}._icon_4dnwm_14._active_4dnwm_29{background-color:var(--accent-blue)}._icon_4dnwm_14 svg{width:16px;height:16px}._window_ybolb_1{color:var(--text-primary);font-family:var(--font-ui);font-size:var(--font-size-lg);z-index:1000;background-color:var(--bg-secondary)!important;border:1px solid var(--border-primary)!important;border-radius:var(--radius-md)!important;flex-direction:column!important;display:flex!important;overflow:hidden!important;box-shadow:0 8px 32px #0009!important}._handle_ybolb_15{background-color:var(--bg-header);border-bottom:1px solid var(--border-primary);border-radius:var(--radius-md) var(--radius-md) 0 0;cursor:grab;-webkit-user-select:none;user-select:none;height:28px;min-height:28px;padding:0 var(--spacing-md);justify-content:flex-end;align-items:center;display:flex}._handle_ybolb_15:active{cursor:grabbing}._title_ybolb_33{font-size:var(--font-size-md);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;padding:0 var(--spacing-md);-webkit-user-select:none;user-select:none;flex:1;overflow:hidden}._body_ybolb_44{padding:var(--spacing-lg);flex:1;min-height:0;overflow:auto}._close_ybolb_51{color:var(--text-muted);font-size:var(--font-size-xl);cursor:pointer;border-radius:var(--radius-sm);background:0 0;border:none;flex-shrink:0;padding:2px 6px;line-height:1}._close_ybolb_51:hover{color:var(--text-primary);background-color:var(--bg-hover)}._assetsPanel_5ux7f_1{flex-direction:column;flex:1;display:flex;overflow:hidden}._toolbar_5ux7f_8{align-items:center;gap:var(--spacing-md);padding:0 var(--spacing-md);flex-shrink:0;height:24px;display:flex}._searchWrapper_5ux7f_17{flex:1;align-items:center;display:flex;position:relative}._search_5ux7f_17{width:100%;height:20px;padding:0 20px 0 var(--spacing-md);background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);color:var(--text-primary);font-family:var(--font-ui);font-size:var(--font-size-xs);box-sizing:border-box;outline:none}._search_5ux7f_17::placeholder{color:var(--text-muted)}._search_5ux7f_17:focus{border-color:var(--accent-blue)}._searchClear_5ux7f_46{color:var(--text-muted);cursor:pointer;background:0 0;border:none;align-items:center;padding:0;font-size:10px;line-height:1;display:flex;position:absolute;right:4px}._searchClear_5ux7f_46:hover{color:var(--text-primary)}._categorySelect_5ux7f_64{height:20px;padding:0 var(--spacing-sm);background-color:var(--bg-active);color:var(--text-primary);font-family:var(--font-ui);font-size:var(--font-size-xs);cursor:pointer;border:none;border-radius:9px;outline:none;flex-shrink:0}._categorySelect_5ux7f_64:focus{border-color:var(--accent-blue)}._assets_5ux7f_1{padding:var(--spacing-lg);gap:var(--spacing-lg);flex-wrap:wrap;flex:1;align-content:flex-start;align-items:flex-start;display:flex;overflow:auto}._assetRow_5ux7f_93{align-items:center;gap:var(--spacing-sm);padding:var(--spacing-sm);border-radius:var(--radius-sm);font-family:var(--font-ui);font-size:var(--font-size-xs);color:var(--text-secondary);cursor:grab;word-break:break-word;text-align:center;flex-direction:column;max-width:80px;display:flex}._assetRow_5ux7f_93:hover{background-color:var(--bg-hover)}._assetRow_5ux7f_93 img{object-fit:contain;border-radius:var(--radius-sm);border:1px solid var(--border-primary);background-color:var(--bg-input);width:64px;height:64px}._texturePreview_5ux7f_122{object-fit:contain;border-radius:var(--radius-sm);border:1px solid var(--border-primary);background-image:linear-gradient(45deg,#2a2a2a 25%,#0000 25%),linear-gradient(-45deg,#2a2a2a 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#2a2a2a 75%),linear-gradient(-45deg,#0000 75%,#2a2a2a 75%);background-position:0 0,0 4px,4px -4px,-4px 0;background-size:8px 8px;background-color:var(--bg-input);width:64px;height:64px}._assetIcon_5ux7f_138{border-radius:var(--radius-sm);border:1px solid var(--border-primary);background-color:var(--bg-input);cursor:grab;justify-content:center;align-items:center;width:64px;height:64px;display:flex}._assetIcon_5ux7f_138 svg{width:24px;height:24px;color:var(--text-muted)}._stats_1gd9h_1{gap:var(--spacing-md);border-left:1px solid var(--border-primary);width:90px;padding:0 var(--spacing-lg);flex-direction:column;flex-shrink:0;justify-content:center;display:flex}._stat_1gd9h_1{flex-direction:column;gap:1px;display:flex}._label_1gd9h_18{font-family:var(--font-ui);font-size:var(--font-size-xs);color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}._value_1gd9h_26{font-family:var(--font-mono);font-size:var(--font-size-md);color:var(--text-primary);font-variant-numeric:tabular-nums}._player_nqeb9_1{flex-direction:row;gap:0;height:100%;display:flex}._main_nqeb9_8{gap:var(--spacing-lg);flex-direction:column;flex:1;min-width:0;display:flex}._waveform_nqeb9_16{flex:1;min-height:0}._controls_nqeb9_21{align-items:center;gap:var(--spacing-md);flex-shrink:0;display:flex}._playButton_nqeb9_28{border:1px solid var(--border-primary);border-radius:var(--radius-sm);color:var(--text-primary);font-size:var(--font-size-xl);cursor:pointer;background:0 0;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;display:flex}._playButton_nqeb9_28:hover{background-color:var(--bg-hover)}._time_nqeb9_47{font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-muted);font-variant-numeric:tabular-nums}._wrapper_65zj4_1{flex-direction:column;width:100%;height:100%;display:flex;position:relative}._canvas_65zj4_9{background-color:var(--bg-viewport);width:100%;height:100%}._toolbar_65zj4_15{height:32px;padding:0 var(--spacing-md);align-items:center;gap:var(--spacing-sm);background-color:var(--bg-toolbar);border-bottom:1px solid var(--border-primary);flex-shrink:0;display:flex}._toolBtn_65zj4_26{border-radius:var(--radius-sm);width:28px;height:28px;color:var(--icon-default);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:0;transition:background-color .1s,color .1s;display:flex}._toolBtn_65zj4_26:hover{background-color:var(--bg-hover);color:var(--icon-active)}._toolBtn_65zj4_26._active_65zj4_46{background-color:var(--accent-blue);color:var(--icon-active)}._separator_65zj4_51{background-color:var(--border-primary);flex-shrink:0;width:1px;height:16px}._toolbarRight_65zj4_58{top:2px;right:var(--spacing-md);gap:var(--spacing-sm);z-index:10;pointer-events:all;align-items:flex-start;display:flex;position:absolute}._overlayDropdown_65zj4_69{background-color:var(--bg-panel);border:1px solid var(--border-primary);border-radius:var(--radius-md);padding:var(--spacing-lg);z-index:20;gap:var(--spacing-sm);min-width:180px;font-family:var(--font-ui);font-size:var(--font-size-lg);flex-direction:column;display:flex;position:absolute;top:calc(100% + 6px);right:0}._overlaySection_65zj4_86{font-size:var(--font-size-sm);color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em;margin-top:6px;margin-bottom:2px}._overlaySection_65zj4_86:first-child{margin-top:0}._overlayRow_65zj4_99{align-items:center;gap:var(--spacing-md);font-size:var(--font-size-lg);color:var(--text-primary);cursor:pointer;-webkit-user-select:none;user-select:none;padding:2px 0;display:flex}._overlayRow_65zj4_99:hover{color:var(--text-bright)}._overlayRow_65zj4_99 input[type=checkbox]{accent-color:var(--accent-blue);cursor:pointer;flex-shrink:0;width:14px;height:14px}._viewer_8mn40_1{flex-direction:row;height:100%;max-height:100%;display:flex;overflow:hidden}._canvasWrapper_8mn40_9{flex:1;min-width:0;min-height:0;position:relative}._toolbar_8mn40_16{top:var(--spacing-md);left:var(--spacing-md);gap:var(--spacing-sm);background-color:var(--bg-panel);border:1px solid var(--border-primary);border-radius:var(--radius-md);padding:var(--spacing-sm);z-index:10;display:flex;position:absolute}._animBar_8mn40_29{bottom:30px;left:var(--spacing-md);z-index:10;align-items:center;gap:var(--spacing-md);background-color:var(--bg-panel);border:1px solid var(--border-primary);border-radius:var(--radius-md);padding:var(--spacing-sm) var(--spacing-md);display:flex;position:absolute}._scrubber_8mn40_43{z-index:10;appearance:none;cursor:pointer;background:0 0;width:100%;height:20px;margin:0;padding:0;position:absolute;bottom:0;left:0}._scrubber_8mn40_43::-webkit-slider-runnable-track{background:var(--bg-panel);border-top:1px solid var(--border-primary);height:4px}._scrubber_8mn40_43::-webkit-slider-thumb{-webkit-appearance:none;background:var(--accent-blue);cursor:pointer;border-radius:50%;width:12px;height:12px;margin-top:-4px}._scrubber_8mn40_43::-moz-range-track{background:var(--bg-panel);border-top:1px solid var(--border-primary);height:4px}._scrubber_8mn40_43::-moz-range-thumb{background:var(--accent-blue);cursor:pointer;border:none;border-radius:50%;width:12px;height:12px}._animSelect_8mn40_89{color:var(--text-primary);font-family:var(--font-ui);font-size:var(--font-size-md);cursor:pointer;background:0 0;border:none;outline:none;max-width:200px}._animSelect_8mn40_89:hover{border-color:var(--border-active)}._animLoopLabel_8mn40_104{color:var(--text-primary);font-family:var(--font-ui);font-size:var(--font-size-md);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;align-items:center;gap:5px;display:flex}._viewer_76hio_1{flex-direction:row;height:100%;max-height:100%;display:flex;overflow:hidden}._imageWrapper_76hio_9{background-image:linear-gradient(45deg,#2a2a2a 25%,#0000 25%),linear-gradient(-45deg,#2a2a2a 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#2a2a2a 75%),linear-gradient(-45deg,#0000 75%,#2a2a2a 75%);background-position:0 0,0 8px,8px -8px,-8px 0;background-size:16px 16px;background-color:var(--bg-input);flex:1;min-width:0;min-height:0;position:relative;overflow:hidden}._zoomInner_76hio_25{transform-origin:0 0;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}._image_76hio_9{object-fit:contain;-webkit-user-select:none;user-select:none;pointer-events:none;max-width:100%;max-height:100%}._zoomReset_76hio_42{bottom:var(--spacing-md);right:var(--spacing-md);background:var(--bg-panel);border:1px solid var(--border-primary);border-radius:var(--radius-sm);color:var(--text-primary);font-size:var(--font-size-sm);font-family:var(--font-mono);cursor:pointer;z-index:10;-webkit-user-select:none;user-select:none;padding:2px 6px;position:absolute}._zoomReset_76hio_42:hover{background:var(--bg-hover)}._cubeCross_76hio_62{width:100%;height:100%;padding:var(--spacing-md);box-sizing:border-box;-webkit-user-select:none;user-select:none;pointer-events:none;grid-template-rows:repeat(3,1fr);grid-template-columns:repeat(4,1fr);gap:2px;display:grid}._cubeFace_76hio_75{background-image:linear-gradient(45deg,#2a2a2a 25%,#0000 25%),linear-gradient(-45deg,#2a2a2a 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#2a2a2a 75%),linear-gradient(-45deg,#0000 75%,#2a2a2a 75%);background-position:0 0,0 8px,8px -8px,-8px 0;background-size:16px 16px;background-color:var(--bg-input);position:relative;overflow:hidden}._cubeFace_76hio_75 img{object-fit:contain;width:100%;height:100%;display:block}._faceLabel_76hio_95{font-size:9px;font-family:var(--font-mono);color:#ffffffa6;pointer-events:none;text-shadow:0 1px 2px #000c;position:absolute;bottom:3px;left:4px}._cubeEmpty_76hio_106{background:0 0}._noPreview_76hio_110{color:var(--text-muted);font-size:var(--font-size-md);font-family:var(--font-ui);-webkit-user-select:none;user-select:none}._tabs_19fdz_1{background-color:var(--bg-header);scrollbar-width:none;align-items:stretch;height:28px;min-height:28px;display:flex;overflow-x:auto}._tab_19fdz_1{padding:0 var(--spacing-md);font-family:var(--font-ui);font-size:var(--font-size-xs);letter-spacing:2px;text-transform:uppercase;color:var(--text-muted);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-top:1px solid #0000;align-items:center;font-weight:600;display:flex}._tab_19fdz_1:hover{color:var(--text-secondary)}._active_19fdz_33{color:var(--text-bright);background-color:var(--bg-secondary);border-top-color:var(--accent-blue)}._unpadded_19fdz_39{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}._mounted_19fdz_47{height:100%}._error_19fdz_51{gap:var(--spacing-md);color:var(--accent-red);font-size:var(--font-size-md);flex-direction:column;display:flex}._error_19fdz_51 button{align-self:flex-start}._root_ngf3k_1{background-color:var(--bg-primary);flex-direction:column;height:100%;display:flex}._main_ngf3k_8{flex:1;display:flex;overflow:hidden}._editor_ngf3k_14{background-color:var(--bg-primary);flex:1;height:100%}._panel_ngf3k_20{font-family:var(--font-ui);font-size:var(--font-size-lg);color:var(--text-primary);background-color:var(--bg-secondary)}._panelContent_ngf3k_27{flex-direction:column;height:100%;display:flex;overflow:hidden}._panelBody_ngf3k_34{padding:var(--spacing-md);flex:1;overflow:auto}._middleGroup_ngf3k_40{flex:1}._panelHeader_25fch_1{height:28px;min-height:28px;padding:0 var(--spacing-md);background-color:var(--bg-header);font-family:var(--font-ui);font-size:var(--font-size-xs);letter-spacing:2px;text-transform:uppercase;color:var(--text-secondary);-webkit-user-select:none;user-select:none;align-items:center;font-weight:600;display:flex}._container_1jjbp_1{flex-direction:column;gap:4px;display:flex}._nameRow_1jjbp_8{background-color:var(--bg-panel);border-bottom:1px solid var(--border-primary);align-items:center;gap:8px;height:32px;padding:0 12px;display:flex}._nameIcon_1jjbp_18{flex-shrink:0;width:16px;height:16px}._nameText_1jjbp_24{font-family:var(--font-ui);font-size:var(--font-size-xl);color:var(--text-bright);font-weight:600}._sectionHeader_1jjbp_32{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;height:24px;padding:0 8px;display:flex}._sectionHeader_1jjbp_32:hover{background-color:var(--bg-hover)}._sectionArrow_1jjbp_46{width:10px;height:10px;color:var(--text-secondary);flex-shrink:0;transition:transform .1s}._sectionArrow_1jjbp_46._collapsed_1jjbp_54{transform:rotate(-90deg)}._sectionTitle_1jjbp_58{font-family:var(--font-ui);font-size:var(--font-size-sm);color:var(--text-primary);font-weight:600}._divider_1jjbp_66{background-color:var(--border-primary);height:1px;margin:0}._propertyRow3_1jjbp_73{align-items:center;gap:8px;height:24px;padding:0 8px;display:flex}._propertyLabel_1jjbp_81{font-family:var(--font-ui);font-size:var(--font-size-sm);color:var(--text-secondary);flex-shrink:0;width:60px}._valueInput_1jjbp_89{background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);width:52px;height:20px;font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-primary);box-sizing:border-box;outline:none;padding:0 6px}._valueInput_1jjbp_89:focus{border-color:var(--accent-blue)}._checkboxRow_1jjbp_108{align-items:center;gap:6px;height:24px;padding:0 8px;display:flex}._checkbox_1jjbp_108{width:14px;height:14px;accent-color:var(--accent-blue);cursor:pointer;flex-shrink:0}._checkboxLabel_1jjbp_124{font-family:var(--font-ui);font-size:var(--font-size-sm);color:var(--text-secondary);cursor:pointer}._propertyRow_1jjbp_73{align-items:center;gap:8px;height:24px;padding:0 8px;display:flex}._propertyLabelWide_1jjbp_140{font-family:var(--font-ui);font-size:var(--font-size-sm);color:var(--text-secondary);flex-shrink:0;width:80px}._valueDisplay_1jjbp_148{background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);height:20px;font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;align-items:center;min-width:60px;padding:0 6px;display:flex;overflow:hidden}._valueInputWide_1jjbp_165{background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);height:20px;font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-primary);box-sizing:border-box;outline:none;flex:1;padding:0 6px}._valueInputWide_1jjbp_165:focus{border-color:var(--accent-blue)}._sliderRow_1jjbp_184{align-items:center;gap:8px;height:24px;padding:0 8px;display:flex}._sliderTrack_1jjbp_192{background-color:var(--bg-input);border:1px solid var(--border-primary);cursor:pointer;border-radius:2px;flex:1;height:4px;position:relative}._sliderFill_1jjbp_202{background-color:var(--accent-blue);pointer-events:none;border-radius:2px;height:100%;position:absolute;top:0;left:0}._sliderThumb_1jjbp_212{background-color:var(--text-bright);pointer-events:none;border-radius:50%;width:10px;height:10px;position:absolute;top:50%;transform:translate(-50%,-50%);box-shadow:0 1px 3px #0006}._sliderInput_1jjbp_224{background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);width:48px;height:20px;font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-primary);box-sizing:border-box;text-align:right;outline:none;padding:0 4px}._sliderInput_1jjbp_224:focus{border-color:var(--accent-blue)}._draggableInput_1jjbp_244{background-color:var(--bg-input);border:1px solid var(--border-primary);border-radius:var(--radius-sm);width:52px;height:20px;font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-primary);box-sizing:border-box;cursor:ew-resize;outline:none;padding:0 6px}._draggableInput_1jjbp_244:focus{border-color:var(--accent-blue);cursor:text}._empty_1jjbp_265{color:var(--text-muted);font-family:var(--font-ui);font-size:var(--font-size-md);padding:16px 8px;font-style:italic}._colorInput_1jjbp_274{border:1px solid var(--border-primary);border-radius:var(--radius-sm);background-color:var(--bg-input);cursor:pointer;box-sizing:border-box;width:32px;height:20px;padding:1px 2px}._prefabSection_1jjbp_286{flex-direction:column;gap:4px;display:flex}._container_7ns3c_1{font-family:var(--font-ui);font-size:var(--font-size-md);-webkit-user-select:none;user-select:none;padding:var(--spacing-sm) 0}._row_7ns3c_8{cursor:pointer;align-items:center;gap:var(--spacing-sm);border-radius:var(--radius-sm);height:24px;padding-right:var(--spacing-md);display:flex}._row_7ns3c_8:hover{background-color:var(--bg-hover)}._selected_7ns3c_22,._selected_7ns3c_22:hover{background-color:var(--bg-selected)}._arrow_7ns3c_30{width:12px;color:var(--text-secondary);cursor:pointer;text-align:center;flex-shrink:0;font-size:10px}._typeIcon_7ns3c_39{flex-shrink:0;justify-content:center;align-items:center;width:14px;height:14px;display:flex}._typeIcon_7ns3c_39 svg{width:14px;height:14px}._name_7ns3c_53{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-md);overflow:hidden}._empty_7ns3c_61{padding:var(--spacing-md);color:var(--text-muted);font-style:italic;font-family:var(--font-ui);font-size:var(--font-size-md)}._runtime_7ns3c_69{color:var(--text-muted);font-style:italic}._container_z6ti4_1{font-family:var(--font-ui);font-size:var(--font-size-md);-webkit-user-select:none;user-select:none}._empty_z6ti4_7,._hint_z6ti4_8{color:var(--text-muted);font-size:var(--font-size-sm);padding:var(--spacing-sm) var(--spacing-md)}._header_z6ti4_14{justify-content:space-between;align-items:center;gap:var(--spacing-md);padding-bottom:var(--spacing-md);border-bottom:1px solid var(--border-subtle);display:flex}._title_z6ti4_23{align-items:baseline;gap:var(--spacing-sm);flex-wrap:wrap;min-width:0;display:flex}._sceneName_z6ti4_31{color:var(--text-bright);font-weight:600}._dirty_z6ti4_36{color:var(--accent-orange);font-size:10px}._file_z6ti4_41{color:var(--text-muted);font-family:var(--font-mono);font-size:var(--font-size-xs)}._saveButton_z6ti4_47,._removeButton_z6ti4_48{background-color:var(--bg-input);color:var(--text-primary);border:1px solid var(--border-primary);border-radius:var(--radius-sm);padding:2px var(--spacing-md);font-family:var(--font-ui);font-size:var(--font-size-sm);cursor:pointer}._saveButton_z6ti4_47:hover:not(:disabled),._removeButton_z6ti4_48:hover{border-color:var(--accent-blue);color:var(--text-bright)}._saveButton_z6ti4_47:disabled{opacity:.6;cursor:default}._removeButton_z6ti4_48{margin-top:var(--spacing-sm);align-self:flex-start}._error_z6ti4_75{color:var(--accent-red);font-size:var(--font-size-sm);padding:var(--spacing-sm) 0}._section_z6ti4_81{color:var(--text-secondary);font-size:var(--font-size-xs);letter-spacing:1px;text-transform:uppercase;padding:var(--spacing-lg) 0 var(--spacing-sm);font-weight:600}._clickable_z6ti4_90{cursor:pointer}._row_z6ti4_94{align-items:center;gap:var(--spacing-sm);height:24px;padding:0 var(--spacing-sm);border-radius:var(--radius-sm);cursor:pointer;display:flex}._row_z6ti4_94:hover{background-color:var(--bg-hover)}._selected_z6ti4_108,._selected_z6ti4_108:hover{background-color:var(--bg-selected)}._liveRow_z6ti4_113 ._name_z6ti4_113{color:var(--text-secondary)}._arrow_z6ti4_117{width:12px;color:var(--text-secondary);text-align:center;flex-shrink:0;font-size:10px}._liveDot_z6ti4_125{background-color:var(--accent-green);border-radius:50%;flex-shrink:0;width:6px;height:6px;margin:0 3px}._name_z6ti4_113{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._type_z6ti4_141{color:var(--text-muted);font-size:var(--font-size-xs);white-space:nowrap;text-overflow:ellipsis;margin-left:auto;overflow:hidden}._badge_z6ti4_150{color:var(--accent-purple);border:1px solid var(--accent-purple);border-radius:var(--radius-sm);text-transform:uppercase;flex-shrink:0;padding:0 3px;font-size:9px}._details_z6ti4_160{gap:var(--spacing-sm);padding:var(--spacing-sm) var(--spacing-md) var(--spacing-md) 28px;-webkit-user-select:text;user-select:text;flex-direction:column;display:flex}._field_z6ti4_168{align-items:center;gap:var(--spacing-md);font-size:var(--font-size-sm);display:flex}._field_z6ti4_168>span{width:80px;color:var(--text-label);flex-shrink:0}._field_z6ti4_168 code{font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._field_z6ti4_168 input:not([type=checkbox]):not([type=color]){background-color:var(--bg-input);min-width:0;color:var(--text-primary);border:1px solid var(--border-primary);border-radius:var(--radius-sm);padding:2px var(--spacing-sm);font-family:var(--font-mono);font-size:var(--font-size-xs);flex:1}._field_z6ti4_168 input[type=color]{background:0 0;border:none;width:28px;height:18px;padding:0}._root_t4wh3_1{gap:var(--spacing-lg);font-size:var(--font-size-md);flex-direction:column;display:flex}._empty_t4wh3_8{color:var(--text-secondary);text-align:center;padding:var(--spacing-2xl) var(--spacing-lg);line-height:1.5}._card_t4wh3_15{gap:var(--spacing-md);padding-bottom:var(--spacing-lg);border-bottom:1px solid var(--border-primary);flex-direction:column;display:flex}._cardHeader_t4wh3_23{align-items:center;gap:var(--spacing-md);min-width:0;display:flex}._badge_t4wh3_30{font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.04em;background-color:var(--accent-blue);color:var(--text-bright);border-radius:var(--radius-sm);flex-shrink:0;padding:1px 6px}._gamepadId_t4wh3_41{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}._meta_t4wh3_49{color:var(--text-muted);font-family:var(--font-mono);flex-shrink:0}._button_t4wh3_55{background-color:var(--bg-active);border:1px solid var(--border-active);color:var(--text-primary);border-radius:var(--radius-sm);font-family:var(--font-ui);font-size:var(--font-size-sm);padding:2px var(--spacing-md);cursor:pointer;flex-shrink:0}._button_t4wh3_55:hover{background-color:var(--bg-hover)}._warning_t4wh3_71{color:var(--accent-yellow);font-size:var(--font-size-sm)}._diagram_t4wh3_76{align-self:center;width:100%;max-width:360px}._body_t4wh3_82{fill:var(--bg-panel);stroke:var(--border-primary)}._part_t4wh3_87{fill:var(--bg-hover);stroke:var(--border-active);stroke-width:1px}._pressed_t4wh3_93{fill:var(--accent-blue);stroke:var(--text-bright)}._fill_t4wh3_98{fill:var(--text-muted)}._fillPressed_t4wh3_102{fill:var(--accent-blue)}._deadzone_t4wh3_106{fill:none;stroke:var(--accent-orange);stroke-dasharray:2 2}._rawDot_t4wh3_112{fill:var(--text-secondary)}._stickDot_t4wh3_116{fill:var(--accent-green)}._tinyLabel_t4wh3_120,._faceLabel_t4wh3_121{fill:var(--text-primary);font-family:var(--font-ui);text-anchor:middle;pointer-events:none}._tinyLabel_t4wh3_120{font-size:7px}._faceLabel_t4wh3_121{font-size:8px;font-weight:600}._sticks_t4wh3_137{font-family:var(--font-mono);color:var(--text-label);justify-content:space-around;display:flex}._sectionTitle_t4wh3_144{font-size:var(--font-size-xs);color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}._rows_t4wh3_151{gap:var(--spacing-xs);flex-direction:column;display:flex}._row_t4wh3_151{align-items:center;gap:var(--spacing-md);color:var(--text-label);grid-template-columns:110px 1fr 48px;display:grid}._rowPressed_t4wh3_165{color:var(--text-bright)}._rowLabel_t4wh3_169{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}._rowValue_t4wh3_175{font-family:var(--font-mono);text-align:right;font-variant-numeric:tabular-nums}._bar_t4wh3_181{background-color:var(--bg-input);border-radius:var(--radius-sm);height:6px;position:relative;overflow:hidden}._barCenter_t4wh3_189{background-color:var(--border-active);width:1px;position:absolute;top:0;bottom:0;left:50%}._barFill_t4wh3_198{background-color:var(--accent-blue);position:absolute;top:0;bottom:0}._log_t4wh3_205{font-family:var(--font-mono);font-size:var(--font-size-sm);gap:var(--spacing-xs);color:var(--text-label);flex-direction:column;display:flex}._logEmpty_t4wh3_214{color:var(--text-muted)}._logEntry_t4wh3_218{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}._logTime_t4wh3_224{color:var(--text-muted);margin-right:var(--spacing-md)}._statusBar_6wjbc_1{background-color:var(--bg-statusbar);height:22px;min-height:22px;padding:0 var(--spacing-md);font-size:var(--font-size-xs);color:var(--text-bright);justify-content:space-between;align-items:center;display:flex}._section_6wjbc_13{gap:var(--spacing-xl);align-items:center;display:flex}._stat_6wjbc_1{gap:var(--spacing-sm);font-family:var(--font-mono);display:flex}._statLabel_6wjbc_25{opacity:.7;font-family:var(--font-mono)}._branch_6wjbc_30{font-family:var(--font-ui);font-weight:500}._engineName_6wjbc_35{font-family:var(--font-ui);font-weight:600}._statButton_6wjbc_40{color:inherit;font-size:inherit;padding:0 var(--spacing-sm);border-radius:var(--radius-sm);cursor:pointer;background:0 0;border:none;align-items:center;height:18px}._statButton_6wjbc_40:hover{background-color:#ffffff26}
2
+ /*$vite$:1*/
package/dist/Editor.d.ts CHANGED
@@ -1,12 +1,18 @@
1
- import type { Root } from 'react-dom/client';
2
- import type { Object3DEventMap } from 'three';
3
- import type { TransformControlsMode } from 'three/examples/jsm/Addons.js';
1
+ import type { EditorPanel } from '@mavonengine/core/Types/IEditor';
4
2
  import type IEditor from '@mavonengine/core/Types/IEditor';
5
3
  import type GameObjectInterface from '@mavonengine/core/World/GameObjectInterface';
6
- import { Object3D } from 'three';
7
- import { FlyControls, OutlinePass, TransformControls } from 'three/examples/jsm/Addons.js';
4
+ import type { Root } from 'react-dom/client';
5
+ import type { Object3DEventMap } from 'three';
6
+ import type { TransformControlsMode } from 'three/examples/jsm/controls/TransformControls.js';
7
+ import type { EditorPanelDefinition } from './Editor/panels';
8
8
  import EditorHelper from '@mavonengine/core/Editor/EditorHelper';
9
9
  import EventEmitter from '@mavonengine/core/Utils/EventEmitter';
10
+ import { Object3D } from 'three';
11
+ import { FlyControls } from 'three/examples/jsm/controls/FlyControls.js';
12
+ import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';
13
+ import { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass.js';
14
+ export type { EditorPanelDefinition, EditorPanelLocation } from './Editor/panels';
15
+ export { registerEditorPanel, unregisterEditorPanel } from './Editor/panels';
10
16
  export type ShadeMode = 'solid' | 'flat' | 'wireframe';
11
17
  export default class Editor extends EventEmitter implements IEditor, GameObjectInterface {
12
18
  flyControls: FlyControls;
@@ -22,8 +28,14 @@ export default class Editor extends EventEmitter implements IEditor, GameObjectI
22
28
  private helpers;
23
29
  private lightHelpers;
24
30
  private _showHelpers;
31
+ private abort;
32
+ private saving?;
25
33
  availableAssetCategories: string[];
26
34
  activeAssetCategory: 'Object' | '_texture' | 'CubeTexture' | 'AudioBuffer' | 'Font';
35
+ /**
36
+ * Dock a custom panel in the editor, before or after it booted. Same as `editor.addPanel()`
37
+ */
38
+ static registerPanel(panel: EditorPanelDefinition | EditorPanel): () => void;
27
39
  /**
28
40
  * The editor should only be instantiated when button is pressed
29
41
  */
@@ -39,6 +51,18 @@ export default class Editor extends EventEmitter implements IEditor, GameObjectI
39
51
  selectObject(object: Object3D): void;
40
52
  private handleCanvasClick;
41
53
  private handleHelperTool;
54
+ addPanel(panel: EditorPanelDefinition | EditorPanel): () => void;
55
+ removePanel(id: string): void;
56
+ /**
57
+ * Save the active scene to `scenes/<name>.json` through the dev server.
58
+ * Triggers `sceneSaved` ({ name, file }) or `sceneSaveFailed` ({ name, error }).
59
+ */
60
+ saveScene(fetchFn?: typeof fetch): Promise<boolean>;
61
+ /** Without a scene loaded by the game, open `scenes/main.json`, or a demo scene when there is none yet */
62
+ private openDefaultScene;
63
+ private watchScene;
64
+ /** The old way, for games that don't use scenes: start from an empty world */
65
+ private clearGame;
42
66
  addHelper(helper: EditorHelper): void;
43
67
  removeHelper(helper: EditorHelper): void;
44
68
  addLightHelper(helper: Object3D): void;