@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.
@@ -1,234 +1,17 @@
1
+ /// <reference types="webxr" />
1
2
  import { SvelteComponent } from "svelte";
2
3
  declare const __propDef: {
3
- props: {
4
- type?: "button" | "reset" | "submit" | null | undefined;
5
- id?: string | null | undefined;
6
- name?: string | null | undefined;
7
- color?: string | null | undefined;
8
- translate?: "" | "yes" | "no" | null | undefined;
9
- value?: string | number | string[] | null | undefined;
10
- hidden?: boolean | null | undefined;
11
- form?: string | null | undefined;
12
- slot?: string | null | undefined;
13
- style?: string | null | undefined;
14
- title?: string | null | undefined;
15
- dir?: string | null | undefined;
16
- contextmenu?: string | null | undefined;
17
- autocapitalize?: string | null | undefined;
18
- draggable?: import("svelte/elements").Booleanish | null | undefined;
19
- inert?: boolean | null | undefined;
20
- lang?: string | null | undefined;
21
- spellcheck?: import("svelte/elements").Booleanish | null | undefined;
22
- part?: string | null | undefined;
23
- prefix?: string | null | undefined;
24
- role?: import("svelte/elements").AriaRole | null | undefined;
25
- autofocus?: boolean | null | undefined;
26
- disabled?: boolean | null | undefined;
27
- class?: string | null | undefined;
28
- typeof?: string | null | undefined;
29
- radiogroup?: string | null | undefined;
30
- accesskey?: string | null | undefined;
31
- contenteditable?: "inherit" | import("svelte/elements").Booleanish | null | undefined;
32
- enterkeyhint?: "search" | "next" | "done" | "enter" | "go" | "previous" | "send" | null | undefined;
33
- placeholder?: string | null | undefined;
34
- tabindex?: number | null | undefined;
35
- about?: string | null | undefined;
36
- datatype?: string | null | undefined;
37
- inlist?: any;
38
- property?: string | null | undefined;
39
- resource?: string | null | undefined;
40
- vocab?: string | null | undefined;
41
- autocorrect?: string | null | undefined;
42
- autosave?: string | null | undefined;
43
- itemprop?: string | null | undefined;
44
- itemscope?: boolean | null | undefined;
45
- itemtype?: string | null | undefined;
46
- itemid?: string | null | undefined;
47
- itemref?: string | null | undefined;
48
- results?: number | null | undefined;
49
- security?: string | null | undefined;
50
- unselectable?: "off" | "on" | null | undefined;
51
- inputmode?: "search" | "numeric" | "none" | "url" | "text" | "email" | "tel" | "decimal" | null | undefined;
52
- is?: string | null | undefined;
53
- 'bind:innerHTML'?: string | null | undefined;
54
- 'bind:textContent'?: string | null | undefined;
55
- 'bind:innerText'?: string | null | undefined;
56
- 'bind:contentRect'?: DOMRectReadOnly | null | undefined;
57
- 'bind:contentBoxSize'?: ResizeObserverSize[] | null | undefined;
58
- 'bind:borderBoxSize'?: ResizeObserverSize[] | null | undefined;
59
- 'bind:devicePixelContentBoxSize'?: ResizeObserverSize[] | null | undefined;
60
- 'data-sveltekit-keepfocus'?: true | "" | "off" | null | undefined;
61
- 'data-sveltekit-noscroll'?: true | "" | "off" | null | undefined;
62
- 'data-sveltekit-preload-code'?: true | "" | "off" | "eager" | "viewport" | "hover" | "tap" | null | undefined;
63
- 'data-sveltekit-preload-data'?: true | "" | "off" | "hover" | "tap" | null | undefined;
64
- 'data-sveltekit-reload'?: true | "" | "off" | null | undefined;
65
- 'data-sveltekit-replacestate'?: true | "" | "off" | null | undefined;
66
- 'aria-activedescendant'?: string | null | undefined;
67
- 'aria-atomic'?: import("svelte/elements").Booleanish | null | undefined;
68
- 'aria-autocomplete'?: "inline" | "both" | "none" | "list" | null | undefined;
69
- 'aria-busy'?: import("svelte/elements").Booleanish | null | undefined;
70
- 'aria-checked'?: boolean | "false" | "true" | "mixed" | null | undefined;
71
- 'aria-colcount'?: number | null | undefined;
72
- 'aria-colindex'?: number | null | undefined;
73
- 'aria-colspan'?: number | null | undefined;
74
- 'aria-controls'?: string | null | undefined;
75
- 'aria-current'?: "time" | "location" | "page" | import("svelte/elements").Booleanish | "step" | "date" | null | undefined;
76
- 'aria-describedby'?: string | null | undefined;
77
- 'aria-details'?: string | null | undefined;
78
- 'aria-disabled'?: import("svelte/elements").Booleanish | null | undefined;
79
- 'aria-dropeffect'?: "link" | "none" | "copy" | "move" | "execute" | "popup" | null | undefined;
80
- 'aria-errormessage'?: string | null | undefined;
81
- 'aria-expanded'?: import("svelte/elements").Booleanish | null | undefined;
82
- 'aria-flowto'?: string | null | undefined;
83
- 'aria-grabbed'?: import("svelte/elements").Booleanish | null | undefined;
84
- 'aria-haspopup'?: "grid" | "dialog" | "menu" | import("svelte/elements").Booleanish | "listbox" | "tree" | null | undefined;
85
- 'aria-hidden'?: import("svelte/elements").Booleanish | null | undefined;
86
- 'aria-invalid'?: import("svelte/elements").Booleanish | "grammar" | "spelling" | null | undefined;
87
- 'aria-keyshortcuts'?: string | null | undefined;
88
- 'aria-label'?: string | null | undefined;
89
- 'aria-labelledby'?: string | null | undefined;
90
- 'aria-level'?: number | null | undefined;
91
- 'aria-live'?: "off" | "assertive" | "polite" | null | undefined;
92
- 'aria-modal'?: import("svelte/elements").Booleanish | null | undefined;
93
- 'aria-multiline'?: import("svelte/elements").Booleanish | null | undefined;
94
- 'aria-multiselectable'?: import("svelte/elements").Booleanish | null | undefined;
95
- 'aria-orientation'?: "horizontal" | "vertical" | null | undefined;
96
- 'aria-owns'?: string | null | undefined;
97
- 'aria-placeholder'?: string | null | undefined;
98
- 'aria-posinset'?: number | null | undefined;
99
- 'aria-pressed'?: boolean | "false" | "true" | "mixed" | null | undefined;
100
- 'aria-readonly'?: import("svelte/elements").Booleanish | null | undefined;
101
- 'aria-relevant'?: "all" | "text" | "additions" | "additions removals" | "additions text" | "removals" | "removals additions" | "removals text" | "text additions" | "text removals" | null | undefined;
102
- 'aria-required'?: import("svelte/elements").Booleanish | null | undefined;
103
- 'aria-roledescription'?: string | null | undefined;
104
- 'aria-rowcount'?: number | null | undefined;
105
- 'aria-rowindex'?: number | null | undefined;
106
- 'aria-rowspan'?: number | null | undefined;
107
- 'aria-selected'?: import("svelte/elements").Booleanish | null | undefined;
108
- 'aria-setsize'?: number | null | undefined;
109
- 'aria-sort'?: "none" | "other" | "ascending" | "descending" | null | undefined;
110
- 'aria-valuemax'?: number | null | undefined;
111
- 'aria-valuemin'?: number | null | undefined;
112
- 'aria-valuenow'?: number | null | undefined;
113
- 'aria-valuetext'?: string | null | undefined;
114
- 'on:copy'?: import("svelte/elements").ClipboardEventHandler<HTMLButtonElement> | null | undefined;
115
- 'on:cut'?: import("svelte/elements").ClipboardEventHandler<HTMLButtonElement> | null | undefined;
116
- 'on:paste'?: import("svelte/elements").ClipboardEventHandler<HTMLButtonElement> | null | undefined;
117
- 'on:compositionend'?: import("svelte/elements").CompositionEventHandler<HTMLButtonElement> | null | undefined;
118
- 'on:compositionstart'?: import("svelte/elements").CompositionEventHandler<HTMLButtonElement> | null | undefined;
119
- 'on:compositionupdate'?: import("svelte/elements").CompositionEventHandler<HTMLButtonElement> | null | undefined;
120
- 'on:focus'?: import("svelte/elements").FocusEventHandler<HTMLButtonElement> | null | undefined;
121
- 'on:focusin'?: import("svelte/elements").FocusEventHandler<HTMLButtonElement> | null | undefined;
122
- 'on:focusout'?: import("svelte/elements").FocusEventHandler<HTMLButtonElement> | null | undefined;
123
- 'on:blur'?: import("svelte/elements").FocusEventHandler<HTMLButtonElement> | null | undefined;
124
- 'on:change'?: import("svelte/elements").FormEventHandler<HTMLButtonElement> | null | undefined;
125
- 'on:beforeinput'?: import("svelte/elements").EventHandler<InputEvent, HTMLButtonElement> | null | undefined;
126
- 'on:input'?: import("svelte/elements").FormEventHandler<HTMLButtonElement> | null | undefined;
127
- 'on:reset'?: import("svelte/elements").FormEventHandler<HTMLButtonElement> | null | undefined;
128
- 'on:submit'?: import("svelte/elements").EventHandler<SubmitEvent, HTMLButtonElement> | null | undefined;
129
- 'on:invalid'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
130
- 'on:formdata'?: import("svelte/elements").EventHandler<FormDataEvent, HTMLButtonElement> | null | undefined;
131
- 'on:load'?: import("svelte/elements").EventHandler<Event, Element> | null | undefined;
132
- 'on:error'?: import("svelte/elements").EventHandler<Event, Element> | null | undefined;
133
- 'on:toggle'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
134
- 'on:keydown'?: import("svelte/elements").KeyboardEventHandler<HTMLButtonElement> | null | undefined;
135
- 'on:keypress'?: import("svelte/elements").KeyboardEventHandler<HTMLButtonElement> | null | undefined;
136
- 'on:keyup'?: import("svelte/elements").KeyboardEventHandler<HTMLButtonElement> | null | undefined;
137
- 'on:abort'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
138
- 'on:canplay'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
139
- 'on:canplaythrough'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
140
- 'on:cuechange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
141
- 'on:durationchange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
142
- 'on:emptied'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
143
- 'on:encrypted'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
144
- 'on:ended'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
145
- 'on:loadeddata'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
146
- 'on:loadedmetadata'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
147
- 'on:loadstart'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
148
- 'on:pause'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
149
- 'on:play'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
150
- 'on:playing'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
151
- 'on:progress'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
152
- 'on:ratechange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
153
- 'on:seeked'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
154
- 'on:seeking'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
155
- 'on:stalled'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
156
- 'on:suspend'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
157
- 'on:timeupdate'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
158
- 'on:volumechange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
159
- 'on:waiting'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
160
- 'on:auxclick'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
161
- 'on:click'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
162
- 'on:contextmenu'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
163
- 'on:dblclick'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
164
- 'on:drag'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
165
- 'on:dragend'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
166
- 'on:dragenter'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
167
- 'on:dragexit'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
168
- 'on:dragleave'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
169
- 'on:dragover'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
170
- 'on:dragstart'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
171
- 'on:drop'?: import("svelte/elements").DragEventHandler<HTMLButtonElement> | null | undefined;
172
- 'on:mousedown'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
173
- 'on:mouseenter'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
174
- 'on:mouseleave'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
175
- 'on:mousemove'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
176
- 'on:mouseout'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
177
- 'on:mouseover'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
178
- 'on:mouseup'?: import("svelte/elements").MouseEventHandler<HTMLButtonElement> | null | undefined;
179
- 'on:select'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
180
- 'on:selectionchange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
181
- 'on:selectstart'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
182
- 'on:touchcancel'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
183
- 'on:touchend'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
184
- 'on:touchmove'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
185
- 'on:touchstart'?: import("svelte/elements").TouchEventHandler<HTMLButtonElement> | null | undefined;
186
- 'on:gotpointercapture'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
187
- 'on:pointercancel'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
188
- 'on:pointerdown'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
189
- 'on:pointerenter'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
190
- 'on:pointerleave'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
191
- 'on:pointermove'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
192
- 'on:pointerout'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
193
- 'on:pointerover'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
194
- 'on:pointerup'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
195
- 'on:lostpointercapture'?: import("svelte/elements").PointerEventHandler<HTMLButtonElement> | null | undefined;
196
- 'on:scroll'?: import("svelte/elements").UIEventHandler<HTMLButtonElement> | null | undefined;
197
- 'on:resize'?: import("svelte/elements").UIEventHandler<HTMLButtonElement> | null | undefined;
198
- 'on:wheel'?: import("svelte/elements").WheelEventHandler<HTMLButtonElement> | null | undefined;
199
- 'on:animationstart'?: import("svelte/elements").AnimationEventHandler<HTMLButtonElement> | null | undefined;
200
- 'on:animationend'?: import("svelte/elements").AnimationEventHandler<HTMLButtonElement> | null | undefined;
201
- 'on:animationiteration'?: import("svelte/elements").AnimationEventHandler<HTMLButtonElement> | null | undefined;
202
- 'on:transitionstart'?: import("svelte/elements").TransitionEventHandler<HTMLButtonElement> | null | undefined;
203
- 'on:transitionrun'?: import("svelte/elements").TransitionEventHandler<HTMLButtonElement> | null | undefined;
204
- 'on:transitionend'?: import("svelte/elements").TransitionEventHandler<HTMLButtonElement> | null | undefined;
205
- 'on:transitioncancel'?: import("svelte/elements").TransitionEventHandler<HTMLButtonElement> | null | undefined;
206
- 'on:outrostart'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLButtonElement> | null | undefined;
207
- 'on:outroend'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLButtonElement> | null | undefined;
208
- 'on:introstart'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLButtonElement> | null | undefined;
209
- 'on:introend'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLButtonElement> | null | undefined;
210
- 'on:message'?: import("svelte/elements").MessageEventHandler<HTMLButtonElement> | null | undefined;
211
- 'on:messageerror'?: import("svelte/elements").MessageEventHandler<HTMLButtonElement> | null | undefined;
212
- 'on:visibilitychange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
213
- 'on:cancel'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
214
- 'on:close'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
215
- 'on:fullscreenchange'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
216
- 'on:fullscreenerror'?: import("svelte/elements").EventHandler<Event, HTMLButtonElement> | null | undefined;
217
- formaction?: string | null | undefined;
218
- formenctype?: string | null | undefined;
219
- formmethod?: string | null | undefined;
220
- formnovalidate?: boolean | null | undefined;
221
- 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;
222
11
  force?: "enter" | "exit" | undefined;
223
12
  styled?: boolean | undefined;
224
- };
13
+ }, "mode" | "sessionInit">;
225
14
  events: {
226
- click: CustomEvent<{
227
- state: "blocked" | "unsupported" | "insecure" | "supported";
228
- nativeEvent: MouseEvent;
229
- }>;
230
- error: CustomEvent<Error>;
231
- } & {
232
15
  [evt: string]: CustomEvent<any>;
233
16
  };
