react-cheminfo 0.2.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 (882) hide show
  1. package/README.md +139 -10
  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 +12 -0
  134. package/lib/core.d.ts.map +1 -1
  135. package/lib/core.js +12 -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 +3 -1
  226. package/lib/ecosystem/core/sites.d.ts.map +1 -1
  227. package/lib/ecosystem/core/sites.js +33 -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/glyphs.d.ts +16 -0
  242. package/lib/ecosystem/ui/glyphs.d.ts.map +1 -0
  243. package/lib/ecosystem/ui/glyphs.js +41 -0
  244. package/lib/ecosystem/ui/glyphs.js.map +1 -0
  245. package/lib/ecosystem/ui/index.d.ts +4 -0
  246. package/lib/ecosystem/ui/index.d.ts.map +1 -1
  247. package/lib/ecosystem/ui/index.js +2 -0
  248. package/lib/ecosystem/ui/index.js.map +1 -1
  249. package/lib/ecosystem/ui/marks.d.ts +30 -4
  250. package/lib/ecosystem/ui/marks.d.ts.map +1 -1
  251. package/lib/ecosystem/ui/marks.js +15 -36
  252. package/lib/ecosystem/ui/marks.js.map +1 -1
  253. package/lib/error/ui/ErrorBoundary.d.ts +60 -0
  254. package/lib/error/ui/ErrorBoundary.d.ts.map +1 -0
  255. package/lib/error/ui/ErrorBoundary.js +59 -0
  256. package/lib/error/ui/ErrorBoundary.js.map +1 -0
  257. package/lib/error/ui/ErrorFallback.d.ts +38 -0
  258. package/lib/error/ui/ErrorFallback.d.ts.map +1 -0
  259. package/lib/error/ui/ErrorFallback.js +16 -0
  260. package/lib/error/ui/ErrorFallback.js.map +1 -0
  261. package/lib/error/ui/index.d.ts +5 -0
  262. package/lib/error/ui/index.d.ts.map +1 -0
  263. package/lib/error/ui/index.js +3 -0
  264. package/lib/error/ui/index.js.map +1 -0
  265. package/lib/error/ui/toError.d.ts +11 -0
  266. package/lib/error/ui/toError.d.ts.map +1 -0
  267. package/lib/error/ui/toError.js +35 -0
  268. package/lib/error/ui/toError.js.map +1 -0
  269. package/lib/format/core/index.d.ts +5 -0
  270. package/lib/format/core/index.d.ts.map +1 -0
  271. package/lib/format/core/index.js +5 -0
  272. package/lib/format/core/index.js.map +1 -0
  273. package/lib/format/core/missing.d.ts +7 -0
  274. package/lib/format/core/missing.d.ts.map +1 -0
  275. package/lib/format/core/missing.js +7 -0
  276. package/lib/format/core/missing.js.map +1 -0
  277. package/lib/format/core/numbers.d.ts +40 -0
  278. package/lib/format/core/numbers.d.ts.map +1 -0
  279. package/lib/format/core/numbers.js +81 -0
  280. package/lib/format/core/numbers.js.map +1 -0
  281. package/lib/format/core/units.d.ts +17 -0
  282. package/lib/format/core/units.d.ts.map +1 -0
  283. package/lib/format/core/units.js +54 -0
  284. package/lib/format/core/units.js.map +1 -0
  285. package/lib/format/core/words.d.ts +12 -0
  286. package/lib/format/core/words.d.ts.map +1 -0
  287. package/lib/format/core/words.js +14 -0
  288. package/lib/format/core/words.js.map +1 -0
  289. package/lib/help/ui/HelpBody.d.ts +57 -0
  290. package/lib/help/ui/HelpBody.d.ts.map +1 -0
  291. package/lib/help/ui/HelpBody.js +44 -0
  292. package/lib/help/ui/HelpBody.js.map +1 -0
  293. package/lib/help/ui/HelpIcon.d.ts +33 -0
  294. package/lib/help/ui/HelpIcon.d.ts.map +1 -0
  295. package/lib/help/ui/HelpIcon.js +16 -0
  296. package/lib/help/ui/HelpIcon.js.map +1 -0
  297. package/lib/help/ui/HelpToolbarButton.d.ts +45 -0
  298. package/lib/help/ui/HelpToolbarButton.d.ts.map +1 -0
  299. package/lib/help/ui/HelpToolbarButton.js +17 -0
  300. package/lib/help/ui/HelpToolbarButton.js.map +1 -0
  301. package/lib/help/ui/HelpTooltip.d.ts +36 -0
  302. package/lib/help/ui/HelpTooltip.d.ts.map +1 -0
  303. package/lib/help/ui/HelpTooltip.js +24 -0
  304. package/lib/help/ui/HelpTooltip.js.map +1 -0
  305. package/lib/help/ui/index.d.ts +9 -0
  306. package/lib/help/ui/index.d.ts.map +1 -0
  307. package/lib/help/ui/index.js +5 -0
  308. package/lib/help/ui/index.js.map +1 -0
  309. package/lib/hooks/ui/index.d.ts +7 -0
  310. package/lib/hooks/ui/index.d.ts.map +1 -0
  311. package/lib/hooks/ui/index.js +5 -0
  312. package/lib/hooks/ui/index.js.map +1 -0
  313. package/lib/hooks/ui/listNavigation.d.ts +54 -0
  314. package/lib/hooks/ui/listNavigation.d.ts.map +1 -0
  315. package/lib/hooks/ui/listNavigation.js +77 -0
  316. package/lib/hooks/ui/listNavigation.js.map +1 -0
  317. package/lib/hooks/ui/useContainerSize.d.ts +15 -0
  318. package/lib/hooks/ui/useContainerSize.d.ts.map +1 -0
  319. package/lib/hooks/ui/useContainerSize.js +24 -0
  320. package/lib/hooks/ui/useContainerSize.js.map +1 -0
  321. package/lib/hooks/ui/useDebouncedValue.d.ts +12 -0
  322. package/lib/hooks/ui/useDebouncedValue.d.ts.map +1 -0
  323. package/lib/hooks/ui/useDebouncedValue.js +24 -0
  324. package/lib/hooks/ui/useDebouncedValue.js.map +1 -0
  325. package/lib/hooks/ui/useListKeyboardNavigation.d.ts +17 -0
  326. package/lib/hooks/ui/useListKeyboardNavigation.d.ts.map +1 -0
  327. package/lib/hooks/ui/useListKeyboardNavigation.js +25 -0
  328. package/lib/hooks/ui/useListKeyboardNavigation.js.map +1 -0
  329. package/lib/hooks/ui/useResizeObserver.d.ts +20 -0
  330. package/lib/hooks/ui/useResizeObserver.d.ts.map +1 -0
  331. package/lib/hooks/ui/useResizeObserver.js +37 -0
  332. package/lib/hooks/ui/useResizeObserver.js.map +1 -0
  333. package/lib/orbital/core/atomicGrid.d.ts +85 -0
  334. package/lib/orbital/core/atomicGrid.d.ts.map +1 -0
  335. package/lib/orbital/core/atomicGrid.js +105 -0
  336. package/lib/orbital/core/atomicGrid.js.map +1 -0
  337. package/lib/orbital/core/atomicOrbitals.d.ts +97 -0
  338. package/lib/orbital/core/atomicOrbitals.d.ts.map +1 -0
  339. package/lib/orbital/core/atomicOrbitals.js +135 -0
  340. package/lib/orbital/core/atomicOrbitals.js.map +1 -0
  341. package/lib/orbital/core/constants.d.ts +33 -0
  342. package/lib/orbital/core/constants.d.ts.map +1 -0
  343. package/lib/orbital/core/constants.js +21 -0
  344. package/lib/orbital/core/constants.js.map +1 -0
  345. package/lib/orbital/core/electronConfiguration.d.ts +106 -0
  346. package/lib/orbital/core/electronConfiguration.d.ts.map +1 -0
  347. package/lib/orbital/core/electronConfiguration.js +207 -0
  348. package/lib/orbital/core/electronConfiguration.js.map +1 -0
  349. package/lib/orbital/core/grid.d.ts +60 -0
  350. package/lib/orbital/core/grid.d.ts.map +1 -0
  351. package/lib/orbital/core/grid.js +81 -0
  352. package/lib/orbital/core/grid.js.map +1 -0
  353. package/lib/orbital/core/hydrogenic.d.ts +99 -0
  354. package/lib/orbital/core/hydrogenic.d.ts.map +1 -0
  355. package/lib/orbital/core/hydrogenic.js +181 -0
  356. package/lib/orbital/core/hydrogenic.js.map +1 -0
  357. package/lib/orbital/core/index.d.ts +24 -0
  358. package/lib/orbital/core/index.d.ts.map +1 -0
  359. package/lib/orbital/core/index.js +13 -0
  360. package/lib/orbital/core/index.js.map +1 -0
  361. package/lib/orbital/core/isovalue.d.ts +60 -0
  362. package/lib/orbital/core/isovalue.d.ts.map +1 -0
  363. package/lib/orbital/core/isovalue.js +128 -0
  364. package/lib/orbital/core/isovalue.js.map +1 -0
  365. package/lib/orbital/core/numerics.d.ts +39 -0
  366. package/lib/orbital/core/numerics.d.ts.map +1 -0
  367. package/lib/orbital/core/numerics.js +75 -0
  368. package/lib/orbital/core/numerics.js.map +1 -0
  369. package/lib/orbital/core/occupancy.d.ts +44 -0
  370. package/lib/orbital/core/occupancy.d.ts.map +1 -0
  371. package/lib/orbital/core/occupancy.js +85 -0
  372. package/lib/orbital/core/occupancy.js.map +1 -0
  373. package/lib/orbital/core/palette.d.ts +36 -0
  374. package/lib/orbital/core/palette.d.ts.map +1 -0
  375. package/lib/orbital/core/palette.js +37 -0
  376. package/lib/orbital/core/palette.js.map +1 -0
  377. package/lib/orbital/core/realHarmonics.d.ts +57 -0
  378. package/lib/orbital/core/realHarmonics.d.ts.map +1 -0
  379. package/lib/orbital/core/realHarmonics.js +144 -0
  380. package/lib/orbital/core/realHarmonics.js.map +1 -0
  381. package/lib/orbital/core/sample.d.ts +66 -0
  382. package/lib/orbital/core/sample.d.ts.map +1 -0
  383. package/lib/orbital/core/sample.js +61 -0
  384. package/lib/orbital/core/sample.js.map +1 -0
  385. package/lib/orbital/core/screening.d.ts +46 -0
  386. package/lib/orbital/core/screening.d.ts.map +1 -0
  387. package/lib/orbital/core/screening.js +72 -0
  388. package/lib/orbital/core/screening.js.map +1 -0
  389. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +62 -0
  390. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -0
  391. package/lib/orbital/ui/AtomicOrbitalCanvas.js +115 -0
  392. package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -0
  393. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +77 -0
  394. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -0
  395. package/lib/orbital/ui/AtomicOrbitalViewer.js +49 -0
  396. package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -0
  397. package/lib/orbital/ui/camera.d.ts +36 -0
  398. package/lib/orbital/ui/camera.d.ts.map +1 -0
  399. package/lib/orbital/ui/camera.js +98 -0
  400. package/lib/orbital/ui/camera.js.map +1 -0
  401. package/lib/orbital/ui/capability.d.ts +28 -0
  402. package/lib/orbital/ui/capability.d.ts.map +1 -0
  403. package/lib/orbital/ui/capability.js +77 -0
  404. package/lib/orbital/ui/capability.js.map +1 -0
  405. package/lib/orbital/ui/index.d.ts +17 -0
  406. package/lib/orbital/ui/index.d.ts.map +1 -0
  407. package/lib/orbital/ui/index.js +13 -0
  408. package/lib/orbital/ui/index.js.map +1 -0
  409. package/lib/orbital/ui/renderVolume.d.ts +60 -0
  410. package/lib/orbital/ui/renderVolume.d.ts.map +1 -0
  411. package/lib/orbital/ui/renderVolume.js +119 -0
  412. package/lib/orbital/ui/renderVolume.js.map +1 -0
  413. package/lib/orbital/ui/viewer.d.ts +88 -0
  414. package/lib/orbital/ui/viewer.d.ts.map +1 -0
  415. package/lib/orbital/ui/viewer.js +156 -0
  416. package/lib/orbital/ui/viewer.js.map +1 -0
  417. package/lib/orbital/ui/volumeField.d.ts +33 -0
  418. package/lib/orbital/ui/volumeField.d.ts.map +1 -0
  419. package/lib/orbital/ui/volumeField.js +68 -0
  420. package/lib/orbital/ui/volumeField.js.map +1 -0
  421. package/lib/orbital.d.ts +11 -0
  422. package/lib/orbital.d.ts.map +1 -0
  423. package/lib/orbital.js +11 -0
  424. package/lib/orbital.js.map +1 -0
  425. package/lib/pedagogy/core/glossary.d.ts +79 -0
  426. package/lib/pedagogy/core/glossary.d.ts.map +1 -0
  427. package/lib/pedagogy/core/glossary.js +71 -0
  428. package/lib/pedagogy/core/glossary.js.map +1 -0
  429. package/lib/pedagogy/core/index.d.ts +8 -0
  430. package/lib/pedagogy/core/index.d.ts.map +1 -0
  431. package/lib/pedagogy/core/index.js +4 -0
  432. package/lib/pedagogy/core/index.js.map +1 -0
  433. package/lib/pedagogy/core/jsonStorage.d.ts +21 -0
  434. package/lib/pedagogy/core/jsonStorage.d.ts.map +1 -0
  435. package/lib/pedagogy/core/jsonStorage.js +55 -0
  436. package/lib/pedagogy/core/jsonStorage.js.map +1 -0
  437. package/lib/pedagogy/core/progress.d.ts +116 -0
  438. package/lib/pedagogy/core/progress.d.ts.map +1 -0
  439. package/lib/pedagogy/core/progress.js +122 -0
  440. package/lib/pedagogy/core/progress.js.map +1 -0
  441. package/lib/pedagogy/core/types.d.ts +74 -0
  442. package/lib/pedagogy/core/types.d.ts.map +1 -0
  443. package/lib/pedagogy/core/types.js +8 -0
  444. package/lib/pedagogy/core/types.js.map +1 -0
  445. package/lib/pedagogy/core/validation.d.ts +79 -0
  446. package/lib/pedagogy/core/validation.d.ts.map +1 -0
  447. package/lib/pedagogy/core/validation.js +47 -0
  448. package/lib/pedagogy/core/validation.js.map +1 -0
  449. package/lib/pedagogy/ui/ExerciseActions.d.ts +74 -0
  450. package/lib/pedagogy/ui/ExerciseActions.d.ts.map +1 -0
  451. package/lib/pedagogy/ui/ExerciseActions.js +22 -0
  452. package/lib/pedagogy/ui/ExerciseActions.js.map +1 -0
  453. package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts +43 -0
  454. package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts.map +1 -0
  455. package/lib/pedagogy/ui/ExerciseProgressHeader.js +43 -0
  456. package/lib/pedagogy/ui/ExerciseProgressHeader.js.map +1 -0
  457. package/lib/pedagogy/ui/ExerciseTags.d.ts +49 -0
  458. package/lib/pedagogy/ui/ExerciseTags.d.ts.map +1 -0
  459. package/lib/pedagogy/ui/ExerciseTags.js +22 -0
  460. package/lib/pedagogy/ui/ExerciseTags.js.map +1 -0
  461. package/lib/pedagogy/ui/GlossaryProvider.d.ts +19 -0
  462. package/lib/pedagogy/ui/GlossaryProvider.d.ts.map +1 -0
  463. package/lib/pedagogy/ui/GlossaryProvider.js +16 -0
  464. package/lib/pedagogy/ui/GlossaryProvider.js.map +1 -0
  465. package/lib/pedagogy/ui/GlossaryText.d.ts +50 -0
  466. package/lib/pedagogy/ui/GlossaryText.d.ts.map +1 -0
  467. package/lib/pedagogy/ui/GlossaryText.js +79 -0
  468. package/lib/pedagogy/ui/GlossaryText.js.map +1 -0
  469. package/lib/pedagogy/ui/HintLadder.d.ts +38 -0
  470. package/lib/pedagogy/ui/HintLadder.d.ts.map +1 -0
  471. package/lib/pedagogy/ui/HintLadder.js +33 -0
  472. package/lib/pedagogy/ui/HintLadder.js.map +1 -0
  473. package/lib/pedagogy/ui/ReferenceGrid.d.ts +31 -0
  474. package/lib/pedagogy/ui/ReferenceGrid.d.ts.map +1 -0
  475. package/lib/pedagogy/ui/ReferenceGrid.js +25 -0
  476. package/lib/pedagogy/ui/ReferenceGrid.js.map +1 -0
  477. package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts +64 -0
  478. package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts.map +1 -0
  479. package/lib/pedagogy/ui/ReferenceSectionBlock.js +78 -0
  480. package/lib/pedagogy/ui/ReferenceSectionBlock.js.map +1 -0
  481. package/lib/pedagogy/ui/SyntaxTooltip.d.ts +94 -0
  482. package/lib/pedagogy/ui/SyntaxTooltip.d.ts.map +1 -0
  483. package/lib/pedagogy/ui/SyntaxTooltip.js +79 -0
  484. package/lib/pedagogy/ui/SyntaxTooltip.js.map +1 -0
  485. package/lib/pedagogy/ui/TestCaseList.d.ts +35 -0
  486. package/lib/pedagogy/ui/TestCaseList.d.ts.map +1 -0
  487. package/lib/pedagogy/ui/TestCaseList.js +63 -0
  488. package/lib/pedagogy/ui/TestCaseList.js.map +1 -0
  489. package/lib/pedagogy/ui/TutorialStepStrip.d.ts +42 -0
  490. package/lib/pedagogy/ui/TutorialStepStrip.d.ts.map +1 -0
  491. package/lib/pedagogy/ui/TutorialStepStrip.js +98 -0
  492. package/lib/pedagogy/ui/TutorialStepStrip.js.map +1 -0
  493. package/lib/pedagogy/ui/exerciseMeta.d.ts +24 -0
  494. package/lib/pedagogy/ui/exerciseMeta.d.ts.map +1 -0
  495. package/lib/pedagogy/ui/exerciseMeta.js +38 -0
  496. package/lib/pedagogy/ui/exerciseMeta.js.map +1 -0
  497. package/lib/pedagogy/ui/glossaryContext.d.ts +17 -0
  498. package/lib/pedagogy/ui/glossaryContext.d.ts.map +1 -0
  499. package/lib/pedagogy/ui/glossaryContext.js +19 -0
  500. package/lib/pedagogy/ui/glossaryContext.js.map +1 -0
  501. package/lib/pedagogy/ui/index.d.ts +27 -0
  502. package/lib/pedagogy/ui/index.d.ts.map +1 -0
  503. package/lib/pedagogy/ui/index.js +15 -0
  504. package/lib/pedagogy/ui/index.js.map +1 -0
  505. package/lib/pedagogy/ui/tutorialLevels.d.ts +18 -0
  506. package/lib/pedagogy/ui/tutorialLevels.d.ts.map +1 -0
  507. package/lib/pedagogy/ui/tutorialLevels.js +14 -0
  508. package/lib/pedagogy/ui/tutorialLevels.js.map +1 -0
  509. package/lib/router/core/address.d.ts +42 -0
  510. package/lib/router/core/address.d.ts.map +1 -0
  511. package/lib/router/core/address.js +64 -0
  512. package/lib/router/core/address.js.map +1 -0
  513. package/lib/router/core/basePath.d.ts +49 -0
  514. package/lib/router/core/basePath.d.ts.map +1 -0
  515. package/lib/router/core/basePath.js +78 -0
  516. package/lib/router/core/basePath.js.map +1 -0
  517. package/lib/router/core/index.d.ts +8 -0
  518. package/lib/router/core/index.d.ts.map +1 -0
  519. package/lib/router/core/index.js +5 -0
  520. package/lib/router/core/index.js.map +1 -0
  521. package/lib/router/core/legacyHash.d.ts +45 -0
  522. package/lib/router/core/legacyHash.d.ts.map +1 -0
  523. package/lib/router/core/legacyHash.js +50 -0
  524. package/lib/router/core/legacyHash.js.map +1 -0
  525. package/lib/router/core/pageAddresses.d.ts +50 -0
  526. package/lib/router/core/pageAddresses.d.ts.map +1 -0
  527. package/lib/router/core/pageAddresses.js +56 -0
  528. package/lib/router/core/pageAddresses.js.map +1 -0
  529. package/lib/router/core/query.d.ts +41 -0
  530. package/lib/router/core/query.d.ts.map +1 -0
  531. package/lib/router/core/query.js +64 -0
  532. package/lib/router/core/query.js.map +1 -0
  533. package/lib/router/core/tabRouter.d.ts +111 -0
  534. package/lib/router/core/tabRouter.d.ts.map +1 -0
  535. package/lib/router/core/tabRouter.js +87 -0
  536. package/lib/router/core/tabRouter.js.map +1 -0
  537. package/lib/seo/core/documentMeta.d.ts +45 -0
  538. package/lib/seo/core/documentMeta.d.ts.map +1 -0
  539. package/lib/seo/core/documentMeta.js +69 -0
  540. package/lib/seo/core/documentMeta.js.map +1 -0
  541. package/lib/seo/core/index.d.ts +3 -0
  542. package/lib/seo/core/index.d.ts.map +1 -0
  543. package/lib/seo/core/index.js +2 -0
  544. package/lib/seo/core/index.js.map +1 -0
  545. package/lib/share/core/config.d.ts +63 -0
  546. package/lib/share/core/config.d.ts.map +1 -0
  547. package/lib/share/core/config.js +125 -0
  548. package/lib/share/core/config.js.map +1 -0
  549. package/lib/share/core/escape.d.ts +15 -0
  550. package/lib/share/core/escape.d.ts.map +1 -0
  551. package/lib/share/core/escape.js +22 -0
  552. package/lib/share/core/escape.js.map +1 -0
  553. package/lib/share/core/index.d.ts +9 -0
  554. package/lib/share/core/index.d.ts.map +1 -0
  555. package/lib/share/core/index.js +5 -0
  556. package/lib/share/core/index.js.map +1 -0
  557. package/lib/share/core/params.d.ts +93 -0
  558. package/lib/share/core/params.d.ts.map +1 -0
  559. package/lib/share/core/params.js +111 -0
  560. package/lib/share/core/params.js.map +1 -0
  561. package/lib/share/core/query.d.ts +30 -0
  562. package/lib/share/core/query.d.ts.map +1 -0
  563. package/lib/share/core/query.js +68 -0
  564. package/lib/share/core/query.js.map +1 -0
  565. package/lib/share/core/url.d.ts +57 -0
  566. package/lib/share/core/url.d.ts.map +1 -0
  567. package/lib/share/core/url.js +49 -0
  568. package/lib/share/core/url.js.map +1 -0
  569. package/lib/share/core/vocabulary.d.ts +51 -0
  570. package/lib/share/core/vocabulary.d.ts.map +1 -0
  571. package/lib/share/core/vocabulary.js +2 -0
  572. package/lib/share/core/vocabulary.js.map +1 -0
  573. package/lib/share/ui/HiddenPartsProvider.d.ts +19 -0
  574. package/lib/share/ui/HiddenPartsProvider.d.ts.map +1 -0
  575. package/lib/share/ui/HiddenPartsProvider.js +15 -0
  576. package/lib/share/ui/HiddenPartsProvider.js.map +1 -0
  577. package/lib/share/ui/PagePart.d.ts +18 -0
  578. package/lib/share/ui/PagePart.d.ts.map +1 -0
  579. package/lib/share/ui/PagePart.js +16 -0
  580. package/lib/share/ui/PagePart.js.map +1 -0
  581. package/lib/share/ui/ShareButton.d.ts +42 -0
  582. package/lib/share/ui/ShareButton.d.ts.map +1 -0
  583. package/lib/share/ui/ShareButton.js +18 -0
  584. package/lib/share/ui/ShareButton.js.map +1 -0
  585. package/lib/share/ui/ShareDialog.d.ts +73 -0
  586. package/lib/share/ui/ShareDialog.d.ts.map +1 -0
  587. package/lib/share/ui/ShareDialog.js +19 -0
  588. package/lib/share/ui/ShareDialog.js.map +1 -0
  589. package/lib/share/ui/ShareDialogContent.d.ts +13 -0
  590. package/lib/share/ui/ShareDialogContent.d.ts.map +1 -0
  591. package/lib/share/ui/ShareDialogContent.js +71 -0
  592. package/lib/share/ui/ShareDialogContent.js.map +1 -0
  593. package/lib/share/ui/SharePartOptions.d.ts +18 -0
  594. package/lib/share/ui/SharePartOptions.d.ts.map +1 -0
  595. package/lib/share/ui/SharePartOptions.js +22 -0
  596. package/lib/share/ui/SharePartOptions.js.map +1 -0
  597. package/lib/share/ui/draft.d.ts +13 -0
  598. package/lib/share/ui/draft.d.ts.map +1 -0
  599. package/lib/share/ui/draft.js +16 -0
  600. package/lib/share/ui/draft.js.map +1 -0
  601. package/lib/share/ui/hiddenParts.d.ts +17 -0
  602. package/lib/share/ui/hiddenParts.d.ts.map +1 -0
  603. package/lib/share/ui/hiddenParts.js +21 -0
  604. package/lib/share/ui/hiddenParts.js.map +1 -0
  605. package/lib/share/ui/index.d.ts +10 -0
  606. package/lib/share/ui/index.d.ts.map +1 -0
  607. package/lib/share/ui/index.js +6 -0
  608. package/lib/share/ui/index.js.map +1 -0
  609. package/lib/shared/ui/index.d.ts +2 -1
  610. package/lib/shared/ui/index.d.ts.map +1 -1
  611. package/lib/shared/ui/index.js +1 -1
  612. package/lib/shared/ui/index.js.map +1 -1
  613. package/lib/state/ui/index.d.ts +3 -0
  614. package/lib/state/ui/index.d.ts.map +1 -0
  615. package/lib/state/ui/index.js +2 -0
  616. package/lib/state/ui/index.js.map +1 -0
  617. package/lib/state/ui/mergeStored.d.ts +27 -0
  618. package/lib/state/ui/mergeStored.d.ts.map +1 -0
  619. package/lib/state/ui/mergeStored.js +82 -0
  620. package/lib/state/ui/mergeStored.js.map +1 -0
  621. package/lib/state/ui/persistBucket.d.ts +65 -0
  622. package/lib/state/ui/persistBucket.d.ts.map +1 -0
  623. package/lib/state/ui/persistBucket.js +90 -0
  624. package/lib/state/ui/persistBucket.js.map +1 -0
  625. package/lib/structure/core/editorValue.d.ts +69 -0
  626. package/lib/structure/core/editorValue.d.ts.map +1 -0
  627. package/lib/structure/core/editorValue.js +72 -0
  628. package/lib/structure/core/editorValue.js.map +1 -0
  629. package/lib/structure/core/fragmentQuery.d.ts +33 -0
  630. package/lib/structure/core/fragmentQuery.d.ts.map +1 -0
  631. package/lib/structure/core/fragmentQuery.js +37 -0
  632. package/lib/structure/core/fragmentQuery.js.map +1 -0
  633. package/lib/structure/core/index.d.ts +11 -0
  634. package/lib/structure/core/index.d.ts.map +1 -0
  635. package/lib/structure/core/index.js +6 -0
  636. package/lib/structure/core/index.js.map +1 -0
  637. package/lib/structure/core/molfile.d.ts +42 -0
  638. package/lib/structure/core/molfile.d.ts.map +1 -0
  639. package/lib/structure/core/molfile.js +74 -0
  640. package/lib/structure/core/molfile.js.map +1 -0
  641. package/lib/structure/core/readStructure.d.ts +37 -0
  642. package/lib/structure/core/readStructure.d.ts.map +1 -0
  643. package/lib/structure/core/readStructure.js +59 -0
  644. package/lib/structure/core/readStructure.js.map +1 -0
  645. package/lib/structure/core/structureSource.d.ts +34 -0
  646. package/lib/structure/core/structureSource.d.ts.map +1 -0
  647. package/lib/structure/core/structureSource.js +32 -0
  648. package/lib/structure/core/structureSource.js.map +1 -0
  649. package/lib/structure/core/toolbarFloor.d.ts +16 -0
  650. package/lib/structure/core/toolbarFloor.d.ts.map +1 -0
  651. package/lib/structure/core/toolbarFloor.js +27 -0
  652. package/lib/structure/core/toolbarFloor.js.map +1 -0
  653. package/lib/structure/ui/EditorCanvas.d.ts +55 -0
  654. package/lib/structure/ui/EditorCanvas.d.ts.map +1 -0
  655. package/lib/structure/ui/EditorCanvas.js +41 -0
  656. package/lib/structure/ui/EditorCanvas.js.map +1 -0
  657. package/lib/structure/ui/Structure.d.ts +122 -0
  658. package/lib/structure/ui/Structure.d.ts.map +1 -0
  659. package/lib/structure/ui/Structure.js +28 -0
  660. package/lib/structure/ui/Structure.js.map +1 -0
  661. package/lib/structure/ui/StructureEditor.d.ts +75 -0
  662. package/lib/structure/ui/StructureEditor.d.ts.map +1 -0
  663. package/lib/structure/ui/StructureEditor.js +83 -0
  664. package/lib/structure/ui/StructureEditor.js.map +1 -0
  665. package/lib/structure/ui/StructurePlaceholder.d.ts +29 -0
  666. package/lib/structure/ui/StructurePlaceholder.d.ts.map +1 -0
  667. package/lib/structure/ui/StructurePlaceholder.js +19 -0
  668. package/lib/structure/ui/StructurePlaceholder.js.map +1 -0
  669. package/lib/structure/ui/StructureSvg.d.ts +58 -0
  670. package/lib/structure/ui/StructureSvg.d.ts.map +1 -0
  671. package/lib/structure/ui/StructureSvg.js +33 -0
  672. package/lib/structure/ui/StructureSvg.js.map +1 -0
  673. package/lib/structure/ui/index.d.ts +19 -0
  674. package/lib/structure/ui/index.d.ts.map +1 -0
  675. package/lib/structure/ui/index.js +15 -0
  676. package/lib/structure/ui/index.js.map +1 -0
  677. package/lib/structure/ui/useToolbarFloor.d.ts +26 -0
  678. package/lib/structure/ui/useToolbarFloor.d.ts.map +1 -0
  679. package/lib/structure/ui/useToolbarFloor.js +70 -0
  680. package/lib/structure/ui/useToolbarFloor.js.map +1 -0
  681. package/lib/structure.d.ts +3 -0
  682. package/lib/structure.d.ts.map +1 -0
  683. package/lib/structure.js +3 -0
  684. package/lib/structure.js.map +1 -0
  685. package/lib/ui.d.ts +13 -0
  686. package/lib/ui.d.ts.map +1 -1
  687. package/lib/ui.js +13 -0
  688. package/lib/ui.js.map +1 -1
  689. package/lib/worker/core/errors.d.ts +15 -0
  690. package/lib/worker/core/errors.d.ts.map +1 -0
  691. package/lib/worker/core/errors.js +15 -0
  692. package/lib/worker/core/errors.js.map +1 -0
  693. package/lib/worker/core/index.d.ts +5 -0
  694. package/lib/worker/core/index.d.ts.map +1 -0
  695. package/lib/worker/core/index.js +3 -0
  696. package/lib/worker/core/index.js.map +1 -0
  697. package/lib/worker/core/messages.d.ts +48 -0
  698. package/lib/worker/core/messages.d.ts.map +1 -0
  699. package/lib/worker/core/messages.js +2 -0
  700. package/lib/worker/core/messages.js.map +1 -0
  701. package/lib/worker/core/workerChannel.d.ts +69 -0
  702. package/lib/worker/core/workerChannel.d.ts.map +1 -0
  703. package/lib/worker/core/workerChannel.js +121 -0
  704. package/lib/worker/core/workerChannel.js.map +1 -0
  705. package/package.json +25 -4
  706. package/src/capsule/ui/CapsuleFilter.tsx +119 -0
  707. package/src/capsule/ui/index.ts +2 -0
  708. package/src/chrome/ui/NavLink.tsx +88 -0
  709. package/src/chrome/ui/NavMenuButton.tsx +95 -0
  710. package/src/chrome/ui/SiteFooter.tsx +65 -0
  711. package/src/chrome/ui/SiteHeader.tsx +119 -0
  712. package/src/chrome/ui/index.ts +11 -0
  713. package/src/chrome/ui/navItem.ts +60 -0
  714. package/src/chrome/ui/useCompactHeader.ts +81 -0
  715. package/src/citation/core/clipboard.ts +27 -11
  716. package/src/citation/core/download.ts +25 -15
  717. package/src/citation/core/index.ts +8 -3
  718. package/src/citation/core/works.ts +81 -0
  719. package/src/citation/ui/CitationMenu.tsx +104 -89
  720. package/src/citation/ui/CitationPreview.tsx +18 -8
  721. package/src/citation/ui/CiteButton.tsx +24 -9
  722. package/src/citation/ui/CopyFormatEntries.tsx +84 -0
  723. package/src/citation/ui/WorkEntry.tsx +80 -0
  724. package/src/citation/ui/entries.tsx +18 -20
  725. package/src/citation/ui/index.ts +10 -2
  726. package/src/citation/ui/useCopyFeedback.ts +76 -0
  727. package/src/clipboard/core/index.ts +1 -0
  728. package/src/clipboard/core/writeToClipboard.ts +47 -0
  729. package/src/clipboard/ui/CodeBlock.tsx +110 -0
  730. package/src/clipboard/ui/CopyButton.tsx +111 -0
  731. package/src/clipboard/ui/index.ts +9 -0
  732. package/src/clipboard/ui/useCopyToClipboard.ts +57 -0
  733. package/src/color/core/contrast.ts +85 -0
  734. package/src/color/core/hex.ts +57 -0
  735. package/src/color/core/index.ts +4 -0
  736. package/src/color/core/scale.ts +132 -0
  737. package/src/color/ui/ColorScaleLegend.tsx +144 -0
  738. package/src/color/ui/index.ts +2 -0
  739. package/src/core.ts +12 -0
  740. package/src/credits/core/credits.ts +183 -0
  741. package/src/credits/core/index.ts +2 -0
  742. package/src/credits/ui/CreditsList.tsx +82 -0
  743. package/src/credits/ui/index.ts +2 -0
  744. package/src/delimited/core/delimiters.ts +64 -0
  745. package/src/delimited/core/index.ts +11 -0
  746. package/src/delimited/core/readDelimited.ts +132 -0
  747. package/src/delimited/core/rowsToDelimited.ts +135 -0
  748. package/src/delimited/core/toDelimited.ts +69 -0
  749. package/src/delimited/ui/DelimitedTextDialog.tsx +49 -0
  750. package/src/delimited/ui/DelimitedTextPanel.tsx +161 -0
  751. package/src/delimited/ui/index.ts +4 -0
  752. package/src/disclosure/ui/CollapsibleSection.tsx +150 -0
  753. package/src/disclosure/ui/index.ts +4 -0
  754. package/src/disclosure/ui/useDisclosure.ts +35 -0
  755. package/src/download/core/downloadBlob.ts +19 -0
  756. package/src/download/core/downloadText.ts +19 -0
  757. package/src/download/core/index.ts +3 -0
  758. package/src/download/core/sanitizeFileName.ts +33 -0
  759. package/src/ecosystem/core/index.ts +3 -0
  760. package/src/ecosystem/core/links.ts +29 -0
  761. package/src/ecosystem/core/lookup.ts +41 -0
  762. package/src/ecosystem/core/sites.ts +38 -1
  763. package/src/ecosystem/core/tokens.ts +47 -0
  764. package/src/ecosystem/ui/SiteTheme.tsx +23 -0
  765. package/src/ecosystem/ui/Wordmark.tsx +65 -0
  766. package/src/ecosystem/ui/glyphs.tsx +246 -0
  767. package/src/ecosystem/ui/index.ts +4 -0
  768. package/src/ecosystem/ui/marks.tsx +56 -214
  769. package/src/error/ui/ErrorBoundary.tsx +94 -0
  770. package/src/error/ui/ErrorFallback.tsx +64 -0
  771. package/src/error/ui/index.ts +4 -0
  772. package/src/error/ui/toError.ts +33 -0
  773. package/src/format/core/index.ts +9 -0
  774. package/src/format/core/missing.ts +6 -0
  775. package/src/format/core/numbers.ts +84 -0
  776. package/src/format/core/units.ts +60 -0
  777. package/src/format/core/words.ts +17 -0
  778. package/src/help/ui/HelpBody.tsx +130 -0
  779. package/src/help/ui/HelpIcon.tsx +53 -0
  780. package/src/help/ui/HelpToolbarButton.tsx +72 -0
  781. package/src/help/ui/HelpTooltip.tsx +72 -0
  782. package/src/help/ui/index.ts +8 -0
  783. package/src/hooks/ui/index.ts +6 -0
  784. package/src/hooks/ui/listNavigation.ts +116 -0
  785. package/src/hooks/ui/useContainerSize.ts +32 -0
  786. package/src/hooks/ui/useDebouncedValue.ts +29 -0
  787. package/src/hooks/ui/useListKeyboardNavigation.ts +37 -0
  788. package/src/hooks/ui/useResizeObserver.ts +50 -0
  789. package/src/orbital/core/atomicGrid.ts +167 -0
  790. package/src/orbital/core/atomicOrbitals.ts +212 -0
  791. package/src/orbital/core/constants.ts +36 -0
  792. package/src/orbital/core/electronConfiguration.ts +242 -0
  793. package/src/orbital/core/grid.ts +126 -0
  794. package/src/orbital/core/hydrogenic.ts +222 -0
  795. package/src/orbital/core/index.ts +63 -0
  796. package/src/orbital/core/isovalue.ts +146 -0
  797. package/src/orbital/core/numerics.ts +79 -0
  798. package/src/orbital/core/occupancy.ts +100 -0
  799. package/src/orbital/core/palette.ts +56 -0
  800. package/src/orbital/core/realHarmonics.ts +172 -0
  801. package/src/orbital/core/sample.ts +111 -0
  802. package/src/orbital/core/screening.ts +90 -0
  803. package/src/orbital/ui/AtomicOrbitalCanvas.tsx +197 -0
  804. package/src/orbital/ui/AtomicOrbitalViewer.tsx +154 -0
  805. package/src/orbital/ui/camera.ts +125 -0
  806. package/src/orbital/ui/capability.ts +102 -0
  807. package/src/orbital/ui/index.ts +17 -0
  808. package/src/orbital/ui/renderVolume.ts +203 -0
  809. package/src/orbital/ui/viewer.ts +191 -0
  810. package/src/orbital/ui/volumeField.ts +84 -0
  811. package/src/orbital.ts +11 -0
  812. package/src/pedagogy/core/glossary.ts +122 -0
  813. package/src/pedagogy/core/index.ts +28 -0
  814. package/src/pedagogy/core/jsonStorage.ts +51 -0
  815. package/src/pedagogy/core/progress.ts +205 -0
  816. package/src/pedagogy/core/types.ts +78 -0
  817. package/src/pedagogy/core/validation.ts +109 -0
  818. package/src/pedagogy/ui/ExerciseActions.tsx +129 -0
  819. package/src/pedagogy/ui/ExerciseProgressHeader.tsx +135 -0
  820. package/src/pedagogy/ui/ExerciseTags.tsx +85 -0
  821. package/src/pedagogy/ui/GlossaryProvider.tsx +31 -0
  822. package/src/pedagogy/ui/GlossaryText.tsx +164 -0
  823. package/src/pedagogy/ui/HintLadder.tsx +95 -0
  824. package/src/pedagogy/ui/ReferenceGrid.tsx +69 -0
  825. package/src/pedagogy/ui/ReferenceSectionBlock.tsx +175 -0
  826. package/src/pedagogy/ui/SyntaxTooltip.tsx +222 -0
  827. package/src/pedagogy/ui/TestCaseList.tsx +122 -0
  828. package/src/pedagogy/ui/TutorialStepStrip.tsx +230 -0
  829. package/src/pedagogy/ui/exerciseMeta.ts +45 -0
  830. package/src/pedagogy/ui/glossaryContext.ts +23 -0
  831. package/src/pedagogy/ui/index.ts +37 -0
  832. package/src/pedagogy/ui/tutorialLevels.ts +27 -0
  833. package/src/router/core/address.ts +74 -0
  834. package/src/router/core/basePath.ts +76 -0
  835. package/src/router/core/index.ts +26 -0
  836. package/src/router/core/legacyHash.ts +77 -0
  837. package/src/router/core/pageAddresses.ts +106 -0
  838. package/src/router/core/query.ts +87 -0
  839. package/src/router/core/tabRouter.ts +214 -0
  840. package/src/seo/core/documentMeta.ts +92 -0
  841. package/src/seo/core/index.ts +6 -0
  842. package/src/share/core/config.ts +165 -0
  843. package/src/share/core/escape.ts +22 -0
  844. package/src/share/core/index.ts +31 -0
  845. package/src/share/core/params.ts +176 -0
  846. package/src/share/core/query.ts +72 -0
  847. package/src/share/core/url.ts +105 -0
  848. package/src/share/core/vocabulary.ts +60 -0
  849. package/src/share/ui/HiddenPartsProvider.tsx +34 -0
  850. package/src/share/ui/PagePart.tsx +26 -0
  851. package/src/share/ui/ShareButton.tsx +84 -0
  852. package/src/share/ui/ShareDialog.tsx +114 -0
  853. package/src/share/ui/ShareDialogContent.tsx +189 -0
  854. package/src/share/ui/SharePartOptions.tsx +51 -0
  855. package/src/share/ui/draft.ts +19 -0
  856. package/src/share/ui/hiddenParts.ts +22 -0
  857. package/src/share/ui/index.ts +9 -0
  858. package/src/shared/ui/index.ts +2 -1
  859. package/src/state/ui/index.ts +6 -0
  860. package/src/state/ui/mergeStored.ts +87 -0
  861. package/src/state/ui/persistBucket.ts +147 -0
  862. package/src/structure/core/editorValue.ts +116 -0
  863. package/src/structure/core/fragmentQuery.ts +50 -0
  864. package/src/structure/core/index.ts +13 -0
  865. package/src/structure/core/molfile.ts +90 -0
  866. package/src/structure/core/readStructure.ts +73 -0
  867. package/src/structure/core/structureSource.ts +57 -0
  868. package/src/structure/core/toolbarFloor.ts +31 -0
  869. package/src/structure/ui/EditorCanvas.tsx +130 -0
  870. package/src/structure/ui/Structure.tsx +183 -0
  871. package/src/structure/ui/StructureEditor.tsx +196 -0
  872. package/src/structure/ui/StructurePlaceholder.tsx +48 -0
  873. package/src/structure/ui/StructureSvg.tsx +110 -0
  874. package/src/structure/ui/index.ts +22 -0
  875. package/src/structure/ui/useToolbarFloor.ts +93 -0
  876. package/src/structure.ts +2 -0
  877. package/src/ui.ts +13 -0
  878. package/src/worker/core/errors.ts +15 -0
  879. package/src/worker/core/index.ts +8 -0
  880. package/src/worker/core/messages.ts +47 -0
  881. package/src/worker/core/workerChannel.ts +218 -0
  882. package/styles/chrome.css +223 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The two shades each level of the guided tour is painted in.
