react-cheminfo 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (806) hide show
  1. package/README.md +111 -23
  2. package/lib/capsule/ui/CapsuleFilter.d.ts +61 -0
  3. package/lib/capsule/ui/CapsuleFilter.d.ts.map +1 -0
  4. package/lib/capsule/ui/CapsuleFilter.js +33 -0
  5. package/lib/capsule/ui/CapsuleFilter.js.map +1 -0
  6. package/lib/capsule/ui/index.d.ts +3 -0
  7. package/lib/capsule/ui/index.d.ts.map +1 -0
  8. package/lib/capsule/ui/index.js +2 -0
  9. package/lib/capsule/ui/index.js.map +1 -0
  10. package/lib/chrome/ui/NavLink.d.ts +27 -0
  11. package/lib/chrome/ui/NavLink.d.ts.map +1 -0
  12. package/lib/chrome/ui/NavLink.js +36 -0
  13. package/lib/chrome/ui/NavLink.js.map +1 -0
  14. package/lib/chrome/ui/NavMenuButton.d.ts +40 -0
  15. package/lib/chrome/ui/NavMenuButton.d.ts.map +1 -0
  16. package/lib/chrome/ui/NavMenuButton.js +26 -0
  17. package/lib/chrome/ui/NavMenuButton.js.map +1 -0
  18. package/lib/chrome/ui/SiteFooter.d.ts +39 -0
  19. package/lib/chrome/ui/SiteFooter.d.ts.map +1 -0
  20. package/lib/chrome/ui/SiteFooter.js +17 -0
  21. package/lib/chrome/ui/SiteFooter.js.map +1 -0
  22. package/lib/chrome/ui/SiteHeader.d.ts +59 -0
  23. package/lib/chrome/ui/SiteHeader.d.ts.map +1 -0
  24. package/lib/chrome/ui/SiteHeader.js +28 -0
  25. package/lib/chrome/ui/SiteHeader.js.map +1 -0
  26. package/lib/chrome/ui/index.d.ts +12 -0
  27. package/lib/chrome/ui/index.d.ts.map +1 -0
  28. package/lib/chrome/ui/index.js +6 -0
  29. package/lib/chrome/ui/index.js.map +1 -0
  30. package/lib/chrome/ui/navItem.d.ts +57 -0
  31. package/lib/chrome/ui/navItem.d.ts.map +1 -0
  32. package/lib/chrome/ui/navItem.js +10 -0
  33. package/lib/chrome/ui/navItem.js.map +1 -0
  34. package/lib/chrome/ui/useCompactHeader.d.ts +31 -0
  35. package/lib/chrome/ui/useCompactHeader.d.ts.map +1 -0
  36. package/lib/chrome/ui/useCompactHeader.js +50 -0
  37. package/lib/chrome/ui/useCompactHeader.js.map +1 -0
  38. package/lib/citation/core/clipboard.d.ts +12 -3
  39. package/lib/citation/core/clipboard.d.ts.map +1 -1
  40. package/lib/citation/core/clipboard.js +21 -10
  41. package/lib/citation/core/clipboard.js.map +1 -1
  42. package/lib/citation/core/download.d.ts +11 -3
  43. package/lib/citation/core/download.d.ts.map +1 -1
  44. package/lib/citation/core/download.js +17 -13
  45. package/lib/citation/core/download.js.map +1 -1
  46. package/lib/citation/core/index.d.ts +4 -3
  47. package/lib/citation/core/index.d.ts.map +1 -1
  48. package/lib/citation/core/index.js +3 -3
  49. package/lib/citation/core/index.js.map +1 -1
  50. package/lib/citation/core/works.d.ts +44 -0
  51. package/lib/citation/core/works.d.ts.map +1 -0
  52. package/lib/citation/core/works.js +51 -0
  53. package/lib/citation/core/works.js.map +1 -0
  54. package/lib/citation/ui/CitationMenu.d.ts +20 -3
  55. package/lib/citation/ui/CitationMenu.d.ts.map +1 -1
  56. package/lib/citation/ui/CitationMenu.js +60 -49
  57. package/lib/citation/ui/CitationMenu.js.map +1 -1
  58. package/lib/citation/ui/CitationPreview.d.ts +5 -2
  59. package/lib/citation/ui/CitationPreview.d.ts.map +1 -1
  60. package/lib/citation/ui/CitationPreview.js +9 -4
  61. package/lib/citation/ui/CitationPreview.js.map +1 -1
  62. package/lib/citation/ui/CiteButton.d.ts +13 -6
  63. package/lib/citation/ui/CiteButton.d.ts.map +1 -1
  64. package/lib/citation/ui/CiteButton.js +5 -4
  65. package/lib/citation/ui/CiteButton.js.map +1 -1
  66. package/lib/citation/ui/CopyFormatEntries.d.ts +31 -0
  67. package/lib/citation/ui/CopyFormatEntries.d.ts.map +1 -0
  68. package/lib/citation/ui/CopyFormatEntries.js +29 -0
  69. package/lib/citation/ui/CopyFormatEntries.js.map +1 -0
  70. package/lib/citation/ui/WorkEntry.d.ts +18 -0
  71. package/lib/citation/ui/WorkEntry.d.ts.map +1 -0
  72. package/lib/citation/ui/WorkEntry.js +32 -0
  73. package/lib/citation/ui/WorkEntry.js.map +1 -0
  74. package/lib/citation/ui/entries.d.ts +7 -7
  75. package/lib/citation/ui/entries.d.ts.map +1 -1
  76. package/lib/citation/ui/entries.js +11 -13
  77. package/lib/citation/ui/entries.js.map +1 -1
  78. package/lib/citation/ui/index.d.ts +2 -2
  79. package/lib/citation/ui/index.d.ts.map +1 -1
  80. package/lib/citation/ui/index.js.map +1 -1
  81. package/lib/citation/ui/useCopyFeedback.d.ts +20 -0
  82. package/lib/citation/ui/useCopyFeedback.d.ts.map +1 -0
  83. package/lib/citation/ui/useCopyFeedback.js +49 -0
  84. package/lib/citation/ui/useCopyFeedback.js.map +1 -0
  85. package/lib/clipboard/core/index.d.ts +2 -0
  86. package/lib/clipboard/core/index.d.ts.map +1 -0
  87. package/lib/clipboard/core/index.js +2 -0
  88. package/lib/clipboard/core/index.js.map +1 -0
  89. package/lib/clipboard/core/writeToClipboard.d.ts +12 -0
  90. package/lib/clipboard/core/writeToClipboard.d.ts.map +1 -0
  91. package/lib/clipboard/core/writeToClipboard.js +49 -0
  92. package/lib/clipboard/core/writeToClipboard.js.map +1 -0
  93. package/lib/clipboard/ui/CodeBlock.d.ts +43 -0
  94. package/lib/clipboard/ui/CodeBlock.d.ts.map +1 -0
  95. package/lib/clipboard/ui/CodeBlock.js +49 -0
  96. package/lib/clipboard/ui/CodeBlock.js.map +1 -0
  97. package/lib/clipboard/ui/CopyButton.d.ts +64 -0
  98. package/lib/clipboard/ui/CopyButton.d.ts.map +1 -0
  99. package/lib/clipboard/ui/CopyButton.js +21 -0
  100. package/lib/clipboard/ui/CopyButton.js.map +1 -0
  101. package/lib/clipboard/ui/index.d.ts +7 -0
  102. package/lib/clipboard/ui/index.d.ts.map +1 -0
  103. package/lib/clipboard/ui/index.js +4 -0
  104. package/lib/clipboard/ui/index.js.map +1 -0
  105. package/lib/clipboard/ui/useCopyToClipboard.d.ts +24 -0
  106. package/lib/clipboard/ui/useCopyToClipboard.d.ts.map +1 -0
  107. package/lib/clipboard/ui/useCopyToClipboard.js +36 -0
  108. package/lib/clipboard/ui/useCopyToClipboard.js.map +1 -0
  109. package/lib/color/core/contrast.d.ts +43 -0
  110. package/lib/color/core/contrast.d.ts.map +1 -0
  111. package/lib/color/core/contrast.js +61 -0
  112. package/lib/color/core/contrast.js.map +1 -0
  113. package/lib/color/core/hex.d.ts +26 -0
  114. package/lib/color/core/hex.d.ts.map +1 -0
  115. package/lib/color/core/hex.js +44 -0
  116. package/lib/color/core/hex.js.map +1 -0
  117. package/lib/color/core/index.d.ts +5 -0
  118. package/lib/color/core/index.d.ts.map +1 -0
  119. package/lib/color/core/index.js +3 -0
  120. package/lib/color/core/index.js.map +1 -0
  121. package/lib/color/core/scale.d.ts +52 -0
  122. package/lib/color/core/scale.d.ts.map +1 -0
  123. package/lib/color/core/scale.js +96 -0
  124. package/lib/color/core/scale.js.map +1 -0
  125. package/lib/color/ui/ColorScaleLegend.d.ts +38 -0
  126. package/lib/color/ui/ColorScaleLegend.d.ts.map +1 -0
  127. package/lib/color/ui/ColorScaleLegend.js +68 -0
  128. package/lib/color/ui/ColorScaleLegend.js.map +1 -0
  129. package/lib/color/ui/index.d.ts +3 -0
  130. package/lib/color/ui/index.d.ts.map +1 -0
  131. package/lib/color/ui/index.js +2 -0
  132. package/lib/color/ui/index.js.map +1 -0
  133. package/lib/core.d.ts +11 -0
  134. package/lib/core.d.ts.map +1 -1
  135. package/lib/core.js +11 -0
  136. package/lib/core.js.map +1 -1
  137. package/lib/credits/core/credits.d.ts +144 -0
  138. package/lib/credits/core/credits.d.ts.map +1 -0
  139. package/lib/credits/core/credits.js +156 -0
  140. package/lib/credits/core/credits.js.map +1 -0
  141. package/lib/credits/core/index.d.ts +3 -0
  142. package/lib/credits/core/index.d.ts.map +1 -0
  143. package/lib/credits/core/index.js +2 -0
  144. package/lib/credits/core/index.js.map +1 -0
  145. package/lib/credits/ui/CreditsList.d.ts +29 -0
  146. package/lib/credits/ui/CreditsList.d.ts.map +1 -0
  147. package/lib/credits/ui/CreditsList.js +33 -0
  148. package/lib/credits/ui/CreditsList.js.map +1 -0
  149. package/lib/credits/ui/index.d.ts +3 -0
  150. package/lib/credits/ui/index.d.ts.map +1 -0
  151. package/lib/credits/ui/index.js +2 -0
  152. package/lib/credits/ui/index.js.map +1 -0
  153. package/lib/delimited/core/delimiters.d.ts +31 -0
  154. package/lib/delimited/core/delimiters.d.ts.map +1 -0
  155. package/lib/delimited/core/delimiters.js +46 -0
  156. package/lib/delimited/core/delimiters.js.map +1 -0
  157. package/lib/delimited/core/index.d.ts +9 -0
  158. package/lib/delimited/core/index.d.ts.map +1 -0
  159. package/lib/delimited/core/index.js +5 -0
  160. package/lib/delimited/core/index.js.map +1 -0
  161. package/lib/delimited/core/readDelimited.d.ts +32 -0
  162. package/lib/delimited/core/readDelimited.d.ts.map +1 -0
  163. package/lib/delimited/core/readDelimited.js +122 -0
  164. package/lib/delimited/core/readDelimited.js.map +1 -0
  165. package/lib/delimited/core/rowsToDelimited.d.ts +59 -0
  166. package/lib/delimited/core/rowsToDelimited.d.ts.map +1 -0
  167. package/lib/delimited/core/rowsToDelimited.js +87 -0
  168. package/lib/delimited/core/rowsToDelimited.js.map +1 -0
  169. package/lib/delimited/core/toDelimited.d.ts +38 -0
  170. package/lib/delimited/core/toDelimited.d.ts.map +1 -0
  171. package/lib/delimited/core/toDelimited.js +45 -0
  172. package/lib/delimited/core/toDelimited.js.map +1 -0
  173. package/lib/delimited/ui/DelimitedTextDialog.d.ts +22 -0
  174. package/lib/delimited/ui/DelimitedTextDialog.d.ts.map +1 -0
  175. package/lib/delimited/ui/DelimitedTextDialog.js +17 -0
  176. package/lib/delimited/ui/DelimitedTextDialog.js.map +1 -0
  177. package/lib/delimited/ui/DelimitedTextPanel.d.ts +56 -0
  178. package/lib/delimited/ui/DelimitedTextPanel.d.ts.map +1 -0
  179. package/lib/delimited/ui/DelimitedTextPanel.js +55 -0
  180. package/lib/delimited/ui/DelimitedTextPanel.js.map +1 -0
  181. package/lib/delimited/ui/index.d.ts +5 -0
  182. package/lib/delimited/ui/index.d.ts.map +1 -0
  183. package/lib/delimited/ui/index.js +3 -0
  184. package/lib/delimited/ui/index.js.map +1 -0
  185. package/lib/disclosure/ui/CollapsibleSection.d.ts +57 -0
  186. package/lib/disclosure/ui/CollapsibleSection.d.ts.map +1 -0
  187. package/lib/disclosure/ui/CollapsibleSection.js +60 -0
  188. package/lib/disclosure/ui/CollapsibleSection.js.map +1 -0
  189. package/lib/disclosure/ui/index.d.ts +5 -0
  190. package/lib/disclosure/ui/index.d.ts.map +1 -0
  191. package/lib/disclosure/ui/index.js +3 -0
  192. package/lib/disclosure/ui/index.js.map +1 -0
  193. package/lib/disclosure/ui/useDisclosure.d.ts +22 -0
  194. package/lib/disclosure/ui/useDisclosure.d.ts.map +1 -0
  195. package/lib/disclosure/ui/useDisclosure.js +18 -0
  196. package/lib/disclosure/ui/useDisclosure.js.map +1 -0
  197. package/lib/download/core/downloadBlob.d.ts +10 -0
  198. package/lib/download/core/downloadBlob.d.ts.map +1 -0
  199. package/lib/download/core/downloadBlob.js +20 -0
  200. package/lib/download/core/downloadBlob.js.map +1 -0
  201. package/lib/download/core/downloadText.d.ts +9 -0
  202. package/lib/download/core/downloadText.d.ts.map +1 -0
  203. package/lib/download/core/downloadText.js +14 -0
  204. package/lib/download/core/downloadText.js.map +1 -0
  205. package/lib/download/core/index.d.ts +4 -0
  206. package/lib/download/core/index.d.ts.map +1 -0
  207. package/lib/download/core/index.js +4 -0
  208. package/lib/download/core/index.js.map +1 -0
  209. package/lib/download/core/sanitizeFileName.d.ts +15 -0
  210. package/lib/download/core/sanitizeFileName.d.ts.map +1 -0
  211. package/lib/download/core/sanitizeFileName.js +33 -0
  212. package/lib/download/core/sanitizeFileName.js.map +1 -0
  213. package/lib/ecosystem/core/index.d.ts +3 -0
  214. package/lib/ecosystem/core/index.d.ts.map +1 -1
  215. package/lib/ecosystem/core/index.js +3 -0
  216. package/lib/ecosystem/core/index.js.map +1 -1
  217. package/lib/ecosystem/core/links.d.ts +11 -0
  218. package/lib/ecosystem/core/links.d.ts.map +1 -0
  219. package/lib/ecosystem/core/links.js +28 -0
  220. package/lib/ecosystem/core/links.js.map +1 -0
  221. package/lib/ecosystem/core/lookup.d.ts +21 -0
  222. package/lib/ecosystem/core/lookup.d.ts.map +1 -0
  223. package/lib/ecosystem/core/lookup.js +40 -0
  224. package/lib/ecosystem/core/lookup.js.map +1 -0
  225. package/lib/ecosystem/core/sites.d.ts +2 -0
  226. package/lib/ecosystem/core/sites.d.ts.map +1 -1
  227. package/lib/ecosystem/core/sites.js +15 -0
  228. package/lib/ecosystem/core/sites.js.map +1 -1
  229. package/lib/ecosystem/core/tokens.d.ts +21 -0
  230. package/lib/ecosystem/core/tokens.d.ts.map +1 -0
  231. package/lib/ecosystem/core/tokens.js +42 -0
  232. package/lib/ecosystem/core/tokens.js.map +1 -0
  233. package/lib/ecosystem/ui/SiteTheme.d.ts +18 -0
  234. package/lib/ecosystem/ui/SiteTheme.d.ts.map +1 -0
  235. package/lib/ecosystem/ui/SiteTheme.js +16 -0
  236. package/lib/ecosystem/ui/SiteTheme.js.map +1 -0
  237. package/lib/ecosystem/ui/Wordmark.d.ts +30 -0
  238. package/lib/ecosystem/ui/Wordmark.d.ts.map +1 -0
  239. package/lib/ecosystem/ui/Wordmark.js +26 -0
  240. package/lib/ecosystem/ui/Wordmark.js.map +1 -0
  241. package/lib/ecosystem/ui/index.d.ts +4 -0
  242. package/lib/ecosystem/ui/index.d.ts.map +1 -1
  243. package/lib/ecosystem/ui/index.js +2 -0
  244. package/lib/ecosystem/ui/index.js.map +1 -1
  245. package/lib/ecosystem/ui/marks.d.ts +30 -4
  246. package/lib/ecosystem/ui/marks.d.ts.map +1 -1
  247. package/lib/ecosystem/ui/marks.js +13 -3
  248. package/lib/ecosystem/ui/marks.js.map +1 -1
  249. package/lib/error/ui/ErrorBoundary.d.ts +60 -0
  250. package/lib/error/ui/ErrorBoundary.d.ts.map +1 -0
  251. package/lib/error/ui/ErrorBoundary.js +59 -0
  252. package/lib/error/ui/ErrorBoundary.js.map +1 -0
  253. package/lib/error/ui/ErrorFallback.d.ts +38 -0
  254. package/lib/error/ui/ErrorFallback.d.ts.map +1 -0
  255. package/lib/error/ui/ErrorFallback.js +16 -0
  256. package/lib/error/ui/ErrorFallback.js.map +1 -0
  257. package/lib/error/ui/index.d.ts +5 -0
  258. package/lib/error/ui/index.d.ts.map +1 -0
  259. package/lib/error/ui/index.js +3 -0
  260. package/lib/error/ui/index.js.map +1 -0
  261. package/lib/error/ui/toError.d.ts +11 -0
  262. package/lib/error/ui/toError.d.ts.map +1 -0
  263. package/lib/error/ui/toError.js +35 -0
  264. package/lib/error/ui/toError.js.map +1 -0
  265. package/lib/format/core/index.d.ts +5 -0
  266. package/lib/format/core/index.d.ts.map +1 -0
  267. package/lib/format/core/index.js +5 -0
  268. package/lib/format/core/index.js.map +1 -0
  269. package/lib/format/core/missing.d.ts +7 -0
  270. package/lib/format/core/missing.d.ts.map +1 -0
  271. package/lib/format/core/missing.js +7 -0
  272. package/lib/format/core/missing.js.map +1 -0
  273. package/lib/format/core/numbers.d.ts +40 -0
  274. package/lib/format/core/numbers.d.ts.map +1 -0
  275. package/lib/format/core/numbers.js +81 -0
  276. package/lib/format/core/numbers.js.map +1 -0
  277. package/lib/format/core/units.d.ts +17 -0
  278. package/lib/format/core/units.d.ts.map +1 -0
  279. package/lib/format/core/units.js +54 -0
  280. package/lib/format/core/units.js.map +1 -0
  281. package/lib/format/core/words.d.ts +12 -0
  282. package/lib/format/core/words.d.ts.map +1 -0
  283. package/lib/format/core/words.js +14 -0
  284. package/lib/format/core/words.js.map +1 -0
  285. package/lib/help/ui/HelpBody.d.ts +57 -0
  286. package/lib/help/ui/HelpBody.d.ts.map +1 -0
  287. package/lib/help/ui/HelpBody.js +44 -0
  288. package/lib/help/ui/HelpBody.js.map +1 -0
  289. package/lib/help/ui/HelpIcon.d.ts +33 -0
  290. package/lib/help/ui/HelpIcon.d.ts.map +1 -0
  291. package/lib/help/ui/HelpIcon.js +16 -0
  292. package/lib/help/ui/HelpIcon.js.map +1 -0
  293. package/lib/help/ui/HelpToolbarButton.d.ts +45 -0
  294. package/lib/help/ui/HelpToolbarButton.d.ts.map +1 -0
  295. package/lib/help/ui/HelpToolbarButton.js +17 -0
  296. package/lib/help/ui/HelpToolbarButton.js.map +1 -0
  297. package/lib/help/ui/HelpTooltip.d.ts +36 -0
  298. package/lib/help/ui/HelpTooltip.d.ts.map +1 -0
  299. package/lib/help/ui/HelpTooltip.js +24 -0
  300. package/lib/help/ui/HelpTooltip.js.map +1 -0
  301. package/lib/help/ui/index.d.ts +9 -0
  302. package/lib/help/ui/index.d.ts.map +1 -0
  303. package/lib/help/ui/index.js +5 -0
  304. package/lib/help/ui/index.js.map +1 -0
  305. package/lib/hooks/ui/index.d.ts +7 -0
  306. package/lib/hooks/ui/index.d.ts.map +1 -0
  307. package/lib/hooks/ui/index.js +5 -0
  308. package/lib/hooks/ui/index.js.map +1 -0
  309. package/lib/hooks/ui/listNavigation.d.ts +54 -0
  310. package/lib/hooks/ui/listNavigation.d.ts.map +1 -0
  311. package/lib/hooks/ui/listNavigation.js +77 -0
  312. package/lib/hooks/ui/listNavigation.js.map +1 -0
  313. package/lib/hooks/ui/useContainerSize.d.ts +15 -0
  314. package/lib/hooks/ui/useContainerSize.d.ts.map +1 -0
  315. package/lib/hooks/ui/useContainerSize.js +24 -0
  316. package/lib/hooks/ui/useContainerSize.js.map +1 -0
  317. package/lib/hooks/ui/useDebouncedValue.d.ts +12 -0
  318. package/lib/hooks/ui/useDebouncedValue.d.ts.map +1 -0
  319. package/lib/hooks/ui/useDebouncedValue.js +24 -0
  320. package/lib/hooks/ui/useDebouncedValue.js.map +1 -0
  321. package/lib/hooks/ui/useListKeyboardNavigation.d.ts +17 -0
  322. package/lib/hooks/ui/useListKeyboardNavigation.d.ts.map +1 -0
  323. package/lib/hooks/ui/useListKeyboardNavigation.js +25 -0
  324. package/lib/hooks/ui/useListKeyboardNavigation.js.map +1 -0
  325. package/lib/hooks/ui/useResizeObserver.d.ts +20 -0
  326. package/lib/hooks/ui/useResizeObserver.d.ts.map +1 -0
  327. package/lib/hooks/ui/useResizeObserver.js +37 -0
  328. package/lib/hooks/ui/useResizeObserver.js.map +1 -0
  329. package/lib/orbital/core/atomicGrid.d.ts +27 -0
  330. package/lib/orbital/core/atomicGrid.d.ts.map +1 -1
  331. package/lib/orbital/core/atomicGrid.js +37 -1
  332. package/lib/orbital/core/atomicGrid.js.map +1 -1
  333. package/lib/orbital/core/index.d.ts +9 -7
  334. package/lib/orbital/core/index.d.ts.map +1 -1
  335. package/lib/orbital/core/index.js +7 -6
  336. package/lib/orbital/core/index.js.map +1 -1
  337. package/lib/orbital/core/isovalue.d.ts +60 -0
  338. package/lib/orbital/core/isovalue.d.ts.map +1 -0
  339. package/lib/orbital/core/isovalue.js +128 -0
  340. package/lib/orbital/core/isovalue.js.map +1 -0
  341. package/lib/orbital/core/sample.d.ts +15 -1
  342. package/lib/orbital/core/sample.d.ts.map +1 -1
  343. package/lib/orbital/core/sample.js +10 -3
  344. package/lib/orbital/core/sample.js.map +1 -1
  345. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +6 -1
  346. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -1
  347. package/lib/orbital/ui/AtomicOrbitalCanvas.js +12 -2
  348. package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -1
  349. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +5 -1
  350. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -1
  351. package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -1
  352. package/lib/orbital/ui/renderVolume.d.ts +6 -3
  353. package/lib/orbital/ui/renderVolume.d.ts.map +1 -1
  354. package/lib/orbital/ui/renderVolume.js +14 -15
  355. package/lib/orbital/ui/renderVolume.js.map +1 -1
  356. package/lib/orbital/ui/viewer.d.ts +3 -1
  357. package/lib/orbital/ui/viewer.d.ts.map +1 -1
  358. package/lib/orbital/ui/viewer.js +3 -2
  359. package/lib/orbital/ui/viewer.js.map +1 -1
  360. package/lib/orbital/ui/volumeField.d.ts +5 -21
  361. package/lib/orbital/ui/volumeField.d.ts.map +1 -1
  362. package/lib/orbital/ui/volumeField.js +5 -45
  363. package/lib/orbital/ui/volumeField.js.map +1 -1
  364. package/lib/pedagogy/core/glossary.d.ts +79 -0
  365. package/lib/pedagogy/core/glossary.d.ts.map +1 -0
  366. package/lib/pedagogy/core/glossary.js +71 -0
  367. package/lib/pedagogy/core/glossary.js.map +1 -0
  368. package/lib/pedagogy/core/index.d.ts +8 -0
  369. package/lib/pedagogy/core/index.d.ts.map +1 -0
  370. package/lib/pedagogy/core/index.js +4 -0
  371. package/lib/pedagogy/core/index.js.map +1 -0
  372. package/lib/pedagogy/core/jsonStorage.d.ts +21 -0
  373. package/lib/pedagogy/core/jsonStorage.d.ts.map +1 -0
  374. package/lib/pedagogy/core/jsonStorage.js +55 -0
  375. package/lib/pedagogy/core/jsonStorage.js.map +1 -0
  376. package/lib/pedagogy/core/progress.d.ts +116 -0
  377. package/lib/pedagogy/core/progress.d.ts.map +1 -0
  378. package/lib/pedagogy/core/progress.js +122 -0
  379. package/lib/pedagogy/core/progress.js.map +1 -0
  380. package/lib/pedagogy/core/types.d.ts +74 -0
  381. package/lib/pedagogy/core/types.d.ts.map +1 -0
  382. package/lib/pedagogy/core/types.js +8 -0
  383. package/lib/pedagogy/core/types.js.map +1 -0
  384. package/lib/pedagogy/core/validation.d.ts +79 -0
  385. package/lib/pedagogy/core/validation.d.ts.map +1 -0
  386. package/lib/pedagogy/core/validation.js +47 -0
  387. package/lib/pedagogy/core/validation.js.map +1 -0
  388. package/lib/pedagogy/ui/ExerciseActions.d.ts +74 -0
  389. package/lib/pedagogy/ui/ExerciseActions.d.ts.map +1 -0
  390. package/lib/pedagogy/ui/ExerciseActions.js +22 -0
  391. package/lib/pedagogy/ui/ExerciseActions.js.map +1 -0
  392. package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts +43 -0
  393. package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts.map +1 -0
  394. package/lib/pedagogy/ui/ExerciseProgressHeader.js +43 -0
  395. package/lib/pedagogy/ui/ExerciseProgressHeader.js.map +1 -0
  396. package/lib/pedagogy/ui/ExerciseTags.d.ts +49 -0
  397. package/lib/pedagogy/ui/ExerciseTags.d.ts.map +1 -0
  398. package/lib/pedagogy/ui/ExerciseTags.js +22 -0
  399. package/lib/pedagogy/ui/ExerciseTags.js.map +1 -0
  400. package/lib/pedagogy/ui/GlossaryProvider.d.ts +19 -0
  401. package/lib/pedagogy/ui/GlossaryProvider.d.ts.map +1 -0
  402. package/lib/pedagogy/ui/GlossaryProvider.js +16 -0
  403. package/lib/pedagogy/ui/GlossaryProvider.js.map +1 -0
  404. package/lib/pedagogy/ui/GlossaryText.d.ts +50 -0
  405. package/lib/pedagogy/ui/GlossaryText.d.ts.map +1 -0
  406. package/lib/pedagogy/ui/GlossaryText.js +79 -0
  407. package/lib/pedagogy/ui/GlossaryText.js.map +1 -0
  408. package/lib/pedagogy/ui/HintLadder.d.ts +38 -0
  409. package/lib/pedagogy/ui/HintLadder.d.ts.map +1 -0
  410. package/lib/pedagogy/ui/HintLadder.js +33 -0
  411. package/lib/pedagogy/ui/HintLadder.js.map +1 -0
  412. package/lib/pedagogy/ui/ReferenceGrid.d.ts +31 -0
  413. package/lib/pedagogy/ui/ReferenceGrid.d.ts.map +1 -0
  414. package/lib/pedagogy/ui/ReferenceGrid.js +25 -0
  415. package/lib/pedagogy/ui/ReferenceGrid.js.map +1 -0
  416. package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts +64 -0
  417. package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts.map +1 -0
  418. package/lib/pedagogy/ui/ReferenceSectionBlock.js +78 -0
  419. package/lib/pedagogy/ui/ReferenceSectionBlock.js.map +1 -0
  420. package/lib/pedagogy/ui/SyntaxTooltip.d.ts +94 -0
  421. package/lib/pedagogy/ui/SyntaxTooltip.d.ts.map +1 -0
  422. package/lib/pedagogy/ui/SyntaxTooltip.js +79 -0
  423. package/lib/pedagogy/ui/SyntaxTooltip.js.map +1 -0
  424. package/lib/pedagogy/ui/TestCaseList.d.ts +35 -0
  425. package/lib/pedagogy/ui/TestCaseList.d.ts.map +1 -0
  426. package/lib/pedagogy/ui/TestCaseList.js +63 -0
  427. package/lib/pedagogy/ui/TestCaseList.js.map +1 -0
  428. package/lib/pedagogy/ui/TutorialStepStrip.d.ts +42 -0
  429. package/lib/pedagogy/ui/TutorialStepStrip.d.ts.map +1 -0
  430. package/lib/pedagogy/ui/TutorialStepStrip.js +98 -0
  431. package/lib/pedagogy/ui/TutorialStepStrip.js.map +1 -0
  432. package/lib/pedagogy/ui/exerciseMeta.d.ts +24 -0
  433. package/lib/pedagogy/ui/exerciseMeta.d.ts.map +1 -0
  434. package/lib/pedagogy/ui/exerciseMeta.js +38 -0
  435. package/lib/pedagogy/ui/exerciseMeta.js.map +1 -0
  436. package/lib/pedagogy/ui/glossaryContext.d.ts +17 -0
  437. package/lib/pedagogy/ui/glossaryContext.d.ts.map +1 -0
  438. package/lib/pedagogy/ui/glossaryContext.js +19 -0
  439. package/lib/pedagogy/ui/glossaryContext.js.map +1 -0
  440. package/lib/pedagogy/ui/index.d.ts +27 -0
  441. package/lib/pedagogy/ui/index.d.ts.map +1 -0
  442. package/lib/pedagogy/ui/index.js +15 -0
  443. package/lib/pedagogy/ui/index.js.map +1 -0
  444. package/lib/pedagogy/ui/tutorialLevels.d.ts +18 -0
  445. package/lib/pedagogy/ui/tutorialLevels.d.ts.map +1 -0
  446. package/lib/pedagogy/ui/tutorialLevels.js +14 -0
  447. package/lib/pedagogy/ui/tutorialLevels.js.map +1 -0
  448. package/lib/router/core/address.d.ts +42 -0
  449. package/lib/router/core/address.d.ts.map +1 -0
  450. package/lib/router/core/address.js +64 -0
  451. package/lib/router/core/address.js.map +1 -0
  452. package/lib/router/core/basePath.d.ts +49 -0
  453. package/lib/router/core/basePath.d.ts.map +1 -0
  454. package/lib/router/core/basePath.js +78 -0
  455. package/lib/router/core/basePath.js.map +1 -0
  456. package/lib/router/core/index.d.ts +8 -0
  457. package/lib/router/core/index.d.ts.map +1 -0
  458. package/lib/router/core/index.js +5 -0
  459. package/lib/router/core/index.js.map +1 -0
  460. package/lib/router/core/legacyHash.d.ts +45 -0
  461. package/lib/router/core/legacyHash.d.ts.map +1 -0
  462. package/lib/router/core/legacyHash.js +50 -0
  463. package/lib/router/core/legacyHash.js.map +1 -0
  464. package/lib/router/core/pageAddresses.d.ts +50 -0
  465. package/lib/router/core/pageAddresses.d.ts.map +1 -0
  466. package/lib/router/core/pageAddresses.js +56 -0
  467. package/lib/router/core/pageAddresses.js.map +1 -0
  468. package/lib/router/core/query.d.ts +41 -0
  469. package/lib/router/core/query.d.ts.map +1 -0
  470. package/lib/router/core/query.js +64 -0
  471. package/lib/router/core/query.js.map +1 -0
  472. package/lib/router/core/tabRouter.d.ts +111 -0
  473. package/lib/router/core/tabRouter.d.ts.map +1 -0
  474. package/lib/router/core/tabRouter.js +87 -0
  475. package/lib/router/core/tabRouter.js.map +1 -0
  476. package/lib/seo/core/documentMeta.d.ts +45 -0
  477. package/lib/seo/core/documentMeta.d.ts.map +1 -0
  478. package/lib/seo/core/documentMeta.js +69 -0
  479. package/lib/seo/core/documentMeta.js.map +1 -0
  480. package/lib/seo/core/index.d.ts +3 -0
  481. package/lib/seo/core/index.d.ts.map +1 -0
  482. package/lib/seo/core/index.js +2 -0
  483. package/lib/seo/core/index.js.map +1 -0
  484. package/lib/share/core/config.d.ts +63 -0
  485. package/lib/share/core/config.d.ts.map +1 -0
  486. package/lib/share/core/config.js +125 -0
  487. package/lib/share/core/config.js.map +1 -0
  488. package/lib/share/core/escape.d.ts +15 -0
  489. package/lib/share/core/escape.d.ts.map +1 -0
  490. package/lib/share/core/escape.js +22 -0
  491. package/lib/share/core/escape.js.map +1 -0
  492. package/lib/share/core/index.d.ts +9 -0
  493. package/lib/share/core/index.d.ts.map +1 -0
  494. package/lib/share/core/index.js +5 -0
  495. package/lib/share/core/index.js.map +1 -0
  496. package/lib/share/core/params.d.ts +93 -0
  497. package/lib/share/core/params.d.ts.map +1 -0
  498. package/lib/share/core/params.js +111 -0
  499. package/lib/share/core/params.js.map +1 -0
  500. package/lib/share/core/query.d.ts +30 -0
  501. package/lib/share/core/query.d.ts.map +1 -0
  502. package/lib/share/core/query.js +68 -0
  503. package/lib/share/core/query.js.map +1 -0
  504. package/lib/share/core/url.d.ts +57 -0
  505. package/lib/share/core/url.d.ts.map +1 -0
  506. package/lib/share/core/url.js +49 -0
  507. package/lib/share/core/url.js.map +1 -0
  508. package/lib/share/core/vocabulary.d.ts +51 -0
  509. package/lib/share/core/vocabulary.d.ts.map +1 -0
  510. package/lib/share/core/vocabulary.js +2 -0
  511. package/lib/share/core/vocabulary.js.map +1 -0
  512. package/lib/share/ui/HiddenPartsProvider.d.ts +19 -0
  513. package/lib/share/ui/HiddenPartsProvider.d.ts.map +1 -0
  514. package/lib/share/ui/HiddenPartsProvider.js +15 -0
  515. package/lib/share/ui/HiddenPartsProvider.js.map +1 -0
  516. package/lib/share/ui/PagePart.d.ts +18 -0
  517. package/lib/share/ui/PagePart.d.ts.map +1 -0
  518. package/lib/share/ui/PagePart.js +16 -0
  519. package/lib/share/ui/PagePart.js.map +1 -0
  520. package/lib/share/ui/ShareButton.d.ts +42 -0
  521. package/lib/share/ui/ShareButton.d.ts.map +1 -0
  522. package/lib/share/ui/ShareButton.js +18 -0
  523. package/lib/share/ui/ShareButton.js.map +1 -0
  524. package/lib/share/ui/ShareDialog.d.ts +73 -0
  525. package/lib/share/ui/ShareDialog.d.ts.map +1 -0
  526. package/lib/share/ui/ShareDialog.js +19 -0
  527. package/lib/share/ui/ShareDialog.js.map +1 -0
  528. package/lib/share/ui/ShareDialogContent.d.ts +13 -0
  529. package/lib/share/ui/ShareDialogContent.d.ts.map +1 -0
  530. package/lib/share/ui/ShareDialogContent.js +71 -0
  531. package/lib/share/ui/ShareDialogContent.js.map +1 -0
  532. package/lib/share/ui/SharePartOptions.d.ts +18 -0
  533. package/lib/share/ui/SharePartOptions.d.ts.map +1 -0
  534. package/lib/share/ui/SharePartOptions.js +22 -0
  535. package/lib/share/ui/SharePartOptions.js.map +1 -0
  536. package/lib/share/ui/draft.d.ts +13 -0
  537. package/lib/share/ui/draft.d.ts.map +1 -0
  538. package/lib/share/ui/draft.js +16 -0
  539. package/lib/share/ui/draft.js.map +1 -0
  540. package/lib/share/ui/hiddenParts.d.ts +17 -0
  541. package/lib/share/ui/hiddenParts.d.ts.map +1 -0
  542. package/lib/share/ui/hiddenParts.js +21 -0
  543. package/lib/share/ui/hiddenParts.js.map +1 -0
  544. package/lib/share/ui/index.d.ts +10 -0
  545. package/lib/share/ui/index.d.ts.map +1 -0
  546. package/lib/share/ui/index.js +6 -0
  547. package/lib/share/ui/index.js.map +1 -0
  548. package/lib/shared/ui/index.d.ts +2 -1
  549. package/lib/shared/ui/index.d.ts.map +1 -1
  550. package/lib/shared/ui/index.js +1 -1
  551. package/lib/shared/ui/index.js.map +1 -1
  552. package/lib/state/ui/index.d.ts +3 -0
  553. package/lib/state/ui/index.d.ts.map +1 -0
  554. package/lib/state/ui/index.js +2 -0
  555. package/lib/state/ui/index.js.map +1 -0
  556. package/lib/state/ui/mergeStored.d.ts +27 -0
  557. package/lib/state/ui/mergeStored.d.ts.map +1 -0
  558. package/lib/state/ui/mergeStored.js +82 -0
  559. package/lib/state/ui/mergeStored.js.map +1 -0
  560. package/lib/state/ui/persistBucket.d.ts +65 -0
  561. package/lib/state/ui/persistBucket.d.ts.map +1 -0
  562. package/lib/state/ui/persistBucket.js +90 -0
  563. package/lib/state/ui/persistBucket.js.map +1 -0
  564. package/lib/structure/core/editorValue.d.ts +69 -0
  565. package/lib/structure/core/editorValue.d.ts.map +1 -0
  566. package/lib/structure/core/editorValue.js +72 -0
  567. package/lib/structure/core/editorValue.js.map +1 -0
  568. package/lib/structure/core/fragmentQuery.d.ts +33 -0
  569. package/lib/structure/core/fragmentQuery.d.ts.map +1 -0
  570. package/lib/structure/core/fragmentQuery.js +37 -0
  571. package/lib/structure/core/fragmentQuery.js.map +1 -0
  572. package/lib/structure/core/index.d.ts +11 -0
  573. package/lib/structure/core/index.d.ts.map +1 -0
  574. package/lib/structure/core/index.js +6 -0
  575. package/lib/structure/core/index.js.map +1 -0
  576. package/lib/structure/core/molfile.d.ts +42 -0
  577. package/lib/structure/core/molfile.d.ts.map +1 -0
  578. package/lib/structure/core/molfile.js +74 -0
  579. package/lib/structure/core/molfile.js.map +1 -0
  580. package/lib/structure/core/readStructure.d.ts +37 -0
  581. package/lib/structure/core/readStructure.d.ts.map +1 -0
  582. package/lib/structure/core/readStructure.js +59 -0
  583. package/lib/structure/core/readStructure.js.map +1 -0
  584. package/lib/structure/core/structureSource.d.ts +34 -0
  585. package/lib/structure/core/structureSource.d.ts.map +1 -0
  586. package/lib/structure/core/structureSource.js +32 -0
  587. package/lib/structure/core/structureSource.js.map +1 -0
  588. package/lib/structure/core/toolbarFloor.d.ts +16 -0
  589. package/lib/structure/core/toolbarFloor.d.ts.map +1 -0
  590. package/lib/structure/core/toolbarFloor.js +27 -0
  591. package/lib/structure/core/toolbarFloor.js.map +1 -0
  592. package/lib/structure/ui/EditorCanvas.d.ts +55 -0
  593. package/lib/structure/ui/EditorCanvas.d.ts.map +1 -0
  594. package/lib/structure/ui/EditorCanvas.js +41 -0
  595. package/lib/structure/ui/EditorCanvas.js.map +1 -0
  596. package/lib/structure/ui/Structure.d.ts +122 -0
  597. package/lib/structure/ui/Structure.d.ts.map +1 -0
  598. package/lib/structure/ui/Structure.js +28 -0
  599. package/lib/structure/ui/Structure.js.map +1 -0
  600. package/lib/structure/ui/StructureEditor.d.ts +75 -0
  601. package/lib/structure/ui/StructureEditor.d.ts.map +1 -0
  602. package/lib/structure/ui/StructureEditor.js +83 -0
  603. package/lib/structure/ui/StructureEditor.js.map +1 -0
  604. package/lib/structure/ui/StructurePlaceholder.d.ts +29 -0
  605. package/lib/structure/ui/StructurePlaceholder.d.ts.map +1 -0
  606. package/lib/structure/ui/StructurePlaceholder.js +19 -0
  607. package/lib/structure/ui/StructurePlaceholder.js.map +1 -0
  608. package/lib/structure/ui/StructureSvg.d.ts +58 -0
  609. package/lib/structure/ui/StructureSvg.d.ts.map +1 -0
  610. package/lib/structure/ui/StructureSvg.js +33 -0
  611. package/lib/structure/ui/StructureSvg.js.map +1 -0
  612. package/lib/structure/ui/index.d.ts +19 -0
  613. package/lib/structure/ui/index.d.ts.map +1 -0
  614. package/lib/structure/ui/index.js +15 -0
  615. package/lib/structure/ui/index.js.map +1 -0
  616. package/lib/structure/ui/useToolbarFloor.d.ts +26 -0
  617. package/lib/structure/ui/useToolbarFloor.d.ts.map +1 -0
  618. package/lib/structure/ui/useToolbarFloor.js +70 -0
  619. package/lib/structure/ui/useToolbarFloor.js.map +1 -0
  620. package/lib/structure.d.ts +3 -0
  621. package/lib/structure.d.ts.map +1 -0
  622. package/lib/structure.js +3 -0
  623. package/lib/structure.js.map +1 -0
  624. package/lib/ui.d.ts +13 -0
  625. package/lib/ui.d.ts.map +1 -1
  626. package/lib/ui.js +13 -0
  627. package/lib/ui.js.map +1 -1
  628. package/lib/worker/core/errors.d.ts +15 -0
  629. package/lib/worker/core/errors.d.ts.map +1 -0
  630. package/lib/worker/core/errors.js +15 -0
  631. package/lib/worker/core/errors.js.map +1 -0
  632. package/lib/worker/core/index.d.ts +5 -0
  633. package/lib/worker/core/index.d.ts.map +1 -0
  634. package/lib/worker/core/index.js +3 -0
  635. package/lib/worker/core/index.js.map +1 -0
  636. package/lib/worker/core/messages.d.ts +48 -0
  637. package/lib/worker/core/messages.d.ts.map +1 -0
  638. package/lib/worker/core/messages.js +2 -0
  639. package/lib/worker/core/messages.js.map +1 -0
  640. package/lib/worker/core/workerChannel.d.ts +69 -0
  641. package/lib/worker/core/workerChannel.d.ts.map +1 -0
  642. package/lib/worker/core/workerChannel.js +121 -0
  643. package/lib/worker/core/workerChannel.js.map +1 -0
  644. package/package.json +18 -5
  645. package/src/capsule/ui/CapsuleFilter.tsx +119 -0
  646. package/src/capsule/ui/index.ts +2 -0
  647. package/src/chrome/ui/NavLink.tsx +88 -0
  648. package/src/chrome/ui/NavMenuButton.tsx +95 -0
  649. package/src/chrome/ui/SiteFooter.tsx +65 -0
  650. package/src/chrome/ui/SiteHeader.tsx +119 -0
  651. package/src/chrome/ui/index.ts +11 -0
  652. package/src/chrome/ui/navItem.ts +60 -0
  653. package/src/chrome/ui/useCompactHeader.ts +81 -0
  654. package/src/citation/core/clipboard.ts +27 -11
  655. package/src/citation/core/download.ts +25 -15
  656. package/src/citation/core/index.ts +8 -3
  657. package/src/citation/core/works.ts +81 -0
  658. package/src/citation/ui/CitationMenu.tsx +104 -89
  659. package/src/citation/ui/CitationPreview.tsx +18 -8
  660. package/src/citation/ui/CiteButton.tsx +24 -9
  661. package/src/citation/ui/CopyFormatEntries.tsx +84 -0
  662. package/src/citation/ui/WorkEntry.tsx +80 -0
  663. package/src/citation/ui/entries.tsx +18 -20
  664. package/src/citation/ui/index.ts +10 -2
  665. package/src/citation/ui/useCopyFeedback.ts +76 -0
  666. package/src/clipboard/core/index.ts +1 -0
  667. package/src/clipboard/core/writeToClipboard.ts +47 -0
  668. package/src/clipboard/ui/CodeBlock.tsx +110 -0
  669. package/src/clipboard/ui/CopyButton.tsx +111 -0
  670. package/src/clipboard/ui/index.ts +9 -0
  671. package/src/clipboard/ui/useCopyToClipboard.ts +57 -0
  672. package/src/color/core/contrast.ts +85 -0
  673. package/src/color/core/hex.ts +57 -0
  674. package/src/color/core/index.ts +4 -0
  675. package/src/color/core/scale.ts +132 -0
  676. package/src/color/ui/ColorScaleLegend.tsx +144 -0
  677. package/src/color/ui/index.ts +2 -0
  678. package/src/core.ts +11 -0
  679. package/src/credits/core/credits.ts +183 -0
  680. package/src/credits/core/index.ts +2 -0
  681. package/src/credits/ui/CreditsList.tsx +82 -0
  682. package/src/credits/ui/index.ts +2 -0
  683. package/src/delimited/core/delimiters.ts +64 -0
  684. package/src/delimited/core/index.ts +11 -0
  685. package/src/delimited/core/readDelimited.ts +132 -0
  686. package/src/delimited/core/rowsToDelimited.ts +135 -0
  687. package/src/delimited/core/toDelimited.ts +69 -0
  688. package/src/delimited/ui/DelimitedTextDialog.tsx +49 -0
  689. package/src/delimited/ui/DelimitedTextPanel.tsx +161 -0
  690. package/src/delimited/ui/index.ts +4 -0
  691. package/src/disclosure/ui/CollapsibleSection.tsx +150 -0
  692. package/src/disclosure/ui/index.ts +4 -0
  693. package/src/disclosure/ui/useDisclosure.ts +35 -0
  694. package/src/download/core/downloadBlob.ts +19 -0
  695. package/src/download/core/downloadText.ts +19 -0
  696. package/src/download/core/index.ts +3 -0
  697. package/src/download/core/sanitizeFileName.ts +33 -0
  698. package/src/ecosystem/core/index.ts +3 -0
  699. package/src/ecosystem/core/links.ts +29 -0
  700. package/src/ecosystem/core/lookup.ts +41 -0
  701. package/src/ecosystem/core/sites.ts +17 -0
  702. package/src/ecosystem/core/tokens.ts +47 -0
  703. package/src/ecosystem/ui/SiteTheme.tsx +23 -0
  704. package/src/ecosystem/ui/Wordmark.tsx +65 -0
  705. package/src/ecosystem/ui/index.ts +4 -0
  706. package/src/ecosystem/ui/marks.tsx +54 -15
  707. package/src/error/ui/ErrorBoundary.tsx +94 -0
  708. package/src/error/ui/ErrorFallback.tsx +64 -0
  709. package/src/error/ui/index.ts +4 -0
  710. package/src/error/ui/toError.ts +33 -0
  711. package/src/format/core/index.ts +9 -0
  712. package/src/format/core/missing.ts +6 -0
  713. package/src/format/core/numbers.ts +84 -0
  714. package/src/format/core/units.ts +60 -0
  715. package/src/format/core/words.ts +17 -0
  716. package/src/help/ui/HelpBody.tsx +130 -0
  717. package/src/help/ui/HelpIcon.tsx +53 -0
  718. package/src/help/ui/HelpToolbarButton.tsx +72 -0
  719. package/src/help/ui/HelpTooltip.tsx +72 -0
  720. package/src/help/ui/index.ts +8 -0
  721. package/src/hooks/ui/index.ts +6 -0
  722. package/src/hooks/ui/listNavigation.ts +116 -0
  723. package/src/hooks/ui/useContainerSize.ts +32 -0
  724. package/src/hooks/ui/useDebouncedValue.ts +29 -0
  725. package/src/hooks/ui/useListKeyboardNavigation.ts +37 -0
  726. package/src/hooks/ui/useResizeObserver.ts +50 -0
  727. package/src/orbital/core/atomicGrid.ts +53 -1
  728. package/src/orbital/core/index.ts +7 -16
  729. package/src/orbital/core/isovalue.ts +146 -0
  730. package/src/orbital/core/sample.ts +25 -5
  731. package/src/orbital/ui/AtomicOrbitalCanvas.tsx +19 -3
  732. package/src/orbital/ui/AtomicOrbitalViewer.tsx +5 -1
  733. package/src/orbital/ui/renderVolume.ts +29 -16
  734. package/src/orbital/ui/viewer.ts +6 -1
  735. package/src/orbital/ui/volumeField.ts +5 -49
  736. package/src/pedagogy/core/glossary.ts +122 -0
  737. package/src/pedagogy/core/index.ts +28 -0
  738. package/src/pedagogy/core/jsonStorage.ts +51 -0
  739. package/src/pedagogy/core/progress.ts +205 -0
  740. package/src/pedagogy/core/types.ts +78 -0
  741. package/src/pedagogy/core/validation.ts +109 -0
  742. package/src/pedagogy/ui/ExerciseActions.tsx +129 -0
  743. package/src/pedagogy/ui/ExerciseProgressHeader.tsx +135 -0
  744. package/src/pedagogy/ui/ExerciseTags.tsx +85 -0
  745. package/src/pedagogy/ui/GlossaryProvider.tsx +31 -0
  746. package/src/pedagogy/ui/GlossaryText.tsx +164 -0
  747. package/src/pedagogy/ui/HintLadder.tsx +95 -0
  748. package/src/pedagogy/ui/ReferenceGrid.tsx +69 -0
  749. package/src/pedagogy/ui/ReferenceSectionBlock.tsx +175 -0
  750. package/src/pedagogy/ui/SyntaxTooltip.tsx +222 -0
  751. package/src/pedagogy/ui/TestCaseList.tsx +122 -0
  752. package/src/pedagogy/ui/TutorialStepStrip.tsx +230 -0
  753. package/src/pedagogy/ui/exerciseMeta.ts +45 -0
  754. package/src/pedagogy/ui/glossaryContext.ts +23 -0
  755. package/src/pedagogy/ui/index.ts +37 -0
  756. package/src/pedagogy/ui/tutorialLevels.ts +27 -0
  757. package/src/router/core/address.ts +74 -0
  758. package/src/router/core/basePath.ts +76 -0
  759. package/src/router/core/index.ts +26 -0
  760. package/src/router/core/legacyHash.ts +77 -0
  761. package/src/router/core/pageAddresses.ts +106 -0
  762. package/src/router/core/query.ts +87 -0
  763. package/src/router/core/tabRouter.ts +214 -0
  764. package/src/seo/core/documentMeta.ts +92 -0
  765. package/src/seo/core/index.ts +6 -0
  766. package/src/share/core/config.ts +165 -0
  767. package/src/share/core/escape.ts +22 -0
  768. package/src/share/core/index.ts +31 -0
  769. package/src/share/core/params.ts +176 -0
  770. package/src/share/core/query.ts +72 -0
  771. package/src/share/core/url.ts +105 -0
  772. package/src/share/core/vocabulary.ts +60 -0
  773. package/src/share/ui/HiddenPartsProvider.tsx +34 -0
  774. package/src/share/ui/PagePart.tsx +26 -0
  775. package/src/share/ui/ShareButton.tsx +84 -0
  776. package/src/share/ui/ShareDialog.tsx +114 -0
  777. package/src/share/ui/ShareDialogContent.tsx +189 -0
  778. package/src/share/ui/SharePartOptions.tsx +51 -0
  779. package/src/share/ui/draft.ts +19 -0
  780. package/src/share/ui/hiddenParts.ts +22 -0
  781. package/src/share/ui/index.ts +9 -0
  782. package/src/shared/ui/index.ts +2 -1
  783. package/src/state/ui/index.ts +6 -0
  784. package/src/state/ui/mergeStored.ts +87 -0
  785. package/src/state/ui/persistBucket.ts +147 -0
  786. package/src/structure/core/editorValue.ts +116 -0
  787. package/src/structure/core/fragmentQuery.ts +50 -0
  788. package/src/structure/core/index.ts +13 -0
  789. package/src/structure/core/molfile.ts +90 -0
  790. package/src/structure/core/readStructure.ts +73 -0
  791. package/src/structure/core/structureSource.ts +57 -0
  792. package/src/structure/core/toolbarFloor.ts +31 -0
  793. package/src/structure/ui/EditorCanvas.tsx +130 -0
  794. package/src/structure/ui/Structure.tsx +183 -0
  795. package/src/structure/ui/StructureEditor.tsx +196 -0
  796. package/src/structure/ui/StructurePlaceholder.tsx +48 -0
  797. package/src/structure/ui/StructureSvg.tsx +110 -0
  798. package/src/structure/ui/index.ts +22 -0
  799. package/src/structure/ui/useToolbarFloor.ts +93 -0
  800. package/src/structure.ts +2 -0
  801. package/src/ui.ts +13 -0
  802. package/src/worker/core/errors.ts +15 -0
  803. package/src/worker/core/index.ts +8 -0
  804. package/src/worker/core/messages.ts +47 -0
  805. package/src/worker/core/workerChannel.ts +218 -0
  806. package/styles/chrome.css +223 -0
