react-cheminfo 0.14.0 → 0.16.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 (207) hide show
  1. package/README.md +175 -21
  2. package/lib/about/core/about.d.ts +13 -7
  3. package/lib/about/core/about.d.ts.map +1 -1
  4. package/lib/about/core/about.js +4 -2
  5. package/lib/about/core/about.js.map +1 -1
  6. package/lib/about/ui/AboutBuild.d.ts +20 -0
  7. package/lib/about/ui/AboutBuild.d.ts.map +1 -0
  8. package/lib/about/ui/AboutBuild.js +38 -0
  9. package/lib/about/ui/AboutBuild.js.map +1 -0
  10. package/lib/about/ui/AboutPage.d.ts +7 -0
  11. package/lib/about/ui/AboutPage.d.ts.map +1 -1
  12. package/lib/about/ui/AboutPage.js +5 -2
  13. package/lib/about/ui/AboutPage.js.map +1 -1
  14. package/lib/about/ui/index.d.ts +2 -0
  15. package/lib/about/ui/index.d.ts.map +1 -1
  16. package/lib/about/ui/index.js +1 -0
  17. package/lib/about/ui/index.js.map +1 -1
  18. package/lib/build/core/buildInfo.d.ts +39 -0
  19. package/lib/build/core/buildInfo.d.ts.map +1 -0
  20. package/lib/build/core/buildInfo.js +20 -0
  21. package/lib/build/core/buildInfo.js.map +1 -0
  22. package/lib/build/core/current.d.ts +12 -0
  23. package/lib/build/core/current.d.ts.map +1 -0
  24. package/lib/build/core/current.js +11 -0
  25. package/lib/build/core/current.js.map +1 -0
  26. package/lib/build/core/index.d.ts +3 -0
  27. package/lib/build/core/index.d.ts.map +1 -0
  28. package/lib/build/core/index.js +2 -0
  29. package/lib/build/core/index.js.map +1 -0
  30. package/lib/build/vite/buildInfo.d.ts +57 -0
  31. package/lib/build/vite/buildInfo.d.ts.map +1 -0
  32. package/lib/build/vite/buildInfo.js +151 -0
  33. package/lib/build/vite/buildInfo.js.map +1 -0
  34. package/lib/build/vite/gitHead.d.ts +29 -0
  35. package/lib/build/vite/gitHead.d.ts.map +1 -0
  36. package/lib/build/vite/gitHead.js +102 -0
  37. package/lib/build/vite/gitHead.js.map +1 -0
  38. package/lib/build/vite/index.d.ts +4 -0
  39. package/lib/build/vite/index.d.ts.map +1 -0
  40. package/lib/build/vite/index.js +3 -0
  41. package/lib/build/vite/index.js.map +1 -0
  42. package/lib/build-info.d.ts +3 -0
  43. package/lib/build-info.d.ts.map +1 -0
  44. package/lib/build-info.js +2 -0
  45. package/lib/build-info.js.map +1 -0
  46. package/lib/core.d.ts +2 -0
  47. package/lib/core.d.ts.map +1 -1
  48. package/lib/core.js +2 -0
  49. package/lib/core.js.map +1 -1
  50. package/lib/credits/core/credits.d.ts +35 -0
  51. package/lib/credits/core/credits.d.ts.map +1 -1
  52. package/lib/credits/core/credits.js +41 -0
  53. package/lib/credits/core/credits.js.map +1 -1
  54. package/lib/ecosystem/core/sites.d.ts.map +1 -1
  55. package/lib/ecosystem/core/sites.js +40 -0
  56. package/lib/ecosystem/core/sites.js.map +1 -1
  57. package/lib/ecosystem/core/types.d.ts +1 -1
  58. package/lib/ecosystem/core/types.d.ts.map +1 -1
  59. package/lib/ecosystem/ui/Wordmark.d.ts +14 -3
  60. package/lib/ecosystem/ui/Wordmark.d.ts.map +1 -1
  61. package/lib/ecosystem/ui/Wordmark.js +8 -4
  62. package/lib/ecosystem/ui/Wordmark.js.map +1 -1
  63. package/lib/ecosystem/ui/glyphs.d.ts.map +1 -1
  64. package/lib/ecosystem/ui/glyphs.js +11 -0
  65. package/lib/ecosystem/ui/glyphs.js.map +1 -1
  66. package/lib/parallel/core/index.d.ts +27 -0
  67. package/lib/parallel/core/index.d.ts.map +1 -0
  68. package/lib/parallel/core/index.js +20 -0
  69. package/lib/parallel/core/index.js.map +1 -0
  70. package/lib/parallel/core/parallelAxes.d.ts +103 -0
  71. package/lib/parallel/core/parallelAxes.d.ts.map +1 -0
  72. package/lib/parallel/core/parallelAxes.js +146 -0
  73. package/lib/parallel/core/parallelAxes.js.map +1 -0
  74. package/lib/parallel/core/parallelBrush.d.ts +79 -0
  75. package/lib/parallel/core/parallelBrush.d.ts.map +1 -0
  76. package/lib/parallel/core/parallelBrush.js +99 -0
  77. package/lib/parallel/core/parallelBrush.js.map +1 -0
  78. package/lib/parallel/core/parallelExtent.d.ts +28 -0
  79. package/lib/parallel/core/parallelExtent.d.ts.map +1 -0
  80. package/lib/parallel/core/parallelExtent.js +47 -0
  81. package/lib/parallel/core/parallelExtent.js.map +1 -0
  82. package/lib/parallel/core/parallelFilter.d.ts +36 -0
  83. package/lib/parallel/core/parallelFilter.d.ts.map +1 -0
  84. package/lib/parallel/core/parallelFilter.js +74 -0
  85. package/lib/parallel/core/parallelFilter.js.map +1 -0
  86. package/lib/parallel/core/parallelHit.d.ts +47 -0
  87. package/lib/parallel/core/parallelHit.d.ts.map +1 -0
  88. package/lib/parallel/core/parallelHit.js +81 -0
  89. package/lib/parallel/core/parallelHit.js.map +1 -0
  90. package/lib/parallel/core/parallelPaint.d.ts +104 -0
  91. package/lib/parallel/core/parallelPaint.d.ts.map +1 -0
  92. package/lib/parallel/core/parallelPaint.js +160 -0
  93. package/lib/parallel/core/parallelPaint.js.map +1 -0
  94. package/lib/parallel/core/parallelPalette.d.ts +31 -0
  95. package/lib/parallel/core/parallelPalette.d.ts.map +1 -0
  96. package/lib/parallel/core/parallelPalette.js +68 -0
  97. package/lib/parallel/core/parallelPalette.js.map +1 -0
  98. package/lib/parallel/core/parallelTicks.d.ts +34 -0
  99. package/lib/parallel/core/parallelTicks.d.ts.map +1 -0
  100. package/lib/parallel/core/parallelTicks.js +116 -0
  101. package/lib/parallel/core/parallelTicks.js.map +1 -0
  102. package/lib/parallel/core/parallelTypes.d.ts +129 -0
  103. package/lib/parallel/core/parallelTypes.d.ts.map +1 -0
  104. package/lib/parallel/core/parallelTypes.js +29 -0
  105. package/lib/parallel/core/parallelTypes.js.map +1 -0
  106. package/lib/parallel/ui/ParallelAxesLayer.d.ts +28 -0
  107. package/lib/parallel/ui/ParallelAxesLayer.d.ts.map +1 -0
  108. package/lib/parallel/ui/ParallelAxesLayer.js +29 -0
  109. package/lib/parallel/ui/ParallelAxesLayer.js.map +1 -0
  110. package/lib/parallel/ui/ParallelCoordinates.d.ts +21 -0
  111. package/lib/parallel/ui/ParallelCoordinates.d.ts.map +1 -0
  112. package/lib/parallel/ui/ParallelCoordinates.js +109 -0
  113. package/lib/parallel/ui/ParallelCoordinates.js.map +1 -0
  114. package/lib/parallel/ui/ParallelLabels.d.ts +26 -0
  115. package/lib/parallel/ui/ParallelLabels.d.ts.map +1 -0
  116. package/lib/parallel/ui/ParallelLabels.js +25 -0
  117. package/lib/parallel/ui/ParallelLabels.js.map +1 -0
  118. package/lib/parallel/ui/ParallelTooltip.d.ts +26 -0
  119. package/lib/parallel/ui/ParallelTooltip.d.ts.map +1 -0
  120. package/lib/parallel/ui/ParallelTooltip.js +30 -0
  121. package/lib/parallel/ui/ParallelTooltip.js.map +1 -0
  122. package/lib/parallel/ui/index.d.ts +25 -0
  123. package/lib/parallel/ui/index.d.ts.map +1 -0
  124. package/lib/parallel/ui/index.js +18 -0
  125. package/lib/parallel/ui/index.js.map +1 -0
  126. package/lib/parallel/ui/parallelCoordinatesProps.d.ts +185 -0
  127. package/lib/parallel/ui/parallelCoordinatesProps.d.ts.map +1 -0
  128. package/lib/parallel/ui/parallelCoordinatesProps.js +11 -0
  129. package/lib/parallel/ui/parallelCoordinatesProps.js.map +1 -0
  130. package/lib/parallel/ui/parallelGestureModel.d.ts +52 -0
  131. package/lib/parallel/ui/parallelGestureModel.d.ts.map +1 -0
  132. package/lib/parallel/ui/parallelGestureModel.js +80 -0
  133. package/lib/parallel/ui/parallelGestureModel.js.map +1 -0
  134. package/lib/parallel/ui/parallelInk.d.ts +76 -0
  135. package/lib/parallel/ui/parallelInk.d.ts.map +1 -0
  136. package/lib/parallel/ui/parallelInk.js +113 -0
  137. package/lib/parallel/ui/parallelInk.js.map +1 -0
  138. package/lib/parallel/ui/parallelPlotModel.d.ts +55 -0
  139. package/lib/parallel/ui/parallelPlotModel.d.ts.map +1 -0
  140. package/lib/parallel/ui/parallelPlotModel.js +113 -0
  141. package/lib/parallel/ui/parallelPlotModel.js.map +1 -0
  142. package/lib/parallel/ui/parallelStyles.d.ts +83 -0
  143. package/lib/parallel/ui/parallelStyles.d.ts.map +1 -0
  144. package/lib/parallel/ui/parallelStyles.js +131 -0
  145. package/lib/parallel/ui/parallelStyles.js.map +1 -0
  146. package/lib/parallel/ui/useParallelCanvas.d.ts +49 -0
  147. package/lib/parallel/ui/useParallelCanvas.d.ts.map +1 -0
  148. package/lib/parallel/ui/useParallelCanvas.js +58 -0
  149. package/lib/parallel/ui/useParallelCanvas.js.map +1 -0
  150. package/lib/parallel/ui/useParallelGesture.d.ts +67 -0
  151. package/lib/parallel/ui/useParallelGesture.d.ts.map +1 -0
  152. package/lib/parallel/ui/useParallelGesture.js +139 -0
  153. package/lib/parallel/ui/useParallelGesture.js.map +1 -0
  154. package/lib/structure/ui/useToolbarFloor.d.ts.map +1 -1
  155. package/lib/structure/ui/useToolbarFloor.js +29 -22
  156. package/lib/structure/ui/useToolbarFloor.js.map +1 -1
  157. package/lib/ui.d.ts +1 -0
  158. package/lib/ui.d.ts.map +1 -1
  159. package/lib/ui.js +1 -0
  160. package/lib/ui.js.map +1 -1
  161. package/lib/vite.d.ts +1 -0
  162. package/lib/vite.d.ts.map +1 -1
  163. package/lib/vite.js +1 -0
  164. package/lib/vite.js.map +1 -1
  165. package/package.json +2 -1
  166. package/src/about/core/about.ts +18 -9
  167. package/src/about/ui/AboutBuild.tsx +83 -0
  168. package/src/about/ui/AboutPage.tsx +15 -7
  169. package/src/about/ui/index.ts +2 -0
  170. package/src/build/core/buildInfo.ts +48 -0
  171. package/src/build/core/current.ts +12 -0
  172. package/src/build/core/index.ts +2 -0
  173. package/src/build/vite/buildInfo.ts +178 -0
  174. package/src/build/vite/gitHead.ts +114 -0
  175. package/src/build/vite/index.ts +8 -0
  176. package/src/build-info.ts +2 -0
  177. package/src/core.ts +2 -0
  178. package/src/credits/core/credits.ts +42 -0
  179. package/src/ecosystem/core/sites.ts +40 -0
  180. package/src/ecosystem/core/types.ts +4 -1
  181. package/src/ecosystem/ui/Wordmark.tsx +22 -7
  182. package/src/ecosystem/ui/glyphs.tsx +46 -0
  183. package/src/parallel/core/index.ts +80 -0
  184. package/src/parallel/core/parallelAxes.ts +207 -0
  185. package/src/parallel/core/parallelBrush.ts +145 -0
  186. package/src/parallel/core/parallelExtent.ts +56 -0
  187. package/src/parallel/core/parallelFilter.ts +94 -0
  188. package/src/parallel/core/parallelHit.ts +106 -0
  189. package/src/parallel/core/parallelPaint.ts +231 -0
  190. package/src/parallel/core/parallelPalette.ts +80 -0
  191. package/src/parallel/core/parallelTicks.ts +164 -0
  192. package/src/parallel/core/parallelTypes.ts +147 -0
  193. package/src/parallel/ui/ParallelAxesLayer.tsx +123 -0
  194. package/src/parallel/ui/ParallelCoordinates.tsx +233 -0
  195. package/src/parallel/ui/ParallelLabels.tsx +56 -0
  196. package/src/parallel/ui/ParallelTooltip.tsx +55 -0
  197. package/src/parallel/ui/index.ts +50 -0
  198. package/src/parallel/ui/parallelCoordinatesProps.ts +199 -0
  199. package/src/parallel/ui/parallelGestureModel.ts +109 -0
  200. package/src/parallel/ui/parallelInk.ts +182 -0
  201. package/src/parallel/ui/parallelPlotModel.ts +130 -0
  202. package/src/parallel/ui/parallelStyles.ts +146 -0
  203. package/src/parallel/ui/useParallelCanvas.ts +104 -0
  204. package/src/parallel/ui/useParallelGesture.ts +227 -0
  205. package/src/structure/ui/useToolbarFloor.ts +27 -22
  206. package/src/ui.ts +1 -0
  207. package/src/vite.ts +1 -0
