matterviz 0.3.1 → 0.3.3

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 (358) hide show
  1. package/dist/EmptyState.svelte +10 -2
  2. package/dist/FilePicker.svelte +154 -96
  3. package/dist/Icon.svelte +20 -14
  4. package/dist/MillerIndexInput.svelte +27 -21
  5. package/dist/api/optimade.js +6 -6
  6. package/dist/app.css +216 -178
  7. package/dist/brillouin/BrillouinZone.svelte +299 -198
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +74 -55
  11. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte +277 -165
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  15. package/dist/brillouin/BrillouinZoneTooltip.svelte +17 -7
  16. package/dist/brillouin/compute.js +11 -6
  17. package/dist/chempot-diagram/ChemPotDiagram.svelte +327 -0
  18. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  19. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +847 -0
  20. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  21. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3194 -0
  22. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  23. package/dist/chempot-diagram/ChemPotScene3D.svelte +11 -0
  24. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  25. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  26. package/dist/chempot-diagram/async-compute.svelte.js +77 -0
  27. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  28. package/dist/chempot-diagram/chempot-worker.js +11 -0
  29. package/dist/chempot-diagram/color.d.ts +10 -0
  30. package/dist/chempot-diagram/color.js +32 -0
  31. package/dist/chempot-diagram/compute.d.ts +48 -0
  32. package/dist/chempot-diagram/compute.js +812 -0
  33. package/dist/chempot-diagram/index.d.ts +6 -0
  34. package/dist/chempot-diagram/index.js +6 -0
  35. package/dist/chempot-diagram/pointer.d.ts +16 -0
  36. package/dist/chempot-diagram/pointer.js +40 -0
  37. package/dist/chempot-diagram/temperature.d.ts +15 -0
  38. package/dist/chempot-diagram/temperature.js +36 -0
  39. package/dist/chempot-diagram/types.d.ts +86 -0
  40. package/dist/chempot-diagram/types.js +28 -0
  41. package/dist/colors/index.d.ts +3 -1
  42. package/dist/colors/index.js +9 -3
  43. package/dist/composition/BarChart.svelte +141 -77
  44. package/dist/composition/BubbleChart.svelte +107 -52
  45. package/dist/composition/Composition.svelte +100 -79
  46. package/dist/composition/Formula.svelte +108 -62
  47. package/dist/composition/FormulaFilter.svelte +973 -353
  48. package/dist/composition/FormulaFilter.svelte.d.ts +35 -1
  49. package/dist/composition/PieChart.svelte +199 -99
  50. package/dist/composition/PieChart.svelte.d.ts +1 -1
  51. package/dist/composition/format.d.ts +5 -0
  52. package/dist/composition/format.js +20 -3
  53. package/dist/composition/parse.js +14 -9
  54. package/dist/convex-hull/ConvexHull.svelte +93 -38
  55. package/dist/convex-hull/ConvexHull2D.svelte +551 -393
  56. package/dist/convex-hull/ConvexHull3D.svelte +1303 -825
  57. package/dist/convex-hull/ConvexHull4D.svelte +1012 -686
  58. package/dist/convex-hull/ConvexHullControls.svelte +115 -28
  59. package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
  60. package/dist/convex-hull/ConvexHullStats.svelte +821 -249
  61. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +6 -1
  62. package/dist/convex-hull/ConvexHullTooltip.svelte +41 -16
  63. package/dist/convex-hull/GasPressureControls.svelte +104 -61
  64. package/dist/convex-hull/StructurePopup.svelte +25 -4
  65. package/dist/convex-hull/TemperatureSlider.svelte +45 -25
  66. package/dist/convex-hull/barycentric-coords.js +13 -7
  67. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  68. package/dist/convex-hull/demo-temperature.js +40 -0
  69. package/dist/convex-hull/gas-thermodynamics.js +17 -12
  70. package/dist/convex-hull/helpers.d.ts +10 -1
  71. package/dist/convex-hull/helpers.js +79 -38
  72. package/dist/convex-hull/index.d.ts +1 -0
  73. package/dist/convex-hull/index.js +1 -0
  74. package/dist/convex-hull/thermodynamics.d.ts +8 -21
  75. package/dist/convex-hull/thermodynamics.js +163 -69
  76. package/dist/convex-hull/types.d.ts +12 -12
  77. package/dist/convex-hull/types.js +0 -12
  78. package/dist/coordination/CoordinationBarPlot.svelte +232 -176
  79. package/dist/element/BohrAtom.svelte +56 -13
  80. package/dist/element/ElementHeading.svelte +7 -2
  81. package/dist/element/ElementPhoto.svelte +15 -9
  82. package/dist/element/ElementStats.svelte +10 -4
  83. package/dist/element/ElementTile.svelte +137 -73
  84. package/dist/element/Nucleus.svelte +39 -11
  85. package/dist/element/data.js +2 -14
  86. package/dist/element/data.json.gz +0 -0
  87. package/dist/element/types.d.ts +1 -0
  88. package/dist/feedback/ClickFeedback.svelte +16 -5
  89. package/dist/feedback/DragOverlay.svelte +10 -2
  90. package/dist/feedback/Spinner.svelte +4 -2
  91. package/dist/feedback/StatusMessage.svelte +8 -2
  92. package/dist/fermi-surface/FermiSlice.svelte +118 -88
  93. package/dist/fermi-surface/FermiSurface.svelte +336 -239
  94. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  95. package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
  96. package/dist/fermi-surface/FermiSurfaceScene.svelte +536 -343
  97. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  98. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
  99. package/dist/fermi-surface/compute.js +16 -20
  100. package/dist/fermi-surface/parse.js +37 -33
  101. package/dist/fermi-surface/symmetry.js +2 -7
  102. package/dist/fermi-surface/types.d.ts +3 -5
  103. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1527 -0
  104. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  105. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  106. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  107. package/dist/heatmap-matrix/index.d.ts +53 -0
  108. package/dist/heatmap-matrix/index.js +100 -0
  109. package/dist/heatmap-matrix/shared.d.ts +2 -0
  110. package/dist/heatmap-matrix/shared.js +4 -0
  111. package/dist/icons.d.ts +111 -0
  112. package/dist/icons.js +158 -0
  113. package/dist/index.d.ts +5 -2
  114. package/dist/index.js +5 -2
  115. package/dist/io/decompress.js +1 -1
  116. package/dist/io/export.d.ts +3 -0
  117. package/dist/io/export.js +138 -140
  118. package/dist/io/file-drop.d.ts +7 -0
  119. package/dist/io/file-drop.js +43 -0
  120. package/dist/io/index.d.ts +2 -2
  121. package/dist/io/index.js +2 -112
  122. package/dist/io/is-binary.js +2 -3
  123. package/dist/io/types.d.ts +1 -0
  124. package/dist/io/url-drop.d.ts +2 -0
  125. package/dist/io/url-drop.js +117 -0
  126. package/dist/isosurface/Isosurface.svelte +220 -110
  127. package/dist/isosurface/IsosurfaceControls.svelte +65 -28
  128. package/dist/isosurface/parse.js +104 -56
  129. package/dist/isosurface/slice.d.ts +2 -1
  130. package/dist/isosurface/slice.js +8 -13
  131. package/dist/isosurface/types.d.ts +14 -1
  132. package/dist/isosurface/types.js +152 -5
  133. package/dist/labels.d.ts +2 -1
  134. package/dist/labels.js +12 -8
  135. package/dist/layout/FullscreenToggle.svelte +11 -2
  136. package/dist/layout/InfoCard.svelte +38 -6
  137. package/dist/layout/InfoTag.svelte +125 -94
  138. package/dist/layout/PropertyFilter.svelte +82 -37
  139. package/dist/layout/SettingsSection.svelte +85 -55
  140. package/dist/layout/SubpageGrid.svelte +82 -0
  141. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  142. package/dist/layout/index.d.ts +1 -0
  143. package/dist/layout/index.js +1 -0
  144. package/dist/layout/json-tree/JsonNode.svelte +266 -223
  145. package/dist/layout/json-tree/JsonTree.svelte +516 -429
  146. package/dist/layout/json-tree/JsonTree.svelte.d.ts +1 -1
  147. package/dist/layout/json-tree/JsonValue.svelte +281 -173
  148. package/dist/layout/json-tree/types.d.ts +10 -2
  149. package/dist/layout/json-tree/utils.d.ts +2 -0
  150. package/dist/layout/json-tree/utils.js +37 -2
  151. package/dist/marching-cubes.js +25 -2
  152. package/dist/math.d.ts +20 -17
  153. package/dist/math.js +474 -57
  154. package/dist/overlays/ContextMenu.svelte +66 -40
  155. package/dist/overlays/DraggablePane.svelte +331 -154
  156. package/dist/overlays/DraggablePane.svelte.d.ts +2 -0
  157. package/dist/periodic-table/PeriodicTable.svelte +278 -145
  158. package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
  159. package/dist/periodic-table/PropertySelect.svelte +25 -7
  160. package/dist/periodic-table/TableInset.svelte +8 -3
  161. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +559 -267
  162. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -2
  163. package/dist/phase-diagram/PhaseDiagramControls.svelte +131 -51
  164. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +3 -2
  165. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  166. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  167. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +160 -110
  168. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +8 -1
  169. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +217 -86
  170. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +6 -3
  171. package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
  172. package/dist/phase-diagram/build-diagram.js +9 -9
  173. package/dist/phase-diagram/colors.js +1 -3
  174. package/dist/phase-diagram/index.d.ts +2 -0
  175. package/dist/phase-diagram/index.js +2 -0
  176. package/dist/phase-diagram/parse.js +10 -9
  177. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  178. package/dist/phase-diagram/svg-to-diagram.js +869 -0
  179. package/dist/phase-diagram/types.d.ts +10 -0
  180. package/dist/phase-diagram/utils.d.ts +8 -4
  181. package/dist/phase-diagram/utils.js +219 -74
  182. package/dist/plot/AxisLabel.svelte +51 -0
  183. package/dist/plot/AxisLabel.svelte.d.ts +16 -0
  184. package/dist/plot/BarPlot.svelte +1461 -768
  185. package/dist/plot/BarPlot.svelte.d.ts +3 -3
  186. package/dist/plot/BarPlotControls.svelte +33 -6
  187. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  188. package/dist/plot/ColorBar.svelte +533 -383
  189. package/dist/plot/ColorBar.svelte.d.ts +1 -1
  190. package/dist/plot/ColorScaleSelect.svelte +28 -7
  191. package/dist/plot/ElementScatter.svelte +38 -16
  192. package/dist/plot/FillArea.svelte +152 -92
  193. package/dist/plot/Histogram.svelte +1162 -709
  194. package/dist/plot/Histogram.svelte.d.ts +1 -1
  195. package/dist/plot/HistogramControls.svelte +81 -18
  196. package/dist/plot/HistogramControls.svelte.d.ts +6 -2
  197. package/dist/plot/InteractiveAxisLabel.svelte +34 -11
  198. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
  199. package/dist/plot/Line.svelte +63 -28
  200. package/dist/plot/PlotControls.svelte +221 -96
  201. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  202. package/dist/plot/PlotLegend.svelte +174 -91
  203. package/dist/plot/PlotTooltip.svelte +45 -6
  204. package/dist/plot/PortalSelect.svelte +175 -146
  205. package/dist/plot/ReferenceLine.svelte +77 -22
  206. package/dist/plot/ReferenceLine.svelte.d.ts +1 -0
  207. package/dist/plot/ReferenceLine3D.svelte +132 -107
  208. package/dist/plot/ReferencePlane.svelte +146 -123
  209. package/dist/plot/ScatterPlot.svelte +1880 -1156
  210. package/dist/plot/ScatterPlot.svelte.d.ts +3 -3
  211. package/dist/plot/ScatterPlot3D.svelte +256 -131
  212. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  213. package/dist/plot/ScatterPlot3DControls.svelte +300 -297
  214. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
  215. package/dist/plot/ScatterPlot3DScene.svelte +608 -406
  216. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  217. package/dist/plot/ScatterPlotControls.svelte +150 -70
  218. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  219. package/dist/plot/ScatterPoint.svelte +98 -26
  220. package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
  221. package/dist/plot/SpacegroupBarPlot.svelte +142 -85
  222. package/dist/plot/Surface3D.svelte +159 -108
  223. package/dist/plot/ZeroLines.svelte +96 -0
  224. package/dist/plot/ZeroLines.svelte.d.ts +32 -0
  225. package/dist/plot/ZoomRect.svelte +23 -0
  226. package/dist/plot/ZoomRect.svelte.d.ts +8 -0
  227. package/dist/plot/axis-utils.d.ts +1 -1
  228. package/dist/plot/axis-utils.js +1 -3
  229. package/dist/plot/data-cleaning.js +12 -28
  230. package/dist/plot/data-transform.js +2 -1
  231. package/dist/plot/fill-utils.js +2 -0
  232. package/dist/plot/index.d.ts +6 -2
  233. package/dist/plot/index.js +6 -2
  234. package/dist/plot/interactions.d.ts +8 -10
  235. package/dist/plot/interactions.js +2 -3
  236. package/dist/plot/layout.d.ts +11 -2
  237. package/dist/plot/layout.js +44 -17
  238. package/dist/plot/reference-line.d.ts +5 -22
  239. package/dist/plot/reference-line.js +12 -84
  240. package/dist/plot/scales.js +24 -36
  241. package/dist/plot/types.d.ts +53 -40
  242. package/dist/plot/types.js +12 -7
  243. package/dist/plot/utils/label-placement.d.ts +32 -15
  244. package/dist/plot/utils/label-placement.js +227 -63
  245. package/dist/plot/utils/series-visibility.js +2 -3
  246. package/dist/plot/utils.d.ts +1 -0
  247. package/dist/plot/utils.js +14 -0
  248. package/dist/rdf/RdfPlot.svelte +173 -132
  249. package/dist/rdf/calc-rdf.js +4 -5
  250. package/dist/sanitize.d.ts +4 -0
  251. package/dist/sanitize.js +107 -0
  252. package/dist/settings.d.ts +21 -6
  253. package/dist/settings.js +63 -19
  254. package/dist/spectral/Bands.svelte +963 -412
  255. package/dist/spectral/Bands.svelte.d.ts +22 -2
  256. package/dist/spectral/BandsAndDos.svelte +90 -49
  257. package/dist/spectral/BrillouinBandsDos.svelte +151 -93
  258. package/dist/spectral/Dos.svelte +389 -258
  259. package/dist/spectral/helpers.d.ts +23 -1
  260. package/dist/spectral/helpers.js +119 -51
  261. package/dist/spectral/types.d.ts +2 -0
  262. package/dist/state.svelte.d.ts +1 -1
  263. package/dist/state.svelte.js +3 -2
  264. package/dist/structure/Arrow.svelte +59 -20
  265. package/dist/structure/AtomLegend.svelte +231 -129
  266. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  267. package/dist/structure/Bond.svelte +73 -47
  268. package/dist/structure/CanvasTooltip.svelte +10 -2
  269. package/dist/structure/CellSelect.svelte +148 -51
  270. package/dist/structure/Cylinder.svelte +33 -17
  271. package/dist/structure/Lattice.svelte +88 -33
  272. package/dist/structure/Structure.svelte +1077 -821
  273. package/dist/structure/Structure.svelte.d.ts +1 -1
  274. package/dist/structure/StructureControls.svelte +373 -139
  275. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  276. package/dist/structure/StructureExportPane.svelte +124 -89
  277. package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
  278. package/dist/structure/StructureInfoPane.svelte +304 -231
  279. package/dist/structure/StructureScene.svelte +919 -445
  280. package/dist/structure/StructureScene.svelte.d.ts +16 -7
  281. package/dist/structure/atom-properties.d.ts +6 -2
  282. package/dist/structure/atom-properties.js +42 -29
  283. package/dist/structure/bonding.js +6 -7
  284. package/dist/structure/export.js +22 -34
  285. package/dist/structure/ferrox-wasm-types.d.ts +3 -2
  286. package/dist/structure/ferrox-wasm-types.js +0 -3
  287. package/dist/structure/ferrox-wasm.d.ts +3 -2
  288. package/dist/structure/ferrox-wasm.js +2 -3
  289. package/dist/structure/index.d.ts +16 -0
  290. package/dist/structure/index.js +88 -6
  291. package/dist/structure/measure.d.ts +2 -2
  292. package/dist/structure/measure.js +4 -44
  293. package/dist/structure/parse.js +130 -155
  294. package/dist/structure/partial-occupancy.d.ts +25 -0
  295. package/dist/structure/partial-occupancy.js +99 -0
  296. package/dist/structure/pbc.d.ts +1 -0
  297. package/dist/structure/pbc.js +16 -6
  298. package/dist/structure/supercell.d.ts +2 -2
  299. package/dist/structure/supercell.js +12 -22
  300. package/dist/structure/validation.js +5 -3
  301. package/dist/symmetry/SymmetryStats.svelte +94 -37
  302. package/dist/symmetry/WyckoffTable.svelte +42 -14
  303. package/dist/symmetry/cell-transform.js +5 -3
  304. package/dist/symmetry/index.d.ts +7 -4
  305. package/dist/symmetry/index.js +87 -21
  306. package/dist/symmetry/spacegroups.js +148 -148
  307. package/dist/table/HeatmapTable.svelte +1112 -516
  308. package/dist/table/HeatmapTable.svelte.d.ts +12 -1
  309. package/dist/table/ToggleMenu.svelte +125 -90
  310. package/dist/table/index.d.ts +2 -0
  311. package/dist/table/index.js +2 -4
  312. package/dist/theme/ThemeControl.svelte +21 -12
  313. package/dist/time.js +4 -1
  314. package/dist/tooltip/TooltipContent.svelte +33 -8
  315. package/dist/trajectory/Trajectory.svelte +889 -687
  316. package/dist/trajectory/TrajectoryError.svelte +14 -3
  317. package/dist/trajectory/TrajectoryExportPane.svelte +148 -90
  318. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +1 -1
  319. package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
  320. package/dist/trajectory/constants.d.ts +6 -0
  321. package/dist/trajectory/constants.js +7 -0
  322. package/dist/trajectory/extract.js +13 -31
  323. package/dist/trajectory/format-detect.d.ts +9 -0
  324. package/dist/trajectory/format-detect.js +76 -0
  325. package/dist/trajectory/frame-reader.d.ts +17 -0
  326. package/dist/trajectory/frame-reader.js +332 -0
  327. package/dist/trajectory/helpers.d.ts +14 -0
  328. package/dist/trajectory/helpers.js +172 -0
  329. package/dist/trajectory/index.d.ts +1 -0
  330. package/dist/trajectory/index.js +23 -14
  331. package/dist/trajectory/parse/ase.d.ts +2 -0
  332. package/dist/trajectory/parse/ase.js +77 -0
  333. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  334. package/dist/trajectory/parse/hdf5.js +129 -0
  335. package/dist/trajectory/parse/index.d.ts +12 -0
  336. package/dist/trajectory/parse/index.js +299 -0
  337. package/dist/trajectory/parse/lammps.d.ts +5 -0
  338. package/dist/trajectory/parse/lammps.js +179 -0
  339. package/dist/trajectory/parse/vasp.d.ts +2 -0
  340. package/dist/trajectory/parse/vasp.js +68 -0
  341. package/dist/trajectory/parse/xyz.d.ts +2 -0
  342. package/dist/trajectory/parse/xyz.js +110 -0
  343. package/dist/trajectory/plotting.js +13 -8
  344. package/dist/trajectory/types.d.ts +11 -0
  345. package/dist/trajectory/types.js +1 -0
  346. package/dist/utils.d.ts +3 -0
  347. package/dist/utils.js +17 -0
  348. package/dist/xrd/XrdPlot.svelte +337 -245
  349. package/dist/xrd/broadening.js +14 -9
  350. package/dist/xrd/calc-xrd.js +12 -19
  351. package/dist/xrd/parse.d.ts +1 -1
  352. package/dist/xrd/parse.js +17 -17
  353. package/package.json +103 -101
  354. package/readme.md +4 -4
  355. package/dist/trajectory/parse.d.ts +0 -42
  356. package/dist/trajectory/parse.js +0 -1267
  357. /package/dist/element/{data.json.d.ts → data.json.gz.d.ts} +0 -0
  358. /package/dist/theme/{themes.js → themes.mjs} +0 -0
