react-cheminfo 0.64.1 → 0.65.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 (604) hide show
  1. package/README.md +282 -0
  2. package/lib/card/core/cardAddress.d.ts +70 -0
  3. package/lib/card/core/cardAddress.d.ts.map +1 -0
  4. package/lib/card/core/cardAddress.js +59 -0
  5. package/lib/card/core/cardAddress.js.map +1 -0
  6. package/lib/card/core/cardPageUrl.d.ts +49 -0
  7. package/lib/card/core/cardPageUrl.d.ts.map +1 -0
  8. package/lib/card/core/cardPageUrl.js +59 -0
  9. package/lib/card/core/cardPageUrl.js.map +1 -0
  10. package/lib/card/core/index.d.ts +7 -0
  11. package/lib/card/core/index.d.ts.map +1 -0
  12. package/lib/card/core/index.js +4 -0
  13. package/lib/card/core/index.js.map +1 -0
  14. package/lib/card/core/panelRoom.d.ts +40 -0
  15. package/lib/card/core/panelRoom.d.ts.map +1 -0
  16. package/lib/card/core/panelRoom.js +40 -0
  17. package/lib/card/core/panelRoom.js.map +1 -0
  18. package/lib/card/ui/CardDetailsButton.d.ts +38 -0
  19. package/lib/card/ui/CardDetailsButton.d.ts.map +1 -0
  20. package/lib/card/ui/CardDetailsButton.js +50 -0
  21. package/lib/card/ui/CardDetailsButton.js.map +1 -0
  22. package/lib/card/ui/CardFigure.d.ts +51 -0
  23. package/lib/card/ui/CardFigure.d.ts.map +1 -0
  24. package/lib/card/ui/CardFigure.js +27 -0
  25. package/lib/card/ui/CardFigure.js.map +1 -0
  26. package/lib/card/ui/CardFrame.d.ts +30 -0
  27. package/lib/card/ui/CardFrame.d.ts.map +1 -0
  28. package/lib/card/ui/CardFrame.js +20 -0
  29. package/lib/card/ui/CardFrame.js.map +1 -0
  30. package/lib/card/ui/CopyTableButton.d.ts +37 -0
  31. package/lib/card/ui/CopyTableButton.d.ts.map +1 -0
  32. package/lib/card/ui/CopyTableButton.js +19 -0
  33. package/lib/card/ui/CopyTableButton.js.map +1 -0
  34. package/lib/card/ui/cardTooltip.d.ts +14 -0
  35. package/lib/card/ui/cardTooltip.d.ts.map +1 -0
  36. package/lib/card/ui/cardTooltip.js +15 -0
  37. package/lib/card/ui/cardTooltip.js.map +1 -0
  38. package/lib/card/ui/embed.d.ts +15 -0
  39. package/lib/card/ui/embed.d.ts.map +1 -0
  40. package/lib/card/ui/embed.js +24 -0
  41. package/lib/card/ui/embed.js.map +1 -0
  42. package/lib/card/ui/fitCardToFrame.d.ts +31 -0
  43. package/lib/card/ui/fitCardToFrame.d.ts.map +1 -0
  44. package/lib/card/ui/fitCardToFrame.js +66 -0
  45. package/lib/card/ui/fitCardToFrame.js.map +1 -0
  46. package/lib/card/ui/holdRoomForPanels.d.ts +16 -0
  47. package/lib/card/ui/holdRoomForPanels.d.ts.map +1 -0
  48. package/lib/card/ui/holdRoomForPanels.js +76 -0
  49. package/lib/card/ui/holdRoomForPanels.js.map +1 -0
  50. package/lib/card/ui/index.d.ts +11 -0
  51. package/lib/card/ui/index.d.ts.map +1 -0
  52. package/lib/card/ui/index.js +7 -0
  53. package/lib/card/ui/index.js.map +1 -0
  54. package/lib/card/ui/openPanels.d.ts +25 -0
  55. package/lib/card/ui/openPanels.d.ts.map +1 -0
  56. package/lib/card/ui/openPanels.js +85 -0
  57. package/lib/card/ui/openPanels.js.map +1 -0
  58. package/lib/card.d.ts +13 -0
  59. package/lib/card.d.ts.map +1 -0
  60. package/lib/card.js +13 -0
  61. package/lib/card.js.map +1 -0
  62. package/lib/conformers.d.ts +1 -0
  63. package/lib/conformers.d.ts.map +1 -1
  64. package/lib/conformers.js +1 -0
  65. package/lib/conformers.js.map +1 -1
  66. package/lib/core.d.ts +4 -0
  67. package/lib/core.d.ts.map +1 -1
  68. package/lib/core.js +5 -0
  69. package/lib/core.js.map +1 -1
  70. package/lib/fetch/core/apiError.d.ts +56 -0
  71. package/lib/fetch/core/apiError.d.ts.map +1 -0
  72. package/lib/fetch/core/apiError.js +43 -0
  73. package/lib/fetch/core/apiError.js.map +1 -0
  74. package/lib/fetch/core/fetchJson.d.ts +47 -0
  75. package/lib/fetch/core/fetchJson.d.ts.map +1 -0
  76. package/lib/fetch/core/fetchJson.js +109 -0
  77. package/lib/fetch/core/fetchJson.js.map +1 -0
  78. package/lib/fetch/core/index.d.ts +5 -0
  79. package/lib/fetch/core/index.d.ts.map +1 -0
  80. package/lib/fetch/core/index.js +3 -0
  81. package/lib/fetch/core/index.js.map +1 -0
  82. package/lib/formula/core/formulaText.d.ts +46 -0
  83. package/lib/formula/core/formulaText.d.ts.map +1 -0
  84. package/lib/formula/core/formulaText.js +74 -0
  85. package/lib/formula/core/formulaText.js.map +1 -0
  86. package/lib/formula/core/index.d.ts +6 -0
  87. package/lib/formula/core/index.d.ts.map +1 -0
  88. package/lib/formula/core/index.js +4 -0
  89. package/lib/formula/core/index.js.map +1 -0
  90. package/lib/formula/core/normalizeFormula.d.ts +22 -0
  91. package/lib/formula/core/normalizeFormula.d.ts.map +1 -0
  92. package/lib/formula/core/normalizeFormula.js +46 -0
  93. package/lib/formula/core/normalizeFormula.js.map +1 -0
  94. package/lib/formula/core/readFormula.d.ts +73 -0
  95. package/lib/formula/core/readFormula.d.ts.map +1 -0
  96. package/lib/formula/core/readFormula.js +132 -0
  97. package/lib/formula/core/readFormula.js.map +1 -0
  98. package/lib/formula/ui/CopyableFormula.d.ts +31 -0
  99. package/lib/formula/ui/CopyableFormula.d.ts.map +1 -0
  100. package/lib/formula/ui/CopyableFormula.js +19 -0
  101. package/lib/formula/ui/CopyableFormula.js.map +1 -0
  102. package/lib/formula/ui/FormulaInput.d.ts +29 -0
  103. package/lib/formula/ui/FormulaInput.d.ts.map +1 -0
  104. package/lib/formula/ui/FormulaInput.js +16 -0
  105. package/lib/formula/ui/FormulaInput.js.map +1 -0
  106. package/lib/formula/ui/QuestionFormula.d.ts +14 -0
  107. package/lib/formula/ui/QuestionFormula.d.ts.map +1 -0
  108. package/lib/formula/ui/QuestionFormula.js +13 -0
  109. package/lib/formula/ui/QuestionFormula.js.map +1 -0
  110. package/lib/formula/ui/index.d.ts +7 -0
  111. package/lib/formula/ui/index.d.ts.map +1 -0
  112. package/lib/formula/ui/index.js +4 -0
  113. package/lib/formula/ui/index.js.map +1 -0
  114. package/lib/formula.d.ts +11 -0
  115. package/lib/formula.d.ts.map +1 -0
  116. package/lib/formula.js +11 -0
  117. package/lib/formula.js.map +1 -0
  118. package/lib/hooks/ui/index.d.ts +1 -0
  119. package/lib/hooks/ui/index.d.ts.map +1 -1
  120. package/lib/hooks/ui/index.js.map +1 -1
  121. package/lib/hooks/ui/keyTargets.d.ts +4 -2
  122. package/lib/hooks/ui/keyTargets.d.ts.map +1 -1
  123. package/lib/hooks/ui/keyTargets.js +5 -3
  124. package/lib/hooks/ui/keyTargets.js.map +1 -1
  125. package/lib/hooks/ui/useAsync.d.ts +20 -5
  126. package/lib/hooks/ui/useAsync.d.ts.map +1 -1
  127. package/lib/hooks/ui/useAsync.js +29 -14
  128. package/lib/hooks/ui/useAsync.js.map +1 -1
  129. package/lib/i18n/core/chromeCatalog.d.ts +1 -1
  130. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
  131. package/lib/locales/de.json +37 -0
  132. package/lib/locales/en.json +37 -0
  133. package/lib/locales/es.json +37 -0
  134. package/lib/locales/fr.json +37 -0
  135. package/lib/locales/it.json +37 -0
  136. package/lib/moleculesClient/core/index.d.ts +5 -0
  137. package/lib/moleculesClient/core/index.d.ts.map +1 -0
  138. package/lib/moleculesClient/core/index.js +3 -0
  139. package/lib/moleculesClient/core/index.js.map +1 -0
  140. package/lib/moleculesClient/core/moleculesClient.d.ts +12 -0
  141. package/lib/moleculesClient/core/moleculesClient.d.ts.map +1 -0
  142. package/lib/moleculesClient/core/moleculesClient.js +105 -0
  143. package/lib/moleculesClient/core/moleculesClient.js.map +1 -0
  144. package/lib/moleculesClient/core/moleculesClientApi.d.ts +100 -0
  145. package/lib/moleculesClient/core/moleculesClientApi.d.ts.map +1 -0
  146. package/lib/moleculesClient/core/moleculesClientApi.js +20 -0
  147. package/lib/moleculesClient/core/moleculesClientApi.js.map +1 -0
  148. package/lib/moleculesClient/core/moleculesTypes.d.ts +154 -0
  149. package/lib/moleculesClient/core/moleculesTypes.d.ts.map +1 -0
  150. package/lib/moleculesClient/core/moleculesTypes.js +2 -0
  151. package/lib/moleculesClient/core/moleculesTypes.js.map +1 -0
  152. package/lib/moleculesClient/core/requestRetry.d.ts +50 -0
  153. package/lib/moleculesClient/core/requestRetry.d.ts.map +1 -0
  154. package/lib/moleculesClient/core/requestRetry.js +108 -0
  155. package/lib/moleculesClient/core/requestRetry.js.map +1 -0
  156. package/lib/molstar/core/camera.d.ts +2 -1
  157. package/lib/molstar/core/camera.d.ts.map +1 -1
  158. package/lib/molstar/core/camera.js +3 -2
  159. package/lib/molstar/core/camera.js.map +1 -1
  160. package/lib/molstar/core/framing.d.ts +102 -0
  161. package/lib/molstar/core/framing.d.ts.map +1 -0
  162. package/lib/molstar/core/framing.js +120 -0
  163. package/lib/molstar/core/framing.js.map +1 -0
  164. package/lib/molstar/core/hover.d.ts +16 -0
  165. package/lib/molstar/core/hover.d.ts.map +1 -1
  166. package/lib/molstar/core/hover.js +14 -0
  167. package/lib/molstar/core/hover.js.map +1 -1
  168. package/lib/molstar/core/index.d.ts +4 -1
  169. package/lib/molstar/core/index.d.ts.map +1 -1
  170. package/lib/molstar/core/index.js +2 -1
  171. package/lib/molstar/core/index.js.map +1 -1
  172. package/lib/pedagogy/core/answers.d.ts +46 -0
  173. package/lib/pedagogy/core/answers.d.ts.map +1 -0
  174. package/lib/pedagogy/core/answers.js +77 -0
  175. package/lib/pedagogy/core/answers.js.map +1 -0
  176. package/lib/pedagogy/core/attempts.d.ts +86 -0
  177. package/lib/pedagogy/core/attempts.d.ts.map +1 -0
  178. package/lib/pedagogy/core/attempts.js +117 -0
  179. package/lib/pedagogy/core/attempts.js.map +1 -0
  180. package/lib/pedagogy/core/index.d.ts +8 -0
  181. package/lib/pedagogy/core/index.d.ts.map +1 -1
  182. package/lib/pedagogy/core/index.js +4 -0
  183. package/lib/pedagogy/core/index.js.map +1 -1
  184. package/lib/pedagogy/core/progressController.d.ts +64 -0
  185. package/lib/pedagogy/core/progressController.d.ts.map +1 -0
  186. package/lib/pedagogy/core/progressController.js +56 -0
  187. package/lib/pedagogy/core/progressController.js.map +1 -0
  188. package/lib/pedagogy/core/seed.d.ts +96 -0
  189. package/lib/pedagogy/core/seed.d.ts.map +1 -0
  190. package/lib/pedagogy/core/seed.js +128 -0
  191. package/lib/pedagogy/core/seed.js.map +1 -0
  192. package/lib/pedagogy/core/series.d.ts +77 -0
  193. package/lib/pedagogy/core/series.d.ts.map +1 -0
  194. package/lib/pedagogy/core/series.js +10 -0
  195. package/lib/pedagogy/core/series.js.map +1 -0
  196. package/lib/pedagogy/ui/AnswerFields.d.ts +21 -0
  197. package/lib/pedagogy/ui/AnswerFields.d.ts.map +1 -0
  198. package/lib/pedagogy/ui/AnswerFields.js +24 -0
  199. package/lib/pedagogy/ui/AnswerFields.js.map +1 -0
  200. package/lib/pedagogy/ui/ExerciseList.d.ts +82 -0
  201. package/lib/pedagogy/ui/ExerciseList.d.ts.map +1 -0
  202. package/lib/pedagogy/ui/ExerciseList.js +53 -0
  203. package/lib/pedagogy/ui/ExerciseList.js.map +1 -0
  204. package/lib/pedagogy/ui/ExerciseSeries.d.ts +95 -0
  205. package/lib/pedagogy/ui/ExerciseSeries.d.ts.map +1 -0
  206. package/lib/pedagogy/ui/ExerciseSeries.js +74 -0
  207. package/lib/pedagogy/ui/ExerciseSeries.js.map +1 -0
  208. package/lib/pedagogy/ui/QuestionCard.d.ts +64 -0
  209. package/lib/pedagogy/ui/QuestionCard.d.ts.map +1 -0
  210. package/lib/pedagogy/ui/QuestionCard.js +73 -0
  211. package/lib/pedagogy/ui/QuestionCard.js.map +1 -0
  212. package/lib/pedagogy/ui/index.d.ts +10 -0
  213. package/lib/pedagogy/ui/index.d.ts.map +1 -1
  214. package/lib/pedagogy/ui/index.js +6 -0
  215. package/lib/pedagogy/ui/index.js.map +1 -1
  216. package/lib/pedagogy/ui/seriesCounts.d.ts +17 -0
  217. package/lib/pedagogy/ui/seriesCounts.d.ts.map +1 -0
  218. package/lib/pedagogy/ui/seriesCounts.js +27 -0
  219. package/lib/pedagogy/ui/seriesCounts.js.map +1 -0
  220. package/lib/pedagogy/ui/seriesParts.d.ts +55 -0
  221. package/lib/pedagogy/ui/seriesParts.d.ts.map +1 -0
  222. package/lib/pedagogy/ui/seriesParts.js +38 -0
  223. package/lib/pedagogy/ui/seriesParts.js.map +1 -0
  224. package/lib/pedagogy/ui/useAttemptRecords.d.ts +10 -0
  225. package/lib/pedagogy/ui/useAttemptRecords.d.ts.map +1 -0
  226. package/lib/pedagogy/ui/useAttemptRecords.js +11 -0
  227. package/lib/pedagogy/ui/useAttemptRecords.js.map +1 -0
  228. package/lib/periodic/ui/PeriodicTable.d.ts.map +1 -1
  229. package/lib/periodic/ui/PeriodicTable.js +6 -3
  230. package/lib/periodic/ui/PeriodicTable.js.map +1 -1
  231. package/lib/property/core/copyableText.d.ts +14 -0
  232. package/lib/property/core/copyableText.d.ts.map +1 -0
  233. package/lib/property/core/copyableText.js +21 -0
  234. package/lib/property/core/copyableText.js.map +1 -0
  235. package/lib/property/core/index.d.ts +2 -0
  236. package/lib/property/core/index.d.ts.map +1 -0
  237. package/lib/property/core/index.js +2 -0
  238. package/lib/property/core/index.js.map +1 -0
  239. package/lib/property/ui/PropertyTable.d.ts +43 -0
  240. package/lib/property/ui/PropertyTable.d.ts.map +1 -0
  241. package/lib/property/ui/PropertyTable.js +19 -0
  242. package/lib/property/ui/PropertyTable.js.map +1 -0
  243. package/lib/property/ui/index.d.ts +3 -0
  244. package/lib/property/ui/index.d.ts.map +1 -0
  245. package/lib/property/ui/index.js +2 -0
  246. package/lib/property/ui/index.js.map +1 -0
  247. package/lib/router/core/history.d.ts +24 -3
  248. package/lib/router/core/history.d.ts.map +1 -1
  249. package/lib/router/core/history.js +55 -7
  250. package/lib/router/core/history.js.map +1 -1
  251. package/lib/router/core/index.d.ts +3 -3
  252. package/lib/router/core/index.d.ts.map +1 -1
  253. package/lib/router/core/index.js +2 -2
  254. package/lib/router/core/index.js.map +1 -1
  255. package/lib/router/core/languageRoute.d.ts +61 -0
  256. package/lib/router/core/languageRoute.d.ts.map +1 -0
  257. package/lib/router/core/languageRoute.js +96 -0
  258. package/lib/router/core/languageRoute.js.map +1 -0
  259. package/lib/router/core/siteAddresses.d.ts +23 -0
  260. package/lib/router/core/siteAddresses.d.ts.map +1 -1
  261. package/lib/router/core/siteAddresses.js +26 -0
  262. package/lib/router/core/siteAddresses.js.map +1 -1
  263. package/lib/router/core/tabRouter.d.ts +2 -108
  264. package/lib/router/core/tabRouter.d.ts.map +1 -1
  265. package/lib/router/core/tabRouter.js +38 -5
  266. package/lib/router/core/tabRouter.js.map +1 -1
  267. package/lib/router/core/tabRouterTypes.d.ts +154 -0
  268. package/lib/router/core/tabRouterTypes.d.ts.map +1 -0
  269. package/lib/router/core/tabRouterTypes.js +2 -0
  270. package/lib/router/core/tabRouterTypes.js.map +1 -0
  271. package/lib/seo/core/fitDescription.d.ts +40 -0
  272. package/lib/seo/core/fitDescription.d.ts.map +1 -0
  273. package/lib/seo/core/fitDescription.js +45 -0
  274. package/lib/seo/core/fitDescription.js.map +1 -0
  275. package/lib/seo/core/index.d.ts +7 -0
  276. package/lib/seo/core/index.d.ts.map +1 -1
  277. package/lib/seo/core/index.js +4 -0
  278. package/lib/seo/core/index.js.map +1 -1
  279. package/lib/seo/core/limits.d.ts +24 -0
  280. package/lib/seo/core/limits.d.ts.map +1 -0
  281. package/lib/seo/core/limits.js +24 -0
  282. package/lib/seo/core/limits.js.map +1 -0
  283. package/lib/seo/core/pageContent.d.ts +25 -0
  284. package/lib/seo/core/pageContent.d.ts.map +1 -0
  285. package/lib/seo/core/pageContent.js +25 -0
  286. package/lib/seo/core/pageContent.js.map +1 -0
  287. package/lib/seo/core/plainDescription.d.ts.map +1 -1
  288. package/lib/seo/core/plainDescription.js +3 -2
  289. package/lib/seo/core/plainDescription.js.map +1 -1
  290. package/lib/seo/core/routeProblems.d.ts.map +1 -1
  291. package/lib/seo/core/routeProblems.js +1 -6
  292. package/lib/seo/core/routeProblems.js.map +1 -1
  293. package/lib/seo/core/routeTable.d.ts +31 -0
  294. package/lib/seo/core/routeTable.d.ts.map +1 -0
  295. package/lib/seo/core/routeTable.js +96 -0
  296. package/lib/seo/core/routeTable.js.map +1 -0
  297. package/lib/seo/vite/index.d.ts +2 -0
  298. package/lib/seo/vite/index.d.ts.map +1 -1
  299. package/lib/seo/vite/index.js +1 -0
  300. package/lib/seo/vite/index.js.map +1 -1
  301. package/lib/seo/vite/prerender.d.ts +10 -0
  302. package/lib/seo/vite/prerender.d.ts.map +1 -1
  303. package/lib/seo/vite/prerender.js +12 -1
  304. package/lib/seo/vite/prerender.js.map +1 -1
  305. package/lib/seo/vite/routeTable.d.ts +40 -0
  306. package/lib/seo/vite/routeTable.d.ts.map +1 -0
  307. package/lib/seo/vite/routeTable.js +44 -0
  308. package/lib/seo/vite/routeTable.js.map +1 -0
  309. package/lib/server/answerAddresses.d.ts +51 -0
  310. package/lib/server/answerAddresses.d.ts.map +1 -0
  311. package/lib/server/answerAddresses.js +72 -0
  312. package/lib/server/answerAddresses.js.map +1 -0
  313. package/lib/server/cardMeta.d.ts +57 -0
  314. package/lib/server/cardMeta.d.ts.map +1 -0
  315. package/lib/server/cardMeta.js +52 -0
  316. package/lib/server/cardMeta.js.map +1 -0
  317. package/lib/server/config.d.ts +72 -0
  318. package/lib/server/config.d.ts.map +1 -0
  319. package/lib/server/config.js +67 -0
  320. package/lib/server/config.js.map +1 -0
  321. package/lib/server/envNumber.d.ts +35 -0
  322. package/lib/server/envNumber.d.ts.map +1 -0
  323. package/lib/server/envNumber.js +42 -0
  324. package/lib/server/envNumber.js.map +1 -0
  325. package/lib/server/healthRoute.d.ts +26 -0
  326. package/lib/server/healthRoute.d.ts.map +1 -0
  327. package/lib/server/healthRoute.js +22 -0
  328. package/lib/server/healthRoute.js.map +1 -0
  329. package/lib/server/listenSite.d.ts +38 -0
  330. package/lib/server/listenSite.d.ts.map +1 -0
  331. package/lib/server/listenSite.js +60 -0
  332. package/lib/server/listenSite.js.map +1 -0
  333. package/lib/server/mcpServer.d.ts +8 -0
  334. package/lib/server/mcpServer.d.ts.map +1 -0
  335. package/lib/server/mcpServer.js +11 -0
  336. package/lib/server/mcpServer.js.map +1 -0
  337. package/lib/server/repositoryVersion.d.ts +16 -0
  338. package/lib/server/repositoryVersion.d.ts.map +1 -0
  339. package/lib/server/repositoryVersion.js +33 -0
  340. package/lib/server/repositoryVersion.js.map +1 -0
  341. package/lib/server/routeOptions.d.ts +23 -0
  342. package/lib/server/routeOptions.d.ts.map +1 -0
  343. package/lib/server/routeOptions.js +20 -0
  344. package/lib/server/routeOptions.js.map +1 -0
  345. package/lib/server/routeTable.d.ts +14 -0
  346. package/lib/server/routeTable.d.ts.map +1 -0
  347. package/lib/server/routeTable.js +32 -0
  348. package/lib/server/routeTable.js.map +1 -0
  349. package/lib/server/siteView.d.ts +29 -0
  350. package/lib/server/siteView.d.ts.map +1 -0
  351. package/lib/server/siteView.js +21 -0
  352. package/lib/server/siteView.js.map +1 -0
  353. package/lib/server/spaPages.d.ts +32 -0
  354. package/lib/server/spaPages.d.ts.map +1 -0
  355. package/lib/server/spaPages.js +126 -0
  356. package/lib/server/spaPages.js.map +1 -0
  357. package/lib/server/spaSite.d.ts +30 -0
  358. package/lib/server/spaSite.d.ts.map +1 -0
  359. package/lib/server/spaSite.js +170 -0
  360. package/lib/server/spaSite.js.map +1 -0
  361. package/lib/server/spaSiteOptions.d.ts +126 -0
  362. package/lib/server/spaSiteOptions.d.ts.map +1 -0
  363. package/lib/server/spaSiteOptions.js +2 -0
  364. package/lib/server/spaSiteOptions.js.map +1 -0
  365. package/lib/server/staticSite.d.ts +9 -0
  366. package/lib/server/staticSite.d.ts.map +1 -1
  367. package/lib/server/staticSite.js +41 -19
  368. package/lib/server/staticSite.js.map +1 -1
  369. package/lib/server/toolSiteServer.d.ts +77 -0
  370. package/lib/server/toolSiteServer.d.ts.map +1 -0
  371. package/lib/server/toolSiteServer.js +58 -0
  372. package/lib/server/toolSiteServer.js.map +1 -0
  373. package/lib/server/trustProxy.d.ts +20 -0
  374. package/lib/server/trustProxy.d.ts.map +1 -0
  375. package/lib/server/trustProxy.js +32 -0
  376. package/lib/server/trustProxy.js.map +1 -0
  377. package/lib/server/types.d.ts +13 -0
  378. package/lib/server/types.d.ts.map +1 -0
  379. package/lib/server/types.js +2 -0
  380. package/lib/server/types.js.map +1 -0
  381. package/lib/server.d.ts +22 -0
  382. package/lib/server.d.ts.map +1 -1
  383. package/lib/server.js +12 -0
  384. package/lib/server.js.map +1 -1
  385. package/lib/share/core/config.d.ts +18 -0
  386. package/lib/share/core/config.d.ts.map +1 -1
  387. package/lib/share/core/config.js +33 -2
  388. package/lib/share/core/config.js.map +1 -1
  389. package/lib/share/core/index.d.ts +3 -1
  390. package/lib/share/core/index.d.ts.map +1 -1
  391. package/lib/share/core/index.js +2 -1
  392. package/lib/share/core/index.js.map +1 -1
  393. package/lib/share/core/keySetParam.d.ts +40 -0
  394. package/lib/share/core/keySetParam.d.ts.map +1 -0
  395. package/lib/share/core/keySetParam.js +60 -0
  396. package/lib/share/core/keySetParam.js.map +1 -0
  397. package/lib/share/core/vocabulary.d.ts +8 -0
  398. package/lib/share/core/vocabulary.d.ts.map +1 -1
  399. package/lib/shell/ui/ShareControl.d.ts +75 -0
  400. package/lib/shell/ui/ShareControl.d.ts.map +1 -0
  401. package/lib/shell/ui/ShareControl.js +40 -0
  402. package/lib/shell/ui/ShareControl.js.map +1 -0
  403. package/lib/shell/ui/ShellFrame.d.ts +14 -0
  404. package/lib/shell/ui/ShellFrame.d.ts.map +1 -0
  405. package/lib/shell/ui/ShellFrame.js +45 -0
  406. package/lib/shell/ui/ShellFrame.js.map +1 -0
  407. package/lib/shell/ui/SiteShell.d.ts +251 -0
  408. package/lib/shell/ui/SiteShell.d.ts.map +1 -0
  409. package/lib/shell/ui/SiteShell.js +39 -0
  410. package/lib/shell/ui/SiteShell.js.map +1 -0
  411. package/lib/shell/ui/index.d.ts +5 -0
  412. package/lib/shell/ui/index.d.ts.map +1 -0
  413. package/lib/shell/ui/index.js +3 -0
  414. package/lib/shell/ui/index.js.map +1 -0
  415. package/lib/state/core/index.d.ts +1 -0
  416. package/lib/state/core/index.d.ts.map +1 -1
  417. package/lib/state/core/index.js.map +1 -1
  418. package/lib/state/core/legacyEntries.d.ts +30 -0
  419. package/lib/state/core/legacyEntries.d.ts.map +1 -0
  420. package/lib/state/core/legacyEntries.js +51 -0
  421. package/lib/state/core/legacyEntries.js.map +1 -0
  422. package/lib/state/core/persistBucket.d.ts +26 -2
  423. package/lib/state/core/persistBucket.d.ts.map +1 -1
  424. package/lib/state/core/persistBucket.js +26 -9
  425. package/lib/state/core/persistBucket.js.map +1 -1
  426. package/lib/state/core/persistSignalBucket.d.ts +26 -0
  427. package/lib/state/core/persistSignalBucket.d.ts.map +1 -1
  428. package/lib/state/core/persistSignalBucket.js +31 -0
  429. package/lib/state/core/persistSignalBucket.js.map +1 -1
  430. package/lib/state/core/storageEntry.d.ts +15 -0
  431. package/lib/state/core/storageEntry.d.ts.map +1 -1
  432. package/lib/state/core/storageEntry.js +33 -0
  433. package/lib/state/core/storageEntry.js.map +1 -1
  434. package/lib/structure/ui/StructureExportButton.d.ts +27 -0
  435. package/lib/structure/ui/StructureExportButton.d.ts.map +1 -0
  436. package/lib/structure/ui/StructureExportButton.js +21 -0
  437. package/lib/structure/ui/StructureExportButton.js.map +1 -0
  438. package/lib/structure/ui/index.d.ts +4 -0
  439. package/lib/structure/ui/index.d.ts.map +1 -1
  440. package/lib/structure/ui/index.js +2 -0
  441. package/lib/structure/ui/index.js.map +1 -1
  442. package/lib/structure/ui/useStructureDraft.d.ts +32 -0
  443. package/lib/structure/ui/useStructureDraft.d.ts.map +1 -0
  444. package/lib/structure/ui/useStructureDraft.js +20 -0
  445. package/lib/structure/ui/useStructureDraft.js.map +1 -0
  446. package/lib/ui.d.ts +2 -0
  447. package/lib/ui.d.ts.map +1 -1
  448. package/lib/ui.js +2 -0
  449. package/lib/ui.js.map +1 -1
  450. package/lib/worker/core/index.d.ts +1 -1
  451. package/lib/worker/core/index.d.ts.map +1 -1
  452. package/lib/worker/core/messages.d.ts +4 -2
  453. package/lib/worker/core/messages.d.ts.map +1 -1
  454. package/lib/worker/core/messages.js.map +1 -1
  455. package/lib/worker/core/oclResourcesUrl.d.ts +16 -0
  456. package/lib/worker/core/oclResourcesUrl.d.ts.map +1 -0
  457. package/lib/worker/core/oclResourcesUrl.js +19 -0
  458. package/lib/worker/core/oclResourcesUrl.js.map +1 -0
  459. package/lib/worker/core/serveWorkerRequests.d.ts +8 -0
  460. package/lib/worker/core/serveWorkerRequests.d.ts.map +1 -1
  461. package/lib/worker/core/serveWorkerRequests.js +15 -2
  462. package/lib/worker/core/serveWorkerRequests.js.map +1 -1
  463. package/lib/worker/core/workerChannel.d.ts +3 -4
  464. package/lib/worker/core/workerChannel.d.ts.map +1 -1
  465. package/lib/worker/core/workerChannel.js +72 -67
  466. package/lib/worker/core/workerChannel.js.map +1 -1
  467. package/lib/worker/core/workerChannelParts.d.ts +17 -6
  468. package/lib/worker/core/workerChannelParts.d.ts.map +1 -1
  469. package/lib/worker/core/workerChannelParts.js +20 -4
  470. package/lib/worker/core/workerChannelParts.js.map +1 -1
  471. package/lib/worker/core/workerChannelTypes.d.ts +46 -2
  472. package/lib/worker/core/workerChannelTypes.d.ts.map +1 -1
  473. package/lib/worker/core/workerSlot.d.ts +66 -0
  474. package/lib/worker/core/workerSlot.d.ts.map +1 -0
  475. package/lib/worker/core/workerSlot.js +107 -0
  476. package/lib/worker/core/workerSlot.js.map +1 -0
  477. package/package.json +16 -1
  478. package/src/card/core/cardAddress.ts +100 -0
  479. package/src/card/core/cardPageUrl.ts +97 -0
  480. package/src/card/core/index.ts +6 -0
  481. package/src/card/core/panelRoom.ts +66 -0
  482. package/src/card/ui/CardDetailsButton.tsx +104 -0
  483. package/src/card/ui/CardFigure.tsx +86 -0
  484. package/src/card/ui/CardFrame.tsx +46 -0
  485. package/src/card/ui/CopyTableButton.tsx +81 -0
  486. package/src/card/ui/cardTooltip.ts +18 -0
  487. package/src/card/ui/embed.ts +27 -0
  488. package/src/card/ui/fitCardToFrame.ts +76 -0
  489. package/src/card/ui/holdRoomForPanels.ts +83 -0
  490. package/src/card/ui/index.ts +14 -0
  491. package/src/card/ui/openPanels.ts +106 -0
  492. package/src/card.ts +13 -0
  493. package/src/conformers.ts +4 -0
  494. package/src/core.ts +5 -0
  495. package/src/fetch/core/apiError.ts +65 -0
  496. package/src/fetch/core/fetchJson.ts +129 -0
  497. package/src/fetch/core/index.ts +4 -0
  498. package/src/formula/core/formulaText.ts +96 -0
  499. package/src/formula/core/index.ts +20 -0
  500. package/src/formula/core/normalizeFormula.ts +50 -0
  501. package/src/formula/core/readFormula.ts +211 -0
  502. package/src/formula/ui/CopyableFormula.tsx +51 -0
  503. package/src/formula/ui/FormulaInput.tsx +50 -0
  504. package/src/formula/ui/QuestionFormula.tsx +20 -0
  505. package/src/formula/ui/index.ts +6 -0
  506. package/src/formula.ts +11 -0
  507. package/src/hooks/ui/index.ts +1 -0
  508. package/src/hooks/ui/keyTargets.ts +5 -3
  509. package/src/hooks/ui/useAsync.ts +50 -14
  510. package/src/locales/de.json +37 -0
  511. package/src/locales/en.json +37 -0
  512. package/src/locales/es.json +37 -0
  513. package/src/locales/fr.json +37 -0
  514. package/src/locales/it.json +37 -0
  515. package/src/moleculesClient/core/index.ts +19 -0
  516. package/src/moleculesClient/core/moleculesClient.ts +175 -0
  517. package/src/moleculesClient/core/moleculesClientApi.ts +120 -0
  518. package/src/moleculesClient/core/moleculesTypes.ts +163 -0
  519. package/src/moleculesClient/core/requestRetry.ts +118 -0
  520. package/src/molstar/core/camera.ts +3 -2
  521. package/src/molstar/core/framing.ts +200 -0
  522. package/src/molstar/core/hover.ts +26 -0
  523. package/src/molstar/core/index.ts +21 -1
  524. package/src/pedagogy/core/answers.ts +94 -0
  525. package/src/pedagogy/core/attempts.ts +205 -0
  526. package/src/pedagogy/core/index.ts +36 -0
  527. package/src/pedagogy/core/progressController.ts +116 -0
  528. package/src/pedagogy/core/seed.ts +177 -0
  529. package/src/pedagogy/core/series.ts +82 -0
  530. package/src/pedagogy/ui/AnswerFields.tsx +63 -0
  531. package/src/pedagogy/ui/ExerciseList.tsx +202 -0
  532. package/src/pedagogy/ui/ExerciseSeries.tsx +250 -0
  533. package/src/pedagogy/ui/QuestionCard.tsx +231 -0
  534. package/src/pedagogy/ui/index.ts +18 -0
  535. package/src/pedagogy/ui/seriesCounts.ts +34 -0
  536. package/src/pedagogy/ui/seriesParts.tsx +127 -0
  537. package/src/pedagogy/ui/useAttemptRecords.ts +16 -0
  538. package/src/periodic/ui/PeriodicTable.tsx +6 -3
  539. package/src/property/core/copyableText.ts +20 -0
  540. package/src/property/core/index.ts +1 -0
  541. package/src/property/ui/PropertyTable.tsx +83 -0
  542. package/src/property/ui/index.ts +2 -0
  543. package/src/router/core/history.ts +61 -7
  544. package/src/router/core/index.ts +3 -2
  545. package/src/router/core/languageRoute.ts +136 -0
  546. package/src/router/core/siteAddresses.ts +38 -0
  547. package/src/router/core/tabRouter.ts +59 -117
  548. package/src/router/core/tabRouterTypes.ts +158 -0
  549. package/src/seo/core/fitDescription.ts +74 -0
  550. package/src/seo/core/index.ts +17 -0
  551. package/src/seo/core/limits.ts +27 -0
  552. package/src/seo/core/pageContent.ts +42 -0
  553. package/src/seo/core/plainDescription.ts +4 -2
  554. package/src/seo/core/routeProblems.ts +1 -7
  555. package/src/seo/core/routeTable.ts +103 -0
  556. package/src/seo/vite/index.ts +2 -0
  557. package/src/seo/vite/prerender.ts +26 -1
  558. package/src/seo/vite/routeTable.ts +79 -0
  559. package/src/server/answerAddresses.ts +92 -0
  560. package/src/server/cardMeta.ts +88 -0
  561. package/src/server/config.ts +125 -0
  562. package/src/server/envNumber.ts +65 -0
  563. package/src/server/healthRoute.ts +42 -0
  564. package/src/server/listenSite.ts +90 -0
  565. package/src/server/mcpServer.ts +14 -0
  566. package/src/server/repositoryVersion.ts +33 -0
  567. package/src/server/routeOptions.ts +26 -0
  568. package/src/server/routeTable.ts +35 -0
  569. package/src/server/siteView.ts +42 -0
  570. package/src/server/spaPages.ts +179 -0
  571. package/src/server/spaSite.ts +216 -0
  572. package/src/server/spaSiteOptions.ts +133 -0
  573. package/src/server/staticSite.ts +65 -35
  574. package/src/server/toolSiteServer.ts +127 -0
  575. package/src/server/trustProxy.ts +32 -0
  576. package/src/server/types.ts +25 -0
  577. package/src/server.ts +40 -0
  578. package/src/share/core/config.ts +45 -2
  579. package/src/share/core/index.ts +4 -0
  580. package/src/share/core/keySetParam.ts +92 -0
  581. package/src/share/core/vocabulary.ts +8 -0
  582. package/src/shell/ui/ShareControl.tsx +150 -0
  583. package/src/shell/ui/ShellFrame.tsx +180 -0
  584. package/src/shell/ui/SiteShell.tsx +297 -0
  585. package/src/shell/ui/index.ts +9 -0
  586. package/src/state/core/index.ts +1 -0
  587. package/src/state/core/legacyEntries.ts +76 -0
  588. package/src/state/core/persistBucket.ts +50 -10
  589. package/src/state/core/persistSignalBucket.ts +52 -0
  590. package/src/state/core/storageEntry.ts +32 -0
  591. package/src/structure/ui/StructureExportButton.tsx +57 -0
  592. package/src/structure/ui/index.ts +4 -0
  593. package/src/structure/ui/useStructureDraft.ts +47 -0
  594. package/src/ui.ts +2 -0
  595. package/src/worker/core/index.ts +1 -0
  596. package/src/worker/core/messages.ts +4 -3
  597. package/src/worker/core/oclResourcesUrl.ts +21 -0
  598. package/src/worker/core/serveWorkerRequests.ts +30 -2
  599. package/src/worker/core/workerChannel.ts +74 -74
  600. package/src/worker/core/workerChannelParts.ts +33 -13
  601. package/src/worker/core/workerChannelTypes.ts +47 -2
  602. package/src/worker/core/workerSlot.ts +181 -0
  603. package/styles/card.css +145 -0
  604. package/styles/chrome.css +248 -0
