matterviz 0.3.6 → 0.4.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 (926) hide show
  1. package/dist/EmptyState.svelte.d.ts +9 -0
  2. package/dist/FilePicker.svelte +360 -0
  3. package/dist/FilePicker.svelte.d.ts +17 -0
  4. package/dist/Icon.svelte +44 -0
  5. package/dist/Icon.svelte.d.ts +13 -0
  6. package/dist/MillerIndexInput.svelte +66 -0
  7. package/dist/MillerIndexInput.svelte.d.ts +7 -0
  8. package/dist/api/mp.d.ts +6 -0
  9. package/dist/api/mp.js +22 -0
  10. package/dist/api/optimade.d.ts +45 -0
  11. package/dist/api/optimade.js +141 -0
  12. package/dist/app.css +244 -0
  13. package/dist/brillouin/BrillouinZone.svelte +554 -0
  14. package/dist/brillouin/BrillouinZone.svelte.d.ts +84 -0
  15. package/dist/brillouin/BrillouinZoneControls.svelte +144 -0
  16. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +17 -0
  17. package/dist/brillouin/BrillouinZoneExportPane.svelte +146 -0
  18. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +15 -0
  19. package/dist/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  20. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +13 -0
  21. package/dist/brillouin/BrillouinZoneScene.svelte +522 -0
  22. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +49 -0
  23. package/dist/brillouin/BrillouinZoneTooltip.svelte +83 -0
  24. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +8 -0
  25. package/dist/brillouin/compute.d.ts +17 -0
  26. package/dist/brillouin/compute.js +422 -0
  27. package/dist/brillouin/index.d.ts +8 -0
  28. package/dist/brillouin/index.js +7 -0
  29. package/dist/brillouin/types.d.ts +43 -0
  30. package/dist/brillouin/types.js +1 -0
  31. package/dist/chempot-diagram/ChemPotDiagram.svelte +328 -0
  32. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  33. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +843 -0
  34. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  35. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3191 -0
  36. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  37. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  38. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  39. package/dist/chempot-diagram/async-compute.svelte.js +80 -0
  40. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  41. package/dist/chempot-diagram/chempot-worker.js +12 -0
  42. package/dist/chempot-diagram/color.d.ts +10 -0
  43. package/dist/chempot-diagram/color.js +32 -0
  44. package/dist/chempot-diagram/compute.d.ts +48 -0
  45. package/dist/chempot-diagram/compute.js +804 -0
  46. package/dist/chempot-diagram/index.d.ts +6 -0
  47. package/dist/chempot-diagram/index.js +6 -0
  48. package/dist/chempot-diagram/pointer.d.ts +16 -0
  49. package/dist/chempot-diagram/pointer.js +40 -0
  50. package/dist/chempot-diagram/temperature.d.ts +15 -0
  51. package/dist/chempot-diagram/temperature.js +34 -0
  52. package/dist/chempot-diagram/types.d.ts +81 -0
  53. package/dist/chempot-diagram/types.js +28 -0
  54. package/dist/colors/index.d.ts +47 -0
  55. package/dist/colors/index.js +204 -0
  56. package/dist/composition/BarChart.svelte +297 -0
  57. package/dist/composition/BarChart.svelte.d.ts +39 -0
  58. package/dist/composition/BubbleChart.svelte +218 -0
  59. package/dist/composition/BubbleChart.svelte.d.ts +28 -0
  60. package/dist/composition/Composition.svelte +165 -0
  61. package/dist/composition/Composition.svelte.d.ts +15 -0
  62. package/dist/composition/Formula.svelte +268 -0
  63. package/dist/composition/Formula.svelte.d.ts +19 -0
  64. package/dist/composition/FormulaFilter.svelte +1263 -0
  65. package/dist/composition/FormulaFilter.svelte.d.ts +51 -0
  66. package/dist/composition/PieChart.svelte +324 -0
  67. package/dist/composition/PieChart.svelte.d.ts +37 -0
  68. package/dist/composition/chem-sys.d.ts +8 -0
  69. package/dist/composition/chem-sys.js +85 -0
  70. package/dist/composition/format.d.ts +15 -0
  71. package/dist/composition/format.js +111 -0
  72. package/dist/composition/index.d.ts +21 -0
  73. package/dist/composition/index.js +15 -0
  74. package/dist/composition/parse.d.ts +56 -0
  75. package/dist/composition/parse.js +486 -0
  76. package/dist/constants.d.ts +29 -0
  77. package/dist/constants.js +99 -0
  78. package/dist/controls.d.ts +14 -0
  79. package/dist/controls.js +30 -0
  80. package/dist/convex-hull/ConvexHull.svelte +157 -0
  81. package/dist/convex-hull/ConvexHull.svelte.d.ts +13 -0
  82. package/dist/convex-hull/ConvexHull2D.svelte +827 -0
  83. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +11 -0
  84. package/dist/convex-hull/ConvexHull3D.svelte +1801 -0
  85. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +8 -0
  86. package/dist/convex-hull/ConvexHull4D.svelte +1394 -0
  87. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +8 -0
  88. package/dist/convex-hull/ConvexHullControls.svelte +535 -0
  89. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +48 -0
  90. package/dist/convex-hull/ConvexHullInfoPane.svelte +125 -0
  91. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +20 -0
  92. package/dist/convex-hull/ConvexHullStats.svelte +929 -0
  93. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +17 -0
  94. package/dist/convex-hull/ConvexHullTooltip.svelte +131 -0
  95. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +33 -0
  96. package/dist/convex-hull/GasPressureControls.svelte +247 -0
  97. package/dist/convex-hull/GasPressureControls.svelte.d.ts +11 -0
  98. package/dist/convex-hull/StructurePopup.svelte +151 -0
  99. package/dist/convex-hull/StructurePopup.svelte.d.ts +18 -0
  100. package/dist/convex-hull/TemperatureSlider.svelte +140 -0
  101. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +8 -0
  102. package/dist/convex-hull/barycentric-coords.d.ts +18 -0
  103. package/dist/convex-hull/barycentric-coords.js +182 -0
  104. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  105. package/dist/convex-hull/demo-temperature.js +38 -0
  106. package/dist/convex-hull/gas-thermodynamics.d.ts +16 -0
  107. package/dist/convex-hull/gas-thermodynamics.js +306 -0
  108. package/dist/convex-hull/helpers.d.ts +117 -0
  109. package/dist/convex-hull/helpers.js +718 -0
  110. package/dist/convex-hull/index.d.ts +119 -0
  111. package/dist/convex-hull/index.js +58 -0
  112. package/dist/convex-hull/thermodynamics.d.ts +67 -0
  113. package/dist/convex-hull/thermodynamics.js +1757 -0
  114. package/dist/convex-hull/types.d.ts +162 -0
  115. package/dist/convex-hull/types.js +36 -0
  116. package/dist/coordination/CoordinationBarPlot.svelte +311 -0
  117. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +30 -0
  118. package/dist/coordination/calc-coordination.d.ts +15 -0
  119. package/dist/coordination/calc-coordination.js +63 -0
  120. package/dist/coordination/index.d.ts +8 -0
  121. package/dist/coordination/index.js +7 -0
  122. package/dist/effects.svelte.d.ts +12 -0
  123. package/dist/effects.svelte.js +37 -0
  124. package/dist/element/BohrAtom.svelte.d.ts +20 -0
  125. package/dist/element/ElementHeading.svelte +26 -0
  126. package/dist/element/ElementHeading.svelte.d.ts +8 -0
  127. package/dist/element/ElementPhoto.svelte +57 -0
  128. package/dist/element/ElementPhoto.svelte.d.ts +9 -0
  129. package/dist/element/ElementStats.svelte +80 -0
  130. package/dist/element/ElementStats.svelte.d.ts +8 -0
  131. package/dist/element/ElementTile.svelte +484 -0
  132. package/dist/element/ElementTile.svelte.d.ts +29 -0
  133. package/dist/element/Nucleus.svelte.d.ts +17 -0
  134. package/dist/element/data.d.ts +2 -0
  135. package/dist/element/data.js +2 -0
  136. package/dist/element/index.d.ts +8 -0
  137. package/dist/element/index.js +7 -0
  138. package/dist/element/types.d.ts +57 -0
  139. package/dist/element/types.js +1 -0
  140. package/dist/feedback/ClickFeedback.svelte +58 -0
  141. package/dist/feedback/ClickFeedback.svelte.d.ts +12 -0
  142. package/dist/feedback/DragOverlay.svelte +42 -0
  143. package/dist/feedback/DragOverlay.svelte.d.ts +7 -0
  144. package/dist/feedback/Spinner.svelte.d.ts +7 -0
  145. package/dist/feedback/StatusMessage.svelte.d.ts +9 -0
  146. package/dist/feedback/index.d.ts +4 -0
  147. package/dist/feedback/index.js +4 -0
  148. package/dist/fermi-surface/FermiSlice.svelte +197 -0
  149. package/dist/fermi-surface/FermiSlice.svelte.d.ts +24 -0
  150. package/dist/fermi-surface/FermiSurface.svelte +606 -0
  151. package/dist/fermi-surface/FermiSurface.svelte.d.ts +83 -0
  152. package/dist/fermi-surface/FermiSurfaceControls.svelte +448 -0
  153. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +35 -0
  154. package/dist/fermi-surface/FermiSurfaceScene.svelte +797 -0
  155. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +50 -0
  156. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +85 -0
  157. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +8 -0
  158. package/dist/fermi-surface/compute.d.ts +5 -0
  159. package/dist/fermi-surface/compute.js +538 -0
  160. package/dist/fermi-surface/constants.d.ts +9 -0
  161. package/dist/fermi-surface/constants.js +27 -0
  162. package/dist/fermi-surface/export.d.ts +5 -0
  163. package/dist/fermi-surface/export.js +51 -0
  164. package/dist/fermi-surface/index.d.ts +12 -0
  165. package/dist/fermi-surface/index.js +13 -0
  166. package/dist/fermi-surface/marching-cubes.d.ts +2 -0
  167. package/dist/fermi-surface/marching-cubes.js +2 -0
  168. package/dist/fermi-surface/parse.d.ts +2 -0
  169. package/dist/fermi-surface/parse.js +494 -0
  170. package/dist/fermi-surface/symmetry.d.ts +3 -0
  171. package/dist/fermi-surface/symmetry.js +46 -0
  172. package/dist/fermi-surface/types.d.ts +111 -0
  173. package/dist/fermi-surface/types.js +4 -0
  174. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1547 -0
  175. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  176. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  177. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  178. package/dist/heatmap-matrix/index.d.ts +53 -0
  179. package/dist/heatmap-matrix/index.js +100 -0
  180. package/dist/heatmap-matrix/shared.d.ts +2 -0
  181. package/dist/heatmap-matrix/shared.js +4 -0
  182. package/dist/icons.d.ts +569 -0
  183. package/dist/icons.js +648 -0
  184. package/dist/index.d.ts +39 -0
  185. package/dist/index.js +39 -0
  186. package/dist/io/decompress.d.ts +11 -0
  187. package/dist/io/decompress.js +76 -0
  188. package/dist/io/export.d.ts +16 -0
  189. package/dist/io/export.js +338 -0
  190. package/dist/io/fetch.d.ts +5 -0
  191. package/dist/io/fetch.js +43 -0
  192. package/dist/io/file-drop.d.ts +7 -0
  193. package/dist/io/file-drop.js +42 -0
  194. package/dist/io/index.d.ts +7 -0
  195. package/dist/io/index.js +6 -0
  196. package/dist/io/is-binary.d.ts +1 -0
  197. package/dist/io/is-binary.js +20 -0
  198. package/dist/io/types.d.ts +8 -0
  199. package/dist/io/types.js +1 -0
  200. package/dist/io/url-drop.d.ts +2 -0
  201. package/dist/io/url-drop.js +154 -0
  202. package/dist/isosurface/Isosurface.svelte +285 -0
  203. package/dist/isosurface/Isosurface.svelte.d.ts +8 -0
  204. package/dist/isosurface/IsosurfaceControls.svelte +277 -0
  205. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +9 -0
  206. package/dist/isosurface/index.d.ts +5 -0
  207. package/dist/isosurface/index.js +6 -0
  208. package/dist/isosurface/parse.d.ts +6 -0
  209. package/dist/isosurface/parse.js +552 -0
  210. package/dist/isosurface/slice.d.ts +11 -0
  211. package/dist/isosurface/slice.js +141 -0
  212. package/dist/isosurface/types.d.ts +56 -0
  213. package/dist/isosurface/types.js +227 -0
  214. package/dist/keyboard.d.ts +3 -0
  215. package/dist/keyboard.js +23 -0
  216. package/dist/labels.d.ts +53 -0
  217. package/dist/labels.js +278 -0
  218. package/dist/layout/FullscreenToggle.svelte +50 -0
  219. package/dist/layout/FullscreenToggle.svelte.d.ts +7 -0
  220. package/dist/layout/InfoCard.svelte +120 -0
  221. package/dist/layout/InfoCard.svelte.d.ts +21 -0
  222. package/dist/layout/InfoTag.svelte +185 -0
  223. package/dist/layout/InfoTag.svelte.d.ts +19 -0
  224. package/dist/layout/PropertyFilter.svelte +247 -0
  225. package/dist/layout/PropertyFilter.svelte.d.ts +24 -0
  226. package/dist/layout/SettingsSection.svelte +148 -0
  227. package/dist/layout/SettingsSection.svelte.d.ts +17 -0
  228. package/dist/layout/SubpageGrid.svelte +82 -0
  229. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  230. package/dist/layout/fullscreen.d.ts +9 -0
  231. package/dist/layout/fullscreen.js +53 -0
  232. package/dist/layout/index.d.ts +10 -0
  233. package/dist/layout/index.js +8 -0
  234. package/dist/layout/json-tree/JsonNode.svelte +548 -0
  235. package/dist/layout/json-tree/JsonNode.svelte.d.ts +11 -0
  236. package/dist/layout/json-tree/JsonTree.svelte +1230 -0
  237. package/dist/layout/json-tree/JsonTree.svelte.d.ts +6 -0
  238. package/dist/layout/json-tree/JsonValue.svelte.d.ts +9 -0
  239. package/dist/layout/json-tree/index.d.ts +3 -0
  240. package/dist/layout/json-tree/index.js +3 -0
  241. package/dist/layout/json-tree/types.d.ts +74 -0
  242. package/dist/layout/json-tree/types.js +2 -0
  243. package/dist/layout/json-tree/utils.d.ts +29 -0
  244. package/dist/layout/json-tree/utils.js +642 -0
  245. package/dist/marching-cubes.d.ts +14 -0
  246. package/dist/marching-cubes.js +535 -0
  247. package/dist/math.d.ts +105 -0
  248. package/dist/math.js +920 -0
  249. package/dist/overlays/ContextMenu.svelte +162 -0
  250. package/dist/overlays/ContextMenu.svelte.d.ts +25 -0
  251. package/dist/overlays/CopyButton.svelte +45 -0
  252. package/dist/overlays/CopyButton.svelte.d.ts +8 -0
  253. package/dist/overlays/DragControlTab.svelte +98 -0
  254. package/dist/overlays/DragControlTab.svelte.d.ts +8 -0
  255. package/dist/overlays/DraggablePane.svelte +487 -0
  256. package/dist/overlays/DraggablePane.svelte.d.ts +36 -0
  257. package/dist/overlays/InfoPaneCards.svelte +149 -0
  258. package/dist/overlays/InfoPaneCards.svelte.d.ts +22 -0
  259. package/dist/overlays/index.d.ts +3 -0
  260. package/dist/overlays/index.js +3 -0
  261. package/dist/periodic-table/PeriodicTable.svelte +480 -0
  262. package/dist/periodic-table/PeriodicTable.svelte.d.ts +55 -0
  263. package/dist/periodic-table/PeriodicTableControls.svelte +557 -0
  264. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +24 -0
  265. package/dist/periodic-table/PropertySelect.svelte +38 -0
  266. package/dist/periodic-table/PropertySelect.svelte.d.ts +13 -0
  267. package/dist/periodic-table/TableInset.svelte.d.ts +9 -0
  268. package/dist/periodic-table/index.d.ts +10 -0
  269. package/dist/periodic-table/index.js +4 -0
  270. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1092 -0
  271. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +44 -0
  272. package/dist/phase-diagram/PhaseDiagramControls.svelte +444 -0
  273. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +30 -0
  274. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +127 -0
  275. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  276. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  277. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +19 -0
  278. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  279. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +16 -0
  280. package/dist/phase-diagram/TdbInfoPanel.svelte +203 -0
  281. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +12 -0
  282. package/dist/phase-diagram/build-diagram.d.ts +11 -0
  283. package/dist/phase-diagram/build-diagram.js +160 -0
  284. package/dist/phase-diagram/colors.d.ts +35 -0
  285. package/dist/phase-diagram/colors.js +51 -0
  286. package/dist/phase-diagram/diagram-input.d.ts +29 -0
  287. package/dist/phase-diagram/diagram-input.js +3 -0
  288. package/dist/phase-diagram/index.d.ts +13 -0
  289. package/dist/phase-diagram/index.js +11 -0
  290. package/dist/phase-diagram/parse.d.ts +55 -0
  291. package/dist/phase-diagram/parse.js +273 -0
  292. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  293. package/dist/phase-diagram/svg-to-diagram.js +867 -0
  294. package/dist/phase-diagram/types.d.ts +93 -0
  295. package/dist/phase-diagram/types.js +1 -0
  296. package/dist/phase-diagram/utils.d.ts +118 -0
  297. package/dist/phase-diagram/utils.js +600 -0
  298. package/dist/plot/bar/BarPlot.svelte +1755 -0
  299. package/dist/plot/bar/BarPlot.svelte.d.ts +84 -0
  300. package/dist/plot/bar/BarPlotControls.svelte +67 -0
  301. package/dist/plot/bar/BarPlotControls.svelte.d.ts +18 -0
  302. package/dist/plot/bar/SpacegroupBarPlot.svelte +293 -0
  303. package/dist/plot/bar/SpacegroupBarPlot.svelte.d.ts +9 -0
  304. package/dist/plot/bar/data.d.ts +40 -0
  305. package/dist/plot/bar/data.js +154 -0
  306. package/dist/plot/bar/geometry.d.ts +39 -0
  307. package/dist/plot/bar/geometry.js +60 -0
  308. package/dist/plot/bar/index.d.ts +3 -0
  309. package/dist/plot/bar/index.js +3 -0
  310. package/dist/plot/box/BoxPlot.svelte +1462 -0
  311. package/dist/plot/box/BoxPlot.svelte.d.ts +94 -0
  312. package/dist/plot/box/BoxPlotControls.svelte +109 -0
  313. package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
  314. package/dist/plot/box/Violin.svelte +14 -0
  315. package/dist/plot/box/Violin.svelte.d.ts +70 -0
  316. package/dist/plot/box/box-plot.d.ts +55 -0
  317. package/dist/plot/box/box-plot.js +126 -0
  318. package/dist/plot/box/index.d.ts +5 -0
  319. package/dist/plot/box/index.js +5 -0
  320. package/dist/plot/box/kde.d.ts +16 -0
  321. package/dist/plot/box/kde.js +160 -0
  322. package/dist/plot/box/quantile.d.ts +3 -0
  323. package/dist/plot/box/quantile.js +53 -0
  324. package/dist/plot/core/auto-place.d.ts +43 -0
  325. package/dist/plot/core/auto-place.js +122 -0
  326. package/dist/plot/core/axis-utils.d.ts +46 -0
  327. package/dist/plot/core/axis-utils.js +110 -0
  328. package/dist/plot/core/components/AxisLabel.svelte +51 -0
  329. package/dist/plot/core/components/AxisLabel.svelte.d.ts +16 -0
  330. package/dist/plot/core/components/ColorBar.svelte +724 -0
  331. package/dist/plot/core/components/ColorBar.svelte.d.ts +31 -0
  332. package/dist/plot/core/components/ColorScaleSelect.svelte +55 -0
  333. package/dist/plot/core/components/ColorScaleSelect.svelte.d.ts +15 -0
  334. package/dist/plot/core/components/ControlPane.svelte +46 -0
  335. package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
  336. package/dist/plot/core/components/FillArea.svelte +234 -0
  337. package/dist/plot/core/components/FillArea.svelte.d.ts +21 -0
  338. package/dist/plot/core/components/InteractiveAxisLabel.svelte +96 -0
  339. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +14 -0
  340. package/dist/plot/core/components/Line.svelte +101 -0
  341. package/dist/plot/core/components/Line.svelte.d.ts +15 -0
  342. package/dist/plot/core/components/PlotAxis.svelte +171 -0
  343. package/dist/plot/core/components/PlotAxis.svelte.d.ts +25 -0
  344. package/dist/plot/core/components/PlotControls.svelte +525 -0
  345. package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
  346. package/dist/plot/core/components/PlotLegend.svelte +580 -0
  347. package/dist/plot/core/components/PlotLegend.svelte.d.ts +30 -0
  348. package/dist/plot/core/components/PlotTooltip.svelte +83 -0
  349. package/dist/plot/core/components/PlotTooltip.svelte.d.ts +25 -0
  350. package/dist/plot/core/components/PortalSelect.svelte +257 -0
  351. package/dist/plot/core/components/PortalSelect.svelte.d.ts +16 -0
  352. package/dist/plot/core/components/ReferenceLine.svelte +204 -0
  353. package/dist/plot/core/components/ReferenceLine.svelte.d.ts +20 -0
  354. package/dist/plot/core/components/ReferenceLine3D.svelte +156 -0
  355. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +14 -0
  356. package/dist/plot/core/components/ReferencePlane.svelte +175 -0
  357. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +14 -0
  358. package/dist/plot/core/components/ZeroLines.svelte +97 -0
  359. package/dist/plot/core/components/ZeroLines.svelte.d.ts +33 -0
  360. package/dist/plot/core/components/ZoomRect.svelte +23 -0
  361. package/dist/plot/core/components/ZoomRect.svelte.d.ts +8 -0
  362. package/dist/plot/core/components/index.d.ts +17 -0
  363. package/dist/plot/core/components/index.js +17 -0
  364. package/dist/plot/core/data-cleaning.d.ts +107 -0
  365. package/dist/plot/core/data-cleaning.js +853 -0
  366. package/dist/plot/core/data-transform.d.ts +16 -0
  367. package/dist/plot/core/data-transform.js +45 -0
  368. package/dist/plot/core/fill-utils.d.ts +33 -0
  369. package/dist/plot/core/fill-utils.js +388 -0
  370. package/dist/plot/core/hover-lock.svelte.d.ts +14 -0
  371. package/dist/plot/core/hover-lock.svelte.js +45 -0
  372. package/dist/plot/core/index.d.ts +10 -0
  373. package/dist/plot/core/index.js +11 -0
  374. package/dist/plot/core/interactions.d.ts +35 -0
  375. package/dist/plot/core/interactions.js +195 -0
  376. package/dist/plot/core/layout.d.ts +79 -0
  377. package/dist/plot/core/layout.js +281 -0
  378. package/dist/plot/core/reference-line.d.ts +60 -0
  379. package/dist/plot/core/reference-line.js +301 -0
  380. package/dist/plot/core/scales.d.ts +48 -0
  381. package/dist/plot/core/scales.js +480 -0
  382. package/dist/plot/core/svg.d.ts +2 -0
  383. package/dist/plot/core/svg.js +41 -0
  384. package/dist/plot/core/types.d.ts +771 -0
  385. package/dist/plot/core/types.js +99 -0
  386. package/dist/plot/core/utils/label-placement.d.ts +68 -0
  387. package/dist/plot/core/utils/label-placement.js +326 -0
  388. package/dist/plot/core/utils/series-visibility.d.ts +26 -0
  389. package/dist/plot/core/utils/series-visibility.js +112 -0
  390. package/dist/plot/core/utils.d.ts +11 -0
  391. package/dist/plot/core/utils.js +27 -0
  392. package/dist/plot/histogram/Histogram.svelte +1418 -0
  393. package/dist/plot/histogram/Histogram.svelte.d.ts +50 -0
  394. package/dist/plot/histogram/HistogramControls.svelte +212 -0
  395. package/dist/plot/histogram/HistogramControls.svelte.d.ts +22 -0
  396. package/dist/plot/histogram/index.d.ts +2 -0
  397. package/dist/plot/histogram/index.js +2 -0
  398. package/dist/plot/index.d.ts +8 -0
  399. package/dist/plot/index.js +10 -0
  400. package/dist/plot/sankey/Sankey.svelte +700 -0
  401. package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
  402. package/dist/plot/sankey/SankeyControls.svelte +98 -0
  403. package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
  404. package/dist/plot/sankey/index.d.ts +4 -0
  405. package/dist/plot/sankey/index.js +3 -0
  406. package/dist/plot/sankey/sankey-types.d.ts +42 -0
  407. package/dist/plot/sankey/sankey-types.js +4 -0
  408. package/dist/plot/sankey/sankey.d.ts +52 -0
  409. package/dist/plot/sankey/sankey.js +187 -0
  410. package/dist/plot/scatter/BinnedScatterPlot.svelte +1116 -0
  411. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +66 -0
  412. package/dist/plot/scatter/ElementScatter.svelte +63 -0
  413. package/dist/plot/scatter/ElementScatter.svelte.d.ts +14 -0
  414. package/dist/plot/scatter/ScatterPlot.svelte +2357 -0
  415. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +96 -0
  416. package/dist/plot/scatter/ScatterPlotControls.svelte +307 -0
  417. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +17 -0
  418. package/dist/plot/scatter/ScatterPoint.svelte +182 -0
  419. package/dist/plot/scatter/ScatterPoint.svelte.d.ts +22 -0
  420. package/dist/plot/scatter/adaptive-density.d.ts +79 -0
  421. package/dist/plot/scatter/adaptive-density.js +217 -0
  422. package/dist/plot/scatter/binned-scatter-types.d.ts +59 -0
  423. package/dist/plot/scatter/binned-scatter-types.js +1 -0
  424. package/dist/plot/scatter/index.d.ts +7 -0
  425. package/dist/plot/scatter/index.js +5 -0
  426. package/dist/plot/scatter/scatter-data.d.ts +19 -0
  427. package/dist/plot/scatter/scatter-data.js +212 -0
  428. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +531 -0
  429. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +95 -0
  430. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +438 -0
  431. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +20 -0
  432. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +912 -0
  433. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +74 -0
  434. package/dist/plot/scatter-3d/Surface3D.svelte +197 -0
  435. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +13 -0
  436. package/dist/plot/scatter-3d/index.d.ts +4 -0
  437. package/dist/plot/scatter-3d/index.js +4 -0
  438. package/dist/plot/sunburst/Sunburst.svelte +1045 -0
  439. package/dist/plot/sunburst/Sunburst.svelte.d.ts +96 -0
  440. package/dist/plot/sunburst/SunburstControls.svelte +200 -0
  441. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
  442. package/dist/plot/sunburst/index.d.ts +4 -0
  443. package/dist/plot/sunburst/index.js +4 -0
  444. package/dist/plot/sunburst/render.d.ts +34 -0
  445. package/dist/plot/sunburst/render.js +122 -0
  446. package/dist/plot/sunburst/sunburst.d.ts +62 -0
  447. package/dist/plot/sunburst/sunburst.js +266 -0
  448. package/dist/rdf/RdfPlot.svelte +248 -0
  449. package/dist/rdf/RdfPlot.svelte.d.ts +27 -0
  450. package/dist/rdf/calc-rdf.d.ts +4 -0
  451. package/dist/rdf/calc-rdf.js +98 -0
  452. package/dist/rdf/index.d.ts +23 -0
  453. package/dist/rdf/index.js +2 -0
  454. package/dist/sanitize.d.ts +6 -0
  455. package/dist/sanitize.js +116 -0
  456. package/dist/settings.d.ts +319 -0
  457. package/dist/settings.js +1394 -0
  458. package/dist/spectral/Bands.svelte +1050 -0
  459. package/dist/spectral/Bands.svelte.d.ts +39 -0
  460. package/dist/spectral/BandsAndDos.svelte +134 -0
  461. package/dist/spectral/BandsAndDos.svelte.d.ts +18 -0
  462. package/dist/spectral/BrillouinBandsDos.svelte +264 -0
  463. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +20 -0
  464. package/dist/spectral/Dos.svelte +688 -0
  465. package/dist/spectral/Dos.svelte.d.ts +29 -0
  466. package/dist/spectral/helpers.d.ts +121 -0
  467. package/dist/spectral/helpers.js +1098 -0
  468. package/dist/spectral/index.d.ts +6 -0
  469. package/dist/spectral/index.js +6 -0
  470. package/dist/spectral/types.d.ts +84 -0
  471. package/dist/spectral/types.js +2 -0
  472. package/dist/state.svelte.d.ts +25 -0
  473. package/dist/state.svelte.js +45 -0
  474. package/dist/structure/Arrow.svelte +72 -0
  475. package/dist/structure/Arrow.svelte.d.ts +15 -0
  476. package/dist/structure/AtomLegend.svelte +814 -0
  477. package/dist/structure/AtomLegend.svelte.d.ts +35 -0
  478. package/dist/structure/Bond.svelte +140 -0
  479. package/dist/structure/Bond.svelte.d.ts +9 -0
  480. package/dist/structure/CanvasTooltip.svelte +33 -0
  481. package/dist/structure/CanvasTooltip.svelte.d.ts +12 -0
  482. package/dist/structure/CellSelect.svelte +348 -0
  483. package/dist/structure/CellSelect.svelte.d.ts +13 -0
  484. package/dist/structure/Cylinder.svelte +49 -0
  485. package/dist/structure/Cylinder.svelte.d.ts +13 -0
  486. package/dist/structure/Lattice.svelte +196 -0
  487. package/dist/structure/Lattice.svelte.d.ts +17 -0
  488. package/dist/structure/Structure.svelte +2254 -0
  489. package/dist/structure/Structure.svelte.d.ts +89 -0
  490. package/dist/structure/StructureControls.svelte +1273 -0
  491. package/dist/structure/StructureControls.svelte.d.ts +31 -0
  492. package/dist/structure/StructureExportPane.svelte +252 -0
  493. package/dist/structure/StructureExportPane.svelte.d.ts +17 -0
  494. package/dist/structure/StructureInfoPane.svelte +736 -0
  495. package/dist/structure/StructureInfoPane.svelte.d.ts +19 -0
  496. package/dist/structure/StructureScene.svelte +2256 -0
  497. package/dist/structure/StructureScene.svelte.d.ts +111 -0
  498. package/dist/structure/atom-properties.d.ts +37 -0
  499. package/dist/structure/atom-properties.js +200 -0
  500. package/dist/structure/bond-order-perception.d.ts +13 -0
  501. package/dist/structure/bond-order-perception.js +384 -0
  502. package/dist/structure/bonding.d.ts +69 -0
  503. package/dist/structure/bonding.js +724 -0
  504. package/dist/structure/export.d.ts +20 -0
  505. package/dist/structure/export.js +731 -0
  506. package/dist/structure/index.d.ts +124 -0
  507. package/dist/structure/index.js +167 -0
  508. package/dist/structure/label-placement.d.ts +14 -0
  509. package/dist/structure/label-placement.js +72 -0
  510. package/dist/structure/measure.d.ts +7 -0
  511. package/dist/structure/measure.js +30 -0
  512. package/dist/structure/parse.d.ts +66 -0
  513. package/dist/structure/parse.js +1410 -0
  514. package/dist/structure/partial-occupancy.d.ts +25 -0
  515. package/dist/structure/partial-occupancy.js +99 -0
  516. package/dist/structure/pbc.d.ts +9 -0
  517. package/dist/structure/pbc.js +127 -0
  518. package/dist/structure/supercell.d.ts +8 -0
  519. package/dist/structure/supercell.js +170 -0
  520. package/dist/structure/validation.d.ts +2 -0
  521. package/dist/structure/validation.js +10 -0
  522. package/dist/symmetry/SymmetryStats.svelte +226 -0
  523. package/dist/symmetry/SymmetryStats.svelte.d.ts +21 -0
  524. package/dist/symmetry/WyckoffTable.svelte +120 -0
  525. package/dist/symmetry/WyckoffTable.svelte.d.ts +11 -0
  526. package/dist/symmetry/cell-transform.d.ts +12 -0
  527. package/dist/symmetry/cell-transform.js +91 -0
  528. package/dist/symmetry/index.d.ts +43 -0
  529. package/dist/symmetry/index.js +226 -0
  530. package/dist/symmetry/spacegroups.d.ts +16 -0
  531. package/dist/symmetry/spacegroups.js +429 -0
  532. package/dist/table/HeatmapTable.svelte +1885 -0
  533. package/dist/table/HeatmapTable.svelte.d.ts +49 -0
  534. package/dist/table/ToggleMenu.svelte +385 -0
  535. package/dist/table/ToggleMenu.svelte.d.ts +11 -0
  536. package/dist/table/index.d.ts +72 -0
  537. package/dist/table/index.js +38 -0
  538. package/dist/theme/ThemeControl.svelte +53 -0
  539. package/dist/theme/ThemeControl.svelte.d.ts +9 -0
  540. package/dist/theme/index.d.ts +29 -0
  541. package/dist/theme/index.js +79 -0
  542. package/dist/time.d.ts +4 -0
  543. package/dist/time.js +70 -0
  544. package/dist/tooltip/KCoords.svelte +45 -0
  545. package/dist/tooltip/KCoords.svelte.d.ts +8 -0
  546. package/dist/tooltip/TooltipContent.svelte +58 -0
  547. package/dist/tooltip/TooltipContent.svelte.d.ts +31 -0
  548. package/dist/tooltip/index.d.ts +3 -0
  549. package/dist/tooltip/index.js +2 -0
  550. package/dist/tooltip/types.d.ts +8 -0
  551. package/dist/tooltip/types.js +1 -0
  552. package/dist/trajectory/Trajectory.svelte +1571 -0
  553. package/dist/trajectory/Trajectory.svelte.d.ts +78 -0
  554. package/dist/trajectory/TrajectoryError.svelte +128 -0
  555. package/dist/trajectory/TrajectoryError.svelte.d.ts +13 -0
  556. package/dist/trajectory/TrajectoryExportPane.svelte +358 -0
  557. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +17 -0
  558. package/dist/trajectory/TrajectoryInfoPane.svelte +314 -0
  559. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +17 -0
  560. package/dist/trajectory/constants.d.ts +6 -0
  561. package/dist/trajectory/constants.js +7 -0
  562. package/dist/trajectory/extract.d.ts +5 -0
  563. package/dist/trajectory/extract.js +162 -0
  564. package/dist/trajectory/format-detect.d.ts +10 -0
  565. package/dist/trajectory/format-detect.js +90 -0
  566. package/dist/trajectory/frame-reader.d.ts +17 -0
  567. package/dist/trajectory/frame-reader.js +299 -0
  568. package/dist/trajectory/helpers.d.ts +15 -0
  569. package/dist/trajectory/helpers.js +164 -0
  570. package/dist/trajectory/index.d.ts +63 -0
  571. package/dist/trajectory/index.js +126 -0
  572. package/dist/trajectory/parse/ase.d.ts +2 -0
  573. package/dist/trajectory/parse/ase.js +73 -0
  574. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  575. package/dist/trajectory/parse/hdf5.js +127 -0
  576. package/dist/trajectory/parse/index.d.ts +12 -0
  577. package/dist/trajectory/parse/index.js +306 -0
  578. package/dist/trajectory/parse/lammps.d.ts +5 -0
  579. package/dist/trajectory/parse/lammps.js +179 -0
  580. package/dist/trajectory/parse/vasp.d.ts +2 -0
  581. package/dist/trajectory/parse/vasp.js +87 -0
  582. package/dist/trajectory/parse/xyz.d.ts +26 -0
  583. package/dist/trajectory/parse/xyz.js +123 -0
  584. package/dist/trajectory/plotting.d.ts +28 -0
  585. package/dist/trajectory/plotting.js +423 -0
  586. package/dist/trajectory/types.d.ts +11 -0
  587. package/dist/trajectory/types.js +1 -0
  588. package/dist/utils.d.ts +7 -0
  589. package/dist/utils.js +47 -0
  590. package/dist/xrd/XrdPlot.svelte +616 -0
  591. package/dist/xrd/XrdPlot.svelte.d.ts +28 -0
  592. package/dist/xrd/broadening.d.ts +20 -0
  593. package/dist/xrd/broadening.js +97 -0
  594. package/dist/xrd/calc-xrd.d.ts +37 -0
  595. package/dist/xrd/calc-xrd.js +339 -0
  596. package/dist/xrd/index.d.ts +37 -0
  597. package/dist/xrd/index.js +4 -0
  598. package/dist/xrd/parse.d.ts +13 -0
  599. package/dist/xrd/parse.js +749 -0
  600. package/license +1 -1
  601. package/package.json +237 -1458
  602. package/readme.md +98 -171
  603. package/.vscode/launch.json +0 -13
  604. package/.vscodeignore +0 -7
  605. package/dist/assets/STLExporter-BpTH3YHE.js +0 -8
  606. package/dist/assets/browser-DdDecX_W.js +0 -1
  607. package/dist/assets/export-qgn-H9y6.js +0 -2
  608. package/dist/assets/main-DiKYzti2.css +0 -1
  609. package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
  610. package/dist/extension.js +0 -31293
  611. package/dist/src/lib/FilePicker.svelte +0 -360
  612. package/dist/src/lib/Icon.svelte +0 -41
  613. package/dist/src/lib/MillerIndexInput.svelte +0 -66
  614. package/dist/src/lib/api/mp.ts +0 -26
  615. package/dist/src/lib/api/optimade.ts +0 -204
  616. package/dist/src/lib/app.css +0 -247
  617. package/dist/src/lib/brillouin/BrillouinZone.svelte +0 -549
  618. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +0 -144
  619. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +0 -146
  620. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  621. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +0 -476
  622. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +0 -92
  623. package/dist/src/lib/brillouin/compute.ts +0 -529
  624. package/dist/src/lib/brillouin/index.ts +0 -8
  625. package/dist/src/lib/brillouin/types.ts +0 -51
  626. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +0 -327
  627. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +0 -846
  628. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +0 -3193
  629. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +0 -94
  630. package/dist/src/lib/chempot-diagram/chempot-worker.ts +0 -11
  631. package/dist/src/lib/chempot-diagram/color.ts +0 -42
  632. package/dist/src/lib/chempot-diagram/compute.ts +0 -1014
  633. package/dist/src/lib/chempot-diagram/index.ts +0 -6
  634. package/dist/src/lib/chempot-diagram/pointer.ts +0 -56
  635. package/dist/src/lib/chempot-diagram/temperature.ts +0 -77
  636. package/dist/src/lib/chempot-diagram/types.ts +0 -130
  637. package/dist/src/lib/colors/index.ts +0 -249
  638. package/dist/src/lib/composition/BarChart.svelte +0 -297
  639. package/dist/src/lib/composition/BubbleChart.svelte +0 -218
  640. package/dist/src/lib/composition/Composition.svelte +0 -165
  641. package/dist/src/lib/composition/Formula.svelte +0 -268
  642. package/dist/src/lib/composition/FormulaFilter.svelte +0 -1257
  643. package/dist/src/lib/composition/PieChart.svelte +0 -323
  644. package/dist/src/lib/composition/format.ts +0 -155
  645. package/dist/src/lib/composition/index.ts +0 -37
  646. package/dist/src/lib/composition/parse.ts +0 -605
  647. package/dist/src/lib/constants.ts +0 -134
  648. package/dist/src/lib/controls.ts +0 -42
  649. package/dist/src/lib/convex-hull/ConvexHull.svelte +0 -157
  650. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +0 -825
  651. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +0 -1801
  652. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +0 -1398
  653. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +0 -535
  654. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +0 -125
  655. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +0 -929
  656. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +0 -131
  657. package/dist/src/lib/convex-hull/GasPressureControls.svelte +0 -247
  658. package/dist/src/lib/convex-hull/StructurePopup.svelte +0 -151
  659. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +0 -140
  660. package/dist/src/lib/convex-hull/barycentric-coords.ts +0 -246
  661. package/dist/src/lib/convex-hull/demo-temperature.ts +0 -63
  662. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +0 -405
  663. package/dist/src/lib/convex-hull/helpers.ts +0 -932
  664. package/dist/src/lib/convex-hull/index.ts +0 -202
  665. package/dist/src/lib/convex-hull/thermodynamics.ts +0 -2192
  666. package/dist/src/lib/convex-hull/types.ts +0 -267
  667. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +0 -311
  668. package/dist/src/lib/coordination/calc-coordination.ts +0 -93
  669. package/dist/src/lib/coordination/index.ts +0 -9
  670. package/dist/src/lib/effects.svelte.ts +0 -48
  671. package/dist/src/lib/element/ElementHeading.svelte +0 -26
  672. package/dist/src/lib/element/ElementPhoto.svelte +0 -57
  673. package/dist/src/lib/element/ElementStats.svelte +0 -80
  674. package/dist/src/lib/element/ElementTile.svelte +0 -484
  675. package/dist/src/lib/element/data.ts +0 -14
  676. package/dist/src/lib/element/index.ts +0 -8
  677. package/dist/src/lib/element/types.ts +0 -62
  678. package/dist/src/lib/feedback/ClickFeedback.svelte +0 -58
  679. package/dist/src/lib/feedback/DragOverlay.svelte +0 -42
  680. package/dist/src/lib/feedback/index.ts +0 -4
  681. package/dist/src/lib/fermi-surface/FermiSlice.svelte +0 -189
  682. package/dist/src/lib/fermi-surface/FermiSurface.svelte +0 -600
  683. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +0 -448
  684. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +0 -794
  685. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  686. package/dist/src/lib/fermi-surface/compute.ts +0 -728
  687. package/dist/src/lib/fermi-surface/constants.ts +0 -32
  688. package/dist/src/lib/fermi-surface/export.ts +0 -64
  689. package/dist/src/lib/fermi-surface/index.ts +0 -14
  690. package/dist/src/lib/fermi-surface/marching-cubes.ts +0 -3
  691. package/dist/src/lib/fermi-surface/parse.ts +0 -574
  692. package/dist/src/lib/fermi-surface/symmetry.ts +0 -56
  693. package/dist/src/lib/fermi-surface/types.ts +0 -159
  694. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +0 -1545
  695. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  696. package/dist/src/lib/heatmap-matrix/index.ts +0 -167
  697. package/dist/src/lib/heatmap-matrix/shared.ts +0 -7
  698. package/dist/src/lib/icons.ts +0 -650
  699. package/dist/src/lib/index.ts +0 -61
  700. package/dist/src/lib/io/decompress.ts +0 -92
  701. package/dist/src/lib/io/export.ts +0 -385
  702. package/dist/src/lib/io/fetch.ts +0 -46
  703. package/dist/src/lib/io/file-drop.ts +0 -51
  704. package/dist/src/lib/io/index.ts +0 -7
  705. package/dist/src/lib/io/is-binary.ts +0 -24
  706. package/dist/src/lib/io/types.ts +0 -8
  707. package/dist/src/lib/io/url-drop.ts +0 -141
  708. package/dist/src/lib/isosurface/Isosurface.svelte +0 -285
  709. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +0 -277
  710. package/dist/src/lib/isosurface/index.ts +0 -7
  711. package/dist/src/lib/isosurface/parse.ts +0 -656
  712. package/dist/src/lib/isosurface/slice.ts +0 -175
  713. package/dist/src/lib/isosurface/types.ts +0 -309
  714. package/dist/src/lib/labels.ts +0 -320
  715. package/dist/src/lib/layout/FullscreenToggle.svelte +0 -50
  716. package/dist/src/lib/layout/InfoCard.svelte +0 -120
  717. package/dist/src/lib/layout/InfoTag.svelte +0 -185
  718. package/dist/src/lib/layout/PropertyFilter.svelte +0 -246
  719. package/dist/src/lib/layout/SettingsSection.svelte +0 -148
  720. package/dist/src/lib/layout/SubpageGrid.svelte +0 -82
  721. package/dist/src/lib/layout/fullscreen.ts +0 -65
  722. package/dist/src/lib/layout/index.ts +0 -11
  723. package/dist/src/lib/layout/json-tree/JsonNode.svelte +0 -548
  724. package/dist/src/lib/layout/json-tree/JsonTree.svelte +0 -1230
  725. package/dist/src/lib/layout/json-tree/index.ts +0 -3
  726. package/dist/src/lib/layout/json-tree/types.ts +0 -126
  727. package/dist/src/lib/layout/json-tree/utils.ts +0 -682
  728. package/dist/src/lib/marching-cubes.ts +0 -614
  729. package/dist/src/lib/math.ts +0 -1081
  730. package/dist/src/lib/overlays/ContextMenu.svelte +0 -162
  731. package/dist/src/lib/overlays/CopyButton.svelte +0 -45
  732. package/dist/src/lib/overlays/DragControlTab.svelte +0 -98
  733. package/dist/src/lib/overlays/DraggablePane.svelte +0 -487
  734. package/dist/src/lib/overlays/InfoPaneCards.svelte +0 -149
  735. package/dist/src/lib/overlays/index.ts +0 -3
  736. package/dist/src/lib/periodic-table/PeriodicTable.svelte +0 -469
  737. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +0 -557
  738. package/dist/src/lib/periodic-table/PropertySelect.svelte +0 -37
  739. package/dist/src/lib/periodic-table/index.ts +0 -12
  740. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1086
  741. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +0 -444
  742. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  743. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +0 -184
  744. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +0 -391
  745. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +0 -203
  746. package/dist/src/lib/phase-diagram/build-diagram.ts +0 -186
  747. package/dist/src/lib/phase-diagram/colors.ts +0 -58
  748. package/dist/src/lib/phase-diagram/diagram-input.ts +0 -40
  749. package/dist/src/lib/phase-diagram/index.ts +0 -13
  750. package/dist/src/lib/phase-diagram/parse.ts +0 -348
  751. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +0 -1023
  752. package/dist/src/lib/phase-diagram/types.ts +0 -144
  753. package/dist/src/lib/phase-diagram/utils.ts +0 -775
  754. package/dist/src/lib/plot/AxisLabel.svelte +0 -51
  755. package/dist/src/lib/plot/BarPlot.svelte +0 -2113
  756. package/dist/src/lib/plot/BarPlotControls.svelte +0 -66
  757. package/dist/src/lib/plot/BinnedScatterPlot.svelte +0 -1114
  758. package/dist/src/lib/plot/ColorBar.svelte +0 -721
  759. package/dist/src/lib/plot/ColorScaleSelect.svelte +0 -54
  760. package/dist/src/lib/plot/ElementScatter.svelte +0 -63
  761. package/dist/src/lib/plot/FillArea.svelte +0 -223
  762. package/dist/src/lib/plot/Histogram.svelte +0 -1558
  763. package/dist/src/lib/plot/HistogramControls.svelte +0 -212
  764. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +0 -96
  765. package/dist/src/lib/plot/Line.svelte +0 -84
  766. package/dist/src/lib/plot/PlotAxis.svelte +0 -169
  767. package/dist/src/lib/plot/PlotControls.svelte +0 -537
  768. package/dist/src/lib/plot/PlotLegend.svelte +0 -569
  769. package/dist/src/lib/plot/PlotTooltip.svelte +0 -67
  770. package/dist/src/lib/plot/PortalSelect.svelte +0 -253
  771. package/dist/src/lib/plot/ReferenceLine.svelte +0 -204
  772. package/dist/src/lib/plot/ReferenceLine3D.svelte +0 -156
  773. package/dist/src/lib/plot/ReferencePlane.svelte +0 -175
  774. package/dist/src/lib/plot/ScatterPlot.svelte +0 -2778
  775. package/dist/src/lib/plot/ScatterPlot3D.svelte +0 -529
  776. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +0 -437
  777. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +0 -912
  778. package/dist/src/lib/plot/ScatterPlotControls.svelte +0 -306
  779. package/dist/src/lib/plot/ScatterPoint.svelte +0 -182
  780. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +0 -293
  781. package/dist/src/lib/plot/Surface3D.svelte +0 -197
  782. package/dist/src/lib/plot/ZeroLines.svelte +0 -97
  783. package/dist/src/lib/plot/ZoomRect.svelte +0 -23
  784. package/dist/src/lib/plot/adaptive-density.ts +0 -316
  785. package/dist/src/lib/plot/auto-place.ts +0 -184
  786. package/dist/src/lib/plot/axis-utils.ts +0 -122
  787. package/dist/src/lib/plot/binned-scatter-types.ts +0 -83
  788. package/dist/src/lib/plot/data-cleaning.ts +0 -1069
  789. package/dist/src/lib/plot/data-transform.ts +0 -69
  790. package/dist/src/lib/plot/defaults.ts +0 -9
  791. package/dist/src/lib/plot/fill-utils.ts +0 -494
  792. package/dist/src/lib/plot/hover-lock.svelte.ts +0 -60
  793. package/dist/src/lib/plot/index.ts +0 -53
  794. package/dist/src/lib/plot/interactions.ts +0 -119
  795. package/dist/src/lib/plot/layout.ts +0 -425
  796. package/dist/src/lib/plot/reference-line.ts +0 -426
  797. package/dist/src/lib/plot/scales.ts +0 -654
  798. package/dist/src/lib/plot/svg.ts +0 -23
  799. package/dist/src/lib/plot/types.ts +0 -1144
  800. package/dist/src/lib/plot/utils/label-placement.ts +0 -541
  801. package/dist/src/lib/plot/utils/series-visibility.ts +0 -140
  802. package/dist/src/lib/plot/utils.ts +0 -11
  803. package/dist/src/lib/rdf/RdfPlot.svelte +0 -247
  804. package/dist/src/lib/rdf/calc-rdf.ts +0 -167
  805. package/dist/src/lib/rdf/index.ts +0 -27
  806. package/dist/src/lib/sanitize.ts +0 -126
  807. package/dist/src/lib/settings.ts +0 -1479
  808. package/dist/src/lib/spectral/Bands.svelte +0 -1040
  809. package/dist/src/lib/spectral/BandsAndDos.svelte +0 -134
  810. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +0 -252
  811. package/dist/src/lib/spectral/Dos.svelte +0 -697
  812. package/dist/src/lib/spectral/helpers.ts +0 -1381
  813. package/dist/src/lib/spectral/index.ts +0 -8
  814. package/dist/src/lib/spectral/types.ts +0 -112
  815. package/dist/src/lib/state.svelte.ts +0 -64
  816. package/dist/src/lib/structure/Arrow.svelte +0 -72
  817. package/dist/src/lib/structure/AtomLegend.svelte +0 -815
  818. package/dist/src/lib/structure/Bond.svelte +0 -140
  819. package/dist/src/lib/structure/CanvasTooltip.svelte +0 -33
  820. package/dist/src/lib/structure/CellSelect.svelte +0 -349
  821. package/dist/src/lib/structure/Cylinder.svelte +0 -45
  822. package/dist/src/lib/structure/Lattice.svelte +0 -196
  823. package/dist/src/lib/structure/Structure.svelte +0 -2248
  824. package/dist/src/lib/structure/StructureControls.svelte +0 -1273
  825. package/dist/src/lib/structure/StructureExportPane.svelte +0 -252
  826. package/dist/src/lib/structure/StructureInfoPane.svelte +0 -737
  827. package/dist/src/lib/structure/StructureScene.svelte +0 -2255
  828. package/dist/src/lib/structure/atom-properties.ts +0 -316
  829. package/dist/src/lib/structure/bond-order-perception.ts +0 -447
  830. package/dist/src/lib/structure/bonding.ts +0 -944
  831. package/dist/src/lib/structure/export.ts +0 -861
  832. package/dist/src/lib/structure/index.ts +0 -291
  833. package/dist/src/lib/structure/label-placement.ts +0 -130
  834. package/dist/src/lib/structure/measure.ts +0 -45
  835. package/dist/src/lib/structure/parse.ts +0 -1705
  836. package/dist/src/lib/structure/partial-occupancy.ts +0 -183
  837. package/dist/src/lib/structure/pbc.ts +0 -164
  838. package/dist/src/lib/structure/supercell.ts +0 -226
  839. package/dist/src/lib/structure/validation.ts +0 -11
  840. package/dist/src/lib/symmetry/SymmetryStats.svelte +0 -226
  841. package/dist/src/lib/symmetry/WyckoffTable.svelte +0 -120
  842. package/dist/src/lib/symmetry/cell-transform.ts +0 -118
  843. package/dist/src/lib/symmetry/index.ts +0 -348
  844. package/dist/src/lib/symmetry/spacegroups.ts +0 -404
  845. package/dist/src/lib/table/HeatmapTable.svelte +0 -1833
  846. package/dist/src/lib/table/ToggleMenu.svelte +0 -385
  847. package/dist/src/lib/table/index.ts +0 -139
  848. package/dist/src/lib/theme/ThemeControl.svelte +0 -53
  849. package/dist/src/lib/theme/index.ts +0 -107
  850. package/dist/src/lib/time.ts +0 -71
  851. package/dist/src/lib/tooltip/TooltipContent.svelte +0 -58
  852. package/dist/src/lib/tooltip/index.ts +0 -2
  853. package/dist/src/lib/tooltip/types.ts +0 -13
  854. package/dist/src/lib/trajectory/Trajectory.svelte +0 -1545
  855. package/dist/src/lib/trajectory/TrajectoryError.svelte +0 -128
  856. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +0 -357
  857. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +0 -313
  858. package/dist/src/lib/trajectory/constants.ts +0 -7
  859. package/dist/src/lib/trajectory/extract.ts +0 -196
  860. package/dist/src/lib/trajectory/format-detect.ts +0 -96
  861. package/dist/src/lib/trajectory/frame-reader.ts +0 -456
  862. package/dist/src/lib/trajectory/helpers.ts +0 -217
  863. package/dist/src/lib/trajectory/index.ts +0 -218
  864. package/dist/src/lib/trajectory/parse/ase.ts +0 -109
  865. package/dist/src/lib/trajectory/parse/hdf5.ts +0 -173
  866. package/dist/src/lib/trajectory/parse/index.ts +0 -411
  867. package/dist/src/lib/trajectory/parse/lammps.ts +0 -215
  868. package/dist/src/lib/trajectory/parse/vasp.ts +0 -102
  869. package/dist/src/lib/trajectory/parse/xyz.ts +0 -143
  870. package/dist/src/lib/trajectory/plotting.ts +0 -599
  871. package/dist/src/lib/trajectory/types.ts +0 -13
  872. package/dist/src/lib/utils.ts +0 -56
  873. package/dist/src/lib/xrd/XrdPlot.svelte +0 -615
  874. package/dist/src/lib/xrd/broadening.ts +0 -130
  875. package/dist/src/lib/xrd/calc-xrd.ts +0 -397
  876. package/dist/src/lib/xrd/index.ts +0 -38
  877. package/dist/src/lib/xrd/parse.ts +0 -858
  878. package/dist/webview.js +0 -29421
  879. package/icon.png +0 -0
  880. package/matterviz-0.3.2.vsix +0 -0
  881. package/matterviz-0.3.4.vsix +0 -0
  882. package/matterviz-0.3.5.vsix +0 -0
  883. package/scripts/sync-config.ts +0 -101
  884. package/src/declarations.d.ts +0 -2
  885. package/src/extension.ts +0 -972
  886. package/src/node-io.ts +0 -65
  887. package/src/types.ts +0 -17
  888. package/src/webview/JsonBrowser.svelte +0 -1079
  889. package/src/webview/PlotPanel.svelte +0 -346
  890. package/src/webview/detect.ts +0 -444
  891. package/src/webview/main.ts +0 -764
  892. package/src/webview/plot-utils.ts +0 -250
  893. package/test-fixtures/all-viz-types.json.gz +0 -0
  894. package/test-fixtures/plot-demo-data.json.gz +0 -0
  895. package/tests/detect.test.ts +0 -604
  896. package/tests/extension.test.ts +0 -2041
  897. package/tests/node-io.test.ts +0 -39
  898. package/tests/plot-utils.test.ts +0 -302
  899. package/tests/vite-plugin-json-gz.test.ts +0 -114
  900. package/tests/vscode-mock.ts +0 -18
  901. package/tests/webview.test.ts +0 -231
  902. package/tsconfig.json +0 -20
  903. package/vite-plugin-json-gz.ts +0 -29
  904. package/vite.config.ts +0 -34
  905. package/vite.extension.config.ts +0 -34
  906. /package/dist/{src/lib/EmptyState.svelte → EmptyState.svelte} +0 -0
  907. /package/dist/{src/lib/chempot-diagram → chempot-diagram}/ChemPotScene3D.svelte +0 -0
  908. /package/dist/{src/lib/colors → colors}/alloy-colors.json +0 -0
  909. /package/dist/{src/lib/colors → colors}/dark-mode-colors.json +0 -0
  910. /package/dist/{src/lib/colors → colors}/jmol-colors.json +0 -0
  911. /package/dist/{src/lib/colors → colors}/muted-colors.json +0 -0
  912. /package/dist/{src/lib/colors → colors}/pastel-colors.json +0 -0
  913. /package/dist/{src/lib/colors → colors}/vesta-colors.json +0 -0
  914. /package/dist/{src/lib/element → element}/BohrAtom.svelte +0 -0
  915. /package/dist/{src/lib/element → element}/Nucleus.svelte +0 -0
  916. /package/dist/{src/lib/element → element}/data.json +0 -0
  917. /package/dist/{src/lib/element → element}/data.json.gz +0 -0
  918. /package/dist/{src/lib/element → element}/data.json.gz.d.ts +0 -0
  919. /package/dist/{src/lib/element → element}/data.schema.json +0 -0
  920. /package/dist/{src/lib/element-image-urls.json → element-image-urls.json} +0 -0
  921. /package/dist/{src/lib/feedback → feedback}/Spinner.svelte +0 -0
  922. /package/dist/{src/lib/feedback → feedback}/StatusMessage.svelte +0 -0
  923. /package/dist/{src/lib/layout → layout}/json-tree/JsonValue.svelte +0 -0
  924. /package/dist/{src/lib/periodic-table → periodic-table}/TableInset.svelte +0 -0
  925. /package/dist/{src/lib/theme → theme}/themes.mjs +0 -0
  926. /package/dist/{src/lib/xrd → xrd}/atomic_scattering_params.json +0 -0
