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,17 +1,51 @@
1
1
  import type { HTMLAttributes } from 'svelte/elements';
2
2
  import type { FormulaSearchMode } from './index';
3
+ type SearchExampleCategory = {
4
+ label: string;
5
+ description: string;
6
+ examples: string[];
7
+ };
8
+ export type FormulaFilterToken = {
9
+ raw: string;
10
+ element: string;
11
+ operator: `include` | `exclude`;
12
+ constraint: string | null;
13
+ is_wildcard: boolean;
14
+ is_valid: boolean;
15
+ };
16
+ export type FormulaFilterParseResult = {
17
+ value: string;
18
+ normalized_value: string;
19
+ search_mode: FormulaSearchMode;
20
+ tokens: FormulaFilterToken[];
21
+ has_wildcards: boolean;
22
+ is_valid: boolean;
23
+ error_message: string | null;
24
+ };
25
+ export type FormulaFilterValidation = {
26
+ state: `valid` | `warning` | `invalid`;
27
+ message: string | null;
28
+ };
3
29
  type $$ComponentProps = {
4
30
  value: string;
5
31
  search_mode?: FormulaSearchMode;
6
32
  input_element?: HTMLInputElement | null;
7
33
  show_clear_button?: boolean;
8
34
  show_examples?: boolean;
35
+ show_mode_lock?: boolean;
36
+ show_chip_editor?: boolean;
37
+ normalize_exact?: boolean;
38
+ examples?: SearchExampleCategory[];
9
39
  disabled?: boolean;
40
+ mode_locked?: boolean;
10
41
  max_history?: number;
11
42
  history_key?: string;
43
+ validate?: (value: string, search_mode: FormulaSearchMode, parsed: FormulaFilterParseResult) => FormulaFilterValidation | null;
44
+ onparse?: (parsed: FormulaFilterParseResult) => void;
45
+ on_validation?: (validation: FormulaFilterValidation) => void;
12
46
  onchange?: (value: string, search_mode: FormulaSearchMode) => void;
13
47
  onclear?: () => void;
14
48
  } & HTMLAttributes<HTMLDivElement>;
15
- declare const FormulaFilter: import("svelte").Component<$$ComponentProps, {}, "value" | "search_mode" | "input_element">;
49
+ declare const FormulaFilter: import("svelte").Component<$$ComponentProps, {}, "value" | "search_mode" | "input_element" | "mode_locked">;
16
50
  type FormulaFilter = ReturnType<typeof FormulaFilter>;
17
51
  export default FormulaFilter;
