react-cheminfo 0.37.0 → 0.39.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 (417) hide show
  1. package/README.md +77 -1
  2. package/bin/check-seo.mjs +43 -1
  3. package/lib/chart/ui/Axes.d.ts +19 -0
  4. package/lib/chart/ui/Axes.d.ts.map +1 -1
  5. package/lib/chart/ui/Axes.js +25 -5
  6. package/lib/chart/ui/Axes.js.map +1 -1
  7. package/lib/chrome/ui/NavMenuButton.d.ts.map +1 -1
  8. package/lib/chrome/ui/NavMenuButton.js +41 -11
  9. package/lib/chrome/ui/NavMenuButton.js.map +1 -1
  10. package/lib/chrome/ui/SiteHeader.js +24 -1
  11. package/lib/chrome/ui/SiteHeader.js.map +1 -1
  12. package/lib/chrome/ui/navItem.d.ts +7 -0
  13. package/lib/chrome/ui/navItem.d.ts.map +1 -1
  14. package/lib/chrome/ui/navItem.js.map +1 -1
  15. package/lib/citation/ui/entries.d.ts.map +1 -1
  16. package/lib/citation/ui/entries.js +6 -1
  17. package/lib/citation/ui/entries.js.map +1 -1
  18. package/lib/clipboard/ui/ClickToCopy.d.ts +11 -0
  19. package/lib/clipboard/ui/ClickToCopy.d.ts.map +1 -1
  20. package/lib/clipboard/ui/ClickToCopy.js +28 -10
  21. package/lib/clipboard/ui/ClickToCopy.js.map +1 -1
  22. package/lib/clipboard/ui/CopyButton.d.ts +2 -1
  23. package/lib/clipboard/ui/CopyButton.d.ts.map +1 -1
  24. package/lib/clipboard/ui/CopyButton.js +2 -1
  25. package/lib/clipboard/ui/CopyButton.js.map +1 -1
  26. package/lib/clipboard/ui/CopyableValue.d.ts +24 -4
  27. package/lib/clipboard/ui/CopyableValue.d.ts.map +1 -1
  28. package/lib/clipboard/ui/CopyableValue.js +35 -3
  29. package/lib/clipboard/ui/CopyableValue.js.map +1 -1
  30. package/lib/clipboard/ui/index.d.ts +1 -1
  31. package/lib/clipboard/ui/index.d.ts.map +1 -1
  32. package/lib/clipboard/ui/index.js.map +1 -1
  33. package/lib/confirm/ui/ConfirmButton.d.ts.map +1 -1
  34. package/lib/confirm/ui/ConfirmButton.js +2 -1
  35. package/lib/confirm/ui/ConfirmButton.js.map +1 -1
  36. package/lib/core.d.ts +1 -0
  37. package/lib/core.d.ts.map +1 -1
  38. package/lib/core.js +1 -0
  39. package/lib/core.js.map +1 -1
  40. package/lib/delimited/ui/TableDataButton.d.ts.map +1 -1
  41. package/lib/delimited/ui/TableDataButton.js +2 -1
  42. package/lib/delimited/ui/TableDataButton.js.map +1 -1
  43. package/lib/download/core/figureSvg.d.ts.map +1 -1
  44. package/lib/download/core/figureSvg.js +37 -12
  45. package/lib/download/core/figureSvg.js.map +1 -1
  46. package/lib/help/ui/HelpToolbarButton.d.ts.map +1 -1
  47. package/lib/help/ui/HelpToolbarButton.js +2 -1
  48. package/lib/help/ui/HelpToolbarButton.js.map +1 -1
  49. package/lib/i18n/core/chromeCatalog.d.ts +1 -1
  50. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
  51. package/lib/locales/de.json +48 -5
  52. package/lib/locales/en.json +48 -5
  53. package/lib/locales/es.json +48 -5
  54. package/lib/locales/fr.json +48 -5
  55. package/lib/locales/it.json +48 -5
  56. package/lib/number/core/index.d.ts +1 -1
  57. package/lib/number/core/index.d.ts.map +1 -1
  58. package/lib/number/core/index.js +1 -1
  59. package/lib/number/core/index.js.map +1 -1
  60. package/lib/number/core/numberText.d.ts +13 -0
  61. package/lib/number/core/numberText.d.ts.map +1 -1
  62. package/lib/number/core/numberText.js +20 -0
  63. package/lib/number/core/numberText.js.map +1 -1
  64. package/lib/number/ui/NumberInput.js +1 -1
  65. package/lib/number/ui/NumberInput.js.map +1 -1
  66. package/lib/overlay/ui/OverlayIconButton.d.ts.map +1 -1
  67. package/lib/overlay/ui/OverlayIconButton.js +1 -1
  68. package/lib/overlay/ui/OverlayIconButton.js.map +1 -1
  69. package/lib/panel/ui/ClearButton.d.ts.map +1 -1
  70. package/lib/panel/ui/ClearButton.js +1 -1
  71. package/lib/panel/ui/ClearButton.js.map +1 -1
  72. package/lib/pedagogy/core/inlineMarks.d.ts +9 -5
  73. package/lib/pedagogy/core/inlineMarks.d.ts.map +1 -1
  74. package/lib/pedagogy/core/inlineMarks.js +14 -6
  75. package/lib/pedagogy/core/inlineMarks.js.map +1 -1
  76. package/lib/pedagogy/ui/GlossaryDefinition.d.ts +4 -10
  77. package/lib/pedagogy/ui/GlossaryDefinition.d.ts.map +1 -1
  78. package/lib/pedagogy/ui/GlossaryDefinition.js +7 -7
  79. package/lib/pedagogy/ui/GlossaryDefinition.js.map +1 -1
  80. package/lib/pedagogy/ui/GlossaryIndex.d.ts.map +1 -1
  81. package/lib/pedagogy/ui/GlossaryIndex.js +1 -1
  82. package/lib/pedagogy/ui/GlossaryIndex.js.map +1 -1
  83. package/lib/pedagogy/ui/GlossaryProvider.d.ts +7 -0
  84. package/lib/pedagogy/ui/GlossaryProvider.d.ts.map +1 -1
  85. package/lib/pedagogy/ui/GlossaryProvider.js +3 -2
  86. package/lib/pedagogy/ui/GlossaryProvider.js.map +1 -1
  87. package/lib/pedagogy/ui/GlossaryText.d.ts +7 -2
  88. package/lib/pedagogy/ui/GlossaryText.d.ts.map +1 -1
  89. package/lib/pedagogy/ui/GlossaryText.js +3 -2
  90. package/lib/pedagogy/ui/GlossaryText.js.map +1 -1
  91. package/lib/pedagogy/ui/InlineText.d.ts +8 -2
  92. package/lib/pedagogy/ui/InlineText.d.ts.map +1 -1
  93. package/lib/pedagogy/ui/InlineText.js +7 -2
  94. package/lib/pedagogy/ui/InlineText.js.map +1 -1
  95. package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts +4 -1
  96. package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts.map +1 -1
  97. package/lib/pedagogy/ui/ReferenceSectionBlock.js +2 -1
  98. package/lib/pedagogy/ui/ReferenceSectionBlock.js.map +1 -1
  99. package/lib/pedagogy/ui/SyntaxTooltip.d.ts.map +1 -1
  100. package/lib/pedagogy/ui/SyntaxTooltip.js +11 -10
  101. package/lib/pedagogy/ui/SyntaxTooltip.js.map +1 -1
  102. package/lib/pedagogy/ui/TutorialStepStrip.d.ts.map +1 -1
  103. package/lib/pedagogy/ui/TutorialStepStrip.js +18 -4
  104. package/lib/pedagogy/ui/TutorialStepStrip.js.map +1 -1
  105. package/lib/pedagogy/ui/glossaryContext.d.ts +7 -0
  106. package/lib/pedagogy/ui/glossaryContext.d.ts.map +1 -1
  107. package/lib/pedagogy/ui/glossaryContext.js.map +1 -1
  108. package/lib/pedagogy/ui/index.d.ts +1 -1
  109. package/lib/pedagogy/ui/index.d.ts.map +1 -1
  110. package/lib/pedagogy/ui/inlineSegments.d.ts +5 -0
  111. package/lib/pedagogy/ui/inlineSegments.d.ts.map +1 -1
  112. package/lib/pedagogy/ui/inlineSegments.js +2 -0
  113. package/lib/pedagogy/ui/inlineSegments.js.map +1 -1
  114. package/lib/pedagogy/ui/pedagogyStyle.d.ts +8 -9
  115. package/lib/pedagogy/ui/pedagogyStyle.d.ts.map +1 -1
  116. package/lib/pedagogy/ui/pedagogyStyle.js +10 -18
  117. package/lib/pedagogy/ui/pedagogyStyle.js.map +1 -1
  118. package/lib/range/core/index.d.ts +4 -0
  119. package/lib/range/core/index.d.ts.map +1 -0
  120. package/lib/range/core/index.js +3 -0
  121. package/lib/range/core/index.js.map +1 -0
  122. package/lib/range/core/rangeBounds.d.ts +79 -0
  123. package/lib/range/core/rangeBounds.d.ts.map +1 -0
  124. package/lib/range/core/rangeBounds.js +110 -0
  125. package/lib/range/core/rangeBounds.js.map +1 -0
  126. package/lib/range/core/rangeHistogram.d.ts +13 -0
  127. package/lib/range/core/rangeHistogram.d.ts.map +1 -0
  128. package/lib/range/core/rangeHistogram.js +39 -0
  129. package/lib/range/core/rangeHistogram.js.map +1 -0
  130. package/lib/range/ui/RangeHistogram.d.ts +20 -0
  131. package/lib/range/ui/RangeHistogram.d.ts.map +1 -0
  132. package/lib/range/ui/RangeHistogram.js +18 -0
  133. package/lib/range/ui/RangeHistogram.js.map +1 -0
  134. package/lib/range/ui/RangeSlider.d.ts +77 -0
  135. package/lib/range/ui/RangeSlider.d.ts.map +1 -0
  136. package/lib/range/ui/RangeSlider.js +60 -0
  137. package/lib/range/ui/RangeSlider.js.map +1 -0
  138. package/lib/range/ui/RangeValue.d.ts +41 -0
  139. package/lib/range/ui/RangeValue.d.ts.map +1 -0
  140. package/lib/range/ui/RangeValue.js +73 -0
  141. package/lib/range/ui/RangeValue.js.map +1 -0
  142. package/lib/range/ui/index.d.ts +3 -0
  143. package/lib/range/ui/index.d.ts.map +1 -0
  144. package/lib/range/ui/index.js +2 -0
  145. package/lib/range/ui/index.js.map +1 -0
  146. package/lib/seo/core/documentMeta.d.ts +16 -0
  147. package/lib/seo/core/documentMeta.d.ts.map +1 -1
  148. package/lib/seo/core/documentMeta.js +18 -0
  149. package/lib/seo/core/documentMeta.js.map +1 -1
  150. package/lib/seo/core/index.d.ts +3 -1
  151. package/lib/seo/core/index.d.ts.map +1 -1
  152. package/lib/seo/core/index.js +2 -1
  153. package/lib/seo/core/index.js.map +1 -1
  154. package/lib/seo/core/noscript.d.ts +8 -0
  155. package/lib/seo/core/noscript.d.ts.map +1 -1
  156. package/lib/seo/core/noscript.js +10 -3
  157. package/lib/seo/core/noscript.js.map +1 -1
  158. package/lib/seo/core/pageMeta.d.ts +10 -2
  159. package/lib/seo/core/pageMeta.d.ts.map +1 -1
  160. package/lib/seo/core/pageMeta.js +12 -3
  161. package/lib/seo/core/pageMeta.js.map +1 -1
  162. package/lib/seo/core/plainDescription.d.ts +2 -2
  163. package/lib/seo/core/plainDescription.js +5 -2
  164. package/lib/seo/core/plainDescription.js.map +1 -1
  165. package/lib/seo/core/siteFiles.d.ts +32 -3
  166. package/lib/seo/core/siteFiles.d.ts.map +1 -1
  167. package/lib/seo/core/siteFiles.js +13 -4
  168. package/lib/seo/core/siteFiles.js.map +1 -1
  169. package/lib/seo/core/startDocumentMeta.js +8 -7
  170. package/lib/seo/core/startDocumentMeta.js.map +1 -1
  171. package/lib/seo/vite/prerender.d.ts +26 -4
  172. package/lib/seo/vite/prerender.d.ts.map +1 -1
  173. package/lib/seo/vite/prerender.js +100 -30
  174. package/lib/seo/vite/prerender.js.map +1 -1
  175. package/lib/share/core/devices.d.ts +41 -0
  176. package/lib/share/core/devices.d.ts.map +1 -0
  177. package/lib/share/core/devices.js +58 -0
  178. package/lib/share/core/devices.js.map +1 -0
  179. package/lib/share/core/index.d.ts +4 -0
  180. package/lib/share/core/index.d.ts.map +1 -1
  181. package/lib/share/core/index.js +2 -0
  182. package/lib/share/core/index.js.map +1 -1
  183. package/lib/share/core/regions.d.ts +43 -0
  184. package/lib/share/core/regions.d.ts.map +1 -0
  185. package/lib/share/core/regions.js +71 -0
  186. package/lib/share/core/regions.js.map +1 -0
  187. package/lib/share/ui/HiddenPartsProvider.d.ts.map +1 -1
  188. package/lib/share/ui/HiddenPartsProvider.js +4 -1
  189. package/lib/share/ui/HiddenPartsProvider.js.map +1 -1
  190. package/lib/share/ui/PagePart.d.ts.map +1 -1
  191. package/lib/share/ui/PagePart.js +10 -1
  192. package/lib/share/ui/PagePart.js.map +1 -1
  193. package/lib/share/ui/ShareButton.d.ts.map +1 -1
  194. package/lib/share/ui/ShareButton.js +3 -4
  195. package/lib/share/ui/ShareButton.js.map +1 -1
  196. package/lib/share/ui/ShareConfigOptions.d.ts +6 -1
  197. package/lib/share/ui/ShareConfigOptions.d.ts.map +1 -1
  198. package/lib/share/ui/ShareConfigOptions.js +6 -13
  199. package/lib/share/ui/ShareConfigOptions.js.map +1 -1
  200. package/lib/share/ui/ShareDialog.d.ts +14 -0
  201. package/lib/share/ui/ShareDialog.d.ts.map +1 -1
  202. package/lib/share/ui/ShareDialog.js +3 -3
  203. package/lib/share/ui/ShareDialog.js.map +1 -1
  204. package/lib/share/ui/ShareDialogContent.d.ts +2 -2
  205. package/lib/share/ui/ShareDialogContent.d.ts.map +1 -1
  206. package/lib/share/ui/ShareDialogContent.js +36 -30
  207. package/lib/share/ui/ShareDialogContent.js.map +1 -1
  208. package/lib/share/ui/ShareLinkBar.d.ts +21 -0
  209. package/lib/share/ui/ShareLinkBar.d.ts.map +1 -0
  210. package/lib/share/ui/ShareLinkBar.js +32 -0
  211. package/lib/share/ui/ShareLinkBar.js.map +1 -0
  212. package/lib/share/ui/SharePanes.d.ts +17 -0
  213. package/lib/share/ui/SharePanes.d.ts.map +1 -0
  214. package/lib/share/ui/SharePanes.js +27 -0
  215. package/lib/share/ui/SharePanes.js.map +1 -0
  216. package/lib/share/ui/SharePartOptions.d.ts +9 -3
  217. package/lib/share/ui/SharePartOptions.d.ts.map +1 -1
  218. package/lib/share/ui/SharePartOptions.js +12 -16
  219. package/lib/share/ui/SharePartOptions.js.map +1 -1
  220. package/lib/share/ui/SharePartRow.d.ts +37 -0
  221. package/lib/share/ui/SharePartRow.d.ts.map +1 -0
  222. package/lib/share/ui/SharePartRow.js +25 -0
  223. package/lib/share/ui/SharePartRow.js.map +1 -0
  224. package/lib/share/ui/SharePresetTabs.d.ts +10 -7
  225. package/lib/share/ui/SharePresetTabs.d.ts.map +1 -1
  226. package/lib/share/ui/SharePresetTabs.js +17 -17
  227. package/lib/share/ui/SharePresetTabs.js.map +1 -1
  228. package/lib/share/ui/SharePreview.d.ts +32 -0
  229. package/lib/share/ui/SharePreview.d.ts.map +1 -0
  230. package/lib/share/ui/SharePreview.js +104 -0
  231. package/lib/share/ui/SharePreview.js.map +1 -0
  232. package/lib/share/ui/SharePreviewDevices.d.ts +20 -0
  233. package/lib/share/ui/SharePreviewDevices.d.ts.map +1 -0
  234. package/lib/share/ui/SharePreviewDevices.js +40 -0
  235. package/lib/share/ui/SharePreviewDevices.js.map +1 -0
  236. package/lib/share/ui/index.d.ts +1 -0
  237. package/lib/share/ui/index.d.ts.map +1 -1
  238. package/lib/share/ui/index.js.map +1 -1
  239. package/lib/share/ui/shareMarking.d.ts +14 -0
  240. package/lib/share/ui/shareMarking.d.ts.map +1 -0
  241. package/lib/share/ui/shareMarking.js +17 -0
  242. package/lib/share/ui/shareMarking.js.map +1 -0
  243. package/lib/share/ui/useShareRegionReports.d.ts +12 -0
  244. package/lib/share/ui/useShareRegionReports.d.ts.map +1 -0
  245. package/lib/share/ui/useShareRegionReports.js +73 -0
  246. package/lib/share/ui/useShareRegionReports.js.map +1 -0
  247. package/lib/shared/ui/ActionTooltip.d.ts +42 -0
  248. package/lib/shared/ui/ActionTooltip.d.ts.map +1 -0
  249. package/lib/shared/ui/ActionTooltip.js +21 -0
  250. package/lib/shared/ui/ActionTooltip.js.map +1 -0
  251. package/lib/shared/ui/index.d.ts +4 -0
  252. package/lib/shared/ui/index.d.ts.map +1 -1
  253. package/lib/shared/ui/index.js +2 -0
  254. package/lib/shared/ui/index.js.map +1 -1
  255. package/lib/shared/ui/useActionTooltip.d.ts +48 -0
  256. package/lib/shared/ui/useActionTooltip.d.ts.map +1 -0
  257. package/lib/shared/ui/useActionTooltip.js +78 -0
  258. package/lib/shared/ui/useActionTooltip.js.map +1 -0
  259. package/lib/structure/core/index.d.ts +2 -0
  260. package/lib/structure/core/index.d.ts.map +1 -1
  261. package/lib/structure/core/index.js +1 -0
  262. package/lib/structure/core/index.js.map +1 -1
  263. package/lib/structure/core/sourceMolecule.d.ts +18 -0
  264. package/lib/structure/core/sourceMolecule.d.ts.map +1 -0
  265. package/lib/structure/core/sourceMolecule.js +26 -0
  266. package/lib/structure/core/sourceMolecule.js.map +1 -0
  267. package/lib/structure/core/structureNotations.d.ts +57 -0
  268. package/lib/structure/core/structureNotations.d.ts.map +1 -0
  269. package/lib/structure/core/structureNotations.js +74 -0
  270. package/lib/structure/core/structureNotations.js.map +1 -0
  271. package/lib/structure/core/structurePicture.d.ts +49 -0
  272. package/lib/structure/core/structurePicture.d.ts.map +1 -0
  273. package/lib/structure/core/structurePicture.js +83 -0
  274. package/lib/structure/core/structurePicture.js.map +1 -0
  275. package/lib/structure/ui/EditorExportButton.d.ts +23 -0
  276. package/lib/structure/ui/EditorExportButton.d.ts.map +1 -0
  277. package/lib/structure/ui/EditorExportButton.js +23 -0
  278. package/lib/structure/ui/EditorExportButton.js.map +1 -0
  279. package/lib/structure/ui/EditorHelpButton.d.ts +5 -2
  280. package/lib/structure/ui/EditorHelpButton.d.ts.map +1 -1
  281. package/lib/structure/ui/EditorHelpButton.js +8 -9
  282. package/lib/structure/ui/EditorHelpButton.js.map +1 -1
  283. package/lib/structure/ui/StructureEditor.d.ts +8 -0
  284. package/lib/structure/ui/StructureEditor.d.ts.map +1 -1
  285. package/lib/structure/ui/StructureEditor.js +26 -3
  286. package/lib/structure/ui/StructureEditor.js.map +1 -1
  287. package/lib/structure/ui/StructureExportDialog.d.ts +34 -0
  288. package/lib/structure/ui/StructureExportDialog.d.ts.map +1 -0
  289. package/lib/structure/ui/StructureExportDialog.js +43 -0
  290. package/lib/structure/ui/StructureExportDialog.js.map +1 -0
  291. package/lib/structure/ui/StructureExportPanel.d.ts +37 -0
  292. package/lib/structure/ui/StructureExportPanel.d.ts.map +1 -0
  293. package/lib/structure/ui/StructureExportPanel.js +75 -0
  294. package/lib/structure/ui/StructureExportPanel.js.map +1 -0
  295. package/lib/structure/ui/StructureNotationRow.d.ts +22 -0
  296. package/lib/structure/ui/StructureNotationRow.d.ts.map +1 -0
  297. package/lib/structure/ui/StructureNotationRow.js +34 -0
  298. package/lib/structure/ui/StructureNotationRow.js.map +1 -0
  299. package/lib/structure/ui/StructurePicturePane.d.ts +23 -0
  300. package/lib/structure/ui/StructurePicturePane.d.ts.map +1 -0
  301. package/lib/structure/ui/StructurePicturePane.js +113 -0
  302. package/lib/structure/ui/StructurePicturePane.js.map +1 -0
  303. package/lib/structure/ui/StructureSvg.d.ts.map +1 -1
  304. package/lib/structure/ui/StructureSvg.js +2 -18
  305. package/lib/structure/ui/StructureSvg.js.map +1 -1
  306. package/lib/structure/ui/ToolbarTooltip.d.ts.map +1 -1
  307. package/lib/structure/ui/ToolbarTooltip.js +1 -2
  308. package/lib/structure/ui/ToolbarTooltip.js.map +1 -1
  309. package/lib/structure/ui/index.d.ts +7 -3
  310. package/lib/structure/ui/index.d.ts.map +1 -1
  311. package/lib/structure/ui/index.js +5 -3
  312. package/lib/structure/ui/index.js.map +1 -1
  313. package/lib/structure/ui/structureNotationText.d.ts +23 -0
  314. package/lib/structure/ui/structureNotationText.d.ts.map +1 -0
  315. package/lib/structure/ui/structureNotationText.js +42 -0
  316. package/lib/structure/ui/structureNotationText.js.map +1 -0
  317. package/lib/structure/ui/useEditorStructure.d.ts +37 -0
  318. package/lib/structure/ui/useEditorStructure.d.ts.map +1 -0
  319. package/lib/structure/ui/useEditorStructure.js +70 -0
  320. package/lib/structure/ui/useEditorStructure.js.map +1 -0
  321. package/lib/ui.d.ts +1 -0
  322. package/lib/ui.d.ts.map +1 -1
  323. package/lib/ui.js +1 -0
  324. package/lib/ui.js.map +1 -1
  325. package/package.json +1 -1
  326. package/src/chart/ui/Axes.tsx +53 -5
  327. package/src/chrome/ui/NavMenuButton.tsx +61 -18
  328. package/src/chrome/ui/SiteHeader.tsx +37 -1
  329. package/src/chrome/ui/navItem.ts +7 -0
  330. package/src/citation/ui/entries.tsx +10 -2
  331. package/src/clipboard/ui/ClickToCopy.tsx +47 -13
  332. package/src/clipboard/ui/CopyButton.tsx +4 -2
  333. package/src/clipboard/ui/CopyableValue.tsx +88 -13
  334. package/src/clipboard/ui/index.ts +5 -1
  335. package/src/confirm/ui/ConfirmButton.tsx +2 -0
  336. package/src/core.ts +1 -0
  337. package/src/delimited/ui/TableDataButton.tsx +2 -1
  338. package/src/download/core/figureSvg.ts +42 -10
  339. package/src/help/ui/HelpToolbarButton.tsx +2 -1
  340. package/src/locales/de.json +48 -5
  341. package/src/locales/en.json +48 -5
  342. package/src/locales/es.json +48 -5
  343. package/src/locales/fr.json +48 -5
  344. package/src/locales/it.json +48 -5
  345. package/src/number/core/index.ts +1 -0
  346. package/src/number/core/numberText.ts +20 -0
  347. package/src/number/ui/NumberInput.tsx +1 -1
  348. package/src/overlay/ui/OverlayIconButton.tsx +1 -0
  349. package/src/panel/ui/ClearButton.tsx +1 -0
  350. package/src/pedagogy/core/inlineMarks.ts +15 -7
  351. package/src/pedagogy/ui/GlossaryDefinition.tsx +8 -18
  352. package/src/pedagogy/ui/GlossaryIndex.tsx +0 -1
  353. package/src/pedagogy/ui/GlossaryProvider.tsx +10 -2
  354. package/src/pedagogy/ui/GlossaryText.tsx +10 -2
  355. package/src/pedagogy/ui/InlineText.tsx +21 -4
  356. package/src/pedagogy/ui/ReferenceSectionBlock.tsx +8 -2
  357. package/src/pedagogy/ui/SyntaxTooltip.tsx +11 -9
  358. package/src/pedagogy/ui/TutorialStepStrip.tsx +50 -18
  359. package/src/pedagogy/ui/glossaryContext.ts +7 -0
  360. package/src/pedagogy/ui/index.ts +1 -1
  361. package/src/pedagogy/ui/inlineSegments.tsx +7 -0
  362. package/src/pedagogy/ui/pedagogyStyle.ts +12 -24
  363. package/src/range/core/index.ts +11 -0
  364. package/src/range/core/rangeBounds.ts +143 -0
  365. package/src/range/core/rangeHistogram.ts +38 -0
  366. package/src/range/ui/RangeHistogram.tsx +49 -0
  367. package/src/range/ui/RangeSlider.tsx +209 -0
  368. package/src/range/ui/RangeValue.tsx +166 -0
  369. package/src/range/ui/index.ts +2 -0
  370. package/src/seo/core/documentMeta.ts +22 -0
  371. package/src/seo/core/index.ts +8 -1
  372. package/src/seo/core/noscript.ts +20 -2
  373. package/src/seo/core/pageMeta.ts +29 -5
  374. package/src/seo/core/plainDescription.ts +4 -2
  375. package/src/seo/core/siteFiles.ts +45 -10
  376. package/src/seo/core/startDocumentMeta.ts +9 -9
  377. package/src/seo/vite/prerender.ts +160 -36
  378. package/src/share/core/devices.ts +80 -0
  379. package/src/share/core/index.ts +14 -0
  380. package/src/share/core/regions.ts +87 -0
  381. package/src/share/ui/HiddenPartsProvider.tsx +6 -1
  382. package/src/share/ui/PagePart.tsx +12 -1
  383. package/src/share/ui/ShareButton.tsx +3 -6
  384. package/src/share/ui/ShareConfigOptions.tsx +25 -16
  385. package/src/share/ui/ShareDialog.tsx +17 -3
  386. package/src/share/ui/ShareDialogContent.tsx +80 -77
  387. package/src/share/ui/ShareLinkBar.tsx +70 -0
  388. package/src/share/ui/SharePanes.tsx +62 -0
  389. package/src/share/ui/SharePartOptions.tsx +25 -26
  390. package/src/share/ui/SharePartRow.tsx +78 -0
  391. package/src/share/ui/SharePresetTabs.tsx +36 -43
  392. package/src/share/ui/SharePreview.tsx +204 -0
  393. package/src/share/ui/SharePreviewDevices.tsx +70 -0
  394. package/src/share/ui/index.ts +1 -0
  395. package/src/share/ui/shareMarking.ts +18 -0
  396. package/src/share/ui/useShareRegionReports.ts +84 -0
  397. package/src/shared/ui/ActionTooltip.tsx +70 -0
  398. package/src/shared/ui/index.ts +7 -0
  399. package/src/shared/ui/useActionTooltip.ts +103 -0
  400. package/src/structure/core/index.ts +5 -0
  401. package/src/structure/core/sourceMolecule.ts +26 -0
  402. package/src/structure/core/structureNotations.ts +125 -0
  403. package/src/structure/core/structurePicture.ts +119 -0
  404. package/src/structure/ui/EditorExportButton.tsx +62 -0
  405. package/src/structure/ui/EditorHelpButton.tsx +26 -30
  406. package/src/structure/ui/StructureEditor.tsx +51 -5
  407. package/src/structure/ui/StructureExportDialog.tsx +90 -0
  408. package/src/structure/ui/StructureExportPanel.tsx +156 -0
  409. package/src/structure/ui/StructureNotationRow.tsx +74 -0
  410. package/src/structure/ui/StructurePicturePane.tsx +208 -0
  411. package/src/structure/ui/StructureSvg.tsx +3 -12
  412. package/src/structure/ui/ToolbarTooltip.tsx +1 -1
  413. package/src/structure/ui/index.ts +7 -3
  414. package/src/structure/ui/structureNotationText.ts +56 -0
  415. package/src/structure/ui/useEditorStructure.ts +119 -0
  416. package/src/ui.ts +1 -0
  417. package/styles/chrome.css +546 -11
