@terraware/web-components 5.0.27 → 5.1.1-rc.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 (311) 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/Stepper/index.d.ts +33 -0
  58. package/components/Stepper/index.d.ts.map +1 -0
  59. package/components/Stepper/index.js +66 -0
  60. package/components/SummaryBox.js +70 -72
  61. package/components/Tabs/index.js +133 -135
  62. package/components/TextTruncated/index.js +117 -130
  63. package/components/Textfield/Textfield.js +158 -190
  64. package/components/Textfield/TruncatedTextArea.js +70 -84
  65. package/components/TimelineSlider/TimelineMarker.js +25 -30
  66. package/components/TimelineSlider/TimelineRail.js +8 -11
  67. package/components/TimelineSlider/index.js +64 -66
  68. package/components/TimelineSliderV2/ClusterBadge.js +25 -29
  69. package/components/TimelineSliderV2/TimelineDot.js +31 -35
  70. package/components/TimelineSliderV2/TimelineRail.js +8 -11
  71. package/components/TimelineSliderV2/index.js +121 -103
  72. package/components/TimelineSliderV2/layout.js +124 -147
  73. package/components/TimelineSliderV2/types.js +0 -1
  74. package/components/Tooltip/Tooltip.js +47 -56
  75. package/components/ViewPhotosDialog/index.js +28 -35
  76. package/components/VirtualWalkthrough/Annotation.js +163 -207
  77. package/components/VirtualWalkthrough/AnnotationEditPane.js +198 -184
  78. package/components/VirtualWalkthrough/AnnotationPanel.js +187 -199
  79. package/components/VirtualWalkthrough/Application.js +31 -34
  80. package/components/VirtualWalkthrough/AutoRotator.js +85 -223
  81. package/components/VirtualWalkthrough/BlockingSpinner.js +26 -28
  82. package/components/VirtualWalkthrough/BoundaryRing.js +30 -34
  83. package/components/VirtualWalkthrough/BoundaryWall.js +32 -36
  84. package/components/VirtualWalkthrough/CameraInfo.js +100 -89
  85. package/components/VirtualWalkthrough/ControlsInfoPane.js +254 -195
  86. package/components/VirtualWalkthrough/GradientSky.js +72 -73
  87. package/components/VirtualWalkthrough/SplatControls.js +209 -221
  88. package/components/VirtualWalkthrough/SplatCrop.js +21 -20
  89. package/components/VirtualWalkthrough/SplatFadeCrop.js +21 -20
  90. package/components/VirtualWalkthrough/SplatModel.js +65 -85
  91. package/components/VirtualWalkthrough/SplatRevealRain.js +41 -46
  92. package/components/VirtualWalkthrough/TfAnnotationManager.js +197 -379
  93. package/components/VirtualWalkthrough/TfXrNavigation.js +73 -162
  94. package/components/VirtualWalkthrough/VirtualWalkthroughViewer.js +438 -431
  95. package/components/VirtualWalkthrough/VrAnnotationPanel.js +18 -22
  96. package/components/VirtualWalkthrough/XrAnnotationInteraction.js +14 -17
  97. package/components/VirtualWalkthrough/XrExitButton.js +14 -17
  98. package/components/VirtualWalkthrough/XrGazeDwell.js +14 -17
  99. package/components/VirtualWalkthrough/XrPointerRay.js +14 -17
  100. package/components/VirtualWalkthrough/XrStartPose.js +67 -121
  101. package/components/VirtualWalkthrough/boundary-ring.js +87 -117
  102. package/components/VirtualWalkthrough/boundary-wall.js +175 -258
  103. package/components/VirtualWalkthrough/camera-adoption.js +18 -64
  104. package/components/VirtualWalkthrough/groundPlane.js +32 -47
  105. package/components/VirtualWalkthrough/gsplat-fade-crop-effect.js +35 -35
  106. package/components/VirtualWalkthrough/splatFormat.js +13 -47
  107. package/components/VirtualWalkthrough/useAdoptedCamera.js +23 -44
  108. package/components/VirtualWalkthrough/useRestartOnVr.js +26 -37
  109. package/components/VirtualWalkthrough/useXrRenderTuning.js +33 -54
  110. package/components/VirtualWalkthrough/vr-annotation-panel-layout.js +67 -99
  111. package/components/VirtualWalkthrough/vr-annotation-panel.js +403 -433
  112. package/components/VirtualWalkthrough/vr-annotation-scroll.js +10 -28
  113. package/components/VirtualWalkthrough/walkthrough-camera.js +204 -329
  114. package/components/VirtualWalkthrough/xr-annotation-candidate-buffer.js +39 -80
  115. package/components/VirtualWalkthrough/xr-annotation-candidates.js +6 -18
  116. package/components/VirtualWalkthrough/xr-annotation-interaction.js +31 -56
  117. package/components/VirtualWalkthrough/xr-annotation-targeting.js +22 -38
  118. package/components/VirtualWalkthrough/xr-button-arming.js +7 -17
  119. package/components/VirtualWalkthrough/xr-button-hold.js +22 -36
  120. package/components/VirtualWalkthrough/xr-exit-button-mask.js +22 -36
  121. package/components/VirtualWalkthrough/xr-exit-button.js +148 -207
  122. package/components/VirtualWalkthrough/xr-face-buttons.js +19 -29
  123. package/components/VirtualWalkthrough/xr-gaze-dwell-state.js +23 -34
  124. package/components/VirtualWalkthrough/xr-gaze-dwell.js +107 -144
  125. package/components/VirtualWalkthrough/xr-interactive-ui.js +12 -24
  126. package/components/VirtualWalkthrough/xr-pointer-ray.js +13 -20
  127. package/components/VirtualWalkthrough/xr-progress-pie-material.js +117 -88
  128. package/components/VirtualWalkthrough/xr-progress-pie.js +1 -10
  129. package/components/VirtualWalkthrough/xr-ray-quad.js +16 -30
  130. package/components/VirtualWalkthrough/xr-render-tuning.js +17 -48
  131. package/components/VirtualWalkthrough/xr-scene-bounds.js +21 -37
  132. package/components/VirtualWalkthrough/xr-start-pose.js +27 -73
  133. package/components/VirtualWalkthrough/xr-teleport-gesture.js +16 -42
  134. package/components/svg/BlobbyGrayIconImage.js +41 -39
  135. package/components/svg/BlobbyGrayIconImport.js +41 -39
  136. package/components/svg/BlobbyGrayIconUploadToTheCloud.js +41 -39
  137. package/components/svg/BlobbyIconCloudChecked.js +202 -164
  138. package/components/svg/BlobbyIconExportOrUploadPhoto.js +202 -164
  139. package/components/svg/BlobbyIconFolder.js +202 -164
  140. package/components/svg/BlobbyIconGraphReport.js +202 -164
  141. package/components/svg/BlobbyIconHappy.js +202 -164
  142. package/components/svg/BlobbyIconHeartMonitor.js +202 -164
  143. package/components/svg/BlobbyIconLeaf.js +202 -164
  144. package/components/svg/BlobbyIconLibrary.js +202 -164
  145. package/components/svg/BlobbyIconNursery.js +204 -166
  146. package/components/svg/BlobbyIconOrganization.js +202 -164
  147. package/components/svg/BlobbyIconParchment.js +202 -164
  148. package/components/svg/BlobbyIconPeople.js +202 -164
  149. package/components/svg/BlobbyIconSeedBank.js +202 -164
  150. package/components/svg/BlobbyIconSeedling.js +202 -164
  151. package/components/svg/BlobbyIconSeeds.js +202 -164
  152. package/components/svg/BlobbyIconSite.js +206 -167
  153. package/components/svg/BlobbyIconSparkles.js +202 -164
  154. package/components/svg/BlobbyIconWrench.js +202 -164
  155. package/components/svg/Bug.js +19 -21
  156. package/components/svg/Calendar.js +19 -21
  157. package/components/svg/CaretDown.js +19 -21
  158. package/components/svg/CaretLeft.js +19 -21
  159. package/components/svg/CaretRight.js +19 -21
  160. package/components/svg/CaretUp.js +19 -21
  161. package/components/svg/ChevronDown.js +19 -21
  162. package/components/svg/ChevronUp.js +19 -21
  163. package/components/svg/Close.js +19 -21
  164. package/components/svg/Critical.js +19 -21
  165. package/components/svg/Edit.js +202 -164
  166. package/components/svg/Error.js +19 -21
  167. package/components/svg/Filter.js +19 -21
  168. package/components/svg/Folder.js +19 -21
  169. package/components/svg/Help.js +19 -21
  170. package/components/svg/Home.js +19 -21
  171. package/components/svg/IconAdd.js +19 -21
  172. package/components/svg/IconArrowRight.js +21 -23
  173. package/components/svg/IconBusinessNetwork.js +19 -21
  174. package/components/svg/IconCalendar.js +19 -21
  175. package/components/svg/IconCancel.js +19 -21
  176. package/components/svg/IconChargingBattery.js +19 -21
  177. package/components/svg/IconChecklist.js +21 -23
  178. package/components/svg/IconCheckmark.js +19 -21
  179. package/components/svg/IconCoinInHand.js +19 -21
  180. package/components/svg/IconColumns.js +19 -21
  181. package/components/svg/IconComment.js +20 -22
  182. package/components/svg/IconDashboard.js +19 -21
  183. package/components/svg/IconDataMigration.js +19 -21
  184. package/components/svg/IconDocument.js +21 -23
  185. package/components/svg/IconDownloadFromTheCloud.js +21 -23
  186. package/components/svg/IconEdit.js +21 -23
  187. package/components/svg/IconExpand.js +21 -23
  188. package/components/svg/IconExport.js +19 -21
  189. package/components/svg/IconExternalLink.js +19 -21
  190. package/components/svg/IconEye.js +19 -21
  191. package/components/svg/IconEyeOff.js +19 -21
  192. package/components/svg/IconFile.js +19 -21
  193. package/components/svg/IconFolder.js +19 -21
  194. package/components/svg/IconFullScreen.js +20 -22
  195. package/components/svg/IconFutures.js +19 -21
  196. package/components/svg/IconGraphReport.js +19 -21
  197. package/components/svg/IconGrid.js +19 -21
  198. package/components/svg/IconHeartMonitor.js +19 -21
  199. package/components/svg/IconHelp.js +21 -23
  200. package/components/svg/IconHistory.js +19 -21
  201. package/components/svg/IconImport.js +19 -21
  202. package/components/svg/IconIndex.js +19 -21
  203. package/components/svg/IconLayers.js +19 -21
  204. package/components/svg/IconLibrary.js +20 -22
  205. package/components/svg/IconList.js +19 -21
  206. package/components/svg/IconLivePlant.js +19 -21
  207. package/components/svg/IconLocations.js +19 -21
  208. package/components/svg/IconMail.js +19 -21
  209. package/components/svg/IconManager.js +19 -21
  210. package/components/svg/IconMap.js +19 -21
  211. package/components/svg/IconMarker.js +19 -21
  212. package/components/svg/IconMenu.js +19 -21
  213. package/components/svg/IconMenuHorizontal.js +19 -21
  214. package/components/svg/IconModule.js +19 -21
  215. package/components/svg/IconMyLocation.js +19 -21
  216. package/components/svg/IconNote.js +21 -23
  217. package/components/svg/IconNursery.js +21 -23
  218. package/components/svg/IconOrg.js +19 -21
  219. package/components/svg/IconParchment.js +19 -21
  220. package/components/svg/IconPhoto.js +19 -21
  221. package/components/svg/IconPlantsFilled.js +19 -21
  222. package/components/svg/IconRedo.js +19 -21
  223. package/components/svg/IconRestorationSite.js +19 -21
  224. package/components/svg/IconSeedBank.js +19 -21
  225. package/components/svg/IconSeedling.js +19 -21
  226. package/components/svg/IconSettings.js +19 -21
  227. package/components/svg/IconSlice.js +19 -21
  228. package/components/svg/IconSubmit.js +19 -21
  229. package/components/svg/IconSubtract.js +21 -23
  230. package/components/svg/IconSynced.js +19 -21
  231. package/components/svg/IconTrashCan.js +19 -21
  232. package/components/svg/IconTreasureMap.js +19 -21
  233. package/components/svg/IconUnavailable.js +19 -21
  234. package/components/svg/IconUndo.js +19 -21
  235. package/components/svg/IconVariable.js +19 -21
  236. package/components/svg/IconVideo.js +30 -31
  237. package/components/svg/IconWifi.js +19 -21
  238. package/components/svg/Info.js +19 -21
  239. package/components/svg/Key.js +19 -21
  240. package/components/svg/Leaf.js +19 -21
  241. package/components/svg/Lock.js +19 -21
  242. package/components/svg/Logo.js +48 -43
  243. package/components/svg/MenuVertical.js +19 -21
  244. package/components/svg/Notification.js +19 -21
  245. package/components/svg/Person.js +19 -21
  246. package/components/svg/Plus.js +19 -21
  247. package/components/svg/RestorationSite.js +19 -21
  248. package/components/svg/Search.js +19 -21
  249. package/components/svg/Seeds.js +19 -21
  250. package/components/svg/Site.js +19 -21
  251. package/components/svg/Sparkles.js +19 -21
  252. package/components/svg/Species.js +19 -21
  253. package/components/svg/Species2.js +202 -164
  254. package/components/svg/Spinner.js +54 -48
  255. package/components/svg/Star.js +19 -21
  256. package/components/svg/Success.js +19 -21
  257. package/components/svg/SuccessFilled.js +19 -21
  258. package/components/svg/TerrawareLogoDesktop.js +55 -49
  259. package/components/svg/TerrawareLogoMobile.js +25 -26
  260. package/components/svg/Touchscreen.js +19 -21
  261. package/components/svg/UploadCloud.js +202 -164
  262. package/components/svg/Warning.js +19 -21
  263. package/components/svg/WelcomeClipboard.js +156 -133
  264. package/components/svg/index.js +129 -129
  265. package/components/table/EnhancedTableToolbar.js +68 -74
  266. package/components/table/EnhancedTableToolbarV2.js +31 -41
  267. package/components/table/TableCellRenderer.js +196 -231
  268. package/components/table/TableHeader.js +71 -73
  269. package/components/table/TableHeaderItem.js +97 -102
  270. package/components/table/density.js +18 -19
  271. package/components/table/index.js +350 -369
  272. package/components/table/sort.js +27 -52
  273. package/components/table/types.js +0 -1
  274. package/components/types/index.js +0 -1
  275. package/hooks/cameraEntityContext.js +2 -13
  276. package/hooks/useBoolean.js +17 -13
  277. package/hooks/useCameraPosition.js +56 -56
  278. package/hooks/useDevicePerformance.js +17 -17
  279. package/hooks/useXr.js +85 -87
  280. package/index.d.ts +3 -1
  281. package/index.d.ts.map +1 -1
  282. package/index.js +59 -58
  283. package/package.json +1 -1
  284. package/setupTests.js +0 -4
  285. package/strings/csv/en.csv +1 -0
  286. package/strings/csv/es.csv +1 -0
  287. package/strings/csv/fr.csv +1 -0
  288. package/strings/export.js +111 -170
  289. package/strings/index.js +25 -54
  290. package/strings/locales.js +21 -41
  291. package/strings/strings-en.d.ts +1 -0
  292. package/strings/strings-en.d.ts.map +1 -1
  293. package/strings/strings-en.js +50 -51
  294. package/strings/strings-es.d.ts +1 -0
  295. package/strings/strings-es.d.ts.map +1 -1
  296. package/strings/strings-es.js +50 -51
  297. package/strings/strings-fr.d.ts +1 -0
  298. package/strings/strings-fr.d.ts.map +1 -1
  299. package/strings/strings-fr.js +50 -51
  300. package/strings/strings-gx.d.ts +1 -0
  301. package/strings/strings-gx.d.ts.map +1 -1
  302. package/strings/strings-gx.js +50 -51
  303. package/style-dictionary-dist/TerrawareTheme.js +186 -186
  304. package/theme.js +74 -76
  305. package/utils/color.js +8 -15
  306. package/utils/date.js +42 -108
  307. package/utils/index.js +4 -4
  308. package/utils/preventDefaultEvent.js +3 -3
  309. package/utils/text.js +11 -11
  310. package/utils/useDeviceInfo.js +42 -79
  311. package/virtualWalkthrough.js +23 -23