@@ -1,8 +1,12 @@
1
1
  import { toError } from '../../error/core/toError.ts';
2
2
 
3
- import type { WorkerLike } from './messages.ts';
3
+ import type {
4
+ WorkerEventLike,
5
+ WorkerLike,
6
+ WorkerResponseMessage,
7
+ } from './messages.ts';
4
8
  import { isProgressMessage, isResponseMessage } from './messages.ts';
5
- import type { WorkerJobContext } from './workerChannelTypes.ts';
9
+ import type { WorkerFailure, WorkerJobContext } from './workerChannelTypes.ts';
6
10
 
7
11
  /** How long a request waits when neither the call nor the channel says. */
8
12
  export const DEFAULT_TIMEOUT_MS = 120_000;
@@ -62,10 +66,13 @@ export type Outcome<TResponse> =
62
66
  interface WorkerMessageHandlers {
63
67
  /** News about a running job. */
64
68
  progress: (id: number, progress: unknown) => void;
65
- /** The end of a job. */
66
- answer: (id: number, outcome: Outcome<unknown>) => void;
67
- /** The worker failed outright, with what it said, possibly nothing. */
68
- failure: (detail: string) => void;
69
+ /** The end of a job, as the worker posted it. */
70
+ answer: (id: number, message: WorkerResponseMessage<unknown>) => void;
71
+ /**
72
+ * The worker failed outright, with what it said — possibly nothing — and
73
+ * the error event itself.
74
+ */
75
+ failure: (detail: string, event: WorkerEventLike) => void;
69
76
  }