package/README.md CHANGED
@@ -62,27 +62,29 @@ through a wildcard subpath exactly as `react-science` serves its own.
62
62
 
63
63
  ## What is in it
64
64
 
65
- | Area | `…/core` | `…/ui` |
66
- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
67
- | **Site identity** | `siteById`, `findSiteByHost`, `siteTokensCss` | `SiteMark`, `Wordmark`, `SiteTheme`, `SiteTile`, `EcosystemButton`, `EcosystemLinks` |
68
- | **Chrome** | — | `SiteHeader`, `SiteFooter`, `NavLink`, `NavMenuButton`, `MenuButton`, `useCompactHeader` |
69
- | **Citation** | `formatCitation`, `formatCitations`, `citationSegments`, `downloadCitation`, `citedReferences`, `doiUrl` | `CiteButton`, `CitationMenu`, `CitationPreview` |
70
- | **Share & embed** | `parseShareConfig`, `applyShareConfig`, `buildShareUrl`, `buildEmbedCode`, `isHidden`, `visibleShareParts`, `applySharePreset`, `findSharePreset`, the param codecs, `syncPreferencesWithUrl`, `applyPreferencesFromSearch`, `writePreferencesToSearch` | `ShareDialog`, `ShareButton`, `HiddenPartsProvider`, `PagePart`, `useIsHidden` |
71
- | **Routing & head** | `createTabRouter`, `readRoute`, `writeRoute`, `subscribeToRoute`, `adoptLegacyHashAddress`, `writeDocumentMeta` | `useTabRoute` |
72
- | **Indexing** | `injectPageMeta`, `pageHeadTags`, `pageDocumentMeta`, `fill`, `PAGE_HEAD_MARKER`, `PAGE_BODY_MARKER`, `robotsTxt`, `sitemapXml`, `noscriptIndex`, `structuredDataScript`, `assertRoutes`, `routeFor`, `homeRoute` | `cheminfoPrerender`, `ogCardHtml`, `OG_WIDTH`, `OG_HEIGHT` (all `/vite`) |
73
- | **Pedagogy** | `parseGlossaryMarkers`, `localStorageProgressStore`, `progressSummary`, `finishValidation` | `GlossaryText`, `SyntaxTooltip`, `HintLadder`, `ExerciseActions`, `ExerciseProgressHeader`, `TutorialStepStrip`, `ReferenceGrid`, `TestCaseList` |
74
- | **Clipboard & files** | `writeToClipboard`, `downloadBlob`, `downloadText`, `sanitizeFileName`, `toDelimited`, `readDelimited`, `downloadFigure`, `figureSvg`, `figurePng`, `figureSize` | `CopyButton`, `CodeBlock`, `DelimitedTextDialog`, `FigureDownload` |
75
- | **Formatting & colour** | `formatInteger`, `formatDecimal`, `formatBytes`, `pluralize`, `readableInk`, `contrastRatio`, `COLOR_SCALES`, `resolveColorScale`, `formatColorScale`, `colorAt`, `swatchAt`, `sampleScale`, `colorScaleGradient`, `rgbToHsv` | `ColorScaleLegend`, `ColorScaleSelect`, `ColorScaleEditor`, `ColorScaleBar` |
76
- | **Widgets** | `CREDITS`, `credits` | `ErrorBoundary`, `CollapsibleSection`, `CapsuleFilter`, `HelpTooltip`, `CreditsList` |
77
- | **Hooks & state** | `createWorkerChannel`, `persistBucket`, `persistSignalBucket` | `useDebouncedValue`, `useContainerSize`, `useListKeyboardNavigation`, `useDisclosure` |
78
- | **Chemistry** | `atomicOrbitalsOf`, `configurationOf`, `classifyMolfile`, `readStructure` | `AtomicOrbitalViewer` (`/orbital`), `StructureEditor`, `Structure` (`/structure`) |
79
- | **Spectra** | `FILTER_CATALOG`, `filterMenu`, `settingsProblems`, `normalizationFilters`, `addFilter`, `moveFilter`, `setFilterOption`, `principalComponentChoices`, `clampPrincipalComponents`, `EMPTY_SETTINGS` (all `/spectra`) | `SpectraSettingsEditor`, `FilterChainEditor`, `PrincipalComponentSelect` (all `/spectra`) |
80
- | **About** | `resolveAbout`, `aboutProblems` | `AboutPage` |
81
- | **Slideshows** | `parseTalk`, `splitDemoLinks`, `slideActionForKey`, `parseTalkOrigin`, `buildTalkManifest` (all `/slides`) | `Slideshow`, `SlideView`, `TalkList`, `BackToSlides` (all `/slides`), `cheminfoTalks` (`/vite`) |
82
- | **Token guard** | `findTokenViolations` | `cheminfo-check-tokens` (the bin) |
83
- | **Figures** | `chartScale`, `chartAxisScale`, `chartAxisTitle`, `chartShare`, `chartColumnExtent`, `chartBinCounts`, `chartSeriesColor`, `rowMatrix`, `stackedMatrix`, `emptiestCorner`, `placeOverlayCard`, `overlayMetrics` | `ChartFrame`, `ChartAxis`, `TrackedLineChart`, `OverlayBar`, `OverlaySelect`, `OverlaySegmented`, `OverlayToggle`, `OverlayNumber`, `OverlayLegend`, `OverlayCaption`, `OverlayReadout` |
84
- | **Projections** | `pcaResult`, `embeddingResult`, `projectionTabs`, `loadingProfiles`, `explainedShares`, `confidenceEllipse`, `projectEllipse`, `pointsInPolygon`, `resolveProjectionGroups`, `PROJECTION_COPY` | `PcaViewer`, `ProjectionViewer`, `ScatterPlot`, `ScatterMatrix` |
85
- | **Periodic table** | `PERIODIC_ELEMENTS`, `elementBySymbol`, `elementByAtomicNumber`, `cellOf`, `placedElements`, `elementByArrowKey`, `categorySwatch`, `CATEGORY_LABELS` | `PeriodicTable`, `ElementCell`, `CategoryLegend` |
65
+ | Area | `…/core` | `…/ui` |
66
+ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
67
+ | **Site identity** | `siteById`, `findSiteByHost`, `siteTokensCss` | `SiteMark`, `Wordmark`, `SiteTheme`, `SiteTile`, `EcosystemButton`, `EcosystemLinks` |
68
+ | **Chrome** | — | `SiteHeader`, `SiteFooter`, `NavLink`, `NavMenuButton`, `MenuButton`, `useCompactHeader` |
69
+ | **Citation** | `formatCitation`, `formatCitations`, `citationSegments`, `downloadCitation`, `citedReferences`, `doiUrl` | `CiteButton`, `CitationMenu`, `CitationPreview` |
70
+ | **Share & embed** | `parseShareConfig`, `applyShareConfig`, `buildShareUrl`, `buildEmbedCode`, `isHidden`, `visibleShareParts`, `applySharePreset`, `findSharePreset`, the param codecs, `syncPreferencesWithUrl`, `applyPreferencesFromSearch`, `writePreferencesToSearch` | `ShareDialog`, `ShareButton`, `HiddenPartsProvider`, `PagePart`, `useIsHidden` |
71
+ | **Routing & head** | `createTabRouter`, `readRoute`, `writeRoute`, `subscribeToRoute`, `adoptLegacyHashAddress`, `writeDocumentMeta` | `useTabRoute` |
72
+ | **Indexing** | `injectPageMeta`, `pageHeadTags`, `pageDocumentMeta`, `fill`, `PAGE_HEAD_MARKER`, `PAGE_BODY_MARKER`, `robotsTxt`, `sitemapXml`, `noscriptIndex`, `structuredDataScript`, `assertRoutes`, `routeFor`, `homeRoute` | `cheminfoPrerender`, `ogCardHtml`, `OG_WIDTH`, `OG_HEIGHT` (all `/vite`) |
73
+ | **Pedagogy** | `parseGlossaryMarkers`, `localStorageProgressStore`, `progressSummary`, `finishValidation` | `GlossaryText`, `SyntaxTooltip`, `HintLadder`, `ExerciseActions`, `ExerciseProgressHeader`, `TutorialStepStrip`, `ReferenceGrid`, `TestCaseList` |
74
+ | **Clipboard & files** | `writeToClipboard`, `downloadBlob`, `downloadText`, `sanitizeFileName`, `toDelimited`, `readDelimited`, `downloadFigure`, `figureSvg`, `figurePng`, `figureSize` | `CopyButton`, `CodeBlock`, `DelimitedTextDialog`, `FigureDownload` |
75
+ | **Formatting & colour** | `formatInteger`, `formatDecimal`, `formatBytes`, `pluralize`, `readableInk`, `contrastRatio`, `COLOR_SCALES`, `resolveColorScale`, `formatColorScale`, `colorAt`, `swatchAt`, `sampleScale`, `colorScaleGradient`, `rgbToHsv` | `ColorScaleLegend`, `ColorScaleSelect`, `ColorScaleEditor`, `ColorScaleBar` |
76
+ | **Widgets** | `CREDITS`, `credits` | `ErrorBoundary`, `CollapsibleSection`, `CapsuleFilter`, `HelpTooltip`, `CreditsList` |
77
+ | **Hooks & state** | `createWorkerChannel`, `persistBucket`, `persistSignalBucket` | `useDebouncedValue`, `useContainerSize`, `useListKeyboardNavigation`, `useDisclosure` |
78
+ | **Chemistry** | `atomicOrbitalsOf`, `configurationOf`, `classifyMolfile`, `readStructure` | `AtomicOrbitalViewer` (`/orbital`), `StructureEditor`, `Structure` (`/structure`) |
79
+ | **Spectra** | `FILTER_CATALOG`, `filterMenu`, `settingsProblems`, `normalizationFilters`, `addFilter`, `moveFilter`, `setFilterOption`, `principalComponentChoices`, `clampPrincipalComponents`, `EMPTY_SETTINGS` (all `/spectra`) | `SpectraSettingsEditor`, `FilterChainEditor`, `PrincipalComponentSelect` (all `/spectra`) |
80
+ | **About** | `resolveAbout`, `aboutProblems` | `AboutPage` |
81
+ | **Which build is running** | `formatBuiltAt`, `shortCommit`, `BuildInfo` | `AboutBuild`, `cheminfoBuildInfo` (`/vite`) |
82
+ | **Slideshows** | `parseTalk`, `splitDemoLinks`, `slideActionForKey`, `parseTalkOrigin`, `buildTalkManifest` (all `/slides`) | `Slideshow`, `SlideView`, `TalkList`, `BackToSlides` (all `/slides`), `cheminfoTalks` (`/vite`) |
83
+ | **Token guard** | `findTokenViolations` | `cheminfo-check-tokens` (the bin) |
84
+ | **Figures** | `chartScale`, `chartAxisScale`, `chartAxisTitle`, `chartShare`, `chartColumnExtent`, `chartBinCounts`, `chartSeriesColor`, `rowMatrix`, `stackedMatrix`, `emptiestCorner`, `placeOverlayCard`, `overlayMetrics` | `ChartFrame`, `ChartAxis`, `TrackedLineChart`, `OverlayBar`, `OverlaySelect`, `OverlaySegmented`, `OverlayToggle`, `OverlayNumber`, `OverlayLegend`, `OverlayCaption`, `OverlayReadout` |
85
+ | **Projections** | `pcaResult`, `embeddingResult`, `projectionTabs`, `loadingProfiles`, `explainedShares`, `confidenceEllipse`, `projectEllipse`, `pointsInPolygon`, `resolveProjectionGroups`, `PROJECTION_COPY` | `PcaViewer`, `ProjectionViewer`, `ScatterPlot`, `ScatterMatrix` |
86
+ | **Parallel coordinates** | `parallelAxisOf`, `parallelAxisLayouts`, `parallelIncludedMask`, `parallelKeptCount`, `parallelNearestRow`, `parallelSegmentAt`, `parallelBandAt`, `parallelRangeOf`, `parallelPalette`, `parallelColorSteps`, `paintParallelLines` | `ParallelCoordinates` |
87
+ | **Periodic table** | `PERIODIC_ELEMENTS`, `elementBySymbol`, `elementByAtomicNumber`, `cellOf`, `placedElements`, `elementByArrowKey`, `categorySwatch`, `CATEGORY_LABELS` | `PeriodicTable`, `ElementCell`, `CategoryLegend` |
86
88
 