@@ -1,107 +1,208 @@
1
- <script lang="ts">import { format_num } from '../labels';
2
- import { ELEMENT_COLOR_SCHEMES, pick_contrast_color } from '../colors';
3
- import { get_chart_font_scale } from './index';
4
- import { count_atoms_in_composition, fractional_composition } from './parse';
5
- // Constants for pie chart calculations
6
- const VERY_THIN_SLICE_THRESHOLD = 20; // degrees
7
- const MEDIUM_SLICE_THRESHOLD = 90; // degrees - increased to move more slices toward outer edge
8
- const MAX_ANGLE_FOR_FULL_SCALE = 120; // degrees
9
- let { composition, size = 200, stroke_width = 0.5, inner_radius = 0, show_labels = true, show_percentages = false, show_amounts = true, color_scheme = `Vesta`, center_content, segment_content, interactive = true, svg_node = $bindable(null), children, ...rest } = $props();
10
- let element_colors = $derived(ELEMENT_COLOR_SCHEMES[color_scheme] || ELEMENT_COLOR_SCHEMES.Vesta);
11
- let fractions = $derived(fractional_composition(composition));
12
- let total_atoms = $derived(count_atoms_in_composition(composition));
13
- let outer_radius = $derived(size / 2 - stroke_width);
14
- let inner_radius_adjusted = $derived(Math.min(inner_radius, outer_radius - 10));
15
- let center = $derived(size / 2);
16
- // Calculate pie segments
17
- let segments = $derived.by(() => {
18
- let current_angle = -90; // Start from top
1
+ <script lang="ts">
2
+ import type { ColorSchemeName } from '../colors'
3
+ import { ELEMENT_COLOR_SCHEMES, pick_contrast_color } from '../colors'
4
+ import type { CompositionType } from './'
5
+ import type { ElementSymbol } from '../element'
6
+ import { format_num } from '../labels'
7
+ import type { Snippet } from 'svelte'
8
+ import type { SVGAttributes } from 'svelte/elements'
9
+ import { type ChartSegmentData, get_chart_font_scale } from './index'
10
+ import { count_atoms_in_composition, fractional_composition } from './parse'
11
+
12
+ // Constants for pie chart calculations
13
+ const VERY_THIN_SLICE_THRESHOLD = 20 // degrees
14
+ const MEDIUM_SLICE_THRESHOLD = 90 // degrees - increased to move more slices toward outer edge
15
+ const MAX_ANGLE_FOR_FULL_SCALE = 120 // degrees
16
+
17
+ type PieSegmentData = ChartSegmentData & {
18
+ start_angle: number
19
+ end_angle: number
20
+ path: string
21
+ label_x: number
22
+ label_y: number
23
+ is_outside_slice: boolean
24
+ }
25
+ let {
26
+ composition,
27
+ size = 200,
28
+ stroke_width = 0.5,
29
+ inner_radius = 0,
30
+ show_labels = true,
31
+ show_percentages = false,
32
+ show_amounts = true,
33
+ color_scheme = `Vesta`,
34
+ center_content,
35
+ segment_content,
36
+ interactive = true,
37
+ svg_node = $bindable(null),
38
+ children,
39
+ ...rest
40
+ }: SVGAttributes<SVGSVGElement> & {
41
+ composition: CompositionType
42
+ size?: number
43
+ stroke_width?: number
44
+ inner_radius?: number
45
+ show_labels?: boolean
46
+ show_percentages?: boolean
47
+ show_amounts?: boolean
48
+ color_scheme?: ColorSchemeName
49
+ center_content?: Snippet<[{ composition: CompositionType; total_atoms: number }]>
50
+ segment_content?: Snippet<[PieSegmentData]>
51
+ interactive?: boolean
52
+ svg_node?: SVGSVGElement | null
53
+ children?: Snippet<[{ hovered_element: ElementSymbol | null }]>
54
+ } = $props()
55
+
56
+ let element_colors = $derived(
57
+ ELEMENT_COLOR_SCHEMES[color_scheme] || ELEMENT_COLOR_SCHEMES.Vesta,
58
+ )
59
+ let fractions = $derived(fractional_composition(composition))
60
+ let total_atoms = $derived(count_atoms_in_composition(composition))
61
+ let outer_radius = $derived(size / 2 - stroke_width)
62
+ let inner_radius_adjusted = $derived(Math.min(inner_radius, outer_radius - 10))
63
+ let center = $derived(size / 2)
64
+
65
+ // Calculate pie segments
66
+ let segments = $derived.by(() => {
67
+ let current_angle = -90 // Start from top
68
+
19
69
  return Object.entries(composition)
20
- .filter(([_, amount]) => amount && amount > 0)
21
- .map(([element_key, amount]) => {
22
- const element = element_key;
23
- const fraction = fractions[element] || 0;
24
- // use 359.99° to avoid 360° for single-element compositions which cause SVG arc issues
25
- const angle_span = fraction === 1 ? 359.99 : fraction * 360;
26
- const start_angle = current_angle;
27
- const end_angle = current_angle + angle_span;
28
- current_angle = end_angle;
70
+ .filter(([_, amount]) => amount && amount > 0)
71
+ .map(([element_key, amount]) => {
72
+ const element = element_key as ElementSymbol
73
+ const fraction = fractions[element] || 0
74
+ const color = element_colors[element] || `#cccccc`
75
+
76
+ // Single element: full circle with no radial stroke line, label at center
77
+ if (fraction === 1) {
78
+ const r = outer_radius
79
+ const ir = inner_radius_adjusted
80
+ // Two semicircular arcs to form a full circle (avoids SVG 360° arc bug)
81
+ const outer_arc = `M ${center} ${center - r} A ${r} ${r} 0 1 1 ${center} ${
82
+ center + r
83
+ } A ${r} ${r} 0 1 1 ${center} ${center - r} Z`
84
+ const path = ir > 0
85
+ ? `${outer_arc} M ${center} ${
86
+ center - ir
87
+ } A ${ir} ${ir} 0 1 0 ${center} ${
88
+ center + ir
89
+ } A ${ir} ${ir} 0 1 0 ${center} ${center - ir} Z`
90
+ : outer_arc
91
+ const label_text = element + (show_amounts ? String(amount) : ``) +
92
+ (show_percentages ? `${format_num(fraction, `.1~%`)}` : ``)
93
+ return {
94
+ element,
95
+ amount,
96
+ fraction,
97
+ color,
98
+ start_angle: -90,
99
+ end_angle: 270,
100
+ path,
101
+ label_x: center,
102
+ label_y: center,
103
+ is_outside_slice: false,
104
+ font_scale: get_chart_font_scale(2.6, label_text, r * 2),
105
+ text_color: pick_contrast_color({ bg_color: color }),
106
+ }
107
+ }
108
+
109
+ const angle_span = fraction * 360
110
+ const start_angle = current_angle
111
+ const end_angle = current_angle + angle_span
112
+
113
+ current_angle = end_angle
114
+
29
115
  // Convert to radians for calculations
30
- const start_rad = (start_angle * Math.PI) / 180;
31
- const end_rad = (end_angle * Math.PI) / 180;
32
- const mid_rad = (((start_angle + end_angle) / 2) * Math.PI) / 180;
116
+ const start_rad = (start_angle * Math.PI) / 180
117
+ const end_rad = (end_angle * Math.PI) / 180
118
+ const mid_rad = (((start_angle + end_angle) / 2) * Math.PI) / 180
119
+
33
120
  // Arc coordinates for outer radius
34
- const x1_outer = center + outer_radius * Math.cos(start_rad);
35
- const y1_outer = center + outer_radius * Math.sin(start_rad);
36
- const x2_outer = center + outer_radius * Math.cos(end_rad);
37
- const y2_outer = center + outer_radius * Math.sin(end_rad);
121
+ const x1_outer = center + outer_radius * Math.cos(start_rad)
122
+ const y1_outer = center + outer_radius * Math.sin(start_rad)
123
+ const x2_outer = center + outer_radius * Math.cos(end_rad)
124
+ const y2_outer = center + outer_radius * Math.sin(end_rad)
125
+
38
126
  // Arc coordinates for inner radius
39
- const x1_inner = center + inner_radius_adjusted * Math.cos(start_rad);
40
- const y1_inner = center + inner_radius_adjusted * Math.sin(start_rad);
41
- const x2_inner = center + inner_radius_adjusted * Math.cos(end_rad);
42
- const y2_inner = center + inner_radius_adjusted * Math.sin(end_rad);
43
- const large_arc = angle_span > 180 ? 1 : 0;
127
+ const x1_inner = center + inner_radius_adjusted * Math.cos(start_rad)
128
+ const y1_inner = center + inner_radius_adjusted * Math.sin(start_rad)
129
+ const x2_inner = center + inner_radius_adjusted * Math.cos(end_rad)
130
+ const y2_inner = center + inner_radius_adjusted * Math.sin(end_rad)
131
+
132
+ const large_arc = angle_span > 180 ? 1 : 0
133
+
44
134
  // Create donut path if inner radius > 0, otherwise regular pie slice
45
135
  const path = inner_radius_adjusted > 0
46
- ? `M ${x1_outer} ${y1_outer} A ${outer_radius} ${outer_radius} 0 ${large_arc} 1 ${x2_outer} ${y2_outer} L ${x2_inner} ${y2_inner} A ${inner_radius_adjusted} ${inner_radius_adjusted} 0 ${large_arc} 0 ${x1_inner} ${y1_inner} Z`
47
- : `M ${center} ${center} L ${x1_outer} ${y1_outer} A ${outer_radius} ${outer_radius} 0 ${large_arc} 1 ${x2_outer} ${y2_outer} Z`;
136
+ ? `M ${x1_outer} ${y1_outer} A ${outer_radius} ${outer_radius} 0 ${large_arc} 1 ${x2_outer} ${y2_outer} L ${x2_inner} ${y2_inner} A ${inner_radius_adjusted} ${inner_radius_adjusted} 0 ${large_arc} 0 ${x1_inner} ${y1_inner} Z`
137
+ : `M ${center} ${center} L ${x1_outer} ${y1_outer} A ${outer_radius} ${outer_radius} 0 ${large_arc} 1 ${x2_outer} ${y2_outer} Z`
138
+
48
139
  // Position labels with three-tier strategy
49
- const is_very_thin_slice = angle_span < VERY_THIN_SLICE_THRESHOLD; // Place outside
140
+ const is_very_thin_slice = angle_span < VERY_THIN_SLICE_THRESHOLD // Place outside
50
141
  const is_medium_slice = angle_span >= VERY_THIN_SLICE_THRESHOLD &&
51
- angle_span < MEDIUM_SLICE_THRESHOLD; // Near outer edge
52
- let label_radius;
53
- let is_outside_slice = false;
142
+ angle_span < MEDIUM_SLICE_THRESHOLD // Near outer edge
143
+
144
+ let label_radius: number
145
+ let is_outside_slice = false
146
+
54
147
  if (is_very_thin_slice) {
55
- // Very thin slices: place outside with distance proportional to chart size
56
- label_radius = outer_radius + outer_radius * 0.2;
57
- is_outside_slice = true;
58
- }
59
- else if (is_medium_slice) {
60
- // Medium slices: place closer to outer edge, proportional to chart size
61
- label_radius = outer_radius - outer_radius * 0.3;
62
- is_outside_slice = false;
63
- }
64
- else {
65
- // Large slices: place in middle of ring
66
- label_radius = (outer_radius + inner_radius_adjusted) / 2;
67
- is_outside_slice = false;
148
+ // Very thin slices: place outside with distance proportional to chart size
149
+ label_radius = outer_radius + outer_radius * 0.2
150
+ is_outside_slice = true
151
+ } else if (is_medium_slice) {
152
+ // Medium slices: place closer to outer edge, proportional to chart size
153
+ label_radius = outer_radius - outer_radius * 0.3
154
+ is_outside_slice = false
155
+ } else {
156
+ // Large slices: place in middle of ring
157
+ label_radius = (outer_radius + inner_radius_adjusted) / 2
158
+ is_outside_slice = false
68
159
  }
160
+
69
161
  // Calculate font scale based on slice size and smart text fitting
70
- const [min_font_scale, max_font_scale] = [1.4, 2];
71
- const scale_factor = angle_span / MAX_ANGLE_FOR_FULL_SCALE;
162
+ const [min_font_scale, max_font_scale] = [1.4, 2] as const
163
+ const scale_factor = angle_span / MAX_ANGLE_FOR_FULL_SCALE
72
164
  const base_scale = min_font_scale +
73
- scale_factor * (max_font_scale - min_font_scale);
74
- const label_text = element + (show_amounts ? amount.toString() : ``) +
75
- (show_percentages ? `${format_num(fraction, `.1~%`)}` : ``);
165
+ scale_factor * (max_font_scale - min_font_scale)
166
+ const label_text = element + (show_amounts ? amount?.toString() ?? `` : ``) +
167
+ (show_percentages ? `${format_num(fraction, `.1~%`)}` : ``)
76
168
  const available_space = is_very_thin_slice
77
- ? outer_radius * 0.8 // More space outside the slice
78
- : Math.min(outer_radius - inner_radius_adjusted, // Radial space
79
- (angle_span * Math.PI / 180) * label_radius * 0.8);
80
- const font_scale = get_chart_font_scale(base_scale, label_text, available_space);
81
- const color = element_colors[element] || `#cccccc`;
169
+ ? outer_radius * 0.8 // More space outside the slice
170
+ : Math.min(
171
+ outer_radius - inner_radius_adjusted, // Radial space
172
+ (angle_span * Math.PI / 180) * label_radius * 0.8, // Arc space at label radius
173
+ )
174
+
175
+ const font_scale = get_chart_font_scale(
176
+ base_scale,
177
+ label_text,
178
+ available_space,
179
+ )
180
+
82
181
  return {
83
- element,
84
- amount,
85
- fraction,
86
- color,
87
- start_angle,
88
- end_angle,
89
- path,
90
- label_x: center + label_radius * Math.cos(mid_rad),
91
- label_y: center + label_radius * Math.sin(mid_rad),
92
- is_outside_slice,
93
- font_scale,
94
- text_color: is_outside_slice
95
- ? `var(--text-color, #333)`
96
- : pick_contrast_color({ bg_color: color }),
97
- };
98
- });
99
- });
100
- let hovered_element = $state(null);
182
+ element,
183
+ amount,
184
+ fraction,
185
+ color,
186
+ start_angle,
187
+ end_angle,
188
+ path,
189
+ label_x: center + label_radius * Math.cos(mid_rad),
190
+ label_y: center + label_radius * Math.sin(mid_rad),
191
+ is_outside_slice,
192
+ font_scale,
193
+ text_color: is_outside_slice
194
+ ? `var(--text-color, #333)`
195
+ : pick_contrast_color({ bg_color: color }),
196
+ }
197
+ })
198
+ })
199
+
200
+ let hovered_element: ElementSymbol | null = $state(null)
101
201
  </script>