70
77
 
71
78
  /**
@@ -121,19 +128,32 @@ export function subscribeToWorker(
121
128
  if (isProgressMessage(message)) {
122
129
  handlers.progress(message.id, message.progress);
123
130
  } else if (isResponseMessage(message)) {
124
- handlers.answer(
125
- message.id,
126
- message.ok
127
- ? { ok: true, response: message.response }
128
- : { ok: false, error: new Error(message.message) },
129
- );
131
+ handlers.answer(message.id, message);
130
132
  }
131
133
  });
132
134
  target.addEventListener('error', (event) => {
133
- handlers.failure(event.message ?? '');
135
+ handlers.failure(event.message ?? '', event);
134
136
  });
135
137
  }
136
138
 
139
+ /**
140
+ * The error a failure rejects its requests with when the channel is given no
141
+ * `failure` of its own: the job's own error or message, `<name> failed: …` for
142
+ * a worker that died, and what creating the worker threw.
143
+ * @param failure - What went wrong.
144
+ * @returns The error.
145
+ */
146
+ export function defaultFailureError(failure: WorkerFailure): Error {
147
+ if (failure.kind === 'worker') {
148
+ const suffix = failure.message === '' ? '' : `: ${failure.message}`;
149
+ return new Error(`${failure.name} failed${suffix}`);
150
+ }
151
+ if (failure.cause instanceof Error) return failure.cause;
152
+ return failure.kind === 'job'
153
+ ? new Error(failure.message)
154
+ : toError(failure.cause);
155
+ }
156
+
137
157
  /**
138
158
  * Run one job on this thread as a worker would: with a signal the channel
139
159
  * aborts, progress routed back, and every outcome — a throw included —
@@ -63,14 +63,59 @@ export interface WorkerChannelOptions<TRequest, TResponse, TProgress = never> {
63
63
  cooperativeCancel?: boolean;
64
64
  /**
65
65
  * The same job run on this thread, used instead of the worker where the page
66
- * has no `Worker` at all — Node.js, a unit test. Only a channel built from a
67
- * function that creates the worker falls back to it.
66
+ * has no `Worker` at all — Node.js, a unit test — or where creating one
67
+ * throws, as a browser refuses a page framed under an opaque origin a worker
68
+ * from its own server; every later job then runs here too. Only a channel
69
+ * built from a function that creates the worker falls back to it.
68
70
  * @default undefined — every job goes to the worker
69
71
  */