87
89
  Everything in that table is exported from `./core`, `./ui`, `./slides`,
88
90
  `./vite` or `./structure` and nothing else is: the sub-components a component is built
@@ -501,6 +503,101 @@ marks itself, so the cog in the corner never lands in the middle of the scatter.
501
503
  `downloadFigure(target, options)`, `figureSvg` and `figurePng` are the same thing
502
504
  without the button, for a site saving a figure from its own menu.
503
505
 
506
+ ### `ParallelCoordinates`
507
+
508
+ Many rows against many properties at once: one vertical axis per column, one
509
+ line per row, and a brush on every axis.
510
+
511
+ ```tsx
512
+ import { ParallelCoordinates } from 'react-cheminfo/ui';
513
+ import { parallelAxisOf, parallelIncludedMask } from 'react-cheminfo/core';
514
+
515
+ const axes = useMemo(
516
+ () => [
517
+ parallelAxisOf(rows, {
518
+ id: 'mw',
519
+ label: 'MW',
520
+ unit: 'g/mol',
521
+ value: (r) => r.weight,
522
+ }),
523
+ parallelAxisOf(rows, { id: 'clogp', label: 'cLogP', value: (r) => r.logP }),
524
+ parallelAxisOf(rows, {
525
+ id: 'mutagenic',
526
+ label: 'Mutagenic',
527
+ domain: [0, 2],
528
+ ticks: [
529
+ { value: 0, label: 'none' },
530
+ { value: 1, label: 'low' },
531
+ { value: 2, label: 'high' },
532
+ ],
533
+ value: (r) => r.mutagenic,
534
+ }),
535
+ ],
536
+ [rows],
537
+ );
538
+ const included = useMemo(
539
+ () => parallelIncludedMask(axes, ranges, rows.length),
540
+ [axes, ranges, rows.length],
541
+ );
542
+
543
+ <ParallelCoordinates
544
+ axes={axes}
545
+ width={width}
546
+ height={340}
547
+ colorAxis="clogp"
548
+ ranges={ranges}
549
+ onRangeChange={setRange}
550
+ included={included}
551
+ hovered={hovered}
552
+ onHoverChange={setHovered}
553
+ selected={picked}
554
+ onRowClick={pick}
555
+ renderTooltip={({ index }) => <MF mf={rows[index].mf} />}
556
+ />;
557
+ <MoleculeTable included={included} />;
558
+ ```
559
+
560
+ - **It is told nothing about what the rows are.** Every axis hands over one
561
+ `ArrayLike<number>` read in place, so a repaint costs an indexed read rather
562
+ than a call per value, and the same figure draws a library of molecules, a set
563
+ of runs and a table of measurements. `parallelAxisOf` is the one place a row
564
+ type is named, and it runs once per data change.
565
+ - **The table beside it filters on the same answer.** `parallelIncludedMask` is
566
+ exported and is what the figure itself uses: a plot drawing one line under a
567
+ table showing fourteen rows is not a rounding error, it is two programs.
568
+ - **A brush reports on release, never during the drag.** The band follows the
569
+ pointer live — that costs nothing, it is one component's own state — while the
570
+ interval reaches the caller once per gesture, so a table filtering on it is
571
+ asked to re-render once rather than sixty times a second. `onRangePreview` is
572
+ there for a caption, and for nothing else.
573
+ - **The brush is arithmetic, not a library.** Create by dragging on a bare axis,
574
+ move the band, drag either edge, clear by pressing outside it: four answers to
575
+ one question, which part of the axis the press landed on. Written that way the
576
+ whole gesture is unit-tested in a runtime with no DOM, which is what a brush
577
+ attached to an element can never be — and it keeps 15.8 kB of `d3-brush` out
578
+ of every site that draws one.
579
+ - **The axes end exactly on the data.** No nicing, because the reader is
580
+ comparing rows against each other and the best one has to touch the top of its
581
+ axis rather than float below a round number nothing reached. `nice` turns it on
582
+ per axis when round numbers really are the point, and a column with no spread
583
+ at all is opened by half a unit so that it still draws.
584
+ - **A coded quantity writes its own graduations.** `domain: [0, 2]` with `ticks`
585
+ reading `none`, `low`, `high` is what a risk column needs; `2` on an axis means
586
+ nothing to anybody.
587
+ - **The lines are a canvas, everything else is not.** Ten thousand polylines are
588
+ not ten thousand elements, so the mass is painted — the rows a brush left out
589
+ in one batched path underneath, the kept ones over them — while the axes, the
590
+ bands, the names and the card stay SVG and HTML. The consequence is worth
591
+ knowing before choosing it: `FigureDownload` copies SVG off the page, so a
592
+ saved figure keeps the axes and loses the lines.
593
+ - **A canvas cannot read a custom property**, and the accent is the one colour a
594
+ site owns, so the figure asks the browser what its own `--accent`, `--text`,
595
+ `--text-muted` and `--surface` resolved to and paints with the answer. `ink`
596
+ overrides any of them.
597
+ - **The card is a render prop**, because what belongs in it is the caller's
598
+ subject — a formula through `react-mf`, a structure, a name — and a readout of
599
+ strings cannot hold any of that.
600
+
504
601
  ## Carrying talks
