visualifyjs 2.5.3 → 3.0.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 (252) hide show
  1. package/.claude/mem/TIMELINE.md +36 -0
  2. package/.claude/mem/notes/2026-02-11-3d-visualization-docs-fix-external-script-solution.md +24 -0
  3. package/.claude/mem/notes/2026-02-11-3d-visualization-docs-fix-session-summary.md +43 -0
  4. package/.claude/mem/notes/2026-02-11-cli-fix-editor-command-alias.md +26 -0
  5. package/.claude/mem/notes/2026-02-11-phase-3-developer-experience-completed.md +51 -0
  6. package/.claude/mem/notes/2026-02-11-phase-4-web-workers-implementation-complete.md +59 -0
  7. package/.claude/mem/notes/2026-02-11-visualify-phase-2-3d-visualization-complete.md +50 -0
  8. package/.claude/mem/notes/2026-02-11-visualify-phase-2-committed-ready-for-phase-3.md +33 -0
  9. package/.claude/mem/notes/2026-02-11-visualify-phase-3-complete-developer-experience.md +52 -0
  10. package/.claude/mem/notes/2026-02-11-visualify-repository-cleanup-complete.md +28 -0
  11. package/.claude/mem/notes/2026-02-18-codebase-cleanup-docsify-plugin-documentation.md +37 -0
  12. package/.claude/mem/notes/2026-02-19-css-grid-layout-fix-displaycontents-on-vcontroller.md +18 -0
  13. package/.claude/mem/notes/2026-02-19-docsify-plugin-fixes-latex-and-visualify-code-bloc.md +26 -0
  14. package/.claude/mem/notes/2026-02-19-page-mode-docs-update-decisions.md +23 -0
  15. package/.claude/mem/notes/2026-02-19-react-context-infinite-re-render-loop-fix-pattern.md +31 -0
  16. package/.claude/mem/notes/2026-02-19-version-300-bump-and-build-fixes.md +32 -0
  17. package/.claude/mem/notes/2026-02-19-visualify-build-deployment-architecture-bug-fixes.md +25 -0
  18. package/.claude/mem/notes/2026-02-19-visualify-dist-iife-self-contained-build-config.md +30 -0
  19. package/.claude/mem/notes/2026-02-19-visualify-infinite-loop-i18n-fixes.md +31 -0
  20. package/.claude/mem/notes/2026-02-19-visualify-v3-bundle-splitting-docs-restructuring.md +32 -0
  21. package/.claude/mem/notes/2026-02-20-bundle-externalization-final-architecture.md +29 -0
  22. package/.claude/mem/notes/2026-02-20-chromium-page-fix-unstable-keys-and-double-event-b.md +27 -0
  23. package/.claude/mem/notes/2026-02-20-console-cleanup-bundle-optimization-commit.md +20 -0
  24. package/.claude/mem/notes/2026-02-20-dotbio-dot-plot-fix-useeffect-dependency.md +21 -0
  25. package/.claude/mem/notes/2026-02-20-public-folder-cleanup-and-readme-rewrite.md +25 -0
  26. package/.claude/mem/notes/2026-02-20-v300-release-and-beta-channel-strategy.md +29 -0
  27. package/.claude/mem/notes/2026-02-20-visium-background-image-unknown-legend-fix.md +19 -0
  28. package/.claude/mem/notes/2026-02-20-visualify-cdn-loader-bundle-externalization.md +34 -0
  29. package/.claude/mem/sessions/session-2026-02-20-031524.md +54 -0
  30. package/.claude/settings.local.json +21 -0
  31. package/.github/workflows/static.yml.bak +51 -51
  32. package/.sisyphus/boulder.json +65 -0
  33. package/.sisyphus/plans/phase-4-advanced-optimizations.md +217 -0
  34. package/LICENSE +674 -674
  35. package/README.md +94 -59
  36. package/config-overrides.js +31 -31
  37. package/dist/stats.html +4949 -0
  38. package/dist/visualify-3d.esm.js +1 -0
  39. package/dist/visualify-3d.js +1 -0
  40. package/dist/visualify-core.esm.js +1 -0
  41. package/dist/visualify-core.js +1 -0
  42. package/dist/visualify-docs.esm.js +1 -0
  43. package/dist/visualify-docs.js +1 -0
  44. package/dist/visualify-loader.js +1 -0
  45. package/dist/visualify-pages.esm.js +1 -0
  46. package/dist/visualify-pages.js +1 -0
  47. package/dist/visualify-portal.esm.js +1 -0
  48. package/dist/visualify-portal.js +1 -0
  49. package/dist/visualify-shared.js +26571 -0
  50. package/dist/visualify.js +1 -188
  51. package/docs/CHANGELOG.md +148 -0
  52. package/docs/cli/commands.md +513 -0
  53. package/docs/configuration/visualify-json.md +474 -0
  54. package/docs/docs/3d-visualization.md +374 -0
  55. package/docs/docs/CLI.md +303 -34
  56. package/docs/docs/README.md +65 -65
  57. package/docs/docs/Rechart/bar.md +190 -190
  58. package/docs/docs/Rechart/funnel.md +241 -193
  59. package/docs/docs/Rechart/line.md +355 -355
  60. package/docs/docs/Rechart/pie.md +225 -225
  61. package/docs/docs/Rechart/radar.md +253 -253
  62. package/docs/docs/Rechart/scatter.md +298 -0
  63. package/docs/docs/_404.md +51 -51
  64. package/docs/docs/_coverpage.md +11 -11
  65. package/docs/docs/_sidebar.md +54 -43
  66. package/docs/docs/components/dotBio.md +87 -34
  67. package/docs/docs/components/echart.md +171 -82
  68. package/docs/docs/components/html.md +61 -34
  69. package/docs/docs/components/macaron.md +156 -145
  70. package/docs/docs/components/markdown.md +42 -0
  71. package/docs/docs/components/more.md +183 -142
  72. package/docs/docs/components/plotly.md +132 -62
  73. package/docs/docs/components/scatterL.md +171 -70
  74. package/docs/docs/components/visium.md +112 -57
  75. package/docs/docs/configuration.md +121 -123
  76. package/docs/docs/deploy.md +31 -31
  77. package/docs/docs/docsify-plugin.md +655 -0
  78. package/docs/docs/hmr.md +165 -0
  79. package/docs/docs/i18n.md +332 -0
  80. package/docs/docs/log.md +30 -1
  81. package/docs/docs/more-pages.md +23 -23
  82. package/docs/docs/quickstart.md +148 -119
  83. package/docs/docs/rechart-attributes.md +74 -74
  84. package/docs/docs/rechart-basic-usage.md +160 -162
  85. package/docs/docs/theme.md +5 -5
  86. package/docs/docs/typescript.md +306 -0
  87. package/docs/docs/visual-editor.md +359 -0
  88. package/docs/index.html +85 -71
  89. package/docs/manifest.json +23 -23
  90. package/docs/migration/v3-migration.md +392 -0
  91. package/docs/static/css/fluff-stuff.css +169 -169
  92. package/docs/static/css/font-awesome.min.css +4 -4
  93. package/docs/static/css/visualify.css +6 -25
  94. package/docs/static/js/3d-viz-examples.js +181 -0
  95. package/docs/static/js/configuration.js +630 -448
  96. package/docs/static/js/visualify.js +1 -188
  97. package/package.json +106 -84
  98. package/rollup.config.mjs +766 -76
  99. package/src/_css/404.css +115 -115
  100. package/src/_css/App.css +37 -37
  101. package/src/_css/autoSuggestion.css +26 -26
  102. package/src/_css/circular-progress.css +32 -32
  103. package/src/_css/index.css +36 -36
  104. package/src/_css/modern.css +350 -25
  105. package/src/_media/corner.svg +8 -8
  106. package/src/_media/download.svg +3 -3
  107. package/src/_media/logo.svg +14 -14
  108. package/src/_test/App.test.js +15 -15
  109. package/src/_utils/reportWebVitals.js +13 -13
  110. package/src/a11y/README.md +177 -0
  111. package/src/a11y/aria-labels.js +339 -0
  112. package/src/a11y/color-contrast.js +535 -0
  113. package/src/a11y/index.js +197 -0
  114. package/src/a11y/keyboard-nav.js +523 -0
  115. package/src/a11y/styles.css +165 -0
  116. package/src/cli/commands/dev.js +214 -0
  117. package/src/cli/commands/docs.js +521 -0
  118. package/src/cli/commands/edit.js +379 -0
  119. package/src/cli/commands/init.js +213 -0
  120. package/src/cli/commands/portal.js +236 -0
  121. package/src/cli/dev-server.js +530 -0
  122. package/src/cli/hmr.js +456 -0
  123. package/src/cli/index.js +180 -0
  124. package/src/cli/utils/config.js +207 -0
  125. package/src/cli/utils/logger.js +241 -0
  126. package/src/config/defaults.ts +122 -0
  127. package/src/config/index.ts +72 -0
  128. package/src/config/loader.ts +478 -0
  129. package/src/config/schema.ts +227 -0
  130. package/src/config/validator.ts +337 -0
  131. package/src/core/appContext.js +34 -27
  132. package/src/core/components/Bar.js +383 -0
  133. package/src/core/components/Bar3D.js +473 -0
  134. package/src/core/components/LargeDatasetChart.js +296 -0
  135. package/src/core/components/Line3D.js +310 -0
  136. package/src/core/components/Scatter.js +392 -188
  137. package/src/core/components/Scatter3D.js +455 -0
  138. package/src/core/components/ScatterBio.js +601 -572
  139. package/src/core/components/Surface3D.js +326 -0
  140. package/src/core/components/ThreeCustom.js +648 -0
  141. package/src/core/components/ThreeScene.js +459 -0
  142. package/src/core/components/VisiumPlot.js +191 -165
  143. package/src/core/components/browser.js +42 -42
  144. package/src/core/components/dotplot.js +413 -413
  145. package/src/core/components/html.js +29 -29
  146. package/src/core/components/list.js +178 -178
  147. package/src/core/components/macaron.js +206 -201
  148. package/src/core/components/markdown.js +56 -56
  149. package/src/core/components/parser.scatterBio.js +582 -579
  150. package/src/core/components/ratio.js +82 -80
  151. package/src/core/components/scatterL.js +206 -173
  152. package/src/core/components/searchbar.js +156 -131
  153. package/src/core/components/selection.js +310 -193
  154. package/src/core/components/timeline.js +236 -281
  155. package/src/core/components/visium.js +114 -97
  156. package/src/core/data-processor.js +413 -0
  157. package/src/core/fetch/condfetch.js +82 -82
  158. package/src/core/fetch/fetch.js +92 -92
  159. package/src/core/fetch/json.js +29 -29
  160. package/src/core/fetch/vfetch.js +42 -42
  161. package/src/core/hmr-client.js +724 -0
  162. package/src/core/liveEditor.js +44 -44
  163. package/src/core/modules/codeEditorWithPreview.js +104 -104
  164. package/src/core/modules/echarts/common.js +20 -20
  165. package/src/core/modules/echarts/gl.js +228 -0
  166. package/src/core/modules/echarts/presetHandler.js +41 -41
  167. package/src/core/modules/echarts/presets/esodev.chromium.js +172 -172
  168. package/src/core/modules/echarts/presets/esodev.codex.js +130 -130
  169. package/src/core/modules/echarts/presets/esodev.visium.js +123 -123
  170. package/src/core/modules/echarts/presets/mmtrbc.js +186 -186
  171. package/src/core/modules/echarts.js +70 -71
  172. package/src/core/modules/echartsUtils.js +43 -43
  173. package/src/core/modules/echartswitcher.js +227 -152
  174. package/src/core/modules/replotly/presetHandler.js +24 -24
  175. package/src/core/modules/replotly/presets/minimum.js +18 -18
  176. package/src/core/modules/replotly/presets/mmtrbc.dot.js +114 -114
  177. package/src/core/modules/replotly/presets/mmtrbc.violin.js +100 -100
  178. package/src/core/modules/replotly.js +74 -71
  179. package/src/core/modules/threejs/Camera.js +373 -0
  180. package/src/core/modules/threejs/Lighting.js +459 -0
  181. package/src/core/modules/threejs/Renderer.js +364 -0
  182. package/src/core/modules/threejs/Scene.js +266 -0
  183. package/src/core/modules/threejs/index.js +155 -0
  184. package/src/core/pages/404.js +50 -50
  185. package/src/core/pages/error.js +27 -27
  186. package/src/core/pages/jsonPage.js +62 -62
  187. package/src/core/pages/loading.js +44 -44
  188. package/src/core/parser/echart.data.js +204 -183
  189. package/src/core/parser/echart.features.js +125 -125
  190. package/src/core/parser/echart.general.js +147 -143
  191. package/src/core/parser/echart.hilbert.js +57 -57
  192. package/src/core/parser/echart.parser.js +210 -210
  193. package/src/core/parser/echart.series.js +67 -67
  194. package/src/core/parser/echart.types.js +76 -76
  195. package/src/core/parser/plotly.config.js +10 -10
  196. package/src/core/parser/plotly.data.js +132 -132
  197. package/src/core/parser/plotly.layout.js +9 -9
  198. package/src/core/parser/plotly.violin.js +18 -18
  199. package/src/core/recharts.js +361 -62
  200. package/src/core/router/alias.js +49 -49
  201. package/src/core/router/jsonRouter.js +31 -31
  202. package/src/core/themes/modern.js +32 -32
  203. package/src/core/themes/themeSelector.js +33 -33
  204. package/src/core/visualify.js +213 -47
  205. package/src/core/widgets/circularProgress.js +23 -23
  206. package/src/core/widgets/controller.js +116 -83
  207. package/src/core/widgets/errorBoundary.js +36 -36
  208. package/src/core/widgets/footer.js +185 -177
  209. package/src/core/widgets/header.js +238 -234
  210. package/src/core/widgets/layout/Grid.js +31 -31
  211. package/src/core/widgets/layout.js +36 -36
  212. package/src/core/widgets/mapping.js +56 -42
  213. package/src/core/workers/data-worker.js +349 -0
  214. package/src/core/workers/worker-pool.js +396 -0
  215. package/src/docsify/bundle.js +215 -0
  216. package/src/docsify/markdown.js +271 -0
  217. package/src/docsify/plugin.js +268 -0
  218. package/src/editor/README.md +172 -0
  219. package/src/editor/components/ChartBuilder.jsx +341 -0
  220. package/src/editor/components/ChartTypeSidebar.jsx +91 -0
  221. package/src/editor/components/Editor.jsx +367 -0
  222. package/src/editor/components/Preview.jsx +446 -0
  223. package/src/editor/components/PropertyPanel.jsx +468 -0
  224. package/src/editor/components/StatusBar.jsx +85 -0
  225. package/src/editor/context/EditorContext.js +248 -0
  226. package/src/editor/hooks/useDebounce.js +32 -0
  227. package/src/editor/index.js +315 -0
  228. package/src/editor/styles/editor.css +637 -0
  229. package/src/editor/utils/chartValidator.js +263 -0
  230. package/src/entries/charts3d.js +70 -0
  231. package/src/entries/core.js +78 -0
  232. package/src/entries/docs.js +154 -0
  233. package/src/entries/pages.js +93 -0
  234. package/src/entries/portal.js +204 -0
  235. package/src/entries/shared.js +50 -0
  236. package/src/i18n/formatters.js +455 -0
  237. package/src/i18n/index.js +169 -0
  238. package/src/i18n/locales/ar.json +137 -0
  239. package/src/i18n/locales/de.json +137 -0
  240. package/src/i18n/locales/en.json +137 -0
  241. package/src/i18n/locales/es.json +137 -0
  242. package/src/i18n/locales/he.json +137 -0
  243. package/src/i18n/locales/zh.json +137 -0
  244. package/src/i18n/rtl.css +183 -0
  245. package/src/index.js +82 -62
  246. package/src/loader.js +103 -0
  247. package/src/setupTests.js +5 -5
  248. package/tsconfig.json +51 -0
  249. package/types/charts.d.ts +569 -0
  250. package/types/components.d.ts +441 -0
  251. package/types/config.d.ts +199 -0
  252. package/types/index.d.ts +353 -0
