@embeddr/react-ui 0.1.0 → 0.1.2

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 (131) hide show
  1. package/LICENSE.md +674 -0
  2. package/dist/context/ImageDialogContext.d.ts +4 -4
  3. package/dist/context/ImageDialogContext.d.ts.map +1 -1
  4. package/dist/context/ImageDialogContext.js.map +1 -1
  5. package/dist/index.d.ts +0 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +113 -116
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/utils.d.ts +2 -2
  10. package/dist/lib/utils.d.ts.map +1 -1
  11. package/dist/lib/utils.js.map +1 -1
  12. package/dist/node_modules/.pnpm/@floating-ui_core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.js.map +1 -1
  13. package/dist/node_modules/.pnpm/@floating-ui_dom@1.7.4/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -1
  14. package/dist/node_modules/.pnpm/@floating-ui_react-dom@2.1.6_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js.map +1 -1
  15. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -1
  16. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -1
  17. package/dist/node_modules/.pnpm/@radix-ui_primitive@1.1.3/node_modules/@radix-ui/primitive/dist/index.js.map +1 -1
  18. package/dist/node_modules/.pnpm/{@radix-ui_react-arrow@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@1_2aa610ae3ce517c8615cebea9e24dc5b → @radix-ui_react-arrow@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19.2.7__mszl4mxerbyoklygdzmmz7z344}/node_modules/@radix-ui/react-arrow/dist/index.js +1 -1
  19. package/dist/node_modules/.pnpm/@radix-ui_react-arrow@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19.2.7__mszl4mxerbyoklygdzmmz7z344/node_modules/@radix-ui/react-arrow/dist/index.js.map +1 -0
  20. package/dist/node_modules/.pnpm/@radix-ui_react-compose-refs@1.1.2_@types_react@19.2.7_react@19.2.3/node_modules/@radix-ui/react-compose-refs/dist/index.js.map +1 -1
  21. package/dist/node_modules/.pnpm/@radix-ui_react-context@1.1.2_@types_react@19.2.7_react@19.2.3/node_modules/@radix-ui/react-context/dist/index.js.map +1 -1
  22. package/dist/node_modules/.pnpm/{@radix-ui_react-dismissable-layer@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.7__@_d3b8d348a25db9227f3697eddbb26378 → @radix-ui_react-dismissable-layer@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.7__@types__3rf2o2lqjhudzepmewjxnjpij4}/node_modules/@radix-ui/react-dismissable-layer/dist/index.js +1 -1
  23. package/dist/node_modules/.pnpm/@radix-ui_react-dismissable-layer@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.7__@types__3rf2o2lqjhudzepmewjxnjpij4/node_modules/@radix-ui/react-dismissable-layer/dist/index.js.map +1 -0
  24. package/dist/node_modules/.pnpm/@radix-ui_react-id@1.1.1_@types_react@19.2.7_react@19.2.3/node_modules/@radix-ui/react-id/dist/index.js.map +1 -1
  25. package/dist/node_modules/.pnpm/{@radix-ui_react-popper@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@_4468d6b8a14aa8e01a5fa6b59b3b35ec → @radix-ui_react-popper@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19.2.7_khjb2df42vo4osw72fyixnkybq}/node_modules/@radix-ui/react-popper/dist/index.js +2 -2
  26. package/dist/node_modules/.pnpm/@radix-ui_react-popper@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19.2.7_khjb2df42vo4osw72fyixnkybq/node_modules/@radix-ui/react-popper/dist/index.js.map +1 -0
  27. package/dist/node_modules/.pnpm/{@radix-ui_react-portal@1.1.9_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@_7645cc20debbdc3166db2ed8e9fd2af5 → @radix-ui_react-portal@1.1.9_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19.2.7_wazm3ifinqzsamvsqllqreat3m}/node_modules/@radix-ui/react-portal/dist/index.js +1 -1
  28. package/dist/node_modules/.pnpm/@radix-ui_react-portal@1.1.9_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19.2.7_wazm3ifinqzsamvsqllqreat3m/node_modules/@radix-ui/react-portal/dist/index.js.map +1 -0
  29. package/dist/node_modules/.pnpm/@radix-ui_react-presence@1.1.5_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19.2_g7nvzcflnhogkdp32witcuayfy/node_modules/@radix-ui/react-presence/dist/index.js.map +1 -0
  30. package/dist/node_modules/.pnpm/@radix-ui_react-primitive@2.1.3_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19._vrijsupjqixawruberrfb56pbm/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  31. package/dist/node_modules/.pnpm/@radix-ui_react-primitive@2.1.4_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19._4sfldbbhvd3xapj4euqmtg5wga/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  32. package/dist/node_modules/.pnpm/{@radix-ui_react-tooltip@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react_61903d443f318e235810cb4023b9ffb4 → @radix-ui_react-tooltip@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19.2._lz7pdiyrbpqbbsap76pucwgg5i}/node_modules/@radix-ui/react-tooltip/dist/index.js +6 -6
  33. package/dist/node_modules/.pnpm/@radix-ui_react-tooltip@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19.2._lz7pdiyrbpqbbsap76pucwgg5i/node_modules/@radix-ui/react-tooltip/dist/index.js.map +1 -0
  34. package/dist/node_modules/.pnpm/@radix-ui_react-use-callback-ref@1.1.1_@types_react@19.2.7_react@19.2.3/node_modules/@radix-ui/react-use-callback-ref/dist/index.js.map +1 -1
  35. package/dist/node_modules/.pnpm/@radix-ui_react-use-controllable-state@1.2.2_@types_react@19.2.7_react@19.2.3/node_modules/@radix-ui/react-use-controllable-state/dist/index.js.map +1 -1
  36. package/dist/node_modules/.pnpm/@radix-ui_react-use-escape-keydown@1.1.1_@types_react@19.2.7_react@19.2.3/node_modules/@radix-ui/react-use-escape-keydown/dist/index.js.map +1 -1
  37. package/dist/node_modules/.pnpm/@radix-ui_react-use-layout-effect@1.1.1_@types_react@19.2.7_react@19.2.3/node_modules/@radix-ui/react-use-layout-effect/dist/index.js.map +1 -1
  38. package/dist/node_modules/.pnpm/@radix-ui_react-use-size@1.1.1_@types_react@19.2.7_react@19.2.3/node_modules/@radix-ui/react-use-size/dist/index.js.map +1 -1
  39. package/dist/node_modules/.pnpm/{@radix-ui_react-visually-hidden@1.2.3_@types_react-dom@19.2.3_@types_react@19.2.7__@typ_b08a54b8b8cc1e2fcb68c28280b66cb9 → @radix-ui_react-visually-hidden@1.2.3_@types_react-dom@19.2.3_@types_react@19.2.7__@types_rea_xyyq4kaffb3s2ucmc374detnx4}/node_modules/@radix-ui/react-visually-hidden/dist/index.js +1 -1
  40. package/dist/node_modules/.pnpm/@radix-ui_react-visually-hidden@1.2.3_@types_react-dom@19.2.3_@types_react@19.2.7__@types_rea_xyyq4kaffb3s2ucmc374detnx4/node_modules/@radix-ui/react-visually-hidden/dist/index.js.map +1 -0
  41. package/dist/node_modules/.pnpm/{@radix-ui_react-visually-hidden@1.2.4_@types_react-dom@19.2.3_@types_react@19.2.7__@typ_7a5b8f185fdc99089c53563f38599d77 → @radix-ui_react-visually-hidden@1.2.4_@types_react-dom@19.2.3_@types_react@19.2.7__@types_rea_uxirz2wej36zwyzefmreqngy74}/node_modules/@radix-ui/react-visually-hidden/dist/index.js +1 -1
  42. package/dist/node_modules/.pnpm/@radix-ui_react-visually-hidden@1.2.4_@types_react-dom@19.2.3_@types_react@19.2.7__@types_rea_uxirz2wej36zwyzefmreqngy74/node_modules/@radix-ui/react-visually-hidden/dist/index.js.map +1 -0
  43. package/dist/node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.js.map +1 -1
  44. package/dist/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -1
  45. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/Icon.js.map +1 -1
  46. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/createLucideIcon.js.map +1 -1
  47. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/defaultAttributes.js.map +1 -1
  48. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/check.js.map +1 -1
  49. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-down.js.map +1 -1
  50. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-right.js.map +1 -1
  51. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +1 -1
  52. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/circle-check.js.map +1 -1
  53. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/circle.js.map +1 -1
  54. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/grip-vertical.js.map +1 -1
  55. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/info.js.map +1 -1
  56. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/loader-circle.js.map +1 -1
  57. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/octagon-x.js.map +1 -1
  58. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/pause.js.map +1 -1
  59. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/play.js.map +1 -1
  60. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js.map +1 -1
  61. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/rotate-cw.js.map +1 -1
  62. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/triangle-alert.js.map +1 -1
  63. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.js.map +1 -1
  64. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/shared/src/utils.js.map +1 -1
  65. package/dist/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
  66. package/dist/providers/ExternalNav.js.map +1 -1
  67. package/dist/providers/ImageDialogProvider.d.ts +1 -1
  68. package/dist/providers/ImageDialogProvider.d.ts.map +1 -1
  69. package/dist/providers/ImageDialogProvider.js +7 -7
  70. package/dist/providers/ImageDialogProvider.js.map +1 -1
  71. package/dist/types/gallery.d.ts +3 -3
  72. package/dist/types/gallery.d.ts.map +1 -1
  73. package/dist/ui/badge.d.ts +1 -1
  74. package/dist/ui/badge.d.ts.map +1 -1
  75. package/dist/ui/badge.js.map +1 -1
  76. package/dist/ui/button.d.ts +1 -1
  77. package/dist/ui/button.d.ts.map +1 -1
  78. package/dist/ui/button.js.map +1 -1
  79. package/dist/ui/input-group.d.ts +1 -1
  80. package/dist/ui/input-group.d.ts.map +1 -1
  81. package/dist/ui/input-group.js.map +1 -1
  82. package/dist/ui/lightbox/GalleryPicker.js.map +1 -1
  83. package/dist/ui/lightbox/ImageThumbnailStrip.js.map +1 -1
  84. package/dist/ui/lightbox/LightboxViewer.d.ts +1 -1
  85. package/dist/ui/lightbox/LightboxViewer.d.ts.map +1 -1
  86. package/dist/ui/lightbox/LightboxViewer.js.map +1 -1
  87. package/dist/ui/lightbox/PannableImage.d.ts +2 -2
  88. package/dist/ui/lightbox/PannableImage.d.ts.map +1 -1
  89. package/dist/ui/lightbox/PannableImage.js.map +1 -1
  90. package/dist/ui/resizable.d.ts +1 -1
  91. package/dist/ui/resizable.js.map +1 -1
  92. package/dist/ui/scroll-area.d.ts.map +1 -1
  93. package/dist/ui/scroll-area.js.map +1 -1
  94. package/dist/ui/sonner.d.ts +1 -1
  95. package/dist/ui/sonner.d.ts.map +1 -1
  96. package/dist/ui/sonner.js.map +1 -1
  97. package/dist/ui/tooltip.js +1 -1
  98. package/package.json +10 -10
  99. package/dist/node_modules/.pnpm/@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/extends.js +0 -13
  100. package/dist/node_modules/.pnpm/@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/extends.js.map +0 -1
  101. package/dist/node_modules/.pnpm/@radix-ui_react-arrow@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@1_2aa610ae3ce517c8615cebea9e24dc5b/node_modules/@radix-ui/react-arrow/dist/index.js.map +0 -1
  102. package/dist/node_modules/.pnpm/@radix-ui_react-dismissable-layer@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.7__@_d3b8d348a25db9227f3697eddbb26378/node_modules/@radix-ui/react-dismissable-layer/dist/index.js.map +0 -1
  103. package/dist/node_modules/.pnpm/@radix-ui_react-popper@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@_4468d6b8a14aa8e01a5fa6b59b3b35ec/node_modules/@radix-ui/react-popper/dist/index.js.map +0 -1
  104. package/dist/node_modules/.pnpm/@radix-ui_react-portal@1.1.9_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@_7645cc20debbdc3166db2ed8e9fd2af5/node_modules/@radix-ui/react-portal/dist/index.js.map +0 -1
  105. package/dist/node_modules/.pnpm/@radix-ui_react-presence@1.1.5_@types_react-dom@19.2.3_@types_react@19.2.7__@types_reac_90b29b5754215655309320557426a63a/node_modules/@radix-ui/react-presence/dist/index.js.map +0 -1
  106. package/dist/node_modules/.pnpm/@radix-ui_react-primitive@2.1.3_@types_react-dom@19.2.3_@types_react@19.2.7__@types_rea_5f3d28fea11cf58eed3830d0189b6e2d/node_modules/@radix-ui/react-primitive/dist/index.js.map +0 -1
  107. package/dist/node_modules/.pnpm/@radix-ui_react-primitive@2.1.4_@types_react-dom@19.2.3_@types_react@19.2.7__@types_rea_2890c4f0094b3fe96d52c22245e0b989/node_modules/@radix-ui/react-primitive/dist/index.js.map +0 -1
  108. package/dist/node_modules/.pnpm/@radix-ui_react-tooltip@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react_61903d443f318e235810cb4023b9ffb4/node_modules/@radix-ui/react-tooltip/dist/index.js.map +0 -1
  109. package/dist/node_modules/.pnpm/@radix-ui_react-visually-hidden@1.2.3_@types_react-dom@19.2.3_@types_react@19.2.7__@typ_b08a54b8b8cc1e2fcb68c28280b66cb9/node_modules/@radix-ui/react-visually-hidden/dist/index.js.map +0 -1
  110. package/dist/node_modules/.pnpm/@radix-ui_react-visually-hidden@1.2.4_@types_react-dom@19.2.3_@types_react@19.2.7__@typ_7a5b8f185fdc99089c53563f38599d77/node_modules/@radix-ui/react-visually-hidden/dist/index.js.map +0 -1
  111. package/dist/node_modules/.pnpm/@react-three_drei@10.7.7_@react-three_fiber@9.4.2_@types_react@19.2.7_react-dom@19.2.3__e3b6c415d30d21deeb56f01c9fc2836f/node_modules/@react-three/drei/core/OrbitControls.js +0 -51
  112. package/dist/node_modules/.pnpm/@react-three_drei@10.7.7_@react-three_fiber@9.4.2_@types_react@19.2.7_react-dom@19.2.3__e3b6c415d30d21deeb56f01c9fc2836f/node_modules/@react-three/drei/core/OrbitControls.js.map +0 -1
  113. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chart-scatter.js +0 -14
  114. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chart-scatter.js.map +0 -1
  115. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/external-link.js +0 -11
  116. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/external-link.js.map +0 -1
  117. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/eye.js +0 -16
  118. package/dist/node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
  119. package/dist/node_modules/.pnpm/three-stdlib@2.36.1_three@0.182.0/node_modules/three-stdlib/controls/EventDispatcher.js +0 -61
  120. package/dist/node_modules/.pnpm/three-stdlib@2.36.1_three@0.182.0/node_modules/three-stdlib/controls/EventDispatcher.js.map +0 -1
  121. package/dist/node_modules/.pnpm/three-stdlib@2.36.1_three@0.182.0/node_modules/three-stdlib/controls/OrbitControls.js +0 -417
  122. package/dist/node_modules/.pnpm/three-stdlib@2.36.1_three@0.182.0/node_modules/three-stdlib/controls/OrbitControls.js.map +0 -1
  123. package/dist/ui/explorers/Umap3DExplorer.d.ts +0 -4
  124. package/dist/ui/explorers/Umap3DExplorer.d.ts.map +0 -1
  125. package/dist/ui/explorers/Umap3DExplorer.js +0 -375
  126. package/dist/ui/explorers/Umap3DExplorer.js.map +0 -1
  127. package/dist/ui/explorers/types.d.ts +0 -16
  128. package/dist/ui/explorers/types.d.ts.map +0 -1
  129. /package/dist/node_modules/.pnpm/{@radix-ui_react-presence@1.1.5_@types_react-dom@19.2.3_@types_react@19.2.7__@types_reac_90b29b5754215655309320557426a63a → @radix-ui_react-presence@1.1.5_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19.2_g7nvzcflnhogkdp32witcuayfy}/node_modules/@radix-ui/react-presence/dist/index.js +0 -0
  130. /package/dist/node_modules/.pnpm/{@radix-ui_react-primitive@2.1.3_@types_react-dom@19.2.3_@types_react@19.2.7__@types_rea_5f3d28fea11cf58eed3830d0189b6e2d → @radix-ui_react-primitive@2.1.3_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19._vrijsupjqixawruberrfb56pbm}/node_modules/@radix-ui/react-primitive/dist/index.js +0 -0
  131. /package/dist/node_modules/.pnpm/{@radix-ui_react-primitive@2.1.4_@types_react-dom@19.2.3_@types_react@19.2.7__@types_rea_2890c4f0094b3fe96d52c22245e0b989 → @radix-ui_react-primitive@2.1.4_@types_react-dom@19.2.3_@types_react@19.2.7__@types_react@19._4sfldbbhvd3xapj4euqmtg5wga}/node_modules/@radix-ui/react-primitive/dist/index.js +0 -0