@@ -16,7 +16,11 @@ import type { AtomicOrbital } from './atomicOrbitals.ts';
16
16
  import { hydrogenicParametersOf } from './atomicOrbitals.ts';
17
17
  import type { GridBox, OrbitalEvaluator, OrbitalGrid } from './grid.ts';
18
18
  import { evaluateGrid } from './grid.ts';
19
- import { createRadialFunction, enclosingRadius } from './hydrogenic.ts';
19
+ import {
20
+ createRadialFunction,
21
+ enclosingRadius,
22
+ radialNodeRadii,
23
+ } from './hydrogenic.ts';
20
24
 
21
25
  /** How finely, and how far out, an orbital is sampled. */
22
26
  export interface AtomicGridOptions {
@@ -105,9 +109,57 @@ export function atomicGridBox(
105
109
  };
106
110
  }
107
111
 
112
+ /** How finely one orbital may be sampled, whatever its shape asks for. */
113
+ export interface ResolutionLimits {
114
+ /** Samples per edge no orbital drops below. */
115
+ floor: number;
116
+ /** Samples per edge no orbital exceeds. */
117
+ cap: number;
118
+ }
119
+
120
+ /**
121
+ * How finely this particular orbital has to be sampled.
122
+ *
123
+ * One resolution for a whole periodic table draws the nested orbitals badly.
124
+ * The box is sized by the outermost lobe, but a `4p` also has to separate two
125
+ * inner shells packed against the nucleus, and at 56 samples per edge xenon's
126
+ * innermost 4p lobe spans **6.6 voxels** while the outer one spans 41 — the
127
+ * inner shells come out as lumps and the outer surface visibly faceted. What
128
+ * sets the requirement is therefore the ratio between the box and the smallest
129
+ * feature in it, not the orbital's size, which is why a nodeless orbital
130
+ * (every `1s`, `2p`, `3d`, `4f`) stays on the floor and costs nothing extra.
131
+ *
132
+ * The cap is not a budget cheat: the innermost lobe of caesium's `7s` would
133
+ * need 858 samples per edge, and no uniform grid the browser can afford
134
+ * resolves it. Those orbitals are drawn as well as the cap allows.
135
+ * @param orbital - The orbital to draw.
136
+ * @param limits - See {@link ResolutionLimits}.
137
+ * @returns Samples along each edge of the cube.
138
+ */
139
+ export function atomicGridResolution(
140
+ orbital: AtomicOrbital,
141
+ limits: ResolutionLimits,
142
+ ): number {
143
+ const { floor, cap } = limits;
144
+ const parameters = hydrogenicParametersOf(orbital);
145
+ const innermost = radialNodeRadii(parameters)[0];
146
+ if (innermost === undefined || !(innermost > 0)) return Math.min(floor, cap);
147
+ const half = atomicGridBox(orbital).size.x / 2;
148
+ // The samples span the box edge to edge, so `resolution - 1` of them cover
149
+ // it: a lobe of radius r gets `r (resolution - 1) / half` across its diameter.
150
+ const needed = Math.ceil((INNER_LOBE_SAMPLES * half) / innermost) + 1;
151
+ return Math.min(cap, Math.max(floor, needed));
152
+ }
153
+
108
154
  /** Samples per edge; the cost is the cube of it. */