package/README.md CHANGED
@@ -97,7 +97,8 @@ through a wildcard subpath exactly as `react-science` serves its own.
97
97
  | **Pedagogy** | `parseGlossaryMarkers`, `localStorageProgressStore`, `progressSummary`, `finishValidation` | `GlossaryText`, `SyntaxTooltip`, `HintLadder`, `ExerciseActions`, `ExerciseProgressHeader`, `TutorialStepStrip`, `ReferenceGrid`, `TestCaseList` |
98
98
  | **Clipboard & files** | `writeToClipboard`, `downloadBlob`, `downloadText`, `sanitizeFileName`, `toDelimited`, `readDelimited`, `downloadFigure`, `figureSvg`, `figurePng`, `figureSize` | `ClickToCopy`, `CopyButton`, `CopyableValue`, `CodeBlock`, `DelimitedTextDialog`, `FigureDownload` |
99
99
  | **Formatting & colour** | `formatInteger`, `formatDecimal`, `formatBytes`, `pluralize`, `readableInk`, `contrastRatio`, `COLOR_SCALES`, `resolveColorScale`, `formatColorScale`, `colorAt`, `swatchAt`, `sampleScale`, `colorScaleGradient`, `rgbToHsv` | `ColorScaleLegend`, `ColorScaleSelect`, `ColorScaleEditor`, `ColorScaleBar` |
