matterviz 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +12 -14
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/app.css +53 -0
  6. package/dist/brillouin/BrillouinZone.svelte +132 -219
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
  8. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  9. package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  13. package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
  15. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  16. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  17. package/dist/brillouin/compute.d.ts +2 -0
  18. package/dist/brillouin/compute.js +80 -77
  19. package/dist/brillouin/geometry.d.ts +8 -0
  20. package/dist/brillouin/geometry.js +57 -0
  21. package/dist/brillouin/index.d.ts +2 -0
  22. package/dist/brillouin/index.js +2 -0
  23. package/dist/brillouin/types.d.ts +2 -2
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
  25. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
  27. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
  29. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  30. package/dist/chempot-diagram/async-compute.svelte.js +1 -1
  31. package/dist/chempot-diagram/color.d.ts +3 -6
  32. package/dist/chempot-diagram/color.js +5 -5
  33. package/dist/chempot-diagram/compute.d.ts +3 -3
  34. package/dist/chempot-diagram/compute.js +3 -1
  35. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  36. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  37. package/dist/chempot-diagram/export.d.ts +47 -0
  38. package/dist/chempot-diagram/export.js +133 -0
  39. package/dist/chempot-diagram/index.d.ts +1 -0
  40. package/dist/chempot-diagram/index.js +1 -0
  41. package/dist/chempot-diagram/pointer.d.ts +0 -10
  42. package/dist/chempot-diagram/pointer.js +4 -4
  43. package/dist/chempot-diagram/types.d.ts +3 -3
  44. package/dist/colors/index.d.ts +0 -4
  45. package/dist/colors/index.js +21 -22
  46. package/dist/composition/BarChart.svelte +37 -31
  47. package/dist/composition/BubbleChart.svelte +17 -17
  48. package/dist/composition/Composition.svelte +7 -11
  49. package/dist/composition/Formula.svelte +18 -25
  50. package/dist/composition/FormulaFilter.svelte +96 -98
  51. package/dist/composition/PieChart.svelte +60 -46
  52. package/dist/composition/chem-sys.js +3 -2
  53. package/dist/composition/format.js +4 -3
  54. package/dist/composition/index.d.ts +2 -0
  55. package/dist/composition/index.js +14 -0
  56. package/dist/composition/parse.d.ts +2 -3
  57. package/dist/composition/parse.js +27 -28
  58. package/dist/constants.js +11 -9
  59. package/dist/controls.d.ts +1 -0
  60. package/dist/controls.js +0 -1
  61. package/dist/convex-hull/ConvexHull.svelte +20 -25
  62. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  63. package/dist/convex-hull/ConvexHull2D.svelte +176 -256
  64. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  65. package/dist/convex-hull/ConvexHull3D.svelte +269 -804
  66. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  67. package/dist/convex-hull/ConvexHull4D.svelte +236 -755
  68. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  69. package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
  70. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  71. package/dist/convex-hull/ConvexHullControls.svelte +128 -49
  72. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  73. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  74. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  75. package/dist/convex-hull/ConvexHullStats.svelte +210 -351
  76. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  77. package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
  78. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  79. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  80. package/dist/convex-hull/StructurePopup.svelte +17 -21
  81. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  82. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  83. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  84. package/dist/convex-hull/barycentric-coords.js +6 -33
  85. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  86. package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
  87. package/dist/convex-hull/helpers.d.ts +47 -17
  88. package/dist/convex-hull/helpers.js +186 -101
  89. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  90. package/dist/convex-hull/hull-state.svelte.js +124 -0
  91. package/dist/convex-hull/index.d.ts +9 -7
  92. package/dist/convex-hull/index.js +7 -2
  93. package/dist/convex-hull/thermodynamics.js +109 -937
  94. package/dist/convex-hull/types.d.ts +12 -4
  95. package/dist/convex-hull/types.js +12 -0
  96. package/dist/coordination/CoordinationBarPlot.svelte +41 -43
  97. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  98. package/dist/coordination/calc-coordination.d.ts +1 -1
  99. package/dist/coordination/calc-coordination.js +28 -25
  100. package/dist/element/BohrAtom.svelte +6 -8
  101. package/dist/element/ElementHeading.svelte +4 -1
  102. package/dist/element/ElementPhoto.svelte +11 -9
  103. package/dist/element/ElementStats.svelte +12 -10
  104. package/dist/element/ElementTile.svelte +24 -29
  105. package/dist/element/ElementTile.svelte.d.ts +1 -1
  106. package/dist/element/Nucleus.svelte +4 -2
  107. package/dist/element/data.d.ts +1 -2
  108. package/dist/element/helpers.d.ts +4 -0
  109. package/dist/element/helpers.js +18 -0
  110. package/dist/element/index.d.ts +1 -0
  111. package/dist/element/index.js +3 -0
  112. package/dist/feedback/DragOverlay.svelte +5 -3
  113. package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
  114. package/dist/feedback/StatusMessage.svelte +20 -7
  115. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  116. package/dist/fermi-surface/FermiSurface.svelte +78 -165
  117. package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
  118. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  119. package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
  120. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  121. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  122. package/dist/fermi-surface/compute.js +14 -13
  123. package/dist/fermi-surface/export.js +4 -15
  124. package/dist/fermi-surface/index.d.ts +0 -1
  125. package/dist/fermi-surface/index.js +0 -1
  126. package/dist/fermi-surface/parse.d.ts +1 -1
  127. package/dist/fermi-surface/parse.js +84 -97
  128. package/dist/fermi-surface/types.d.ts +2 -2
  129. package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
  130. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
  131. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
  132. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  133. package/dist/heatmap-matrix/index.d.ts +8 -2
  134. package/dist/icons.d.ts +4 -0
  135. package/dist/icons.js +4 -0
  136. package/dist/index.d.ts +1 -0
  137. package/dist/index.js +1 -0
  138. package/dist/io/ExportPane.svelte +170 -0
  139. package/dist/io/ExportPane.svelte.d.ts +17 -0
  140. package/dist/io/decompress.d.ts +2 -1
  141. package/dist/io/decompress.js +22 -36
  142. package/dist/io/export.d.ts +9 -1
  143. package/dist/io/export.js +37 -29
  144. package/dist/io/fetch.d.ts +2 -4
  145. package/dist/io/fetch.js +0 -11
  146. package/dist/io/file-drop.d.ts +7 -0
  147. package/dist/io/file-drop.js +13 -0
  148. package/dist/io/index.d.ts +1 -0
  149. package/dist/io/index.js +3 -0
  150. package/dist/io/is-binary.d.ts +9 -0
  151. package/dist/io/is-binary.js +45 -1
  152. package/dist/io/types.d.ts +13 -0
  153. package/dist/io/url-drop.js +13 -25
  154. package/dist/isosurface/Isosurface.svelte +17 -23
  155. package/dist/isosurface/IsosurfaceControls.svelte +37 -42
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +50 -48
  159. package/dist/labels.d.ts +6 -2
  160. package/dist/labels.js +44 -14
  161. package/dist/layout/FullscreenButton.svelte +34 -0
  162. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  163. package/dist/layout/FullscreenToggle.svelte +12 -12
  164. package/dist/layout/InfoCard.svelte +7 -18
  165. package/dist/layout/InfoTag.svelte +1 -3
  166. package/dist/layout/NumberRangeInput.svelte +46 -0
  167. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  168. package/dist/layout/PropertyFilter.svelte +2 -6
  169. package/dist/layout/SettingsSection.svelte +21 -17
  170. package/dist/layout/SubpageGrid.svelte +3 -1
  171. package/dist/layout/ViewerChrome.svelte +115 -0
  172. package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
  173. package/dist/layout/fullscreen.d.ts +4 -0
  174. package/dist/layout/fullscreen.js +3 -5
  175. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  176. package/dist/layout/fullscreen.svelte.js +36 -0
  177. package/dist/layout/index.d.ts +4 -0
  178. package/dist/layout/index.js +4 -0
  179. package/dist/layout/json-tree/JsonNode.svelte +8 -11
  180. package/dist/layout/json-tree/JsonTree.svelte +53 -77
  181. package/dist/layout/json-tree/JsonValue.svelte +7 -15
  182. package/dist/layout/json-tree/utils.js +14 -23
  183. package/dist/math.d.ts +9 -3
  184. package/dist/math.js +37 -21
  185. package/dist/overlays/ContextMenu.svelte +4 -2
  186. package/dist/overlays/CopyButton.svelte +11 -5
  187. package/dist/overlays/DragControlTab.svelte +6 -1
  188. package/dist/overlays/DraggablePane.svelte +81 -26
  189. package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
  190. package/dist/overlays/GlassChip.svelte +30 -0
  191. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  192. package/dist/overlays/InfoPaneCards.svelte +11 -23
  193. package/dist/overlays/index.d.ts +11 -0
  194. package/dist/overlays/index.js +26 -0
  195. package/dist/overlays/portal.d.ts +2 -0
  196. package/dist/overlays/portal.js +14 -0
  197. package/dist/periodic-table/PeriodicTable.svelte +115 -146
  198. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  199. package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
  200. package/dist/periodic-table/TableInset.svelte +9 -4
  201. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
  202. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  203. package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
  204. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  205. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  206. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  207. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
  208. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  209. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  210. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  211. package/dist/phase-diagram/build-diagram.js +3 -3
  212. package/dist/phase-diagram/colors.js +1 -1
  213. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  214. package/dist/phase-diagram/parse.d.ts +2 -1
  215. package/dist/phase-diagram/parse.js +15 -15
  216. package/dist/phase-diagram/svg-to-diagram.js +21 -15
  217. package/dist/phase-diagram/utils.js +2 -3
  218. package/dist/plot/bar/BarPlot.svelte +494 -692
  219. package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
  220. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  221. package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
  222. package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
  223. package/dist/plot/bar/data.d.ts +5 -4
  224. package/dist/plot/bar/data.js +2 -1
  225. package/dist/plot/box/BoxPlot.svelte +361 -439
  226. package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
  227. package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
  228. package/dist/plot/box/Violin.svelte.d.ts +2 -1
  229. package/dist/plot/box/box-plot.d.ts +3 -2
  230. package/dist/plot/box/box-plot.js +6 -3
  231. package/dist/plot/box/kde.d.ts +2 -1
  232. package/dist/plot/box/kde.js +4 -4
  233. package/dist/plot/core/auto-place.d.ts +1 -1
  234. package/dist/plot/core/auto-place.js +5 -2
  235. package/dist/plot/core/axis-utils.d.ts +12 -7
  236. package/dist/plot/core/axis-utils.js +48 -48
  237. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  238. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  239. package/dist/plot/core/components/ColorBar.svelte +106 -111
  240. package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
  241. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  242. package/dist/plot/core/components/FillArea.svelte +10 -17
  243. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  244. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  245. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  246. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  247. package/dist/plot/core/components/Line.svelte +21 -11
  248. package/dist/plot/core/components/Line.svelte.d.ts +5 -2
  249. package/dist/plot/core/components/PlotAxis.svelte +42 -18
  250. package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
  251. package/dist/plot/core/components/PlotControls.svelte +65 -41
  252. package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
  253. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  254. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  255. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  256. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  257. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  258. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  259. package/dist/plot/core/components/ReferenceLine3D.svelte +56 -59
  260. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
  261. package/dist/plot/core/components/ReferencePlane.svelte +9 -10
  262. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +29 -476
  271. package/dist/plot/core/data-transform.js +9 -5
  272. package/dist/plot/core/fill-utils.d.ts +7 -4
  273. package/dist/plot/core/fill-utils.js +34 -9
  274. package/dist/plot/core/index.d.ts +1 -0
  275. package/dist/plot/core/index.js +1 -0
  276. package/dist/plot/core/interactions.d.ts +5 -1
  277. package/dist/plot/core/interactions.js +14 -2
  278. package/dist/plot/core/layout.d.ts +3 -1
  279. package/dist/plot/core/layout.js +22 -13
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  283. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  284. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -0
  286. package/dist/plot/core/reference-line.d.ts +10 -10
  287. package/dist/plot/core/reference-line.js +7 -7
  288. package/dist/plot/core/scales.d.ts +40 -25
  289. package/dist/plot/core/scales.js +49 -21
  290. package/dist/plot/core/svg.d.ts +2 -1
  291. package/dist/plot/core/types/fills.d.ts +101 -0
  292. package/dist/plot/core/types/fills.js +15 -0
  293. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  294. package/dist/plot/core/types/plot-3d.js +4 -0
  295. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  296. package/dist/plot/core/types/reference-lines.js +9 -0
  297. package/dist/plot/core/types.d.ts +47 -331
  298. package/dist/plot/core/types.js +23 -20
  299. package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
  300. package/dist/plot/core/utils/hierarchy-chart.js +179 -0
  301. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  302. package/dist/plot/core/utils/hierarchy-labels.js +99 -0
  303. package/dist/plot/core/utils/label-placement.d.ts +1 -1
  304. package/dist/plot/core/utils/label-placement.js +5 -5
  305. package/dist/plot/core/utils.d.ts +2 -1
  306. package/dist/plot/histogram/Histogram.svelte +373 -631
  307. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  308. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  309. package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
  310. package/dist/plot/histogram/histogram.d.ts +31 -0
  311. package/dist/plot/histogram/histogram.js +70 -0
  312. package/dist/plot/histogram/index.d.ts +1 -0
  313. package/dist/plot/histogram/index.js +1 -0
  314. package/dist/plot/index.d.ts +1 -0
  315. package/dist/plot/index.js +1 -0
  316. package/dist/plot/sankey/Sankey.svelte +79 -73
  317. package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
  318. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  319. package/dist/plot/sankey/sankey.js +3 -1
  320. package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
  321. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
  322. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  323. package/dist/plot/scatter/ScatterPlot.svelte +623 -821
  324. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
  325. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  326. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  327. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  328. package/dist/plot/scatter/binned-scatter-types.d.ts +6 -12
  329. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  330. package/dist/plot/scatter/index.d.ts +1 -1
  331. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  332. package/dist/plot/scatter/scatter-data.js +8 -7
  333. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +40 -60
  334. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
  335. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
  336. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
  337. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
  338. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
  339. package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
  340. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
  341. package/dist/plot/sunburst/Sunburst.svelte +256 -338
  342. package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
  343. package/dist/plot/sunburst/index.d.ts +1 -1
  344. package/dist/plot/sunburst/index.js +2 -1
  345. package/dist/plot/sunburst/render.d.ts +2 -2
  346. package/dist/plot/sunburst/render.js +47 -22
  347. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  348. package/dist/plot/sunburst/sunburst.js +14 -4
  349. package/dist/plot/treemap/Treemap.svelte +907 -0
  350. package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
  351. package/dist/plot/treemap/index.d.ts +3 -0
  352. package/dist/plot/treemap/index.js +4 -0
  353. package/dist/plot/treemap/treemap.d.ts +26 -0
  354. package/dist/plot/treemap/treemap.js +99 -0
  355. package/dist/rdf/RdfPlot.svelte +22 -26
  356. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  357. package/dist/rdf/calc-rdf.js +4 -8
  358. package/dist/sanitize.js +14 -3
  359. package/dist/scene/SceneCamera.svelte +62 -0
  360. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  361. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  362. package/dist/scene/bind-renderer.svelte.js +22 -0
  363. package/dist/scene/index.d.ts +4 -0
  364. package/dist/scene/index.js +5 -0
  365. package/dist/scene/props.js +52 -0
  366. package/dist/scene/types.d.ts +26 -0
  367. package/dist/scene/types.js +1 -0
  368. package/dist/settings.d.ts +33 -11
  369. package/dist/settings.js +136 -51
  370. package/dist/spectral/Bands.svelte +231 -237
  371. package/dist/spectral/Bands.svelte.d.ts +3 -2
  372. package/dist/spectral/BandsAndDos.svelte +29 -29
  373. package/dist/spectral/BrillouinBandsDos.svelte +21 -29
  374. package/dist/spectral/Dos.svelte +75 -77
  375. package/dist/spectral/Dos.svelte.d.ts +2 -1
  376. package/dist/spectral/helpers.d.ts +9 -9
  377. package/dist/spectral/helpers.js +66 -70
  378. package/dist/state.svelte.d.ts +0 -7
  379. package/dist/state.svelte.js +5 -24
  380. package/dist/structure/Arrow.svelte +6 -21
  381. package/dist/structure/ArrowInstances.svelte +160 -0
  382. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  383. package/dist/structure/AtomLegend.svelte +115 -75
  384. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  385. package/dist/structure/Bond.svelte +31 -23
  386. package/dist/structure/CanvasTooltip.svelte +16 -3
  387. package/dist/structure/CellSelect.svelte +22 -29
  388. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  389. package/dist/structure/Cylinder.svelte +24 -40
  390. package/dist/structure/InstancedAtoms.svelte +114 -0
  391. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  392. package/dist/structure/Lattice.svelte +85 -149
  393. package/dist/structure/SiteLabels.svelte +122 -0
  394. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  395. package/dist/structure/Structure.svelte +725 -735
  396. package/dist/structure/Structure.svelte.d.ts +8 -16
  397. package/dist/structure/StructureCarousel.svelte +630 -0
  398. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  399. package/dist/structure/StructureControls.svelte +298 -325
  400. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  401. package/dist/structure/StructureExportPane.svelte +62 -168
  402. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  403. package/dist/structure/StructureInfoPane.svelte +77 -69
  404. package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
  405. package/dist/structure/StructureScene.svelte +758 -600
  406. package/dist/structure/StructureScene.svelte.d.ts +24 -20
  407. package/dist/structure/StructureViewport.svelte +386 -0
  408. package/dist/structure/StructureViewport.svelte.d.ts +63 -0
  409. package/dist/structure/atom-label-placement.d.ts +18 -0
  410. package/dist/structure/atom-label-placement.js +115 -0
  411. package/dist/structure/atom-properties.d.ts +3 -1
  412. package/dist/structure/atom-properties.js +115 -54
  413. package/dist/structure/bond-order-perception.js +2 -4
  414. package/dist/structure/bonding.d.ts +12 -2
  415. package/dist/structure/bonding.js +172 -73
  416. package/dist/structure/edit-history.d.ts +6 -0
  417. package/dist/structure/edit-history.js +27 -0
  418. package/dist/structure/export.d.ts +25 -4
  419. package/dist/structure/export.js +103 -153
  420. package/dist/structure/format-detect.d.ts +1 -0
  421. package/dist/structure/format-detect.js +22 -0
  422. package/dist/structure/geometry.d.ts +9 -0
  423. package/dist/structure/geometry.js +27 -0
  424. package/dist/structure/index.d.ts +18 -1
  425. package/dist/structure/index.js +15 -2
  426. package/dist/structure/measure.d.ts +1 -1
  427. package/dist/structure/measure.js +6 -12
  428. package/dist/structure/parse.d.ts +5 -3
  429. package/dist/structure/parse.js +551 -567
  430. package/dist/structure/partial-occupancy.d.ts +0 -1
  431. package/dist/structure/partial-occupancy.js +5 -3
  432. package/dist/structure/pbc.d.ts +1 -1
  433. package/dist/structure/pbc.js +204 -51
  434. package/dist/structure/polyhedra.d.ts +40 -0
  435. package/dist/structure/polyhedra.js +587 -0
  436. package/dist/structure/site.d.ts +4 -0
  437. package/dist/structure/site.js +1 -0
  438. package/dist/structure/supercell.d.ts +1 -2
  439. package/dist/structure/supercell.js +10 -15
  440. package/dist/structure/validation.js +5 -6
  441. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  442. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  443. package/dist/symmetry/SymmetryElements.svelte +350 -0
  444. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  445. package/dist/symmetry/SymmetryStats.svelte +142 -49
  446. package/dist/symmetry/WyckoffTable.svelte +58 -16
  447. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  448. package/dist/symmetry/cell-transform.js +8 -14
  449. package/dist/symmetry/index.d.ts +15 -4
  450. package/dist/symmetry/index.js +308 -81
  451. package/dist/symmetry/spacegroups.d.ts +5 -1
  452. package/dist/symmetry/spacegroups.js +18 -3
  453. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  454. package/dist/symmetry/symmetry-elements.js +521 -0
  455. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  456. package/dist/symmetry/wyckoff-db.js +87 -0
  457. package/dist/table/HeatmapTable.svelte +1104 -378
  458. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  459. package/dist/table/ToggleMenu.svelte +5 -12
  460. package/dist/table/index.d.ts +21 -6
  461. package/dist/table/index.js +34 -21
  462. package/dist/theme/ThemeControl.svelte +16 -8
  463. package/dist/theme/index.d.ts +1 -5
  464. package/dist/theme/index.js +4 -10
  465. package/dist/theme/themes.mjs +14 -7
  466. package/dist/tooltip/KCoords.svelte +4 -1
  467. package/dist/tooltip/TooltipContent.svelte +2 -5
  468. package/dist/trajectory/Trajectory.svelte +556 -352
  469. package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
  470. package/dist/trajectory/TrajectoryError.svelte +11 -8
  471. package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
  472. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  473. package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
  474. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  475. package/dist/trajectory/constants.js +6 -2
  476. package/dist/trajectory/extract.js +73 -71
  477. package/dist/trajectory/format-detect.d.ts +0 -1
  478. package/dist/trajectory/format-detect.js +13 -17
  479. package/dist/trajectory/frame-reader.d.ts +2 -1
  480. package/dist/trajectory/frame-reader.js +74 -136
  481. package/dist/trajectory/helpers.d.ts +12 -2
  482. package/dist/trajectory/helpers.js +68 -37
  483. package/dist/trajectory/index.d.ts +1 -0
  484. package/dist/trajectory/index.js +3 -0
  485. package/dist/trajectory/parse/ase.d.ts +9 -1
  486. package/dist/trajectory/parse/ase.js +47 -32
  487. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  488. package/dist/trajectory/parse/diagnostics.js +14 -0
  489. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  490. package/dist/trajectory/parse/h5-utils.js +109 -0
  491. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  492. package/dist/trajectory/parse/hdf5.js +116 -106
  493. package/dist/trajectory/parse/index.d.ts +3 -4
  494. package/dist/trajectory/parse/index.js +68 -119
  495. package/dist/trajectory/parse/lammps.d.ts +0 -2
  496. package/dist/trajectory/parse/lammps.js +14 -16
  497. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  498. package/dist/trajectory/parse/pymatgen.js +74 -0
  499. package/dist/trajectory/parse/vasp.js +13 -9
  500. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  501. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  502. package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
  503. package/dist/trajectory/parse/vaspout-h5.js +284 -0
  504. package/dist/trajectory/parse/xyz.d.ts +9 -21
  505. package/dist/trajectory/parse/xyz.js +38 -39
  506. package/dist/trajectory/plotting.d.ts +8 -10
  507. package/dist/trajectory/plotting.js +102 -127
  508. package/dist/utils.d.ts +4 -0
  509. package/dist/utils.js +8 -1
  510. package/dist/xrd/XrdPlot.svelte +56 -85
  511. package/dist/xrd/broadening.d.ts +2 -1
  512. package/dist/xrd/broadening.js +2 -1
  513. package/dist/xrd/calc-xrd.js +8 -15
  514. package/dist/xrd/index.d.ts +2 -2
  515. package/dist/xrd/parse.d.ts +0 -1
  516. package/dist/xrd/parse.js +56 -73
  517. package/package.json +77 -36
  518. package/dist/api/mp.d.ts +0 -6
  519. package/dist/api/mp.js +0 -22
  520. package/dist/element/data.json +0 -11864
  521. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  522. package/dist/fermi-surface/marching-cubes.js +0 -2
  523. package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
  524. package/dist/plot/core/hover-lock.svelte.js +0 -45
  525. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  526. package/dist/structure/label-placement.d.ts +0 -14
  527. package/dist/structure/label-placement.js +0 -72