@@ -1,375 +0,0 @@
1
- import { jsxs as f, jsx as t } from "react/jsx-runtime";
2
- import { useState as L, useRef as S, useEffect as U, useMemo as T } from "react";
3
- import { Canvas as W, useThree as $, useFrame as G } from "@react-three/fiber";
4
- import * as j from "three";
5
- import { Spinner as H } from "../spinner.js";
6
- import { Button as z } from "../button.js";
7
- import { OrbitControls as q } from "../../node_modules/.pnpm/@react-three_drei@10.7.7_@react-three_fiber@9.4.2_@types_react@19.2.7_react-dom@19.2.3__e3b6c415d30d21deeb56f01c9fc2836f/node_modules/@react-three/drei/core/OrbitControls.js";
8
- import B from "../../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.js";
9
- import Q from "../../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chart-scatter.js";
10
- import X from "../../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/eye.js";
11
- import Z from "../../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/external-link.js";
12
- const N = (e) => {
13
- let i = 0, l = 0, r = 0;
14
- return e.umap && typeof e.umap == "object" ? (i = e.umap.x || 0, l = e.umap.y || 0, r = e.umap.z || 0) : (i = e.x || 0, l = e.y || 0, r = e.z || 0), isNaN(i) && (i = 0), isNaN(l) && (l = 0), isNaN(r) && (r = 0), [(i - 0.5) * 20, (l - 0.5) * 20, (r - 0.5) * 20];
15
- }, J = ({
16
- points: e,
17
- onHover: i,
18
- onClick: l
19
- }) => {
20
- const r = S(null), h = S(null), p = T(() => {
21
- const a = new Float32Array(e.length * 3);
22
- for (let n = 0; n < e.length; n++) {
23
- const o = e[n];
24
- if (!o) continue;
25
- const [u, y, x] = N(o);
26
- a[n * 3] = u, a[n * 3 + 1] = y, a[n * 3 + 2] = x;
27
- }
28
- return a;
29
- }, [e]), v = T(() => {
30
- const a = new Float32Array(e.length * 3), n = new j.Color();
31
- for (let o = 0; o < e.length; o++) {
32
- const u = e[o];
33
- if (!u) continue;
34
- let y = 0, x = 0, g = 0;
35
- u.umap && typeof u.umap == "object" ? (y = u.umap.x || 0, x = u.umap.y || 0, g = u.umap.z || 0) : (y = u.x || 0, x = u.y || 0, g = u.z || 0), isNaN(y) && (y = 0), isNaN(x) && (x = 0), isNaN(g) && (g = 0), n.setRGB(y, x, g), a[o * 3] = n.r, a[o * 3 + 1] = n.g, a[o * 3 + 2] = n.b;
36
- }
37
- return a;
38
- }, [e]);
39
- return /* @__PURE__ */ f(
40
- "points",
41
- {
42
- ref: r,
43
- onPointerMove: (a) => {
44
- a.stopPropagation();
45
- const n = a.index;
46
- if (n !== void 0 && n !== h.current && (h.current = n, n >= 0 && n < e.length)) {
47
- const o = e[n];
48
- o && i(n, o);
49
- }
50
- },
51
- onPointerOut: (a) => {
52
- h.current = null, i(null, null);
53
- },
54
- onClick: (a) => {
55
- a.stopPropagation();
56
- const n = a.index;
57
- if (n !== void 0 && n >= 0 && n < e.length) {
58
- const o = e[n];
59
- o && l(n, o, a);
60
- }
61
- },
62
- children: [
63
- /* @__PURE__ */ f("bufferGeometry", { children: [
64
- /* @__PURE__ */ t(
65
- "bufferAttribute",
66
- {
67
- attach: "attributes-position",
68
- count: p.length / 3,
69
- array: p,
70
- itemSize: 3,
71
- args: [p, 3]
72
- }
73
- ),
74
- /* @__PURE__ */ t(
75
- "bufferAttribute",
76
- {
77
- attach: "attributes-color",
78
- count: v.length / 3,
79
- array: v,
80
- itemSize: 3,
81
- args: [v, 3]
82
- }
83
- )
84
- ] }),
85
- /* @__PURE__ */ t(
86
- "pointsMaterial",
87
- {
88
- size: 0.15,
89
- vertexColors: !0,
90
- sizeAttenuation: !0,
91
- transparent: !0,
92
- opacity: 0.8
93
- }
94
- )
95
- ]
96
- }
97
- );
98
- }, Y = ({ point: e }) => {
99
- if (!e) return null;
100
- const i = N(e);
101
- return /* @__PURE__ */ f("mesh", { position: i, children: [
102
- /* @__PURE__ */ t("sphereGeometry", { args: [0.15, 16, 16] }),
103
- /* @__PURE__ */ t(
104
- "meshStandardMaterial",
105
- {
106
- color: "#ff00ff",
107
- emissive: "#ff00ff",
108
- emissiveIntensity: 2,
109
- transparent: !0,
110
- opacity: 0.8
111
- }
112
- )
113
- ] });
114
- }, ee = ({
115
- points: e,
116
- selectedIndices: i
117
- }) => !e || i.length === 0 ? null : /* @__PURE__ */ t("group", { children: i.map((l) => {
118
- const r = e[l];
119
- if (!r) return null;
120
- const h = N(r);
121
- return /* @__PURE__ */ f("mesh", { position: h, children: [
122
- /* @__PURE__ */ t("sphereGeometry", { args: [0.15, 16, 16] }),
123
- /* @__PURE__ */ t(
124
- "meshStandardMaterial",
125
- {
126
- color: "#00ffff",
127
- emissive: "#00ffff",
128
- emissiveIntensity: 2,
129
- transparent: !0,
130
- opacity: 0.8
131
- }
132
- )
133
- ] }, l);
134
- }) }), te = ({
135
- controlsRef: e,
136
- targetPoint: i
137
- }) => {
138
- const { camera: l } = $(), [r, h] = L({}), p = S(!1);
139
- return U(() => {
140
- const v = (m) => h((c) => ({ ...c, [m.code]: !0 })), b = (m) => h((c) => ({ ...c, [m.code]: !1 }));
141
- return window.addEventListener("keydown", v), window.addEventListener("keyup", b), () => {
142
- window.removeEventListener("keydown", v), window.removeEventListener("keyup", b);
143
- };
144
- }, []), G((v, b) => {
145
- if (!e.current) return;
146
- if (i && (e.current.target.distanceTo(i) > 0.1 ? (p.current = !0, e.current.target.lerp(i, b * 5)) : p.current = !1), Object.values(r).some((c) => c)) {
147
- p.current = !1;
148
- const c = (r.ShiftLeft || r.ShiftRight ? 20 : 8) * b, a = new j.Vector3();
149
- l.getWorldDirection(a);
150
- const n = new j.Vector3();
151
- n.crossVectors(a, l.up).normalize();
152
- const o = new j.Vector3();
153
- (r.KeyW || r.ArrowUp) && o.add(a), (r.KeyS || r.ArrowDown) && o.sub(a), (r.KeyA || r.ArrowLeft) && o.sub(n), (r.KeyD || r.ArrowRight) && o.add(n), r.KeyQ && (o.y += 1), r.KeyE && (o.y -= 1), o.lengthSq() > 0 && (o.normalize().multiplyScalar(c), l.position.add(o), e.current.target.add(o));
154
- }
155
- }), null;
156
- }, fe = ({
157
- points: e = [],
158
- isLoading: i = !1,
159
- error: l = null,
160
- onPointSelect: r,
161
- getImageUrl: h,
162
- className: p
163
- }) => {
164
- const [v, b] = L(null), [m, c] = L([]), [a, n] = L(null), o = S(null), u = (s, d = "thumb") => h ? h(s, d) : d === "thumb" ? s.thumb_url ? s.thumb_url : s.thumb_path?.startsWith("http") ? s.thumb_path : s.rel_path ? `/static/images/posts/thumb_${s.rel_path}` : "" : s.image_url ? s.image_url : s.rel_path ? `/static/images/posts/${s.rel_path}` : "", y = (s, d, w) => {
165
- if (w && (w.ctrlKey || w.metaKey)) {
166
- const [_, A, D] = N(d), E = new j.Vector3(_, A, D);
167
- n(E), c([s]), r && r(d);
168
- return;
169
- }
170
- c([s]), r && r(d);
171
- }, x = (s, d = 50) => {
172
- if (!e) return;
173
- const w = e[s];
174
- if (!w) return;
175
- const [_, A, D] = N(w), E = e.map((C, K) => {
176
- const [O, V, F] = N(C), P = O - _, M = V - A, I = F - D;
177
- return { i: K, d: P * P + M * M + I * I };
178
- });
179
- E.sort((C, K) => C.d - K.d);
180
- const R = E.slice(0, d).map((C) => C.i);
181
- c(R);
182
- };
183
- if (i)
184
- return /* @__PURE__ */ f("div", { className: "h-full w-full flex items-center justify-center flex-col gap-4", children: [
185
- /* @__PURE__ */ t(H, { className: "w-8 h-8 text-primary" }),
186
- /* @__PURE__ */ t("p", { className: "text-muted-foreground animate-pulse", children: "Loading 3D Point Cloud..." })
187
- ] });
188
- if (l)
189
- return /* @__PURE__ */ f("div", { className: "h-full w-full flex items-center justify-center text-destructive", children: [
190
- "Error loading 3D data: ",
191
- l.message
192
- ] });
193
- if (!e || e.length === 0)
194
- return /* @__PURE__ */ t("div", { className: "h-full w-full flex items-center justify-center text-muted-foreground", children: "No 3D data found." });
195
- const g = m.length === 1 ? m[0] : void 0, k = g !== void 0 ? e[g] : void 0;
196
- return /* @__PURE__ */ f(
197
- "div",
198
- {
199
- className: `w-full h-full flex flex-col bg-card relative overflow-hidden ${p || ""}`,
200
- children: [
201
- /* @__PURE__ */ f(
202
- W,
203
- {
204
- camera: { position: [0, 0, 15], fov: 60 },
205
- raycaster: { params: { Points: { threshold: 0.15 } } },
206
- children: [
207
- /* @__PURE__ */ t("fog", { attach: "fog", args: ["#050505", 10, 70] }),
208
- /* @__PURE__ */ t("ambientLight", { intensity: 0.5 }),
209
- /* @__PURE__ */ t("pointLight", { position: [10, 10, 10] }),
210
- /* @__PURE__ */ t(
211
- q,
212
- {
213
- ref: o,
214
- enableDamping: !0,
215
- dampingFactor: 0.1,
216
- rotateSpeed: 0.5,
217
- zoomSpeed: 0.8,
218
- minDistance: 1,
219
- maxDistance: 30
220
- }
221
- ),
222
- /* @__PURE__ */ t(
223
- te,
224
- {
225
- controlsRef: o,
226
- targetPoint: a
227
- }
228
- ),
229
- /* @__PURE__ */ t(
230
- J,
231
- {
232
- points: e,
233
- onHover: (s, d) => b(d),
234
- onClick: y
235
- }
236
- ),
237
- /* @__PURE__ */ t(Y, { point: v }),
238
- /* @__PURE__ */ t(ee, { points: e, selectedIndices: m })
239
- ]
240
- }
241
- ),
242
- /* @__PURE__ */ t("div", { className: "absolute top-4 left-4 pointer-events-none", children: /* @__PURE__ */ f("div", { className: "bg-black/50 backdrop-blur text-white px-3 py-1 text-xs border border-white/10", children: [
243
- e.length.toLocaleString(),
244
- " points"
245
- ] }) }),
246
- k && g !== void 0 && /* @__PURE__ */ f("div", { className: "absolute bottom-4 left-4 z-10 ring-2 ring-foreground/10 overflow-hidden shadow-lg max-w-sm", children: [
247
- /* @__PURE__ */ f(
248
- "div",
249
- {
250
- className: "bg-card cursor-pointer relative ring-1 ring-foreground/10 hover:ring-2 ",
251
- onClick: () => {
252
- r && r(k);
253
- },
254
- children: [
255
- /* @__PURE__ */ t(
256
- "img",
257
- {
258
- src: u(k, "thumb"),
259
- alt: `Point ${g}`,
260
- className: "w-full h-64 object-contain bg-black/20"
261
- }
262
- ),
263
- /* @__PURE__ */ t(
264
- z,
265
- {
266
- onClick: (s) => {
267
- s.stopPropagation(), c([]);
268
- },
269
- variant: "ghost",
270
- size: "icon",
271
- className: "absolute top-2 right-2 w-8 h-8 bg-black/50 hover:bg-black/70 text-white flex items-center justify-center backdrop-blur-sm",
272
- children: /* @__PURE__ */ t(B, { className: "w-4 h-4" })
273
- }
274
- ),
275
- /* @__PURE__ */ t(
276
- z,
277
- {
278
- onClick: (s) => {
279
- s.stopPropagation(), x(g);
280
- },
281
- variant: "ghost",
282
- size: "sm",
283
- className: "absolute top-2 left-2 h-8 px-2 bg-black/50 hover:bg-black/70 text-white text-xs flex items-center justify-center backdrop-blur-sm",
284
- title: "Select 50 nearest neighbors",
285
- children: /* @__PURE__ */ t(Q, { className: "w-4 h-4 mr-1" })
286
- }
287
- )
288
- ]
289
- }
290
- ),
291
- /* @__PURE__ */ t("div", { className: "absolute bottom-2 left-2 px-4 py-3 w-fit", children: /* @__PURE__ */ f("div", { className: "mt-2 flex flex-row gap-1 absolute bottom-0 left-0 p-1 ", children: [
292
- /* @__PURE__ */ t(
293
- z,
294
- {
295
- variant: "ghost",
296
- className: "w-8 h-8 z-50 bg-black/50 hover:bg-black/70 p-2 text-white flex items-center justify-center backdrop-blur-sm",
297
- style: {
298
- padding: 0,
299
- border: "none",
300
- cursor: "pointer"
301
- },
302
- onClick: () => {
303
- r && r(k);
304
- },
305
- children: /* @__PURE__ */ t(X, { className: "w-5" })
306
- }
307
- ),
308
- /* @__PURE__ */ t(z, { variant: "ghost", asChild: !0, children: /* @__PURE__ */ t(
309
- "a",
310
- {
311
- href: u(k, "full"),
312
- target: "_blank",
313
- rel: "noopener noreferrer",
314
- className: "w-8 h-8 bg-black/50 hover:bg-black/70 text-white flex items-center justify-center backdrop-blur-sm",
315
- style: {
316
- padding: 0,
317
- border: "none",
318
- cursor: "pointer"
319
- },
320
- children: /* @__PURE__ */ t(Z, { className: "w-5" })
321
- }
322
- ) })
323
- ] }) })
324
- ] }),
325
- m.length > 1 && e && /* @__PURE__ */ f("div", { className: "absolute bottom-4 left-4 z-10 bg-card border border-border overflow-hidden shadow-lg w-96 max-h-[50vh] flex flex-col", children: [
326
- /* @__PURE__ */ f("div", { className: "p-2 bg-muted border-b border-border flex items-center justify-between", children: [
327
- /* @__PURE__ */ f("span", { className: "text-sm font-medium", children: [
328
- m.length,
329
- " selected"
330
- ] }),
331
- /* @__PURE__ */ t(
332
- z,
333
- {
334
- onClick: () => c([]),
335
- variant: "ghost",
336
- size: "sm",
337
- className: "text-xs py-0! my-0! text-muted-foreground hover:text-foreground",
338
- children: "Clear"
339
- }
340
- )
341
- ] }),
342
- /* @__PURE__ */ t("div", { className: "p-2 overflow-y-auto grid grid-cols-4 gap-2", children: m.slice(0, 100).map((s) => {
343
- const d = e[s];
344
- return d ? /* @__PURE__ */ t(
345
- "div",
346
- {
347
- className: "aspect-square relative group cursor-pointer ring-1 ring-border hover:ring-primary/20 hover:ring-2",
348
- onClick: () => {
349
- c([s]), r && r(d);
350
- },
351
- onMouseEnter: () => b(d),
352
- onMouseLeave: () => b(null),
353
- children: /* @__PURE__ */ t(
354
- "img",
355
- {
356
- src: u(d, "thumb"),
357
- alt: "",
358
- className: "w-full h-full object-cover",
359
- loading: "lazy"
360
- }
361
- )
362
- },
363
- s
364
- ) : null;
365
- }) })
366
- ] }),
367
- /* @__PURE__ */ t("div", { className: "absolute bottom-4 right-4 pointer-events-none max-w-sm text-right", children: /* @__PURE__ */ t("div", { className: "text-white/50 text-[10px] bg-black/50 backdrop-blur px-2 py-1 border border-white/10", children: "Left Click: Select • Ctrl+Click: Center & Select • Right Click: Pan • Scroll: Zoom • WASD/QE: Move" }) })
368
- ]
369
- }
370
- );
371
- };
372
- export {
373
- fe as Umap3DExplorer
374
- };
375
- //# sourceMappingURL=Umap3DExplorer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Umap3DExplorer.js","sources":["../../../src/ui/explorers/Umap3DExplorer.tsx"],"sourcesContent":["import { useMemo, useState, useRef, useEffect } from \"react\";\nimport {\n Canvas,\n useFrame,\n useThree,\n type ThreeEvent,\n} from \"@react-three/fiber\";\nimport { OrbitControls } from \"@react-three/drei\";\nimport * as THREE from \"three\";\nimport { Spinner } from \"../spinner\";\nimport { Button } from \"../button\";\nimport { ExternalLinkIcon, EyeIcon, ScatterChart, X } from \"lucide-react\";\nimport type { Point3D, Explorer3DProps } from \"./types\";\nexport type { Point3D, Explorer3DProps } from \"./types\";\n\n// Helper to extract coordinates safely\nconst getCoordinates = (point: Point3D): [number, number, number] => {\n let x = 0,\n y = 0,\n z = 0;\n // Check for nested umap coordinates first\n if (point.umap && typeof point.umap === \"object\") {\n x = (point.umap as any).x || 0;\n y = (point.umap as any).y || 0;\n z = (point.umap as any).z || 0;\n } else {\n x = point.x || 0;\n y = point.y || 0;\n z = point.z || 0;\n }\n\n if (isNaN(x)) x = 0;\n if (isNaN(y)) y = 0;\n if (isNaN(z)) z = 0;\n\n // Scale up the coordinates to make the cloud larger\n return [(x - 0.5) * 20, (y - 0.5) * 20, (z - 0.5) * 20];\n};\n\nconst PointCloud = ({\n points,\n onHover,\n onClick,\n}: {\n points: Point3D[];\n onHover: (index: number | null, point: Point3D | null) => void;\n onClick: (\n index: number,\n point: Point3D,\n event: ThreeEvent<MouseEvent>\n ) => void;\n}) => {\n const meshRef = useRef<THREE.Points>(null);\n const hoverRef = useRef<number | null>(null);\n\n // Convert points to Float32Array for BufferGeometry\n const positions = useMemo(() => {\n const pos = new Float32Array(points.length * 3);\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n if (!p) continue;\n const [x, y, z] = getCoordinates(p);\n pos[i * 3] = x;\n pos[i * 3 + 1] = y;\n pos[i * 3 + 2] = z;\n }\n return pos;\n }, [points]);\n\n const colors = useMemo(() => {\n const cols = new Float32Array(points.length * 3);\n const color = new THREE.Color();\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n if (!p) continue;\n let x = 0,\n y = 0,\n z = 0;\n if (p.umap && typeof p.umap === \"object\") {\n x = (p.umap as any).x || 0;\n y = (p.umap as any).y || 0;\n z = (p.umap as any).z || 0;\n } else {\n x = p.x || 0;\n y = p.y || 0;\n z = p.z || 0;\n }\n\n if (isNaN(x)) x = 0;\n if (isNaN(y)) y = 0;\n if (isNaN(z)) z = 0;\n\n // Map position to color\n color.setRGB(x, y, z);\n cols[i * 3] = color.r;\n cols[i * 3 + 1] = color.g;\n cols[i * 3 + 2] = color.b;\n }\n return cols;\n }, [points]);\n\n const handlePointerMove = (e: ThreeEvent<PointerEvent>) => {\n e.stopPropagation();\n const index = e.index;\n if (index !== undefined && index !== hoverRef.current) {\n hoverRef.current = index;\n if (index >= 0 && index < points.length) {\n const p = points[index];\n if (p) onHover(index, p);\n }\n }\n };\n\n const handlePointerOut = (e: ThreeEvent<PointerEvent>) => {\n hoverRef.current = null;\n onHover(null, null);\n };\n\n const handleClick = (e: ThreeEvent<MouseEvent>) => {\n e.stopPropagation();\n const index = e.index;\n if (index !== undefined && index >= 0 && index < points.length) {\n const p = points[index];\n if (p) onClick(index, p, e);\n }\n };\n\n return (\n <points\n ref={meshRef}\n onPointerMove={handlePointerMove}\n onPointerOut={handlePointerOut}\n onClick={handleClick}\n >\n <bufferGeometry>\n <bufferAttribute\n attach=\"attributes-position\"\n count={positions.length / 3}\n array={positions}\n itemSize={3}\n args={[positions, 3]}\n />\n <bufferAttribute\n attach=\"attributes-color\"\n count={colors.length / 3}\n array={colors}\n itemSize={3}\n args={[colors, 3]}\n />\n </bufferGeometry>\n <pointsMaterial\n size={0.15}\n vertexColors\n sizeAttenuation\n transparent\n opacity={0.8}\n />\n </points>\n );\n};\n\nconst HighlightPoint = ({ point }: { point: Point3D | null }) => {\n if (!point) return null;\n const pos = getCoordinates(point);\n\n return (\n <mesh position={pos}>\n <sphereGeometry args={[0.15, 16, 16]} />\n <meshStandardMaterial\n color=\"#ff00ff\"\n emissive=\"#ff00ff\"\n emissiveIntensity={2}\n transparent\n opacity={0.8}\n />\n </mesh>\n );\n};\n\nconst SelectedPoints = ({\n points,\n selectedIndices,\n}: {\n points: Point3D[];\n selectedIndices: number[];\n}) => {\n if (!points || selectedIndices.length === 0) return null;\n\n return (\n <group>\n {selectedIndices.map((idx) => {\n const point = points[idx];\n if (!point) return null;\n const pos = getCoordinates(point);\n\n return (\n <mesh key={idx} position={pos}>\n <sphereGeometry args={[0.15, 16, 16]} />\n <meshStandardMaterial\n color=\"#00ffff\"\n emissive=\"#00ffff\"\n emissiveIntensity={2}\n transparent\n opacity={0.8}\n />\n </mesh>\n );\n })}\n </group>\n );\n};\n\nconst CameraController = ({\n controlsRef,\n targetPoint,\n}: {\n controlsRef: React.RefObject<any>;\n targetPoint: THREE.Vector3 | null;\n}) => {\n const { camera } = useThree();\n const [keys, setKeys] = useState<Record<string, boolean>>({});\n const isAnimating = useRef(false);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) =>\n setKeys((k) => ({ ...k, [e.code]: true }));\n const handleKeyUp = (e: KeyboardEvent) =>\n setKeys((k) => ({ ...k, [e.code]: false }));\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"keyup\", handleKeyUp);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"keyup\", handleKeyUp);\n };\n }, []);\n\n useFrame((state, delta) => {\n if (!controlsRef.current) return;\n\n // Handle animation to target\n if (targetPoint) {\n const currentTarget = controlsRef.current.target;\n const dist = currentTarget.distanceTo(targetPoint);\n\n if (dist > 0.1) {\n isAnimating.current = true;\n // Smoothly interpolate target\n controlsRef.current.target.lerp(targetPoint, delta * 5);\n } else {\n isAnimating.current = false;\n }\n }\n\n // Manual controls override animation if keys are pressed\n const hasInput = Object.values(keys).some((k) => k);\n if (hasInput) {\n isAnimating.current = false;\n const speed = (keys[\"ShiftLeft\"] || keys[\"ShiftRight\"] ? 20 : 8) * delta;\n const forward = new THREE.Vector3();\n camera.getWorldDirection(forward);\n\n const right = new THREE.Vector3();\n right.crossVectors(forward, camera.up).normalize();\n\n const move = new THREE.Vector3();\n\n if (keys[\"KeyW\"] || keys[\"ArrowUp\"]) move.add(forward);\n if (keys[\"KeyS\"] || keys[\"ArrowDown\"]) move.sub(forward);\n if (keys[\"KeyA\"] || keys[\"ArrowLeft\"]) move.sub(right);\n if (keys[\"KeyD\"] || keys[\"ArrowRight\"]) move.add(right);\n\n // Q/E for vertical movement\n if (keys[\"KeyQ\"]) move.y += 1;\n if (keys[\"KeyE\"]) move.y -= 1;\n\n if (move.lengthSq() > 0) {\n move.normalize().multiplyScalar(speed);\n camera.position.add(move);\n controlsRef.current.target.add(move);\n }\n }\n });\n\n return null;\n};\n\nexport const Umap3DExplorer = ({\n points = [],\n isLoading = false,\n error = null,\n onPointSelect,\n getImageUrl: customGetImageUrl,\n className,\n}: Explorer3DProps) => {\n const [hoveredPoint, setHoveredPoint] = useState<Point3D | null>(null);\n const [selectedIndices, setSelectedIndices] = useState<number[]>([]);\n const [cameraTarget, setCameraTarget] = useState<THREE.Vector3 | null>(null);\n const controlsRef = useRef<any>(null);\n\n const getImageUrl = (point: Point3D, type: \"thumb\" | \"full\" = \"thumb\") => {\n if (customGetImageUrl) return customGetImageUrl(point, type);\n\n // Fallback default behavior\n if (type === \"thumb\") {\n if (point.thumb_url) return point.thumb_url;\n if (point.thumb_path?.startsWith(\"http\")) return point.thumb_path;\n return point.rel_path\n ? `/static/images/posts/thumb_${point.rel_path}`\n : \"\";\n } else {\n if (point.image_url) return point.image_url;\n return point.rel_path ? `/static/images/posts/${point.rel_path}` : \"\";\n }\n };\n\n const handlePointClick = (\n index: number,\n point: Point3D,\n event?: ThreeEvent<MouseEvent>\n ) => {\n // If Ctrl/Cmd click, center camera\n if (event && (event.ctrlKey || event.metaKey)) {\n const [x, y, z] = getCoordinates(point);\n const target = new THREE.Vector3(x, y, z);\n setCameraTarget(target);\n // Also select it\n setSelectedIndices([index]);\n if (onPointSelect) onPointSelect(point);\n return;\n }\n\n // Normal click: Select point\n setSelectedIndices([index]);\n if (onPointSelect) onPointSelect(point);\n };\n\n const selectNearest = (index: number, count: number = 50) => {\n if (!points) return;\n const origin = points[index];\n if (!origin) return;\n\n const [ox, oy, oz] = getCoordinates(origin);\n\n // Calculate all distances\n const distances = points.map((p: Point3D, i: number) => {\n const [px, py, pz] = getCoordinates(p);\n const dx = px - ox;\n const dy = py - oy;\n const dz = pz - oz;\n return { i, d: dx * dx + dy * dy + dz * dz }; // Squared dist is enough for sorting\n });\n distances.sort((a: any, b: any) => a.d - b.d);\n const nearest = distances.slice(0, count).map((d: any) => d.i);\n setSelectedIndices(nearest);\n };\n\n if (isLoading) {\n return (\n <div className=\"h-full w-full flex items-center justify-center flex-col gap-4\">\n <Spinner className=\"w-8 h-8 text-primary\" />\n <p className=\"text-muted-foreground animate-pulse\">\n Loading 3D Point Cloud...\n </p>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"h-full w-full flex items-center justify-center text-destructive\">\n Error loading 3D data: {(error as Error).message}\n </div>\n );\n }\n\n if (!points || points.length === 0) {\n return (\n <div className=\"h-full w-full flex items-center justify-center text-muted-foreground\">\n No 3D data found.\n </div>\n );\n }\n\n const selectedIndex =\n selectedIndices.length === 1 ? selectedIndices[0] : undefined;\n const selectedPoint =\n selectedIndex !== undefined ? points[selectedIndex] : undefined;\n\n return (\n <div\n className={`w-full h-full flex flex-col bg-card relative overflow-hidden ${\n className || \"\"\n }`}\n >\n <Canvas\n camera={{ position: [0, 0, 15], fov: 60 }}\n raycaster={{ params: { Points: { threshold: 0.15 } } as any }}\n >\n <fog attach=\"fog\" args={[\"#050505\", 10, 70]} />\n\n <ambientLight intensity={0.5} />\n <pointLight position={[10, 10, 10]} />\n\n <OrbitControls\n ref={controlsRef}\n enableDamping\n dampingFactor={0.1}\n rotateSpeed={0.5}\n zoomSpeed={0.8}\n minDistance={1}\n maxDistance={30}\n />\n\n <CameraController\n controlsRef={controlsRef}\n targetPoint={cameraTarget}\n />\n\n <PointCloud\n points={points}\n onHover={(_, point) => setHoveredPoint(point)}\n onClick={handlePointClick}\n />\n\n <HighlightPoint point={hoveredPoint} />\n <SelectedPoints points={points} selectedIndices={selectedIndices} />\n </Canvas>\n\n <div className=\"absolute top-4 left-4 pointer-events-none\">\n <div className=\"bg-black/50 backdrop-blur text-white px-3 py-1 text-xs border border-white/10\">\n {points.length.toLocaleString()} points\n </div>\n </div>\n\n {/* Selected info with full image (Bottom Left) */}\n {selectedPoint && selectedIndex !== undefined && (\n <div className=\"absolute bottom-4 left-4 z-10 ring-2 ring-foreground/10 overflow-hidden shadow-lg max-w-sm\">\n <div\n className=\"bg-card cursor-pointer relative ring-1 ring-foreground/10 hover:ring-2 \"\n onClick={() => {\n if (onPointSelect) onPointSelect(selectedPoint);\n }}\n >\n <img\n src={getImageUrl(selectedPoint, \"thumb\")}\n alt={`Point ${selectedIndex}`}\n className=\"w-full h-64 object-contain bg-black/20\"\n />\n <Button\n onClick={(e) => {\n e.stopPropagation();\n setSelectedIndices([]);\n }}\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute top-2 right-2 w-8 h-8 bg-black/50 hover:bg-black/70 text-white flex items-center justify-center backdrop-blur-sm\"\n >\n <X className=\"w-4 h-4\" />\n </Button>\n <Button\n onClick={(e) => {\n e.stopPropagation();\n selectNearest(selectedIndex);\n }}\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute top-2 left-2 h-8 px-2 bg-black/50 hover:bg-black/70 text-white text-xs flex items-center justify-center backdrop-blur-sm\"\n title=\"Select 50 nearest neighbors\"\n >\n <ScatterChart className=\"w-4 h-4 mr-1\" />\n </Button>\n </div>\n <div className=\"absolute bottom-2 left-2 px-4 py-3 w-fit\">\n <div className=\"mt-2 flex flex-row gap-1 absolute bottom-0 left-0 p-1 \">\n <Button\n variant=\"ghost\"\n className=\"w-8 h-8 z-50 bg-black/50 hover:bg-black/70 p-2 text-white flex items-center justify-center backdrop-blur-sm\"\n style={{\n padding: 0,\n border: \"none\",\n cursor: \"pointer\",\n }}\n onClick={() => {\n if (onPointSelect) onPointSelect(selectedPoint);\n }}\n >\n <EyeIcon className=\"w-5\" />\n </Button>\n <Button variant=\"ghost\" asChild>\n <a\n href={getImageUrl(selectedPoint, \"full\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"w-8 h-8 bg-black/50 hover:bg-black/70 text-white flex items-center justify-center backdrop-blur-sm\"\n style={{\n padding: 0,\n border: \"none\",\n cursor: \"pointer\",\n }}\n >\n <ExternalLinkIcon className=\"w-5\" />\n </a>\n </Button>\n </div>\n </div>\n </div>\n )}\n\n {/* Multi-selection Grid (Bottom Left) */}\n {selectedIndices.length > 1 && points && (\n <div className=\"absolute bottom-4 left-4 z-10 bg-card border border-border overflow-hidden shadow-lg w-96 max-h-[50vh] flex flex-col\">\n <div className=\"p-2 bg-muted border-b border-border flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {selectedIndices.length} selected\n </span>\n <Button\n onClick={() => setSelectedIndices([])}\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs py-0! my-0! text-muted-foreground hover:text-foreground\"\n >\n Clear\n </Button>\n </div>\n <div className=\"p-2 overflow-y-auto grid grid-cols-4 gap-2\">\n {selectedIndices.slice(0, 100).map((idx) => {\n const point = points[idx];\n if (!point) return null;\n return (\n <div\n key={idx}\n className=\"aspect-square relative group cursor-pointer ring-1 ring-border hover:ring-primary/20 hover:ring-2\"\n onClick={() => {\n setSelectedIndices([idx]);\n if (onPointSelect) onPointSelect(point);\n }}\n onMouseEnter={() => setHoveredPoint(point)}\n onMouseLeave={() => setHoveredPoint(null)}\n >\n <img\n src={getImageUrl(point, \"thumb\")}\n alt=\"\"\n className=\"w-full h-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n <div className=\"absolute bottom-4 right-4 pointer-events-none max-w-sm text-right\">\n <div className=\"text-white/50 text-[10px] bg-black/50 backdrop-blur px-2 py-1 border border-white/10\">\n Left Click: Select • Ctrl+Click: Center & Select • Right Click: Pan •\n Scroll: Zoom • WASD/QE: Move\n </div>\n </div>\n </div>\n );\n};\n"],"names":["getCoordinates","point","x","y","z","PointCloud","points","onHover","onClick","meshRef","useRef","hoverRef","positions","useMemo","pos","i","p","colors","cols","color","THREE","jsxs","e","index","jsx","HighlightPoint","SelectedPoints","selectedIndices","idx","CameraController","controlsRef","targetPoint","camera","useThree","keys","setKeys","useState","isAnimating","useEffect","handleKeyDown","k","handleKeyUp","useFrame","state","delta","speed","forward","right","move","Umap3DExplorer","isLoading","error","onPointSelect","customGetImageUrl","className","hoveredPoint","setHoveredPoint","setSelectedIndices","cameraTarget","setCameraTarget","getImageUrl","type","handlePointClick","event","target","selectNearest","count","origin","ox","oy","oz","distances","px","py","pz","dx","dy","dz","a","b","nearest","d","Spinner","selectedIndex","selectedPoint","Canvas","OrbitControls","_","Button","X","ScatterChart","EyeIcon","ExternalLinkIcon"],"mappings":";;;;;;;;;;;AAgBA,MAAMA,IAAiB,CAACC,MAA6C;AACnE,MAAIC,IAAI,GACNC,IAAI,GACJC,IAAI;AAEN,SAAIH,EAAM,QAAQ,OAAOA,EAAM,QAAS,YACtCC,IAAKD,EAAM,KAAa,KAAK,GAC7BE,IAAKF,EAAM,KAAa,KAAK,GAC7BG,IAAKH,EAAM,KAAa,KAAK,MAE7BC,IAAID,EAAM,KAAK,GACfE,IAAIF,EAAM,KAAK,GACfG,IAAIH,EAAM,KAAK,IAGb,MAAMC,CAAC,MAAGA,IAAI,IACd,MAAMC,CAAC,MAAGA,IAAI,IACd,MAAMC,CAAC,MAAGA,IAAI,IAGX,EAAEF,IAAI,OAAO,KAAKC,IAAI,OAAO,KAAKC,IAAI,OAAO,EAAE;AACxD,GAEMC,IAAa,CAAC;AAAA,EAClB,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AACF,MAQM;AACJ,QAAMC,IAAUC,EAAqB,IAAI,GACnCC,IAAWD,EAAsB,IAAI,GAGrCE,IAAYC,EAAQ,MAAM;AAC9B,UAAMC,IAAM,IAAI,aAAaR,EAAO,SAAS,CAAC;AAC9C,aAASS,IAAI,GAAGA,IAAIT,EAAO,QAAQS,KAAK;AACtC,YAAMC,IAAIV,EAAOS,CAAC;AAClB,UAAI,CAACC,EAAG;AACR,YAAM,CAACd,GAAG,GAAGE,CAAC,IAAIJ,EAAegB,CAAC;AAClC,MAAAF,EAAIC,IAAI,CAAC,IAAIb,GACbY,EAAIC,IAAI,IAAI,CAAC,IAAI,GACjBD,EAAIC,IAAI,IAAI,CAAC,IAAIX;AAAA,IACnB;AACA,WAAOU;AAAA,EACT,GAAG,CAACR,CAAM,CAAC,GAELW,IAASJ,EAAQ,MAAM;AAC3B,UAAMK,IAAO,IAAI,aAAaZ,EAAO,SAAS,CAAC,GACzCa,IAAQ,IAAIC,EAAM,MAAA;AACxB,aAASL,IAAI,GAAGA,IAAIT,EAAO,QAAQS,KAAK;AACtC,YAAMC,IAAIV,EAAOS,CAAC;AAClB,UAAI,CAACC,EAAG;AACR,UAAId,IAAI,GACNC,IAAI,GACJC,IAAI;AACN,MAAIY,EAAE,QAAQ,OAAOA,EAAE,QAAS,YAC9Bd,IAAKc,EAAE,KAAa,KAAK,GACzBb,IAAKa,EAAE,KAAa,KAAK,GACzBZ,IAAKY,EAAE,KAAa,KAAK,MAEzBd,IAAIc,EAAE,KAAK,GACXb,IAAIa,EAAE,KAAK,GACXZ,IAAIY,EAAE,KAAK,IAGT,MAAMd,CAAC,MAAGA,IAAI,IACd,MAAMC,CAAC,MAAGA,IAAI,IACd,MAAMC,CAAC,MAAGA,IAAI,IAGlBe,EAAM,OAAOjB,GAAGC,GAAGC,CAAC,GACpBc,EAAKH,IAAI,CAAC,IAAII,EAAM,GACpBD,EAAKH,IAAI,IAAI,CAAC,IAAII,EAAM,GACxBD,EAAKH,IAAI,IAAI,CAAC,IAAII,EAAM;AAAA,IAC1B;AACA,WAAOD;AAAA,EACT,GAAG,CAACZ,CAAM,CAAC;AA4BX,SACE,gBAAAe;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKZ;AAAA,MACL,eA7BsB,CAACa,MAAgC;AACzD,QAAAA,EAAE,gBAAA;AACF,cAAMC,IAAQD,EAAE;AAChB,YAAIC,MAAU,UAAaA,MAAUZ,EAAS,YAC5CA,EAAS,UAAUY,GACfA,KAAS,KAAKA,IAAQjB,EAAO,SAAQ;AACvC,gBAAMU,IAAIV,EAAOiB,CAAK;AACtB,UAAIP,KAAGT,EAAQgB,GAAOP,CAAC;AAAA,QACzB;AAAA,MAEJ;AAAA,MAoBI,cAlBqB,CAACM,MAAgC;AACxD,QAAAX,EAAS,UAAU,MACnBJ,EAAQ,MAAM,IAAI;AAAA,MACpB;AAAA,MAgBI,SAdgB,CAACe,MAA8B;AACjD,QAAAA,EAAE,gBAAA;AACF,cAAMC,IAAQD,EAAE;AAChB,YAAIC,MAAU,UAAaA,KAAS,KAAKA,IAAQjB,EAAO,QAAQ;AAC9D,gBAAMU,IAAIV,EAAOiB,CAAK;AACtB,UAAIP,KAAGR,EAAQe,GAAOP,GAAGM,CAAC;AAAA,QAC5B;AAAA,MACF;AAAA,MASI,UAAA;AAAA,QAAA,gBAAAD,EAAC,kBAAA,EACC,UAAA;AAAA,UAAA,gBAAAG;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,QAAO;AAAA,cACP,OAAOZ,EAAU,SAAS;AAAA,cAC1B,OAAOA;AAAA,cACP,UAAU;AAAA,cACV,MAAM,CAACA,GAAW,CAAC;AAAA,YAAA;AAAA,UAAA;AAAA,UAErB,gBAAAY;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,QAAO;AAAA,cACP,OAAOP,EAAO,SAAS;AAAA,cACvB,OAAOA;AAAA,cACP,UAAU;AAAA,cACV,MAAM,CAACA,GAAQ,CAAC;AAAA,YAAA;AAAA,UAAA;AAAA,QAClB,GACF;AAAA,QACA,gBAAAO;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN,cAAY;AAAA,YACZ,iBAAe;AAAA,YACf,aAAW;AAAA,YACX,SAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MACX;AAAA,IAAA;AAAA,EAAA;AAGN,GAEMC,IAAiB,CAAC,EAAE,OAAAxB,QAAuC;AAC/D,MAAI,CAACA,EAAO,QAAO;AACnB,QAAMa,IAAMd,EAAeC,CAAK;AAEhC,SACE,gBAAAoB,EAAC,QAAA,EAAK,UAAUP,GACd,UAAA;AAAA,IAAA,gBAAAU,EAAC,oBAAe,MAAM,CAAC,MAAM,IAAI,EAAE,GAAG;AAAA,IACtC,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,UAAS;AAAA,QACT,mBAAmB;AAAA,QACnB,aAAW;AAAA,QACX,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EACX,GACF;AAEJ,GAEME,KAAiB,CAAC;AAAA,EACtB,QAAApB;AAAA,EACA,iBAAAqB;AACF,MAIM,CAACrB,KAAUqB,EAAgB,WAAW,IAAU,OAGlD,gBAAAH,EAAC,SAAA,EACE,UAAAG,EAAgB,IAAI,CAACC,MAAQ;AAC5B,QAAM3B,IAAQK,EAAOsB,CAAG;AACxB,MAAI,CAAC3B,EAAO,QAAO;AACnB,QAAMa,IAAMd,EAAeC,CAAK;AAEhC,SACE,gBAAAoB,EAAC,QAAA,EAAe,UAAUP,GACxB,UAAA;AAAA,IAAA,gBAAAU,EAAC,oBAAe,MAAM,CAAC,MAAM,IAAI,EAAE,GAAG;AAAA,IACtC,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,UAAS;AAAA,QACT,mBAAmB;AAAA,QACnB,aAAW;AAAA,QACX,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EACX,EAAA,GARSI,CASX;AAEJ,CAAC,EAAA,CACH,GAIEC,KAAmB,CAAC;AAAA,EACxB,aAAAC;AAAA,EACA,aAAAC;AACF,MAGM;AACJ,QAAM,EAAE,QAAAC,EAAA,IAAWC,EAAA,GACb,CAACC,GAAMC,CAAO,IAAIC,EAAkC,CAAA,CAAE,GACtDC,IAAc3B,EAAO,EAAK;AAEhC,SAAA4B,EAAU,MAAM;AACd,UAAMC,IAAgB,CAACjB,MACrBa,EAAQ,CAACK,OAAO,EAAE,GAAGA,GAAG,CAAClB,EAAE,IAAI,GAAG,KAAO,GACrCmB,IAAc,CAACnB,MACnBa,EAAQ,CAACK,OAAO,EAAE,GAAGA,GAAG,CAAClB,EAAE,IAAI,GAAG,KAAQ;AAC5C,kBAAO,iBAAiB,WAAWiB,CAAa,GAChD,OAAO,iBAAiB,SAASE,CAAW,GACrC,MAAM;AACX,aAAO,oBAAoB,WAAWF,CAAa,GACnD,OAAO,oBAAoB,SAASE,CAAW;AAAA,IACjD;AAAA,EACF,GAAG,CAAA,CAAE,GAELC,EAAS,CAACC,GAAOC,MAAU;AACzB,QAAI,CAACd,EAAY,QAAS;AAkB1B,QAfIC,MACoBD,EAAY,QAAQ,OACf,WAAWC,CAAW,IAEtC,OACTM,EAAY,UAAU,IAEtBP,EAAY,QAAQ,OAAO,KAAKC,GAAaa,IAAQ,CAAC,KAEtDP,EAAY,UAAU,KAKT,OAAO,OAAOH,CAAI,EAAE,KAAK,CAACM,MAAMA,CAAC,GACpC;AACZ,MAAAH,EAAY,UAAU;AACtB,YAAMQ,KAASX,EAAK,aAAgBA,EAAK,aAAgB,KAAK,KAAKU,GAC7DE,IAAU,IAAI1B,EAAM,QAAA;AAC1B,MAAAY,EAAO,kBAAkBc,CAAO;AAEhC,YAAMC,IAAQ,IAAI3B,EAAM,QAAA;AACxB,MAAA2B,EAAM,aAAaD,GAASd,EAAO,EAAE,EAAE,UAAA;AAEvC,YAAMgB,IAAO,IAAI5B,EAAM,QAAA;AAEvB,OAAIc,EAAK,QAAWA,EAAK,YAAYc,EAAK,IAAIF,CAAO,IACjDZ,EAAK,QAAWA,EAAK,cAAcc,EAAK,IAAIF,CAAO,IACnDZ,EAAK,QAAWA,EAAK,cAAcc,EAAK,IAAID,CAAK,IACjDb,EAAK,QAAWA,EAAK,eAAec,EAAK,IAAID,CAAK,GAGlDb,EAAK,SAASc,EAAK,KAAK,IACxBd,EAAK,SAASc,EAAK,KAAK,IAExBA,EAAK,SAAA,IAAa,MACpBA,EAAK,UAAA,EAAY,eAAeH,CAAK,GACrCb,EAAO,SAAS,IAAIgB,CAAI,GACxBlB,EAAY,QAAQ,OAAO,IAAIkB,CAAI;AAAA,IAEvC;AAAA,EACF,CAAC,GAEM;AACT,GAEaC,KAAiB,CAAC;AAAA,EAC7B,QAAA3C,IAAS,CAAA;AAAA,EACT,WAAA4C,IAAY;AAAA,EACZ,OAAAC,IAAQ;AAAA,EACR,eAAAC;AAAA,EACA,aAAaC;AAAA,EACb,WAAAC;AACF,MAAuB;AACrB,QAAM,CAACC,GAAcC,CAAe,IAAIpB,EAAyB,IAAI,GAC/D,CAACT,GAAiB8B,CAAkB,IAAIrB,EAAmB,CAAA,CAAE,GAC7D,CAACsB,GAAcC,CAAe,IAAIvB,EAA+B,IAAI,GACrEN,IAAcpB,EAAY,IAAI,GAE9BkD,IAAc,CAAC3D,GAAgB4D,IAAyB,YACxDR,IAA0BA,EAAkBpD,GAAO4D,CAAI,IAGvDA,MAAS,UACP5D,EAAM,YAAkBA,EAAM,YAC9BA,EAAM,YAAY,WAAW,MAAM,IAAUA,EAAM,aAChDA,EAAM,WACT,8BAA8BA,EAAM,QAAQ,KAC5C,KAEAA,EAAM,YAAkBA,EAAM,YAC3BA,EAAM,WAAW,wBAAwBA,EAAM,QAAQ,KAAK,IAIjE6D,IAAmB,CACvBvC,GACAtB,GACA8D,MACG;AAEH,QAAIA,MAAUA,EAAM,WAAWA,EAAM,UAAU;AAC7C,YAAM,CAAC7D,GAAGC,GAAGC,CAAC,IAAIJ,EAAeC,CAAK,GAChC+D,IAAS,IAAI5C,EAAM,QAAQlB,GAAGC,GAAGC,CAAC;AACxC,MAAAuD,EAAgBK,CAAM,GAEtBP,EAAmB,CAAClC,CAAK,CAAC,GACtB6B,OAA6BnD,CAAK;AACtC;AAAA,IACF;AAGA,IAAAwD,EAAmB,CAAClC,CAAK,CAAC,GACtB6B,OAA6BnD,CAAK;AAAA,EACxC,GAEMgE,IAAgB,CAAC1C,GAAe2C,IAAgB,OAAO;AAC3D,QAAI,CAAC5D,EAAQ;AACb,UAAM6D,IAAS7D,EAAOiB,CAAK;AAC3B,QAAI,CAAC4C,EAAQ;AAEb,UAAM,CAACC,GAAIC,GAAIC,CAAE,IAAItE,EAAemE,CAAM,GAGpCI,IAAYjE,EAAO,IAAI,CAACU,GAAYD,MAAc;AACtD,YAAM,CAACyD,GAAIC,GAAIC,CAAE,IAAI1E,EAAegB,CAAC,GAC/B2D,IAAKH,IAAKJ,GACVQ,IAAKH,IAAKJ,GACVQ,IAAKH,IAAKJ;AAChB,aAAO,EAAE,GAAAvD,GAAG,GAAG4D,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,EAAA;AAAA,IAC1C,CAAC;AACD,IAAAN,EAAU,KAAK,CAACO,GAAQC,MAAWD,EAAE,IAAIC,EAAE,CAAC;AAC5C,UAAMC,IAAUT,EAAU,MAAM,GAAGL,CAAK,EAAE,IAAI,CAACe,MAAWA,EAAE,CAAC;AAC7D,IAAAxB,EAAmBuB,CAAO;AAAA,EAC5B;AAEA,MAAI9B;AACF,WACE,gBAAA7B,EAAC,OAAA,EAAI,WAAU,iEACb,UAAA;AAAA,MAAA,gBAAAG,EAAC0D,GAAA,EAAQ,WAAU,uBAAA,CAAuB;AAAA,MAC1C,gBAAA1D,EAAC,KAAA,EAAE,WAAU,uCAAsC,UAAA,4BAAA,CAEnD;AAAA,IAAA,GACF;AAIJ,MAAI2B;AACF,WACE,gBAAA9B,EAAC,OAAA,EAAI,WAAU,mEAAkE,UAAA;AAAA,MAAA;AAAA,MACtD8B,EAAgB;AAAA,IAAA,GAC3C;AAIJ,MAAI,CAAC7C,KAAUA,EAAO,WAAW;AAC/B,WACE,gBAAAkB,EAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,qBAEtF;AAIJ,QAAM2D,IACJxD,EAAgB,WAAW,IAAIA,EAAgB,CAAC,IAAI,QAChDyD,IACJD,MAAkB,SAAY7E,EAAO6E,CAAa,IAAI;AAExD,SACE,gBAAA9D;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,gEACTiC,KAAa,EACf;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAjC;AAAA,UAACgE;AAAA,UAAA;AAAA,YACC,QAAQ,EAAE,UAAU,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,GAAA;AAAA,YACrC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,KAAA,IAAO;AAAA,YAEnD,UAAA;AAAA,cAAA,gBAAA7D,EAAC,OAAA,EAAI,QAAO,OAAM,MAAM,CAAC,WAAW,IAAI,EAAE,GAAG;AAAA,cAE7C,gBAAAA,EAAC,gBAAA,EAAa,WAAW,IAAA,CAAK;AAAA,gCAC7B,cAAA,EAAW,UAAU,CAAC,IAAI,IAAI,EAAE,GAAG;AAAA,cAEpC,gBAAAA;AAAA,gBAAC8D;AAAA,gBAAA;AAAA,kBACC,KAAKxD;AAAA,kBACL,eAAa;AAAA,kBACb,eAAe;AAAA,kBACf,aAAa;AAAA,kBACb,WAAW;AAAA,kBACX,aAAa;AAAA,kBACb,aAAa;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGf,gBAAAN;AAAA,gBAACK;AAAA,gBAAA;AAAA,kBACC,aAAAC;AAAA,kBACA,aAAa4B;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGf,gBAAAlC;AAAA,gBAACnB;AAAA,gBAAA;AAAA,kBACC,QAAAC;AAAA,kBACA,SAAS,CAACiF,GAAGtF,MAAUuD,EAAgBvD,CAAK;AAAA,kBAC5C,SAAS6D;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGX,gBAAAtC,EAACC,GAAA,EAAe,OAAO8B,EAAA,CAAc;AAAA,cACrC,gBAAA/B,EAACE,IAAA,EAAe,QAAApB,GAAgB,iBAAAqB,EAAA,CAAkC;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,0BAGnE,OAAA,EAAI,WAAU,6CACb,UAAA,gBAAAN,EAAC,OAAA,EAAI,WAAU,iFACZ,UAAA;AAAA,UAAAf,EAAO,OAAO,eAAA;AAAA,UAAiB;AAAA,QAAA,EAAA,CAClC,EAAA,CACF;AAAA,QAGC8E,KAAiBD,MAAkB,UAClC,gBAAA9D,EAAC,OAAA,EAAI,WAAU,+FACb,UAAA;AAAA,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,MAAM;AACb,gBAAI+B,OAA6BgC,CAAa;AAAA,cAChD;AAAA,cAEA,UAAA;AAAA,gBAAA,gBAAA5D;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAKoC,EAAYwB,GAAe,OAAO;AAAA,oBACvC,KAAK,SAASD,CAAa;AAAA,oBAC3B,WAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEZ,gBAAA3D;AAAA,kBAACgE;AAAA,kBAAA;AAAA,oBACC,SAAS,CAAClE,MAAM;AACd,sBAAAA,EAAE,gBAAA,GACFmC,EAAmB,CAAA,CAAE;AAAA,oBACvB;AAAA,oBACA,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,WAAU;AAAA,oBAEV,UAAA,gBAAAjC,EAACiE,GAAA,EAAE,WAAU,UAAA,CAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEzB,gBAAAjE;AAAA,kBAACgE;AAAA,kBAAA;AAAA,oBACC,SAAS,CAAClE,MAAM;AACd,sBAAAA,EAAE,gBAAA,GACF2C,EAAckB,CAAa;AAAA,oBAC7B;AAAA,oBACA,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,OAAM;AAAA,oBAEN,UAAA,gBAAA3D,EAACkE,GAAA,EAAa,WAAU,eAAA,CAAe;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACzC;AAAA,YAAA;AAAA,UAAA;AAAA,4BAED,OAAA,EAAI,WAAU,6CACb,UAAA,gBAAArE,EAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,YAAA,gBAAAG;AAAA,cAACgE;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,QAAQ;AAAA,gBAAA;AAAA,gBAEV,SAAS,MAAM;AACb,kBAAIpC,OAA6BgC,CAAa;AAAA,gBAChD;AAAA,gBAEA,UAAA,gBAAA5D,EAACmE,GAAA,EAAQ,WAAU,MAAA,CAAM;AAAA,cAAA;AAAA,YAAA;AAAA,YAE3B,gBAAAnE,EAACgE,GAAA,EAAO,SAAQ,SAAQ,SAAO,IAC7B,UAAA,gBAAAhE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAMoC,EAAYwB,GAAe,MAAM;AAAA,gBACvC,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,QAAQ;AAAA,gBAAA;AAAA,gBAGV,UAAA,gBAAA5D,EAACoE,GAAA,EAAiB,WAAU,MAAA,CAAM;AAAA,cAAA;AAAA,YAAA,EACpC,CACF;AAAA,UAAA,EAAA,CACF,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAIDjE,EAAgB,SAAS,KAAKrB,KAC7B,gBAAAe,EAAC,OAAA,EAAI,WAAU,yHACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,uBACb,UAAA;AAAA,cAAAM,EAAgB;AAAA,cAAO;AAAA,YAAA,GAC1B;AAAA,YACA,gBAAAH;AAAA,cAACgE;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM/B,EAAmB,EAAE;AAAA,gBACpC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,WAAU;AAAA,gBACX,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAED,GACF;AAAA,UACA,gBAAAjC,EAAC,OAAA,EAAI,WAAU,8CACZ,UAAAG,EAAgB,MAAM,GAAG,GAAG,EAAE,IAAI,CAACC,MAAQ;AAC1C,kBAAM3B,IAAQK,EAAOsB,CAAG;AACxB,mBAAK3B,IAEH,gBAAAuB;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,SAAS,MAAM;AACb,kBAAAiC,EAAmB,CAAC7B,CAAG,CAAC,GACpBwB,OAA6BnD,CAAK;AAAA,gBACxC;AAAA,gBACA,cAAc,MAAMuD,EAAgBvD,CAAK;AAAA,gBACzC,cAAc,MAAMuD,EAAgB,IAAI;AAAA,gBAExC,UAAA,gBAAAhC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAKoC,EAAY3D,GAAO,OAAO;AAAA,oBAC/B,KAAI;AAAA,oBACJ,WAAU;AAAA,oBACV,SAAQ;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACV;AAAA,cAdK2B;AAAA,YAAA,IAHU;AAAA,UAoBrB,CAAC,EAAA,CACH;AAAA,QAAA,GACF;AAAA,QAGF,gBAAAJ,EAAC,SAAI,WAAU,qEACb,4BAAC,OAAA,EAAI,WAAU,yFAAwF,UAAA,qGAAA,CAGvG,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -1,16 +0,0 @@
1
- export interface Point3D {
2
- id: number | string;
3
- x: number;
4
- y: number;
5
- z: number;
6
- [key: string]: any;
7
- }
8
- export interface Explorer3DProps<T extends Point3D = Point3D> {
9
- points?: T[];
10
- isLoading?: boolean;
11
- error?: Error | null;
12
- onPointSelect?: (point: T) => void;
13
- getImageUrl?: (point: T, type: "thumb" | "full") => string;
14
- className?: string;
15
- }
16
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/explorers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IAC1D,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,KAAK,MAAM,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}