react-cheminfo 0.3.0 → 0.4.1

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 (844) 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 +32 -0
  222. package/lib/ecosystem/core/lookup.d.ts.map +1 -0
  223. package/lib/ecosystem/core/lookup.js +55 -0
  224. package/lib/ecosystem/core/lookup.js.map +1 -0
  225. package/lib/ecosystem/core/sites.d.ts +3 -1
  226. package/lib/ecosystem/core/sites.d.ts.map +1 -1
  227. package/lib/ecosystem/core/sites.js +18 -3
  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/glyphs.js +1 -1
  242. package/lib/ecosystem/ui/glyphs.js.map +1 -1
  243. package/lib/ecosystem/ui/index.d.ts +4 -0
  244. package/lib/ecosystem/ui/index.d.ts.map +1 -1
  245. package/lib/ecosystem/ui/index.js +2 -0
  246. package/lib/ecosystem/ui/index.js.map +1 -1
  247. package/lib/ecosystem/ui/marks.d.ts +30 -4
  248. package/lib/ecosystem/ui/marks.d.ts.map +1 -1
  249. package/lib/ecosystem/ui/marks.js +13 -3
  250. package/lib/ecosystem/ui/marks.js.map +1 -1
  251. package/lib/error/ui/ErrorBoundary.d.ts +60 -0
  252. package/lib/error/ui/ErrorBoundary.d.ts.map +1 -0
  253. package/lib/error/ui/ErrorBoundary.js +59 -0
  254. package/lib/error/ui/ErrorBoundary.js.map +1 -0
  255. package/lib/error/ui/ErrorFallback.d.ts +38 -0
  256. package/lib/error/ui/ErrorFallback.d.ts.map +1 -0
  257. package/lib/error/ui/ErrorFallback.js +16 -0
  258. package/lib/error/ui/ErrorFallback.js.map +1 -0
  259. package/lib/error/ui/index.d.ts +5 -0
  260. package/lib/error/ui/index.d.ts.map +1 -0
  261. package/lib/error/ui/index.js +3 -0
  262. package/lib/error/ui/index.js.map +1 -0
  263. package/lib/error/ui/toError.d.ts +11 -0
  264. package/lib/error/ui/toError.d.ts.map +1 -0
  265. package/lib/error/ui/toError.js +35 -0
  266. package/lib/error/ui/toError.js.map +1 -0
  267. package/lib/format/core/index.d.ts +5 -0
  268. package/lib/format/core/index.d.ts.map +1 -0
  269. package/lib/format/core/index.js +5 -0
  270. package/lib/format/core/index.js.map +1 -0
  271. package/lib/format/core/missing.d.ts +7 -0
  272. package/lib/format/core/missing.d.ts.map +1 -0
  273. package/lib/format/core/missing.js +7 -0
  274. package/lib/format/core/missing.js.map +1 -0
  275. package/lib/format/core/numbers.d.ts +40 -0
  276. package/lib/format/core/numbers.d.ts.map +1 -0
  277. package/lib/format/core/numbers.js +81 -0
  278. package/lib/format/core/numbers.js.map +1 -0
  279. package/lib/format/core/units.d.ts +17 -0
  280. package/lib/format/core/units.d.ts.map +1 -0
  281. package/lib/format/core/units.js +54 -0
  282. package/lib/format/core/units.js.map +1 -0
  283. package/lib/format/core/words.d.ts +12 -0
  284. package/lib/format/core/words.d.ts.map +1 -0
  285. package/lib/format/core/words.js +14 -0
  286. package/lib/format/core/words.js.map +1 -0
  287. package/lib/help/ui/HelpBody.d.ts +57 -0
  288. package/lib/help/ui/HelpBody.d.ts.map +1 -0
  289. package/lib/help/ui/HelpBody.js +44 -0
  290. package/lib/help/ui/HelpBody.js.map +1 -0
  291. package/lib/help/ui/HelpIcon.d.ts +33 -0
  292. package/lib/help/ui/HelpIcon.d.ts.map +1 -0
  293. package/lib/help/ui/HelpIcon.js +16 -0
  294. package/lib/help/ui/HelpIcon.js.map +1 -0
  295. package/lib/help/ui/HelpToolbarButton.d.ts +45 -0
  296. package/lib/help/ui/HelpToolbarButton.d.ts.map +1 -0
  297. package/lib/help/ui/HelpToolbarButton.js +17 -0
  298. package/lib/help/ui/HelpToolbarButton.js.map +1 -0
  299. package/lib/help/ui/HelpTooltip.d.ts +36 -0
  300. package/lib/help/ui/HelpTooltip.d.ts.map +1 -0
  301. package/lib/help/ui/HelpTooltip.js +24 -0
  302. package/lib/help/ui/HelpTooltip.js.map +1 -0
  303. package/lib/help/ui/index.d.ts +9 -0
  304. package/lib/help/ui/index.d.ts.map +1 -0
  305. package/lib/help/ui/index.js +5 -0
  306. package/lib/help/ui/index.js.map +1 -0
  307. package/lib/hooks/ui/index.d.ts +7 -0
  308. package/lib/hooks/ui/index.d.ts.map +1 -0
  309. package/lib/hooks/ui/index.js +5 -0
  310. package/lib/hooks/ui/index.js.map +1 -0
  311. package/lib/hooks/ui/listNavigation.d.ts +54 -0
  312. package/lib/hooks/ui/listNavigation.d.ts.map +1 -0
  313. package/lib/hooks/ui/listNavigation.js +77 -0
  314. package/lib/hooks/ui/listNavigation.js.map +1 -0
  315. package/lib/hooks/ui/useContainerSize.d.ts +15 -0
  316. package/lib/hooks/ui/useContainerSize.d.ts.map +1 -0
  317. package/lib/hooks/ui/useContainerSize.js +24 -0
  318. package/lib/hooks/ui/useContainerSize.js.map +1 -0
  319. package/lib/hooks/ui/useDebouncedValue.d.ts +12 -0
  320. package/lib/hooks/ui/useDebouncedValue.d.ts.map +1 -0
  321. package/lib/hooks/ui/useDebouncedValue.js +24 -0
  322. package/lib/hooks/ui/useDebouncedValue.js.map +1 -0
  323. package/lib/hooks/ui/useListKeyboardNavigation.d.ts +17 -0
  324. package/lib/hooks/ui/useListKeyboardNavigation.d.ts.map +1 -0
  325. package/lib/hooks/ui/useListKeyboardNavigation.js +25 -0
  326. package/lib/hooks/ui/useListKeyboardNavigation.js.map +1 -0
  327. package/lib/hooks/ui/useResizeObserver.d.ts +20 -0
  328. package/lib/hooks/ui/useResizeObserver.d.ts.map +1 -0
  329. package/lib/hooks/ui/useResizeObserver.js +37 -0
  330. package/lib/hooks/ui/useResizeObserver.js.map +1 -0
  331. package/lib/orbital/core/atomicGrid.d.ts +27 -0
  332. package/lib/orbital/core/atomicGrid.d.ts.map +1 -1
  333. package/lib/orbital/core/atomicGrid.js +37 -1
  334. package/lib/orbital/core/atomicGrid.js.map +1 -1
  335. package/lib/orbital/core/index.d.ts +9 -7
  336. package/lib/orbital/core/index.d.ts.map +1 -1
  337. package/lib/orbital/core/index.js +7 -6
  338. package/lib/orbital/core/index.js.map +1 -1
  339. package/lib/orbital/core/isovalue.d.ts +60 -0
  340. package/lib/orbital/core/isovalue.d.ts.map +1 -0
  341. package/lib/orbital/core/isovalue.js +128 -0
  342. package/lib/orbital/core/isovalue.js.map +1 -0
  343. package/lib/orbital/core/sample.d.ts +15 -1
  344. package/lib/orbital/core/sample.d.ts.map +1 -1
  345. package/lib/orbital/core/sample.js +10 -3
  346. package/lib/orbital/core/sample.js.map +1 -1
  347. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +6 -1
  348. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -1
  349. package/lib/orbital/ui/AtomicOrbitalCanvas.js +12 -2
  350. package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -1
  351. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +5 -1
  352. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -1
  353. package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -1
  354. package/lib/orbital/ui/renderVolume.d.ts +6 -3
  355. package/lib/orbital/ui/renderVolume.d.ts.map +1 -1
  356. package/lib/orbital/ui/renderVolume.js +14 -15
  357. package/lib/orbital/ui/renderVolume.js.map +1 -1
  358. package/lib/orbital/ui/viewer.d.ts +3 -1
  359. package/lib/orbital/ui/viewer.d.ts.map +1 -1
  360. package/lib/orbital/ui/viewer.js +3 -2
  361. package/lib/orbital/ui/viewer.js.map +1 -1
  362. package/lib/orbital/ui/volumeField.d.ts +5 -21
  363. package/lib/orbital/ui/volumeField.d.ts.map +1 -1
  364. package/lib/orbital/ui/volumeField.js +5 -45
  365. package/lib/orbital/ui/volumeField.js.map +1 -1
  366. package/lib/pedagogy/core/glossary.d.ts +79 -0
  367. package/lib/pedagogy/core/glossary.d.ts.map +1 -0
  368. package/lib/pedagogy/core/glossary.js +71 -0
  369. package/lib/pedagogy/core/glossary.js.map +1 -0
  370. package/lib/pedagogy/core/index.d.ts +8 -0
  371. package/lib/pedagogy/core/index.d.ts.map +1 -0
  372. package/lib/pedagogy/core/index.js +4 -0
  373. package/lib/pedagogy/core/index.js.map +1 -0
  374. package/lib/pedagogy/core/jsonStorage.d.ts +21 -0
  375. package/lib/pedagogy/core/jsonStorage.d.ts.map +1 -0
  376. package/lib/pedagogy/core/jsonStorage.js +55 -0
  377. package/lib/pedagogy/core/jsonStorage.js.map +1 -0
  378. package/lib/pedagogy/core/progress.d.ts +116 -0
  379. package/lib/pedagogy/core/progress.d.ts.map +1 -0
  380. package/lib/pedagogy/core/progress.js +122 -0
  381. package/lib/pedagogy/core/progress.js.map +1 -0
  382. package/lib/pedagogy/core/types.d.ts +74 -0
  383. package/lib/pedagogy/core/types.d.ts.map +1 -0
  384. package/lib/pedagogy/core/types.js +8 -0
  385. package/lib/pedagogy/core/types.js.map +1 -0
  386. package/lib/pedagogy/core/validation.d.ts +79 -0
  387. package/lib/pedagogy/core/validation.d.ts.map +1 -0
  388. package/lib/pedagogy/core/validation.js +47 -0
  389. package/lib/pedagogy/core/validation.js.map +1 -0
  390. package/lib/pedagogy/ui/ExerciseActions.d.ts +74 -0
  391. package/lib/pedagogy/ui/ExerciseActions.d.ts.map +1 -0
  392. package/lib/pedagogy/ui/ExerciseActions.js +22 -0
  393. package/lib/pedagogy/ui/ExerciseActions.js.map +1 -0
  394. package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts +43 -0
  395. package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts.map +1 -0
  396. package/lib/pedagogy/ui/ExerciseProgressHeader.js +43 -0
  397. package/lib/pedagogy/ui/ExerciseProgressHeader.js.map +1 -0
  398. package/lib/pedagogy/ui/ExerciseTags.d.ts +49 -0
  399. package/lib/pedagogy/ui/ExerciseTags.d.ts.map +1 -0
  400. package/lib/pedagogy/ui/ExerciseTags.js +22 -0
  401. package/lib/pedagogy/ui/ExerciseTags.js.map +1 -0
  402. package/lib/pedagogy/ui/GlossaryProvider.d.ts +19 -0
  403. package/lib/pedagogy/ui/GlossaryProvider.d.ts.map +1 -0
  404. package/lib/pedagogy/ui/GlossaryProvider.js +16 -0
  405. package/lib/pedagogy/ui/GlossaryProvider.js.map +1 -0
  406. package/lib/pedagogy/ui/GlossaryText.d.ts +50 -0
  407. package/lib/pedagogy/ui/GlossaryText.d.ts.map +1 -0
  408. package/lib/pedagogy/ui/GlossaryText.js +79 -0
  409. package/lib/pedagogy/ui/GlossaryText.js.map +1 -0
  410. package/lib/pedagogy/ui/HintLadder.d.ts +38 -0
  411. package/lib/pedagogy/ui/HintLadder.d.ts.map +1 -0
  412. package/lib/pedagogy/ui/HintLadder.js +33 -0
  413. package/lib/pedagogy/ui/HintLadder.js.map +1 -0
  414. package/lib/pedagogy/ui/ReferenceGrid.d.ts +31 -0
  415. package/lib/pedagogy/ui/ReferenceGrid.d.ts.map +1 -0
  416. package/lib/pedagogy/ui/ReferenceGrid.js +25 -0
  417. package/lib/pedagogy/ui/ReferenceGrid.js.map +1 -0
  418. package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts +64 -0
  419. package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts.map +1 -0
  420. package/lib/pedagogy/ui/ReferenceSectionBlock.js +78 -0
  421. package/lib/pedagogy/ui/ReferenceSectionBlock.js.map +1 -0
  422. package/lib/pedagogy/ui/SyntaxTooltip.d.ts +94 -0
  423. package/lib/pedagogy/ui/SyntaxTooltip.d.ts.map +1 -0
  424. package/lib/pedagogy/ui/SyntaxTooltip.js +79 -0
  425. package/lib/pedagogy/ui/SyntaxTooltip.js.map +1 -0
  426. package/lib/pedagogy/ui/TestCaseList.d.ts +35 -0
  427. package/lib/pedagogy/ui/TestCaseList.d.ts.map +1 -0
  428. package/lib/pedagogy/ui/TestCaseList.js +63 -0
  429. package/lib/pedagogy/ui/TestCaseList.js.map +1 -0
  430. package/lib/pedagogy/ui/TutorialStepStrip.d.ts +42 -0
  431. package/lib/pedagogy/ui/TutorialStepStrip.d.ts.map +1 -0
  432. package/lib/pedagogy/ui/TutorialStepStrip.js +98 -0
  433. package/lib/pedagogy/ui/TutorialStepStrip.js.map +1 -0
  434. package/lib/pedagogy/ui/exerciseMeta.d.ts +24 -0
  435. package/lib/pedagogy/ui/exerciseMeta.d.ts.map +1 -0
  436. package/lib/pedagogy/ui/exerciseMeta.js +38 -0
  437. package/lib/pedagogy/ui/exerciseMeta.js.map +1 -0
  438. package/lib/pedagogy/ui/glossaryContext.d.ts +17 -0
  439. package/lib/pedagogy/ui/glossaryContext.d.ts.map +1 -0
  440. package/lib/pedagogy/ui/glossaryContext.js +19 -0
  441. package/lib/pedagogy/ui/glossaryContext.js.map +1 -0
  442. package/lib/pedagogy/ui/index.d.ts +27 -0
  443. package/lib/pedagogy/ui/index.d.ts.map +1 -0
  444. package/lib/pedagogy/ui/index.js +15 -0
  445. package/lib/pedagogy/ui/index.js.map +1 -0
  446. package/lib/pedagogy/ui/tutorialLevels.d.ts +18 -0
  447. package/lib/pedagogy/ui/tutorialLevels.d.ts.map +1 -0
  448. package/lib/pedagogy/ui/tutorialLevels.js +14 -0
  449. package/lib/pedagogy/ui/tutorialLevels.js.map +1 -0
  450. package/lib/router/core/address.d.ts +42 -0
  451. package/lib/router/core/address.d.ts.map +1 -0
  452. package/lib/router/core/address.js +64 -0
  453. package/lib/router/core/address.js.map +1 -0
  454. package/lib/router/core/basePath.d.ts +49 -0
  455. package/lib/router/core/basePath.d.ts.map +1 -0
  456. package/lib/router/core/basePath.js +78 -0
  457. package/lib/router/core/basePath.js.map +1 -0
  458. package/lib/router/core/index.d.ts +8 -0
  459. package/lib/router/core/index.d.ts.map +1 -0
  460. package/lib/router/core/index.js +5 -0
  461. package/lib/router/core/index.js.map +1 -0
  462. package/lib/router/core/legacyHash.d.ts +45 -0
  463. package/lib/router/core/legacyHash.d.ts.map +1 -0
  464. package/lib/router/core/legacyHash.js +50 -0
  465. package/lib/router/core/legacyHash.js.map +1 -0
  466. package/lib/router/core/pageAddresses.d.ts +50 -0
  467. package/lib/router/core/pageAddresses.d.ts.map +1 -0
  468. package/lib/router/core/pageAddresses.js +56 -0
  469. package/lib/router/core/pageAddresses.js.map +1 -0
  470. package/lib/router/core/query.d.ts +41 -0
  471. package/lib/router/core/query.d.ts.map +1 -0
  472. package/lib/router/core/query.js +64 -0
  473. package/lib/router/core/query.js.map +1 -0
  474. package/lib/router/core/tabRouter.d.ts +111 -0
  475. package/lib/router/core/tabRouter.d.ts.map +1 -0
  476. package/lib/router/core/tabRouter.js +87 -0
  477. package/lib/router/core/tabRouter.js.map +1 -0
  478. package/lib/seo/core/documentMeta.d.ts +45 -0
  479. package/lib/seo/core/documentMeta.d.ts.map +1 -0
  480. package/lib/seo/core/documentMeta.js +69 -0
  481. package/lib/seo/core/documentMeta.js.map +1 -0
  482. package/lib/seo/core/index.d.ts +9 -0
  483. package/lib/seo/core/index.d.ts.map +1 -0
  484. package/lib/seo/core/index.js +5 -0
  485. package/lib/seo/core/index.js.map +1 -0
  486. package/lib/seo/core/pageMeta.d.ts +60 -0
  487. package/lib/seo/core/pageMeta.d.ts.map +1 -0
  488. package/lib/seo/core/pageMeta.js +91 -0
  489. package/lib/seo/core/pageMeta.js.map +1 -0
  490. package/lib/seo/core/routes.d.ts +52 -0
  491. package/lib/seo/core/routes.d.ts.map +1 -0
  492. package/lib/seo/core/routes.js +62 -0
  493. package/lib/seo/core/routes.js.map +1 -0
  494. package/lib/seo/core/siteFiles.d.ts +73 -0
  495. package/lib/seo/core/siteFiles.d.ts.map +1 -0
  496. package/lib/seo/core/siteFiles.js +100 -0
  497. package/lib/seo/core/siteFiles.js.map +1 -0
  498. package/lib/seo/vite/index.d.ts +5 -0
  499. package/lib/seo/vite/index.d.ts.map +1 -0
  500. package/lib/seo/vite/index.js +3 -0
  501. package/lib/seo/vite/index.js.map +1 -0
  502. package/lib/seo/vite/ogCard.d.ts +33 -0
  503. package/lib/seo/vite/ogCard.d.ts.map +1 -0
  504. package/lib/seo/vite/ogCard.js +72 -0
  505. package/lib/seo/vite/ogCard.js.map +1 -0
  506. package/lib/seo/vite/prerender.d.ts +58 -0
  507. package/lib/seo/vite/prerender.d.ts.map +1 -0
  508. package/lib/seo/vite/prerender.js +76 -0
  509. package/lib/seo/vite/prerender.js.map +1 -0
  510. package/lib/share/core/config.d.ts +63 -0
  511. package/lib/share/core/config.d.ts.map +1 -0
  512. package/lib/share/core/config.js +125 -0
  513. package/lib/share/core/config.js.map +1 -0
  514. package/lib/share/core/escape.d.ts +15 -0
  515. package/lib/share/core/escape.d.ts.map +1 -0
  516. package/lib/share/core/escape.js +22 -0
  517. package/lib/share/core/escape.js.map +1 -0
  518. package/lib/share/core/index.d.ts +9 -0
  519. package/lib/share/core/index.d.ts.map +1 -0
  520. package/lib/share/core/index.js +5 -0
  521. package/lib/share/core/index.js.map +1 -0
  522. package/lib/share/core/params.d.ts +93 -0
  523. package/lib/share/core/params.d.ts.map +1 -0
  524. package/lib/share/core/params.js +111 -0
  525. package/lib/share/core/params.js.map +1 -0
  526. package/lib/share/core/query.d.ts +30 -0
  527. package/lib/share/core/query.d.ts.map +1 -0
  528. package/lib/share/core/query.js +68 -0
  529. package/lib/share/core/query.js.map +1 -0
  530. package/lib/share/core/url.d.ts +57 -0
  531. package/lib/share/core/url.d.ts.map +1 -0
  532. package/lib/share/core/url.js +49 -0
  533. package/lib/share/core/url.js.map +1 -0
  534. package/lib/share/core/vocabulary.d.ts +51 -0
  535. package/lib/share/core/vocabulary.d.ts.map +1 -0
  536. package/lib/share/core/vocabulary.js +2 -0
  537. package/lib/share/core/vocabulary.js.map +1 -0
  538. package/lib/share/ui/HiddenPartsProvider.d.ts +19 -0
  539. package/lib/share/ui/HiddenPartsProvider.d.ts.map +1 -0
  540. package/lib/share/ui/HiddenPartsProvider.js +15 -0
  541. package/lib/share/ui/HiddenPartsProvider.js.map +1 -0
  542. package/lib/share/ui/PagePart.d.ts +18 -0
  543. package/lib/share/ui/PagePart.d.ts.map +1 -0
  544. package/lib/share/ui/PagePart.js +16 -0
  545. package/lib/share/ui/PagePart.js.map +1 -0
  546. package/lib/share/ui/ShareButton.d.ts +42 -0
  547. package/lib/share/ui/ShareButton.d.ts.map +1 -0
  548. package/lib/share/ui/ShareButton.js +18 -0
  549. package/lib/share/ui/ShareButton.js.map +1 -0
  550. package/lib/share/ui/ShareDialog.d.ts +73 -0
  551. package/lib/share/ui/ShareDialog.d.ts.map +1 -0
  552. package/lib/share/ui/ShareDialog.js +19 -0
  553. package/lib/share/ui/ShareDialog.js.map +1 -0
  554. package/lib/share/ui/ShareDialogContent.d.ts +13 -0
  555. package/lib/share/ui/ShareDialogContent.d.ts.map +1 -0
  556. package/lib/share/ui/ShareDialogContent.js +71 -0
  557. package/lib/share/ui/ShareDialogContent.js.map +1 -0
  558. package/lib/share/ui/SharePartOptions.d.ts +18 -0
  559. package/lib/share/ui/SharePartOptions.d.ts.map +1 -0
  560. package/lib/share/ui/SharePartOptions.js +22 -0
  561. package/lib/share/ui/SharePartOptions.js.map +1 -0
  562. package/lib/share/ui/draft.d.ts +13 -0
  563. package/lib/share/ui/draft.d.ts.map +1 -0
  564. package/lib/share/ui/draft.js +16 -0
  565. package/lib/share/ui/draft.js.map +1 -0
  566. package/lib/share/ui/hiddenParts.d.ts +17 -0
  567. package/lib/share/ui/hiddenParts.d.ts.map +1 -0
  568. package/lib/share/ui/hiddenParts.js +21 -0
  569. package/lib/share/ui/hiddenParts.js.map +1 -0
  570. package/lib/share/ui/index.d.ts +10 -0
  571. package/lib/share/ui/index.d.ts.map +1 -0
  572. package/lib/share/ui/index.js +6 -0
  573. package/lib/share/ui/index.js.map +1 -0
  574. package/lib/shared/ui/index.d.ts +2 -1
  575. package/lib/shared/ui/index.d.ts.map +1 -1
  576. package/lib/shared/ui/index.js +1 -1
  577. package/lib/shared/ui/index.js.map +1 -1
  578. package/lib/state/ui/index.d.ts +3 -0
  579. package/lib/state/ui/index.d.ts.map +1 -0
  580. package/lib/state/ui/index.js +2 -0
  581. package/lib/state/ui/index.js.map +1 -0
  582. package/lib/state/ui/mergeStored.d.ts +27 -0
  583. package/lib/state/ui/mergeStored.d.ts.map +1 -0
  584. package/lib/state/ui/mergeStored.js +82 -0
  585. package/lib/state/ui/mergeStored.js.map +1 -0
  586. package/lib/state/ui/persistBucket.d.ts +65 -0
  587. package/lib/state/ui/persistBucket.d.ts.map +1 -0
  588. package/lib/state/ui/persistBucket.js +90 -0
  589. package/lib/state/ui/persistBucket.js.map +1 -0
  590. package/lib/structure/core/editorValue.d.ts +69 -0
  591. package/lib/structure/core/editorValue.d.ts.map +1 -0
  592. package/lib/structure/core/editorValue.js +72 -0
  593. package/lib/structure/core/editorValue.js.map +1 -0
  594. package/lib/structure/core/fragmentQuery.d.ts +33 -0
  595. package/lib/structure/core/fragmentQuery.d.ts.map +1 -0
  596. package/lib/structure/core/fragmentQuery.js +37 -0
  597. package/lib/structure/core/fragmentQuery.js.map +1 -0
  598. package/lib/structure/core/index.d.ts +11 -0
  599. package/lib/structure/core/index.d.ts.map +1 -0
  600. package/lib/structure/core/index.js +6 -0
  601. package/lib/structure/core/index.js.map +1 -0
  602. package/lib/structure/core/molfile.d.ts +42 -0
  603. package/lib/structure/core/molfile.d.ts.map +1 -0
  604. package/lib/structure/core/molfile.js +74 -0
  605. package/lib/structure/core/molfile.js.map +1 -0
  606. package/lib/structure/core/readStructure.d.ts +37 -0
  607. package/lib/structure/core/readStructure.d.ts.map +1 -0
  608. package/lib/structure/core/readStructure.js +59 -0
  609. package/lib/structure/core/readStructure.js.map +1 -0
  610. package/lib/structure/core/structureSource.d.ts +34 -0
  611. package/lib/structure/core/structureSource.d.ts.map +1 -0
  612. package/lib/structure/core/structureSource.js +32 -0
  613. package/lib/structure/core/structureSource.js.map +1 -0
  614. package/lib/structure/core/toolbarFloor.d.ts +16 -0
  615. package/lib/structure/core/toolbarFloor.d.ts.map +1 -0
  616. package/lib/structure/core/toolbarFloor.js +27 -0
  617. package/lib/structure/core/toolbarFloor.js.map +1 -0
  618. package/lib/structure/ui/EditorCanvas.d.ts +55 -0
  619. package/lib/structure/ui/EditorCanvas.d.ts.map +1 -0
  620. package/lib/structure/ui/EditorCanvas.js +41 -0
  621. package/lib/structure/ui/EditorCanvas.js.map +1 -0
  622. package/lib/structure/ui/Structure.d.ts +122 -0
  623. package/lib/structure/ui/Structure.d.ts.map +1 -0
  624. package/lib/structure/ui/Structure.js +28 -0
  625. package/lib/structure/ui/Structure.js.map +1 -0
  626. package/lib/structure/ui/StructureEditor.d.ts +75 -0
  627. package/lib/structure/ui/StructureEditor.d.ts.map +1 -0
  628. package/lib/structure/ui/StructureEditor.js +83 -0
  629. package/lib/structure/ui/StructureEditor.js.map +1 -0
  630. package/lib/structure/ui/StructurePlaceholder.d.ts +29 -0
  631. package/lib/structure/ui/StructurePlaceholder.d.ts.map +1 -0
  632. package/lib/structure/ui/StructurePlaceholder.js +19 -0
  633. package/lib/structure/ui/StructurePlaceholder.js.map +1 -0
  634. package/lib/structure/ui/StructureSvg.d.ts +58 -0
  635. package/lib/structure/ui/StructureSvg.d.ts.map +1 -0
  636. package/lib/structure/ui/StructureSvg.js +33 -0
  637. package/lib/structure/ui/StructureSvg.js.map +1 -0
  638. package/lib/structure/ui/index.d.ts +19 -0
  639. package/lib/structure/ui/index.d.ts.map +1 -0
  640. package/lib/structure/ui/index.js +15 -0
  641. package/lib/structure/ui/index.js.map +1 -0
  642. package/lib/structure/ui/useToolbarFloor.d.ts +26 -0
  643. package/lib/structure/ui/useToolbarFloor.d.ts.map +1 -0
  644. package/lib/structure/ui/useToolbarFloor.js +70 -0
  645. package/lib/structure/ui/useToolbarFloor.js.map +1 -0
  646. package/lib/structure.d.ts +3 -0
  647. package/lib/structure.d.ts.map +1 -0
  648. package/lib/structure.js +3 -0
  649. package/lib/structure.js.map +1 -0
  650. package/lib/ui.d.ts +13 -0
  651. package/lib/ui.d.ts.map +1 -1
  652. package/lib/ui.js +13 -0
  653. package/lib/ui.js.map +1 -1
  654. package/lib/vite.d.ts +2 -0
  655. package/lib/vite.d.ts.map +1 -0
  656. package/lib/vite.js +2 -0
  657. package/lib/vite.js.map +1 -0
  658. package/lib/worker/core/errors.d.ts +15 -0
  659. package/lib/worker/core/errors.d.ts.map +1 -0
  660. package/lib/worker/core/errors.js +15 -0
  661. package/lib/worker/core/errors.js.map +1 -0
  662. package/lib/worker/core/index.d.ts +5 -0
  663. package/lib/worker/core/index.d.ts.map +1 -0
  664. package/lib/worker/core/index.js +3 -0
  665. package/lib/worker/core/index.js.map +1 -0
  666. package/lib/worker/core/messages.d.ts +48 -0
  667. package/lib/worker/core/messages.d.ts.map +1 -0
  668. package/lib/worker/core/messages.js +2 -0
  669. package/lib/worker/core/messages.js.map +1 -0
  670. package/lib/worker/core/workerChannel.d.ts +69 -0
  671. package/lib/worker/core/workerChannel.d.ts.map +1 -0
  672. package/lib/worker/core/workerChannel.js +121 -0
  673. package/lib/worker/core/workerChannel.js.map +1 -0
  674. package/package.json +22 -4
  675. package/src/capsule/ui/CapsuleFilter.tsx +119 -0
  676. package/src/capsule/ui/index.ts +2 -0
  677. package/src/chrome/ui/NavLink.tsx +88 -0
  678. package/src/chrome/ui/NavMenuButton.tsx +95 -0
  679. package/src/chrome/ui/SiteFooter.tsx +65 -0
  680. package/src/chrome/ui/SiteHeader.tsx +119 -0
  681. package/src/chrome/ui/index.ts +11 -0
  682. package/src/chrome/ui/navItem.ts +60 -0
  683. package/src/chrome/ui/useCompactHeader.ts +81 -0
  684. package/src/citation/core/clipboard.ts +27 -11
  685. package/src/citation/core/download.ts +25 -15
  686. package/src/citation/core/index.ts +8 -3
  687. package/src/citation/core/works.ts +81 -0
  688. package/src/citation/ui/CitationMenu.tsx +104 -89
  689. package/src/citation/ui/CitationPreview.tsx +18 -8
  690. package/src/citation/ui/CiteButton.tsx +24 -9
  691. package/src/citation/ui/CopyFormatEntries.tsx +84 -0
  692. package/src/citation/ui/WorkEntry.tsx +80 -0
  693. package/src/citation/ui/entries.tsx +18 -20
  694. package/src/citation/ui/index.ts +10 -2
  695. package/src/citation/ui/useCopyFeedback.ts +76 -0
  696. package/src/clipboard/core/index.ts +1 -0
  697. package/src/clipboard/core/writeToClipboard.ts +47 -0
  698. package/src/clipboard/ui/CodeBlock.tsx +110 -0
  699. package/src/clipboard/ui/CopyButton.tsx +111 -0
  700. package/src/clipboard/ui/index.ts +9 -0
  701. package/src/clipboard/ui/useCopyToClipboard.ts +57 -0
  702. package/src/color/core/contrast.ts +85 -0
  703. package/src/color/core/hex.ts +57 -0
  704. package/src/color/core/index.ts +4 -0
  705. package/src/color/core/scale.ts +132 -0
  706. package/src/color/ui/ColorScaleLegend.tsx +144 -0
  707. package/src/color/ui/index.ts +2 -0
  708. package/src/core.ts +11 -0
  709. package/src/credits/core/credits.ts +183 -0
  710. package/src/credits/core/index.ts +2 -0
  711. package/src/credits/ui/CreditsList.tsx +82 -0
  712. package/src/credits/ui/index.ts +2 -0
  713. package/src/delimited/core/delimiters.ts +64 -0
  714. package/src/delimited/core/index.ts +11 -0
  715. package/src/delimited/core/readDelimited.ts +132 -0
  716. package/src/delimited/core/rowsToDelimited.ts +135 -0
  717. package/src/delimited/core/toDelimited.ts +69 -0
  718. package/src/delimited/ui/DelimitedTextDialog.tsx +49 -0
  719. package/src/delimited/ui/DelimitedTextPanel.tsx +161 -0
  720. package/src/delimited/ui/index.ts +4 -0
  721. package/src/disclosure/ui/CollapsibleSection.tsx +150 -0
  722. package/src/disclosure/ui/index.ts +4 -0
  723. package/src/disclosure/ui/useDisclosure.ts +35 -0
  724. package/src/download/core/downloadBlob.ts +19 -0
  725. package/src/download/core/downloadText.ts +19 -0
  726. package/src/download/core/index.ts +3 -0
  727. package/src/download/core/sanitizeFileName.ts +33 -0
  728. package/src/ecosystem/core/index.ts +3 -0
  729. package/src/ecosystem/core/links.ts +29 -0
  730. package/src/ecosystem/core/lookup.ts +57 -0
  731. package/src/ecosystem/core/sites.ts +21 -4
  732. package/src/ecosystem/core/tokens.ts +47 -0
  733. package/src/ecosystem/ui/SiteTheme.tsx +23 -0
  734. package/src/ecosystem/ui/Wordmark.tsx +65 -0
  735. package/src/ecosystem/ui/glyphs.tsx +1 -1
  736. package/src/ecosystem/ui/index.ts +4 -0
  737. package/src/ecosystem/ui/marks.tsx +54 -15
  738. package/src/error/ui/ErrorBoundary.tsx +94 -0
  739. package/src/error/ui/ErrorFallback.tsx +64 -0
  740. package/src/error/ui/index.ts +4 -0
  741. package/src/error/ui/toError.ts +33 -0
  742. package/src/format/core/index.ts +9 -0
  743. package/src/format/core/missing.ts +6 -0
  744. package/src/format/core/numbers.ts +84 -0
  745. package/src/format/core/units.ts +60 -0
  746. package/src/format/core/words.ts +17 -0
  747. package/src/help/ui/HelpBody.tsx +130 -0
  748. package/src/help/ui/HelpIcon.tsx +53 -0
  749. package/src/help/ui/HelpToolbarButton.tsx +72 -0
  750. package/src/help/ui/HelpTooltip.tsx +72 -0
  751. package/src/help/ui/index.ts +8 -0
  752. package/src/hooks/ui/index.ts +6 -0
  753. package/src/hooks/ui/listNavigation.ts +116 -0
  754. package/src/hooks/ui/useContainerSize.ts +32 -0
  755. package/src/hooks/ui/useDebouncedValue.ts +29 -0
  756. package/src/hooks/ui/useListKeyboardNavigation.ts +37 -0
  757. package/src/hooks/ui/useResizeObserver.ts +50 -0
  758. package/src/orbital/core/atomicGrid.ts +53 -1
  759. package/src/orbital/core/index.ts +7 -16
  760. package/src/orbital/core/isovalue.ts +146 -0
  761. package/src/orbital/core/sample.ts +25 -5
  762. package/src/orbital/ui/AtomicOrbitalCanvas.tsx +19 -3
  763. package/src/orbital/ui/AtomicOrbitalViewer.tsx +5 -1
  764. package/src/orbital/ui/renderVolume.ts +29 -16
  765. package/src/orbital/ui/viewer.ts +6 -1
  766. package/src/orbital/ui/volumeField.ts +5 -49
  767. package/src/pedagogy/core/glossary.ts +122 -0
  768. package/src/pedagogy/core/index.ts +28 -0
  769. package/src/pedagogy/core/jsonStorage.ts +51 -0
  770. package/src/pedagogy/core/progress.ts +205 -0
  771. package/src/pedagogy/core/types.ts +78 -0
  772. package/src/pedagogy/core/validation.ts +109 -0
  773. package/src/pedagogy/ui/ExerciseActions.tsx +129 -0
  774. package/src/pedagogy/ui/ExerciseProgressHeader.tsx +135 -0
  775. package/src/pedagogy/ui/ExerciseTags.tsx +85 -0
  776. package/src/pedagogy/ui/GlossaryProvider.tsx +31 -0
  777. package/src/pedagogy/ui/GlossaryText.tsx +164 -0
  778. package/src/pedagogy/ui/HintLadder.tsx +95 -0
  779. package/src/pedagogy/ui/ReferenceGrid.tsx +69 -0
  780. package/src/pedagogy/ui/ReferenceSectionBlock.tsx +175 -0
  781. package/src/pedagogy/ui/SyntaxTooltip.tsx +222 -0
  782. package/src/pedagogy/ui/TestCaseList.tsx +122 -0
  783. package/src/pedagogy/ui/TutorialStepStrip.tsx +230 -0
  784. package/src/pedagogy/ui/exerciseMeta.ts +45 -0
  785. package/src/pedagogy/ui/glossaryContext.ts +23 -0
  786. package/src/pedagogy/ui/index.ts +37 -0
  787. package/src/pedagogy/ui/tutorialLevels.ts +27 -0
  788. package/src/router/core/address.ts +74 -0
  789. package/src/router/core/basePath.ts +76 -0
  790. package/src/router/core/index.ts +26 -0
  791. package/src/router/core/legacyHash.ts +77 -0
  792. package/src/router/core/pageAddresses.ts +106 -0
  793. package/src/router/core/query.ts +87 -0
  794. package/src/router/core/tabRouter.ts +214 -0
  795. package/src/seo/core/documentMeta.ts +92 -0
  796. package/src/seo/core/index.ts +26 -0
  797. package/src/seo/core/pageMeta.ts +127 -0
  798. package/src/seo/core/routes.ts +79 -0
  799. package/src/seo/core/siteFiles.ts +150 -0
  800. package/src/seo/vite/index.ts +4 -0
  801. package/src/seo/vite/ogCard.ts +92 -0
  802. package/src/seo/vite/prerender.ts +156 -0
  803. package/src/share/core/config.ts +165 -0
  804. package/src/share/core/escape.ts +22 -0
  805. package/src/share/core/index.ts +31 -0
  806. package/src/share/core/params.ts +176 -0
  807. package/src/share/core/query.ts +72 -0
  808. package/src/share/core/url.ts +105 -0
  809. package/src/share/core/vocabulary.ts +60 -0
  810. package/src/share/ui/HiddenPartsProvider.tsx +34 -0
  811. package/src/share/ui/PagePart.tsx +26 -0
  812. package/src/share/ui/ShareButton.tsx +84 -0
  813. package/src/share/ui/ShareDialog.tsx +114 -0
  814. package/src/share/ui/ShareDialogContent.tsx +189 -0
  815. package/src/share/ui/SharePartOptions.tsx +51 -0
  816. package/src/share/ui/draft.ts +19 -0
  817. package/src/share/ui/hiddenParts.ts +22 -0
  818. package/src/share/ui/index.ts +9 -0
  819. package/src/shared/ui/index.ts +2 -1
  820. package/src/state/ui/index.ts +6 -0
  821. package/src/state/ui/mergeStored.ts +87 -0
  822. package/src/state/ui/persistBucket.ts +147 -0
  823. package/src/structure/core/editorValue.ts +116 -0
  824. package/src/structure/core/fragmentQuery.ts +50 -0
  825. package/src/structure/core/index.ts +13 -0
  826. package/src/structure/core/molfile.ts +90 -0
  827. package/src/structure/core/readStructure.ts +73 -0
  828. package/src/structure/core/structureSource.ts +57 -0
  829. package/src/structure/core/toolbarFloor.ts +31 -0
  830. package/src/structure/ui/EditorCanvas.tsx +130 -0
  831. package/src/structure/ui/Structure.tsx +183 -0
  832. package/src/structure/ui/StructureEditor.tsx +196 -0
  833. package/src/structure/ui/StructurePlaceholder.tsx +48 -0
  834. package/src/structure/ui/StructureSvg.tsx +110 -0
  835. package/src/structure/ui/index.ts +22 -0
  836. package/src/structure/ui/useToolbarFloor.ts +93 -0
  837. package/src/structure.ts +2 -0
  838. package/src/ui.ts +13 -0
  839. package/src/vite.ts +1 -0
  840. package/src/worker/core/errors.ts +15 -0
  841. package/src/worker/core/index.ts +8 -0
  842. package/src/worker/core/messages.ts +47 -0
  843. package/src/worker/core/workerChannel.ts +218 -0
  844. package/styles/chrome.css +223 -0