@@ -1,3 +1,14 @@
1
+ import type { ComponentProps } from 'svelte';
2
+ import { SvelteSet } from 'svelte/reactivity';
3
+ import type DraggablePane from './DraggablePane.svelte';
1
4
  export { default as ContextMenu } from './ContextMenu.svelte';
2
5
  export { default as DraggablePane } from './DraggablePane.svelte';
3
6
  export { default as DragControlTab } from './DragControlTab.svelte';
7
+ export { default as GlassChip } from './GlassChip.svelte';
8
+ export * from './portal';
9
+ export type PaneToggleProps = ComponentProps<typeof DraggablePane>[`toggle_props`];
10
+ export type PaneProps = ComponentProps<typeof DraggablePane>[`pane_props`];
11
+ export declare function create_clipboard_feedback(duration?: number): {
12
+ copied: SvelteSet<string>;
13
+ copy: (text: string, key: string) => Promise<void>;
14
+ };
@@ -1,3 +1,29 @@
1
+ import { SvelteMap, SvelteSet } from 'svelte/reactivity';
1
2
  export { default as ContextMenu } from './ContextMenu.svelte';
2
3
  export { default as DraggablePane } from './DraggablePane.svelte';
3
4
  export { default as DragControlTab } from './DragControlTab.svelte';