@@ -1,37 +1,30 @@
1
- import { useState, useEffect } from 'react';
2
- import DialogBox from '../DialogBox/DialogBox.js';
3
- import PhotosCarousel from '../PhotosCarousel/index.js';
4
- import { jsx } from 'react/jsx-runtime';
5
-
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import DialogBox from "../DialogBox/DialogBox.js";
4
+ import PhotosCarousel from "../PhotosCarousel/index.js";
6
5
  function ViewPhotosDialog(props) {
7
- const {
8
- onClose,
9
- open,
10
- photos,
11
- initialSelectedSlide,
12
- title,
13
- numbered,
14
- dots
15
- } = props;
16
- const [selectedSlide, setSelectedSlide] = useState(initialSelectedSlide);
17
- useEffect(() => {
18
- setSelectedSlide(initialSelectedSlide);
19
- }, [initialSelectedSlide, open]);
20
- return /*#__PURE__*/jsx(DialogBox, {
21
- onClose: onClose,
22
- open: open,
23
- title: title,
24
- size: "large",
25
- scrolled: true,
26
- children: /*#__PURE__*/jsx(PhotosCarousel, {
27
- photos: photos,
28
- selectedSlide: selectedSlide,
29
- onSlideChange: setSelectedSlide,
30
- numbered: numbered,
31
- dots: dots,
32
- showArrows: true
33
- })
34
- });
6
+ const { onClose, open, photos, initialSelectedSlide, title, numbered, dots } = props;
7
+ const [selectedSlide, setSelectedSlide] = useState(initialSelectedSlide);
8
+ useEffect(()=>{
9
+ setSelectedSlide(initialSelectedSlide);
10
+ }, [
11
+ initialSelectedSlide,
12
+ open
13
+ ]);
14
+ return /*#__PURE__*/ jsx(DialogBox, {
15
+ onClose: onClose,
16
+ open: open,
17
+ title: title,
18
+ size: "large",
19
+ scrolled: true,
20
+ children: /*#__PURE__*/ jsx(PhotosCarousel, {
21
+ photos: photos,
22
+ selectedSlide: selectedSlide,
23
+ onSlideChange: setSelectedSlide,
24
+ numbered: numbered,
25
+ dots: dots,
26
+ showArrows: true
27
+ })
28
+ });
35
29
  }
