react-cheminfo 0.24.0 → 0.26.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 (432) hide show
  1. package/README.md +73 -2
  2. package/bin/check-messages.mjs +229 -0
  3. package/lib/about/ui/AboutBuild.d.ts.map +1 -1
  4. package/lib/about/ui/AboutBuild.js +15 -4
  5. package/lib/about/ui/AboutBuild.js.map +1 -1
  6. package/lib/about/ui/AboutCitations.d.ts.map +1 -1
  7. package/lib/about/ui/AboutCitations.js +3 -1
  8. package/lib/about/ui/AboutCitations.js.map +1 -1
  9. package/lib/about/ui/AboutPage.d.ts.map +1 -1
  10. package/lib/about/ui/AboutPage.js +9 -1
  11. package/lib/about/ui/AboutPage.js.map +1 -1
  12. package/lib/about/ui/AboutProvidedBy.d.ts.map +1 -1
  13. package/lib/about/ui/AboutProvidedBy.js +8 -3
  14. package/lib/about/ui/AboutProvidedBy.js.map +1 -1
  15. package/lib/capsule/ui/Capsule.d.ts +30 -0
  16. package/lib/capsule/ui/Capsule.d.ts.map +1 -0
  17. package/lib/capsule/ui/Capsule.js +12 -0
  18. package/lib/capsule/ui/Capsule.js.map +1 -0
  19. package/lib/capsule/ui/CapsuleFilter.d.ts +19 -3
  20. package/lib/capsule/ui/CapsuleFilter.d.ts.map +1 -1
  21. package/lib/capsule/ui/CapsuleFilter.js +14 -44
  22. package/lib/capsule/ui/CapsuleFilter.js.map +1 -1
  23. package/lib/capsule/ui/capsuleFilterCapsules.d.ts +15 -0
  24. package/lib/capsule/ui/capsuleFilterCapsules.d.ts.map +1 -0
  25. package/lib/capsule/ui/capsuleFilterCapsules.js +47 -0
  26. package/lib/capsule/ui/capsuleFilterCapsules.js.map +1 -0
  27. package/lib/chart/ui/ChartTrackingLayer.d.ts.map +1 -1
  28. package/lib/chart/ui/ChartTrackingLayer.js +4 -2
  29. package/lib/chart/ui/ChartTrackingLayer.js.map +1 -1
  30. package/lib/chrome/ui/SiteHeader.d.ts +1 -1
  31. package/lib/chrome/ui/SiteHeader.d.ts.map +1 -1
  32. package/lib/chrome/ui/SiteHeader.js +4 -2
  33. package/lib/chrome/ui/SiteHeader.js.map +1 -1
  34. package/lib/citation/ui/CitationMenu.d.ts +1 -1
  35. package/lib/citation/ui/CitationMenu.d.ts.map +1 -1
  36. package/lib/citation/ui/CitationMenu.js +7 -3
  37. package/lib/citation/ui/CitationMenu.js.map +1 -1
  38. package/lib/citation/ui/CiteButton.d.ts +1 -1
  39. package/lib/citation/ui/CiteButton.d.ts.map +1 -1
  40. package/lib/citation/ui/CiteButton.js +3 -1
  41. package/lib/citation/ui/CiteButton.js.map +1 -1
  42. package/lib/citation/ui/CopyFormatEntries.d.ts.map +1 -1
  43. package/lib/citation/ui/CopyFormatEntries.js +3 -1
  44. package/lib/citation/ui/CopyFormatEntries.js.map +1 -1
  45. package/lib/citation/ui/WorkEntry.d.ts.map +1 -1
  46. package/lib/citation/ui/WorkEntry.js +3 -1
  47. package/lib/citation/ui/WorkEntry.js.map +1 -1
  48. package/lib/citation/ui/entries.d.ts.map +1 -1
  49. package/lib/citation/ui/entries.js +8 -2
  50. package/lib/citation/ui/entries.js.map +1 -1
  51. package/lib/citation/ui/useCopyFeedback.d.ts.map +1 -1
  52. package/lib/citation/ui/useCopyFeedback.js +9 -4
  53. package/lib/citation/ui/useCopyFeedback.js.map +1 -1
  54. package/lib/clipboard/ui/ClickToCopy.d.ts.map +1 -1
  55. package/lib/clipboard/ui/ClickToCopy.js +12 -6
  56. package/lib/clipboard/ui/ClickToCopy.js.map +1 -1
  57. package/lib/clipboard/ui/CopyButton.d.ts +3 -3
  58. package/lib/clipboard/ui/CopyButton.d.ts.map +1 -1
  59. package/lib/clipboard/ui/CopyButton.js +7 -4
  60. package/lib/clipboard/ui/CopyButton.js.map +1 -1
  61. package/lib/color/ui/ColorScaleEditor.d.ts.map +1 -1
  62. package/lib/color/ui/ColorScaleEditor.js +15 -10
  63. package/lib/color/ui/ColorScaleEditor.js.map +1 -1
  64. package/lib/color/ui/ColorScaleEntry.d.ts.map +1 -1
  65. package/lib/color/ui/ColorScaleEntry.js +4 -2
  66. package/lib/color/ui/ColorScaleEntry.js.map +1 -1
  67. package/lib/color/ui/ColorScaleLegend.d.ts.map +1 -1
  68. package/lib/color/ui/ColorScaleLegend.js +7 -1
  69. package/lib/color/ui/ColorScaleLegend.js.map +1 -1
  70. package/lib/color/ui/ColorScaleSelect.d.ts.map +1 -1
  71. package/lib/color/ui/ColorScaleSelect.js +8 -4
  72. package/lib/color/ui/ColorScaleSelect.js.map +1 -1
  73. package/lib/confirm/ui/ConfirmButton.d.ts +2 -2
  74. package/lib/confirm/ui/ConfirmButton.d.ts.map +1 -1
  75. package/lib/confirm/ui/ConfirmButton.js +4 -2
  76. package/lib/confirm/ui/ConfirmButton.js.map +1 -1
  77. package/lib/core.d.ts +1 -0
  78. package/lib/core.d.ts.map +1 -1
  79. package/lib/core.js +1 -0
  80. package/lib/core.js.map +1 -1
  81. package/lib/credits/ui/CreditsList.d.ts.map +1 -1
  82. package/lib/credits/ui/CreditsList.js +3 -1
  83. package/lib/credits/ui/CreditsList.js.map +1 -1
  84. package/lib/delimited/ui/DelimitedTextDialog.d.ts.map +1 -1
  85. package/lib/delimited/ui/DelimitedTextDialog.js +5 -2
  86. package/lib/delimited/ui/DelimitedTextDialog.js.map +1 -1
  87. package/lib/delimited/ui/DelimitedTextPanel.d.ts.map +1 -1
  88. package/lib/delimited/ui/DelimitedTextPanel.js +8 -8
  89. package/lib/delimited/ui/DelimitedTextPanel.js.map +1 -1
  90. package/lib/download/ui/FigureDownload.d.ts +2 -2
  91. package/lib/download/ui/FigureDownload.d.ts.map +1 -1
  92. package/lib/download/ui/FigureDownload.js +4 -2
  93. package/lib/download/ui/FigureDownload.js.map +1 -1
  94. package/lib/download/ui/FigureDownloadPanel.d.ts.map +1 -1
  95. package/lib/download/ui/FigureDownloadPanel.js +24 -18
  96. package/lib/download/ui/FigureDownloadPanel.js.map +1 -1
  97. package/lib/ecosystem/core/sites.d.ts.map +1 -1
  98. package/lib/ecosystem/core/sites.js +4 -2
  99. package/lib/ecosystem/core/sites.js.map +1 -1
  100. package/lib/ecosystem/ui/EcosystemButton.d.ts +1 -1
  101. package/lib/ecosystem/ui/EcosystemButton.d.ts.map +1 -1
  102. package/lib/ecosystem/ui/EcosystemButton.js +4 -2
  103. package/lib/ecosystem/ui/EcosystemButton.js.map +1 -1
  104. package/lib/ecosystem/ui/EcosystemLinks.d.ts +1 -1
  105. package/lib/ecosystem/ui/EcosystemLinks.d.ts.map +1 -1
  106. package/lib/ecosystem/ui/EcosystemLinks.js +5 -2
  107. package/lib/ecosystem/ui/EcosystemLinks.js.map +1 -1
  108. package/lib/ecosystem/ui/EcosystemMenu.d.ts.map +1 -1
  109. package/lib/ecosystem/ui/EcosystemMenu.js +3 -1
  110. package/lib/ecosystem/ui/EcosystemMenu.js.map +1 -1
  111. package/lib/ecosystem/ui/SiteGroupSection.d.ts.map +1 -1
  112. package/lib/ecosystem/ui/SiteGroupSection.js +3 -1
  113. package/lib/ecosystem/ui/SiteGroupSection.js.map +1 -1
  114. package/lib/ecosystem/ui/SiteTile.d.ts.map +1 -1
  115. package/lib/ecosystem/ui/SiteTile.js +3 -1
  116. package/lib/ecosystem/ui/SiteTile.js.map +1 -1
  117. package/lib/ecosystem/ui/glyphs.d.ts.map +1 -1
  118. package/lib/ecosystem/ui/glyphs.js +6 -5
  119. package/lib/ecosystem/ui/glyphs.js.map +1 -1
  120. package/lib/error/ui/ErrorFallback.d.ts +2 -2
  121. package/lib/error/ui/ErrorFallback.d.ts.map +1 -1
  122. package/lib/error/ui/ErrorFallback.js +4 -2
  123. package/lib/error/ui/ErrorFallback.js.map +1 -1
  124. package/lib/help/ui/HelpBody.d.ts.map +1 -1
  125. package/lib/help/ui/HelpBody.js +3 -1
  126. package/lib/help/ui/HelpBody.js.map +1 -1
  127. package/lib/help/ui/HelpIcon.d.ts +2 -1
  128. package/lib/help/ui/HelpIcon.d.ts.map +1 -1
  129. package/lib/help/ui/HelpIcon.js +4 -2
  130. package/lib/help/ui/HelpIcon.js.map +1 -1
  131. package/lib/help/ui/HelpToolbarButton.d.ts.map +1 -1
  132. package/lib/help/ui/HelpToolbarButton.js +3 -1
  133. package/lib/help/ui/HelpToolbarButton.js.map +1 -1
  134. package/lib/help/ui/helpName.d.ts +5 -1
  135. package/lib/help/ui/helpName.d.ts.map +1 -1
  136. package/lib/help/ui/helpName.js +4 -2
  137. package/lib/help/ui/helpName.js.map +1 -1
  138. package/lib/i18n/core/chromeCatalog.d.ts +21 -0
  139. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -0
  140. package/lib/i18n/core/chromeCatalog.js +29 -0
  141. package/lib/i18n/core/chromeCatalog.js.map +1 -0
  142. package/lib/i18n/core/index.d.ts +12 -0
  143. package/lib/i18n/core/index.d.ts.map +1 -0
  144. package/lib/i18n/core/index.js +6 -0
  145. package/lib/i18n/core/index.js.map +1 -0
  146. package/lib/i18n/core/languages.d.ts +32 -0
  147. package/lib/i18n/core/languages.d.ts.map +1 -0
  148. package/lib/i18n/core/languages.js +41 -0
  149. package/lib/i18n/core/languages.js.map +1 -0
  150. package/lib/i18n/core/messageCatalog.d.ts +113 -0
  151. package/lib/i18n/core/messageCatalog.d.ts.map +1 -0
  152. package/lib/i18n/core/messageCatalog.js +135 -0
  153. package/lib/i18n/core/messageCatalog.js.map +1 -0
  154. package/lib/i18n/core/messageValues.d.ts +3 -0
  155. package/lib/i18n/core/messageValues.d.ts.map +1 -0
  156. package/lib/i18n/core/messageValues.js +2 -0
  157. package/lib/i18n/core/messageValues.js.map +1 -0
  158. package/lib/i18n/core/session.d.ts +51 -0
  159. package/lib/i18n/core/session.d.ts.map +1 -0
  160. package/lib/i18n/core/session.js +64 -0
  161. package/lib/i18n/core/session.js.map +1 -0
  162. package/lib/i18n/core/translateSetup.d.ts +28 -0
  163. package/lib/i18n/core/translateSetup.d.ts.map +1 -0
  164. package/lib/i18n/core/translateSetup.js +30 -0
  165. package/lib/i18n/core/translateSetup.js.map +1 -0
  166. package/lib/i18n/ui/LanguageSelect.d.ts +37 -0
  167. package/lib/i18n/ui/LanguageSelect.d.ts.map +1 -0
  168. package/lib/i18n/ui/LanguageSelect.js +27 -0
  169. package/lib/i18n/ui/LanguageSelect.js.map +1 -0
  170. package/lib/i18n/ui/index.d.ts +6 -0
  171. package/lib/i18n/ui/index.d.ts.map +1 -0
  172. package/lib/i18n/ui/index.js +4 -0
  173. package/lib/i18n/ui/index.js.map +1 -0
  174. package/lib/i18n/ui/useLanguage.d.ts +23 -0
  175. package/lib/i18n/ui/useLanguage.d.ts.map +1 -0
  176. package/lib/i18n/ui/useLanguage.js +36 -0
  177. package/lib/i18n/ui/useLanguage.js.map +1 -0
  178. package/lib/i18n/ui/useT.d.ts +47 -0
  179. package/lib/i18n/ui/useT.d.ts.map +1 -0
  180. package/lib/i18n/ui/useT.js +51 -0
  181. package/lib/i18n/ui/useT.js.map +1 -0
  182. package/lib/locales/de.json +442 -0
  183. package/lib/locales/en.json +442 -0
  184. package/lib/locales/es.json +442 -0
  185. package/lib/locales/fr.json +442 -0
  186. package/lib/molecule3d/core/gestures.d.ts +10 -0
  187. package/lib/molecule3d/core/gestures.d.ts.map +1 -1
  188. package/lib/molecule3d/core/gestures.js +39 -7
  189. package/lib/molecule3d/core/gestures.js.map +1 -1
  190. package/lib/molecule3d/ui/Molecule3DExport.d.ts.map +1 -1
  191. package/lib/molecule3d/ui/Molecule3DExport.js +3 -1
  192. package/lib/molecule3d/ui/Molecule3DExport.js.map +1 -1
  193. package/lib/molecule3d/ui/Molecule3DHelp.d.ts.map +1 -1
  194. package/lib/molecule3d/ui/Molecule3DHelp.js +7 -2
  195. package/lib/molecule3d/ui/Molecule3DHelp.js.map +1 -1
  196. package/lib/molecule3d/ui/Molecule3DOptions.d.ts.map +1 -1
  197. package/lib/molecule3d/ui/Molecule3DOptions.js +9 -9
  198. package/lib/molecule3d/ui/Molecule3DOptions.js.map +1 -1
  199. package/lib/molecule3d/ui/Molecule3DSurfaceColors.d.ts.map +1 -1
  200. package/lib/molecule3d/ui/Molecule3DSurfaceColors.js +8 -8
  201. package/lib/molecule3d/ui/Molecule3DSurfaceColors.js.map +1 -1
  202. package/lib/molecule3d/ui/Molecule3DToolbar.d.ts.map +1 -1
  203. package/lib/molecule3d/ui/Molecule3DToolbar.js +15 -10
  204. package/lib/molecule3d/ui/Molecule3DToolbar.js.map +1 -1
  205. package/lib/molecule3d/ui/MoleculeViewer3D.d.ts.map +1 -1
  206. package/lib/molecule3d/ui/MoleculeViewer3D.js +6 -3
  207. package/lib/molecule3d/ui/MoleculeViewer3D.js.map +1 -1
  208. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -1
  209. package/lib/orbital/ui/AtomicOrbitalCanvas.js +3 -1
  210. package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -1
  211. package/lib/orbital/ui/AtomicOrbitalControls.d.ts.map +1 -1
  212. package/lib/orbital/ui/AtomicOrbitalControls.js +12 -15
  213. package/lib/orbital/ui/AtomicOrbitalControls.js.map +1 -1
  214. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -1
  215. package/lib/orbital/ui/AtomicOrbitalViewer.js +6 -3
  216. package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -1
  217. package/lib/orbital/ui/capability.d.ts +4 -0
  218. package/lib/orbital/ui/capability.d.ts.map +1 -1
  219. package/lib/orbital/ui/capability.js +4 -0
  220. package/lib/orbital/ui/capability.js.map +1 -1
  221. package/lib/overlay/ui/OverlayBar.d.ts +1 -1
  222. package/lib/overlay/ui/OverlayBar.d.ts.map +1 -1
  223. package/lib/overlay/ui/OverlayBar.js +6 -3
  224. package/lib/overlay/ui/OverlayBar.js.map +1 -1
  225. package/lib/overlay/ui/OverlayInfo.d.ts +1 -1
  226. package/lib/overlay/ui/OverlayInfo.d.ts.map +1 -1
  227. package/lib/overlay/ui/OverlayInfo.js +5 -2
  228. package/lib/overlay/ui/OverlayInfo.js.map +1 -1
  229. package/lib/overlay/ui/OverlayPanel.d.ts +9 -2
  230. package/lib/overlay/ui/OverlayPanel.d.ts.map +1 -1
  231. package/lib/overlay/ui/OverlayPanel.js +5 -11
  232. package/lib/overlay/ui/OverlayPanel.js.map +1 -1
  233. package/lib/overlay/ui/OverlayReadout.d.ts.map +1 -1
  234. package/lib/overlay/ui/OverlayReadout.js +3 -1
  235. package/lib/overlay/ui/OverlayReadout.js.map +1 -1
  236. package/lib/pedagogy/ui/ExerciseActions.d.ts +1 -1
  237. package/lib/pedagogy/ui/ExerciseActions.d.ts.map +1 -1
  238. package/lib/pedagogy/ui/ExerciseActions.js +9 -2
  239. package/lib/pedagogy/ui/ExerciseActions.js.map +1 -1
  240. package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts +1 -1
  241. package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts.map +1 -1
  242. package/lib/pedagogy/ui/ExerciseProgressHeader.js +9 -5
  243. package/lib/pedagogy/ui/ExerciseProgressHeader.js.map +1 -1
  244. package/lib/pedagogy/ui/GlossaryIndex.d.ts +1 -1
  245. package/lib/pedagogy/ui/GlossaryIndex.d.ts.map +1 -1
  246. package/lib/pedagogy/ui/GlossaryIndex.js +6 -8
  247. package/lib/pedagogy/ui/GlossaryIndex.js.map +1 -1
  248. package/lib/pedagogy/ui/HintLadder.d.ts +2 -2
  249. package/lib/pedagogy/ui/HintLadder.d.ts.map +1 -1
  250. package/lib/pedagogy/ui/HintLadder.js +8 -2
  251. package/lib/pedagogy/ui/HintLadder.js.map +1 -1
  252. package/lib/pedagogy/ui/SyntaxTooltip.d.ts +4 -4
  253. package/lib/pedagogy/ui/SyntaxTooltip.d.ts.map +1 -1
  254. package/lib/pedagogy/ui/SyntaxTooltip.js +4 -2
  255. package/lib/pedagogy/ui/SyntaxTooltip.js.map +1 -1
  256. package/lib/pedagogy/ui/TutorialStepStrip.d.ts.map +1 -1
  257. package/lib/pedagogy/ui/TutorialStepStrip.js +7 -2
  258. package/lib/pedagogy/ui/TutorialStepStrip.js.map +1 -1
  259. package/lib/periodic/ui/CategoryLegend.d.ts.map +1 -1
  260. package/lib/periodic/ui/CategoryLegend.js +3 -1
  261. package/lib/periodic/ui/CategoryLegend.js.map +1 -1
  262. package/lib/periodic/ui/ElementCell.d.ts.map +1 -1
  263. package/lib/periodic/ui/ElementCell.js +7 -1
  264. package/lib/periodic/ui/ElementCell.js.map +1 -1
  265. package/lib/periodic/ui/PeriodicTable.d.ts.map +1 -1
  266. package/lib/periodic/ui/PeriodicTable.js +3 -1
  267. package/lib/periodic/ui/PeriodicTable.js.map +1 -1
  268. package/lib/periodic/ui/PeriodicTableChrome.d.ts.map +1 -1
  269. package/lib/periodic/ui/PeriodicTableChrome.js +4 -2
  270. package/lib/periodic/ui/PeriodicTableChrome.js.map +1 -1
  271. package/lib/share/ui/ShareButton.d.ts +2 -2
  272. package/lib/share/ui/ShareButton.d.ts.map +1 -1
  273. package/lib/share/ui/ShareButton.js +5 -2
  274. package/lib/share/ui/ShareButton.js.map +1 -1
  275. package/lib/share/ui/ShareConfigOptions.d.ts.map +1 -1
  276. package/lib/share/ui/ShareConfigOptions.js +4 -2
  277. package/lib/share/ui/ShareConfigOptions.js.map +1 -1
  278. package/lib/share/ui/ShareDialog.d.ts.map +1 -1
  279. package/lib/share/ui/ShareDialog.js +3 -1
  280. package/lib/share/ui/ShareDialog.js.map +1 -1
  281. package/lib/share/ui/ShareDialogContent.d.ts.map +1 -1
  282. package/lib/share/ui/ShareDialogContent.js +10 -1
  283. package/lib/share/ui/ShareDialogContent.js.map +1 -1
  284. package/lib/share/ui/SharePresetTabs.d.ts.map +1 -1
  285. package/lib/share/ui/SharePresetTabs.js +3 -1
  286. package/lib/share/ui/SharePresetTabs.js.map +1 -1
  287. package/lib/slides/ui/BackToSlides.d.ts.map +1 -1
  288. package/lib/slides/ui/BackToSlides.js +4 -2
  289. package/lib/slides/ui/BackToSlides.js.map +1 -1
  290. package/lib/slides/ui/EmbedSlide.d.ts.map +1 -1
  291. package/lib/slides/ui/EmbedSlide.js +3 -1
  292. package/lib/slides/ui/EmbedSlide.js.map +1 -1
  293. package/lib/slides/ui/Slide.d.ts.map +1 -1
  294. package/lib/slides/ui/Slide.js +3 -1
  295. package/lib/slides/ui/Slide.js.map +1 -1
  296. package/lib/slides/ui/SlideshowBar.d.ts.map +1 -1
  297. package/lib/slides/ui/SlideshowBar.js +5 -3
  298. package/lib/slides/ui/SlideshowBar.js.map +1 -1
  299. package/lib/slides/ui/TalkList.d.ts +1 -1
  300. package/lib/slides/ui/TalkList.d.ts.map +1 -1
  301. package/lib/slides/ui/TalkList.js +4 -2
  302. package/lib/slides/ui/TalkList.js.map +1 -1
  303. package/lib/structure/core/editorGuide.d.ts +14 -0
  304. package/lib/structure/core/editorGuide.d.ts.map +1 -1
  305. package/lib/structure/core/editorGuide.js +117 -19
  306. package/lib/structure/core/editorGuide.js.map +1 -1
  307. package/lib/structure/core/editorToolbar.d.ts +3 -1
  308. package/lib/structure/core/editorToolbar.d.ts.map +1 -1
  309. package/lib/structure/core/editorToolbar.js +44 -23
  310. package/lib/structure/core/editorToolbar.js.map +1 -1
  311. package/lib/structure/ui/EditorHelpButton.d.ts.map +1 -1
  312. package/lib/structure/ui/EditorHelpButton.js +3 -2
  313. package/lib/structure/ui/EditorHelpButton.js.map +1 -1
  314. package/lib/structure/ui/StructureEditor.d.ts.map +1 -1
  315. package/lib/structure/ui/StructureEditor.js +3 -1
  316. package/lib/structure/ui/StructureEditor.js.map +1 -1
  317. package/lib/structure/ui/StructureEditorHelp.d.ts.map +1 -1
  318. package/lib/structure/ui/StructureEditorHelp.js +12 -3
  319. package/lib/structure/ui/StructureEditorHelp.js.map +1 -1
  320. package/lib/structure/ui/ToolbarTooltip.d.ts.map +1 -1
  321. package/lib/structure/ui/ToolbarTooltip.js +5 -3
  322. package/lib/structure/ui/ToolbarTooltip.js.map +1 -1
  323. package/lib/translate/core/index.d.ts +1 -1
  324. package/lib/translate/core/index.d.ts.map +1 -1
  325. package/lib/translate/core/start.d.ts +35 -2
  326. package/lib/translate/core/start.d.ts.map +1 -1
  327. package/lib/translate/core/start.js +23 -4
  328. package/lib/translate/core/start.js.map +1 -1
  329. package/lib/ui.d.ts +1 -0
  330. package/lib/ui.d.ts.map +1 -1
  331. package/lib/ui.js +1 -0
  332. package/lib/ui.js.map +1 -1
  333. package/package.json +4 -2
  334. package/src/about/ui/AboutBuild.tsx +23 -16
  335. package/src/about/ui/AboutCitations.tsx +3 -1
  336. package/src/about/ui/AboutPage.tsx +38 -12
  337. package/src/about/ui/AboutProvidedBy.tsx +13 -3
  338. package/src/capsule/ui/Capsule.tsx +48 -0
  339. package/src/capsule/ui/CapsuleFilter.tsx +38 -114
  340. package/src/capsule/ui/capsuleFilterCapsules.tsx +110 -0
  341. package/src/chart/ui/ChartTrackingLayer.tsx +4 -2
  342. package/src/chrome/ui/SiteHeader.tsx +5 -3
  343. package/src/citation/ui/CitationMenu.tsx +9 -5
  344. package/src/citation/ui/CiteButton.tsx +4 -2
  345. package/src/citation/ui/CopyFormatEntries.tsx +3 -1
  346. package/src/citation/ui/WorkEntry.tsx +5 -3
  347. package/src/citation/ui/entries.tsx +9 -2
  348. package/src/citation/ui/useCopyFeedback.ts +11 -4
  349. package/src/clipboard/ui/ClickToCopy.tsx +15 -5
  350. package/src/clipboard/ui/CopyButton.tsx +14 -10
  351. package/src/color/ui/ColorScaleEditor.tsx +17 -15
  352. package/src/color/ui/ColorScaleEntry.tsx +7 -3
  353. package/src/color/ui/ColorScaleLegend.tsx +7 -1
  354. package/src/color/ui/ColorScaleSelect.tsx +12 -6
  355. package/src/confirm/ui/ConfirmButton.tsx +9 -11
  356. package/src/core.ts +1 -0
  357. package/src/credits/ui/CreditsList.tsx +5 -1
  358. package/src/delimited/ui/DelimitedTextDialog.tsx +10 -10
  359. package/src/delimited/ui/DelimitedTextPanel.tsx +19 -12
  360. package/src/download/ui/FigureDownload.tsx +7 -5
  361. package/src/download/ui/FigureDownloadPanel.tsx +31 -25
  362. package/src/ecosystem/core/sites.ts +4 -2
  363. package/src/ecosystem/ui/EcosystemButton.tsx +5 -3
  364. package/src/ecosystem/ui/EcosystemLinks.tsx +10 -10
  365. package/src/ecosystem/ui/EcosystemMenu.tsx +3 -1
  366. package/src/ecosystem/ui/SiteGroupSection.tsx +6 -2
  367. package/src/ecosystem/ui/SiteTile.tsx +6 -2
  368. package/src/ecosystem/ui/glyphs.tsx +16 -22
  369. package/src/error/ui/ErrorFallback.tsx +13 -12
  370. package/src/help/ui/HelpBody.tsx +4 -2
  371. package/src/help/ui/HelpIcon.tsx +6 -3
  372. package/src/help/ui/HelpToolbarButton.tsx +4 -1
  373. package/src/help/ui/helpName.ts +10 -2
  374. package/src/i18n/core/chromeCatalog.ts +35 -0
  375. package/src/i18n/core/index.ts +26 -0
  376. package/src/i18n/core/languages.ts +46 -0
  377. package/src/i18n/core/messageCatalog.ts +202 -0
  378. package/src/i18n/core/messageValues.ts +2 -0
  379. package/src/i18n/core/session.ts +82 -0
  380. package/src/i18n/core/translateSetup.ts +47 -0
  381. package/src/i18n/ui/LanguageSelect.tsx +72 -0
  382. package/src/i18n/ui/index.ts +9 -0
  383. package/src/i18n/ui/useLanguage.ts +48 -0
  384. package/src/i18n/ui/useT.ts +90 -0
  385. package/src/locales/de.json +442 -0
  386. package/src/locales/en.json +442 -0
  387. package/src/locales/es.json +442 -0
  388. package/src/locales/fr.json +442 -0
  389. package/src/molecule3d/core/gestures.ts +44 -7
  390. package/src/molecule3d/ui/Molecule3DExport.tsx +3 -1
  391. package/src/molecule3d/ui/Molecule3DHelp.tsx +17 -6
  392. package/src/molecule3d/ui/Molecule3DOptions.tsx +13 -13
  393. package/src/molecule3d/ui/Molecule3DSurfaceColors.tsx +16 -13
  394. package/src/molecule3d/ui/Molecule3DToolbar.tsx +29 -18
  395. package/src/molecule3d/ui/MoleculeViewer3D.tsx +13 -8
  396. package/src/orbital/ui/AtomicOrbitalCanvas.tsx +3 -1
  397. package/src/orbital/ui/AtomicOrbitalControls.tsx +15 -20
  398. package/src/orbital/ui/AtomicOrbitalViewer.tsx +13 -13
  399. package/src/orbital/ui/capability.ts +10 -0
  400. package/src/overlay/ui/OverlayBar.tsx +7 -4
  401. package/src/overlay/ui/OverlayInfo.tsx +6 -3
  402. package/src/overlay/ui/OverlayPanel.tsx +10 -7
  403. package/src/overlay/ui/OverlayReadout.tsx +3 -1
  404. package/src/pedagogy/ui/ExerciseActions.tsx +16 -6
  405. package/src/pedagogy/ui/ExerciseProgressHeader.tsx +13 -11
  406. package/src/pedagogy/ui/GlossaryIndex.tsx +11 -12
  407. package/src/pedagogy/ui/HintLadder.tsx +15 -12
  408. package/src/pedagogy/ui/SyntaxTooltip.tsx +9 -7
  409. package/src/pedagogy/ui/TutorialStepStrip.tsx +8 -3
  410. package/src/periodic/ui/CategoryLegend.tsx +6 -1
  411. package/src/periodic/ui/ElementCell.tsx +7 -1
  412. package/src/periodic/ui/PeriodicTable.tsx +3 -1
  413. package/src/periodic/ui/PeriodicTableChrome.tsx +4 -2
  414. package/src/share/ui/ShareButton.tsx +8 -5
  415. package/src/share/ui/ShareConfigOptions.tsx +6 -7
  416. package/src/share/ui/ShareDialog.tsx +3 -1
  417. package/src/share/ui/ShareDialogContent.tsx +20 -10
  418. package/src/share/ui/SharePresetTabs.tsx +3 -1
  419. package/src/slides/ui/BackToSlides.tsx +4 -2
  420. package/src/slides/ui/EmbedSlide.tsx +3 -3
  421. package/src/slides/ui/Slide.tsx +3 -1
  422. package/src/slides/ui/SlideshowBar.tsx +12 -4
  423. package/src/slides/ui/TalkList.tsx +8 -10
  424. package/src/structure/core/editorGuide.ts +126 -19
  425. package/src/structure/core/editorToolbar.ts +52 -24
  426. package/src/structure/ui/EditorHelpButton.tsx +9 -4
  427. package/src/structure/ui/StructureEditor.tsx +7 -1
  428. package/src/structure/ui/StructureEditorHelp.tsx +34 -11
  429. package/src/structure/ui/ToolbarTooltip.tsx +8 -4
  430. package/src/translate/core/index.ts +1 -1
  431. package/src/translate/core/start.ts +65 -3
  432. package/src/ui.ts +1 -0
