@fps-games/editor 0.2.1-beta.1 → 0.2.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-bridge/capabilities/ui-regions.d.ts.map +1 -1
- package/dist/agent-bridge/capabilities/ui-regions.js +16 -0
- package/dist/agent-bridge/capabilities/ui-regions.js.map +1 -1
- package/dist/build-info.json +43 -43
- package/dist/internal/material-preview.d.ts +22 -0
- package/dist/internal/material-preview.d.ts.map +1 -0
- package/dist/internal/material-preview.js +186 -0
- package/dist/internal/material-preview.js.map +1 -0
- package/dist/internal/project-model-preview.d.ts +4 -0
- package/dist/internal/project-model-preview.d.ts.map +1 -0
- package/dist/internal/project-model-preview.js +359 -0
- package/dist/internal/project-model-preview.js.map +1 -0
- package/dist/local-editor-agent-context.d.ts +12 -1
- package/dist/local-editor-agent-context.d.ts.map +1 -1
- package/dist/local-editor-agent-context.js +47 -0
- package/dist/local-editor-agent-context.js.map +1 -1
- package/dist/local-editor-harness.d.ts +15 -2
- package/dist/local-editor-harness.d.ts.map +1 -1
- package/dist/local-editor-harness.js +310 -21
- package/dist/local-editor-harness.js.map +1 -1
- package/dist/local-editor-tools.d.ts +1 -0
- package/dist/local-editor-tools.d.ts.map +1 -1
- package/dist/local-editor-tools.js +3 -0
- package/dist/local-editor-tools.js.map +1 -1
- package/dist/playable-local-editor-host.d.ts +4 -0
- package/dist/playable-local-editor-host.d.ts.map +1 -1
- package/dist/playable-local-editor-host.js +27 -0
- package/dist/playable-local-editor-host.js.map +1 -1
- package/dist/playable-product-scene-capabilities.d.ts.map +1 -1
- package/dist/playable-product-scene-capabilities.js +9 -3
- package/dist/playable-product-scene-capabilities.js.map +1 -1
- package/dist/playable-standard-project.d.ts.map +1 -1
- package/dist/playable-standard-project.js +5 -2
- package/dist/playable-standard-project.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/package.json +7 -7
- package/node_modules/@fps-games/editor-babylon/dist/marker-overlay.js +24 -0
- package/node_modules/@fps-games/editor-babylon/dist/marker-overlay.js.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts +10 -1
- package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/projection.js +96 -1
- package/node_modules/@fps-games/editor-babylon/dist/projection.js.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-spatial-overlay-controller.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-spatial-overlay-controller.js +85 -22
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-spatial-overlay-controller.js.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.d.ts +2 -0
- package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.js +150 -4
- package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.js.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.d.ts +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.js +249 -15
- package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.js.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/types.d.ts +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/types.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/types.js.map +1 -1
- package/node_modules/@fps-games/editor-babylon/package.json +6 -6
- package/node_modules/@fps-games/editor-browser/dist/index.d.ts +5 -0
- package/node_modules/@fps-games/editor-browser/dist/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/index.js +3 -0
- package/node_modules/@fps-games/editor-browser/dist/index.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-browser-continuity.d.ts +35 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-browser-continuity.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-browser-continuity.js +136 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-browser-continuity.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-filesystem.d.ts +46 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-filesystem.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-filesystem.js +283 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-filesystem.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-preview-cleanup-registry.d.ts +12 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-preview-cleanup-registry.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-preview-cleanup-registry.js +67 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-preview-cleanup-registry.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-open.d.ts +6 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-open.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-open.js +9 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-open.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-preview.d.ts +7 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-preview.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-preview.js +20 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-preview.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-media-thumbnail-cache.d.ts +9 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-media-thumbnail-cache.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-media-thumbnail-cache.js +219 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-project-media-thumbnail-cache.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-tool-presentation.d.ts +14 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-tool-presentation.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-tool-presentation.js +42 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-tool-presentation.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-asset-kind.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-asset-kind.js +2 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-asset-kind.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-console.d.ts +27 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-console.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-console.js +288 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-console.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.d.ts +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.js +29 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.d.ts +20 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.js +321 -60
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.d.ts +2 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.js +4 -2
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts +63 -3
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.d.ts +9 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.js +88 -16
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts +2 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js +1463 -356
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-viewport-orientation.d.ts +13 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-viewport-orientation.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-viewport-orientation.js +15 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-viewport-orientation.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/package.json +7 -7
- package/node_modules/@fps-games/editor-core/dist/editor-tools.d.ts +1 -0
- package/node_modules/@fps-games/editor-core/dist/editor-tools.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-core/dist/editor-tools.js +3 -1
- package/node_modules/@fps-games/editor-core/dist/editor-tools.js.map +1 -1
- package/node_modules/@fps-games/editor-core/dist/viewport-tools.d.ts +11 -2
- package/node_modules/@fps-games/editor-core/dist/viewport-tools.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-core/dist/viewport-tools.js +12 -1
- package/node_modules/@fps-games/editor-core/dist/viewport-tools.js.map +1 -1
- package/node_modules/@fps-games/editor-core/package.json +6 -6
- package/node_modules/@fps-games/editor-forge-play/package.json +2 -2
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/catalog.d.ts +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/catalog.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/catalog.js +5 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/catalog.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/index.d.ts +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/index.js +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/index.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/handler.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/handler.js +15 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/handler.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/routes.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/routes.js +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/routes.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/types.d.ts +6 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/types.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/types.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/index.d.ts +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/index.js +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/index.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-source.d.ts +4 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-source.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-source.js +10 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-source.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/index.d.ts +4 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/index.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/index.js +4 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/index.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/protocol.d.ts +4 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/protocol.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/protocol.js +86 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/protocol.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/support.d.ts +9 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/support.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/support.js +76 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/support.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/types.d.ts +34 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/types.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/types.js +2 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/types.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.d.ts +4 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.js +40 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.d.ts +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.js +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.d.ts +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.js +94 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-file-handle.d.ts +14 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-file-handle.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-file-handle.js +101 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-file-handle.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-files.d.ts +23 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-files.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-files.js +180 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-files.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/package.json +6 -6
- package/node_modules/@fps-games/editor-protocol/dist/agent.d.ts +23 -3
- package/node_modules/@fps-games/editor-protocol/dist/agent.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-protocol/dist/agent.js.map +1 -1
- package/node_modules/@fps-games/editor-protocol/package.json +2 -2
- package/node_modules/@fps-games/editor-tooling/package.json +3 -3
- package/node_modules/@fps-games/editor-ui/dist/editor-ui-theme.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-ui/dist/editor-ui-theme.js +103 -10
- package/node_modules/@fps-games/editor-ui/dist/editor-ui-theme.js.map +1 -1
- package/node_modules/@fps-games/editor-ui/package.json +1 -1
- package/node_modules/@fps-games/playable-assets/package.json +1 -1
- package/node_modules/@fps-games/playable-contracts/package.json +1 -1
- package/node_modules/@fps-games/playable-rendering/package.json +2 -2
- package/node_modules/@fps-games/playable-runtime/package.json +12 -12
- package/node_modules/@fps-games/playable-runtime-data/package.json +4 -4
- package/node_modules/@fps-games/playable-scene/package.json +2 -2
- package/node_modules/@fps-games/plugin-api/package.json +1 -1
- package/node_modules/@fps-games/plugin-assets/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-assets/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-assets/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-assets/package.json +5 -5
- package/node_modules/@fps-games/plugin-hierarchy/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-hierarchy/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-hierarchy/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-hierarchy/package.json +5 -5
- package/node_modules/@fps-games/plugin-host/package.json +2 -2
- package/node_modules/@fps-games/plugin-markers/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-markers/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-markers/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-markers/package.json +5 -5
- package/node_modules/@fps-games/plugin-materials/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-materials/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-materials/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-materials/package.json +5 -5
- package/node_modules/@fps-games/plugin-rendering/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-rendering/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-rendering/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-rendering/package.json +5 -5
- package/node_modules/@fps-games/plugin-scene/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-scene/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-scene/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-scene/package.json +5 -5
- package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-shadow-map-experiment/package.json +5 -5
- package/node_modules/@fps-games/plugin-shadows/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-shadows/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-shadows/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-shadows/package.json +7 -7
- package/package.json +22 -22
package/node_modules/@fps-games/editor-browser/dist/local-editor-project-media-thumbnail-cache.js
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
const PROJECT_MODEL_THUMBNAIL_CACHE_NAME = 'fps-editor-project-model-thumbnails-v1';
|
|
2
|
+
const PROJECT_MODEL_THUMBNAIL_CACHE_PATH = '/__fps-editor-cache/project-model-thumbnail';
|
|
3
|
+
const PROJECT_MODEL_THUMBNAIL_PATH_CACHE_EPOCH_PATH = '/__fps-editor-cache/project-model-thumbnail-path-epoch';
|
|
4
|
+
const PROJECT_MODEL_THUMBNAIL_CACHE_LIMIT = 256;
|
|
5
|
+
export const LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX = 'model:path:';
|
|
6
|
+
export function createLocalEditorProjectModelThumbnailCache(ownerWindow) {
|
|
7
|
+
const objectUrls = new Map();
|
|
8
|
+
const cacheStorage = ownerWindow?.caches;
|
|
9
|
+
const baseUrl = ownerWindow?.location.href;
|
|
10
|
+
let disposed = false;
|
|
11
|
+
let generation = 0;
|
|
12
|
+
let pathGeneration = 0;
|
|
13
|
+
let pathCacheEpoch = 0;
|
|
14
|
+
let pathCacheEpochLoaded = false;
|
|
15
|
+
let pathCacheEpochLoad = null;
|
|
16
|
+
let pathCacheMutation = Promise.resolve();
|
|
17
|
+
const openCache = async (strict = false) => {
|
|
18
|
+
if (!cacheStorage || !baseUrl)
|
|
19
|
+
return null;
|
|
20
|
+
try {
|
|
21
|
+
return await cacheStorage.open(PROJECT_MODEL_THUMBNAIL_CACHE_NAME);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (strict)
|
|
25
|
+
throw error;
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const resolveRequestUrl = (key, epoch = pathCacheEpoch) => {
|
|
30
|
+
if (!baseUrl)
|
|
31
|
+
return null;
|
|
32
|
+
const url = new URL(PROJECT_MODEL_THUMBNAIL_CACHE_PATH, baseUrl);
|
|
33
|
+
url.searchParams.set('key', key);
|
|
34
|
+
if (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX)) {
|
|
35
|
+
url.searchParams.set('epoch', String(epoch));
|
|
36
|
+
}
|
|
37
|
+
return url.href;
|
|
38
|
+
};
|
|
39
|
+
const resolvePathCacheEpochUrl = () => (baseUrl ? new URL(PROJECT_MODEL_THUMBNAIL_PATH_CACHE_EPOCH_PATH, baseUrl).href : null);
|
|
40
|
+
const loadPathCacheEpoch = async (cache) => {
|
|
41
|
+
if (pathCacheEpochLoaded)
|
|
42
|
+
return pathCacheEpoch;
|
|
43
|
+
if (pathCacheEpochLoad)
|
|
44
|
+
return pathCacheEpochLoad;
|
|
45
|
+
pathCacheEpochLoad = (async () => {
|
|
46
|
+
const epochUrl = resolvePathCacheEpochUrl();
|
|
47
|
+
if (!epochUrl)
|
|
48
|
+
return pathCacheEpoch;
|
|
49
|
+
const response = await cache.match(epochUrl);
|
|
50
|
+
const value = response ? Number.parseInt(await response.text(), 10) : 0;
|
|
51
|
+
pathCacheEpoch = Number.isSafeInteger(value) && value >= 0 ? value : 0;
|
|
52
|
+
pathCacheEpochLoaded = true;
|
|
53
|
+
return pathCacheEpoch;
|
|
54
|
+
})().finally(() => {
|
|
55
|
+
pathCacheEpochLoad = null;
|
|
56
|
+
});
|
|
57
|
+
return pathCacheEpochLoad;
|
|
58
|
+
};
|
|
59
|
+
const revokePathObjectUrls = () => {
|
|
60
|
+
for (const [key, objectUrl] of objectUrls) {
|
|
61
|
+
if (!key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX))
|
|
62
|
+
continue;
|
|
63
|
+
URL.revokeObjectURL(objectUrl);
|
|
64
|
+
objectUrls.delete(key);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
async get(key) {
|
|
69
|
+
if (disposed)
|
|
70
|
+
return null;
|
|
71
|
+
const requestGeneration = generation;
|
|
72
|
+
const requestPathGeneration = pathGeneration;
|
|
73
|
+
const existingObjectUrl = objectUrls.get(key);
|
|
74
|
+
if (existingObjectUrl)
|
|
75
|
+
return existingObjectUrl;
|
|
76
|
+
const cache = await openCache();
|
|
77
|
+
if (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX) && cache) {
|
|
78
|
+
await pathCacheMutation.catch(() => undefined);
|
|
79
|
+
try {
|
|
80
|
+
await loadPathCacheEpoch(cache);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const requestUrl = resolveRequestUrl(key);
|
|
87
|
+
if (!cache || !requestUrl || !ownerWindow)
|
|
88
|
+
return null;
|
|
89
|
+
try {
|
|
90
|
+
const response = await cache.match(requestUrl);
|
|
91
|
+
if (!response || disposed || requestGeneration !== generation)
|
|
92
|
+
return null;
|
|
93
|
+
const blob = await response.blob();
|
|
94
|
+
if (blob.size === 0
|
|
95
|
+
|| disposed
|
|
96
|
+
|| requestGeneration !== generation
|
|
97
|
+
|| (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX)
|
|
98
|
+
&& requestPathGeneration !== pathGeneration))
|
|
99
|
+
return null;
|
|
100
|
+
const objectUrl = URL.createObjectURL(blob);
|
|
101
|
+
if (disposed
|
|
102
|
+
|| requestGeneration !== generation
|
|
103
|
+
|| (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX)
|
|
104
|
+
&& requestPathGeneration !== pathGeneration)) {
|
|
105
|
+
URL.revokeObjectURL(objectUrl);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
const adoptedObjectUrl = objectUrls.get(key);
|
|
109
|
+
if (adoptedObjectUrl) {
|
|
110
|
+
URL.revokeObjectURL(objectUrl);
|
|
111
|
+
return adoptedObjectUrl;
|
|
112
|
+
}
|
|
113
|
+
objectUrls.set(key, objectUrl);
|
|
114
|
+
return objectUrl;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
async put(key, dataUrl) {
|
|
121
|
+
if (disposed)
|
|
122
|
+
return;
|
|
123
|
+
const requestGeneration = generation;
|
|
124
|
+
const requestPathGeneration = pathGeneration;
|
|
125
|
+
const cache = await openCache();
|
|
126
|
+
if (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX) && cache) {
|
|
127
|
+
await pathCacheMutation.catch(() => undefined);
|
|
128
|
+
try {
|
|
129
|
+
await loadPathCacheEpoch(cache);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const requestUrl = resolveRequestUrl(key);
|
|
136
|
+
if (!cache || !requestUrl || !ownerWindow?.fetch)
|
|
137
|
+
return;
|
|
138
|
+
try {
|
|
139
|
+
const response = await ownerWindow.fetch(dataUrl);
|
|
140
|
+
const stale = () => disposed
|
|
141
|
+
|| requestGeneration !== generation
|
|
142
|
+
|| (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX)
|
|
143
|
+
&& requestPathGeneration !== pathGeneration);
|
|
144
|
+
if (!response.ok || stale())
|
|
145
|
+
return;
|
|
146
|
+
await cache.put(requestUrl, response);
|
|
147
|
+
if (stale()) {
|
|
148
|
+
await cache.delete(requestUrl);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const requests = await cache.keys();
|
|
152
|
+
const epochUrl = resolvePathCacheEpochUrl();
|
|
153
|
+
const evictionCandidates = requests.filter(request => request.url !== epochUrl);
|
|
154
|
+
const overflow = evictionCandidates.length - PROJECT_MODEL_THUMBNAIL_CACHE_LIMIT;
|
|
155
|
+
if (overflow > 0) {
|
|
156
|
+
await Promise.all(evictionCandidates.slice(0, overflow).map(request => cache.delete(request)));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Persistent caching is an optimization; thumbnail generation remains the fallback.
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
async clearPathEntries() {
|
|
164
|
+
pathGeneration += 1;
|
|
165
|
+
revokePathObjectUrls();
|
|
166
|
+
const clear = pathCacheMutation.then(async () => {
|
|
167
|
+
const cache = await openCache(true);
|
|
168
|
+
if (!cache)
|
|
169
|
+
return;
|
|
170
|
+
await loadPathCacheEpoch(cache);
|
|
171
|
+
pathCacheEpoch += 1;
|
|
172
|
+
pathCacheEpochLoaded = true;
|
|
173
|
+
const epochUrl = resolvePathCacheEpochUrl();
|
|
174
|
+
if (!epochUrl)
|
|
175
|
+
return;
|
|
176
|
+
await cache.put(epochUrl, new Response(String(pathCacheEpoch), {
|
|
177
|
+
headers: { 'Content-Type': 'text/plain' },
|
|
178
|
+
}));
|
|
179
|
+
const errors = [];
|
|
180
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
181
|
+
try {
|
|
182
|
+
const requests = (await cache.keys()).filter((request) => {
|
|
183
|
+
const key = new URL(request.url).searchParams.get('key') ?? '';
|
|
184
|
+
return key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX);
|
|
185
|
+
});
|
|
186
|
+
const deleted = await Promise.all(requests.map(request => cache.delete(request)));
|
|
187
|
+
if (deleted.every(Boolean))
|
|
188
|
+
return;
|
|
189
|
+
errors.push(new Error('project_model_thumbnail_cache_delete_failed'));
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
errors.push(error);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const error = new Error('Project model thumbnail path cache cleanup failed.');
|
|
196
|
+
error.errors = errors;
|
|
197
|
+
throw error;
|
|
198
|
+
});
|
|
199
|
+
pathCacheMutation = clear.catch(() => undefined);
|
|
200
|
+
try {
|
|
201
|
+
await clear;
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
revokePathObjectUrls();
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
dispose() {
|
|
208
|
+
if (disposed)
|
|
209
|
+
return;
|
|
210
|
+
disposed = true;
|
|
211
|
+
generation += 1;
|
|
212
|
+
pathGeneration += 1;
|
|
213
|
+
for (const objectUrl of objectUrls.values())
|
|
214
|
+
URL.revokeObjectURL(objectUrl);
|
|
215
|
+
objectUrls.clear();
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=local-editor-project-media-thumbnail-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-editor-project-media-thumbnail-cache.js","sourceRoot":"","sources":["../src/local-editor-project-media-thumbnail-cache.ts"],"names":[],"mappings":"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","sourcesContent":["const PROJECT_MODEL_THUMBNAIL_CACHE_NAME = 'fps-editor-project-model-thumbnails-v1';\nconst PROJECT_MODEL_THUMBNAIL_CACHE_PATH = '/__fps-editor-cache/project-model-thumbnail';\nconst PROJECT_MODEL_THUMBNAIL_PATH_CACHE_EPOCH_PATH = '/__fps-editor-cache/project-model-thumbnail-path-epoch';\nconst PROJECT_MODEL_THUMBNAIL_CACHE_LIMIT = 256;\n\nexport const LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX = 'model:path:';\n\nexport interface LocalEditorProjectModelThumbnailCache {\n get(key: string): Promise<string | null>;\n put(key: string, dataUrl: string): Promise<void>;\n clearPathEntries(): Promise<void>;\n dispose(): void;\n}\n\nexport function createLocalEditorProjectModelThumbnailCache(\n ownerWindow: Window | null,\n): LocalEditorProjectModelThumbnailCache {\n const objectUrls = new Map<string, string>();\n const cacheStorage = ownerWindow?.caches;\n const baseUrl = ownerWindow?.location.href;\n let disposed = false;\n let generation = 0;\n let pathGeneration = 0;\n let pathCacheEpoch = 0;\n let pathCacheEpochLoaded = false;\n let pathCacheEpochLoad: Promise<number> | null = null;\n let pathCacheMutation: Promise<void> = Promise.resolve();\n\n const openCache = async (strict = false): Promise<Cache | null> => {\n if (!cacheStorage || !baseUrl) return null;\n try {\n return await cacheStorage.open(PROJECT_MODEL_THUMBNAIL_CACHE_NAME);\n } catch (error) {\n if (strict) throw error;\n return null;\n }\n };\n\n const resolveRequestUrl = (key: string, epoch = pathCacheEpoch): string | null => {\n if (!baseUrl) return null;\n const url = new URL(PROJECT_MODEL_THUMBNAIL_CACHE_PATH, baseUrl);\n url.searchParams.set('key', key);\n if (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX)) {\n url.searchParams.set('epoch', String(epoch));\n }\n return url.href;\n };\n\n const resolvePathCacheEpochUrl = (): string | null => (\n baseUrl ? new URL(PROJECT_MODEL_THUMBNAIL_PATH_CACHE_EPOCH_PATH, baseUrl).href : null\n );\n\n const loadPathCacheEpoch = async (cache: Cache): Promise<number> => {\n if (pathCacheEpochLoaded) return pathCacheEpoch;\n if (pathCacheEpochLoad) return pathCacheEpochLoad;\n pathCacheEpochLoad = (async () => {\n const epochUrl = resolvePathCacheEpochUrl();\n if (!epochUrl) return pathCacheEpoch;\n const response = await cache.match(epochUrl);\n const value = response ? Number.parseInt(await response.text(), 10) : 0;\n pathCacheEpoch = Number.isSafeInteger(value) && value >= 0 ? value : 0;\n pathCacheEpochLoaded = true;\n return pathCacheEpoch;\n })().finally(() => {\n pathCacheEpochLoad = null;\n });\n return pathCacheEpochLoad;\n };\n\n const revokePathObjectUrls = (): void => {\n for (const [key, objectUrl] of objectUrls) {\n if (!key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX)) continue;\n URL.revokeObjectURL(objectUrl);\n objectUrls.delete(key);\n }\n };\n\n return {\n async get(key) {\n if (disposed) return null;\n const requestGeneration = generation;\n const requestPathGeneration = pathGeneration;\n const existingObjectUrl = objectUrls.get(key);\n if (existingObjectUrl) return existingObjectUrl;\n const cache = await openCache();\n if (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX) && cache) {\n await pathCacheMutation.catch(() => undefined);\n try {\n await loadPathCacheEpoch(cache);\n } catch {\n return null;\n }\n }\n const requestUrl = resolveRequestUrl(key);\n if (!cache || !requestUrl || !ownerWindow) return null;\n try {\n const response = await cache.match(requestUrl);\n if (!response || disposed || requestGeneration !== generation) return null;\n const blob = await response.blob();\n if (blob.size === 0\n || disposed\n || requestGeneration !== generation\n || (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX)\n && requestPathGeneration !== pathGeneration)) return null;\n const objectUrl = URL.createObjectURL(blob);\n if (disposed\n || requestGeneration !== generation\n || (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX)\n && requestPathGeneration !== pathGeneration)) {\n URL.revokeObjectURL(objectUrl);\n return null;\n }\n const adoptedObjectUrl = objectUrls.get(key);\n if (adoptedObjectUrl) {\n URL.revokeObjectURL(objectUrl);\n return adoptedObjectUrl;\n }\n objectUrls.set(key, objectUrl);\n return objectUrl;\n } catch {\n return null;\n }\n },\n async put(key, dataUrl) {\n if (disposed) return;\n const requestGeneration = generation;\n const requestPathGeneration = pathGeneration;\n const cache = await openCache();\n if (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX) && cache) {\n await pathCacheMutation.catch(() => undefined);\n try {\n await loadPathCacheEpoch(cache);\n } catch {\n return;\n }\n }\n const requestUrl = resolveRequestUrl(key);\n if (!cache || !requestUrl || !ownerWindow?.fetch) return;\n try {\n const response = await ownerWindow.fetch(dataUrl);\n const stale = (): boolean => disposed\n || requestGeneration !== generation\n || (key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX)\n && requestPathGeneration !== pathGeneration);\n if (!response.ok || stale()) return;\n await cache.put(requestUrl, response);\n if (stale()) {\n await cache.delete(requestUrl);\n return;\n }\n const requests = await cache.keys();\n const epochUrl = resolvePathCacheEpochUrl();\n const evictionCandidates = requests.filter(request => request.url !== epochUrl);\n const overflow = evictionCandidates.length - PROJECT_MODEL_THUMBNAIL_CACHE_LIMIT;\n if (overflow > 0) {\n await Promise.all(evictionCandidates.slice(0, overflow).map(request => cache.delete(request)));\n }\n } catch {\n // Persistent caching is an optimization; thumbnail generation remains the fallback.\n }\n },\n async clearPathEntries() {\n pathGeneration += 1;\n revokePathObjectUrls();\n const clear = pathCacheMutation.then(async () => {\n const cache = await openCache(true);\n if (!cache) return;\n await loadPathCacheEpoch(cache);\n pathCacheEpoch += 1;\n pathCacheEpochLoaded = true;\n const epochUrl = resolvePathCacheEpochUrl();\n if (!epochUrl) return;\n await cache.put(epochUrl, new Response(String(pathCacheEpoch), {\n headers: { 'Content-Type': 'text/plain' },\n }));\n const errors: unknown[] = [];\n for (let attempt = 0; attempt < 2; attempt += 1) {\n try {\n const requests = (await cache.keys()).filter((request) => {\n const key = new URL(request.url).searchParams.get('key') ?? '';\n return key.startsWith(LOCAL_EDITOR_PROJECT_MODEL_THUMBNAIL_PATH_CACHE_PREFIX);\n });\n const deleted = await Promise.all(requests.map(request => cache.delete(request)));\n if (deleted.every(Boolean)) return;\n errors.push(new Error('project_model_thumbnail_cache_delete_failed'));\n } catch (error) {\n errors.push(error);\n }\n }\n const error = new Error('Project model thumbnail path cache cleanup failed.') as Error & { errors: unknown[] };\n error.errors = errors;\n throw error;\n });\n pathCacheMutation = clear.catch(() => undefined);\n try {\n await clear;\n } finally {\n revokePathObjectUrls();\n }\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n generation += 1;\n pathGeneration += 1;\n for (const objectUrl of objectUrls.values()) URL.revokeObjectURL(objectUrl);\n objectUrls.clear();\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EditorToolPresentation } from '@fps-games/editor-core/tools';
|
|
2
|
+
export interface LocalEditorToolButtonSynchronizationInput {
|
|
3
|
+
document: Document;
|
|
4
|
+
group: HTMLElement;
|
|
5
|
+
buttons: Map<string, HTMLButtonElement>;
|
|
6
|
+
presentations: readonly EditorToolPresentation[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Reconciles the renderer-neutral Tool presentation snapshot into keyed native
|
|
10
|
+
* buttons. Existing nodes remain stable so a Tool publish does not rebuild the
|
|
11
|
+
* toolbar or disturb focus/tooltip ownership.
|
|
12
|
+
*/
|
|
13
|
+
export declare function synchronizeLocalEditorToolButtons(input: LocalEditorToolButtonSynchronizationInput): void;
|
|
14
|
+
//# sourceMappingURL=local-editor-tool-presentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-editor-tool-presentation.d.ts","sourceRoot":"","sources":["../src/local-editor-tool-presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAI3E,MAAM,WAAW,yCAAyC;IACxD,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACxC,aAAa,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAClD;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,yCAAyC,GAC/C,IAAI,CAgCN"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { isLocalEditorIconName } from './local-editor-ui-icons.js';
|
|
2
|
+
import * as LocalEditorShared from './local-editor-ui-shared.js';
|
|
3
|
+
/**
|
|
4
|
+
* Reconciles the renderer-neutral Tool presentation snapshot into keyed native
|
|
5
|
+
* buttons. Existing nodes remain stable so a Tool publish does not rebuild the
|
|
6
|
+
* toolbar or disturb focus/tooltip ownership.
|
|
7
|
+
*/
|
|
8
|
+
export function synchronizeLocalEditorToolButtons(input) {
|
|
9
|
+
const primaryTools = input.presentations.filter(tool => tool.kind === 'primary');
|
|
10
|
+
const nextIds = new Set(primaryTools.map(tool => tool.id));
|
|
11
|
+
for (const [toolId, button] of input.buttons) {
|
|
12
|
+
if (nextIds.has(toolId))
|
|
13
|
+
continue;
|
|
14
|
+
button.remove();
|
|
15
|
+
input.buttons.delete(toolId);
|
|
16
|
+
}
|
|
17
|
+
for (const tool of primaryTools) {
|
|
18
|
+
let button = input.buttons.get(tool.id);
|
|
19
|
+
const tooltip = tool.shortcut ? `${tool.label}工具 (${tool.shortcut})` : `${tool.label}工具`;
|
|
20
|
+
if (!button) {
|
|
21
|
+
button = LocalEditorShared.createButton(input.document, tool.label, {
|
|
22
|
+
icon: tool.icon && isLocalEditorIconName(tool.icon) ? tool.icon : 'object',
|
|
23
|
+
labelMode: 'icon-only',
|
|
24
|
+
variant: 'toolbar-icon',
|
|
25
|
+
tooltip,
|
|
26
|
+
ariaLabel: tooltip,
|
|
27
|
+
});
|
|
28
|
+
button.dataset.editorToolId = tool.id;
|
|
29
|
+
input.buttons.set(tool.id, button);
|
|
30
|
+
}
|
|
31
|
+
const resolvedTooltip = tool.availability.state === 'enabled'
|
|
32
|
+
? tooltip
|
|
33
|
+
: `${tooltip} · ${tool.availability.reason}`;
|
|
34
|
+
button.dataset.editorTooltip = resolvedTooltip;
|
|
35
|
+
button.setAttribute('aria-label', resolvedTooltip);
|
|
36
|
+
button.style.display = tool.availability.state === 'hidden' ? 'none' : 'inline-flex';
|
|
37
|
+
button.disabled = tool.availability.state !== 'enabled';
|
|
38
|
+
LocalEditorShared.applyButtonActiveState(button, tool.active);
|
|
39
|
+
input.group.appendChild(button);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=local-editor-tool-presentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-editor-tool-presentation.js","sourceRoot":"","sources":["../src/local-editor-tool-presentation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAS9D;;;;GAIG;AACH,MAAM,UAAU,iCAAiC,CAC/C,KAAgD;IAEhD,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS;QAClC,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;QACzF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE;gBAClE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAC1E,SAAS,EAAE,WAAW;gBACtB,OAAO,EAAE,cAAc;gBACvB,OAAO;gBACP,SAAS,EAAE,OAAO;aACnB,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK,SAAS;YAC3D,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,GAAG,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,eAAe,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;QACrF,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK,SAAS,CAAC;QACxD,iBAAiB,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9D,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;AACH,CAAC","sourcesContent":["import type { EditorToolPresentation } from '@fps-games/editor-core/tools';\nimport { isLocalEditorIconName } from './local-editor-ui-icons';\nimport * as LocalEditorShared from './local-editor-ui-shared';\n\nexport interface LocalEditorToolButtonSynchronizationInput {\n document: Document;\n group: HTMLElement;\n buttons: Map<string, HTMLButtonElement>;\n presentations: readonly EditorToolPresentation[];\n}\n\n/**\n * Reconciles the renderer-neutral Tool presentation snapshot into keyed native\n * buttons. Existing nodes remain stable so a Tool publish does not rebuild the\n * toolbar or disturb focus/tooltip ownership.\n */\nexport function synchronizeLocalEditorToolButtons(\n input: LocalEditorToolButtonSynchronizationInput,\n): void {\n const primaryTools = input.presentations.filter(tool => tool.kind === 'primary');\n const nextIds = new Set(primaryTools.map(tool => tool.id));\n for (const [toolId, button] of input.buttons) {\n if (nextIds.has(toolId)) continue;\n button.remove();\n input.buttons.delete(toolId);\n }\n for (const tool of primaryTools) {\n let button = input.buttons.get(tool.id);\n const tooltip = tool.shortcut ? `${tool.label}工具 (${tool.shortcut})` : `${tool.label}工具`;\n if (!button) {\n button = LocalEditorShared.createButton(input.document, tool.label, {\n icon: tool.icon && isLocalEditorIconName(tool.icon) ? tool.icon : 'object',\n labelMode: 'icon-only',\n variant: 'toolbar-icon',\n tooltip,\n ariaLabel: tooltip,\n });\n button.dataset.editorToolId = tool.id;\n input.buttons.set(tool.id, button);\n }\n const resolvedTooltip = tool.availability.state === 'enabled'\n ? tooltip\n : `${tooltip} · ${tool.availability.reason}`;\n button.dataset.editorTooltip = resolvedTooltip;\n button.setAttribute('aria-label', resolvedTooltip);\n button.style.display = tool.availability.state === 'hidden' ? 'none' : 'inline-flex';\n button.disabled = tool.availability.state !== 'enabled';\n LocalEditorShared.applyButtonActiveState(button, tool.active);\n input.group.appendChild(button);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-editor-ui-asset-kind.d.ts","sourceRoot":"","sources":["../src/local-editor-ui-asset-kind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,6BAA6B,EAC9B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,mCAAmC,GAC3C,OAAO,GACP,QAAQ,GACR,UAAU,GACV,SAAS,GACT,OAAO,GACP,SAAS,CAAC;AAEd,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,6BAA6B,GACnC,mCAAmC,CAWrC;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,0BAA0B,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"local-editor-ui-asset-kind.d.ts","sourceRoot":"","sources":["../src/local-editor-ui-asset-kind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,6BAA6B,EAC9B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,mCAAmC,GAC3C,OAAO,GACP,QAAQ,GACR,UAAU,GACV,SAAS,GACT,OAAO,GACP,SAAS,CAAC;AAEd,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,6BAA6B,GACnC,mCAAmC,CAWrC;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAO5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-editor-ui-asset-kind.js","sourceRoot":"","sources":["../src/local-editor-ui-asset-kind.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,kCAAkC,CAChD,KAAoC;IAEpC,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxD,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9D,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAC5I,IAAI,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,UAAU,CAAC;IACvG,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACnJ,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IACpH,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC/F,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,KAAoC;IAEpC,MAAM,IAAI,GAAG,kCAAkC,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAC1C,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import type {\n LocalEditorAssetBrowserTab,\n LocalEditorBrowserUiAssetItem,\n} from './local-editor-ui-types';\n\nexport type LocalEditorBrowserResolvedAssetKind =\n | 'model'\n | 'prefab'\n | 'material'\n | 'texture'\n | 'sound'\n | 'unknown';\n\nexport function resolveLocalEditorBrowserAssetKind(\n asset: LocalEditorBrowserUiAssetItem,\n): LocalEditorBrowserResolvedAssetKind {\n const kind = `${asset.kind ?? ''}`.trim().toLowerCase();\n const id = `${asset.id ?? ''}`.trim().toLowerCase();\n const assetId = `${asset.assetId ?? ''}`.trim().toLowerCase();\n if (kind === 'prefab' || kind === 'prefabs' || id.startsWith('prefab:') || assetId.startsWith('prefab:') || !!asset.prefab) return 'prefab';\n if (kind === 'material' || id.startsWith('material:') || assetId.startsWith('mat_')) return 'material';\n if (kind === 'texture' || kind === 'image' || kind === 'textures' || id.startsWith('texture:') || assetId.startsWith('texture_')) return 'texture';\n if (kind === 'sound' || kind === 'audio' || id.startsWith('sound:') || assetId.startsWith('sound_')) return 'sound';\n if (kind === 'model' || kind === 'glb' || kind === 'gltf' || kind === 'models') return 'model';\n if (kind) return 'unknown';\n return 'model';\n}\n\nexport function resolveLocalEditorAssetBrowserTab(\n asset: LocalEditorBrowserUiAssetItem,\n): Exclude<LocalEditorAssetBrowserTab, 'all'> {\n const kind = resolveLocalEditorBrowserAssetKind(asset);\n if (kind === 'material') return 'materials';\n if (kind === 'prefab') return 'prefabs';\n if (kind === 'texture') return 'textures';\n return 'models';\n}\n"]}
|
|
1
|
+
{"version":3,"file":"local-editor-ui-asset-kind.js","sourceRoot":"","sources":["../src/local-editor-ui-asset-kind.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,kCAAkC,CAChD,KAAoC;IAEpC,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxD,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9D,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAC5I,IAAI,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,UAAU,CAAC;IACvG,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACnJ,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IACpH,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC/F,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,KAAoC;IAEpC,MAAM,IAAI,GAAG,kCAAkC,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAC1C,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACrC,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import type {\n LocalEditorAssetBrowserTab,\n LocalEditorBrowserUiAssetItem,\n} from './local-editor-ui-types';\n\nexport type LocalEditorBrowserResolvedAssetKind =\n | 'model'\n | 'prefab'\n | 'material'\n | 'texture'\n | 'sound'\n | 'unknown';\n\nexport function resolveLocalEditorBrowserAssetKind(\n asset: LocalEditorBrowserUiAssetItem,\n): LocalEditorBrowserResolvedAssetKind {\n const kind = `${asset.kind ?? ''}`.trim().toLowerCase();\n const id = `${asset.id ?? ''}`.trim().toLowerCase();\n const assetId = `${asset.assetId ?? ''}`.trim().toLowerCase();\n if (kind === 'prefab' || kind === 'prefabs' || id.startsWith('prefab:') || assetId.startsWith('prefab:') || !!asset.prefab) return 'prefab';\n if (kind === 'material' || id.startsWith('material:') || assetId.startsWith('mat_')) return 'material';\n if (kind === 'texture' || kind === 'image' || kind === 'textures' || id.startsWith('texture:') || assetId.startsWith('texture_')) return 'texture';\n if (kind === 'sound' || kind === 'audio' || id.startsWith('sound:') || assetId.startsWith('sound_')) return 'sound';\n if (kind === 'model' || kind === 'glb' || kind === 'gltf' || kind === 'models') return 'model';\n if (kind) return 'unknown';\n return 'model';\n}\n\nexport function resolveLocalEditorAssetBrowserTab(\n asset: LocalEditorBrowserUiAssetItem,\n): Exclude<LocalEditorAssetBrowserTab, 'all'> {\n const kind = resolveLocalEditorBrowserAssetKind(asset);\n if (kind === 'material') return 'materials';\n if (kind === 'prefab') return 'prefabs';\n if (kind === 'texture') return 'textures';\n if (kind === 'sound') return 'audio';\n return 'models';\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { LocalEditorBrowserUiState } from './local-editor-ui-types';
|
|
2
|
+
export type LocalEditorConsoleSeverity = 'info' | 'warning' | 'error';
|
|
3
|
+
export type LocalEditorConsoleSource = 'editor' | 'save' | 'import' | 'compile' | 'run' | 'plugin' | 'capability';
|
|
4
|
+
export interface LocalEditorConsoleEntry {
|
|
5
|
+
id: number;
|
|
6
|
+
timestamp: Date;
|
|
7
|
+
severity: LocalEditorConsoleSeverity;
|
|
8
|
+
source: LocalEditorConsoleSource;
|
|
9
|
+
message: string;
|
|
10
|
+
details?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface LocalEditorConsoleController {
|
|
13
|
+
append(entry: Omit<LocalEditorConsoleEntry, 'id' | 'timestamp'> & {
|
|
14
|
+
timestamp?: Date;
|
|
15
|
+
}): void;
|
|
16
|
+
syncState<TDocument>(state: LocalEditorBrowserUiState<TDocument>, previousState?: LocalEditorBrowserUiState<TDocument> | null): void;
|
|
17
|
+
dispose(): void;
|
|
18
|
+
}
|
|
19
|
+
export interface LocalEditorConsoleControllerOptions {
|
|
20
|
+
isCollapsed(): boolean;
|
|
21
|
+
onCollapsedChange(collapsed: boolean): void;
|
|
22
|
+
maxEntries?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function createLocalEditorConsoleController(doc: Document, host: HTMLElement, options: LocalEditorConsoleControllerOptions): LocalEditorConsoleController;
|
|
25
|
+
export declare function formatLocalEditorConsoleEntry(entry: LocalEditorConsoleEntry): string;
|
|
26
|
+
export declare function formatLocalEditorConsoleEntries(entries: readonly LocalEditorConsoleEntry[]): string;
|
|
27
|
+
//# sourceMappingURL=local-editor-ui-console.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-editor-ui-console.d.ts","sourceRoot":"","sources":["../src/local-editor-ui-console.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AACtE,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,YAAY,CAAC;AAGlH,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,0BAA0B,CAAC;IACrC,MAAM,EAAE,wBAAwB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9F,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,yBAAyB,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACrI,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mCAAmC;IAClD,WAAW,IAAI,OAAO,CAAC;IACvB,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AASD,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,mCAAmC,GAC3C,4BAA4B,CAoL9B;AAoFD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAMpF;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,GAAG,MAAM,CAEnG"}
|