234
17
  slots: {};
@@ -30,10 +30,12 @@ import { setupRaf } from "../internal/setupRaf";
30
30
  import { setupHeadset } from "../internal/setupHeadset";
31
31
  import { setupControllers } from "../internal/setupControllers";
32
32
  import { setupHands } from "../internal/setupHands";
33
- export let foveation = 1;
34
- export let frameRate = void 0;
35
- export let referenceSpace = "local-floor";
36
- const dispatch = createRawEventDispatcher();
33
+ let {
34
+ foveation = 1,
35
+ frameRate,
36
+ referenceSpace = "local-floor",
37
+ ...props
38
+ } = $props();
37
39
  const { renderer, renderMode } = useThrelte();
38
40
  const { xr } = renderer;
39
41
  let originalRenderMode = $renderMode;
@@ -43,22 +45,22 @@ setupControllers();
43
45
  setupHands();
44
46
  const handleSessionStart = () => {
45
47
  isPresenting.set(true);
46
- dispatch("sessionstart", { type: "sessionstart", target: $session });
48
+ props.$$events?.sessionstart?.({ type: "sessionstart", target: $session });
47
49
  };
48
50
  const handleSessionEnd = () => {
49
- dispatch("sessionend", { type: "sessionend", target: $session });
51
+ props.$$events?.sessionend?.({ type: "sessionend", target: $session });
50
52
  isPresenting.set(false);
51
53
  session.set(void 0);
52
54
  };