505
602
 
506
603
  A deck is one Markdown file in the repository of the site whose subject it
@@ -686,6 +783,63 @@ disk. A server writing more into the same place composes it itself, with
686
783
  `pageHeadTags` and `fill(page, PAGE_BODY_MARKER, noscriptIndex(…))`. All of that
687
784
  is `react-cheminfo/core`, so a backend loads no React and no Vite.
688
785
 
786
+ ## Saying which build is running
787
+
788
+ A report of something going wrong is worth answering only when we know what was
789
+ running, and a hand-written version in a source file is wrong by the next
790
+ release. So the build states it: `cheminfoBuildInfo` resolves the release, the
791
+ instant and the commit once, and the About page reads them.
792
+
793
+ ```ts
794
+ // vite.config.ts
795
+ import { cheminfoBuildInfo } from 'react-cheminfo/vite';
796
+
797
+ plugins: [react(), cheminfoBuildInfo(), cheminfoPrerender({ ... })];
798
+ ```
799
+
800
+ ```ts
801
+ // src/about.ts
802
+ import { BUILD_INFO } from 'react-cheminfo/build-info';
803
+
804
+ export const ABOUT: AboutContent = { siteId: 'smiles', build: BUILD_INFO, ... };
805
+ ```
806
+
807
+ `react-cheminfo/build-info` is a real module that exports `undefined`, and the
808
+ plugin fills it in during the build. So a Playwright spec or a unit test that
809
+ imports the same About record in plain Node still resolves it — a virtual
810
+ specifier does not, and the whole suite dies on the import — and a build without
811
+ the plugin simply shows no build line.
812
+
813
+ Where each value comes from:
814
+
815
+ - **version** — the `package.json` at the repository root, which is the one
816
+ release-please bumps. A site whose tool lives in `frontend` still reports the
817
+ root version rather than the `0.0.0` that workspace was scaffolded with.
818
+ - **builtAt** — the instant the build ran, to the second, honouring
819
+ `SOURCE_DATE_EPOCH`.
820
+ - **commit** — read out of `.git` as files, never by running git: the image
821
+ build has no git binary and the shared `docker-image` workflow passes no build
822
+ argument. A site therefore lets three paths back into the build context, which
823
+ costs a few kilobytes:
824
+
825
+ ```
826
+ # .dockerignore
827
+ .git
828
+ !.git/HEAD
829
+ !.git/refs
830
+ !.git/packed-refs
831
+ ```
832
+
833
+ Without them the commit is simply left out, and `GITHUB_SHA` is used when the
834
+ environment names one.
835
+
836
+ The same record is written to **`build-info.json`** in the build, so the whole
837
+ family answers one question with one request each:
838
+
839
+ ```sh
840
+ curl -s https://smiles.cheminfo.org/build-info.json
841
+ ```
842
+
689
843
  ## Styling