3
+ *
4
+ * Green, amber, pink — the same three the level tags use, in the pale weights a
5
+ * strip of buttons can sit on. They are shared so a student moving from one of
6
+ * our tools to the next reads the shape of the course the same way.
7
+ */
8
+
9
+ import type { ExerciseLevel } from '../core/types.ts';
10
+
11
+ /** How one level is painted. */
12
+ export interface TutorialLevelColours {
13
+ /** Behind the whole strip. */
14
+ background: string;
15
+ /** Behind the step that is open, which is the darker of the two. */
16
+ activeBackground: string;
17
+ }
18
+
19
+ /** The palette of the three levels. */
20
+ export const TUTORIAL_LEVEL_COLOURS: Record<
21
+ ExerciseLevel,
22
+ TutorialLevelColours
23
+ > = {
24
+ beginner: { background: '#d1fae5', activeBackground: '#6ee7b7' },
25
+ intermediate: { background: '#fef3c7', activeBackground: '#fcd34d' },
26
+ advanced: { background: '#fce7f3', activeBackground: '#f9a8d4' },
27
+ };
@@ -0,0 +1,74 @@
1
+ /** An address cut into the three parts a router reads separately. */
2
+ export interface AddressParts {
3
+ /** Path of the address, `/` when it carries none. */
4
+ path: string;
5
+ /** Query string, without its leading `?`. */
6
+ search: string;
7
+ /** Fragment, without its leading `#`. */
8
+ fragment: string;
9
+ }
10
+
11
+ /**
12
+ * Cut an address into its path, its query and its fragment.
13
+ *
14
+ * The fragment is taken first, so a `?` inside it — an old hash link of the
15
+ * shape `#/tutorial/3?step=2` — stays part of the fragment rather than being
16
+ * read as the query of the page.
17
+ * @param address - A path, a full address, or a bare query string.
18
+ * @returns The three parts, each without its separator.
19
+ */
20
+ export function splitAddress(address: string): AddressParts {
21
+ const hashIndex = address.indexOf('#');
22
+ const beforeHash = hashIndex === -1 ? address : address.slice(0, hashIndex);
23
+ const fragment = hashIndex === -1 ? '' : address.slice(hashIndex + 1);
24
+ const queryIndex = beforeHash.indexOf('?');
25
+ if (queryIndex === -1) {
26
+ return { path: beforeHash === '' ? '/' : beforeHash, search: '', fragment };
27
+ }
28
+ const path = beforeHash.slice(0, queryIndex);
29
+ return {
30
+ path: path === '' ? '/' : path,
31
+ search: beforeHash.slice(queryIndex + 1),
32
+ fragment,
33
+ };
34
+ }
35
+
36
+ /**
37
+ * The decoded, non-empty segments of a path.
38
+ * @param path - Path of an address, with or without its leading slash.
39
+ * @returns One entry per segment, `[]` for the root.
40
+ */
41
+ export function splitPath(path: string): string[] {
42
+ const segments: string[] = [];
43
+ for (const raw of path.split('/')) {
44
+ if (raw !== '') segments.push(safeDecode(raw));
45
+ }
46
+ return segments;
47
+ }
48
+
49
+ /**
50
+ * A path in the one shape the lookups compare: a leading slash, no trailing
51
+ * one, its segments decoded, and neither query nor fragment.
52
+ * @param path - Path of an address.
53
+ * @returns The same address, normalized.
54
+ */
55
+ export function normalizePath(path: string): string {
56
+ const segments = splitPath(splitAddress(path).path);
57
+ return segments.length === 0 ? '/' : `/${segments.join('/')}`;
58
+ }
59
+
60
+ /**
61
+ * Decode one component of an address, tolerating an escape that is not one.
62
+ *
63
+ * `decodeURIComponent` throws on a lone `%`, and an address is hand-editable:
64
+ * the raw text is closer to what its author meant than an error page.
65
+ * @param value - Raw, percent-encoded text.
66
+ * @returns The decoded text, or the raw text when it does not decode.
67
+ */
68
+ export function safeDecode(value: string): string {
69
+ try {
70
+ return decodeURIComponent(value);
71
+ } catch {
72
+ return value;
73
+ }
74
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Where a site is mounted, read off the page rather than off the build.
3
+ *
4
+ * The build is mount-agnostic — vite is given a relative base, so the same
5
+ * `dist` serves `https://surge.cheminfo.org/` and
6
+ * `https://www.cheminfo.org/surge/`. What tells the two apart is the `<base>`
7
+ * the deployment stamps into the page it hands out, and `document.baseURI`
8
+ * resolves it against the address actually opened. So this answers correctly
9
+ * whether or not a slash closes the address, and on an address the SPA
10
+ * fallback answered.
11
+ * @returns The mount path, in the shape {@link normalizeBasePath} returns.
12
+ */
13
+ export function readMountPath(): string {
14
+ const baseUri = globalThis.document?.baseURI;
15
+ if (!baseUri) return '';
16
+ return normalizeBasePath(new URL(baseUri).pathname);
17
+ }
18
+
19
+ /**
20
+ * The path half of a site's address, as a mount path.
21
+ *
22
+ * A deployment names where it serves the site in full — origin and path in one
23
+ * value — because the origin is what the canonical link and the sitemap need.
24
+ * This is the other half of it.
25
+ * @param siteUrl - The absolute address the site is served at.
26
+ * @returns The mount path, in the shape {@link normalizeBasePath} returns.
27
+ */
28
+ export function basePathOf(siteUrl: string): string {
29
+ return normalizeBasePath(new URL(siteUrl).pathname);
30
+ }
31
+
32
+ /**
33
+ * A mount path in the shape the other helpers assume: the empty string when the
34
+ * site owns the root of its host, `/surge` when it is one tool among several on
35
+ * a shared one.
36
+ * @param basePath - The mount path however it was written: `surge`, `/surge`, `/surge/`.
37
+ * @returns The normalized mount path, without a trailing slash.
38
+ */
39
+ export function normalizeBasePath(basePath: string): string {
40
+ const trimmed = basePath.trim();
41
+ if (trimmed === '' || trimmed === '/') return '';
42
+ const opened = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
43
+ return opened.replace(/\/+$/, '');
44
+ }
45
+
46
+ /**
47
+ * Move one of the site's own addresses under the path it is mounted at.
48
+ * @param basePath - The mount path, in any of the shapes {@link normalizeBasePath} accepts.
49
+ * @param path - An address from the site's own root, e.g. `/exercises`.
50
+ * @returns The address the browser and the server see, e.g. `/surge/exercises`.
51
+ */
52
+ export function joinBasePath(basePath: string, path: string): string {
53
+ const base = normalizeBasePath(basePath);
54
+ const opened = path === '' || !path.startsWith('/') ? `/${path}` : path;
55
+ if (base === '') return opened;
56
+ return opened === '/' ? `${base}/` : `${base}${opened}`;
57
+ }
58
+
59
+ /**
60
+ * Read one of the site's own addresses back out of a browser path.
61
+ *
62
+ * A path that does not sit under the mount is handed back untouched, so a
63
+ * deployment served from somewhere else than the build was told still routes.
64
+ * @param basePath - The mount path, in any of the shapes {@link normalizeBasePath} accepts.
65
+ * @param pathname - The path the browser is on, e.g. `/surge/exercises`.
66
+ * @returns The address from the site's own root, `/` for the mount itself.
67
+ */
68
+ export function stripBasePath(basePath: string, pathname: string): string {
69
+ const base = normalizeBasePath(basePath);
70
+ const path = pathname === '' ? '/' : pathname;
71
+ if (base === '') return path;
72
+ if (path === base || path === `${base}/`) return '/';
73
+ // `/surgeon` is not a page of a site mounted at `/surge`, so the mount only
74
+ // matches when what follows it is a path of its own.
75
+ return path.startsWith(`${base}/`) ? path.slice(base.length) : path;
76
+ }
@@ -0,0 +1,26 @@
1
+ export {
2
+ basePathOf,
3
+ joinBasePath,
4
+ normalizeBasePath,
5
+ readMountPath,
6
+ stripBasePath,
7
+ } from './basePath.ts';
8
+ export type {
9
+ AdoptLegacyHashOptions,
10
+ LegacyHashOptions,
11
+ } from './legacyHash.ts';
12
+ export { adoptLegacyHashAddress, pathFromLegacyHash } from './legacyHash.ts';
13
+ export type {
14
+ PageAddresses,
15
+ PageAddressesOptions,
16
+ PageWithPath,
17
+ } from './pageAddresses.ts';
18
+ export { createPageAddresses } from './pageAddresses.ts';
19
+ export type {
20
+ TabDefinition,
21
+ TabRoute,
22
+ TabRouteInput,
23
+ TabRouter,
24
+ TabRouterOptions,
25
+ } from './tabRouter.ts';
26
+ export { createTabRouter } from './tabRouter.ts';
@@ -0,0 +1,77 @@
1
+ import { splitAddress } from './address.ts';
2
+ import { normalizeBasePath, stripBasePath } from './basePath.ts';
3
+
4
+ /** How a legacy hash link is turned into the path it means. */
5
+ export interface LegacyHashOptions {
6
+ /**
7
+ * Carry the query string of the address over to the path. The share
8
+ * configuration lives there, so an embed stays configured across the move.
9
+ * A query written inside the fragment itself always wins over it.
10
+ * @default true
11
+ */
12
+ keepSearch?: boolean;
13
+ }
14
+
15
+ /** How an address is read when adopting the path a legacy hash link meant. */
16
+ export interface AdoptLegacyHashOptions extends LegacyHashOptions {
17
+ /**
18
+ * The path the site is mounted at, so a legacy link to a tool served under
19
+ * one is recognised as sitting on its root.
20
+ * @default ''
21
+ */
22
+ basePath?: string;
23
+ }
24
+
25
+ /**
26
+ * The path a link written before the site routed by path points at.
27
+ *
28
+ * Those links are in course pages, in bookmarks and inside other people's
29
+ * iframes, so they are answered rather than dropped. Only a fragment shaped
30
+ * like a path is one: an anchor such as `#results` names a place inside a page
31
+ * and comes back `null`.
32
+ * @param address - A full address, or the fragment on its own, e.g. `/#/tutorial/3`.
33
+ * @param options - Whether the query string is carried over.
34
+ * @returns The path form of the address, or `null` when it names no page.
35
+ */
36
+ export function pathFromLegacyHash(
37
+ address: string,
38
+ options: LegacyHashOptions = {},
39
+ ): string | null {
40
+ const outer = splitAddress(address);
41
+ if (outer.fragment === '' || !outer.fragment.startsWith('/')) return null;
42
+
43
+ const inner = splitAddress(outer.fragment);
44
+ if (inner.path === '/') return null;
45
+
46
+ const keepSearch = options.keepSearch ?? true;
47
+ const search = inner.search || (keepSearch ? outer.search : '');
48
+ return search === '' ? inner.path : `${inner.path}?${search}`;
49
+ }
50
+
51
+ /**
52
+ * The address to put in the bar in place of a legacy hash link, before anything
53
+ * reads it.
54
+ *
55
+ * Called once at startup with `location.pathname + location.search +
56
+ * location.hash`, so nothing downstream has to know the site ever routed by the
57
+ * hash. Only a visitor sitting on the site's root is moved: a fragment on a
58
+ * real page is an anchor of that page, not an address of its own.
59
+ * @param address - The address the browser is on.
60
+ * @param options - Whether the query is carried over, and the site's mount path.
61
+ * @returns The address to replace it with, or `null` when there is nothing to adopt.
62
+ */
63
+ export function adoptLegacyHashAddress(
64
+ address: string,
65
+ options: AdoptLegacyHashOptions = {},
66
+ ): string | null {
67
+ const basePath = normalizeBasePath(options.basePath ?? '');
68
+ if (stripBasePath(basePath, splitAddress(address).path) !== '/') return null;
69
+
70
+ const path = pathFromLegacyHash(address, options);
71
+ if (path === null) return null;
72
+ if (basePath === '') return path;
73
+
74
+ const { path: adopted, search } = splitAddress(path);
75
+ const mounted = `${basePath}${adopted}`;
76
+ return search === '' ? mounted : `${mounted}?${search}`;
77
+ }
@@ -0,0 +1,106 @@
1
+ import { normalizePath, splitAddress } from './address.ts';
2
+ import { joinBasePath, normalizeBasePath, stripBasePath } from './basePath.ts';
3
+
4
+ /**
5
+ * The table of everything the site answers, read by the three things that must
6
+ * agree on it: the build, which writes one HTML file per entry and the sitemap
7
+ * listing them; the server or the entrypoint, which titles the page it hands
8
+ * out; and the running app, which retitles the tab after an in-app move.
9
+ *
10
+ * Pure and DOM-free, so the prerender script imports the same table under Node
11
+ * that the browser imports at run time. A page missing from it is a page a
12
+ * search engine only ever sees as the home page.
13
+ * @param options - The pages, in the order the site presents them.
14
+ * @returns The three lookups the build and the app share.
15
+ */
16
+ export function createPageAddresses<Page extends PageWithPath>(
17
+ options: PageAddressesOptions<Page>,
18
+ ): PageAddresses<Page> {
19
+ const pages = options.pages;
20
+ const first = pages[0];
21
+ if (first === undefined) {
22
+ throw new Error('createPageAddresses needs at least one page');
23
+ }
24
+ const home: Page = first;
25
+ const basePath = normalizeBasePath(options.basePath ?? '');
26
+
27
+ const byPath = new Map<string, Page>();
28
+ for (const page of pages) {
29
+ byPath.set(normalizePath(page.path), page);
30
+ }
31
+
32
+ function everyPage(): readonly Page[] {
33
+ return pages;
34
+ }
35
+
36
+ function canonicalPathOf(page: Page): string {
37
+ return joinBasePath(basePath, normalizePath(page.path));
38
+ }
39
+
40
+ function pageAt(address: string): Page {
41
+ const path = normalizePath(
42
+ stripBasePath(basePath, splitAddress(address).path),
43
+ );
44
+ const exact = byPath.get(path);
45
+ if (exact !== undefined) return exact;
46
+ return deepestPageUnder(pages, path) ?? home;
47
+ }
48
+
49
+ return { everyPage, canonicalPathOf, pageAt };
50
+ }
51
+
52
+ /** The one thing a page must carry: the address it is reachable at. */
53
+ export interface PageWithPath {
54
+ /** Address from the site's own root, e.g. `/exercises`. */
55
+ path: string;
56
+ }
57
+
58
+ /** How a site's pages are turned into addresses. */
59
+ export interface PageAddressesOptions<Page extends PageWithPath> {
60
+ /**
61
+ * Every page, deep addresses included. The first is the home page, and is
62
+ * what an address the site does not know opens.
63
+ */
64
+ pages: readonly Page[];
65
+ /**
66
+ * The path the site is served under: nothing on a host of its own, `/surge`
67
+ * as one tool among several on a shared one.
68
+ * @default ''
69
+ */
70
+ basePath?: string;
71
+ }
72
+
73
+ /** The lookups a site's pages answer. */
74
+ export interface PageAddresses<Page extends PageWithPath> {
75
+ /** Every page, in the order given: what the sitemap lists and the build writes. */
76
+ everyPage: () => readonly Page[];
77
+ /**
78
+ * The address a page is indexed under, mount path included and query string
79
+ * dropped — a structure being edited and a share configuration are not pages.
80
+ */
81
+ canonicalPathOf: (page: Page) => string;
82
+ /**
83
+ * The page an address opens. An address below a page it does not list is that
84
+ * page — a link written before an exercise was renamed still opens, and is
85
+ * indexed as the exercises — and an address it knows nothing about is the
86
+ * home page.
87
+ */
88
+ pageAt: (address: string) => Page;
89
+ }
90
+
91
+ function deepestPageUnder<Page extends PageWithPath>(
92
+ pages: readonly Page[],
93
+ path: string,
94
+ ): Page | undefined {
95
+ let deepest: Page | undefined;
96
+ let depth = 0;
97
+ for (const page of pages) {
98
+ const candidate = normalizePath(page.path);
99
+ if (candidate === '/' || candidate.length <= depth) continue;
100
+ if (path.startsWith(`${candidate}/`)) {
101
+ deepest = page;
102
+ depth = candidate.length;
103
+ }
104
+ }
105
+ return deepest;
106
+ }
@@ -0,0 +1,87 @@
1
+ import { safeDecode } from './address.ts';
2
+
3
+ /** How a query string is read and written. */
4
+ export interface QueryStringOptions {
5
+ /**
6
+ * Keep a `+` in a value as the character it is, rather than reading it as
7
+ * the space `URLSearchParams` decodes it to. A SMILES carries `+` for a
8
+ * charged atom, and `CC[N+](C)(C)C` handed out in a link has to survive.
9
+ * @default true
10
+ */
11
+ literalPlus?: boolean;
12
+ /**
13
+ * Write a parameter carrying nothing back as the bare key, so a hand-typed
14
+ * flag such as `?embed` survives the round trip. Left off, an empty value is
15
+ * dropped and an unconfigured link stays clean.
16
+ * @default false
17
+ */
18
+ keepEmptyValues?: boolean;
19
+ }
20
+
21
+ /**
22
+ * Read a query string.
23
+ *
24
+ * Forgiving by design, because the address is hand-editable and arrives from
25
+ * bookmarks, course pages and lecture slides: a repeated key keeps its last
26
+ * value, a key carrying nothing is kept as an empty value so a bare `?embed`
27
+ * reads as present, and an escape that does not decode is taken literally.
28
+ * @param search - The query string, with or without its leading `?`.
29
+ * @param options - How the values are decoded.
30
+ * @returns One entry per key, decoded.
31
+ */
32
+ export function parseQueryString(
33
+ search: string,
34
+ options: QueryStringOptions = {},
35
+ ): Record<string, string> {
36
+ const literalPlus = options.literalPlus ?? true;
37
+ const query: Record<string, string> = {};
38
+ const text = search.startsWith('?') ? search.slice(1) : search;
39
+ for (const part of text.split('&')) {
40
+ if (part === '') continue;
41
+ const index = part.indexOf('=');
42
+ const rawKey = index === -1 ? part : part.slice(0, index);
43
+ const rawValue = index === -1 ? '' : part.slice(index + 1);
44
+ const key = decodeValue(rawKey, literalPlus);
45
+ if (key === '') continue;
46
+ query[key] = decodeValue(rawValue, literalPlus);
47
+ }
48
+ return query;
49
+ }
50
+
51
+ /**
52
+ * Write a query string.
53
+ *
54
+ * A parameter left at nothing is dropped unless `keepEmptyValues` asks for it,
55
+ * and `undefined` or `null` removes a parameter outright, so a page can hand
56
+ * its whole state to this function and get back only what it actually carries.
57
+ * @param params - The parameters, in the order they should be written.
58
+ * @param options - How the values are encoded.
59
+ * @returns The query string, without its leading `?`, empty when nothing is carried.
60
+ */
61
+ export function formatQueryString(
62
+ params: Readonly<Record<string, string | undefined | null>>,
63
+ options: QueryStringOptions = {},
64
+ ): string {
65
+ const keepEmptyValues = options.keepEmptyValues ?? false;
66
+ const parts: string[] = [];
67
+ for (const [key, value] of Object.entries(params)) {
68
+ if (key === '' || value === undefined || value === null) continue;
69
+ if (value === '') {
70
+ if (keepEmptyValues) parts.push(encodeValue(key));
71
+ continue;
72
+ }
73
+ parts.push(`${encodeValue(key)}=${encodeValue(value)}`);
74
+ }
75
+ return parts.join('&');
76
+ }
77
+
78
+ // A comma is legal in a query value and is what separates the keys of `hide`
79
+ // and the formulas of a list; escaped to `%2C` a link stops being one a teacher
80
+ // can read out loud.
81
+ function encodeValue(value: string): string {
82
+ return encodeURIComponent(value).replaceAll('%2C', ',');
83
+ }
84
+
85
+ function decodeValue(value: string, literalPlus: boolean): string {
86
+ return safeDecode(literalPlus ? value : value.replaceAll('+', ' '));
87
+ }
@@ -0,0 +1,214 @@
1
+ import { splitAddress, splitPath } from './address.ts';
2
+ import { joinBasePath, normalizeBasePath, stripBasePath } from './basePath.ts';
3
+ import { pathFromLegacyHash } from './legacyHash.ts';
4
+ import type { QueryStringOptions } from './query.ts';
5
+ import { formatQueryString, parseQueryString } from './query.ts';
6
+
7
+ /**
8
+ * The two directions between an address and the page it names.
9
+ *
10
+ * Both functions are pure: they take and return strings, never touch
11
+ * `location`, and know none of the parameter names the tool carries — the share
12
+ * configuration owns those. That is what makes the round trip unit-testable
13
+ * without a DOM, and usable from a prerender script under Node.
14
+ * @param options - The tabs of the site and how their addresses are written.
15
+ * @returns The parser, the serialiser, and the test for a known tab.
16
+ */
17
+ export function createTabRouter<Tab extends string>(
18
+ options: TabRouterOptions<Tab>,
19
+ ): TabRouter<Tab> {
20
+ const mode = options.mode ?? 'path';
21
+ const basePath = normalizeBasePath(options.basePath ?? '');
22
+ const adoptLegacyHash = options.adoptLegacyHash ?? false;
23
+ const queryOptions: QueryStringOptions = {
24
+ literalPlus: options.literalPlus ?? true,
25
+ keepEmptyValues: options.keepEmptyValues ?? false,
26
+ };
27
+
28
+ const definitions = new Map<string, NormalizedTab>();
29
+ for (const tab of options.tabs) {
30
+ const definition = typeof tab === 'string' ? { id: tab } : tab;
31
+ definitions.set(definition.id, {
32
+ path: normalizeTabPath(definition.path ?? `/${definition.id}`),
33
+ takesId: definition.takesId ?? false,
34
+ });
35
+ }
36
+ definitions.set(
37
+ options.home,
38
+ definitions.get(options.home) ?? { path: '/', takesId: false },
39
+ );
40
+
41
+ const tabBySegment = new Map<string, Tab>();
42
+ for (const [id, definition] of definitions) {
43
+ const segment = definition.path.slice(1);
44
+ if (segment !== '') tabBySegment.set(segment, id as Tab);
45
+ }
46
+
47
+ function isTab(value: string): value is Tab {
48
+ return definitions.has(value);
49
+ }
50
+
51
+ function parse(address: string): TabRoute<Tab> {
52
+ const parts = readAddress(address, mode, basePath, adoptLegacyHash);
53
+ const params = parseQueryString(parts.search, queryOptions);
54
+ const segments = splitPath(parts.path);
55
+ const first = segments[0];
56
+ const tab = first === undefined ? undefined : tabBySegment.get(first);
57
+ if (tab === undefined) return { tab: options.home, id: null, params };
58
+ const second = segments[1];
59
+ const takesId = definitions.get(tab)?.takesId ?? false;
60
+ return { tab, id: takesId && second !== undefined ? second : null, params };
61
+ }
62
+
63
+ function format(route: TabRouteInput<Tab>): string {
64
+ const tab = definitions.has(route.tab) ? route.tab : options.home;
65
+ const definition = definitions.get(tab);
66
+ const base = tab === options.home ? '/' : (definition?.path ?? '/');
67
+ const id = definition?.takesId === true ? (route.id ?? null) : null;
68
+ const path =
69
+ id === null || base === '/' ? base : `${base}/${encodeURIComponent(id)}`;
70
+ const search = formatQueryString(route.params ?? {}, queryOptions);
71
+ const address = mode === 'hash' ? `#${path}` : joinBasePath(basePath, path);
72
+ return search === '' ? address : `${address}?${search}`;
73
+ }
74
+
75
+ return { parse, format, isTab };
76
+ }
77
+
78
+ /** A tab whose address carries more than the tab's own name. */
79
+ export interface TabDefinition<Tab extends string = string> {
80
+ /** Identifier of the tab, as the state and the components name it. */
81
+ id: Tab;
82
+ /**
83
+ * The address of the tab, from the site's own root. The home tab is always
84
+ * written as `/`, whatever it declares here, so the site has one address for
85
+ * it instead of two holding the same thing.
86
+ * @default `/${id}`
87
+ */
88
+ path?: string;
89
+ /**
90
+ * Whether the tab addresses one of its items in a second path segment — a
91
+ * tutorial step, an exercise, an element — so a lecturer can hand out a deep
92
+ * link and a crawler indexes each item as a page of its own.
93
+ * @default false
94
+ */
95
+ takesId?: boolean;
96
+ }
97
+
98
+ /** How the addresses of a site's tabs are read and written. */
99
+ export interface TabRouterOptions<Tab extends string> {
100
+ /** Every tab of the site, named on its own or described in full. */
101
+ tabs: ReadonlyArray<Tab | TabDefinition<Tab>>;
102
+ /**
103
+ * The tab living at the root, and the one an address the site does not know
104
+ * opens — a link written before a rename still lands somewhere.
105
+ */
106
+ home: Tab;
107
+ /**
108
+ * Whether the address is the path or the fragment. A public tool must use
109
+ * `'path'`: a `#` is dropped by half the tools that pass links around, the
110
+ * server never sees it, and a crawler indexes the whole site as one page.
111
+ * `'hash'` exists only so a site already routing that way can adopt this
112
+ * router before it moves.
113
+ * @default 'path'
114
+ */
115
+ mode?: 'path' | 'hash';
116
+ /**
117
+ * The path the site is served under: nothing on a host of its own, `/surge`
118
+ * as one tool among several on a shared one.
119
+ * @default ''
120
+ */
121
+ basePath?: string;
122
+ /**
123
+ * Read a `+` in a value as the character it is rather than as a space.
124
+ * Without it a shared SMILES breaks.
125
+ * @default true
126
+ */
127
+ literalPlus?: boolean;
128
+ /**
129
+ * Write a parameter carrying nothing back as the bare key, so a hand-typed
130
+ * `?embed` survives the round trip.
131
+ * @default false
132
+ */
133
+ keepEmptyValues?: boolean;
134
+ /**
135
+ * Also read an address whose page is named by an old `#/tab/item` fragment,
136
+ * so links handed out before the site routed by path keep working.
137
+ * @default false
138
+ */
139
+ adoptLegacyHash?: boolean;
140
+ }
141
+
142
+ /** Where the app is: which tab, what it has open, and how it is set up. */
143
+ export interface TabRoute<Tab extends string = string> {
144
+ /** The tab the address opens. */
145
+ tab: Tab;
146
+ /** The item its second segment names, `null` on a tab that takes none. */
147
+ id: string | null;
148
+ /** Decoded query parameters, the tool's own and the share configuration's. */
149
+ params: Record<string, string>;
150
+ }
151
+
152
+ /** A route as a caller writes it, the parts it does not carry left out. */
153
+ export interface TabRouteInput<Tab extends string = string> {
154
+ /** The tab to open; one the router does not know falls back to the home tab. */
155
+ tab: Tab;
156
+ /**
157
+ * The item the tab has open, ignored by a tab that addresses none.
158
+ * @default null
159
+ */
160
+ id?: string | null;
161
+ /**
162
+ * Query parameters to carry; an empty, `undefined` or `null` value is left out.
163
+ * @default {}
164
+ */
165
+ params?: Record<string, string | undefined | null>;
166
+ }
167
+
168
+ /** The string ↔ route mapping of a site. */
169
+ export interface TabRouter<Tab extends string = string> {
170
+ /**
171
+ * The route an address denotes. An unknown tab, a trailing slash, an empty
172
+ * address and an escape that does not decode all resolve to something
173
+ * sensible rather than throwing.
174
+ */
175
+ parse: (address: string) => TabRoute<Tab>;
176
+ /** The address a route is reachable at, mount path and query included. */
177
+ format: (route: TabRouteInput<Tab>) => string;
178
+ /** Whether a string read out of an address names one of the site's tabs. */
179
+ isTab: (value: string) => value is Tab;
180
+ }
181
+
182
+ interface NormalizedTab {
183
+ path: string;
184
+ takesId: boolean;
185
+ }
186
+
187
+ function readAddress(
188
+ address: string,
189
+ mode: 'path' | 'hash',
190
+ basePath: string,
191
+ adoptLegacyHash: boolean,
192
+ ): { path: string; search: string } {
193
+ if (mode === 'hash') {
194
+ const fragment = address.includes('#')
195
+ ? splitAddress(address).fragment
196
+ : address;
197
+ const { path, search } = splitAddress(fragment);
198
+ return { path, search };
199
+ }
200
+
201
+ const outer = splitAddress(address);
202
+ const path = stripBasePath(basePath, outer.path);
203
+ if (adoptLegacyHash && path === '/') {
204
+ const legacy = pathFromLegacyHash(address);
205
+ if (legacy !== null) return splitAddress(legacy);
206
+ }
207
+ return { path, search: outer.search };
208
+ }
209
+
210
+ function normalizeTabPath(path: string): string {
211
+ const opened = path.startsWith('/') ? path : `/${path}`;
212
+ const closed = opened.replace(/\/+$/, '');
213
+ return closed === '' ? '/' : closed;
214
+ }