53
55
  const handleVisibilityChange = (event) => {
54
- dispatch("visibilitychange", { ...event, target: $session });
56
+ props.$$events?.visibilitychange?.({ ...event, target: $session });
55
57
  };
56
58
  const handleInputSourcesChange = (event) => {
57
59
  $isHandTracking = Object.values(event.session.inputSources).some((source) => source.hand);
58
- dispatch("inputsourceschange", { ...event, target: $session });
60
+ props.$$events?.inputsourceschange?.({ ...event, target: $session });
59
61
  };
60
62
  const handleFramerateChange = (event) => {
61
- dispatch("visibilitychange", { ...event, target: $session });
63
+ props.$$events?.visibilitychange?.({ ...event, target: $session });
62
64
  };
63
65
  const updateTargetFrameRate = (frameRate2) => {
64
66
  if (frameRate2 === void 0)
@@ -102,14 +104,12 @@ onMount(() => {
102
104
  xr.removeEventListener("sessionend", handleSessionEnd);
103
105
  };
104
106
  });
105
- $:
106
- updateTargetFrameRate(frameRate);
107
- $:
108
- xr.setFoveation(foveation);
109
- $: {
107
+ $effect.pre(() => updateTargetFrameRate(frameRate));
108
+ $effect.pre(() => xr.setFoveation(foveation));
109
+ $effect.pre(() => {
110
110
  xr.setReferenceSpaceType(referenceSpace);
111
111
  $referenceSpaceType = referenceSpace;
112
- }
112
+ });
113
113
  </script>
