@wandelbots/wandelbots-js-react-components 3.6.0 → 3.6.1-pr.feat-model-retrieval-from-rdp.463.65f387f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +46 -0
  2. package/dist/3d.cjs.js +1 -1
  3. package/dist/3d.es.js +1 -1
  4. package/dist/{LoadingCover-Dr9hDTku.js → LoadingCover-6gWr11KP.js} +11 -10
  5. package/dist/{LoadingCover-Dr9hDTku.js.map → LoadingCover-6gWr11KP.js.map} +1 -1
  6. package/dist/LoadingCover-CukpS_aj.cjs +2 -0
  7. package/dist/{LoadingCover-r2yhJZF9.cjs.map → LoadingCover-CukpS_aj.cjs.map} +1 -1
  8. package/dist/{WandelscriptEditor-DnJvITTA.js → WandelscriptEditor-7eN-Yw7m.js} +3 -3
  9. package/dist/{WandelscriptEditor-DnJvITTA.js.map → WandelscriptEditor-7eN-Yw7m.js.map} +1 -1
  10. package/dist/WandelscriptEditor-D6_vS5Uk.cjs +2 -0
  11. package/dist/{WandelscriptEditor-Dj7TBCkF.cjs.map → WandelscriptEditor-D6_vS5Uk.cjs.map} +1 -1
  12. package/dist/auth0-spa-js.production.esm-BMSlxZC5.js +3877 -0
  13. package/dist/auth0-spa-js.production.esm-BMSlxZC5.js.map +1 -0
  14. package/dist/auth0-spa-js.production.esm-DZ6lsBvD.cjs +5 -0
  15. package/dist/auth0-spa-js.production.esm-DZ6lsBvD.cjs.map +1 -0
  16. package/dist/components/RobotCard.d.ts +1 -1
  17. package/dist/components/RobotCard.d.ts.map +1 -1
  18. package/dist/components/robots/GenericRobot.d.ts +2 -2
  19. package/dist/components/robots/GenericRobot.d.ts.map +1 -1
  20. package/dist/components/robots/Robot.d.ts +3 -1
  21. package/dist/components/robots/Robot.d.ts.map +1 -1
  22. package/dist/components/robots/SupportedRobot.d.ts +1 -1
  23. package/dist/components/robots/SupportedRobot.d.ts.map +1 -1
  24. package/dist/components/robots/robotModelLogic.d.ts +11 -1
  25. package/dist/components/robots/robotModelLogic.d.ts.map +1 -1
  26. package/dist/core.cjs.js +1 -1
  27. package/dist/core.es.js +4 -4
  28. package/dist/externalizeComponent-CkVWk2F_.cjs +24 -0
  29. package/dist/externalizeComponent-CkVWk2F_.cjs.map +1 -0
  30. package/dist/externalizeComponent-Dc3fViZA.js +489 -0
  31. package/dist/externalizeComponent-Dc3fViZA.js.map +1 -0
  32. package/dist/index.cjs.js +1 -1
  33. package/dist/index.es.js +6 -6
  34. package/dist/interpolation-DAXKfoDS.cjs +20 -0
  35. package/dist/interpolation-DAXKfoDS.cjs.map +1 -0
  36. package/dist/interpolation-DcPbemBD.js +6924 -0
  37. package/dist/interpolation-DcPbemBD.js.map +1 -0
  38. package/dist/lib/JoggerConnection.d.ts.map +1 -1
  39. package/dist/manufacturerHomePositions-B3eJ_OqZ.cjs +2 -0
  40. package/dist/manufacturerHomePositions-B3eJ_OqZ.cjs.map +1 -0
  41. package/dist/{manufacturerHomePositions-CgaG5vaK.js → manufacturerHomePositions-j75MUgMb.js} +350 -290
  42. package/dist/manufacturerHomePositions-j75MUgMb.js.map +1 -0
  43. package/dist/theming-CPShzNuV.cjs +115 -0
  44. package/dist/theming-CPShzNuV.cjs.map +1 -0
  45. package/dist/{theming-Coh4zx7d.js → theming-Hr605E6v.js} +5105 -6451
  46. package/dist/theming-Hr605E6v.js.map +1 -0
  47. package/dist/wandelscript.cjs.js +1 -1
  48. package/dist/wandelscript.es.js +1 -1
  49. package/package.json +22 -12
  50. package/src/components/RobotCard.tsx +1 -1
  51. package/src/components/robots/GenericRobot.tsx +97 -36
  52. package/src/components/robots/Robot.tsx +3 -1
  53. package/src/components/robots/RobotAnimator.test.tsx +1 -1
  54. package/src/components/robots/SupportedRobot.tsx +11 -3
  55. package/src/components/robots/robotModelLogic.ts +75 -6
  56. package/src/env.d.ts +3 -0
  57. package/src/lib/JoggerConnection.ts +10 -10
  58. package/src/lib/MotionStreamConnection.ts +1 -1
  59. package/dist/LoadingCover-r2yhJZF9.cjs +0 -2
  60. package/dist/WandelscriptEditor-Dj7TBCkF.cjs +0 -2
  61. package/dist/auth0-spa-js.production.esm-DL9f1uDJ.js +0 -1438
  62. package/dist/auth0-spa-js.production.esm-DL9f1uDJ.js.map +0 -1
  63. package/dist/auth0-spa-js.production.esm-DTiWXa87.cjs +0 -5
  64. package/dist/auth0-spa-js.production.esm-DTiWXa87.cjs.map +0 -1
  65. package/dist/index-CAib4NKw.js +0 -2261
  66. package/dist/index-CAib4NKw.js.map +0 -1
  67. package/dist/index-CqMZL0FV.cjs +0 -2
  68. package/dist/index-CqMZL0FV.cjs.map +0 -1
  69. package/dist/index-CxasuX80.js +0 -5212
  70. package/dist/index-CxasuX80.js.map +0 -1
  71. package/dist/index-DxwppshT.cjs +0 -29
  72. package/dist/index-DxwppshT.cjs.map +0 -1
  73. package/dist/manufacturerHomePositions-Ca80ycLi.cjs +0 -2
  74. package/dist/manufacturerHomePositions-Ca80ycLi.cjs.map +0 -1
  75. package/dist/manufacturerHomePositions-CgaG5vaK.js.map +0 -1
  76. package/dist/theming-Coh4zx7d.js.map +0 -1
  77. package/dist/theming-D4ztsmTr.cjs +0 -133
  78. package/dist/theming-D4ztsmTr.cjs.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./WandelscriptEditor-Dj7TBCkF.cjs");exports.WandelscriptEditor=t.WandelscriptEditor;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./WandelscriptEditor-D6_vS5Uk.cjs");exports.WandelscriptEditor=t.WandelscriptEditor;