5
+ export { default as GlassChip } from './GlassChip.svelte';
6
+ export * from './portal';
7
+ // Reactive clipboard-copy feedback shared by info panes. `copy(text, key)` writes
8
+ // `text` to the clipboard and flags `key` as recently-copied in the returned reactive
9
+ // `copied` set for `duration` ms, so UIs can show a transient "copied" checkmark.
10
+ export function create_clipboard_feedback(duration = 1000) {
11
+ const copied = new SvelteSet();
12
+ const timers = new SvelteMap();
13
+ const copy = async (text, key) => {
14
+ try {
15
+ await navigator.clipboard.writeText(text);
16
+ copied.add(key);
17
+ // reset any in-flight timer so a re-copy gets the full feedback duration
18
+ clearTimeout(timers.get(key));
19
+ timers.set(key, setTimeout(() => {
20
+ copied.delete(key);
21
+ timers.delete(key);
22
+ }, duration));
23
+ }
24
+ catch (error) {
25
+ console.error(`Failed to copy to clipboard:`, error);
26
+ }
27
+ };
28
+ return { copied, copy };
29
+ }
@@ -0,0 +1,2 @@
1
+ import type { Attachment } from 'svelte/attachments';
2
+ export declare const portal: (target: HTMLElement | null | undefined) => Attachment;
@@ -0,0 +1,14 @@
1
+ // Attachment that moves its element into `target` (e.g. a host panel's toolbar),
2
+ // so components can offer optional external placement of their chrome (search/
3
+ // export/settings buttons etc.) without duplicating markup: pass nothing and the
4
+ // element renders inline where declared; pass a target and it teleports there.
5
+ // A comment anchor marks the original position so the element is restored when
6
+ // the target changes or unmounts, keeping Svelte's teardown sound.
7
+ export const portal = (target) => (element) => {
8
+ if (!target)
9
+ return undefined;
10
+ const anchor = document.createComment(`portal`);
11
+ element.before(anchor);
12
+ target.append(element);
13
+ return () => anchor.replaceWith(element);
14
+ };
@@ -1,18 +1,21 @@
1
1
  <script lang="ts">
