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,11 @@
1
+ export type { NavItem } from './navItem.ts';
2
+ export type { NavLinkProps } from './NavLink.tsx';
3
+ export { NavLink } from './NavLink.tsx';
4
+ export type { NavMenuButtonProps } from './NavMenuButton.tsx';
5
+ export { NavMenuButton } from './NavMenuButton.tsx';
6
+ export type { SiteFooterProps } from './SiteFooter.tsx';
7
+ export { SiteFooter } from './SiteFooter.tsx';
8
+ export type { SiteHeaderProps } from './SiteHeader.tsx';
9
+ export { SiteHeader } from './SiteHeader.tsx';
10
+ export type { UseCompactHeaderOptions } from './useCompactHeader.ts';
11
+ export { useCompactHeader } from './useCompactHeader.ts';
@@ -0,0 +1,60 @@
1
+ import type { IconName } from '@blueprintjs/core';
2
+ import type { MouseEvent, ReactNode } from 'react';
3
+
4
+ /**
5
+ * One entry of a site's chrome: a page in the bar, a utility beside it, or a
6
+ * line of a header menu. It is a plain description, so the same array feeds the
7
+ * bar, the menu it overflows into, and a site's own renderer.
8
+ */
9
+ export interface NavItem {
10
+ /** What tells this entry apart, and what the active entry is named by. */
11
+ id: string;
12
+ /** What the entry reads. */
13
+ label: ReactNode;
14
+ /**
15
+ * The address the entry opens. Writing it keeps the entry a real link, so a
16
+ * crawler walks the site and a middle click opens a tab of its own, even when
17
+ * the plain click is taken over by `onSelect`.
18
+ * @default undefined
19
+ */
20
+ href?: string;
21
+ /**
22
+ * Glyph before the label, drawn at 14 px.
23
+ * @default undefined
24
+ */
25
+ icon?: IconName;
26
+ /**
27
+ * What the pointer is told, and what names the entry to a screen reader when
28
+ * the label is not text.
29
+ * @default undefined
30
+ */
31
+ title?: string;
32
+ /**
33
+ * Whether the address leaves the site, in which case it opens in a tab of its
34
+ * own.
35
+ * @default false
36
+ */
37
+ external?: boolean;
38
+ /**
39
+ * What the site does when the entry is picked. An entry that also carries an
40
+ * `href` takes over the plain click only — a modified one is left to the
41
+ * browser.
42
+ * @default undefined
43
+ */
44
+ onSelect?: () => void;
45
+ /**
46
+ * What follows the label: a count, a tag, anything the entry reports.
47
+ * @default undefined
48
+ */
49
+ after?: ReactNode;
50
+ }
51
+
52
+ /**
53
+ * Whether a click asked the browser for something other than following the link
54
+ * in place — a tab of its own, a window, a download.
55
+ * @param event - The click on the entry.
56
+ * @returns True when the browser is to be left alone.
57
+ */
58
+ export function isModifiedClick(event: MouseEvent): boolean {
59
+ return event.metaKey || event.ctrlKey || event.shiftKey || event.altKey;
60
+ }
@@ -0,0 +1,81 @@
1
+ import type { RefObject } from 'react';
2
+ import { useCallback, useSyncExternalStore } from 'react';
3
+
4
+ // Below this the bar has run out of room: the utilities keep their icons and
5
+ // give up their labels rather than pushing the pages off the edge.
6
+ const COMPACT_MAX_WIDTH = 1000;
7
+
8
+ export interface UseCompactHeaderOptions {
9
+ /**
10
+ * Width in pixels at or below which the bar counts as narrow.
11
+ * @default 1000
12
+ */
13
+ maxWidth?: number;
14
+ }
15
+
16
+ /**
17
+ * Whether the bar has run out of room, so its utilities should be reduced to
18
+ * their icons and its page list allowed to fold away.
19
+ *
20
+ * The bar is measured rather than the window whenever a reference to it is
21
+ * given, so a tool sitting beside a panel folds on its own width; with no
22
+ * reference, or before the first paint, the window is what is read.
23
+ * @param ref - The bar itself, usually the `app-header__inner` element.
24
+ * @param options - The width at which the bar counts as narrow.
25
+ * @returns True while the bar is too narrow to write every label.
26
+ */
27
+ export function useCompactHeader(
28
+ ref?: RefObject<HTMLElement | null>,
29
+ options: UseCompactHeaderOptions = {},
30
+ ): boolean {
31
+ const { maxWidth = COMPACT_MAX_WIDTH } = options;
32
+
33
+ const subscribe = useCallback(
34
+ (onChange: () => void) => watchWidth(ref?.current ?? null, onChange),
35
+ [ref],
36
+ );
37
+ const getSnapshot = useCallback(
38
+ () => isCompactBar(ref?.current ?? null, maxWidth),
39
+ [ref, maxWidth],
40
+ );
41
+
42
+ return useSyncExternalStore(subscribe, getSnapshot, notCompact);
43
+ }
44
+
45
+ /**
46
+ * Whether a bar of this width has run out of room. An element that has not been
47
+ * laid out yet, and a page with no window to measure, are both taken as roomy:
48
+ * a bar that flashes its icons before its labels is worse than one that never
49
+ * folds.
50
+ * @param element - The bar, when there is one to measure.
51
+ * @param maxWidth - Width at or below which it counts as narrow.
52
+ * @returns True when the bar is narrow.
53
+ */
54
+ export function isCompactBar(
55
+ element: HTMLElement | null,
56
+ maxWidth = COMPACT_MAX_WIDTH,
57
+ ): boolean {
58
+ const measured = element === null ? 0 : element.clientWidth;
59
+ const width = measured > 0 ? measured : globalThis.innerWidth;
60
+
61
+ if (!Number.isFinite(width) || width <= 0) return false;
62
+ return width <= maxWidth;
63
+ }
64
+
65
+ function watchWidth(
66
+ element: HTMLElement | null,
67
+ onChange: () => void,
68
+ ): () => void {
69
+ if (element !== null && typeof ResizeObserver === 'function') {
70
+ const observer = new ResizeObserver(onChange);
71
+ observer.observe(element);
72
+ return () => observer.disconnect();
73
+ }
74
+
75
+ globalThis.addEventListener('resize', onChange);
76
+ return () => globalThis.removeEventListener('resize', onChange);
77
+ }
78
+
79
+ function notCompact(): boolean {
80
+ return false;
81
+ }
@@ -1,32 +1,48 @@
1
1
  import type { CitationFormatId } from './formats.ts';
