@babylonjs/inspector 8.48.1-preview → 8.48.1

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/package.json CHANGED
@@ -1,44 +1,60 @@
1
1
  {
2
2
  "name": "@babylonjs/inspector",
3
- "version": "8.48.1-preview",
4
- "type": "module",
5
- "main": "lib/index.js",
6
- "module": "lib/index.js",
7
- "esnext": "lib/index.js",
8
- "types": "lib/index.d.ts",
3
+ "version": "8.48.1",
4
+ "module": "dist/babylon.inspector.bundle.js",
5
+ "main": "dist/babylon.inspector.bundle.js",
6
+ "esnext": "dist/babylon.inspector.bundle.js",
7
+ "typings": "dist/babylon.inspector.module.d.ts",
9
8
  "files": [
10
- "lib/**/*.js",
11
- "lib/**/*.d.ts",
12
- "lib/**/*.map",
9
+ "dist/**/*.*",
13
10
  "readme.md",
14
11
  "license.md"
15
12
  ],
13
+ "scripts": {
14
+ "build": "npm run clean && npm run build:prod && npm run build:declaration",
15
+ "build:dev": "webpack --env development",
16
+ "build:prod": "webpack --env production",
17
+ "build:declaration": "build-tools -c pud --config ./config.json",
18
+ "clean": "rimraf dist"
19
+ },
20
+ "dependencies": {
21
+ "@fortawesome/fontawesome-svg-core": "^6.1.0",
22
+ "@fortawesome/free-regular-svg-icons": "^6.0.0",
23
+ "@fortawesome/free-solid-svg-icons": "^6.0.0"
24
+ },
16
25
  "peerDependencies": {
17
- "@babylonjs/addons": "^8.0.0",
18
- "@babylonjs/core": "^8.0.0",
19
- "@babylonjs/gui": "^8.0.0",
20
- "@babylonjs/gui-editor": "^8.0.0",
21
- "@babylonjs/loaders": "^8.0.0",
22
- "@babylonjs/materials": "^8.0.0",
23
- "@babylonjs/serializers": "^8.0.0",
24
- "@fluentui-contrib/react-virtualizer": "^0.5.3",
25
- "@fluentui/react-components": "^9.70.0",
26
- "@fluentui/react-icons": "^2.0.310",
27
- "react": ">=16.14.0 <20.0.0",
28
- "react-dom": ">=16.14.0 <20.0.0",
29
- "usehooks-ts": "^3.1.1"
26
+ "@babylonjs/addons": "^8.0.0 || ^9.0.0",
27
+ "@babylonjs/core": "^8.0.0 || ^9.0.0",
28
+ "@babylonjs/gui": "^8.0.0 || ^9.0.0",
29
+ "@babylonjs/gui-editor": "^8.0.0 || ^9.0.0",
30
+ "@babylonjs/loaders": "^8.0.0 || ^9.0.0",
31
+ "@babylonjs/materials": "^8.0.0 || ^9.0.0",
32
+ "@babylonjs/serializers": "^8.0.0 || ^9.0.0",
33
+ "@types/react": ">=16.7.3",
34
+ "@types/react-dom": ">=16.0.9"
35
+ },
36
+ "devDependencies": {
37
+ "@babylonjs/addons": "8.48.1",
38
+ "@babylonjs/core": "8.48.1",
39
+ "@babylonjs/gui": "8.48.1",
40
+ "@babylonjs/gui-editor": "8.48.1",
41
+ "@babylonjs/loaders": "8.48.1",
42
+ "@babylonjs/materials": "8.48.1",
43
+ "@babylonjs/serializers": "8.48.1",
44
+ "@dev/inspector": "1.0.0",
45
+ "@lts/gui": "1.0.0",
46
+ "react": "^18.2.0",
47
+ "react-dom": "^18.2.0"
30
48
  },
31
49
  "keywords": [
32
50
  "3D",
33
51
  "javascript",
34
52
  "html5",
35
53
  "webgl",
36
- "babylon.js",
37
- "inspector",
38
- "diagnostic",
39
- "debug"
54
+ "babylon.js"
40
55
  ],
41
56
  "license": "Apache-2.0",
57
+ "sideEffects": true,
42
58
  "homepage": "https://www.babylonjs.com",
43
59
  "repository": {
44
60
  "type": "git",
package/readme.md CHANGED
@@ -1,23 +1,26 @@
1
- # BabylonJS Inspector
1
+ # Babylon.js inspector module
2
2
 
3
- The Babylon Inspector is a diagnostic tool that makes it possible to view and edit the scene graph, properties of entities within the scene, and more.
3
+ For usage documentation please visit https://doc.babylonjs.com/how_to/debug_layer.
4
4
 
5
- You can learn more in the Inspector [documentation](https://doc.babylonjs.com/toolsAndResources/inspectorv2/).
5
+ # Installation instructions
6
6
 
7
- ## Installation
7
+ To install using npm :
8
8
 
9
- Install the package using npm:
10
-
11
- ```bash
12
- npm install @babylonjs/inspector@preview
9
+ ```shell
10
+ npm install @babylonjs/core @babylonjs/inspector
13
11
  ```
14
12
 
15
- The simplest way to use `Inspector` is to call the `ShowInspector` function, passing in your scene:
16
-
17
- ```ts
18
- import { ShowInspector } from "@babylonjs/inspector";
13
+ # How to use
19
14
 
20
- // Your code that sets up a Babylon.js scene...
15
+ Afterwards it can be imported to your project using:
21
16
 
22
- ShowInspector(scene);
17
+ ```javascript
18
+ import "@babylonjs/core/Debug/debugLayer";
19
+ import "@babylonjs/inspector";
23
20
  ```
21
+
22
+ The first line will ensure you can access the property debugLayer of the scene while the second will ensure the inspector can be used within your scene.
23
+
24
+ This is a great example where code splitting or conditional loading could be used to ensure you are not delivering the inspector if not part of your final app.
25
+
26
+ For more information you can have a look at our [ES6 dedicated documentation](https://doc.babylonjs.com/features/es6_support).
@@ -1,367 +0,0 @@
1
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
- import { makeStyles, Dialog, DialogTrigger, Tooltip, Button, DialogSurface, DialogBody, DialogTitle, TabList, Tab, DialogContent, Accordion, tokens, AccordionItem, AccordionHeader, Body1Strong, PresenceBadge, AccordionPanel, Card, CardHeader, Caption1, Body1, CardPreview, Persona, AvatarGroup, AvatarGroupItem, CardFooter, Spinner, Popover, PopoverTrigger, PopoverSurface } from '@fluentui/react-components';
3
- import { AppsAddInRegular, DismissRegular, LinkRegular, BranchForkRegular, BugRegular, ArrowDownloadRegular, DeleteRegular, MailRegular, PeopleCommunityRegular } from '@fluentui/react-icons';
4
- import { Fade } from '@fluentui/react-motion-components-preview';
5
- import { useState, useEffect, memo, useMemo, useCallback } from 'react';
6
- import { Logger } from '@babylonjs/core/Misc/logger.js';
7
- import { a as ShellServiceIdentity, g as useExtensionManager, h as MakePopoverTeachingMoment, i as TeachingMoment, L as Link } from './index-D3l4X8Gw.js';
8
- import '@babylonjs/core/Maths/math.color.js';
9
- import '@babylonjs/core/Maths/math.vector.js';
10
- import '@babylonjs/core/Misc/observable.js';
11
- import '@babylonjs/core/Misc/typeStore.js';
12
- import 'usehooks-ts';
13
- import '@babylonjs/core/Misc/asyncLock.js';
14
- import '@babylonjs/core/Misc/deferred.js';
15
- import '@babylonjs/core/Maths/math.scalar.functions.js';
16
- import '@fluentui-contrib/react-virtualizer';
17
- import '@babylonjs/addons/msdfText/fontAsset.js';
18
- import '@babylonjs/addons/msdfText/textRenderer.js';
19
- import '@babylonjs/core/Debug/physicsViewer.js';
20
- import '@babylonjs/core/Materials/Textures/texture.js';
21
- import '@babylonjs/core/Materials/materialFlags.js';
22
- import '@babylonjs/core/Materials/standardMaterial.js';
23
- import '@babylonjs/core/Meshes/Builders/groundBuilder.js';
24
- import '@babylonjs/core/Misc/tools.js';
25
- import '@babylonjs/core/Rendering/utilityLayerRenderer.js';
26
- import '@babylonjs/materials/grid/gridMaterial.js';
27
- import '@babylonjs/core/Misc/dataStorage.js';
28
- import '@babylonjs/core/Instrumentation/engineInstrumentation.js';
29
- import '@babylonjs/core/Instrumentation/sceneInstrumentation.js';
30
- import '@babylonjs/core/Engines/AbstractEngine/abstractEngine.timeQuery.js';
31
- import '@babylonjs/core/Engines/Extensions/engine.query.js';
32
- import '@babylonjs/core/Engines/WebGPU/Extensions/engine.query.js';
33
- import '@babylonjs/core/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js';
34
- import '@babylonjs/core/Misc/PerformanceViewer/performanceViewerSceneExtension.js';
35
- import '@babylonjs/core/Misc/pressureObserverWrapper.js';
36
- import '@babylonjs/core/Maths/math.scalar.js';
37
- import '@babylonjs/core/Misc/PerformanceViewer/performanceViewerCollector.js';
38
- import '@babylonjs/core/Engines/abstractEngine.js';
39
- import 'react-dom/client';
40
- import '@babylonjs/core/FrameGraph/frameGraphUtils.js';
41
- import '@babylonjs/core/Gizmos/cameraGizmo.js';
42
- import '@babylonjs/core/Gizmos/lightGizmo.js';
43
- import '@babylonjs/core/Bones/bone.js';
44
- import '@babylonjs/core/Cameras/camera.js';
45
- import '@babylonjs/core/Gizmos/gizmoManager.js';
46
- import '@babylonjs/core/Lights/light.js';
47
- import '@babylonjs/core/Meshes/abstractMesh.js';
48
- import '@babylonjs/core/node.js';
49
- import '@babylonjs/core/Animations/animationGroup.js';
50
- import '@babylonjs/core/Animations/animation.js';
51
- import '@babylonjs/core/Animations/animationPropertiesOverride.js';
52
- import '@babylonjs/addons/atmosphere/atmosphere.js';
53
- import '@babylonjs/core/Cameras/arcRotateCamera.js';
54
- import '@babylonjs/core/Cameras/followCamera.js';
55
- import '@babylonjs/core/Cameras/freeCamera.js';
56
- import '@babylonjs/core/Cameras/geospatialCamera.js';
57
- import '@babylonjs/core/Cameras/targetCamera.js';
58
- import '@babylonjs/core/scene.js';
59
- import '@babylonjs/core/FrameGraph/frameGraph.js';
60
- import '@babylonjs/core/Lights/directionalLight.js';
61
- import '@babylonjs/core/Lights/hemisphericLight.js';
62
- import '@babylonjs/core/Lights/pointLight.js';
63
- import '@babylonjs/core/Lights/rectAreaLight.js';
64
- import '@babylonjs/core/Lights/shadowLight.js';
65
- import '@babylonjs/core/Lights/spotLight.js';
66
- import '@babylonjs/core/Lights/Shadows/cascadedShadowGenerator.js';
67
- import '@babylonjs/core/Debug/directionalLightFrustumViewer.js';
68
- import '@babylonjs/core/Lights/Shadows/shadowGenerator.js';
69
- import '@babylonjs/core/Lights/Shadows/shadowGeneratorSceneComponent.js';
70
- import '@babylonjs/core/Materials/material.js';
71
- import '@babylonjs/core/Materials/multiMaterial.js';
72
- import '@babylonjs/core/Materials/Node/nodeMaterial.js';
73
- import '@babylonjs/core/Materials/PBR/openpbrMaterial.js';
74
- import '@babylonjs/core/Materials/PBR/pbrBaseMaterial.js';
75
- import '@babylonjs/materials/sky/skyMaterial.js';
76
- import '@babylonjs/core/Engines/constants.js';
77
- import '@babylonjs/core/Engines/engine.js';
78
- import '@babylonjs/core/Particles/particleSystem.js';
79
- import '@babylonjs/core/Materials/Node/Blocks/gradientBlock.js';
80
- import '@babylonjs/core/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes.js';
81
- import '@babylonjs/core/Misc/gradients.js';
82
- import '@babylonjs/core/Misc/fileTools.js';
83
- import '@babylonjs/core/Materials/Textures/cubeTexture.js';
84
- import '@babylonjs/core/Meshes/GaussianSplatting/gaussianSplattingMesh.js';
85
- import '@babylonjs/core/Meshes/mesh.js';
86
- import '@babylonjs/core/Debug/skeletonViewer.js';
87
- import '@babylonjs/core/Meshes/buffer.js';
88
- import '@babylonjs/core/Meshes/Builders/linesBuilder.js';
89
- import '@babylonjs/core/Meshes/instancedMesh.js';
90
- import '@babylonjs/core/Rendering/renderingManager.js';
91
- import '@babylonjs/core/Rendering/edgesRenderer.js';
92
- import '@babylonjs/core/Rendering/outlineRenderer.js';
93
- import '@babylonjs/core/Particles/gpuParticleSystem.js';
94
- import '@babylonjs/core/Particles/Node/nodeParticleSystemSet.helper.js';
95
- import '@babylonjs/core/Particles/particleHelper.js';
96
- import '@babylonjs/core/Particles/EmitterTypes/boxParticleEmitter.js';
97
- import '@babylonjs/core/Particles/EmitterTypes/coneParticleEmitter.js';
98
- import '@babylonjs/core/Particles/EmitterTypes/cylinderParticleEmitter.js';
99
- import '@babylonjs/core/Particles/EmitterTypes/hemisphericParticleEmitter.js';
100
- import '@babylonjs/core/Particles/EmitterTypes/meshParticleEmitter.js';
101
- import '@babylonjs/core/Particles/EmitterTypes/pointParticleEmitter.js';
102
- import '@babylonjs/core/Particles/EmitterTypes/sphereParticleEmitter.js';
103
- import '@babylonjs/core/Particles/attractor.js';
104
- import '@babylonjs/core/Meshes/Builders/sphereBuilder.js';
105
- import '@babylonjs/core/Particles/Node/Blocks/particleInputBlock.js';
106
- import '@babylonjs/core/Particles/Node/Blocks/Update/updateAttractorBlock.js';
107
- import '@babylonjs/core/Particles/Node/Enums/nodeParticleBlockConnectionPointTypes.js';
108
- import '@babylonjs/core/Meshes/transformNode.js';
109
- import '@babylonjs/core/Physics/v2/IPhysicsEnginePlugin.js';
110
- import '@babylonjs/core/Physics/v2/physicsEngineComponent.js';
111
- import '@babylonjs/core/PostProcesses/postProcess.js';
112
- import '@babylonjs/core/PostProcesses/RenderPipeline/postProcessRenderPipeline.js';
113
- import '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js';
114
- import '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js';
115
- import '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js';
116
- import '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js';
117
- import '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js';
118
- import '@babylonjs/core/Rendering/IBLShadows/iblShadowsRenderPipeline.js';
119
- import '@babylonjs/core/Materials/imageProcessingConfiguration.js';
120
- import '@babylonjs/core/Bones/skeleton.js';
121
- import '@babylonjs/core/Sprites/sprite.js';
122
- import '@babylonjs/core/Sprites/spriteManager.js';
123
- import '@babylonjs/core/Misc/textureTools.js';
124
- import '@babylonjs/core/Materials/Textures/baseTexture.js';
125
- import '@babylonjs/core/Materials/Textures/multiRenderTarget.js';
126
- import '@babylonjs/core/Materials/Textures/renderTargetTexture.js';
127
- import '@babylonjs/core/Materials/Textures/thinTexture.js';
128
- import '@babylonjs/core/Events/keyboardEvents.js';
129
- import '@babylonjs/core/Events/pointerEvents.js';
130
- import '@babylonjs/core/Materials/Textures/htmlElementTexture.js';
131
- import '@babylonjs/core/Materials/shaderMaterial.js';
132
- import '@babylonjs/core/Meshes/Builders/planeBuilder.js';
133
- import '@babylonjs/core/Lights/Clustered/clusteredLightContainer.js';
134
- import '@babylonjs/core/Rendering/boundingBoxRenderer.js';
135
- import '@babylonjs/core/PostProcesses/RenderPipeline/postProcessRenderPipelineManagerSceneComponent.js';
136
- import '@babylonjs/core/Sprites/spriteSceneComponent.js';
137
- import '@babylonjs/core/Materials/Textures/dynamicTexture.js';
138
- import '@babylonjs/core/Misc/equirectangularCapture.js';
139
- import '@babylonjs/core/Misc/sceneRecorder.js';
140
- import '@babylonjs/core/Misc/screenshotTools.js';
141
- import '@babylonjs/core/Misc/videoRecorder.js';
142
- import '@babylonjs/core/Misc/sceneSerializer.js';
143
- import '@babylonjs/core/Misc/environmentTextureTools.js';
144
- import '@babylonjs/core/Loading/sceneLoader.js';
145
- import '@babylonjs/core/Misc/filesInput.js';
146
- import '@babylonjs/loaders/glTF/glTFFileLoader.js';
147
- import '@babylonjs/loaders/glTF/glTFValidation.js';
148
- import '@babylonjs/core/Engines/engineStore.js';
149
- import '@babylonjs/core/Misc/uniqueIdGenerator.js';
150
- import '@babylonjs/core/Debug/debugLayer.js';
151
- import '@babylonjs/core/Misc/lazy.js';
152
-
153
- const useStyles = makeStyles({
154
- extensionButton: {},
155
- extensionsDialogSurface: {
156
- height: "auto",
157
- width: "70vw",
158
- maxWidth: "600px",
159
- maxHeight: "70vh",
160
- backgroundColor: tokens.colorNeutralBackground2,
161
- },
162
- extensionDialogBody: {
163
- maxWidth: "100%",
164
- maxHeight: "100%",
165
- },
166
- extensionDialogContent: {
167
- marginLeft: `calc(-1 * ${tokens.spacingHorizontalM})`,
168
- marginRight: `calc(-1 * ${tokens.spacingHorizontalS})`,
169
- },
170
- extensionHeader: {},
171
- extensionItem: {},
172
- extensionCardPreview: {
173
- padding: `${tokens.spacingVerticalM} ${tokens.spacingHorizontalM}`,
174
- display: "flex",
175
- flexDirection: "column",
176
- rowGap: tokens.spacingVerticalL,
177
- },
178
- extensionIntro: {
179
- display: "flex",
180
- alignItems: "center",
181
- columnGap: tokens.spacingHorizontalM,
182
- },
183
- extensionDescription: {
184
- display: "flex",
185
- flexDirection: "row",
186
- columnGap: tokens.spacingHorizontalS,
187
- },
188
- extensionButtonContainer: {
189
- marginLeft: "auto",
190
- alignSelf: "flex-start",
191
- },
192
- spinner: {
193
- animationDuration: "1s",
194
- animationName: {
195
- from: { opacity: 0 },
196
- to: { opacity: 1 },
197
- },
198
- },
199
- webResourceDiv: {
200
- display: "flex",
201
- flexDirection: "column",
202
- },
203
- webResourceLink: {
204
- display: "flex",
205
- flexDirection: "row",
206
- columnGap: tokens.spacingHorizontalS,
207
- alignItems: "center",
208
- },
209
- personPopoverSurfaceDiv: {
210
- display: "flex",
211
- flexDirection: "column",
212
- rowGap: tokens.spacingVerticalS,
213
- },
214
- accordionHeaderDiv: {
215
- display: "flex",
216
- flexDirection: "row",
217
- columnGap: tokens.spacingHorizontalS,
218
- alignItems: "center",
219
- },
220
- resourceDetailsDiv: {
221
- display: "flex",
222
- flexDirection: "column",
223
- rowGap: tokens.spacingVerticalS,
224
- },
225
- peopleDetailsDiv: {
226
- display: "flex",
227
- flexDirection: "row",
228
- columnGap: tokens.spacingHorizontalXL,
229
- },
230
- avatarGroupItem: {
231
- cursor: "pointer",
232
- },
233
- });
234
- function AsPersonMetadata(person) {
235
- if (typeof person === "string") {
236
- return { name: person };
237
- }
238
- return person;
239
- }
240
- function usePeopleMetadata(people) {
241
- const definedPeople = useMemo(() => (people ? people.filter((person) => !!person) : []), [people]);
242
- //const [peopleMetadataEx, setPeopleMetadataEx] = useState<(PersonMetadata & { avatarUrl?: string })[]>(definedPeople.map(AsPersonMetadata));
243
- const [peopleMetadataEx] = useState(definedPeople.map(AsPersonMetadata));
244
- // TODO: Would be nice if we could pull author/contributor profile pictures from the forum, but need to see if this is ok and whether we want to adjust CORS to allow it.
245
- // useEffect(() => {
246
- // definedPeople.forEach(async (person, index) => {
247
- // const personMetadata = AsPersonMetadata(person);
248
- // if (personMetadata.forumUserName) {
249
- // try {
250
- // const json = await (await fetch(`https://forum.babylonjs.com/u/${personMetadata.forumUserName}.json`)).json();
251
- // const avatarRelativeUrl = json.user?.avatar_template?.replace("{size}", "96");
252
- // if (avatarRelativeUrl) {
253
- // const avatarUrl = `https://forum.babylonjs.com${avatarRelativeUrl}`;
254
- // setPeopleMetadataEx((prev) => {
255
- // const newMetadata = [...prev];
256
- // newMetadata[index] = { ...personMetadata, avatarUrl };
257
- // return newMetadata;
258
- // });
259
- // }
260
- // } catch {
261
- // // Ignore, non-fatal
262
- // }
263
- // }
264
- // });
265
- // }, [definedPeople]);
266
- return peopleMetadataEx.filter(Boolean);
267
- }
268
- const useTeachingMoment = MakePopoverTeachingMoment("Extensions");
269
- const WebResource = (props) => {
270
- const { url, urlDisplay, icon, label } = props;
271
- const classes = useStyles();
272
- return (jsx("div", { className: classes.webResourceDiv, children: jsx(Tooltip, { content: label, relationship: "label", positioning: "before", withArrow: true, children: jsxs("div", { className: classes.webResourceLink, children: [icon, jsx(Link, { url: url, value: urlDisplay || url })] }) }) }));
273
- };
274
- const PersonDetailsPopover = (props) => {
275
- const { person, title, disabled, children } = props;
276
- const classes = useStyles();
277
- if (disabled) {
278
- return jsx(Fragment, { children: children });
279
- }
280
- return (jsxs(Popover, { withArrow: true, children: [jsx(PopoverTrigger, { disableButtonEnhancement: true, children: children }), jsx(PopoverSurface, { children: jsxs("div", { className: classes.personPopoverSurfaceDiv, children: [jsx(Persona, { name: person.name, secondaryText: title }), person.email && jsx(WebResource, { url: `mailto:${person.email}`, urlDisplay: person.email, icon: jsx(MailRegular, {}), label: "Email" }), person.url && jsx(WebResource, { url: person.url, urlDisplay: person.url, icon: jsx(LinkRegular, {}), label: "Website" }), person.forumUserName && (jsx(WebResource, { url: `https://forum.babylonjs.com/u/${person.forumUserName}`, urlDisplay: person.forumUserName, icon: jsx(PeopleCommunityRegular, {}), label: "Forum" }))] }) })] }));
281
- };
282
- const ExtensionDetails = memo((props) => {
283
- const { extension } = props;
284
- const { metadata } = extension;
285
- const classes = useStyles();
286
- const [canInstall, setCanInstall] = useState(false);
287
- const [canUninstall, setCanUninstall] = useState(false);
288
- const [isStateChanging, setIsStateChanging] = useState(false);
289
- useEffect(() => {
290
- const updateState = () => {
291
- setCanInstall(!extension.isInstalled && !extension.isStateChanging);
292
- setCanUninstall(extension.isInstalled && !extension.isStateChanging);
293
- setIsStateChanging(extension.isStateChanging);
294
- };
295
- const stateChangedHandlerRegistration = extension.addStateChangedHandler(updateState);
296
- updateState();
297
- return stateChangedHandlerRegistration.dispose;
298
- }, [extension]);
299
- const [author] = usePeopleMetadata(useMemo(() => [metadata.author], [metadata.author]));
300
- const contributors = usePeopleMetadata(metadata.contributors);
301
- const hasResourceDetails = metadata.homepage || metadata.repository || metadata.bugs;
302
- const hasPeopleDetails = author || contributors.length > 0;
303
- const hasPreviewDetails = hasResourceDetails || hasPeopleDetails;
304
- const hasAuthorDetails = author?.email || author?.url || author?.forumUserName;
305
- const subHeader = [metadata.version ? `${metadata.version}` : null, metadata.license ? `${metadata.license}` : null].filter(Boolean).join(" | ");
306
- const install = useCallback(async () => {
307
- try {
308
- await extension.installAsync();
309
- }
310
- catch {
311
- // Ignore errors. Other parts of the infrastructure handle them and communicate them to the user.
312
- }
313
- }, [extension]);
314
- const uninstall = useCallback(async () => {
315
- try {
316
- await extension.uninstallAsync();
317
- }
318
- catch {
319
- // Ignore errors. Other parts of the infrastructure handle them and communicate them to the user.
320
- }
321
- }, [extension]);
322
- return (jsxs(AccordionItem, { className: classes.extensionItem, value: extension.metadata.name, children: [jsx(AccordionHeader, { className: classes.extensionHeader, expandIconPosition: "end", children: jsxs("div", { className: classes.accordionHeaderDiv, children: [jsx(Body1Strong, { children: extension.metadata.name }), jsx(Fade, { visible: extension.isInstalled, children: jsx(PresenceBadge, { size: "small" }) })] }) }), jsx(AccordionPanel, { children: jsxs(Card, { children: [jsx(CardHeader, { header: jsx(Body1, { children: metadata.description }), description: jsx(Caption1, { italic: true, children: subHeader }) }), hasPreviewDetails && (jsxs(CardPreview, { className: classes.extensionCardPreview, children: [hasResourceDetails && (jsxs("div", { className: classes.resourceDetailsDiv, style: { display: "flex" }, children: [metadata.homepage && jsx(WebResource, { url: metadata.homepage, icon: jsx(LinkRegular, {}), label: "Website" }), metadata.repository && jsx(WebResource, { url: metadata.repository, icon: jsx(BranchForkRegular, {}), label: "Repository" }), metadata.bugs && jsx(WebResource, { url: metadata.bugs, icon: jsx(BugRegular, {}), label: "Report Issues" })] })), hasPeopleDetails && (jsxs("div", { className: classes.peopleDetailsDiv, style: { display: "flex" }, children: [author && (jsx(PersonDetailsPopover, { person: author, title: "Author", disabled: !hasAuthorDetails, children: jsx(Persona, { name: author.name, secondaryText: "Author", style: { cursor: hasAuthorDetails ? "pointer" : "default" } }) })), contributors.length > 0 && (jsx(AvatarGroup, { layout: "stack", children: contributors.map((contributor) => {
323
- return (jsx(PersonDetailsPopover, { person: contributor, title: "Contributor", children: jsx(AvatarGroupItem, { name: contributor.name, className: classes.avatarGroupItem }) }, contributor.name));
324
- }) }))] }))] })), jsxs(CardFooter, { children: [canInstall && (jsx(Button, { appearance: "primary", size: "small", icon: jsx(ArrowDownloadRegular, {}), onClick: install, children: "Get" })), canUninstall && (jsx(Button, { appearance: "secondary", size: "small", icon: jsx(DeleteRegular, {}), onClick: uninstall, children: "Remove" })), isStateChanging && jsx(Spinner, { className: classes.spinner, size: "extra-small" })] })] }) })] }));
325
- });
326
- const ExtensionListServiceDefinition = {
327
- friendlyName: "ExtensionList",
328
- consumes: [ShellServiceIdentity],
329
- factory: (shellService) => {
330
- const registration = shellService.addToolbarItem({
331
- key: "ExtensionList",
332
- horizontalLocation: "right",
333
- verticalLocation: "top",
334
- suppressTeachingMoment: true,
335
- order: -200,
336
- component: () => {
337
- const classes = useStyles();
338
- const [selectedTab, setSelectedTab] = useState("available");
339
- const extensionManager = useExtensionManager();
340
- const [extensions, setExtensions] = useState([]);
341
- useEffect(() => {
342
- if (extensionManager) {
343
- const populateExtensionsAsync = async () => {
344
- const query = await extensionManager.queryExtensionsAsync(undefined, undefined, selectedTab === "installed");
345
- const extensions = await query.getExtensionsAsync(0, query.totalCount);
346
- setExtensions(extensions);
347
- };
348
- // eslint-disable-next-line github/no-then
349
- populateExtensionsAsync().catch((error) => {
350
- Logger.Warn(`Failed to populate extensions: ${error}`);
351
- });
352
- }
353
- }, [extensionManager, selectedTab]);
354
- const teachingMoment = useTeachingMoment();
355
- return (jsxs(Fragment, { children: [jsx(TeachingMoment, { ...teachingMoment, title: "Extensions", description: "Extensions provide new optional features that can be useful to your specific task or workflow. Click this button to manage extensions." }), jsxs(Dialog, { children: [jsx(DialogTrigger, { disableButtonEnhancement: true, children: jsx(Tooltip, { content: "Manage Extensions", relationship: "label", children: jsx(Button, { ref: teachingMoment.targetRef, className: classes.extensionButton, appearance: "subtle", icon: jsx(AppsAddInRegular, {}) }) }) }), jsx(DialogSurface, { className: classes.extensionsDialogSurface, children: jsxs(DialogBody, { className: classes.extensionDialogBody, children: [jsx(DialogTitle, { action: jsx(DialogTrigger, { action: "close", children: jsx(Button, { appearance: "subtle", "aria-label": "close", icon: jsx(DismissRegular, {}) }) }), children: jsxs(Fragment, { children: ["Extensions", jsxs(TabList, { className: classes.extensionDialogContent, selectedValue: selectedTab, onTabSelect: (event, data) => {
356
- setSelectedTab(data.value);
357
- }, children: [jsx(Tab, { value: "available", children: "Available" }), jsx(Tab, { value: "installed", children: "Installed" })] })] }) }), jsx(DialogContent, { className: classes.extensionDialogContent, children: jsx(Accordion, { collapsible: true, children: extensions.map((extension) => (jsx(ExtensionDetails, { extension: extension }, extension.metadata.name))) }) })] }) })] })] }));
358
- },
359
- });
360
- return {
361
- dispose: () => registration.dispose(),
362
- };
363
- },
364
- };
365
-
366
- export { ExtensionListServiceDefinition };
367
- //# sourceMappingURL=extensionsListService-B4-L1I2C.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extensionsListService-B4-L1I2C.js","sources":["../../../../../../../../dev/inspector-v2/src/services/extensionsListService.tsx"],"sourcesContent":["import type { SelectTabData, SelectTabEvent } from \"@fluentui/react-components\";\r\nimport type { TriggerProps } from \"@fluentui/react-utilities\";\r\nimport type { FunctionComponent } from \"react\";\r\nimport type { PersonMetadata } from \"../extensibility/extensionFeed\";\r\nimport type { IExtension } from \"../extensibility/extensionManager\";\r\nimport type { ServiceDefinition } from \"../modularity/serviceDefinition\";\r\nimport type { IShellService } from \"./shellService\";\r\n\r\nimport {\r\n Accordion,\r\n AccordionHeader,\r\n AccordionItem,\r\n AccordionPanel,\r\n AvatarGroup,\r\n AvatarGroupItem,\r\n Body1,\r\n Body1Strong,\r\n Button,\r\n Caption1,\r\n Card,\r\n CardFooter,\r\n CardHeader,\r\n CardPreview,\r\n Dialog,\r\n DialogBody,\r\n DialogContent,\r\n DialogSurface,\r\n DialogTitle,\r\n DialogTrigger,\r\n makeStyles,\r\n Persona,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n PresenceBadge,\r\n Spinner,\r\n Tab,\r\n TabList,\r\n tokens,\r\n Tooltip,\r\n} from \"@fluentui/react-components\";\r\nimport {\r\n AppsAddInRegular,\r\n ArrowDownloadRegular,\r\n BranchForkRegular,\r\n BugRegular,\r\n DeleteRegular,\r\n DismissRegular,\r\n LinkRegular,\r\n MailRegular,\r\n PeopleCommunityRegular,\r\n} from \"@fluentui/react-icons\";\r\nimport { Fade } from \"@fluentui/react-motion-components-preview\";\r\nimport { memo, useCallback, useEffect, useMemo, useState } from \"react\";\r\n\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\nimport { Link } from \"shared-ui-components/fluent/primitives/link\";\r\nimport { TeachingMoment } from \"../components/teachingMoment\";\r\nimport { useExtensionManager } from \"../contexts/extensionManagerContext\";\r\nimport { MakePopoverTeachingMoment } from \"../hooks/teachingMomentHooks\";\r\nimport { ShellServiceIdentity } from \"./shellService\";\r\n\r\nconst useStyles = makeStyles({\r\n extensionButton: {},\r\n extensionsDialogSurface: {\r\n height: \"auto\",\r\n width: \"70vw\",\r\n maxWidth: \"600px\",\r\n maxHeight: \"70vh\",\r\n backgroundColor: tokens.colorNeutralBackground2,\r\n },\r\n extensionDialogBody: {\r\n maxWidth: \"100%\",\r\n maxHeight: \"100%\",\r\n },\r\n extensionDialogContent: {\r\n marginLeft: `calc(-1 * ${tokens.spacingHorizontalM})`,\r\n marginRight: `calc(-1 * ${tokens.spacingHorizontalS})`,\r\n },\r\n extensionHeader: {},\r\n extensionItem: {},\r\n extensionCardPreview: {\r\n padding: `${tokens.spacingVerticalM} ${tokens.spacingHorizontalM}`,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n rowGap: tokens.spacingVerticalL,\r\n },\r\n extensionIntro: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n columnGap: tokens.spacingHorizontalM,\r\n },\r\n extensionDescription: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n columnGap: tokens.spacingHorizontalS,\r\n },\r\n extensionButtonContainer: {\r\n marginLeft: \"auto\",\r\n alignSelf: \"flex-start\",\r\n },\r\n spinner: {\r\n animationDuration: \"1s\",\r\n animationName: {\r\n from: { opacity: 0 },\r\n to: { opacity: 1 },\r\n },\r\n },\r\n webResourceDiv: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n webResourceLink: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n columnGap: tokens.spacingHorizontalS,\r\n alignItems: \"center\",\r\n },\r\n personPopoverSurfaceDiv: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n rowGap: tokens.spacingVerticalS,\r\n },\r\n accordionHeaderDiv: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n columnGap: tokens.spacingHorizontalS,\r\n alignItems: \"center\",\r\n },\r\n resourceDetailsDiv: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n rowGap: tokens.spacingVerticalS,\r\n },\r\n peopleDetailsDiv: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n columnGap: tokens.spacingHorizontalXL,\r\n },\r\n avatarGroupItem: {\r\n cursor: \"pointer\",\r\n },\r\n});\r\n\r\nfunction AsPersonMetadata(person: string | PersonMetadata): PersonMetadata {\r\n if (typeof person === \"string\") {\r\n return { name: person } satisfies PersonMetadata;\r\n }\r\n return person;\r\n}\r\n\r\nfunction usePeopleMetadata(people?: readonly (string | PersonMetadata | undefined)[]) {\r\n const definedPeople = useMemo(() => (people ? people.filter((person): person is string | PersonMetadata => !!person) : []), [people]);\r\n\r\n //const [peopleMetadataEx, setPeopleMetadataEx] = useState<(PersonMetadata & { avatarUrl?: string })[]>(definedPeople.map(AsPersonMetadata));\r\n const [peopleMetadataEx] = useState(definedPeople.map(AsPersonMetadata));\r\n\r\n // TODO: Would be nice if we could pull author/contributor profile pictures from the forum, but need to see if this is ok and whether we want to adjust CORS to allow it.\r\n // useEffect(() => {\r\n // definedPeople.forEach(async (person, index) => {\r\n // const personMetadata = AsPersonMetadata(person);\r\n // if (personMetadata.forumUserName) {\r\n // try {\r\n // const json = await (await fetch(`https://forum.babylonjs.com/u/${personMetadata.forumUserName}.json`)).json();\r\n // const avatarRelativeUrl = json.user?.avatar_template?.replace(\"{size}\", \"96\");\r\n // if (avatarRelativeUrl) {\r\n // const avatarUrl = `https://forum.babylonjs.com${avatarRelativeUrl}`;\r\n // setPeopleMetadataEx((prev) => {\r\n // const newMetadata = [...prev];\r\n // newMetadata[index] = { ...personMetadata, avatarUrl };\r\n // return newMetadata;\r\n // });\r\n // }\r\n // } catch {\r\n // // Ignore, non-fatal\r\n // }\r\n // }\r\n // });\r\n // }, [definedPeople]);\r\n\r\n return peopleMetadataEx.filter(Boolean);\r\n}\r\n\r\nconst useTeachingMoment = MakePopoverTeachingMoment(\"Extensions\");\r\n\r\nconst WebResource: FunctionComponent<{ url: string; urlDisplay?: string; icon: JSX.Element; label: string }> = (props) => {\r\n const { url, urlDisplay, icon, label } = props;\r\n const classes = useStyles();\r\n\r\n return (\r\n <div className={classes.webResourceDiv}>\r\n <Tooltip content={label} relationship=\"label\" positioning=\"before\" withArrow>\r\n <div className={classes.webResourceLink}>\r\n {icon}\r\n <Link url={url} value={urlDisplay || url} />\r\n </div>\r\n </Tooltip>\r\n </div>\r\n );\r\n};\r\n\r\nconst PersonDetailsPopover: FunctionComponent<TriggerProps & { person: PersonMetadata; title: string; disabled?: boolean }> = (props) => {\r\n const { person, title, disabled, children } = props;\r\n const classes = useStyles();\r\n\r\n if (disabled) {\r\n return <>{children}</>;\r\n }\r\n\r\n return (\r\n <Popover withArrow>\r\n <PopoverTrigger disableButtonEnhancement>{children}</PopoverTrigger>\r\n <PopoverSurface>\r\n <div className={classes.personPopoverSurfaceDiv}>\r\n <Persona name={person.name} secondaryText={title} />\r\n {person.email && <WebResource url={`mailto:${person.email}`} urlDisplay={person.email} icon={<MailRegular />} label=\"Email\" />}\r\n {person.url && <WebResource url={person.url} urlDisplay={person.url} icon={<LinkRegular />} label=\"Website\" />}\r\n {person.forumUserName && (\r\n <WebResource\r\n url={`https://forum.babylonjs.com/u/${person.forumUserName}`}\r\n urlDisplay={person.forumUserName}\r\n icon={<PeopleCommunityRegular />}\r\n label=\"Forum\"\r\n />\r\n )}\r\n </div>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n\r\nconst ExtensionDetails: FunctionComponent<{ extension: IExtension }> = memo((props) => {\r\n const { extension } = props;\r\n const { metadata } = extension;\r\n\r\n const classes = useStyles();\r\n\r\n const [canInstall, setCanInstall] = useState(false);\r\n const [canUninstall, setCanUninstall] = useState(false);\r\n const [isStateChanging, setIsStateChanging] = useState(false);\r\n\r\n useEffect(() => {\r\n const updateState = () => {\r\n setCanInstall(!extension.isInstalled && !extension.isStateChanging);\r\n setCanUninstall(extension.isInstalled && !extension.isStateChanging);\r\n setIsStateChanging(extension.isStateChanging);\r\n };\r\n\r\n const stateChangedHandlerRegistration = extension.addStateChangedHandler(updateState);\r\n updateState();\r\n\r\n return stateChangedHandlerRegistration.dispose;\r\n }, [extension]);\r\n\r\n const [author] = usePeopleMetadata(useMemo(() => [metadata.author], [metadata.author]));\r\n const contributors = usePeopleMetadata(metadata.contributors);\r\n\r\n const hasResourceDetails = metadata.homepage || metadata.repository || metadata.bugs;\r\n const hasPeopleDetails = author || contributors.length > 0;\r\n const hasPreviewDetails = hasResourceDetails || hasPeopleDetails;\r\n const hasAuthorDetails = author?.email || author?.url || author?.forumUserName;\r\n const subHeader = [metadata.version ? `${metadata.version}` : null, metadata.license ? `${metadata.license}` : null].filter(Boolean).join(\" | \");\r\n\r\n const install = useCallback(async () => {\r\n try {\r\n await extension.installAsync();\r\n } catch {\r\n // Ignore errors. Other parts of the infrastructure handle them and communicate them to the user.\r\n }\r\n }, [extension]);\r\n\r\n const uninstall = useCallback(async () => {\r\n try {\r\n await extension.uninstallAsync();\r\n } catch {\r\n // Ignore errors. Other parts of the infrastructure handle them and communicate them to the user.\r\n }\r\n }, [extension]);\r\n\r\n return (\r\n <AccordionItem className={classes.extensionItem} value={extension.metadata.name}>\r\n <AccordionHeader className={classes.extensionHeader} expandIconPosition=\"end\">\r\n <div className={classes.accordionHeaderDiv}>\r\n <Body1Strong>{extension.metadata.name}</Body1Strong>\r\n <Fade visible={extension.isInstalled}>\r\n <PresenceBadge size=\"small\" />\r\n </Fade>\r\n </div>\r\n </AccordionHeader>\r\n <AccordionPanel>\r\n <Card>\r\n <CardHeader header={<Body1>{metadata.description}</Body1>} description={<Caption1 italic>{subHeader}</Caption1>} />\r\n {hasPreviewDetails && (\r\n <CardPreview className={classes.extensionCardPreview}>\r\n {hasResourceDetails && (\r\n <div className={classes.resourceDetailsDiv} style={{ display: \"flex\" }}>\r\n {metadata.homepage && <WebResource url={metadata.homepage} icon={<LinkRegular />} label=\"Website\" />}\r\n {metadata.repository && <WebResource url={metadata.repository} icon={<BranchForkRegular />} label=\"Repository\" />}\r\n {metadata.bugs && <WebResource url={metadata.bugs} icon={<BugRegular />} label=\"Report Issues\" />}\r\n </div>\r\n )}\r\n {hasPeopleDetails && (\r\n <div className={classes.peopleDetailsDiv} style={{ display: \"flex\" }}>\r\n {author && (\r\n <PersonDetailsPopover person={author} title=\"Author\" disabled={!hasAuthorDetails}>\r\n <Persona name={author.name} secondaryText=\"Author\" style={{ cursor: hasAuthorDetails ? \"pointer\" : \"default\" }} />\r\n </PersonDetailsPopover>\r\n )}\r\n {contributors.length > 0 && (\r\n <AvatarGroup layout=\"stack\">\r\n {contributors.map((contributor) => {\r\n return (\r\n <PersonDetailsPopover key={contributor.name} person={contributor} title=\"Contributor\">\r\n <AvatarGroupItem name={contributor.name} className={classes.avatarGroupItem} />\r\n </PersonDetailsPopover>\r\n );\r\n })}\r\n </AvatarGroup>\r\n )}\r\n </div>\r\n )}\r\n </CardPreview>\r\n )}\r\n <CardFooter>\r\n {canInstall && (\r\n <Button appearance=\"primary\" size=\"small\" icon={<ArrowDownloadRegular />} onClick={install}>\r\n Get\r\n </Button>\r\n )}\r\n {canUninstall && (\r\n <Button appearance=\"secondary\" size=\"small\" icon={<DeleteRegular />} onClick={uninstall}>\r\n Remove\r\n </Button>\r\n )}\r\n {isStateChanging && <Spinner className={classes.spinner} size=\"extra-small\" />}\r\n </CardFooter>\r\n </Card>\r\n </AccordionPanel>\r\n </AccordionItem>\r\n );\r\n});\r\n\r\ntype TabValue = \"available\" | \"installed\";\r\n\r\nexport const ExtensionListServiceDefinition: ServiceDefinition<[], [IShellService]> = {\r\n friendlyName: \"ExtensionList\",\r\n consumes: [ShellServiceIdentity],\r\n factory: (shellService) => {\r\n const registration = shellService.addToolbarItem({\r\n key: \"ExtensionList\",\r\n horizontalLocation: \"right\",\r\n verticalLocation: \"top\",\r\n suppressTeachingMoment: true,\r\n order: -200,\r\n component: () => {\r\n const classes = useStyles();\r\n\r\n const [selectedTab, setSelectedTab] = useState<TabValue>(\"available\");\r\n const extensionManager = useExtensionManager();\r\n const [extensions, setExtensions] = useState<IExtension[]>([]);\r\n\r\n useEffect(() => {\r\n if (extensionManager) {\r\n const populateExtensionsAsync = async () => {\r\n const query = await extensionManager.queryExtensionsAsync(undefined, undefined, selectedTab === \"installed\");\r\n const extensions = await query.getExtensionsAsync(0, query.totalCount);\r\n setExtensions(extensions);\r\n };\r\n\r\n // eslint-disable-next-line github/no-then\r\n populateExtensionsAsync().catch((error) => {\r\n Logger.Warn(`Failed to populate extensions: ${error}`);\r\n });\r\n }\r\n }, [extensionManager, selectedTab]);\r\n\r\n const teachingMoment = useTeachingMoment();\r\n\r\n return (\r\n <>\r\n <TeachingMoment\r\n {...teachingMoment}\r\n title=\"Extensions\"\r\n description=\"Extensions provide new optional features that can be useful to your specific task or workflow. Click this button to manage extensions.\"\r\n />\r\n <Dialog>\r\n <DialogTrigger disableButtonEnhancement>\r\n <Tooltip content=\"Manage Extensions\" relationship=\"label\">\r\n <Button ref={teachingMoment.targetRef} className={classes.extensionButton} appearance=\"subtle\" icon={<AppsAddInRegular />} />\r\n </Tooltip>\r\n </DialogTrigger>\r\n <DialogSurface className={classes.extensionsDialogSurface}>\r\n <DialogBody className={classes.extensionDialogBody}>\r\n <DialogTitle\r\n action={\r\n <DialogTrigger action=\"close\">\r\n <Button appearance=\"subtle\" aria-label=\"close\" icon={<DismissRegular />} />\r\n </DialogTrigger>\r\n }\r\n >\r\n <>\r\n Extensions\r\n <TabList\r\n className={classes.extensionDialogContent}\r\n selectedValue={selectedTab}\r\n onTabSelect={(event: SelectTabEvent, data: SelectTabData) => {\r\n setSelectedTab(data.value as TabValue);\r\n }}\r\n >\r\n <Tab value={\"available\" satisfies TabValue}>Available</Tab>\r\n <Tab value={\"installed\" satisfies TabValue}>Installed</Tab>\r\n </TabList>\r\n </>\r\n </DialogTitle>\r\n <DialogContent className={classes.extensionDialogContent}>\r\n <Accordion collapsible>\r\n {extensions.map((extension) => (\r\n <ExtensionDetails key={extension.metadata.name} extension={extension} />\r\n ))}\r\n </Accordion>\r\n </DialogContent>\r\n </DialogBody>\r\n </DialogSurface>\r\n </Dialog>\r\n </>\r\n );\r\n },\r\n });\r\n\r\n return {\r\n dispose: () => registration.dispose(),\r\n };\r\n },\r\n};\r\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.GIF=e():t.GIF=e();}(undefined,function(){return function(t){function e(n){if(i[n])return i[n].exports;var r=i[n]={exports:{},id:n,loaded:false};return t[n].call(r.exports,r,r.exports,e),r.loaded=true,r.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){var n,r,o=function(t,e){function i(){this.constructor=t;}for(var n in e)a.call(e,n)&&(t[n]=e[n]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},a={}.hasOwnProperty,h=[].indexOf||function(t){for(var e=0,i=this.length;e<i;e++)if(e in this&&this[e]===t)return e;return -1};n=i(1).EventEmitter,i(2),r=function(t){function e(t){var e,n,r;this.running=false,this.options={},this.frames=[],this.groups=new Map,this.freeWorkers=[],this.activeWorkers=[],this.setOptions(t);for(n in i)r=i[n],null==(e=this.options)[n]&&(e[n]=r);}var i,n;return o(e,t),i={workerScript:"gif.worker.js",workers:2,repeat:0,background:"#fff",quality:10,width:null,height:null,transparent:null,debug:false},n={delay:500,copy:false},e.prototype.setOption=function(t,e){if(this.options[t]=e,null!=this._canvas&&("width"===t||"height"===t))return this._canvas[t]=e},e.prototype.setOptions=function(t){var e,i,n;i=[];for(e in t)a.call(t,e)&&(n=t[e],i.push(this.setOption(e,n)));return i},e.prototype.addFrame=function(t,e){var i,r,s;null==e&&(e={}),i={},i.transparent=this.options.transparent;for(s in n)i[s]=e[s]||n[s];if(null==this.options.width&&this.setOption("width",t.width),null==this.options.height&&this.setOption("height",t.height),"undefined"!=typeof ImageData&&null!==ImageData&&t instanceof ImageData)i.data=t.data;else if("undefined"!=typeof CanvasRenderingContext2D&&null!==CanvasRenderingContext2D&&t instanceof CanvasRenderingContext2D||"undefined"!=typeof WebGLRenderingContext&&null!==WebGLRenderingContext&&t instanceof WebGLRenderingContext)e.copy?i.data=this.getContextData(t):i.context=t;else {if(null==t.childNodes)throw new Error("Invalid image");e.copy?i.data=this.getImageData(t):i.image=t;}return r=this.frames.length,r>0&&i.data&&(this.groups.has(i.data)?this.groups.get(i.data).push(r):this.groups.set(i.data,[r])),this.frames.push(i)},e.prototype.render=function(){var e,i,n;if(this.running)throw new Error("Already running");if(null==this.options.width||null==this.options.height)throw new Error("Width and height must be set prior to rendering");if(this.running=true,this.nextFrame=0,this.finishedFrames=0,this.imageParts=function(){var e,i,n;for(n=[],e=0,i=this.frames.length;0<=i?e<i:e>i;0<=i?++e:--e)n.push(null);return n}.call(this),i=this.spawnWorkers(),this.options.globalPalette===true)this.renderNextFrame();else for(e=0,n=i;0<=n?e<n:e>n;0<=n?++e:--e)this.renderNextFrame();return this.emit("start"),this.emit("progress",0)},e.prototype.abort=function(){for(var t;;){if(t=this.activeWorkers.shift(),null==t)break;this.log("killing active worker"),t.terminate();}return this.running=false,this.emit("abort")},e.prototype.spawnWorkers=function(){var t,e,i;return t=Math.min(this.options.workers,this.frames.length),function(){i=[];for(var n=e=this.freeWorkers.length;e<=t?n<t:n>t;e<=t?n++:n--)i.push(n);return i}.apply(this).forEach(function(t){return function(e){var i;return t.log("spawning worker "+e),i=new Worker(t.options.workerScript),i.onmessage=function(e){return t.activeWorkers.splice(t.activeWorkers.indexOf(i),1),t.freeWorkers.push(i),t.frameFinished(e.data,false)},t.freeWorkers.push(i)}}(this)),t},e.prototype.frameFinished=function(t,e){var n,r,s,o;if(this.finishedFrames++,e?(n=this.frames.indexOf(t),r=this.groups.get(t.data)[0],this.log("frame "+(n+1)+" is duplicate of "+r+" - "+this.activeWorkers.length+" active"),this.imageParts[n]={indexOfFirstInGroup:r}):(this.log("frame "+(t.index+1)+" finished - "+this.activeWorkers.length+" active"),this.emit("progress",this.finishedFrames/this.frames.length),this.imageParts[t.index]=t),this.options.globalPalette===true&&!e&&(this.options.globalPalette=t.globalPalette,this.log("global palette analyzed"),this.frames.length>2))for(s=1,o=this.freeWorkers.length;1<=o?s<o:s>o;1<=o?++s:--s)this.renderNextFrame();return h.call(this.imageParts,null)>=0?this.renderNextFrame():this.finishRendering()},e.prototype.finishRendering=function(){var t,e,i,n,r,s,o,a,h,l,f,p,u,d,c,g,v,m,y,_;for(v=this.imageParts,r=s=0,l=v.length;s<l;r=++s)e=v[r],e.indexOfFirstInGroup&&(this.imageParts[r]=this.imageParts[e.indexOfFirstInGroup]);for(h=0,m=this.imageParts,o=0,f=m.length;o<f;o++)e=m[o],h+=(e.data.length-1)*e.pageSize+e.cursor;for(h+=e.pageSize-e.cursor,this.log("rendering finished - filesize "+Math.round(h/1e3)+"kb"),t=new Uint8Array(h),c=0,y=this.imageParts,a=0,p=y.length;a<p;a++)for(e=y[a],_=e.data,i=d=0,u=_.length;d<u;i=++d)g=_[i],t.set(g,c),c+=i===e.data.length-1?e.cursor:e.pageSize;return n=new Blob([t],{type:"image/gif"}),this.emit("finished",n,t)},e.prototype.renderNextFrame=function(){var t,e,i,n;if(0===this.freeWorkers.length)throw new Error("No free workers");if(!(this.nextFrame>=this.frames.length))return t=this.frames[this.nextFrame++],e=this.frames.indexOf(t),e>0&&this.groups.has(t.data)&&this.groups.get(t.data)[0]!==e?void setTimeout(function(e){return function(){return e.frameFinished(t,true)}}(this),0):(n=this.freeWorkers.shift(),i=this.getTask(t),this.log("starting frame "+(i.index+1)+" of "+this.frames.length),this.activeWorkers.push(n),n.postMessage(i))},e.prototype.getContextData=function(t){return t.getImageData(0,0,this.options.width,this.options.height).data},e.prototype.getImageData=function(t){var e;return null==this._canvas&&(this._canvas=document.createElement("canvas"),this._canvas.width=this.options.width,this._canvas.height=this.options.height),e=this._canvas.getContext("2d"),e.setFill=this.options.background,e.fillRect(0,0,this.options.width,this.options.height),e.drawImage(t,0,0),this.getContextData(e)},e.prototype.getTask=function(t){var e,i;if(e=this.frames.indexOf(t),i={index:e,last:e===this.frames.length-1,delay:t.delay,transparent:t.transparent,width:this.options.width,height:this.options.height,quality:this.options.quality,dither:this.options.dither,globalPalette:this.options.globalPalette,repeat:this.options.repeat,canTransfer:true},null!=t.data)i.data=t.data;else if(null!=t.context)i.data=this.getContextData(t.context);else {if(null==t.image)throw new Error("Invalid frame");i.data=this.getImageData(t.image);}return i},e.prototype.log=function(t){if(this.options.debug)return console.log(t)},e}(n),t.exports=r;},function(t,e){function i(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0;}function n(t){return "function"==typeof t}function r(t){return "number"==typeof t}function s(t){return "object"==typeof t&&null!==t}function o(t){return void 0===t}t.exports=i,i.EventEmitter=i,i.prototype._events=void 0,i.prototype._maxListeners=void 0,i.defaultMaxListeners=10,i.prototype.setMaxListeners=function(t){if(!r(t)||t<0||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},i.prototype.emit=function(t){var e,i,r,a,h,l;if(this._events||(this._events={}),"error"===t&&(!this._events.error||s(this._events.error)&&!this._events.error.length)){if(e=arguments[1],e instanceof Error)throw e;var f=new Error('Uncaught, unspecified "error" event. ('+e+")");throw f.context=e,f}if(i=this._events[t],o(i))return false;if(n(i))switch(arguments.length){case 1:i.call(this);break;case 2:i.call(this,arguments[1]);break;case 3:i.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),i.apply(this,a);}else if(s(i))for(a=Array.prototype.slice.call(arguments,1),l=i.slice(),r=l.length,h=0;h<r;h++)l[h].apply(this,a);return true},i.prototype.addListener=function(t,e){var r;if(!n(e))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",t,n(e.listener)?e.listener:e),this._events[t]?s(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,s(this._events[t])&&!this._events[t].warned&&(r=o(this._maxListeners)?i.defaultMaxListeners:this._maxListeners,r&&r>0&&this._events[t].length>r&&(this._events[t].warned=true,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace())),this},i.prototype.on=i.prototype.addListener,i.prototype.once=function(t,e){function i(){this.removeListener(t,i),r||(r=true,e.apply(this,arguments));}if(!n(e))throw TypeError("listener must be a function");var r=false;return i.listener=e,this.on(t,i),this},i.prototype.removeListener=function(t,e){var i,r,o,a;if(!n(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(i=this._events[t],o=i.length,r=-1,i===e||n(i.listener)&&i.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(s(i)){for(a=o;a-- >0;)if(i[a]===e||i[a].listener&&i[a].listener===e){r=a;break}if(r<0)return this;1===i.length?(i.length=0,delete this._events[t]):i.splice(r,1),this._events.removeListener&&this.emit("removeListener",t,e);}return this},i.prototype.removeAllListeners=function(t){var e,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(i=this._events[t],n(i))this.removeListener(t,i);else if(i)for(;i.length;)this.removeListener(t,i[i.length-1]);return delete this._events[t],this},i.prototype.listeners=function(t){return this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},i.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(n(e))return 1;if(e)return e.length}return 0},i.listenerCount=function(t,e){return t.listenerCount(e)};},function(t,e){var i,n,r,s,o;o=navigator.userAgent.toLowerCase(),s=navigator.platform.toLowerCase(),i=o.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/)||[null,"unknown",0],r="ie"===i[1]&&document.documentMode,n={name:"version"===i[1]?i[3]:i[1],version:r||parseFloat("opera"===i[1]&&i[4]?i[4]:i[2]),platform:{name:o.match(/ip(?:ad|od|hone)/)?"ios":(o.match(/(?:webos|android)/)||s.match(/mac|win|linux/)||["other"])[0]}},n[n.name]=true,n[n.name+parseInt(n.version,10)]=true,n.platform[n.platform.name]=true,t.exports=n;}])});
2
- //# sourceMappingURL=gif-8Ty35Toc.js.map