102
202
 
103
203
  <svg
104
204
  viewBox="0 0 {size} {size}"
205
+ style:max-width="{size}px"
105
206
  {...rest}
106
207
  class="pie-chart {rest.class ?? ``}"
107
208
  bind:this={svg_node}
@@ -111,7 +212,11 @@ let hovered_element = $state(null);
111
212
  d={segment.path}
112
213
  fill={segment.color}
113
214
  stroke="white"
114
- stroke-width={hovered_element === segment.element ? stroke_width + 1 : stroke_width}
215
+ stroke-width={segments.length === 1
216
+ ? 0
217
+ : hovered_element === segment.element
218
+ ? stroke_width + 1
219
+ : stroke_width}
115
220
  class="pie-segment"
116
221
  class:interactive
117
222
  class:hovered={hovered_element === segment.element}
@@ -154,14 +259,12 @@ let hovered_element = $state(null);
154
259
  <span class="element-symbol" style:font-size="{14 * segment.font_scale}px">{
155
260
  segment.element
156
261
  }</span>
157
- {#if show_amounts}
158
- <sub class="amount" style:font-size="{10 * segment.font_scale}px">
159
- {segment.amount}
160
- </sub>{/if}
161
- {#if show_percentages}
162
- <sub class="percentage" style:font-size="{11 * segment.font_scale}px">
163
- {format_num(segment.fraction, `.1~%`)}
164
- </sub>
262
+ {#if show_amounts || show_percentages}
263
+ <sub class="amount" style:font-size="{8 * segment.font_scale}px">{
264
+ show_amounts ? segment.amount : ``
265
+ }{show_amounts && show_percentages ? `=` : ``}{
266
+ show_percentages ? format_num(segment.fraction, `.1~%`) : ``
267
+ }</sub>
165
268
  {/if}
166
269
  </div>
167
270
  </foreignObject>
@@ -215,9 +318,6 @@ let hovered_element = $state(null);
215
318
  }
216
319
  .amount {
217
320
  margin-left: 1px;
218
- transform: translateY(9pt);
219
- }
220
- .percentage {
221
- transform: translateY(4px);
321
+ transform: translateY(5pt);
222
322
  }
223
323
  </style>
@@ -1,6 +1,6 @@
1
+ import type { ColorSchemeName } from '../colors';
1
2
  import type { CompositionType } from './';
2
3
  import type { ElementSymbol } from '../element';
3
- import type { ColorSchemeName } from '../colors';
4
4
  import type { Snippet } from 'svelte';
5
5
  import type { SVGAttributes } from 'svelte/elements';
6
6
  import { type ChartSegmentData } from './index';
@@ -6,5 +6,10 @@ export declare const get_alphabetical_formula: (input: string | CompositionType
6
6
  export declare const sort_by_electronegativity: (symbols: ElementSymbol[]) => ElementSymbol[];
7
7
  export declare const sort_by_hill_notation: (symbols: ElementSymbol[]) => ElementSymbol[];
8
8
  export declare const get_electro_neg_formula: (input: string | CompositionType | AnyStructure, plain_text?: boolean, delim?: string, amount_format?: string) => string;
9
+ export interface FormulaLabelSegment {
10
+ text: string;
11
+ subscript: boolean;
12
+ }
13
+ export declare function get_formula_label_segments(formula: string): FormulaLabelSegment[];
9
14
  export declare const get_hill_formula: (input: string | CompositionType | AnyStructure, plain_text?: boolean, delim?: string, amount_format?: string) => string;
10
15
  export declare function format_oxi_state(oxidation?: number): string;
@@ -27,9 +27,7 @@ export const format_composition_formula = (composition, sort_fn, plain_text = fa
27
27
  if (amount === 1)
28
28
  return el;
29
29
  const formatted_amount = format_num(Number(amount), amount_format);
30
- return plain_text
31
- ? `${el}${formatted_amount}`
32
- : `${el}<sub>${formatted_amount}</sub>`;
30
+ return plain_text ? `${el}${formatted_amount}` : `${el}<sub>${formatted_amount}</sub>`;
33
31
  })
34
32
  .join(delim);
35
33
  };
@@ -82,6 +80,25 @@ export const sort_by_hill_notation = (symbols) => {
82
80
  };
83
81
  // Create electronegativity-sorted formula
84
82
  export const get_electro_neg_formula = (input, plain_text = false, delim = ` `, amount_format = `.3~f`) => format_formula_generic(input, sort_by_electronegativity, plain_text, delim, amount_format);
83
+ export function get_formula_label_segments(formula) {
84
+ const segments = [];
85
+ let cursor = 0;
86
+ for (const match of formula.matchAll(/([A-Za-z])(\d+(?:\.\d+)?)/g)) {
87
+ const match_idx = match.index ?? 0;
88
+ const prefix = match[1];
89
+ const amount = match[2];
90
+ const amount_idx = match_idx + prefix.length;
91
+ if (amount_idx > cursor) {
92
+ segments.push({ text: formula.slice(cursor, amount_idx), subscript: false });
93
+ }
94
+ segments.push({ text: amount, subscript: true });
95
+ cursor = amount_idx + amount.length;
96
+ }
97
+ if (cursor < formula.length) {
98
+ segments.push({ text: formula.slice(cursor), subscript: false });
99
+ }
100
+ return segments.length > 0 ? segments : [{ text: formula, subscript: false }];
101
+ }
85
102
  // Create Hill notation formula (C first, H second, then alphabetical)
86
103
  export const get_hill_formula = (input, plain_text = false, delim = ` `, amount_format = `.3~s`) => format_formula_generic(input, sort_by_hill_notation, plain_text, delim, amount_format);
87
104
  export function format_oxi_state(oxidation) {
@@ -21,8 +21,8 @@ export const is_valid_element = (sym) => ELEM_SYMBOLS.includes(sym);
21
21
  // Check if object has atomic numbers as keys (1-118)
22
22
  const is_atomic_number_composition = (obj) => {
23
23
  const keys = Object.keys(obj);
24
- return keys.length > 0 &&
25
- keys.map(Number).every((num) => Number.isInteger(num) && num >= 1 && num <= 118);
24
+ return (keys.length > 0 &&
25
+ keys.map(Number).every((num) => Number.isInteger(num) && num >= 1 && num <= 118));
26
26
  };
27
27
  // Convert atomic numbers to element symbols
28
28
  export const atomic_num_to_symbols = (atomic_composition) => {
@@ -148,7 +148,7 @@ export const parse_composition = (input) => {
148
148
  return normalize_composition(input);
149
149
  };
150
150
  // Calculate GCD of two numbers
151
- const gcd = (num_a, num_b) => (num_b === 0 ? num_a : gcd(num_b, num_a % num_b));
151
+ const gcd = (num_a, num_b) => num_b === 0 ? num_a : gcd(num_b, num_a % num_b);
152
152
  // Get reduced formula by dividing all amounts by their GCD
153
153
  // Example: Fe2O4 -> FeO2, H4O2 -> H2O
154
154
  export const get_reduced_formula = (composition) => {
@@ -176,7 +176,7 @@ const parse_oxidation_state = (oxidation_str) => {
176
176
  return oxidation_str === `+` ? 1 : -1;
177
177
  }
178
178
  // Handle formats like "2+", "+2", "2-", "-2"
179
- const ox_match = oxidation_str.match(/([+-]?)(\d+)([+-]?)/);
179
+ const ox_match = /([+-]?)(\d+)([+-]?)/.exec(oxidation_str);
180
180
  if (!ox_match)
181
181
  return 0;
182
182
  const [, sign_before, number, sign_after] = ox_match;
@@ -211,9 +211,7 @@ export const parse_formula_with_oxidation = (formula, strict = false) => {
211
211
  const count = count_str ? parseInt(count_str, 10) : 1;
212
212
  if (!is_valid_element(element))
213
213
  throw new Error(`Invalid element symbol: ${element}`);
214
- const oxidation_state = oxidation_str
215
- ? parse_oxidation_state(oxidation_str)
216
- : undefined;
214
+ const oxidation_state = oxidation_str ? parse_oxidation_state(oxidation_str) : undefined;
217
215
  // Find or add element entry
218
216
  const existing = elements.find((el) => el.element === element);
219
217
  if (existing) {
@@ -304,7 +302,10 @@ export function generate_chem_sys_subspaces(input) {
304
302
  // Example: "Zr, Nb, InvalidElement, H" -> ["H", "Nb", "Zr"]
305
303
  // Note: Matching is case-sensitive. Use all_symbols to filter against a subset.
306
304
  export const normalize_element_symbols = (csv, all_symbols) => {
307
- const input_set = new Set(csv.split(`,`).map((sym) => sym.trim()).filter(Boolean));
305
+ const input_set = new Set(csv
306
+ .split(`,`)
307
+ .map((sym) => sym.trim())
308
+ .filter(Boolean));
308
309
  // Cast needed: ELEM_SYMBOLS is readonly const tuple, T is generic string subtype
309
310
  return (all_symbols ?? ELEM_SYMBOLS).filter((sym) => input_set.has(sym));
310
311
  };
@@ -315,7 +316,11 @@ export const has_wildcards = (input) => input.includes(`*`);
315
316
  // Accepts both hyphen and comma separators.
316
317
  // Throws if any non-wildcard token is not a valid element symbol.
317
318
  export function parse_chemsys_with_wildcards(input) {
318
- const tokens = input.replace(/-/g, `,`).split(`,`).map((tok) => tok.trim()).filter(Boolean);
319
+ const tokens = input
320
+ .replace(/-/g, `,`)
321
+ .split(`,`)
322
+ .map((tok) => tok.trim())
323
+ .filter(Boolean);
319
324
  const elements = [];
320
325
  let wildcard_count = 0;
321
326
  for (const token of tokens) {