@@ -1,168 +1,300 @@
1
- <script lang="ts">import { is_color } from '../colors';
2
- import { element_data, ElementPhoto, ElementTile } from '../element';
3
- import { ELEM_SYMBOLS } from '../labels';
4
- import { ColorBar } from '../plot';
5
- import { colors } from '../state.svelte';
6
- import * as d3_sc from 'd3-scale-chromatic';
7
- import { TableInset } from './index';
8
- const default_f_block_inset_tiles = [
1
+ <script lang="ts">
2
+ import { is_color } from '../colors'
3
+ import type { ChemicalElement, ElementCategory, ElementSymbol } from '../element'
4
+ import { element_data, ElementPhoto, ElementTile } from '../element'
5
+ import { ELEM_SYMBOLS } from '../labels'
6
+ import type { Vec2 } from '../math'
7
+ import type { XyObj } from '../plot'
8
+ import { ColorBar } from '../plot'
9
+ import { colors } from '../state.svelte'
10
+ import * as d3_sc from 'd3-scale-chromatic'
11
+ import type { ComponentProps, Snippet } from 'svelte'
12
+ import type { HTMLAttributes } from 'svelte/elements'
13
+ import type { D3InterpolateName } from '../colors'
14
+ import type { ScaleContext } from './index'
15
+ import { TableInset } from './index'
16
+
17
+ const default_f_block_inset_tiles = [
9
18
  { name: `Lanthanides`, symbol: `La-Lu`, number: `57-71`, category: `lanthanide` },
10
19
  { name: `Actinides`, symbol: `Ac-Lr`, number: `89-103`, category: `actinide` },
11
- ];
12
- let { tile_props, show_photo = false, disabled = false, heatmap_values = [], links = null, log = false, color_scale = $bindable(`interpolateViridis`), active_element = $bindable(null), active_category = $bindable(null), active_elements = $bindable([]), gap = `0.3cqw`, inner_transition_metal_offset = 0.5, lanth_act_tiles = tile_props?.show_symbol == false
13
- ? []
14
- : [...default_f_block_inset_tiles], lanth_act_style = ``, color_scale_range = [null, null], color_overrides = {}, labels = {}, missing_color = `element-category`, split_layout = undefined, show_color_bar = true, color_bar_props = {}, inset, bottom_left_inset, tooltip = false, onenter, children, ...rest } = $props();
15
- let heat_values = $derived.by(() => {
20
+ ] as const
21
+ let {
22
+ tile_props,
23
+ show_photo = false,
24
+ disabled = false,
25
+ heatmap_values = [],
26
+ links = null,
27
+ log = false,
28
+ color_scale = $bindable(`interpolateViridis`),
29
+ active_element = $bindable(null),
30
+ active_category = $bindable(null),
31
+ active_elements = $bindable([]),
32
+ gap = `0.3cqw`,
33
+ inner_transition_metal_offset = 0.5,
34
+ lanth_act_tiles = tile_props?.show_symbol == false
35
+ ? []
36
+ : [...default_f_block_inset_tiles],
37
+ lanth_act_style = ``,
38
+ color_scale_range = [null, null],
39
+ color_overrides = {},
40
+ labels = {},
41
+ missing_color = `element-category`,
42
+ split_layout = undefined,
43
+ show_color_bar = true,
44
+ color_bar_props = {},
45
+ inset,
46
+ bottom_left_inset,
47
+ tooltip = false,
48
+ onenter,
49
+ children,
50
+ ...rest
51
+ }: HTMLAttributes<HTMLDivElement> & {
52
+ tile_props?: Partial<ComponentProps<typeof ElementTile>>
53
+ show_photo?: boolean
54
+ disabled?: boolean // disable hover and click events from updating active_element
55
+ // either array of numbers/colors (can be partial, missing elements default to 0) or object with
56
+ // element symbol as key and heat value as value
57
+ // NEW: each value can now be a single number/color or array of 1-4 numbers/colors for multi-segment display
58
+ heatmap_values?:
59
+ | Partial<Record<ElementSymbol, number | number[] | string | string[]>>
60
+ | (number | number[] | string | string[])[]
61
+ // links is either string with element property (name, symbol, number, ...) to use as link,
62
+ // or object with mapping element symbols to link
63
+ links?: keyof ChemicalElement | Record<ElementSymbol, string> | null
64
+ log?: boolean
65
+ color_scale?: D3InterpolateName | ((num: number) => string)
66
+ active_element?: ChemicalElement | null
67
+ active_category?: ElementCategory | null
68
+ // array of element symbols or ChemicalElement objects to highlight
69
+ active_elements?: (ElementSymbol | ChemicalElement)[]
70
+ gap?: string // gap between element tiles, default is 0.3% of container width
71
+ inner_transition_metal_offset?: number
72
+ // show lanthanides and actinides as tiles
73
+ lanth_act_tiles?: {
74
+ name: string
75
+ symbol: string
76
+ number: string
77
+ category: ElementCategory
78
+ }[]
79
+ lanth_act_style?: string
80
+ color_scale_range?: [number | null, number | null]
81
+ color_overrides?: Partial<Record<ElementSymbol, string>>
82
+ labels?: Partial<Record<ElementSymbol, string>>
83
+ // background color for elements missing from heatmap_values
84
+ // "element-category" falls back to element category default color
85
+ missing_color?: string
86
+ // control the layout of multi-value splits for all tiles
87
+ split_layout?: `diagonal` | `horizontal` | `vertical` | `triangular` | `quadrant`
88
+ // automatically show a color bar when heatmap_values is provided (default: true)
89
+ show_color_bar?: boolean
90
+ // props to pass to the ColorBar component (e.g. { title: 'Bar Title', tick_labels: 5 })
91
+ color_bar_props?: Partial<ComponentProps<typeof ColorBar>>
92
+ inset?: Snippet<[{ active_element: ChemicalElement | null }]>
93
+ bottom_left_inset?: Snippet<[{ active_element: ChemicalElement | null }]>
94
+ tooltip?:
95
+ | Snippet<
96
+ [
97
+ {
98
+ element: ChemicalElement
99
+ value: number | number[] | string | string[]
100
+ active: boolean
101
+ bg_color: string | null
102
+ scale_context: ScaleContext
103
+ },
104
+ ]
105
+ >
106
+ | boolean
107
+ children?: Snippet
108
+ onenter?: (element: ChemicalElement) => void
109
+ } = $props()
110
+
111
+ let heat_values = $derived.by(() => {
16
112
  if (Array.isArray(heatmap_values)) {
17
- if (heatmap_values.length > 118) {
18
- console.error(`heatmap_values is an array of numbers/arrays, length should be 118 or less, one for ` +
19
- `each element possibly omitting elements at the end, got ${heatmap_values.length}`);
20
- return [];
21
- }
22
- else
23
- return heatmap_values;
24
- }
25
- else if (typeof heatmap_values == `object`) {
26
- const bad_keys = Object.keys(heatmap_values).filter((key) => !ELEM_SYMBOLS.includes(key));
27
- if (bad_keys.length > 0) {
28
- console.error(`heatmap_values is an object, keys should be element symbols, got ${bad_keys}`);
29
- return [];
30
- }
31
- return ELEM_SYMBOLS.map((symbol) => heatmap_values[symbol] ?? 0);
113
+ if (heatmap_values.length > 118) {
114
+ console.error(
115
+ `heatmap_values is an array of numbers/arrays, length should be 118 or less, one for ` +
116
+ `each element possibly omitting elements at the end, got ${heatmap_values.length}`,
117
+ )
118
+ return []
119
+ } else return heatmap_values
120
+ } else if (typeof heatmap_values == `object`) {
121
+ const bad_keys = Object.keys(heatmap_values).filter(
122
+ (key) => !ELEM_SYMBOLS.includes(key as ElementSymbol),
123
+ )
124
+ if (bad_keys.length > 0) {
125
+ console.error(
126
+ `heatmap_values is an object, keys should be element symbols, got ${bad_keys}`,
127
+ )
128
+ return []
129
+ }
130
+ return ELEM_SYMBOLS.map((symbol) => heatmap_values[symbol] ?? 0)
32
131
  }
33
- return [];
34
- });
35
- let set_active_element = $derived((element) => () => {
36
- if (disabled)
37
- return;
38
- active_element = element;
39
- });
40
- let window_width = $state(0);
41
- let tooltip_element = $state(null);
42
- let tooltip_pos = $state({ x: 0, y: 0 });
43
- let tooltip_visible = $state(false);
44
- function handle_key(event) {
45
- if (disabled || !active_element)
46
- return;
47
- if (event.key == `Enter`)
48
- onenter?.(active_element);
49
- const arrow_keys = [`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`];
50
- if (!arrow_keys.includes(event.key))
51
- return;
52
- event.preventDefault(); // prevent scrolling the page
53
- event.stopPropagation();
132
+ return []
133
+ })
134
+
135
+ let set_active_element = $derived((element: ChemicalElement | null) => () => {
136
+ if (disabled) return
137
+ active_element = element
138
+ })
139
+
140
+ let window_width: number = $state(0)
141
+ let tooltip_element: ChemicalElement | null = $state(null)
142
+ let tooltip_pos: XyObj = $state({ x: 0, y: 0 })
143
+ let tooltip_visible: boolean = $state(false)
144
+
145
+ function handle_key(event: KeyboardEvent) {
146
+ if (disabled || !active_element) return
147
+ if (event.key == `Enter`) onenter?.(active_element)
148
+
149
+ const arrow_keys = [`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`]
150
+ if (!arrow_keys.includes(event.key)) return
151
+
152
+ event.preventDefault() // prevent scrolling the page
153
+ event.stopPropagation()
154
+
54
155
  // Arrow key navigation including lanthanides (row 9) and actinides (row 10)
55
- const { column: col, row } = active_element;
56
- const in_f_block = col >= 3 && col <= 17;
57
- const row_map = {
58
- ArrowUp: row === 9 ? 6 : row === 10 ? 7 : row - 1,
59
- ArrowDown: row === 6 && in_f_block ? 9 : row === 7 && in_f_block ? 10 : row + 1,
60
- };
61
- const target_row = row_map[event.key] ?? row;
156
+ const { column: col, row } = active_element
157
+ const in_f_block = col >= 3 && col <= 17
158
+ const row_map: Record<string, number> = {
159
+ ArrowUp: row === 9 ? 6 : row === 10 ? 7 : row - 1,
160
+ ArrowDown: row === 6 && in_f_block ? 9 : row === 7 && in_f_block ? 10 : row + 1,
161
+ }
162
+ const target_row = row_map[event.key] ?? row
62
163
  const target_col = event.key === `ArrowLeft`
63
- ? col - 1
64
- : event.key === `ArrowRight`
65
- ? col + 1
66
- : col;
164
+ ? col - 1
165
+ : event.key === `ArrowRight`
166
+ ? col + 1
167
+ : col
67
168
  active_element =
68
- element_data.find((el) => el.column === target_col && el.row === target_row) ??
69
- active_element;
70
- }
71
- function handle_tooltip_enter(element, event) {
72
- if (tooltip === false || disabled)
73
- return;
74
- tooltip_element = element;
75
- const target = event.currentTarget;
76
- const rect = target.getBoundingClientRect();
77
- const container_rect = target.closest(`.periodic-table`)?.getBoundingClientRect();
169
+ element_data.find((el) => el.column === target_col && el.row === target_row) ??
170
+ active_element
171
+ }
172
+
173
+ function handle_tooltip_enter(element: ChemicalElement, event: MouseEvent) {
174
+ if (tooltip === false || disabled) return
175
+ tooltip_element = element
176
+ const target = event.currentTarget as HTMLElement
177
+ const rect = target.getBoundingClientRect()
178
+ const container_rect = target.closest(`.ptable-grid`)?.getBoundingClientRect()
78
179
  if (container_rect) {
79
- tooltip_pos = {
80
- x: rect.left - container_rect.left + rect.width / 2,
81
- y: rect.bottom - container_rect.top + 8,
82
- };
180
+ tooltip_pos = {
181
+ x: rect.left - container_rect.left + rect.width / 2,
182
+ y: rect.bottom - container_rect.top + 8,
183
+ }
83
184
  }
84
- tooltip_visible = true;
85
- }
86
- let color_scale_fn = $derived(typeof color_scale == `string` ? d3_sc[color_scale] : color_scale);
87
- let cs_min = $derived(color_scale_range[0] ??
88
- (heat_values.length
89
- ? Math.min(...heat_values.flat().filter((v) => typeof v === `number`))
90
- : 0));
91
- let cs_max = $derived(color_scale_range[1] ??
92
- (heat_values.length
93
- ? Math.max(...heat_values.flat().filter((v) => typeof v === `number`))
94
- : 1));
95
- let bg_color = $derived((value, element) => {
96
- if (Array.isArray(value)) {
185
+ tooltip_visible = true
186
+ }
187
+
188
+ let color_scale_fn = $derived(
189
+ typeof color_scale == `string` ? d3_sc[color_scale] : color_scale,
190
+ )
191
+
192
+ let cs_min = $derived(
193
+ color_scale_range[0] ??
194
+ (heat_values.length
195
+ ? Math.min(
196
+ ...heat_values.flat().filter((v): v is number => typeof v === `number`),
197
+ )
198
+ : 0),
199
+ )
200
+ let cs_max = $derived(
201
+ color_scale_range[1] ??
202
+ (heat_values.length
203
+ ? Math.max(
204
+ ...heat_values.flat().filter((v): v is number => typeof v === `number`),
205
+ )
206
+ : 1),
207
+ )
208
+
209
+ let bg_color = $derived(
210
+ (
211
+ value: number | number[] | string | string[] | false,
212
+ element?: ChemicalElement,
213
+ ): string | null => {
214
+ if (Array.isArray(value)) {
97
215
  // For arrays, return the color of the first value (used as fallback)
98
- return bg_color(value[0], element);
99
- }
100
- // If it's already a color string, return it directly
101
- if (is_color(value))
102
- return value;
103
- // Return missing color for zero/invalid values or when no heatmap data
104
- if (!value ||
216
+ return bg_color(value[0], element)
217
+ }
218
+
219
+ // If it's already a color string, return it directly
220
+ if (is_color(value)) return value as string
221
+
222
+ // Return missing color for zero/invalid values or when no heatmap data
223
+ if (
224
+ !value ||
105
225
  value === 0 ||
106
226
  (log && value <= 0) ||
107
227
  !heat_values?.length ||
108
- !color_scale_fn) {
228
+ !color_scale_fn
229
+ ) {
109
230
  // Use missing color for zero/missing values or when no heatmap data
110
231
  if (missing_color === `element-category` && element) {
111
- return colors.category[element.category] || `#cccccc`;
232
+ return colors.category[element.category] || `#cccccc`
112
233
  }
113
- return missing_color;
114
- }
115
- // map value to [0, 1] range
116
- const span = cs_max - cs_min;
117
- if (span === 0)
118
- return color_scale_fn?.(0.5); // midpoint when all values equal
119
- if (log)
120
- value = Math.log(value - cs_min + 1) / Math.log(span + 1);
121
- else
122
- value = (value - cs_min) / span;
123
- return color_scale_fn?.(value);
124
- });
125
- let bg_colors = $derived((value, element) => {
126
- if (!Array.isArray(value))
127
- return [];
128
- return value.map((v) => {
234
+ return missing_color
235
+ }
236
+
237
+ // map value to [0, 1] range
238
+ const span = cs_max - cs_min
239
+ if (span === 0) return color_scale_fn?.(0.5) // midpoint when all values equal
240
+
241
+ if (log) value = Math.log((value as number) - cs_min + 1) / Math.log(span + 1)
242
+ else value = ((value as number) - cs_min) / span
243
+ return color_scale_fn?.(value as number)
244
+ },
245
+ )
246
+
247
+ let bg_colors = $derived(
248
+ (
249
+ value: number | number[] | string | string[] | false,
250
+ element?: ChemicalElement,
251
+ ) => {
252
+ if (!Array.isArray(value)) return []
253
+
254
+ return value.map((v) => {
129
255
  // If it's already a color string, return it directly
130
- if (is_color(v))
131
- return v;
256
+ if (is_color(v)) return v as string
132
257
  // Otherwise, map it through the color scale
133
- return bg_color(v, element);
134
- });
135
- });
136
- // Determine whether to automatically show the color bar
137
- let should_show_color_bar = $derived.by(() => {
138
- if (!show_color_bar || inset || heat_values.length === 0)
139
- return false;
258
+ return bg_color(v as number, element)
259
+ })
260
+ },
261
+ )
262
+
263
+ // Determine whether to automatically show the color bar
264
+ let should_show_color_bar = $derived.by(() => {
265
+ if (!show_color_bar || inset || heat_values.length === 0) return false
266
+
140
267
  const num_vals = heat_values
141
- .flat()
142
- .filter((v) => typeof v === `number`);
143
- const usable_values = log ? num_vals.filter((v) => v > 0) : num_vals;
144
- return usable_values.length > 0;
145
- });
146
- // Calculate heat range for color bar
147
- let heat_range = $derived.by(() => {
148
- if (!should_show_color_bar)
149
- return [0, 1];
268
+ .flat()
269
+ .filter((v): v is number => typeof v === `number`)
270
+
271
+ const usable_values = log ? num_vals.filter((v) => v > 0) : num_vals
272
+
273
+ return usable_values.length > 0
274
+ })
275
+
276
+ // Calculate heat range for color bar
277
+ let heat_range = $derived.by((): Vec2 => {
278
+ if (!should_show_color_bar) return [0, 1]
279
+
150
280
  const numeric_values = heat_values
151
- .flat()
152
- .filter((v) => typeof v === `number`);
153
- const usable_values = log ? numeric_values.filter((v) => v > 0) : numeric_values;
154
- if (usable_values.length === 0)
155
- return [0, 1];
156
- const min = color_scale_range[0] ?? Math.min(...usable_values);
157
- const max = color_scale_range[1] ?? Math.max(...usable_values);
158
- return [min, max];
159
- });
281
+ .flat()
282
+ .filter((v): v is number => typeof v === `number`)
283
+ const usable_values = log ? numeric_values.filter((v) => v > 0) : numeric_values
284
+
285
+ if (usable_values.length === 0) return [0, 1]
286
+
287
+ const min = color_scale_range[0] ?? Math.min(...usable_values)
288
+ const max = color_scale_range[1] ?? Math.max(...usable_values)
289
+
290
+ return [min, max]
291
+ })
160
292
  </script>