114
114
 
115
115
  {#if $isPresenting}
@@ -4,21 +4,35 @@ import type { XRSessionEvent } from '../types';
4
4
  declare const __propDef: {
5
5
  props: {
6
6
  /**
7
- * Enables foveated rendering. Default is `1`, the three.js default.
8
- *
9
- * 0 = no foveation, full resolution
10
- *
11
- * 1 = maximum foveation, the edges render at lower resolution
12
- */ foveation?: number | undefined;
7
+ * Enables foveated rendering. Default is `1`, the three.js default.
8
+ *
9
+ * 0 = no foveation, full resolution
10
+ *
11
+ * 1 = maximum foveation, the edges render at lower resolution
12
+ */
13
+ foveation?: number | undefined;
13
14
  /**
14
- * The target framerate for the XRSystem. Smaller rates give more CPU headroom at the cost of responsiveness.
15
- * Recommended range is `72`-`120`. Default is unset and left to the device.
16
- * @note If your experience cannot effectively reach the target framerate, it will be subject to frame reprojection
17
- * which will halve the effective framerate. Choose a conservative estimate that balances responsiveness and
18
- * headroom based on your experience.
19
- * @see https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API/Rendering#refresh_rate_and_frame_rate
20
- */ frameRate?: number | undefined;
21
- /** Type of WebXR reference space to use. Default is `local-floor` */ referenceSpace?: XRReferenceSpaceType | undefined;
15
+ * The target framerate for the XRSystem. Smaller rates give more CPU headroom at the cost of responsiveness.
16
+ * Recommended range is `72`-`120`. Default is unset and left to the device.
17
+ * @note If your experience cannot effectively reach the target framerate, it will be subject to frame reprojection
18
+ * which will halve the effective framerate. Choose a conservative estimate that balances responsiveness and
19
+ * headroom based on your experience.
20
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API/Rendering#refresh_rate_and_frame_rate
21
+ */
22
+ frameRate?: number | undefined;
23
+ /** Type of WebXR reference space to use. Default is `local-floor` */
24
+ referenceSpace?: XRReferenceSpaceType | undefined;
25
+ } & {
26
+ $$events: {
27
+ /** Called as an XRSession is requested */
28
+ sessionstart(): XRSessionEvent<'sessionstart'>;
29
+ /** Called after an XRSession is terminated */
30
+ sessionend(): XRSessionEvent<'sessionend'>;
31
+ /** Called when an XRSession is hidden or unfocused. */
32
+ visibilitychange(): globalThis.XRSessionEvent;
33
+ /** Called when available inputsources change */
34
+ inputsourceschange(): globalThis.XRSessionEvent;
35
+ };
22
36
  };
23
37
  slots: {
24
38
  default: {};
@@ -26,13 +40,13 @@ declare const __propDef: {
26
40
  };
27
41
  events: {
28
42
  /** Called as an XRSession is requested */
29
- sessionstart: XRSessionEvent<'sessionstart'>;
43
+ sessionstart(): XRSessionEvent<'sessionstart'>;
30
44
  /** Called after an XRSession is terminated */
31
- sessionend: XRSessionEvent<'sessionend'>;
45
+ sessionend(): XRSessionEvent<'sessionend'>;
32
46
  /** Called when an XRSession is hidden or unfocused. */
33
- visibilitychange: globalThis.XRSessionEvent;
47
+ visibilitychange(): globalThis.XRSessionEvent;
34
48
  /** Called when available inputsources change */
35
- inputsourceschange: globalThis.XRSessionEvent;
49
+ inputsourceschange(): globalThis.XRSessionEvent;
36
50
  };
37
51
  };
38
52
  export type XrProps = typeof __propDef.props;
@@ -17,38 +17,34 @@ display info about your WebXR session. This is aliased by `ARButton` and
17
17
  />
18
18
  ```
19
19
  -->
20
-
21
- <script>import { createEventDispatcher } from "svelte";
22
- import { getXRSupportState } from "../lib/getXRSupportState";
20
+ <script>import { getXRSupportState } from "../lib/getXRSupportState";
23
21
  import { toggleXRSession } from "../lib/toggleXRSession";
24
22
  import { session, xr } from "../internal/stores";
25
- export let mode;
26
- export let sessionInit = void 0;
27
- export let force = void 0;
28
- export let styled = true;
29
- const dispatch = createEventDispatcher();
23
+ let { mode, sessionInit, force, styled = true, ...props } = $props();
30
24
  const handleButtonClick = async (nativeEvent, state) => {
31
25
  if (!$xr) {
32
- throw new Error("The <XR> component was not created. This is required to start an XR session.");
26
+ throw new Error(
27
+ "The <XR> component was not created. This is required to start an XR session."
28
+ );
33
29
  }
34
- dispatch("click", { state, nativeEvent });
30
+ props.$$events?.click?.({ state, nativeEvent });
35
31
  if (state !== "supported")
36
32
  return;
37
33
  try {
38
34
  await toggleXRSession(mode, sessionInit, force);
39
35
  } catch (error) {
40
- dispatch("error", error);
36
+ props.$$events?.error?.(error);
41
37
  }
42
38
  };
43
- $:
44
- modeText = {
39
+ let modeText = $derived(
40
+ {
45
41
  "immersive-vr": "VR",
46
42
  "immersive-ar": "AR",
47
43
  inline: "inline"
48
- }[mode];
49
- $:
50
- if (styled) {
51
- $$restProps.style = `
44
+ }[mode]
45
+ );
46
+ let style = $derived(
47
+ styled ? `
52
48
  position: absolute;
53
49
  bottom: 24px;
54
50
  left: 50%;
@@ -59,15 +55,18 @@ $:
59
55
  color: white;
60
56
  outline: none;
61
57
  z-index: 10;
62
- ${$$restProps.style ?? ""}
63
- `;
64
- }
58
+ ${props.style ?? ""}
59
+ ` : props.style
60
+ );
65
61
  </script>
66
62
 
67
63
  {#await getXRSupportState(mode) then state}
68
64
  <button
69
- {...$$restProps}
70
- on:click={(event) => handleButtonClick(event, state)}
65
+ on:click={(event) => {
66
+ handleButtonClick(event, state)
67
+ }}
68
+ {...props}
69
+ {style}
71
70
  >
72
71
  {#if state === 'unsupported'}
73
72
  {modeText} unsupported