package/README.md CHANGED
@@ -78,6 +78,7 @@ through a wildcard subpath exactly as `react-science` serves its own.
78
78
  | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
79
79
  | **Site identity** | `siteById`, `findSiteByHost`, `siteTokensCss` | `SiteMark`, `Wordmark`, `SiteTheme`, `SiteTile`, `EcosystemButton`, `EcosystemLinks` |
80
80
  | **Chrome** | — | `SiteHeader`, `SiteFooter`, `NavLink`, `NavMenuButton`, `MenuButton`, `useCompactHeader` |
81
+ | **Languages** | `LANGUAGES`, `DEFAULT_LANGUAGE`, `LANGUAGE_LABELS`, `isLanguage`, `MessageCatalog`, `CHROME_CATALOG`, `setMessageSession`, `loadCatalogs`, `LANGUAGE_PARAM`, `withLanguageParam` | `useT`, `useChromeT`, `useLanguage`, `LanguageSelect`, `SiteLanguage` |
81
82
  | **Citation** | `formatCitation`, `formatCitations`, `citationSegments`, `downloadCitation`, `citedReferences`, `doiUrl` | `CiteButton`, `CitationMenu`, `CitationPreview` |
82
83
  | **Share & embed** | `parseShareConfig`, `applyShareConfig`, `buildShareUrl`, `buildEmbedCode`, `isHidden`, `visibleShareParts`, `applySharePreset`, `findSharePreset`, the param codecs, `syncPreferencesWithUrl`, `applyPreferencesFromSearch`, `writePreferencesToSearch` | `ShareDialog`, `ShareButton`, `HiddenPartsProvider`, `PagePart`, `useIsHidden` |