100
- | **Number entry** | `readNumber`, `numberText`, `isPartialNumber`, `stepNumber` | `NumberInput` |
100
+ | **Number entry** | `readNumber`, `numberText`, `isPartialNumber`, `stepNumber`, `snapToStep` | `NumberInput` |
101
+ | **Range filter** | `isRangeBounded`, `isRangeDomain`, `rangeHandles`, `movedRange`, `settleHandles`, `sameRange`, `rangeHistogramPath`, `OPEN_RANGE` | `RangeSlider` |
101
102
  | **Widgets** | `CREDITS`, `credits` | `ErrorBoundary`, `CollapsibleSection`, `CapsuleFilter`, `HelpTooltip`, `CreditsList` |
102
103
  | **Hooks & state** | `createWorkerChannel`, `persistBucket`, `persistSignalBucket` | `useDebouncedValue`, `useContainerSize`, `useListKeyboardNavigation`, `useDisclosure` |
103
104
  | **Chemistry** | `atomicOrbitalsOf`, `configurationOf`, `classifyMolfile`, `readStructure`, `toMolfileExport` | `AtomicOrbitalViewer` (`/orbital`), `StructureEditor`, `Structure` (`/structure`) |
@@ -337,6 +338,50 @@ The colours a name is set in are the site's own and are not retuned to reach the
337
338
  4.5:1 of body text: ChemCalc's teal and NMRium's orange both land just under it,
