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
@@ -0,0 +1,116 @@
1
+ import { looksLikeMolfile } from './molfile.ts';
2
+
3
+ /** One structure of an editor's value, with whatever was written next to it. */
4
+ export interface EditorLine {
5
+ /**
6
+ * The structure. On a line-oriented value this is the first blank-separated
7
+ * token, because a line notation never holds a blank; on a molfile it is the
8
+ * whole file.
9
+ */
10
+ structure: string;
11
+ /**
12
+ * What followed the structure on its line, which a Daylight `.smi` file uses
13
+ * as a name. Empty when nothing did.
14
+ */
15
+ label: string;
16
+ /** 1-based line the structure starts on, so an error can point back at it. */
17
+ line: number;
18
+ }
19
+
20
+ /** An editor's value, classified and cut into the structures it holds. */
21
+ export interface EditorValue {
22
+ /** How the value is written; `empty` when it holds no structure at all. */
23
+ kind: 'molfile' | 'smiles' | 'empty';
24
+ /**
25
+ * The molfile, exactly as it arrived, when `kind` is `molfile`. Empty
26
+ * otherwise — a molfile's fixed-width header does not survive being trimmed.
27
+ */
28
+ molfile: string;
29
+ /**
30
+ * Every structure the value holds, in order: one per meaningful line for a
31
+ * line-oriented value, a single entry for a molfile, none for an empty one.
32
+ */
33
+ entries: EditorLine[];
34
+ }
35
+
36
+ /**
37
+ * Take an editor's value apart.
38
+ *
39
+ * A structure box is handed whatever the chemist had: one molfile pasted out
40
+ * of another tool, or a run of line notations one per line, possibly with a
41
+ * name after each and with blank and `#` comment lines in between. Both are
42
+ * read here so a page can take either without asking which it was given.
43
+ * @param text - The editor's value, as typed, pasted or dropped.
44
+ * @returns The notation, the molfile when it is one, and the structures.
45
+ */
46
+ export function splitEditorValue(text: string): EditorValue {
47
+ if (text.trim() === '') return { kind: 'empty', molfile: '', entries: [] };
48
+ if (looksLikeMolfile(text)) {
49
+ return {
50
+ kind: 'molfile',
51
+ molfile: text,
52
+ entries: [{ structure: text, label: '', line: 1 }],
53
+ };
54
+ }
55
+ const entries = splitLines(text);
56
+ return entries.length === 0
57
+ ? { kind: 'empty', molfile: '', entries: [] }
58
+ : { kind: 'smiles', molfile: '', entries };
59
+ }
60
+
61
+ /** An idCode and, when the writer emitted one, the atom layout beside it. */
62
+ export interface IdCodeValue {
63
+ idCode: string;
64
+ /** Absent when the value carried no coordinates. */
65
+ coordinates?: string;
66
+ }
67
+
68
+ /**
69
+ * Take an idCode apart.
70
+ *
71
+ * A drawing editor appends the atom coordinates after a space, which
72
+ * `Molecule.fromIDCode` takes as a second argument rather than as part of the
73
+ * first, and which two drawings of the same structure differ by.
74
+ * @param value - The editor value, coordinates included or not.
75
+ * @returns The idCode and the coordinates, the idCode empty for a blank value.
76
+ */
77
+ export function splitIdCode(value: string): IdCodeValue {
78
+ const [idCode = '', coordinates] = value.trim().split(' ');
79
+ return coordinates === undefined ? { idCode } : { idCode, coordinates };
80
+ }
81
+
82
+ /**
83
+ * Whether an idCode describes nothing.
84
+ *
85
+ * Erasing a canvas does not leave the editor with an empty string: it leaves
86
+ * the idCode of the empty molecule, or of the empty fragment in query mode.
87
+ * Treating either as a structure keeps a filter alive with nothing drawn.
88
+ * @param value - The editor value, coordinates included or not.
89
+ * @returns True when there is nothing on the canvas.
90
+ */
91
+ export function isEmptyIdCode(value: string): boolean {
92
+ return EMPTY_ID_CODES.has(splitIdCode(value).idCode);
93
+ }
94
+
95
+ /** What openchemlib writes for a structure with no atoms: molecule, fragment. */
96
+ const EMPTY_ID_CODES = new Set(['', 'd@', 'dH']);
97
+
98
+ function splitLines(text: string): EditorLine[] {
99
+ const entries: EditorLine[] = [];
100
+ const lines = text.split('\n');
101
+ for (let index = 0; index < lines.length; index++) {
102
+ const line = (lines[index] ?? '').trim();
103
+ if (line === '' || line.startsWith('#')) continue;
104
+ const blank = line.search(/\s/);
105
+ entries.push(
106
+ blank === -1
107
+ ? { structure: line, label: '', line: index + 1 }
108
+ : {
109
+ structure: line.slice(0, blank),
110
+ label: line.slice(blank).trim(),
111
+ line: index + 1,
112
+ },
113
+ );
114
+ }
115
+ return entries;
116
+ }
@@ -0,0 +1,50 @@
1
+ import { isEmptyIdCode } from './editorValue.ts';
2
+ import type { StructureKind } from './readStructure.ts';
3
+ import { readStructure } from './readStructure.ts';
4
+
5
+ /** What a substructure field is currently filtering on. */
6
+ export interface FragmentQuery {
7
+ /** The notation the query should be read as. */
8
+ kind: StructureKind;
9
+ /** The query, ready to hand a parser. Empty when nothing is filtered on. */
10
+ value: string;
11
+ /**
12
+ * True when the field filters on nothing — a blank box, or the idCode an
13
+ * erased canvas leaves behind.
14
+ */
15
+ isEmpty: boolean;
16
+ }
17
+
18
+ /**
19
+ * Read what a substructure field holds.
20
+ *
21
+ * A filter is fed from two places that disagree about what "nothing" is: a
22
+ * text box hands back the empty string, while a drawing canvas hands back the
23
+ * idCode of the empty molecule. Both mean the filter is off, and a filter that
24
+ * stays on with nothing drawn quietly hides every result.
25
+ * @param text - The field's value: an idCode, a molfile or a line notation.
26
+ * @returns The notation, the query, and whether anything is being filtered on.
27
+ */
28
+ export function fragmentQuery(text: string): FragmentQuery {
29
+ if (isEmptyIdCode(text)) return { kind: 'empty', value: '', isEmpty: true };
30
+ const read = readStructure(text);
31
+ return {
32
+ kind: read.kind,
33
+ value: read.value,
34
+ isEmpty: read.kind === 'empty',
35
+ };
36
+ }
37
+
38
+ /**
39
+ * Whether two field values describe the same query, so a search is not run
40
+ * again for a value that only changed by its surrounding blanks.
41
+ * @param left - One field value.
42
+ * @param right - The other field value.
43
+ * @returns True when both would be read as the same query.
44
+ */
45
+ export function sameFragmentQuery(left: string, right: string): boolean {
46
+ const first = fragmentQuery(left);
47
+ const second = fragmentQuery(right);
48
+ if (first.isEmpty || second.isEmpty) return first.isEmpty === second.isEmpty;
49
+ return first.kind === second.kind && first.value === second.value;
50
+ }
@@ -0,0 +1,13 @@
1
+ export type { EditorLine, EditorValue } from './editorValue.ts';
2
+ export { splitEditorValue } from './editorValue.ts';
3
+ export type { FragmentQuery } from './fragmentQuery.ts';
4
+ export { fragmentQuery, sameFragmentQuery } from './fragmentQuery.ts';
5
+ export type { MolfileClassification, MolfileVersion } from './molfile.ts';
6
+ export { classifyMolfile, molfileAtomCount } from './molfile.ts';
7
+ export type { ReadStructureResult, StructureKind } from './readStructure.ts';
8
+ export { looksLikeSmarts, readStructure } from './readStructure.ts';
9
+ export type {
10
+ StructureSource,
11
+ StructureSourceInput,
12
+ } from './structureSource.ts';
13
+ export { structureSource } from './structureSource.ts';
@@ -0,0 +1,90 @@
1
+ /** Which connection-table dialect a molfile is written in. */
2
+ export type MolfileVersion = 'v2000' | 'v3000' | 'unknown';
3
+
4
+ /** What a molfile's counts line says about it. */
5
+ export interface MolfileClassification {
6
+ /** The dialect, `unknown` when the text carries no version stamp. */
7
+ version: MolfileVersion;
8
+ /**
9
+ * Atoms the counts line declares, `0` when there is no counts line to read.
10
+ */
11
+ atomCount: number;
12
+ }
13
+
14
+ /**
15
+ * Read a molfile's version and its declared atom count.
16
+ *
17
+ * The two dialects write their counts in unrelated places: V2000 packs them
18
+ * into the fixed-width fields of the line ending in `V2000`, while a V3000
19
+ * file leaves those fields at zero and declares the real counts on an
20
+ * `M V30 COUNTS` line further down. Reading a V3000 file with the V2000 rule
21
+ * therefore answers zero atoms without failing, which is what makes a viewer
22
+ * render an empty scene and report nothing.
23
+ * @param text - A molfile, or any text that may not be one.
24
+ * @returns The dialect and the declared atom count.
25
+ */
26
+ export function classifyMolfile(text: string): MolfileClassification {
27
+ if (V3000_STAMP.test(text)) {
28
+ return { version: 'v3000', atomCount: countIn(text, V3000_COUNTS) };
29
+ }
30
+ if (V2000_STAMP.test(text)) {
31
+ return { version: 'v2000', atomCount: countIn(text, V2000_COUNTS) };
32
+ }
33
+ return { version: 'unknown', atomCount: 0 };
34
+ }
35
+
36
+ /**
37
+ * How many atoms a molfile declares, whichever dialect it is written in.
38
+ * @param text - A molfile, or any text that may not be one.
39
+ * @returns The declared atom count, `0` when the text declares none.
40
+ */
41
+ export function molfileAtomCount(text: string): number {
42
+ return classifyMolfile(text).atomCount;
43
+ }
44
+
45
+ /**
46
+ * Whether a piece of text should be read as a molfile rather than as a line
47
+ * notation.
48
+ *
49
+ * A line notation is a single line and can never carry a version stamp, so a
50
+ * text holding a header, a counts line and at least one atom line is the one
51
+ * that is a molfile.
52
+ * @param text - The structure, as typed, pasted or dropped.
53
+ * @returns True when it should be read as a molfile.
54
+ */
55
+ export function looksLikeMolfile(text: string): boolean {
56
+ if (countLines(text) < 4) return false;
57
+ return classifyMolfile(text).version !== 'unknown';
58
+ }
59
+
60
+ /**
61
+ * The version stamp closes a line whose every other field is a number, so a
62
+ * data field or a sentence mentioning the dialect is not mistaken for one.
63
+ */
64
+ const V2000_STAMP = /^[\d ]+V2000[^\S\n]*$/m;
65
+ const V3000_STAMP = /^[\d ]+V3000[^\S\n]*$/m;
66
+
67
+ /**
68
+ * The V2000 counts line is fixed-width: three characters for the atoms, three
69
+ * for the bonds. A writer that trims the padding still lands inside the same
70
+ * six characters for any count a V2000 file can hold.
71
+ */
72
+ const V2000_COUNTS = /^(?<atoms>[\d ]{3})[\d ]*V2000[^\S\n]*$/m;
73
+ const V3000_COUNTS = /^M {2}V30 COUNTS +(?<atoms>\d+)/m;
74
+
75
+ function countIn(text: string, pattern: RegExp): number {
76
+ const atoms = pattern.exec(text)?.groups?.atoms;
77
+ if (atoms === undefined) return 0;
78
+ const count = Number.parseInt(atoms.trim(), 10);
79
+ return Number.isFinite(count) && count > 0 ? count : 0;
80
+ }
81
+
82
+ function countLines(text: string): number {
83
+ let lines = 1;
84
+ let index = text.indexOf('\n');
85
+ while (index !== -1) {
86
+ lines++;
87
+ index = text.indexOf('\n', index + 1);
88
+ }
89
+ return lines;
90
+ }
@@ -0,0 +1,73 @@
1
+ import { looksLikeMolfile } from './molfile.ts';
2
+
3
+ /** How a piece of structure text turned out to be written. */
4
+ export type StructureKind = 'molfile' | 'smiles' | 'smarts' | 'empty';
5
+
6
+ /** A piece of structure text, and the notation it should be read as. */
7
+ export interface ReadStructureResult {
8
+ kind: StructureKind;
9
+ /**
10
+ * The text to hand a parser. A line notation is trimmed; a molfile is left
11
+ * exactly as it arrived, because its first three lines are a fixed-width
12
+ * header whose title line is very often blank — trimming shifts every line
13
+ * up and the counts line is then read as an atom.
14
+ */
15
+ value: string;
16
+ }
17
+
18
+ /**
19
+ * Decide what a piece of text is, without parsing it.
20
+ *
21
+ * Nothing is asked of the user, because the answer is in the text: a molfile
22
+ * carries a version stamp and several lines, a query carries syntax that only
23
+ * exists in SMARTS, and whatever is left is a SMILES. Text that holds nothing
24
+ * is the third answer, so a field can tell "not typed yet" from "typed
25
+ * something wrong" and only complain about the second.
26
+ * @param text - The structure, as typed, pasted or dropped.
27
+ * @returns The notation and the text to read it with.
28
+ */
29
+ export function readStructure(text: string): ReadStructureResult {
30
+ const trimmed = text.trim();
31
+ if (trimmed === '') return { kind: 'empty', value: '' };
32
+ if (looksLikeMolfile(text)) return { kind: 'molfile', value: text };
33
+ if (looksLikeSmarts(trimmed)) return { kind: 'smarts', value: trimmed };
34
+ return { kind: 'smiles', value: trimmed };
35
+ }
36
+
37
+ /**
38
+ * Whether a line notation uses syntax that exists in SMARTS and not in SMILES.
39
+ *
40
+ * Only the inside of a bracket atom is inspected for the primitives, because
41
+ * `#` is a triple bond outside one and `D`, `X`, `R`, `v` and `h` are the
42
+ * start of real element symbols. `~`, `&`, `,`, `;`, `!` and `$(` are SMARTS
43
+ * anywhere they appear.
44
+ * @param text - The line notation, already trimmed.
45
+ * @returns True when it can only be a query.
46
+ */
47
+ export function looksLikeSmarts(text: string): boolean {
48
+ if (/[~&;,!]/.test(text) || text.includes('$(')) return true;
49
+ for (const match of text.matchAll(BRACKET_ATOM)) {
50
+ if (QUERY_PRIMITIVE.test(match.groups?.atom ?? '')) return true;
51
+ }
52
+ return BARE_WILDCARD.test(text.replaceAll(BRACKET_ATOM, ''));
53
+ }
54
+
55
+ const BRACKET_ATOM = /\[(?<atom>[^\]]*)\]/g;
56
+
57
+ /**
58
+ * `#6` (atomic number), `X3` / `D2` / `R1` / `r5` / `v4` / `h1` / `x2`
59
+ * (counts), and the `a` / `A` wildcards. A digit is required after the letter,
60
+ * so `[Xe]` and `[Rn]` stay elements. The wildcard is anchored to the start of
61
+ * the atom, after an optional isotope: unanchored it matches the `a` of
62
+ * `[Na+]`, and every bracketed element holding a lowercase a — Na, Ca, Ba, La,
63
+ * Ta — would then read as a query rather than as the atom it is.
64
+ */
65
+ const QUERY_PRIMITIVE = /#\d|[DXRrvhx]\d|^\*|^\d*[aA](?![a-z])/;
66
+
67
+ /**
68
+ * Outside a bracket the wildcard has to stand on its own: a letter on either
69
+ * side and it is part of a word, not a pattern. Widening this to any `a` or
70
+ * `A` reads the header `CAS` as the three-atom SMARTS `C`,`A`,`S`, and a
71
+ * spreadsheet's header row stops being recognised as one.
72
+ */
73
+ const BARE_WILDCARD = /(?:^|[^A-Za-z])[aA](?![a-z])/;
@@ -0,0 +1,57 @@
1
+ import { isEmptyIdCode, splitIdCode } from './editorValue.ts';
2
+ import { molfileAtomCount } from './molfile.ts';
3
+
4
+ /** Every notation a read-only depiction may be handed. */
5
+ export interface StructureSourceInput {
6
+ /** A canonical openchemlib idCode, coordinates included or not. */
7
+ idCode?: string;
8
+ /** Encoded 2D coordinates, when they did not travel with the idCode. */
9
+ coordinates?: string;
10
+ /** A molfile, V2000 or V3000. */
11
+ molfile?: string;
12
+ /** A SMILES. */
13
+ smiles?: string;
14
+ }
15
+
16
+ /** The one notation a depiction should be drawn from. */
17
+ export interface StructureSource {
18
+ /** Which notation was picked; `empty` when none of them holds a structure. */
19
+ kind: 'idcode' | 'molfile' | 'smiles' | 'empty';
20
+ /** The text to draw, empty when there is nothing to draw. */
21
+ value: string;
22
+ /** Encoded 2D coordinates, only ever set beside an idCode. */
23
+ coordinates?: string;
24
+ }
25
+
26
+ /**
27
+ * Pick the notation a depiction is drawn from when several were supplied.
28
+ *
29
+ * The most exact one wins: an idCode says precisely which structure, a molfile
30
+ * additionally carries the layout its author chose, and a SMILES leaves the
31
+ * layout to be invented. A notation that describes nothing — a blank string, a
32
+ * molfile with an empty atom block, the idCode an erased canvas leaves behind
33
+ * — is skipped rather than drawn, which is what turns a broken box into the
34
+ * next best picture, or into an honest placeholder.
35
+ * @param input - Whatever notations the caller has.
36
+ * @returns The notation to draw, and the text to draw it from.
37
+ */
38
+ export function structureSource(input: StructureSourceInput): StructureSource {
39
+ const { idCode, coordinates, molfile, smiles } = input;
40
+
41
+ if (idCode !== undefined && !isEmptyIdCode(idCode)) {
42
+ const split = splitIdCode(idCode);
43
+ const layout = split.coordinates ?? coordinates;
44
+ return layout === undefined || layout === ''
45
+ ? { kind: 'idcode', value: split.idCode }
46
+ : { kind: 'idcode', value: split.idCode, coordinates: layout };
47
+ }
48
+
49
+ if (molfile !== undefined && molfileAtomCount(molfile) > 0) {
50
+ return { kind: 'molfile', value: molfile };
51
+ }
52
+
53
+ const line = smiles?.trim() ?? '';
54
+ if (line !== '') return { kind: 'smiles', value: line };
55
+
56
+ return { kind: 'empty', value: '' };
57
+ }
@@ -0,0 +1,31 @@
1
+ /** The two 1px borders of a container that sizes itself border-box. */
2
+ export const TOOLBAR_BORDERS = 2;
3
+
4
+ /**
5
+ * The smallest height a drawing editor's container may take.
6
+ *
7
+ * The editor's toolbar is a canvas of a fixed height, drawn from a sprite of a
8
+ * fixed number of buttons: a container any shorter than that does not scroll,
9
+ * it simply cuts the last buttons off. So the floor is whichever is taller,
10
+ * the height the caller asked for or the toolbar plus the borders around it.
11
+ * @param toolbarHeight - Height the toolbar was measured at, in pixels.
12
+ * @param minHeight - Smallest height the caller asked for, in pixels.
13
+ * @param borders - Borders the container adds around the toolbar, in pixels.
14
+ * @returns The height to give the container, in pixels.
15
+ */
16
+ export function toolbarFloorHeight(
17
+ toolbarHeight: number,
18
+ minHeight: number,
19
+ borders: number = TOOLBAR_BORDERS,
20
+ ): number {
21
+ const asked = positive(minHeight);
22
+ const measured = positive(toolbarHeight);
23
+ // A toolbar with no layout yet measures zero, and a floor of two pixels of
24
+ // border would collapse the editor before it has had a chance to draw.
25
+ if (measured === 0) return asked;
26
+ return Math.max(asked, measured + positive(borders));
27
+ }
28
+
29
+ function positive(value: number): number {
30
+ return Number.isFinite(value) && value > 0 ? value : 0;
31
+ }
@@ -0,0 +1,130 @@
1
+ import type { CSSProperties, ReactElement } from 'react';
2
+ import { useCallback, useState } from 'react';
3
+ import type {
4
+ CanvasEditorInputFormat,
5
+ CanvasEditorOnChangeMolecule,
6
+ CanvasEditorOnChangeReaction,
7
+ } from 'react-ocl';
8
+ import { CanvasMoleculeEditor, CanvasReactionEditor } from 'react-ocl';
9
+
10
+ /** What the editor draws: one structure, or a reaction with its arrow. */
11
+ export type StructureEditorMode = 'molecule' | 'reaction';
12
+
13
+ /** Everything the editor holds at the moment it changed. */
14
+ export interface StructureEditorChange {
15
+ /** Which kind of editor produced it. */
16
+ mode: StructureEditorMode;
17
+ /**
18
+ * The idCode, with the coordinates the editor laid out written after a
19
+ * space. `splitIdCode` takes the two apart.
20
+ */
21
+ idCode: string;
22
+ /** The V2000 molfile of a molecule, or the RXN file of a reaction. */
23
+ molfile: string;
24
+ /** The SMILES of a molecule, or the reaction SMILES. */
25
+ smiles: string;
26
+ }
27
+
28
+ export interface EditorCanvasProps {
29
+ /** Called on every stroke, with the editor read out synchronously. */
30
+ onChange: (change: StructureEditorChange) => void;
31
+ /**
32
+ * Draw a query fragment rather than a whole structure, which is what a
33
+ * substructure filter needs.
34
+ * @default false
35
+ */
36
+ fragment?: boolean;
37
+ /**
38
+ * How `value` is written.
39
+ * @default 'idcode'
40
+ */
41
+ inputFormat?: CanvasEditorInputFormat;
42
+ /**
43
+ * What the canvas holds when it appears. Read once, at mount: the editor is
44
+ * uncontrolled, so feeding a later value back would replace the structure
45
+ * and reset every coordinate under the pen.
46
+ * @default ''
47
+ */
48
+ value?: string;
49
+ /**
50
+ * Whether the editor draws one structure or a reaction.
51
+ * @default 'molecule'
52
+ */
53
+ mode?: StructureEditorMode;
54
+ }
55
+
56
+ /**
57
+ * The react-ocl canvas, filling whatever box it is put in.
58
+ *
59
+ * Its value is frozen at mount, so the caller remounts it — by changing its
60
+ * `key` — to load a different structure into it.
61
+ * @param props - What to draw, how it is written, and where to send it.
62
+ * @returns The canvas.
63
+ */
64
+ export function EditorCanvas(props: EditorCanvasProps): ReactElement {
65
+ const {
66
+ onChange,
67
+ fragment = false,
68
+ inputFormat = 'idcode',
69
+ value = '',
70
+ mode = 'molecule',
71
+ } = props;
72
+ const [initialValue] = useState(value);
73
+
74
+ const handleMolecule = useCallback(
75
+ (event: CanvasEditorOnChangeMolecule) => {
76
+ // The event describes the editor only while the callback runs, so every
77
+ // notation is read now and whatever waiting there is happens afterwards.
78
+ onChange({
79
+ mode: 'molecule',
80
+ idCode: event.getIdcode(),
81
+ molfile: event.getMolfile(),
82
+ smiles: event.getSmiles(),
83
+ });
84
+ },
85
+ [onChange],
86
+ );
87
+
88
+ const handleReaction = useCallback(
89
+ (event: CanvasEditorOnChangeReaction) => {
90
+ onChange({
91
+ mode: 'reaction',
92
+ idCode: event.getIdcode(),
93
+ molfile: event.getRxn(),
94
+ smiles: event.getSmiles(),
95
+ });
96
+ },
97
+ [onChange],
98
+ );
99
+
100
+ return (
101
+ <div style={CANVAS_STYLE}>
102
+ {mode === 'reaction' ? (
103
+ <CanvasReactionEditor
104
+ width="100%"
105
+ height="100%"
106
+ fragment={fragment}
107
+ inputFormat={inputFormat}
108
+ inputValue={initialValue}
109
+ onChange={handleReaction}
110
+ />
111
+ ) : (
112
+ <CanvasMoleculeEditor
113
+ width="100%"
114
+ height="100%"
115
+ fragment={fragment}
116
+ inputFormat={inputFormat}
117
+ inputValue={initialValue}
118
+ onChange={handleMolecule}
119
+ />
120
+ )}
121
+ </div>
122
+ );
123
+ }
124
+
125
+ /**
126
+ * The canvas measures its container in pixels, so it is taken out of the
127
+ * height computation: otherwise the container and the canvas grow each other
128
+ * without ever settling.
129
+ */
130
+ const CANVAS_STYLE: CSSProperties = { position: 'absolute', inset: 0 };