@threlte/xr 1.0.0-next.12 → 1.0.0-next.13

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 (41) hide show
  1. package/dist/components/ARButton.svelte +10 -3
  2. package/dist/components/ARButton.svelte.d.ts +2 -4
  3. package/dist/components/Controller.svelte +86 -46
  4. package/dist/components/Controller.svelte.d.ts +10 -10
  5. package/dist/components/Hand.svelte +109 -60
  6. package/dist/components/Hand.svelte.d.ts +6 -6
  7. package/dist/components/Headset.svelte +6 -4
  8. package/dist/components/Headset.svelte.d.ts +0 -1
  9. package/dist/components/VRButton.svelte +8 -3
  10. package/dist/components/VRButton.svelte.d.ts +0 -1
  11. package/dist/components/XR.svelte +156 -96
  12. package/dist/components/XR.svelte.d.ts +8 -9
  13. package/dist/components/XRButton.svelte +71 -38
  14. package/dist/components/XRButton.svelte.d.ts +8 -9
  15. package/dist/components/internal/Cursor.svelte +38 -25
  16. package/dist/components/internal/Cursor.svelte.d.ts +3 -4
  17. package/dist/components/internal/PointerCursor.svelte +46 -34
  18. package/dist/components/internal/PointerCursor.svelte.d.ts +2 -2
  19. package/dist/components/internal/ScenePortal.svelte +15 -12
  20. package/dist/components/internal/ScenePortal.svelte.d.ts +0 -1
  21. package/dist/components/internal/ShortRay.svelte +23 -12
  22. package/dist/components/internal/ShortRay.svelte.d.ts +2 -2
  23. package/dist/components/internal/TeleportCursor.svelte +51 -37
  24. package/dist/components/internal/TeleportCursor.svelte.d.ts +2 -2
  25. package/dist/components/internal/TeleportRay.svelte +76 -53
  26. package/dist/components/internal/TeleportRay.svelte.d.ts +2 -2
  27. package/dist/hooks/useController.d.ts +0 -1
  28. package/dist/hooks/useHand.d.ts +1 -1
  29. package/dist/hooks/useHandJoint.d.ts +1 -1
  30. package/dist/hooks/useHitTest.d.ts +0 -1
  31. package/dist/hooks/useXR.d.ts +0 -1
  32. package/dist/internal/stores.d.ts +0 -1
  33. package/dist/lib/getXRSessionOptions.d.ts +0 -1
  34. package/dist/lib/getXRSupportState.d.ts +1 -2
  35. package/dist/lib/toggleXRSession.d.ts +1 -2
  36. package/dist/plugins/pointerControls/context.d.ts +2 -2
  37. package/dist/plugins/pointerControls/index.d.ts +1 -1
  38. package/dist/plugins/teleportControls/context.d.ts +3 -3
  39. package/dist/plugins/teleportControls/index.d.ts +1 -1
  40. package/dist/types.d.ts +0 -1
  41. package/package.json +8 -8
@@ -1,15 +1,18 @@
1
- <script lang="ts">import { T, useThrelte } from "@threlte/core";
2
- import { Object3D } from "three";
3
- const { scene } = useThrelte();
4
- const proxy = new Object3D();
5
- proxy.add = (child) => {
6
- scene.add(child);
7
- return child;
8
- };
9
- proxy.remove = (child) => {
10
- scene.remove(child);
11
- return child;
12
- };
1
+ <script lang="ts">
2
+ import { T, useThrelte } from '@threlte/core'
3
+ import { Object3D } from 'three'
4
+
5
+ const { scene } = useThrelte()
6
+
7
+ const proxy = new Object3D()
8
+ proxy.add = (child) => {
9
+ scene.add(child)
10
+ return child
11
+ }
12
+ proxy.remove = (child) => {
13
+ scene.remove(child)
14
+ return child
15
+ }
13
16
  </script>
14
17
 
15
18
  <T
@@ -1,4 +1,3 @@
1
- /// <reference types="svelte" />
2
1
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
2
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
3
  $$bindings?: Bindings;