83
84
  | **Routing & head** | `createTabRouter`, `readRoute`, `writeRoute`, `subscribeToRoute`, `adoptLegacyHashAddress`, `writeDocumentMeta` | `useTabRoute` |
@@ -93,7 +94,7 @@ through a wildcard subpath exactly as `react-science` serves its own.
93
94
  | **About** | `resolveAbout`, `aboutProblems` | `AboutPage` |
94
95
  | **Which build is running** | `formatBuiltAt`, `shortCommit`, `BuildInfo` | `AboutBuild`, `cheminfoBuildInfo` (`/vite`) |
95
96
  | **Slideshows** | `parseTalk`, `splitDemoLinks`, `slideActionForKey`, `parseTalkOrigin`, `buildTalkManifest` (all `/slides`) | `Slideshow`, `SlideView`, `TalkList`, `BackToSlides` (all `/slides`), `cheminfoTalks` (`/vite`) |
96
- | **Token guard** | `findTokenViolations` | `cheminfo-check-tokens` (the bin) |
97
+ | **Token guard** | `findTokenViolations` | `cheminfo-check-tokens`, `cheminfo-check-messages`, `cheminfo-check-deploy` (the bins) |
97
98
  | **Figures** | `chartScale`, `chartAxisScale`, `chartAxisTitle`, `chartShare`, `chartColumnExtent`, `chartBinCounts`, `chartSeriesColor`, `rowMatrix`, `stackedMatrix`, `emptiestCorner`, `placeOverlayCard`, `overlayMetrics` | `ChartFrame`, `ChartAxis`, `TrackedLineChart`, `OverlayBar`, `OverlaySelect`, `OverlaySegmented`, `OverlayToggle`, `OverlayNumber`, `OverlayLegend`, `OverlayCaption`, `OverlayReadout` |
