react-cheminfo 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (844) hide show
  1. package/README.md +111 -23
  2. package/lib/capsule/ui/CapsuleFilter.d.ts +61 -0
  3. package/lib/capsule/ui/CapsuleFilter.d.ts.map +1 -0
  4. package/lib/capsule/ui/CapsuleFilter.js +33 -0
  5. package/lib/capsule/ui/CapsuleFilter.js.map +1 -0
  6. package/lib/capsule/ui/index.d.ts +3 -0
  7. package/lib/capsule/ui/index.d.ts.map +1 -0
  8. package/lib/capsule/ui/index.js +2 -0
  9. package/lib/capsule/ui/index.js.map +1 -0
  10. package/lib/chrome/ui/NavLink.d.ts +27 -0
  11. package/lib/chrome/ui/NavLink.d.ts.map +1 -0
  12. package/lib/chrome/ui/NavLink.js +36 -0
  13. package/lib/chrome/ui/NavLink.js.map +1 -0
  14. package/lib/chrome/ui/NavMenuButton.d.ts +40 -0
  15. package/lib/chrome/ui/NavMenuButton.d.ts.map +1 -0
  16. package/lib/chrome/ui/NavMenuButton.js +26 -0
  17. package/lib/chrome/ui/NavMenuButton.js.map +1 -0
  18. package/lib/chrome/ui/SiteFooter.d.ts +39 -0
  19. package/lib/chrome/ui/SiteFooter.d.ts.map +1 -0
  20. package/lib/chrome/ui/SiteFooter.js +17 -0
  21. package/lib/chrome/ui/SiteFooter.js.map +1 -0
  22. package/lib/chrome/ui/SiteHeader.d.ts +59 -0
  23. package/lib/chrome/ui/SiteHeader.d.ts.map +1 -0
  24. package/lib/chrome/ui/SiteHeader.js +28 -0
  25. package/lib/chrome/ui/SiteHeader.js.map +1 -0
  26. package/lib/chrome/ui/index.d.ts +12 -0
  27. package/lib/chrome/ui/index.d.ts.map +1 -0
  28. package/lib/chrome/ui/index.js +6 -0
  29. package/lib/chrome/ui/index.js.map +1 -0
  30. package/lib/chrome/ui/navItem.d.ts +57 -0
  31. package/lib/chrome/ui/navItem.d.ts.map +1 -0
  32. package/lib/chrome/ui/navItem.js +10 -0
  33. package/lib/chrome/ui/navItem.js.map +1 -0
  34. package/lib/chrome/ui/useCompactHeader.d.ts +31 -0
  35. package/lib/chrome/ui/useCompactHeader.d.ts.map +1 -0
  36. package/lib/chrome/ui/useCompactHeader.js +50 -0
  37. package/lib/chrome/ui/useCompactHeader.js.map +1 -0
  38. package/lib/citation/core/clipboard.d.ts +12 -3
  39. package/lib/citation/core/clipboard.d.ts.map +1 -1
  40. package/lib/citation/core/clipboard.js +21 -10
  41. package/lib/citation/core/clipboard.js.map +1 -1
  42. package/lib/citation/core/download.d.ts +11 -3
  43. package/lib/citation/core/download.d.ts.map +1 -1
  44. package/lib/citation/core/download.js +17 -13
  45. package/lib/citation/core/download.js.map +1 -1
  46. package/lib/citation/core/index.d.ts +4 -3
  47. package/lib/citation/core/index.d.ts.map +1 -1
  48. package/lib/citation/core/index.js +3 -3
  49. package/lib/citation/core/index.js.map +1 -1
  50. package/lib/citation/core/works.d.ts +44 -0
  51. package/lib/citation/core/works.d.ts.map +1 -0
  52. package/lib/citation/core/works.js +51 -0
  53. package/lib/citation/core/works.js.map +1 -0
  54. package/lib/citation/ui/CitationMenu.d.ts +20 -3
  55. package/lib/citation/ui/CitationMenu.d.ts.map +1 -1
  56. package/lib/citation/ui/CitationMenu.js +60 -49
  57. package/lib/citation/ui/CitationMenu.js.map +1 -1
  58. package/lib/citation/ui/CitationPreview.d.ts +5 -2
  59. package/lib/citation/ui/CitationPreview.d.ts.map +1 -1
  60. package/lib/citation/ui/CitationPreview.js +9 -4
  61. package/lib/citation/ui/CitationPreview.js.map +1 -1
  62. package/lib/citation/ui/CiteButton.d.ts +13 -6
  63. package/lib/citation/ui/CiteButton.d.ts.map +1 -1
  64. package/lib/citation/ui/CiteButton.js +5 -4
  65. package/lib/citation/ui/CiteButton.js.map +1 -1
  66. package/lib/citation/ui/CopyFormatEntries.d.ts +31 -0
  67. package/lib/citation/ui/CopyFormatEntries.d.ts.map +1 -0
  68. package/lib/citation/ui/CopyFormatEntries.js +29 -0
  69. package/lib/citation/ui/CopyFormatEntries.js.map +1 -0
  70. package/lib/citation/ui/WorkEntry.d.ts +18 -0
  71. package/lib/citation/ui/WorkEntry.d.ts.map +1 -0
  72. package/lib/citation/ui/WorkEntry.js +32 -0
  73. package/lib/citation/ui/WorkEntry.js.map +1 -0
  74. package/lib/citation/ui/entries.d.ts +7 -7
  75. package/lib/citation/ui/entries.d.ts.map +1 -1
  76. package/lib/citation/ui/entries.js +11 -13
  77. package/lib/citation/ui/entries.js.map +1 -1
  78. package/lib/citation/ui/index.d.ts +2 -2
  79. package/lib/citation/ui/index.d.ts.map +1 -1
  80. package/lib/citation/ui/index.js.map +1 -1
  81. package/lib/citation/ui/useCopyFeedback.d.ts +20 -0
  82. package/lib/citation/ui/useCopyFeedback.d.ts.map +1 -0
  83. package/lib/citation/ui/useCopyFeedback.js +49 -0
  84. package/lib/citation/ui/useCopyFeedback.js.map +1 -0
  85. package/lib/clipboard/core/index.d.ts +2 -0
  86. package/lib/clipboard/core/index.d.ts.map +1 -0
  87. package/lib/clipboard/core/index.js +2 -0
  88. package/lib/clipboard/core/index.js.map +1 -0
  89. package/lib/clipboard/core/writeToClipboard.d.ts +12 -0
  90. package/lib/clipboard/core/writeToClipboard.d.ts.map +1 -0
  91. package/lib/clipboard/core/writeToClipboard.js +49 -0
  92. package/lib/clipboard/core/writeToClipboard.js.map +1 -0
  93. package/lib/clipboard/ui/CodeBlock.d.ts +43 -0
  94. package/lib/clipboard/ui/CodeBlock.d.ts.map +1 -0
  95. package/lib/clipboard/ui/CodeBlock.js +49 -0
  96. package/lib/clipboard/ui/CodeBlock.js.map +1 -0
  97. package/lib/clipboard/ui/CopyButton.d.ts +64 -0
  98. package/lib/clipboard/ui/CopyButton.d.ts.map +1 -0
  99. package/lib/clipboard/ui/CopyButton.js +21 -0
  100. package/lib/clipboard/ui/CopyButton.js.map +1 -0
  101. package/lib/clipboard/ui/index.d.ts +7 -0
  102. package/lib/clipboard/ui/index.d.ts.map +1 -0
  103. package/lib/clipboard/ui/index.js +4 -0
  104. package/lib/clipboard/ui/index.js.map +1 -0
  105. package/lib/clipboard/ui/useCopyToClipboard.d.ts +24 -0
  106. package/lib/clipboard/ui/useCopyToClipboard.d.ts.map +1 -0
  107. package/lib/clipboard/ui/useCopyToClipboard.js +36 -0
  108. package/lib/clipboard/ui/useCopyToClipboard.js.map +1 -0
  109. package/lib/color/core/contrast.d.ts +43 -0
  110. package/lib/color/core/contrast.d.ts.map +1 -0
  111. package/lib/color/core/contrast.js +61 -0
  112. package/lib/color/core/contrast.js.map +1 -0
  113. package/lib/color/core/hex.d.ts +26 -0
  114. package/lib/color/core/hex.d.ts.map +1 -0
  115. package/lib/color/core/hex.js +44 -0
  116. package/lib/color/core/hex.js.map +1 -0
  117. package/lib/color/core/index.d.ts +5 -0
  118. package/lib/color/core/index.d.ts.map +1 -0
  119. package/lib/color/core/index.js +3 -0
  120. package/lib/color/core/index.js.map +1 -0
  121. package/lib/color/core/scale.d.ts +52 -0
  122. package/lib/color/core/scale.d.ts.map +1 -0
  123. package/lib/color/core/scale.js +96 -0
  124. package/lib/color/core/scale.js.map +1 -0
  125. package/lib/color/ui/ColorScaleLegend.d.ts +38 -0
  126. package/lib/color/ui/ColorScaleLegend.d.ts.map +1 -0
  127. package/lib/color/ui/ColorScaleLegend.js +68 -0
  128. package/lib/color/ui/ColorScaleLegend.js.map +1 -0
  129. package/lib/color/ui/index.d.ts +3 -0
  130. package/lib/color/ui/index.d.ts.map +1 -0
  131. package/lib/color/ui/index.js +2 -0
  132. package/lib/color/ui/index.js.map +1 -0
  133. package/lib/core.d.ts +11 -0
  134. package/lib/core.d.ts.map +1 -1
  135. package/lib/core.js +11 -0
  136. package/lib/core.js.map +1 -1
  137. package/lib/credits/core/credits.d.ts +144 -0
  138. package/lib/credits/core/credits.d.ts.map +1 -0
  139. package/lib/credits/core/credits.js +156 -0
  140. package/lib/credits/core/credits.js.map +1 -0
  141. package/lib/credits/core/index.d.ts +3 -0
  142. package/lib/credits/core/index.d.ts.map +1 -0
  143. package/lib/credits/core/index.js +2 -0
  144. package/lib/credits/core/index.js.map +1 -0
  145. package/lib/credits/ui/CreditsList.d.ts +29 -0
  146. package/lib/credits/ui/CreditsList.d.ts.map +1 -0
  147. package/lib/credits/ui/CreditsList.js +33 -0
  148. package/lib/credits/ui/CreditsList.js.map +1 -0
  149. package/lib/credits/ui/index.d.ts +3 -0
  150. package/lib/credits/ui/index.d.ts.map +1 -0
  151. package/lib/credits/ui/index.js +2 -0
  152. package/lib/credits/ui/index.js.map +1 -0
  153. package/lib/delimited/core/delimiters.d.ts +31 -0
  154. package/lib/delimited/core/delimiters.d.ts.map +1 -0
  155. package/lib/delimited/core/delimiters.js +46 -0
  156. package/lib/delimited/core/delimiters.js.map +1 -0
  157. package/lib/delimited/core/index.d.ts +9 -0
  158. package/lib/delimited/core/index.d.ts.map +1 -0
  159. package/lib/delimited/core/index.js +5 -0
  160. package/lib/delimited/core/index.js.map +1 -0
  161. package/lib/delimited/core/readDelimited.d.ts +32 -0
  162. package/lib/delimited/core/readDelimited.d.ts.map +1 -0
  163. package/lib/delimited/core/readDelimited.js +122 -0
  164. package/lib/delimited/core/readDelimited.js.map +1 -0
  165. package/lib/delimited/core/rowsToDelimited.d.ts +59 -0
  166. package/lib/delimited/core/rowsToDelimited.d.ts.map +1 -0
  167. package/lib/delimited/core/rowsToDelimited.js +87 -0
  168. package/lib/delimited/core/rowsToDelimited.js.map +1 -0
  169. package/lib/delimited/core/toDelimited.d.ts +38 -0
  170. package/lib/delimited/core/toDelimited.d.ts.map +1 -0
  171. package/lib/delimited/core/toDelimited.js +45 -0
  172. package/lib/delimited/core/toDelimited.js.map +1 -0
  173. package/lib/delimited/ui/DelimitedTextDialog.d.ts +22 -0
  174. package/lib/delimited/ui/DelimitedTextDialog.d.ts.map +1 -0
  175. package/lib/delimited/ui/DelimitedTextDialog.js +17 -0
  176. package/lib/delimited/ui/DelimitedTextDialog.js.map +1 -0
  177. package/lib/delimited/ui/DelimitedTextPanel.d.ts +56 -0
  178. package/lib/delimited/ui/DelimitedTextPanel.d.ts.map +1 -0
  179. package/lib/delimited/ui/DelimitedTextPanel.js +55 -0
  180. package/lib/delimited/ui/DelimitedTextPanel.js.map +1 -0
  181. package/lib/delimited/ui/index.d.ts +5 -0
  182. package/lib/delimited/ui/index.d.ts.map +1 -0
  183. package/lib/delimited/ui/index.js +3 -0
  184. package/lib/delimited/ui/index.js.map +1 -0
  185. package/lib/disclosure/ui/CollapsibleSection.d.ts +57 -0
  186. package/lib/disclosure/ui/CollapsibleSection.d.ts.map +1 -0
  187. package/lib/disclosure/ui/CollapsibleSection.js +60 -0
  188. package/lib/disclosure/ui/CollapsibleSection.js.map +1 -0
  189. package/lib/disclosure/ui/index.d.ts +5 -0
  190. package/lib/disclosure/ui/index.d.ts.map +1 -0
  191. package/lib/disclosure/ui/index.js +3 -0
  192. package/lib/disclosure/ui/index.js.map +1 -0
  193. package/lib/disclosure/ui/useDisclosure.d.ts +22 -0
  194. package/lib/disclosure/ui/useDisclosure.d.ts.map +1 -0
  195. package/lib/disclosure/ui/useDisclosure.js +18 -0
  196. package/lib/disclosure/ui/useDisclosure.js.map +1 -0
  197. package/lib/download/core/downloadBlob.d.ts +10 -0
  198. package/lib/download/core/downloadBlob.d.ts.map +1 -0
  199. package/lib/download/core/downloadBlob.js +20 -0
  200. package/lib/download/core/downloadBlob.js.map +1 -0
  201. package/lib/download/core/downloadText.d.ts +9 -0
  202. package/lib/download/core/downloadText.d.ts.map +1 -0
  203. package/lib/download/core/downloadText.js +14 -0
  204. package/lib/download/core/downloadText.js.map +1 -0
  205. package/lib/download/core/index.d.ts +4 -0
  206. package/lib/download/core/index.d.ts.map +1 -0
  207. package/lib/download/core/index.js +4 -0
  208. package/lib/download/core/index.js.map +1 -0
  209. package/lib/download/core/sanitizeFileName.d.ts +15 -0
  210. package/lib/download/core/sanitizeFileName.d.ts.map +1 -0
  211. package/lib/download/core/sanitizeFileName.js +33 -0
  212. package/lib/download/core/sanitizeFileName.js.map +1 -0
  213. package/lib/ecosystem/core/index.d.ts +3 -0
  214. package/lib/ecosystem/core/index.d.ts.map +1 -1
  215. package/lib/ecosystem/core/index.js +3 -0
  216. package/lib/ecosystem/core/index.js.map +1 -1
  217. package/lib/ecosystem/core/links.d.ts +11 -0
  218. package/lib/ecosystem/core/links.d.ts.map +1 -0
  219. package/lib/ecosystem/core/links.js +28 -0
  220. package/lib/ecosystem/core/links.js.map +1 -0
  221. package/lib/ecosystem/core/lookup.d.ts +32 -0
  222. package/lib/ecosystem/core/lookup.d.ts.map +1 -0
  223. package/lib/ecosystem/core/lookup.js +55 -0
  224. package/lib/ecosystem/core/lookup.js.map +1 -0
  225. package/lib/ecosystem/core/sites.d.ts +3 -1
  226. package/lib/ecosystem/core/sites.d.ts.map +1 -1
  227. package/lib/ecosystem/core/sites.js +18 -3
  228. package/lib/ecosystem/core/sites.js.map +1 -1
  229. package/lib/ecosystem/core/tokens.d.ts +21 -0
  230. package/lib/ecosystem/core/tokens.d.ts.map +1 -0
  231. package/lib/ecosystem/core/tokens.js +42 -0
  232. package/lib/ecosystem/core/tokens.js.map +1 -0
  233. package/lib/ecosystem/ui/SiteTheme.d.ts +18 -0
  234. package/lib/ecosystem/ui/SiteTheme.d.ts.map +1 -0
  235. package/lib/ecosystem/ui/SiteTheme.js +16 -0
  236. package/lib/ecosystem/ui/SiteTheme.js.map +1 -0
  237. package/lib/ecosystem/ui/Wordmark.d.ts +30 -0
  238. package/lib/ecosystem/ui/Wordmark.d.ts.map +1 -0
  239. package/lib/ecosystem/ui/Wordmark.js +26 -0
  240. package/lib/ecosystem/ui/Wordmark.js.map +1 -0
  241. package/lib/ecosystem/ui/glyphs.js +1 -1
  242. package/lib/ecosystem/ui/glyphs.js.map +1 -1
  243. package/lib/ecosystem/ui/index.d.ts +4 -0
  244. package/lib/ecosystem/ui/index.d.ts.map +1 -1
  245. package/lib/ecosystem/ui/index.js +2 -0
  246. package/lib/ecosystem/ui/index.js.map +1 -1
  247. package/lib/ecosystem/ui/marks.d.ts +30 -4
  248. package/lib/ecosystem/ui/marks.d.ts.map +1 -1
  249. package/lib/ecosystem/ui/marks.js +13 -3
  250. package/lib/ecosystem/ui/marks.js.map +1 -1
  251. package/lib/error/ui/ErrorBoundary.d.ts +60 -0
  252. package/lib/error/ui/ErrorBoundary.d.ts.map +1 -0
  253. package/lib/error/ui/ErrorBoundary.js +59 -0
  254. package/lib/error/ui/ErrorBoundary.js.map +1 -0
  255. package/lib/error/ui/ErrorFallback.d.ts +38 -0
  256. package/lib/error/ui/ErrorFallback.d.ts.map +1 -0
  257. package/lib/error/ui/ErrorFallback.js +16 -0
  258. package/lib/error/ui/ErrorFallback.js.map +1 -0
  259. package/lib/error/ui/index.d.ts +5 -0
  260. package/lib/error/ui/index.d.ts.map +1 -0
  261. package/lib/error/ui/index.js +3 -0
  262. package/lib/error/ui/index.js.map +1 -0
  263. package/lib/error/ui/toError.d.ts +11 -0
  264. package/lib/error/ui/toError.d.ts.map +1 -0
  265. package/lib/error/ui/toError.js +35 -0
  266. package/lib/error/ui/toError.js.map +1 -0
  267. package/lib/format/core/index.d.ts +5 -0
  268. package/lib/format/core/index.d.ts.map +1 -0
  269. package/lib/format/core/index.js +5 -0
  270. package/lib/format/core/index.js.map +1 -0
  271. package/lib/format/core/missing.d.ts +7 -0
  272. package/lib/format/core/missing.d.ts.map +1 -0
  273. package/lib/format/core/missing.js +7 -0
  274. package/lib/format/core/missing.js.map +1 -0
  275. package/lib/format/core/numbers.d.ts +40 -0
  276. package/lib/format/core/numbers.d.ts.map +1 -0
  277. package/lib/format/core/numbers.js +81 -0
  278. package/lib/format/core/numbers.js.map +1 -0
  279. package/lib/format/core/units.d.ts +17 -0
  280. package/lib/format/core/units.d.ts.map +1 -0
  281. package/lib/format/core/units.js +54 -0
  282. package/lib/format/core/units.js.map +1 -0
  283. package/lib/format/core/words.d.ts +12 -0
  284. package/lib/format/core/words.d.ts.map +1 -0
  285. package/lib/format/core/words.js +14 -0
  286. package/lib/format/core/words.js.map +1 -0
  287. package/lib/help/ui/HelpBody.d.ts +57 -0
  288. package/lib/help/ui/HelpBody.d.ts.map +1 -0
  289. package/lib/help/ui/HelpBody.js +44 -0
  290. package/lib/help/ui/HelpBody.js.map +1 -0
  291. package/lib/help/ui/HelpIcon.d.ts +33 -0
  292. package/lib/help/ui/HelpIcon.d.ts.map +1 -0
  293. package/lib/help/ui/HelpIcon.js +16 -0
  294. package/lib/help/ui/HelpIcon.js.map +1 -0
  295. package/lib/help/ui/HelpToolbarButton.d.ts +45 -0
  296. package/lib/help/ui/HelpToolbarButton.d.ts.map +1 -0
  297. package/lib/help/ui/HelpToolbarButton.js +17 -0
  298. package/lib/help/ui/HelpToolbarButton.js.map +1 -0
  299. package/lib/help/ui/HelpTooltip.d.ts +36 -0
  300. package/lib/help/ui/HelpTooltip.d.ts.map +1 -0
  301. package/lib/help/ui/HelpTooltip.js +24 -0
  302. package/lib/help/ui/HelpTooltip.js.map +1 -0
  303. package/lib/help/ui/index.d.ts +9 -0
  304. package/lib/help/ui/index.d.ts.map +1 -0
  305. package/lib/help/ui/index.js +5 -0
  306. package/lib/help/ui/index.js.map +1 -0
  307. package/lib/hooks/ui/index.d.ts +7 -0
  308. package/lib/hooks/ui/index.d.ts.map +1 -0
  309. package/lib/hooks/ui/index.js +5 -0
  310. package/lib/hooks/ui/index.js.map +1 -0
  311. package/lib/hooks/ui/listNavigation.d.ts +54 -0
  312. package/lib/hooks/ui/listNavigation.d.ts.map +1 -0
  313. package/lib/hooks/ui/listNavigation.js +77 -0
  314. package/lib/hooks/ui/listNavigation.js.map +1 -0
  315. package/lib/hooks/ui/useContainerSize.d.ts +15 -0
  316. package/lib/hooks/ui/useContainerSize.d.ts.map +1 -0
  317. package/lib/hooks/ui/useContainerSize.js +24 -0
  318. package/lib/hooks/ui/useContainerSize.js.map +1 -0
  319. package/lib/hooks/ui/useDebouncedValue.d.ts +12 -0
  320. package/lib/hooks/ui/useDebouncedValue.d.ts.map +1 -0
  321. package/lib/hooks/ui/useDebouncedValue.js +24 -0
  322. package/lib/hooks/ui/useDebouncedValue.js.map +1 -0
  323. package/lib/hooks/ui/useListKeyboardNavigation.d.ts +17 -0
  324. package/lib/hooks/ui/useListKeyboardNavigation.d.ts.map +1 -0
  325. package/lib/hooks/ui/useListKeyboardNavigation.js +25 -0
  326. package/lib/hooks/ui/useListKeyboardNavigation.js.map +1 -0
  327. package/lib/hooks/ui/useResizeObserver.d.ts +20 -0
  328. package/lib/hooks/ui/useResizeObserver.d.ts.map +1 -0
  329. package/lib/hooks/ui/useResizeObserver.js +37 -0
  330. package/lib/hooks/ui/useResizeObserver.js.map +1 -0
  331. package/lib/orbital/core/atomicGrid.d.ts +27 -0
  332. package/lib/orbital/core/atomicGrid.d.ts.map +1 -1
  333. package/lib/orbital/core/atomicGrid.js +37 -1
  334. package/lib/orbital/core/atomicGrid.js.map +1 -1
  335. package/lib/orbital/core/index.d.ts +9 -7
  336. package/lib/orbital/core/index.d.ts.map +1 -1
  337. package/lib/orbital/core/index.js +7 -6
  338. package/lib/orbital/core/index.js.map +1 -1
  339. package/lib/orbital/core/isovalue.d.ts +60 -0
  340. package/lib/orbital/core/isovalue.d.ts.map +1 -0
  341. package/lib/orbital/core/isovalue.js +128 -0
  342. package/lib/orbital/core/isovalue.js.map +1 -0
  343. package/lib/orbital/core/sample.d.ts +15 -1
  344. package/lib/orbital/core/sample.d.ts.map +1 -1
  345. package/lib/orbital/core/sample.js +10 -3
  346. package/lib/orbital/core/sample.js.map +1 -1
  347. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +6 -1
  348. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -1
  349. package/lib/orbital/ui/AtomicOrbitalCanvas.js +12 -2
  350. package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -1
  351. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +5 -1
  352. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -1
  353. package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -1
  354. package/lib/orbital/ui/renderVolume.d.ts +6 -3
  355. package/lib/orbital/ui/renderVolume.d.ts.map +1 -1
  356. package/lib/orbital/ui/renderVolume.js +14 -15
  357. package/lib/orbital/ui/renderVolume.js.map +1 -1
  358. package/lib/orbital/ui/viewer.d.ts +3 -1
  359. package/lib/orbital/ui/viewer.d.ts.map +1 -1
  360. package/lib/orbital/ui/viewer.js +3 -2
  361. package/lib/orbital/ui/viewer.js.map +1 -1
  362. package/lib/orbital/ui/volumeField.d.ts +5 -21
  363. package/lib/orbital/ui/volumeField.d.ts.map +1 -1
  364. package/lib/orbital/ui/volumeField.js +5 -45
  365. package/lib/orbital/ui/volumeField.js.map +1 -1
  366. package/lib/pedagogy/core/glossary.d.ts +79 -0
  367. package/lib/pedagogy/core/glossary.d.ts.map +1 -0
  368. package/lib/pedagogy/core/glossary.js +71 -0
  369. package/lib/pedagogy/core/glossary.js.map +1 -0
  370. package/lib/pedagogy/core/index.d.ts +8 -0
  371. package/lib/pedagogy/core/index.d.ts.map +1 -0
  372. package/lib/pedagogy/core/index.js +4 -0
  373. package/lib/pedagogy/core/index.js.map +1 -0
  374. package/lib/pedagogy/core/jsonStorage.d.ts +21 -0
  375. package/lib/pedagogy/core/jsonStorage.d.ts.map +1 -0
  376. package/lib/pedagogy/core/jsonStorage.js +55 -0
  377. package/lib/pedagogy/core/jsonStorage.js.map +1 -0
  378. package/lib/pedagogy/core/progress.d.ts +116 -0
  379. package/lib/pedagogy/core/progress.d.ts.map +1 -0
  380. package/lib/pedagogy/core/progress.js +122 -0
  381. package/lib/pedagogy/core/progress.js.map +1 -0
  382. package/lib/pedagogy/core/types.d.ts +74 -0
  383. package/lib/pedagogy/core/types.d.ts.map +1 -0
  384. package/lib/pedagogy/core/types.js +8 -0
  385. package/lib/pedagogy/core/types.js.map +1 -0
  386. package/lib/pedagogy/core/validation.d.ts +79 -0
  387. package/lib/pedagogy/core/validation.d.ts.map +1 -0
  388. package/lib/pedagogy/core/validation.js +47 -0
  389. package/lib/pedagogy/core/validation.js.map +1 -0
  390. package/lib/pedagogy/ui/ExerciseActions.d.ts +74 -0
  391. package/lib/pedagogy/ui/ExerciseActions.d.ts.map +1 -0
  392. package/lib/pedagogy/ui/ExerciseActions.js +22 -0
  393. package/lib/pedagogy/ui/ExerciseActions.js.map +1 -0
  394. package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts +43 -0
  395. package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts.map +1 -0
  396. package/lib/pedagogy/ui/ExerciseProgressHeader.js +43 -0
  397. package/lib/pedagogy/ui/ExerciseProgressHeader.js.map +1 -0
  398. package/lib/pedagogy/ui/ExerciseTags.d.ts +49 -0
  399. package/lib/pedagogy/ui/ExerciseTags.d.ts.map +1 -0
  400. package/lib/pedagogy/ui/ExerciseTags.js +22 -0
  401. package/lib/pedagogy/ui/ExerciseTags.js.map +1 -0
  402. package/lib/pedagogy/ui/GlossaryProvider.d.ts +19 -0
  403. package/lib/pedagogy/ui/GlossaryProvider.d.ts.map +1 -0
  404. package/lib/pedagogy/ui/GlossaryProvider.js +16 -0
  405. package/lib/pedagogy/ui/GlossaryProvider.js.map +1 -0
  406. package/lib/pedagogy/ui/GlossaryText.d.ts +50 -0
  407. package/lib/pedagogy/ui/GlossaryText.d.ts.map +1 -0
  408. package/lib/pedagogy/ui/GlossaryText.js +79 -0
  409. package/lib/pedagogy/ui/GlossaryText.js.map +1 -0
  410. package/lib/pedagogy/ui/HintLadder.d.ts +38 -0
  411. package/lib/pedagogy/ui/HintLadder.d.ts.map +1 -0
  412. package/lib/pedagogy/ui/HintLadder.js +33 -0
  413. package/lib/pedagogy/ui/HintLadder.js.map +1 -0
  414. package/lib/pedagogy/ui/ReferenceGrid.d.ts +31 -0
  415. package/lib/pedagogy/ui/ReferenceGrid.d.ts.map +1 -0
  416. package/lib/pedagogy/ui/ReferenceGrid.js +25 -0
  417. package/lib/pedagogy/ui/ReferenceGrid.js.map +1 -0
  418. package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts +64 -0
  419. package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts.map +1 -0
  420. package/lib/pedagogy/ui/ReferenceSectionBlock.js +78 -0
  421. package/lib/pedagogy/ui/ReferenceSectionBlock.js.map +1 -0
  422. package/lib/pedagogy/ui/SyntaxTooltip.d.ts +94 -0
  423. package/lib/pedagogy/ui/SyntaxTooltip.d.ts.map +1 -0
  424. package/lib/pedagogy/ui/SyntaxTooltip.js +79 -0
  425. package/lib/pedagogy/ui/SyntaxTooltip.js.map +1 -0
  426. package/lib/pedagogy/ui/TestCaseList.d.ts +35 -0
  427. package/lib/pedagogy/ui/TestCaseList.d.ts.map +1 -0
  428. package/lib/pedagogy/ui/TestCaseList.js +63 -0
  429. package/lib/pedagogy/ui/TestCaseList.js.map +1 -0
  430. package/lib/pedagogy/ui/TutorialStepStrip.d.ts +42 -0
  431. package/lib/pedagogy/ui/TutorialStepStrip.d.ts.map +1 -0
  432. package/lib/pedagogy/ui/TutorialStepStrip.js +98 -0
  433. package/lib/pedagogy/ui/TutorialStepStrip.js.map +1 -0
  434. package/lib/pedagogy/ui/exerciseMeta.d.ts +24 -0
  435. package/lib/pedagogy/ui/exerciseMeta.d.ts.map +1 -0
  436. package/lib/pedagogy/ui/exerciseMeta.js +38 -0
  437. package/lib/pedagogy/ui/exerciseMeta.js.map +1 -0
  438. package/lib/pedagogy/ui/glossaryContext.d.ts +17 -0
  439. package/lib/pedagogy/ui/glossaryContext.d.ts.map +1 -0
  440. package/lib/pedagogy/ui/glossaryContext.js +19 -0
  441. package/lib/pedagogy/ui/glossaryContext.js.map +1 -0
  442. package/lib/pedagogy/ui/index.d.ts +27 -0
  443. package/lib/pedagogy/ui/index.d.ts.map +1 -0
  444. package/lib/pedagogy/ui/index.js +15 -0
  445. package/lib/pedagogy/ui/index.js.map +1 -0
  446. package/lib/pedagogy/ui/tutorialLevels.d.ts +18 -0
  447. package/lib/pedagogy/ui/tutorialLevels.d.ts.map +1 -0
  448. package/lib/pedagogy/ui/tutorialLevels.js +14 -0
  449. package/lib/pedagogy/ui/tutorialLevels.js.map +1 -0
  450. package/lib/router/core/address.d.ts +42 -0
  451. package/lib/router/core/address.d.ts.map +1 -0
  452. package/lib/router/core/address.js +64 -0
  453. package/lib/router/core/address.js.map +1 -0
  454. package/lib/router/core/basePath.d.ts +49 -0
  455. package/lib/router/core/basePath.d.ts.map +1 -0
  456. package/lib/router/core/basePath.js +78 -0
  457. package/lib/router/core/basePath.js.map +1 -0
  458. package/lib/router/core/index.d.ts +8 -0
  459. package/lib/router/core/index.d.ts.map +1 -0
  460. package/lib/router/core/index.js +5 -0
  461. package/lib/router/core/index.js.map +1 -0
  462. package/lib/router/core/legacyHash.d.ts +45 -0
  463. package/lib/router/core/legacyHash.d.ts.map +1 -0
  464. package/lib/router/core/legacyHash.js +50 -0
  465. package/lib/router/core/legacyHash.js.map +1 -0
  466. package/lib/router/core/pageAddresses.d.ts +50 -0
  467. package/lib/router/core/pageAddresses.d.ts.map +1 -0
  468. package/lib/router/core/pageAddresses.js +56 -0
  469. package/lib/router/core/pageAddresses.js.map +1 -0
  470. package/lib/router/core/query.d.ts +41 -0
  471. package/lib/router/core/query.d.ts.map +1 -0
  472. package/lib/router/core/query.js +64 -0
  473. package/lib/router/core/query.js.map +1 -0
  474. package/lib/router/core/tabRouter.d.ts +111 -0
  475. package/lib/router/core/tabRouter.d.ts.map +1 -0
  476. package/lib/router/core/tabRouter.js +87 -0
  477. package/lib/router/core/tabRouter.js.map +1 -0
  478. package/lib/seo/core/documentMeta.d.ts +45 -0
  479. package/lib/seo/core/documentMeta.d.ts.map +1 -0
  480. package/lib/seo/core/documentMeta.js +69 -0
  481. package/lib/seo/core/documentMeta.js.map +1 -0
  482. package/lib/seo/core/index.d.ts +9 -0
  483. package/lib/seo/core/index.d.ts.map +1 -0
  484. package/lib/seo/core/index.js +5 -0
  485. package/lib/seo/core/index.js.map +1 -0
  486. package/lib/seo/core/pageMeta.d.ts +60 -0
  487. package/lib/seo/core/pageMeta.d.ts.map +1 -0
  488. package/lib/seo/core/pageMeta.js +91 -0
  489. package/lib/seo/core/pageMeta.js.map +1 -0
  490. package/lib/seo/core/routes.d.ts +52 -0
  491. package/lib/seo/core/routes.d.ts.map +1 -0
  492. package/lib/seo/core/routes.js +62 -0
  493. package/lib/seo/core/routes.js.map +1 -0
  494. package/lib/seo/core/siteFiles.d.ts +73 -0
  495. package/lib/seo/core/siteFiles.d.ts.map +1 -0
  496. package/lib/seo/core/siteFiles.js +100 -0
  497. package/lib/seo/core/siteFiles.js.map +1 -0
  498. package/lib/seo/vite/index.d.ts +5 -0
  499. package/lib/seo/vite/index.d.ts.map +1 -0
  500. package/lib/seo/vite/index.js +3 -0
  501. package/lib/seo/vite/index.js.map +1 -0
  502. package/lib/seo/vite/ogCard.d.ts +33 -0
  503. package/lib/seo/vite/ogCard.d.ts.map +1 -0
  504. package/lib/seo/vite/ogCard.js +72 -0
  505. package/lib/seo/vite/ogCard.js.map +1 -0
  506. package/lib/seo/vite/prerender.d.ts +58 -0
  507. package/lib/seo/vite/prerender.d.ts.map +1 -0
  508. package/lib/seo/vite/prerender.js +76 -0
  509. package/lib/seo/vite/prerender.js.map +1 -0
  510. package/lib/share/core/config.d.ts +63 -0
  511. package/lib/share/core/config.d.ts.map +1 -0
  512. package/lib/share/core/config.js +125 -0
  513. package/lib/share/core/config.js.map +1 -0
  514. package/lib/share/core/escape.d.ts +15 -0
  515. package/lib/share/core/escape.d.ts.map +1 -0
  516. package/lib/share/core/escape.js +22 -0
  517. package/lib/share/core/escape.js.map +1 -0
  518. package/lib/share/core/index.d.ts +9 -0
  519. package/lib/share/core/index.d.ts.map +1 -0
  520. package/lib/share/core/index.js +5 -0
  521. package/lib/share/core/index.js.map +1 -0
  522. package/lib/share/core/params.d.ts +93 -0
  523. package/lib/share/core/params.d.ts.map +1 -0
  524. package/lib/share/core/params.js +111 -0
  525. package/lib/share/core/params.js.map +1 -0
  526. package/lib/share/core/query.d.ts +30 -0
  527. package/lib/share/core/query.d.ts.map +1 -0
  528. package/lib/share/core/query.js +68 -0
  529. package/lib/share/core/query.js.map +1 -0
  530. package/lib/share/core/url.d.ts +57 -0
  531. package/lib/share/core/url.d.ts.map +1 -0
  532. package/lib/share/core/url.js +49 -0
  533. package/lib/share/core/url.js.map +1 -0
  534. package/lib/share/core/vocabulary.d.ts +51 -0
  535. package/lib/share/core/vocabulary.d.ts.map +1 -0
  536. package/lib/share/core/vocabulary.js +2 -0
  537. package/lib/share/core/vocabulary.js.map +1 -0
  538. package/lib/share/ui/HiddenPartsProvider.d.ts +19 -0
  539. package/lib/share/ui/HiddenPartsProvider.d.ts.map +1 -0
  540. package/lib/share/ui/HiddenPartsProvider.js +15 -0
  541. package/lib/share/ui/HiddenPartsProvider.js.map +1 -0
  542. package/lib/share/ui/PagePart.d.ts +18 -0
  543. package/lib/share/ui/PagePart.d.ts.map +1 -0
  544. package/lib/share/ui/PagePart.js +16 -0
  545. package/lib/share/ui/PagePart.js.map +1 -0
  546. package/lib/share/ui/ShareButton.d.ts +42 -0
  547. package/lib/share/ui/ShareButton.d.ts.map +1 -0
  548. package/lib/share/ui/ShareButton.js +18 -0
  549. package/lib/share/ui/ShareButton.js.map +1 -0
  550. package/lib/share/ui/ShareDialog.d.ts +73 -0
  551. package/lib/share/ui/ShareDialog.d.ts.map +1 -0
  552. package/lib/share/ui/ShareDialog.js +19 -0
  553. package/lib/share/ui/ShareDialog.js.map +1 -0
  554. package/lib/share/ui/ShareDialogContent.d.ts +13 -0
  555. package/lib/share/ui/ShareDialogContent.d.ts.map +1 -0
  556. package/lib/share/ui/ShareDialogContent.js +71 -0
  557. package/lib/share/ui/ShareDialogContent.js.map +1 -0
  558. package/lib/share/ui/SharePartOptions.d.ts +18 -0
  559. package/lib/share/ui/SharePartOptions.d.ts.map +1 -0
  560. package/lib/share/ui/SharePartOptions.js +22 -0
  561. package/lib/share/ui/SharePartOptions.js.map +1 -0
  562. package/lib/share/ui/draft.d.ts +13 -0
  563. package/lib/share/ui/draft.d.ts.map +1 -0
  564. package/lib/share/ui/draft.js +16 -0
  565. package/lib/share/ui/draft.js.map +1 -0
  566. package/lib/share/ui/hiddenParts.d.ts +17 -0
  567. package/lib/share/ui/hiddenParts.d.ts.map +1 -0
  568. package/lib/share/ui/hiddenParts.js +21 -0
  569. package/lib/share/ui/hiddenParts.js.map +1 -0
  570. package/lib/share/ui/index.d.ts +10 -0
  571. package/lib/share/ui/index.d.ts.map +1 -0
  572. package/lib/share/ui/index.js +6 -0
  573. package/lib/share/ui/index.js.map +1 -0
  574. package/lib/shared/ui/index.d.ts +2 -1
  575. package/lib/shared/ui/index.d.ts.map +1 -1
  576. package/lib/shared/ui/index.js +1 -1
  577. package/lib/shared/ui/index.js.map +1 -1
  578. package/lib/state/ui/index.d.ts +3 -0
  579. package/lib/state/ui/index.d.ts.map +1 -0
  580. package/lib/state/ui/index.js +2 -0
  581. package/lib/state/ui/index.js.map +1 -0
  582. package/lib/state/ui/mergeStored.d.ts +27 -0
  583. package/lib/state/ui/mergeStored.d.ts.map +1 -0
  584. package/lib/state/ui/mergeStored.js +82 -0
  585. package/lib/state/ui/mergeStored.js.map +1 -0
  586. package/lib/state/ui/persistBucket.d.ts +65 -0
  587. package/lib/state/ui/persistBucket.d.ts.map +1 -0
  588. package/lib/state/ui/persistBucket.js +90 -0
  589. package/lib/state/ui/persistBucket.js.map +1 -0
  590. package/lib/structure/core/editorValue.d.ts +69 -0
  591. package/lib/structure/core/editorValue.d.ts.map +1 -0
  592. package/lib/structure/core/editorValue.js +72 -0
  593. package/lib/structure/core/editorValue.js.map +1 -0
  594. package/lib/structure/core/fragmentQuery.d.ts +33 -0
  595. package/lib/structure/core/fragmentQuery.d.ts.map +1 -0
  596. package/lib/structure/core/fragmentQuery.js +37 -0
  597. package/lib/structure/core/fragmentQuery.js.map +1 -0
  598. package/lib/structure/core/index.d.ts +11 -0
  599. package/lib/structure/core/index.d.ts.map +1 -0
  600. package/lib/structure/core/index.js +6 -0
  601. package/lib/structure/core/index.js.map +1 -0
  602. package/lib/structure/core/molfile.d.ts +42 -0
  603. package/lib/structure/core/molfile.d.ts.map +1 -0
  604. package/lib/structure/core/molfile.js +74 -0
  605. package/lib/structure/core/molfile.js.map +1 -0
  606. package/lib/structure/core/readStructure.d.ts +37 -0
  607. package/lib/structure/core/readStructure.d.ts.map +1 -0
  608. package/lib/structure/core/readStructure.js +59 -0
  609. package/lib/structure/core/readStructure.js.map +1 -0
  610. package/lib/structure/core/structureSource.d.ts +34 -0
  611. package/lib/structure/core/structureSource.d.ts.map +1 -0
  612. package/lib/structure/core/structureSource.js +32 -0
  613. package/lib/structure/core/structureSource.js.map +1 -0
  614. package/lib/structure/core/toolbarFloor.d.ts +16 -0
  615. package/lib/structure/core/toolbarFloor.d.ts.map +1 -0
  616. package/lib/structure/core/toolbarFloor.js +27 -0
  617. package/lib/structure/core/toolbarFloor.js.map +1 -0
  618. package/lib/structure/ui/EditorCanvas.d.ts +55 -0
  619. package/lib/structure/ui/EditorCanvas.d.ts.map +1 -0
  620. package/lib/structure/ui/EditorCanvas.js +41 -0
  621. package/lib/structure/ui/EditorCanvas.js.map +1 -0
  622. package/lib/structure/ui/Structure.d.ts +122 -0
  623. package/lib/structure/ui/Structure.d.ts.map +1 -0
  624. package/lib/structure/ui/Structure.js +28 -0
  625. package/lib/structure/ui/Structure.js.map +1 -0
  626. package/lib/structure/ui/StructureEditor.d.ts +75 -0
  627. package/lib/structure/ui/StructureEditor.d.ts.map +1 -0
  628. package/lib/structure/ui/StructureEditor.js +83 -0
  629. package/lib/structure/ui/StructureEditor.js.map +1 -0
  630. package/lib/structure/ui/StructurePlaceholder.d.ts +29 -0
  631. package/lib/structure/ui/StructurePlaceholder.d.ts.map +1 -0
  632. package/lib/structure/ui/StructurePlaceholder.js +19 -0
  633. package/lib/structure/ui/StructurePlaceholder.js.map +1 -0
  634. package/lib/structure/ui/StructureSvg.d.ts +58 -0
  635. package/lib/structure/ui/StructureSvg.d.ts.map +1 -0
  636. package/lib/structure/ui/StructureSvg.js +33 -0
  637. package/lib/structure/ui/StructureSvg.js.map +1 -0
  638. package/lib/structure/ui/index.d.ts +19 -0
  639. package/lib/structure/ui/index.d.ts.map +1 -0
  640. package/lib/structure/ui/index.js +15 -0
  641. package/lib/structure/ui/index.js.map +1 -0
  642. package/lib/structure/ui/useToolbarFloor.d.ts +26 -0
  643. package/lib/structure/ui/useToolbarFloor.d.ts.map +1 -0
  644. package/lib/structure/ui/useToolbarFloor.js +70 -0
  645. package/lib/structure/ui/useToolbarFloor.js.map +1 -0
  646. package/lib/structure.d.ts +3 -0
  647. package/lib/structure.d.ts.map +1 -0
  648. package/lib/structure.js +3 -0
  649. package/lib/structure.js.map +1 -0
  650. package/lib/ui.d.ts +13 -0
  651. package/lib/ui.d.ts.map +1 -1
  652. package/lib/ui.js +13 -0
  653. package/lib/ui.js.map +1 -1
  654. package/lib/vite.d.ts +2 -0
  655. package/lib/vite.d.ts.map +1 -0
  656. package/lib/vite.js +2 -0
  657. package/lib/vite.js.map +1 -0
  658. package/lib/worker/core/errors.d.ts +15 -0
  659. package/lib/worker/core/errors.d.ts.map +1 -0
  660. package/lib/worker/core/errors.js +15 -0
  661. package/lib/worker/core/errors.js.map +1 -0
  662. package/lib/worker/core/index.d.ts +5 -0
  663. package/lib/worker/core/index.d.ts.map +1 -0
  664. package/lib/worker/core/index.js +3 -0
  665. package/lib/worker/core/index.js.map +1 -0
  666. package/lib/worker/core/messages.d.ts +48 -0
  667. package/lib/worker/core/messages.d.ts.map +1 -0
  668. package/lib/worker/core/messages.js +2 -0
  669. package/lib/worker/core/messages.js.map +1 -0
  670. package/lib/worker/core/workerChannel.d.ts +69 -0
  671. package/lib/worker/core/workerChannel.d.ts.map +1 -0
  672. package/lib/worker/core/workerChannel.js +121 -0
  673. package/lib/worker/core/workerChannel.js.map +1 -0
  674. package/package.json +22 -4
  675. package/src/capsule/ui/CapsuleFilter.tsx +119 -0
  676. package/src/capsule/ui/index.ts +2 -0
  677. package/src/chrome/ui/NavLink.tsx +88 -0
  678. package/src/chrome/ui/NavMenuButton.tsx +95 -0
  679. package/src/chrome/ui/SiteFooter.tsx +65 -0
  680. package/src/chrome/ui/SiteHeader.tsx +119 -0
  681. package/src/chrome/ui/index.ts +11 -0
  682. package/src/chrome/ui/navItem.ts +60 -0
  683. package/src/chrome/ui/useCompactHeader.ts +81 -0
  684. package/src/citation/core/clipboard.ts +27 -11
  685. package/src/citation/core/download.ts +25 -15
  686. package/src/citation/core/index.ts +8 -3
  687. package/src/citation/core/works.ts +81 -0
  688. package/src/citation/ui/CitationMenu.tsx +104 -89
  689. package/src/citation/ui/CitationPreview.tsx +18 -8
  690. package/src/citation/ui/CiteButton.tsx +24 -9
  691. package/src/citation/ui/CopyFormatEntries.tsx +84 -0
  692. package/src/citation/ui/WorkEntry.tsx +80 -0
  693. package/src/citation/ui/entries.tsx +18 -20
  694. package/src/citation/ui/index.ts +10 -2
  695. package/src/citation/ui/useCopyFeedback.ts +76 -0
  696. package/src/clipboard/core/index.ts +1 -0
  697. package/src/clipboard/core/writeToClipboard.ts +47 -0
  698. package/src/clipboard/ui/CodeBlock.tsx +110 -0
  699. package/src/clipboard/ui/CopyButton.tsx +111 -0
  700. package/src/clipboard/ui/index.ts +9 -0
  701. package/src/clipboard/ui/useCopyToClipboard.ts +57 -0
  702. package/src/color/core/contrast.ts +85 -0
  703. package/src/color/core/hex.ts +57 -0
  704. package/src/color/core/index.ts +4 -0
  705. package/src/color/core/scale.ts +132 -0
  706. package/src/color/ui/ColorScaleLegend.tsx +144 -0
  707. package/src/color/ui/index.ts +2 -0
  708. package/src/core.ts +11 -0
  709. package/src/credits/core/credits.ts +183 -0
  710. package/src/credits/core/index.ts +2 -0
  711. package/src/credits/ui/CreditsList.tsx +82 -0
  712. package/src/credits/ui/index.ts +2 -0
  713. package/src/delimited/core/delimiters.ts +64 -0
  714. package/src/delimited/core/index.ts +11 -0
  715. package/src/delimited/core/readDelimited.ts +132 -0
  716. package/src/delimited/core/rowsToDelimited.ts +135 -0
  717. package/src/delimited/core/toDelimited.ts +69 -0
  718. package/src/delimited/ui/DelimitedTextDialog.tsx +49 -0
  719. package/src/delimited/ui/DelimitedTextPanel.tsx +161 -0
  720. package/src/delimited/ui/index.ts +4 -0
  721. package/src/disclosure/ui/CollapsibleSection.tsx +150 -0
  722. package/src/disclosure/ui/index.ts +4 -0
  723. package/src/disclosure/ui/useDisclosure.ts +35 -0
  724. package/src/download/core/downloadBlob.ts +19 -0
  725. package/src/download/core/downloadText.ts +19 -0
  726. package/src/download/core/index.ts +3 -0
  727. package/src/download/core/sanitizeFileName.ts +33 -0
  728. package/src/ecosystem/core/index.ts +3 -0
  729. package/src/ecosystem/core/links.ts +29 -0
  730. package/src/ecosystem/core/lookup.ts +57 -0
  731. package/src/ecosystem/core/sites.ts +21 -4
  732. package/src/ecosystem/core/tokens.ts +47 -0
  733. package/src/ecosystem/ui/SiteTheme.tsx +23 -0
  734. package/src/ecosystem/ui/Wordmark.tsx +65 -0
  735. package/src/ecosystem/ui/glyphs.tsx +1 -1
  736. package/src/ecosystem/ui/index.ts +4 -0
  737. package/src/ecosystem/ui/marks.tsx +54 -15
  738. package/src/error/ui/ErrorBoundary.tsx +94 -0
  739. package/src/error/ui/ErrorFallback.tsx +64 -0
  740. package/src/error/ui/index.ts +4 -0
  741. package/src/error/ui/toError.ts +33 -0
  742. package/src/format/core/index.ts +9 -0
  743. package/src/format/core/missing.ts +6 -0
  744. package/src/format/core/numbers.ts +84 -0
  745. package/src/format/core/units.ts +60 -0
  746. package/src/format/core/words.ts +17 -0
  747. package/src/help/ui/HelpBody.tsx +130 -0
  748. package/src/help/ui/HelpIcon.tsx +53 -0
  749. package/src/help/ui/HelpToolbarButton.tsx +72 -0
  750. package/src/help/ui/HelpTooltip.tsx +72 -0
  751. package/src/help/ui/index.ts +8 -0
  752. package/src/hooks/ui/index.ts +6 -0
  753. package/src/hooks/ui/listNavigation.ts +116 -0
  754. package/src/hooks/ui/useContainerSize.ts +32 -0
  755. package/src/hooks/ui/useDebouncedValue.ts +29 -0
  756. package/src/hooks/ui/useListKeyboardNavigation.ts +37 -0
  757. package/src/hooks/ui/useResizeObserver.ts +50 -0
  758. package/src/orbital/core/atomicGrid.ts +53 -1
  759. package/src/orbital/core/index.ts +7 -16
  760. package/src/orbital/core/isovalue.ts +146 -0
  761. package/src/orbital/core/sample.ts +25 -5
  762. package/src/orbital/ui/AtomicOrbitalCanvas.tsx +19 -3
  763. package/src/orbital/ui/AtomicOrbitalViewer.tsx +5 -1
  764. package/src/orbital/ui/renderVolume.ts +29 -16
  765. package/src/orbital/ui/viewer.ts +6 -1
  766. package/src/orbital/ui/volumeField.ts +5 -49
  767. package/src/pedagogy/core/glossary.ts +122 -0
  768. package/src/pedagogy/core/index.ts +28 -0
  769. package/src/pedagogy/core/jsonStorage.ts +51 -0
  770. package/src/pedagogy/core/progress.ts +205 -0
  771. package/src/pedagogy/core/types.ts +78 -0
  772. package/src/pedagogy/core/validation.ts +109 -0
  773. package/src/pedagogy/ui/ExerciseActions.tsx +129 -0
  774. package/src/pedagogy/ui/ExerciseProgressHeader.tsx +135 -0
  775. package/src/pedagogy/ui/ExerciseTags.tsx +85 -0
  776. package/src/pedagogy/ui/GlossaryProvider.tsx +31 -0
  777. package/src/pedagogy/ui/GlossaryText.tsx +164 -0
  778. package/src/pedagogy/ui/HintLadder.tsx +95 -0
  779. package/src/pedagogy/ui/ReferenceGrid.tsx +69 -0
  780. package/src/pedagogy/ui/ReferenceSectionBlock.tsx +175 -0
  781. package/src/pedagogy/ui/SyntaxTooltip.tsx +222 -0
  782. package/src/pedagogy/ui/TestCaseList.tsx +122 -0
  783. package/src/pedagogy/ui/TutorialStepStrip.tsx +230 -0
  784. package/src/pedagogy/ui/exerciseMeta.ts +45 -0
  785. package/src/pedagogy/ui/glossaryContext.ts +23 -0
  786. package/src/pedagogy/ui/index.ts +37 -0
  787. package/src/pedagogy/ui/tutorialLevels.ts +27 -0
  788. package/src/router/core/address.ts +74 -0
  789. package/src/router/core/basePath.ts +76 -0
  790. package/src/router/core/index.ts +26 -0
  791. package/src/router/core/legacyHash.ts +77 -0
  792. package/src/router/core/pageAddresses.ts +106 -0
  793. package/src/router/core/query.ts +87 -0
  794. package/src/router/core/tabRouter.ts +214 -0
  795. package/src/seo/core/documentMeta.ts +92 -0
  796. package/src/seo/core/index.ts +26 -0
  797. package/src/seo/core/pageMeta.ts +127 -0
  798. package/src/seo/core/routes.ts +79 -0
  799. package/src/seo/core/siteFiles.ts +150 -0
  800. package/src/seo/vite/index.ts +4 -0
  801. package/src/seo/vite/ogCard.ts +92 -0
  802. package/src/seo/vite/prerender.ts +156 -0
  803. package/src/share/core/config.ts +165 -0
  804. package/src/share/core/escape.ts +22 -0
  805. package/src/share/core/index.ts +31 -0
  806. package/src/share/core/params.ts +176 -0
  807. package/src/share/core/query.ts +72 -0
  808. package/src/share/core/url.ts +105 -0
  809. package/src/share/core/vocabulary.ts +60 -0
  810. package/src/share/ui/HiddenPartsProvider.tsx +34 -0
  811. package/src/share/ui/PagePart.tsx +26 -0
  812. package/src/share/ui/ShareButton.tsx +84 -0
  813. package/src/share/ui/ShareDialog.tsx +114 -0
  814. package/src/share/ui/ShareDialogContent.tsx +189 -0
  815. package/src/share/ui/SharePartOptions.tsx +51 -0
  816. package/src/share/ui/draft.ts +19 -0
  817. package/src/share/ui/hiddenParts.ts +22 -0
  818. package/src/share/ui/index.ts +9 -0
  819. package/src/shared/ui/index.ts +2 -1
  820. package/src/state/ui/index.ts +6 -0
  821. package/src/state/ui/mergeStored.ts +87 -0
  822. package/src/state/ui/persistBucket.ts +147 -0
  823. package/src/structure/core/editorValue.ts +116 -0
  824. package/src/structure/core/fragmentQuery.ts +50 -0
  825. package/src/structure/core/index.ts +13 -0
  826. package/src/structure/core/molfile.ts +90 -0
  827. package/src/structure/core/readStructure.ts +73 -0
  828. package/src/structure/core/structureSource.ts +57 -0
  829. package/src/structure/core/toolbarFloor.ts +31 -0
  830. package/src/structure/ui/EditorCanvas.tsx +130 -0
  831. package/src/structure/ui/Structure.tsx +183 -0
  832. package/src/structure/ui/StructureEditor.tsx +196 -0
  833. package/src/structure/ui/StructurePlaceholder.tsx +48 -0
  834. package/src/structure/ui/StructureSvg.tsx +110 -0
  835. package/src/structure/ui/index.ts +22 -0
  836. package/src/structure/ui/useToolbarFloor.ts +93 -0
  837. package/src/structure.ts +2 -0
  838. package/src/ui.ts +13 -0
  839. package/src/vite.ts +1 -0
  840. package/src/worker/core/errors.ts +15 -0
  841. package/src/worker/core/index.ts +8 -0
  842. package/src/worker/core/messages.ts +47 -0
  843. package/src/worker/core/workerChannel.ts +218 -0
  844. package/styles/chrome.css +223 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The addresses a site answers, each with the name and the sentence it is