2
2
  //# sourceMappingURL=wandelscript.cjs.js.map
@@ -1,4 +1,4 @@
1
- import { W as t } from "./WandelscriptEditor-DnJvITTA.js";
1
+ import { W as t } from "./WandelscriptEditor-7eN-Yw7m.js";
2
2
  export {
3
3
  t as WandelscriptEditor
4
4
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wandelbots/wandelbots-js-react-components",
3
- "version": "3.6.0",
3
+ "version": "3.6.1-pr.feat-model-retrieval-from-rdp.463.65f387f",
4
4
  "description": "React UI toolkit for building applications on top of the Wandelbots platform",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -50,7 +50,8 @@
50
50
  "ci:test:runner": "wait-on tcp:127.0.0.1:9009 && test-storybook --url http://127.0.0.1:9009 --index-json --browsers chromium",
51
51
  "build": "rimraf dist && vite build && tsc --declaration --emitDeclarationOnly",
52
52
  "build-storybook": "storybook build",
53
- "prepare": "husky || true"
53
+ "prepare": "husky || true",
54
+ "td": "tsx scripts/td-wrapper.ts"
54
55
  },
55
56
  "repository": {
56
57
  "type": "git",
@@ -63,6 +64,10 @@
63
64
  ],
64
65
  "author": "Wandelbots",