98
99
  | **Projections** | `pcaResult`, `embeddingResult`, `projectionTabs`, `loadingProfiles`, `explainedShares`, `confidenceEllipse`, `projectEllipse`, `pointsInPolygon`, `resolveProjectionGroups`, `resolveProjectionShapes`, `PROJECTION_COPY` | `PcaViewer`, `ProjectionViewer`, `ScatterPlot`, `ScatterMatrix` |
99
100
  | **Parallel coordinates** | `parallelAxisOf`, `parallelAxisLayouts`, `parallelIncludedMask`, `parallelKeptCount`, `parallelNearestRow`, `parallelSegmentAt`, `parallelBandAt`, `parallelRangeOf`, `parallelPalette`, `parallelColorSteps`, `paintParallelLines` | `ParallelCoordinates` |
@@ -621,6 +622,76 @@ const included = useMemo(
621
622
  subject — a formula through `react-mf`, a structure, a name — and a readout of
622
623
  strings cannot hold any of that.
623
624
 
625
+ ## Speaking four languages
626
+
627
+ Every word this library puts on a page — the header, the Tools menu, the Cite
628
+ menu, the share dialog, the About page, the structure editor's guide, the 3D
629
+ toolbar — is in `src/locales`, one flat JSON file per language, `en.json` being
630
+ the source of truth. English, French, German and Spanish are complete, and
631
+ `npm run check-messages` fails on a key English does not declare, a placeholder
632
+ a translation adds or drops, and an empty message.
633
+
634
+ **A site gets a translated chrome by saying what language it is in, and nothing
635
+ else.** `<SiteLanguage value>` already tells every link out of the page which
636
+ language to carry; the chrome now reads the same declaration:
637
+
638
+ ```tsx
639
+ <SiteLanguage value={language === 'en' ? undefined : language}>
640
+ <SiteHeader
641
+ siteId="surge"
642
+ nav={nav}
643
+ actions={<ShareButton onClick={open} />}
644
+ />
645
+ </SiteLanguage>
646
+ ```
647
+
648
+ English is part of the page, because it is what a missing message falls back to;
649
+ the other three arrive as a chunk of their own, so a site nobody reads in German
650
+ never downloads the German. A site with a language switch draws it with
651
+ `<LanguageSelect value onChange>`, which names each language in its own words.
652
+
653
+ A site's own text is a catalog of its own, read with the same runtime:
654
+
655
+ ```ts
656
+ import { MessageCatalog } from 'react-cheminfo/core';
657
+ import en from '../locales/en.json' with { type: 'json' };
658
+
659
+ export const SITE_CATALOG = new MessageCatalog({
660
+ id: 'surge.cheminfo.org',
661
+ repository: 'cheminfo/surge.cheminfo.org',
662
+ directory: 'src/locales',
663
+ source: en,
664
+ translations: {
665
+ fr: () => import('../locales/fr.json', { with: { type: 'json' } }),
666
+ },
667
+ });
668
+ ```
669
+
670
+ `const t = useT(SITE_CATALOG)` then reads it in the language of the page, typed
671
+ by the English keys; `t.or(key, fallback)` is for a key built from the data,
672
+ which the catalog may not have caught up with. Only the plain `{name}` argument
673
+ of ICU MessageFormat is filled — a plural or a select needs the formatter
674
+ itself, which an ordinary visit must not pay for, so `check-messages` refuses
675
+ one and the page is written with a key per branch instead.
676
+
677
+ In translate mode the page hands both catalogs over at once, so a translator
678
+ editing a site also edits the chrome:
679
+
680
+ ```ts
681
+ const { catalogs, translations } = await loadCatalogs(
682
+ [CHROME_CATALOG, SITE_CATALOG],
683
+ locale,
684
+ );
685
+ setMessageSession(startTranslating({ locale, catalogs, translations }));
686
+ ```
687
+
688
+ `setMessageSession` is what every `useT` listens to, so an edit typed in the
689
+ overlay redraws the page without the site holding a version of its own.
690
+
691
+ Still English, with the runtime in place and no catalog yet: the spectra
692
+ settings editor and the projection panels (`react-cheminfo/spectra`, the
693
+ projection viewers), which no site of the family reads in a second language yet.
694
+
624
695
  ## Carrying talks
625
696
 
626
697
  A deck is one Markdown file in the repository of the site whose subject it
@@ -906,7 +977,7 @@ Unit tests cover the framework-free half, which is where the citation formats
906
977
  and the site list live:
907
978
 
908
979
  ```console
909
- npm run test # vitest + type-check + eslint + prettier
980
+ npm run test # vitest + type-check + tokens + messages + eslint + prettier
910
981
  ```
911
982
 
912
983
  The components themselves are almost entirely interaction — Blueprint popovers
@@ -0,0 +1,229 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * Check a catalog directory: `en.json` is the source of truth, and every other
4
+ * locale beside it must answer to the same keys with the same placeholders.
5
+ *
6
+ * Wire it as an npm script:
7
+ * "check-messages": "cheminfo-check-messages src/locales"
8
+ *
9
+ * Usage: check-messages.mjs [directory...] [--quiet]
10
+ * directory the catalog directories to check, `src/locales` when none is
11
+ * given
12
+ * --quiet say nothing when every catalog is clean
13
+ *
14
+ * It reports, per locale: a key English does not declare, a placeholder the
15
+ * translation adds or drops, a message left empty, and — as a count rather
16
+ * than a fault — the keys still missing. It also refuses an ICU plural or
17
+ * select, which the page's formatter does not load: a message with branches is
18
+ * written as one key per branch instead.
19
+ *
20
+ * Exits 1 when anything is reported, 2 when it was called wrongly, 0 otherwise.
21
+ */
22
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
23
+ import { basename, join } from 'node:path';
24
+ import process from 'node:process';
25
+
26
+ import { countOf, usageError } from './cli.mjs';
27
+
28
+ const TOOL = 'check-messages';
29
+ const SOURCE_LOCALE = 'en';
30
+ const DEFAULT_DIRECTORY = 'src/locales';
31
+ const PLACEHOLDER = /\{(?<name>[^{}]*)\}/g;
32
+
33
+ process.exit(main(process.argv.slice(2)));
34
+
35
+ /**
36
+ * Run the check.
37
+ * @param {string[]} argv - The arguments, without the node and script paths.
38
+ * @returns {number} The status to exit with.
39
+ */
40
+ function main(argv) {
41
+ const directories = [];
42
+ let quiet = false;
43
+ for (const argument of argv) {
44
+ if (argument === '--quiet') {
45
+ quiet = true;
46
+ } else if (argument.startsWith('--')) {
47
+ return usageError(TOOL, `unknown option ${argument}`);
48
+ } else {
49
+ directories.push(argument);
50
+ }
51
+ }
52
+ if (directories.length === 0) directories.push(DEFAULT_DIRECTORY);
53
+
54
+ const problems = [];
55
+ const lines = [];
56
+ for (const directory of directories) {
57
+ const report = checkDirectory(directory);
58
+ if (typeof report === 'string') return usageError(TOOL, report);
59
+ problems.push(...report.problems);
60
+ lines.push(...report.lines);
61
+ }
62
+
63
+ for (const problem of problems) process.stdout.write(`${problem}\n`);
64
+ if (problems.length > 0) {
65
+ process.stdout.write(`\n${TOOL}: ${countOf(problems.length, 'problem')}\n`);
66
+ return 1;
67
+ }
68
+ if (!quiet) {
69
+ for (const line of lines) process.stdout.write(`${line}\n`);
70
+ }
71
+ return 0;
72
+ }
73
+
74
+ /**
75
+ * Check one catalog directory.
76
+ * @param {string} directory - Where `en.json` and its locales live.
77
+ * @returns {{problems: string[], lines: string[]} | string} What was found, or
78
+ * the reason the directory could not be read.
79
+ */
80
+ function checkDirectory(directory) {
81
+ let entries;
82
+ try {
83
+ entries = readdirSync(directory);
84
+ } catch {
85
+ return `cannot read ${directory}`;
86
+ }
87
+ const source = readCatalog(join(directory, `${SOURCE_LOCALE}.json`));
88
+ if (typeof source === 'string') return source;
89
+
90
+ const problems = [];
91
+ const lines = [];
92
+ for (const problem of catalogProblems(source, directory, SOURCE_LOCALE)) {
93
+ problems.push(problem);
94
+ }
95
+ const keys = Object.keys(source);
96
+ lines.push(`${directory}: ${countOf(keys.length, 'message')} in English`);
97
+
98
+ for (const entry of entries.toSorted()) {
99
+ if (!entry.endsWith('.json')) continue;
100
+ const locale = basename(entry, '.json');
101
+ if (locale === SOURCE_LOCALE) continue;
102
+ const path = join(directory, entry);
103
+ if (statSync(path).isDirectory()) continue;
104
+ const catalog = readCatalog(path);
105
+ if (typeof catalog === 'string') {
106
+ problems.push(catalog);
107
+ continue;
108
+ }
109
+ problems.push(
110
+ ...catalogProblems(catalog, directory, locale),
111
+ ...localeProblems(source, catalog, path),
112
+ );
113
+ const translated = keys.filter((key) => hasOwn(catalog, key)).length;
114
+ lines.push(
115
+ ` ${locale}: ${translated}/${keys.length} translated${
116
+ translated === keys.length
117
+ ? ''
118
+ : `, ${countOf(keys.length - translated, 'message')} still in English`
119
+ }`,
120
+ );
121
+ }
122
+ return { problems, lines };
123
+ }
124
+
125
+ /**
126
+ * What is wrong with a catalog read on its own.
127
+ * @param {Record<string, unknown>} catalog - The messages.
128
+ * @param {string} directory - Where it lives, for the report.
129
+ * @param {string} locale - Which locale it is.
130
+ * @returns {string[]} One line per problem.
131
+ */
132
+ function catalogProblems(catalog, directory, locale) {
133
+ const problems = [];
134
+ const where = join(directory, `${locale}.json`);
135
+ for (const [key, message] of Object.entries(catalog)) {
136
+ if (typeof message !== 'string') {
137
+ problems.push(`${where}: ${key} is not a string`);
138
+ continue;
139
+ }
140
+ if (message.trim() === '') {
141
+ problems.push(`${where}: ${key} is empty`);
142
+ }
143
+ for (const name of placeholders(message)) {
144
+ if (name.includes(',')) {
145
+ problems.push(
146
+ `${where}: ${key} uses an ICU plural or select, which the page does not load a formatter for — write one key per branch`,
147
+ );
148
+ break;
149
+ }
150
+ if (!/^\w+$/.test(name)) {
151
+ problems.push(`${where}: ${key} has a malformed placeholder {${name}}`);
152
+ }
153
+ }
154
+ }
155
+ return problems;
156
+ }
157
+
158
+ /**
159
+ * What is wrong with a translation against the English it translates.
160
+ * @param {Record<string, string>} source - The English messages.
161
+ * @param {Record<string, unknown>} catalog - The translation.
162
+ * @param {string} where - Its path, for the report.
163
+ * @returns {string[]} One line per problem.
164
+ */
165
+ function localeProblems(source, catalog, where) {
166
+ const problems = [];
167
+ for (const [key, message] of Object.entries(catalog)) {
168
+ if (!hasOwn(source, key)) {
169
+ problems.push(`${where}: ${key} is not a key of English`);
170
+ continue;
171
+ }
172
+ if (typeof message !== 'string') continue;
173
+ const wanted = placeholders(source[key]);
174
+ const written = placeholders(message);
175
+ for (const name of wanted) {
176
+ if (!written.has(name)) {
177
+ problems.push(`${where}: ${key} drops the placeholder {${name}}`);
178
+ }
179
+ }
180
+ for (const name of written) {
181
+ if (!wanted.has(name)) {
182
+ problems.push(`${where}: ${key} adds the placeholder {${name}}`);
183
+ }
184
+ }
185
+ }
186
+ return problems;
187
+ }
188
+
189
+ /**
190
+ * The names a message fills in.
191
+ * @param {string} message - The message.
192
+ * @returns {Set<string>} Every `{name}` it writes.
193
+ */
194
+ function placeholders(message) {
195
+ const names = new Set();
196
+ for (const match of message.matchAll(PLACEHOLDER)) {
197
+ names.add(match.groups.name);
198
+ }
199
+ return names;
200
+ }
201
+
202
+ /**
203
+ * Read one catalog file.
204
+ * @param {string} path - Where it is.
205
+ * @returns {Record<string, unknown> | string} The messages, or why they could
206
+ * not be read.
207
+ */
208
+ function readCatalog(path) {
209
+ let text;
210
+ try {
211
+ text = readFileSync(path, 'utf8');
212
+ } catch {
213
+ return `cannot read ${path}`;
214
+ }
215
+ let parsed;
216
+ try {
217
+ parsed = JSON.parse(text);
218
+ } catch (error) {
219
+ return `${path}: ${error instanceof Error ? error.message : 'is not JSON'}`;
220
+ }
221
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
222
+ return `${path}: is not an object of messages`;
223
+ }
224
+ return parsed;
225
+ }
226
+
227
+ function hasOwn(catalog, key) {
228
+ return Object.hasOwn(catalog, key);
229
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"AboutBuild.d.ts","sourceRoot":"","sources":["../../../src/about/ui/AboutBuild.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAa,MAAM,OAAO,CAAC;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAI/D,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,KAAK,EAAE,SAAS,CAAC;IACjB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAwB/D"}
1
+ {"version":3,"file":"AboutBuild.d.ts","sourceRoot":"","sources":["../../../src/about/ui/AboutBuild.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAa,MAAM,OAAO,CAAC;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAK/D,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,KAAK,EAAE,SAAS,CAAC;IACjB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CA8B/D"}
@@ -1,5 +1,6 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { formatBuiltAt, shortCommit } from "../../build/core/buildInfo.js";
3
+ import { useChromeT } from "../../i18n/ui/useT.js";
3
4
  import { githubSources } from "../core/repository.js";
4
5
  /**
5
6
  * The one line that says when the build a visitor has open was made.
@@ -14,10 +15,20 @@ import { githubSources } from "../core/repository.js";
14
15
  */
15
16
  export function AboutBuild(props) {
16
17
  const { build, repository } = props;
18
+ const t = useChromeT();
17
19
  const sources = githubSources(repository);
18
- return (_jsxs("p", { style: PARAGRAPH_STYLE, children: ["Built ", formatBuiltAt(build.builtAt), build.commit === undefined ? null : (_jsxs(_Fragment, { children: [' from commit ', _jsx(Reference, { href: sources === undefined
19
- ? undefined
20
- : `${sources}/commit/${build.commit}`, children: shortCommit(build.commit) })] })), "."] }));
20
+ const builtAt = formatBuiltAt(build.builtAt);
21
+ if (build.commit === undefined) {
22
+ return _jsx("p", { style: PARAGRAPH_STYLE, children: t('about.built', { builtAt }) });
23
+ }
24
+ // The commit is a link inside a sentence whose word order is the
25
+ // translator's, so the message is split where it names it.
26
+ const [before = '', after = ''] = t('about.builtFromCommit', {
27
+ builtAt,
28
+ }).split('{commit}');
29
+ return (_jsxs("p", { style: PARAGRAPH_STYLE, children: [before, _jsx(Reference, { href: sources === undefined
30
+ ? undefined
31
+ : `${sources}/commit/${build.commit}`, children: shortCommit(build.commit) }), after] }));
21
32
  }
22
33
  function Reference(props) {
23
34
  const { href, children } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"AboutBuild.js","sourceRoot":"","sources":["../../../src/about/ui/AboutBuild.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAStD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IACpC,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAE1C,OAAO,CACL,aAAG,KAAK,EAAE,eAAe,uBAChB,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EAClC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACnC,8BACG,eAAe,EAChB,KAAC,SAAS,IACR,IAAI,EACF,OAAO,KAAK,SAAS;4BACnB,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,GAAG,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,YAGxC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAChB,IACX,CACJ,SAEC,CACL,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAGlB;IACC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACjC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,eAAM,KAAK,EAAE,UAAU,YAAG,QAAQ,GAAQ,CAAC;IAE1E,OAAO,CACL,YAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,KAAK,EAAE,UAAU,YACxE,eAAM,KAAK,EAAE,UAAU,YAAG,QAAQ,GAAQ,GACxC,CACL,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAAG;IACtB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,EAAE;CACoB,CAAC;AAEnC,MAAM,UAAU,GAAG;IACjB,UAAU,EAAE,2CAA2C;IACvD,QAAQ,EAAE,EAAE;CACoB,CAAC;AAEnC,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,eAAe,EAAmC,CAAC"}
1
+ {"version":3,"file":"AboutBuild.js","sourceRoot":"","sources":["../../../src/about/ui/AboutBuild.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAStD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IACpC,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,YAAG,KAAK,EAAE,eAAe,YAAG,CAAC,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,GAAK,CAAC;IACxE,CAAC;IAED,iEAAiE;IACjE,2DAA2D;IAC3D,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,uBAAuB,EAAE;QAC3D,OAAO;KACR,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAErB,OAAO,CACL,aAAG,KAAK,EAAE,eAAe,aACtB,MAAM,EACP,KAAC,SAAS,IACR,IAAI,EACF,OAAO,KAAK,SAAS;oBACnB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,GAAG,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,YAGxC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAChB,EACX,KAAK,IACJ,CACL,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAGlB;IACC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACjC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,eAAM,KAAK,EAAE,UAAU,YAAG,QAAQ,GAAQ,CAAC;IAE1E,OAAO,CACL,YAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,KAAK,EAAE,UAAU,YACxE,eAAM,KAAK,EAAE,UAAU,YAAG,QAAQ,GAAQ,GACxC,CACL,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAAG;IACtB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,EAAE;CACoB,CAAC;AAEnC,MAAM,UAAU,GAAG;IACjB,UAAU,EAAE,2CAA2C;IACvD,QAAQ,EAAE,EAAE;CACoB,CAAC;AAEnC,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,eAAe,EAAmC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AboutCitations.d.ts","sourceRoot":"","sources":["../../../src/about/ui/AboutCitations.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAG9D,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CAoBvE"}
1
+ {"version":3,"file":"AboutCitations.d.ts","sourceRoot":"","sources":["../../../src/about/ui/AboutCitations.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAI9D,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CAqBvE"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { CiteButton } from "../../citation/ui/CiteButton.js";
3
+ import { useChromeT } from "../../i18n/ui/useT.js";
3
4
  /**
4
5
  * What to cite, and what citing each work credits: a reader handed two
5
6
  * references has to be told which is which before they can pick one. Each
@@ -10,7 +11,8 @@ import { CiteButton } from "../../citation/ui/CiteButton.js";
10
11
  */
11
12
  export function AboutCitations(props) {
12
13
  const { works } = props;
13
- return (_jsx("div", { className: "about-citations", style: LIST_STYLE, children: works.map((work) => (_jsxs("div", { className: "about-citation", children: [_jsx("div", { style: WHAT_STYLE, children: work.what }), work.note === undefined ? null : (_jsx("p", { style: NOTE_STYLE, children: work.note })), _jsx(CiteButton, { reference: work.reference, label: `Cite ${work.what}`, placement: "bottom-start" })] }, work.reference.doi))) }));
14
+ const t = useChromeT();
15
+ return (_jsx("div", { className: "about-citations", style: LIST_STYLE, children: works.map((work) => (_jsxs("div", { className: "about-citation", children: [_jsx("div", { style: WHAT_STYLE, children: work.what }), work.note === undefined ? null : (_jsx("p", { style: NOTE_STYLE, children: work.note })), _jsx(CiteButton, { reference: work.reference, label: t('about.citeWork', { what: work.what }), placement: "bottom-start" })] }, work.reference.doi))) }));
14
16
  }
15
17
  const LIST_STYLE = {
16
18
  display: 'flex',
@@ -1 +1 @@
1
- {"version":3,"file":"AboutCitations.js","sourceRoot":"","sources":["../../../src/about/ui/AboutCitations.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAkC,CAAC;AAO9D;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAExB,OAAO,CACL,cAAK,SAAS,EAAC,iBAAiB,EAAC,KAAK,EAAE,UAAU,YAC/C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,eAA8B,SAAS,EAAC,gBAAgB,aACtD,cAAK,KAAK,EAAE,UAAU,YAAG,IAAI,CAAC,IAAI,GAAO,EACxC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAChC,YAAG,KAAK,EAAE,UAAU,YAAG,IAAI,CAAC,IAAI,GAAK,CACtC,EACD,KAAC,UAAU,IACT,SAAS,EAAE,IAAI,CAAC,SAAS,EACzB,KAAK,EAAE,QAAQ,IAAI,CAAC,IAAI,EAAE,EAC1B,SAAS,EAAC,cAAc,GACxB,KATM,IAAI,CAAC,SAAS,CAAC,GAAG,CAUtB,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,GAAG,EAAE,EAAE;CACyB,CAAC;AAEnC,MAAM,UAAU,GAAG,EAAE,UAAU,EAAE,GAAG,EAAmC,CAAC;AAExE,MAAM,UAAU,GAAG;IACjB,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,EAAE;CACoB,CAAC"}
1
+ {"version":3,"file":"AboutCitations.js","sourceRoot":"","sources":["../../../src/about/ui/AboutCitations.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAkC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAOnD;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACxB,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IAEvB,OAAO,CACL,cAAK,SAAS,EAAC,iBAAiB,EAAC,KAAK,EAAE,UAAU,YAC/C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,eAA8B,SAAS,EAAC,gBAAgB,aACtD,cAAK,KAAK,EAAE,UAAU,YAAG,IAAI,CAAC,IAAI,GAAO,EACxC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAChC,YAAG,KAAK,EAAE,UAAU,YAAG,IAAI,CAAC,IAAI,GAAK,CACtC,EACD,KAAC,UAAU,IACT,SAAS,EAAE,IAAI,CAAC,SAAS,EACzB,KAAK,EAAE,CAAC,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAC/C,SAAS,EAAC,cAAc,GACxB,KATM,IAAI,CAAC,SAAS,CAAC,GAAG,CAUtB,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,GAAG,EAAE,EAAE;CACyB,CAAC;AAEnC,MAAM,UAAU,GAAG,EAAE,UAAU,EAAE,GAAG,EAAmC,CAAC;AAExE,MAAM,UAAU,GAAG;IACjB,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,EAAE;CACoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AboutPage.d.ts","sourceRoot":"","sources":["../../../src/about/ui/AboutPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AASrD,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAqG7D"}
1
+ {"version":3,"file":"AboutPage.d.ts","sourceRoot":"","sources":["../../../src/about/ui/AboutPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AASrD,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAmH7D"}
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { CreditsList } from "../../credits/ui/CreditsList.js";
3
3
  import { Wordmark } from "../../ecosystem/ui/Wordmark.js";
4
4
  import { SiteMark } from "../../ecosystem/ui/marks.js";
5
+ import { useChromeT } from "../../i18n/ui/useT.js";
5
6
  import { resolveAbout } from "../core/about.js";
6
7
  import { AboutBuild } from "./AboutBuild.js";
7
8
  import { AboutCitations } from "./AboutCitations.js";
@@ -22,11 +23,18 @@ import { AboutVersion } from "./AboutVersion.js";
22
23
  */
23
24
  export function AboutPage(props) {
24
25
  const { content, className, children, logo, mark } = props;
26
+ const t = useChromeT();
25
27
  const about = resolveAbout(content);
26
28
  const site = about.site;
27
29
  return (_jsxs("div", { className: className === undefined ? 'about-page' : `about-page ${className}`, style: PAGE_STYLE, children: [_jsxs("header", { className: "about-hero", style: HERO_STYLE, children: [logo === undefined
28
30
  ? (mark ?? _jsx(SiteMark, { site: site, size: 56 }))
29
- : null, _jsxs("div", { style: HERO_BODY_STYLE, children: [_jsx("h1", { style: logo === undefined ? NAME_STYLE : LOGO_NAME_STYLE, children: logo ?? _jsx(Wordmark, { site: site, size: 26 }) }), _jsx("p", { style: TAGLINE_STYLE, children: site.tagline }), _jsx("p", { style: WHAT_STYLE, children: about.what })] }), _jsx(AboutVersion, { build: about.build, repository: about.repository, publicRepository: about.publicRepository })] }), about.people.length === 0 && about.providedBy.length === 0 ? null : (_jsx(AboutSection, { title: "Provided by", className: "about-provided-by", children: _jsx(AboutProvidedBy, { people: about.people, providers: about.providedBy }) })), _jsx(AboutSection, { title: "What you can do here", className: "about-can", children: _jsx("ul", { style: CAN_LIST_STYLE, children: about.can.map((line) => (_jsx("li", { children: line }, line))) }) }), about.paragraphs.length === 0 ? null : (_jsx(AboutSection, { className: "about-context", children: about.paragraphs.map((paragraph, index) => (_jsx("p", { style: index === 0 ? FIRST_PARAGRAPH_STYLE : PARAGRAPH_STYLE, children: paragraph }, paragraph))) })), children, _jsx(AboutSection, { title: "Built on", className: "about-credits", children: _jsx(CreditsList, { entries: about.credits }) }), about.cite.length === 0 ? null : (_jsx(AboutSection, { title: "How to cite", className: "about-cite", children: _jsx(AboutCitations, { works: about.cite }) })), !about.publicRepository ? null : (_jsxs(AboutSection, { title: "Licence and source", className: "about-licence", children: [_jsxs("p", { style: FIRST_PARAGRAPH_STYLE, children: [about.license, ", \u00A9 cheminfo. Use it in a course, fork it, or lift a piece of it into something else. The sources are at", ' ', _jsx(ExternalLink, { href: about.repository }), "."] }), about.build === undefined ? null : (_jsx(AboutBuild, { build: about.build, repository: about.repository }))] })), about.issues === undefined ? null : (_jsx(AboutSection, { title: "Found a problem?", className: "about-issues", children: _jsxs("p", { style: FIRST_PARAGRAPH_STYLE, children: ["Tell us: a report naming what you typed and what came back is the fastest fix there is. ", _jsx(ExternalLink, { href: about.issues }), "."] }) }))] }));
31
+ : null, _jsxs("div", { style: HERO_BODY_STYLE, children: [_jsx("h1", { style: logo === undefined ? NAME_STYLE : LOGO_NAME_STYLE, children: logo ?? _jsx(Wordmark, { site: site, size: 26 }) }), _jsx("p", { style: TAGLINE_STYLE, children: t.or(`site.${site.id}.tagline`, site.tagline) }), _jsx("p", { style: WHAT_STYLE, children: about.what })] }), _jsx(AboutVersion, { build: about.build, repository: about.repository, publicRepository: about.publicRepository })] }), about.people.length === 0 && about.providedBy.length === 0 ? null : (_jsx(AboutSection, { title: t('about.providedBy'), className: "about-provided-by", children: _jsx(AboutProvidedBy, { people: about.people, providers: about.providedBy }) })), _jsx(AboutSection, { title: t('about.whatYouCanDo'), className: "about-can", children: _jsx("ul", { style: CAN_LIST_STYLE, children: about.can.map((line) => (_jsx("li", { children: line }, line))) }) }), about.paragraphs.length === 0 ? null : (_jsx(AboutSection, { className: "about-context", children: about.paragraphs.map((paragraph, index) => (_jsx("p", { style: index === 0 ? FIRST_PARAGRAPH_STYLE : PARAGRAPH_STYLE, children: paragraph }, paragraph))) })), children, _jsx(AboutSection, { title: t('about.builtOn'), className: "about-credits", children: _jsx(CreditsList, { entries: about.credits }) }), about.cite.length === 0 ? null : (_jsx(AboutSection, { title: t('about.howToCite'), className: "about-cite", children: _jsx(AboutCitations, { works: about.cite }) })), !about.publicRepository ? null : (_jsxs(AboutSection, { title: t('about.licenceAndSource'), className: "about-licence", children: [_jsx("p", { style: FIRST_PARAGRAPH_STYLE, children: around(t('about.licence', { license: about.license }), 'sources', _jsx(ExternalLink, { href: about.repository }, "sources")) }), about.build === undefined ? null : (_jsx(AboutBuild, { build: about.build, repository: about.repository }))] })), about.issues === undefined ? null : (_jsx(AboutSection, { title: t('about.foundAProblem'), className: "about-issues", children: _jsx("p", { style: FIRST_PARAGRAPH_STYLE, children: around(t('about.reportIt'), 'tracker', _jsx(ExternalLink, { href: about.issues }, "tracker")) }) }))] }));
32
+ }
33
+ // A link sits inside a sentence whose word order is the translator's, so the
34
+ // message names where it goes with a placeholder and is split there.
35
+ function around(message, placeholder, link) {
36
+ const [before = '', after = ''] = message.split(`{${placeholder}}`);
37
+ return [before, link, after];
30
38
  }
31
39
  function ExternalLink(props) {
32
40
  const { href } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"AboutPage.js","sourceRoot":"","sources":["../../../src/about/ui/AboutPage.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AboutPage.js","sourceRoot":"","sources":["../../../src/about/ui/AboutPage.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AboutProvidedBy.d.ts","sourceRoot":"","sources":["../../../src/about/ui/AboutProvidedBy.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,kEAAkE;IAClE,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,YAAY,CA8CzE"}
1
+ {"version":3,"file":"AboutProvidedBy.d.ts","sourceRoot":"","sources":["../../../src/about/ui/AboutProvidedBy.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAKzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,kEAAkE;IAClE,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,YAAY,CA+CzE"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useChromeT } from "../../i18n/ui/useT.js";
2
3
  /**
3
4
  * The lockup of who provides a site: the institution's logo, then the names
4
5
  * and the institution they work at, and under it what each one contributed
@@ -8,14 +9,18 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
9
  */
9
10
  export function AboutProvidedBy(props) {
10
11
  const { people, providers } = props;
12
+ const t = useChromeT();
11
13
  const withRoles = people.filter((person) => person.role !== undefined);
12
- return (_jsxs("div", { children: [_jsxs("div", { style: LOCKUP_STYLE, children: [providers.map((provider) => (_jsx("a", { href: provider.href, target: "_blank", rel: "noopener noreferrer", title: provider.fullName, style: LOGO_TILE_STYLE, children: _jsx(ProviderLogo, { provider: provider }) }, provider.id))), _jsxs("div", { style: providers.length === 0 ? IDENTITY_STYLE : DIVIDED_IDENTITY_STYLE, children: [people.length === 0 ? null : (_jsx("p", { style: NAMES_STYLE, children: joinNames(people) })), providers.map((provider) => (_jsxs("p", { style: INSTITUTION_STYLE, children: [provider.fullName, _jsx("span", { style: LOCATION_STYLE, children: provider.location })] }, provider.id)))] })] }), withRoles.length === 0 ? null : (_jsx("ul", { style: ROLES_STYLE, children: withRoles.map((person) => (_jsxs("li", { children: [_jsx("strong", { children: person.name }), " \u2014 ", person.role] }, person.name))) }))] }));
14
+ return (_jsxs("div", { children: [_jsxs("div", { style: LOCKUP_STYLE, children: [providers.map((provider) => (_jsx("a", { href: provider.href, target: "_blank", rel: "noopener noreferrer", title: provider.fullName, style: LOGO_TILE_STYLE, children: _jsx(ProviderLogo, { provider: provider }) }, provider.id))), _jsxs("div", { style: providers.length === 0 ? IDENTITY_STYLE : DIVIDED_IDENTITY_STYLE, children: [people.length === 0 ? null : (_jsx("p", { style: NAMES_STYLE, children: joinNames(people, t) })), providers.map((provider) => (_jsxs("p", { style: INSTITUTION_STYLE, children: [provider.fullName, _jsx("span", { style: LOCATION_STYLE, children: provider.location })] }, provider.id)))] })] }), withRoles.length === 0 ? null : (_jsx("ul", { style: ROLES_STYLE, children: withRoles.map((person) => (_jsxs("li", { children: [_jsx("strong", { children: person.name }), " \u2014 ", person.role] }, person.name))) }))] }));
13
15
  }
14
- function joinNames(people) {
16
+ function joinNames(people, t) {
15
17
  const names = people.map((person) => person.name);
16
18
  if (names.length < 2)
17
19
  return names.join('');
18
- return `${names.slice(0, -1).join(', ')} and ${names.at(-1)}`;
20
+ return t('about.nameList', {
21
+ names: names.slice(0, -1).join(', '),
22
+ last: names.at(-1) ?? '',
23
+ });
19
24
  }
20
25
  function ProviderLogo(props) {
21
26
  const { provider } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"AboutProvidedBy.js","sourceRoot":"","sources":["../../../src/about/ui/AboutProvidedBy.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AboutProvidedBy.js","sourceRoot":"","sources":["../../../src/about/ui/AboutProvidedBy.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * One capsule of a filter row: an interactive tag that keeps its semantic
3
+ * colour whether or not it is selected, the filled shape being what encodes
4
+ * the selection.
5
+ */
6
+ import type { Intent } from '@blueprintjs/core';
7
+ import type { ReactElement } from 'react';
8
+ /** What one capsule needs. */
9
+ export interface CapsuleProps {
10
+ /** What the capsule reads, count included. */
11
+ text: string;
12
+ /** Whether it is filled. */
13
+ selected: boolean;
14
+ /**
15
+ * Colour of the capsule, which says what the outcome means.
16
+ * @default undefined — the capsule takes no intent
17
+ */
18
+ intent?: Intent;
19
+ /** What the pointer is told, or `undefined` for no title at all. */
20
+ title: string | undefined;
21
+ /** Called when the capsule is picked. */
22
+ onClick: () => void;
23
+ }
24
+ /**
25
+ * One capsule.
26
+ * @param props - See {@link CapsuleProps}.
27
+ * @returns The tag.
28
+ */
29
+ export declare function Capsule(props: CapsuleProps): ReactElement;
30
+ //# sourceMappingURL=Capsule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Capsule.d.ts","sourceRoot":"","sources":["../../../src/capsule/ui/Capsule.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,8BAA8B;AAC9B,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAezD"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Tag } from '@blueprintjs/core';
3
+ /**
4
+ * One capsule.
5
+ * @param props - See {@link CapsuleProps}.
6
+ * @returns The tag.
7
+ */
8
+ export function Capsule(props) {
9
+ const { text, selected, intent, title, onClick } = props;
10
+ return (_jsx(Tag, { interactive: true, round: true, minimal: !selected, intent: intent, "aria-pressed": selected, htmlTitle: title, onClick: onClick, children: text }));
11
+ }
12
+ //# sourceMappingURL=Capsule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Capsule.js","sourceRoot":"","sources":["../../../src/capsule/ui/Capsule.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAoBxC;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,KAAmB;IACzC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACzD,OAAO,CACL,KAAC,GAAG,IACF,WAAW,QACX,KAAK,QACL,OAAO,EAAE,CAAC,QAAQ,EAClB,MAAM,EAAE,MAAM,kBACA,QAAQ,EACtB,SAAS,EAAE,KAAK,EAChB,OAAO,EAAE,OAAO,YAEf,IAAI,GACD,CACP,CAAC;AACJ,CAAC"}