338
339
  which is why a name is set bold, where 3:1 is the threshold.
339
340
 
341
+ ### `StructureEditor`
342
+
343
+ The canvas a structure is drawn on, sized so none of its toolbar is cut off, and
344
+ loaded from whatever notation the caller has.
345
+
346
+ ```tsx
347
+ import { StructureEditor } from 'react-cheminfo/structure';
348
+
349
+ <StructureEditor
350
+ value={smiles}
351
+ inputFormat="smiles"
352
+ revision={revision}
353
+ minHeight={280}
354
+ onChange={(change) => setSmiles(change.smiles)}
355
+ />;
356
+ ```
357
+
358
+ - **The canvas takes a pasted structure itself, so a site needs no box beside it
359
+ to paste into.** Click the canvas and ⌘/Ctrl-V reads a molfile, a SMILES or an
360
+ idCode out of the clipboard and adds it to the drawing — openchemlib listens
361
+ for the paste on the editor and parses the text with `Molecule.fromText`.
362
+ Focus is what decides it, not the pointer: a paste while the caret is
363
+ elsewhere goes to that element and the canvas never sees it. ⌘/Ctrl-C copies
364
+ the structure back out. A box is still worth having where a structure arrives
365
+ as _text the visitor keeps_ — a share link, a value they read back — and not
366
+ merely to get a SMILES onto the canvas.
367
+ - **The editor is uncontrolled**: `value` is read at mount and again on every
368
+ change of `revision`, never on every render. Feeding the drawing back into
369
+ `value` would replace every coordinate under the pen, so bump `revision` when
370
+ an example, a share link or a Clear button loads a structure the editor did
371
+ not produce.
372
+ - `onChange` fires once the drawing has been still for `debounce` milliseconds
373
+ (300 by default) with every notation read out at once — idCode, SMILES,
374
+ molfile, formula.
375
+ - `minHeight` is a floor, not a height: the container grows to whatever the
376
+ toolbar needs, measured when the lazy canvas arrives rather than on a
377
+ deadline, so a slow chunk never leaves half the palette cut off.
378
+ - `help` (on by default) explains each toolbar button in a tooltip and puts a
379
+ guide to the mouse and the keyboard in the corner, which F1 opens too — the
380
+ paste and copy keys are listed there under **Anywhere**.
381
+ - The canvas sits behind `React.lazy`, so a page that never opens an editor
382
+ never downloads openchemlib, and `react-cheminfo/structure` stays importable
383
+ when those optional peers are absent.
384
+
340
385
  ### `ColorScaleSelect`