@@ -1,12 +1,22 @@
1
- <script lang="ts">import { T } from "@threlte/core";
2
- import { pointerState, teleportState, teleportIntersection } from "../../internal/stores";
3
- let { handedness, children } = $props();
4
- let hovering = $derived($teleportState[handedness].hovering);
5
- let intersection = $derived(teleportIntersection[handedness]);
6
- let visible = $derived(
7
- $pointerState[handedness].enabled || hovering && $intersection === void 0
8
- );
9
- const vertexShader = `
1
+ <script lang="ts">
2
+ import { T } from '@threlte/core'
3
+ import { pointerState, teleportState, teleportIntersection } from '../../internal/stores'
4
+ import type { Snippet } from 'svelte'
5
+
6
+ interface Props {
7
+ handedness: 'left' | 'right'
8
+ children?: Snippet
9
+ }
10
+
11
+ let { handedness, children }: Props = $props()
12
+
13
+ let hovering = $derived($teleportState[handedness].hovering)
14
+ let intersection = $derived(teleportIntersection[handedness])
15
+ let visible = $derived(
16
+ $pointerState[handedness].enabled || (hovering && $intersection === undefined)
17
+ )
18
+
19
+ const vertexShader = `
10
20
  uniform mat4 modelViewMatrix;
11
21
  uniform mat4 projectionMatrix;
12
22
  attribute vec2 uv;
