@terraware/web-components 5.0.27 → 5.1.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.
Files changed (295) hide show
  1. package/components/AntSwitch/index.js +19 -22
  2. package/components/Autocomplete/Autocomplete.js +106 -130
  3. package/components/Badge/index.js +28 -29
  4. package/components/BusySpinner/index.js +40 -45
  5. package/components/Button/Button.js +41 -47
  6. package/components/Checkbox.js +64 -63
  7. package/components/Confirm/index.js +74 -83
  8. package/components/DatePicker/DatePicker.js +138 -141
  9. package/components/DialogBox/DialogBox.js +111 -118
  10. package/components/Divisor.js +18 -18
  11. package/components/Dropdown.js +66 -94
  12. package/components/EditableTable/index.js +211 -271
  13. package/components/ErrorBox/ErrorBox.js +47 -49
  14. package/components/FileChooser/index.js +117 -135
  15. package/components/FormBottomBar/index.js +75 -84
  16. package/components/Icon/Icon.js +12 -20
  17. package/components/Icon/icons/index.js +256 -256
  18. package/components/IconTooltip/index.js +49 -60
  19. package/components/Map/MapBox.js +545 -452
  20. package/components/Map/MapContainer.js +25 -29
  21. package/components/Map/MapDateSliderControl.js +64 -64
  22. package/components/Map/MapDrawer.js +41 -47
  23. package/components/Map/MapLegend.js +176 -172
  24. package/components/Map/MapViewStyleControl.js +59 -63
  25. package/components/Map/ReactMapboxWrapper.js +3 -2
  26. package/components/Map/index.js +161 -180
  27. package/components/Map/types.js +12 -17
  28. package/components/Map/useMaintainLayerOrder.js +16 -26
  29. package/components/Markdown/index.js +25 -26
  30. package/components/Message/Message.js +73 -76
  31. package/components/MultiSelect/index.js +112 -124
  32. package/components/Navbar/NavFooter.js +9 -13
  33. package/components/Navbar/NavItem.js +70 -76
  34. package/components/Navbar/NavSection.js +17 -19
  35. package/components/Navbar/Navbar.js +39 -46
  36. package/components/Navbar/SubNavbar.js +9 -13
  37. package/components/Note.js +18 -22
  38. package/components/OverlayModal/OverlayModal.js +56 -63
  39. package/components/PageForm/index.js +33 -41
  40. package/components/PhotoChooser/index.js +165 -173
  41. package/components/PhotosCarousel/PhotoSlide.js +32 -35
  42. package/components/PhotosCarousel/index.js +80 -85
  43. package/components/PhotosCarousel/usePhotosCarousel.js +69 -76
  44. package/components/Pill/index.js +41 -45
  45. package/components/PillList/index.js +17 -24
  46. package/components/PlacementWrapper/index.js +38 -59
  47. package/components/PopoverMenu/Popover.js +68 -85
  48. package/components/PopoverMenu/index.js +51 -56
  49. package/components/PopoverMultiSelect/index.js +52 -59
  50. package/components/ProgressCircle/ProgressCircle.js +28 -32
  51. package/components/RadioButton.js +17 -19
  52. package/components/Select/Select.js +13 -15
  53. package/components/Select/SelectT.js +235 -250
  54. package/components/Separator/index.js +14 -17
  55. package/components/Size.js +0 -1
  56. package/components/Slider/index.js +43 -56
  57. package/components/SummaryBox.js +70 -72
  58. package/components/Tabs/index.js +133 -135
  59. package/components/TextTruncated/index.js +117 -130
  60. package/components/Textfield/Textfield.js +158 -190
  61. package/components/Textfield/TruncatedTextArea.js +70 -84
  62. package/components/TimelineSlider/TimelineMarker.js +25 -30
  63. package/components/TimelineSlider/TimelineRail.js +8 -11
  64. package/components/TimelineSlider/index.js +64 -66
  65. package/components/TimelineSliderV2/ClusterBadge.js +25 -29
  66. package/components/TimelineSliderV2/TimelineDot.js +31 -35
  67. package/components/TimelineSliderV2/TimelineRail.js +8 -11
  68. package/components/TimelineSliderV2/index.js +121 -103
  69. package/components/TimelineSliderV2/layout.js +124 -147
  70. package/components/TimelineSliderV2/types.js +0 -1
  71. package/components/Tooltip/Tooltip.js +47 -56
  72. package/components/ViewPhotosDialog/index.js +28 -35
  73. package/components/VirtualWalkthrough/Annotation.js +163 -207
  74. package/components/VirtualWalkthrough/AnnotationEditPane.js +198 -184
  75. package/components/VirtualWalkthrough/AnnotationPanel.js +187 -199
  76. package/components/VirtualWalkthrough/Application.js +31 -34
  77. package/components/VirtualWalkthrough/AutoRotator.js +85 -223
  78. package/components/VirtualWalkthrough/BlockingSpinner.js +26 -28
  79. package/components/VirtualWalkthrough/BoundaryRing.js +30 -34
  80. package/components/VirtualWalkthrough/BoundaryWall.js +32 -36
  81. package/components/VirtualWalkthrough/CameraInfo.js +100 -89
  82. package/components/VirtualWalkthrough/ControlsInfoPane.js +254 -195
  83. package/components/VirtualWalkthrough/GradientSky.js +72 -73
  84. package/components/VirtualWalkthrough/SplatControls.js +209 -221
  85. package/components/VirtualWalkthrough/SplatCrop.js +21 -20
  86. package/components/VirtualWalkthrough/SplatFadeCrop.js +21 -20
  87. package/components/VirtualWalkthrough/SplatModel.js +65 -85
  88. package/components/VirtualWalkthrough/SplatRevealRain.js +41 -46
  89. package/components/VirtualWalkthrough/TfAnnotationManager.js +197 -379
  90. package/components/VirtualWalkthrough/TfXrNavigation.js +73 -162
  91. package/components/VirtualWalkthrough/VirtualWalkthroughViewer.js +438 -431
  92. package/components/VirtualWalkthrough/VrAnnotationPanel.js +18 -22
  93. package/components/VirtualWalkthrough/XrAnnotationInteraction.js +14 -17
  94. package/components/VirtualWalkthrough/XrExitButton.js +14 -17
  95. package/components/VirtualWalkthrough/XrGazeDwell.js +14 -17
  96. package/components/VirtualWalkthrough/XrPointerRay.js +14 -17
  97. package/components/VirtualWalkthrough/XrStartPose.js +67 -121
  98. package/components/VirtualWalkthrough/boundary-ring.js +87 -117
  99. package/components/VirtualWalkthrough/boundary-wall.js +175 -258
  100. package/components/VirtualWalkthrough/camera-adoption.js +18 -64
  101. package/components/VirtualWalkthrough/groundPlane.js +32 -47
  102. package/components/VirtualWalkthrough/gsplat-fade-crop-effect.js +35 -35
  103. package/components/VirtualWalkthrough/splatFormat.js +13 -47
  104. package/components/VirtualWalkthrough/useAdoptedCamera.js +23 -44
  105. package/components/VirtualWalkthrough/useRestartOnVr.js +26 -37
  106. package/components/VirtualWalkthrough/useXrRenderTuning.js +33 -54
  107. package/components/VirtualWalkthrough/vr-annotation-panel-layout.js +67 -99
  108. package/components/VirtualWalkthrough/vr-annotation-panel.js +403 -433
  109. package/components/VirtualWalkthrough/vr-annotation-scroll.js +10 -28
  110. package/components/VirtualWalkthrough/walkthrough-camera.js +204 -329
  111. package/components/VirtualWalkthrough/xr-annotation-candidate-buffer.js +39 -80
  112. package/components/VirtualWalkthrough/xr-annotation-candidates.js +6 -18
  113. package/components/VirtualWalkthrough/xr-annotation-interaction.js +31 -56
  114. package/components/VirtualWalkthrough/xr-annotation-targeting.js +22 -38
  115. package/components/VirtualWalkthrough/xr-button-arming.js +7 -17
  116. package/components/VirtualWalkthrough/xr-button-hold.js +22 -36
  117. package/components/VirtualWalkthrough/xr-exit-button-mask.js +22 -36
  118. package/components/VirtualWalkthrough/xr-exit-button.js +148 -207
  119. package/components/VirtualWalkthrough/xr-face-buttons.js +19 -29
  120. package/components/VirtualWalkthrough/xr-gaze-dwell-state.js +23 -34
  121. package/components/VirtualWalkthrough/xr-gaze-dwell.js +107 -144
  122. package/components/VirtualWalkthrough/xr-interactive-ui.js +12 -24
  123. package/components/VirtualWalkthrough/xr-pointer-ray.js +13 -20
  124. package/components/VirtualWalkthrough/xr-progress-pie-material.js +117 -88
  125. package/components/VirtualWalkthrough/xr-progress-pie.js +1 -10
  126. package/components/VirtualWalkthrough/xr-ray-quad.js +16 -30
  127. package/components/VirtualWalkthrough/xr-render-tuning.js +17 -48
  128. package/components/VirtualWalkthrough/xr-scene-bounds.js +21 -37
  129. package/components/VirtualWalkthrough/xr-start-pose.js +27 -73
  130. package/components/VirtualWalkthrough/xr-teleport-gesture.js +16 -42
  131. package/components/svg/BlobbyGrayIconImage.js +41 -39
  132. package/components/svg/BlobbyGrayIconImport.js +41 -39
  133. package/components/svg/BlobbyGrayIconUploadToTheCloud.js +41 -39
  134. package/components/svg/BlobbyIconCloudChecked.js +202 -164
  135. package/components/svg/BlobbyIconExportOrUploadPhoto.js +202 -164
  136. package/components/svg/BlobbyIconFolder.js +202 -164
  137. package/components/svg/BlobbyIconGraphReport.js +202 -164
  138. package/components/svg/BlobbyIconHappy.js +202 -164
  139. package/components/svg/BlobbyIconHeartMonitor.js +202 -164
  140. package/components/svg/BlobbyIconLeaf.js +202 -164
  141. package/components/svg/BlobbyIconLibrary.js +202 -164
  142. package/components/svg/BlobbyIconNursery.js +204 -166
  143. package/components/svg/BlobbyIconOrganization.js +202 -164
  144. package/components/svg/BlobbyIconParchment.js +202 -164
  145. package/components/svg/BlobbyIconPeople.js +202 -164
  146. package/components/svg/BlobbyIconSeedBank.js +202 -164
  147. package/components/svg/BlobbyIconSeedling.js +202 -164
  148. package/components/svg/BlobbyIconSeeds.js +202 -164
  149. package/components/svg/BlobbyIconSite.js +206 -167
  150. package/components/svg/BlobbyIconSparkles.js +202 -164
  151. package/components/svg/BlobbyIconWrench.js +202 -164
  152. package/components/svg/Bug.js +19 -21
  153. package/components/svg/Calendar.js +19 -21
  154. package/components/svg/CaretDown.js +19 -21
  155. package/components/svg/CaretLeft.js +19 -21
  156. package/components/svg/CaretRight.js +19 -21
  157. package/components/svg/CaretUp.js +19 -21
  158. package/components/svg/ChevronDown.js +19 -21
  159. package/components/svg/ChevronUp.js +19 -21
  160. package/components/svg/Close.js +19 -21
  161. package/components/svg/Critical.js +19 -21
  162. package/components/svg/Edit.js +202 -164
  163. package/components/svg/Error.js +19 -21
  164. package/components/svg/Filter.js +19 -21
  165. package/components/svg/Folder.js +19 -21
  166. package/components/svg/Help.js +19 -21
  167. package/components/svg/Home.js +19 -21
  168. package/components/svg/IconAdd.js +19 -21
  169. package/components/svg/IconArrowRight.js +21 -23
  170. package/components/svg/IconBusinessNetwork.js +19 -21
  171. package/components/svg/IconCalendar.js +19 -21
  172. package/components/svg/IconCancel.js +19 -21
  173. package/components/svg/IconChargingBattery.js +19 -21
  174. package/components/svg/IconChecklist.js +21 -23
  175. package/components/svg/IconCheckmark.js +19 -21
  176. package/components/svg/IconCoinInHand.js +19 -21
  177. package/components/svg/IconColumns.js +19 -21
  178. package/components/svg/IconComment.js +20 -22
  179. package/components/svg/IconDashboard.js +19 -21
  180. package/components/svg/IconDataMigration.js +19 -21
  181. package/components/svg/IconDocument.js +21 -23
  182. package/components/svg/IconDownloadFromTheCloud.js +21 -23
  183. package/components/svg/IconEdit.js +21 -23
  184. package/components/svg/IconExpand.js +21 -23
  185. package/components/svg/IconExport.js +19 -21
  186. package/components/svg/IconExternalLink.js +19 -21
  187. package/components/svg/IconEye.js +19 -21
  188. package/components/svg/IconEyeOff.js +19 -21
  189. package/components/svg/IconFile.js +19 -21
  190. package/components/svg/IconFolder.js +19 -21
  191. package/components/svg/IconFullScreen.js +20 -22
  192. package/components/svg/IconFutures.js +19 -21
  193. package/components/svg/IconGraphReport.js +19 -21
  194. package/components/svg/IconGrid.js +19 -21
  195. package/components/svg/IconHeartMonitor.js +19 -21
  196. package/components/svg/IconHelp.js +21 -23
  197. package/components/svg/IconHistory.js +19 -21
  198. package/components/svg/IconImport.js +19 -21
  199. package/components/svg/IconIndex.js +19 -21
  200. package/components/svg/IconLayers.js +19 -21
  201. package/components/svg/IconLibrary.js +20 -22
  202. package/components/svg/IconList.js +19 -21
  203. package/components/svg/IconLivePlant.js +19 -21
  204. package/components/svg/IconLocations.js +19 -21
  205. package/components/svg/IconMail.js +19 -21
  206. package/components/svg/IconManager.js +19 -21
  207. package/components/svg/IconMap.js +19 -21
  208. package/components/svg/IconMarker.js +19 -21
  209. package/components/svg/IconMenu.js +19 -21
  210. package/components/svg/IconMenuHorizontal.js +19 -21
  211. package/components/svg/IconModule.js +19 -21
  212. package/components/svg/IconMyLocation.js +19 -21
  213. package/components/svg/IconNote.js +21 -23
  214. package/components/svg/IconNursery.js +21 -23
  215. package/components/svg/IconOrg.js +19 -21
  216. package/components/svg/IconParchment.js +19 -21
  217. package/components/svg/IconPhoto.js +19 -21
  218. package/components/svg/IconPlantsFilled.js +19 -21
  219. package/components/svg/IconRedo.js +19 -21
  220. package/components/svg/IconRestorationSite.js +19 -21
  221. package/components/svg/IconSeedBank.js +19 -21
  222. package/components/svg/IconSeedling.js +19 -21
  223. package/components/svg/IconSettings.js +19 -21
  224. package/components/svg/IconSlice.js +19 -21
  225. package/components/svg/IconSubmit.js +19 -21
  226. package/components/svg/IconSubtract.js +21 -23
  227. package/components/svg/IconSynced.js +19 -21
  228. package/components/svg/IconTrashCan.js +19 -21
  229. package/components/svg/IconTreasureMap.js +19 -21
  230. package/components/svg/IconUnavailable.js +19 -21
  231. package/components/svg/IconUndo.js +19 -21
  232. package/components/svg/IconVariable.js +19 -21
  233. package/components/svg/IconVideo.js +30 -31
  234. package/components/svg/IconWifi.js +19 -21
  235. package/components/svg/Info.js +19 -21
  236. package/components/svg/Key.js +19 -21
  237. package/components/svg/Leaf.js +19 -21
  238. package/components/svg/Lock.js +19 -21
  239. package/components/svg/Logo.js +48 -43
  240. package/components/svg/MenuVertical.js +19 -21
  241. package/components/svg/Notification.js +19 -21
  242. package/components/svg/Person.js +19 -21
  243. package/components/svg/Plus.js +19 -21
  244. package/components/svg/RestorationSite.js +19 -21
  245. package/components/svg/Search.js +19 -21
  246. package/components/svg/Seeds.js +19 -21
  247. package/components/svg/Site.js +19 -21
  248. package/components/svg/Sparkles.js +19 -21
  249. package/components/svg/Species.js +19 -21
  250. package/components/svg/Species2.js +202 -164
  251. package/components/svg/Spinner.js +54 -48
  252. package/components/svg/Star.js +19 -21
  253. package/components/svg/Success.js +19 -21
  254. package/components/svg/SuccessFilled.js +19 -21
  255. package/components/svg/TerrawareLogoDesktop.js +55 -49
  256. package/components/svg/TerrawareLogoMobile.js +25 -26
  257. package/components/svg/Touchscreen.js +19 -21
  258. package/components/svg/UploadCloud.js +202 -164
  259. package/components/svg/Warning.js +19 -21
  260. package/components/svg/WelcomeClipboard.js +156 -133
  261. package/components/svg/index.js +129 -129
  262. package/components/table/EnhancedTableToolbar.js +68 -74
  263. package/components/table/EnhancedTableToolbarV2.js +31 -41
  264. package/components/table/TableCellRenderer.js +196 -231
  265. package/components/table/TableHeader.js +71 -73
  266. package/components/table/TableHeaderItem.js +97 -102
  267. package/components/table/density.js +18 -19
  268. package/components/table/index.js +350 -369
  269. package/components/table/sort.js +27 -52
  270. package/components/table/types.js +0 -1
  271. package/components/types/index.js +0 -1
  272. package/hooks/cameraEntityContext.js +2 -13
  273. package/hooks/useBoolean.js +17 -13
  274. package/hooks/useCameraPosition.js +56 -56
  275. package/hooks/useDevicePerformance.js +17 -17
  276. package/hooks/useXr.js +85 -87
  277. package/index.js +58 -58
  278. package/package.json +1 -1
  279. package/setupTests.js +0 -4
  280. package/strings/export.js +111 -170
  281. package/strings/index.js +25 -54
  282. package/strings/locales.js +21 -41
  283. package/strings/strings-en.js +49 -51
  284. package/strings/strings-es.js +49 -51
  285. package/strings/strings-fr.js +49 -51
  286. package/strings/strings-gx.js +49 -51
  287. package/style-dictionary-dist/TerrawareTheme.js +186 -186
  288. package/theme.js +74 -76
  289. package/utils/color.js +8 -15
  290. package/utils/date.js +42 -108
  291. package/utils/index.js +4 -4
  292. package/utils/preventDefaultEvent.js +3 -3
  293. package/utils/text.js +11 -11
  294. package/utils/useDeviceInfo.js +42 -79
  295. package/virtualWalkthrough.js +23 -23
