@terraware/web-components 5.0.27-rc.0 → 5.0.27

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 +22 -19
  2. package/components/Autocomplete/Autocomplete.js +130 -106
  3. package/components/Badge/index.js +29 -28
  4. package/components/BusySpinner/index.js +45 -40
  5. package/components/Button/Button.js +47 -41
  6. package/components/Checkbox.js +63 -64
  7. package/components/Confirm/index.js +83 -74
  8. package/components/DatePicker/DatePicker.js +141 -138
  9. package/components/DialogBox/DialogBox.js +118 -111
  10. package/components/Divisor.js +18 -18
  11. package/components/Dropdown.js +94 -66
  12. package/components/EditableTable/index.js +271 -211
  13. package/components/ErrorBox/ErrorBox.js +49 -47
  14. package/components/FileChooser/index.js +135 -117
  15. package/components/FormBottomBar/index.js +84 -75
  16. package/components/Icon/Icon.js +20 -12
  17. package/components/Icon/icons/index.js +256 -256
  18. package/components/IconTooltip/index.js +60 -49
  19. package/components/Map/MapBox.js +452 -545
  20. package/components/Map/MapContainer.js +29 -25
  21. package/components/Map/MapDateSliderControl.js +64 -64
  22. package/components/Map/MapDrawer.js +47 -41
  23. package/components/Map/MapLegend.js +172 -176
  24. package/components/Map/MapViewStyleControl.js +63 -59
  25. package/components/Map/ReactMapboxWrapper.js +2 -3
  26. package/components/Map/index.js +180 -161
  27. package/components/Map/types.js +17 -12
  28. package/components/Map/useMaintainLayerOrder.js +26 -16
  29. package/components/Markdown/index.js +26 -25
  30. package/components/Message/Message.js +76 -73
  31. package/components/MultiSelect/index.js +124 -112
  32. package/components/Navbar/NavFooter.js +13 -9
  33. package/components/Navbar/NavItem.js +76 -70
  34. package/components/Navbar/NavSection.js +19 -17
  35. package/components/Navbar/Navbar.js +46 -39
  36. package/components/Navbar/SubNavbar.js +13 -9
  37. package/components/Note.js +22 -18
  38. package/components/OverlayModal/OverlayModal.js +63 -56
  39. package/components/PageForm/index.js +41 -33
  40. package/components/PhotoChooser/index.js +173 -165
  41. package/components/PhotosCarousel/PhotoSlide.js +35 -32
  42. package/components/PhotosCarousel/index.js +85 -80
  43. package/components/PhotosCarousel/usePhotosCarousel.js +76 -69
  44. package/components/Pill/index.js +45 -41
  45. package/components/PillList/index.js +24 -17
  46. package/components/PlacementWrapper/index.js +59 -38
  47. package/components/PopoverMenu/Popover.js +85 -68
  48. package/components/PopoverMenu/index.js +56 -51
  49. package/components/PopoverMultiSelect/index.js +59 -52
  50. package/components/ProgressCircle/ProgressCircle.js +32 -28
  51. package/components/RadioButton.js +19 -17
  52. package/components/Select/Select.js +15 -13
  53. package/components/Select/SelectT.js +250 -235
  54. package/components/Separator/index.js +17 -14
  55. package/components/Size.js +1 -0
  56. package/components/Slider/index.js +56 -43
  57. package/components/SummaryBox.js +72 -70
  58. package/components/Tabs/index.js +135 -133
  59. package/components/TextTruncated/index.js +130 -117
  60. package/components/Textfield/Textfield.js +190 -158
  61. package/components/Textfield/TruncatedTextArea.js +84 -70
  62. package/components/TimelineSlider/TimelineMarker.js +30 -25
  63. package/components/TimelineSlider/TimelineRail.js +11 -8
  64. package/components/TimelineSlider/index.js +66 -64
  65. package/components/TimelineSliderV2/ClusterBadge.js +29 -25
  66. package/components/TimelineSliderV2/TimelineDot.js +35 -31
  67. package/components/TimelineSliderV2/TimelineRail.js +11 -8
  68. package/components/TimelineSliderV2/index.js +103 -121
  69. package/components/TimelineSliderV2/layout.js +147 -124
  70. package/components/TimelineSliderV2/types.js +1 -0
  71. package/components/Tooltip/Tooltip.js +56 -47
  72. package/components/ViewPhotosDialog/index.js +35 -28
  73. package/components/VirtualWalkthrough/Annotation.js +207 -163
  74. package/components/VirtualWalkthrough/AnnotationEditPane.js +184 -198
  75. package/components/VirtualWalkthrough/AnnotationPanel.js +199 -187
  76. package/components/VirtualWalkthrough/Application.js +34 -31
  77. package/components/VirtualWalkthrough/AutoRotator.js +223 -85
  78. package/components/VirtualWalkthrough/BlockingSpinner.js +28 -26
  79. package/components/VirtualWalkthrough/BoundaryRing.js +34 -30
  80. package/components/VirtualWalkthrough/BoundaryWall.js +36 -32
  81. package/components/VirtualWalkthrough/CameraInfo.js +89 -100
  82. package/components/VirtualWalkthrough/ControlsInfoPane.js +195 -254
  83. package/components/VirtualWalkthrough/GradientSky.js +73 -72
  84. package/components/VirtualWalkthrough/SplatControls.js +221 -209
  85. package/components/VirtualWalkthrough/SplatCrop.js +20 -21
  86. package/components/VirtualWalkthrough/SplatFadeCrop.js +20 -21
  87. package/components/VirtualWalkthrough/SplatModel.js +85 -65
  88. package/components/VirtualWalkthrough/SplatRevealRain.js +46 -41
  89. package/components/VirtualWalkthrough/TfAnnotationManager.js +379 -197
  90. package/components/VirtualWalkthrough/TfXrNavigation.js +162 -73
  91. package/components/VirtualWalkthrough/VirtualWalkthroughViewer.js +431 -438
  92. package/components/VirtualWalkthrough/VrAnnotationPanel.js +22 -18
  93. package/components/VirtualWalkthrough/XrAnnotationInteraction.js +17 -14
  94. package/components/VirtualWalkthrough/XrExitButton.js +17 -14
  95. package/components/VirtualWalkthrough/XrGazeDwell.js +17 -14
  96. package/components/VirtualWalkthrough/XrPointerRay.js +17 -14
  97. package/components/VirtualWalkthrough/XrStartPose.js +121 -67
  98. package/components/VirtualWalkthrough/boundary-ring.js +117 -87
  99. package/components/VirtualWalkthrough/boundary-wall.js +258 -175
  100. package/components/VirtualWalkthrough/camera-adoption.js +64 -18
  101. package/components/VirtualWalkthrough/groundPlane.js +47 -32
  102. package/components/VirtualWalkthrough/gsplat-fade-crop-effect.js +35 -35
  103. package/components/VirtualWalkthrough/splatFormat.js +47 -13
  104. package/components/VirtualWalkthrough/useAdoptedCamera.js +44 -23
  105. package/components/VirtualWalkthrough/useRestartOnVr.js +37 -26
  106. package/components/VirtualWalkthrough/useXrRenderTuning.js +54 -33
  107. package/components/VirtualWalkthrough/vr-annotation-panel-layout.js +99 -67
  108. package/components/VirtualWalkthrough/vr-annotation-panel.js +433 -403
  109. package/components/VirtualWalkthrough/vr-annotation-scroll.js +28 -10
  110. package/components/VirtualWalkthrough/walkthrough-camera.js +329 -204
  111. package/components/VirtualWalkthrough/xr-annotation-candidate-buffer.js +80 -39
  112. package/components/VirtualWalkthrough/xr-annotation-candidates.js +18 -6
  113. package/components/VirtualWalkthrough/xr-annotation-interaction.js +56 -31
  114. package/components/VirtualWalkthrough/xr-annotation-targeting.js +38 -22
  115. package/components/VirtualWalkthrough/xr-button-arming.js +17 -7
  116. package/components/VirtualWalkthrough/xr-button-hold.js +36 -22
  117. package/components/VirtualWalkthrough/xr-exit-button-mask.js +36 -22
  118. package/components/VirtualWalkthrough/xr-exit-button.js +207 -148
  119. package/components/VirtualWalkthrough/xr-face-buttons.js +29 -19
  120. package/components/VirtualWalkthrough/xr-gaze-dwell-state.js +34 -23
  121. package/components/VirtualWalkthrough/xr-gaze-dwell.js +144 -107
  122. package/components/VirtualWalkthrough/xr-interactive-ui.js +24 -12
  123. package/components/VirtualWalkthrough/xr-pointer-ray.js +20 -13
  124. package/components/VirtualWalkthrough/xr-progress-pie-material.js +88 -117
  125. package/components/VirtualWalkthrough/xr-progress-pie.js +10 -1
  126. package/components/VirtualWalkthrough/xr-ray-quad.js +30 -16
  127. package/components/VirtualWalkthrough/xr-render-tuning.js +48 -17
  128. package/components/VirtualWalkthrough/xr-scene-bounds.js +37 -21
  129. package/components/VirtualWalkthrough/xr-start-pose.js +73 -27
  130. package/components/VirtualWalkthrough/xr-teleport-gesture.js +42 -16
  131. package/components/svg/BlobbyGrayIconImage.js +39 -41
  132. package/components/svg/BlobbyGrayIconImport.js +39 -41
  133. package/components/svg/BlobbyGrayIconUploadToTheCloud.js +39 -41
  134. package/components/svg/BlobbyIconCloudChecked.js +164 -202
  135. package/components/svg/BlobbyIconExportOrUploadPhoto.js +164 -202
  136. package/components/svg/BlobbyIconFolder.js +164 -202
  137. package/components/svg/BlobbyIconGraphReport.js +164 -202
  138. package/components/svg/BlobbyIconHappy.js +164 -202
  139. package/components/svg/BlobbyIconHeartMonitor.js +164 -202
  140. package/components/svg/BlobbyIconLeaf.js +164 -202
  141. package/components/svg/BlobbyIconLibrary.js +164 -202
  142. package/components/svg/BlobbyIconNursery.js +166 -204
  143. package/components/svg/BlobbyIconOrganization.js +164 -202
  144. package/components/svg/BlobbyIconParchment.js +164 -202
  145. package/components/svg/BlobbyIconPeople.js +164 -202
  146. package/components/svg/BlobbyIconSeedBank.js +164 -202
  147. package/components/svg/BlobbyIconSeedling.js +164 -202
  148. package/components/svg/BlobbyIconSeeds.js +164 -202
  149. package/components/svg/BlobbyIconSite.js +167 -206
  150. package/components/svg/BlobbyIconSparkles.js +164 -202
  151. package/components/svg/BlobbyIconWrench.js +164 -202
  152. package/components/svg/Bug.js +21 -19
  153. package/components/svg/Calendar.js +21 -19
  154. package/components/svg/CaretDown.js +21 -19
  155. package/components/svg/CaretLeft.js +21 -19
  156. package/components/svg/CaretRight.js +21 -19
  157. package/components/svg/CaretUp.js +21 -19
  158. package/components/svg/ChevronDown.js +21 -19
  159. package/components/svg/ChevronUp.js +21 -19
  160. package/components/svg/Close.js +21 -19
  161. package/components/svg/Critical.js +21 -19
  162. package/components/svg/Edit.js +164 -202
  163. package/components/svg/Error.js +21 -19
  164. package/components/svg/Filter.js +21 -19
  165. package/components/svg/Folder.js +21 -19
  166. package/components/svg/Help.js +21 -19
  167. package/components/svg/Home.js +21 -19
  168. package/components/svg/IconAdd.js +21 -19
  169. package/components/svg/IconArrowRight.js +23 -21
  170. package/components/svg/IconBusinessNetwork.js +21 -19
  171. package/components/svg/IconCalendar.js +21 -19
  172. package/components/svg/IconCancel.js +21 -19
  173. package/components/svg/IconChargingBattery.js +21 -19
  174. package/components/svg/IconChecklist.js +23 -21
  175. package/components/svg/IconCheckmark.js +21 -19
  176. package/components/svg/IconCoinInHand.js +21 -19
  177. package/components/svg/IconColumns.js +21 -19
  178. package/components/svg/IconComment.js +22 -20
  179. package/components/svg/IconDashboard.js +21 -19
  180. package/components/svg/IconDataMigration.js +21 -19
  181. package/components/svg/IconDocument.js +23 -21
  182. package/components/svg/IconDownloadFromTheCloud.js +23 -21
  183. package/components/svg/IconEdit.js +23 -21
  184. package/components/svg/IconExpand.js +23 -21
  185. package/components/svg/IconExport.js +21 -19
  186. package/components/svg/IconExternalLink.js +21 -19
  187. package/components/svg/IconEye.js +21 -19
  188. package/components/svg/IconEyeOff.js +21 -19
  189. package/components/svg/IconFile.js +21 -19
  190. package/components/svg/IconFolder.js +21 -19
  191. package/components/svg/IconFullScreen.js +22 -20
  192. package/components/svg/IconFutures.js +21 -19
  193. package/components/svg/IconGraphReport.js +21 -19
  194. package/components/svg/IconGrid.js +21 -19
  195. package/components/svg/IconHeartMonitor.js +21 -19
  196. package/components/svg/IconHelp.js +23 -21
  197. package/components/svg/IconHistory.js +21 -19
  198. package/components/svg/IconImport.js +21 -19
  199. package/components/svg/IconIndex.js +21 -19
  200. package/components/svg/IconLayers.js +21 -19
  201. package/components/svg/IconLibrary.js +22 -20
  202. package/components/svg/IconList.js +21 -19
  203. package/components/svg/IconLivePlant.js +21 -19
  204. package/components/svg/IconLocations.js +21 -19
  205. package/components/svg/IconMail.js +21 -19
  206. package/components/svg/IconManager.js +21 -19
  207. package/components/svg/IconMap.js +21 -19
  208. package/components/svg/IconMarker.js +21 -19
  209. package/components/svg/IconMenu.js +21 -19
  210. package/components/svg/IconMenuHorizontal.js +21 -19
  211. package/components/svg/IconModule.js +21 -19
  212. package/components/svg/IconMyLocation.js +21 -19
  213. package/components/svg/IconNote.js +23 -21
  214. package/components/svg/IconNursery.js +23 -21
  215. package/components/svg/IconOrg.js +21 -19
  216. package/components/svg/IconParchment.js +21 -19
  217. package/components/svg/IconPhoto.js +21 -19
  218. package/components/svg/IconPlantsFilled.js +21 -19
  219. package/components/svg/IconRedo.js +21 -19
  220. package/components/svg/IconRestorationSite.js +21 -19
  221. package/components/svg/IconSeedBank.js +21 -19
  222. package/components/svg/IconSeedling.js +21 -19
  223. package/components/svg/IconSettings.js +21 -19
  224. package/components/svg/IconSlice.js +21 -19
  225. package/components/svg/IconSubmit.js +21 -19
  226. package/components/svg/IconSubtract.js +23 -21
  227. package/components/svg/IconSynced.js +21 -19
  228. package/components/svg/IconTrashCan.js +21 -19
  229. package/components/svg/IconTreasureMap.js +21 -19
  230. package/components/svg/IconUnavailable.js +21 -19
  231. package/components/svg/IconUndo.js +21 -19
  232. package/components/svg/IconVariable.js +21 -19
  233. package/components/svg/IconVideo.js +31 -30
  234. package/components/svg/IconWifi.js +21 -19
  235. package/components/svg/Info.js +21 -19
  236. package/components/svg/Key.js +21 -19
  237. package/components/svg/Leaf.js +21 -19
  238. package/components/svg/Lock.js +21 -19
  239. package/components/svg/Logo.js +43 -48
  240. package/components/svg/MenuVertical.js +21 -19
  241. package/components/svg/Notification.js +21 -19
  242. package/components/svg/Person.js +21 -19
  243. package/components/svg/Plus.js +21 -19
  244. package/components/svg/RestorationSite.js +21 -19
  245. package/components/svg/Search.js +21 -19
  246. package/components/svg/Seeds.js +21 -19
  247. package/components/svg/Site.js +21 -19
  248. package/components/svg/Sparkles.js +21 -19
  249. package/components/svg/Species.js +21 -19
  250. package/components/svg/Species2.js +164 -202
  251. package/components/svg/Spinner.js +48 -54
  252. package/components/svg/Star.js +21 -19
  253. package/components/svg/Success.js +21 -19
  254. package/components/svg/SuccessFilled.js +21 -19
  255. package/components/svg/TerrawareLogoDesktop.js +49 -55
  256. package/components/svg/TerrawareLogoMobile.js +26 -25
  257. package/components/svg/Touchscreen.js +21 -19
  258. package/components/svg/UploadCloud.js +164 -202
  259. package/components/svg/Warning.js +21 -19
  260. package/components/svg/WelcomeClipboard.js +133 -156
  261. package/components/svg/index.js +129 -129
  262. package/components/table/EnhancedTableToolbar.js +74 -68
  263. package/components/table/EnhancedTableToolbarV2.js +41 -31
  264. package/components/table/TableCellRenderer.js +231 -196
  265. package/components/table/TableHeader.js +73 -71
  266. package/components/table/TableHeaderItem.js +102 -97
  267. package/components/table/density.js +19 -18
  268. package/components/table/index.js +369 -350
  269. package/components/table/sort.js +52 -27
  270. package/components/table/types.js +1 -0
  271. package/components/types/index.js +1 -0
  272. package/hooks/cameraEntityContext.js +13 -2
  273. package/hooks/useBoolean.js +13 -17
  274. package/hooks/useCameraPosition.js +56 -56
  275. package/hooks/useDevicePerformance.js +17 -17
  276. package/hooks/useXr.js +87 -85
  277. package/index.js +58 -58
  278. package/package.json +1 -1
  279. package/setupTests.js +4 -0
  280. package/strings/export.js +170 -111
  281. package/strings/index.js +54 -25
  282. package/strings/locales.js +41 -21
  283. package/strings/strings-en.js +51 -49
  284. package/strings/strings-es.js +51 -49
  285. package/strings/strings-fr.js +51 -49
  286. package/strings/strings-gx.js +51 -49
  287. package/style-dictionary-dist/TerrawareTheme.js +186 -186
  288. package/theme.js +76 -74
  289. package/utils/color.js +15 -8
  290. package/utils/date.js +108 -42
  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 +79 -42
  295. package/virtualWalkthrough.js +23 -23