2
- import { is_color } from '../colors'
2
+ import { get_d3_interpolator, is_color } from '../colors'
3
3
  import type { ChemicalElement, ElementCategory, ElementSymbol } from '../element'
4
4
  import { element_data, ElementPhoto, ElementTile } from '../element'
5
5
  import { ELEM_SYMBOLS } from '../labels'
6
6
  import type { Point2D, Vec2 } from '../math'
7
7
  import { ColorBar } from '../plot'
8
8
  import { colors } from '../state.svelte'
9
- import * as d3_sc from 'd3-scale-chromatic'
10
9
  import type { ComponentProps, Snippet } from 'svelte'
11
10
  import type { HTMLAttributes } from 'svelte/elements'
12
11
  import type { D3InterpolateName } from '../colors'
12
+ import type { MissingCellStyle } from '../heatmap-matrix'
13
13
  import type { ScaleContext } from './index'
14
14
  import { TableInset } from './index'
15
15
 
16
+ // a tile's heat value: scalar or 1-4-segment array of numbers/colors
17
+ type HeatValue = number | number[] | string | string[]
18
+
16
19
  const default_f_block_inset_tiles = [
17
20
  { name: `Lanthanides`, symbol: `La-Lu`, number: `57-71`, category: `lanthanide` },
18
21
  { name: `Actinides`, symbol: `Ac-Lr`, number: `89-103`, category: `actinide` },
@@ -37,7 +40,7 @@
37
40
  color_scale_range = [null, null],
38
41
  color_overrides = {},
39
42
  labels = {},
40
- missing_color = `element-category`,
43
+ missing = {},
41
44
  split_layout = undefined,
42
45
  show_color_bar = true,
43
46
  color_bar_props = {},
@@ -51,12 +54,10 @@
51
54
  tile_props?: Partial<ComponentProps<typeof ElementTile>>
52
55
  show_photo?: boolean
53
56
  disabled?: boolean // disable hover and click events from updating active_element
54
- // either array of numbers/colors (can be partial, missing elements default to 0) or object with
55
- // element symbol as key and heat value as value
56
- // NEW: each value can now be a single number/color or array of 1-4 numbers/colors for multi-segment display
57
- heatmap_values?:
58
- | Partial<Record<ElementSymbol, number | number[] | string | string[]>>
59
- | (number | number[] | string | string[])[]
57
+ // array (positional by atomic number, can be partial) or object keyed by element symbol.
58
+ // each value is a single number/color or an array of 1-4 numbers/colors for multi-segment
59
+ // tiles. null/omitted -> missing (uses the `missing` fallback); 0 is a real value
60
+ heatmap_values?: Partial<Record<ElementSymbol, HeatValue | null>> | (HeatValue | null)[]
60
61
  // links is either string with element property (name, symbol, number, ...) to use as link,
61
62
  // or object with mapping element symbols to link
62
63
  links?: keyof ChemicalElement | Record<ElementSymbol, string> | null
@@ -79,9 +80,7 @@
79
80
  color_scale_range?: [number | null, number | null]
80
81
  color_overrides?: Partial<Record<ElementSymbol, string>>
81
82
  labels?: Partial<Record<ElementSymbol, string>>
82
- // background color for elements missing from heatmap_values
83
- // "element-category" falls back to element category default color
84
- missing_color?: string
83
+ missing?: MissingCellStyle // styling for tiles with no heatmap value
85
84
  // control the layout of multi-value splits for all tiles
86
85
  split_layout?: `diagonal` | `horizontal` | `vertical` | `triangular` | `quadrant`
87
86
  // automatically show a color bar when heatmap_values is provided (default: true)
@@ -92,16 +91,16 @@
92
91
  bottom_left_inset?: Snippet<[{ active_element: ChemicalElement | null }]>
93
92
  tooltip?:
94
93
  | Snippet<
95
- [
96
- {
97
- element: ChemicalElement
98
- value: number | number[] | string | string[]
99
- active: boolean
100
- bg_color: string | null
101
- scale_context: ScaleContext
102
- },
103
- ]
104
- >
94
+ [
95
+ {
96
+ element: ChemicalElement
97
+ value: HeatValue | null
98
+ active: boolean
99
+ bg_color: string | null
100
+ scale_context: ScaleContext
101
+ },
102
+ ]
103
+ >
105
104
  | boolean
106
105
  children?: Snippet
107
106
  onenter?: (element: ChemicalElement) => void
@@ -115,7 +114,8 @@
115
114
  `each element possibly omitting elements at the end, got ${heatmap_values.length}`,
116
115
  )