70
72
  runInProcess?: (
71
73
  request: TRequest,
72
74
  context: WorkerJobContext<TProgress>,
73
75
  ) => Promise<TResponse>;
76
+ /**
77
+ * Turn what went wrong into the error the requests reject with, so a page
78
+ * can say it in its own words — a translated message, an error class of its
79
+ * own. Answering `undefined` keeps the default error. Cancellations and
80
+ * timeouts are not failures: they keep their own error classes.
81
+ * @default undefined — the job's message, or `<name> failed: …`
82
+ */
83
+ failure?: (failure: WorkerFailure) => Error | undefined;
84
+ /**
85
+ * Post a job again, once, on a fresh worker when its worker failed before
86
+ * answering, rather than reporting the failure: a worker whose module graph
87
+ * was still loading when the channel replaced it dies without having run
88
+ * anything. A job posted with buffers to transfer is not posted twice. Only
89
+ * a channel built from a function that creates the worker can do it.
90
+ * @default false
91
+ */
92
+ retryAfterWorkerFailure?: boolean;
93
+ }
94
+
95
+ /** What went wrong, before it becomes the error a request rejects with. */
96
+ export interface WorkerFailure {
97
+ /**
98
+ * `job`: the job failed — its worker answered with a failure, or its
99
+ * in-process run threw. `worker`: the worker itself failed outright; an
100
+ * empty `message` means it never ran at all, its module graph not loading.
101
+ * `start`: creating the worker threw, and no in-process run stood in.
102
+ */
103
+ kind: 'job' | 'worker' | 'start';
104
+ /** The channel's name, e.g. `conformers`. */
105
+ name: string;
106
+ /** What was said: the job's message, the error event's, or the thrown error's. */
107
+ message: string;
108
+ /**
109
+ * The `detail` a failed answer carried, as `serveWorkerRequests` was told to
110
+ * write it — the key of a translatable message, say.
111
+ * @default undefined
112
+ */
113
+ detail?: unknown;
114
+ /**
115
+ * What the failure came with: the failed answer the worker posted, the error
116
+ * the in-process run threw, the error event, or what the factory threw.
117
+ */
118
+ cause: unknown;
74
119
  }