@@ -1,39 +1,64 @@
1
1
  function descendingComparator(a, b, orderBy, order) {
2
- const numCompare = descendingNumComparator(a, b, orderBy);
3
- if (null !== numCompare) if (0 === numCompare) return numCompare;
4
- else return 'desc' === order ? -1 * numCompare : numCompare;
5
- const bValue = b[orderBy] ?? '';
6
- const aValue = a[orderBy] ?? '';
7
- if (isEmptyValue(aValue.toString()) && isEmptyValue(bValue.toString())) return 0;
8
- if (isEmptyValue(aValue.toString())) return 1;
9
- if (isEmptyValue(bValue.toString())) return -1;
10
- if (bValue < aValue) return 'desc' === order ? -1 : 1;
11
- if (bValue > aValue) return 'desc' === order ? 1 : -1;
2
+ // first attempt to parse into a numeric value and compare
3
+ const numCompare = descendingNumComparator(a, b, orderBy);
4
+ if (numCompare !== null) {
5
+ if (numCompare === 0) {
6
+ return numCompare;
7
+ } else {
8
+ return order === 'desc' ? numCompare * -1 : numCompare;
9
+ }
10
+ }
11
+
12
+ // if non-numeric, compare using the javascript built-in compare for this type
13
+ const bValue = b[orderBy] ?? '';
14
+ const aValue = a[orderBy] ?? '';
15
+
16
+ // blank values at the end always (any order)
17
+ if (isEmptyValue(aValue.toString()) && isEmptyValue(bValue.toString())) {
12
18
  return 0;
19
+ }
20
+ if (isEmptyValue(aValue.toString())) {
21
+ return 1;
22
+ }
23
+ if (isEmptyValue(bValue.toString())) {
24
+ return -1;
25
+ }
26
+ if (bValue < aValue) {
27
+ return order === 'desc' ? -1 : 1;
28
+ }
29
+ if (bValue > aValue) {
30
+ return order === 'desc' ? 1 : -1;
31
+ }
32
+ return 0;
13
33
  }