65
66
  "license": "Apache-2.0",
67
+ "engines": {
68
+ "node": ">=18.14.0",
69
+ "npm": ">=8.0.0"
70
+ },
66
71
  "devDependencies": {
67
72
  "@emotion/react": "^11.14.0",
68
73
  "@emotion/styled": "^11.14.0",
@@ -77,18 +82,18 @@
77
82
  "@rollup/plugin-terser": "^0.4.4",
78
83
  "@rollup/plugin-typescript": "^12.1.2",
79
84
  "@shikijs/monaco": "^3.1.0",
80
- "@storybook/addon-docs": "^10.1.7",
81
- "@storybook/react-vite": "^10.1.10",
85
+ "@storybook/addon-docs": "^10.2.3",
86
+ "@storybook/react-vite": "^10.2.3",
82
87
  "@storybook/test-runner": "^0.24.1",
83
88
  "@svgr/rollup": "^8.1.0",
84
89
  "@testing-library/jest-dom": "^6.6.3",
85
- "@testing-library/react": "^16.3.0",
90
+ "@testing-library/react": "^16.3.2",
86
91
  "@testing-library/user-event": "^14.6.1",
87
92
  "@types/lodash-es": "^4.17.12",
88
93
  "@types/react": "^19.1.8",
89
94
  "@types/three": "^0.182.0",
90
95
  "@vitejs/plugin-react": "^4.3.4",
91
- "@wandelbots/nova-js": "^3.4.1",
96
+ "@wandelbots/nova-js": "^3.5.0",
92
97
  "add": "^2.0.6",
93
98
  "eslint-plugin-storybook": "^10.1.10",
94
99
  "glob": "^13.0.0",
@@ -114,11 +119,12 @@
114
119
  "rollup-plugin-postcss": "^4.0.2",
115
120
  "semantic-release": "^25.0.2",
116
121
  "shiki": "^3.1.0",
117
- "storybook": "^10.1.11",
118
- "storybook-preset-inline-svg": "^1.0.1",
122
+ "storybook": "^10.2.3",
123
+ "storybook-preset-inline-svg": "^2.0.0",
119
124
  "three": "^0.182.0",
120
125
  "three-stdlib": "^2.35.14",
121
126
  "ts-dedent": "^2.2.0",
127
+ "tsx": "^4.21.0",
122
128
  "typescript": "^5.8.2",
123
129
  "unplugin": "^1.15.0",
124
130
  "vite": "^6.2.0",
@@ -168,14 +174,18 @@
168
174
  }
169
175
  },
170
176
  "dependencies": {
171
- "@mui/x-charts": "8.24.0",
172
- "@mui/x-data-grid": "8.24.0",
173
- "i18next-browser-languagedetector": "^8.0.4",
177
+ "@mui/x-charts": "^8.27.0",
178
+ "@mui/x-data-grid": "^8.27.0",
179
+ "@wandelbots/nova-js": "3.5.0",
180
+ "axios": "^1.13.2",
181
+ "dotenv": "^17.2.3",
182
+ "i18next-browser-languagedetector": "^8.2.0",
174
183
  "lodash-es": "^4.17.21",
175
184
  "mobx": "^6.13.6",
176
185
  "mobx-react-lite": "^4.1.0",
177
186
  "react-error-boundary": "^6.0.3",
178
- "react-i18next": "^16.5.2"
187
+ "react-i18next": "^16.5.2",
188
+ "username": "^7.0.0"
179
189
  },