341
386
 
342
387
  The colours a quantity is read with, chosen by looking at them rather than by
@@ -595,6 +640,37 @@ in a box of exactly that size.
595
640
  `downloadFigure(target, options)`, `figureSvg` and `figurePng` are the same thing
596
641
  without the button, for a site saving a figure from its own menu.
597
642
 
643
+ ### `RangeSlider`
644
+
645
+ A range picked with two handles, its two values written under the track, where
646
+ a click turns either into a box to type an exact number.
647
+
648
+ ```tsx
649
+ import { RangeSlider } from 'react-cheminfo/ui';
650
+
651
+ <RangeSlider
652
+ label="Molecular weight"
653
+ unit="g/mol"
654
+ domain={[0, 1000]}
655
+ step={10}
656
+ value={range}
657
+ histogram={counts}
658
+ onPreview={setCountRange}
659
+ onChange={setRange}
660
+ />;
661
+ ```
662
+
663
+ - **A handle at the end of the track is an open side.** The range is
664
+ `{ min, max }`, either side `null`; the track only covers the values the page
665
+ knows about, so a value past it is never cut by a filter nobody touched.
666
+ - **`onChange` fires when the range settles** — a handle released, a value
667
+ typed, the range cleared — so a page that fetches on it fetches once per
668
+ gesture. `onPreview` follows every step of a drag, for what is cheap to redraw.
669
+ - **The handles are Blueprint's**, so the keyboard, touch screens and screen
670
+ readers are handled there; the stylesheet dresses them in the brand colour.
671
+ - **`histogram`** takes one count per equal-width bin, drawn over the track with
672
+ the part the handles keep in the brand colour.
673
+
598
674
  ### `ParallelCoordinates`
599
675
 
600
676
  Many rows against many properties at once: one vertical axis per column, one
package/bin/check-seo.mjs CHANGED
@@ -69,6 +69,7 @@ if (pages.length === 0) {
69
69
  const problems = [];
70
70
  const deferred = [];
71
71
  const excluded = [];
72
+ const written = new Set(pages.map((page) => page.address));
72
73
  const titles = new Map();
73
74
  const descriptions = new Map();
74
75
 
@@ -209,6 +210,48 @@ function checkHead(at, html) {
209
210
  problems.push(`${at}: no twitter:card, so a shared link unfurls bare.`);
210
211
  }
211
212
 
213
+ // A translated page points at its own language too, so a set that is there
214
+ // at all must name every address the build wrote for this page. One that
215
+ // points at a file nothing wrote is a soft 404 on every language at once,
216
+ // and a set missing its own address is ignored whole.
217
+ const alternates = [
218
+ ...html.matchAll(
219
+ /<link\s+rel="alternate"\s+hreflang="([^"]*)"\s+href="([^"]*)"/gi,
220
+ ),
221
+ ];
222
+ if (alternates.length > 0) {
223
+ let self = false;
224
+ for (const [, hreflang, href] of alternates) {
225
+ const own = ownPath(href ?? '');
226
+ if (own === undefined) continue;
227
+ if (own === at) self = true;
228
+ if (!written.has(own)) {
229
+ problems.push(
230
+ `${at}: hreflang="${hreflang}" points at ${own}, which the build never wrote.`,
231
+ );
232
+ }
233
+ }
234
+ if (!self) {
235
+ problems.push(
236
+ `${at}: the hreflang set does not name this address — a set that leaves out the page it is on is ignored whole.`,
237
+ );
238
+ }
239
+ const prefix = /^\/(?<language>[a-z]{2}(?:-[A-Za-z]{2,8})?)(?:\/|$)/.exec(
240
+ at,
241
+ );
242
+ const named = prefix?.groups?.language;
243
+ const declared = tag(html, /<html[^>]*\slang="([^"]*)"/i);
244
+ if (
245
+ named !== undefined &&
246
+ alternates.some(([, hreflang]) => hreflang === named) &&
247
+ declared !== named
248
+ ) {
249
+ problems.push(
250
+ `${at}: the address says ${named} and <html lang> says ${declared ?? 'nothing'} — a page whose lang lies is offered to the wrong reader.`,
251
+ );
252
+ }
253
+ }
254
+
212
255
  const image = tag(html, /<meta\s+property="og:image"\s+content="([^"]*)"/i);