2
- import { formatCitation } from './formats.ts';
3
2
  import type { Reference } from './reference.ts';
4
3
  import type { CitationStyleId } from './segments.ts';
4
+ import { formatCitations } from './works.ts';
5
5
 
6
6
  /**
7
- * Put a reference on the clipboard. HTML goes on in both flavours, so a paste
8
- * into Word or Google Docs keeps the emphasis of the style while a plain text
9
- * editor still receives a readable line rather than the markup.
10
- * @param reference - Reference to copy.
11
- * @param format - Format to copy it in.
7
+ * Put every reference a site asks for on the clipboard, in one value. HTML goes
8
+ * on in both flavours, so a paste into Word or Google Docs keeps the emphasis of
9
+ * the style while a plain text editor still receives readable lines rather than
10
+ * the markup.
11
+ * @param references - References to copy, in reading order.
12
+ * @param format - Format to copy them in.
12
13
  * @param style - Journal style, for the formats that have one.
13
- * @returns Resolves once the clipboard holds the citation.
14
+ * @returns Resolves once the clipboard holds the citations.
14
15
  */
15
- export function copyCitation(
16
- reference: Reference,
16
+ export function copyCitations(
17
+ references: readonly Reference[],
17
18
  format: CitationFormatId,
18
19
  style?: CitationStyleId,
19
20
  ): Promise<void> {
20
- const value = formatCitation(reference, format, style);
21
+ const value = formatCitations(references, format, style);
21
22
  if (format !== 'html' || typeof ClipboardItem === 'undefined') {
22
23
  return navigator.clipboard.writeText(value);
23
24
  }
24
25
  return navigator.clipboard.write([
25
26
  new ClipboardItem({
26
27
  'text/html': new Blob([value], { type: 'text/html' }),
27
- 'text/plain': new Blob([formatCitation(reference, 'text', style)], {
28
+ 'text/plain': new Blob([formatCitations(references, 'text', style)], {
28
29
  type: 'text/plain',
29
30
  }),
30
31
  }),
31
32
  ]);
32
33
  }
34
+
35
+ /**
36
+ * Put one reference on the clipboard.
37
+ * @param reference - Reference to copy.
38
+ * @param format - Format to copy it in.
39
+ * @param style - Journal style, for the formats that have one.
40
+ * @returns Resolves once the clipboard holds the citation.
41
+ */
42
+ export function copyCitation(
43
+ reference: Reference,
44
+ format: CitationFormatId,
45
+ style?: CitationStyleId,
46
+ ): Promise<void> {
47
+ return copyCitations([reference], format, style);
48
+ }
@@ -1,11 +1,31 @@
1
+ import { downloadBlob } from '../../download/core/downloadBlob.ts';
2
+
1
3
  import type { CitationDownload } from './formats.ts';
2
- import { citationFilename, formatCitation } from './formats.ts';
3
4
  import type { Reference } from './reference.ts';
5
+ import { citationsFilename, formatCitations } from './works.ts';
6
+
7
+ /**
8
+ * Save every reference a site asks for as the one file a reference manager
9
+ * imports — both formats hold several entries, so a site asking for two works
10
+ * hands out one file with both. The MIME type is the one Zotero, Mendeley and
11
+ * EndNote recognise, so opening the saved file hands it to whichever of them is
12
+ * installed.
13
+ * @param references - References to save, in reading order.
14
+ * @param download - File to write, from `CITATION_DOWNLOADS`.
15
+ */
16
+ export function downloadCitations(
17
+ references: readonly Reference[],
18
+ download: CitationDownload,
19
+ ): void {
20
+ const content = formatCitations(references, download.format);
21
+ downloadBlob(
22
+ new Blob([content], { type: download.mimeType }),
23
+ citationsFilename(references, download.extension),
24
+ );
25
+ }
4
26
 
5
27
  /**
6
- * Save the reference as the file a reference manager imports. The MIME type
7
- * is the one Zotero, Mendeley and EndNote recognise, so opening the saved
8
- * file hands it to whichever of them is installed.
28
+ * Save one reference as the file a reference manager imports.
9
29
  * @param reference - Reference to save.
10
30
  * @param download - File to write, from `CITATION_DOWNLOADS`.
11
31
  */
@@ -13,15 +33,5 @@ export function downloadCitation(
13
33
  reference: Reference,
14
34
  download: CitationDownload,
15
35
  ): void {
16
- const content = formatCitation(reference, download.format);
17
- const url = URL.createObjectURL(
18
- new Blob([content], { type: download.mimeType }),
19
- );
20
- const anchor = document.createElement('a');
21
- anchor.href = url;
22
- anchor.download = citationFilename(reference, download.extension);
23
- document.body.append(anchor);
24
- anchor.click();
25
- anchor.remove();
26
- URL.revokeObjectURL(url);
36
+ downloadCitations([reference], download);
27
37
  }
@@ -1,5 +1,5 @@
1
- export { copyCitation } from './clipboard.ts';
2
- export { downloadCitation } from './download.ts';
1
+ export { copyCitation, copyCitations } from './clipboard.ts';
2
+ export { downloadCitation, downloadCitations } from './download.ts';
3
3
  export type {
4
4
  CitationDownload,
5
5
  CitationFormat,
@@ -14,10 +14,15 @@ export {
14
14
  } from './formats.ts';
15
15
  export type { Reference, ReferenceAuthor } from './reference.ts';
16
16
  export { doiUrl } from './reference.ts';
17
- export { renderHtml, renderMarkdown, renderText } from './render.ts';
18
17
  export type {
19
18
  CitationSegment,
20
19
  CitationStyle,
21
20
  CitationStyleId,
22
21
  } from './segments.ts';
23
22
  export { CITATION_STYLES, citationSegments } from './segments.ts';
23
+ export type { CitedWork } from './works.ts';
24
+ export {
25
+ citationsFilename,
26
+ citedReferences,
27
+ formatCitations,
28
+ } from './works.ts';
@@ -0,0 +1,81 @@
1
+ import type { CitationFormatId } from './formats.ts';
2
+ import { citationFilename, formatCitation } from './formats.ts';
3
+ import type { Reference } from './reference.ts';
4
+ import type { CitationStyleId } from './segments.ts';
5
+
6
+ /**
7
+ * One of the works a site asks to be cited, with the words that say which part
8
+ * of the site it covers: a reader handed two references has to be told what is
9
+ * what before they can pick one.
10
+ */
11
+ export interface CitedWork {
12
+ /** The bibliographic record. */
13
+ reference: Reference;
14
+ /** What the work is, in a few words, e.g. `The isomer generator`. */
15
+ what: string;
16
+ /**
17
+ * One sentence saying what citing it credits, read under `what`.
18
+ * @default undefined
19
+ */
20
+ note?: string;
21
+ }
22
+
23
+ /**
24
+ * What separates two citations written at once: a line for the formats that
25
+ * read as a list, a blank line for the ones whose entries are paragraphs.
26
+ */
27
+ const SEPARATORS: Record<CitationFormatId, string> = {
28
+ text: '\n',
29
+ html: '<br>',
30
+ markdown: '\n\n',
31
+ bibtex: '\n\n',
32
+ ris: '\n',
33
+ doi: '\n',
34
+ };
35
+
36
+ /** What the file holding several references is called, before its extension. */
37
+ const SET_FILENAME = 'references';
38
+
39
+ /**
40
+ * The references of a list of works, in the order the site names them.
41
+ * @param works - The works being cited.
42
+ * @returns Their bibliographic records.
43
+ */
44
+ export function citedReferences(works: readonly CitedWork[]): Reference[] {
45
+ return works.map((work) => work.reference);
46
+ }
47
+
48
+ /**
49
+ * Render several references in one of the citation formats, as the one value a
50
+ * paste or a saved file holds: an RIS or BibTeX file takes every entry, and a
51
+ * written citation takes one reference per line.
52
+ * @param references - References to render, in reading order.
53
+ * @param format - Format to render them in.
54
+ * @param style - Journal style, for the formats that have one.
55
+ * @returns The citations, ready to be copied to the clipboard or saved.
56
+ */
57
+ export function formatCitations(
58
+ references: readonly Reference[],
59
+ format: CitationFormatId,
60
+ style?: CitationStyleId,
61
+ ): string {
62
+ return references
63
+ .map((reference) => formatCitation(reference, format, style))
64
+ .join(SEPARATORS[format]);
65
+ }
66
+
67
+ /**
68
+ * Name the saved file carries: the author and the year of the work when there
69
+ * is one, and a plain `references` when the site asks for several.
70
+ * @param references - References the file holds.
71
+ * @param extension - Extension of the file, without its dot.
72
+ * @returns The file name.
73
+ */
74
+ export function citationsFilename(
75
+ references: readonly Reference[],
76
+ extension: string,
77
+ ): string {
78
+ const only = references.length === 1 ? references[0] : undefined;
79
+ if (only === undefined) return `${SET_FILENAME}.${extension}`;
80
+ return citationFilename(only, extension);
81
+ }
@@ -1,76 +1,76 @@
1
1
  import { Menu, MenuDivider, MenuItem } from '@blueprintjs/core';
2
2
  import { SvgLogoDoi } from 'cheminfo-font';
3
3
  import type { CSSProperties, ReactElement } from 'react';
4
- import { useEffect, useRef, useState } from 'react';
5
4
 
6
- import { copyCitation } from '../core/clipboard.ts';
7
- import type { CitationFormat } from '../core/formats.ts';
8
- import { CITATION_DOWNLOADS, CITATION_FORMATS } from '../core/formats.ts';
5
+ import { CITATION_DOWNLOADS } from '../core/formats.ts';
9
6
  import type { Reference } from '../core/reference.ts';
10
7
  import { doiUrl } from '../core/reference.ts';
11
- import type { CitationStyle } from '../core/segments.ts';
12
- import { CITATION_STYLES } from '../core/segments.ts';
8
+ import type { CitedWork } from '../core/works.ts';
9
+ import { citedReferences } from '../core/works.ts';
13
10
 
14
- import type { CopyState } from './entries.tsx';
15
- import { CopyEntry, DownloadEntry } from './entries.tsx';
16
-
17
- // How long the tick replaces the clipboard glyph of an entry after a copy.
18
- const FEEDBACK_MS = 1500;
11
+ import { CopyFormatEntries } from './CopyFormatEntries.tsx';
12
+ import { WorkEntry } from './WorkEntry.tsx';
13
+ import { DownloadEntry } from './entries.tsx';
14
+ import { useCopyFeedback } from './useCopyFeedback.ts';
19
15
 
20
16
  const MENU_STYLE: CSSProperties = { minWidth: 240 };
17
+ // A set names what each work covers, which needs the room a title does not.
18
+ const SET_MENU_STYLE: CSSProperties = { minWidth: 300 };
21
19
  const DOI_ICON_STYLE: CSSProperties = { width: 16, height: 16 };
22
20
 
23
- export interface CitationMenuProps {
21
+ /** What a site asks to be cited when it is one work. */
22
+ export interface CitedReferenceProps {
24
23
  /** The work being cited. */
25
24
  reference: Reference;
26
25
  }
27
26
 
27
+ /** What a site asks to be cited when it is built on several works. */
28
+ export interface CitedWorksProps {
29
+ /** The works being cited, in the order the site names them. */
30
+ works: readonly CitedWork[];
31
+ /**
32
+ * The line heading the menu, saying which of the works a reader is expected
33
+ * to cite.
34
+ * @default 'Please cite both works', or 'Please cite every work' past two
35
+ */
36
+ guidance?: string;
37
+ }
38
+
39
+ export type CitationMenuProps = CitedReferenceProps | CitedWorksProps;
40
+
28
41
  /**
29
42
  * What the Cite button opens: the article at its DOI, the reference copied in
30
- * the style a journal asks for, and the files a reference manager imports.
31
- * @param props - The work being cited.
43
+ * the style a journal asks for, and the files a reference manager imports. A
44
+ * site built on several works lists them all, each behind what citing it
45
+ * credits, and the copy and download entries then carry every reference at
46
+ * once.
47
+ * @param props - The work, or the works, being cited.
32
48
  * @returns The citation menu.
33
49
  */
34
50
  export function CitationMenu(props: CitationMenuProps): ReactElement {
35
- const { reference } = props;
36
- // Which entry showed feedback last, keyed `format` or `format:style`.
37
- const [copied, setCopied] = useState<string | null>(null);
38
- const [hasFailed, setHasFailed] = useState(false);
39
- const timeout = useRef<number | null>(null);
40
-
41
- useEffect(() => {
42
- return () => {
43
- if (timeout.current !== null) window.clearTimeout(timeout.current);
44
- };
45
- }, []);
46
-
47
- function announce(key: string, failed: boolean): void {
48
- setCopied(key);
49
- setHasFailed(failed);
50
- if (timeout.current !== null) window.clearTimeout(timeout.current);
51
- timeout.current = window.setTimeout(() => {
52
- setCopied(null);
53
- setHasFailed(false);
54
- }, FEEDBACK_MS);
55
- }
56
-
57
- function copy(format: CitationFormat, style?: CitationStyle): void {
58
- const key = style === undefined ? format.id : `${format.id}:${style.id}`;
59
- copyCitation(reference, format.id, style?.id).then(
60
- () => {
61
- announce(key, false);
62
- },
63
- () => {
64
- // A denied clipboard permission is the usual cause, and the menu is the
65
- // only place the user can be told about it.
66
- announce(key, true);
67
- },
68
- );
51
+ if ('works' in props) {
52
+ if (props.works.length > 1) {
53
+ return <WorkSetMenu works={props.works} guidance={props.guidance} />;
54
+ }
55
+ const first = props.works[0];
56
+ if (first === undefined) {
57
+ throw new Error('a citation menu needs at least one work to cite');
58
+ }
59
+ return <OneWorkMenu reference={first.reference} />;
69
60
  }
61
+ return <OneWorkMenu reference={props.reference} />;
62
+ }
70
63
 
71
- function stateOf(key: string): CopyState | null {
72
- return copied === key ? feedback(hasFailed) : null;
73
- }
64
+ /**
65
+ * The menu of a site asking for a single work: the article, then everything a
66
+ * reader does with its reference.
67
+ * @param props - The work being cited.
68
+ * @returns The menu.
69
+ */
70
+ function OneWorkMenu(props: CitedReferenceProps): ReactElement {
71
+ const { reference } = props;
72
+ const feedback = useCopyFeedback();
73
+ const references = [reference];
74
74
 
75
75
  return (
76
76
  <Menu className="citation-menu" style={MENU_STYLE}>
@@ -83,50 +83,65 @@ export function CitationMenu(props: CitationMenuProps): ReactElement {
83
83
  rel="noreferrer"
84
84
  />
85
85
  <MenuDivider title="Copy the reference as" />
86
- {CITATION_FORMATS.map((format) =>
87
- format.styled ? (
88
- <MenuItem
89
- key={format.id}
90
- icon="clipboard"
91
- text={format.label}
92
- label={format.hint}
93
- >
94
- {CITATION_STYLES.map((style) => (
95
- <CopyEntry
96
- key={style.id}
97
- reference={reference}
98
- format={format}
99
- style={style}
100
- state={stateOf(`${format.id}:${style.id}`)}
101
- onCopy={copy}
102
- />
103
- ))}
104
- </MenuItem>
105
- ) : (
106
- <CopyEntry
107
- key={format.id}
108
- reference={reference}
109
- format={format}
110
- state={stateOf(format.id)}
111
- onCopy={copy}
112
- />
113
- ),
114
- )}
86
+ <CopyFormatEntries references={references} feedback={feedback} />
87
+ <ImportSection references={references} />
88
+ </Menu>
89
+ );
90
+ }
91
+
92
+ /**
93
+ * The menu of a site asking for several works: what each one covers, then the
94
+ * whole set copied or saved at once.
95
+ * @param props - The works being cited, and the line heading them.
96
+ * @returns The menu.
97
+ */
98
+ function WorkSetMenu(props: CitedWorksProps): ReactElement {
99
+ const { works, guidance } = props;
100
+ const feedback = useCopyFeedback();
101
+ const references = citedReferences(works);
102
+ const both = works.length === 2;
103
+
104
+ return (
105
+ <Menu className="citation-menu" style={SET_MENU_STYLE}>
106
+ <MenuDivider
107
+ title={
108
+ guidance ??
109
+ (both ? 'Please cite both works' : 'Please cite every work')
110
+ }
111
+ />
112
+ {works.map((work) => (
113
+ <WorkEntry key={work.reference.doi} work={work} feedback={feedback} />
114
+ ))}
115
+ <MenuDivider
116
+ title={both ? 'Copy both references as' : 'Copy every reference as'}
117
+ />
118
+ <CopyFormatEntries references={references} feedback={feedback} />
119
+ <ImportSection references={references} />
120
+ </Menu>
121
+ );
122
+ }
123
+
124
+ /**
125
+ * The files a reference manager imports, holding every reference the menu is
126
+ * about.
127
+ * @param props - The references saved by the entries.
128
+ * @param props.references - The works being saved.
129
+ * @returns The last section of the menu.
130
+ */
131
+ function ImportSection(props: {
132
+ references: readonly Reference[];
133
+ }): ReactElement {
134
+ const { references } = props;
135
+ return (
136
+ <>
115
137
  <MenuDivider title="Import into a reference manager" />
116
138
  {CITATION_DOWNLOADS.map((download) => (
117
139
  <DownloadEntry
118
140
  key={download.format}
119
- reference={reference}
141
+ references={references}
120
142
  download={download}
121
143
  />
122
144
  ))}
123
- </Menu>
145
+ </>
124
146
  );
125
147
  }
126
-
127
- function feedback(failed: boolean): CopyState {
128
- if (failed) {
129
- return { icon: 'cross', intent: 'danger', label: 'copy failed' };
130
- }
131
- return { icon: 'tick', intent: 'success', label: 'copied' };
132
- }
@@ -1,10 +1,10 @@
1
1
  import type { CSSProperties, ReactElement } from 'react';
2
2
 
3
3
  import type { CitationFormatId } from '../core/formats.ts';
4
- import { formatCitation } from '../core/formats.ts';
5
4
  import type { Reference } from '../core/reference.ts';
6
5
  import type { CitationStyleId } from '../core/segments.ts';
7
6
  import { citationSegments } from '../core/segments.ts';
7
+ import { formatCitations } from '../core/works.ts';
8
8
 
9
9
  // A BibTeX entry and a one-line citation share this box, so the text wraps and
10
10
  // the box never grows past what a tooltip can hold. The height is the last
@@ -28,10 +28,13 @@ const RICH_STYLE: CSSProperties = {
28
28
  fontSize: 12,
29
29
  lineHeight: 1.45,
30
30
  };
31
+ // Two references pasted as HTML read as two lines, and preview as two.
32
+ const RICH_LINE_STYLE: CSSProperties = { marginTop: 6 };
31
33
  const LINK_STYLE: CSSProperties = { color: '#8abbff' };
32
34
 
33
35
  export interface CitationPreviewProps {
34
- reference: Reference;
36
+ /** The work, or the works, whose citation is previewed. */
37
+ reference: Reference | readonly Reference[];
35
38
  format: CitationFormatId;
36
39
  /** Journal style, for the formats that have one. */
37
40
  style?: CitationStyleId;
@@ -39,20 +42,27 @@ export interface CitationPreviewProps {
39
42
 
40
43
  /**
41
44
  * What a copy of the reference puts on the clipboard, as it will read once
42
- * pasted: the emphasis of the style for HTML, the source itself otherwise.
45
+ * pasted: the emphasis of the style for HTML, the source itself otherwise. A
46
+ * site asking for several works previews every one of them, in the order it
47
+ * names them.
43
48
  * @param props - Reference, format and style to preview.
44
49
  * @returns The body of the preview tooltip.
45
50
  */
46
51
  export function CitationPreview(props: CitationPreviewProps): ReactElement {
47
52
  const { reference, format, style } = props;
53
+ const references = Array.isArray(reference) ? reference : [reference];
48
54
 
49
55
  if (format === 'html' && style !== undefined) {
50
56
  return (
51
57
  <div className="citation-preview" style={RICH_STYLE}>
52
- {citationSegments(reference, style).map((segment, index) => (
53
- // The segments of one citation are a fixed list, never reordered.
54
- // eslint-disable-next-line react/no-array-index-key
55
- <Segment key={index} segment={segment} />
58
+ {references.map((one, line) => (
59
+ <div key={one.doi} style={line === 0 ? undefined : RICH_LINE_STYLE}>
60
+ {citationSegments(one, style).map((segment, index) => (
61
+ // The segments of one citation are a fixed list, never reordered.
62
+ // eslint-disable-next-line react/no-array-index-key
63
+ <Segment key={index} segment={segment} />
64
+ ))}
65
+ </div>
56
66
  ))}
57
67
  </div>
58
68
  );
@@ -60,7 +70,7 @@ export function CitationPreview(props: CitationPreviewProps): ReactElement {
60
70
 
61
71
  return (
62
72
  <pre className="citation-preview" style={PREVIEW_STYLE}>
63
- {formatCitation(reference, format, style)}
73
+ {formatCitations(references, format, style)}
64
74
  </pre>
65
75
  );
66
76
  }