117
116
  return []
118
- }return heatmap_values
117
+ }
118
+ return heatmap_values
119
119
  } else if (typeof heatmap_values === `object`) {
120
120
  const bad_keys = Object.keys(heatmap_values).filter(
121
121
  (key) => !ELEM_SYMBOLS.includes(key as ElementSymbol),
@@ -126,7 +126,9 @@
126
126
  )
127
127
  return []
128
128
  }
129
- return ELEM_SYMBOLS.map((symbol) => heatmap_values[symbol] ?? 0)
129
+ // keep absent elements as null (distinct from a real 0 value) so they map to the
130
+ // missing fallback while explicit 0 maps through the color scale
131
+ return ELEM_SYMBOLS.map((symbol) => heatmap_values[symbol] ?? null)
130
132
  }
131
133
  return []
132
134
  })
@@ -159,14 +161,11 @@
159
161
  ArrowDown: row === 6 && in_f_block ? 9 : row === 7 && in_f_block ? 10 : row + 1,
160
162
  }
161
163
  const target_row = row_map[event.key] ?? row
162
- const target_col = event.key === `ArrowLeft`
163
- ? col - 1
164
- : event.key === `ArrowRight`
165
- ? col + 1
166
- : col
164
+ const target_col =
165
+ event.key === `ArrowLeft` ? col - 1 : event.key === `ArrowRight` ? col + 1 : col
167
166
  active_element =
168
167
  element_data.find((el) => el.column === target_col && el.row === target_row) ??
169
- active_element
168
+ active_element
170
169
  }
171
170
 
172
171
  function handle_tooltip_enter(element: ChemicalElement, event: MouseEvent) {
@@ -186,125 +185,95 @@
186
185
  }