690
844
 
691
845
  **No stylesheet, nothing for a consumer to import.** Every rule is a
@@ -1,3 +1,4 @@
1
+ import type { BuildInfo } from '../../build/core/buildInfo.ts';
1
2
  import type { CitedWork } from '../../citation/core/works.ts';
2
3
  import type { CreditEntry, CreditId } from '../../credits/core/credits.ts';
3
4
  import type { EcosystemSite, SiteId } from '../../ecosystem/core/sites.ts';
@@ -12,8 +13,12 @@ import type { ProviderEntry, ProviderId } from './providers.ts';
12
13
  * each crediting a different half of what it runs on.
13
14
  */
14
15
  export interface AboutContent {
15
- /** The site the page belongs to. */
16
- siteId: SiteId;
16
+ /**
17
+ * The site the page belongs to: its id, or the record itself for a site that
18
+ * is deliberately not listed in the family's Tools menu and therefore not in
19
+ * `ECOSYSTEM_SITES`.
20
+ */
21
+ siteId: SiteId | EcosystemSite;
17
22
  /** One sentence: what this tool is. */
18
23
  what: string;
19
24
  /**
@@ -54,10 +59,11 @@ export interface AboutContent {
54
59
  */
55
60
  repository?: string;
56
61
  /**
57
- * The running version, when the site knows it.
58
- * @default undefined
62
+ * Which build is running, from `virtual:cheminfo-build-info` — never written
63
+ * by hand, which is what keeps it true after the next release.
64
+ * @default undefined — the site's build does not publish one
59
65
  */
60
- version?: string;
66
+ build?: BuildInfo;
61
67
  /**
62
68
  * Where a problem is reported.
63
69
  * @default the repository's /issues
@@ -95,8 +101,8 @@ export interface ResolvedAbout {
95
101
  providedBy: ProviderEntry[];
96
102
  license: string;
97
103
  repository: string;
98
- /** The running version, or `undefined` when the site does not know it. */
99
- version: string | undefined;
104
+ /** Which build is running, or `undefined` when the site does not say. */
105
+ build: BuildInfo | undefined;
100
106
  issues: string;
101
107
  }