109
155
  const DEFAULT_RESOLUTION = 56;
110
156
 
157
+ /**
158
+ * Samples the innermost radial lobe is asked to span, edge to edge. Below
159
+ * about eight, marching cubes turns a sphere into a faceted blob.
160
+ */
161
+ const INNER_LOBE_SAMPLES = 12;
162
+
111
163
  /** A tail past this holds too little density to change the surface. */
112
164
  const DEFAULT_ENCLOSED_FRACTION = 0.985;
113
165
 
@@ -1,30 +1,20 @@
1
- export type { AtomicGridOptions } from './atomicGrid.ts';
2
- export {
3
- atomicGridBox,
4
- createAtomicOrbitalEvaluator,
5
- sampleAtomicOrbital,
6
- } from './atomicGrid.ts';
1
+ export type { ResolutionLimits } from './atomicGrid.ts';
2
+ export { atomicGridResolution } from './atomicGrid.ts';
7
3
  export type { AtomicOrbital, AtomicOrbitalOptions } from './atomicOrbitals.ts';
8
4
  export {
9
5
  atomicOrbitalsOf,
10
6
  defaultOrbitalId,
11
7
  findAtomicOrbital,
12
8
  hydrogenicParametersOf,
13
- orbitalId,
14
9
  } from './atomicOrbitals.ts';