187
186
 
188
187
  let color_scale_fn = $derived(
189
- typeof color_scale === `string` ? d3_sc[color_scale] : color_scale,
188
+ typeof color_scale === `string` ? get_d3_interpolator(color_scale) : color_scale,
190
189
  )
191
190
 
191
+ // finite numeric heat value (numeric strings coerced; colors, null/false and non-finite
192
+ // excluded so they can't poison the color-scale domain). null => not a mappable number
193
+ const to_heat_num = (value: number | string | false | null | undefined): number | null => {
194
+ if (value == null || value === false || is_color(value)) return null
195
+ const num = Number(value)
196
+ return Number.isFinite(num) ? num : null
197
+ }
198
+
199
+ let heat_nums = $derived(
200
+ heat_values
201
+ .flat()
202
+ .map(to_heat_num)
203
+ .filter((num): num is number => num !== null),
204
+ )
205
+ // values usable by the active scale (log excludes non-positive)
206
+ let usable_heat_nums = $derived(log ? heat_nums.filter((num) => num > 0) : heat_nums)
207
+
192
208
  let cs_min = $derived(
193
- color_scale_range[0] ??
194
- (heat_values.length > 0
195
- ? Math.min(
196
- ...heat_values.flat().filter((v): v is number => typeof v === `number`),
197
- )
198
- : 0),
209
+ color_scale_range[0] ?? (heat_nums.length > 0 ? Math.min(...heat_nums) : 0),
199
210
  )
200
211
  let cs_max = $derived(
201
- color_scale_range[1] ??
202
- (heat_values.length > 0
203
- ? Math.max(
204
- ...heat_values.flat().filter((v): v is number => typeof v === `number`),
205
- )
206
- : 1),
212
+ color_scale_range[1] ?? (heat_nums.length > 0 ? Math.max(...heat_nums) : 1),
207
213
  )
208
214
 
209
215
  // smallest positive bound for log color mapping (matches the auto ColorBar's log scale)
210
216
  let cs_min_pos = $derived.by(() => {
211
217
  if (cs_min > 0) return cs_min
212
- const pos = heat_values.flat().filter((v): v is number => typeof v === `number` && v > 0)
218
+ const pos = heat_nums.filter((num) => num > 0)
213
219
  return pos.length > 0 ? Math.min(...pos) : cs_max
214
220
  })
215
221
 
216
- let bg_color = $derived(
217
- (
218
- value: number | number[] | string | string[] | false,
219
- element?: ChemicalElement,
220
- ): string | null => {
221
- if (Array.isArray(value)) {
222
- // For arrays, return the color of the first value (used as fallback)
223
- return bg_color(value[0], element)
224
- }
225
-
226
- // If it's already a color string, return it directly
227
- if (is_color(value)) return value as string
228
-
229
- // Return missing color for zero/invalid values or when no heatmap data
230
- if (
231
- !value ||
232
- value === 0 ||
233
- (log && value <= 0) ||
234
- !heat_values?.length ||
235
- !color_scale_fn
236
- ) {
237
- // Use missing color for zero/missing values or when no heatmap data
238
- if (missing_color === `element-category` && element) {
239
- return colors.category[element.category] || `#cccccc`
240
- }
241
- return missing_color
242
- }
243
-
244
- // map value to [0, 1] range
245
- const span = cs_max - cs_min
246
- if (span === 0) return color_scale_fn?.(0.5) // midpoint when all values equal
222
+ // whether a value maps to a heatmap color (false => use the missing fallback). 0 is a
223
+ // real value; only absent/null/non-finite (and <=0 in log mode) count as missing. a
224
+ // multi-value tile is missing only when every segment is missing
225
+ const value_is_missing = (value: HeatValue | false | null): boolean => {
226
+ if (Array.isArray(value)) return value.every(value_is_missing) // [] -> true (missing)
227
+ if (is_color(value)) return false // explicit colors are real values, not missing
228
+ const num = to_heat_num(value)
229
+ return num === null || (log && num <= 0)
230
+ }
247
231
 
248
- if (log) {
249
- // log mapping matching the log ColorBar (value <= 0 returned missing_color above)
250
- const log_span = Math.log(cs_max) - Math.log(cs_min_pos)
251
- if (log_span === 0) return color_scale_fn?.(0.5)
252
- value = (Math.log(value as number) - Math.log(cs_min_pos)) / log_span
253
- } else value = ((value as number) - cs_min) / span
254
- return color_scale_fn?.(value as number)
255
- },
256
- )
232
+ const bg_color = (
233
+ value: HeatValue | false | null,
234
+ element?: ChemicalElement,
235
+ ): string | null => {
236
+ if (Array.isArray(value)) return bg_color(value[0], element) // arrays: use first value
237
+ if (is_color(value)) return value // already a color string
238
+
239
+ if (!heat_values.length || !color_scale_fn || value_is_missing(value)) {
240
+ const category_color = (element && colors.category[element.category]) || `#cccccc`
241
+ if (missing.color === `element-category`) return category_color
242
+ // default: category colors for a plain table, gray for missing heatmap data
243
+ return missing.color || (heat_values.length ? `#666` : category_color)
244
+ }
257
245
 
258
- let bg_colors = $derived(
259
- (
260
- value: number | number[] | string | string[] | false,
261
- element?: ChemicalElement,
262
- ) => {
263
- if (!Array.isArray(value)) return []
246
+ // map value to [0, 1] range
247
+ const num = Number(value)
248
+ const span = cs_max - cs_min
249
+ if (span === 0) return color_scale_fn(0.5) // midpoint when all values equal
250
+ if (log) {
251
+ const log_span = Math.log(cs_max) - Math.log(cs_min_pos)
252
+ if (log_span === 0) return color_scale_fn(0.5)
253
+ return color_scale_fn((Math.log(num) - Math.log(cs_min_pos)) / log_span)
254
+ }
255
+ return color_scale_fn((num - cs_min) / span)
256
+ }
264
257
 
265
- return value.map((val) => {
266
- // If it's already a color string, return it directly
267
- if (is_color(val)) return val as string
268
- // Otherwise, map it through the color scale
269
- return bg_color(val as number, element)
270
- })
271
- },
272
- )
258
+ // per-segment colors for multi-value tiles (bg_color already handles color strings)
259
+ const bg_colors = (value: HeatValue | false, element?: ChemicalElement) =>
260
+ Array.isArray(value) ? value.map((val) => bg_color(val, element)) : []
273
261
 
274
262
  // Determine whether to automatically show the color bar