@@ -1,22 +1,18 @@
1
- import 'react';
2
- import { Entity } from '@playcanvas/react';
3
- import { Script } from '@playcanvas/react/components';
4
- import { VrAnnotationPanel as VrAnnotationPanel$1 } from './vr-annotation-panel.js';
5
- import { jsx } from 'react/jsx-runtime';
6
-
7
- const VrAnnotationPanel = ({
8
- annotation,
9
- annotationIndex
10
- }) => /*#__PURE__*/jsx(Entity, {
11
- name: "vr-annotation-panel",
12
- children: /*#__PURE__*/jsx(Script, {
13
- script: VrAnnotationPanel$1,
14
- title: annotation.title,
15
- label: annotation.label,
16
- bodyText: annotation.bodyText,
17
- imageUrls: annotation.imageUrls,
18
- annotationIndex: annotationIndex
19
- })
20
- });
21
-
22
- export { VrAnnotationPanel as default };
1
+ import { jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ import { Entity } from "@playcanvas/react";
4
+ import { Script } from "@playcanvas/react/components";
5
+ import { VrAnnotationPanel } from "./vr-annotation-panel.js";
6
+ const VrAnnotationPanel_VrAnnotationPanel = ({ annotation, annotationIndex })=>/*#__PURE__*/ jsx(Entity, {
7
+ name: "vr-annotation-panel",
8
+ children: /*#__PURE__*/ jsx(Script, {
9
+ script: VrAnnotationPanel,
10
+ title: annotation.title,
11
+ label: annotation.label,
12
+ bodyText: annotation.bodyText,
13
+ imageUrls: annotation.imageUrls,
14
+ annotationIndex: annotationIndex
15
+ })
16
+ });
17
+ const VirtualWalkthrough_VrAnnotationPanel = VrAnnotationPanel_VrAnnotationPanel;
18
+ export default VirtualWalkthrough_VrAnnotationPanel;
@@ -1,17 +1,14 @@
1
- import 'react';
2
- import { Entity } from '@playcanvas/react';
3
- import { Script } from '@playcanvas/react/components';
4
- import { XrAnnotationInteraction as XrAnnotationInteraction$1 } from './xr-annotation-interaction.js';
5
- import { jsx } from 'react/jsx-runtime';
6
-
7
- const XrAnnotationInteraction = ({
8
- onDismiss
9
- }) => /*#__PURE__*/jsx(Entity, {
10
- name: "xr-annotation-interaction",
11
- children: /*#__PURE__*/jsx(Script, {
12
- script: XrAnnotationInteraction$1,
13
- onDismissCallback: onDismiss
14
- })
15
- });
16
-
17
- export { XrAnnotationInteraction as default };
1
+ import { jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ import { Entity } from "@playcanvas/react";
4
+ import { Script } from "@playcanvas/react/components";
5
+ import { XrAnnotationInteraction } from "./xr-annotation-interaction.js";
6
+ const XrAnnotationInteraction_XrAnnotationInteraction = ({ onDismiss })=>/*#__PURE__*/ jsx(Entity, {
7
+ name: "xr-annotation-interaction",
8
+ children: /*#__PURE__*/ jsx(Script, {
9
+ script: XrAnnotationInteraction,
10
+ onDismissCallback: onDismiss
11
+ })
12
+ });
13
+ const VirtualWalkthrough_XrAnnotationInteraction = XrAnnotationInteraction_XrAnnotationInteraction;
14
+ export default VirtualWalkthrough_XrAnnotationInteraction;
@@ -1,17 +1,14 @@
1
- import 'react';
2
- import { Entity } from '@playcanvas/react';
3
- import { Script } from '@playcanvas/react/components';
4
- import { XrExitButton as XrExitButton$1 } from './xr-exit-button.js';
5
- import { jsx } from 'react/jsx-runtime';
6
-
7
- const XrExitButton = ({
8
- onClose
9
- }) => /*#__PURE__*/jsx(Entity, {
10
- name: "xr-exit-button",
11
- children: /*#__PURE__*/jsx(Script, {
12
- script: XrExitButton$1,
13
- onClose: onClose
14
- })
15
- });
16
-
17
- export { XrExitButton as default };
1
+ import { jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ import { Entity } from "@playcanvas/react";
4
+ import { Script } from "@playcanvas/react/components";
5
+ import { XrExitButton } from "./xr-exit-button.js";
6
+ const XrExitButton_XrExitButton = ({ onClose })=>/*#__PURE__*/ jsx(Entity, {
7
+ name: "xr-exit-button",
8
+ children: /*#__PURE__*/ jsx(Script, {
9
+ script: XrExitButton,
10
+ onClose: onClose
11
+ })
12
+ });
13
+ const VirtualWalkthrough_XrExitButton = XrExitButton_XrExitButton;
14
+ export default VirtualWalkthrough_XrExitButton;
@@ -1,17 +1,14 @@
1
- import 'react';
2
- import { Entity } from '@playcanvas/react';
3
- import { Script } from '@playcanvas/react/components';
4
- import { XrGazeDwell as XrGazeDwell$1 } from './xr-gaze-dwell.js';
5
- import { jsx } from 'react/jsx-runtime';
6
-
7
- const XrGazeDwell = ({
8
- activeIndex
9
- }) => /*#__PURE__*/jsx(Entity, {
10
- name: "xr-gaze-dwell",
11
- children: /*#__PURE__*/jsx(Script, {
12
- script: XrGazeDwell$1,
13
- activeIndex: activeIndex
14
- })
15
- });
16
-
17
- export { XrGazeDwell as default };
1
+ import { jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ import { Entity } from "@playcanvas/react";
4
+ import { Script } from "@playcanvas/react/components";
5
+ import { XrGazeDwell } from "./xr-gaze-dwell.js";
6
+ const XrGazeDwell_XrGazeDwell = ({ activeIndex })=>/*#__PURE__*/ jsx(Entity, {
7
+ name: "xr-gaze-dwell",
8
+ children: /*#__PURE__*/ jsx(Script, {
9
+ script: XrGazeDwell,
10
+ activeIndex: activeIndex
11
+ })
12
+ });
13
+ const VirtualWalkthrough_XrGazeDwell = XrGazeDwell_XrGazeDwell;
14
+ export default VirtualWalkthrough_XrGazeDwell;
@@ -1,17 +1,14 @@
1
- import 'react';
2
- import { Entity } from '@playcanvas/react';
3
- import { Script } from '@playcanvas/react/components';
4
- import { DEFAULT_RAY_COLOR, XrPointerRay as XrPointerRay$1 } from './xr-pointer-ray.js';
5
- import { jsx } from 'react/jsx-runtime';
6
-
7
- const XrPointerRay = ({
8
- color = DEFAULT_RAY_COLOR
9
- }) => /*#__PURE__*/jsx(Entity, {
10
- name: "xr-pointer-ray",
11
- children: /*#__PURE__*/jsx(Script, {
12
- script: XrPointerRay$1,
13
- color: color
14
- })
15
- });
16
-
17
- export { XrPointerRay as default };
1
+ import { jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ import { Entity } from "@playcanvas/react";
4
+ import { Script } from "@playcanvas/react/components";
5
+ import { DEFAULT_RAY_COLOR, XrPointerRay } from "./xr-pointer-ray.js";
6
+ const XrPointerRay_XrPointerRay = ({ color = DEFAULT_RAY_COLOR })=>/*#__PURE__*/ jsx(Entity, {
7
+ name: "xr-pointer-ray",
8
+ children: /*#__PURE__*/ jsx(Script, {
9
+ script: XrPointerRay,
10
+ color: color
11
+ })
12
+ });
13
+ const VirtualWalkthrough_XrPointerRay = XrPointerRay_XrPointerRay;
14
+ export default VirtualWalkthrough_XrPointerRay;
@@ -1,128 +1,74 @@
1
- import { Script, XRTYPE_VR, XRTYPE_AR } from 'playcanvas';
2
- import { xrStartRigPose, yawFromBasis } from './xr-start-pose.js';
3
-
4
- /**
5
- * Starts an immersive session at the scene's camera position rather than at the world origin.
6
- *
7
- * PlayCanvas overwrites the camera entity's local transform with the head pose every frame, so the
8
- * head lands wherever the headset's reference space puts it — near (0, 0) for a rig that has never
9
- * been moved. This script moves the rig on the first frame of a session so the head instead starts
10
- * at `targetX`/`targetZ` facing `focusX`/`focusZ`.
11
- *
12
- * Only XZ is touched: the user stands on the rig floor, which the boundary wall is also built
13
- * against, so lifting the rig onto the splat's ground plane would put them through it.
14
- *
15
- * Attach to the rig entity — the camera's parent, alongside TfXrNavigation, whose bounds clamp
16
- * pulls the start point back inside the scene bounds when the camera position sits outside them.
17
- */
1
+ import { Script, XRTYPE_AR, XRTYPE_VR } from "playcanvas";
2
+ import { xrStartRigPose, yawFromBasis } from "./xr-start-pose.js";
18
3
  class XrStartPose extends Script {
19
- static scriptName = 'xrStartPose';
20
-
21
- /** World-space X the head should start at, i.e. the viewer's `cameraPosition`. */
22
- targetX = 0;
23
-
24
- /** World-space Z the head should start at. */
25
- targetZ = 0;
26
-
27
- /** World-space X the head should face from there, i.e. the viewer's `origin`. */
28
- focusX = 0;
29
-
30
- /** World-space Z the head should face from there. */
31
- focusZ = 0;
32
-
33
- /** Set when a session starts, cleared once the rig has been placed. */
34
- _pending = false;
35
-
36
- /**
37
- * Whether the engine has written a head pose for this session yet.
38
- */
39
- _posed = false;
40
- _onXrStart = () => {
41
- this._pending = true;
42
- };
43
-
44
- /** Fired from XrManager.update only after the head pose has been written to the camera. */
45
- _onXrUpdate = () => {
46
- this._posed = true;
47
- };
48
- _onXrEnd = () => {
49
- this._posed = false;
50
- };
51
- initialize() {
52
- // Covers mounting into a session that is already running as well as the usual mount before one.
53
- this._pending = this._isXrActive();
54
- this.app.xr?.on('start', this._onXrStart);
55
- this.app.xr?.on('update', this._onXrUpdate);
56
- this.app.xr?.on('end', this._onXrEnd);
57
- // Script removal fires a 'destroy' event rather than calling a destroy() method, so the
58
- // teardown has to be registered as a listener or these handlers outlive the script.
59
- this.once('destroy', () => this._teardown());
60
- }
61
- _isXrActive = () => this.app.xr?.active === true && (this.app.xr?.type === XRTYPE_VR || this.app.xr?.type === XRTYPE_AR);
62
-
63
- /**
64
- * The bounds circle to place the start point in, or undefined when nothing is clamping the head.
65
- * Resolved per call rather than cached: the React wrapper assigns the bounds to the navigation
66
- * script imperatively, so they can land after this script initializes.
67
- */
68
- _bounds = () => {
69
- // @ts-expect-error - scripts are added dynamically to the entity
70
- const navigation = this.entity.script?.tfXrNavigation;
71
- if (!navigation || navigation.boundsRadius <= 0) {
72
- return undefined;
4
+ static scriptName = 'xrStartPose';
5
+ targetX = 0;
6
+ targetZ = 0;
7
+ focusX = 0;
8
+ focusZ = 0;
9
+ _pending = false;
10
+ _posed = false;
11
+ _onXrStart = ()=>{
12
+ this._pending = true;
13
+ };
14
+ _onXrUpdate = ()=>{
15
+ this._posed = true;
16
+ };
17
+ _onXrEnd = ()=>{
18
+ this._posed = false;
19
+ };
20
+ initialize() {
21
+ this._pending = this._isXrActive();
22
+ this.app.xr?.on('start', this._onXrStart);
23
+ this.app.xr?.on('update', this._onXrUpdate);
24
+ this.app.xr?.on('end', this._onXrEnd);
25
+ this.once('destroy', ()=>this._teardown());
73
26
  }
74
- return {
75
- x: navigation.boundsCenter.x,
76
- z: navigation.boundsCenter.z,
77
- radius: navigation.boundsRadius
27
+ _isXrActive = ()=>this.app.xr?.active === true && (this.app.xr?.type === XRTYPE_VR || this.app.xr?.type === XRTYPE_AR);
28
+ _bounds = ()=>{
29
+ const navigation = this.entity.script?.tfXrNavigation;
30
+ if (!navigation || navigation.boundsRadius <= 0) return;
31
+ return {
32
+ x: navigation.boundsCenter.x,
33
+ z: navigation.boundsCenter.z,
34
+ radius: navigation.boundsRadius
35
+ };
78
36
  };
79
- };
80
-
81
- /**
82
- * Runs in update rather than on the 'start' event: the engine writes the head pose during
83
- * xr.update, which precedes the script update in the same tick, so a frame that has posed is the
84
- * first point at which there is a real head to solve the rig pose from.
85
- */
86
- update() {
87
- if (!this._pending || !this._posed || !this._isXrActive()) {
88
- return;
37
+ update() {
38
+ if (!this._pending || !this._posed || !this._isXrActive()) return;
39
+ const camera = this.entity.findComponent('camera')?.entity;
40
+ if (!camera) return;
41
+ const head = camera.getPosition();
42
+ const rig = this.entity.getPosition();
43
+ const rigY = rig.y;
44
+ const pose = xrStartRigPose({
45
+ head: {
46
+ x: head.x,
47
+ z: head.z
48
+ },
49
+ headYaw: yawFromBasis(camera.forward, camera.right),
50
+ rig: {
51
+ x: rig.x,
52
+ z: rig.z
53
+ },
54
+ target: {
55
+ x: this.targetX,
56
+ z: this.targetZ
57
+ },
58
+ focus: {
59
+ x: this.focusX,
60
+ z: this.focusZ
61
+ },
62
+ bounds: this._bounds()
63
+ });
64
+ this.entity.rotate(0, pose.yawDelta, 0);
65
+ this.entity.setPosition(pose.x, rigY, pose.z);
66
+ this._pending = false;
89
67
  }
90
- const camera = this.entity.findComponent('camera')?.entity;
91
- if (!camera) {
92
- return;
68
+ _teardown() {
69
+ this.app.xr?.off('start', this._onXrStart);
70
+ this.app.xr?.off('update', this._onXrUpdate);
71
+ this.app.xr?.off('end', this._onXrEnd);
93
72
  }
94
- const head = camera.getPosition();
95
- const rig = this.entity.getPosition();
96
- const rigY = rig.y;
97
- const pose = xrStartRigPose({
98
- head: {
99
- x: head.x,
100
- z: head.z
101
- },
102
- headYaw: yawFromBasis(camera.forward, camera.right),
103
- rig: {
104
- x: rig.x,
105
- z: rig.z
106
- },
107
- target: {
108
- x: this.targetX,
109
- z: this.targetZ
110
- },
111
- focus: {
112
- x: this.focusX,
113
- z: this.focusZ
114
- },
115
- bounds: this._bounds()
116
- });
117
- this.entity.rotate(0, pose.yawDelta, 0);
118
- this.entity.setPosition(pose.x, rigY, pose.z);
119
- this._pending = false;
120
- }
121
- _teardown() {
122
- this.app.xr?.off('start', this._onXrStart);
123
- this.app.xr?.off('update', this._onXrUpdate);
124
- this.app.xr?.off('end', this._onXrEnd);
125
- }
126
73
  }
127
-
128
74
  export { XrStartPose };
@@ -1,127 +1,97 @@
1
- import { Script, Vec3, Color, StandardMaterial, CULLFACE_NONE, Mesh, MeshInstance, LAYERID_IMMEDIATE } from 'playcanvas';
2
- import { computeGroundPlane, yOnPlane } from './groundPlane.js';
3
-
4
- /** Flat-array triangle geometry ready for `Mesh.setPositions` / `Mesh.setIndices`. */
5
-
6
- /**
7
- * Triangle geometry for a dashed boundary ring laid flat on the ground plane. Each dash is a
8
- * short band (a quad = two triangles) sweeping from `radius - width / 2` to `radius + width / 2`;
9
- * every vertex is sampled on the circle in XZ and lifted onto the plane via `yOnPlane`.
10
- * Returns empty arrays when radius, width, or dashCount is non-positive, or the plane is invalid.
11
- */
12
- const boundaryRingMesh = ({
13
- center,
14
- radius,
15
- groundPlane,
16
- width,
17
- dashCount = 64,
18
- dashRatio = 0.5
19
- }) => {
20
- const plane = computeGroundPlane(groundPlane);
21
- if (radius <= 0 || width <= 0 || dashCount <= 0 || !plane) {
1
+ import { CULLFACE_NONE, Color, LAYERID_IMMEDIATE, Mesh, MeshInstance, Script, StandardMaterial, Vec3 } from "playcanvas";
2
+ import { computeGroundPlane, yOnPlane } from "./groundPlane.js";
3
+ const boundaryRingMesh = ({ center, radius, groundPlane, width, dashCount = 64, dashRatio = 0.5 })=>{
4
+ const plane = computeGroundPlane(groundPlane);
5
+ if (radius <= 0 || width <= 0 || dashCount <= 0 || !plane) return {
6
+ positions: [],
7
+ indices: []
8
+ };
9
+ const innerR = radius - width / 2;
10
+ const outerR = radius + width / 2;
11
+ const step = 2 * Math.PI / dashCount;
12
+ const on = step * dashRatio;
13
+ const positions = [];
14
+ const indices = [];
15
+ const pushVertex = (r, angle)=>{
16
+ const x = center.x + r * Math.cos(angle);
17
+ const z = center.z + r * Math.sin(angle);
18
+ positions.push(x, yOnPlane(x, z, plane.normal, plane.point, center.y), z);
19
+ };
20
+ for(let i = 0; i < dashCount; i++){
21
+ const a0 = i * step;
22
+ const a1 = a0 + on;
23
+ const base = 4 * i;
24
+ pushVertex(innerR, a0);
25
+ pushVertex(outerR, a0);
26
+ pushVertex(innerR, a1);
27
+ pushVertex(outerR, a1);
28
+ indices.push(base, base + 1, base + 3, base, base + 3, base + 2);
29
+ }
22
30
  return {
23
- positions: [],
24
- indices: []
31
+ positions,
32
+ indices
25
33
  };
26
- }
27
- const innerR = radius - width / 2;
28
- const outerR = radius + width / 2;
29
- const step = Math.PI * 2 / dashCount;
30
- const on = step * dashRatio;
31
- const positions = [];
32
- const indices = [];
33
- const pushVertex = (r, angle) => {
34
- const x = center.x + r * Math.cos(angle);
35
- const z = center.z + r * Math.sin(angle);
36
- positions.push(x, yOnPlane(x, z, plane.normal, plane.point, center.y), z);
37
- };
38
- for (let i = 0; i < dashCount; i++) {
39
- const a0 = i * step;
40
- const a1 = a0 + on;
41
- const base = i * 4;
42
- // Per dash: v0 inner@a0, v1 outer@a0, v2 inner@a1, v3 outer@a1.
43
- pushVertex(innerR, a0);
44
- pushVertex(outerR, a0);
45
- pushVertex(innerR, a1);
46
- pushVertex(outerR, a1);
47
- indices.push(base, base + 1, base + 3, base, base + 3, base + 2);
48
- }
49
- return {
50
- positions,
51
- indices
52
- };
53
34
  };
54
-
55
- /**
56
- * Draws a dashed boundary ring as a flat band mesh on the ground plane.
57
- *
58
- * Rendered as a thin triangle band whose width is a fraction of the radius (`widthRatio`).
59
- * center / radius / groundPlane are set imperatively by the BoundaryRing component (see BoundaryRing.tsx for why
60
- * they are not reactive Script props), which calls `rebuild()` after updating them.
61
- */
62
35
  class BoundaryRingScript extends Script {
63
- static scriptName = 'boundaryRing';
64
- center = new Vec3();
65
- radius = 0;
66
- groundPlane = [];
67
- color = new Color(1, 1, 1);
68
- dashCount = 64;
69
- dashRatio = 0.5;
70
- /** Band width as a fraction of the radius. */
71
- widthRatio = 0.05;
72
- initialize() {
73
- const material = new StandardMaterial();
74
- material.useLighting = false;
75
- material.emissive = this.color;
76
- material.cull = CULLFACE_NONE;
77
- material.update();
78
- this._material = material;
79
- this.rebuild();
80
- }
81
- rebuild() {
82
- this._clearMesh();
83
- const geometry = boundaryRingMesh({
84
- center: this.center,
85
- radius: this.radius,
86
- groundPlane: this.groundPlane,
87
- width: this.radius * this.widthRatio,
88
- dashCount: this.dashCount,
89
- dashRatio: this.dashRatio
90
- });
91
- if (geometry.positions.length === 0 || !this._material) {
92
- return;
36
+ static scriptName = 'boundaryRing';
37
+ center = new Vec3();
38
+ radius = 0;
39
+ groundPlane = [];
40
+ color = new Color(1, 1, 1);
41
+ dashCount = 64;
42
+ dashRatio = 0.5;
43
+ widthRatio = 0.05;
44
+ _material;
45
+ _mesh;
46
+ initialize() {
47
+ const material = new StandardMaterial();
48
+ material.useLighting = false;
49
+ material.emissive = this.color;
50
+ material.cull = CULLFACE_NONE;
51
+ material.update();
52
+ this._material = material;
53
+ this.rebuild();
93
54
  }
94
- const mesh = new Mesh(this.app.graphicsDevice);
95
- mesh.setPositions(geometry.positions);
96
- mesh.setIndices(geometry.indices);
97
- mesh.update();
98
- this._mesh = mesh;
99
- const meshInstance = new MeshInstance(mesh, this._material);
100
- if (this.entity.render) {
101
- this.entity.render.meshInstances = [meshInstance];
102
- } else {
103
- // Render on the Immediate layer (drawn after the World layer where the splats render) so
104
- // the ring is not composited behind them.
105
- this.entity.addComponent('render', {
106
- meshInstances: [meshInstance],
107
- layers: [LAYERID_IMMEDIATE]
108
- });
55
+ rebuild() {
56
+ this._clearMesh();
57
+ const geometry = boundaryRingMesh({
58
+ center: this.center,
59
+ radius: this.radius,
60
+ groundPlane: this.groundPlane,
61
+ width: this.radius * this.widthRatio,
62
+ dashCount: this.dashCount,
63
+ dashRatio: this.dashRatio
64
+ });
65
+ if (0 === geometry.positions.length || !this._material) return;
66
+ const mesh = new Mesh(this.app.graphicsDevice);
67
+ mesh.setPositions(geometry.positions);
68
+ mesh.setIndices(geometry.indices);
69
+ mesh.update();
70
+ this._mesh = mesh;
71
+ const meshInstance = new MeshInstance(mesh, this._material);
72
+ if (this.entity.render) this.entity.render.meshInstances = [
73
+ meshInstance
74
+ ];
75
+ else this.entity.addComponent('render', {
76
+ meshInstances: [
77
+ meshInstance
78
+ ],
79
+ layers: [
80
+ LAYERID_IMMEDIATE
81
+ ]
82
+ });
109
83
  }
110
- }
111
- _clearMesh() {
112
- if (this.entity.render) {
113
- this.entity.render.meshInstances = [];
84
+ _clearMesh() {
85
+ if (this.entity.render) this.entity.render.meshInstances = [];
86
+ if (this._mesh) {
87
+ this._mesh.destroy();
88
+ this._mesh = void 0;
89
+ }
114
90
  }
115
- if (this._mesh) {
116
- this._mesh.destroy();
117
- this._mesh = undefined;
91
+ destroy() {
92
+ this._clearMesh();
93
+ this._material?.destroy();
94
+ this._material = void 0;
118
95
  }
119
- }
120
- destroy() {
121
- this._clearMesh();
122
- this._material?.destroy();
123
- this._material = undefined;
124
- }
125
96
  }
126
-
127
97
  export { BoundaryRingScript, boundaryRingMesh };