102
108
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"about.d.ts","sourceRoot":"","sources":["../../../src/about/core/about.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAG3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGhE;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,iEAAiE;IACjE,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB,8DAA8D;IAC9D,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC7B;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC;;;;OAIG;IACH,UAAU,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACnC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB,uEAAuE;IACvE,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,4DAA4D;IAC5D,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IAC3B,2DAA2D;IAC3D,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,2EAA2E;IAC3E,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAkBjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CA8C7D"}
1
+ {"version":3,"file":"about.d.ts","sourceRoot":"","sources":["../../../src/about/core/about.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAG3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGhE;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,iEAAiE;IACjE,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB,8DAA8D;IAC9D,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC7B;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC;;;;OAIG;IACH,UAAU,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACnC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB,uEAAuE;IACvE,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,4DAA4D;IAC5D,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IAC3B,2DAA2D;IAC3D,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,2EAA2E;IAC3E,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAqBjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CA8C7D"}
@@ -10,7 +10,9 @@ import { providers } from "./providers.js";
10
10
  * credits nobody.
11
11
  */
12
12
  export function resolveAbout(content) {
13
- const site = siteById(content.siteId);
13
+ const site = typeof content.siteId === 'string'
14
+ ? siteById(content.siteId)
15
+ : content.siteId;
14
16
  const repository = content.repository ?? site.repository;
15
17
  return {
16
18
  site,
@@ -23,7 +25,7 @@ export function resolveAbout(content) {
23
25
  providedBy: providers(content.providedBy ?? []),
24
26
  license: content.license ?? DEFAULT_LICENSE,
25
27
  repository,
26
- version: content.version,
28
+ build: content.build,
27
29
  issues: content.issues ?? `${withoutTrailingSlash(repository)}/issues`,
28
30
  };
29
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"about.js","sourceRoot":"","sources":["../../../src/about/core/about.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAI1D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAsG3C;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,OAAqB;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;IAEzD,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QACpC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QACjC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;QAC5B,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAC/C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,eAAe;QAC3C,UAAU;QACV,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG,oBAAoB,CAAC,UAAU,CAAC,SAAS;KACvE,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CACX,eAAe,OAAO,CAAC,IAAI,CAAC,MAAM,wCAAwC,UAAU,yBAAyB,CAC9G,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;QACjD,QAAQ,CAAC,IAAI,CACX,iBAAiB,GAAG,CAAC,MAAM,qBAAqB,OAAO,QAAQ,OAAO,mDAAmD,CAC1H,CAAC;IACJ,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,CACX,iBAAiB,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,MAAM,oCAAoC,cAAc,4BAA4B,CAC3H,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAC5C,IAAI,UAAU,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CACX,wBAAwB,UAAU,CAAC,MAAM,aAAa,aAAa,mEAAmE,CACvI,CAAC;IACJ,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,SAAS,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CACX,aAAa,KAAK,GAAG,CAAC,OAAO,SAAS,CAAC,MAAM,wBAAwB,eAAe,+CAA+C,CACpI,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,QAAQ,CAAC,IAAI,CACX,2GAA2G,CAC5G,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,+DAA+D;AAC/D,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,SAAS,oBAAoB,CAAC,GAAW;IACvC,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"about.js","sourceRoot":"","sources":["../../../src/about/core/about.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ReactElement } from 'react';
2
+ import type { BuildInfo } from '../../build/core/buildInfo.ts';
3
+ export interface AboutBuildProps {
4
+ /** What the build published about itself. */
5
+ build: BuildInfo;
6
+ /** Where the sources live, which is what the version and commit link into. */
7
+ repository: string;
8
+ }
9
+ /**
10
+ * The one line that says which build of the site a visitor has open.
11
+ *
12
+ * A report of something going wrong is worth answering only when we know what
13
+ * was running, and a visitor cannot read that off the page otherwise. The
14
+ * version and the commit link into the repository, so the change that caused a
15
+ * problem is one click from the page that shows it.
16
+ * @param props - See {@link AboutBuildProps}.
17
+ * @returns The line.
18
+ */
19
+ export declare function AboutBuild(props: AboutBuildProps): ReactElement;
20
+ //# sourceMappingURL=AboutBuild.d.ts.map
@@ -0,0 +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;AAG/D,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,KAAK,EAAE,SAAS,CAAC;IACjB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CA+B/D"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { formatBuiltAt, shortCommit } from "../../build/core/buildInfo.js";
3
+ /**
4
+ * The one line that says which build of the site a visitor has open.
5
+ *
6
+ * A report of something going wrong is worth answering only when we know what
7
+ * was running, and a visitor cannot read that off the page otherwise. The
8
+ * version and the commit link into the repository, so the change that caused a
9
+ * problem is one click from the page that shows it.
10
+ * @param props - See {@link AboutBuildProps}.
11
+ * @returns The line.
12
+ */
13
+ export function AboutBuild(props) {
14
+ const { build, repository } = props;
15
+ const sources = repository.endsWith('/')
16
+ ? repository.slice(0, -1)
17
+ : repository;
18
+ const onGitHub = sources.startsWith(GITHUB);
19
+ return (_jsxs("p", { style: PARAGRAPH_STYLE, children: ["Running version", ' ', _jsx(Reference, { href: onGitHub ? `${sources}/releases/tag/v${build.version}` : undefined, children: build.version }), ", built ", formatBuiltAt(build.builtAt), build.commit === undefined ? null : (_jsxs(_Fragment, { children: [' from commit ', _jsx(Reference, { href: onGitHub ? `${sources}/commit/${build.commit}` : undefined, children: shortCommit(build.commit) })] })), "."] }));
20
+ }
21
+ function Reference(props) {
22
+ const { href, children } = props;
23
+ if (href === undefined)
24
+ return _jsx("code", { style: CODE_STYLE, children: children });
25
+ return (_jsx("a", { href: href, target: "_blank", rel: "noopener noreferrer", style: LINK_STYLE, children: _jsx("code", { style: CODE_STYLE, children: children }) }));
26
+ }
27
+ const GITHUB = 'https://github.com/';
28
+ const PARAGRAPH_STYLE = {
29
+ margin: '8px 0 0',
30
+ color: 'var(--text-muted)',
31
+ fontSize: 13,
32
+ };
33
+ const CODE_STYLE = {
34
+ fontFamily: 'var(--font-mono, ui-monospace, monospace)',
35
+ fontSize: 13,
36
+ };
37
+ const LINK_STYLE = { color: 'var(--accent)' };
38
+ //# sourceMappingURL=AboutBuild.js.map
@@ -0,0 +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;AAS3E;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IACpC,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,UAAU,CAAC;IACf,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,CACL,aAAG,KAAK,EAAE,eAAe,gCACP,GAAG,EACnB,KAAC,SAAS,IACR,IAAI,EACF,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,YAGnE,KAAK,CAAC,OAAO,GACJ,cACH,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EACpC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACnC,8BACG,eAAe,EAChB,KAAC,SAAS,IACR,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,YAE/D,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,MAAM,GAAG,qBAAqB,CAAC;AAErC,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"}
@@ -15,6 +15,13 @@ export interface AboutPageProps {
15
15
  * @default undefined
16
16
  */
17
17
  children?: ReactNode;
18
+ /**
19
+ * The site's own mark, for a site the shared glyph set does not hold —
20
+ * one that is deliberately not listed in `ECOSYSTEM_SITES`. It stands where
21
+ * `SiteMark` would, and the hero is otherwise unchanged.
22
+ * @default undefined — the family's mark for that site
23
+ */
24
+ mark?: ReactNode;
18
25
  /**
19
26
  * The site's own drawn lockup, for a site that has one. It stands in the
20
27
  * hero in place of the mark and the written name, above the tagline, and
@@ -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;AAOrD,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;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAsF7D"}
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;AAQrD,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,CAsF7D"}
@@ -3,6 +3,7 @@ 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
5
  import { resolveAbout } from "../core/about.js";
6
+ import { AboutBuild } from "./AboutBuild.js";
6
7
  import { AboutCitations } from "./AboutCitations.js";
7
8
  import { AboutProvidedBy } from "./AboutProvidedBy.js";
8
9
  import { AboutSection } from "./AboutSection.js";
@@ -19,10 +20,12 @@ import { AboutSection } from "./AboutSection.js";
19
20
  * @throws {Error} When the record names a site or a credit that does not exist.
20
21
  */
21
22
  export function AboutPage(props) {
22
- const { content, className, children, logo } = props;
23
+ const { content, className, children, logo, mark } = props;
23
24
  const about = resolveAbout(content);
24
25
  const site = about.site;
25
- return (_jsxs("div", { className: className === undefined ? 'about-page' : `about-page ${className}`, style: PAGE_STYLE, children: [_jsxs("header", { className: "about-hero", style: logo === undefined ? HERO_STYLE : LOGO_HERO_STYLE, children: [logo === undefined ? _jsx(SiteMark, { siteId: site.id, size: 56 }) : null, _jsxs("div", { children: [_jsx("h1", { style: logo === undefined ? NAME_STYLE : LOGO_NAME_STYLE, children: logo ?? _jsx(Wordmark, { siteId: site.id, size: 26 }) }), _jsx("p", { style: TAGLINE_STYLE, children: site.tagline }), _jsx("p", { style: WHAT_STYLE, children: about.what })] })] }), 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 }) })), _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.version === undefined ? null : (_jsxs("p", { style: PARAGRAPH_STYLE, children: ["This page is running version ", about.version, "."] }))] }), _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 }), "."] }) })] }));
26
+ return (_jsxs("div", { className: className === undefined ? 'about-page' : `about-page ${className}`, style: PAGE_STYLE, children: [_jsxs("header", { className: "about-hero", style: logo === undefined ? HERO_STYLE : LOGO_HERO_STYLE, children: [logo === undefined
27
+ ? (mark ?? _jsx(SiteMark, { site: site, size: 56 }))
28
+ : null, _jsxs("div", { 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 })] })] }), 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 }) })), _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 }))] }), _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 }), "."] }) })] }));
26
29
  }