275
- let should_show_color_bar = $derived.by(() => {
276
- if (!show_color_bar || inset || heat_values.length === 0) return false
277
-
278
- const num_vals = heat_values
279
- .flat()
280
- .filter((val): val is number => typeof val === `number`)
281
-
282
- const usable_values = log ? num_vals.filter((val) => val > 0) : num_vals
283
-
284
- return usable_values.length > 0
285
- })
263
+ let should_show_color_bar = $derived(show_color_bar && !inset && usable_heat_nums.length > 0)
286
264
 
287
265
  // Calculate heat range for color bar
288
266
  let heat_range = $derived.by((): Vec2 => {
289
267
  if (!should_show_color_bar) return [0, 1]
290
-
291
- const numeric_values = heat_values
292
- .flat()
293
- .filter((val): val is number => typeof val === `number`)
294
- const usable_values = log ? numeric_values.filter((val) => val > 0) : numeric_values
295
-
296
- if (usable_values.length === 0) return [0, 1]
297
-
298
- const min = color_scale_range[0] ?? Math.min(...usable_values)
299
- const max = color_scale_range[1] ?? Math.max(...usable_values)
300
-
268
+ const min = color_scale_range[0] ?? Math.min(...usable_heat_nums)
269
+ const max = color_scale_range[1] ?? Math.max(...usable_heat_nums)
301
270
  return [min, max]
302
271
  })
303
272
  </script>
304
273
 
305
274
  <svelte:window bind:innerWidth={window_width} onkeydown={handle_key} />
306
275
 
307
- <div {...rest} class="periodic-table {rest.class ?? ``}">
276
+ <div {...rest} class={[`periodic-table`, rest.class]}>
308
277
  <div class="ptable-grid" style:gap>