15
10
  export type { Vec3 } from './constants.ts';
16
- export {
17
- BOHR_IN_ANGSTROM,
18
- ENCLOSED_WEIGHT,
19
- RYDBERG_ELECTRONVOLTS,
20
- } from './constants.ts';
11
+ export { BOHR_IN_ANGSTROM, RYDBERG_ELECTRONVOLTS } from './constants.ts';
21
12
  export type { Subshell, SubshellOccupancy } from './electronConfiguration.ts';
22
13
  export {
23
14
  ELEMENT_ANOMALIES,
24
15
  HIGHEST_ATOMIC_NUMBER,
25
16
  MADELUNG_ORDER,
26
17
  NOBLE_GASES,
27
- assertAtomicNumber,
28
18
  aufbauConfigurationOf,
29
19
  configurationOf,
30
20
  coreAtomicNumber,
@@ -33,10 +23,11 @@ export {
33
23
  isAnomalous,
34
24
  subshellCapacity,
35
25
  subshellLabel,
36
- superscript,
37
26
  } from './electronConfiguration.ts';
38
27
  export type { GridBox, OrbitalEvaluator, OrbitalGrid } from './grid.ts';
39
28
  export { evaluateGrid, gridIndex } from './grid.ts';
29
+ export type { OrbitalContour } from './isovalue.ts';
30
+ export { enclosedReach, isocontourCutoff, orbitalContour } from './isovalue.ts';
40
31
  export type { HydrogenicParameters } from './hydrogenic.ts';
41
32
  export {
42
33
  createRadialFunction,
@@ -67,6 +58,6 @@ export type {
67
58
  AtomicSampleResult,
68
59
  AtomicSampler,
69
60
  } from './sample.ts';
70
- export { runAtomicSample, sampleInProcess } from './sample.ts';
61
+ export { runAtomicSample } from './sample.ts';
71
62
  export type { Screening } from './screening.ts';
72
- export { groupRank, slaterScreening } from './screening.ts';
63
+ export { slaterScreening } from './screening.ts';
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Choosing the value a signed wavefunction's isosurface is drawn at.
3
+ *
4
+ * The surface is named by how much of the electron it holds, not by an
5
+ * amplitude: `ENCLOSED_WEIGHT` of `∫|ψ|² dV` inside it and the tail
6
+ * outside. On a uniform grid that is a weighted quantile of the samples, and
7
+ * the isovalue is the `|ψ|` at which the quantile falls.
8
+ *
9
+ * molstar ships `computeOrbitalIsocontourValues` for the same job, and it
10
+ * cannot be used here. It abandons any field whose mean `ψ²` is under an
11
+ * absolute `1e-5` and returns no isovalue at all — a guard against degenerate
12
+ * data that instead reads the amplitude *scale*. Amplitudes are Å^(-3/2), so a
13
+ * diffuse orbital is normalised straight into that range and draws nothing:
14
+ * caesium's 6s reaches 13 Å, and 2588 of the 7460 orbitals lcao.cheminfo.org
15
+ * offers came back blank. A quantile has no scale of its own and cannot.
16
+ *
17
+ * Every pass below touches each of the million-odd samples, so all of them are
18
+ * indexed loops: `for…of` over a `Float32Array` measures 6.7× slower.
19
+ */
20
+
21
+ import { ENCLOSED_WEIGHT } from './constants.ts';
22
+ import type { OrbitalGrid } from './grid.ts';
23
+
24
+ /**
25
+ * The `|ψ|` whose surface encloses a given share of the sampled electron.
26
+ * @param data - The sampled amplitudes.
27
+ * @param enclosedWeight - Share of `∑ψ²` to hold inside, between 0 and 1.
28
+ * @returns The isovalue, or 0 when the field is empty — a nodeless orbital
29
+ * sampled where it has no amplitude at all.
30
+ * @throws {Error} When `enclosedWeight` is outside `(0, 1)`.
31
+ */
32
+ export function isocontourCutoff(
33
+ data: Float32Array,
34
+ enclosedWeight: number = ENCLOSED_WEIGHT,
35
+ ): number {
36
+ if (!(enclosedWeight > 0) || enclosedWeight >= 1) {
37
+ throw new RangeError('the enclosed weight must be in (0, 1)');
38
+ }
39
+ let total = 0;
40
+ let peak = 0;
41
+ for (let index = data.length - 1; index >= 0; index--) {
42
+ const value = data[index] as number;
43
+ const weight = value * value;
44
+ total += weight;
45
+ if (weight > peak) peak = weight;
46
+ }
47
+ if (!(total > 0)) return 0;
48
+
49
+ // Bins are logarithmic because a wavefunction spans decades between its peak
50
+ // and its tail while the isovalue sits far below the peak: linear bins would
51
+ // drop every sample that decides the answer into the first one.
52
+ const bins = new Float64Array(BIN_COUNT);
53
+ const peakLogarithm = Math.log2(peak);
54
+ for (let index = data.length - 1; index >= 0; index--) {
55
+ const value = data[index] as number;
56
+ const weight = value * value;
57
+ if (weight === 0) continue;
58
+ const bin = Math.floor(
59
+ (peakLogarithm - Math.log2(weight)) * BINS_PER_OCTAVE,
60
+ );
61
+ const clamped = bin < 0 ? 0 : Math.min(bin, BIN_COUNT - 1);
62
+ bins[clamped] = (bins[clamped] as number) + weight;
63
+ }
64
+
65
+ const target = total * enclosedWeight;
66
+ let running = 0;
67
+ for (let bin = 0; bin < BIN_COUNT; bin++) {
68
+ running += bins[bin] as number;
69
+ // Everything above this bin's lower edge is what has just been counted.
70
+ if (running >= target) {
71
+ return Math.sqrt(peak * 2 ** (-(bin + 1) / BINS_PER_OCTAVE));
72
+ }
73
+ }
74
+ return 0;
75
+ }
76
+
77
+ /**
78
+ * How far from the centre of the box the drawn surface actually reaches.
79
+ *
80
+ * Molstar sizes a volume representation's bounding sphere from the whole
81
+ * sampled box, which is deliberately larger than the isosurface inside it, so a
82
+ * camera framing that sphere leaves the orbital a quarter of the frame wide.
83
+ * Measuring the samples that are really enclosed gives the camera the extent it
84
+ * has to fill.
85
+ * @param field - The sampled field.
86
+ * @param cutoff - The isovalue the surfaces are drawn at.
87
+ * @returns The reach in ångström, or 0 when nothing is enclosed.
88
+ */
89
+ export function enclosedReach(field: OrbitalGrid, cutoff: number): number {
90
+ if (!(cutoff > 0)) return 0;
91
+ const { data, dimensions, origin, spacing } = field;
92
+ const [countX, countY, countZ] = dimensions;
93
+ const centreX = origin.x + ((countX - 1) * spacing) / 2;
94
+ const centreY = origin.y + ((countY - 1) * spacing) / 2;
95
+ const centreZ = origin.z + ((countZ - 1) * spacing) / 2;
96
+ let furthest = 0;
97
+ let index = 0;
98
+ for (let indexX = 0; indexX < countX; indexX++) {
99
+ const dx = origin.x + indexX * spacing - centreX;
100
+ for (let indexY = 0; indexY < countY; indexY++) {
101
+ const dy = origin.y + indexY * spacing - centreY;
102
+ for (let indexZ = 0; indexZ < countZ; indexZ++) {
103
+ const value = data[index++] as number;
104
+ if (value < cutoff && value > -cutoff) continue;
105
+ const dz = origin.z + indexZ * spacing - centreZ;
106
+ const squared = dx * dx + dy * dy + dz * dz;
107
+ if (squared > furthest) furthest = squared;
108
+ }
109
+ }
110
+ }
111
+ return Math.sqrt(furthest);
112
+ }
113
+
114
+ /** Which isovalue each phase is drawn at, and how far the pair reaches. */
115
+ export interface OrbitalContour {
116
+ /** `|ψ|` on the surface; 0 when there is nothing to draw. */
117
+ cutoff: number;
118
+ /** Distance from the centre of the box to the outermost enclosed sample. */
119
+ reach: number;
120
+ }
121
+
122
+ /**
123
+ * The isovalue and the extent of one sampled orbital's surface pair.
124
+ *
125
+ * Both phases come from one cutoff, so they can never disagree about where the
126
+ * node between them is.
127
+ * @param field - The sampled field.
128
+ * @param enclosedWeight - Share of `∑ψ²` to hold inside.
129
+ * @returns See {@link OrbitalContour}.
130
+ */
131
+ export function orbitalContour(
132
+ field: OrbitalGrid,
133
+ enclosedWeight: number = ENCLOSED_WEIGHT,
134
+ ): OrbitalContour {
135
+ const cutoff = isocontourCutoff(field.data, enclosedWeight);
136
+ return { cutoff, reach: enclosedReach(field, cutoff) };
137
+ }
138
+
139
+ /**
140
+ * Bins per doubling of `ψ²`, so the isovalue lands within 2.2% in `|ψ|`.
141
+ * Finer than the grid spacing can resolve on the surface it produces.
142
+ */
143
+ const BINS_PER_OCTAVE = 16;
144
+
145
+ /** 128 octaves of `ψ²`, far past the dynamic range of a sampled orbital. */
146
+ const BIN_COUNT = 2048;
@@ -11,8 +11,8 @@
11
11
  * `sample` prop; one that does not gets the in-process version for free.
12
12
  */
13
13
 
14
- import type { AtomicGridOptions } from './atomicGrid.ts';
15
- import { sampleAtomicOrbital } from './atomicGrid.ts';
14
+ import type { AtomicGridOptions, ResolutionLimits } from './atomicGrid.ts';
15
+ import { atomicGridResolution, sampleAtomicOrbital } from './atomicGrid.ts';
16
16
  import {
17
17
  atomicOrbitalsOf,
18
18
  findAtomicOrbital,
@@ -20,6 +20,8 @@ import {
20
20
  } from './atomicOrbitals.ts';
21
21
  import type { OrbitalGrid } from './grid.ts';
22
22
  import { radialNodeRadii } from './hydrogenic.ts';
23
+ import type { OrbitalContour } from './isovalue.ts';
24
+ import { orbitalContour } from './isovalue.ts';
23
25
 
24
26
  /** Which orbital to sample, and how finely. */
25
27
  export interface AtomicSampleRequest {
@@ -29,15 +31,27 @@ export interface AtomicSampleRequest {
29
31
  orbitalId: string;
30
32
  /**
31
33
  * Samples along each edge of the cube. The cost is the cube of this.
34
+ *
35
+ * A number fixes the resolution. {@link ResolutionLimits} lets the orbital's
36
+ * own shape pick one between the two, which is what a nested orbital needs —
37
+ * see {@link atomicGridResolution}.
32
38
  * @default 56
33
39
  */
34
- resolution?: number;
40
+ resolution?: number | ResolutionLimits;
35
41
  }
36
42
 
37
43
  /** What one sampling job produces. */
38
44
  export interface AtomicSampleResult {
39
45
  /** The signed field, ready for an isosurface. */
40
46
  grid: OrbitalGrid;
47
+ /**
48
+ * The isovalue both phases are drawn at, and how far the pair reaches.
49
+ *
50
+ * Measured here rather than beside the renderer: both passes are O(samples),
51
+ * and at the resolutions a nested orbital asks for that is over a million of
52
+ * them on whichever thread runs this.
53
+ */
54
+ contour: OrbitalContour;
41
55
  /** Radii of the orbital's radial nodes, ångström, ascending. */
42
56
  nodeRadii: number[];
43
57
  }
@@ -65,9 +79,15 @@ export function runAtomicSample(
65
79
  );
66
80
  }
67
81
  const options: AtomicGridOptions = {};
68
- if (resolution !== undefined) options.resolution = resolution;
82
+ if (typeof resolution === 'number') {
83
+ options.resolution = resolution;
84
+ } else if (resolution !== undefined) {
85
+ options.resolution = atomicGridResolution(orbital, resolution);
86
+ }
87
+ const grid = sampleAtomicOrbital(orbital, options);
69
88
  return {
70
- grid: sampleAtomicOrbital(orbital, options),
89
+ grid,
90
+ contour: orbitalContour(grid),
71
91
  nodeRadii: radialNodeRadii(hydrogenicParametersOf(orbital)),
72
92
  };
73
93
  }
@@ -9,6 +9,7 @@
9
9
  import type { CSSProperties, ReactElement } from 'react';
10
10
  import { useEffect, useRef, useState } from 'react';
11
11
 
12
+ import type { ResolutionLimits } from '../core/atomicGrid.ts';
12
13
  import type { PhasePalette } from '../core/palette.ts';
13
14
  import { PHASE_PALETTES } from '../core/palette.ts';
14
15
  import type { AtomicSampler } from '../core/sample.ts';
@@ -30,9 +31,13 @@ export interface AtomicOrbitalCanvasProps {
30
31
  palette?: PhasePalette;
31
32
  /**
32
33
  * Samples along each edge of the cube; the cost is the cube of it.
34
+ *
35
+ * A number fixes it. A {@link ResolutionLimits} pair lets each orbital's own
36
+ * shape pick a resolution between the two, which is what the orbitals with
37
+ * inner shells packed against the nucleus need.
33
38
  * @default 56
34
39
  */
35
- resolution?: number;
40
+ resolution?: number | ResolutionLimits;
36
41
  /**
37
42
  * Whether the scene turns on its own, which is what makes a still screenshot
38
43
  * of a 3D shape readable.
@@ -83,7 +88,7 @@ export function AtomicOrbitalCanvas(
83
88
 
84
89
  // What the canvas is being asked to show. Comparing it with what it *is*
85
90
  // showing gives the progress note without a state write on every prop change.
86
- const wanted = `${atomicNumber}|${orbitalId}|${resolution}|${palette.id}`;
91
+ const wanted = `${atomicNumber}|${orbitalId}|${resolutionKey(resolution)}|${palette.id}`;
87
92
  const busy = drawn !== wanted;
88
93
 
89
94
  // Callbacks are read through refs so a caller passing an inline arrow does
@@ -120,7 +125,7 @@ export function AtomicOrbitalCanvas(
120
125
  .then(async (result) => {
121
126
  if (cancelled) return;
122
127
  callbacks.current.onNodeRadii?.(result.nodeRadii);
123
- const reach = await viewer.showOrbital(result.grid, {
128
+ const reach = await viewer.showOrbital(result.grid, result.contour, {
124
129
  positiveColour: palette.positive,
125
130
  negativeColour: palette.negative,
126
131
  });
@@ -152,6 +157,17 @@ export function AtomicOrbitalCanvas(
152
157
  /** Samples per edge; 56 resolves the radial node of a 3s in about 25 ms. */
153
158
  const DEFAULT_RESOLUTION = 56;
154
159
 
160
+ /**
161
+ * A stable identity for either shape the resolution prop can take.
162
+ * @param resolution - A fixed sample count, or the limits it may vary between.
163
+ * @returns A string that changes exactly when the sampling would.
164
+ */
165
+ function resolutionKey(resolution: number | ResolutionLimits): string {
166
+ return typeof resolution === 'number'
167
+ ? String(resolution)
168
+ : `${resolution.floor}-${resolution.cap}`;
169
+ }
170
+
155
171
  /**
156
172
  * A square, centred stage: an atomic orbital is as tall as it is wide, so a
157
173
  * square wastes the least of the frame and keeps the lobes the same size when
@@ -18,6 +18,7 @@
18
18
  import type { CSSProperties, ReactElement, ReactNode } from 'react';
19
19
  import { Suspense, lazy, useState } from 'react';
20
20
 
21
+ import type { ResolutionLimits } from '../core/atomicGrid.ts';
21
22
  import type { PhasePalette } from '../core/palette.ts';
22
23
  import type { AtomicSampler } from '../core/sample.ts';
23
24
 
@@ -44,9 +45,12 @@ export interface AtomicOrbitalViewerProps {
44
45
  palette?: PhasePalette;
45
46
  /**
46
47
  * Samples along each edge of the cube; the cost is the cube of it.
48
+ *
49
+ * A number fixes it. A {@link ResolutionLimits} pair lets each orbital's own
50
+ * shape pick a resolution between the two.
47
51
  * @default 56
48
52
  */
49
- resolution?: number;
53
+ resolution?: number | ResolutionLimits;
50
54
  /**
51
55
  * Whether the scene turns on its own.
52
56
  * @default false
@@ -14,7 +14,6 @@
14
14
  * them wholesale.
15
15
  */
16
16
 
17
- import { computeOrbitalIsocontourValues } from 'molstar/lib/extensions/alpha-orbitals/orbitals.js';
18
17
  import type { Volume } from 'molstar/lib/mol-model/volume.js';
19
18
  import type { PluginContext } from 'molstar/lib/mol-plugin/context.js';
20
19
  import { createVolumeRepresentationParams } from 'molstar/lib/mol-plugin-state/helpers/volume-representation-params.js';
@@ -22,10 +21,10 @@ import type { Representation } from 'molstar/lib/mol-repr/representation.js';
22
21
  import { Theme } from 'molstar/lib/mol-theme/theme.js';
23
22
  import { Color } from 'molstar/lib/mol-util/color/color.js';
24
23
 
25
- import { ENCLOSED_WEIGHT } from '../core/constants.ts';
26
24
  import type { OrbitalGrid } from '../core/grid.ts';
25
+ import type { OrbitalContour } from '../core/isovalue.ts';
27
26
 
28
- import { DISPLAY_REACH, surfaceReach, toVolume } from './volumeField.ts';
27
+ import { DISPLAY_REACH, toVolume } from './volumeField.ts';
29
28
 
30
29
  /** Colours and opacity of one signed isosurface pair. */
31
30
  export interface VolumeStyle {
@@ -40,8 +39,8 @@ export interface VolumeStyle {
40
39
  */
41
40
  negativeColour?: string;
42
41
  /**
43
- * Isovalue as a multiple of the one enclosing `ENCLOSED_WEIGHT` of the
44
- * orbital's weight. Larger means a tighter, smaller surface.
42
+ * Isovalue as a multiple of the contour's own cutoff. Larger means a
43
+ * tighter, smaller surface.
45
44
  * @default 1
46
45
  */
47
46
  relativeIsovalue?: number;
@@ -56,6 +55,8 @@ export interface VolumeStyle {
56
55
  * Replace the isosurface pair drawn from a sampled field.
57
56
  * @param plugin - The molstar context.
58
57
  * @param field - The field, as `sampleAtomicOrbital` produced it.
58
+ * @param contour - The isovalue and reach measured on that field, as
59
+ * `runAtomicSample` returned them.
59
60
  * @param style - See {@link VolumeStyle}.
60
61
  * @returns How far the drawn surface reaches from the centre of the box,
61
62
  * ångström — what a camera has to frame to fill the viewport with it.
@@ -64,6 +65,7 @@ export interface VolumeStyle {
64
65
  export async function renderSampledVolume(
65
66
  plugin: PluginContext,
66
67
  field: OrbitalGrid,
68
+ contour: OrbitalContour,
67
69
  style: VolumeStyle = {},
68
70
  ): Promise<number> {
69
71
  const canvas3d = plugin.canvas3d;
@@ -78,25 +80,30 @@ export async function renderSampledVolume(
78
80
  } = style;
79
81
  clearSampledVolume(plugin);
80
82
 
81
- const isovalues = computeOrbitalIsocontourValues(field.data, ENCLOSED_WEIGHT);
83
+ const { cutoff, reach } = contour;
82
84
  // Molstar's camera clamps both its target distance and its near plane, so it
83
85
  // cannot get close to a small object: uranium's 4f reaches 0.35 Å and would
84
86
  // stay a dot in the corner whatever the camera is asked to frame. Every
85
87
  // orbital is therefore drawn at one canonical size, and the true extent is
86
88
  // reported as ⟨r⟩ and on the radial plot instead of by the picture's scale.
87
- const reach = surfaceReach(field, isovalues);
88
89
  const volume = toVolume(field, reach > 0 ? DISPLAY_REACH / reach : 1);
89
90
  // A nodeless orbital — every 1s — has no negative lobe at all, and asking for
90
91
  // its isosurface would draw an empty mesh at value 0.
91
92
  const surfaces = await Promise.all([
92
- maybeSurface(plugin, volume, isovalues.positive, relativeIsovalue, {
93
- colour: positiveColour,
94
- alpha,
95
- }),
96
- maybeSurface(plugin, volume, isovalues.negative, relativeIsovalue, {
97
- colour: negativeColour,
98
- alpha,
99
- }),
93
+ maybeSurface(
94
+ plugin,
95
+ volume,
96
+ field.max >= cutoff ? cutoff : undefined,
97
+ relativeIsovalue,
98
+ { colour: positiveColour, alpha },
99
+ ),
100
+ maybeSurface(
101
+ plugin,
102
+ volume,
103
+ field.min <= -cutoff ? -cutoff : undefined,
104
+ relativeIsovalue,
105
+ { colour: negativeColour, alpha },
106
+ ),
100
107
  ]);
101
108
  const drawn = surfaces.filter(
102
109
  (surface): surface is Representation.Any => surface !== null,
@@ -163,7 +170,13 @@ async function createSurface(
163
170
  isoValue: { kind: 'absolute', absoluteValue: isovalue },
164
171
  alpha,
165
172
  xrayShaded: true,
166
- tryUseGpu: true,
173
+ // Molstar's GPU marching cubes pits the outer lobe of a diffuse orbital
174
+ // with voxel-sized dimples — caesium's 6s and every 7s, 6d and 7p above
175
+ // it — and quantises the field to 255 steps on upload unless told
176
+ // otherwise, which terraces xenon's 4p. The surface is a thin shell
177
+ // whatever the box holds, so the CPU path costs 13–44 ms and returns
178
+ // 27 k vertices even on the 152³ grid the highest quality asks for.
179
+ tryUseGpu: false,
167
180
  },
168
181
  color: 'uniform',
169
182
  colorParams: { value: Color.fromHexStyle(colour) },
@@ -20,6 +20,7 @@ import { DefaultPluginSpec as defaultPluginSpec } from 'molstar/lib/mol-plugin/s
20
20
  import { Color } from 'molstar/lib/mol-util/color/color.js';
21
21
 
22
22
  import type { OrbitalGrid } from '../core/grid.ts';
23
+ import type { OrbitalContour } from '../core/isovalue.ts';
23
24
 
24
25
  import { DEFAULT_CAMERA_DURATION, frameOrbital, setSpin } from './camera.ts';
25
26
  import type { VolumeStyle } from './renderVolume.ts';
@@ -89,15 +90,19 @@ export class OrbitalViewer {
89
90
  /**
90
91
  * Replace the isosurface pair with one drawn from a sampled field.
91
92
  * @param field - The sampled wavefunction, in ångström.
93
+ * @param contour - The isovalue and reach measured on that field.
92
94
  * @param style - See {@link VolumeStyle}.
93
95
  * @returns How far the drawn surface reaches, in scene units, for the camera
94
96
  * to frame; `undefined` once the viewer has been disposed.
95
97
  */
96
98
  showOrbital(
97
99
  field: OrbitalGrid,
100
+ contour: OrbitalContour,
98
101
  style?: VolumeStyle,
99
102
  ): Promise<number | undefined> {
100
- return this.#run((plugin) => renderSampledVolume(plugin, field, style));
103
+ return this.#run((plugin) =>
104
+ renderSampledVolume(plugin, field, contour, style),
105
+ );
101
106
  }
102
107
 
103
108
  /**
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * Turning a field the caller sampled into the `Volume` molstar's isosurface
3
- * renderer wants, and measuring how far the surface inside it actually reaches.
3
+ * renderer wants.
4
4
  *
5
- * Both halves are arithmetic over the samples, which is why they are here
6
- * rather than in `renderVolume.ts` — that module is about representations.
5
+ * It is arithmetic over the samples, which is why it is here rather than in
6
+ * `renderVolume.ts` — that module is about representations. How far the
7
+ * surface inside the box reaches is measured in `core/isovalue.ts`, beside the
8
+ * isovalue it is measured against.
7
9
  */
8
10
 
9
11
  import { Mat4, Tensor, Vec3 } from 'molstar/lib/mol-math/linear-algebra.js';
@@ -24,52 +26,6 @@ const { Space: createTensorSpace, Data1: asTensorData } = Tensor;
24
26
  */
25
27
  export const DISPLAY_REACH = 12;
26
28
 
27
- /**
28
- * How far from the centre of the box the drawn surface actually reaches.
29
- *
30
- * Molstar sizes a volume representation's bounding sphere from the whole
31
- * sampled box, which is deliberately much larger than the isosurface inside it,
32
- * so a camera framing that sphere leaves the orbital a quarter of the frame
33
- * wide. Measuring the samples that are actually enclosed gives the camera the
34
- * real extent, and does it here because this is where the isovalue is known.
35
- * @param field - The sampled field.
36
- * @param isovalues - The two isovalues the surfaces were drawn at.
37
- * @param isovalues.negative - Isovalue the negative lobe was drawn at, if any.
38
- * @param isovalues.positive - Isovalue the positive lobe was drawn at, if any.
39
- * @returns The reach in ångström, or 0 when nothing was drawn.
40
- */
41
- export function surfaceReach(
42
- field: OrbitalGrid,
43
- isovalues: { negative?: number | undefined; positive?: number | undefined },
44
- ): number {
45
- const cutoff = Math.min(
46
- Math.abs(isovalues.positive ?? Infinity),
47
- Math.abs(isovalues.negative ?? Infinity),
48
- );
49
- if (!Number.isFinite(cutoff) || cutoff <= 0) return 0;
50
- const { data, dimensions, origin, spacing } = field;
51
- const [countX, countY, countZ] = dimensions;
52
- const centreX = origin.x + ((countX - 1) * spacing) / 2;
53
- const centreY = origin.y + ((countY - 1) * spacing) / 2;
54
- const centreZ = origin.z + ((countZ - 1) * spacing) / 2;
55
- let furthest = 0;
56
- let index = 0;
57
- for (let indexX = 0; indexX < countX; indexX++) {
58
- const dx = origin.x + indexX * spacing - centreX;
59
- for (let indexY = 0; indexY < countY; indexY++) {
60
- const dy = origin.y + indexY * spacing - centreY;
61
- for (let indexZ = 0; indexZ < countZ; indexZ++) {
62
- const value = data[index++] as number;
63
- if (value < cutoff && value > -cutoff) continue;
64
- const dz = origin.z + indexZ * spacing - centreZ;
65
- const squared = dx * dx + dy * dy + dz * dz;
66
- if (squared > furthest) furthest = squared;
67
- }
68
- }
69
- }
70
- return Math.sqrt(furthest);
71
- }
72
-
73
29
  /**
74
30
  * Wrap a sampled field in molstar's `Volume`.
75
31
  *