36
-
37
- export { ViewPhotosDialog as default };
30
+ export default ViewPhotosDialog;
@@ -1,210 +1,166 @@
1
- import { useContext, useRef, useEffect, useCallback, useMemo } from 'react';
2
- import { Entity } from '@playcanvas/react';
3
- import { Script } from '@playcanvas/react/components';
4
- import { useApp } from '@playcanvas/react/hooks';
5
- import { Gizmo, TranslateGizmo } from 'playcanvas';
6
- import { Annotation as Annotation$1 } from 'playcanvas/scripts/esm/annotations.mjs';
7
- import { CameraControls } from 'playcanvas/scripts/esm/camera-controls.mjs';
8
- import { CameraEntityContext } from '../../hooks/cameraEntityContext.js';
9
- import { useCameraPosition } from '../../hooks/useCameraPosition.js';
10
- import './annotation-styles.css';
11
- import { jsx } from 'react/jsx-runtime';
12
-
13
- /**
14
- * Target normalized-device x coordinate for a clicked annotation. +0.5 places
15
- * the hotspot three quarters across the screen (25% from the right), leaving room
16
- * for the annotation panel on the left without covering the hotspot.
17
- */
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useCallback, useContext, useEffect, useMemo, useRef } from "react";
3
+ import { Entity } from "@playcanvas/react";
4
+ import { Script } from "@playcanvas/react/components";
5
+ import { useApp } from "@playcanvas/react/hooks";
6
+ import { Gizmo, TranslateGizmo } from "playcanvas";
7
+ import { Annotation } from "playcanvas/scripts/esm/annotations.mjs";
8
+ import { CameraControls } from "playcanvas/scripts/esm/camera-controls.mjs";
9
+ import { CameraEntityContext } from "../../hooks/cameraEntityContext.js";
10
+ import { useCameraPosition } from "../../hooks/useCameraPosition.js";
11
+ import "./annotation-styles.css";
18
12
  const VIEW_HORIZONTAL_NDC_BIAS = 0.5;