75
120
 
76
121
  /** What one call may ask of the channel. */
@@ -0,0 +1,181 @@
1
+ import { errorMessage } from '../../error/core/toError.ts';
2
+
3
+ import { CancelledRequestError } from './errors.ts';
4
+ import type { WorkerLike, WorkerResponseMessage } from './messages.ts';
5
+ import type { Outcome } from './workerChannelParts.ts';
6
+ import {
7
+ defaultFailureError,
8
+ subscribeToWorker,
9
+ } from './workerChannelParts.ts';
10
+ import type {
11
+ WorkerFailure,
12
+ WorkerJobContext,
13
+ WorkerSource,
14
+ } from './workerChannelTypes.ts';
15
+
16
+ /**
17
+ * The one worker a channel posts to, kept, replaced and listened to.
18
+ *
19
+ * Handed a worker, the slot holds it until it is terminated. Handed a function,
20
+ * it creates the worker on first use and again after one failed or was let go,
21
+ * and runs the jobs on this thread instead — where there is no `Worker`, or
22
+ * where creating one throws — when the channel was given an in-process run.
23
+ * What a worker posts is heard only while it is the slot's current one, so a
24
+ * worker already let go cannot settle a job it no longer runs.
25
+ * @param source - The worker, or the function that creates it.
26
+ * @param options - What the slot reports to, and how failures are worded.
27
+ * @returns The slot.
28
+ */
29
+ export function createWorkerSlot<TRequest, TResponse, TProgress>(
30
+ source: WorkerSource,
31
+ options: WorkerSlotOptions<TRequest, TResponse, TProgress>,
32
+ ): WorkerSlot<TRequest, TResponse, TProgress> {
33
+ const { name, runInProcess, failure, isWaited, report } = options;
34
+ const factory = typeof source === 'function' ? source : undefined;
35
+ let worker: WorkerLike | null = null;
36
+ let local =
37
+ factory !== undefined && !('Worker' in globalThis)
38
+ ? runInProcess
39
+ : undefined;
40
+ if (typeof source !== 'function') {
41
+ worker = source;
42
+ listen(source);
43
+ }
44
+
45
+ function fail(described: WorkerFailure): Error {
46
+ return failure?.(described) ?? defaultFailureError(described);
47
+ }
48
+
49
+ function acquire(): WorkerLike | null {
50
+ if (local !== undefined) return null;
51
+ if (worker !== null) return worker;
52
+ if (factory === undefined) {
53
+ throw new CancelledRequestError(`${name} was terminated`);
54
+ }
55
+ try {
56
+ worker = factory();
57
+ } catch (error) {
58
+ if (runInProcess === undefined) {
59
+ const message = errorMessage(error);
60
+ throw fail({ kind: 'start', name, message, cause: error });
61
+ }
62
+ local = runInProcess;
63
+ return null;
64
+ }
65
+ listen(worker);
66
+ return worker;
67
+ }
68
+
69
+ function outcomeOf(
70
+ id: number,
71
+ message: WorkerResponseMessage<unknown>,
72
+ ): Outcome<TResponse> {
73
+ if (message.ok) {
74
+ return { ok: true, response: message.response as TResponse };
75
+ }
76
+ if (!isWaited(id)) return { ok: false, error: new Error(message.message) };
77
+ const { detail } = message;
78
+ const described = { kind: 'job', name, message: message.message } as const;
79
+ return { ok: false, error: fail({ ...described, detail, cause: message }) };
80
+ }
81
+
82
+ function listen(target: WorkerLike): void {
83
+ subscribeToWorker(target, {
84
+ progress: (id, progress) => {
85
+ if (target === worker) report.progress(id, progress);
86
+ },
87
+ answer: (id, message) => {
88
+ if (target === worker) report.answer(id, outcomeOf(id, message));
89
+ },
90
+ failure: (detail, event) => {
91
+ if (target !== worker) return;
92
+ if (factory !== undefined) {
93
+ target.terminate();
94
+ worker = null;
95
+ }
96
+ report.failure(
97
+ fail({ kind: 'worker', name, message: detail, cause: event }),
98
+ );
99
+ },
100
+ });
101
+ }
102
+
103
+ return {
104
+ hasFactory: factory !== undefined,
105
+ get current() {
106
+ return worker;
107
+ },
108
+ acquire,
109
+ runLocally: (payload, context) =>
110
+ local === undefined
111
+ ? Promise.reject(new Error(`${name} has no in-process run`))
112
+ : local(payload, context),
113
+ jobFailed: (error) =>
114
+ fail({ kind: 'job', name, message: error.message, cause: error }),
115
+ abandon: () => {
116
+ if (factory === undefined || worker === null) return;
117
+ worker.terminate();
118
+ worker = null;
119
+ },
120
+ terminate: () => {
121
+ worker?.terminate();
122
+ if (factory !== undefined) worker = null;
123
+ },
124
+ };
125
+ }
126
+
127
+ /** What a slot is told about its channel. */
128
+ export interface WorkerSlotOptions<TRequest, TResponse, TProgress> {
129
+ /** The channel's name, for its errors. */
130
+ name: string;
131
+ /**
132
+ * The job run on this thread instead of a worker.
133
+ * @default undefined — every job goes to the worker
134
+ */
135
+ runInProcess?: (
136
+ request: TRequest,
137
+ context: WorkerJobContext<TProgress>,
138
+ ) => Promise<TResponse>;
139
+ /**
140
+ * The channel's own wording of a failure.
141
+ * @default undefined — the default errors
142
+ */
143
+ failure?: (failure: WorkerFailure) => Error | undefined;
144
+ /** Whether somebody still waits for a request. */
145
+ isWaited: (id: number) => boolean;
146
+ /** Where what the current worker posts goes. */
147
+ report: {
148
+ /** News about a running job. */
149
+ progress: (id: number, progress: unknown) => void;
150
+ /** The end of a job. */
151
+ answer: (id: number, outcome: Outcome<TResponse>) => void;
152
+ /** The worker failed outright, and a factory's was let go. */
153
+ failure: (error: Error) => void;
154
+ };
155
+ }
156
+
157
+ /** The worker of a channel; see {@link createWorkerSlot}. */
158
+ export interface WorkerSlot<TRequest, TResponse, TProgress> {
159
+ /** Whether the slot creates its workers, and can therefore replace one. */
160
+ readonly hasFactory: boolean;
161
+ /** The worker posted to now, if there is one. */
162
+ readonly current: WorkerLike | null;
163
+ /**
164
+ * The worker a job goes to, created if need be.
165
+ * @returns It, or `null` when the job runs on this thread instead.
166
+ * @throws {CancelledRequestError} When a worker handed over was terminated.
167
+ * @throws {Error} What creating the worker threw, worded by the channel.
168
+ */
169
+ acquire: () => WorkerLike | null;
170
+ /** Run a job on this thread, as the channel's in-process run. */
171
+ runLocally: (
172
+ payload: TRequest,
173
+ context: WorkerJobContext<TProgress>,
174
+ ) => Promise<TResponse>;
175
+ /** The error an in-process run that failed rejects with. */
176
+ jobFailed: (error: Error) => Error;
177
+ /** End a factory's worker, so the next job starts on a fresh one. */
178
+ abandon: () => void;
179
+ /** End the worker, whatever made it. */
180
+ terminate: () => void;
181
+ }
@@ -0,0 +1,145 @@
1
+ /*
2
+ * The card an answer is shown as in a chat: a site's own page under
3
+ * `?embed=1&card=1`, which mcp.cheminfo.org frames inline. Imported once by
4
+ * the site's card, after `chrome.css`, whose tokens it reads; `CardFrame` and
5
+ * the components of `react-cheminfo/card` carry the classes.
6
+ */
7
+
8
+ /* The frame is exactly as tall as the card reports, so nothing around the card
9
+ may add a pixel, and the page behind it takes the card's colour. */
10
+ body:has(.card) {
11
+ margin: 0;
12
+ background: var(--surface);
13
+ }
14
+
15
+ .card {
16
+ box-sizing: border-box;
17
+ padding: 0.6rem 0.75rem;
18
+ background: var(--surface);
19
+ color: var(--text);
20
+ font-size: 0.875rem;
21
+ }
22
+
23
+ .card a:not(.bp6-button) {
24
+ color: var(--accent);
25
+ }
26
+
27
+ /* The chat floats its own full-screen control over the top right corner of
28
+ the frame, about 40px square: the first line of a card leaves it empty. */
29
+ .card__header {
30
+ padding-right: 2.75rem;
31
+ margin: 0;
32
+ }
33
+
34
+ .card__title {
35
+ min-width: 0;
36
+ margin: 0;
37
+ font-size: 1.0625rem;
38
+ line-height: 1.35;
39
+ overflow-wrap: anywhere;
40
+ }
41
+
42
+ .card__muted {
43
+ color: var(--text-muted);
44
+ }
45
+
46
+ /* The last row of a card: a remark, then the actions — copying its table, the
47
+ way to the site's page — keeping its right edge together. */
48
+ .card__end {
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ align-items: center;
52
+ justify-content: flex-end;
53
+ margin-top: 0.35rem;
54
+ gap: 0.25rem 0.5rem;
55
+ }
56
+
57
+ .card__note {
58
+ min-width: 0;
59
+ flex: 1;
60
+ margin: 0;
61
+ color: var(--text-muted);
62
+ font-size: 0.8125rem;
63
+ }
64
+
65
+ /* A dialog a card opens is as tall as what it holds: the card grows to hold
66
+ it, where Blueprint would cut its body to seven tenths of a frame that is
67
+ only as tall as the card. */
68
+ body:has(.card) .bp6-dialog-body-scroll-container {
69
+ max-height: none;
70
+ }
71
+
72
+ /* The tooltip of a card's action names it in a few words: the family's help
73
+ card, at the width of its text rather than at the measure of a paragraph. */
74
+ .help-tooltip.card-tooltip .bp6-popover-content {
75
+ width: auto;
76
+ max-width: 300px;
77
+ }
78
+
79
+ /* ── A figure, and the glyphs that take it away ─────────────────────────── */
80
+
81
+ /* The glyphs stand in a column beside the figure's top right corner: over the
82
+ drawing they would hide part of a curve or an atom. */
83
+ .card-figure {
84
+ position: relative;
85
+ width: fit-content;
86
+ min-width: 0;
87
+ max-width: 100%;
88
+ padding-right: 30px;
89
+ }
90
+
91
+ /* A grid of structures takes the width it is given. */
92
+ .card-figure--fill {
93
+ width: auto;
94
+ }
95
+
96
+ /* Faded until the figure is pointed at, as the chat's own glyphs are, and at
97
+ full strength while one holds the focus or has its panel open. Inset by the
98
+ width of a focus ring, which the layer around them would otherwise cut. */
99
+ .card-figure__tools {
100
+ position: absolute;
101
+ top: 3px;
102
+ right: 3px;
103
+ display: flex;
104
+ flex-direction: column;
105
+ gap: 2px;
106
+ opacity: 0.6;
107
+ pointer-events: auto;
108
+ transition: opacity 120ms ease;
109
+ }
110
+
111
+ .card-figure:hover .card-figure__tools,
112
+ .card-figure__tools:focus-within,
113
+ .card-figure__tools:has([aria-expanded='true']) {
114
+ opacity: 1;
115
+ }
116
+
117
+ /* A finger has nothing to point with before it taps, and gets the larger
118
+ glyphs: the column widens with them. */
119
+ @media (hover: none) {
120
+ .card-figure__tools {
121
+ opacity: 1;
122
+ }
123
+ }
124
+
125
+ @media (pointer: coarse) {
126
+ .card-figure {
127
+ padding-right: 46px;
128
+ }
129
+ }
130
+
131
+ /* ── Copying a table ────────────────────────────────────────────────────── */
132
+
133
+ /* A heading of a few letters has room for the glyph alone; the label stays the
134
+ button's accessible name. */
135
+ .card__copy-table--glyph .bp6-button-text {
136
+ display: none;
137
+ }
138
+
139
+ /* On a narrow frame the last row has no room for two labelled buttons: the
140
+ table's copy keeps its glyph, and its tooltip says what it does. */
141
+ @media (width <= 30rem) {
142
+ .card__copy-table .bp6-button-text {
143
+ display: none;
144
+ }
145
+ }
package/styles/chrome.css CHANGED
@@ -1574,3 +1574,251 @@ span.taxon-lineage__name {
1574
1574
  display: none !important;
1575
1575
  }
