@threlte/xr 0.1.2 → 1.0.0-next.0

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.
@@ -9,8 +9,8 @@
9
9
  />
10
10
  ```
11
11
  -->
12
-
13
12
  <script>import XRButton from "./XRButton.svelte";
13
+ let { ...props } = $props();
14
14
  </script>
15
15
 
16
16
  <XRButton
@@ -19,9 +19,6 @@
19
19
  requiredFeatures: ['plane-detection'],
20
20
  optionalFeatures: ['local-floor', 'bounded-floor', 'hand-tracking', 'layers', 'hit-test']
21
21
  }}
22
- {...$$restProps}
23
- mode='immersive-ar'
24
-
25
- on:click
26
- on:error
22
+ {...props}
23
+ mode="immersive-ar"
27
24
  />
@@ -1,227 +1,16 @@
1
1
  /// <reference types="webxr" />
2
2
  import { SvelteComponent } from "svelte";
3
3
  declare const __propDef: {
4
- props: {
5
- type?: "button" | "reset" | "submit" | null | undefined;
6
- id?: string | null | undefined;
7
- name?: string | null | undefined;
8
- color?: string | null | undefined;
9
- translate?: "" | "yes" | "no" | null | undefined;
10
- value?: string | number | string[] | null | undefined;
11
- hidden?: boolean | null | undefined;
12
- form?: string | null | undefined;
13
- slot?: string | null | undefined;
14
- style?: string | null | undefined;
15
- title?: string | null | undefined;
16
- dir?: string | null | undefined;
17
- contextmenu?: string | null | undefined;
18
- autocapitalize?: string | null | undefined;
19
- draggable?: import("svelte/elements").Booleanish | null | undefined;
20
- inert?: boolean | null | undefined;
21
- lang?: string | null | undefined;
22
- spellcheck?: import("svelte/elements").Booleanish | null | undefined;
23
- part?: string | null | undefined;
24
- prefix?: string | null | undefined;
25
- role?: import("svelte/elements").AriaRole | null | undefined;
26
- autofocus?: boolean | null | undefined;
27
- disabled?: boolean | null | undefined;
28
- class?: string | null | undefined;
29
- typeof?: string | null | undefined;
30
- radiogroup?: string | null | undefined;
31
- accesskey?: string | null | undefined;
32
- contenteditable?: "inherit" | import("svelte/elements").Booleanish | null | undefined;
33
- enterkeyhint?: "search" | "next" | "done" | "enter" | "go" | "previous" | "send" | null | undefined;
34
- placeholder?: string | null | undefined;
35
- tabindex?: number | null | undefined;
36
- about?: string | null | undefined;
37
- datatype?: string | null | undefined;
38
- inlist?: any;
39
- property?: string | null | undefined;
40
- resource?: string | null | undefined;
41
- vocab?: string | null | undefined;
42
- autocorrect?: string | null | undefined;
43
- autosave?: string | null | undefined;
44
- itemprop?: string | null | undefined;
45
- itemscope?: boolean | null | undefined;
46
- itemtype?: string | null | undefined;
47
- itemid?: string | null | undefined;
48
- itemref?: string | null | undefined;
49
- results?: number | null | undefined;
50
- security?: string | null | undefined;
51
- unselectable?: "off" | "on" | null | undefined;
52
- inputmode?: "search" | "numeric" | "none" | "url" | "text" | "email" | "tel" | "decimal" | null | undefined;
53
- is?: string | null | undefined;
54
- 'bind:innerHTML'?: string | null | undefined;
55
- 'bind:textContent'?: string | null | undefined;
56
- 'bind:innerText'?: string | null | undefined;
57
- 'bind:contentRect'?: DOMRectReadOnly | null | undefined;
58
- 'bind:contentBoxSize'?: ResizeObserverSize[] | null | undefined;
59
- 'bind:borderBoxSize'?: ResizeObserverSize[] | null | undefined;
60
- 'bind:devicePixelContentBoxSize'?: ResizeObserverSize[] | null | undefined;
61
- 'data-sveltekit-keepfocus'?: true | "" | "off" | null | undefined;
62
- 'data-sveltekit-noscroll'?: true | "" | "off" | null | undefined;
63
- 'data-sveltekit-preload-code'?: true | "" | "off" | "eager" | "viewport" | "hover" | "tap" | null | undefined;
64
- 'data-sveltekit-preload-data'?: true | "" | "off" | "hover" | "tap" | null | undefined;
65
- 'data-sveltekit-reload'?: true | "" | "off" | null | undefined;
66
- 'data-sveltekit-replacestate'?: true | "" | "off" | null | undefined;
67
- 'aria-activedescendant'?: string | null | undefined;
68
- 'aria-atomic'?: import("svelte/elements").Booleanish | null | undefined;
69
- 'aria-autocomplete'?: "inline" | "both" | "none" | "list" | null | undefined;
70
- 'aria-busy'?: import("svelte/elements").Booleanish | null | undefined;
71
- 'aria-checked'?: boolean | "false" | "true" | "mixed" | null | undefined;
72
- 'aria-colcount'?: number | null | undefined;
73
- 'aria-colindex'?: number | null | undefined;
74
- 'aria-colspan'?: number | null | undefined;
75
- 'aria-controls'?: string | null | undefined;
76
- 'aria-current'?: "time" | "location" | "page" | import("svelte/elements").Booleanish | "step" | "date" | null | undefined;
77
- 'aria-describedby'?: string | null | undefined;
78
- 'aria-details'?: string | null | undefined;
79
- 'aria-disabled'?: import("svelte/elements").Booleanish | null | undefined;
80
- 'aria-dropeffect'?: "link" | "none" | "copy" | "move" | "execute" | "popup" | null | undefined;
81
- 'aria-errormessage'?: string | null | undefined;
82
- 'aria-expanded'?: import("svelte/elements").Booleanish | null | undefined;
83
- 'aria-flowto'?: string | null | undefined;
84
- 'aria-grabbed'?: import("svelte/elements").Booleanish | null | undefined;
85
- 'aria-haspopup'?: "grid" | "dialog" | "menu" | import("svelte/elements").Booleanish | "listbox" | "tree" | null | undefined;
86
- 'aria-hidden'?: import("svelte/elements").Booleanish | null | undefined;
87
- 'aria-invalid'?: import("svelte/elements").Booleanish | "grammar" | "spelling" | null | undefined;
88
- 'aria-keyshortcuts'?: string | null | undefined;
89
- 'aria-label'?: string | null | undefined;
90
- 'aria-labelledby'?: string | null | undefined;
91
- 'aria-level'?: number | null | undefined;
92
- 'aria-live'?: "off" | "assertive" | "polite" | null | undefined;
93
- 'aria-modal'?: import("svelte/elements").Booleanish | null | undefined;
94
- 'aria-multiline'?: import("svelte/elements").Booleanish | null | undefined;
95
- 'aria-multiselectable'?: import("svelte/elements").Booleanish | null | undefined;
96
- 'aria-orientation'?: "horizontal" | "vertical" | null | undefined;
97
- 'aria-owns'?: string | null | undefined;
98
- 'aria-placeholder'?: string | null | undefined;
99
- 'aria-posinset'?: number | null | undefined;
100
- 'aria-pressed'?: boolean | "false" | "true" | "mixed" | null | undefined;
101
- 'aria-readonly'?: import("svelte/elements").Booleanish | null | undefined;
102
- 'aria-relevant'?: "all" | "text" | "additions" | "additions removals" | "additions text" | "removals" | "removals additions" | "removals text" | "text additions" | "text removals" | null | undefined;
103
- 'aria-required'?: import("svelte/elements").Booleanish | null | undefined;
104
- 'aria-roledescription'?: string | null | undefined;
105
- 'aria-rowcount'?: number | null | undefined;
106
- 'aria-rowindex'?: number | null | undefined;
107
- 'aria-rowspan'?: number | null | undefined;
108
- 'aria-selected'?: import("svelte/elements").Booleanish | null | undefined;
109
- 'aria-setsize'?: number | null | undefined;
110
- 'aria-sort'?: "none" | "other" | "ascending" | "descending" | null | undefined;
111
- 'aria-valuemax'?: number | null | undefined;
112
- 'aria-valuemin'?: number | null | undefined;
113
- 'aria-valuenow'?: number | null | undefined;
114
- 'aria-valuetext'?: string | null | undefined;
115
- 'on:copy'?: import("svelte/elements").ClipboardEventHandler<HTMLButtonElement> | null | undefined;
116
- 'on:cut'?: import("svelte/elements").ClipboardEventHandler<HTMLButtonElement> | null | undefined;
117
- 'on:paste'?: import("svelte/elements").ClipboardEventHandler<HTMLButtonElement> | null | undefined;
118
- 'on:compositionend'?: import("svelte/elements").CompositionEventHandler<HTMLButtonElement> | null | undefined;
119
- 'on:compositionstart'?: import("svelte/elements").CompositionEventHandler<HTMLButtonElement> | null | undefined;
120
- 'on:compositionupdate'?: import("svelte/elements").CompositionEventHandler<HTMLButtonElement> | null | undefined;
121
- 'on:focus'?: import("svelte/elements").FocusEventHandler<HTMLButtonElement> | null | undefined;
122
- 'on:focusin'?: import("svelte/elements").FocusEventHandler<HTMLButtonElement> | null | undefined;
123
- 'on:focusout'?: import("svelte/elements").FocusEventHandler<HTMLButtonElement> | null | undefined;
124
- 'on:blur'?: import("svelte/elements").FocusEventHandler<HTMLButtonElement> | null | undefined;
125
- 'on:change'?: import("svelte/elements").FormEventHandler<HTMLButtonElement> | null | undefined;
126
- 'on:beforeinput'?: import("svelte/elements").EventHandler<InputEvent, HTMLButtonElement> | null | undefined;
127
- 'on:input'?: import("svelte/elements").FormEventHandler<HTMLButtonElement> | null | undefined;
128
- 'on:reset'?: import("svelte/elements").FormEventHandler<HTMLButtonElement> | null | undefined;
129
- 'on:submit'?: import("svelte/elements").EventHandler<SubmitEvent, HTMLButtonElement> | null | undefined;
130
- 'on:invalid'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
131
- 'on:formdata'?: import("svelte/elements").EventHandler<FormDataEvent, HTMLButtonElement> | null | undefined;
132
- 'on:load'?: import("svelte/elements").EventHandler<Event, Element> | null | undefined;
133
- 'on:error'?: import("svelte/elements").EventHandler<Event, Element> | null | undefined;
134
- 'on:toggle'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
135
- 'on:keydown'?: import("svelte/elements").KeyboardEventHandler<HTMLButtonElement> | null | undefined;
136
- 'on:keypress'?: import("svelte/elements").KeyboardEventHandler<HTMLButtonElement> | null | undefined;
137
- 'on:keyup'?: import("svelte/elements").KeyboardEventHandler<HTMLButtonElement> | null | undefined;
138
- 'on:abort'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
139
- 'on:canplay'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
140
- 'on:canplaythrough'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
141
- 'on:cuechange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
142
- 'on:durationchange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
143
- 'on:emptied'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
144
- 'on:encrypted'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
145
- 'on:ended'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
146
- 'on:loadeddata'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
147
- 'on:loadedmetadata'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
148
- 'on:loadstart'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
149
- 'on:pause'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
150
- 'on:play'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
151
- 'on:playing'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
152
- 'on:progress'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
153
- 'on:ratechange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
154
- 'on:seeked'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
155
- 'on:seeking'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
156
- 'on:stalled'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
157
- 'on:suspend'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
158
- 'on:timeupdate'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
159
- 'on:volumechange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
160
- 'on:waiting'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
161
- 'on:auxclick'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
162
- 'on:click'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
163
- 'on:contextmenu'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
164
- 'on:dblclick'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
165
- 'on:drag'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
166
- 'on:dragend'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
167
- 'on:dragenter'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
168
- 'on:dragexit'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
169
- 'on:dragleave'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
170
- 'on:dragover'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
171
- 'on:dragstart'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
172
- 'on:drop'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
173
- 'on:mousedown'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
174
- 'on:mouseenter'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
175
- 'on:mouseleave'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
176
- 'on:mousemove'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
177
- 'on:mouseout'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
178
- 'on:mouseover'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
179
- 'on:mouseup'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
180
- 'on:select'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
181
- 'on:selectionchange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
182
- 'on:selectstart'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
183
- 'on:touchcancel'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
184
- 'on:touchend'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
185
- 'on:touchmove'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
186
- 'on:touchstart'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
187
- 'on:gotpointercapture'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
188
- 'on:pointercancel'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
189
- 'on:pointerdown'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
190
- 'on:pointerenter'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
191
- 'on:pointerleave'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
192
- 'on:pointermove'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
193
- 'on:pointerout'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
194
- 'on:pointerover'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
195
- 'on:pointerup'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
196
- 'on:lostpointercapture'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
197
- 'on:scroll'?: import("svelte/elements").UIEventHandler<HTMLButtonElement> | null | undefined;
198
- 'on:resize'?: import("svelte/elements").UIEventHandler<HTMLButtonElement> | null | undefined;
199
- 'on:wheel'?: import("svelte/elements").WheelEventHandler<HTMLButtonElement> | null | undefined;
200
- 'on:animationstart'?: import("svelte/elements").AnimationEventHandler<HTMLButtonElement> | null | undefined;
201
- 'on:animationend'?: import("svelte/elements").AnimationEventHandler<HTMLButtonElement> | null | undefined;
202
- 'on:animationiteration'?: import("svelte/elements").AnimationEventHandler<HTMLButtonElement> | null | undefined;
203
- 'on:transitionstart'?: import("svelte/elements").TransitionEventHandler<HTMLButtonElement> | null | undefined;
204
- 'on:transitionrun'?: import("svelte/elements").TransitionEventHandler<HTMLButtonElement> | null | undefined;
205
- 'on:transitionend'?: import("svelte/elements").TransitionEventHandler<HTMLButtonElement> | null | undefined;
206
- 'on:transitioncancel'?: import("svelte/elements").TransitionEventHandler<HTMLButtonElement> | null | undefined;
207
- 'on:outrostart'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLButtonElement> | null | undefined;
208
- 'on:outroend'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLButtonElement> | null | undefined;
209
- 'on:introstart'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLButtonElement> | null | undefined;
210
- 'on:introend'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLButtonElement> | null | undefined;
211
- 'on:message'?: import("svelte/elements").MessageEventHandler<HTMLButtonElement> | null | undefined;
212
- 'on:messageerror'?: import("svelte/elements").MessageEventHandler<HTMLButtonElement> | null | undefined;
213
- 'on:visibilitychange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
214
- 'on:cancel'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
215
- 'on:close'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
216
- 'on:fullscreenchange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
217
- 'on:fullscreenerror'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
218
- formaction?: string | null | undefined;
219
- formenctype?: string | null | undefined;
220
- formmethod?: string | null | undefined;
221
- formnovalidate?: boolean | null | undefined;
222
- formtarget?: string | null | undefined;
4
+ props: Omit<import("svelte/elements").HTMLButtonAttributes & {
5
+ mode: XRSessionMode;
6
+ sessionInit?: (XRSessionInit & {
7
+ domOverlay?: {
8
+ root: HTMLElement;
9
+ } | undefined;
10
+ }) | undefined;
223
11
  force?: "enter" | "exit" | undefined;
224
12
  styled?: boolean | undefined;
13
+ }, "mode" | "sessionInit"> & {
225
14
  sessionInit?: (XRSessionInit & {
226
15
  domOverlay?: {
227
16
  root: HTMLElement;
@@ -229,12 +18,6 @@ declare const __propDef: {
229
18
  }) | undefined;
230
19
  };
231
20
  events: {
232
- click: CustomEvent<{
233
- state: "blocked" | "unsupported" | "insecure" | "supported";
234
- nativeEvent: MouseEvent;
235
- }>;
236
- error: CustomEvent<Error>;
237
- } & {
238
21
  [evt: string]: CustomEvent<any>;
239
22
  };
240
23
  slots: {};
@@ -5,9 +5,9 @@
5
5
 
6
6
  context="module"
7
7
  >import { writable } from "svelte/store";
8
- import { T, createRawEventDispatcher } from "@threlte/core";
8
+ import { T } from "@threlte/core";
9
9
  import { left as leftStore, right as rightStore } from "../hooks/useController";
10
- import { isHandTracking, pointerState, teleportState, controllerDispatchers } from "../internal/stores";
10
+ import { isHandTracking, pointerState, teleportState, controllerEvents } from "../internal/stores";
11
11
  import PointerCursor from "./internal/PointerCursor.svelte";
12
12
  import ShortRay from "./internal/ShortRay.svelte";
13
13
  import ScenePortal from "./internal/ScenePortal.svelte";
@@ -19,28 +19,17 @@ const stores = {
19
19
  };
20
20
  </script>
21
21
 
22
- <script>export let left = void 0;
23
- export let right = void 0;
24
- export let hand = void 0;
25
- const dispatch = createRawEventDispatcher();
22
+ <script>let { left, right, hand, ...props } = $props();
26
23
  const handedness = writable(left ? "left" : right ? "right" : hand);
27
- $:
28
- handedness.set(left ? "left" : right ? "right" : hand);
29
- controllerDispatchers[$handedness].set(dispatch);
30
- $:
31
- controllerDispatchers[$handedness].set(dispatch);
32
- $:
33
- store = stores[$handedness];
34
- $:
35
- grip = $store?.grip;
36
- $:
37
- targetRay = $store?.targetRay;
38
- $:
39
- model = $store?.model;
40
- $:
41
- hasPointerControls = $pointerState[$handedness].enabled;
42
- $:
43
- hasTeleportControls = $teleportState[$handedness].enabled;
24
+ $effect.pre(() => handedness.set(left ? "left" : right ? "right" : hand));
25
+ controllerEvents[$handedness].set(props.$$events);
26
+ $effect.pre(() => controllerEvents[$handedness].set(props.$$events));
27
+ let store = $derived(stores[$handedness]);
28
+ let grip = $derived($store?.grip);
29
+ let targetRay = $derived($store?.targetRay);
30
+ let model = $derived($store?.model);
31
+ let hasPointerControls = $derived($pointerState[$handedness].enabled);
32
+ let hasTeleportControls = $derived($teleportState[$handedness].enabled);
44
33
  </script>
45
34
 
46
35
  {#if !$isHandTracking}
@@ -1,8 +1,9 @@
1
1
  <script
2
2
 
3
3
  context="module"
4
- >import { T, useThrelte, createRawEventDispatcher, useTask } from "@threlte/core";
5
- import { isHandTracking, handDispatchers } from "../internal/stores";
4
+ >import { Group } from "three";
5
+ import { T, useThrelte, useTask } from "@threlte/core";
6
+ import { isHandTracking, handEvents } from "../internal/stores";
6
7
  import { left as leftStore, right as rightStore } from "../hooks/useHand";
7
8
  import ScenePortal from "./internal/ScenePortal.svelte";
8
9
  import { writable } from "svelte/store";
@@ -12,18 +13,13 @@ const stores = {
12
13
  };
13
14
  </script>
14
15
 
15
- <script>export let left = void 0;
16
- export let right = void 0;
17
- export let hand = void 0;
18
- const dispatch = createRawEventDispatcher();
16
+ <script>let { left, right, hand, ...props } = $props();
19
17
  const { xr } = useThrelte().renderer;
20
18
  const space = xr.getReferenceSpace();
21
19
  const handedness = writable(left ? "left" : right ? "right" : hand);
22
- $:
23
- handedness.set(left ? "left" : right ? "right" : hand);
24
- $:
25
- handDispatchers[$handedness].set(dispatch);
26
- let children;
20
+ $effect.pre(() => handedness.set(left ? "left" : right ? "right" : hand));
21
+ $effect.pre(() => handEvents[$handedness].set(props.$$events));
22
+ let children = new Group();
27
23
  const { start, stop } = useTask(
28
24
  () => {
29
25
  const frame = xr.getFrame();
@@ -39,18 +35,16 @@ const { start, stop } = useTask(
39
35
  },
40
36
  { autoStart: false }
41
37
  );
42
- $:
38
+ $effect.pre(() => {
43
39
  if ($isHandTracking && ($$slots.wrist || $$slots.default) && inputSource) {
44
40
  start();
45
41
  } else {
46
42
  stop();
47
43
  }
48
- $:
49
- store = stores[$handedness];
50
- $:
51
- inputSource = $store?.inputSource;
52
- $:
53
- model = $store?.model;
44
+ });
45
+ let store = $derived(stores[$handedness]);
46
+ let inputSource = $derived($store?.inputSource);
47
+ let model = $derived($store?.model);
54
48
  </script>
55
49
 
56
50
  {#if $store?.hand && $isHandTracking}
@@ -69,9 +63,9 @@ $:
69
63
 
70
64
  {#if $isHandTracking}
71
65
  <ScenePortal>
72
- <T.Group bind:ref={children}>
66
+ <T is={children}>
73
67
  <slot name="wrist" />
74
68
  <slot />
75
- </T.Group>
69
+ </T>
76
70
  </ScenePortal>
77
71
  {/if}
@@ -1,7 +1,7 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { XRHandEvent } from '../types';
3
3
  declare const __propDef: {
4
- props: {
4
+ props: ({
5
5
  /** Whether the XRHand should be matched with the left hand. */
6
6
  left: true;
7
7
  right?: undefined;
@@ -16,6 +16,13 @@ declare const __propDef: {
16
16
  hand: 'left' | 'right';
17
17
  left?: undefined;
18
18
  right?: undefined;
19
+ }) & {
20
+ $$events: {
21
+ connected: XRHandEvent<'connected'>;
22
+ disconnected: XRHandEvent<'disconnected'>;
23
+ pinchstart: XRHandEvent<'pinchstart'>;
24
+ pinchend: XRHandEvent<'pinchend'>;
25
+ };
19
26
  };
20
27
  slots: {
21
28
  'target-ray': {};
@@ -1,4 +1,3 @@
1
-
2
1
  <script>import { T } from "@threlte/core";
3
2
  import { useHeadset } from "../hooks/useHeadset";
4
3
  import ScenePortal from "./internal/ScenePortal.svelte";
@@ -6,7 +5,7 @@ const headset = useHeadset();
6
5
  </script>
7
6
 
8
7
  <ScenePortal>
9
- <T is={headset}>
10
- <slot />
11
- </T>
8
+ <T is={headset}>
9
+ <slot />
10
+ </T>
12
11
  </ScenePortal>
@@ -9,16 +9,14 @@
9
9
  />
10
10
  ```
11
11
  -->
12
-
13
12
  <script>import XRButton from "./XRButton.svelte";
13
+ let { ...props } = $props();
14
14
  </script>
15
15
 
16
16
  <XRButton
17
17
  sessionInit={{
18
18
  optionalFeatures: ['local-floor', 'bounded-floor', 'hand-tracking', 'layers']
19
19
  }}
20
- {...$$restProps}
21
- mode='immersive-vr'
22
- on:click
23
- on:error
20
+ {...props}
21
+ mode="immersive-vr"
24
22
  />