@@ -1,3 +1,5 @@
1
+ export { renderEcosystemLinksHtml } from './links.ts';
2
+ export { findSiteByHost, siteById, siteDisplayName } from './lookup.ts';
1
3
  export type {
2
4
  EcosystemSite,
3
5
  SiteId,
@@ -5,3 +7,4 @@ export type {
5
7
  SiteName,
6
8
  } from './sites.ts';
7
9
  export { ECOSYSTEM_SITES, siteUrl } from './sites.ts';
10
+ export { siteThemeColor, siteTokensCss } from './tokens.ts';
@@ -0,0 +1,29 @@
1
+ import { ECOSYSTEM_SITES, siteUrl } from './sites.ts';
2
+
3
+ /**
4
+ * Every site of the family as a plain list of links, for the `<noscript>` of a
5
+ * page whose body is an empty root element.
6
+ *
7
+ * A crawler that runs no script sees nothing else of the page, so this is the
8
+ * only path it has from one of our tools to the next — and each entry carries
9
+ * the line saying what it opens, as real text.
10
+ * @returns The `<ul>`, for the caller to place inside its own `<noscript>`.
11
+ */
12
+ export function renderEcosystemLinksHtml(): string {
13
+ let html = '<ul class="ecosystem-links">\n';
14
+ for (const site of ECOSYSTEM_SITES) {
15
+ const href = escapeHtml(siteUrl(site));
16
+ const host = escapeHtml(site.host);
17
+ const tagline = escapeHtml(site.tagline);
18
+ html += `<li><a href="${href}">${host}</a> — ${tagline}</li>\n`;
19
+ }
20
+ return `${html}</ul>\n`;
21
+ }
22
+
23
+ function escapeHtml(value: string): string {
24
+ return value
25
+ .replaceAll('&', '&amp;')
26
+ .replaceAll('<', '&lt;')
27
+ .replaceAll('>', '&gt;')
28
+ .replaceAll('"', '&quot;');
29
+ }
@@ -0,0 +1,57 @@
1
+ import type { EcosystemSite, SiteId } from './sites.ts';
2
+ import { ECOSYSTEM_SITES } from './sites.ts';
3
+
4
+ /**
5
+ * One site of the family, by the identifier its entry carries.
6
+ * @param id - The site being asked for.
7
+ * @returns The site.
8
+ * @throws {Error} When no site of the family carries that identifier.
9
+ */
10
+ export function siteById(id: SiteId): EcosystemSite {
11
+ for (const site of ECOSYSTEM_SITES) {
12
+ if (site.id === id) return site;
13
+ }
14
+ throw new Error(`unknown ecosystem site: ${id}`);
15
+ }
16
+
17
+ /**
18
+ * The site's name as prose, for a page title, a card or a citation.
19
+ *
20
+ * An address-shaped name is written as the address it is — `3d` and `cheminfo`
21
+ * are two halves of `3d.cheminfo.org`, and joining them would read `3dcheminfo`
22
+ * — while a product-shaped one is its two halves run together, as its wordmark
23
+ * sets them.
24
+ * @param site - The site being named.
25
+ * @returns What the site is called, in one string.
26
+ */
27
+ export function siteDisplayName(site: EcosystemSite): string {
28
+ return site.name.dot === true
29
+ ? site.host
30
+ : `${site.name.lead}${site.name.alt}`;
31
+ }
32
+
33
+ /**
34
+ * The site a page is being served from, so a header can mark itself as the
35
+ * current one without being told which site it belongs to.
36
+ *
37
+ * The host is whatever the browser reports, so it may carry a port and may or
38
+ * may not carry the `www.` two of our sites are written with. Neither changes
39
+ * which site it is, and a host belonging to nobody — a development server, a
40
+ * preview deployment — is simply not one of ours.
41
+ * @param host - What `location.host` reads, or any host-shaped string.
42
+ * @returns The site served from that host, or undefined for any other host.
43
+ */
44
+ export function findSiteByHost(host: string): EcosystemSite | undefined {
45
+ const wanted = normalizeHost(host);
46
+ if (wanted === '') return undefined;
47
+
48
+ for (const site of ECOSYSTEM_SITES) {
49
+ if (normalizeHost(site.host) === wanted) return site;
50
+ }
51
+ return undefined;
52
+ }
53
+
54
+ function normalizeHost(host: string): string {
55
+ const withoutPort = host.trim().toLowerCase().split(':', 1)[0] ?? '';
56
+ return withoutPort.startsWith('www.') ? withoutPort.slice(4) : withoutPort;
57
+ }
@@ -14,7 +14,7 @@ export type SiteId =
14
14
  | 'equilibrium'
15
15
  | 'polycarp'
16
16
  | '3d'
17
- | 'pt';
17
+ | 'periodic-table';
18
18
 
19
19
  export interface SiteName {
20
20
  /** First half of the name, set in the site's leading colour. */
@@ -35,6 +35,8 @@ export interface EcosystemSite {
35
35
  name: SiteName;
36
36
  /** Where the site lives, written the way it is typed. */
37
37
  host: string;
38
+ /** Where the sources live, and what a Source link opens. */
39
+ repository: string;
38
40
  /** One line on what the site does. */
39
41
  tagline: string;
40
42
  /** The colour the first half of the name is set in. */
@@ -71,6 +73,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
71
73
  id: 'inchi',
72
74
  name: { lead: 'inchi', alt: 'cheminfo', dot: true },
73
75
  host: 'inchi.cheminfo.org',
76
+ repository: 'https://github.com/cheminfo/inchi.cheminfo.org',
74
77
  tagline: 'InChI and InChIKey from a structure, in the browser.',
75
78
  brand: '#5b21b6',
76
79
  brandAlt: '#a16207',
@@ -80,6 +83,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
80
83
  id: 'vcl',
81
84
  name: { lead: 'vcl', alt: 'cheminfo', dot: true },
82
85
  host: 'vcl.cheminfo.org',
86
+ repository: 'https://github.com/cheminfo/vcl.cheminfo.org',
83
87
  tagline: 'Combine a core and fragments into a screened library.',
84
88
  brand: '#2d72d2',
85
89
  brandAlt: '#9a3412',
@@ -89,6 +93,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
89
93
  id: 'smiles',
90
94
  name: { lead: 'smiles', alt: 'cheminfo', dot: true },
91
95
  host: 'smiles.cheminfo.org',
96
+ repository: 'https://github.com/cheminfo/smiles.cheminfo.org',
92
97
  tagline: 'Draw a structure, read its SMILES, learn the notation.',
93
98
  brand: '#1c6e42',
94
99
  brandAlt: '#9a3412',
@@ -98,6 +103,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
98
103
  id: 'chemcalc',
99
104
  name: { lead: 'Chem', alt: 'Calc' },
100
105
  host: 'www.chemcalc.org',
106
+ repository: 'https://github.com/cheminfo/chemcalc.org',
101
107
  tagline: 'Molecular formula, exact mass and isotopic distribution.',
102
108
  brand: '#5b52e0',
103
109
  brandAlt: '#0d9488',
@@ -107,6 +113,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
107
113
  id: 'nmrium',
108
114
  name: { lead: 'NMR', alt: 'ium' },
109
115
  host: 'www.nmrium.org',
116
+ repository: 'https://github.com/cheminfo/nmrium',
110
117
  tagline: 'Process and assign NMR spectra in the browser.',
111
118
  brand: '#ea580c',
112
119
  brandAlt: '#2b143e',
@@ -116,6 +123,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
116
123
  id: 'surge',
117
124
  name: { lead: 'surge', alt: 'cheminfo', dot: true },
118
125
  host: 'surge.cheminfo.org',
126
+ repository: 'https://github.com/cheminfo/surge.cheminfo.org',
119
127
  tagline: 'Every constitutional isomer of a molecular formula.',
120
128
  brand: '#4338ca',
121
129
  brandAlt: '#be123c',
@@ -125,6 +133,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
125
133
  id: 'tex',
126
134
  name: { lead: 'tex', alt: 'cheminfo', dot: true },
127
135
  host: 'tex.cheminfo.org',
136
+ repository: 'https://github.com/cheminfo/tex.cheminfo.org',
128
137
  tagline: 'LaTeX formulas rendered to SVG or PNG from a URL.',
129
138
  brand: '#a21caf',
130
139
  brandAlt: '#a16207',
@@ -134,6 +143,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
134
143
  id: 'lcao',
135
144
  name: { lead: 'lcao', alt: 'cheminfo', dot: true },
136
145
  host: 'lcao.cheminfo.org',
146
+ repository: 'https://github.com/cheminfo/lcao.cheminfo.org',
137
147
  tagline: 'Combine atomic orbitals into molecular ones.',
138
148
  brand: '#1565c0',
139
149
  brandAlt: '#c62828',
@@ -143,6 +153,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
143
153
  id: 'regexp',
144
154
  name: { lead: 'regexp', alt: 'cheminfo', dot: true },
145
155
  host: 'regexp.cheminfo.org',
156
+ repository: 'https://github.com/cheminfo/regexp.cheminfo.org',
146
157
  tagline: 'Learn regular expressions in a live playground.',
147
158
  brand: '#1e3a8a',
148
159
  brandAlt: '#a16207',
@@ -152,6 +163,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
152
163
  id: 'pdb',
153
164
  name: { lead: 'pdb', alt: 'cheminfo', dot: true },
154
165
  host: 'pdb.cheminfo.org',
166
+ repository: 'https://github.com/cheminfo/pdb.cheminfo.org',
155
167
  tagline: 'A fast look at any Protein Data Bank entry.',
156
168
  brand: '#2563eb',
157
169
  brandAlt: '#b45309',
@@ -161,6 +173,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
161
173
  id: 'elucidation',
162
174
  name: { lead: 'elucidation', alt: 'cheminfo', dot: true },
163
175
  host: 'elucidation.cheminfo.org',
176
+ repository: 'https://github.com/cheminfo/elucidation.cheminfo.org',
164
177
  tagline: 'A structure from a 1H NMR spectrum and a formula.',
165
178
  brand: '#7e22ce',
166
179
  brandAlt: '#b45309',
@@ -170,6 +183,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
170
183
  id: 'equilibrium',
171
184
  name: { lead: 'Equi', alt: 'Librium' },
172
185
  host: 'equilibrium.cheminfo.org',
186
+ repository: 'https://github.com/cheminfo/equilibrium.cheminfo.org',
173
187
  tagline: 'Chemical equilibria: pH, speciation and titration curves.',
174
188
  brand: '#0b5754',
175
189
  brandAlt: '#a56600',
@@ -179,6 +193,7 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
179
193
  id: 'polycarp',
180
194
  name: { lead: 'Poly', alt: 'Carp' },
181
195
  host: 'polycarp.cheminfo.org',
196
+ repository: 'https://github.com/cheminfo/polycarp.cheminfo.org',
182
197
  tagline: 'Predict the microstructure of a radical copolymerisation.',
183
198
  brand: '#0d1d37',
184
199
  brandAlt: '#0c9ba3',
@@ -188,15 +203,17 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
188
203
  id: '3d',
189
204
  name: { lead: '3d', alt: 'cheminfo', dot: true },
190
205
  host: '3d.cheminfo.org',
206
+ repository: 'https://github.com/cheminfo/3d.cheminfo.org',
191
207
  tagline: 'Conformers in 3D from a structure you draw.',
192
208
  brand: '#155e75',
193
209
  brandAlt: '#b45309',
194
210
  mark: { plate: '#155e75', accent: '#f97316' },
195
211
  },
196
212
  {
197
- id: 'pt',
198
- name: { lead: 'pt', alt: 'cheminfo', dot: true },
199
- host: 'pt.cheminfo.org',
213
+ id: 'periodic-table',
214
+ name: { lead: 'Periodic', alt: 'Table' },
215
+ host: 'periodic-table.cheminfo.org',
216
+ repository: 'https://github.com/cheminfo/periodic-table.cheminfo.org',
200
217
  tagline: 'The periodic table, coloured, plotted and taken apart.',
201
218
  brand: '#15803d',
202
219
  brandAlt: '#a16207',
@@ -0,0 +1,47 @@
1
+ import { siteById } from './lookup.ts';
2
+ import type { EcosystemSite, SiteId } from './sites.ts';
3
+
4
+ /**
5
+ * The custom properties a site of the family sets on `:root`: the two colours
6
+ * it owns, the readable form of the second one when that is needed, and the
7
+ * accent bound to the first.
8
+ *
9
+ * It is a complete rule rather than a list of declarations, so it drops into a
10
+ * `<style>` of a prerendered page as it is.
11
+ * @param id - The site whose palette is wanted.
12
+ * @returns The `:root` rule, ending in a newline.
13
+ */
14
+ export function siteTokensCss(id: SiteId): string {
15
+ const site = siteById(id);
16
+ const answering = answeringColor(site);
17
+ const declarations = [
18
+ `--brand: ${site.brand};`,
19
+ `--brand-alt: ${answering};`,
20
+ ];
21
+
22
+ // The answering colour of several sites is a yellow or an amber that sits
23
+ // around 2:1 on white, so text set in it needs the darkened form instead.
24
+ if (site.brandAlt !== answering) {
25
+ declarations.push(`--brand-alt-text: ${site.brandAlt};`);
26
+ }
27
+ declarations.push('--accent: var(--brand);');
28
+
29
+ return `:root {\n ${declarations.join('\n ')}\n}\n`;
30
+ }
31
+
32
+ /**
33
+ * What a browser paints its own chrome with on that site — the address bar on
34
+ * Android, the title bar of an installed page — which is the site's leading
35
+ * colour.
36
+ * @param id - The site whose colour is wanted.
37
+ * @returns The colour, as the `<meta name="theme-color">` content.
38
+ */
39
+ export function siteThemeColor(id: SiteId): string {
40
+ return siteById(id).brand;
41
+ }
42
+
43
+ // The second colour as the site's mark draws it: on the accent element, unless
44
+ // the mark inverts the pair and gives the plate the answering colour instead.
45
+ function answeringColor(site: EcosystemSite): string {
46
+ return site.mark.accent === site.brand ? site.mark.plate : site.mark.accent;
47
+ }
@@ -0,0 +1,23 @@
1
+ import type { ReactElement } from 'react';
2
+
3
+ import type { SiteId } from '../core/sites.ts';
4
+ import { siteTokensCss } from '../core/tokens.ts';
5
+
6
+ export interface SiteThemeProps {
7
+ /** The site whose palette the page takes. */
8
+ siteId: SiteId;
9
+ }
10
+
11
+ /**
12
+ * The two colours a site owns, put on the page as custom properties.
13
+ *
14
+ * Everything of the family that reads `--brand`, `--brand-alt` or `--accent` —
15
+ * a mark drawn in token colours, a current menu item, a focus ring — follows
16
+ * from here, so a site declares its palette once and never repeats a hex code
17
+ * in a component.
18
+ * @param props - The site whose palette is injected.
19
+ * @returns The rule, as a style element that applies wherever it is rendered.
20
+ */
21
+ export function SiteTheme(props: SiteThemeProps): ReactElement {
22
+ return <style>{siteTokensCss(props.siteId)}</style>;
23
+ }
@@ -0,0 +1,65 @@
1
+ import type { CSSProperties, ReactElement } from 'react';
2
+
3
+ import { siteById } from '../core/lookup.ts';
4
+ import type { SiteId } from '../core/sites.ts';
5
+
6
+ export interface WordmarkProps {
7
+ /** The site whose name is written. */
8
+ siteId: SiteId;
9
+ /**
10
+ * Size of the name, in pixels. The weight comes from the surrounding
11
+ * context, so the same wordmark suits a header bar and a heading.
12
+ * @default 17
13
+ */
14
+ size?: number;
15
+ /**
16
+ * Extra class names, for spacing at the place it is used. `wordmark` is
17
+ * always carried as well.
18
+ * @default undefined
19
+ */
20
+ className?: string;
21
+ }
22
+
23
+ /**
24
+ * The name of a site, written in the two colours it owns.
25
+ *
26
+ * A name that splits on itself — `ChemCalc`, `EquiLibrium`, `PolyCarp` —
27
+ * carries no domain and no dot; a one-word name takes `.cheminfo` after a faint
28
+ * dot. The `.org` is never written, because the name is the site rather than
29
+ * its address.
30
+ * @param props - The site, the size of the name, and extra class names.
31
+ * @returns The name, as one inline element that never wraps mid-address.
32
+ */
33
+ export function Wordmark(props: WordmarkProps): ReactElement {
34
+ const { siteId, size = 17, className } = props;
35
+ const site = siteById(siteId);
36
+
37
+ return (
38
+ <span
39
+ className={className ? `wordmark ${className}` : 'wordmark'}
40
+ style={{ ...WORDMARK_STYLE, fontSize: size }}
41
+ >
42
+ <span className="wordmark__lead" style={{ color: site.brand }}>
43
+ {site.name.lead}
44
+ </span>
45
+ {site.name.dot ? (
46
+ <span className="wordmark__dot" style={{ color: DOT_COLOR }}>
47
+ .
48
+ </span>
49
+ ) : null}
50
+ <span className="wordmark__alt" style={{ color: site.brandAlt }}>
51
+ {site.name.alt}
52
+ </span>
53
+ </span>
54
+ );
55
+ }
56
+
57
+ // The separating dot is neutral so the two coloured halves read as the name
58
+ // rather than as three equal parts, and it takes the family's own token when
59
+ // the page defines one.
60
+ const DOT_COLOR = 'var(--text-faint, #8a96a3)';
61
+
62
+ const WORDMARK_STYLE: CSSProperties = {
63
+ letterSpacing: '-0.01em',
64
+ whiteSpace: 'nowrap',
65
+ };
@@ -214,7 +214,7 @@ export const GLYPHS: Record<SiteId, (alt: string) => ReactNode> = {
214
214
  // The stepped corner of the table, with the one cell a visitor has picked
215
215
  // carrying the accent — which is what every tool of that site is: the table,
216
216
  // and one element read off it.
217
- pt: (alt) => (
217
+ 'periodic-table': (alt) => (
218
218
  <>
219
219
  <g fill="#ffffff" opacity="0.55">
220
220
  <rect x="5" y="6" width="5" height="5" rx="1" />
@@ -6,5 +6,9 @@ export type { EcosystemMenuProps } from './EcosystemMenu.tsx';
6
6
  export { EcosystemMenu } from './EcosystemMenu.tsx';
7
7
  export type { SiteMarkProps } from './marks.tsx';
8
8
  export { SiteMark } from './marks.tsx';
9
+ export type { SiteThemeProps } from './SiteTheme.tsx';
10
+ export { SiteTheme } from './SiteTheme.tsx';
9
11
  export type { SiteTileProps } from './SiteTile.tsx';
10
12
  export { SiteTile } from './SiteTile.tsx';
13
+ export type { WordmarkProps } from './Wordmark.tsx';
14
+ export { Wordmark } from './Wordmark.tsx';
@@ -1,6 +1,7 @@
1
1
  import type { CSSProperties, ReactElement } from 'react';
2
2
 
3
- import type { EcosystemSite } from '../core/sites.ts';
3
+ import { siteById } from '../core/lookup.ts';
4
+ import type { EcosystemSite, SiteId } from '../core/sites.ts';
4
5
 
5
6
  import { GLYPHS } from './glyphs.tsx';
6
7
 
@@ -12,22 +13,58 @@ import { GLYPHS } from './glyphs.tsx';
12
13
  const MARK_STYLE: CSSProperties = { display: 'block', flex: 'none' };
13
14
 
14
15
  export interface SiteMarkProps {
15
- /** The site whose mark is drawn, with the two colours it owns. */
16
- site: EcosystemSite;
16
+ /**
17
+ * The site whose mark is drawn, with the two colours it owns. One of `site`
18
+ * and `siteId` is required.
19
+ * @default undefined
20
+ */
21
+ site?: EcosystemSite;
22
+ /**
23
+ * The same site, named rather than passed, for a header that knows only
24
+ * which site it is.
25
+ * @default undefined
26
+ */
27
+ siteId?: SiteId;
17
28
  /**
18
29
  * Edge of the square the mark is drawn in, in pixels.
19
30
  * @default 28
20
31
  */
21
32
  size?: number;
33
+ /**
34
+ * Whether the drawing sits on the site's rounded plate. Several marks are
35
+ * drawn in the plate's negative space, so dropping it suits a mark already
36
+ * standing on a surface of the site's own colour.
37
+ * @default true
38
+ */
39
+ plate?: boolean;
40
+ /**
41
+ * Whether the two colours are written out or read from the page. `tokens`
42
+ * draws the plate in `var(--brand)` and the answering element in
43
+ * `var(--brand-alt)`, so a site retuning its pair retunes its mark; it is
44
+ * therefore for the site's own mark rather than for another site's.
45
+ * @default 'literal'
46
+ */
47
+ colors?: 'literal' | 'tokens';
22
48
  }
23
49
 
24
50
  /**
25
51
  * The little logo of one site of the family.
26
- * @param props - The site and the size of its mark.
52
+ * @param props - Which site, how big, and where its colours come from.
27
53
  * @returns The mark, as an inline SVG.
54
+ * @throws {Error} When neither `site` nor `siteId` is given.
28
55
  */
29
56
  export function SiteMark(props: SiteMarkProps): ReactElement {
30
- const { site, size = 28 } = props;
57
+ const { site, siteId, size = 28, plate = true, colors = 'literal' } = props;
58
+
59
+ const drawn = site ?? (siteId === undefined ? undefined : siteById(siteId));
60
+ if (drawn === undefined) {
61
+ throw new Error('SiteMark needs one of its `site` and `siteId` props');
62
+ }
63
+
64
+ const usesTokens = colors === 'tokens';
65
+ const plateFill = usesTokens ? 'var(--brand)' : drawn.mark.plate;
66
+ const accent = usesTokens ? 'var(--brand-alt)' : drawn.mark.accent;
67
+ const edge = drawn.mark.edge;
31
68
 
32
69
  return (
33
70
  <svg
@@ -38,16 +75,18 @@ export function SiteMark(props: SiteMarkProps): ReactElement {
38
75
  aria-hidden="true"
39
76
  focusable="false"
40
77
  >
41
- <rect
42
- x={site.mark.edge ? 0.5 : 0}
43
- y={site.mark.edge ? 0.5 : 0}
44
- width={site.mark.edge ? 31 : 32}
45
- height={site.mark.edge ? 31 : 32}
46
- rx={site.mark.edge ? 6.5 : 7}
47
- fill={site.mark.plate}
48
- stroke={site.mark.edge}
49
- />
50
- {GLYPHS[site.id](site.mark.accent)}
78
+ {plate ? (
79
+ <rect
80
+ x={edge ? 0.5 : 0}
81
+ y={edge ? 0.5 : 0}
82
+ width={edge ? 31 : 32}
83
+ height={edge ? 31 : 32}
84
+ rx={edge ? 6.5 : 7}
85
+ fill={plateFill}
86
+ stroke={edge}
87
+ />
88
+ ) : null}
89
+ {GLYPHS[drawn.id](accent)}
51
90
  </svg>
52
91
  );
53
92
  }
@@ -0,0 +1,94 @@
1
+ import type { ErrorInfo, ReactNode } from 'react';
2
+ import { Component } from 'react';
3
+
4
+ import { ErrorFallback } from './ErrorFallback.tsx';
5
+ import { toError } from './toError.ts';
6
+
7
+ /** What {@link ErrorBoundary} wraps, and what it does when that part fails. */
8
+ export interface ErrorBoundaryProps {
9
+ /** The part of the page whose failures are caught here. */
10
+ children: ReactNode;
11
+ /**
12
+ * What is drawn in place of the children once one of them has thrown. The
13
+ * reset closes the boundary again, so a retry re-renders the children.
14
+ * @default a non-ideal state naming the error, with a retry button
15
+ */
16
+ fallback?: (error: Error, reset: () => void) => ReactNode;
17
+ /**
18
+ * Called once with the error and the stack of components it came through, so
19
+ * a site can report it. Anything it throws is ignored: a failing reporter
20
+ * must not replace the failure the visitor is already looking at.
21
+ * @default undefined — the failure is not reported anywhere
22
+ */
23
+ onError?: (error: Error, componentStack: string) => void;
24
+ /**
25
+ * First line of the default fallback.
26
+ * @default 'Something went wrong'
27
+ */
28
+ title?: string;
29
+ }
30
+
31
+ /** Whether the boundary is holding an error, and which one. */
32
+ export interface ErrorBoundaryState {
33
+ /** The error the boundary caught, or `null` while nothing has failed. */
34
+ error: Error | null;
35
+ }
36
+
37
+ /**
38
+ * Keep one failing part of the page from taking the whole page with it.
39
+ *
40
+ * A viewer that cannot start, a worker that dies, a structure that will not
41
+ * parse: without a boundary any of these leaves a blank page carrying the
42
+ * right title, which reads as a routing or a build defect and is neither.
43
+ */
44
+ export class ErrorBoundary extends Component<
45
+ ErrorBoundaryProps,
46
+ ErrorBoundaryState
47
+ > {
48
+ /**
49
+ * Move the boundary into its failed state, whatever was thrown.
50
+ * @param thrown - The value a child threw.
51
+ * @returns The state holding it.
52
+ */
53
+ static getDerivedStateFromError(thrown: unknown): ErrorBoundaryState {
54
+ return { error: toError(thrown) };
55
+ }
56
+
57
+ constructor(props: ErrorBoundaryProps) {
58
+ super(props);
59
+ this.state = { error: null };
60
+ }
61
+
62
+ /**
63
+ * Hand the failure to the site's reporter, if it has one.
64
+ * @param thrown - The value a child threw.
65
+ * @param info - Where it came from.
66
+ */
67
+ override componentDidCatch(thrown: unknown, info: ErrorInfo): void {
68
+ const { onError } = this.props;
69
+ if (onError === undefined) return;
70
+ try {
71
+ onError(toError(thrown), info.componentStack ?? '');
72
+ } catch {
73
+ // A reporter that fails must not replace the error being shown.
74
+ }
75
+ }
76
+
77
+ /** Forget the error and render the children again. */
78
+ reset = (): void => {
79
+ this.setState({ error: null });
80
+ };
81
+
82
+ /**
83
+ * The children, or what stands in for them once one has failed.
84
+ * @returns The rendered tree.
85
+ */
86
+ override render(): ReactNode {
87
+ const { children, fallback, title } = this.props;
88
+ const { error } = this.state;
89
+
90
+ if (error === null) return children;
91
+ if (fallback !== undefined) return fallback(error, this.reset);
92
+ return <ErrorFallback error={error} title={title} onRetry={this.reset} />;
93
+ }
94
+ }
@@ -0,0 +1,64 @@
1
+ import { Button, NonIdealState } from '@blueprintjs/core';
2
+ import type { ReactElement } from 'react';
3
+
4
+ /** What the page shows in place of the part that failed. */
5
+ export interface ErrorFallbackProps {
6
+ /** What was thrown, whose message is what the visitor is told. */
7
+ error: Error;
8
+ /**
9
+ * Called when the visitor asks for another attempt. Left out when there is
10
+ * nothing sensible to retry, and then no button is drawn.
11
+ * @default undefined — no retry button
12
+ */
13
+ onRetry?: () => void;
14
+ /**
15
+ * First line, above the message.
16
+ * @default 'Something went wrong'
17
+ */
18
+ title?: string;
19
+ /**
20
+ * Text of the retry button.
21
+ * @default 'Try again'
22
+ */
23
+ retryLabel?: string;
24
+ /**
25
+ * Class the holder carries, so a site can reach it from its stylesheet.
26
+ * @default undefined
27
+ */
28
+ className?: string;
29
+ }
30
+
31
+ /**
32
+ * The default face of a failure: what happened, and a way out of it.
33
+ *
34
+ * The message is written out rather than swallowed, because a visitor who
35
+ * reports "it says nothing" cannot be helped, whereas one who reports the
36
+ * sentence can.
37
+ * @param props - See {@link ErrorFallbackProps}.
38
+ * @returns The non-ideal state.
39
+ */
40
+ export function ErrorFallback(props: ErrorFallbackProps): ReactElement {
41
+ const {
42
+ error,
43
+ onRetry,
44
+ title = 'Something went wrong',
45
+ retryLabel = 'Try again',
46
+ className,
47
+ } = props;
48
+
49
+ return (
50
+ <NonIdealState
51
+ className={className}
52
+ icon="error"
53
+ title={title}
54
+ description={
55
+ error.message === '' ? 'No message was given.' : error.message
56
+ }
57
+ action={
58
+ onRetry === undefined ? undefined : (
59
+ <Button icon="refresh" text={retryLabel} onClick={onRetry} />
60
+ )
61
+ }
62
+ />
63
+ );
64
+ }
@@ -0,0 +1,4 @@
1
+ export type { ErrorBoundaryProps } from './ErrorBoundary.tsx';
2
+ export { ErrorBoundary } from './ErrorBoundary.tsx';
3
+ export type { ErrorFallbackProps } from './ErrorFallback.tsx';
4
+ export { ErrorFallback } from './ErrorFallback.tsx';