3
+ * indexed under.
4
+ *
5
+ * One table per site, read by three things: the build, which writes an HTML
6
+ * file per entry and the sitemap listing them; the head injector; and the
7
+ * running app, which retitles the tab after an in-app move. A page missing from
8
+ * the table is a page a search engine only ever sees as the home page.
9
+ */
10
+ /** A page, as a crawler and a shared card see it. */
11
+ export interface RouteMeta {
12
+ /** Absolute path, without a trailing slash and without a query string. */
13
+ path: string;
14
+ /** Under ~60 characters: the site name is appended to it. */
15
+ title: string;
16
+ /** One sentence, in the words someone would search for. */
17
+ description: string;
18
+ }
19
+ /**
20
+ * The route an address names.
21
+ * @param routes - Every address the site answers.
22
+ * @param path - Absolute path, without a query string.
23
+ * @returns Its entry, or `undefined` when the site does not know the address.
24
+ */
25
+ export declare function routeFor(routes: readonly RouteMeta[], path: string): RouteMeta | undefined;
26
+ /**
27
+ * The page an address opens.
28
+ *
29
+ * An address the site does not know is described as the home page rather than
30
+ * invented on the fly, which is what the router does with it too. The query
31
+ * string never reaches the answer: the structure being drawn and the
32
+ * configuration a shared link carries are not pages of their own.
33
+ * @param routes - Every address the site answers.
34
+ * @param url - The address, query string and fragment included.
35
+ * @returns The route it is indexed as.
36
+ * @throws {Error} When the table is empty, so there is no page to fall back to.
37
+ */
38
+ export declare function pageMetaFor(routes: readonly RouteMeta[], url: string): RouteMeta;
39
+ /**
40
+ * The page an unknown address falls back to.
41
+ * @param routes - Every address the site answers.
42
+ * @returns The `/` entry, or the first one when the table names no root.
43
+ * @throws {Error} When the table is empty.
44
+ */
45
+ export declare function homeRoute(routes: readonly RouteMeta[]): RouteMeta;
46
+ /**
47
+ * Drop a trailing slash, so `/about/` and `/about` are one page.
48
+ * @param value - A path or an origin.
49
+ * @returns It, without the trailing slash `/` itself keeps.
50
+ */
51
+ export declare function trimTrailingSlash(value: string): string;
52
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/seo/core/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,qDAAqD;AACrD,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,SAAS,CAMvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,GAAG,EAAE,MAAM,GACV,SAAS,CAKX;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAIjE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * The addresses a site answers, each with the name and the sentence it is
3
+ * indexed under.
4
+ *
5
+ * One table per site, read by three things: the build, which writes an HTML
6
+ * file per entry and the sitemap listing them; the head injector; and the
7
+ * running app, which retitles the tab after an in-app move. A page missing from
8
+ * the table is a page a search engine only ever sees as the home page.
9
+ */
10
+ /**
11
+ * The route an address names.
12
+ * @param routes - Every address the site answers.
13
+ * @param path - Absolute path, without a query string.
14
+ * @returns Its entry, or `undefined` when the site does not know the address.
15
+ */
16
+ export function routeFor(routes, path) {
17
+ const wanted = trimTrailingSlash(path) || '/';
18
+ for (const route of routes) {
19
+ if (trimTrailingSlash(route.path) === wanted)
20
+ return route;
21
+ }
22
+ return undefined;
23
+ }
24
+ /**
25
+ * The page an address opens.
26
+ *
27
+ * An address the site does not know is described as the home page rather than
28
+ * invented on the fly, which is what the router does with it too. The query
29
+ * string never reaches the answer: the structure being drawn and the
30
+ * configuration a shared link carries are not pages of their own.
31
+ * @param routes - Every address the site answers.
32
+ * @param url - The address, query string and fragment included.
33
+ * @returns The route it is indexed as.
34
+ * @throws {Error} When the table is empty, so there is no page to fall back to.
35
+ */
36
+ export function pageMetaFor(routes, url) {
37
+ const home = homeRoute(routes);
38
+ const cut = url.search(/[?#]/);
39
+ const path = cut === -1 ? url : url.slice(0, cut);
40
+ return routeFor(routes, path) ?? home;
41
+ }
42
+ /**
43
+ * The page an unknown address falls back to.
44
+ * @param routes - Every address the site answers.
45
+ * @returns The `/` entry, or the first one when the table names no root.
46
+ * @throws {Error} When the table is empty.
47
+ */
48
+ export function homeRoute(routes) {
49
+ const first = routes[0];
50
+ if (first === undefined)
51
+ throw new Error('a site answers at least one route');
52
+ return routeFor(routes, '/') ?? first;
53
+ }
54
+ /**
55
+ * Drop a trailing slash, so `/about/` and `/about` are one page.
56
+ * @param value - A path or an origin.
57
+ * @returns It, without the trailing slash `/` itself keeps.
58
+ */
59
+ export function trimTrailingSlash(value) {
60
+ return value.length > 1 && value.endsWith('/') ? value.slice(0, -1) : value;
61
+ }
62
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/seo/core/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CACtB,MAA4B,EAC5B,IAAY;IAEZ,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;IAC7D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CACzB,MAA4B,EAC5B,GAAW;IAEX,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,MAA4B;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC9E,OAAO,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The files and blocks a crawler reads besides the head: the sitemap, the
3
+ * robots policy, the structured-data block and the list of addresses a visitor
4
+ * without JavaScript can still follow.
5
+ *
6
+ * All four are derived from the site's own record and its route table, so a
7
+ * page added to the table is added to every one of them at once.
8
+ */
9
+ import type { EcosystemSite, SiteId } from '../../ecosystem/core/sites.ts';
10
+ import type { RouteMeta } from './routes.ts';
11
+ /** What a crawler is told about the site as a whole. */
12
+ export interface SiteFilesOptions {
13
+ /** The site, named or passed. */
14
+ site: EcosystemSite | SiteId;
15
+ /** Every address it answers. */
16
+ routes: readonly RouteMeta[];
17
+ /**
18
+ * Origin every absolute address is built on.
19
+ * @default `https://<the site's host>`
20
+ */
21
+ origin?: string;
22
+ }
23
+ /**
24
+ * Every routed address, as the sitemap lists them.
25
+ * @param options - The site and its routes.
26
+ * @returns The `sitemap.xml` document.
27
+ */
28
+ export declare function sitemapXml(options: SiteFilesOptions): string;
29
+ /**
30
+ * The crawl policy.
31
+ *
32
+ * Our tools are meant to be found, so only the endpoints are disallowed — an
33
+ * API prefix and its documentation are not pages. The sitemap is named only
34
+ * because this module also writes it: a `Sitemap:` line pointing at a 404 is
35
+ * reported as an error on every fetch.
36
+ * @param options - The site and its routes.
37
+ * @param disallow - Address prefixes to keep out of the index.
38
+ * @returns The `robots.txt` document.
39
+ */
40
+ export declare function robotsTxt(options: SiteFilesOptions, disallow?: readonly string[]): string;
41
+ /** What the structured-data block says the tool is. */
42
+ export interface StructuredDataOptions extends SiteFilesOptions {
43
+ /**
44
+ * The schema.org application category.
45
+ * @default 'EducationalApplication'
46
+ */
47
+ category?: string;
48
+ /**
49
+ * What the tool needs to run.
50
+ * @default 'Any modern browser'
51
+ */
52
+ operatingSystem?: string;
53
+ }
54
+ /**
55
+ * One `application/ld+json` block describing the tool.
56
+ *
57
+ * It is the same on every page of a site — what varies per page is the head —
58
+ * so it is written into the built page once rather than per route.
59
+ * @param options - The site, and what kind of application it is.
60
+ * @returns The script tag, ready to put in the head.
61
+ */
62
+ export declare function structuredDataScript(options: StructuredDataOptions): string;
63
+ /**
64
+ * A readable page for a visitor, or a crawler, with no JavaScript.
65
+ *
66
+ * The body of our sites is an empty root element, so this is the only crawl
67
+ * path through them that costs nothing to render — and it is honest: it says
68
+ * the tool needs JavaScript, and links every address it answers.
69
+ * @param options - The site and its routes.
70
+ * @returns The `noscript` block, ready to put in the body.
71
+ */
72
+ export declare function noscriptIndex(options: SiteFilesOptions): string;
73
+ //# sourceMappingURL=siteFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siteFiles.d.ts","sourceRoot":"","sources":["../../../src/seo/core/siteFiles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAG3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,IAAI,EAAE,aAAa,GAAG,MAAM,CAAC;IAC7B,gCAAgC;IAChC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAa5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,GAAE,SAAS,MAAM,EAAO,GAC/B,MAAM,CAKR;AAED,uDAAuD;AACvD,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC7D;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAkB3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAe/D"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * The files and blocks a crawler reads besides the head: the sitemap, the
3
+ * robots policy, the structured-data block and the list of addresses a visitor
4
+ * without JavaScript can still follow.
5
+ *
6
+ * All four are derived from the site's own record and its route table, so a
7
+ * page added to the table is added to every one of them at once.
8
+ */
9
+ import { siteById, siteDisplayName } from "../../ecosystem/core/lookup.js";
10
+ import { escapeAttribute, escapeText } from "../../share/core/escape.js";
11
+ import { trimTrailingSlash } from "./routes.js";
12
+ /** The sequence that must not appear raw inside a script element. */
13
+ const SCRIPT_SAFE_LESS_THAN = String.raw `\u003c`;
14
+ /**
15
+ * Every routed address, as the sitemap lists them.
16
+ * @param options - The site and its routes.
17
+ * @returns The `sitemap.xml` document.
18
+ */
19
+ export function sitemapXml(options) {
20
+ const origin = originOf(options);
21
+ const entries = options.routes
22
+ .map((route) => ` <url><loc>${escapeText(`${origin}${route.path}`)}</loc></url>`)
23
+ .join('\n');
24
+ return `<?xml version="1.0" encoding="UTF-8"?>
25
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
26
+ ${entries}
27
+ </urlset>
28
+ `;
29
+ }
30
+ /**
31
+ * The crawl policy.
32
+ *
33
+ * Our tools are meant to be found, so only the endpoints are disallowed — an
34
+ * API prefix and its documentation are not pages. The sitemap is named only
35
+ * because this module also writes it: a `Sitemap:` line pointing at a 404 is
36
+ * reported as an error on every fetch.
37
+ * @param options - The site and its routes.
38
+ * @param disallow - Address prefixes to keep out of the index.
39
+ * @returns The `robots.txt` document.
40
+ */
41
+ export function robotsTxt(options, disallow = []) {
42
+ const lines = ['User-agent: *', 'Allow: /'];
43
+ for (const path of disallow)
44
+ lines.push(`Disallow: ${path}`);
45
+ lines.push('', `Sitemap: ${originOf(options)}/sitemap.xml`, '');
46
+ return lines.join('\n');
47
+ }
48
+ /**
49
+ * One `application/ld+json` block describing the tool.
50
+ *
51
+ * It is the same on every page of a site — what varies per page is the head —
52
+ * so it is written into the built page once rather than per route.
53
+ * @param options - The site, and what kind of application it is.
54
+ * @returns The script tag, ready to put in the head.
55
+ */
56
+ export function structuredDataScript(options) {
57
+ const site = resolveSite(options.site);
58
+ const data = {
59
+ '@context': 'https://schema.org',
60
+ '@type': 'WebApplication',
61
+ name: siteDisplayName(site),
62
+ url: `${originOf(options)}/`,
63
+ description: site.tagline,
64
+ applicationCategory: options.category ?? 'EducationalApplication',
65
+ operatingSystem: options.operatingSystem ?? 'Any modern browser',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ publisher: { '@type': 'Organization', name: 'cheminfo' },
68
+ };
69
+ const json = JSON.stringify(data, null, 2).replaceAll('<', SCRIPT_SAFE_LESS_THAN);
70
+ return `<script type="application/ld+json">\n${json}\n</script>`;
71
+ }
72
+ /**
73
+ * A readable page for a visitor, or a crawler, with no JavaScript.
74
+ *
75
+ * The body of our sites is an empty root element, so this is the only crawl
76
+ * path through them that costs nothing to render — and it is honest: it says
77
+ * the tool needs JavaScript, and links every address it answers.
78
+ * @param options - The site and its routes.
79
+ * @returns The `noscript` block, ready to put in the body.
80
+ */
81
+ export function noscriptIndex(options) {
82
+ const site = resolveSite(options.site);
83
+ const items = options.routes
84
+ .map((route) => ` <li><a href="${escapeAttribute(route.path)}">${escapeText(route.title)}</a></li>`)
85
+ .join('\n');
86
+ return `<noscript>
87
+ <h1>${escapeText(siteDisplayName(site))}</h1>
88
+ <p>${escapeText(site.tagline)} This tool needs JavaScript; these are the pages it offers:</p>
89
+ <ul>
90
+ ${items}
91
+ </ul>
92
+ </noscript>`;
93
+ }
94
+ function resolveSite(site) {
95
+ return typeof site === 'string' ? siteById(site) : site;
96
+ }
97
+ function originOf(options) {
98
+ return trimTrailingSlash(options.origin ?? `https://${resolveSite(options.site).host}`);
99
+ }
100
+ //# sourceMappingURL=siteFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siteFiles.js","sourceRoot":"","sources":["../../../src/seo/core/siteFiles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,qEAAqE;AACrE,MAAM,qBAAqB,GAAG,MAAM,CAAC,GAAG,CAAA,QAAQ,CAAC;AAejD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAyB;IAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM;SAC3B,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CACR,eAAe,UAAU,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,cAAc,CACpE;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;;EAEP,OAAO;;CAER,CAAC;AACF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CACvB,OAAyB,EACzB,WAA8B,EAAE;IAEhC,MAAM,KAAK,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAgBD;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG;QACX,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,gBAAgB;QACzB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;QAC3B,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG;QAC5B,WAAW,EAAE,IAAI,CAAC,OAAO;QACzB,mBAAmB,EAAE,OAAO,CAAC,QAAQ,IAAI,wBAAwB;QACjE,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,oBAAoB;QAChE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE;QAC9D,SAAS,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE;KACzD,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CACnD,GAAG,EACH,qBAAqB,CACtB,CAAC;IACF,OAAO,wCAAwC,IAAI,aAAa,CAAC;AACnE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,OAAyB;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM;SACzB,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CACR,oBAAoB,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CACzF;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;QACD,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;OAClC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;;EAE7B,KAAK;;YAEK,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,IAA4B;IAC/C,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC;AAED,SAAS,QAAQ,CAAC,OAAyB;IACzC,OAAO,iBAAiB,CACtB,OAAO,CAAC,MAAM,IAAI,WAAW,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAC9D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type { OgCardOptions } from './ogCard.ts';
2
+ export { OG_HEIGHT, OG_WIDTH, ogCardHtml } from './ogCard.ts';
3
+ export type { PrerenderOptions } from './prerender.ts';
4
+ export { cheminfoPrerender } from './prerender.ts';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seo/vite/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { OG_HEIGHT, OG_WIDTH, ogCardHtml } from "./ogCard.js";
2
+ export { cheminfoPrerender } from "./prerender.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seo/vite/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The 1200×630 card a link to a site unfurls into, as a page to screenshot.
3
+ *
4
+ * The card is the site's own mark, its two colours and its name, all read from
5
+ * its record — so it is generated rather than hand-drawn. A mark redrawn in the
6
+ * card is a mark that drifts from the one the site shows.
7
+ */
8
+ import type { EcosystemSite, SiteId } from '../../ecosystem/core/sites.ts';
9
+ /** The width every card is drawn at. */
10
+ export declare const OG_WIDTH = 1200;
11
+ /** The height every card is drawn at. */
12
+ export declare const OG_HEIGHT = 630;
13
+ /** What the card says, beyond the site's own name and mark. */
14
+ export interface OgCardOptions {
15
+ /** The site, named or passed. */
16
+ site: EcosystemSite | SiteId;
17
+ /**
18
+ * The sentence under the name.
19
+ * @default the site's tagline
20
+ */
21
+ description?: string;
22
+ }
23
+ /**
24
+ * The card, as a standalone page.
25
+ *
26
+ * Screenshot it at {@link OG_WIDTH} × {@link OG_HEIGHT} — a headless browser is
27
+ * the only thing here that can rasterise it, and every site already has one for
28
+ * its end-to-end tests.
29
+ * @param options - Which site, and what it says.
30
+ * @returns A complete HTML document.
31
+ */
32
+ export declare function ogCardHtml(options: OgCardOptions): string;
33
+ //# sourceMappingURL=ogCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ogCard.d.ts","sourceRoot":"","sources":["../../../src/seo/vite/ogCard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAI3E,wCAAwC;AACxC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAE7B,yCAAyC;AACzC,eAAO,MAAM,SAAS,MAAM,CAAC;AAE7B,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,IAAI,EAAE,aAAa,GAAG,MAAM,CAAC;IAC7B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAiDzD"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * The 1200×630 card a link to a site unfurls into, as a page to screenshot.
3
+ *
4
+ * The card is the site's own mark, its two colours and its name, all read from
5
+ * its record — so it is generated rather than hand-drawn. A mark redrawn in the
6
+ * card is a mark that drifts from the one the site shows.
7
+ */
8
+ import { createElement } from 'react';
9
+ import { renderToStaticMarkup } from 'react-dom/server';
10
+ import { siteById } from "../../ecosystem/core/lookup.js";
11
+ import { SiteMark } from "../../ecosystem/ui/marks.js";
12
+ import { escapeText } from "../../share/core/escape.js";
13
+ /** The width every card is drawn at. */
14
+ export const OG_WIDTH = 1200;
15
+ /** The height every card is drawn at. */
16
+ export const OG_HEIGHT = 630;
17
+ /**
18
+ * The card, as a standalone page.
19
+ *
20
+ * Screenshot it at {@link OG_WIDTH} × {@link OG_HEIGHT} — a headless browser is
21
+ * the only thing here that can rasterise it, and every site already has one for
22
+ * its end-to-end tests.
23
+ * @param options - Which site, and what it says.
24
+ * @returns A complete HTML document.
25
+ */
26
+ export function ogCardHtml(options) {
27
+ const site = typeof options.site === 'string' ? siteById(options.site) : options.site;
28
+ const description = options.description ?? site.tagline;
29
+ const mark = renderToStaticMarkup(createElement(SiteMark, { site, size: 132, colors: 'literal' }));
30
+ const dot = site.name.dot === true ? '<span class="dot">.</span>' : '';
31
+ return `<!doctype html>
32
+ <html lang="en">
33
+ <head>
34
+ <meta charset="utf-8" />
35
+ <style>
36
+ * { box-sizing: border-box; margin: 0; }
37
+ body {
38
+ display: flex;
39
+ width: ${OG_WIDTH}px;
40
+ height: ${OG_HEIGHT}px;
41
+ flex-direction: column;
42
+ justify-content: center;
43
+ padding: 88px;
44
+ background: #ffffff;
45
+ color: #16202c;
46
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
47
+ Helvetica, Arial, sans-serif;
48
+ gap: 28px;
49
+ }
50
+ h1 { font-size: 76px; font-weight: 700; letter-spacing: -0.02em; }
51
+ .lead { color: ${site.brand}; }
52
+ .alt { color: ${site.brandAlt}; }
53
+ .dot { color: #8a96a3; }
54
+ p { max-width: 900px; color: #5b6875; font-size: 34px; line-height: 1.35; }
55
+ .rule {
56
+ width: 180px;
57
+ height: 10px;
58
+ border-radius: 5px;
59
+ background: ${site.brandAlt};
60
+ }
61
+ </style>
62
+ </head>
63
+ <body>
64
+ ${mark}
65
+ <h1><span class="lead">${escapeText(site.name.lead)}</span>${dot}<span class="alt">${escapeText(site.name.alt)}</span></h1>
66
+ <div class="rule"></div>
67
+ <p>${escapeText(description)}</p>
68
+ </body>
69
+ </html>
70
+ `;
71
+ }
72
+ //# sourceMappingURL=ogCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ogCard.js","sourceRoot":"","sources":["../../../src/seo/vite/ogCard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA8B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,wCAAwC;AACxC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAE7B,yCAAyC;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAa7B;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,OAAsB;IAC/C,MAAM,IAAI,GACR,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC;IACxD,MAAM,IAAI,GAAG,oBAAoB,CAC/B,aAAa,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAChE,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvE,OAAO;;;;;;;;iBAQQ,QAAQ;kBACP,SAAS;;;;;;;;;;;uBAWJ,IAAI,CAAC,KAAK;sBACX,IAAI,CAAC,QAAQ;;;;;;;sBAOb,IAAI,CAAC,QAAQ;;;;;MAK7B,IAAI;6BACmB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,qBAAqB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;;SAEzG,UAAU,CAAC,WAAW,CAAC;;;CAG/B,CAAC;AACF,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Write one real HTML file per routed address, and everything else a crawler
3
+ * fetches on its own.
4
+ *
5
+ * A site served by a static image has nothing to rewrite a head per request: a
6
+ * crawler gets whatever came off the wire. Without this every address carries
7
+ * the same title and a search engine folds the whole site into one result.
8
+ *
9
+ * These files are also what makes the server's catch-all fallback unnecessary.
10
+ * Every address the tool answers is on disk, so an address that is *not* on
11
+ * disk is genuinely not a page and must 404 rather than serving the tool under
12
+ * a name it does not have.
13
+ */
14
+ import type { Plugin } from 'vite';
15
+ import type { EcosystemSite, SiteId } from '../../ecosystem/core/sites.ts';
16
+ import type { RouteMeta } from '../core/routes.ts';
17
+ /** What the build needs to know to write the site's addresses. */
18
+ export interface PrerenderOptions {
19
+ /** The site, named or passed. */
20
+ site: EcosystemSite | SiteId;
21
+ /** Every address it answers, each with its title and description. */
22
+ routes: readonly RouteMeta[];
23
+ /**
24
+ * Origin every absolute address is built on.
25
+ * @default `https://<the site's host>`
26
+ */
27
+ origin?: string;
28
+ /**
29
+ * Address prefixes `robots.txt` keeps out of the index, e.g. `/v1/`. Set to
30
+ * `false` to write no `robots.txt` at all, for a site that ships its own.
31
+ * @default []
32
+ */
33
+ robots?: false | readonly string[];
34
+ /**
35
+ * The schema.org category of the structured-data block, or `false` to write
36
+ * none.
37
+ * @default 'EducationalApplication'
38
+ */
39
+ category?: false | string;
40
+ /**
41
+ * What the tool needs to run, named in the structured-data block.
42
+ * @default 'Any modern browser'
43
+ */
44
+ operatingSystem?: string;
45
+ /**
46
+ * Whether the built page carries a `noscript` index of the addresses. It is
47
+ * the only crawl path through a site whose body is an empty root element.
48
+ * @default true
49
+ */
50
+ noscript?: boolean;
51
+ }
52
+ /**
53
+ * Prerender every routed address of a cheminfo site.
54
+ * @param options - The site, its routes, and what a crawler is told.
55
+ * @returns The Vite plugin.
56
+ */
57
+ export declare function cheminfoPrerender(options: PrerenderOptions): Plugin;
58
+ //# sourceMappingURL=prerender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerender.d.ts","sourceRoot":"","sources":["../../../src/seo/vite/prerender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,MAAM,CAAC;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAQnD,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,IAAI,EAAE,aAAa,GAAG,MAAM,CAAC;IAC7B,qEAAqE;IACrE,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,MAAM,EAAE,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CA+EnE"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Write one real HTML file per routed address, and everything else a crawler
3
+ * fetches on its own.
4
+ *
5
+ * A site served by a static image has nothing to rewrite a head per request: a
6
+ * crawler gets whatever came off the wire. Without this every address carries
7
+ * the same title and a search engine folds the whole site into one result.
8
+ *
9
+ * These files are also what makes the server's catch-all fallback unnecessary.
10
+ * Every address the tool answers is on disk, so an address that is *not* on
11
+ * disk is genuinely not a page and must 404 rather than serving the tool under
12
+ * a name it does not have.
13
+ */
14
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
15
+ import { dirname, join, resolve } from 'node:path';
16
+ import { injectPageMeta, insertBeforeHeadEnd } from "../core/pageMeta.js";
17
+ import { noscriptIndex, robotsTxt, sitemapXml, structuredDataScript, } from "../core/siteFiles.js";
18
+ /**
19
+ * Prerender every routed address of a cheminfo site.
20
+ * @param options - The site, its routes, and what a crawler is told.
21
+ * @returns The Vite plugin.
22
+ */
23
+ export function cheminfoPrerender(options) {
24
+ const { site, routes, origin, robots = [], category, operatingSystem, noscript = true, } = options;
25
+ let out = 'dist';
26
+ let logger = null;
27
+ return {
28
+ name: 'cheminfo:prerender',
29
+ apply: 'build',
30
+ configResolved(config) {
31
+ out = resolve(config.root, config.build.outDir);
32
+ logger = config.logger;
33
+ },
34
+ transformIndexHtml: {
35
+ order: 'post',
36
+ handler(html) {
37
+ let page = html;
38
+ if (category !== false) {
39
+ page = insertBeforeHeadEnd(page, structuredDataScript({
40
+ site,
41
+ routes,
42
+ origin,
43
+ category,
44
+ operatingSystem,
45
+ }));
46
+ }
47
+ if (noscript) {
48
+ page = insertBeforeBodyEnd(page, noscriptIndex({ site, routes, origin }));
49
+ }
50
+ return page;
51
+ },
52
+ },
53
+ closeBundle() {
54
+ const index = readFileSync(join(out, 'index.html'), 'utf8');
55
+ for (const route of routes) {
56
+ const file = route.path === '/'
57
+ ? join(out, 'index.html')
58
+ : join(out, route.path.slice(1), 'index.html');
59
+ mkdirSync(dirname(file), { recursive: true });
60
+ writeFileSync(file, injectPageMeta(index, { site, routes, origin, url: route.path }));
61
+ }
62
+ writeFileSync(join(out, 'sitemap.xml'), sitemapXml({ site, routes, origin }));
63
+ if (robots !== false) {
64
+ writeFileSync(join(out, 'robots.txt'), robotsTxt({ site, routes, origin }, robots));
65
+ }
66
+ logger?.info(`${routes.length} pages prerendered, and listed in sitemap.xml`);
67
+ },
68
+ };
69
+ }
70
+ function insertBeforeBodyEnd(html, addition) {
71
+ const body = html.lastIndexOf('</body>');
72
+ if (body === -1)
73
+ return `${html}\n${addition}\n`;
74
+ return `${html.slice(0, body)}${addition}\n${html.slice(body)}`;
75
+ }
76
+ //# sourceMappingURL=prerender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerender.js","sourceRoot":"","sources":["../../../src/seo/vite/prerender.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { ShareParamCodecs, ShareParamValues, ShareVocabulary } from './vocabulary.ts';
2
+ /** The parameter that drops the site chrome. */
3
+ export declare const EMBED_PARAM = "embed";
4
+ /** The parameter listing the parts a link switches off. */
5
+ export declare const HIDE_PARAM = "hide";
6
+ /** What one link says about the page it opens, beyond the tool's own inputs. */
7
+ export interface ShareConfig<Codecs extends ShareParamCodecs = Record<string, never>> {
8
+ /** Drop the site chrome, so the page can be framed in someone else's site. */
9
+ embed: boolean;
10
+ /** The parts switched off, in the order the vocabulary lists them. */
11
+ hidden: readonly string[];
12
+ /** The tool's own parameters, each at the value the link carries or its default. */
13
+ params: ShareParamValues<Codecs>;
14
+ }
15
+ /**
16
+ * Read the configuration a link carries.
17
+ *
18
+ * Everything here is untrusted: a `hide` key the vocabulary does not list is
19
+ * ignored, a malformed number falls back to its default, and every number is
20
+ * clamped to what the tool can serve, so a link written two years ago still
21
+ * opens.
22
+ * @param search - The query string, with or without its leading `?`.
23
+ * @param vocabulary - What this site's links can say.
24
+ * @returns The configuration in force.
25
+ */
26
+ export declare function parseShareConfig<Codecs extends ShareParamCodecs = Record<string, never>>(search: string, vocabulary: ShareVocabulary<Codecs>): ShareConfig<Codecs>;
27
+ /**
28
+ * Write a configuration into an address, leaving the tool's own inputs as they
29
+ * were. A parameter left at its default is deleted rather than written, so an
30
+ * unconfigured link stays a plain link.
31
+ * @param search - The address as it stands, with or without its leading `?`.
32
+ * @param config - The configuration to write.
33
+ * @param vocabulary - What this site's links can say.
34
+ * @returns The new query string, without its leading `?`.
35
+ */
36
+ export declare function applyShareConfig<Codecs extends ShareParamCodecs = Record<string, never>>(search: string, config: ShareConfig<Codecs>, vocabulary: ShareVocabulary<Codecs>): string;
37
+ /**
38
+ * Whether the link switches a part of the page off.
39
+ *
40
+ * Hidden means hidden, not disabled: the value a hidden control carries still
41
+ * applies, so an embedder can preset what a visitor may not change.
42
+ * @param config - The configuration in force.
43
+ * @param key - The part to test.
44
+ * @returns True when the part must not be rendered.
45
+ */
46
+ export declare function isHidden(config: Pick<ShareConfig, 'hidden'>, key: string): boolean;
47
+ /**
48
+ * Whether a configuration differs from an unconfigured link.
49
+ * @param config - The configuration to test.
50
+ * @param vocabulary - What this site's links can say.
51
+ * @returns True when the link configures anything at all.
52
+ */
53
+ export declare function isShareConfigured<Codecs extends ShareParamCodecs = Record<string, never>>(config: ShareConfig<Codecs>, vocabulary: ShareVocabulary<Codecs>): boolean;
54
+ /**
55
+ * The configuration a share dialog opens on: framed, with the parts a host
56
+ * page has no use for already switched off. Someone who wants the whole site
57
+ * is one click away; someone building a course tile should not have to tick
58
+ * five boxes every time.
59
+ * @param vocabulary - What this site's links can say.
60
+ * @returns The configuration to start from.
61
+ */
62
+ export declare function suggestedShareConfig<Codecs extends ShareParamCodecs = Record<string, never>>(vocabulary: ShareVocabulary<Codecs>): ShareConfig<Codecs>;
63
+ //# sourceMappingURL=config.d.ts.map