180
190
  "overrides": {
181
191
  "storybook": "$storybook"
@@ -52,7 +52,7 @@ export interface RobotCardProps {
52
52
  flangeRef?: React.Ref<Group>
53
53
  postModelRender?: () => void
54
54
  transparentColor?: string
55
- getModel?: (modelFromController: string) => string
55
+ getModel?: (modelFromController: string) => Promise<string>
56
56
  }>
57
57
  /** Custom component to render in the content area (optional) */
58
58
  customContentComponent?: React.ComponentType<Record<string, unknown>>
@@ -1,12 +1,12 @@
1
1
  import { useGLTF } from "@react-three/drei"
2
2
  import type { ThreeElements } from "@react-three/fiber"
3
- import React, { useCallback } from "react"
3
+ import React, { useCallback, useEffect, useState } from "react"
4
4
  import type { Group, Mesh } from "three"
5
5
  import { type Object3D } from "three"
6
6
  import { isFlange, parseRobotModel } from "./robotModelLogic"
7
7
 
8
8
  export type RobotModelProps = {
9
- modelURL: string
9
+ modelURL: string | Promise<string>
10
10
  /**
11
11
  * Called after a robot model has been loaded and
12
12
  * rendered into the threejs scene
@@ -19,16 +19,25 @@ function isMesh(node: Object3D): node is Mesh {
19
19
  return node.type === "Mesh"
20
20
  }
21
21
 
22
- export function GenericRobot({
23
- modelURL,
24
- flangeRef,
25
- postModelRender,
26
- ...props
27
- }: RobotModelProps) {
28
- const { gltf } = parseRobotModel(
29
- useGLTF(modelURL),
30
- modelURL.split("/").pop() || modelURL,
31
- )
22
+ // Separate component that only renders when we have a valid URL
23
+ function LoadedRobotModel({
24
+ url,
25
+ flangeRef,
26
+ postModelRender,
27
+ ...props
28
+ }: {
29
+ url: string
30
+ flangeRef?: React.Ref<Group>
31
+ postModelRender?: () => void
32
+ } & ThreeElements["group"]) {
33
+ const gltfResult = useGLTF(url)
34
+ let gltf
35
+ try {
36
+ const parsed = parseRobotModel(gltfResult, 'robot.glb')
37
+ gltf = parsed.gltf
38
+ } catch (err) {
39
+ throw err;
40
+ }
32
41
 
33
42
  const groupRef: React.RefCallback<Group> = useCallback(
34
43
  (group) => {
@@ -36,33 +45,45 @@ export function GenericRobot({
36
45
  postModelRender()
37
46
  }
38
47
  },
39
- [modelURL],
48
+ [postModelRender],
40
49
  )
41
50
 
42
51
  function renderNode(node: Object3D): React.ReactNode {
43
- if (isMesh(node)) {
44
- return (
45
- <mesh
46
- name={node.name}
47
- key={node.uuid}
48
- geometry={node.geometry}
49
- material={node.material}
50
- position={node.position}
51
- rotation={node.rotation}
52
- />
53
- )
54
- } else {
55
- return (
56
- <group
57
- name={node.name}
58
- key={node.uuid}
59
- position={node.position}
60
- rotation={node.rotation}
61
- ref={isFlange(node) ? flangeRef : undefined}
62
- >
63
- {node.children.map(renderNode)}
64
- </group>
65
- )
52
+ try {
53
+ if (isMesh(node)) {
54
+ // Defensive: only render mesh if geometry exists
55
+ if ((node as Mesh).geometry) {
56
+ return (
57
+ <mesh
58
+ name={node.name}
59
+ key={node.uuid}
60
+ geometry={(node as Mesh).geometry}
61
+ material={(node as Mesh).material}
62
+ position={node.position}
63
+ rotation={node.rotation}
64
+ />
65
+ )
66
+ }
67
+ // Fallback to empty group if geometry is missing
68
+ return (
69
+ <group name={node.name} key={node.uuid} position={node.position} rotation={node.rotation} />
70
+ )
71
+ } else {
72
+ return (
73
+ <group
74
+ name={node.name}
75
+ key={node.uuid}
76
+ position={node.position}
77
+ rotation={node.rotation}
78
+ ref={isFlange(node) ? flangeRef : undefined}
79
+ >
80
+ {node.children.map(renderNode)}
81
+ </group>
82
+ )
83
+ }
84
+ } catch (e) {
85
+ console.warn('Error rendering node', node.name, e)
86
+ return null
66
87
  }
67
88
  }
68
89
 
@@ -72,3 +93,43 @@ export function GenericRobot({
72
93
  </group>
73
94
  )
74
95
  }
96
+
97
+ export function GenericRobot({
98
+ modelURL,
99
+ flangeRef,
100
+ postModelRender,
101
+ ...props
102
+ }: RobotModelProps) {
103
+ const [resolvedURL, setResolvedURL] = useState<string | null>(null)
104
+
105
+ useEffect(() => {
106
+ const resolveURL = async () => {
107
+ try {
108
+ if (typeof modelURL === 'string') {
109
+ setResolvedURL(modelURL)
110
+ } else {
111
+ const url = await modelURL
112
+ setResolvedURL(url)
113
+ }
114
+ } catch (error) {
115
+ console.error('Failed to resolve model URL:', error)
116
+ }
117
+ }
118
+
119
+ resolveURL()
120
+ }, [modelURL])
121
+
122
+ // Don't render until we have a resolved URL
123
+ if (!resolvedURL) {
124
+ return null // Loading state
125
+ }
126
+
127
+ return (
128
+ <LoadedRobotModel
129
+ url={resolvedURL}
130
+ flangeRef={flangeRef}
131
+ postModelRender={postModelRender}
132
+ {...props}
133
+ />
134
+ )
135
+ }
@@ -7,7 +7,7 @@ import { SupportedRobot } from "./SupportedRobot"
7
7
 
8
8
  export type RobotProps = {
9
9
  connectedMotionGroup: ConnectedMotionGroup
10
- getModel?: (modelFromController: string) => string
10
+ getModel?: (modelFromController: string) => Promise<string>
11
11
  flangeRef?: React.Ref<Group>
12
12
  transparentColor?: string
13
13
  postModelRender?: () => void
@@ -51,3 +51,5 @@ export function Robot({
51
51
  />
52
52
  )
53
53
  }
54
+
55
+ export { defaultGetModel }
@@ -1,4 +1,4 @@
1
- import type { DHParameter, MotionGroupState } from "@wandelbots/nova-api/v2"
1
+ import type { DHParameter, MotionGroupState } from "@wandelbots/nova-js/v2"
2
2
  import { describe, expect, it, vi } from "vitest"
3
3
  import RobotAnimator from "./RobotAnimator"
4
4
 
@@ -22,7 +22,7 @@ export type SupportedRobotProps = {
22
22
  modelFromController: string
23
23
  dhParameters: DHParameter[]
24
24
  flangeRef?: React.Ref<THREE.Group>
25
- getModel?: (modelFromController: string) => string
25
+ getModel?: (modelFromController: string) => Promise<string> | undefined
26
26
  postModelRender?: () => void
27
27
  transparentColor?: string
28
28
  } & ThreeElements["group"]
@@ -67,7 +67,7 @@ export const SupportedRobot = externalizeComponent(
67
67
  fallback={dhrobot}
68
68
  onError={(err) => {
69
69
  // Missing model; show the fallback for now
70
- console.error(err)
70
+ console.warn(err)
71
71
  }}
72
72
  >
73
73
  <Suspense fallback={dhrobot}>
@@ -77,7 +77,15 @@ export const SupportedRobot = externalizeComponent(
77
77
  dhParameters={dhParameters}
78
78
  >
79
79
  <GenericRobot
80
- modelURL={getModel(modelFromController)}
80
+ modelURL={(() => {
81
+ const result = getModel(modelFromController)
82
+ if (!result) {
83
+ const mockBlob = new Blob([], { type: 'model/gltf-binary' })
84
+ const mockFile = new File([mockBlob], `${modelFromController}.glb`, { type: 'model/gltf-binary' })
85
+ return Promise.resolve(URL.createObjectURL(mockFile))
86
+ }
87
+ return result
88
+ })()}
81
89
  postModelRender={postModelRender}
82
90
  flangeRef={flangeRef}
83
91
  {...props}
@@ -1,13 +1,82 @@
1
+ import { NovaClient } from "@wandelbots/nova-js/v2"
1
2
  import type { Object3D } from "three"
2
3
  import type { GLTF } from "three-stdlib"
3
- import { version } from "../../../package.json"
4
4
 
5
- export function defaultGetModel(modelFromController: string): string {
6
- let useVersion = version
7
- if (version.startsWith("0.")) {
8
- useVersion = ""
5
+ const modelCache = new Map<string, Promise<string>>()
6
+
7
+ /**
8
+ * Revoke a cached model's object URL to prevent memory leaks.
9
+ * Call this when a component unmounts or no longer needs the model.
10
+ */
11
+ export async function revokeModelUrl(modelFromController: string): Promise<void> {
12
+ const urlPromise = modelCache.get(modelFromController)
13
+ if (!urlPromise) return
14
+
15
+ try {
16
+ const url = await urlPromise
17
+ URL.revokeObjectURL(url)
18
+ } catch (e) {
19
+ // Ignore errors - URL may already be revoked
20
+ }
21
+ modelCache.delete(modelFromController)
22
+ }
23
+
24
+ /**
25
+ * Revoke all cached model object URLs and clear the cache.
26
+ * Useful for cleanup on app teardown.
27
+ */
28
+ export async function revokeAllModelUrls(): Promise<void> {
29
+ const entries = Array.from(modelCache.entries())
30
+ await Promise.allSettled(
31
+ entries.map(async ([key, urlPromise]) => {
32
+ try {
33
+ const url = await urlPromise
34
+ URL.revokeObjectURL(url)
35
+ } catch (e) {
36
+ // Ignore errors
37
+ }
38
+ })
39
+ )
40
+ modelCache.clear()
41
+ }
42
+
43
+ export async function defaultGetModel(modelFromController: string): Promise<string> {
44
+ // Check cache first
45
+ if (modelCache.has(modelFromController)) {
46
+ return modelCache.get(modelFromController)!
9
47
  }
10
- return `https://cdn.jsdelivr.net/gh/wandelbotsgmbh/wandelbots-js-react-components${useVersion ? `@${useVersion}` : ""}/public/models/${modelFromController}.glb`
48
+
49
+ // Create the promise and cache it immediately to prevent duplicate calls
50
+ const modelPromise = (async () => {
51
+ const instanceUrl = import.meta.env.WANDELAPI_BASE_URL
52
+ const nova = new NovaClient({ instanceUrl })
53
+
54
+ // Configure axios to handle binary responses for GLB files
55
+ const apiInstance = nova.api.motionGroupModels as any
56
+ if (apiInstance.axios?.interceptors) {
57
+ apiInstance.axios.interceptors.request.use((config: any) => {
58
+ if (config.url?.includes('/glb')) {
59
+ config.responseType = 'blob'
60
+ }
61
+ return config
62
+ })
63
+ }
64
+
65
+ try {
66
+ const file = await nova.api.motionGroupModels.getMotionGroupGlbModel(modelFromController)
67
+
68
+ // Create object URL from the file and return it
69
+ const url = URL.createObjectURL(file)
70
+ return url
71
+ } catch (error) {
72
+ console.error("Failed to fetch model:", error)
73
+ throw error
74
+ }
75
+ })()
76
+
77
+ // Cache the promise
78
+ modelCache.set(modelFromController, modelPromise)
79
+ return modelPromise
11
80
  }
12
81
 
13
82
  /**
package/src/env.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ // Ensure ImportMeta.env types from Vite are available to TypeScript.
@@ -390,14 +390,14 @@ export class JoggerConnection {
390
390
  axis: "x" | "y" | "z"
391
391
  direction: "-" | "+"
392
392
  motion:
393
- | {
394
- type: "rotate"
395
- distanceRads: number
396
- }
397
- | {
398
- type: "translate"
399
- distanceMm: number
400
- }
393
+ | {
394
+ type: "rotate"
395
+ distanceRads: number
396
+ }
397
+ | {
398
+ type: "translate"
399
+ distanceMm: number
400
+ }
401
401
  }) {
402
402
  const commands: MotionCommand[] = []
403
403
 
@@ -559,8 +559,8 @@ export class JoggerConnection {
559
559
  } else {
560
560
  throw new Error(
561
561
  result?.add_trajectory_error?.message ||
562
- result?.message ||
563
- "Failed to execute trajectory, unknown error",
562
+ result?.message ||
563
+ "Failed to execute trajectory, unknown error",
564
564
  )
565
565
  }
566
566
  }
@@ -31,7 +31,7 @@ export class MotionStreamConnection {
31
31
  const controller =
32
32
  await nova.api.controller.getCurrentRobotControllerState(controllerId)
33
33
  const motionGroup = controller?.motion_groups.find(
34
- (mg) => mg.motion_group === motionGroupId,
34
+ (mg: MotionGroupState) => mg.motion_group === motionGroupId,
35
35
  )
36
36
  if (!controller || !motionGroup) {
37
37
  throw new Error(
@@ -1,2 +0,0 @@
1
- "use strict";const t=require("./index-DxwppshT.cjs"),n=require("@mui/material"),x=require("lodash-es"),a=require("react");function l(e){try{return JSON.stringify(e)}catch{return}}function m(e,s){throw new Error(s+` ${JSON.stringify(e)}`)}function g(e){var s,r,o,i;return e instanceof t.AxiosError&&e.code==="ERR_NETWORK"?"Failed to connect to the server. Please check your internet connection.":e instanceof t.AxiosError&&e.response?`${(s=e.response)==null?void 0:s.status} ${(r=e.response)==null?void 0:r.statusText} from ${(o=e.response)==null?void 0:o.config.url}: ${JSON.stringify((i=e.response)==null?void 0:i.data)}`:e instanceof Error?e.message:`Unexpected error: ${l(e)||e}`}const d=e=>{const s=e.softTimeout||3e3,[r,o]=a.useState(!1),i=n.useTheme();return a.useEffect(()=>{const u=setTimeout(()=>{o(!0)},s);return()=>clearTimeout(u)}),t.jsxRuntimeExports.jsx(n.Stack,{width:"100%",height:"100%",alignItems:"center",justifyContent:"center",sx:{color:i.palette.text.primary},children:e.error?t.jsxRuntimeExports.jsx(c,{loadingMessage:e.message,error:e.error}):t.jsxRuntimeExports.jsxs(t.jsxRuntimeExports.Fragment,{children:[t.jsxRuntimeExports.jsx(n.CircularProgress,{sx:{marginBottom:"24px"}}),!!e.message&&t.jsxRuntimeExports.jsx("div",{children:e.message}),t.jsxRuntimeExports.jsx(n.Stack,{sx:{visibility:r?"visible":"hidden",marginTop:"1rem",color:i.palette.text.secondary},children:"This is taking longer than expected..."})]})})},c=e=>{const s=g(e.error),r=e.error instanceof Error?e.error.stack:null,o=n.useTheme();return t.jsxRuntimeExports.jsxs(n.Stack,{sx:{maxHeight:"100%",maxWidth:"min(100%, 800px)",padding:2,overflow:"auto",color:o.palette.error.main,"& pre":{whiteSpace:"pre-wrap",wordBreak:"break-word",paddingBottom:"3rem"}},children:[(e.loadingMessage?`Error while ${x.lowerFirst(n.capitalize(e.loadingMessage))} - `:"")+s,t.jsxRuntimeExports.jsx("br",{}),r&&t.jsxRuntimeExports.jsx("pre",{children:r})]})};exports.LoadingCover=d;exports.LoadingErrorMessage=c;exports.assertUnreachable=m;
2
- //# sourceMappingURL=LoadingCover-r2yhJZF9.cjs.map
@@ -1,2 +0,0 @@
1
- "use strict";var w=Object.create;var p=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,b=Object.prototype.hasOwnProperty;var v=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of f(t))!b.call(e,i)&&i!==n&&p(e,i,{get:()=>t[i],enumerable:!(s=k(t,i))||s.enumerable});return e};var c=(e,t,n)=>(n=e!=null?w(x(e)):{},v(t||!e||!e.__esModule?p(n,"default",{value:e,enumerable:!0}):n,e));const r=require("./index-DxwppshT.cjs"),u=require("react"),T=require("@mui/material"),y=require("./LoadingCover-r2yhJZF9.cjs"),C={$schema:"https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",name:"wandelscript",patterns:[{include:"#keywords"},{include:"#strings"},{include:"#comments"},{include:"#functions"}],repository:{keywords:{patterns:[{name:"keyword.control.flow.wandelscript",match:"\\b(move|via|to|interrupt|def|False|True|for|if|else|elif|while|return|switch|activate|deactivate|print|and|or|not)\\b"}]},strings:{name:"string.quoted.double.wandelscript",begin:'"',end:'"',patterns:[{name:"constant.character.escape.wandelscript",match:"\\\\."}]},comments:{patterns:[{begin:"#",beginCaptures:{0:{name:"punctuation.definition.comment.wandelscript"}},end:"$",name:"comment.line.number-sign.wandelscript"}]},functions:{patterns:[{match:"[a-zA-Z_-]+\\(",name:"entity.name.function.wandelscript"}]}},scopeName:"source.wandelscript"},E=u.lazy(()=>import("@monaco-editor/react"));let l=null;async function S(){if(!l){const[{createHighlighter:e},{shikiToMonaco:t}]=await Promise.all([import("shiki"),import("@shikijs/monaco")]);l={shiki:await e({langs:[C],themes:["dark-plus","light-plus"]}),shikiToMonaco:t}}return l}const j=r.externalizeComponent(e=>{const t=T.useTheme(),[n,s]=u.useState("dark-plus"),i=t.palette.mode==="dark"?"dark-plus":"light-plus";async function g(a){var m,d;a.languages.register({id:"wandelscript"}),a.languages.setLanguageConfiguration("wandelscript",{comments:{lineComment:"#"},brackets:[["(",")"],["[","]"]],autoClosingPairs:[{open:"[",close:"]"},{open:"(",close:")"}],surroundingPairs:[{open:"[",close:"]"},{open:"(",close:")"}]});const{shiki:o,shikiToMonaco:h}=await S();h(o,a),a.editor.defineTheme(i,((d=(m=t.componentsExt)==null?void 0:m.WandelscriptEditor)==null?void 0:d.monacoTheme)??{base:t.palette.mode==="dark"?"vs-dark":"vs",inherit:!0,rules:[],colors:{}}),e.monacoSetup&&e.monacoSetup(a),s(i)}return r.jsxRuntimeExports.jsx(u.Suspense,{fallback:r.jsxRuntimeExports.jsx(y.LoadingCover,{}),children:r.jsxRuntimeExports.jsx(E,{value:e.code,onMount:(a,o)=>{g(o)},onChange:e.onChange,defaultLanguage:"wandelscript",theme:n,options:{minimap:{enabled:!1},wordWrap:"on",automaticLayout:!0,...e.monacoOptions}})})});exports.WandelscriptEditor=j;
2
- //# sourceMappingURL=WandelscriptEditor-Dj7TBCkF.cjs.map