@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,64 +1,39 @@
1
1
  function descendingComparator(a, b, orderBy, order) {
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())) {
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;
18
12
  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;
33
13
  }
34
14
  function isEmptyValue(value) {
35
- if (value === '' || value === null || value?.toString().trim() === '' || value === undefined) {
36
- return true;
37
- } else {
38
- return false;
39
- }
15
+ if ('' === value || null === value || value?.toString().trim() === '' || void 0 === value) return true;
16
+ else return false;
40
17
  }
41
18
  function descendingNumComparator(a, b, orderBy) {
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;
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;
48
23
  }
49
24
  function getComparator(order, orderBy, sorting) {
50
- return (a, b) => sorting(a, b, orderBy, order);
25
+ return (a, b)=>sorting(a, b, orderBy, order);
51
26
  }
52
27
  function stableSort(array, comparator) {
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]);
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]);
62
38
  }
63
-
64
39
  export { descendingComparator, getComparator, stableSort };
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
-
@@ -1,14 +1,3 @@
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
-
1
+ import { createContext } from "react";
2
+ const CameraEntityContext = createContext(null);
14
3
  export { CameraEntityContext };
@@ -1,14 +1,18 @@
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];
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
+ ];
12
16
  };
13
-
14
- export { useBoolean as default };
17
+ const hooks_useBoolean = useBoolean;
18
+ export default hooks_useBoolean;
@@ -1,58 +1,58 @@
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]);
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
+ ]);
56
57
  };
57
-
58
58
  export { useCameraPosition };
@@ -1,19 +1,19 @@
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
- };
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
+ };
17
18
  };
18
-
19
19
  export { useDevicePerformance };
package/hooks/useXr.js CHANGED
@@ -1,92 +1,90 @@
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
-
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";
5
4
  const XR_TYPES = {
6
- VR: XRTYPE_VR,
7
- AR: XRTYPE_AR
5
+ VR: XRTYPE_VR,
6
+ AR: XRTYPE_AR
8
7
  };
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
- */
17
8
  const XR_FRAMEBUFFER_SCALE_FACTOR = 1;
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
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
37
14
  }));
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]);
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
+ ]);
90
87
  };
91
-
92
- export { useXr as default, useXr };
88
+ const hooks_useXr = useXr;
89
+ export default hooks_useXr;
90
+ export { useXr };
package/index.js CHANGED
@@ -1,58 +1,58 @@
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';
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terraware/web-components",
3
- "version": "5.0.27",
3
+ "version": "5.1.0",
4
4
  "author": "Terraformation Inc.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
package/setupTests.js CHANGED
@@ -1,5 +1 @@
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
5
1
  import '@testing-library/jest-dom';