@@ -15,13 +25,14 @@ const vertexShader = `
15
25
  void main() {
16
26
  vUv = uv;
17
27
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
18
- }`;
19
- const fragmentShader = `
28
+ }`
29
+
30
+ const fragmentShader = `
20
31
  precision mediump float;
21
32
  varying vec2 vUv;
22
33
  void main() {
23
34
  gl_FragColor = vec4(1.0, 1.0, 1.0, pow(vUv.y - 1.0, 2.0));
24
- }`;
35
+ }`
25
36
  </script>
26
37
 
27
38
  <T.Group {visible}>
@@ -1,6 +1,6 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  declare const ShortRay: import("svelte").Component<{
3
- handedness: 'left' | 'right';
4
- children?: Snippet<[]> | undefined;
3
+ handedness: "left" | "right";
4
+ children?: Snippet;
5
5
  }, {}, "">;
6
6
  export default ShortRay;
@@ -1,41 +1,55 @@
1
- <script lang="ts">import { spring } from "svelte/motion";
2
- import { Group, Matrix3, Vector3 } from "three";
3
- import { T, useTask } from "@threlte/core";
4
- import { teleportIntersection } from "../../internal/stores";
5
- import Cursor from "./Cursor.svelte";
6
- let { handedness, children } = $props();
7
- const ref = new Group();
8
- const vec3 = new Vector3();
9
- const normalMatrix = new Matrix3();
10
- const worldNormal = new Vector3();
11
- let intersection = $derived(teleportIntersection[handedness]);
12
- const { start, stop } = useTask(
13
- () => {
14
- if (intersection.current === void 0)
15
- return;
16
- const { point, face, object } = intersection.current;
17
- ref.position.lerp(point, 0.4);
18
- if (face) {
19
- normalMatrix.getNormalMatrix(object.matrixWorld);
20
- worldNormal.copy(face.normal).applyMatrix3(normalMatrix).normalize();
21
- ref.lookAt(vec3.addVectors(point, worldNormal));
22
- }
23
- },
24
- {
25
- autoStart: false
26
- }
27
- );
28
- const size = spring(0.1, { stiffness: 0.2 });
29
- $effect.pre(() => {
30
- if ($intersection === void 0) {
31
- size.set(0.1);
32
- stop();
33
- } else {
34
- size.set(1);
35
- ref.position.copy($intersection.point);
36
- start();
1
+ <script lang="ts">
2
+ import { spring } from 'svelte/motion'
3
+ import { Group, Matrix3, Vector3 } from 'three'
4
+ import { T, useTask } from '@threlte/core'
5
+ import { teleportIntersection } from '../../internal/stores'
6
+ import Cursor from './Cursor.svelte'
7
+ import type { Snippet } from 'svelte'
8
+
9
+ interface Props {
10
+ handedness: 'left' | 'right'
11
+ children?: Snippet
37
12
  }
38
- });
13
+
14
+ let { handedness, children }: Props = $props()
15
+
16
+ const ref = new Group()
17
+ const vec3 = new Vector3()
18
+ const normalMatrix = new Matrix3()
19
+ const worldNormal = new Vector3()
20
+
21
+ let intersection = $derived(teleportIntersection[handedness])
22
+
23
+ const { start, stop } = useTask(
24
+ () => {
25
+ if (intersection.current === undefined) return
26
+
27
+ const { point, face, object } = intersection.current
28
+ ref.position.lerp(point, 0.4)
29
+
30
+ if (face) {
31
+ normalMatrix.getNormalMatrix(object.matrixWorld)
32
+ worldNormal.copy(face.normal).applyMatrix3(normalMatrix).normalize()
33
+ ref.lookAt(vec3.addVectors(point, worldNormal))
34
+ }
35
+ },
36
+ {
37
+ autoStart: false
38
+ }
39
+ )
40
+
41
+ const size = spring(0.1, { stiffness: 0.2 })
42
+
43
+ $effect.pre(() => {
44
+ if ($intersection === undefined) {
45
+ size.set(0.1)
46
+ stop()
47
+ } else {
48
+ size.set(1)
49
+ ref.position.copy($intersection.point)
50
+ start()
51
+ }
52
+ })
39
53
  </script>
40
54
 
41
55
  <T
@@ -1,6 +1,6 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  declare const TeleportCursor: import("svelte").Component<{
3
- handedness: 'left' | 'right';
4
- children?: Snippet<[]> | undefined;
3
+ handedness: "left" | "right";
4
+ children?: Snippet;
5
5
  }, {}, "">;
6
6
  export default TeleportCursor;
@@ -1,58 +1,81 @@
1
- <script lang="ts">import { Vector3, QuadraticBezierCurve3, Vector2 } from "three";
2
- import { Line2 } from "three/examples/jsm/lines/Line2.js";
3
- import { LineGeometry } from "three/examples/jsm/lines/LineGeometry.js";
4
- import { LineMaterial } from "three/examples/jsm/lines/LineMaterial.js";
5
- import { T, useTask } from "@threlte/core";
6
- import { teleportIntersection } from "../../internal/stores";
7
- let { handedness, targetRay, children } = $props();
8
- let lineGeometry = new LineGeometry();
9
- const rayStart = new Vector3();
10
- const rayMidpoint = new Vector3();
11
- const curve = new QuadraticBezierCurve3();
12
- const rayDivisions = 40;
13
- const positions = new Float32Array(rayDivisions * 3);
14
- const vec3 = new Vector3();
15
- const v2_1 = new Vector2();
16
- const v2_2 = new Vector2();
17
- let intersection = $derived(teleportIntersection[handedness]);
18
- const setCurvePoints = (alpha = 0.3) => {
19
- if (intersection.current === void 0)
20
- return;
21
- const rayEnd = intersection.current.point;
22
- targetRay.getWorldPosition(rayStart);
23
- rayMidpoint.x = (rayStart.x + rayEnd.x) / 2;
24
- rayMidpoint.y = (rayStart.y + rayEnd.y) / 2;
25
- rayMidpoint.z = (rayStart.z + rayEnd.z) / 2;
26
- const arc = Math.log1p(
27
- v2_1.set(rayStart.x, rayStart.z).distanceTo(v2_2.set(rayEnd.x, rayEnd.z))
28
- );
29
- rayMidpoint.y += arc;
30
- curve.v0.lerp(rayStart, alpha);
31
- curve.v1.lerp(rayMidpoint, alpha);
32
- curve.v2.lerp(rayEnd, alpha);
33
- for (let i = 0, j = 0; i < rayDivisions; i += 1, j += 3) {
34
- const t = i / rayDivisions;
35
- curve.getPoint(t, vec3);
36
- positions[j + 0] = vec3.x;
37
- positions[j + 1] = vec3.y;
38
- positions[j + 2] = vec3.z;
1
+ <script lang="ts">
2
+ import { Vector3, QuadraticBezierCurve3, type XRTargetRaySpace, Vector2 } from 'three'
3
+ import { Line2 } from 'three/examples/jsm/lines/Line2.js'
4
+ import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js'
5
+ import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js'
6
+ import { T, useTask } from '@threlte/core'
7
+ import { teleportIntersection } from '../../internal/stores'
8
+ import type { Snippet } from 'svelte'
9
+
10
+ interface Props {
11
+ handedness: 'left' | 'right'
12
+ targetRay: XRTargetRaySpace
13
+ children?: Snippet
39
14
  }
40
- lineGeometry.setPositions(positions);
41
- };
42
- const { start, stop } = useTask(
43
- () => {
44
- setCurvePoints();
45
- },
46
- { autoStart: false }
47
- );
48
- $effect.pre(() => {
49
- if ($intersection === void 0) {
50
- stop();
51
- } else {
52
- setCurvePoints(1);
53
- start();
15
+
16
+ let { handedness, targetRay, children }: Props = $props()
17
+
18
+ let lineGeometry = new LineGeometry()
19
+
20
+ const rayStart = new Vector3()
21
+ const rayMidpoint = new Vector3()
22
+ const curve = new QuadraticBezierCurve3()
23
+ const rayDivisions = 40
24
+ const positions = new Float32Array(rayDivisions * 3)
25
+ const vec3 = new Vector3()
26
+
27
+ const v2_1 = new Vector2()
28
+ const v2_2 = new Vector2()
29
+
30
+ let intersection = $derived(teleportIntersection[handedness])
31
+
32
+ const setCurvePoints = (alpha = 0.3) => {
33
+ if (intersection.current === undefined) return
34
+
35
+ const rayEnd = intersection.current.point
36
+ targetRay.getWorldPosition(rayStart)
37
+
38
+ rayMidpoint.x = (rayStart.x + rayEnd.x) / 2
39
+ rayMidpoint.y = (rayStart.y + rayEnd.y) / 2
40
+ rayMidpoint.z = (rayStart.z + rayEnd.z) / 2
41
+
42
+ const arc = Math.log1p(
43
+ v2_1.set(rayStart.x, rayStart.z).distanceTo(v2_2.set(rayEnd.x, rayEnd.z))
44
+ )
45
+
46
+ // Create an arc
47
+ rayMidpoint.y += arc
48
+
49
+ curve.v0.lerp(rayStart, alpha)
50
+ curve.v1.lerp(rayMidpoint, alpha)
51
+ curve.v2.lerp(rayEnd, alpha)
52
+
53
+ for (let i = 0, j = 0; i < rayDivisions; i += 1, j += 3) {
54
+ const t = i / rayDivisions
55
+ curve.getPoint(t, vec3)
56
+ positions[j + 0] = vec3.x
57
+ positions[j + 1] = vec3.y
58
+ positions[j + 2] = vec3.z
59
+ }
60
+
61
+ lineGeometry.setPositions(positions)
54
62
  }
55
- });
63
+
64
+ const { start, stop } = useTask(
65
+ () => {
66
+ setCurvePoints()
67
+ },
68
+ { autoStart: false }
69
+ )
70
+
71
+ $effect.pre(() => {
72
+ if ($intersection === undefined) {
73
+ stop()
74
+ } else {
75
+ setCurvePoints(1)
76
+ start()
77
+ }
78
+ })
56
79
  </script>
57
80
 
58
81
  {#if children}
@@ -1,8 +1,8 @@
1
1
  import { type XRTargetRaySpace } from 'three';
2
2
  import type { Snippet } from 'svelte';
3
3
  declare const TeleportRay: import("svelte").Component<{
4
- handedness: 'left' | 'right';
4
+ handedness: "left" | "right";
5
5
  targetRay: XRTargetRaySpace;
6
- children?: Snippet<[]> | undefined;
6
+ children?: Snippet;
7
7
  }, {}, "">;
8
8
  export default TeleportRay;
@@ -1,4 +1,3 @@
1
- /// <reference types="webxr" />
2
1
  import { type CurrentWritable } from '@threlte/core';
3
2
  import type { XRController } from '../types';
4
3
  export declare const left: CurrentWritable<XRController | undefined>;
@@ -5,4 +5,4 @@ export declare const right: CurrentWritable<XRHand | undefined>;
5
5
  /**
6
6
  * Provides a reference to a current XRHand, filtered by handedness.
7
7
  */
8
- export declare const useHand: (handedness: 'left' | 'right') => CurrentWritable<undefined | XRHand>;
8
+ export declare const useHand: (handedness: "left" | "right") => CurrentWritable<undefined | XRHand>;
@@ -3,4 +3,4 @@ import type { HandJoints } from '../lib/handJoints';
3
3
  /**
4
4
  * Provides a reference to a requested hand joint, once available.
5
5
  */
6
- export declare const useHandJoint: (handedness: 'left' | 'right', joint: HandJoints) => import("@threlte/core").CurrentWritable<XRJointSpace | undefined>;
6
+ export declare const useHandJoint: (handedness: "left" | "right", joint: HandJoints) => import("@threlte/core").CurrentWritable<XRJointSpace | undefined>;
@@ -1,4 +1,3 @@
1
- /// <reference types="webxr" />
2
1
  import { Matrix4 } from 'three';
3
2
  export type HitTestCallback = (hitMatrix: Matrix4, hit: XRHitTestResult | undefined) => void;
4
3
  export type UseHitTestOptions = {
@@ -1,4 +1,3 @@
1
- /// <reference types="webxr" />
2
1
  import type { CurrentWritable } from '@threlte/core';
3
2
  /**
4
3
  * Provides access to context related to `<XR />`.
@@ -1,4 +1,3 @@
1
- /// <reference types="webxr" />
2
1
  import type { WebXRManager, Intersection } from 'three';
3
2
  import type { XRControllerEvents, XRHandEvents } from '../types';
4
3
  export declare const isPresenting: import("@threlte/core").CurrentWritable<boolean>;
@@ -1,2 +1 @@
1
- /// <reference types="webxr" />
2
1
  export declare const getXRSessionOptions: (referenceSpaceType: XRReferenceSpaceType | undefined, sessionInit: XRSessionInit | undefined) => XRSessionInit | undefined;
@@ -1,7 +1,6 @@
1
- /// <reference types="webxr" />
2
1
  /**
3
2
  * Gets the support state of requested session mode.
4
3
  * @param mode Session mode: 'inline' | 'immersive-vr' | 'immersive-ar'
5
4
  * @returns The current support state
6
5
  */
7
- export declare const getXRSupportState: (mode: XRSessionMode) => Promise<'unsupported' | 'insecure' | 'blocked' | 'supported'>;
6
+ export declare const getXRSupportState: (mode: XRSessionMode) => Promise<"unsupported" | "insecure" | "blocked" | "supported">;
@@ -1,4 +1,3 @@
1
- /// <reference types="webxr" />
2
1
  /**
3
2
  * Starts / ends an XR session.
4
3
  *
@@ -11,4 +10,4 @@ export declare const toggleXRSession: (sessionMode: XRSessionMode, sessionInit?:
11
10
  domOverlay?: {
12
11
  root: HTMLElement;
13
12
  } | undefined;
14
- }) | undefined, force?: 'enter' | 'exit') => Promise<XRSession | undefined>;
13
+ }) | undefined, force?: "enter" | "exit") => Promise<XRSession | undefined>;
@@ -1,7 +1,7 @@
1
1
  import type { Object3D } from 'three';
2
2
  import type { ControlsContext, HandContext } from './types';
3
- export declare const getHandContext: (hand: 'left' | 'right') => HandContext;
4
- export declare const setHandContext: (hand: 'left' | 'right', context: HandContext) => void;
3
+ export declare const getHandContext: (hand: "left" | "right") => HandContext;
4
+ export declare const setHandContext: (hand: "left" | "right", context: HandContext) => void;
5
5
  export declare const getControlsContext: () => ControlsContext;
6
6
  export declare const setControlsContext: (context: ControlsContext) => void;
7
7
  interface InternalContext {
@@ -21,7 +21,7 @@ export type PointerControlsOptions = {
21
21
  */
22
22
  fixedStep?: number;
23
23
  };
24
- export declare const pointerControls: (handedness: 'left' | 'right', options?: PointerControlsOptions) => {
24
+ export declare const pointerControls: (handedness: "left" | "right", options?: PointerControlsOptions) => {
25
25
  enabled: import("@threlte/core").CurrentWritable<boolean>;
26
26
  hovered: Map<string, import("./types").IntersectionEvent>;
27
27
  };
@@ -21,7 +21,7 @@ export interface HandContext {
21
21
  active: CurrentWritable<boolean>;
22
22
  hovered: CurrentWritable<Intersection | undefined>;
23
23
  }
24
- export declare const getHandContext: (hand: 'left' | 'right') => HandContext;
25
- export declare const setHandContext: (hand: 'left' | 'right', context: HandContext) => void;
24
+ export declare const getHandContext: (hand: "left" | "right") => HandContext;
25
+ export declare const setHandContext: (hand: "left" | "right", context: HandContext) => void;
26
26
  export declare const useTeleportControls: () => Context;
27
- export declare const createTeleportContext: (compute: TeleportControlsOptions['compute']) => Context;
27
+ export declare const createTeleportContext: (compute: TeleportControlsOptions["compute"]) => Context;
@@ -12,7 +12,7 @@ export interface TeleportControlsOptions {
12
12
  */
13
13
  fixedStep?: number;
14
14
  }
15
- export declare const teleportControls: (handedness: 'left' | 'right', options?: TeleportControlsOptions) => {
15
+ export declare const teleportControls: (handedness: "left" | "right", options?: TeleportControlsOptions) => {
16
16
  enabled: import("@threlte/core").CurrentWritable<boolean>;
17
17
  hovered: import("@threlte/core").CurrentWritable<import("three").Intersection<import("three").Object3D<import("three").Object3DEventMap>> | undefined>;
18
18
  active: import("@threlte/core").CurrentWritable<boolean>;
package/dist/types.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- /// <reference types="webxr" />
2
1
  import type { Event, Group, XRTargetRaySpace, XRGripSpace, XRHandSpace } from 'three';
3
2
  import type { XRControllerModel } from 'three/examples/jsm/webxr/XRControllerModelFactory.js';
4
3
  import type { XRHandModel } from 'three/examples/jsm/webxr/XRHandModelFactory.js';
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@threlte/xr",
3
- "version": "1.0.0-next.12",
3
+ "version": "1.0.0-next.13",
4
4
  "author": "Micheal Parks <michealparks1989@gmail.com> (https://parks.lol)",
5
5
  "license": "MIT",
6
6
  "description": "Tools to more easily create VR and AR experiences with Threlte",
7
7
  "devDependencies": {
8
- "@sveltejs/adapter-auto": "^3.2.0",
9
- "@sveltejs/kit": "^2.7.2",
8
+ "@sveltejs/adapter-auto": "^3.3.1",
9
+ "@sveltejs/kit": "^2.7.7",
10
10
  "@sveltejs/package": "^2.3.7",
11
- "@sveltejs/vite-plugin-svelte": "^3.1.0",
11
+ "@sveltejs/vite-plugin-svelte": "^4.0.0",
12
12
  "@types/three": "^0.169.0",
13
13
  "@typescript-eslint/eslint-plugin": "^7.6.0",
14
14
  "@typescript-eslint/parser": "^7.6.0",
@@ -17,14 +17,14 @@
17
17
  "eslint-plugin-svelte": "^2.36.0",
18
18
  "postcss": "^8.4.38",
19
19
  "publint": "^0.2.7",
20
- "svelte": "^5.1.6",
20
+ "svelte": "^5.1.10",
21
21
  "svelte-check": "^3.6.9",
22
- "three": "^0.169.0",
22
+ "three": "^0.170.0",
23
23
  "tslib": "^2.6.2",
24
- "typescript": "^5.4.5",
24
+ "typescript": "^5.6.3",
25
25
  "vite": "^5.2.8",
26
26
  "vite-plugin-mkcert": "^1.17.5",
27
- "@threlte/core": "8.0.0-next.23"
27
+ "@threlte/core": "8.0.0-next.28"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "svelte": ">=5",