@@ -0,0 +1 @@
1
+ import*as e from"three";import{Vector3 as t,Color as r,Loader as a,FileLoader as o,Group as n,BufferGeometry as i,Float32BufferAttribute as s,LineBasicMaterial as c,Material as l,PointsMaterial as d,MeshPhongMaterial as h,LineSegments as f,Points as u,Mesh as p}from"three";import m,{forwardRef as g,useRef as y,useEffect as b,isValidElement as v,useState as w,useCallback as x,useMemo as _,useImperativeHandle as E}from"react";import A from"echarts-for-react";import{Canvas as T,useThree as C,useFrame as S}from"@react-three/fiber";import{OrbitControls as I,FlyControls as D,TrackballControls as L,Bounds as M,Center as k,useGLTF as R}from"@react-three/drei";function z(){return z=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)({}).hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},z.apply(null,arguments)}const $=g((({options:e,style:t,onEvents:r={}},a)=>{const o=y(null),n=a||o;return b((()=>{if(n.current){const t=n.current.getEchartsInstance();t.setOption({...e,silent:!0}),JSON.stringify(e)!==JSON.stringify(t.getOption())&&(t.clear(),t.setOption(e)),Object.keys(r).forEach((e=>{t.off(e),t.on(e,r[e])}));const a=new ResizeObserver((()=>{t.resize()})),o=t.getDom().parentElement;return o&&a.observe(o),()=>{a.disconnect(),t.isDisposed()||(t.off(),t.dispose())}}}),[e,n,r]),m.createElement(A,{ref:n,option:e,style:t})}));!function(e){if(!e||"undefined"==typeof document)return;let t=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t.firstChild?t.insertBefore(r,t.firstChild):t.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}(':root{--toastify-color-light: #fff;--toastify-color-dark: #121212;--toastify-color-info: #3498db;--toastify-color-success: #07bc0c;--toastify-color-warning: #f1c40f;--toastify-color-error: hsl(6, 78%, 57%);--toastify-color-transparent: rgba(255, 255, 255, .7);--toastify-icon-color-info: var(--toastify-color-info);--toastify-icon-color-success: var(--toastify-color-success);--toastify-icon-color-warning: var(--toastify-color-warning);--toastify-icon-color-error: var(--toastify-color-error);--toastify-container-width: fit-content;--toastify-toast-width: 320px;--toastify-toast-offset: 16px;--toastify-toast-top: max(var(--toastify-toast-offset), env(safe-area-inset-top));--toastify-toast-right: max(var(--toastify-toast-offset), env(safe-area-inset-right));--toastify-toast-left: max(var(--toastify-toast-offset), env(safe-area-inset-left));--toastify-toast-bottom: max(var(--toastify-toast-offset), env(safe-area-inset-bottom));--toastify-toast-background: #fff;--toastify-toast-padding: 14px;--toastify-toast-min-height: 64px;--toastify-toast-max-height: 800px;--toastify-toast-bd-radius: 6px;--toastify-toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1);--toastify-font-family: sans-serif;--toastify-z-index: 9999;--toastify-text-color-light: #757575;--toastify-text-color-dark: #fff;--toastify-text-color-info: #fff;--toastify-text-color-success: #fff;--toastify-text-color-warning: #fff;--toastify-text-color-error: #fff;--toastify-spinner-color: #616161;--toastify-spinner-color-empty-area: #e0e0e0;--toastify-color-progress-light: linear-gradient(to right, #4cd964, #5ac8fa, #007aff, #34aadc, #5856d6, #ff2d55);--toastify-color-progress-dark: #bb86fc;--toastify-color-progress-info: var(--toastify-color-info);--toastify-color-progress-success: var(--toastify-color-success);--toastify-color-progress-warning: var(--toastify-color-warning);--toastify-color-progress-error: var(--toastify-color-error);--toastify-color-progress-bgo: .2}.Toastify__toast-container{z-index:var(--toastify-z-index);-webkit-transform:translate3d(0,0,var(--toastify-z-index));position:fixed;width:var(--toastify-container-width);box-sizing:border-box;color:#fff;display:flex;flex-direction:column}.Toastify__toast-container--top-left{top:var(--toastify-toast-top);left:var(--toastify-toast-left)}.Toastify__toast-container--top-center{top:var(--toastify-toast-top);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--top-right{top:var(--toastify-toast-top);right:var(--toastify-toast-right);align-items:end}.Toastify__toast-container--bottom-left{bottom:var(--toastify-toast-bottom);left:var(--toastify-toast-left)}.Toastify__toast-container--bottom-center{bottom:var(--toastify-toast-bottom);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--bottom-right{bottom:var(--toastify-toast-bottom);right:var(--toastify-toast-right);align-items:end}.Toastify__toast{--y: 0;position:relative;touch-action:none;width:var(--toastify-toast-width);min-height:var(--toastify-toast-min-height);box-sizing:border-box;margin-bottom:1rem;padding:var(--toastify-toast-padding);border-radius:var(--toastify-toast-bd-radius);box-shadow:var(--toastify-toast-shadow);max-height:var(--toastify-toast-max-height);font-family:var(--toastify-font-family);z-index:0;display:flex;flex:1 auto;align-items:center;word-break:break-word}@media only screen and (max-width: 480px){.Toastify__toast-container{width:100vw;left:env(safe-area-inset-left);margin:0}.Toastify__toast-container--top-left,.Toastify__toast-container--top-center,.Toastify__toast-container--top-right{top:env(safe-area-inset-top);transform:translate(0)}.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-right{bottom:env(safe-area-inset-bottom);transform:translate(0)}.Toastify__toast-container--rtl{right:env(safe-area-inset-right);left:initial}.Toastify__toast{--toastify-toast-width: 100%;margin-bottom:0;border-radius:0}}.Toastify__toast-container[data-stacked=true]{width:var(--toastify-toast-width)}.Toastify__toast--stacked{position:absolute;width:100%;transform:translate3d(0,var(--y),0) scale(var(--s));transition:transform .3s}.Toastify__toast--stacked[data-collapsed] .Toastify__toast-body,.Toastify__toast--stacked[data-collapsed] .Toastify__close-button{transition:opacity .1s}.Toastify__toast--stacked[data-collapsed=false]{overflow:visible}.Toastify__toast--stacked[data-collapsed=true]:not(:last-child)>*{opacity:0}.Toastify__toast--stacked:after{content:"";position:absolute;left:0;right:0;height:calc(var(--g) * 1px);bottom:100%}.Toastify__toast--stacked[data-pos=top]{top:0}.Toastify__toast--stacked[data-pos=bot]{bottom:0}.Toastify__toast--stacked[data-pos=bot].Toastify__toast--stacked:before{transform-origin:top}.Toastify__toast--stacked[data-pos=top].Toastify__toast--stacked:before{transform-origin:bottom}.Toastify__toast--stacked:before{content:"";position:absolute;left:0;right:0;bottom:0;height:100%;transform:scaleY(3);z-index:-1}.Toastify__toast--rtl{direction:rtl}.Toastify__toast--close-on-click{cursor:pointer}.Toastify__toast-icon{margin-inline-end:10px;width:22px;flex-shrink:0;display:flex}.Toastify--animate{animation-fill-mode:both;animation-duration:.5s}.Toastify--animate-icon{animation-fill-mode:both;animation-duration:.3s}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--light,.Toastify__toast-theme--colored.Toastify__toast--default{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{color:var(--toastify-text-color-info);background:var(--toastify-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{color:var(--toastify-text-color-success);background:var(--toastify-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{color:var(--toastify-text-color-warning);background:var(--toastify-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{color:var(--toastify-text-color-error);background:var(--toastify-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error{background:var(--toastify-color-transparent)}.Toastify__close-button{color:#fff;position:absolute;top:6px;right:6px;background:transparent;outline:none;border:none;padding:0;cursor:pointer;opacity:.7;transition:.3s ease;z-index:1}.Toastify__toast--rtl .Toastify__close-button{left:6px;right:unset}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:hover,.Toastify__close-button:focus{opacity:1}@keyframes Toastify__trackProgress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.Toastify__progress-bar{position:absolute;bottom:0;left:0;width:100%;height:100%;z-index:1;opacity:.7;transform-origin:left}.Toastify__progress-bar--animated{animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{right:0;left:initial;transform-origin:right;border-bottom-left-radius:initial}.Toastify__progress-bar--wrp{position:absolute;overflow:hidden;bottom:0;left:0;width:100%;height:5px;border-bottom-left-radius:var(--toastify-toast-bd-radius);border-bottom-right-radius:var(--toastify-toast-bd-radius)}.Toastify__progress-bar--wrp[data-hidden=true]{opacity:0}.Toastify__progress-bar--bg{opacity:var(--toastify-color-progress-bgo);width:100%;height:100%}.Toastify__spinner{width:20px;height:20px;box-sizing:border-box;border:2px solid;border-radius:100%;border-color:var(--toastify-spinner-color-empty-area);border-right-color:var(--toastify-spinner-color);animation:Toastify__spin .65s linear infinite}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutRight{20%{opacity:1;transform:translate3d(-20px,var(--y),0)}to{opacity:0;transform:translate3d(2000px,var(--y),0)}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;transform:translate3d(20px,var(--y),0)}to{opacity:0;transform:translate3d(-2000px,var(--y),0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}@keyframes Toastify__bounceOutUp{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes Toastify__bounceOutDown{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--top-left,.Toastify__bounce-enter--bottom-left{animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--top-right,.Toastify__bounce-enter--bottom-right{animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--top-left,.Toastify__bounce-exit--bottom-left{animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--top-right,.Toastify__bounce-exit--bottom-right{animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:Toastify__bounceOutDown}@keyframes Toastify__zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;transform:translate3d(0,var(--y),0) scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:Toastify__zoomIn}.Toastify__zoom-exit{animation-name:Toastify__zoomOut}@keyframes Toastify__flipIn{0%{transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes Toastify__flipOut{0%{transform:translate3d(0,var(--y),0) perspective(400px)}30%{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(-20deg);opacity:1}to{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(90deg);opacity:0}}.Toastify__flip-enter{animation-name:Toastify__flipIn}.Toastify__flip-exit{animation-name:Toastify__flipOut}@keyframes Toastify__slideInRight{0%{transform:translate3d(110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInLeft{0%{transform:translate3d(-110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInUp{0%{transform:translate3d(0,110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInDown{0%{transform:translate3d(0,-110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideOutRight{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(110%,var(--y),0)}}@keyframes Toastify__slideOutLeft{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(-110%,var(--y),0)}}@keyframes Toastify__slideOutDown{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,500px,0)}}@keyframes Toastify__slideOutUp{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,-500px,0)}}.Toastify__slide-enter--top-left,.Toastify__slide-enter--bottom-left{animation-name:Toastify__slideInLeft}.Toastify__slide-enter--top-right,.Toastify__slide-enter--bottom-right{animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:Toastify__slideInUp}.Toastify__slide-exit--top-left,.Toastify__slide-exit--bottom-left{animation-name:Toastify__slideOutLeft;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-right,.Toastify__slide-exit--bottom-right{animation-name:Toastify__slideOutRight;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-center{animation-name:Toastify__slideOutUp;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--bottom-center{animation-name:Toastify__slideOutDown;animation-timing-function:ease-in;animation-duration:.3s}@keyframes Toastify__spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n');var O=e=>"number"==typeof e&&!isNaN(e),j=e=>"string"==typeof e,P=e=>"function"==typeof e,G=1,N=()=>""+G++,F=new Map,V=[],U=new Set,B=()=>F.size>0;function W(e){if(B()){if(null==e||(e=>j(e)||O(e))(e))F.forEach((t=>{t.removeToast(e)}));else if(e&&("containerId"in e||"id"in e)){let t=F.get(e.containerId);t?t.removeToast(e.id):F.forEach((t=>{t.removeToast(e.id)}))}}else V=V.filter((t=>null!=e&&t.options.toastId!==e))}function H(e,t){(e=>v(e)||j(e)||P(e)||O(e))(e)&&(B()||V.push({content:e,options:t}),F.forEach((r=>{r.buildToast(e,t)})))}function X(e,t){F.forEach((r=>{(null==t||null==t||!t.containerId||(null==t?void 0:t.containerId)===r.id)&&r.toggle(e,null==t?void 0:t.id)}))}function Y(e){return e&&(j(e.toastId)||O(e.toastId))?e.toastId:N()}function Z(e,t){return H(e,t),t.toastId}function q(e,t){return{...t,type:t&&t.type||e,toastId:Y(t)}}function J(e){return(t,r)=>Z(t,q(e,r))}function K(e,t){return Z(e,q("default",t))}function Q(){try{const e=document.createElement("canvas");return!!(e.getContext("webgl2")||e.getContext("webgl")||e.getContext("experimental-webgl"))}catch(e){return!1}}function ee(){try{const e=document.createElement("canvas"),t=e.getContext("webgl2")||e.getContext("webgl")||e.getContext("experimental-webgl");return t?{vendor:t.getParameter(t.VENDOR),renderer:t.getParameter(t.RENDERER),version:t.getParameter(t.VERSION),shadingLanguageVersion:t.getParameter(t.SHADING_LANGUAGE_VERSION),maxTextureSize:t.getParameter(t.MAX_TEXTURE_SIZE),maxViewportDims:t.getParameter(t.MAX_VIEWPORT_DIMS)}:null}catch(e){return null}}K.loading=(e,t)=>Z(e,q("default",{isLoading:!0,autoClose:!1,closeOnClick:!1,closeButton:!1,draggable:!1,...t})),K.promise=function(e,{pending:t,error:r,success:a},o){let n;t&&(n=j(t)?K.loading(t,o):K.loading(t.render,{...o,...t}));let i={isLoading:null,autoClose:null,closeOnClick:null,closeButton:null,draggable:null},s=(e,t,r)=>{if(null==t)return void K.dismiss(n);let a={type:e,...i,...o,data:r},s=j(t)?{render:t}:t;return n?K.update(n,{...a,...s}):K(s.render,{...a,...s}),r},c=P(e)?e():e;return c.then((e=>s("success",a,e))).catch((e=>s("error",r,e))),c},K.success=J("success"),K.info=J("info"),K.error=J("error"),K.warning=J("warning"),K.warn=K.warning,K.dark=(e,t)=>Z(e,q("default",{theme:"dark",...t})),K.dismiss=function(e){W(e)},K.clearWaitingQueue=(e={})=>{F.forEach((t=>{t.props.limit&&(!e.containerId||t.id===e.containerId)&&t.clearQueue()}))},K.isActive=function(e,t){var r;if(t)return!(null==(r=F.get(t))||!r.isToastActive(e));let a=!1;return F.forEach((t=>{t.isToastActive(e)&&(a=!0)})),a},K.update=(e,t={})=>{let r=((e,{containerId:t})=>{var r;return null==(r=F.get(t||1))?void 0:r.toasts.get(e)})(e,t);if(r){let{props:a,content:o}=r,n={delay:100,...a,...t,toastId:t.toastId||e,updateId:N()};n.toastId!==e&&(n.staleId=e);let i=n.render||o;delete n.render,Z(i,n)}},K.done=e=>{K.update(e,{progress:1})},K.onChange=function(e){return U.add(e),()=>{U.delete(e)}},K.play=e=>X(!0,e),K.pause=e=>X(!1,e);let te=null,re=null;async function ae(){if(te)return te;if(re)return re;if(!Q()){const e=new Error("WebGL is not supported in this browser. 3D charts require WebGL support.");throw e.code="WEBGL_NOT_SUPPORTED",e}return"undefined"!=typeof window&&window["echarts-gl"]?(te=window["echarts-gl"],Promise.resolve(te)):(re=import("echarts-gl").then((e=>(te=e,e))).catch((e=>{re=null;const t=new Error(`Failed to load ECharts GL: ${e.message}`);throw t.code="ECHARTS_GL_LOAD_ERROR",t.originalError=e,t})),re)}function oe(){te||re||!Q()||ae().catch((()=>{}))}function ne(){return{isLoaded:!!te,isLoading:!!re,isSupported:Q()}}function ie(e,t={}){const{useToast:r=!0,fallbackMessage:a}=t;let o=a||"Unable to display 3D chart. Please try a different browser.";return"WEBGL_NOT_SUPPORTED"===e.code?o="Your browser does not support WebGL, which is required for 3D charts. Please use a modern browser like Chrome, Firefox, Safari, or Edge.":"ECHARTS_GL_LOAD_ERROR"===e.code&&(o="Failed to load 3D chart library. Please check your internet connection and try again."),r&&void 0!==K&&K.error(o,{position:"top-center",autoClose:5e3,hideProgressBar:!1,closeOnClick:!0,pauseOnHover:!0,draggable:!0}),o}function se(e){if(e)try{e.off(),e.isDisposed()||e.dispose()}catch(e){console.warn("Error during WebGL cleanup:",e)}}function ce(e,t){if(!e)return()=>{};const r=e=>{e.preventDefault(),console.warn("WebGL context lost")},a=()=>{console.info("WebGL context restored"),"function"==typeof t&&t()};return e.addEventListener("webglcontextlost",r),e.addEventListener("webglcontextrestored",a),()=>{e.removeEventListener("webglcontextlost",r),e.removeEventListener("webglcontextrestored",a)}}var le={isWebGLSupported:Q,getWebGLInfo:ee,loadEChartsGL:ae,preloadEChartsGL:oe,getLoadingState:ne,display3DError:ie,cleanupWebGL:se,handleWebGLContextLoss:ce},de=Object.freeze({__proto__:null,isWebGLSupported:Q,getWebGLInfo:ee,loadEChartsGL:ae,preloadEChartsGL:oe,getLoadingState:ne,display3DError:ie,cleanupWebGL:se,handleWebGLContextLoss:ce,default:le});function he({message:e,style:t}){return m.createElement("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",color:"red",...t}},m.createElement("p",null,e))}function fe(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ue={exports:{}};function pe(){}function me(){}me.resetWarningCache=pe;ue.exports=function(){function e(e,t,r,a,o,n){if("SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"!==n){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:me,resetWarningCache:pe};return r.PropTypes=r,r}();var ge=fe(ue.exports);function ye({color:e}){return m.createElement("div",{className:"circular-progress"},m.createElement("div",{className:`spinner ${e}`}))}function be({message:e,style:t,msgStyle:r,ProgressColor:a="primary",error:o=!1}){return m.createElement("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%",...t}},m.createElement(ye,{color:a}),m.createElement("div",{style:{marginTop:"10px",...r}},o?m.createElement(he,{message:e,style:r}):m.createElement("p",null,e)))}!function(e,t){void 0===t&&(t={});var r=t.insertAt;if(e&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css","top"===r&&a.firstChild?a.insertBefore(o,a.firstChild):a.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}(".circular-progress{align-items:center;display:flex;justify-content:center}.spinner{animation:spin 1s linear infinite;border:4px solid #0000001a;border-left-color:#333;border-radius:50%;height:30px;width:30px}.spinner.primary{border-left-color:#1976d2}.spinner.secondary{border-left-color:#f50057}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}"),ye.propTypes={color:ge.oneOf(["primary","secondary"])};const ve=(e,t={},r="chart")=>{if(!e||!Array.isArray(e)||0===e.length)return"No data available";const a=e.length;let o=`Data summary: ${a} total items. `;const n=e[0];if(Array.isArray(n)){const t=n.length;o+=`Each data point has ${t} dimensions. `;const r=e.slice(0,10).map(((e,r)=>2===t?`Point ${r+1}: ${xe(e[0])}, ${xe(e[1])}`:t>=3?`Point ${r+1}: ${xe(e[0])}, ${xe(e[1])}, ${xe(e[2])}`:`Point ${r+1}: ${xe(e[0])}`)).join("; ");o+=r}else if("object"==typeof n){const t=e.slice(0,10).map(((e,t)=>{const r=e.name||e.label||`Item ${t+1}`,a=void 0!==e.value?e.value:void 0!==e.z?`(${e.x}, ${e.y}, ${e.z})`:`(${e.x}, ${e.y})`;return`${r}: ${xe(a)}`})).join("; ");o+=t}else{const t=e.slice(0,10).map(((e,t)=>`Item ${t+1}: ${xe(e)}`)).join("; ");o+=t}return a>10&&(o+=`. And ${a-10} more items`),o},we=(e,t,r={})=>{if(Array.isArray(e)){const a=r.labels?.x||"X",o=r.labels?.y||"Y",n=r.zAxis3D?.name||r.zAxis?.name||"Z";return e.length>=3?`Data point ${t+1}: ${a} ${xe(e[0])}, ${o} ${xe(e[1])}, ${n} ${xe(e[2])}`:`Data point ${t+1}: ${a} ${xe(e[0])}, ${o} ${xe(e[1])}`}if("object"==typeof e){const a=e.name||e.label||`Data point ${t+1}`,o=void 0!==e.value?xe(e.value):"",n=[void 0!==e.x?`${r.labels?.x||"X"}: ${xe(e.x)}`:"",void 0!==e.y?`${r.labels?.y||"Y"}: ${xe(e.y)}`:"",void 0!==e.z?`${r.zAxis3D?.name||"Z"}: ${xe(e.z)}`:""].filter(Boolean).join(", ");return o?`${a}: ${o}${n?` at ${n}`:""}`:`${a}${n?`: ${n}`:""}`}return`Data point ${t+1}: ${xe(e)}`},xe=e=>{if(null==e)return"unknown";if("number"==typeof e){if(Math.abs(e)>=1e3)return e.toLocaleString();if(e%1!=0)return e.toFixed(2)}return e instanceof Date?e.toLocaleDateString():String(e)},_e=(e,t="chart",r="")=>{const a=((e,t="chart")=>{const r="string"==typeof e.title?e.title:e.title?.text||"Untitled chart",a=e.data?.length||e.series?.[0]?.data?.length||0,o=e.labels?.x||e.xAxis?.name||"X axis",n=e.labels?.y||e.yAxis?.name||"Y axis",i=e.zAxis3D?.name||e.zAxis?.name||"Z axis";let s=`${r}. ${t} chart`;return a>0&&(s+=` with ${a} data points`),e.is3D||t.includes("3D")?s+=`. Three-dimensional view showing ${o}, ${n}, and ${i}`:s+=`. X axis shows ${o}, Y axis shows ${n}`,e.description&&(s+=`. ${e.description}`),s})(e,t);ve(e.data||e.series?.[0]?.data,e,t);const o=r?`${r}-description`:"chart-description";return{role:"img","aria-label":a,"aria-describedby":o,tabIndex:0,"data-description-id":o,"data-chart-type":t}},Ee=(e,t={},r="chart")=>{if(!e||!Array.isArray(e)||0===e.length)return{caption:t.title||"Chart Data",headers:[],rows:[]};const a=e[0];let o=[],n=[];if(Array.isArray(a)){const r=a.length;o=[t.labels?.x||"X",t.labels?.y||"Y",...r>2?[t.zAxis3D?.name||t.zAxis?.name||"Z"]:[]].slice(0,r),n=e.map(((e,t)=>({id:`row-${t}`,cells:e.map((e=>xe(e)))})))}else if("object"==typeof a){const r=Object.keys(a);o=r.map((e=>{switch(e){case"x":return t.labels?.x||"X";case"y":return t.labels?.y||"Y";case"z":return t.zAxis3D?.name||t.zAxis?.name||"Z";case"name":return"Name";case"value":return"Value";default:return e.charAt(0).toUpperCase()+e.slice(1)}})),n=e.map(((e,t)=>({id:`row-${t}`,cells:r.map((t=>xe(e[t])))})))}else o=["Index","Value"],n=e.map(((e,t)=>({id:`row-${t}`,cells:[String(t+1),xe(e)]})));return{caption:"string"==typeof t.title?t.title:t.title?.text||"Chart Data",headers:o,rows:n}},Ae=(e,t="polite")=>{let r=document.getElementById("visualify-a11y-announcer");r||(r=document.createElement("div"),r.id="visualify-a11y-announcer",r.setAttribute("aria-live",t),r.setAttribute("aria-atomic","true"),r.className="sr-only",document.body.appendChild(r)),r.setAttribute("aria-live",t),r.textContent=e,setTimeout((()=>{r.textContent=""}),1e3)},Te=(e,t={})=>{if(!e||!Array.isArray(e)||0===e.length)return"";const r=Ee(e,t);return`${r.headers.join(",")}\n${r.rows.map((e=>e.cells.join(","))).join("\n")}`},Ce=(e,t="chart-data.csv")=>{const r=new Blob([e],{type:"text/csv;charset=utf-8;"}),a=document.createElement("a"),o=URL.createObjectURL(r);a.setAttribute("href",o),a.setAttribute("download",t),a.setAttribute("aria-label",`Download data as ${t}`),a.className="sr-only",document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(o)},Se={enableArrowNavigation:!0,enableTabNavigation:!0,enableEnterActivation:!0,wrapAround:!0,announceChanges:!0},Ie=(e={})=>{const[t,r]=w(-1),a=y(null),{data:o=[],onFocusChange:n,onActivate:i,onEscape:s,config:c={},navConfig:l={}}=e,d={...Se,...l},h=x((e=>{if(e<0||e>=o.length){if(!d.wrapAround)return;e=e<0?o.length-1:0}if(r(e),d.announceChanges&&e>=0){const t=we(o[e],e,c);Ae(t,"polite")}n&&n(e,o[e])}),[o,c,d,n]),f=x((()=>{t>=0&&t<o.length&&(d.announceChanges&&Ae(`Activated ${we(o[t],t,c)}`,"polite"),i&&i(t,o[t]))}),[t,o,c,d,i]),u=x((()=>{r(-1),s&&s()}),[s]),p=x((e=>{if(d.enableArrowNavigation||d.enableEnterActivation)switch(e.key){case"ArrowRight":case"ArrowDown":e.preventDefault(),d.enableArrowNavigation&&h(t+1);break;case"ArrowLeft":case"ArrowUp":e.preventDefault(),d.enableArrowNavigation&&h(t-1);break;case"Enter":case" ":e.preventDefault(),d.enableEnterActivation&&f();break;case"Escape":e.preventDefault(),u(),a.current&&a.current.focus();break;case"Home":e.preventDefault(),d.enableArrowNavigation&&h(0);break;case"End":e.preventDefault(),d.enableArrowNavigation&&h(o.length-1);break;case"PageUp":e.preventDefault(),d.enableArrowNavigation&&h(Math.max(0,t-10));break;case"PageDown":e.preventDefault(),d.enableArrowNavigation&&h(Math.min(o.length-1,t+10))}}),[t,o.length,d,h,f,u]),m=x((()=>{-1===t&&o.length>0&&h(0)}),[t,o.length,h]),g=x((e=>{a.current&&!a.current.contains(e.relatedTarget)&&u()}),[u]);return{focusedIndex:t,containerRef:a,handleKeyDown:p,handleFocus:m,handleBlur:g,focusDataPoint:h,activateDataPoint:f,clearFocus:u,containerProps:{ref:a,tabIndex:0,onKeyDown:p,onFocus:m,onBlur:g,role:"application","aria-label":c.title||"Interactive chart"}}},De={AA_NORMAL:4.5,AAA_NORMAL:7,AA_LARGE:3,AAA_LARGE:4.5,AA_UI:3},Le=(e,t,r)=>{const a=e=>{const t=Math.max(0,Math.min(255,Math.round(e))).toString(16);return 1===t.length?"0"+t:t};return`#${a(e)}${a(t)}${a(r)}`},Me=e=>{if(!e||"string"!=typeof e)return null;if((e=e.trim().toLowerCase()).startsWith("#"))return(e=>{if(!e||"string"!=typeof e)return null;if(3===(e=e.replace(/^#/,"")).length&&(e=e.split("").map((e=>e+e)).join("")),6===e.length){const t=parseInt(e.substring(0,2),16),r=parseInt(e.substring(2,4),16),a=parseInt(e.substring(4,6),16);return isNaN(t)||isNaN(r)||isNaN(a)?null:{r:t,g:r,b:a}}return null})(e);const t=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);if(t)return{r:parseInt(t[1],10),g:parseInt(t[2],10),b:parseInt(t[3],10)};const r={black:{r:0,g:0,b:0},white:{r:255,g:255,b:255},red:{r:255,g:0,b:0},green:{r:0,g:128,b:0},blue:{r:0,g:0,b:255},yellow:{r:255,g:255,b:0},cyan:{r:0,g:255,b:255},magenta:{r:255,g:0,b:255},silver:{r:192,g:192,b:192},gray:{r:128,g:128,b:128},grey:{r:128,g:128,b:128},maroon:{r:128,g:0,b:0},olive:{r:128,g:128,b:0},lime:{r:0,g:255,b:0},aqua:{r:0,g:255,b:255},teal:{r:0,g:128,b:128},navy:{r:0,g:0,b:128},fuchsia:{r:255,g:0,b:255},purple:{r:128,g:0,b:128},orange:{r:255,g:165,b:0}};return r[e]?r[e]:null},ke=e=>{if(!e)return 0;const{r:t,g:r,b:a}=e,o=t/255,n=r/255,i=a/255;return.2126*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))+.0722*(i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))},Re=(e,t)=>{const r="string"==typeof e?Me(e):e,a="string"==typeof t?Me(t):t;if(!r||!a)return 1;const o=ke(r),n=ke(a);return(Math.max(o,n)+.05)/(Math.min(o,n)+.05)},ze=(e,t,r=!1)=>{const a=Re(e,t),o=r?De.AA_LARGE:De.AA_NORMAL;return{ratio:Math.round(100*a)/100,passesAA:a>=o,passesAAA:a>=(r?De.AAA_LARGE:De.AAA_NORMAL),threshold:o,isLargeText:r}},$e=(e,t=null,r={})=>{const{minContrast:a=De.AA_NORMAL,darkenAmount:o=20}=r,n=Me(e);if(!n)return"#000000";if(t){const e=Me(t);if(e){return Re(n,e)>=a?t:Oe(n,e,a)}}return ke(n)>.5?"#000000":"#ffffff"},Oe=(e,t,r)=>{let a={...t};const o=ke(e)>.5;for(let t=0;t<20;t++){if(Re(e,a)>=r)return Le(a.r,a.g,a.b);o?(a.r=Math.max(0,a.r-15),a.g=Math.max(0,a.g-15),a.b=Math.max(0,a.b-15)):(a.r=Math.min(255,a.r+15),a.g=Math.min(255,a.g+15),a.b=Math.min(255,a.b+15))}return o?"#000000":"#ffffff"},je=e=>{const t={valid:!0,issues:[],suggestions:{}},r=e.backgroundColor||"#ffffff";if(e.color&&Array.isArray(e.color)&&e.color.forEach(((e,a)=>{const o=ze(e,r);o.passesAA||(t.valid=!1,t.issues.push({type:"series-color",index:a,color:e,message:`Series color ${e} does not meet WCAG AA contrast requirements (${o.ratio}:1)`}),t.suggestions[`series-${a}`]=$e(r,e))})),e.title?.textStyle?.color){ze(e.title.textStyle.color,r).passesAA||(t.valid=!1,t.issues.push({type:"title-color",color:e.title.textStyle.color,message:"Title color does not meet WCAG AA contrast requirements"}),t.suggestions.title=$e(r,e.title.textStyle.color))}if(e.xAxis?.axisLabel?.color){ze(e.xAxis.axisLabel.color,r).passesAA||(t.valid=!1,t.issues.push({type:"xaxis-color",color:e.xAxis.axisLabel.color,message:"X-axis label color does not meet WCAG AA contrast requirements"}))}if(e.yAxis?.axisLabel?.color){ze(e.yAxis.axisLabel.color,r).passesAA||(t.valid=!1,t.issues.push({type:"yaxis-color",color:e.yAxis.axisLabel.color,message:"Y-axis label color does not meet WCAG AA contrast requirements"}))}return t},Pe=e=>{const t={...e};e.backgroundColor;const r=je(e);return r.suggestions&&(t.color&&Array.isArray(t.color)&&(t.color=t.color.map(((e,t)=>r.suggestions[`series-${t}`]||e))),r.suggestions.title&&t.title?.textStyle&&(t.title.textStyle.color=r.suggestions.title)),t},Ge=10,Ne=.8,Fe="#5470c6",Ve=g((({props:e,style:t},r)=>{const{config:a={}}=e,o=e.id||`scatter3d-chart-${Math.random().toString(36).substr(2,9)}`,n=`${o}-description`,i=`${o}-data-table`,s=m.useMemo((()=>je(a).valid||!1===a.a11y?.autoFix?a:Pe(a)),[a]),[c,l]=w(null),[d,h]=w({active:!0,message:"Loading 3D library..."}),[f,u]=w(null),[p,g]=w(null),v=y(null),_=m.useMemo((()=>s.data||[]),[s]),{containerRef:E,handleKeyDown:A,handleFocus:T,focusedIndex:C}=Ie({data:_,config:s,onFocusChange:(e,t)=>{if(g(t),v.current){const t=v.current.getEchartsInstance?.();t&&t.dispatchAction({type:"highlight",seriesIndex:0,dataIndex:e})}},onActivate:(e,t)=>{if(v.current){const t=v.current.getEchartsInstance?.();t&&t.dispatchAction({type:"showTip",seriesIndex:0,dataIndex:e})}}}),S=m.useMemo((()=>_e(s,"scatter3D",o)),[s,o]),I=m.useMemo((()=>ve(_,s,"scatter3D")),[_,s]),D=m.useMemo((()=>Ee(_,s,"scatter3D")),[_,s]),L=x((()=>{const e=Te(_,s);e&&(Ce(e,`${s.title||"scatter3d-chart"}-data.csv`),Ae("Data downloaded as CSV file","polite"))}),[_,s]),M=x((async()=>{try{if(h({active:!0,message:"Loading 3D library..."}),u(null),!Q())throw new Error("WebGL not supported");await ae();const e=(e=>{const{title:t,data:r,xAxis3D:a,yAxis3D:o,zAxis3D:n,grid3D:i,visualMap:s,series:c,backgroundColor:l,color:d,tooltip:h,legend:f,toolbox:u}=e;if(!r)throw new Error("Scatter3D requires data");let p=r;if(!Array.isArray(r)&&r.x&&r.y&&r.z){const e=Math.min(r.x.length,r.y.length,r.z.length);p=[];for(let t=0;t<e;t++)p.push([r.x[t],r.y[t],r.z[t]])}else Array.isArray(r)&&r.length>0&&"object"==typeof r[0]&&!Array.isArray(r[0])&&(p=r.map((e=>[e.x,e.y,e.z])));const m={title:"string"==typeof t?{text:t}:{left:"center",top:0,...t},tooltip:{trigger:"item",formatter:h?.formatter||(e=>{const[t,r,a]=e.value;return`X: ${t}<br/>Y: ${r}<br/>Z: ${a}`}),...h},legend:f??void 0,visualMap:s??void 0,xAxis3D:{name:a?.name||"X",type:a?.type||"value",nameGap:25,...a},yAxis3D:{name:o?.name||"Y",type:o?.type||"value",nameGap:25,...o},zAxis3D:{name:n?.name||"Z",type:n?.type||"value",nameGap:25,...n},grid3D:{boxWidth:100,boxDepth:80,boxHeight:60,viewControl:{autoRotate:!1,projection:"perspective",...i?.viewControl},light:{main:{intensity:1.2,shadow:!0},ambient:{intensity:.3}},...i},series:[{type:"scatter3D",symbolSize:c?.symbolSize??Ge,data:p,itemStyle:{opacity:c?.opacity??Ne,color:c?.color??Fe,...c?.itemStyle},emphasis:{itemStyle:{borderColor:"#fff",borderWidth:1}},...c}]};return l&&(m.backgroundColor=l),d&&(m.color=d),u&&(m.toolbox={feature:{...u,saveAsImage:{show:u.saveAsImage?.show??!1}}}),m})(s);l(e),h({active:!1,message:null}),!1!==s.a11y?.announceLoad&&Ae(`${S["aria-label"]}. 3D scatter plot. Use arrow keys to navigate data points. Press Enter to select.`,"polite")}catch(e){const t=ie(e,{useToast:!0});u(t),h({active:!0,message:t}),Ae(`Error loading 3D chart: ${t}`,"assertive")}}),[s,S]);return b((()=>{M()}),[M]),b((()=>()=>{r?.current&&se(r.current.getEchartsInstance?.())}),[r]),b((()=>{const e=()=>{if(r?.current){const e=r.current.getEchartsInstance?.();e&&!e.isDisposed()&&e.resize()}};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}),[r]),f?m.createElement("div",{id:o,ref:E,role:"alert","aria-live":"assertive",style:{...t,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f5f5f5",border:"1px solid #ddd",borderRadius:"4px",padding:"20px",textAlign:"center"},tabIndex:0},m.createElement("div",null,m.createElement("h4",null,"3D Chart Unavailable"),m.createElement("p",{style:{color:"#666",marginTop:"10px"}},f))):m.createElement("div",z({id:o,ref:E,style:{...t,position:"relative"},className:"visualify-chart visualify-scatter3d-chart"},S,{onKeyDown:A,onFocus:T,"data-testid":"scatter3d-chart"}),m.createElement("div",{id:n,className:"sr-only"},I,s.description&&m.createElement("span",null,". ",s.description),m.createElement("p",null,"3D visualization. Use Tab to enter chart, then arrow keys to navigate data points.")),D.rows.length>0&&m.createElement("table",{id:i,className:"sr-only"},m.createElement("caption",null,D.caption," - Data Table"),m.createElement("thead",null,m.createElement("tr",null,D.headers.map(((e,t)=>m.createElement("th",{key:t,scope:"col"},e))))),m.createElement("tbody",null,D.rows.map((e=>m.createElement("tr",{key:e.id},e.cells.map(((e,t)=>m.createElement("td",{key:t},e)))))))),!1!==s.a11y?.enableDownload&&_.length>0&&m.createElement("button",{className:"sr-only",onClick:L,"aria-label":"Download chart data as CSV",tabIndex:-1},"Download Data"),m.createElement("div",{"aria-live":"polite","aria-atomic":"true",className:"sr-only",id:`${o}-live-region`},p&&`Focused: X ${p[0]||p.x}, Y ${p[1]||p.y}, Z ${p[2]||p.z}`),d.active&&m.createElement(be,{message:d.message,style:{marginTop:"10px"}}),c&&m.createElement($,{ref:e=>{v.current=e,"function"==typeof r?r(e):r&&(r.current=e)},options:c,style:{width:s.chartWidth||"100%",height:s.chartHeight||"400px",opacity:d.active?0:1},"aria-hidden":"true"}))}));Ve.displayName="Scatter3D";const Ue="lambert",Be=1,We=g((({props:e,style:t},r)=>{const{config:a={}}=e,o=e.id||`bar3d-chart-${Math.random().toString(36).substr(2,9)}`,n=`${o}-description`,i=`${o}-data-table`,s=m.useMemo((()=>je(a).valid||!1===a.a11y?.autoFix?a:Pe(a)),[a]),[c,l]=w(null),[d,h]=w({active:!0,message:"Loading 3D library..."}),[f,u]=w(null),[p,g]=w(null),v=y(null),_=m.useMemo((()=>s.data||[]),[s]),{containerRef:E,handleKeyDown:A,handleFocus:T,focusedIndex:C}=Ie({data:_,config:s,onFocusChange:(e,t)=>{if(g(t),v.current){const t=v.current.getEchartsInstance?.();t&&t.dispatchAction({type:"highlight",seriesIndex:0,dataIndex:e})}},onActivate:(e,t)=>{if(v.current){const t=v.current.getEchartsInstance?.();t&&t.dispatchAction({type:"showTip",seriesIndex:0,dataIndex:e})}}}),S=m.useMemo((()=>_e(s,"bar3D",o)),[s,o]),I=m.useMemo((()=>ve(_,s,"bar3D")),[_,s]),D=m.useMemo((()=>Ee(_,s,"bar3D")),[_,s]),L=x((()=>{const e=Te(_,s);e&&(Ce(e,`${s.title||"bar3d-chart"}-data.csv`),Ae("Data downloaded as CSV file","polite"))}),[_,s]),M=x((async()=>{try{if(h({active:!0,message:"Loading 3D library..."}),u(null),!Q())throw new Error("WebGL not supported");await ae();const e=(e=>{const{title:t,data:r,xAxis3D:a,yAxis3D:o,zAxis3D:n,grid3D:i,visualMap:s,series:c,backgroundColor:l,color:d,tooltip:h,legend:f,toolbox:u}=e;if(!r)throw new Error("Bar3D requires data");let p=r;if(!Array.isArray(r)&&r.x&&r.y&&r.z){const e=Math.min(r.x.length,r.y.length,r.z.length);p=[];for(let t=0;t<e;t++)p.push([r.x[t],r.y[t],r.z[t]])}else Array.isArray(r)&&r.length>0&&"object"==typeof r[0]&&!Array.isArray(r[0])&&(p=r.map((e=>[e.x,e.y,e.z])));const m={title:"string"==typeof t?{text:t}:{left:"center",top:0,...t},tooltip:{trigger:"item",formatter:h?.formatter||(e=>{const[t,r,a]=e.value;return`X: ${t}<br/>Y: ${r}<br/>Height: ${a}`}),...h},legend:f??void 0,visualMap:s??void 0,xAxis3D:{name:a?.name||"X",type:a?.type||"category",nameGap:25,...a},yAxis3D:{name:o?.name||"Y",type:o?.type||"category",nameGap:25,...o},zAxis3D:{name:n?.name||"Z",type:n?.type||"value",nameGap:25,...n},grid3D:{boxWidth:100,boxDepth:80,boxHeight:60,viewControl:{autoRotate:!1,projection:"perspective",...i?.viewControl},light:{main:{intensity:1.2,shadow:!0},ambient:{intensity:.3}},...i},series:[{type:"bar3D",data:p,shading:c?.shading??Ue,itemStyle:{opacity:c?.opacity??Be,...c?.itemStyle},label:{show:c?.label?.show??!1,...c?.label},emphasis:{label:{show:!0,fontSize:16,color:"#fff"},itemStyle:{color:"#ff7f50"}},...c}]};return l&&(m.backgroundColor=l),d&&(m.color=d),u&&(m.toolbox={feature:{...u,saveAsImage:{show:u.saveAsImage?.show??!1}}}),m})(s);l(e),h({active:!1,message:null}),!1!==s.a11y?.announceLoad&&Ae(`${S["aria-label"]}. 3D bar chart. Use arrow keys to navigate data points. Press Enter to select.`,"polite")}catch(e){const t=ie(e,{useToast:!0});u(t),h({active:!0,message:t}),Ae(`Error loading 3D chart: ${t}`,"assertive")}}),[s,S]);return b((()=>{M()}),[M]),b((()=>()=>{r?.current&&se(r.current.getEchartsInstance?.())}),[r]),b((()=>{const e=()=>{if(r?.current){const e=r.current.getEchartsInstance?.();e&&!e.isDisposed()&&e.resize()}};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}),[r]),f?m.createElement("div",{id:o,ref:E,role:"alert","aria-live":"assertive",style:{...t,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f5f5f5",border:"1px solid #ddd",borderRadius:"4px",padding:"20px",textAlign:"center"},tabIndex:0},m.createElement("div",null,m.createElement("h4",null,"3D Chart Unavailable"),m.createElement("p",{style:{color:"#666",marginTop:"10px"}},f))):m.createElement("div",z({id:o,ref:E,style:{...t,position:"relative"},className:"visualify-chart visualify-bar3d-chart"},S,{onKeyDown:A,onFocus:T,"data-testid":"bar3d-chart"}),m.createElement("div",{id:n,className:"sr-only"},I,s.description&&m.createElement("span",null,". ",s.description),m.createElement("p",null,"3D bar chart visualization. Use Tab to enter chart, then arrow keys to navigate data points.")),D.rows.length>0&&m.createElement("table",{id:i,className:"sr-only"},m.createElement("caption",null,D.caption," - Data Table"),m.createElement("thead",null,m.createElement("tr",null,D.headers.map(((e,t)=>m.createElement("th",{key:t,scope:"col"},e))))),m.createElement("tbody",null,D.rows.map((e=>m.createElement("tr",{key:e.id},e.cells.map(((e,t)=>m.createElement("td",{key:t},e)))))))),!1!==s.a11y?.enableDownload&&_.length>0&&m.createElement("button",{className:"sr-only",onClick:L,"aria-label":"Download chart data as CSV",tabIndex:-1},"Download Data"),m.createElement("div",{"aria-live":"polite","aria-atomic":"true",className:"sr-only",id:`${o}-live-region`},p&&`Focused: X ${p[0]||p.x}, Y ${p[1]||p.y}, Height ${p[2]||p.z}`),d.active&&m.createElement(be,{message:d.message,style:{marginTop:"10px"}}),c&&m.createElement($,{ref:e=>{v.current=e,"function"==typeof r?r(e):r&&(r.current=e)},options:c,style:{width:s.chartWidth||"100%",height:s.chartHeight||"400px",opacity:d.active?0:1},"aria-hidden":"true"}))}));We.displayName="Bar3D";const He="lambert",Xe={show:!1},Ye=e=>{const{title:t,data:r,xAxis3D:a,yAxis3D:o,zAxis3D:n,grid3D:i,visualMap:s,series:c,backgroundColor:l,color:d,tooltip:h,legend:f,toolbox:u,contour:p}=e;if(!r)throw new Error("Surface3D requires data");const m=((e,t={})=>{if(!Array.isArray(e)&&"object"==typeof e&&e.x&&e.y&&e.z){const{x:t,y:r,z:a}=e,o=[];for(let e=0;e<t.length;e++)for(let n=0;n<r.length;n++)o.push([t[e],r[n],a[e][n]]);return o}if(Array.isArray(e))return e;if("function"==typeof e){const{xMin:r=-10,xMax:a=10,yMin:o=-10,yMax:n=10,step:i=1}=t,s=[];for(let t=r;t<=a;t+=i)for(let r=o;r<=n;r+=i){const a=e(t,r);s.push([t,r,a])}return s}return[]})(r,e.range),g={title:"string"==typeof t?{text:t}:{left:"center",top:0,...t},tooltip:{trigger:"item",formatter:h?.formatter||(e=>{const[t,r,a]=e.value;return`X: ${t.toFixed(2)}<br/>Y: ${r.toFixed(2)}<br/>Z: ${a.toFixed(2)}`}),...h},legend:f??void 0,visualMap:s??{show:!0,dimension:2,min:Math.min(...m.map((e=>e[2]))),max:Math.max(...m.map((e=>e[2]))),inRange:{color:["#313695","#4575b4","#74add1","#abd9e9","#e0f3f8","#ffffbf","#fee090","#fdae61","#f46d43","#d73027","#a50026"]}},xAxis3D:{name:a?.name||"X",type:a?.type||"value",nameGap:25,...a},yAxis3D:{name:o?.name||"Y",type:o?.type||"value",nameGap:25,...o},zAxis3D:{name:n?.name||"Z",type:n?.type||"value",nameGap:25,...n},grid3D:{boxWidth:100,boxDepth:80,boxHeight:60,viewControl:{autoRotate:c?.autoRotate??!1,projection:"perspective",...i?.viewControl},light:{main:{intensity:1.2,shadow:!0},ambient:{intensity:.3}},...i},series:[{type:"surface",data:m,shading:c?.shading??He,wireframe:{show:c?.wireframe?.show??Xe.show,...c?.wireframe},itemStyle:{opacity:c?.opacity??1,...c?.itemStyle},...c}]};return p?.show&&(g.series[0].contour={show:!0,color:p.color||"#000",...p}),l&&(g.backgroundColor=l),d&&(g.color=d),u&&(g.toolbox={feature:{...u,saveAsImage:{show:u.saveAsImage?.show??!1}}}),g},Ze=g((({props:e,style:t},r)=>{const{config:a={}}=e,[o,n]=w(null),[i,s]=w({active:!0,message:"Loading 3D library..."}),[c,l]=w(null),d=x((async()=>{try{if(s({active:!0,message:"Loading 3D library..."}),l(null),!Q())throw new Error("WebGL not supported");await ae();const e=Ye(a);n(e),s({active:!1,message:null})}catch(e){const t=ie(e,{useToast:!0});l(t),s({active:!0,message:t})}}),[a]);return b((()=>{d()}),[d]),b((()=>()=>{r?.current&&se(r.current.getEchartsInstance?.())}),[r]),b((()=>{const e=()=>{if(r?.current){const e=r.current.getEchartsInstance?.();e&&!e.isDisposed()&&e.resize()}};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}),[r]),c?m.createElement("div",{id:e.id,style:{...t,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f5f5f5",border:"1px solid #ddd",borderRadius:"4px",padding:"20px",textAlign:"center"}},m.createElement("div",null,m.createElement("h4",null,"3D Chart Unavailable"),m.createElement("p",{style:{color:"#666",marginTop:"10px"}},c))):m.createElement("div",{id:e.id,style:{...t,position:"relative"}},i.active&&m.createElement(be,{message:i.message,style:{marginTop:"10px"}}),o&&m.createElement($,{ref:r,options:o,style:{width:a.chartWidth||"100%",height:a.chartHeight||"400px",opacity:i.active?0:1}}))}));Ze.displayName="Surface3D";const qe={width:4},Je=8,Ke=e=>{const{title:t,data:r,xAxis3D:a,yAxis3D:o,zAxis3D:n,grid3D:i,visualMap:s,series:c,backgroundColor:l,color:d,tooltip:h,legend:f,toolbox:u}=e,p=(e=>{if(!e)return[];if(Array.isArray(e)){if(e.length>0&&Array.isArray(e[0])&&3===e[0].length)return[{data:e,name:"Series 1"}];if(e.length>0&&e[0].data)return e}if("object"==typeof e&&!Array.isArray(e)){const{x:t,y:r,z:a}=e;if(Array.isArray(t)&&Array.isArray(r)&&Array.isArray(a))return[{data:t.map(((e,t)=>[e,r[t],a[t]])),name:"Series 1"}]}return[]})(r);if(0===p.length)throw new Error("Line3D requires valid data");const m=p.map(((e,t)=>({type:"line3D",name:e.name||`Series ${t+1}`,data:e.data,lineStyle:{width:c?.lineStyle?.width??qe.width,color:c?.lineStyle?.color||d?.[t],...c?.lineStyle},symbolSize:c?.symbolSize??Je,symbol:c?.symbol||"circle",emphasis:{lineStyle:{width:(c?.lineStyle?.width??qe.width)+2}},...c}))),g={title:"string"==typeof t?{text:t}:{left:"center",top:0,...t},tooltip:{trigger:"item",formatter:h?.formatter||(e=>{const[t,r,a]=e.value;return`${e.seriesName}<br/>X: ${t}<br/>Y: ${r}<br/>Z: ${a}`}),...h},legend:f??{show:m.length>1,data:m.map((e=>e.name))},visualMap:s??void 0,xAxis3D:{name:a?.name||"X",type:a?.type||"value",nameGap:25,...a},yAxis3D:{name:o?.name||"Y",type:o?.type||"value",nameGap:25,...o},zAxis3D:{name:n?.name||"Z",type:n?.type||"value",nameGap:25,...n},grid3D:{boxWidth:100,boxDepth:80,boxHeight:60,viewControl:{autoRotate:!1,projection:"perspective",...i?.viewControl},light:{main:{intensity:1.2,shadow:!0},ambient:{intensity:.3}},...i},series:m};return l&&(g.backgroundColor=l),d&&(g.color=d),u&&(g.toolbox={feature:{...u,saveAsImage:{show:u.saveAsImage?.show??!1}}}),g},Qe=g((({props:e,style:t},r)=>{const{config:a={}}=e,[o,n]=w(null),[i,s]=w({active:!0,message:"Loading 3D library..."}),[c,l]=w(null),d=x((async()=>{try{if(s({active:!0,message:"Loading 3D library..."}),l(null),!Q())throw new Error("WebGL not supported");await ae();const e=Ke(a);n(e),s({active:!1,message:null})}catch(e){const t=ie(e,{useToast:!0});l(t),s({active:!0,message:t})}}),[a]);return b((()=>{d()}),[d]),b((()=>()=>{r?.current&&se(r.current.getEchartsInstance?.())}),[r]),b((()=>{const e=()=>{if(r?.current){const e=r.current.getEchartsInstance?.();e&&!e.isDisposed()&&e.resize()}};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}),[r]),c?m.createElement("div",{id:e.id,style:{...t,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f5f5f5",border:"1px solid #ddd",borderRadius:"4px",padding:"20px",textAlign:"center"}},m.createElement("div",null,m.createElement("h4",null,"3D Chart Unavailable"),m.createElement("p",{style:{color:"#666",marginTop:"10px"}},c))):m.createElement("div",{id:e.id,style:{...t,position:"relative"}},i.active&&m.createElement(be,{message:i.message,style:{marginTop:"10px"}}),o&&m.createElement($,{ref:r,options:o,style:{width:a.chartWidth||"100%",height:a.chartHeight||"400px",opacity:i.active?0:1}}))}));Qe.displayName="Line3D";const et={position:[0,0,100],fov:75,near:.1,far:1e3},tt=[{type:"ambient",color:"#ffffff",intensity:.5},{type:"directional",position:[10,10,10],intensity:1}];function rt({config:t}){const r=y(),a=_((()=>{switch(t.type){case"ambient":return new e.AmbientLight(t.color,t.intensity);case"directional":const r=new e.DirectionalLight(t.color,t.intensity);return r.position.set(...t.position||[10,10,10]),r.castShadow=t.castShadow||!1,r;case"point":const a=new e.PointLight(t.color,t.intensity,t.distance||0,t.decay||2);return a.position.set(...t.position||[0,0,0]),a.castShadow=t.castShadow||!1,a;case"spot":const o=new e.SpotLight(t.color,t.intensity,t.distance||0,t.angle||Math.PI/6,t.penumbra||0,t.decay||2);return o.position.set(...t.position||[0,10,0]),o.castShadow=t.castShadow||!1,o;case"hemisphere":const n=new e.HemisphereLight(t.skyColor||"#ffffff",t.groundColor||"#444444",t.intensity||1);return n.position.set(...t.position||[0,10,0]),n;default:return new e.AmbientLight("#ffffff",.5)}}),[t]);return b((()=>{r.current&&(void 0!==t.intensity&&(r.current.intensity=t.intensity),void 0!==t.color&&r.current.color.set(t.color))}),[t.intensity,t.color]),m.createElement("primitive",{ref:r,object:a})}function at({config:t}){const r=y(),a=_((()=>{if(!t.geometry)return new e.BoxGeometry(1,1,1);const r=t.geometry;switch(r.type){case"box":return new e.BoxGeometry(r.width||1,r.height||1,r.depth||1);case"sphere":return new e.SphereGeometry(r.radius||1,r.widthSegments||32,r.heightSegments||16);case"cylinder":return new e.CylinderGeometry(r.radiusTop||1,r.radiusBottom||1,r.height||1,r.radialSegments||32);case"plane":return new e.PlaneGeometry(r.width||1,r.height||1);case"torus":return new e.TorusGeometry(r.radius||1,r.tube||.4,r.radialSegments||16,r.tubularSegments||100);case"cone":return new e.ConeGeometry(r.radius||1,r.height||1,r.radialSegments||32);default:return new e.BoxGeometry(1,1,1)}}),[t.geometry]),o=_((()=>{if(!t.material)return new e.MeshStandardMaterial({color:"#888888"});const r=t.material;switch(r.type){case"basic":return new e.MeshBasicMaterial({color:r.color||"#888888",transparent:r.transparent||!1,opacity:void 0!==r.opacity?r.opacity:1,wireframe:r.wireframe||!1});case"standard":return new e.MeshStandardMaterial({color:r.color||"#888888",roughness:void 0!==r.roughness?r.roughness:.5,metalness:void 0!==r.metalness?r.metalness:.5,transparent:r.transparent||!1,opacity:void 0!==r.opacity?r.opacity:1,wireframe:r.wireframe||!1});case"phong":return new e.MeshPhongMaterial({color:r.color||"#888888",shininess:r.shininess||30,transparent:r.transparent||!1,opacity:void 0!==r.opacity?r.opacity:1});case"lambert":return new e.MeshLambertMaterial({color:r.color||"#888888",transparent:r.transparent||!1,opacity:void 0!==r.opacity?r.opacity:1});default:return new e.MeshStandardMaterial({color:r.color||"#888888"})}}),[t.material]);return S((e=>{if(t.animation&&r.current){const{rotation:a,position:o}=t.animation;a&&(a[0]&&(r.current.rotation.x+=a[0]),a[1]&&(r.current.rotation.y+=a[1]),a[2]&&(r.current.rotation.z+=a[2])),o&&o.speed&&(r.current.position.y=Math.sin(e.clock.elapsedTime*o.speed)*(o.amplitude||1))}})),b((()=>()=>{a.dispose(),o.dispose()}),[a,o]),m.createElement("mesh",{ref:r,geometry:a,material:o,position:t.position||[0,0,0],rotation:t.rotation||[0,0,0],scale:t.scale||[1,1,1],castShadow:!1!==t.castShadow,receiveShadow:!1!==t.receiveShadow})}function ot({type:e,config:t={}}){const{camera:r,gl:a}=C(),o=_((()=>({enableDamping:!1!==t.enableDamping,dampingFactor:t.dampingFactor||.05,enableZoom:!1!==t.enableZoom,enablePan:!1!==t.enablePan,enableRotate:!1!==t.enableRotate,autoRotate:t.autoRotate||!1,autoRotateSpeed:t.autoRotateSpeed||1,minDistance:t.minDistance||0,maxDistance:t.maxDistance||1/0,...t})),[t]);switch(e){case"orbit":default:return m.createElement(I,z({},o,{args:[r,a.domElement]}));case"trackball":return m.createElement(L,z({},o,{args:[r,a.domElement]}));case"fly":return m.createElement(D,z({},o,{args:[r,a.domElement]}))}}function nt({config:e}){return S(((e,t)=>{})),null}function it({sceneConfig:t,controls:r,animation:a}){const{scene:o}=C();b((()=>{t?.backgroundColor&&(o.background=new e.Color(t.backgroundColor)),t?.fog&&(o.fog=new e.Fog(t.fog.color||0,t.fog.near||1,t.fog.far||1e3))}),[o,t]);const n=_((()=>(t?.lights||tt).map(((e,t)=>m.createElement(rt,{key:`light-${t}`,config:e})))),[t?.lights]),i=_((()=>t?.objects?t.objects.map(((e,t)=>"mesh"===e.type?m.createElement(at,{key:`mesh-${t}`,config:e}):null)):null),[t?.objects]);return m.createElement(m.Fragment,null,n,i,m.createElement(ot,{type:r,config:a}),m.createElement(nt,{config:a}))}class st extends m.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error("ThreeScene error:",e,t)}render(){return this.state.hasError?m.createElement("div",{style:{padding:"20px",color:"red",textAlign:"center"}},m.createElement("h3",null,"WebGL Error"),m.createElement("p",null,"Failed to initialize 3D scene. Please check your browser supports WebGL."),m.createElement("p",{style:{fontSize:"12px",color:"#666"}},this.state.error?.message)):this.props.children}}const ct=g((({props:e,style:t},r)=>{const{config:a}=e||{},[o,n]=w(!0),[i,s]=w(null),c=y(),l=a?.scene||{},d=l?.camera||et,h=a?.controls||"orbit",f=a?.animation||{},u=_((()=>({position:d.position||et.position,fov:d.fov||et.fov,near:d.near||et.near,far:d.far||et.far})),[d]),p=_((()=>({gl:{antialias:!0,alpha:!0,powerPreference:"high-performance"},camera:u,onCreated:()=>n(!1),onError:e=>{console.error("Canvas error:",e),s(e),n(!1)}})),[u]);return E(r,(()=>({getCanvas:()=>c.current,getScene:()=>c.current?.scene,getCamera:()=>c.current?.camera,getRenderer:()=>c.current?.gl,screenshot:(e="image/png")=>{const t=c.current?.gl;return t?t.domElement.toDataURL(e):null}})),[]),i?m.createElement("div",{style:{...t,display:"flex",alignItems:"center",justifyContent:"center"}},m.createElement("div",{style:{color:"red",textAlign:"center"}},m.createElement("p",null,"Failed to load 3D scene"),m.createElement("p",{style:{fontSize:"12px"}},i.message))):m.createElement("div",{id:e?.id,style:{...t,position:"relative"}},o&&m.createElement("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",background:"#f5f5f5",zIndex:1}},"Loading 3D Scene..."),m.createElement(st,null,m.createElement(T,z({ref:c},p,{style:{width:"100%",height:"100%"}}),m.createElement(it,{sceneConfig:l,controls:h,animation:f}))))}));ct.displayName="ThreeScene";const lt=/^[og]\s*(.+)?/,dt=/^mtllib /,ht=/^usemtl /,ft=/^usemap /,ut=/\s+/,pt=new t,mt=new t,gt=new t,yt=new t,bt=new t,vt=new r;function wt(){const e={objects:[],object:{},vertices:[],normals:[],colors:[],uvs:[],materials:{},materialLibraries:[],startObject:function(e,t){if(this.object&&!1===this.object.fromDeclaration)return this.object.name=e,void(this.object.fromDeclaration=!1!==t);const r=this.object&&"function"==typeof this.object.currentMaterial?this.object.currentMaterial():void 0;if(this.object&&"function"==typeof this.object._finalize&&this.object._finalize(!0),this.object={name:e||"",fromDeclaration:!1!==t,geometry:{vertices:[],normals:[],colors:[],uvs:[],hasUVIndices:!1},materials:[],smooth:!0,startMaterial:function(e,t){const r=this._finalize(!1);r&&(r.inherited||r.groupCount<=0)&&this.materials.splice(r.index,1);const a={index:this.materials.length,name:e||"",mtllib:Array.isArray(t)&&t.length>0?t[t.length-1]:"",smooth:void 0!==r?r.smooth:this.smooth,groupStart:void 0!==r?r.groupEnd:0,groupEnd:-1,groupCount:-1,inherited:!1,clone:function(e){const t={index:"number"==typeof e?e:this.index,name:this.name,mtllib:this.mtllib,smooth:this.smooth,groupStart:0,groupEnd:-1,groupCount:-1,inherited:!1};return t.clone=this.clone.bind(t),t}};return this.materials.push(a),a},currentMaterial:function(){if(this.materials.length>0)return this.materials[this.materials.length-1]},_finalize:function(e){const t=this.currentMaterial();if(t&&-1===t.groupEnd&&(t.groupEnd=this.geometry.vertices.length/3,t.groupCount=t.groupEnd-t.groupStart,t.inherited=!1),e&&this.materials.length>1)for(let e=this.materials.length-1;e>=0;e--)this.materials[e].groupCount<=0&&this.materials.splice(e,1);return e&&0===this.materials.length&&this.materials.push({name:"",smooth:this.smooth}),t}},r&&r.name&&"function"==typeof r.clone){const e=r.clone(0);e.inherited=!0,this.object.materials.push(e)}this.objects.push(this.object)},finalize:function(){this.object&&"function"==typeof this.object._finalize&&this.object._finalize(!0)},parseVertexIndex:function(e,t){const r=parseInt(e,10);return 3*(r>=0?r-1:r+t/3)},parseNormalIndex:function(e,t){const r=parseInt(e,10);return 3*(r>=0?r-1:r+t/3)},parseUVIndex:function(e,t){const r=parseInt(e,10);return 2*(r>=0?r-1:r+t/2)},addVertex:function(e,t,r){const a=this.vertices,o=this.object.geometry.vertices;o.push(a[e+0],a[e+1],a[e+2]),o.push(a[t+0],a[t+1],a[t+2]),o.push(a[r+0],a[r+1],a[r+2])},addVertexPoint:function(e){const t=this.vertices;this.object.geometry.vertices.push(t[e+0],t[e+1],t[e+2])},addVertexLine:function(e){const t=this.vertices;this.object.geometry.vertices.push(t[e+0],t[e+1],t[e+2])},addNormal:function(e,t,r){const a=this.normals,o=this.object.geometry.normals;o.push(a[e+0],a[e+1],a[e+2]),o.push(a[t+0],a[t+1],a[t+2]),o.push(a[r+0],a[r+1],a[r+2])},addFaceNormal:function(e,t,r){const a=this.vertices,o=this.object.geometry.normals;pt.fromArray(a,e),mt.fromArray(a,t),gt.fromArray(a,r),bt.subVectors(gt,mt),yt.subVectors(pt,mt),bt.cross(yt),bt.normalize(),o.push(bt.x,bt.y,bt.z),o.push(bt.x,bt.y,bt.z),o.push(bt.x,bt.y,bt.z)},addColor:function(e,t,r){const a=this.colors,o=this.object.geometry.colors;void 0!==a[e]&&o.push(a[e+0],a[e+1],a[e+2]),void 0!==a[t]&&o.push(a[t+0],a[t+1],a[t+2]),void 0!==a[r]&&o.push(a[r+0],a[r+1],a[r+2])},addUV:function(e,t,r){const a=this.uvs,o=this.object.geometry.uvs;o.push(a[e+0],a[e+1]),o.push(a[t+0],a[t+1]),o.push(a[r+0],a[r+1])},addDefaultUV:function(){const e=this.object.geometry.uvs;e.push(0,0),e.push(0,0),e.push(0,0)},addUVLine:function(e){const t=this.uvs;this.object.geometry.uvs.push(t[e+0],t[e+1])},addFace:function(e,t,r,a,o,n,i,s,c){const l=this.vertices.length;let d=this.parseVertexIndex(e,l),h=this.parseVertexIndex(t,l),f=this.parseVertexIndex(r,l);if(this.addVertex(d,h,f),this.addColor(d,h,f),void 0!==i&&""!==i){const e=this.normals.length;d=this.parseNormalIndex(i,e),h=this.parseNormalIndex(s,e),f=this.parseNormalIndex(c,e),this.addNormal(d,h,f)}else this.addFaceNormal(d,h,f);if(void 0!==a&&""!==a){const e=this.uvs.length;d=this.parseUVIndex(a,e),h=this.parseUVIndex(o,e),f=this.parseUVIndex(n,e),this.addUV(d,h,f),this.object.geometry.hasUVIndices=!0}else this.addDefaultUV()},addPointGeometry:function(e){this.object.geometry.type="Points";const t=this.vertices.length;for(let r=0,a=e.length;r<a;r++){const a=this.parseVertexIndex(e[r],t);this.addVertexPoint(a),this.addColor(a)}},addLineGeometry:function(e,t){this.object.geometry.type="Line";const r=this.vertices.length,a=this.uvs.length;for(let t=0,a=e.length;t<a;t++)this.addVertexLine(this.parseVertexIndex(e[t],r));for(let e=0,r=t.length;e<r;e++)this.addUVLine(this.parseUVIndex(t[e],a))}};return e.startObject("",!1),e}class xt extends a{constructor(e){super(e),this.materials=null}load(e,t,r,a){const n=this,i=new o(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(function(r){try{t(n.parse(r))}catch(t){a?a(t):console.error(t),n.manager.itemError(e)}}),r,a)}setMaterials(e){return this.materials=e,this}parse(e){const t=new wt;-1!==e.indexOf("\r\n")&&(e=e.replace(/\r\n/g,"\n")),-1!==e.indexOf("\\\n")&&(e=e.replace(/\\\n/g,""));const r=e.split("\n");let a=[];for(let e=0,o=r.length;e<o;e++){const o=r[e].trimStart();if(0===o.length)continue;const n=o.charAt(0);if("#"!==n)if("v"===n){const e=o.split(ut);switch(e[0]){case"v":t.vertices.push(parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3])),e.length>=7?(vt.setRGB(parseFloat(e[4]),parseFloat(e[5]),parseFloat(e[6])).convertSRGBToLinear(),t.colors.push(vt.r,vt.g,vt.b)):t.colors.push(void 0,void 0,void 0);break;case"vn":t.normals.push(parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3]));break;case"vt":t.uvs.push(parseFloat(e[1]),parseFloat(e[2]))}}else if("f"===n){const e=o.slice(1).trim().split(ut),r=[];for(let t=0,a=e.length;t<a;t++){const a=e[t];if(a.length>0){const e=a.split("/");r.push(e)}}const a=r[0];for(let e=1,o=r.length-1;e<o;e++){const o=r[e],n=r[e+1];t.addFace(a[0],o[0],n[0],a[1],o[1],n[1],a[2],o[2],n[2])}}else if("l"===n){const e=o.substring(1).trim().split(" ");let r=[];const a=[];if(-1===o.indexOf("/"))r=e;else for(let t=0,o=e.length;t<o;t++){const o=e[t].split("/");""!==o[0]&&r.push(o[0]),""!==o[1]&&a.push(o[1])}t.addLineGeometry(r,a)}else if("p"===n){const e=o.slice(1).trim().split(" ");t.addPointGeometry(e)}else if(null!==(a=lt.exec(o))){const e=(" "+a[0].slice(1).trim()).slice(1);t.startObject(e)}else if(ht.test(o))t.object.startMaterial(o.substring(7).trim(),t.materialLibraries);else if(dt.test(o))t.materialLibraries.push(o.substring(7).trim());else if(ft.test(o))console.warn('THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.');else if("s"===n){if(a=o.split(" "),a.length>1){const e=a[1].trim().toLowerCase();t.object.smooth="0"!==e&&"off"!==e}else t.object.smooth=!0;const e=t.object.currentMaterial();e&&(e.smooth=t.object.smooth)}else{if("\0"===o)continue;console.warn('THREE.OBJLoader: Unexpected line: "'+o+'"')}}t.finalize();const o=new n;o.materialLibraries=[].concat(t.materialLibraries);if(!0===!(1===t.objects.length&&0===t.objects[0].geometry.vertices.length))for(let e=0,r=t.objects.length;e<r;e++){const r=t.objects[e],a=r.geometry,n=r.materials,m="Line"===a.type,g="Points"===a.type;let y=!1;if(0===a.vertices.length)continue;const b=new i;b.setAttribute("position",new s(a.vertices,3)),a.normals.length>0&&b.setAttribute("normal",new s(a.normals,3)),a.colors.length>0&&(y=!0,b.setAttribute("color",new s(a.colors,3))),!0===a.hasUVIndices&&b.setAttribute("uv",new s(a.uvs,2));const v=[];for(let e=0,r=n.length;e<r;e++){const r=n[e],a=r.name+"_"+r.smooth+"_"+y;let o=t.materials[a];if(null!==this.materials)if(o=this.materials.create(r.name),!m||!o||o instanceof c){if(g&&o&&!(o instanceof d)){const e=new d({size:10,sizeAttenuation:!1});l.prototype.copy.call(e,o),e.color.copy(o.color),e.map=o.map,o=e}}else{const e=new c;l.prototype.copy.call(e,o),e.color.copy(o.color),o=e}void 0===o&&(o=m?new c:g?new d({size:1,sizeAttenuation:!1}):new h,o.name=r.name,o.flatShading=!r.smooth,o.vertexColors=y,t.materials[a]=o),v.push(o)}let w;if(v.length>1){for(let e=0,t=n.length;e<t;e++){const t=n[e];b.addGroup(t.groupStart,t.groupCount,e)}w=m?new f(b,v):g?new u(b,v):new p(b,v)}else w=m?new f(b,v[0]):g?new u(b,v[0]):new p(b,v[0]);w.name=r.name,o.add(w)}else if(t.vertices.length>0){const e=new d({size:1,sizeAttenuation:!1}),r=new i;r.setAttribute("position",new s(t.vertices,3)),t.colors.length>0&&void 0!==t.colors[0]&&(r.setAttribute("color",new s(t.colors,3)),e.vertexColors=!0);const a=new u(r,e);o.add(a)}return o}}class _t extends m.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error("ThreeCustom error:",e,t)}render(){return this.state.hasError?m.createElement("div",{style:{padding:"20px",color:"red",textAlign:"center"}},m.createElement("h3",null,"WebGL Error"),m.createElement("p",null,"Failed to initialize 3D scene. Please check your browser supports WebGL."),m.createElement("p",{style:{fontSize:"12px",color:"#666"}},this.state.error?.message)):this.props.children}}function Et(){return m.createElement("mesh",null,m.createElement("boxGeometry",{args:[1,1,1]}),m.createElement("meshBasicMaterial",{color:"#cccccc",wireframe:!0}))}function At({config:t}){const r=y(),a=_((()=>{switch(t.type){case"ambient":return new e.AmbientLight(t.color,t.intensity);case"directional":const r=new e.DirectionalLight(t.color,t.intensity);return r.position.set(...t.position||[10,10,10]),r.castShadow=t.castShadow||!1,r;case"point":const a=new e.PointLight(t.color,t.intensity,t.distance||0,t.decay||2);return a.position.set(...t.position||[0,0,0]),a.castShadow=t.castShadow||!1,a;case"spot":const o=new e.SpotLight(t.color,t.intensity,t.distance||0,t.angle||Math.PI/6,t.penumbra||0,t.decay||2);return o.position.set(...t.position||[0,10,0]),o.castShadow=t.castShadow||!1,o;case"hemisphere":const n=new e.HemisphereLight(t.skyColor||"#ffffff",t.groundColor||"#444444",t.intensity||1);return n.position.set(...t.position||[0,10,0]),n;default:return new e.AmbientLight("#ffffff",.5)}}),[t]);return m.createElement("primitive",{ref:r,object:a})}function Tt({type:e,config:t={}}){const{camera:r,gl:a}=C(),o=_((()=>({enableDamping:!1!==t.enableDamping,dampingFactor:t.dampingFactor||.05,enableZoom:!1!==t.enableZoom,enablePan:!1!==t.enablePan,enableRotate:!1!==t.enableRotate,autoRotate:t.autoRotate||!1,autoRotateSpeed:t.autoRotateSpeed||1,minDistance:t.minDistance||0,maxDistance:t.maxDistance||1/0,...t})),[t]);switch(e){case"orbit":default:return m.createElement(I,z({},o,{args:[r,a.domElement]}));case"trackball":return m.createElement(L,z({},o,{args:[r,a.domElement]}));case"fly":return m.createElement(D,z({},o,{args:[r,a.domElement]}))}}function Ct(t){if(!t)return new e.MeshStandardMaterial({color:"#888888"});const r=t;switch(r.type){case"basic":return new e.MeshBasicMaterial({color:r.color||"#888888",transparent:r.transparent||!1,opacity:void 0!==r.opacity?r.opacity:1,wireframe:r.wireframe||!1});case"standard":const t=new e.MeshStandardMaterial({color:r.color||"#888888",roughness:void 0!==r.roughness?r.roughness:.5,metalness:void 0!==r.metalness?r.metalness:.5,transparent:r.transparent||!1,opacity:void 0!==r.opacity?r.opacity:1,wireframe:r.wireframe||!1});return r.map,t;case"phong":return new e.MeshPhongMaterial({color:r.color||"#888888",shininess:r.shininess||30,transparent:r.transparent||!1,opacity:void 0!==r.opacity?r.opacity:1});case"lambert":return new e.MeshLambertMaterial({color:r.color||"#888888",transparent:r.transparent||!1,opacity:void 0!==r.opacity?r.opacity:1});case"physical":return new e.MeshPhysicalMaterial({color:r.color||"#888888",roughness:void 0!==r.roughness?r.roughness:.5,metalness:void 0!==r.metalness?r.metalness:.5,clearcoat:r.clearcoat||0,clearcoatRoughness:r.clearcoatRoughness||0,transparent:r.transparent||!1,opacity:void 0!==r.opacity?r.opacity:1});default:return new e.MeshStandardMaterial({color:r.color||"#888888"})}}function St({url:e,config:t,onLoad:r,onError:a}){const o=y(),[n,i]=w(null),s=R(e,!0);return b((()=>{if(!s){const e=new Error("Failed to load GLTF model");i(e),a&&a(e)}}),[s,a]),b((()=>{s&&r&&r(s)}),[s,r]),S((e=>{if(!o.current||!t?.animation)return;const r=t.animation;if(r.autoRotate){const e=r.speed||.01;o.current.rotation.y+=e}r.rotation&&(o.current.rotation.x+=r.rotation[0]||0,o.current.rotation.y+=r.rotation[1]||0,o.current.rotation.z+=r.rotation[2]||0)})),b((()=>{if(!o.current||!t?.material)return;const e=Ct(t.material);return o.current.traverse((t=>{t.isMesh&&(t.material=e)})),()=>{e.dispose()}}),[t?.material]),n?m.createElement("mesh",null,m.createElement("boxGeometry",{args:[1,1,1]}),m.createElement("meshBasicMaterial",{color:"#ff0000",wireframe:!0})):s?m.createElement("group",{ref:o,position:t?.position||[0,0,0],rotation:t?.rotation||[0,0,0],scale:t?.scale||[1,1,1]},m.createElement("primitive",{object:s.scene})):m.createElement(Et,null)}function It({url:e,config:t,onLoad:r,onError:a}){const o=y(),[n,i]=w(null),[s,c]=w(null);return b((()=>{(new xt).load(e,(e=>{i(e),r&&r(e)}),void 0,(e=>{console.error("Error loading OBJ:",e),c(e),a&&a(e)}))}),[e,r,a]),S((()=>{if(!o.current||!t?.animation)return;const e=t.animation;if(e.autoRotate){const t=e.speed||.01;o.current.rotation.y+=t}e.rotation&&(o.current.rotation.x+=e.rotation[0]||0,o.current.rotation.y+=e.rotation[1]||0,o.current.rotation.z+=e.rotation[2]||0)})),b((()=>{if(!o.current||!t?.material)return;const e=Ct(t.material);return o.current.traverse((t=>{t.isMesh&&(t.material=e)})),()=>{e.dispose()}}),[t?.material]),s?m.createElement("mesh",null,m.createElement("boxGeometry",{args:[1,1,1]}),m.createElement("meshBasicMaterial",{color:"#ff0000",wireframe:!0})):n?m.createElement("group",{ref:o,position:t?.position||[0,0,0],rotation:t?.rotation||[0,0,0],scale:t?.scale||[1,1,1]},m.createElement("primitive",{object:n})):m.createElement(Et,null)}function Dt({config:t}){const r=y(),a=_((()=>{if(!t?.geometry)return new e.BoxGeometry(1,1,1);const r=t.geometry;switch(r.type){case"box":return new e.BoxGeometry(r.width||1,r.height||1,r.depth||1);case"sphere":return new e.SphereGeometry(r.radius||1,r.widthSegments||32,r.heightSegments||16);case"cylinder":return new e.CylinderGeometry(r.radiusTop||1,r.radiusBottom||1,r.height||1,r.radialSegments||32);case"plane":return new e.PlaneGeometry(r.width||1,r.height||1);case"torus":return new e.TorusGeometry(r.radius||1,r.tube||.4,r.radialSegments||16,r.tubularSegments||100);case"cone":return new e.ConeGeometry(r.radius||1,r.height||1,r.radialSegments||32);case"buffer":if(r.vertices){const t=new e.BufferGeometry;return t.setAttribute("position",new e.Float32BufferAttribute(r.vertices,3)),r.normals&&t.setAttribute("normal",new e.Float32BufferAttribute(r.normals,3)),r.uvs&&t.setAttribute("uv",new e.Float32BufferAttribute(r.uvs,2)),r.indices&&t.setIndex(r.indices),t}return new e.BoxGeometry(1,1,1);default:return new e.BoxGeometry(1,1,1)}}),[t?.geometry]),o=_((()=>Ct(t?.material)),[t?.material]);return S((()=>{if(!r.current||!t?.animation)return;const e=t.animation;if(e.autoRotate){const t=e.speed||.01;r.current.rotation.y+=t}e.rotation&&(r.current.rotation.x+=e.rotation[0]||0,r.current.rotation.y+=e.rotation[1]||0,r.current.rotation.z+=e.rotation[2]||0)})),b((()=>()=>{a.dispose(),o.dispose()}),[a,o]),m.createElement("mesh",{ref:r,geometry:a,material:o,position:t?.position||[0,0,0],rotation:t?.rotation||[0,0,0],scale:t?.scale||[1,1,1],castShadow:!1!==t?.castShadow,receiveShadow:!1!==t?.receiveShadow})}function Lt({config:e,onLoad:t,onError:r}){switch(e?.format||"geometry"){case"gltf":case"glb":return m.createElement(St,{url:e.url,config:e,onLoad:t,onError:r});case"obj":return m.createElement(It,{url:e.url,config:e,onLoad:t,onError:r});default:return m.createElement(Dt,{config:e})}}function Mt({sceneConfig:t,controls:r,animation:a,onModelLoad:o,onModelError:n}){const{scene:i}=C();b((()=>{t?.backgroundColor&&(i.background=new e.Color(t.backgroundColor)),t?.fog&&(i.fog=new e.Fog(t.fog.color||0,t.fog.near||1,t.fog.far||1e3))}),[i,t]);const s=_((()=>(t?.lights||[{type:"ambient",color:"#ffffff",intensity:.5},{type:"directional",position:[10,10,10],intensity:1}]).map(((e,t)=>m.createElement(At,{key:`light-${t}`,config:e})))),[t?.lights]);return m.createElement(m.Fragment,null,s,m.createElement(M,{fit:!0,clip:!0,observe:!0,margin:1.2},m.createElement(k,null,m.createElement(Lt,{config:t?.model,onLoad:o,onError:n}))),m.createElement(Tt,{type:r,config:a}))}const kt=g((({props:e,style:t},r)=>{const{config:a}=e||{},[o,n]=w(!0),[i,s]=w(null),c=y(),l=a?.scene||{},d=l?.camera||{position:[0,0,100],fov:75,near:.1,far:1e3},h=a?.controls||"orbit",f=a?.animation||{},u=_((()=>({position:d.position||[0,0,100],fov:d.fov||75,near:d.near||.1,far:d.far||1e3})),[d]),p=x((()=>{n(!1)}),[]),g=x((e=>{console.error("Model loading error:",e),s(e),n(!1)}),[]);return E(r,(()=>({getCanvas:()=>c.current,getScene:()=>c.current?.scene,getCamera:()=>c.current?.camera,getRenderer:()=>c.current?.gl,screenshot:(e="image/png")=>{const t=c.current?.gl;return t?t.domElement.toDataURL(e):null}})),[]),i?m.createElement("div",{style:{...t,display:"flex",alignItems:"center",justifyContent:"center"}},m.createElement("div",{style:{color:"red",textAlign:"center"}},m.createElement("p",null,"Failed to load 3D model"),m.createElement("p",{style:{fontSize:"12px"}},i.message))):m.createElement("div",{id:e?.id,style:{...t,position:"relative"}},o&&m.createElement("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",background:"#f5f5f5",zIndex:1}},"Loading 3D Model..."),m.createElement(_t,null,m.createElement(T,{ref:c,gl:{antialias:!0,alpha:!0,powerPreference:"high-performance"},camera:u,style:{width:"100%",height:"100%"}},m.createElement(Mt,{sceneConfig:l,controls:h,animation:f,onModelLoad:p,onModelError:g}))))}));kt.displayName="ThreeCustom";class Rt{constructor(e={}){this.scenes=new Map,this.activeSceneId=null,this.defaultOptions={backgroundColor:0,fog:null,...e}}createScene(t,r={}){if(this.scenes.has(t))return console.warn(`Scene with id "${t}" already exists. Returning existing scene.`),this.scenes.get(t).scene;const a=new e.Scene,o={...this.defaultOptions,...r};return void 0!==o.backgroundColor&&(a.background=new e.Color(o.backgroundColor)),o.fog&&(a.fog=new e.Fog(o.fog.color||0,o.fog.near||1,o.fog.far||1e3)),this.scenes.set(t,{scene:a,config:o,objects:new Map,createdAt:Date.now()}),this.activeSceneId||(this.activeSceneId=t),a}getScene(e){const t=this.scenes.get(e);return t?t.scene:null}getActiveScene(){return this.activeSceneId?this.getScene(this.activeSceneId):null}setActiveScene(e){if(!this.scenes.has(e))throw new Error(`Scene with id "${e}" does not exist`);this.activeSceneId=e}addObject(e,t,r){const a=this.scenes.get(e);if(!a)throw new Error(`Scene with id "${e}" does not exist`);a.scene.add(r),a.objects.set(t,r)}removeObject(e,t){const r=this.scenes.get(e);if(!r)return;const a=r.objects.get(t);a&&(r.scene.remove(a),this.disposeObject(a),r.objects.delete(t))}getObject(e,t){const r=this.scenes.get(e);return r&&r.objects.get(t)||null}clearScene(e){const t=this.scenes.get(e);t&&(t.objects.forEach(((e,r)=>{t.scene.remove(e),this.disposeObject(e)})),t.objects.clear())}removeScene(e){const t=this.scenes.get(e);if(t&&(this.clearScene(e),t.scene.background&&t.scene.background.dispose&&t.scene.background.dispose(),this.scenes.delete(e),this.activeSceneId===e)){const e=Array.from(this.scenes.keys());this.activeSceneId=e.length>0?e[0]:null}}disposeObject(e){e&&e.traverse((e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach((e=>this.disposeMaterial(e))):this.disposeMaterial(e.material))}))}disposeMaterial(e){e&&(Object.keys(e).forEach((t=>{const r=e[t];r&&r.isTexture&&r.dispose()})),e.dispose())}getSceneIds(){return Array.from(this.scenes.keys())}dispose(){this.getSceneIds().forEach((e=>this.removeScene(e))),this.activeSceneId=null}}var zt=Object.freeze({__proto__:null,SceneManager:Rt,createSceneFromConfig:function(t={}){const r=new e.Scene;return t.backgroundColor&&(r.background=new e.Color(t.backgroundColor)),t.fog&&(r.fog=new e.Fog(t.fog.color||0,t.fog.near||1,t.fog.far||1e3)),r},default:Rt});const $t={PERSPECTIVE:"perspective",ORTHOGRAPHIC:"orthographic"};class Ot{constructor(e={}){this.cameras=new Map,this.activeCameraId=null,this.defaultOptions={type:$t.PERSPECTIVE,position:[0,0,100],target:[0,0,0],up:[0,1,0],...e}}createPerspectiveCamera(t,r={}){const a={fov:75,near:.1,far:1e3,aspect:window.innerWidth/window.innerHeight,...this.defaultOptions,...r},o=new e.PerspectiveCamera(a.fov,a.aspect,a.near,a.far);return this.setupCamera(o,a),this.storeCamera(t,o,a),o}createOrthographicCamera(t,r={}){const a={left:-50,right:50,top:50,bottom:-50,near:.1,far:1e3,...this.defaultOptions,...r},o=new e.OrthographicCamera(a.left,a.right,a.top,a.bottom,a.near,a.far);return this.setupCamera(o,a),this.storeCamera(t,o,a),o}setupCamera(e,t){t.position&&e.position.set(...t.position),t.up&&e.up.set(...t.up),t.target&&e.lookAt(...t.target)}storeCamera(e,t,r){this.cameras.has(e)&&(console.warn(`Camera with id "${e}" already exists. Replacing.`),this.disposeCamera(e)),this.cameras.set(e,{camera:t,config:r,createdAt:Date.now()}),this.activeCameraId||(this.activeCameraId=e)}createCamera(e,t={}){const r=t.type||this.defaultOptions.type;switch(r){case $t.PERSPECTIVE:return this.createPerspectiveCamera(e,t);case $t.ORTHOGRAPHIC:return this.createOrthographicCamera(e,t);default:throw new Error(`Unknown camera type: ${r}`)}}getCamera(e){const t=this.cameras.get(e);return t?t.camera:null}getActiveCamera(){return this.activeCameraId?this.getCamera(this.activeCameraId):null}setActiveCamera(e){if(!this.cameras.has(e))throw new Error(`Camera with id "${e}" does not exist`);this.activeCameraId=e}updateAspectRatio(e,t){const r=this.cameras.get(e);if(!r)return;const a=r.camera;a.isPerspectiveCamera&&(a.aspect=t,a.updateProjectionMatrix())}updateOrthographicBounds(e,t){const r=this.cameras.get(e);if(!r)return;const a=r.camera;a.isOrthographicCamera&&(Object.assign(a,t),a.updateProjectionMatrix())}async animateTo(t,r,a=1e3){const o=this.getCamera(t);if(!o)throw new Error(`Camera with id "${t}" does not exist`);const n=o.position.clone(),i=new e.Vector3(0,0,-1).applyQuaternion(o.quaternion).add(o.position),s=new e.Vector3(...r.position||[0,0,100]),c=new e.Vector3(...r.target||[0,0,0]),l=Date.now();return new Promise((t=>{const r=()=>{const d=Date.now()-l,h=Math.min(d/a,1),f=h<.5?4*h*h*h:1-Math.pow(-2*h+2,3)/2;o.position.lerpVectors(n,s,f);const u=(new e.Vector3).lerpVectors(i,c,f);o.lookAt(u),h<1?requestAnimationFrame(r):t()};r()}))}async resetCamera(e,t=1e3){const r=this.cameras.get(e);if(!r)return;const a=r.config;await this.animateTo(e,{position:a.position,target:a.target},t)}removeCamera(e){if(this.disposeCamera(e),this.cameras.delete(e),this.activeCameraId===e){const e=Array.from(this.cameras.keys());this.activeCameraId=e.length>0?e[0]:null}}disposeCamera(e){const t=this.cameras.get(e);t&&(t.camera=null)}getCameraIds(){return Array.from(this.cameras.keys())}dispose(){this.getCameraIds().forEach((e=>this.removeCamera(e))),this.activeCameraId=null}}var jt=Object.freeze({__proto__:null,CameraType:$t,CameraManager:Ot,createCameraFromConfig:function(t={}){let r;return r=(t.type||$t.PERSPECTIVE)===$t.PERSPECTIVE?new e.PerspectiveCamera(t.fov||75,t.aspect||window.innerWidth/window.innerHeight,t.near||.1,t.far||1e3):new e.OrthographicCamera(t.left||-50,t.right||50,t.top||50,t.bottom||-50,t.near||.1,t.far||1e3),t.position&&r.position.set(...t.position),t.up&&r.up.set(...t.up),t.target&&r.lookAt(...t.target),r},default:Ot});const Pt={AMBIENT:"ambient",DIRECTIONAL:"directional",POINT:"point",SPOT:"spot",HEMISPHERE:"hemisphere",RECT_AREA:"rectArea"};class Gt{constructor(){this.lights=new Map,this.lightGroups=new Map}createAmbientLight(t,r={}){const a={color:16777215,intensity:.5,...r},o=new e.AmbientLight(a.color,a.intensity);return this.storeLight(t,o,Pt.AMBIENT,a),o}createDirectionalLight(t,r={}){const a={color:16777215,intensity:1,position:[10,10,10],target:[0,0,0],castShadow:!1,shadow:null,...r},o=new e.DirectionalLight(a.color,a.intensity);return o.position.set(...a.position),o.target.position.set(...a.target),a.castShadow&&(o.castShadow=!0,this.configureShadow(o,a.shadow)),this.storeLight(t,o,Pt.DIRECTIONAL,a),o}createPointLight(t,r={}){const a={color:16777215,intensity:1,distance:0,decay:2,position:[0,0,0],castShadow:!1,shadow:null,...r},o=new e.PointLight(a.color,a.intensity,a.distance,a.decay);return o.position.set(...a.position),a.castShadow&&(o.castShadow=!0,this.configureShadow(o,a.shadow)),this.storeLight(t,o,Pt.POINT,a),o}createSpotLight(t,r={}){const a={color:16777215,intensity:1,distance:0,angle:Math.PI/6,penumbra:0,decay:2,position:[0,10,0],target:[0,0,0],castShadow:!1,shadow:null,...r},o=new e.SpotLight(a.color,a.intensity,a.distance,a.angle,a.penumbra,a.decay);return o.position.set(...a.position),o.target.position.set(...a.target),a.castShadow&&(o.castShadow=!0,this.configureShadow(o,a.shadow)),this.storeLight(t,o,Pt.SPOT,a),o}createHemisphereLight(t,r={}){const a={skyColor:16777215,groundColor:4473924,intensity:1,position:[0,10,0],...r},o=new e.HemisphereLight(a.skyColor,a.groundColor,a.intensity);return o.position.set(...a.position),this.storeLight(t,o,Pt.HEMISPHERE,a),o}configureShadow(e,t={}){if(!e.shadow)return;const r={mapSize:{width:1024,height:1024},camera:{near:.5,far:500,left:-50,right:50,top:50,bottom:-50},bias:-.001,radius:1,...t};r.mapSize&&(e.shadow.mapSize.width=r.mapSize.width,e.shadow.mapSize.height=r.mapSize.height),r.camera&&e.shadow.camera&&(Object.assign(e.shadow.camera,r.camera),e.shadow.camera.updateProjectionMatrix()),void 0!==r.bias&&(e.shadow.bias=r.bias),void 0!==r.radius&&(e.shadow.radius=r.radius)}storeLight(e,t,r,a){this.lights.has(e)&&(console.warn(`Light with id "${e}" already exists. Replacing.`),this.disposeLight(e)),this.lights.set(e,{light:t,type:r,config:a,createdAt:Date.now()})}createLight(e,t={}){const r=t.type||Pt.AMBIENT;switch(r){case Pt.AMBIENT:return this.createAmbientLight(e,t);case Pt.DIRECTIONAL:return this.createDirectionalLight(e,t);case Pt.POINT:return this.createPointLight(e,t);case Pt.SPOT:return this.createSpotLight(e,t);case Pt.HEMISPHERE:return this.createHemisphereLight(e,t);default:throw new Error(`Unknown light type: ${r}`)}}getLight(e){const t=this.lights.get(e);return t?t.light:null}updateIntensity(e,t){const r=this.lights.get(e);r&&r.light&&(r.light.intensity=t)}updateColor(e,t){const r=this.lights.get(e);r&&r.light&&r.light.color.set(t)}updatePosition(e,t){const r=this.lights.get(e);r&&r.light&&r.light.position.set(...t)}createLightGroup(t,r=[]){const a=new e.Group;return r.forEach((e=>{const t=this.lights.get(e);t&&a.add(t.light)})),this.lightGroups.set(t,{group:a,lightIds:r}),a}getLightGroup(e){const t=this.lightGroups.get(e);return t?t.group:null}removeLight(e){this.disposeLight(e),this.lights.delete(e)}disposeLight(e){const t=this.lights.get(e);if(!t)return;const r=t.light;r.shadow&&r.shadow.map&&r.shadow.map.dispose(),this.lightGroups.forEach((e=>{e.group.remove(r)})),t.light=null}removeLightGroup(e){const t=this.lightGroups.get(e);t&&(t.lightIds.forEach((e=>{const r=this.lights.get(e);r&&t.group.remove(r.light)})),this.lightGroups.delete(e))}getLightIds(){return Array.from(this.lights.keys())}dispose(){this.getLightIds().forEach((e=>this.removeLight(e))),this.lightGroups.clear()}}function Nt(e=[]){const t=new Gt,r=[];return e.forEach(((e,a)=>{const o=e.id||`light_${a}`,n=t.createLight(o,e);r.push(n)})),r}var Ft=Object.freeze({__proto__:null,LightType:Pt,LightingManager:Gt,createLightsFromConfig:Nt,createDefaultLighting:function(){return Nt([{type:Pt.AMBIENT,color:16777215,intensity:.5},{type:Pt.DIRECTIONAL,color:16777215,intensity:1,position:[10,10,10],castShadow:!0}])},default:Gt});class Vt{constructor(e={}){this.renderers=new Map,this.activeRendererId=null,this.defaultOptions={antialias:!0,alpha:!0,powerPreference:"high-performance",precision:"highp",stencil:!1,depth:!0,logarithmicDepthBuffer:!1,...e}}createRenderer(t,r,a={}){if(this.renderers.has(t))return console.warn(`Renderer with id "${t}" already exists. Returning existing renderer.`),this.renderers.get(t).renderer;const o={...this.defaultOptions,...a},n=new e.WebGLRenderer({canvas:r,antialias:o.antialias,alpha:o.alpha,powerPreference:o.powerPreference,stencil:o.stencil,depth:o.depth,logarithmicDepthBuffer:o.logarithmicDepthBuffer});return this.configureRenderer(n,o),this.renderers.set(t,{renderer:n,config:o,canvas:r,resizeObserver:null,createdAt:Date.now()}),this.activeRendererId||(this.activeRendererId=t),n}configureRenderer(t,r){const a=Math.min(window.devicePixelRatio,2);t.setPixelRatio(a),r.width&&r.height&&t.setSize(r.width,r.height),r.precision&&(t.capabilities.precision=r.precision),!1!==r.shadowMap&&(t.shadowMap.enabled=!0,t.shadowMap.type=r.shadowMapType||e.PCFSoftShadowMap),t.outputColorSpace=e.SRGBColorSpace,r.toneMapping&&(t.toneMapping=r.toneMapping,r.toneMappingExposure&&(t.toneMappingExposure=r.toneMappingExposure)),void 0!==r.clearColor&&t.setClearColor(r.clearColor,r.clearAlpha??1)}getRenderer(e){const t=this.renderers.get(e);return t?t.renderer:null}getActiveRenderer(){return this.activeRendererId?this.getRenderer(this.activeRendererId):null}setActiveRenderer(e){if(!this.renderers.has(e))throw new Error(`Renderer with id "${e}" does not exist`);this.activeRendererId=e}updateSize(e,t,r){const a=this.renderers.get(e);if(!a)return;a.renderer.setSize(t,r),a.config.width=t,a.config.height=r}updatePixelRatio(e,t){const r=this.renderers.get(e);if(!r)return;r.renderer.setPixelRatio(Math.min(t,2))}enableAutoResize(e,t){const r=this.renderers.get(e);if(!r)return;r.resizeObserver&&r.resizeObserver.disconnect();const a=new ResizeObserver((t=>{for(const r of t){const{width:t,height:a}=r.contentRect;this.updateSize(e,t,a)}}));a.observe(t),r.resizeObserver=a}disableAutoResize(e){const t=this.renderers.get(e);t&&t.resizeObserver&&(t.resizeObserver.disconnect(),t.resizeObserver=null)}render(e,t,r){const a=this.getRenderer(e);a&&a.render(t,r)}takeScreenshot(e,t="image/png",r=1){const a=this.getRenderer(e);return a?a.domElement.toDataURL(t,r):null}getWebGLInfo(e){const t=this.getRenderer(e);return t?{renderer:t.info.render,memory:t.info.memory,programs:t.info.programs?.length||0}:null}resetInfo(e){const t=this.getRenderer(e);t&&t.info.reset()}compile(e,t,r){const a=this.getRenderer(e);a&&a.compile(t,r)}removeRenderer(e){const t=this.renderers.get(e);if(t&&(this.disableAutoResize(e),t.renderer.dispose(),this.renderers.delete(e),this.activeRendererId===e)){const e=Array.from(this.renderers.keys());this.activeRendererId=e.length>0?e[0]:null}}getRendererIds(){return Array.from(this.renderers.keys())}dispose(){this.getRendererIds().forEach((e=>this.removeRenderer(e))),this.activeRendererId=null}}var Ut=Object.freeze({__proto__:null,RendererManager:Vt,createRendererFromConfig:function(e,t={}){return new Vt(t).createRenderer("default",e,t)},handleResize:function(e,t,r){const a=r.clientWidth,o=r.clientHeight;if(e.setSize(a,o),t.isPerspectiveCamera)t.aspect=a/o,t.updateProjectionMatrix();else if(t.isOrthographicCamera){const e=a/o,r=Math.max(t.right-t.left,t.top-t.bottom);t.left=-r*e/2,t.right=r*e/2,t.top=r/2,t.bottom=-r/2,t.updateProjectionMatrix()}},default:Vt});var Bt={THREE:e,VERSION:"0.1.0",ThreeJSManager:class{constructor(e={}){this.sceneManager=null,this.cameraManager=null,this.lightingManager=null,this.rendererManager=null,this.options={autoRender:!0,...e},this.animationId=null,this.isRendering=!1}async init(e,t,r={}){if(!this.sceneManager){const{SceneManager:e}=await Promise.resolve().then((function(){return zt}));this.sceneManager=new e}if(!this.cameraManager){const{CameraManager:e}=await Promise.resolve().then((function(){return jt}));this.cameraManager=new e}if(!this.lightingManager){const{LightingManager:e}=await Promise.resolve().then((function(){return Ft}));this.lightingManager=new e}if(!this.rendererManager){const{RendererManager:e}=await Promise.resolve().then((function(){return Ut}));this.rendererManager=new e}const a=this.sceneManager.createScene(`${e}_scene`,r.scene),o=this.cameraManager.createCamera(`${e}_camera`,r.camera);r.lights&&r.lights.forEach(((t,r)=>{const o=this.lightingManager.createLight(`${e}_light_${r}`,t);a.add(o)}));const n=this.rendererManager.createRenderer(`${e}_renderer`,t,r.renderer);return{scene:a,camera:o,renderer:n}}startRenderLoop(e){if(this.isRendering)return;this.isRendering=!0;const t=()=>{this.isRendering&&(this.animationId=requestAnimationFrame(t),e&&e())};t()}stopRenderLoop(){this.isRendering=!1,this.animationId&&(cancelAnimationFrame(this.animationId),this.animationId=null)}render(e,t,r){const a=this.sceneManager.getScene(e),o=this.cameraManager.getCamera(t);a&&o&&this.rendererManager.render(r,a,o)}dispose(){this.stopRenderLoop(),this.sceneManager&&this.sceneManager.dispose(),this.cameraManager&&this.cameraManager.dispose(),this.lightingManager&&this.lightingManager.dispose(),this.rendererManager&&this.rendererManager.dispose()}}};const Wt={version:"3.0.0-1.dev",isSupported(){try{const e=document.createElement("canvas");return!!(e.getContext("webgl2")||e.getContext("webgl")||e.getContext("experimental-webgl"))}catch(e){return!1}},async preload(){const{preloadEChartsGL:e}=await Promise.resolve().then((function(){return de}));e()}};export{We as Bar3D,Qe as Line3D,Ve as Scatter3D,Ze as Surface3D,kt as ThreeCustom,Bt as ThreeJS,ct as ThreeScene,se as cleanupWebGL,Wt as default,ie as display3DError,ne as getLoadingState,ee as getWebGLInfo,ce as handleWebGLContextLoss,Q as isWebGLSupported,ae as loadEChartsGL,oe as preloadEChartsGL};
@@ -0,0 +1 @@
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("three"),require("react"),require("echarts-for-react"),require("@react-three/fiber"),require("@react-three/drei")):"function"==typeof define&&define.amd?define(["exports","three","react","echarts-for-react","@react-three/fiber","@react-three/drei"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Visualify3D={},e.THREE,e.React,e.ReactEcharts,e.ReactThreeFiber,e.ReactThreeDrei)}(this,(function(e,t,r,a,o,n){"use strict";function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var l=i(t),c=s(r),d=s(a);function u(){return u=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)({}).hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},u.apply(null,arguments)}const f=r.forwardRef((({options:e,style:t,onEvents:a={}},o)=>{const n=r.useRef(null),s=o||n;return r.useEffect((()=>{if(s.current){const t=s.current.getEchartsInstance();t.setOption({...e,silent:!0}),JSON.stringify(e)!==JSON.stringify(t.getOption())&&(t.clear(),t.setOption(e)),Object.keys(a).forEach((e=>{t.off(e),t.on(e,a[e])}));const r=new ResizeObserver((()=>{t.resize()})),o=t.getDom().parentElement;return o&&r.observe(o),()=>{r.disconnect(),t.isDisposed()||(t.off(),t.dispose())}}}),[e,s,a]),c.default.createElement(d.default,{ref:s,option:e,style:t})}));!function(e){if(!e||"undefined"==typeof document)return;let t=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t.firstChild?t.insertBefore(r,t.firstChild):t.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}(':root{--toastify-color-light: #fff;--toastify-color-dark: #121212;--toastify-color-info: #3498db;--toastify-color-success: #07bc0c;--toastify-color-warning: #f1c40f;--toastify-color-error: hsl(6, 78%, 57%);--toastify-color-transparent: rgba(255, 255, 255, .7);--toastify-icon-color-info: var(--toastify-color-info);--toastify-icon-color-success: var(--toastify-color-success);--toastify-icon-color-warning: var(--toastify-color-warning);--toastify-icon-color-error: var(--toastify-color-error);--toastify-container-width: fit-content;--toastify-toast-width: 320px;--toastify-toast-offset: 16px;--toastify-toast-top: max(var(--toastify-toast-offset), env(safe-area-inset-top));--toastify-toast-right: max(var(--toastify-toast-offset), env(safe-area-inset-right));--toastify-toast-left: max(var(--toastify-toast-offset), env(safe-area-inset-left));--toastify-toast-bottom: max(var(--toastify-toast-offset), env(safe-area-inset-bottom));--toastify-toast-background: #fff;--toastify-toast-padding: 14px;--toastify-toast-min-height: 64px;--toastify-toast-max-height: 800px;--toastify-toast-bd-radius: 6px;--toastify-toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1);--toastify-font-family: sans-serif;--toastify-z-index: 9999;--toastify-text-color-light: #757575;--toastify-text-color-dark: #fff;--toastify-text-color-info: #fff;--toastify-text-color-success: #fff;--toastify-text-color-warning: #fff;--toastify-text-color-error: #fff;--toastify-spinner-color: #616161;--toastify-spinner-color-empty-area: #e0e0e0;--toastify-color-progress-light: linear-gradient(to right, #4cd964, #5ac8fa, #007aff, #34aadc, #5856d6, #ff2d55);--toastify-color-progress-dark: #bb86fc;--toastify-color-progress-info: var(--toastify-color-info);--toastify-color-progress-success: var(--toastify-color-success);--toastify-color-progress-warning: var(--toastify-color-warning);--toastify-color-progress-error: var(--toastify-color-error);--toastify-color-progress-bgo: .2}.Toastify__toast-container{z-index:var(--toastify-z-index);-webkit-transform:translate3d(0,0,var(--toastify-z-index));position:fixed;width:var(--toastify-container-width);box-sizing:border-box;color:#fff;display:flex;flex-direction:column}.Toastify__toast-container--top-left{top:var(--toastify-toast-top);left:var(--toastify-toast-left)}.Toastify__toast-container--top-center{top:var(--toastify-toast-top);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--top-right{top:var(--toastify-toast-top);right:var(--toastify-toast-right);align-items:end}.Toastify__toast-container--bottom-left{bottom:var(--toastify-toast-bottom);left:var(--toastify-toast-left)}.Toastify__toast-container--bottom-center{bottom:var(--toastify-toast-bottom);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--bottom-right{bottom:var(--toastify-toast-bottom);right:var(--toastify-toast-right);align-items:end}.Toastify__toast{--y: 0;position:relative;touch-action:none;width:var(--toastify-toast-width);min-height:var(--toastify-toast-min-height);box-sizing:border-box;margin-bottom:1rem;padding:var(--toastify-toast-padding);border-radius:var(--toastify-toast-bd-radius);box-shadow:var(--toastify-toast-shadow);max-height:var(--toastify-toast-max-height);font-family:var(--toastify-font-family);z-index:0;display:flex;flex:1 auto;align-items:center;word-break:break-word}@media only screen and (max-width: 480px){.Toastify__toast-container{width:100vw;left:env(safe-area-inset-left);margin:0}.Toastify__toast-container--top-left,.Toastify__toast-container--top-center,.Toastify__toast-container--top-right{top:env(safe-area-inset-top);transform:translate(0)}.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-right{bottom:env(safe-area-inset-bottom);transform:translate(0)}.Toastify__toast-container--rtl{right:env(safe-area-inset-right);left:initial}.Toastify__toast{--toastify-toast-width: 100%;margin-bottom:0;border-radius:0}}.Toastify__toast-container[data-stacked=true]{width:var(--toastify-toast-width)}.Toastify__toast--stacked{position:absolute;width:100%;transform:translate3d(0,var(--y),0) scale(var(--s));transition:transform .3s}.Toastify__toast--stacked[data-collapsed] .Toastify__toast-body,.Toastify__toast--stacked[data-collapsed] .Toastify__close-button{transition:opacity .1s}.Toastify__toast--stacked[data-collapsed=false]{overflow:visible}.Toastify__toast--stacked[data-collapsed=true]:not(:last-child)>*{opacity:0}.Toastify__toast--stacked:after{content:"";position:absolute;left:0;right:0;height:calc(var(--g) * 1px);bottom:100%}.Toastify__toast--stacked[data-pos=top]{top:0}.Toastify__toast--stacked[data-pos=bot]{bottom:0}.Toastify__toast--stacked[data-pos=bot].Toastify__toast--stacked:before{transform-origin:top}.Toastify__toast--stacked[data-pos=top].Toastify__toast--stacked:before{transform-origin:bottom}.Toastify__toast--stacked:before{content:"";position:absolute;left:0;right:0;bottom:0;height:100%;transform:scaleY(3);z-index:-1}.Toastify__toast--rtl{direction:rtl}.Toastify__toast--close-on-click{cursor:pointer}.Toastify__toast-icon{margin-inline-end:10px;width:22px;flex-shrink:0;display:flex}.Toastify--animate{animation-fill-mode:both;animation-duration:.5s}.Toastify--animate-icon{animation-fill-mode:both;animation-duration:.3s}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--light,.Toastify__toast-theme--colored.Toastify__toast--default{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{color:var(--toastify-text-color-info);background:var(--toastify-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{color:var(--toastify-text-color-success);background:var(--toastify-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{color:var(--toastify-text-color-warning);background:var(--toastify-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{color:var(--toastify-text-color-error);background:var(--toastify-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error{background:var(--toastify-color-transparent)}.Toastify__close-button{color:#fff;position:absolute;top:6px;right:6px;background:transparent;outline:none;border:none;padding:0;cursor:pointer;opacity:.7;transition:.3s ease;z-index:1}.Toastify__toast--rtl .Toastify__close-button{left:6px;right:unset}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:hover,.Toastify__close-button:focus{opacity:1}@keyframes Toastify__trackProgress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.Toastify__progress-bar{position:absolute;bottom:0;left:0;width:100%;height:100%;z-index:1;opacity:.7;transform-origin:left}.Toastify__progress-bar--animated{animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{right:0;left:initial;transform-origin:right;border-bottom-left-radius:initial}.Toastify__progress-bar--wrp{position:absolute;overflow:hidden;bottom:0;left:0;width:100%;height:5px;border-bottom-left-radius:var(--toastify-toast-bd-radius);border-bottom-right-radius:var(--toastify-toast-bd-radius)}.Toastify__progress-bar--wrp[data-hidden=true]{opacity:0}.Toastify__progress-bar--bg{opacity:var(--toastify-color-progress-bgo);width:100%;height:100%}.Toastify__spinner{width:20px;height:20px;box-sizing:border-box;border:2px solid;border-radius:100%;border-color:var(--toastify-spinner-color-empty-area);border-right-color:var(--toastify-spinner-color);animation:Toastify__spin .65s linear infinite}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutRight{20%{opacity:1;transform:translate3d(-20px,var(--y),0)}to{opacity:0;transform:translate3d(2000px,var(--y),0)}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;transform:translate3d(20px,var(--y),0)}to{opacity:0;transform:translate3d(-2000px,var(--y),0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}@keyframes Toastify__bounceOutUp{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes Toastify__bounceOutDown{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--top-left,.Toastify__bounce-enter--bottom-left{animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--top-right,.Toastify__bounce-enter--bottom-right{animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--top-left,.Toastify__bounce-exit--bottom-left{animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--top-right,.Toastify__bounce-exit--bottom-right{animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:Toastify__bounceOutDown}@keyframes Toastify__zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;transform:translate3d(0,var(--y),0) scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:Toastify__zoomIn}.Toastify__zoom-exit{animation-name:Toastify__zoomOut}@keyframes Toastify__flipIn{0%{transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes Toastify__flipOut{0%{transform:translate3d(0,var(--y),0) perspective(400px)}30%{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(-20deg);opacity:1}to{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(90deg);opacity:0}}.Toastify__flip-enter{animation-name:Toastify__flipIn}.Toastify__flip-exit{animation-name:Toastify__flipOut}@keyframes Toastify__slideInRight{0%{transform:translate3d(110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInLeft{0%{transform:translate3d(-110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInUp{0%{transform:translate3d(0,110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInDown{0%{transform:translate3d(0,-110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideOutRight{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(110%,var(--y),0)}}@keyframes Toastify__slideOutLeft{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(-110%,var(--y),0)}}@keyframes Toastify__slideOutDown{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,500px,0)}}@keyframes Toastify__slideOutUp{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,-500px,0)}}.Toastify__slide-enter--top-left,.Toastify__slide-enter--bottom-left{animation-name:Toastify__slideInLeft}.Toastify__slide-enter--top-right,.Toastify__slide-enter--bottom-right{animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:Toastify__slideInUp}.Toastify__slide-exit--top-left,.Toastify__slide-exit--bottom-left{animation-name:Toastify__slideOutLeft;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-right,.Toastify__slide-exit--bottom-right{animation-name:Toastify__slideOutRight;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-center{animation-name:Toastify__slideOutUp;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--bottom-center{animation-name:Toastify__slideOutDown;animation-timing-function:ease-in;animation-duration:.3s}@keyframes Toastify__spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n');var h=e=>"number"==typeof e&&!isNaN(e),p=e=>"string"==typeof e,m=e=>"function"==typeof e,g=1,y=()=>""+g++,b=new Map,v=[],w=new Set,x=()=>b.size>0;function _(e){if(x()){if(null==e||(e=>p(e)||h(e))(e))b.forEach((t=>{t.removeToast(e)}));else if(e&&("containerId"in e||"id"in e)){let t=b.get(e.containerId);t?t.removeToast(e.id):b.forEach((t=>{t.removeToast(e.id)}))}}else v=v.filter((t=>null!=e&&t.options.toastId!==e))}function E(e,t){(e=>r.isValidElement(e)||p(e)||m(e)||h(e))(e)&&(x()||v.push({content:e,options:t}),b.forEach((r=>{r.buildToast(e,t)})))}function A(e,t){b.forEach((r=>{(null==t||null==t||!t.containerId||(null==t?void 0:t.containerId)===r.id)&&r.toggle(e,null==t?void 0:t.id)}))}function T(e){return e&&(p(e.toastId)||h(e.toastId))?e.toastId:y()}function C(e,t){return E(e,t),t.toastId}function S(e,t){return{...t,type:t&&t.type||e,toastId:T(t)}}function L(e){return(t,r)=>C(t,S(e,r))}function I(e,t){return C(e,S("default",t))}function M(){try{const e=document.createElement("canvas");return!!(e.getContext("webgl2")||e.getContext("webgl")||e.getContext("experimental-webgl"))}catch(e){return!1}}function D(){try{const e=document.createElement("canvas"),t=e.getContext("webgl2")||e.getContext("webgl")||e.getContext("experimental-webgl");return t?{vendor:t.getParameter(t.VENDOR),renderer:t.getParameter(t.RENDERER),version:t.getParameter(t.VERSION),shadingLanguageVersion:t.getParameter(t.SHADING_LANGUAGE_VERSION),maxTextureSize:t.getParameter(t.MAX_TEXTURE_SIZE),maxViewportDims:t.getParameter(t.MAX_VIEWPORT_DIMS)}:null}catch(e){return null}}I.loading=(e,t)=>C(e,S("default",{isLoading:!0,autoClose:!1,closeOnClick:!1,closeButton:!1,draggable:!1,...t})),I.promise=function(e,{pending:t,error:r,success:a},o){let n;t&&(n=p(t)?I.loading(t,o):I.loading(t.render,{...o,...t}));let s={isLoading:null,autoClose:null,closeOnClick:null,closeButton:null,draggable:null},i=(e,t,r)=>{if(null==t)return void I.dismiss(n);let a={type:e,...s,...o,data:r},i=p(t)?{render:t}:t;return n?I.update(n,{...a,...i}):I(i.render,{...a,...i}),r},l=m(e)?e():e;return l.then((e=>i("success",a,e))).catch((e=>i("error",r,e))),l},I.success=L("success"),I.info=L("info"),I.error=L("error"),I.warning=L("warning"),I.warn=I.warning,I.dark=(e,t)=>C(e,S("default",{theme:"dark",...t})),I.dismiss=function(e){_(e)},I.clearWaitingQueue=(e={})=>{b.forEach((t=>{t.props.limit&&(!e.containerId||t.id===e.containerId)&&t.clearQueue()}))},I.isActive=function(e,t){var r;if(t)return!(null==(r=b.get(t))||!r.isToastActive(e));let a=!1;return b.forEach((t=>{t.isToastActive(e)&&(a=!0)})),a},I.update=(e,t={})=>{let r=((e,{containerId:t})=>{var r;return null==(r=b.get(t||1))?void 0:r.toasts.get(e)})(e,t);if(r){let{props:a,content:o}=r,n={delay:100,...a,...t,toastId:t.toastId||e,updateId:y()};n.toastId!==e&&(n.staleId=e);let s=n.render||o;delete n.render,C(s,n)}},I.done=e=>{I.update(e,{progress:1})},I.onChange=function(e){return w.add(e),()=>{w.delete(e)}},I.play=e=>A(!0,e),I.pause=e=>A(!1,e);let R=null,k=null;async function z(){if(R)return R;if(k)return k;if(!M()){const e=new Error("WebGL is not supported in this browser. 3D charts require WebGL support.");throw e.code="WEBGL_NOT_SUPPORTED",e}return"undefined"!=typeof window&&window["echarts-gl"]?(R=window["echarts-gl"],Promise.resolve(R)):(k=import("echarts-gl").then((e=>(R=e,e))).catch((e=>{k=null;const t=new Error(`Failed to load ECharts GL: ${e.message}`);throw t.code="ECHARTS_GL_LOAD_ERROR",t.originalError=e,t})),k)}function O(){R||k||!M()||z().catch((()=>{}))}function $(){return{isLoaded:!!R,isLoading:!!k,isSupported:M()}}function j(e,t={}){const{useToast:r=!0,fallbackMessage:a}=t;let o=a||"Unable to display 3D chart. Please try a different browser.";return"WEBGL_NOT_SUPPORTED"===e.code?o="Your browser does not support WebGL, which is required for 3D charts. Please use a modern browser like Chrome, Firefox, Safari, or Edge.":"ECHARTS_GL_LOAD_ERROR"===e.code&&(o="Failed to load 3D chart library. Please check your internet connection and try again."),r&&void 0!==I&&I.error(o,{position:"top-center",autoClose:5e3,hideProgressBar:!1,closeOnClick:!0,pauseOnHover:!0,draggable:!0}),o}function P(e){if(e)try{e.off(),e.isDisposed()||e.dispose()}catch(e){console.warn("Error during WebGL cleanup:",e)}}function G(e,t){if(!e)return()=>{};const r=e=>{e.preventDefault(),console.warn("WebGL context lost")},a=()=>{console.info("WebGL context restored"),"function"==typeof t&&t()};return e.addEventListener("webglcontextlost",r),e.addEventListener("webglcontextrestored",a),()=>{e.removeEventListener("webglcontextlost",r),e.removeEventListener("webglcontextrestored",a)}}var F={isWebGLSupported:M,getWebGLInfo:D,loadEChartsGL:z,preloadEChartsGL:O,getLoadingState:$,display3DError:j,cleanupWebGL:P,handleWebGLContextLoss:G},N=Object.freeze({__proto__:null,isWebGLSupported:M,getWebGLInfo:D,loadEChartsGL:z,preloadEChartsGL:O,getLoadingState:$,display3DError:j,cleanupWebGL:P,handleWebGLContextLoss:G,default:F});function B({message:e,style:t}){return c.default.createElement("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",color:"red",...t}},c.default.createElement("p",null,e))}function V(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var W={exports:{}};function U(){}function H(){}H.resetWarningCache=U;W.exports=function(){function e(e,t,r,a,o,n){if("SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"!==n){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:H,resetWarningCache:U};return r.PropTypes=r,r}();var X=V(W.exports);function q({color:e}){return c.default.createElement("div",{className:"circular-progress"},c.default.createElement("div",{className:`spinner ${e}`}))}function Y({message:e,style:t,msgStyle:r,ProgressColor:a="primary",error:o=!1}){return c.default.createElement("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%",...t}},c.default.createElement(q,{color:a}),c.default.createElement("div",{style:{marginTop:"10px",...r}},o?c.default.createElement(B,{message:e,style:r}):c.default.createElement("p",null,e)))}!function(e,t){void 0===t&&(t={});var r=t.insertAt;if(e&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css","top"===r&&a.firstChild?a.insertBefore(o,a.firstChild):a.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}(".circular-progress{align-items:center;display:flex;justify-content:center}.spinner{animation:spin 1s linear infinite;border:4px solid #0000001a;border-left-color:#333;border-radius:50%;height:30px;width:30px}.spinner.primary{border-left-color:#1976d2}.spinner.secondary{border-left-color:#f50057}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}"),q.propTypes={color:X.oneOf(["primary","secondary"])};const Z=(e,t={},r="chart")=>{if(!e||!Array.isArray(e)||0===e.length)return"No data available";const a=e.length;let o=`Data summary: ${a} total items. `;const n=e[0];if(Array.isArray(n)){const t=n.length;o+=`Each data point has ${t} dimensions. `;const r=e.slice(0,10).map(((e,r)=>2===t?`Point ${r+1}: ${K(e[0])}, ${K(e[1])}`:t>=3?`Point ${r+1}: ${K(e[0])}, ${K(e[1])}, ${K(e[2])}`:`Point ${r+1}: ${K(e[0])}`)).join("; ");o+=r}else if("object"==typeof n){const t=e.slice(0,10).map(((e,t)=>{const r=e.name||e.label||`Item ${t+1}`,a=void 0!==e.value?e.value:void 0!==e.z?`(${e.x}, ${e.y}, ${e.z})`:`(${e.x}, ${e.y})`;return`${r}: ${K(a)}`})).join("; ");o+=t}else{const t=e.slice(0,10).map(((e,t)=>`Item ${t+1}: ${K(e)}`)).join("; ");o+=t}return a>10&&(o+=`. And ${a-10} more items`),o},J=(e,t,r={})=>{if(Array.isArray(e)){const a=r.labels?.x||"X",o=r.labels?.y||"Y",n=r.zAxis3D?.name||r.zAxis?.name||"Z";return e.length>=3?`Data point ${t+1}: ${a} ${K(e[0])}, ${o} ${K(e[1])}, ${n} ${K(e[2])}`:`Data point ${t+1}: ${a} ${K(e[0])}, ${o} ${K(e[1])}`}if("object"==typeof e){const a=e.name||e.label||`Data point ${t+1}`,o=void 0!==e.value?K(e.value):"",n=[void 0!==e.x?`${r.labels?.x||"X"}: ${K(e.x)}`:"",void 0!==e.y?`${r.labels?.y||"Y"}: ${K(e.y)}`:"",void 0!==e.z?`${r.zAxis3D?.name||"Z"}: ${K(e.z)}`:""].filter(Boolean).join(", ");return o?`${a}: ${o}${n?` at ${n}`:""}`:`${a}${n?`: ${n}`:""}`}return`Data point ${t+1}: ${K(e)}`},K=e=>{if(null==e)return"unknown";if("number"==typeof e){if(Math.abs(e)>=1e3)return e.toLocaleString();if(e%1!=0)return e.toFixed(2)}return e instanceof Date?e.toLocaleDateString():String(e)},Q=(e,t="chart",r="")=>{const a=((e,t="chart")=>{const r="string"==typeof e.title?e.title:e.title?.text||"Untitled chart",a=e.data?.length||e.series?.[0]?.data?.length||0,o=e.labels?.x||e.xAxis?.name||"X axis",n=e.labels?.y||e.yAxis?.name||"Y axis",s=e.zAxis3D?.name||e.zAxis?.name||"Z axis";let i=`${r}. ${t} chart`;return a>0&&(i+=` with ${a} data points`),e.is3D||t.includes("3D")?i+=`. Three-dimensional view showing ${o}, ${n}, and ${s}`:i+=`. X axis shows ${o}, Y axis shows ${n}`,e.description&&(i+=`. ${e.description}`),i})(e,t);Z(e.data||e.series?.[0]?.data,e,t);const o=r?`${r}-description`:"chart-description";return{role:"img","aria-label":a,"aria-describedby":o,tabIndex:0,"data-description-id":o,"data-chart-type":t}},ee=(e,t={},r="chart")=>{if(!e||!Array.isArray(e)||0===e.length)return{caption:t.title||"Chart Data",headers:[],rows:[]};const a=e[0];let o=[],n=[];if(Array.isArray(a)){const r=a.length;o=[t.labels?.x||"X",t.labels?.y||"Y",...r>2?[t.zAxis3D?.name||t.zAxis?.name||"Z"]:[]].slice(0,r),n=e.map(((e,t)=>({id:`row-${t}`,cells:e.map((e=>K(e)))})))}else if("object"==typeof a){const r=Object.keys(a);o=r.map((e=>{switch(e){case"x":return t.labels?.x||"X";case"y":return t.labels?.y||"Y";case"z":return t.zAxis3D?.name||t.zAxis?.name||"Z";case"name":return"Name";case"value":return"Value";default:return e.charAt(0).toUpperCase()+e.slice(1)}})),n=e.map(((e,t)=>({id:`row-${t}`,cells:r.map((t=>K(e[t])))})))}else o=["Index","Value"],n=e.map(((e,t)=>({id:`row-${t}`,cells:[String(t+1),K(e)]})));return{caption:"string"==typeof t.title?t.title:t.title?.text||"Chart Data",headers:o,rows:n}},te=(e,t="polite")=>{let r=document.getElementById("visualify-a11y-announcer");r||(r=document.createElement("div"),r.id="visualify-a11y-announcer",r.setAttribute("aria-live",t),r.setAttribute("aria-atomic","true"),r.className="sr-only",document.body.appendChild(r)),r.setAttribute("aria-live",t),r.textContent=e,setTimeout((()=>{r.textContent=""}),1e3)},re=(e,t={})=>{if(!e||!Array.isArray(e)||0===e.length)return"";const r=ee(e,t);return`${r.headers.join(",")}\n${r.rows.map((e=>e.cells.join(","))).join("\n")}`},ae=(e,t="chart-data.csv")=>{const r=new Blob([e],{type:"text/csv;charset=utf-8;"}),a=document.createElement("a"),o=URL.createObjectURL(r);a.setAttribute("href",o),a.setAttribute("download",t),a.setAttribute("aria-label",`Download data as ${t}`),a.className="sr-only",document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(o)},oe={enableArrowNavigation:!0,enableTabNavigation:!0,enableEnterActivation:!0,wrapAround:!0,announceChanges:!0},ne=(e={})=>{const[t,a]=r.useState(-1),o=r.useRef(null),{data:n=[],onFocusChange:s,onActivate:i,onEscape:l,config:c={},navConfig:d={}}=e,u={...oe,...d},f=r.useCallback((e=>{if(e<0||e>=n.length){if(!u.wrapAround)return;e=e<0?n.length-1:0}if(a(e),u.announceChanges&&e>=0){const t=J(n[e],e,c);te(t,"polite")}s&&s(e,n[e])}),[n,c,u,s]),h=r.useCallback((()=>{t>=0&&t<n.length&&(u.announceChanges&&te(`Activated ${J(n[t],t,c)}`,"polite"),i&&i(t,n[t]))}),[t,n,c,u,i]),p=r.useCallback((()=>{a(-1),l&&l()}),[l]),m=r.useCallback((e=>{if(u.enableArrowNavigation||u.enableEnterActivation)switch(e.key){case"ArrowRight":case"ArrowDown":e.preventDefault(),u.enableArrowNavigation&&f(t+1);break;case"ArrowLeft":case"ArrowUp":e.preventDefault(),u.enableArrowNavigation&&f(t-1);break;case"Enter":case" ":e.preventDefault(),u.enableEnterActivation&&h();break;case"Escape":e.preventDefault(),p(),o.current&&o.current.focus();break;case"Home":e.preventDefault(),u.enableArrowNavigation&&f(0);break;case"End":e.preventDefault(),u.enableArrowNavigation&&f(n.length-1);break;case"PageUp":e.preventDefault(),u.enableArrowNavigation&&f(Math.max(0,t-10));break;case"PageDown":e.preventDefault(),u.enableArrowNavigation&&f(Math.min(n.length-1,t+10))}}),[t,n.length,u,f,h,p]),g=r.useCallback((()=>{-1===t&&n.length>0&&f(0)}),[t,n.length,f]),y=r.useCallback((e=>{o.current&&!o.current.contains(e.relatedTarget)&&p()}),[p]);return{focusedIndex:t,containerRef:o,handleKeyDown:m,handleFocus:g,handleBlur:y,focusDataPoint:f,activateDataPoint:h,clearFocus:p,containerProps:{ref:o,tabIndex:0,onKeyDown:m,onFocus:g,onBlur:y,role:"application","aria-label":c.title||"Interactive chart"}}},se={AA_NORMAL:4.5,AAA_NORMAL:7,AA_LARGE:3,AAA_LARGE:4.5,AA_UI:3},ie=(e,t,r)=>{const a=e=>{const t=Math.max(0,Math.min(255,Math.round(e))).toString(16);return 1===t.length?"0"+t:t};return`#${a(e)}${a(t)}${a(r)}`},le=e=>{if(!e||"string"!=typeof e)return null;if((e=e.trim().toLowerCase()).startsWith("#"))return(e=>{if(!e||"string"!=typeof e)return null;if(3===(e=e.replace(/^#/,"")).length&&(e=e.split("").map((e=>e+e)).join("")),6===e.length){const t=parseInt(e.substring(0,2),16),r=parseInt(e.substring(2,4),16),a=parseInt(e.substring(4,6),16);return isNaN(t)||isNaN(r)||isNaN(a)?null:{r:t,g:r,b:a}}return null})(e);const t=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);if(t)return{r:parseInt(t[1],10),g:parseInt(t[2],10),b:parseInt(t[3],10)};const r={black:{r:0,g:0,b:0},white:{r:255,g:255,b:255},red:{r:255,g:0,b:0},green:{r:0,g:128,b:0},blue:{r:0,g:0,b:255},yellow:{r:255,g:255,b:0},cyan:{r:0,g:255,b:255},magenta:{r:255,g:0,b:255},silver:{r:192,g:192,b:192},gray:{r:128,g:128,b:128},grey:{r:128,g:128,b:128},maroon:{r:128,g:0,b:0},olive:{r:128,g:128,b:0},lime:{r:0,g:255,b:0},aqua:{r:0,g:255,b:255},teal:{r:0,g:128,b:128},navy:{r:0,g:0,b:128},fuchsia:{r:255,g:0,b:255},purple:{r:128,g:0,b:128},orange:{r:255,g:165,b:0}};return r[e]?r[e]:null},ce=e=>{if(!e)return 0;const{r:t,g:r,b:a}=e,o=t/255,n=r/255,s=a/255;return.2126*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))+.0722*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))},de=(e,t)=>{const r="string"==typeof e?le(e):e,a="string"==typeof t?le(t):t;if(!r||!a)return 1;const o=ce(r),n=ce(a);return(Math.max(o,n)+.05)/(Math.min(o,n)+.05)},ue=(e,t,r=!1)=>{const a=de(e,t),o=r?se.AA_LARGE:se.AA_NORMAL;return{ratio:Math.round(100*a)/100,passesAA:a>=o,passesAAA:a>=(r?se.AAA_LARGE:se.AAA_NORMAL),threshold:o,isLargeText:r}},fe=(e,t=null,r={})=>{const{minContrast:a=se.AA_NORMAL,darkenAmount:o=20}=r,n=le(e);if(!n)return"#000000";if(t){const e=le(t);if(e){return de(n,e)>=a?t:he(n,e,a)}}return ce(n)>.5?"#000000":"#ffffff"},he=(e,t,r)=>{let a={...t};const o=ce(e)>.5;for(let t=0;t<20;t++){if(de(e,a)>=r)return ie(a.r,a.g,a.b);o?(a.r=Math.max(0,a.r-15),a.g=Math.max(0,a.g-15),a.b=Math.max(0,a.b-15)):(a.r=Math.min(255,a.r+15),a.g=Math.min(255,a.g+15),a.b=Math.min(255,a.b+15))}return o?"#000000":"#ffffff"},pe=e=>{const t={valid:!0,issues:[],suggestions:{}},r=e.backgroundColor||"#ffffff";if(e.color&&Array.isArray(e.color)&&e.color.forEach(((e,a)=>{const o=ue(e,r);o.passesAA||(t.valid=!1,t.issues.push({type:"series-color",index:a,color:e,message:`Series color ${e} does not meet WCAG AA contrast requirements (${o.ratio}:1)`}),t.suggestions[`series-${a}`]=fe(r,e))})),e.title?.textStyle?.color){ue(e.title.textStyle.color,r).passesAA||(t.valid=!1,t.issues.push({type:"title-color",color:e.title.textStyle.color,message:"Title color does not meet WCAG AA contrast requirements"}),t.suggestions.title=fe(r,e.title.textStyle.color))}if(e.xAxis?.axisLabel?.color){ue(e.xAxis.axisLabel.color,r).passesAA||(t.valid=!1,t.issues.push({type:"xaxis-color",color:e.xAxis.axisLabel.color,message:"X-axis label color does not meet WCAG AA contrast requirements"}))}if(e.yAxis?.axisLabel?.color){ue(e.yAxis.axisLabel.color,r).passesAA||(t.valid=!1,t.issues.push({type:"yaxis-color",color:e.yAxis.axisLabel.color,message:"Y-axis label color does not meet WCAG AA contrast requirements"}))}return t},me=e=>{const t={...e};e.backgroundColor;const r=pe(e);return r.suggestions&&(t.color&&Array.isArray(t.color)&&(t.color=t.color.map(((e,t)=>r.suggestions[`series-${t}`]||e))),r.suggestions.title&&t.title?.textStyle&&(t.title.textStyle.color=r.suggestions.title)),t},ge=10,ye=.8,be="#5470c6",ve=r.forwardRef((({props:e,style:t},a)=>{const{config:o={}}=e,n=e.id||`scatter3d-chart-${Math.random().toString(36).substr(2,9)}`,s=`${n}-description`,i=`${n}-data-table`,l=c.default.useMemo((()=>pe(o).valid||!1===o.a11y?.autoFix?o:me(o)),[o]),[d,h]=r.useState(null),[p,m]=r.useState({active:!0,message:"Loading 3D library..."}),[g,y]=r.useState(null),[b,v]=r.useState(null),w=r.useRef(null),x=c.default.useMemo((()=>l.data||[]),[l]),{containerRef:_,handleKeyDown:E,handleFocus:A,focusedIndex:T}=ne({data:x,config:l,onFocusChange:(e,t)=>{if(v(t),w.current){const t=w.current.getEchartsInstance?.();t&&t.dispatchAction({type:"highlight",seriesIndex:0,dataIndex:e})}},onActivate:(e,t)=>{if(w.current){const t=w.current.getEchartsInstance?.();t&&t.dispatchAction({type:"showTip",seriesIndex:0,dataIndex:e})}}}),C=c.default.useMemo((()=>Q(l,"scatter3D",n)),[l,n]),S=c.default.useMemo((()=>Z(x,l,"scatter3D")),[x,l]),L=c.default.useMemo((()=>ee(x,l,"scatter3D")),[x,l]),I=r.useCallback((()=>{const e=re(x,l);e&&(ae(e,`${l.title||"scatter3d-chart"}-data.csv`),te("Data downloaded as CSV file","polite"))}),[x,l]),D=r.useCallback((async()=>{try{if(m({active:!0,message:"Loading 3D library..."}),y(null),!M())throw new Error("WebGL not supported");await z();const e=(e=>{const{title:t,data:r,xAxis3D:a,yAxis3D:o,zAxis3D:n,grid3D:s,visualMap:i,series:l,backgroundColor:c,color:d,tooltip:u,legend:f,toolbox:h}=e;if(!r)throw new Error("Scatter3D requires data");let p=r;if(!Array.isArray(r)&&r.x&&r.y&&r.z){const e=Math.min(r.x.length,r.y.length,r.z.length);p=[];for(let t=0;t<e;t++)p.push([r.x[t],r.y[t],r.z[t]])}else Array.isArray(r)&&r.length>0&&"object"==typeof r[0]&&!Array.isArray(r[0])&&(p=r.map((e=>[e.x,e.y,e.z])));const m={title:"string"==typeof t?{text:t}:{left:"center",top:0,...t},tooltip:{trigger:"item",formatter:u?.formatter||(e=>{const[t,r,a]=e.value;return`X: ${t}<br/>Y: ${r}<br/>Z: ${a}`}),...u},legend:f??void 0,visualMap:i??void 0,xAxis3D:{name:a?.name||"X",type:a?.type||"value",nameGap:25,...a},yAxis3D:{name:o?.name||"Y",type:o?.type||"value",nameGap:25,...o},zAxis3D:{name:n?.name||"Z",type:n?.type||"value",nameGap:25,...n},grid3D:{boxWidth:100,boxDepth:80,boxHeight:60,viewControl:{autoRotate:!1,projection:"perspective",...s?.viewControl},light:{main:{intensity:1.2,shadow:!0},ambient:{intensity:.3}},...s},series:[{type:"scatter3D",symbolSize:l?.symbolSize??ge,data:p,itemStyle:{opacity:l?.opacity??ye,color:l?.color??be,...l?.itemStyle},emphasis:{itemStyle:{borderColor:"#fff",borderWidth:1}},...l}]};return c&&(m.backgroundColor=c),d&&(m.color=d),h&&(m.toolbox={feature:{...h,saveAsImage:{show:h.saveAsImage?.show??!1}}}),m})(l);h(e),m({active:!1,message:null}),!1!==l.a11y?.announceLoad&&te(`${C["aria-label"]}. 3D scatter plot. Use arrow keys to navigate data points. Press Enter to select.`,"polite")}catch(e){const t=j(e,{useToast:!0});y(t),m({active:!0,message:t}),te(`Error loading 3D chart: ${t}`,"assertive")}}),[l,C]);return r.useEffect((()=>{D()}),[D]),r.useEffect((()=>()=>{a?.current&&P(a.current.getEchartsInstance?.())}),[a]),r.useEffect((()=>{const e=()=>{if(a?.current){const e=a.current.getEchartsInstance?.();e&&!e.isDisposed()&&e.resize()}};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}),[a]),g?c.default.createElement("div",{id:n,ref:_,role:"alert","aria-live":"assertive",style:{...t,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f5f5f5",border:"1px solid #ddd",borderRadius:"4px",padding:"20px",textAlign:"center"},tabIndex:0},c.default.createElement("div",null,c.default.createElement("h4",null,"3D Chart Unavailable"),c.default.createElement("p",{style:{color:"#666",marginTop:"10px"}},g))):c.default.createElement("div",u({id:n,ref:_,style:{...t,position:"relative"},className:"visualify-chart visualify-scatter3d-chart"},C,{onKeyDown:E,onFocus:A,"data-testid":"scatter3d-chart"}),c.default.createElement("div",{id:s,className:"sr-only"},S,l.description&&c.default.createElement("span",null,". ",l.description),c.default.createElement("p",null,"3D visualization. Use Tab to enter chart, then arrow keys to navigate data points.")),L.rows.length>0&&c.default.createElement("table",{id:i,className:"sr-only"},c.default.createElement("caption",null,L.caption," - Data Table"),c.default.createElement("thead",null,c.default.createElement("tr",null,L.headers.map(((e,t)=>c.default.createElement("th",{key:t,scope:"col"},e))))),c.default.createElement("tbody",null,L.rows.map((e=>c.default.createElement("tr",{key:e.id},e.cells.map(((e,t)=>c.default.createElement("td",{key:t},e)))))))),!1!==l.a11y?.enableDownload&&x.length>0&&c.default.createElement("button",{className:"sr-only",onClick:I,"aria-label":"Download chart data as CSV",tabIndex:-1},"Download Data"),c.default.createElement("div",{"aria-live":"polite","aria-atomic":"true",className:"sr-only",id:`${n}-live-region`},b&&`Focused: X ${b[0]||b.x}, Y ${b[1]||b.y}, Z ${b[2]||b.z}`),p.active&&c.default.createElement(Y,{message:p.message,style:{marginTop:"10px"}}),d&&c.default.createElement(f,{ref:e=>{w.current=e,"function"==typeof a?a(e):a&&(a.current=e)},options:d,style:{width:l.chartWidth||"100%",height:l.chartHeight||"400px",opacity:p.active?0:1},"aria-hidden":"true"}))}));ve.displayName="Scatter3D";const we="lambert",xe=1,_e=r.forwardRef((({props:e,style:t},a)=>{const{config:o={}}=e,n=e.id||`bar3d-chart-${Math.random().toString(36).substr(2,9)}`,s=`${n}-description`,i=`${n}-data-table`,l=c.default.useMemo((()=>pe(o).valid||!1===o.a11y?.autoFix?o:me(o)),[o]),[d,h]=r.useState(null),[p,m]=r.useState({active:!0,message:"Loading 3D library..."}),[g,y]=r.useState(null),[b,v]=r.useState(null),w=r.useRef(null),x=c.default.useMemo((()=>l.data||[]),[l]),{containerRef:_,handleKeyDown:E,handleFocus:A,focusedIndex:T}=ne({data:x,config:l,onFocusChange:(e,t)=>{if(v(t),w.current){const t=w.current.getEchartsInstance?.();t&&t.dispatchAction({type:"highlight",seriesIndex:0,dataIndex:e})}},onActivate:(e,t)=>{if(w.current){const t=w.current.getEchartsInstance?.();t&&t.dispatchAction({type:"showTip",seriesIndex:0,dataIndex:e})}}}),C=c.default.useMemo((()=>Q(l,"bar3D",n)),[l,n]),S=c.default.useMemo((()=>Z(x,l,"bar3D")),[x,l]),L=c.default.useMemo((()=>ee(x,l,"bar3D")),[x,l]),I=r.useCallback((()=>{const e=re(x,l);e&&(ae(e,`${l.title||"bar3d-chart"}-data.csv`),te("Data downloaded as CSV file","polite"))}),[x,l]),D=r.useCallback((async()=>{try{if(m({active:!0,message:"Loading 3D library..."}),y(null),!M())throw new Error("WebGL not supported");await z();const e=(e=>{const{title:t,data:r,xAxis3D:a,yAxis3D:o,zAxis3D:n,grid3D:s,visualMap:i,series:l,backgroundColor:c,color:d,tooltip:u,legend:f,toolbox:h}=e;if(!r)throw new Error("Bar3D requires data");let p=r;if(!Array.isArray(r)&&r.x&&r.y&&r.z){const e=Math.min(r.x.length,r.y.length,r.z.length);p=[];for(let t=0;t<e;t++)p.push([r.x[t],r.y[t],r.z[t]])}else Array.isArray(r)&&r.length>0&&"object"==typeof r[0]&&!Array.isArray(r[0])&&(p=r.map((e=>[e.x,e.y,e.z])));const m={title:"string"==typeof t?{text:t}:{left:"center",top:0,...t},tooltip:{trigger:"item",formatter:u?.formatter||(e=>{const[t,r,a]=e.value;return`X: ${t}<br/>Y: ${r}<br/>Height: ${a}`}),...u},legend:f??void 0,visualMap:i??void 0,xAxis3D:{name:a?.name||"X",type:a?.type||"category",nameGap:25,...a},yAxis3D:{name:o?.name||"Y",type:o?.type||"category",nameGap:25,...o},zAxis3D:{name:n?.name||"Z",type:n?.type||"value",nameGap:25,...n},grid3D:{boxWidth:100,boxDepth:80,boxHeight:60,viewControl:{autoRotate:!1,projection:"perspective",...s?.viewControl},light:{main:{intensity:1.2,shadow:!0},ambient:{intensity:.3}},...s},series:[{type:"bar3D",data:p,shading:l?.shading??we,itemStyle:{opacity:l?.opacity??xe,...l?.itemStyle},label:{show:l?.label?.show??!1,...l?.label},emphasis:{label:{show:!0,fontSize:16,color:"#fff"},itemStyle:{color:"#ff7f50"}},...l}]};return c&&(m.backgroundColor=c),d&&(m.color=d),h&&(m.toolbox={feature:{...h,saveAsImage:{show:h.saveAsImage?.show??!1}}}),m})(l);h(e),m({active:!1,message:null}),!1!==l.a11y?.announceLoad&&te(`${C["aria-label"]}. 3D bar chart. Use arrow keys to navigate data points. Press Enter to select.`,"polite")}catch(e){const t=j(e,{useToast:!0});y(t),m({active:!0,message:t}),te(`Error loading 3D chart: ${t}`,"assertive")}}),[l,C]);return r.useEffect((()=>{D()}),[D]),r.useEffect((()=>()=>{a?.current&&P(a.current.getEchartsInstance?.())}),[a]),r.useEffect((()=>{const e=()=>{if(a?.current){const e=a.current.getEchartsInstance?.();e&&!e.isDisposed()&&e.resize()}};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}),[a]),g?c.default.createElement("div",{id:n,ref:_,role:"alert","aria-live":"assertive",style:{...t,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f5f5f5",border:"1px solid #ddd",borderRadius:"4px",padding:"20px",textAlign:"center"},tabIndex:0},c.default.createElement("div",null,c.default.createElement("h4",null,"3D Chart Unavailable"),c.default.createElement("p",{style:{color:"#666",marginTop:"10px"}},g))):c.default.createElement("div",u({id:n,ref:_,style:{...t,position:"relative"},className:"visualify-chart visualify-bar3d-chart"},C,{onKeyDown:E,onFocus:A,"data-testid":"bar3d-chart"}),c.default.createElement("div",{id:s,className:"sr-only"},S,l.description&&c.default.createElement("span",null,". ",l.description),c.default.createElement("p",null,"3D bar chart visualization. Use Tab to enter chart, then arrow keys to navigate data points.")),L.rows.length>0&&c.default.createElement("table",{id:i,className:"sr-only"},c.default.createElement("caption",null,L.caption," - Data Table"),c.default.createElement("thead",null,c.default.createElement("tr",null,L.headers.map(((e,t)=>c.default.createElement("th",{key:t,scope:"col"},e))))),c.default.createElement("tbody",null,L.rows.map((e=>c.default.createElement("tr",{key:e.id},e.cells.map(((e,t)=>c.default.createElement("td",{key:t},e)))))))),!1!==l.a11y?.enableDownload&&x.length>0&&c.default.createElement("button",{className:"sr-only",onClick:I,"aria-label":"Download chart data as CSV",tabIndex:-1},"Download Data"),c.default.createElement("div",{"aria-live":"polite","aria-atomic":"true",className:"sr-only",id:`${n}-live-region`},b&&`Focused: X ${b[0]||b.x}, Y ${b[1]||b.y}, Height ${b[2]||b.z}`),p.active&&c.default.createElement(Y,{message:p.message,style:{marginTop:"10px"}}),d&&c.default.createElement(f,{ref:e=>{w.current=e,"function"==typeof a?a(e):a&&(a.current=e)},options:d,style:{width:l.chartWidth||"100%",height:l.chartHeight||"400px",opacity:p.active?0:1},"aria-hidden":"true"}))}));_e.displayName="Bar3D";const Ee="lambert",Ae={show:!1},Te=e=>{const{title:t,data:r,xAxis3D:a,yAxis3D:o,zAxis3D:n,grid3D:s,visualMap:i,series:l,backgroundColor:c,color:d,tooltip:u,legend:f,toolbox:h,contour:p}=e;if(!r)throw new Error("Surface3D requires data");const m=((e,t={})=>{if(!Array.isArray(e)&&"object"==typeof e&&e.x&&e.y&&e.z){const{x:t,y:r,z:a}=e,o=[];for(let e=0;e<t.length;e++)for(let n=0;n<r.length;n++)o.push([t[e],r[n],a[e][n]]);return o}if(Array.isArray(e))return e;if("function"==typeof e){const{xMin:r=-10,xMax:a=10,yMin:o=-10,yMax:n=10,step:s=1}=t,i=[];for(let t=r;t<=a;t+=s)for(let r=o;r<=n;r+=s){const a=e(t,r);i.push([t,r,a])}return i}return[]})(r,e.range),g={title:"string"==typeof t?{text:t}:{left:"center",top:0,...t},tooltip:{trigger:"item",formatter:u?.formatter||(e=>{const[t,r,a]=e.value;return`X: ${t.toFixed(2)}<br/>Y: ${r.toFixed(2)}<br/>Z: ${a.toFixed(2)}`}),...u},legend:f??void 0,visualMap:i??{show:!0,dimension:2,min:Math.min(...m.map((e=>e[2]))),max:Math.max(...m.map((e=>e[2]))),inRange:{color:["#313695","#4575b4","#74add1","#abd9e9","#e0f3f8","#ffffbf","#fee090","#fdae61","#f46d43","#d73027","#a50026"]}},xAxis3D:{name:a?.name||"X",type:a?.type||"value",nameGap:25,...a},yAxis3D:{name:o?.name||"Y",type:o?.type||"value",nameGap:25,...o},zAxis3D:{name:n?.name||"Z",type:n?.type||"value",nameGap:25,...n},grid3D:{boxWidth:100,boxDepth:80,boxHeight:60,viewControl:{autoRotate:l?.autoRotate??!1,projection:"perspective",...s?.viewControl},light:{main:{intensity:1.2,shadow:!0},ambient:{intensity:.3}},...s},series:[{type:"surface",data:m,shading:l?.shading??Ee,wireframe:{show:l?.wireframe?.show??Ae.show,...l?.wireframe},itemStyle:{opacity:l?.opacity??1,...l?.itemStyle},...l}]};return p?.show&&(g.series[0].contour={show:!0,color:p.color||"#000",...p}),c&&(g.backgroundColor=c),d&&(g.color=d),h&&(g.toolbox={feature:{...h,saveAsImage:{show:h.saveAsImage?.show??!1}}}),g},Ce=r.forwardRef((({props:e,style:t},a)=>{const{config:o={}}=e,[n,s]=r.useState(null),[i,l]=r.useState({active:!0,message:"Loading 3D library..."}),[d,u]=r.useState(null),h=r.useCallback((async()=>{try{if(l({active:!0,message:"Loading 3D library..."}),u(null),!M())throw new Error("WebGL not supported");await z();const e=Te(o);s(e),l({active:!1,message:null})}catch(e){const t=j(e,{useToast:!0});u(t),l({active:!0,message:t})}}),[o]);return r.useEffect((()=>{h()}),[h]),r.useEffect((()=>()=>{a?.current&&P(a.current.getEchartsInstance?.())}),[a]),r.useEffect((()=>{const e=()=>{if(a?.current){const e=a.current.getEchartsInstance?.();e&&!e.isDisposed()&&e.resize()}};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}),[a]),d?c.default.createElement("div",{id:e.id,style:{...t,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f5f5f5",border:"1px solid #ddd",borderRadius:"4px",padding:"20px",textAlign:"center"}},c.default.createElement("div",null,c.default.createElement("h4",null,"3D Chart Unavailable"),c.default.createElement("p",{style:{color:"#666",marginTop:"10px"}},d))):c.default.createElement("div",{id:e.id,style:{...t,position:"relative"}},i.active&&c.default.createElement(Y,{message:i.message,style:{marginTop:"10px"}}),n&&c.default.createElement(f,{ref:a,options:n,style:{width:o.chartWidth||"100%",height:o.chartHeight||"400px",opacity:i.active?0:1}}))}));Ce.displayName="Surface3D";const Se={width:4},Le=8,Ie=e=>{const{title:t,data:r,xAxis3D:a,yAxis3D:o,zAxis3D:n,grid3D:s,visualMap:i,series:l,backgroundColor:c,color:d,tooltip:u,legend:f,toolbox:h}=e,p=(e=>{if(!e)return[];if(Array.isArray(e)){if(e.length>0&&Array.isArray(e[0])&&3===e[0].length)return[{data:e,name:"Series 1"}];if(e.length>0&&e[0].data)return e}if("object"==typeof e&&!Array.isArray(e)){const{x:t,y:r,z:a}=e;if(Array.isArray(t)&&Array.isArray(r)&&Array.isArray(a))return[{data:t.map(((e,t)=>[e,r[t],a[t]])),name:"Series 1"}]}return[]})(r);if(0===p.length)throw new Error("Line3D requires valid data");const m=p.map(((e,t)=>({type:"line3D",name:e.name||`Series ${t+1}`,data:e.data,lineStyle:{width:l?.lineStyle?.width??Se.width,color:l?.lineStyle?.color||d?.[t],...l?.lineStyle},symbolSize:l?.symbolSize??Le,symbol:l?.symbol||"circle",emphasis:{lineStyle:{width:(l?.lineStyle?.width??Se.width)+2}},...l}))),g={title:"string"==typeof t?{text:t}:{left:"center",top:0,...t},tooltip:{trigger:"item",formatter:u?.formatter||(e=>{const[t,r,a]=e.value;return`${e.seriesName}<br/>X: ${t}<br/>Y: ${r}<br/>Z: ${a}`}),...u},legend:f??{show:m.length>1,data:m.map((e=>e.name))},visualMap:i??void 0,xAxis3D:{name:a?.name||"X",type:a?.type||"value",nameGap:25,...a},yAxis3D:{name:o?.name||"Y",type:o?.type||"value",nameGap:25,...o},zAxis3D:{name:n?.name||"Z",type:n?.type||"value",nameGap:25,...n},grid3D:{boxWidth:100,boxDepth:80,boxHeight:60,viewControl:{autoRotate:!1,projection:"perspective",...s?.viewControl},light:{main:{intensity:1.2,shadow:!0},ambient:{intensity:.3}},...s},series:m};return c&&(g.backgroundColor=c),d&&(g.color=d),h&&(g.toolbox={feature:{...h,saveAsImage:{show:h.saveAsImage?.show??!1}}}),g},Me=r.forwardRef((({props:e,style:t},a)=>{const{config:o={}}=e,[n,s]=r.useState(null),[i,l]=r.useState({active:!0,message:"Loading 3D library..."}),[d,u]=r.useState(null),h=r.useCallback((async()=>{try{if(l({active:!0,message:"Loading 3D library..."}),u(null),!M())throw new Error("WebGL not supported");await z();const e=Ie(o);s(e),l({active:!1,message:null})}catch(e){const t=j(e,{useToast:!0});u(t),l({active:!0,message:t})}}),[o]);return r.useEffect((()=>{h()}),[h]),r.useEffect((()=>()=>{a?.current&&P(a.current.getEchartsInstance?.())}),[a]),r.useEffect((()=>{const e=()=>{if(a?.current){const e=a.current.getEchartsInstance?.();e&&!e.isDisposed()&&e.resize()}};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}),[a]),d?c.default.createElement("div",{id:e.id,style:{...t,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f5f5f5",border:"1px solid #ddd",borderRadius:"4px",padding:"20px",textAlign:"center"}},c.default.createElement("div",null,c.default.createElement("h4",null,"3D Chart Unavailable"),c.default.createElement("p",{style:{color:"#666",marginTop:"10px"}},d))):c.default.createElement("div",{id:e.id,style:{...t,position:"relative"}},i.active&&c.default.createElement(Y,{message:i.message,style:{marginTop:"10px"}}),n&&c.default.createElement(f,{ref:a,options:n,style:{width:o.chartWidth||"100%",height:o.chartHeight||"400px",opacity:i.active?0:1}}))}));Me.displayName="Line3D";const De={position:[0,0,100],fov:75,near:.1,far:1e3},Re=[{type:"ambient",color:"#ffffff",intensity:.5},{type:"directional",position:[10,10,10],intensity:1}];function ke({config:e}){const t=r.useRef(),a=r.useMemo((()=>{switch(e.type){case"ambient":return new l.AmbientLight(e.color,e.intensity);case"directional":const t=new l.DirectionalLight(e.color,e.intensity);return t.position.set(...e.position||[10,10,10]),t.castShadow=e.castShadow||!1,t;case"point":const r=new l.PointLight(e.color,e.intensity,e.distance||0,e.decay||2);return r.position.set(...e.position||[0,0,0]),r.castShadow=e.castShadow||!1,r;case"spot":const a=new l.SpotLight(e.color,e.intensity,e.distance||0,e.angle||Math.PI/6,e.penumbra||0,e.decay||2);return a.position.set(...e.position||[0,10,0]),a.castShadow=e.castShadow||!1,a;case"hemisphere":const o=new l.HemisphereLight(e.skyColor||"#ffffff",e.groundColor||"#444444",e.intensity||1);return o.position.set(...e.position||[0,10,0]),o;default:return new l.AmbientLight("#ffffff",.5)}}),[e]);return r.useEffect((()=>{t.current&&(void 0!==e.intensity&&(t.current.intensity=e.intensity),void 0!==e.color&&t.current.color.set(e.color))}),[e.intensity,e.color]),c.default.createElement("primitive",{ref:t,object:a})}function ze({config:e}){const t=r.useRef(),a=r.useMemo((()=>{if(!e.geometry)return new l.BoxGeometry(1,1,1);const t=e.geometry;switch(t.type){case"box":return new l.BoxGeometry(t.width||1,t.height||1,t.depth||1);case"sphere":return new l.SphereGeometry(t.radius||1,t.widthSegments||32,t.heightSegments||16);case"cylinder":return new l.CylinderGeometry(t.radiusTop||1,t.radiusBottom||1,t.height||1,t.radialSegments||32);case"plane":return new l.PlaneGeometry(t.width||1,t.height||1);case"torus":return new l.TorusGeometry(t.radius||1,t.tube||.4,t.radialSegments||16,t.tubularSegments||100);case"cone":return new l.ConeGeometry(t.radius||1,t.height||1,t.radialSegments||32);default:return new l.BoxGeometry(1,1,1)}}),[e.geometry]),n=r.useMemo((()=>{if(!e.material)return new l.MeshStandardMaterial({color:"#888888"});const t=e.material;switch(t.type){case"basic":return new l.MeshBasicMaterial({color:t.color||"#888888",transparent:t.transparent||!1,opacity:void 0!==t.opacity?t.opacity:1,wireframe:t.wireframe||!1});case"standard":return new l.MeshStandardMaterial({color:t.color||"#888888",roughness:void 0!==t.roughness?t.roughness:.5,metalness:void 0!==t.metalness?t.metalness:.5,transparent:t.transparent||!1,opacity:void 0!==t.opacity?t.opacity:1,wireframe:t.wireframe||!1});case"phong":return new l.MeshPhongMaterial({color:t.color||"#888888",shininess:t.shininess||30,transparent:t.transparent||!1,opacity:void 0!==t.opacity?t.opacity:1});case"lambert":return new l.MeshLambertMaterial({color:t.color||"#888888",transparent:t.transparent||!1,opacity:void 0!==t.opacity?t.opacity:1});default:return new l.MeshStandardMaterial({color:t.color||"#888888"})}}),[e.material]);return o.useFrame((r=>{if(e.animation&&t.current){const{rotation:a,position:o}=e.animation;a&&(a[0]&&(t.current.rotation.x+=a[0]),a[1]&&(t.current.rotation.y+=a[1]),a[2]&&(t.current.rotation.z+=a[2])),o&&o.speed&&(t.current.position.y=Math.sin(r.clock.elapsedTime*o.speed)*(o.amplitude||1))}})),r.useEffect((()=>()=>{a.dispose(),n.dispose()}),[a,n]),c.default.createElement("mesh",{ref:t,geometry:a,material:n,position:e.position||[0,0,0],rotation:e.rotation||[0,0,0],scale:e.scale||[1,1,1],castShadow:!1!==e.castShadow,receiveShadow:!1!==e.receiveShadow})}function Oe({type:e,config:t={}}){const{camera:a,gl:s}=o.useThree(),i=r.useMemo((()=>({enableDamping:!1!==t.enableDamping,dampingFactor:t.dampingFactor||.05,enableZoom:!1!==t.enableZoom,enablePan:!1!==t.enablePan,enableRotate:!1!==t.enableRotate,autoRotate:t.autoRotate||!1,autoRotateSpeed:t.autoRotateSpeed||1,minDistance:t.minDistance||0,maxDistance:t.maxDistance||1/0,...t})),[t]);switch(e){case"orbit":default:return c.default.createElement(n.OrbitControls,u({},i,{args:[a,s.domElement]}));case"trackball":return c.default.createElement(n.TrackballControls,u({},i,{args:[a,s.domElement]}));case"fly":return c.default.createElement(n.FlyControls,u({},i,{args:[a,s.domElement]}))}}function $e({config:e}){return o.useFrame(((e,t)=>{})),null}function je({sceneConfig:e,controls:t,animation:a}){const{scene:n}=o.useThree();r.useEffect((()=>{e?.backgroundColor&&(n.background=new l.Color(e.backgroundColor)),e?.fog&&(n.fog=new l.Fog(e.fog.color||0,e.fog.near||1,e.fog.far||1e3))}),[n,e]);const s=r.useMemo((()=>(e?.lights||Re).map(((e,t)=>c.default.createElement(ke,{key:`light-${t}`,config:e})))),[e?.lights]),i=r.useMemo((()=>e?.objects?e.objects.map(((e,t)=>"mesh"===e.type?c.default.createElement(ze,{key:`mesh-${t}`,config:e}):null)):null),[e?.objects]);return c.default.createElement(c.default.Fragment,null,s,i,c.default.createElement(Oe,{type:t,config:a}),c.default.createElement($e,{config:a}))}class Pe extends c.default.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error("ThreeScene error:",e,t)}render(){return this.state.hasError?c.default.createElement("div",{style:{padding:"20px",color:"red",textAlign:"center"}},c.default.createElement("h3",null,"WebGL Error"),c.default.createElement("p",null,"Failed to initialize 3D scene. Please check your browser supports WebGL."),c.default.createElement("p",{style:{fontSize:"12px",color:"#666"}},this.state.error?.message)):this.props.children}}const Ge=r.forwardRef((({props:e,style:t},a)=>{const{config:n}=e||{},[s,i]=r.useState(!0),[l,d]=r.useState(null),f=r.useRef(),h=n?.scene||{},p=h?.camera||De,m=n?.controls||"orbit",g=n?.animation||{},y=r.useMemo((()=>({position:p.position||De.position,fov:p.fov||De.fov,near:p.near||De.near,far:p.far||De.far})),[p]),b=r.useMemo((()=>({gl:{antialias:!0,alpha:!0,powerPreference:"high-performance"},camera:y,onCreated:()=>i(!1),onError:e=>{console.error("Canvas error:",e),d(e),i(!1)}})),[y]);return r.useImperativeHandle(a,(()=>({getCanvas:()=>f.current,getScene:()=>f.current?.scene,getCamera:()=>f.current?.camera,getRenderer:()=>f.current?.gl,screenshot:(e="image/png")=>{const t=f.current?.gl;return t?t.domElement.toDataURL(e):null}})),[]),l?c.default.createElement("div",{style:{...t,display:"flex",alignItems:"center",justifyContent:"center"}},c.default.createElement("div",{style:{color:"red",textAlign:"center"}},c.default.createElement("p",null,"Failed to load 3D scene"),c.default.createElement("p",{style:{fontSize:"12px"}},l.message))):c.default.createElement("div",{id:e?.id,style:{...t,position:"relative"}},s&&c.default.createElement("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",background:"#f5f5f5",zIndex:1}},"Loading 3D Scene..."),c.default.createElement(Pe,null,c.default.createElement(o.Canvas,u({ref:f},b,{style:{width:"100%",height:"100%"}}),c.default.createElement(je,{sceneConfig:h,controls:m,animation:g}))))}));Ge.displayName="ThreeScene";const Fe=/^[og]\s*(.+)?/,Ne=/^mtllib /,Be=/^usemtl /,Ve=/^usemap /,We=/\s+/,Ue=new t.Vector3,He=new t.Vector3,Xe=new t.Vector3,qe=new t.Vector3,Ye=new t.Vector3,Ze=new t.Color;function Je(){const e={objects:[],object:{},vertices:[],normals:[],colors:[],uvs:[],materials:{},materialLibraries:[],startObject:function(e,t){if(this.object&&!1===this.object.fromDeclaration)return this.object.name=e,void(this.object.fromDeclaration=!1!==t);const r=this.object&&"function"==typeof this.object.currentMaterial?this.object.currentMaterial():void 0;if(this.object&&"function"==typeof this.object._finalize&&this.object._finalize(!0),this.object={name:e||"",fromDeclaration:!1!==t,geometry:{vertices:[],normals:[],colors:[],uvs:[],hasUVIndices:!1},materials:[],smooth:!0,startMaterial:function(e,t){const r=this._finalize(!1);r&&(r.inherited||r.groupCount<=0)&&this.materials.splice(r.index,1);const a={index:this.materials.length,name:e||"",mtllib:Array.isArray(t)&&t.length>0?t[t.length-1]:"",smooth:void 0!==r?r.smooth:this.smooth,groupStart:void 0!==r?r.groupEnd:0,groupEnd:-1,groupCount:-1,inherited:!1,clone:function(e){const t={index:"number"==typeof e?e:this.index,name:this.name,mtllib:this.mtllib,smooth:this.smooth,groupStart:0,groupEnd:-1,groupCount:-1,inherited:!1};return t.clone=this.clone.bind(t),t}};return this.materials.push(a),a},currentMaterial:function(){if(this.materials.length>0)return this.materials[this.materials.length-1]},_finalize:function(e){const t=this.currentMaterial();if(t&&-1===t.groupEnd&&(t.groupEnd=this.geometry.vertices.length/3,t.groupCount=t.groupEnd-t.groupStart,t.inherited=!1),e&&this.materials.length>1)for(let e=this.materials.length-1;e>=0;e--)this.materials[e].groupCount<=0&&this.materials.splice(e,1);return e&&0===this.materials.length&&this.materials.push({name:"",smooth:this.smooth}),t}},r&&r.name&&"function"==typeof r.clone){const e=r.clone(0);e.inherited=!0,this.object.materials.push(e)}this.objects.push(this.object)},finalize:function(){this.object&&"function"==typeof this.object._finalize&&this.object._finalize(!0)},parseVertexIndex:function(e,t){const r=parseInt(e,10);return 3*(r>=0?r-1:r+t/3)},parseNormalIndex:function(e,t){const r=parseInt(e,10);return 3*(r>=0?r-1:r+t/3)},parseUVIndex:function(e,t){const r=parseInt(e,10);return 2*(r>=0?r-1:r+t/2)},addVertex:function(e,t,r){const a=this.vertices,o=this.object.geometry.vertices;o.push(a[e+0],a[e+1],a[e+2]),o.push(a[t+0],a[t+1],a[t+2]),o.push(a[r+0],a[r+1],a[r+2])},addVertexPoint:function(e){const t=this.vertices;this.object.geometry.vertices.push(t[e+0],t[e+1],t[e+2])},addVertexLine:function(e){const t=this.vertices;this.object.geometry.vertices.push(t[e+0],t[e+1],t[e+2])},addNormal:function(e,t,r){const a=this.normals,o=this.object.geometry.normals;o.push(a[e+0],a[e+1],a[e+2]),o.push(a[t+0],a[t+1],a[t+2]),o.push(a[r+0],a[r+1],a[r+2])},addFaceNormal:function(e,t,r){const a=this.vertices,o=this.object.geometry.normals;Ue.fromArray(a,e),He.fromArray(a,t),Xe.fromArray(a,r),Ye.subVectors(Xe,He),qe.subVectors(Ue,He),Ye.cross(qe),Ye.normalize(),o.push(Ye.x,Ye.y,Ye.z),o.push(Ye.x,Ye.y,Ye.z),o.push(Ye.x,Ye.y,Ye.z)},addColor:function(e,t,r){const a=this.colors,o=this.object.geometry.colors;void 0!==a[e]&&o.push(a[e+0],a[e+1],a[e+2]),void 0!==a[t]&&o.push(a[t+0],a[t+1],a[t+2]),void 0!==a[r]&&o.push(a[r+0],a[r+1],a[r+2])},addUV:function(e,t,r){const a=this.uvs,o=this.object.geometry.uvs;o.push(a[e+0],a[e+1]),o.push(a[t+0],a[t+1]),o.push(a[r+0],a[r+1])},addDefaultUV:function(){const e=this.object.geometry.uvs;e.push(0,0),e.push(0,0),e.push(0,0)},addUVLine:function(e){const t=this.uvs;this.object.geometry.uvs.push(t[e+0],t[e+1])},addFace:function(e,t,r,a,o,n,s,i,l){const c=this.vertices.length;let d=this.parseVertexIndex(e,c),u=this.parseVertexIndex(t,c),f=this.parseVertexIndex(r,c);if(this.addVertex(d,u,f),this.addColor(d,u,f),void 0!==s&&""!==s){const e=this.normals.length;d=this.parseNormalIndex(s,e),u=this.parseNormalIndex(i,e),f=this.parseNormalIndex(l,e),this.addNormal(d,u,f)}else this.addFaceNormal(d,u,f);if(void 0!==a&&""!==a){const e=this.uvs.length;d=this.parseUVIndex(a,e),u=this.parseUVIndex(o,e),f=this.parseUVIndex(n,e),this.addUV(d,u,f),this.object.geometry.hasUVIndices=!0}else this.addDefaultUV()},addPointGeometry:function(e){this.object.geometry.type="Points";const t=this.vertices.length;for(let r=0,a=e.length;r<a;r++){const a=this.parseVertexIndex(e[r],t);this.addVertexPoint(a),this.addColor(a)}},addLineGeometry:function(e,t){this.object.geometry.type="Line";const r=this.vertices.length,a=this.uvs.length;for(let t=0,a=e.length;t<a;t++)this.addVertexLine(this.parseVertexIndex(e[t],r));for(let e=0,r=t.length;e<r;e++)this.addUVLine(this.parseUVIndex(t[e],a))}};return e.startObject("",!1),e}class Ke extends t.Loader{constructor(e){super(e),this.materials=null}load(e,r,a,o){const n=this,s=new t.FileLoader(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(e,(function(t){try{r(n.parse(t))}catch(t){o?o(t):console.error(t),n.manager.itemError(e)}}),a,o)}setMaterials(e){return this.materials=e,this}parse(e){const r=new Je;-1!==e.indexOf("\r\n")&&(e=e.replace(/\r\n/g,"\n")),-1!==e.indexOf("\\\n")&&(e=e.replace(/\\\n/g,""));const a=e.split("\n");let o=[];for(let e=0,t=a.length;e<t;e++){const t=a[e].trimStart();if(0===t.length)continue;const n=t.charAt(0);if("#"!==n)if("v"===n){const e=t.split(We);switch(e[0]){case"v":r.vertices.push(parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3])),e.length>=7?(Ze.setRGB(parseFloat(e[4]),parseFloat(e[5]),parseFloat(e[6])).convertSRGBToLinear(),r.colors.push(Ze.r,Ze.g,Ze.b)):r.colors.push(void 0,void 0,void 0);break;case"vn":r.normals.push(parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3]));break;case"vt":r.uvs.push(parseFloat(e[1]),parseFloat(e[2]))}}else if("f"===n){const e=t.slice(1).trim().split(We),a=[];for(let t=0,r=e.length;t<r;t++){const r=e[t];if(r.length>0){const e=r.split("/");a.push(e)}}const o=a[0];for(let e=1,t=a.length-1;e<t;e++){const t=a[e],n=a[e+1];r.addFace(o[0],t[0],n[0],o[1],t[1],n[1],o[2],t[2],n[2])}}else if("l"===n){const e=t.substring(1).trim().split(" ");let a=[];const o=[];if(-1===t.indexOf("/"))a=e;else for(let t=0,r=e.length;t<r;t++){const r=e[t].split("/");""!==r[0]&&a.push(r[0]),""!==r[1]&&o.push(r[1])}r.addLineGeometry(a,o)}else if("p"===n){const e=t.slice(1).trim().split(" ");r.addPointGeometry(e)}else if(null!==(o=Fe.exec(t))){const e=(" "+o[0].slice(1).trim()).slice(1);r.startObject(e)}else if(Be.test(t))r.object.startMaterial(t.substring(7).trim(),r.materialLibraries);else if(Ne.test(t))r.materialLibraries.push(t.substring(7).trim());else if(Ve.test(t))console.warn('THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.');else if("s"===n){if(o=t.split(" "),o.length>1){const e=o[1].trim().toLowerCase();r.object.smooth="0"!==e&&"off"!==e}else r.object.smooth=!0;const e=r.object.currentMaterial();e&&(e.smooth=r.object.smooth)}else{if("\0"===t)continue;console.warn('THREE.OBJLoader: Unexpected line: "'+t+'"')}}r.finalize();const n=new t.Group;n.materialLibraries=[].concat(r.materialLibraries);if(!0===!(1===r.objects.length&&0===r.objects[0].geometry.vertices.length))for(let e=0,a=r.objects.length;e<a;e++){const a=r.objects[e],o=a.geometry,s=a.materials,i="Line"===o.type,l="Points"===o.type;let c=!1;if(0===o.vertices.length)continue;const d=new t.BufferGeometry;d.setAttribute("position",new t.Float32BufferAttribute(o.vertices,3)),o.normals.length>0&&d.setAttribute("normal",new t.Float32BufferAttribute(o.normals,3)),o.colors.length>0&&(c=!0,d.setAttribute("color",new t.Float32BufferAttribute(o.colors,3))),!0===o.hasUVIndices&&d.setAttribute("uv",new t.Float32BufferAttribute(o.uvs,2));const u=[];for(let e=0,a=s.length;e<a;e++){const a=s[e],o=a.name+"_"+a.smooth+"_"+c;let n=r.materials[o];if(null!==this.materials)if(n=this.materials.create(a.name),!i||!n||n instanceof t.LineBasicMaterial){if(l&&n&&!(n instanceof t.PointsMaterial)){const e=new t.PointsMaterial({size:10,sizeAttenuation:!1});t.Material.prototype.copy.call(e,n),e.color.copy(n.color),e.map=n.map,n=e}}else{const e=new t.LineBasicMaterial;t.Material.prototype.copy.call(e,n),e.color.copy(n.color),n=e}void 0===n&&(n=i?new t.LineBasicMaterial:l?new t.PointsMaterial({size:1,sizeAttenuation:!1}):new t.MeshPhongMaterial,n.name=a.name,n.flatShading=!a.smooth,n.vertexColors=c,r.materials[o]=n),u.push(n)}let f;if(u.length>1){for(let e=0,t=s.length;e<t;e++){const t=s[e];d.addGroup(t.groupStart,t.groupCount,e)}f=i?new t.LineSegments(d,u):l?new t.Points(d,u):new t.Mesh(d,u)}else f=i?new t.LineSegments(d,u[0]):l?new t.Points(d,u[0]):new t.Mesh(d,u[0]);f.name=a.name,n.add(f)}else if(r.vertices.length>0){const e=new t.PointsMaterial({size:1,sizeAttenuation:!1}),a=new t.BufferGeometry;a.setAttribute("position",new t.Float32BufferAttribute(r.vertices,3)),r.colors.length>0&&void 0!==r.colors[0]&&(a.setAttribute("color",new t.Float32BufferAttribute(r.colors,3)),e.vertexColors=!0);const o=new t.Points(a,e);n.add(o)}return n}}class Qe extends c.default.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error("ThreeCustom error:",e,t)}render(){return this.state.hasError?c.default.createElement("div",{style:{padding:"20px",color:"red",textAlign:"center"}},c.default.createElement("h3",null,"WebGL Error"),c.default.createElement("p",null,"Failed to initialize 3D scene. Please check your browser supports WebGL."),c.default.createElement("p",{style:{fontSize:"12px",color:"#666"}},this.state.error?.message)):this.props.children}}function et(){return c.default.createElement("mesh",null,c.default.createElement("boxGeometry",{args:[1,1,1]}),c.default.createElement("meshBasicMaterial",{color:"#cccccc",wireframe:!0}))}function tt({config:e}){const t=r.useRef(),a=r.useMemo((()=>{switch(e.type){case"ambient":return new l.AmbientLight(e.color,e.intensity);case"directional":const t=new l.DirectionalLight(e.color,e.intensity);return t.position.set(...e.position||[10,10,10]),t.castShadow=e.castShadow||!1,t;case"point":const r=new l.PointLight(e.color,e.intensity,e.distance||0,e.decay||2);return r.position.set(...e.position||[0,0,0]),r.castShadow=e.castShadow||!1,r;case"spot":const a=new l.SpotLight(e.color,e.intensity,e.distance||0,e.angle||Math.PI/6,e.penumbra||0,e.decay||2);return a.position.set(...e.position||[0,10,0]),a.castShadow=e.castShadow||!1,a;case"hemisphere":const o=new l.HemisphereLight(e.skyColor||"#ffffff",e.groundColor||"#444444",e.intensity||1);return o.position.set(...e.position||[0,10,0]),o;default:return new l.AmbientLight("#ffffff",.5)}}),[e]);return c.default.createElement("primitive",{ref:t,object:a})}function rt({type:e,config:t={}}){const{camera:a,gl:s}=o.useThree(),i=r.useMemo((()=>({enableDamping:!1!==t.enableDamping,dampingFactor:t.dampingFactor||.05,enableZoom:!1!==t.enableZoom,enablePan:!1!==t.enablePan,enableRotate:!1!==t.enableRotate,autoRotate:t.autoRotate||!1,autoRotateSpeed:t.autoRotateSpeed||1,minDistance:t.minDistance||0,maxDistance:t.maxDistance||1/0,...t})),[t]);switch(e){case"orbit":default:return c.default.createElement(n.OrbitControls,u({},i,{args:[a,s.domElement]}));case"trackball":return c.default.createElement(n.TrackballControls,u({},i,{args:[a,s.domElement]}));case"fly":return c.default.createElement(n.FlyControls,u({},i,{args:[a,s.domElement]}))}}function at(e){if(!e)return new l.MeshStandardMaterial({color:"#888888"});const t=e;switch(t.type){case"basic":return new l.MeshBasicMaterial({color:t.color||"#888888",transparent:t.transparent||!1,opacity:void 0!==t.opacity?t.opacity:1,wireframe:t.wireframe||!1});case"standard":const e=new l.MeshStandardMaterial({color:t.color||"#888888",roughness:void 0!==t.roughness?t.roughness:.5,metalness:void 0!==t.metalness?t.metalness:.5,transparent:t.transparent||!1,opacity:void 0!==t.opacity?t.opacity:1,wireframe:t.wireframe||!1});return t.map,e;case"phong":return new l.MeshPhongMaterial({color:t.color||"#888888",shininess:t.shininess||30,transparent:t.transparent||!1,opacity:void 0!==t.opacity?t.opacity:1});case"lambert":return new l.MeshLambertMaterial({color:t.color||"#888888",transparent:t.transparent||!1,opacity:void 0!==t.opacity?t.opacity:1});case"physical":return new l.MeshPhysicalMaterial({color:t.color||"#888888",roughness:void 0!==t.roughness?t.roughness:.5,metalness:void 0!==t.metalness?t.metalness:.5,clearcoat:t.clearcoat||0,clearcoatRoughness:t.clearcoatRoughness||0,transparent:t.transparent||!1,opacity:void 0!==t.opacity?t.opacity:1});default:return new l.MeshStandardMaterial({color:t.color||"#888888"})}}function ot({url:e,config:t,onLoad:a,onError:s}){const i=r.useRef(),[l,d]=r.useState(null),u=n.useGLTF(e,!0);return r.useEffect((()=>{if(!u){const e=new Error("Failed to load GLTF model");d(e),s&&s(e)}}),[u,s]),r.useEffect((()=>{u&&a&&a(u)}),[u,a]),o.useFrame((e=>{if(!i.current||!t?.animation)return;const r=t.animation;if(r.autoRotate){const e=r.speed||.01;i.current.rotation.y+=e}r.rotation&&(i.current.rotation.x+=r.rotation[0]||0,i.current.rotation.y+=r.rotation[1]||0,i.current.rotation.z+=r.rotation[2]||0)})),r.useEffect((()=>{if(!i.current||!t?.material)return;const e=at(t.material);return i.current.traverse((t=>{t.isMesh&&(t.material=e)})),()=>{e.dispose()}}),[t?.material]),l?c.default.createElement("mesh",null,c.default.createElement("boxGeometry",{args:[1,1,1]}),c.default.createElement("meshBasicMaterial",{color:"#ff0000",wireframe:!0})):u?c.default.createElement("group",{ref:i,position:t?.position||[0,0,0],rotation:t?.rotation||[0,0,0],scale:t?.scale||[1,1,1]},c.default.createElement("primitive",{object:u.scene})):c.default.createElement(et,null)}function nt({url:e,config:t,onLoad:a,onError:n}){const s=r.useRef(),[i,l]=r.useState(null),[d,u]=r.useState(null);return r.useEffect((()=>{(new Ke).load(e,(e=>{l(e),a&&a(e)}),void 0,(e=>{console.error("Error loading OBJ:",e),u(e),n&&n(e)}))}),[e,a,n]),o.useFrame((()=>{if(!s.current||!t?.animation)return;const e=t.animation;if(e.autoRotate){const t=e.speed||.01;s.current.rotation.y+=t}e.rotation&&(s.current.rotation.x+=e.rotation[0]||0,s.current.rotation.y+=e.rotation[1]||0,s.current.rotation.z+=e.rotation[2]||0)})),r.useEffect((()=>{if(!s.current||!t?.material)return;const e=at(t.material);return s.current.traverse((t=>{t.isMesh&&(t.material=e)})),()=>{e.dispose()}}),[t?.material]),d?c.default.createElement("mesh",null,c.default.createElement("boxGeometry",{args:[1,1,1]}),c.default.createElement("meshBasicMaterial",{color:"#ff0000",wireframe:!0})):i?c.default.createElement("group",{ref:s,position:t?.position||[0,0,0],rotation:t?.rotation||[0,0,0],scale:t?.scale||[1,1,1]},c.default.createElement("primitive",{object:i})):c.default.createElement(et,null)}function st({config:e}){const t=r.useRef(),a=r.useMemo((()=>{if(!e?.geometry)return new l.BoxGeometry(1,1,1);const t=e.geometry;switch(t.type){case"box":return new l.BoxGeometry(t.width||1,t.height||1,t.depth||1);case"sphere":return new l.SphereGeometry(t.radius||1,t.widthSegments||32,t.heightSegments||16);case"cylinder":return new l.CylinderGeometry(t.radiusTop||1,t.radiusBottom||1,t.height||1,t.radialSegments||32);case"plane":return new l.PlaneGeometry(t.width||1,t.height||1);case"torus":return new l.TorusGeometry(t.radius||1,t.tube||.4,t.radialSegments||16,t.tubularSegments||100);case"cone":return new l.ConeGeometry(t.radius||1,t.height||1,t.radialSegments||32);case"buffer":if(t.vertices){const e=new l.BufferGeometry;return e.setAttribute("position",new l.Float32BufferAttribute(t.vertices,3)),t.normals&&e.setAttribute("normal",new l.Float32BufferAttribute(t.normals,3)),t.uvs&&e.setAttribute("uv",new l.Float32BufferAttribute(t.uvs,2)),t.indices&&e.setIndex(t.indices),e}return new l.BoxGeometry(1,1,1);default:return new l.BoxGeometry(1,1,1)}}),[e?.geometry]),n=r.useMemo((()=>at(e?.material)),[e?.material]);return o.useFrame((()=>{if(!t.current||!e?.animation)return;const r=e.animation;if(r.autoRotate){const e=r.speed||.01;t.current.rotation.y+=e}r.rotation&&(t.current.rotation.x+=r.rotation[0]||0,t.current.rotation.y+=r.rotation[1]||0,t.current.rotation.z+=r.rotation[2]||0)})),r.useEffect((()=>()=>{a.dispose(),n.dispose()}),[a,n]),c.default.createElement("mesh",{ref:t,geometry:a,material:n,position:e?.position||[0,0,0],rotation:e?.rotation||[0,0,0],scale:e?.scale||[1,1,1],castShadow:!1!==e?.castShadow,receiveShadow:!1!==e?.receiveShadow})}function it({config:e,onLoad:t,onError:r}){switch(e?.format||"geometry"){case"gltf":case"glb":return c.default.createElement(ot,{url:e.url,config:e,onLoad:t,onError:r});case"obj":return c.default.createElement(nt,{url:e.url,config:e,onLoad:t,onError:r});default:return c.default.createElement(st,{config:e})}}function lt({sceneConfig:e,controls:t,animation:a,onModelLoad:s,onModelError:i}){const{scene:d}=o.useThree();r.useEffect((()=>{e?.backgroundColor&&(d.background=new l.Color(e.backgroundColor)),e?.fog&&(d.fog=new l.Fog(e.fog.color||0,e.fog.near||1,e.fog.far||1e3))}),[d,e]);const u=r.useMemo((()=>(e?.lights||[{type:"ambient",color:"#ffffff",intensity:.5},{type:"directional",position:[10,10,10],intensity:1}]).map(((e,t)=>c.default.createElement(tt,{key:`light-${t}`,config:e})))),[e?.lights]);return c.default.createElement(c.default.Fragment,null,u,c.default.createElement(n.Bounds,{fit:!0,clip:!0,observe:!0,margin:1.2},c.default.createElement(n.Center,null,c.default.createElement(it,{config:e?.model,onLoad:s,onError:i}))),c.default.createElement(rt,{type:t,config:a}))}const ct=r.forwardRef((({props:e,style:t},a)=>{const{config:n}=e||{},[s,i]=r.useState(!0),[l,d]=r.useState(null),u=r.useRef(),f=n?.scene||{},h=f?.camera||{position:[0,0,100],fov:75,near:.1,far:1e3},p=n?.controls||"orbit",m=n?.animation||{},g=r.useMemo((()=>({position:h.position||[0,0,100],fov:h.fov||75,near:h.near||.1,far:h.far||1e3})),[h]),y=r.useCallback((()=>{i(!1)}),[]),b=r.useCallback((e=>{console.error("Model loading error:",e),d(e),i(!1)}),[]);return r.useImperativeHandle(a,(()=>({getCanvas:()=>u.current,getScene:()=>u.current?.scene,getCamera:()=>u.current?.camera,getRenderer:()=>u.current?.gl,screenshot:(e="image/png")=>{const t=u.current?.gl;return t?t.domElement.toDataURL(e):null}})),[]),l?c.default.createElement("div",{style:{...t,display:"flex",alignItems:"center",justifyContent:"center"}},c.default.createElement("div",{style:{color:"red",textAlign:"center"}},c.default.createElement("p",null,"Failed to load 3D model"),c.default.createElement("p",{style:{fontSize:"12px"}},l.message))):c.default.createElement("div",{id:e?.id,style:{...t,position:"relative"}},s&&c.default.createElement("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",background:"#f5f5f5",zIndex:1}},"Loading 3D Model..."),c.default.createElement(Qe,null,c.default.createElement(o.Canvas,{ref:u,gl:{antialias:!0,alpha:!0,powerPreference:"high-performance"},camera:g,style:{width:"100%",height:"100%"}},c.default.createElement(lt,{sceneConfig:f,controls:p,animation:m,onModelLoad:y,onModelError:b}))))}));ct.displayName="ThreeCustom";class dt{constructor(e={}){this.scenes=new Map,this.activeSceneId=null,this.defaultOptions={backgroundColor:0,fog:null,...e}}createScene(e,t={}){if(this.scenes.has(e))return console.warn(`Scene with id "${e}" already exists. Returning existing scene.`),this.scenes.get(e).scene;const r=new l.Scene,a={...this.defaultOptions,...t};return void 0!==a.backgroundColor&&(r.background=new l.Color(a.backgroundColor)),a.fog&&(r.fog=new l.Fog(a.fog.color||0,a.fog.near||1,a.fog.far||1e3)),this.scenes.set(e,{scene:r,config:a,objects:new Map,createdAt:Date.now()}),this.activeSceneId||(this.activeSceneId=e),r}getScene(e){const t=this.scenes.get(e);return t?t.scene:null}getActiveScene(){return this.activeSceneId?this.getScene(this.activeSceneId):null}setActiveScene(e){if(!this.scenes.has(e))throw new Error(`Scene with id "${e}" does not exist`);this.activeSceneId=e}addObject(e,t,r){const a=this.scenes.get(e);if(!a)throw new Error(`Scene with id "${e}" does not exist`);a.scene.add(r),a.objects.set(t,r)}removeObject(e,t){const r=this.scenes.get(e);if(!r)return;const a=r.objects.get(t);a&&(r.scene.remove(a),this.disposeObject(a),r.objects.delete(t))}getObject(e,t){const r=this.scenes.get(e);return r&&r.objects.get(t)||null}clearScene(e){const t=this.scenes.get(e);t&&(t.objects.forEach(((e,r)=>{t.scene.remove(e),this.disposeObject(e)})),t.objects.clear())}removeScene(e){const t=this.scenes.get(e);if(t&&(this.clearScene(e),t.scene.background&&t.scene.background.dispose&&t.scene.background.dispose(),this.scenes.delete(e),this.activeSceneId===e)){const e=Array.from(this.scenes.keys());this.activeSceneId=e.length>0?e[0]:null}}disposeObject(e){e&&e.traverse((e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach((e=>this.disposeMaterial(e))):this.disposeMaterial(e.material))}))}disposeMaterial(e){e&&(Object.keys(e).forEach((t=>{const r=e[t];r&&r.isTexture&&r.dispose()})),e.dispose())}getSceneIds(){return Array.from(this.scenes.keys())}dispose(){this.getSceneIds().forEach((e=>this.removeScene(e))),this.activeSceneId=null}}var ut=Object.freeze({__proto__:null,SceneManager:dt,createSceneFromConfig:function(e={}){const t=new l.Scene;return e.backgroundColor&&(t.background=new l.Color(e.backgroundColor)),e.fog&&(t.fog=new l.Fog(e.fog.color||0,e.fog.near||1,e.fog.far||1e3)),t},default:dt});const ft={PERSPECTIVE:"perspective",ORTHOGRAPHIC:"orthographic"};class ht{constructor(e={}){this.cameras=new Map,this.activeCameraId=null,this.defaultOptions={type:ft.PERSPECTIVE,position:[0,0,100],target:[0,0,0],up:[0,1,0],...e}}createPerspectiveCamera(e,t={}){const r={fov:75,near:.1,far:1e3,aspect:window.innerWidth/window.innerHeight,...this.defaultOptions,...t},a=new l.PerspectiveCamera(r.fov,r.aspect,r.near,r.far);return this.setupCamera(a,r),this.storeCamera(e,a,r),a}createOrthographicCamera(e,t={}){const r={left:-50,right:50,top:50,bottom:-50,near:.1,far:1e3,...this.defaultOptions,...t},a=new l.OrthographicCamera(r.left,r.right,r.top,r.bottom,r.near,r.far);return this.setupCamera(a,r),this.storeCamera(e,a,r),a}setupCamera(e,t){t.position&&e.position.set(...t.position),t.up&&e.up.set(...t.up),t.target&&e.lookAt(...t.target)}storeCamera(e,t,r){this.cameras.has(e)&&(console.warn(`Camera with id "${e}" already exists. Replacing.`),this.disposeCamera(e)),this.cameras.set(e,{camera:t,config:r,createdAt:Date.now()}),this.activeCameraId||(this.activeCameraId=e)}createCamera(e,t={}){const r=t.type||this.defaultOptions.type;switch(r){case ft.PERSPECTIVE:return this.createPerspectiveCamera(e,t);case ft.ORTHOGRAPHIC:return this.createOrthographicCamera(e,t);default:throw new Error(`Unknown camera type: ${r}`)}}getCamera(e){const t=this.cameras.get(e);return t?t.camera:null}getActiveCamera(){return this.activeCameraId?this.getCamera(this.activeCameraId):null}setActiveCamera(e){if(!this.cameras.has(e))throw new Error(`Camera with id "${e}" does not exist`);this.activeCameraId=e}updateAspectRatio(e,t){const r=this.cameras.get(e);if(!r)return;const a=r.camera;a.isPerspectiveCamera&&(a.aspect=t,a.updateProjectionMatrix())}updateOrthographicBounds(e,t){const r=this.cameras.get(e);if(!r)return;const a=r.camera;a.isOrthographicCamera&&(Object.assign(a,t),a.updateProjectionMatrix())}async animateTo(e,t,r=1e3){const a=this.getCamera(e);if(!a)throw new Error(`Camera with id "${e}" does not exist`);const o=a.position.clone(),n=new l.Vector3(0,0,-1).applyQuaternion(a.quaternion).add(a.position),s=new l.Vector3(...t.position||[0,0,100]),i=new l.Vector3(...t.target||[0,0,0]),c=Date.now();return new Promise((e=>{const t=()=>{const d=Date.now()-c,u=Math.min(d/r,1),f=u<.5?4*u*u*u:1-Math.pow(-2*u+2,3)/2;a.position.lerpVectors(o,s,f);const h=(new l.Vector3).lerpVectors(n,i,f);a.lookAt(h),u<1?requestAnimationFrame(t):e()};t()}))}async resetCamera(e,t=1e3){const r=this.cameras.get(e);if(!r)return;const a=r.config;await this.animateTo(e,{position:a.position,target:a.target},t)}removeCamera(e){if(this.disposeCamera(e),this.cameras.delete(e),this.activeCameraId===e){const e=Array.from(this.cameras.keys());this.activeCameraId=e.length>0?e[0]:null}}disposeCamera(e){const t=this.cameras.get(e);t&&(t.camera=null)}getCameraIds(){return Array.from(this.cameras.keys())}dispose(){this.getCameraIds().forEach((e=>this.removeCamera(e))),this.activeCameraId=null}}var pt=Object.freeze({__proto__:null,CameraType:ft,CameraManager:ht,createCameraFromConfig:function(e={}){let t;return t=(e.type||ft.PERSPECTIVE)===ft.PERSPECTIVE?new l.PerspectiveCamera(e.fov||75,e.aspect||window.innerWidth/window.innerHeight,e.near||.1,e.far||1e3):new l.OrthographicCamera(e.left||-50,e.right||50,e.top||50,e.bottom||-50,e.near||.1,e.far||1e3),e.position&&t.position.set(...e.position),e.up&&t.up.set(...e.up),e.target&&t.lookAt(...e.target),t},default:ht});const mt={AMBIENT:"ambient",DIRECTIONAL:"directional",POINT:"point",SPOT:"spot",HEMISPHERE:"hemisphere",RECT_AREA:"rectArea"};class gt{constructor(){this.lights=new Map,this.lightGroups=new Map}createAmbientLight(e,t={}){const r={color:16777215,intensity:.5,...t},a=new l.AmbientLight(r.color,r.intensity);return this.storeLight(e,a,mt.AMBIENT,r),a}createDirectionalLight(e,t={}){const r={color:16777215,intensity:1,position:[10,10,10],target:[0,0,0],castShadow:!1,shadow:null,...t},a=new l.DirectionalLight(r.color,r.intensity);return a.position.set(...r.position),a.target.position.set(...r.target),r.castShadow&&(a.castShadow=!0,this.configureShadow(a,r.shadow)),this.storeLight(e,a,mt.DIRECTIONAL,r),a}createPointLight(e,t={}){const r={color:16777215,intensity:1,distance:0,decay:2,position:[0,0,0],castShadow:!1,shadow:null,...t},a=new l.PointLight(r.color,r.intensity,r.distance,r.decay);return a.position.set(...r.position),r.castShadow&&(a.castShadow=!0,this.configureShadow(a,r.shadow)),this.storeLight(e,a,mt.POINT,r),a}createSpotLight(e,t={}){const r={color:16777215,intensity:1,distance:0,angle:Math.PI/6,penumbra:0,decay:2,position:[0,10,0],target:[0,0,0],castShadow:!1,shadow:null,...t},a=new l.SpotLight(r.color,r.intensity,r.distance,r.angle,r.penumbra,r.decay);return a.position.set(...r.position),a.target.position.set(...r.target),r.castShadow&&(a.castShadow=!0,this.configureShadow(a,r.shadow)),this.storeLight(e,a,mt.SPOT,r),a}createHemisphereLight(e,t={}){const r={skyColor:16777215,groundColor:4473924,intensity:1,position:[0,10,0],...t},a=new l.HemisphereLight(r.skyColor,r.groundColor,r.intensity);return a.position.set(...r.position),this.storeLight(e,a,mt.HEMISPHERE,r),a}configureShadow(e,t={}){if(!e.shadow)return;const r={mapSize:{width:1024,height:1024},camera:{near:.5,far:500,left:-50,right:50,top:50,bottom:-50},bias:-.001,radius:1,...t};r.mapSize&&(e.shadow.mapSize.width=r.mapSize.width,e.shadow.mapSize.height=r.mapSize.height),r.camera&&e.shadow.camera&&(Object.assign(e.shadow.camera,r.camera),e.shadow.camera.updateProjectionMatrix()),void 0!==r.bias&&(e.shadow.bias=r.bias),void 0!==r.radius&&(e.shadow.radius=r.radius)}storeLight(e,t,r,a){this.lights.has(e)&&(console.warn(`Light with id "${e}" already exists. Replacing.`),this.disposeLight(e)),this.lights.set(e,{light:t,type:r,config:a,createdAt:Date.now()})}createLight(e,t={}){const r=t.type||mt.AMBIENT;switch(r){case mt.AMBIENT:return this.createAmbientLight(e,t);case mt.DIRECTIONAL:return this.createDirectionalLight(e,t);case mt.POINT:return this.createPointLight(e,t);case mt.SPOT:return this.createSpotLight(e,t);case mt.HEMISPHERE:return this.createHemisphereLight(e,t);default:throw new Error(`Unknown light type: ${r}`)}}getLight(e){const t=this.lights.get(e);return t?t.light:null}updateIntensity(e,t){const r=this.lights.get(e);r&&r.light&&(r.light.intensity=t)}updateColor(e,t){const r=this.lights.get(e);r&&r.light&&r.light.color.set(t)}updatePosition(e,t){const r=this.lights.get(e);r&&r.light&&r.light.position.set(...t)}createLightGroup(e,t=[]){const r=new l.Group;return t.forEach((e=>{const t=this.lights.get(e);t&&r.add(t.light)})),this.lightGroups.set(e,{group:r,lightIds:t}),r}getLightGroup(e){const t=this.lightGroups.get(e);return t?t.group:null}removeLight(e){this.disposeLight(e),this.lights.delete(e)}disposeLight(e){const t=this.lights.get(e);if(!t)return;const r=t.light;r.shadow&&r.shadow.map&&r.shadow.map.dispose(),this.lightGroups.forEach((e=>{e.group.remove(r)})),t.light=null}removeLightGroup(e){const t=this.lightGroups.get(e);t&&(t.lightIds.forEach((e=>{const r=this.lights.get(e);r&&t.group.remove(r.light)})),this.lightGroups.delete(e))}getLightIds(){return Array.from(this.lights.keys())}dispose(){this.getLightIds().forEach((e=>this.removeLight(e))),this.lightGroups.clear()}}function yt(e=[]){const t=new gt,r=[];return e.forEach(((e,a)=>{const o=e.id||`light_${a}`,n=t.createLight(o,e);r.push(n)})),r}var bt=Object.freeze({__proto__:null,LightType:mt,LightingManager:gt,createLightsFromConfig:yt,createDefaultLighting:function(){return yt([{type:mt.AMBIENT,color:16777215,intensity:.5},{type:mt.DIRECTIONAL,color:16777215,intensity:1,position:[10,10,10],castShadow:!0}])},default:gt});class vt{constructor(e={}){this.renderers=new Map,this.activeRendererId=null,this.defaultOptions={antialias:!0,alpha:!0,powerPreference:"high-performance",precision:"highp",stencil:!1,depth:!0,logarithmicDepthBuffer:!1,...e}}createRenderer(e,t,r={}){if(this.renderers.has(e))return console.warn(`Renderer with id "${e}" already exists. Returning existing renderer.`),this.renderers.get(e).renderer;const a={...this.defaultOptions,...r},o=new l.WebGLRenderer({canvas:t,antialias:a.antialias,alpha:a.alpha,powerPreference:a.powerPreference,stencil:a.stencil,depth:a.depth,logarithmicDepthBuffer:a.logarithmicDepthBuffer});return this.configureRenderer(o,a),this.renderers.set(e,{renderer:o,config:a,canvas:t,resizeObserver:null,createdAt:Date.now()}),this.activeRendererId||(this.activeRendererId=e),o}configureRenderer(e,t){const r=Math.min(window.devicePixelRatio,2);e.setPixelRatio(r),t.width&&t.height&&e.setSize(t.width,t.height),t.precision&&(e.capabilities.precision=t.precision),!1!==t.shadowMap&&(e.shadowMap.enabled=!0,e.shadowMap.type=t.shadowMapType||l.PCFSoftShadowMap),e.outputColorSpace=l.SRGBColorSpace,t.toneMapping&&(e.toneMapping=t.toneMapping,t.toneMappingExposure&&(e.toneMappingExposure=t.toneMappingExposure)),void 0!==t.clearColor&&e.setClearColor(t.clearColor,t.clearAlpha??1)}getRenderer(e){const t=this.renderers.get(e);return t?t.renderer:null}getActiveRenderer(){return this.activeRendererId?this.getRenderer(this.activeRendererId):null}setActiveRenderer(e){if(!this.renderers.has(e))throw new Error(`Renderer with id "${e}" does not exist`);this.activeRendererId=e}updateSize(e,t,r){const a=this.renderers.get(e);if(!a)return;a.renderer.setSize(t,r),a.config.width=t,a.config.height=r}updatePixelRatio(e,t){const r=this.renderers.get(e);if(!r)return;r.renderer.setPixelRatio(Math.min(t,2))}enableAutoResize(e,t){const r=this.renderers.get(e);if(!r)return;r.resizeObserver&&r.resizeObserver.disconnect();const a=new ResizeObserver((t=>{for(const r of t){const{width:t,height:a}=r.contentRect;this.updateSize(e,t,a)}}));a.observe(t),r.resizeObserver=a}disableAutoResize(e){const t=this.renderers.get(e);t&&t.resizeObserver&&(t.resizeObserver.disconnect(),t.resizeObserver=null)}render(e,t,r){const a=this.getRenderer(e);a&&a.render(t,r)}takeScreenshot(e,t="image/png",r=1){const a=this.getRenderer(e);return a?a.domElement.toDataURL(t,r):null}getWebGLInfo(e){const t=this.getRenderer(e);return t?{renderer:t.info.render,memory:t.info.memory,programs:t.info.programs?.length||0}:null}resetInfo(e){const t=this.getRenderer(e);t&&t.info.reset()}compile(e,t,r){const a=this.getRenderer(e);a&&a.compile(t,r)}removeRenderer(e){const t=this.renderers.get(e);if(t&&(this.disableAutoResize(e),t.renderer.dispose(),this.renderers.delete(e),this.activeRendererId===e)){const e=Array.from(this.renderers.keys());this.activeRendererId=e.length>0?e[0]:null}}getRendererIds(){return Array.from(this.renderers.keys())}dispose(){this.getRendererIds().forEach((e=>this.removeRenderer(e))),this.activeRendererId=null}}var wt=Object.freeze({__proto__:null,RendererManager:vt,createRendererFromConfig:function(e,t={}){return new vt(t).createRenderer("default",e,t)},handleResize:function(e,t,r){const a=r.clientWidth,o=r.clientHeight;if(e.setSize(a,o),t.isPerspectiveCamera)t.aspect=a/o,t.updateProjectionMatrix();else if(t.isOrthographicCamera){const e=a/o,r=Math.max(t.right-t.left,t.top-t.bottom);t.left=-r*e/2,t.right=r*e/2,t.top=r/2,t.bottom=-r/2,t.updateProjectionMatrix()}},default:vt});var xt={THREE:l,VERSION:"0.1.0",ThreeJSManager:class{constructor(e={}){this.sceneManager=null,this.cameraManager=null,this.lightingManager=null,this.rendererManager=null,this.options={autoRender:!0,...e},this.animationId=null,this.isRendering=!1}async init(e,t,r={}){if(!this.sceneManager){const{SceneManager:e}=await Promise.resolve().then((function(){return ut}));this.sceneManager=new e}if(!this.cameraManager){const{CameraManager:e}=await Promise.resolve().then((function(){return pt}));this.cameraManager=new e}if(!this.lightingManager){const{LightingManager:e}=await Promise.resolve().then((function(){return bt}));this.lightingManager=new e}if(!this.rendererManager){const{RendererManager:e}=await Promise.resolve().then((function(){return wt}));this.rendererManager=new e}const a=this.sceneManager.createScene(`${e}_scene`,r.scene),o=this.cameraManager.createCamera(`${e}_camera`,r.camera);r.lights&&r.lights.forEach(((t,r)=>{const o=this.lightingManager.createLight(`${e}_light_${r}`,t);a.add(o)}));const n=this.rendererManager.createRenderer(`${e}_renderer`,t,r.renderer);return{scene:a,camera:o,renderer:n}}startRenderLoop(e){if(this.isRendering)return;this.isRendering=!0;const t=()=>{this.isRendering&&(this.animationId=requestAnimationFrame(t),e&&e())};t()}stopRenderLoop(){this.isRendering=!1,this.animationId&&(cancelAnimationFrame(this.animationId),this.animationId=null)}render(e,t,r){const a=this.sceneManager.getScene(e),o=this.cameraManager.getCamera(t);a&&o&&this.rendererManager.render(r,a,o)}dispose(){this.stopRenderLoop(),this.sceneManager&&this.sceneManager.dispose(),this.cameraManager&&this.cameraManager.dispose(),this.lightingManager&&this.lightingManager.dispose(),this.rendererManager&&this.rendererManager.dispose()}}};const _t={version:"3.0.0-1.dev",isSupported(){try{const e=document.createElement("canvas");return!!(e.getContext("webgl2")||e.getContext("webgl")||e.getContext("experimental-webgl"))}catch(e){return!1}},async preload(){const{preloadEChartsGL:e}=await Promise.resolve().then((function(){return N}));e()}};e.Bar3D=_e,e.Line3D=Me,e.Scatter3D=ve,e.Surface3D=Ce,e.ThreeCustom=ct,e.ThreeJS=xt,e.ThreeScene=Ge,e.cleanupWebGL=P,e.default=_t,e.display3DError=j,e.getLoadingState=$,e.getWebGLInfo=D,e.handleWebGLContextLoss=G,e.isWebGLSupported=M,e.loadEChartsGL=z,e.preloadEChartsGL=O,Object.defineProperty(e,"__esModule",{value:!0})}));