27
30
  function ExternalLink(props) {
28
31
  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,3 +1,5 @@
1
+ export type { AboutBuildProps } from './AboutBuild.tsx';
2
+ export { AboutBuild } from './AboutBuild.tsx';
1
3
  export type { AboutCitationsProps } from './AboutCitations.tsx';
2
4
  export { AboutCitations } from './AboutCitations.tsx';
3
5
  export type { AboutPageProps } from './AboutPage.tsx';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/about/ui/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/about/ui/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,3 +1,4 @@
1
+ export { AboutBuild } from "./AboutBuild.js";
1
2
  export { AboutCitations } from "./AboutCitations.js";
2
3
  export { AboutPage } from "./AboutPage.js";
3
4
  export { AboutProvidedBy } from "./AboutProvidedBy.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/about/ui/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAsB,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAiB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAuB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/about/ui/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAkB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAsB,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAiB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAuB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAoB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * What a deployed page can say about itself: which release it is, when it was
3
+ * built, and from which commit.
4
+ *
5
+ * A site of ours is a link somebody handed out in a course, so the first
6
+ * question a report raises is *which one of these is running*. The record is
7
+ * filled by the build rather than written by hand — a version a human types
8
+ * into a source file is a version that is wrong by the next release.
9
+ */
10
+ export interface BuildInfo {
11
+ /** The released version, from the package.json at the repository root. */
12
+ version: string;
13
+ /** When the build ran, as an ISO instant to the second: `2026-09-16T09:41:07Z`. */
14
+ builtAt: string;
15
+ /**
16
+ * The full commit the build was made from.
17
+ * @default undefined — the build could not see the repository
18
+ */
19
+ commit?: string;
20
+ /**
21
+ * The version of `react-cheminfo` the site is built against, which is what
22
+ * says whether a site is running the current chrome.
23
+ * @default undefined — the build could not read it
24
+ */
25
+ reactCheminfo?: string;
26
+ }
27
+ /**
28
+ * The commit as it is written for a reader.
29
+ * @param commit - The full hash.
30
+ * @returns Its first seven characters, which is what git itself shows.
31
+ */
32
+ export declare function shortCommit(commit: string): string;
33
+ /**
34
+ * The build instant as it is read on the page.
35
+ * @param builtAt - The ISO instant the build wrote.
36
+ * @returns The day and the time, in UTC, e.g. `2026-09-16 09:41:07 UTC`.
37
+ */
38
+ export declare function formatBuiltAt(builtAt: string): string;
39
+ //# sourceMappingURL=buildInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildInfo.d.ts","sourceRoot":"","sources":["../../../src/build/core/buildInfo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The commit as it is written for a reader.
3
+ * @param commit - The full hash.
4
+ * @returns Its first seven characters, which is what git itself shows.
5
+ */
6
+ export function shortCommit(commit) {
7
+ return commit.slice(0, SHORT_COMMIT_LENGTH);
8
+ }
9
+ /**
10
+ * The build instant as it is read on the page.
11
+ * @param builtAt - The ISO instant the build wrote.
12
+ * @returns The day and the time, in UTC, e.g. `2026-09-16 09:41:07 UTC`.
13
+ */
14
+ export function formatBuiltAt(builtAt) {
15
+ const seconds = builtAt.slice(0, SECOND_LENGTH).replace('T', ' ');
16
+ return `${seconds} UTC`;
17
+ }
18
+ const SHORT_COMMIT_LENGTH = 7;
19
+ const SECOND_LENGTH = 19;
20
+ //# sourceMappingURL=buildInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildInfo.js","sourceRoot":"","sources":["../../../src/build/core/buildInfo.ts"],"names":[],"mappings":"AA2BA;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClE,OAAO,GAAG,OAAO,MAAM,CAAC;AAC1B,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,aAAa,GAAG,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { BuildInfo } from './buildInfo.ts';
2
+ /**
3
+ * Which build of the site is running, or `undefined` when nothing filled it in.
4
+ *
5
+ * The module is replaced at build time by `cheminfoBuildInfo`, which is what
6
+ * puts the real version, instant and commit here. It stays a real module rather
7
+ * than a virtual one so that a test, a Playwright spec or a backend can import
8
+ * the About record in plain Node: outside a build there is simply no record,
9
+ * and the About page leaves the line out.
10
+ */
11
+ export declare const BUILD_INFO: BuildInfo | undefined;
12
+ //# sourceMappingURL=current.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current.d.ts","sourceRoot":"","sources":["../../../src/build/core/current.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,GAAG,SAAqB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Which build of the site is running, or `undefined` when nothing filled it in.
3
+ *
4
+ * The module is replaced at build time by `cheminfoBuildInfo`, which is what
5
+ * puts the real version, instant and commit here. It stays a real module rather
6
+ * than a virtual one so that a test, a Playwright spec or a backend can import
7
+ * the About record in plain Node: outside a build there is simply no record,
8
+ * and the About page leaves the line out.
9
+ */
10
+ export const BUILD_INFO = undefined;
11
+ //# sourceMappingURL=current.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current.js","sourceRoot":"","sources":["../../../src/build/core/current.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,UAAU,GAA0B,SAAS,CAAC"}