213
256
  if (image === undefined) {
214
257
  problems.push(`${at}: no og:image.`);
@@ -245,7 +288,6 @@ function checkSiteFiles() {
245
288
  return;
246
289
  }
247
290
  const xml = readFileSync(sitemap, 'utf8');
248
- const written = new Set(pages.map((page) => page.address));
249
291
  const claimed = new Set();
250
292
  let listed = 0;
251
293
  for (const match of xml.matchAll(/<loc>([^<]+)<\/loc>/g)) {
@@ -70,6 +70,25 @@ export interface AxesProps {
70
70
  * @default 44
71
71
  */
72
72
  yTickSpacing?: number;
73
+ /**
74
+ * The values to rule the vertical axis at, instead of the ones the room
75
+ * allows.
76
+ *
77
+ * An axis whose ticks are decided by what is being measured rather than by
78
+ * how much space there is: a concentration read over fifteen decades is ruled
79
+ * at the decades, and a tick at 0.0037 between two of them says nothing. The
80
+ * values outside the window are dropped, so one list serves every zoom.
81
+ * @default the ticks worked out from the window and the room
82
+ */
83
+ yTickValues?: readonly number[];
84
+ /**
85
+ * How a value up the side is written, instead of as a plain number.
86
+ *
87
+ * What goes with `yTickValues`: an axis ruled at the decades writes `10⁻³`,
88
+ * and the exponent is the only part of it a reader is reading.
89
+ * @default the notation the window's step calls for
90
+ */
91
+ formatYTick?: (value: number) => string;
73
92
  }
74
93
  /**
75
94
  * The frame the spectra are read against: two axis lines, a grid, and titles.
@@ -1 +1 @@
1
- {"version":3,"file":"Axes.d.ts","sourceRoot":"","sources":["../../../src/chart/ui/Axes.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,MAAM,WAAW,SAAS;IACxB,0CAA0C;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf,6EAA6E;IAC7E,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,wEAAwE;IACxE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC;;;;OAIG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB,mDAAmD;IACnD,MAAM,EAAE,UAAU,CAAC;IACnB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CA+HnD"}
1
+ {"version":3,"file":"Axes.d.ts","sourceRoot":"","sources":["../../../src/chart/ui/Axes.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,MAAM,WAAW,SAAS;IACxB,0CAA0C;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf,6EAA6E;IAC7E,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,wEAAwE;IACxE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC;;;;OAIG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB,mDAAmD;IACnD,MAAM,EAAE,UAAU,CAAC;IACnB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CAyInD"}
@@ -34,11 +34,15 @@ import { CHART_COLORS, CHART_FONT } from "../core/chartTheme.js";
34
34
  * @returns The axes, as SVG.
35
35
  */
36
36
  export function Axes(props) {
37
- const { plot, xDomain, yDomain, xScale, yScale, absYTicks = false, showXTicks = true, showXTitle = true, xTitle, yTitle, xTickSpacing = X_TICK_SPACING, yTickSpacing = Y_TICK_SPACING, } = props;
37
+ const { plot, xDomain, yDomain, xScale, yScale, absYTicks = false, showXTicks = true, showXTitle = true, xTitle, yTitle, xTickSpacing = X_TICK_SPACING, yTickSpacing = Y_TICK_SPACING, yTickValues, formatYTick, } = props;
38
38
  const xTicks = useMemo(() => spectrumAxis(xDomain, tickCount(plot.width, xTickSpacing)), [xDomain, plot.width, xTickSpacing]);
39
39
  const yTicks = useMemo(() => spectrumAxis(yDomain, tickCount(plot.height, yTickSpacing)), [yDomain, plot.height, yTickSpacing]);
40
40
  const writeXTick = useMemo(() => axisLabeller(xTicks), [xTicks]);
41
- const writeYTick = useMemo(() => axisLabeller(yTicks), [yTicks]);
41
+ const labelYTick = useMemo(() => axisLabeller(yTicks), [yTicks]);
42
+ const writeYTick = formatYTick ?? labelYTick;
43
+ // Ruled where the quantity asks rather than where there is room; a value the
44
+ // zoom has left behind is dropped rather than drawn onto the margin.
45
+ const yRules = useMemo(() => (yTickValues ? insideWindow(yTickValues, yDomain) : yTicks.values), [yTickValues, yDomain, yTicks]);
42
46
  const middleX = plot.left + plot.width / 2;
43
47
  const middleY = plot.top + plot.height / 2;
44
48
  // Beside the numbers rather than in a fixed column at the edge of the margin.
@@ -46,13 +50,29 @@ export function Axes(props) {
46
50
  // title pinned where the wider of the two would leave it stands twenty pixels
47
51
  // clear of the narrower — far enough to read as naming the chart rather than
48
52
  // the axis.
49
- const titleColumn = useMemo(() => valueTitleColumn(yTicks.values, writeYTick, absYTicks, plot.left), [yTicks, writeYTick, absYTicks, plot.left]);
53
+ const titleColumn = useMemo(() => valueTitleColumn(yRules, writeYTick, absYTicks, plot.left), [yRules, writeYTick, absYTicks, plot.left]);
50
54
  // The rule a mirrored pair is reflected in only exists while both halves are
51
55
  // on screen; on an ordinary chart zero is the baseline and already drawn.
52
56
  const zero = chartPixel(yScale, 0);
53
57
  const showsZeroRule = yDomain[0] < 0 && yDomain[1] > 0;
54
- return (_jsxs("g", { pointerEvents: "none", children: [xTicks.values.map((tick) => (_jsx("line", { x1: chartPixel(xScale, tick), y1: plot.top, x2: chartPixel(xScale, tick), y2: plot.bottom, style: gridStyle }, tick))), yTicks.values.map((tick) => (_jsx("line", { x1: plot.left, y1: chartPixel(yScale, tick), x2: plot.right, y2: chartPixel(yScale, tick), style: gridStyle }, tick))), showsZeroRule ? (_jsx("line", { x1: plot.left, y1: zero, x2: plot.right, y2: zero, style: zeroRuleStyle })) : null, _jsx("path", { d: `M${plot.left} ${plot.top}V${plot.bottom}H${plot.right}`, fill: "none", style: axisStyle }), showXTicks &&
55
- xTicks.values.map((tick) => (_jsx("text", { x: chartPixel(xScale, tick), y: plot.bottom + TICK_LABEL_GAP, textAnchor: "middle", dominantBaseline: "hanging", style: tickStyle, children: writeXTick(tick) }, tick))), yTicks.values.map((tick) => (_jsx("text", { x: plot.left - TICK_LABEL_GAP, y: chartPixel(yScale, tick), textAnchor: "end", dominantBaseline: "central", style: tickStyle, children: writeYTick(absYTicks ? Math.abs(tick) : tick) }, tick))), showXTitle && (_jsx("text", { x: middleX, y: plot.bottom + TITLE_GAP, textAnchor: "middle", dominantBaseline: "hanging", style: titleStyle, children: xTitle })), _jsx("text", { x: titleColumn, y: middleY, transform: `rotate(-90 ${titleColumn} ${middleY})`, textAnchor: "middle", dominantBaseline: "central", style: titleStyle, children: yTitle })] }));
58
+ return (_jsxs("g", { pointerEvents: "none", children: [xTicks.values.map((tick) => (_jsx("line", { x1: chartPixel(xScale, tick), y1: plot.top, x2: chartPixel(xScale, tick), y2: plot.bottom, style: gridStyle }, tick))), yRules.map((tick) => (_jsx("line", { x1: plot.left, y1: chartPixel(yScale, tick), x2: plot.right, y2: chartPixel(yScale, tick), style: gridStyle }, tick))), showsZeroRule ? (_jsx("line", { x1: plot.left, y1: zero, x2: plot.right, y2: zero, style: zeroRuleStyle })) : null, _jsx("path", { d: `M${plot.left} ${plot.top}V${plot.bottom}H${plot.right}`, fill: "none", style: axisStyle }), showXTicks &&
59
+ xTicks.values.map((tick) => (_jsx("text", { x: chartPixel(xScale, tick), y: plot.bottom + TICK_LABEL_GAP, textAnchor: "middle", dominantBaseline: "hanging", style: tickStyle, children: writeXTick(tick) }, tick))), yRules.map((tick) => (_jsx("text", { x: plot.left - TICK_LABEL_GAP, y: chartPixel(yScale, tick), textAnchor: "end", dominantBaseline: "central", style: tickStyle, children: writeYTick(absYTicks ? Math.abs(tick) : tick) }, tick))), showXTitle && (_jsx("text", { x: middleX, y: plot.bottom + TITLE_GAP, textAnchor: "middle", dominantBaseline: "hanging", style: titleStyle, children: xTitle })), _jsx("text", { x: titleColumn, y: middleY, transform: `rotate(-90 ${titleColumn} ${middleY})`, textAnchor: "middle", dominantBaseline: "central", style: titleStyle, children: yTitle })] }));
60
+ }
61
+ /**
62
+ * The values of a given list that the window still shows.
63
+ * @param values - Every value the axis would be ruled at.
64
+ * @param domain - The window on screen, `[from, to]`.
65
+ * @returns Those inside it, in the order they were given.
66
+ */
67
+ function insideWindow(values, domain) {
68
+ const low = Math.min(domain[0], domain[1]);
69
+ const high = Math.max(domain[0], domain[1]);
70
+ const inside = [];
71
+ for (const value of values) {
72
+ if (value >= low && value <= high)
73
+ inside.push(value);
74
+ }
75
+ return inside;
56
76
  }
57
77
  /**
58
78
  * The ticks of one axis of a chart a reader has zoomed for themselves.
@@ -1 +1 @@
1
- {"version":3,"file":"Axes.js","sourceRoot":"","sources":["../../../src/chart/ui/Axes.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Axes.js","sourceRoot":"","sources":["../../../src/chart/ui/Axes.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavMenuButton.d.ts","sourceRoot":"","sources":["../../../src/chrome/ui/NavMenuButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1C;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CAkErE"}
1
+ {"version":3,"file":"NavMenuButton.d.ts","sourceRoot":"","sources":["../../../src/chrome/ui/NavMenuButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1C;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CAkDrE"}
@@ -11,7 +11,7 @@ import { isModifiedClick } from "./navItem.js";
11
11
  */
12
12
  export function NavMenuButton(props) {
13
13
  const { label, items, activeId, icon, placement = 'bottom-start', compact = false, children, } = props;
14
- const holdsActive = items.some((item) => item.id === activeId);
14
+ const holdsActive = holdsId(items, activeId);
15
15
  const classes = [
16
16
  'nav-link',
17
17
  icon === undefined ? null : 'nav-link--icon',
@@ -19,15 +19,45 @@ export function NavMenuButton(props) {
19
19
  ]
20
20
  .filter((part) => part !== null)
21
21
  .join(' ');
22
- return (_jsx(PopoverNext, { placement: placement, content: _jsxs(Menu, { className: "nav-menu", children: [items.map((item) => (_jsx(MenuItem, { icon: item.icon, text: item.label,
23
- // A real address, so a crawler reaching the menu can follow it
24
- // and a middle click opens a tab of its own.
25
- href: item.href, target: item.external ? '_blank' : undefined, active: item.id === activeId, onClick: (event) => {
26
- if (item.onSelect === undefined || isModifiedClick(event)) {
27
- return;
28
- }
29
- event.preventDefault();
30
- item.onSelect();
31
- } }, item.id))), children] }), children: _jsxs("button", { type: "button", className: classes, "aria-label": label, title: compact ? label : undefined, children: [icon === undefined ? (label) : (_jsxs(_Fragment, { children: [_jsx(Icon, { icon: icon, size: 14 }), compact ? null : _jsx("span", { className: "nav-link__label", children: label })] })), compact ? null : _jsx(Icon, { icon: "caret-down", size: 14 })] }) }));
22
+ return (_jsx(PopoverNext, { placement: placement, content: _jsxs(Menu, { className: "nav-menu", children: [items.map((item) => (_jsx(NavMenuEntry, { item: item, activeId: activeId }, item.id))), children] }), children: _jsxs("button", { type: "button", className: classes, "aria-label": label, title: compact ? label : undefined, children: [icon === undefined ? (label) : (_jsxs(_Fragment, { children: [_jsx(Icon, { icon: icon, size: 14 }), compact ? null : _jsx("span", { className: "nav-link__label", children: label })] })), compact ? null : _jsx(Icon, { icon: "caret-down", size: 14 })] }) }));
23
+ }
24
+ /**
25
+ * One line of a header menu, holding a submenu of its own when the entry folds
26
+ * pages — which is how a bar entry that is already a menu reads once the whole
27
+ * bar has folded into one.
28
+ * @param props - The entry and the page on show.
29
+ * @param props.item - The entry.
30
+ * @param props.activeId - The page on show.
31
+ * @returns The line.
32
+ */
33
+ function NavMenuEntry(props) {
34
+ const { item, activeId } = props;
35
+ return (_jsx(MenuItem, { icon: item.icon, text: item.label,
36
+ // A real address, so a crawler reaching the menu can follow it and a
37
+ // middle click opens a tab of its own.
38
+ href: item.href, target: item.external ? '_blank' : undefined, active: item.items === undefined
39
+ ? item.id === activeId
40
+ : holdsId(item.items, activeId), onClick: (event) => {
41
+ if (item.onSelect === undefined || isModifiedClick(event))
42
+ return;
43
+ event.preventDefault();
44
+ item.onSelect();
45
+ }, children: item.items?.map((child) => (_jsx(NavMenuEntry, { item: child, activeId: activeId }, child.id))) }));
46
+ }
47
+ /**
48
+ * Whether a run of entries holds the page on show, looking through the ones
49
+ * that are menus of their own.
50
+ * @param items - The entries.
51
+ * @param activeId - The page on show.
52
+ * @returns Whether one of them is it.
53
+ */
54
+ function holdsId(items, activeId) {
55
+ for (const item of items) {
56
+ if (item.id === activeId)
57
+ return true;
58
+ if (item.items !== undefined && holdsId(item.items, activeId))
59
+ return true;
60
+ }
61
+ return false;
32
62
  }
33
63
  //# sourceMappingURL=NavMenuButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NavMenuButton.js","sourceRoot":"","sources":["../../../src/chrome/ui/NavMenuButton.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAItE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAoC/C;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,EACJ,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,SAAS,GAAG,cAAc,EAC1B,OAAO,GAAG,KAAK,EACf,QAAQ,GACT,GAAG,KAAK,CAAC;IAEV,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG;QACd,UAAU;QACV,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB;QAC5C,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI;KACxC;SACE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;SAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,CACL,KAAC,WAAW,IACV,SAAS,EAAE,SAAS,EACpB,OAAO,EACL,MAAC,IAAI,IAAC,SAAS,EAAC,UAAU,aACvB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,QAAQ,IAEP,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,IAAI,EAAE,IAAI,CAAC,KAAK;oBAChB,+DAA+D;oBAC/D,6CAA6C;oBAC7C,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAC5C,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,QAAQ,EAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;wBACjB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC1D,OAAO;wBACT,CAAC;wBACD,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,CAAC,IAdI,IAAI,CAAC,EAAE,CAeZ,CACH,CAAC,EACD,QAAQ,IACJ,YAGT,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,OAAO,gBACN,KAAK,EACjB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,aAEjC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CACpB,KAAK,CACN,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAI,EAC7B,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,iBAAiB,YAAE,KAAK,GAAQ,IACjE,CACJ,EACA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,IAAI,EAAC,YAAY,EAAC,IAAI,EAAE,EAAE,GAAI,IAC/C,GACG,CACf,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"NavMenuButton.js","sourceRoot":"","sources":["../../../src/chrome/ui/NavMenuButton.tsx"],"names":[],"mappings":"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"}
@@ -34,7 +34,30 @@ export function SiteHeader(props) {
34
34
  return;
35
35
  event.preventDefault();
36
36
  onHome();
37
- }, children: [mark ?? _jsx(SiteMark, { site: site, size: markSize }), _jsx(Wordmark, { site: site })] }), _jsx("nav", { className: "app-header-nav", children: nav.map((item) => (_jsx(Fragment, { children: renderNavItem === undefined ? (_jsx(NavLink, { item: item, active: item.id === activeId })) : (renderNavItem(item, item.id === activeId)) }, item.id))) }), nav.length > 1 ? (_jsx("div", { className: "app-header-nav-menu", children: _jsx(NavMenuButton, { label: pagesLabel ?? t('chrome.pages'), icon: "menu", compact: true, items: nav, activeId: activeId }) })) : null, _jsx("span", { className: "spacer" }), actions === undefined ? null : (_jsx("div", { className: "app-header-actions", children: actions }))] }) }));
37
+ }, children: [mark ?? _jsx(SiteMark, { site: site, size: markSize }), _jsx(Wordmark, { site: site })] }), _jsx("nav", { className: "app-header-nav", children: nav.map((item) => (_jsx(Fragment, { children: renderNavItem === undefined ? (_jsx(NavEntry, { item: item, activeId: activeId })) : (renderNavItem(item, item.id === activeId)) }, item.id))) }), nav.length > 1 ? (_jsx("div", { className: "app-header-nav-menu", children: _jsx(NavMenuButton, { label: pagesLabel ?? t('chrome.pages'), icon: "menu", compact: true, items: nav, activeId: activeId }) })) : null, _jsx("span", { className: "spacer" }), actions === undefined ? null : (_jsx("div", { className: "app-header-actions", children: actions }))] }) }));
38
+ }
39
+ /**
40
+ * One page of the bar: a link, or the menu it opens when the entry folds pages
41
+ * of its own. A menu stands where its pages would, among them and not among the
42
+ * utilities, because picking one of them changes what the page shows.
43
+ * @param props - The entry and the page on show.
44
+ * @param props.item - The entry.
45
+ * @param props.activeId - The page on show.
46
+ * @returns The entry.
47
+ */
48
+ function NavEntry(props) {
49
+ const { item, activeId } = props;
50
+ if (item.items === undefined) {
51
+ return _jsx(NavLink, { item: item, active: item.id === activeId });
52
+ }
53
+ return (_jsx(NavMenuButton, { label: menuLabel(item), icon: typeof item.icon === 'string' ? item.icon : undefined, items: item.items, activeId: activeId, placement: "bottom-start" }));
54
+ }
55
+ // The trigger names itself to a screen reader, so an entry drawn as a glyph
56
+ // alone says what it opens through its title rather than through its id.
57
+ function menuLabel(item) {
58
+ if (typeof item.label === 'string')
59
+ return item.label;
60
+ return item.title ?? item.id;
38
61
  }