19
- /**
20
- * A 3D annotation component that displays a hotspot in the scene.
21
- * When clicked, displays annotation text and moves the camera.
22
- * In edit mode, shows a translate gizmo when selected.
23
- *
24
- * @param props.position - The world position of the annotation
25
- * @param props.index - The index of the annotation, used as a unique identifier
26
- * @param props.title - The title displayed in the annotation
27
- * @param props.bodyText - Optional description displayed in the annotation
28
- * @param props.label - Optional label displayed on the hotspot
29
- * @param props.cameraPosition - Optional camera position to move to when clicked. If undefined, camera stays at current position
30
- * @param props.visible - Optional flag to show/hide the annotation. Defaults to true
31
- * @param props.isEdit - Optional flag for edit mode. Defaults to false
32
- * @param props.isSelected - Optional flag indicating if this annotation is selected. Defaults to false
33
- * @param props.onSelect - Optional callback when annotation is clicked in edit mode
34
- * @param props.onPositionChange - Optional callback when annotation position changes
35
- */
36
- const Annotation = props => {
37
- const {
38
- position,
39
- cameraPosition,
40
- bodyText,
41
- imageUrls,
42
- icon,
43
- title,
44
- label,
45
- visible = true,
46
- isEdit = false,
47
- isSelected = false,
48
- isViewed = false,
49
- onSelect,
50
- onPositionChange,
51
- onView,
52
- onScreenPositionUpdate,
53
- index
54
- } = props;
55
- const app = useApp();
56
- const walkthroughCamera = useContext(CameraEntityContext);
57
- const {
58
- setCamera
59
- } = useCameraPosition();
60
- const gizmoRef = useRef(null);
61
- const layerRef = useRef(null);
62
-
63
- // Use refs to always call the latest callback values
64
- const isEditRef = useRef(isEdit);
65
- const onSelectRef = useRef(onSelect);
66
- const onViewRef = useRef(onView);
67
- const onScreenPositionUpdateRef = useRef(onScreenPositionUpdate);
68
- const positionRef = useRef(position);
69
- const cameraPositionRef = useRef(cameraPosition);
70
- const annotationForViewRef = useRef({
71
- position,
72
- title,
73
- label,
74
- bodyText,
75
- imageUrls,
76
- cameraPosition
77
- });
78
- useEffect(() => {
79
- isEditRef.current = isEdit;
80
- onSelectRef.current = onSelect;
81
- onViewRef.current = onView;
82
- onScreenPositionUpdateRef.current = onScreenPositionUpdate;
83
- positionRef.current = position;
84
- cameraPositionRef.current = cameraPosition;
85
- annotationForViewRef.current = {
86
- position,
87
- title,
88
- label,
89
- bodyText,
90
- imageUrls,
91
- cameraPosition
92
- };
93
- }, [isEdit, onSelect, onView, onScreenPositionUpdate, position, cameraPosition, title, label, bodyText, imageUrls]);
94
-
95
- // Create a stable callback that reads from refs, because this is read from TfAnnotationManager when the annotation is added to the scene
96
- const handleClick = useCallback((screenX, screenY) => {
97
- if (isEditRef.current) {
98
- onSelectRef.current?.();
99
- } else {
100
- setCamera(positionRef.current, cameraPositionRef.current, VIEW_HORIZONTAL_NDC_BIAS);
101
- if (onViewRef.current && screenX !== undefined && screenY !== undefined) {
102
- onViewRef.current(annotationForViewRef.current, screenX, screenY);
103
- }
104
- }
105
- }, [setCamera]);
106
-
107
- // VR open path: shows the annotation without moving the camera (roomscale head pose
108
- // comes from the XR views, so a camera move would be disorienting or a no-op).
109
- const handleVrOpen = useCallback((screenX, screenY) => {
110
- if (isEditRef.current) {
111
- return;
112
- }
113
- onViewRef.current?.(annotationForViewRef.current, screenX, screenY);
114
- }, []);
115
-
116
- // Stable callback so its identity doesn't churn the underlying script prop each frame.
117
- const handleScreenPositionUpdate = useCallback((screenX, screenY, size) => {
118
- onScreenPositionUpdateRef.current?.(index, screenX, screenY, size);
119
- }, [index]);
120
- const entityName = useMemo(() => `annotation-${index}`, [index]);
121
- useEffect(() => {
122
- const shouldShowGizmo = isEdit && isSelected && visible;
123
- const cleanupGizmo = () => {
124
- if (gizmoRef.current) {
125
- try {
126
- gizmoRef.current.detach();
127
- gizmoRef.current.destroy();
128
- } catch (error) {
129
- // Ignore cleanup errors
13
+ const Annotation_Annotation = (props)=>{
14
+ const { position, cameraPosition, bodyText, imageUrls, icon, title, label, visible = true, isEdit = false, isSelected = false, isViewed = false, onSelect, onPositionChange, onView, onScreenPositionUpdate, index } = props;
15
+ const app = useApp();
16
+ const walkthroughCamera = useContext(CameraEntityContext);
17
+ const { setCamera } = useCameraPosition();
18
+ const gizmoRef = useRef(null);
19
+ const layerRef = useRef(null);
20
+ const isEditRef = useRef(isEdit);
21
+ const onSelectRef = useRef(onSelect);
22
+ const onViewRef = useRef(onView);
23
+ const onScreenPositionUpdateRef = useRef(onScreenPositionUpdate);
24
+ const positionRef = useRef(position);
25
+ const cameraPositionRef = useRef(cameraPosition);
26
+ const annotationForViewRef = useRef({
27
+ position,
28
+ title,
29
+ label,
30
+ bodyText,
31
+ imageUrls,
32
+ cameraPosition
33
+ });
34
+ useEffect(()=>{
35
+ isEditRef.current = isEdit;
36
+ onSelectRef.current = onSelect;
37
+ onViewRef.current = onView;
38
+ onScreenPositionUpdateRef.current = onScreenPositionUpdate;
39
+ positionRef.current = position;
40
+ cameraPositionRef.current = cameraPosition;
41
+ annotationForViewRef.current = {
42
+ position,
43
+ title,
44
+ label,
45
+ bodyText,
46
+ imageUrls,
47
+ cameraPosition
48
+ };
49
+ }, [
50
+ isEdit,
51
+ onSelect,
52
+ onView,
53
+ onScreenPositionUpdate,
54
+ position,
55
+ cameraPosition,
56
+ title,
57
+ label,
58
+ bodyText,
59
+ imageUrls
60
+ ]);
61
+ const handleClick = useCallback((screenX, screenY)=>{
62
+ if (isEditRef.current) onSelectRef.current?.();
63
+ else {
64
+ setCamera(positionRef.current, cameraPositionRef.current, VIEW_HORIZONTAL_NDC_BIAS);
65
+ if (onViewRef.current && void 0 !== screenX && void 0 !== screenY) onViewRef.current(annotationForViewRef.current, screenX, screenY);
130
66
  }
131
- gizmoRef.current = null;
132
- }
133
- if (layerRef.current && app.scene?.layers) {
134
- try {
135
- const layer = app.scene.layers.getLayerByName('Gizmo');
136
- if (layer) {
137
- app.scene.layers.remove(layerRef.current);
138
- }
139
- } catch (error) {
140
- // Ignore cleanup errors
141
- }
142
- layerRef.current = null;
143
- }
144
- };
145
- if (!shouldShowGizmo) {
146
- cleanupGizmo();
147
- return;
148
- }
149
- const setupGizmo = () => {
150
- const annotationEntity = app.root.findByName(entityName);
151
- const cameraComponent = walkthroughCamera?.camera;
152
- const cameraControls = walkthroughCamera?.script?.get(CameraControls.scriptName);
153
- if (!annotationEntity || !cameraComponent) {
154
- return false;
155
- }
156
- if (!gizmoRef.current) {
157
- if (!layerRef.current) {
158
- layerRef.current = Gizmo.createLayer(app);
159
- }
160
- const gizmo = new TranslateGizmo(cameraComponent, layerRef.current);
161
- gizmo.size = 0.75;
162
- gizmo.snapIncrement = 0.01;
163
- gizmo.coordSpace = 'world';
164
- gizmo.on('transform:start', () => {
165
- if (cameraControls) {
166
- cameraControls.enabled = false;
167
- }
168
- });
169
- gizmo.on('transform:end', () => {
170
- if (cameraControls) {
171
- cameraControls.enabled = true;
172
- }
173
- if (onPositionChange) {
174
- const pos = annotationEntity.getPosition();
175
- onPositionChange([pos.x, pos.y, pos.z]);
176
- }
177
- });
178
- gizmo.attach([annotationEntity]);
179
- gizmoRef.current = gizmo;
180
- }
181
- return true;
182
- };
183
- const intervalId = setInterval(() => {
184
- if (setupGizmo()) {
185
- clearInterval(intervalId);
186
- }
187
- }, 100);
188
- return () => {
189
- clearInterval(intervalId);
190
- cleanupGizmo();
191
- };
192
- }, [app, isEdit, isSelected, visible, onPositionChange, entityName, walkthroughCamera]);
193
- return /*#__PURE__*/jsx(Entity, {
194
- name: entityName,
195
- position: position,
196
- children: /*#__PURE__*/jsx(Script, {
197
- script: Annotation$1,
198
- title: title,
199
- label: label,
200
- icon: icon,
201
- text: bodyText,
202
- enabled: visible,
203
- onClickCallback: handleClick,
204
- onVrOpenCallback: handleVrOpen,
205
- onScreenPositionUpdateCallback: isViewed ? handleScreenPositionUpdate : undefined
206
- })
207
- });
67
+ }, [
68
+ setCamera
69
+ ]);
70
+ const handleVrOpen = useCallback((screenX, screenY)=>{
71
+ if (isEditRef.current) return;
72
+ onViewRef.current?.(annotationForViewRef.current, screenX, screenY);
73
+ }, []);
74
+ const handleScreenPositionUpdate = useCallback((screenX, screenY, size)=>{
75
+ onScreenPositionUpdateRef.current?.(index, screenX, screenY, size);
76
+ }, [
77
+ index
78
+ ]);
79
+ const entityName = useMemo(()=>`annotation-${index}`, [
80
+ index
81
+ ]);
82
+ useEffect(()=>{
83
+ const shouldShowGizmo = isEdit && isSelected && visible;
84
+ const cleanupGizmo = ()=>{
85
+ if (gizmoRef.current) {
86
+ try {
87
+ gizmoRef.current.detach();
88
+ gizmoRef.current.destroy();
89
+ } catch (error) {}
90
+ gizmoRef.current = null;
91
+ }
92
+ if (layerRef.current && app.scene?.layers) {
93
+ try {
94
+ const layer = app.scene.layers.getLayerByName('Gizmo');
95
+ if (layer) app.scene.layers.remove(layerRef.current);
96
+ } catch (error) {}
97
+ layerRef.current = null;
98
+ }
99
+ };
100
+ if (!shouldShowGizmo) return void cleanupGizmo();
101
+ const setupGizmo = ()=>{
102
+ const annotationEntity = app.root.findByName(entityName);
103
+ const cameraComponent = walkthroughCamera?.camera;
104
+ const cameraControls = walkthroughCamera?.script?.get(CameraControls.scriptName);
105
+ if (!annotationEntity || !cameraComponent) return false;
106
+ if (!gizmoRef.current) {
107
+ if (!layerRef.current) layerRef.current = Gizmo.createLayer(app);
108
+ const gizmo = new TranslateGizmo(cameraComponent, layerRef.current);
109
+ gizmo.size = 0.75;
110
+ gizmo.snapIncrement = 0.01;
111
+ gizmo.coordSpace = 'world';
112
+ gizmo.on('transform:start', ()=>{
113
+ if (cameraControls) cameraControls.enabled = false;
114
+ });
115
+ gizmo.on('transform:end', ()=>{
116
+ if (cameraControls) cameraControls.enabled = true;
117
+ if (onPositionChange) {
118
+ const pos = annotationEntity.getPosition();
119
+ onPositionChange([
120
+ pos.x,
121
+ pos.y,
122
+ pos.z
123
+ ]);
124
+ }
125
+ });
126
+ gizmo.attach([
127
+ annotationEntity
128
+ ]);
129
+ gizmoRef.current = gizmo;
130
+ }
131
+ return true;
132
+ };
133
+ const intervalId = setInterval(()=>{
134
+ if (setupGizmo()) clearInterval(intervalId);
135
+ }, 100);
136
+ return ()=>{
137
+ clearInterval(intervalId);
138
+ cleanupGizmo();
139
+ };
140
+ }, [
141
+ app,
142
+ isEdit,
143
+ isSelected,
144
+ visible,
145
+ onPositionChange,
146
+ entityName,
147
+ walkthroughCamera
148
+ ]);
149
+ return /*#__PURE__*/ jsx(Entity, {
150
+ name: entityName,
151
+ position: position,
152
+ children: /*#__PURE__*/ jsx(Script, {
153
+ script: Annotation,
154
+ title: title,
155
+ label: label,
156
+ icon: icon,
157
+ text: bodyText,
158
+ enabled: visible,
159
+ onClickCallback: handleClick,
160
+ onVrOpenCallback: handleVrOpen,
161
+ onScreenPositionUpdateCallback: isViewed ? handleScreenPositionUpdate : void 0
162
+ })
163
+ });
208
164
  };
209
-
210
- export { Annotation as default };
165
+ const VirtualWalkthrough_Annotation = Annotation_Annotation;
166
+ export default VirtualWalkthrough_Annotation;