1576
1576
  }
1577
+
1578
+ /* ── The footer's note ───────────────────────────────────────────────────── */
1579
+
1580
+ /* One line a site adds under the family — what its links can be handed out as.
1581
+ The footer stacks only when it carries one, so a footer without a note is
1582
+ laid out as it always was, and no site re-declares `.app-footer__inner`. */
1583
+ .app-footer__inner:has(> .app-footer__note) {
1584
+ display: flex;
1585
+ flex-direction: column;
1586
+ gap: 0.75rem;
1587
+ }
1588
+
1589
+ .app-footer__note {
1590
+ margin: 0;
1591
+ color: var(--text-muted);
1592
+ font-size: 0.8125rem;
1593
+ }
1594
+
1595
+ .app-footer__note a {
1596
+ color: var(--accent);
1597
+ }
1598
+
1599
+ /* ── The site shell ──────────────────────────────────────────────────────── */
1600
+
1601
+ /* The bar and the page own the screen they open on, so the family links in
1602
+ the footer are always reached by scrolling. */
1603
+ .site-shell {
1604
+ display: flex;
1605
+ min-height: 100dvh;
1606
+ flex-direction: column;
1607
+ }
1608
+
1609
+ .site-shell__main {
1610
+ width: 100%;
1611
+ max-width: var(--page-max);
1612
+ flex: 1 1 auto;
1613
+ padding: 16px 1.25rem 24px;
1614
+ margin: 0 auto;
1615
+ }
1616
+
1617
+ /* Under a bar that runs full width, the page does too. */
1618
+ .site-shell__main--full {
1619
+ max-width: none;
1620
+ }
1621
+
1622
+ /* Framed in another site: the frame is the margin, and it is usually narrow. */
1623
+ .site-shell__main--embedded {
1624
+ max-width: none;
1625
+ padding: 8px;
1626
+ }
1627
+
1628
+ @media (max-width: 40rem) {
1629
+ .site-shell__main:not(.site-shell__main--embedded) {
1630
+ padding-inline: 0.5rem;
1631
+ }
1632
+ }
1633
+
1634
+ /* ── A graded series ─────────────────────────────────────────────────────── */
1635
+
1636
+ .exercise-series {
1637
+ display: flex;
1638
+ flex-direction: column;
1639
+ gap: 0.75rem;
1640
+ }
1641
+
1642
+ .exercise-series__head {
1643
+ display: flex;
1644
+ flex-wrap: wrap;
1645
+ align-items: center;
1646
+ justify-content: space-between;
1647
+ gap: 0.5rem;
1648
+ }
1649
+
1650
+ .exercise-series__title {
1651
+ margin: 0;
1652
+ font-size: 1rem;
1653
+ font-weight: 700;
1654
+ }
1655
+
1656
+ .exercise-series__controls {
1657
+ display: flex;
1658
+ flex-wrap: wrap;
1659
+ gap: 0.5rem;
1660
+ }
1661
+
1662
+ /* The list and the open question share the row at the share the address
1663
+ names, so no width is written here: `SplitRow` divides it. */
1664
+ .exercise-series__list {
1665
+ display: flex;
1666
+ flex-direction: column;
1667
+ gap: 2px;
1668
+ }
1669
+
1670
+ .exercise-series__number {
1671
+ color: var(--text-muted);
1672
+ font-variant-numeric: tabular-nums;
1673
+ }
1674
+
1675
+ .series-question {
1676
+ display: flex;
1677
+ min-width: 0;
1678
+ flex-direction: column;
1679
+ gap: 0.75rem;
1680
+ }
1681
+
1682
+ .series-question__meta {
1683
+ display: flex;
1684
+ align-items: center;
1685
+ color: var(--text-muted);
1686
+ font-size: 0.8125rem;
1687
+ gap: 0.5rem;
1688
+ }
1689
+
1690
+ .series-question__prompt p {
1691
+ margin: 0;
1692
+ font-size: 1.0625rem;
1693
+ }
1694
+
1695
+ .series-question__solution {
1696
+ margin: 0 0 0.5rem;
1697
+ }
1698
+
1699
+ .series-question__next {
1700
+ margin-left: 0.75rem;
1701
+ }
1702
+
1703
+ .series-answers {
1704
+ display: flex;
1705
+ flex-wrap: wrap;
1706
+ gap: 0 1rem;
1707
+ }
1708
+
1709
+ .series-answers__field {
1710
+ width: 10rem;
1711
+ }
1712
+
1713
+ /* A formula is read character by character, so its box is set monospace. */
1714
+ .formula-input input {
1715
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1716
+ }
1717
+
1718
+ /* ── A list of exercises ─────────────────────────────────────────────────── */
1719
+
1720
+ .exercise-list {
1721
+ display: flex;
1722
+ flex-direction: column;
1723
+ gap: 10px;
1724
+ }
1725
+
1726
+ .exercise-list__rows {
1727
+ display: flex;
1728
+ overflow: auto;
1729
+ max-height: 30rem;
1730
+ flex-direction: column;
1731
+ gap: 2px;
1732
+ }
1733
+
1734
+ .exercise-list__item {
1735
+ display: flex;
1736
+ flex-wrap: wrap;
1737
+ align-items: center;
1738
+ padding: 5px 7px;
1739
+ border: 1px solid transparent;
1740
+ border-radius: var(--radius);
1741
+ background: none;
1742
+ color: var(--text-muted);
1743
+ font: inherit;
1744
+ font-size: 0.875rem;
1745
+ gap: 6px;
1746
+ text-align: left;
1747
+ cursor: pointer;
1748
+ }
1749
+
1750
+ .exercise-list__item:hover {
1751
+ background: var(--surface-sunken);
1752
+ color: var(--text);
1753
+ }
1754
+
1755
+ /* The brand tint says which one is open, as it says which page is. */
1756
+ .exercise-list__item--active,
1757
+ .exercise-list__item--active:hover {
1758
+ border-color: color-mix(in oklab, var(--accent) 30%, white);
1759
+ background: color-mix(in oklab, var(--accent) 12%, white);
1760
+ color: var(--accent);
1761
+ }
1762
+
1763
+ .exercise-list__title {
1764
+ min-width: 0;
1765
+ flex: 1 1 6rem;
1766
+ font-weight: 600;
1767
+ }
1768
+
1769
+ /* The tags travel together: left loose in the row, a long title strands the
1770
+ level at the end of one line and drops the kind onto the next. */
1771
+ .exercise-list__tags {
1772
+ display: inline-flex;
1773
+ flex: 0 0 auto;
1774
+ flex-wrap: nowrap;
1775
+ align-items: center;
1776
+ gap: 6px;
1777
+ }
1778
+
1779
+ /* ── A table of properties ───────────────────────────────────────────────── */
1780
+
1781
+ .properties__title {
1782
+ margin: 0 0 0.35rem;
1783
+ color: var(--text-muted);
1784
+ font-size: 0.75rem;
1785
+ font-weight: 700;
1786
+ letter-spacing: 0.04em;
1787
+ text-transform: uppercase;
1788
+ }
1789
+
1790
+ .properties__table {
1791
+ width: 100%;
1792
+ border-collapse: collapse;
1793
+ font-size: 0.875rem;
1794
+ }
1795
+
1796
+ .properties__table th {
1797
+ padding: 0.3rem 0.75rem 0.3rem 0;
1798
+ color: var(--text-muted);
1799
+ font-weight: 500;
1800
+ text-align: left;
1801
+ vertical-align: top;
1802
+ }
1803
+
1804
+ .properties__table td {
1805
+ padding: 0.3rem 22px 0.3rem 0;
1806
+ font-variant-numeric: tabular-nums;
1807
+ text-align: right;
1808
+ vertical-align: top;
1809
+ word-break: break-all;
1810
+ }
1811
+
1812
+ .properties__note {
1813
+ display: block;
1814
+ color: var(--text-faint);
1815
+ font-size: 0.75rem;
1816
+ }
1817
+
1818
+ .properties__table td code {
1819
+ display: inline-block;
1820
+ max-width: 100%;
1821
+ font-size: 0.8125rem;
1822
+ text-align: left;
1823
+ word-break: break-all;
1824
+ }