14
34
  function isEmptyValue(value) {
15
- if ('' === value || null === value || value?.toString().trim() === '' || void 0 === value) return true;
16
- else return false;
35
+ if (value === '' || value === null || value?.toString().trim() === '' || value === undefined) {
36
+ return true;
37
+ } else {
38
+ return false;
39
+ }
17
40
  }
18
41
  function descendingNumComparator(a, b, orderBy) {
19
- const aNumValue = Number(a[orderBy] ?? '0.0');
20
- const bNumValue = Number(b[orderBy] ?? '0.0');
21
- if (!isNaN(aNumValue) && !isNaN(bNumValue)) return bNumValue - aNumValue;
22
- return null;
42
+ const aNumValue = Number(a[orderBy] ?? '0.0');
43
+ const bNumValue = Number(b[orderBy] ?? '0.0');
44
+ if (!isNaN(aNumValue) && !isNaN(bNumValue)) {
45
+ return bNumValue - aNumValue;
46
+ }
47
+ return null;
23
48
  }
24
49
  function getComparator(order, orderBy, sorting) {
25
- return (a, b)=>sorting(a, b, orderBy, order);
50
+ return (a, b) => sorting(a, b, orderBy, order);
26
51
  }
27
52
  function stableSort(array, comparator) {
28
- const stabilizedThis = array.map((el, index)=>[
29
- el,
30
- index
31
- ]);
32
- stabilizedThis.sort((a, b)=>{
33
- const order = comparator(a[0], b[0]);
34
- if (0 !== order) return order;
35
- return a[1] - b[1];
36
- });
37
- return stabilizedThis.map((el)=>el[0]);
53
+ const stabilizedThis = array.map((el, index) => [el, index]);
54
+ stabilizedThis.sort((a, b) => {
55
+ const order = comparator(a[0], b[0]);
56
+ if (order !== 0) {
57
+ return order;
58
+ }
59
+ return a[1] - b[1];
60
+ });
61
+ return stabilizedThis.map(el => el[0]);
38
62
  }