39
62
  /** The two widths the bar's contents run at, as the classes that set them. */
40
63
  const INNER_CLASS = {
@@ -1 +1 @@
1
- {"version":3,"file":"SiteHeader.js","sourceRoot":"","sources":["../../../src/chrome/ui/SiteHeader.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SiteHeader.js","sourceRoot":"","sources":["../../../src/chrome/ui/SiteHeader.tsx"],"names":[],"mappings":"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"}
@@ -48,6 +48,13 @@ export interface NavItem {
48
48
  * @default undefined
49
49
  */
50
50
  after?: ReactNode;
51
+ /**
52
+ * The pages this entry folds, which make it a menu rather than a link: the
53
+ * run of pages that do not each need a place of their own in the bar. The
54
+ * entry takes the brand tint while one of them is the page on show.
55
+ * @default undefined
56
+ */
57
+ items?: readonly NavItem[];
51
58
  /**
52
59
  * Whether the page cannot be opened yet — a view that needs data the site
53
60
  * has not been given.
@@ -1 +1 @@
1
- {"version":3,"file":"navItem.d.ts","sourceRoot":"","sources":["../../../src/chrome/ui/navItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjE;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC/B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE1D"}
1
+ {"version":3,"file":"navItem.d.ts","sourceRoot":"","sources":["../../../src/chrome/ui/navItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjE;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC/B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"navItem.js","sourceRoot":"","sources":["../../../src/chrome/ui/navItem.ts"],"names":[],"mappings":"AAiEA;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;AAC1E,CAAC"}
1
+ {"version":3,"file":"navItem.js","sourceRoot":"","sources":["../../../src/chrome/ui/navItem.ts"],"names":[],"mappings":"AAwEA;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;AAC1E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../src/citation/ui/entries.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAIzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAczD,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;IACjC,mCAAmC;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB;;;OAGG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,sDAAsD;IACtD,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,wCAAwC;IACxC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAgC7D;AAED,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;IACjC,oDAAoD;IACpD,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CAmBrE"}
1
+ {"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../src/citation/ui/entries.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAKzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAczD,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;IACjC,mCAAmC;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB;;;OAGG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,sDAAsD;IACtD,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,wCAAwC;IACxC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAgC7D;AAED,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;IACjC,oDAAoD;IACpD,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CAmBrE"}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { MenuItem, Tooltip } from '@blueprintjs/core';
3
3
  import { useChromeT } from "../../i18n/ui/useT.js";
4
+ import { useActionTooltip } from "../../shared/ui/useActionTooltip.js";
4
5
  import { downloadCitations } from "../core/download.js";
5
6
  import { CitationPreview } from "./CitationPreview.js";
6
7
  // An entry carrying its preview tooltip is also a popover target, and
@@ -51,6 +52,10 @@ export function DownloadEntry(props) {
51
52
  */
52
53
  function PreviewTooltip(props) {
53
54
  const { references, format, style, children } = props;
54
- return (_jsx(Tooltip, { placement: "left", popoverClassName: "citation-tooltip", hoverOpenDelay: PREVIEW_OPEN_DELAY, content: _jsx(CitationPreview, { reference: references, format: format, style: style?.id }), renderTarget: ({ isOpen, ...targetProps }) => children(targetProps) }));
55
+ // Held rather than left to Blueprint: pressing an entry downloads or copies
56
+ // and closes the menu, and a preview opened by the hover that led to the
57
+ // press would outlive both — see `useActionTooltip`.
58
+ const { isOpen, target } = useActionTooltip(false, PREVIEW_OPEN_DELAY);
59
+ return (_jsx(Tooltip, { placement: "left", popoverClassName: "citation-tooltip", isOpen: isOpen, content: _jsx(CitationPreview, { reference: references, format: format, style: style?.id }), renderTarget: ({ isOpen: drawn, ...targetProps }) => children({ ...targetProps, ...target }) }));
55
60
  }
56
61
  //# sourceMappingURL=entries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entries.js","sourceRoot":"","sources":["../../../src/citation/ui/entries.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entries.js","sourceRoot":"","sources":["../../../src/citation/ui/entries.tsx"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ import type { CSSProperties, ReactElement, ReactNode } from 'react';
2
2
  import type { ClipboardContent } from '../core/writeToClipboard.ts';
3
3
  /** The elements a {@link ClickToCopy} can be, so a table cell is its own target. */
4
4
  export type ClickToCopyElement = 'span' | 'code' | 'div' | 'td' | 'th';
5
+ /** Where the glyph sits: past the value, or inside its right edge. */
6
+ export type ClickToCopyLayout = 'inline' | 'block';
5
7
  /** What {@link ClickToCopy} copies, and how it reads. */
6
8
  export interface ClickToCopyProps {
7
9
  /**
@@ -30,6 +32,15 @@ export interface ClickToCopyProps {
30
32
  * @default 'span'
31
33
  */
32
34
  as?: ClickToCopyElement;
35
+ /**
36
+ * Where the glyph goes. A value in a line of text shows it just past itself,
37
+ * so the line keeps its spacing; one laid out as a block keeps room for it
38
+ * inside its right edge, because a glyph past the edge of a full-width block
39
+ * is a glyph past the edge of whatever holds it — which scrolls the page
40
+ * sideways by the width of the glyph.
41
+ * @default read from `as`: a `span` or a `code` is inline, the rest a block
42
+ */
43
+ layout?: ClickToCopyLayout;
33
44
  /**
34
45
  * Whether the value is a tab stop and a button of its own, with the glyph a
35
46
  * keyboard is shown instead of the cursor. Off when a copy button beside it
@@ -1 +1 @@
1
- {"version":3,"file":"ClickToCopy.d.ts","sourceRoot":"","sources":["../../../src/clipboard/ui/ClickToCopy.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EAGb,YAAY,EACZ,SAAS,EACV,MAAM,OAAO,CAAC;AAOf,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAKpE,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvE,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACnD,iEAAiE;IACjE,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACxB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAYD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CA2EjE"}
1
+ {"version":3,"file":"ClickToCopy.d.ts","sourceRoot":"","sources":["../../../src/clipboard/ui/ClickToCopy.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAGb,YAAY,EACZ,SAAS,EACV,MAAM,OAAO,CAAC;AAOf,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAKpE,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvE,sEAAsE;AACtE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnD,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACnD,iEAAiE;IACjE,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACxB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAYD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAmEjE"}
@@ -24,9 +24,10 @@ const NESTED_CONTROL = 'a[href], button, input, select, textarea, summary, label
24
24
  * @returns The copyable value.
25
25
  */
26
26
  export function ClickToCopy(props) {
27
- const { value, children, label, title, as: Element = 'span', focusable = true, disabled = false, className, style, testId, } = props;
27
+ const { value, children, label, title, as: Element = 'span', layout, focusable = true, disabled = false, className, style, testId, } = props;
28
28
  const t = useChromeT();
29
29
  const { copied, failed, copy } = useCopyToClipboard();
30
+ const placing = layout ?? (INLINE.has(Element) ? 'inline' : 'block');
30
31
  if (disabled) {
31
32
  return (_jsx(Element, { className: className, style: style, "data-testid": testId, children: children }));
32
33
  }
@@ -37,15 +38,32 @@ export function ClickToCopy(props) {
37
38
  void copy(typeof value === 'function' ? () => writeToClipboard(value()) : value);
38
39
  }
39
40
  const outcome = copied ? 'copied' : failed ? 'failed' : undefined;
40
- return (_jsxs(Element, { className: joinClassNames('click-to-copy', INLINE.has(Element) ? 'click-to-copy--inline' : 'click-to-copy--block', className), style: style, "data-testid": testId, role: focusable && !CELLS.has(Element) ? 'button' : undefined, tabIndex: focusable ? 0 : undefined, title: title ?? copyTitle(value, label, t), "data-copy": outcome, onClick: activate, onKeyDown: onActivateKey(activate), children: [children, focusable ? (_jsx(Icon, { className: "click-to-copy__icon", icon: outcome === 'copied'
41
- ? 'tick'
42
- : outcome === 'failed'
43
- ? 'cross'
44
- : 'clipboard', size: 16 })) : null, _jsx("span", { className: "click-to-copy__status", role: "status", children: outcome === 'copied'
45
- ? t('clipboard.copied')
46
- : outcome === 'failed'
47
- ? t('clipboard.failed')
48
- : null })] }));
41
+ return (_jsxs(Element, { className: joinClassNames('click-to-copy', `click-to-copy--${placing}`, className), style: style, "data-testid": testId, role: focusable && !CELLS.has(Element) ? 'button' : undefined, tabIndex: focusable ? 0 : undefined, title: title ?? copyTitle(value, label, t), "data-copy": outcome, onClick: activate, onKeyDown: onActivateKey(activate), children: [children, focusable ? (_jsx(Icon, { className: "click-to-copy__icon", icon: outcomeIcon(outcome), size: 16 })) : null, _jsx("span", { className: "click-to-copy__status", role: "status", children: outcomeStatus(outcome, t) })] }));
42
+ }
43
+ /**
44
+ * The glyph the value carries: the clipboard at rest, then the answer.
45
+ * @param outcome - How the last copy went.
46
+ * @returns The icon.
47
+ */
48
+ function outcomeIcon(outcome) {
49
+ if (outcome === 'copied')
50
+ return 'tick';
51
+ if (outcome === 'failed')
52
+ return 'cross';
53
+ return 'clipboard';
54
+ }
55
+ /**
56
+ * What a screen reader is told once a copy has been attempted.
57
+ * @param outcome - How it went.
58
+ * @param t - The chrome's formatter.
59
+ * @returns The line, or nothing before anything was copied.
60
+ */
61
+ function outcomeStatus(outcome, t) {
62
+ if (outcome === 'copied')
63
+ return t('clipboard.copied');
64
+ if (outcome === 'failed')
65
+ return t('clipboard.failed');
66
+ return null;
49
67
  }
50
68
  function isOnNestedControl(event) {
51
69
  const { target, currentTarget } = event;