@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.
- package/components/AntSwitch/index.js +22 -19
- package/components/Autocomplete/Autocomplete.js +130 -106
- package/components/Badge/index.js +29 -28
- package/components/BusySpinner/index.js +45 -40
- package/components/Button/Button.js +47 -41
- package/components/Checkbox.js +63 -64
- package/components/Confirm/index.js +83 -74
- package/components/DatePicker/DatePicker.js +141 -138
- package/components/DialogBox/DialogBox.js +118 -111
- package/components/Divisor.js +18 -18
- package/components/Dropdown.js +94 -66
- package/components/EditableTable/index.js +271 -211
- package/components/ErrorBox/ErrorBox.js +49 -47
- package/components/FileChooser/index.js +135 -117
- package/components/FormBottomBar/index.js +84 -75
- package/components/Icon/Icon.js +20 -12
- package/components/Icon/icons/index.js +256 -256
- package/components/IconTooltip/index.js +60 -49
- package/components/Map/MapBox.js +452 -545
- package/components/Map/MapContainer.js +29 -25
- package/components/Map/MapDateSliderControl.js +64 -64
- package/components/Map/MapDrawer.js +47 -41
- package/components/Map/MapLegend.js +172 -176
- package/components/Map/MapViewStyleControl.js +63 -59
- package/components/Map/ReactMapboxWrapper.js +2 -3
- package/components/Map/index.js +180 -161
- package/components/Map/types.js +17 -12
- package/components/Map/useMaintainLayerOrder.js +26 -16
- package/components/Markdown/index.js +26 -25
- package/components/Message/Message.js +76 -73
- package/components/MultiSelect/index.js +124 -112
- package/components/Navbar/NavFooter.js +13 -9
- package/components/Navbar/NavItem.js +76 -70
- package/components/Navbar/NavSection.js +19 -17
- package/components/Navbar/Navbar.js +46 -39
- package/components/Navbar/SubNavbar.js +13 -9
- package/components/Note.js +22 -18
- package/components/OverlayModal/OverlayModal.js +63 -56
- package/components/PageForm/index.js +41 -33
- package/components/PhotoChooser/index.js +173 -165
- package/components/PhotosCarousel/PhotoSlide.js +35 -32
- package/components/PhotosCarousel/index.js +85 -80
- package/components/PhotosCarousel/usePhotosCarousel.js +76 -69
- package/components/Pill/index.js +45 -41
- package/components/PillList/index.js +24 -17
- package/components/PlacementWrapper/index.js +59 -38
- package/components/PopoverMenu/Popover.js +85 -68
- package/components/PopoverMenu/index.js +56 -51
- package/components/PopoverMultiSelect/index.js +59 -52
- package/components/ProgressCircle/ProgressCircle.js +32 -28
- package/components/RadioButton.js +19 -17
- package/components/Select/Select.js +15 -13
- package/components/Select/SelectT.js +250 -235
- package/components/Separator/index.js +17 -14
- package/components/Size.js +1 -0
- package/components/Slider/index.js +56 -43
- package/components/SummaryBox.js +72 -70
- package/components/Tabs/index.js +135 -133
- package/components/TextTruncated/index.js +130 -117
- package/components/Textfield/Textfield.js +190 -158
- package/components/Textfield/TruncatedTextArea.js +84 -70
- package/components/TimelineSlider/TimelineMarker.js +30 -25
- package/components/TimelineSlider/TimelineRail.js +11 -8
- package/components/TimelineSlider/index.js +66 -64
- package/components/TimelineSliderV2/ClusterBadge.js +29 -25
- package/components/TimelineSliderV2/TimelineDot.js +35 -31
- package/components/TimelineSliderV2/TimelineRail.js +11 -8
- package/components/TimelineSliderV2/index.js +103 -121
- package/components/TimelineSliderV2/layout.js +147 -124
- package/components/TimelineSliderV2/types.js +1 -0
- package/components/Tooltip/Tooltip.js +56 -47
- package/components/ViewPhotosDialog/index.js +35 -28
- package/components/VirtualWalkthrough/Annotation.js +207 -163
- package/components/VirtualWalkthrough/AnnotationEditPane.js +184 -198
- package/components/VirtualWalkthrough/AnnotationPanel.js +199 -187
- package/components/VirtualWalkthrough/Application.js +34 -31
- package/components/VirtualWalkthrough/AutoRotator.js +223 -85
- package/components/VirtualWalkthrough/BlockingSpinner.js +28 -26
- package/components/VirtualWalkthrough/BoundaryRing.js +34 -30
- package/components/VirtualWalkthrough/BoundaryWall.js +36 -32
- package/components/VirtualWalkthrough/CameraInfo.js +89 -100
- package/components/VirtualWalkthrough/ControlsInfoPane.js +195 -254
- package/components/VirtualWalkthrough/GradientSky.js +73 -72
- package/components/VirtualWalkthrough/SplatControls.js +221 -209
- package/components/VirtualWalkthrough/SplatCrop.js +20 -21
- package/components/VirtualWalkthrough/SplatFadeCrop.js +20 -21
- package/components/VirtualWalkthrough/SplatModel.js +85 -65
- package/components/VirtualWalkthrough/SplatRevealRain.js +46 -41
- package/components/VirtualWalkthrough/TfAnnotationManager.js +379 -197
- package/components/VirtualWalkthrough/TfXrNavigation.js +162 -73
- package/components/VirtualWalkthrough/VirtualWalkthroughViewer.js +431 -438
- package/components/VirtualWalkthrough/VrAnnotationPanel.js +22 -18
- package/components/VirtualWalkthrough/XrAnnotationInteraction.js +17 -14
- package/components/VirtualWalkthrough/XrExitButton.js +17 -14
- package/components/VirtualWalkthrough/XrGazeDwell.js +17 -14
- package/components/VirtualWalkthrough/XrPointerRay.js +17 -14
- package/components/VirtualWalkthrough/XrStartPose.js +121 -67
- package/components/VirtualWalkthrough/boundary-ring.js +117 -87
- package/components/VirtualWalkthrough/boundary-wall.js +258 -175
- package/components/VirtualWalkthrough/camera-adoption.js +64 -18
- package/components/VirtualWalkthrough/groundPlane.js +47 -32
- package/components/VirtualWalkthrough/gsplat-fade-crop-effect.js +35 -35
- package/components/VirtualWalkthrough/splatFormat.js +47 -13
- package/components/VirtualWalkthrough/useAdoptedCamera.js +44 -23
- package/components/VirtualWalkthrough/useRestartOnVr.js +37 -26
- package/components/VirtualWalkthrough/useXrRenderTuning.js +54 -33
- package/components/VirtualWalkthrough/vr-annotation-panel-layout.js +99 -67
- package/components/VirtualWalkthrough/vr-annotation-panel.js +433 -403
- package/components/VirtualWalkthrough/vr-annotation-scroll.js +28 -10
- package/components/VirtualWalkthrough/walkthrough-camera.js +329 -204
- package/components/VirtualWalkthrough/xr-annotation-candidate-buffer.js +80 -39
- package/components/VirtualWalkthrough/xr-annotation-candidates.js +18 -6
- package/components/VirtualWalkthrough/xr-annotation-interaction.js +56 -31
- package/components/VirtualWalkthrough/xr-annotation-targeting.js +38 -22
- package/components/VirtualWalkthrough/xr-button-arming.js +17 -7
- package/components/VirtualWalkthrough/xr-button-hold.js +36 -22
- package/components/VirtualWalkthrough/xr-exit-button-mask.js +36 -22
- package/components/VirtualWalkthrough/xr-exit-button.js +207 -148
- package/components/VirtualWalkthrough/xr-face-buttons.js +29 -19
- package/components/VirtualWalkthrough/xr-gaze-dwell-state.js +34 -23
- package/components/VirtualWalkthrough/xr-gaze-dwell.js +144 -107
- package/components/VirtualWalkthrough/xr-interactive-ui.js +24 -12
- package/components/VirtualWalkthrough/xr-pointer-ray.js +20 -13
- package/components/VirtualWalkthrough/xr-progress-pie-material.js +88 -117
- package/components/VirtualWalkthrough/xr-progress-pie.js +10 -1
- package/components/VirtualWalkthrough/xr-ray-quad.js +30 -16
- package/components/VirtualWalkthrough/xr-render-tuning.js +48 -17
- package/components/VirtualWalkthrough/xr-scene-bounds.js +37 -21
- package/components/VirtualWalkthrough/xr-start-pose.js +73 -27
- package/components/VirtualWalkthrough/xr-teleport-gesture.js +42 -16
- package/components/svg/BlobbyGrayIconImage.js +39 -41
- package/components/svg/BlobbyGrayIconImport.js +39 -41
- package/components/svg/BlobbyGrayIconUploadToTheCloud.js +39 -41
- package/components/svg/BlobbyIconCloudChecked.js +164 -202
- package/components/svg/BlobbyIconExportOrUploadPhoto.js +164 -202
- package/components/svg/BlobbyIconFolder.js +164 -202
- package/components/svg/BlobbyIconGraphReport.js +164 -202
- package/components/svg/BlobbyIconHappy.js +164 -202
- package/components/svg/BlobbyIconHeartMonitor.js +164 -202
- package/components/svg/BlobbyIconLeaf.js +164 -202
- package/components/svg/BlobbyIconLibrary.js +164 -202
- package/components/svg/BlobbyIconNursery.js +166 -204
- package/components/svg/BlobbyIconOrganization.js +164 -202
- package/components/svg/BlobbyIconParchment.js +164 -202
- package/components/svg/BlobbyIconPeople.js +164 -202
- package/components/svg/BlobbyIconSeedBank.js +164 -202
- package/components/svg/BlobbyIconSeedling.js +164 -202
- package/components/svg/BlobbyIconSeeds.js +164 -202
- package/components/svg/BlobbyIconSite.js +167 -206
- package/components/svg/BlobbyIconSparkles.js +164 -202
- package/components/svg/BlobbyIconWrench.js +164 -202
- package/components/svg/Bug.js +21 -19
- package/components/svg/Calendar.js +21 -19
- package/components/svg/CaretDown.js +21 -19
- package/components/svg/CaretLeft.js +21 -19
- package/components/svg/CaretRight.js +21 -19
- package/components/svg/CaretUp.js +21 -19
- package/components/svg/ChevronDown.js +21 -19
- package/components/svg/ChevronUp.js +21 -19
- package/components/svg/Close.js +21 -19
- package/components/svg/Critical.js +21 -19
- package/components/svg/Edit.js +164 -202
- package/components/svg/Error.js +21 -19
- package/components/svg/Filter.js +21 -19
- package/components/svg/Folder.js +21 -19
- package/components/svg/Help.js +21 -19
- package/components/svg/Home.js +21 -19
- package/components/svg/IconAdd.js +21 -19
- package/components/svg/IconArrowRight.js +23 -21
- package/components/svg/IconBusinessNetwork.js +21 -19
- package/components/svg/IconCalendar.js +21 -19
- package/components/svg/IconCancel.js +21 -19
- package/components/svg/IconChargingBattery.js +21 -19
- package/components/svg/IconChecklist.js +23 -21
- package/components/svg/IconCheckmark.js +21 -19
- package/components/svg/IconCoinInHand.js +21 -19
- package/components/svg/IconColumns.js +21 -19
- package/components/svg/IconComment.js +22 -20
- package/components/svg/IconDashboard.js +21 -19
- package/components/svg/IconDataMigration.js +21 -19
- package/components/svg/IconDocument.js +23 -21
- package/components/svg/IconDownloadFromTheCloud.js +23 -21
- package/components/svg/IconEdit.js +23 -21
- package/components/svg/IconExpand.js +23 -21
- package/components/svg/IconExport.js +21 -19
- package/components/svg/IconExternalLink.js +21 -19
- package/components/svg/IconEye.js +21 -19
- package/components/svg/IconEyeOff.js +21 -19
- package/components/svg/IconFile.js +21 -19
- package/components/svg/IconFolder.js +21 -19
- package/components/svg/IconFullScreen.js +22 -20
- package/components/svg/IconFutures.js +21 -19
- package/components/svg/IconGraphReport.js +21 -19
- package/components/svg/IconGrid.js +21 -19
- package/components/svg/IconHeartMonitor.js +21 -19
- package/components/svg/IconHelp.js +23 -21
- package/components/svg/IconHistory.js +21 -19
- package/components/svg/IconImport.js +21 -19
- package/components/svg/IconIndex.js +21 -19
- package/components/svg/IconLayers.js +21 -19
- package/components/svg/IconLibrary.js +22 -20
- package/components/svg/IconList.js +21 -19
- package/components/svg/IconLivePlant.js +21 -19
- package/components/svg/IconLocations.js +21 -19
- package/components/svg/IconMail.js +21 -19
- package/components/svg/IconManager.js +21 -19
- package/components/svg/IconMap.js +21 -19
- package/components/svg/IconMarker.js +21 -19
- package/components/svg/IconMenu.js +21 -19
- package/components/svg/IconMenuHorizontal.js +21 -19
- package/components/svg/IconModule.js +21 -19
- package/components/svg/IconMyLocation.js +21 -19
- package/components/svg/IconNote.js +23 -21
- package/components/svg/IconNursery.js +23 -21
- package/components/svg/IconOrg.js +21 -19
- package/components/svg/IconParchment.js +21 -19
- package/components/svg/IconPhoto.js +21 -19
- package/components/svg/IconPlantsFilled.js +21 -19
- package/components/svg/IconRedo.js +21 -19
- package/components/svg/IconRestorationSite.js +21 -19
- package/components/svg/IconSeedBank.js +21 -19
- package/components/svg/IconSeedling.js +21 -19
- package/components/svg/IconSettings.js +21 -19
- package/components/svg/IconSlice.js +21 -19
- package/components/svg/IconSubmit.js +21 -19
- package/components/svg/IconSubtract.js +23 -21
- package/components/svg/IconSynced.js +21 -19
- package/components/svg/IconTrashCan.js +21 -19
- package/components/svg/IconTreasureMap.js +21 -19
- package/components/svg/IconUnavailable.js +21 -19
- package/components/svg/IconUndo.js +21 -19
- package/components/svg/IconVariable.js +21 -19
- package/components/svg/IconVideo.js +31 -30
- package/components/svg/IconWifi.js +21 -19
- package/components/svg/Info.js +21 -19
- package/components/svg/Key.js +21 -19
- package/components/svg/Leaf.js +21 -19
- package/components/svg/Lock.js +21 -19
- package/components/svg/Logo.js +43 -48
- package/components/svg/MenuVertical.js +21 -19
- package/components/svg/Notification.js +21 -19
- package/components/svg/Person.js +21 -19
- package/components/svg/Plus.js +21 -19
- package/components/svg/RestorationSite.js +21 -19
- package/components/svg/Search.js +21 -19
- package/components/svg/Seeds.js +21 -19
- package/components/svg/Site.js +21 -19
- package/components/svg/Sparkles.js +21 -19
- package/components/svg/Species.js +21 -19
- package/components/svg/Species2.js +164 -202
- package/components/svg/Spinner.js +48 -54
- package/components/svg/Star.js +21 -19
- package/components/svg/Success.js +21 -19
- package/components/svg/SuccessFilled.js +21 -19
- package/components/svg/TerrawareLogoDesktop.js +49 -55
- package/components/svg/TerrawareLogoMobile.js +26 -25
- package/components/svg/Touchscreen.js +21 -19
- package/components/svg/UploadCloud.js +164 -202
- package/components/svg/Warning.js +21 -19
- package/components/svg/WelcomeClipboard.js +133 -156
- package/components/svg/index.js +129 -129
- package/components/table/EnhancedTableToolbar.js +74 -68
- package/components/table/EnhancedTableToolbarV2.js +41 -31
- package/components/table/TableCellRenderer.js +231 -196
- package/components/table/TableHeader.js +73 -71
- package/components/table/TableHeaderItem.js +102 -97
- package/components/table/density.js +19 -18
- package/components/table/index.js +369 -350
- package/components/table/sort.js +52 -27
- package/components/table/types.js +1 -0
- package/components/types/index.js +1 -0
- package/hooks/cameraEntityContext.js +13 -2
- package/hooks/useBoolean.js +13 -17
- package/hooks/useCameraPosition.js +56 -56
- package/hooks/useDevicePerformance.js +17 -17
- package/hooks/useXr.js +87 -85
- package/index.js +58 -58
- package/package.json +1 -1
- package/setupTests.js +4 -0
- package/strings/export.js +170 -111
- package/strings/index.js +54 -25
- package/strings/locales.js +41 -21
- package/strings/strings-en.js +51 -49
- package/strings/strings-es.js +51 -49
- package/strings/strings-fr.js +51 -49
- package/strings/strings-gx.js +51 -49
- package/style-dictionary-dist/TerrawareTheme.js +186 -186
- package/theme.js +76 -74
- package/utils/color.js +15 -8
- package/utils/date.js +108 -42
- package/utils/index.js +4 -4
- package/utils/preventDefaultEvent.js +3 -3
- package/utils/text.js +11 -11
- package/utils/useDeviceInfo.js +79 -42
- package/virtualWalkthrough.js +23 -23
package/components/table/sort.js
CHANGED
|
@@ -1,39 +1,64 @@
|
|
|
1
1
|
function descendingComparator(a, b, orderBy, order) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return
|
|
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
|
-
|
|
50
|
+
return (a, b) => sorting(a, b, orderBy, order);
|
|
26
51
|
}
|
|
27
52
|
function stableSort(array, comparator) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
2
|
-
|
|
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 };
|
package/hooks/useBoolean.js
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
18
|
-
export default
|
|
13
|
+
|
|
14
|
+
export { useBoolean as default };
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useApp } from
|
|
3
|
-
import { Vec3 } from
|
|
4
|
-
import { CameraEntityContext } from
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
|
2
|
-
import useDeviceInfo from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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 {
|
|
2
|
-
import { useApp } from
|
|
3
|
-
import {
|
|
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
|
-
|
|
6
|
-
|
|
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 = ({
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
89
|
-
export default
|
|
90
|
-
export { useXr };
|
|
91
|
+
|
|
92
|
+
export { useXr as default, useXr };
|
package/index.js
CHANGED
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
|
|
2
|
-
export { default as
|
|
3
|
-
export { default as
|
|
4
|
-
export { default as
|
|
5
|
-
export { default as
|
|
6
|
-
export { default as
|
|
7
|
-
export { default as
|
|
8
|
-
export { default as
|
|
9
|
-
export { default as
|
|
10
|
-
export { default as
|
|
11
|
-
export { default as
|
|
12
|
-
export {
|
|
13
|
-
export { default as
|
|
14
|
-
export { default as
|
|
15
|
-
export { default as
|
|
16
|
-
export { default as
|
|
17
|
-
export { default as
|
|
18
|
-
export { default as
|
|
19
|
-
export { default as
|
|
20
|
-
export { default as
|
|
21
|
-
export { default as
|
|
22
|
-
export { default as
|
|
23
|
-
export { default as
|
|
24
|
-
export { default as
|
|
25
|
-
export { default as
|
|
26
|
-
export { default as
|
|
27
|
-
export { default as
|
|
28
|
-
export { default as
|
|
29
|
-
export { default as
|
|
30
|
-
export { default as
|
|
31
|
-
export { default as
|
|
32
|
-
export { default as
|
|
33
|
-
export { default as
|
|
34
|
-
export { default as
|
|
35
|
-
export { default as
|
|
36
|
-
export { default as
|
|
37
|
-
export { default as
|
|
38
|
-
export { default as
|
|
39
|
-
export { default as
|
|
40
|
-
export { default as
|
|
41
|
-
export { default as
|
|
42
|
-
export { default as
|
|
43
|
-
export { default as
|
|
44
|
-
export { default as
|
|
45
|
-
export { default as
|
|
46
|
-
export { default as
|
|
47
|
-
export { default as
|
|
48
|
-
export { default as
|
|
49
|
-
export { default as
|
|
50
|
-
export { default as
|
|
51
|
-
|
|
52
|
-
export {
|
|
53
|
-
export {
|
|
54
|
-
export {
|
|
55
|
-
export {
|
|
56
|
-
export {
|
|
57
|
-
export {
|
|
58
|
-
export {
|
|
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
package/setupTests.js
CHANGED