63
+
39
64
  export { descendingComparator, getComparator, stableSort };
@@ -0,0 +1 @@
1
+
@@ -0,0 +1 @@
1
+
@@ -1,3 +1,14 @@
1
- import { createContext } from "react";
2
- const CameraEntityContext = createContext(null);
1
+ import { createContext } from 'react';
2
+
3
+ /**
4
+ * The camera entity the walkthrough owns, published by `VirtualWalkthroughViewer` for the hooks
5
+ * beneath it.
6
+ *
7
+ * Looking the camera up by name is not safe once the viewer shares a scene graph with a host that
8
+ * has entities of its own: `findByName('camera')` walks the whole graph and returns whichever
9
+ * entity was added first, so a host that names its own camera entity `camera` shadows the viewer's.
10
+ * Null outside a viewer, where the name lookup is still the only thing to go on.
11
+ */
12
+ const CameraEntityContext = /*#__PURE__*/createContext(null);
13
+
3
14
  export { CameraEntityContext };
@@ -1,18 +1,14 @@
1
- import { useCallback, useState } from "react";
2
- const useBoolean = (initialValue)=>{
3
- const [value, setValue] = useState(initialValue);
4
- const setTrue = useCallback(()=>{
5
- setValue(true);
6
- }, []);
7
- const setFalse = useCallback(()=>{
8
- setValue(false);
9
- }, []);
10
- return [
11
- value,
12
- setValue,
13
- setTrue,
14
- setFalse
15
- ];
1
+ import { useState, useCallback } from 'react';
2
+
3
+ const useBoolean = initialValue => {
4
+ const [value, setValue] = useState(initialValue);
5
+ const setTrue = useCallback(() => {
6
+ setValue(true);
7
+ }, []);
8
+ const setFalse = useCallback(() => {
9
+ setValue(false);
10
+ }, []);
11
+ return [value, setValue, setTrue, setFalse];
16
12
  };
17
- const hooks_useBoolean = useBoolean;
18
- export default hooks_useBoolean;
13
+
14
+ export { useBoolean as default };
@@ -1,58 +1,58 @@
1
- import { useCallback, useContext, useMemo } from "react";
2
- import { useApp } from "@playcanvas/react/hooks";
3
- import { Vec3 } from "playcanvas";
4
- import { CameraEntityContext } from "./cameraEntityContext.js";
5
- const scriptsOn = (node)=>node?.script;
6
- const useCameraPosition = (cameraEntity)=>{
7
- const app = useApp();
8
- const contextCamera = useContext(CameraEntityContext);
9
- const resolvedCamera = cameraEntity ?? contextCamera;
10
- const findCamera = useCallback(()=>resolvedCamera ?? app.root.findByName('camera'), [
11
- app,
12
- resolvedCamera
13
- ]);
14
- const findControls = useCallback((camera)=>{
15
- const own = scriptsOn(camera);
16
- return own?.cameraControls ?? own?.walkthroughCamera ?? scriptsOn(camera?.parent)?.walkthroughCamera;
17
- }, []);
18
- const setCamera = useCallback((focus, position, horizontalNdcBias = 0)=>{
19
- const camera = findCamera();
20
- const controls = findControls(camera);
21
- if (controls && camera) controls.reset(new Vec3(focus), position ? new Vec3(position) : camera.getPosition(), horizontalNdcBias);
22
- }, [
23
- findCamera,
24
- findControls
25
- ]);
26
- const getCameraState = useCallback(()=>{
27
- const camera = findCamera();
28
- const controls = findControls(camera);
29
- if (camera && controls) {
30
- const position = camera.getPosition();
31
- const focusPoint = controls?.focusPoint;
32
- return {
33
- position: [
34
- position.x,
35
- position.y,
36
- position.z
37
- ],
38
- focus: [
39
- focusPoint.x,
40
- focusPoint.y,
41
- focusPoint.z
42
- ]
43
- };
44
- }
45
- return null;
46
- }, [
47
- findCamera,
48
- findControls
49
- ]);
50
- return useMemo(()=>({
51
- setCamera,
52
- getCameraState
53
- }), [
54
- setCamera,
55
- getCameraState
56
- ]);
1
+ import { useContext, useCallback, useMemo } from 'react';
2
+ import { useApp } from '@playcanvas/react/hooks';
3
+ import { Vec3 } from 'playcanvas';
4
+ import { CameraEntityContext } from './cameraEntityContext.js';
5
+
6
+ /** The camera-driving scripts this hook talks to. */
7
+
8
+ /** Scripts are added to entities dynamically, so they aren't on the engine's types. */
9
+ const scriptsOn = node => node?.script;
10
+
11
+ /**
12
+ * @param cameraEntity - The camera to drive. Callers above {@link CameraEntityContext} pass it
13
+ * directly; the ones beneath take it from the context, and anything with neither falls back to
14
+ * looking an entity named `camera` in the scene graph.
15
+ */
16
+ const useCameraPosition = cameraEntity => {
17
+ const app = useApp();
18
+ const contextCamera = useContext(CameraEntityContext);
19
+ const resolvedCamera = cameraEntity ?? contextCamera;
20
+ const findCamera = useCallback(() => resolvedCamera ?? app.root.findByName('camera'), [app, resolvedCamera]);
21
+
22
+ /**
23
+ * The script driving the camera. WalkthroughCamera is mounted on the rig above the camera rather
24
+ * than on the camera entity, so that it poses a camera the walkthrough adopted from a host scene
25
+ * as readily as one of its own; CameraControls sits on the camera entity itself.
26
+ */
27
+ const findControls = useCallback(camera => {
28
+ const own = scriptsOn(camera);
29
+ return own?.cameraControls ?? own?.walkthroughCamera ?? scriptsOn(camera?.parent)?.walkthroughCamera;
30
+ }, []);
31
+ const setCamera = useCallback((focus, position, horizontalNdcBias = 0) => {
32
+ const camera = findCamera();
33
+ const controls = findControls(camera);
34
+ if (controls && camera) {
35
+ // The extra bias arg is only honored by WalkthroughCamera; CameraControls ignores it.
36
+ controls.reset(new Vec3(focus), position ? new Vec3(position) : camera.getPosition(), horizontalNdcBias);
37
+ }
38
+ }, [findCamera, findControls]);
39
+ const getCameraState = useCallback(() => {
40
+ const camera = findCamera();
41
+ const controls = findControls(camera);
42
+ if (camera && controls) {
43
+ const position = camera.getPosition();
44
+ const focusPoint = controls?.focusPoint;
45
+ return {
46
+ position: [position.x, position.y, position.z],
47
+ focus: [focusPoint.x, focusPoint.y, focusPoint.z]
48
+ };
49
+ }
50
+ return null;
51
+ }, [findCamera, findControls]);
52
+ return useMemo(() => ({
53
+ setCamera,
54
+ getCameraState
55
+ }), [setCamera, getCameraState]);
57
56
  };
57
+
58
58
  export { useCameraPosition };
@@ -1,19 +1,19 @@
1
- import { useMemo } from "react";
2
- import useDeviceInfo from "../utils/useDeviceInfo.js";
3
- const useDevicePerformance = ()=>{
4
- const { isMobile } = useDeviceInfo();
5
- const cpuCores = useMemo(()=>navigator.hardwareConcurrency || 4, []);
6
- const deviceMemory = useMemo(()=>navigator.deviceMemory, []);
7
- const isHighPerformance = useMemo(()=>!isMobile && cpuCores >= 4 || void 0 !== deviceMemory && deviceMemory >= 8 || cpuCores >= 6, [
8
- cpuCores,
9
- deviceMemory,
10
- isMobile
11
- ]);
12
- return {
13
- isHighPerformance,
14
- cpuCores,
15
- deviceMemory,
16
- isMobile
17
- };
1
+ import { useMemo } from 'react';
2
+ import useDeviceInfo from '../utils/useDeviceInfo.js';
3
+
4
+ const useDevicePerformance = () => {
5
+ const {
6
+ isMobile
7
+ } = useDeviceInfo();
8
+ const cpuCores = useMemo(() => navigator.hardwareConcurrency || 4, []);
9
+ const deviceMemory = useMemo(() => navigator.deviceMemory, []);
10
+ const isHighPerformance = useMemo(() => !isMobile && cpuCores >= 4 || deviceMemory !== undefined && deviceMemory >= 8 || cpuCores >= 6, [cpuCores, deviceMemory, isMobile]);
11
+ return {
12
+ isHighPerformance,
13
+ cpuCores,
14
+ deviceMemory,
15
+ isMobile
16
+ };
18
17
  };
18
+
19
19
  export { useDevicePerformance };
package/hooks/useXr.js CHANGED
@@ -1,90 +1,92 @@
1
- import { useCallback, useEffect, useMemo, useState } from "react";
2
- import { useApp } from "@playcanvas/react/hooks";
3
- import { XRSPACE_LOCALFLOOR, XRTYPE_AR, XRTYPE_VR } from "playcanvas";
1
+ import { useState, useEffect, useCallback, useMemo } from 'react';
2
+ import { useApp } from '@playcanvas/react/hooks';
3
+ import { XRTYPE_AR, XRTYPE_VR, XRSPACE_LOCALFLOOR } from 'playcanvas';
4
+
4
5
  const XR_TYPES = {
5
- VR: XRTYPE_VR,
6
- AR: XRTYPE_AR
6
+ VR: XRTYPE_VR,
7
+ AR: XRTYPE_AR
7
8
  };
9
+
10
+ /**
11
+ * Factor PlayCanvas applies on top of the device pixel ratio to compute the headset's
12
+ * framebuffer resolution: `app.graphicsDevice.maxPixelRatio / window.devicePixelRatio *
13
+ * XR_FRAMEBUFFER_SCALE_FACTOR`. Splat rendering in stereo is fill-rate bound, so this (and
14
+ * `maxPixelRatio`, which also multiplies XR resolution) is the largest lever on XR framerate.
15
+ * Read once when the session starts and fixed for its lifetime.
16
+ */
8
17
  const XR_FRAMEBUFFER_SCALE_FACTOR = 1;
9
- const useXr = ({ onError } = {})=>{
10
- const app = useApp();
11
- const [available, setAvailable] = useState(()=>({
12
- VR: app.xr?.isAvailable(XRTYPE_VR) ?? false,
13
- AR: app.xr?.isAvailable(XRTYPE_AR) ?? false
18
+ const useXr = ({
19
+ onError
20
+ } = {}) => {
21
+ const app = useApp();
22
+ // Seeded from the manager rather than defaulting to unavailable, so a caller acting in a mount
23
+ // effect isn't told VR is unsupported while the effect below is still waiting to run.
24
+ const [available, setAvailable] = useState(() => ({
25
+ VR: app.xr?.isAvailable(XRTYPE_VR) ?? false,
26
+ AR: app.xr?.isAvailable(XRTYPE_AR) ?? false
27
+ }));
28
+ // `type` is set as soon as a session is requested, so gate on `active` to ignore pending sessions.
29
+ const [currentXrType, setCurrentXrType] = useState(app.xr?.active ? app.xr.type : null);
30
+ useEffect(() => {
31
+ // We subscribe to the manager directly because `app` doesn't update when XR's availability changes.
32
+ const handleAvailable = (type, isAvailable) => {
33
+ if (type === XRTYPE_VR) {
34
+ setAvailable(prev => ({
35
+ ...prev,
36
+ VR: isAvailable
14
37
  }));
15
- const [currentXrType, setCurrentXrType] = useState(app.xr?.active ? app.xr.type : null);
16
- useEffect(()=>{
17
- const handleAvailable = (type, isAvailable)=>{
18
- if (type === XRTYPE_VR) setAvailable((prev)=>({
19
- ...prev,
20
- VR: isAvailable
21
- }));
22
- else if (type === XRTYPE_AR) setAvailable((prev)=>({
23
- ...prev,
24
- AR: isAvailable
25
- }));
26
- };
27
- setAvailable({
28
- VR: app.xr?.isAvailable(XRTYPE_VR) ?? false,
29
- AR: app.xr?.isAvailable(XRTYPE_AR) ?? false
30
- });
31
- app.xr?.on('available', handleAvailable);
32
- return ()=>{
33
- app.xr?.off('available', handleAvailable);
34
- };
35
- }, [
36
- app
37
- ]);
38
- useEffect(()=>{
39
- const handleStart = ()=>setCurrentXrType(app.xr?.type ?? null);
40
- const handleEnd = ()=>setCurrentXrType(null);
41
- setCurrentXrType(app.xr?.active ? app.xr.type : null);
42
- app.xr?.on('start', handleStart);
43
- app.xr?.on('end', handleEnd);
44
- return ()=>{
45
- app.xr?.off('start', handleStart);
46
- app.xr?.off('end', handleEnd);
47
- };
48
- }, [
49
- app
50
- ]);
51
- const isXrAvailable = useCallback((type)=>available[type], [
52
- available
53
- ]);
54
- const startXr = useCallback((type)=>{
55
- const camera = app.root.findComponent('camera');
56
- app.xr?.start(camera, XR_TYPES[type], XRSPACE_LOCALFLOOR, {
57
- framebufferScaleFactor: XR_FRAMEBUFFER_SCALE_FACTOR,
58
- callback: (err)=>{
59
- if (err) {
60
- onError?.(err);
61
- app.xr?.end();
62
- }
63
- }
64
- });
65
- }, [
66
- app,
67
- onError
68
- ]);
69
- const endXr = useCallback(()=>{
70
- app.xr?.end();
71
- }, [
72
- app
73
- ]);
74
- return useMemo(()=>({
75
- isXrAvailable,
76
- startXr,
77
- endXr,
78
- isCurrentlyInXr: null !== currentXrType,
79
- isCurrentlyInAr: currentXrType === XRTYPE_AR,
80
- isCurrentlyInVr: currentXrType === XRTYPE_VR
81
- }), [
82
- isXrAvailable,
83
- startXr,
84
- endXr,
85
- currentXrType
86
- ]);
38
+ } else if (type === XRTYPE_AR) {
39
+ setAvailable(prev => ({
40
+ ...prev,
41
+ AR: isAvailable
42
+ }));
43
+ }
44
+ };
45
+ setAvailable({
46
+ VR: app.xr?.isAvailable(XRTYPE_VR) ?? false,
47
+ AR: app.xr?.isAvailable(XRTYPE_AR) ?? false
48
+ });
49
+ app.xr?.on('available', handleAvailable);
50
+ return () => {
51
+ app.xr?.off('available', handleAvailable);
52
+ };
53
+ }, [app]);
54
+ useEffect(() => {
55
+ const handleStart = () => setCurrentXrType(app.xr?.type ?? null);
56
+ // `app.xr.type` isn't cleared until after the `end` event fires, so don't read it here.
57
+ const handleEnd = () => setCurrentXrType(null);
58
+ setCurrentXrType(app.xr?.active ? app.xr.type : null);
59
+ app.xr?.on('start', handleStart);
60
+ app.xr?.on('end', handleEnd);
61
+ return () => {
62
+ app.xr?.off('start', handleStart);
63
+ app.xr?.off('end', handleEnd);
64
+ };
65
+ }, [app]);
66
+ const isXrAvailable = useCallback(type => available[type], [available]);
67
+ const startXr = useCallback(type => {
68
+ const camera = app.root.findComponent('camera');
69
+ app.xr?.start(camera, XR_TYPES[type], XRSPACE_LOCALFLOOR, {
70
+ framebufferScaleFactor: XR_FRAMEBUFFER_SCALE_FACTOR,
71
+ callback: err => {
72
+ if (err) {
73
+ onError?.(err);
74
+ app.xr?.end();
75
+ }
76
+ }
77
+ });
78
+ }, [app, onError]);
79
+ const endXr = useCallback(() => {
80
+ app.xr?.end();
81
+ }, [app]);
82
+ return useMemo(() => ({
83
+ isXrAvailable,
84
+ startXr,
85
+ endXr,
86
+ isCurrentlyInXr: currentXrType !== null,
87
+ isCurrentlyInAr: currentXrType === XRTYPE_AR,
88
+ isCurrentlyInVr: currentXrType === XRTYPE_VR
89
+ }), [isXrAvailable, startXr, endXr, currentXrType]);
87
90
  };
88
- const hooks_useXr = useXr;
89
- export default hooks_useXr;
90
- export { useXr };
91
+
92
+ export { useXr as default, useXr };
package/index.js CHANGED
@@ -1,58 +1,58 @@
1
- import * as __rspack_external__components_svg_index_js_524d890d from "./components/svg/index.js";
2
- export { default as AntSwitch } from "./components/AntSwitch/index.js";
3
- export { default as Autocomplete } from "./components/Autocomplete/Autocomplete.js";
4
- export { default as Badge } from "./components/Badge/index.js";
5
- export { default as BusySpinner } from "./components/BusySpinner/index.js";
6
- export { default as Button } from "./components/Button/Button.js";
7
- export { default as Checkbox } from "./components/Checkbox.js";
8
- export { default as Confirm } from "./components/Confirm/index.js";
9
- export { default as DatePicker } from "./components/DatePicker/DatePicker.js";
10
- export { default as DialogBox } from "./components/DialogBox/DialogBox.js";
11
- export { default as Divisor } from "./components/Divisor.js";
12
- export { DropdownV1, default as Dropdown } from "./components/Dropdown.js";
13
- export { default as EditableTable } from "./components/EditableTable/index.js";
14
- export { default as ErrorBox } from "./components/ErrorBox/ErrorBox.js";
15
- export { default as FileChooser } from "./components/FileChooser/index.js";
16
- export { default as FormBottomBar } from "./components/FormBottomBar/index.js";
17
- export { default as Icon } from "./components/Icon/Icon.js";
18
- export { default as icons } from "./components/Icon/icons/index.js";
19
- export { default as IconTooltip } from "./components/IconTooltip/index.js";
20
- export { default as MapComponent } from "./components/Map/index.js";
21
- export { default as Message } from "./components/Message/Message.js";
22
- export { default as MultiSelect } from "./components/MultiSelect/index.js";
23
- export { default as NavFooter } from "./components/Navbar/NavFooter.js";
24
- export { default as NavItem } from "./components/Navbar/NavItem.js";
25
- export { default as NavSection } from "./components/Navbar/NavSection.js";
26
- export { default as Navbar } from "./components/Navbar/Navbar.js";
27
- export { default as Note } from "./components/Note.js";
28
- export { default as OverlayModal } from "./components/OverlayModal/OverlayModal.js";
29
- export { default as PageForm } from "./components/PageForm/index.js";
30
- export { default as PhotoChooser } from "./components/PhotoChooser/index.js";
31
- export { default as PhotosCarousel } from "./components/PhotosCarousel/index.js";
32
- export { default as Pill } from "./components/Pill/index.js";
33
- export { default as PillList } from "./components/PillList/index.js";
34
- export { default as PlacementWrapper } from "./components/PlacementWrapper/index.js";
35
- export { default as PopoverMenu } from "./components/PopoverMenu/index.js";
36
- export { default as Popover } from "./components/PopoverMenu/Popover.js";
37
- export { default as PopoverMultiSelect } from "./components/PopoverMultiSelect/index.js";
38
- export { default as ProgressCircle } from "./components/ProgressCircle/ProgressCircle.js";
39
- export { default as RadioButton } from "./components/RadioButton.js";
40
- export { default as Select } from "./components/Select/Select.js";
41
- export { default as SelectT } from "./components/Select/SelectT.js";
42
- export { default as Separator } from "./components/Separator/index.js";
43
- export { default as Slider } from "./components/Slider/index.js";
44
- export { default as SummaryBox } from "./components/SummaryBox.js";
45
- export { default as Tabs } from "./components/Tabs/index.js";
46
- export { default as TextTruncated } from "./components/TextTruncated/index.js";
47
- export { default as Textfield } from "./components/Textfield/Textfield.js";
48
- export { default as TimelineSlider } from "./components/TimelineSlider/index.js";
49
- export { default as TimelineSliderV2 } from "./components/TimelineSliderV2/index.js";
50
- export { default as Tooltip } from "./components/Tooltip/Tooltip.js";
51
- export { default as ViewPhotosDialog } from "./components/ViewPhotosDialog/index.js";
52
- export { default as Table } from "./components/table/index.js";
53
- export { CellDateRenderer, default as CellRenderer } from "./components/table/TableCellRenderer.js";
54
- export { descendingComparator, getComparator, stableSort } from "./components/table/sort.js";
55
- export { getLocale, getStrings, setLocale, useStrings } from "./strings/index.js";
56
- export { findLocaleDetails, getSupportedLocales, supportedLocales } from "./strings/locales.js";
57
- export { default as theme } from "./theme.js";
58
- export { __rspack_external__components_svg_index_js_524d890d as Svg };
1
+ export { default as AntSwitch } from './components/AntSwitch/index.js';
2
+ export { default as Autocomplete } from './components/Autocomplete/Autocomplete.js';
3
+ export { default as Badge } from './components/Badge/index.js';
4
+ export { default as BusySpinner } from './components/BusySpinner/index.js';
5
+ export { default as Button } from './components/Button/Button.js';
6
+ export { default as Checkbox } from './components/Checkbox.js';
7
+ export { default as Confirm } from './components/Confirm/index.js';
8
+ export { default as DatePicker } from './components/DatePicker/DatePicker.js';
9
+ export { default as DialogBox } from './components/DialogBox/DialogBox.js';
10
+ export { default as Divisor } from './components/Divisor.js';
11
+ export { default as Dropdown, DropdownV1 } from './components/Dropdown.js';
12
+ export { default as EditableTable } from './components/EditableTable/index.js';
13
+ export { default as ErrorBox } from './components/ErrorBox/ErrorBox.js';
14
+ export { default as FileChooser } from './components/FileChooser/index.js';
15
+ export { default as FormBottomBar } from './components/FormBottomBar/index.js';
16
+ export { default as Icon } from './components/Icon/Icon.js';
17
+ export { default as icons } from './components/Icon/icons/index.js';
18
+ export { default as IconTooltip } from './components/IconTooltip/index.js';
19
+ export { default as MapComponent } from './components/Map/index.js';
20
+ export { default as Message } from './components/Message/Message.js';
21
+ export { default as MultiSelect } from './components/MultiSelect/index.js';
22
+ export { default as NavFooter } from './components/Navbar/NavFooter.js';
23
+ export { default as NavItem } from './components/Navbar/NavItem.js';
24
+ export { default as NavSection } from './components/Navbar/NavSection.js';
25
+ export { default as Navbar } from './components/Navbar/Navbar.js';
26
+ export { default as Note } from './components/Note.js';
27
+ export { default as OverlayModal } from './components/OverlayModal/OverlayModal.js';
28
+ export { default as PageForm } from './components/PageForm/index.js';
29
+ export { default as PhotoChooser } from './components/PhotoChooser/index.js';
30
+ export { default as PhotosCarousel } from './components/PhotosCarousel/index.js';
31
+ export { default as Pill } from './components/Pill/index.js';
32
+ export { default as PillList } from './components/PillList/index.js';
33
+ export { default as PlacementWrapper } from './components/PlacementWrapper/index.js';
34
+ export { default as PopoverMenu } from './components/PopoverMenu/index.js';
35
+ export { default as Popover } from './components/PopoverMenu/Popover.js';
36
+ export { default as PopoverMultiSelect } from './components/PopoverMultiSelect/index.js';
37
+ export { default as ProgressCircle } from './components/ProgressCircle/ProgressCircle.js';
38
+ export { default as RadioButton } from './components/RadioButton.js';
39
+ export { default as Select } from './components/Select/Select.js';
40
+ export { default as SelectT } from './components/Select/SelectT.js';
41
+ export { default as Separator } from './components/Separator/index.js';
42
+ export { default as Slider } from './components/Slider/index.js';
43
+ export { default as SummaryBox } from './components/SummaryBox.js';
44
+ export { default as Tabs } from './components/Tabs/index.js';
45
+ export { default as TextTruncated } from './components/TextTruncated/index.js';
46
+ export { default as Textfield } from './components/Textfield/Textfield.js';
47
+ export { default as TimelineSlider } from './components/TimelineSlider/index.js';
48
+ export { default as TimelineSliderV2 } from './components/TimelineSliderV2/index.js';
49
+ export { default as Tooltip } from './components/Tooltip/Tooltip.js';
50
+ export { default as ViewPhotosDialog } from './components/ViewPhotosDialog/index.js';
51
+ import * as index from './components/svg/index.js';
52
+ export { index as Svg };
53
+ export { default as Table } from './components/table/index.js';
54
+ export { CellDateRenderer, default as CellRenderer } from './components/table/TableCellRenderer.js';
55
+ export { descendingComparator, getComparator, stableSort } from './components/table/sort.js';
56
+ export { getLocale, getStrings, setLocale, useStrings } from './strings/index.js';
57
+ export { findLocaleDetails, getSupportedLocales, supportedLocales } from './strings/locales.js';
58
+ export { default as theme } from './theme.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terraware/web-components",
3
- "version": "5.0.27-rc.0",
3
+ "version": "5.0.27",
4
4
  "author": "Terraformation Inc.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
package/setupTests.js CHANGED
@@ -1 +1,5 @@
1
+ // jest-dom adds custom jest matchers for asserting on DOM nodes.
2
+ // allows you to do things like:
3
+ // expect(element).toHaveTextContent(/react/i)
4
+ // learn more: https://github.com/testing-library/jest-dom
1
5
  import '@testing-library/jest-dom';