161
293
 
162
294
  <svelte:window bind:innerWidth={window_width} onkeydown={handle_key} />
163
295
 
164
- <div {...rest} class="periodic-table-container {rest.class ?? ``}">
165
- <div class="periodic-table" style:gap>
296
+ <div {...rest} class="periodic-table {rest.class ?? ``}">
297
+ <div class="ptable-grid" style:gap>
166
298
  {#if should_show_color_bar}
167
299
  <TableInset class="auto-colorbar-inset">
168
300
  <ColorBar
@@ -275,11 +407,12 @@ let heat_range = $derived.by(() => {
275
407
  </div>
276
408
 
277
409
  <style>
278
- .periodic-table-container {
410
+ .periodic-table {
279
411
  /* needed for gap: 0.3cqw; to work */
280
412
  container-type: inline-size;
413
+ width: 100%; /* prevent collapse in shrink-to-fit contexts (inline-size containment) */
281
414
  }
282
- div.periodic-table {
415
+ .ptable-grid {
283
416
  display: grid;
284
417
  grid-template-columns: repeat(18, 1fr);
285
418
  position: relative;
@@ -287,13 +420,13 @@ let heat_range = $derived.by(() => {
287
420
  gap: var(--ptable-gap, 0.3cqw);
288
421
  }
289
422
  /* Auto-generated color bar inset with fluid responsive sizing using container query units */
290
- div.periodic-table :global(.auto-colorbar-inset) {
423
+ .ptable-grid :global(.auto-colorbar-inset) {
291
424
  place-items: center;
292
425
  padding: clamp(0.3em, 1.5cqw, 1em) clamp(0.4em, 3cqw, 2em);
293
426
  --cbar-font-size: clamp(7pt, 1.8cqw, 9pt);
294
427
  --cbar-thickness: clamp(8px, 2.5cqw, 14px);
295
428
  }
296
- div.periodic-table :global(.auto-colorbar-inset .colorbar) {
429
+ .ptable-grid :global(.auto-colorbar-inset .colorbar) {
297
430
  width: 90%;
298
431
  }
299
432
  div.spacer {