@@ -0,0 +1,1092 @@
1
+ <script lang="ts">
2
+ import { format_num } from '../labels'
3
+ import {
4
+ FullscreenToggle,
5
+ set_fullscreen_bg,
6
+ setup_fullscreen_effect,
7
+ } from '../layout'
8
+ import { sanitize_svg } from '../sanitize'
9
+ import { compute_bounding_box_2d, polygon_centroid, type Vec2 } from '../math'
10
+ import type { AxisConfig } from '../plot'
11
+ import { constrain_tooltip_position } from '../plot/core/layout'
12
+ import { unique_id } from '../plot/core/utils'
13
+ import { scaleLinear } from 'd3-scale'
14
+ import type { ComponentProps, Snippet } from 'svelte'
15
+ import type { HTMLAttributes } from 'svelte/elements'
16
+ import { build_diagram } from './build-diagram'
17
+ import type { DiagramInput } from './diagram-input'
18
+ import PhaseDiagramControls from './PhaseDiagramControls.svelte'
19
+ import PhaseDiagramEditorPane from './PhaseDiagramEditorPane.svelte'
20
+ import PhaseDiagramExportPane from './PhaseDiagramExportPane.svelte'
21
+ import PhaseDiagramTooltip from './PhaseDiagramTooltip.svelte'
22
+ import { parse_phase_diagram_svg } from './svg-to-diagram'
23
+ import type {
24
+ LeverRuleMode,
25
+ PhaseDiagramConfig,
26
+ PhaseDiagramData,
27
+ PhaseDiagramTooltipConfig,
28
+ PhaseHoverInfo,
29
+ PhaseRegion,
30
+ TempUnit,
31
+ } from './types'
32
+ import {
33
+ calculate_lever_rule,
34
+ calculate_vertical_lever_rule,
35
+ compute_label_properties,
36
+ compute_x_domain,
37
+ convert_temp,
38
+ find_phase_at_point,
39
+ format_composition,
40
+ format_formula_svg,
41
+ format_hover_info_text,
42
+ format_label_svg,
43
+ generate_boundary_path,
44
+ generate_region_path,
45
+ get_multi_phase_gradient,
46
+ get_phase_color,
47
+ merge_phase_diagram_config,
48
+ PHASE_COLOR_RGB,
49
+ transform_vertices,
50
+ } from './utils'
51
+
52
+ let {
53
+ data,
54
+ config = $bindable({}),
55
+ on_phase_hover,
56
+ fullscreen = $bindable(false),
57
+ wrapper = $bindable(),
58
+ hovered_region = $bindable(null),
59
+ show_boundaries = $bindable(true),
60
+ show_labels = $bindable(true),
61
+ show_special_points = $bindable(true),
62
+ show_grid = $bindable(true),
63
+ show_component_labels = $bindable(true),
64
+ fullscreen_toggle = true,
65
+ enable_export = true,
66
+ show_controls = true,
67
+ display_temp_unit = $bindable(),
68
+ controls_open = $bindable(false),
69
+ controls_props = {},
70
+ export_pane_open = $bindable(false),
71
+ png_dpi = $bindable(150),
72
+ export_filename = `phase-diagram`,
73
+ lever_rule_mode = $bindable(`horizontal`),
74
+ diagram_input = $bindable<DiagramInput | null>(null),
75
+ editor_open = $bindable(false),
76
+ x_axis = $bindable({}),
77
+ y_axis = $bindable({}),
78
+ tooltip,
79
+ children,
80
+ ...rest
81
+ }: HTMLAttributes<HTMLDivElement> & {
82
+ data: PhaseDiagramData
83
+ config?: Partial<PhaseDiagramConfig>
84
+ // Hover callback
85
+ on_phase_hover?: (info: PhaseHoverInfo | null) => void
86
+ // Bindable state
87
+ fullscreen?: boolean
88
+ wrapper?: HTMLDivElement
89
+ hovered_region?: PhaseRegion | null
90
+ // Display options
91
+ show_boundaries?: boolean
92
+ show_labels?: boolean
93
+ show_special_points?: boolean
94
+ show_grid?: boolean
95
+ show_component_labels?: boolean
96
+ fullscreen_toggle?: boolean
97
+ enable_export?: boolean
98
+ show_controls?: boolean
99
+ // Temperature display unit (can differ from data.temperature_unit)
100
+ display_temp_unit?: `K` | `°C` | `°F`
101
+ // Controls pane
102
+ controls_open?: boolean
103
+ controls_props?: Partial<ComponentProps<typeof PhaseDiagramControls>>
104
+ // Export options
105
+ export_pane_open?: boolean
106
+ png_dpi?: number
107
+ export_filename?: string
108
+ // Lever rule mode (horizontal = composition tie-line, vertical = temperature tie-line)
109
+ lever_rule_mode?: LeverRuleMode
110
+ // Diagram input editor (for SVG drop editing)
111
+ diagram_input?: DiagramInput | null
112
+ editor_open?: boolean
113
+ // Axis configuration
114
+ x_axis?: AxisConfig
115
+ y_axis?: AxisConfig
116
+ // Custom tooltip - can be a snippet (replaces default), config object (adds prefix/suffix),
117
+ // or false to disable tooltip entirely
118
+ tooltip?: Snippet<[PhaseHoverInfo]> | PhaseDiagramTooltipConfig | false
119
+ children?: Snippet<
120
+ [{ width: number; height: number; fullscreen: boolean }]
121
+ >
122
+ } = $props()
123
+
124
+ // Shared icon/toggle styling for controls and export panes
125
+ const pane_icon_style = `width: 14px; height: 14px`
126
+ const pane_toggle_props = { style: `padding: 0` }
127
+
128
+ // Instance-unique prefix for gradient ids: region ids come from user data (e.g.
129
+ // 'liquid'), so two diagrams on one page would otherwise cross-reference each
130
+ // other's gradients (first-in-document wins, with that instance's pixel coords)
131
+ const gradient_uid = unique_id(`pd-gradient`)
132
+
133
+ // Rebuild diagram data when diagram_input changes ($derived auto-recomputes)
134
+ const rebuilt_data = $derived.by(() => {
135
+ if (!diagram_input) return null
136
+ try {
137
+ return build_diagram(diagram_input)
138
+ } catch (error) {
139
+ console.warn(`Failed to rebuild diagram from input:`, error)
140
+ return null
141
+ }
142
+ })
143
+
144
+ // Override from direct PhaseDiagramData edits in the editor pane
145
+ let data_override = $state<PhaseDiagramData | null>(null)
146
+
147
+ // Clear data_override when source data changes (e.g. new SVG dropped or data prop updated)
148
+ $effect(() => {
149
+ if (diagram_input || data) data_override = null
150
+ })
151
+
152
+ // Use editor override first (clears rebuilt_data path), then rebuilt, then data prop
153
+ const effective_data = $derived(data_override ?? rebuilt_data ?? data)
154
+
155
+ // Handle SVG file drop directly on the component
156
+ function handle_svg_drop(event: DragEvent) {
157
+ event.preventDefault()
158
+ const file = event.dataTransfer?.files[0]
159
+ if (!file || (!file.name.endsWith(`.svg`) && file.type !== `image/svg+xml`)) {
160
+ return
161
+ }
162
+ const reader = new FileReader()
163
+ reader.addEventListener(`load`, () => {
164
+ try {
165
+ diagram_input = parse_phase_diagram_svg(reader.result as string)
166
+ } catch (error) {
167
+ console.error(`Failed to parse dropped SVG:`, error)
168
+ }
169
+ })
170
+ reader.readAsText(file)
171
+ }
172
+
173
+ // Merge config with centralized defaults using shared helper
174
+ const merged_config = $derived(merge_phase_diagram_config(config))
175
+
176
+ // Dimensions - use container size directly, no fallback to avoid layout shift
177
+ let width = $state(0)
178
+ let height = $state(0)
179
+
180
+ // Margin from config
181
+ const margin = $derived(merged_config.margin)
182
+
183
+ // Pre-computed plot edges to avoid repeated calculations
184
+ const left = $derived(margin.l)
185
+ const right = $derived(width - margin.r)
186
+ const top = $derived(margin.t)
187
+ const bottom = $derived(height - margin.b)
188
+ const plot_width = $derived(right - left)
189
+ const plot_height = $derived(bottom - top)
190
+
191
+ // Compute x domain from data extent, x_axis.range override, or default [0, 1]
192
+ // Auto-extends to 0/1 when edge regions contain a pure component
193
+ const x_domain = $derived(compute_x_domain(x_axis.range, effective_data))
194
+
195
+ // Scales
196
+ const x_scale = $derived(scaleLinear().domain(x_domain).range([left, right]))
197
+
198
+ // Temperature units (guard for initial render when data may be undefined)
199
+ const data_temp_unit = $derived<TempUnit>(
200
+ (effective_data?.temperature_unit ?? `K`) as TempUnit,
201
+ )
202
+ const temp_unit = $derived<TempUnit>(display_temp_unit ?? data_temp_unit)
203
+ const temp_range = $derived(effective_data?.temperature_range ?? [0, 1000])
204
+
205
+ // Convert temperature range for display
206
+ const display_temp_range = $derived<Vec2>([
207
+ convert_temp(temp_range[0], data_temp_unit, temp_unit),
208
+ convert_temp(temp_range[1], data_temp_unit, temp_unit),
209
+ ])
210
+
211
+ // y_scale maps data temperatures to SVG coordinates
212
+ // We keep this in data units so region vertices render correctly
213
+ const y_scale = $derived(
214
+ scaleLinear().domain(temp_range).range([bottom, top]),
215
+ )
216
+
217
+ // y_scale_display maps display temperatures (after unit conversion) to SVG
218
+ // Used for axis labels and ticks
219
+ const y_scale_display = $derived(
220
+ scaleLinear().domain(display_temp_range).range([bottom, top]),
221
+ )
222
+
223
+ // Generate tick values using d3 scale's built-in ticks method
224
+ const x_ticks = $derived(
225
+ x_scale.ticks(typeof x_axis.ticks === `number` ? x_axis.ticks : 5),
226
+ )
227
+ // Use display scale for y ticks so they show converted temperatures
228
+ const y_ticks = $derived(
229
+ y_scale_display.ticks(typeof y_axis.ticks === `number` ? y_axis.ticks : 6),
230
+ )
231
+
232
+ // Transform regions to SVG coordinates
233
+ const transformed_regions = $derived(
234
+ (effective_data?.regions ?? []).map((region) => {
235
+ const svg_vertices = transform_vertices(region.vertices, x_scale, y_scale)
236
+ const { width: box_width, height: box_height } = compute_bounding_box_2d(svg_vertices)
237
+ const label_props = compute_label_properties(
238
+ region.name,
239
+ { width: box_width, height: box_height },
240
+ merged_config.font_size,
241
+ )
242
+ // Get gradient stops for multi-phase regions (2+, supports 3+ phases)
243
+ const gradient = get_multi_phase_gradient(region.name)
244
+ const x_coords = svg_vertices.map(([vx]) => vx)
245
+ return {
246
+ ...region,
247
+ svg_path: generate_region_path(svg_vertices),
248
+ label_pos: region.label_position
249
+ ? [x_scale(region.label_position[0]), y_scale(region.label_position[1])]
250
+ : polygon_centroid(svg_vertices),
251
+ label_rotation: label_props.rotation,
252
+ label_lines: label_props.lines,
253
+ label_scale: label_props.scale,
254
+ gradient,
255
+ x_min: Math.min(...x_coords),
256
+ x_max: Math.max(...x_coords),
257
+ }
258
+ }),
259
+ )
260
+
261
+ // Transform boundaries to SVG coordinates
262
+ const transformed_boundaries = $derived(
263
+ (effective_data?.boundaries ?? []).map((boundary) => ({
264
+ ...boundary,
265
+ svg_path: generate_boundary_path(
266
+ transform_vertices(boundary.points, x_scale, y_scale),
267
+ ),
268
+ })),
269
+ )
270
+
271
+ // Transform special points to SVG coordinates
272
+ const transformed_special_points = $derived(
273
+ (effective_data?.special_points ?? []).map((point) => ({
274
+ ...point,
275
+ svg_x: x_scale(point.position[0]),
276
+ svg_y: y_scale(point.position[1]),
277
+ })),
278
+ )
279
+
280
+ // Hover state
281
+ let hover_info = $state<PhaseHoverInfo | null>(null)
282
+ // Locked tooltip state (click to lock, click again to unlock)
283
+ let locked_hover_info = $state<PhaseHoverInfo | null>(null)
284
+
285
+ // Clear hover state helper (used in multiple places)
286
+ function clear_hover() {
287
+ hover_info = null
288
+ hovered_region = null
289
+ on_phase_hover?.(null)
290
+ }
291
+
292
+ // Handle click to lock/unlock tooltip
293
+ function handle_click() {
294
+ if (locked_hover_info) {
295
+ // Unlock if already locked
296
+ locked_hover_info = null
297
+ } else if (hover_info) {
298
+ // Lock current hover info
299
+ locked_hover_info = { ...hover_info }
300
+ }
301
+ }
302
+
303
+ // Effective hover info - locked takes precedence
304
+ const effective_hover_info = $derived(locked_hover_info ?? hover_info)
305
+
306
+ // Copy feedback state
307
+ let copy_feedback_visible = $state(false)
308
+ let copy_feedback_pos = $state({ x: 0, y: 0 })
309
+ let copy_feedback_timeout: ReturnType<typeof setTimeout> | undefined
310
+
311
+ // Handle double-click to copy tooltip data
312
+ async function handle_double_click(event: MouseEvent) {
313
+ if (!hover_info) return
314
+ try {
315
+ await navigator.clipboard.writeText(
316
+ format_hover_info_text(
317
+ hover_info,
318
+ temp_unit,
319
+ comp_unit,
320
+ component_a,
321
+ component_b,
322
+ data_temp_unit,
323
+ lever_rule_mode,
324
+ ),
325
+ )
326
+ if (copy_feedback_timeout) clearTimeout(copy_feedback_timeout)
327
+ copy_feedback_pos = { x: event.clientX, y: event.clientY }
328
+ copy_feedback_visible = true
329
+ copy_feedback_timeout = setTimeout(() => {
330
+ copy_feedback_visible = false
331
+ copy_feedback_timeout = undefined
332
+ }, 1500)
333
+ } catch (error) {
334
+ console.error(`Failed to copy phase data:`, error)
335
+ }
336
+ }
337
+
338
+ // Tooltip element reference for measuring actual size
339
+ let tooltip_el = $state<HTMLDivElement | null>(null)
340
+
341
+ // Tooltip positioning using shared utility (uses effective_hover_info for locked state)
342
+ const tooltip_pos = $derived.by(() => {
343
+ const info = effective_hover_info
344
+ if (!info) return { x: 0, y: 0 }
345
+ return constrain_tooltip_position(
346
+ info.position.x,
347
+ info.position.y,
348
+ tooltip_el?.offsetWidth ?? 200,
349
+ tooltip_el?.offsetHeight ?? 150,
350
+ globalThis.innerWidth ?? 1000,
351
+ globalThis.innerHeight ?? 800,
352
+ { offset: 15 },
353
+ )
354
+ })
355
+
356
+ // Find nearest special point within threshold (in SVG pixels)
357
+ function find_nearby_special_point(
358
+ svg_x: number,
359
+ svg_y: number,
360
+ threshold: number = 20,
361
+ ) {
362
+ let nearest: (typeof transformed_special_points)[0] | null = null
363
+ let min_dist = threshold
364
+ for (const point of transformed_special_points) {
365
+ const dist = Math.hypot(point.svg_x - svg_x, point.svg_y - svg_y)
366
+ if (dist < min_dist) {
367
+ min_dist = dist
368
+ nearest = point
369
+ }
370
+ }
371
+ return nearest
372
+ }
373
+
374
+ // Pointer move handler (unified mouse/touch via Pointer Events API)
375
+ function handle_pointer_move(
376
+ event: PointerEvent & { currentTarget: SVGElement },
377
+ ) {
378
+ const svg = event.currentTarget
379
+ const rect = svg.getBoundingClientRect()
380
+ const svg_x = event.clientX - rect.left
381
+ const svg_y = event.clientY - rect.top
382
+
383
+ // Check if within plot area
384
+ if (
385
+ svg_x < left || svg_x > right || svg_y < top || svg_y > bottom ||
386
+ !effective_data
387
+ ) {
388
+ clear_hover()
389
+ return
390
+ }
391
+
392
+ // Convert to data coordinates and find phase
393
+ const composition = x_scale.invert(svg_x)
394
+ const temperature = y_scale.invert(svg_y)
395
+ const region = find_phase_at_point(composition, temperature, effective_data)
396
+
397
+ // Check for nearby special point
398
+ const nearby_special = show_special_points
399
+ ? find_nearby_special_point(svg_x, svg_y)
400
+ : null
401
+
402
+ if (region) {
403
+ hovered_region = region
404
+ hover_info = {
405
+ region,
406
+ composition,
407
+ temperature,
408
+ position: { x: event.clientX, y: event.clientY },
409
+ lever_rule: calculate_lever_rule(region, composition, temperature) ||
410
+ undefined,
411
+ vertical_lever_rule:
412
+ calculate_vertical_lever_rule(region, composition, temperature) ||
413
+ undefined,
414
+ special_point: nearby_special || undefined,
415
+ }
416
+ on_phase_hover?.(hover_info)
417
+ } else {
418
+ clear_hover()
419
+ }
420
+ }
421
+
422
+ function handle_pointer_leave(event: PointerEvent) {
423
+ // Don't clear on touch lift (allows reading tooltip) or when locked
424
+ if (event.pointerType === `touch` || locked_hover_info) return
425
+ clear_hover()
426
+ }
427
+
428
+ // Document-level keyboard shortcuts
429
+ function handle_doc_keydown(event: KeyboardEvent) {
430
+ if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key === `E`) {
431
+ event.preventDefault()
432
+ export_pane_open = !export_pane_open
433
+ } else if (event.key === `Escape` && locked_hover_info) {
434
+ locked_hover_info = null
435
+ }
436
+ }
437
+
438
+ // SVG keyboard handler (Enter/Space to toggle lock)
439
+ function handle_svg_keydown(event: KeyboardEvent) {
440
+ if (event.key === `Enter` || event.key === ` `) {
441
+ event.preventDefault()
442
+ handle_click()
443
+ }
444
+ }
445
+
446
+ // Fullscreen handling
447
+ $effect(() => {
448
+ setup_fullscreen_effect(fullscreen, wrapper)
449
+ set_fullscreen_bg(wrapper, fullscreen, `--phase-diagram-bg-fullscreen`)
450
+ })
451
+
452
+ // Cleanup timeout on unmount to prevent memory leaks
453
+ $effect(() => {
454
+ return () => {
455
+ if (copy_feedback_timeout) clearTimeout(copy_feedback_timeout)
456
+ }
457
+ })
458
+
459
+ // Component labels (guard for initial render when data may be undefined)
460
+ const component_a = $derived(effective_data?.components?.[0] ?? ``)
461
+ const component_b = $derived(effective_data?.components?.[1] ?? ``)
462
+ const comp_unit = $derived(effective_data?.composition_unit ?? `at%`)
463
+
464
+ // Pseudo-binary support: format compound names with subscripts when enabled
465
+ const use_subscripts = $derived(
466
+ effective_data?.pseudo_binary?.use_subscripts ?? true,
467
+ )
468
+
469
+ // Formatted component labels for SVG axis labels (with tspan subscripts if compound)
470
+ const component_a_svg = $derived(format_formula_svg(component_a, use_subscripts))
471
+ const component_b_svg = $derived(format_formula_svg(component_b, use_subscripts))
472
+
473
+ // Default x-axis label as a single string (avoids mixing plain text with {@html})
474
+ const default_x_axis_label = $derived.by(() => {
475
+ const prefix = comp_unit === `fraction` ? `x ` : ``
476
+ const unit = comp_unit === `fraction` ? `mole fraction` : comp_unit
477
+ return `${prefix}${component_b_svg} (${unit})`
478
+ })
479
+ </script>
480
+
481
+ <!-- Grid lines snippet for DRY rendering -->
482
+ {#snippet grid_lines(ticks: number[], vertical: boolean)}
483
+ {#each ticks as tick (tick)}
484
+ <line
485
+ x1={vertical ? x_scale(tick) : left}
486
+ y1={vertical ? top : y_scale_display(tick)}
487
+ x2={vertical ? x_scale(tick) : right}
488
+ y2={vertical ? bottom : y_scale_display(tick)}
489
+ stroke={merged_config.colors.grid}
490
+ stroke-dasharray="4"
491
+ />
492
+ {/each}
493
+ {/snippet}
494
+
495
+ <!-- Tie-line snippet: renders line with white outline, phase endpoints, and cursor marker -->
496
+ {#snippet tie_line_viz(
497
+ x1: number,
498
+ y1: number,
499
+ x2: number,
500
+ y2: number,
501
+ endpoints: Array<{ cx: number; cy: number; color: string }>,
502
+ cursor_cx: number,
503
+ cursor_cy: number,
504
+ )}
505
+ {@const tl = merged_config.tie_line}
506
+ <g class="tie-line" class:locked={locked_hover_info}>
507
+ {#each [`white`, `rgb(${PHASE_COLOR_RGB.tie_line})`] as stroke (stroke)}
508
+ <line
509
+ {x1}
510
+ {y1}
511
+ {x2}
512
+ {y2}
513
+ {stroke}
514
+ stroke-width={tl.stroke_width + (stroke === `white` ? 1 : 0)}
515
+ stroke-linecap="round"
516
+ />
517
+ {/each}
518
+ {#each endpoints as ep, idx (idx)}
519
+ <circle
520
+ cx={ep.cx}
521
+ cy={ep.cy}
522
+ r={tl.endpoint_radius}
523
+ fill="rgb({ep.color})"
524
+ stroke="white"
525
+ stroke-width={1.5}
526
+ />
527
+ {/each}
528
+ <circle
529
+ cx={cursor_cx}
530
+ cy={cursor_cy}
531
+ r={tl.cursor_radius}
532
+ fill="rgb({PHASE_COLOR_RGB.tie_line})"
533
+ stroke="white"
534
+ stroke-width={2}
535
+ />
536
+ </g>
537
+ {/snippet}
538
+
539
+ <svelte:document
540
+ onfullscreenchange={() => {
541
+ fullscreen = Boolean(document.fullscreenElement)
542
+ }}
543
+ onkeydown={handle_doc_keydown}
544
+ />
545
+
546
+ <div
547
+ {...rest}
548
+ class="binary-phase-diagram {rest.class ?? ``}"
549
+ class:fullscreen
550
+ bind:this={wrapper}
551
+ bind:clientWidth={width}
552
+ bind:clientHeight={height}
553
+ role="img"
554
+ aria-label="{component_a}-{component_b} binary phase diagram"
555
+ ondrop={handle_svg_drop}
556
+ ondragover={(ev) => ev.preventDefault()}
557
+ >
558
+ {#if width > 0 && height > 0}
559
+ <!-- Header controls -->
560
+ <div class="header-controls">
561
+ {#if show_controls}
562
+ <PhaseDiagramControls
563
+ bind:controls_open
564
+ bind:show_boundaries
565
+ bind:show_labels
566
+ bind:show_special_points
567
+ bind:show_grid
568
+ bind:show_component_labels
569
+ bind:config
570
+ bind:lever_rule_mode
571
+ bind:x_axis
572
+ bind:y_axis
573
+ bind:png_dpi
574
+ data={effective_data}
575
+ {enable_export}
576
+ {...controls_props}
577
+ icon_style={pane_icon_style}
578
+ toggle_props={pane_toggle_props}
579
+ />
580
+ {/if}
581
+ {#if enable_export}
582
+ <PhaseDiagramExportPane
583
+ bind:export_pane_open
584
+ bind:png_dpi
585
+ data={effective_data}
586
+ {wrapper}
587
+ filename={export_filename}
588
+ icon_style={pane_icon_style}
589
+ toggle_props={pane_toggle_props}
590
+ />
591
+ {/if}
592
+ <PhaseDiagramEditorPane
593
+ bind:editor_open
594
+ bind:diagram_input
595
+ data={effective_data}
596
+ ondata={(edited) => data_override = edited}
597
+ icon_style={pane_icon_style}
598
+ toggle_props={pane_toggle_props}
599
+ />
600
+ {#if fullscreen_toggle}
601
+ <FullscreenToggle bind:fullscreen />
602
+ {/if}
603
+ </div>
604
+
605
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
606
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
607
+ <svg
608
+ class="binary-phase-diagram"
609
+ {width}
610
+ {height}
611
+ onpointermove={handle_pointer_move}
612
+ onpointerleave={handle_pointer_leave}
613
+ onclick={handle_click}
614
+ onkeydown={handle_svg_keydown}
615
+ ondblclick={handle_double_click}
616
+ tabindex="0"
617
+ style:display="block"
618
+ style:cursor={effective_hover_info ? `crosshair` : `default`}
619
+ style:touch-action="none"
620
+ role="application"
621
+ aria-label="Binary phase diagram. Use mouse to explore phases. Click to lock tooltip, double-click to copy data. Press Ctrl/Cmd+Shift+E to export."
622
+ >
623
+ <!-- Gradient definitions for multi-phase regions (2+ phases) -->
624
+ <defs>
625
+ {#each transformed_regions as region (region.id)}
626
+ {#if region.gradient}
627
+ <linearGradient
628
+ id="{gradient_uid}-{region.id}"
629
+ x1={region.x_min}
630
+ x2={region.x_max}
631
+ y1="0"
632
+ y2="0"
633
+ gradientUnits="userSpaceOnUse"
634
+ >
635
+ {#each region.gradient as stop, idx (idx)}
636
+ <stop
637
+ offset="{stop.offset * 100}%"
638
+ stop-color={stop.color}
639
+ stop-opacity="0.6"
640
+ />
641
+ {/each}
642
+ </linearGradient>
643
+ {/if}
644
+ {/each}
645
+ </defs>
646
+
647
+ <!-- Background -->
648
+ <rect
649
+ x={left}
650
+ y={top}
651
+ width={plot_width}
652
+ height={plot_height}
653
+ fill={merged_config.colors.background}
654
+ />
655
+
656
+ <!-- Grid lines -->
657
+ {#if show_grid}
658
+ <g class="grid">
659
+ {@render grid_lines(x_ticks, true)}
660
+ {@render grid_lines(y_ticks, false)}
661
+ </g>
662
+ {/if}
663
+
664
+ <!-- Phase regions -->
665
+ <g class="phase-regions">
666
+ {#each transformed_regions as region (region.id)}
667
+ <path
668
+ d={region.svg_path}
669
+ fill={region.gradient
670
+ ? `url(#${gradient_uid}-${region.id})`
671
+ : (region.color || get_phase_color(region.name))}
672
+ stroke="none"
673
+ class:hovered={hovered_region?.id === region.id}
674
+ />
675
+ {/each}
676
+ </g>
677
+
678
+ <!-- Boundaries -->
679
+ {#if show_boundaries}
680
+ <g class="boundaries">
681
+ {#each transformed_boundaries as boundary (boundary.id)}
682
+ <path
683
+ d={boundary.svg_path}
684
+ fill="none"
685
+ stroke={boundary.style?.color ?? merged_config.colors.boundary}
686
+ stroke-width={boundary.style?.width || 2}
687
+ stroke-dasharray={boundary.style?.dash || ``}
688
+ stroke-linecap="round"
689
+ stroke-linejoin="round"
690
+ />
691
+ {/each}
692
+ </g>
693
+ {/if}
694
+
695
+ <!-- Region labels -->
696
+ {#if show_labels}
697
+ <g class="region-labels">
698
+ {#each transformed_regions as region (region.id)}
699
+ {@const line_height = merged_config.font_size * 1.2}
700
+ <g
701
+ transform="translate({region.label_pos[0]}, {region.label_pos[1]}) rotate({region.label_rotation}) scale({region.label_scale})"
702
+ >
703
+ {#each region.label_lines as line, line_idx (line_idx)}
704
+ <text
705
+ x={0}
706
+ y={(line_idx - (region.label_lines.length - 1) / 2) * line_height}
707
+ text-anchor="middle"
708
+ dominant-baseline="middle"
709
+ fill={merged_config.colors.text}
710
+ font-size={merged_config.font_size}
711
+ font-weight="500"
712
+ class="region-label"
713
+ >
714
+ {@html sanitize_svg(format_label_svg(line, use_subscripts))}
715
+ </text>
716
+ {/each}
717
+ </g>
718
+ {/each}
719
+ </g>
720
+ {/if}
721
+
722
+ <!-- Tie-line visualization for two-phase regions -->
723
+ {#if lever_rule_mode === `vertical` && effective_hover_info?.vertical_lever_rule}
724
+ {@const vlr = effective_hover_info.vertical_lever_rule}
725
+ {@const cx = x_scale(effective_hover_info.composition)}
726
+ {@const y_bot = y_scale(vlr.bottom_temperature)}
727
+ {@const y_top = y_scale(vlr.top_temperature)}
728
+ {@render tie_line_viz(
729
+ cx,
730
+ y_bot,
731
+ cx,
732
+ y_top,
733
+ [
734
+ { cx, cy: y_bot, color: get_phase_color(vlr.bottom_phase, `rgb`) },
735
+ { cx, cy: y_top, color: get_phase_color(vlr.top_phase, `rgb`) },
736
+ ],
737
+ cx,
738
+ y_scale(effective_hover_info.temperature),
739
+ )}
740
+ {:else if lever_rule_mode === `horizontal` && effective_hover_info?.lever_rule}
741
+ {@const lr = effective_hover_info.lever_rule}
742
+ {@const cy = y_scale(effective_hover_info.temperature)}
743
+ {@const x_l = x_scale(lr.left_composition)}
744
+ {@const x_r = x_scale(lr.right_composition)}
745
+ {@render tie_line_viz(
746
+ x_l,
747
+ cy,
748
+ x_r,
749
+ cy,
750
+ [
751
+ { cx: x_l, cy, color: get_phase_color(lr.left_phase, `rgb`) },
752
+ { cx: x_r, cy, color: get_phase_color(lr.right_phase, `rgb`) },
753
+ ],
754
+ x_scale(effective_hover_info.composition),
755
+ cy,
756
+ )}
757
+ {/if}
758
+
759
+ <!-- Special points (rendered last for highest z-index) -->
760
+ {#if show_special_points}
761
+ <g class="special-points">
762
+ {#each transformed_special_points as point (point.id)}
763
+ <!-- Larger hit area for easier hovering (2x radius) -->
764
+ <circle
765
+ cx={point.svg_x}
766
+ cy={point.svg_y}
767
+ r={merged_config.special_point_radius * 2}
768
+ fill="transparent"
769
+ class="special-point-hit-area"
770
+ />
771
+ <circle
772
+ cx={point.svg_x}
773
+ cy={point.svg_y}
774
+ r={merged_config.special_point_radius}
775
+ fill={merged_config.colors.special_point}
776
+ stroke="white"
777
+ stroke-width={1.5}
778
+ class="special-point-marker"
779
+ />
780
+ {#if point.label}
781
+ {@const is_near_left = point.position[0] <= 0.05}
782
+ {@const is_near_right = point.position[0] >= 0.95}
783
+ {@const anchor = is_near_left ? `start` : is_near_right ? `end` : `middle`}
784
+ {@const x_offset = is_near_left ? 4 : is_near_right ? -4 : 0}
785
+ <text
786
+ x={point.svg_x + x_offset}
787
+ y={point.svg_y - merged_config.special_point_radius * 2}
788
+ text-anchor={anchor}
789
+ fill={merged_config.colors.text}
790
+ font-size={merged_config.font_size}
791
+ font-weight="bold"
792
+ >
793
+ {point.label}
794
+ </text>
795
+ {/if}
796
+ {/each}
797
+ </g>
798
+ {/if}
799
+
800
+ <!-- X-axis -->
801
+ <g class="x-axis">
802
+ <line
803
+ x1={left}
804
+ y1={bottom}
805
+ x2={right}
806
+ y2={bottom}
807
+ stroke={merged_config.colors.axis}
808
+ stroke-width={1}
809
+ />
810
+ {#each x_ticks as tick (tick)}
811
+ <g transform="translate({x_scale(tick)}, {bottom})">
812
+ <line y2={6} stroke={merged_config.colors.axis} />
813
+ <text
814
+ y={20}
815
+ text-anchor="middle"
816
+ fill={merged_config.colors.text}
817
+ font-size={merged_config.font_size}
818
+ >
819
+ {format_composition(tick, comp_unit, false)}
820
+ </text>
821
+ </g>
822
+ {/each}
823
+ <!-- X-axis label (supports custom labels from props, data, or auto-generated with subscripts) -->
824
+ <text
825
+ x={left + plot_width / 2}
826
+ y={height - 10}
827
+ text-anchor="middle"
828
+ fill={merged_config.colors.text}
829
+ font-size={merged_config.font_size + 2}
830
+ >
831
+ {#if x_axis.label}
832
+ {@html sanitize_svg(x_axis.label)}
833
+ {:else if effective_data?.x_axis_label}
834
+ {@html sanitize_svg(effective_data.x_axis_label)}
835
+ {:else}
836
+ {@html sanitize_svg(default_x_axis_label)}
837
+ {/if}
838
+ </text>
839
+ </g>
840
+
841
+ <!-- Y-axis -->
842
+ <g class="y-axis">
843
+ <line
844
+ x1={left}
845
+ y1={top}
846
+ x2={left}
847
+ y2={bottom}
848
+ stroke={merged_config.colors.axis}
849
+ stroke-width={1}
850
+ />
851
+ {#each y_ticks as tick (tick)}
852
+ <g transform="translate({left}, {y_scale_display(tick)})">
853
+ <line x2={-6} stroke={merged_config.colors.axis} />
854
+ <text
855
+ x={-10}
856
+ text-anchor="end"
857
+ dominant-baseline="middle"
858
+ fill={merged_config.colors.text}
859
+ font-size={merged_config.font_size}
860
+ >
861
+ {format_num(tick, `.0f`)}
862
+ </text>
863
+ </g>
864
+ {/each}
865
+ <!-- Y-axis label (supports custom labels from props or data) -->
866
+ <text
867
+ transform="rotate(-90)"
868
+ x={-(top + plot_height / 2)}
869
+ y={16}
870
+ text-anchor="middle"
871
+ fill={merged_config.colors.text}
872
+ font-size={merged_config.font_size + 2}
873
+ >
874
+ {#if y_axis.label}
875
+ {@html sanitize_svg(y_axis.label)}
876
+ {:else if effective_data?.y_axis_label}
877
+ {@html sanitize_svg(effective_data.y_axis_label)}
878
+ {:else}
879
+ Temperature ({temp_unit})
880
+ {/if}
881
+ </text>
882
+ </g>
883
+
884
+ <!-- Component labels at corners (supports compound formulas with subscripts) -->
885
+ {#if show_component_labels}
886
+ <text
887
+ x={left}
888
+ y={bottom + 45}
889
+ text-anchor="middle"
890
+ fill={merged_config.colors.text}
891
+ font-size={merged_config.font_size + 2}
892
+ font-weight="bold"
893
+ >
894
+ {@html sanitize_svg(component_a_svg)}
895
+ </text>
896
+ <text
897
+ x={right}
898
+ y={bottom + 45}
899
+ text-anchor="middle"
900
+ fill={merged_config.colors.text}
901
+ font-size={merged_config.font_size + 2}
902
+ font-weight="bold"
903
+ >
904
+ {@html sanitize_svg(component_b_svg)}
905
+ </text>
906
+ {/if}
907
+ </svg>
908
+
909
+ <!-- Tooltip (uses effective_hover_info which respects locked state) -->
910
+ <!-- tooltip={false} disables tooltip entirely -->
911
+ {#if effective_hover_info && tooltip !== false}
912
+ <div
913
+ bind:this={tooltip_el}
914
+ class="tooltip-container"
915
+ class:locked={locked_hover_info}
916
+ style:left="{tooltip_pos.x}px"
917
+ style:top="{tooltip_pos.y}px"
918
+ >
919
+ {#if locked_hover_info}
920
+ <div class="tooltip-lock-indicator" title="Click diagram to unlock">🔒</div>
921
+ {/if}
922
+ {#if typeof tooltip === `function`}
923
+ {@render tooltip(effective_hover_info)}
924
+ {:else}
925
+ <PhaseDiagramTooltip
926
+ hover_info={effective_hover_info}
927
+ temperature_unit={temp_unit}
928
+ data_temperature_unit={data_temp_unit}
929
+ composition_unit={comp_unit}
930
+ {component_a}
931
+ {component_b}
932
+ boundaries={effective_data?.boundaries ?? []}
933
+ {lever_rule_mode}
934
+ {use_subscripts}
935
+ {tooltip}
936
+ />
937
+ {/if}
938
+ </div>
939
+ {/if}
940
+
941
+ <!-- Copy feedback indicator -->
942
+ {#if copy_feedback_visible}
943
+ <div
944
+ class="copy-feedback"
945
+ style:left="{copy_feedback_pos.x}px"
946
+ style:top="{copy_feedback_pos.y}px"
947
+ >
948
+ ✓ Copied
949
+ </div>
950
+ {/if}
951
+
952
+ <!-- Custom children -->
953
+ {@render children?.({ width, height, fullscreen })}
954
+ {/if}
955
+ </div>
956
+
957
+ <style>
958
+ .binary-phase-diagram {
959
+ position: relative;
960
+ width: 100%;
961
+ height: 100%;
962
+ min-height: 400px;
963
+ aspect-ratio: 6 / 5; /* Default aspect ratio matching 600x500 */
964
+ background: var(--pd-bg, transparent);
965
+ container-type: inline-size;
966
+
967
+ &.fullscreen {
968
+ background: var(--phase-diagram-bg-fullscreen, var(--page-bg, #1a1a2e)) !important;
969
+ }
970
+ @container (max-width: 500px) {
971
+ min-height: 300px;
972
+ }
973
+ }
974
+ .header-controls {
975
+ position: absolute;
976
+ top: var(--ctrl-btn-top, 30px);
977
+ right: var(--ctrl-btn-right, 20px);
978
+ display: flex;
979
+ align-items: center;
980
+ gap: 6px;
981
+ z-index: 10;
982
+ }
983
+ /* Override absolute positioning since container handles it */
984
+ .header-controls :global(:is(.fullscreen-toggle, .phase-diagram-controls-toggle)) {
985
+ position: static;
986
+ }
987
+ .header-controls :global(.fullscreen-toggle) {
988
+ opacity: 1; /* Always visible when inside header-controls */
989
+ }
990
+ /* Hide controls and fullscreen toggles by default, show on hover/focus */
991
+ .binary-phase-diagram :global(:is(.pane-toggle, .header-controls)) {
992
+ opacity: 0;
993
+ transition: opacity 0.2s ease;
994
+ }
995
+ /* Keep editor toggle always visible so users discover the edit feature */
996
+ .binary-phase-diagram :global(.pd-editor-toggle) {
997
+ opacity: 1;
998
+ }
999
+ .binary-phase-diagram:is(:hover, :focus-within)
1000
+ :is(:global(.pane-toggle), .header-controls),
1001
+ .binary-phase-diagram :global(.pane-toggle:is(:focus-visible, [aria-expanded='true'])),
1002
+ .header-controls:has(:global(.pane-open)) {
1003
+ opacity: 1;
1004
+ }
1005
+ .phase-regions path {
1006
+ transition: opacity 0.15s ease;
1007
+
1008
+ &.hovered {
1009
+ opacity: 0.85;
1010
+ filter: brightness(1.1);
1011
+ }
1012
+ }
1013
+ .special-points {
1014
+ pointer-events: auto;
1015
+ }
1016
+ .special-point-hit-area {
1017
+ cursor: pointer;
1018
+ pointer-events: auto;
1019
+ }
1020
+ .special-point-hit-area:hover + .special-point-marker {
1021
+ filter: brightness(1.3) drop-shadow(0 0 4px currentColor);
1022
+ }
1023
+ .special-point-marker {
1024
+ pointer-events: none; /* Let hit-area handle events */
1025
+ }
1026
+ /* Grouped pointer-events: none */
1027
+ .region-label, .tie-line, .tooltip-container, .copy-feedback, .grid, .region-labels {
1028
+ pointer-events: none;
1029
+ }
1030
+ .region-label {
1031
+ user-select: none;
1032
+ }
1033
+ .tie-line {
1034
+ animation: tie-line-fade-in 150ms ease-out;
1035
+
1036
+ &.locked {
1037
+ filter: drop-shadow(0 0 3px rgba(255, 107, 107, 0.5));
1038
+ }
1039
+ }
1040
+ @keyframes tie-line-fade-in {
1041
+ from {
1042
+ opacity: 0;
1043
+ }
1044
+ }
1045
+ :is(.tooltip-container, .copy-feedback) {
1046
+ position: fixed;
1047
+ }
1048
+ .tooltip-container {
1049
+ z-index: 1000;
1050
+
1051
+ &.locked {
1052
+ pointer-events: auto; /* Allow interaction when locked */
1053
+ filter: drop-shadow(0 0 4px rgba(99, 102, 241, 0.4));
1054
+ }
1055
+ }
1056
+ .tooltip-lock-indicator {
1057
+ position: absolute;
1058
+ top: -8px;
1059
+ right: -8px;
1060
+ font-size: 12px;
1061
+ background: rgba(99, 102, 241, 0.9);
1062
+ border-radius: 50%;
1063
+ width: 20px;
1064
+ height: 20px;
1065
+ display: flex;
1066
+ align-items: center;
1067
+ justify-content: center;
1068
+ cursor: pointer;
1069
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
1070
+ }
1071
+ .copy-feedback {
1072
+ z-index: 1001;
1073
+ background: rgba(76, 175, 80, 0.95);
1074
+ color: white;
1075
+ padding: 6px 12px;
1076
+ border-radius: 4px;
1077
+ font-size: 13px;
1078
+ font-weight: 500;
1079
+ transform: translate(-50%, calc(-100% - 10px));
1080
+ animation: copy-fade-up 1.5s ease-out forwards;
1081
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
1082
+ }
1083
+ @keyframes copy-fade-up {
1084
+ 0%, 70% {
1085
+ opacity: 1;
1086
+ }
1087
+ 100% {
1088
+ opacity: 0;
1089
+ transform: translate(-50%, calc(-100% - 30px));
1090
+ }
1091
+ }
1092
+ </style>