309
278
  {#if should_show_color_bar}
310
279
  <TableInset class="auto-colorbar-inset">
@@ -325,28 +294,32 @@
325
294
  {#each element_data as element (element.number)}
326
295
  {@const { column, row, category, name, symbol } = element}
327
296
  {@const value = heat_values[element.number - 1]}
297
+ {@const override = color_overrides[symbol]}
298
+ {@const tile_missing = heat_values.length > 0 && !override && value_is_missing(value)}
328
299
  {@const is_active_elem = active_elements?.some((active_elem) =>
329
300
  typeof active_elem === `string`
330
301
  ? active_elem === symbol
331
- : active_elem?.symbol === symbol
302
+ : active_elem?.symbol === symbol,
332
303
  )}
333
- {@const active = active_category === category ||
334
- active_element?.name === name || is_active_elem}
335
- {@const style = `grid-column: ${column}; grid-row: ${row};`}
304
+ {@const active =
305
+ active_category === category || active_element?.name === name || is_active_elem}
306
+ {@const style = `grid-column: ${column}; grid-row: ${row};${
307
+ tile_props?.style ? ` ${tile_props.style}` : ``
308
+ }${tile_missing && missing.style ? ` ${missing.style}` : ``}`}
336
309
  <ElementTile
337
310
  {element}
338
311
  href={links
339
- ? typeof links == `string`
340
- ? `/${element[links]}`.toLowerCase()
341
- : links[symbol]
342
- : undefined}
343
- {style}
344
- {value}
345
- bg_color={color_overrides[symbol] ?? bg_color(value, element) ?? undefined}
346
- bg_colors={Array.isArray(value) ? bg_colors(value, element) : []}
312
+ ? typeof links == `string`
313
+ ? `/${element[links]}`.toLowerCase()
314
+ : links[symbol]
315
+ : undefined}
316
+ value={tile_missing ? undefined : (value ?? undefined)}
317
+ bg_color={override ?? bg_color(value, element) ?? undefined}
318
+ bg_colors={!override && Array.isArray(value) ? bg_colors(value, element) : []}
347
319
  {active}
348
- label={labels[symbol]}
320
+ label={labels[symbol] ?? (tile_missing ? missing.label : undefined)}
349
321
  {...tile_props}
322
+ {style}
350
323
  onmouseenter={(event: MouseEvent) => {
351
324
  set_active_element(element)()
352
325
  handle_tooltip_enter(element, event)
@@ -389,17 +362,16 @@
389
362
  {#if tooltip_visible && tooltip_element}
390
363
  {@const el = tooltip_element as ChemicalElement}
391
364
  {@const style = `left: ${tooltip_pos.x}px; top: ${tooltip_pos.y}px;`}
392
- {@const tooltip_value = heat_values[el.number - 1] ?? 0}
365
+ {@const tooltip_value = heat_values[el.number - 1]}
393
366
  {#if typeof tooltip == `function`}
394
367
  <div class="tooltip" {style}>
395
368
  {@render tooltip({
396
- element: el,
397
- value: tooltip_value,
398
- active: active_category === el.category ||
399
- active_element?.name === el.name,
400
- bg_color: color_overrides[el.symbol] ?? bg_color(tooltip_value, el),
401
- scale_context: { min: cs_min, max: cs_max, color_scale },
402
- })}
369
+ element: el,
370
+ value: tooltip_value ?? null,
371
+ active: active_category === el.category || active_element?.name === el.name,
372
+ bg_color: color_overrides[el.symbol] ?? bg_color(tooltip_value, el),
373
+ scale_context: { min: log ? cs_min_pos : cs_min, max: cs_max, color_scale },
374
+ })}
403
375
  </div>
404
376
  {:else if tooltip !== false}
405
377
  <div class="tooltip" {style}>
@@ -447,10 +419,7 @@
447
419
  .tooltip {
448
420
  position: absolute;
449
421
  transform: translate(-50%, -10%);
450
- background: var(
451
- --tooltip-bg,
452
- light-dark(rgba(255, 255, 255, 0.95), rgba(0, 0, 0, 0.85))
453
- );
422
+ background: var(--tooltip-bg, light-dark(rgba(255, 255, 255, 0.95), rgba(0, 0, 0, 0.85)));
454
423
  color: var(--tooltip-color, light-dark(#222, #eee));
455
424
  padding: var(--tooltip-padding, 4px 6px);
456
425
  border-radius: var(--tooltip-border-radius, var(--border-radius, 3pt));
@@ -4,12 +4,14 @@ import { ColorBar } from '../plot';
4
4
  import type { ComponentProps, Snippet } from 'svelte';
5
5
  import type { HTMLAttributes } from 'svelte/elements';
6
6
  import type { D3InterpolateName } from '../colors';
7
+ import type { MissingCellStyle } from '../heatmap-matrix';
7
8
  import type { ScaleContext } from './index';
9
+ type HeatValue = number | number[] | string | string[];
8
10
  type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
9
11
  tile_props?: Partial<ComponentProps<typeof ElementTile>>;
10
12
  show_photo?: boolean;
11
13
  disabled?: boolean;
12
- heatmap_values?: Partial<Record<ElementSymbol, number | number[] | string | string[]>> | (number | number[] | string | string[])[];
14
+ heatmap_values?: Partial<Record<ElementSymbol, HeatValue | null>> | (HeatValue | null)[];
13
15
  links?: keyof ChemicalElement | Record<ElementSymbol, string> | null;
14
16
  log?: boolean;
15
17
  color_scale?: D3InterpolateName | ((num: number) => string);
@@ -28,7 +30,7 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
28
30
  color_scale_range?: [number | null, number | null];
29
31
  color_overrides?: Partial<Record<ElementSymbol, string>>;
30
32
  labels?: Partial<Record<ElementSymbol, string>>;
31
- missing_color?: string;
33
+ missing?: MissingCellStyle;
32
34
  split_layout?: `diagonal` | `horizontal` | `vertical` | `triangular` | `quadrant`;
33
35
  show_color_bar?: boolean;
34
36
  color_bar_props?: Partial<ComponentProps<typeof ColorBar>>;
@@ -41,7 +43,7 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
41
43
  tooltip?: Snippet<[
42
44
  {
43
45
  element: ChemicalElement;
44
- value: number | number[] | string | string[];
46
+ value: HeatValue | null;
45
47
  active: boolean;
46
48
  bg_color: string | null;
47
49
  scale_context: ScaleContext;
@@ -205,7 +205,7 @@
205
205
  }
206
206
  </script>
207
207
 
208
- <div {...rest} class="controls-grid {rest.class ?? ``}">
208
+ <div {...rest} class={[`controls-grid`, rest.class]}>
209
209
  <section class="category-colors">
210
210
  <h3 id="element-category-colors-reset" style="grid-column: span 2">
211
211
  Element Category Colors
@@ -220,10 +220,7 @@
220
220
  onmouseleave={() => (selected.category = null)}
221
221
  onblur={() => (selected.category = null)}
222
222
  >
223
- <input
224
- type="color"
225
- bind:value={colors.category[category]}
226
- />
223
+ <input type="color" bind:value={colors.category[category]} />
227
224
  <span>{category}</span>
228
225
  {#if colors.category[category] !== DEFAULT_CATEGORY_COLORS[category]}
229
226
  <button
@@ -262,32 +259,14 @@
262
259
 
263
260
  <label>
264
261
  <span>Inner transition offset</span>
265
- <input
266
- type="range"
267
- min="0.1"
268
- max="2"
269
- step="0.1"
270
- bind:value={inner_transition_offset}
271
- />
272
- <input
273
- type="number"
274
- min="0.1"
275
- max="2"
276
- step="0.1"
277
- bind:value={inner_transition_offset}
278
- />
262
+ <input type="range" min="0.1" max="2" step="0.1" bind:value={inner_transition_offset} />
263
+ <input type="number" min="0.1" max="2" step="0.1" bind:value={inner_transition_offset} />
279
264
  <button onclick={() => reset_property(`inner_transition_offset`)}>reset</button>
280
265
  </label>
281
266
 
282
267
  <label>
283
268
  <span>Transition duration (s)</span>
284
- <input
285
- type="range"
286
- min="0.1"
287
- max="2"
288
- step="0.1"
289
- bind:value={tile_transition_duration}
290
- />
269
+ <input type="range" min="0.1" max="2" step="0.1" bind:value={tile_transition_duration} />
291
270
  <input
292
271
  type="number"
293
272
  min="0.1"
@@ -350,39 +329,15 @@
350
329
 
351
330
  <label>
352
331
  <span>Symbol weight</span>
353
- <input
354
- type="range"
355
- min="100"
356
- max="900"
357
- step="100"
358
- bind:value={symbol_font_weight}
359
- />
360
- <input
361
- type="number"
362
- min="100"
363
- max="900"
364
- step="100"
365
- bind:value={symbol_font_weight}
366
- />
332
+ <input type="range" min="100" max="900" step="100" bind:value={symbol_font_weight} />
333
+ <input type="number" min="100" max="900" step="100" bind:value={symbol_font_weight} />
367
334
  <button onclick={() => reset_property(`symbol_font_weight`)}>reset</button>
368
335
  </label>
369
336
 
370
337
  <label>
371
338
  <span>Number weight</span>
372
- <input
373
- type="range"
374
- min="100"
375
- max="900"
376
- step="100"
377
- bind:value={number_font_weight}
378
- />
379
- <input
380
- type="number"
381
- min="100"
382
- max="900"
383
- step="100"
384
- bind:value={number_font_weight}
385
- />
339
+ <input type="range" min="100" max="900" step="100" bind:value={number_font_weight} />
340
+ <input type="number" min="100" max="900" step="100" bind:value={number_font_weight} />
386
341
  <button onclick={() => reset_property(`number_font_weight`)}>reset</button>
387
342
  </label>
388
343
  </section>
@@ -424,13 +379,7 @@
424
379
  <label>
425
380
  <span>Line height</span>
426
381
  <input type="range" min="0.8" max="2" step="0.1" bind:value={tooltip_line_height} />
427
- <input
428
- type="number"
429
- min="0.8"
430
- max="2"
431
- step="0.1"
432
- bind:value={tooltip_line_height}
433
- />
382
+ <input type="number" min="0.8" max="2" step="0.1" bind:value={tooltip_line_height} />
434
383
  <button onclick={() => reset_property(`tooltip_line_height`)}>reset</button>
435
384
  </label>
436
385
 
@@ -449,8 +398,7 @@
449
398
  <style>
450
399
  .controls-grid {
451
400
  display: grid;
452
- grid-template-columns:
453
- var(--ptable-ctrl-columns, repeat(auto-fit, minmax(320px, 1fr)));
401
+ grid-template-columns: var(--ptable-ctrl-columns, repeat(auto-fit, minmax(320px, 1fr)));
454
402
  gap: var(--ptable-ctrl-gap, 1.5em);
455
403
  margin: var(--ptable-ctrl-margin, 2em auto);
456
404
  padding: 0 1em;
@@ -2,12 +2,17 @@
2
2
  import type { Snippet } from 'svelte'
3
3
  import type { HTMLAttributes } from 'svelte/elements'
4
4
 
5
- let { as = `aside`, children, ...rest }:
6
- & HTMLAttributes<HTMLElementTagNameMap[`aside`]>
7
- & { as?: keyof HTMLElementTagNameMap; children?: Snippet } = $props()
5
+ let {
6
+ as = `aside`,
7
+ children,
8
+ ...rest
9
+ }: HTMLAttributes<HTMLElementTagNameMap[`aside`]> & {
10
+ as?: keyof HTMLElementTagNameMap
11
+ children?: Snippet
12
+ } = $props()
8
13
  </script>
9
14
 
10
- <svelte:element this={as} {...rest} class="table-inset {rest.class ?? ``}">
15
+ <svelte:element this={as} {...rest} class={[`table-inset`, rest.class]}>
11
16
  {@render children?.()}
12
17
  </svelte:element>
13
18