react-cheminfo 0.37.0 → 0.38.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 (104) hide show
  1. package/README.md +77 -1
  2. package/bin/check-seo.mjs +43 -1
  3. package/lib/core.d.ts +1 -0
  4. package/lib/core.d.ts.map +1 -1
  5. package/lib/core.js +1 -0
  6. package/lib/core.js.map +1 -1
  7. package/lib/i18n/core/chromeCatalog.d.ts +1 -1
  8. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
  9. package/lib/locales/de.json +9 -1
  10. package/lib/locales/en.json +9 -1
  11. package/lib/locales/es.json +9 -1
  12. package/lib/locales/fr.json +9 -1
  13. package/lib/locales/it.json +9 -1
  14. package/lib/number/core/index.d.ts +1 -1
  15. package/lib/number/core/index.d.ts.map +1 -1
  16. package/lib/number/core/index.js +1 -1
  17. package/lib/number/core/index.js.map +1 -1
  18. package/lib/number/core/numberText.d.ts +13 -0
  19. package/lib/number/core/numberText.d.ts.map +1 -1
  20. package/lib/number/core/numberText.js +20 -0
  21. package/lib/number/core/numberText.js.map +1 -1
  22. package/lib/range/core/index.d.ts +4 -0
  23. package/lib/range/core/index.d.ts.map +1 -0
  24. package/lib/range/core/index.js +3 -0
  25. package/lib/range/core/index.js.map +1 -0
  26. package/lib/range/core/rangeBounds.d.ts +79 -0
  27. package/lib/range/core/rangeBounds.d.ts.map +1 -0
  28. package/lib/range/core/rangeBounds.js +110 -0
  29. package/lib/range/core/rangeBounds.js.map +1 -0
  30. package/lib/range/core/rangeHistogram.d.ts +13 -0
  31. package/lib/range/core/rangeHistogram.d.ts.map +1 -0
  32. package/lib/range/core/rangeHistogram.js +39 -0
  33. package/lib/range/core/rangeHistogram.js.map +1 -0
  34. package/lib/range/ui/RangeHistogram.d.ts +20 -0
  35. package/lib/range/ui/RangeHistogram.d.ts.map +1 -0
  36. package/lib/range/ui/RangeHistogram.js +18 -0
  37. package/lib/range/ui/RangeHistogram.js.map +1 -0
  38. package/lib/range/ui/RangeSlider.d.ts +77 -0
  39. package/lib/range/ui/RangeSlider.d.ts.map +1 -0
  40. package/lib/range/ui/RangeSlider.js +60 -0
  41. package/lib/range/ui/RangeSlider.js.map +1 -0
  42. package/lib/range/ui/RangeValue.d.ts +41 -0
  43. package/lib/range/ui/RangeValue.d.ts.map +1 -0
  44. package/lib/range/ui/RangeValue.js +73 -0
  45. package/lib/range/ui/RangeValue.js.map +1 -0
  46. package/lib/range/ui/index.d.ts +3 -0
  47. package/lib/range/ui/index.d.ts.map +1 -0
  48. package/lib/range/ui/index.js +2 -0
  49. package/lib/range/ui/index.js.map +1 -0
  50. package/lib/seo/core/documentMeta.d.ts +16 -0
  51. package/lib/seo/core/documentMeta.d.ts.map +1 -1
  52. package/lib/seo/core/documentMeta.js +18 -0
  53. package/lib/seo/core/documentMeta.js.map +1 -1
  54. package/lib/seo/core/index.d.ts +3 -1
  55. package/lib/seo/core/index.d.ts.map +1 -1
  56. package/lib/seo/core/index.js +2 -1
  57. package/lib/seo/core/index.js.map +1 -1
  58. package/lib/seo/core/noscript.d.ts +8 -0
  59. package/lib/seo/core/noscript.d.ts.map +1 -1
  60. package/lib/seo/core/noscript.js +10 -3
  61. package/lib/seo/core/noscript.js.map +1 -1
  62. package/lib/seo/core/pageMeta.d.ts +10 -2
  63. package/lib/seo/core/pageMeta.d.ts.map +1 -1
  64. package/lib/seo/core/pageMeta.js +12 -3
  65. package/lib/seo/core/pageMeta.js.map +1 -1
  66. package/lib/seo/core/siteFiles.d.ts +32 -3
  67. package/lib/seo/core/siteFiles.d.ts.map +1 -1
  68. package/lib/seo/core/siteFiles.js +13 -4
  69. package/lib/seo/core/siteFiles.js.map +1 -1
  70. package/lib/seo/core/startDocumentMeta.js +8 -7
  71. package/lib/seo/core/startDocumentMeta.js.map +1 -1
  72. package/lib/seo/vite/prerender.d.ts +26 -4
  73. package/lib/seo/vite/prerender.d.ts.map +1 -1
  74. package/lib/seo/vite/prerender.js +100 -30
  75. package/lib/seo/vite/prerender.js.map +1 -1
  76. package/lib/ui.d.ts +1 -0
  77. package/lib/ui.d.ts.map +1 -1
  78. package/lib/ui.js +1 -0
  79. package/lib/ui.js.map +1 -1
  80. package/package.json +1 -1
  81. package/src/core.ts +1 -0
  82. package/src/locales/de.json +9 -1
  83. package/src/locales/en.json +9 -1
  84. package/src/locales/es.json +9 -1
  85. package/src/locales/fr.json +9 -1
  86. package/src/locales/it.json +9 -1
  87. package/src/number/core/index.ts +1 -0
  88. package/src/number/core/numberText.ts +20 -0
  89. package/src/range/core/index.ts +11 -0
  90. package/src/range/core/rangeBounds.ts +143 -0
  91. package/src/range/core/rangeHistogram.ts +38 -0
  92. package/src/range/ui/RangeHistogram.tsx +49 -0
  93. package/src/range/ui/RangeSlider.tsx +209 -0
  94. package/src/range/ui/RangeValue.tsx +166 -0
  95. package/src/range/ui/index.ts +2 -0
  96. package/src/seo/core/documentMeta.ts +22 -0
  97. package/src/seo/core/index.ts +8 -1
  98. package/src/seo/core/noscript.ts +20 -2
  99. package/src/seo/core/pageMeta.ts +29 -5
  100. package/src/seo/core/siteFiles.ts +45 -10
  101. package/src/seo/core/startDocumentMeta.ts +9 -9
  102. package/src/seo/vite/prerender.ts +160 -36
  103. package/src/ui.ts +1 -0
  104. package/styles/chrome.css +135 -0
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)) {
package/lib/core.d.ts CHANGED
@@ -21,6 +21,7 @@ export * from './parallel/core/index.ts';
21
21
  export * from './pedagogy/core/index.ts';
22
22
  export * from './periodic/core/index.ts';
23
23
  export * from './projection/core/index.ts';
24
+ export * from './range/core/index.ts';
24
25
  export * from './router/core/index.ts';
25
26
  export * from './scatter/core/index.ts';
26
27
  export * from './scatter3d/core/index.ts';
package/lib/core.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
package/lib/core.js CHANGED
@@ -21,6 +21,7 @@ export * from "./parallel/core/index.js";
21
21
  export * from "./pedagogy/core/index.js";
22
22
  export * from "./periodic/core/index.js";
23
23
  export * from "./projection/core/index.js";
24
+ export * from "./range/core/index.js";
24
25
  export * from "./router/core/index.js";
25
26
  export * from "./scatter/core/index.js";
26
27
  export * from "./scatter3d/core/index.js";
package/lib/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,+EAA+E;AAC/E,2EAA2E;AAC3E,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,0EAA0E;AAC1E,8EAA8E;AAC9E,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,+EAA+E;AAC/E,2EAA2E;AAC3E,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,0EAA0E;AAC1E,8EAA8E;AAC9E,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
@@ -17,5 +17,5 @@ export type ChromeKey = keyof typeof en;
17
17
  * missing message falls back to; every other language arrives as a chunk of its
18
18
  * own, so a site read only in English downloads none of them.
19
19
  */
20
- export declare const CHROME_CATALOG: MessageCatalog<"language.label" | "chrome.pages" | "account.signIn" | "account.signOut" | "account.signedInAs" | "ecosystem.tools" | "ecosystem.menuHeading" | "ecosystem.otherTools" | "ecosystem.youAreHere" | "ecosystem.group.basics.label" | "ecosystem.group.basics.blurb" | "ecosystem.group.practice.label" | "ecosystem.group.practice.blurb" | "ecosystem.group.structures.label" | "ecosystem.group.structures.blurb" | "ecosystem.group.spectra.label" | "ecosystem.group.spectra.blurb" | "ecosystem.group.research.label" | "ecosystem.group.research.blurb" | "ecosystem.group.computing.label" | "ecosystem.group.computing.blurb" | "site.learn.tagline" | "site.inchi.tagline" | "site.vcl.tagline" | "site.smiles.tagline" | "site.openbabel.tagline" | "site.chemcalc.tagline" | "site.dbe.tagline" | "site.nmrium.tagline" | "site.metabo.tagline" | "site.derepflow.tagline" | "site.surge.tagline" | "site.tex.tagline" | "site.lcao.tagline" | "site.regexp.tagline" | "site.pdb.tagline" | "site.elucidation.tagline" | "site.equilibrium.tagline" | "site.polycarp.tagline" | "site.3d.tagline" | "site.periodic-table.tagline" | "site.database.tagline" | "site.symmetry.tagline" | "site.osiris.tagline" | "site.atoms.tagline" | "site.moles.tagline" | "site.inorganic.tagline" | "share.button" | "share.buttonTitle" | "share.dialogTitle" | "share.lead" | "share.layout" | "share.embed" | "share.embedHint" | "share.showOnPage" | "share.custom" | "share.link" | "share.copyLink" | "share.openInNewTab" | "share.iframe" | "share.copyIframe" | "share.done" | "cite.button" | "cite.copyReferenceAs" | "cite.pleaseCiteBoth" | "cite.pleaseCiteEvery" | "cite.copyBothAs" | "cite.copyEveryAs" | "cite.importIntoManager" | "cite.openArticle" | "cite.copyThisAs" | "cite.importThis" | "cite.copied" | "cite.copyFailed" | "cite.format.doi" | "cite.download.ris" | "cite.download.bibtex" | "clipboard.copied" | "clipboard.failed" | "clipboard.copy" | "clipboard.copyThe" | "clipboard.copyValue" | "clipboard.copyToClipboard" | "about.providedBy" | "about.whatYouCanDo" | "about.builtOn" | "about.howToCite" | "about.citeWork" | "about.built" | "about.builtFromCommit" | "about.nameList" | "credits.openbabel.description" | "credits.openchemlib.description" | "credits.openchemlib-utils.description" | "credits.osiris-property-explorer.description" | "credits.react-ocl.description" | "credits.react-mf.description" | "credits.mass-tools.description" | "credits.chem-equilibrium.description" | "credits.ml-matrix.description" | "credits.ml-xsadd.description" | "credits.cif-to-json.description" | "credits.ml-spectra-processing.description" | "credits.occ.description" | "credits.xtb-wasm.description" | "credits.molstar.description" | "credits.blueprint.description" | "credits.react-science.description" | "credits.react-cheminfo.description" | "credits.cheminfo-font.description" | "credits.nivo.description" | "credits.mathjax.description" | "credits.lexical.description" | "credits.katex.description" | "credits.dnd-kit.description" | "credits.react-roi.description" | "credits.file-collection.description" | "credits.zip-js.description" | "credits.preact-signals.description" | "credits.fastify.description" | "credits.sqlite.description" | "credits.sqlite-wasm.description" | "credits.pouchdb.description" | "credits.chemexper.description" | "credits.react.description" | "credits.vite.description" | "help.label" | "help.learnMore" | "help.on" | "confirm.delete" | "confirm.cancel" | "error.title" | "error.tryAgain" | "error.noMessage" | "capsule.filter" | "color.scales" | "color.done" | "color.custom" | "color.customEllipsis" | "color.inUse" | "color.colourScale" | "color.legendLabel" | "color.scaleBeingEdited" | "color.anchorColour" | "color.anchorPosition" | "color.removeAnchor" | "color.addColour" | "color.path" | "color.interpolation.rgb" | "color.interpolation.hsv" | "color.interpolation.hsv-long" | "color.kind.sequential" | "color.kind.diverging" | "color.kind.cyclic" | "color.scale.viridis.label" | "color.scale.viridis.description" | "color.scale.plasma.label" | "color.scale.plasma.description" | "color.scale.magma.label" | "color.scale.magma.description" | "color.scale.inferno.label" | "color.scale.inferno.description" | "color.scale.cividis.label" | "color.scale.cividis.description" | "color.scale.turbo.label" | "color.scale.turbo.description" | "color.scale.greys.label" | "color.scale.greys.description" | "color.scale.cool-warm.label" | "color.scale.cool-warm.description" | "color.scale.blue-red.label" | "color.scale.blue-red.description" | "color.scale.rainbow.label" | "color.scale.rainbow.description" | "download.save" | "download.saveFigure" | "download.saveThisFigure" | "download.format" | "download.formatHelp" | "download.resolution" | "download.resolutionHelp" | "download.resolutionExample" | "download.noFigure" | "download.hintRasterSvg" | "download.hintSvg" | "download.hintPng" | "download.hintCopied" | "download.copyUnsupported" | "download.size" | "download.sizeHelp" | "download.sizeScreen" | "download.sizeColumn" | "download.sizeCustom" | "download.customSize" | "download.width" | "download.height" | "pedagogy.check" | "pedagogy.revealHint" | "pedagogy.revealHintCount" | "pedagogy.revealHintLadder" | "pedagogy.hideSolution" | "pedagogy.revealSolution" | "pedagogy.reset" | "pedagogy.hints" | "pedagogy.solvedCount" | "pedagogy.clearAll" | "pedagogy.keepAnswers" | "pedagogy.clearEverything" | "pedagogy.clearWarning" | "pedagogy.filterTerms" | "pedagogy.noTermDefined" | "pedagogy.noTermMatches" | "pedagogy.example" | "pedagogy.input" | "pedagogy.previous" | "pedagogy.next" | "pedagogy.stepOf" | "slides.exit" | "slides.previousSlide" | "slides.nextSlide" | "slides.toggleFullscreen" | "slides.backToSlides" | "slides.backToSlide" | "slides.noAddress" | "slides.liveDemos" | "slides.noTalkYet" | "overlay.options" | "overlay.whatAmILookingAt" | "overlay.reset" | "overlay.hoverAName" | "overlay.dismiss" | "axis.scale" | "axis.xScale" | "axis.yScale" | "axis.linear" | "axis.logarithmic" | "axis.scaleHelp" | "delimited.copyTable" | "delimited.copyOrDownload" | "delimited.close" | "delimited.separator" | "delimited.save" | "delimited.copy" | "delimited.tableAsText" | "chart.measurement" | "chart.measurements" | "delimited.descriptionOne" | "delimited.descriptionMany" | "structure.guide.atom.title" | "structure.guide.atom.element" | "structure.guide.atom.group" | "structure.guide.atom.applyOrForget" | "structure.guide.atom.chain" | "structure.guide.atom.charge" | "structure.guide.atom.radical" | "structure.guide.atom.spin" | "structure.guide.atom.attachment" | "structure.guide.atom.query" | "structure.guide.atom.halogen" | "structure.guide.atom.delete" | "structure.guide.atom.note" | "structure.guide.bond.title" | "structure.guide.bond.order" | "structure.guide.bond.zeroOrder" | "structure.guide.bond.stereo" | "structure.guide.bond.unknownGeometry" | "structure.guide.bond.threeRing" | "structure.guide.bond.ring" | "structure.guide.bond.benzene" | "structure.guide.bond.query" | "structure.guide.bond.delete" | "structure.guide.anywhere.title" | "structure.guide.anywhere.undo" | "structure.guide.anywhere.copy" | "structure.guide.anywhere.paste" | "structure.guide.anywhere.deleteSelection" | "structure.guide.anywhere.flip" | "structure.guide.anywhere.help" | "structure.guide.anywhere.note" | "structure.guide.selecting.title" | "structure.guide.selecting.lasso" | "structure.guide.selecting.rectangle" | "structure.guide.selecting.add" | "structure.guide.selecting.move" | "structure.guide.selecting.duplicate" | "structure.guide.selecting.queryFeatures" | "structure.guide.selecting.note" | "structure.guide.stereochemistry.title" | "structure.guide.stereochemistry.note" | "structure.input.type" | "structure.input.or" | "structure.input.drag" | "structure.input.plusDrag" | "structure.input.dragSelection" | "structure.input.plusDragSelection" | "structure.input.doubleClick" | "structure.docs.toolsAndKeys" | "structure.docs.atomProperties" | "structure.docs.stereochemistry" | "structure.help.hoverToolbar" | "structure.help.learnMore" | "structure.mouseAndKeyboard" | "structure.tool.clear.name" | "structure.tool.clear.description" | "structure.tool.cleanUp.name" | "structure.tool.cleanUp.description" | "structure.tool.select.name" | "structure.tool.select.description" | "structure.tool.unknownConfiguration.name" | "structure.tool.unknownConfiguration.description" | "structure.tool.delete.name" | "structure.tool.delete.description" | "structure.tool.singleBond.name" | "structure.tool.singleBond.description" | "structure.tool.upBond.name" | "structure.tool.upBond.description" | "structure.tool.positiveCharge.name" | "structure.tool.positiveCharge.description" | "structure.tool.undo.name" | "structure.tool.undo.description" | "structure.tool.zoomAndRotate.name" | "structure.tool.zoomAndRotate.description" | "structure.tool.atomMapping.name" | "structure.tool.atomMapping.description" | "structure.tool.enhancedStereo.name" | "structure.tool.enhancedStereo.description" | "structure.tool.text.name" | "structure.tool.text.description" | "structure.tool.chain.name" | "structure.tool.chain.description" | "structure.tool.downBond.name" | "structure.tool.downBond.description" | "structure.tool.negativeCharge.name" | "structure.tool.negativeCharge.description" | "structure.tool.anyAtom.name" | "structure.tool.anyAtom.description" | "structure.tool.ring3.name" | "structure.tool.ring3.description" | "structure.tool.ring5.name" | "structure.tool.ring5.description" | "structure.tool.ring7.name" | "structure.tool.ring7.description" | "structure.tool.ring4.name" | "structure.tool.ring4.description" | "structure.tool.ring6.name" | "structure.tool.ring6.description" | "structure.tool.benzene.name" | "structure.tool.benzene.description" | "structure.tool.carbon.name" | "structure.tool.carbon.description" | "structure.tool.nitrogen.name" | "structure.tool.nitrogen.description" | "structure.tool.oxygen.name" | "structure.tool.oxygen.description" | "structure.tool.fluorine.name" | "structure.tool.fluorine.description" | "structure.tool.bromine.name" | "structure.tool.bromine.description" | "structure.tool.hydrogen.name" | "structure.tool.hydrogen.description" | "structure.tool.silicon.name" | "structure.tool.silicon.description" | "structure.tool.phosphorus.name" | "structure.tool.phosphorus.description" | "structure.tool.sulfur.name" | "structure.tool.sulfur.description" | "structure.tool.chlorine.name" | "structure.tool.chlorine.description" | "structure.tool.iodine.name" | "structure.tool.iodine.description" | "structure.tool.reactionOnly" | "structure.tool.unavailable" | "structure.loadingEditor" | "periodic.table" | "periodic.group" | "periodic.period" | "periodic.cellLabel" | "periodic.category.alkali-metal" | "periodic.category.alkaline-earth-metal" | "periodic.category.transition-metal" | "periodic.category.post-transition-metal" | "periodic.category.metalloid" | "periodic.category.nonmetal" | "periodic.category.halogen" | "periodic.category.noble-gas" | "periodic.category.lanthanoid" | "periodic.category.actinoid" | "molecule3d.view" | "molecule3d.resetView" | "molecule3d.spin" | "molecule3d.surface" | "molecule3d.molecularSurface" | "molecule3d.displayOptions" | "molecule3d.exportImage" | "molecule3d.measure" | "molecule3d.clearMeasurements" | "molecule3d.measurement.distance" | "molecule3d.measurement.angle" | "molecule3d.measurement.dihedral" | "molecule3d.measurementTooltip" | "molecule3d.representation.ball-and-stick" | "molecule3d.representation.spacefill" | "molecule3d.representation.stick" | "molecule3d.size" | "molecule3d.surfaceOpacity" | "molecule3d.solventProbe" | "molecule3d.solventProbeHelp" | "molecule3d.surfaceColour" | "molecule3d.colour" | "molecule3d.coloring.uniform" | "molecule3d.coloring.element" | "molecule3d.coloring.polarity" | "molecule3d.neutral" | "molecule3d.tpsaHelp" | "molecule3d.loadingViewer" | "molecule3d.couldNotDraw" | "molecule3d.gesture.rotate" | "molecule3d.gesture.rollDrag" | "molecule3d.gesture.rollKeys" | "molecule3d.gesture.moveDrag" | "molecule3d.gesture.moveCtrl" | "molecule3d.gesture.zoom" | "molecule3d.gesture.clip" | "molecule3d.gesture.centreAtom" | "molecule3d.gesture.centreMolecule" | "molecule3d.input.drag" | "molecule3d.input.plus" | "molecule3d.input.plusDrag" | "molecule3d.input.plusScroll" | "molecule3d.input.or" | "molecule3d.input.rightDrag" | "molecule3d.input.scroll" | "molecule3d.input.clickAtom" | "molecule3d.input.clickBackground" | "molecule3d.helpNote" | "orbital.couldNotDraw" | "orbital.sampling" | "orbital.showAxes" | "orbital.axesTitle" | "orbital.axesBody" | "orbital.axesExample" | "orbital.spin" | "orbital.spinTitle" | "orbital.spinBody" | "orbital.resetTitle" | "orbital.resetBody" | "viewer.capability.noWindow" | "viewer.capability.noContext" | "viewer.capability.noFloatTextures" | "viewer.capability.ready" | "conformers.strategy.adaptive-random" | "conformers.strategy.likely-random" | "conformers.strategy.pure-random" | "conformers.strategy.likely-systematic" | "conformers.strategyDetail.adaptive-random" | "conformers.strategyDetail.likely-random" | "conformers.strategyDetail.pure-random" | "conformers.strategyDetail.likely-systematic" | "conformers.minimisation.none" | "number.increment" | "number.decrement">;
20
+ export declare const CHROME_CATALOG: MessageCatalog<"language.label" | "chrome.pages" | "account.signIn" | "account.signOut" | "account.signedInAs" | "ecosystem.tools" | "ecosystem.menuHeading" | "ecosystem.otherTools" | "ecosystem.youAreHere" | "ecosystem.group.basics.label" | "ecosystem.group.basics.blurb" | "ecosystem.group.practice.label" | "ecosystem.group.practice.blurb" | "ecosystem.group.structures.label" | "ecosystem.group.structures.blurb" | "ecosystem.group.spectra.label" | "ecosystem.group.spectra.blurb" | "ecosystem.group.research.label" | "ecosystem.group.research.blurb" | "ecosystem.group.computing.label" | "ecosystem.group.computing.blurb" | "site.learn.tagline" | "site.inchi.tagline" | "site.vcl.tagline" | "site.smiles.tagline" | "site.openbabel.tagline" | "site.chemcalc.tagline" | "site.dbe.tagline" | "site.nmrium.tagline" | "site.metabo.tagline" | "site.derepflow.tagline" | "site.surge.tagline" | "site.tex.tagline" | "site.lcao.tagline" | "site.regexp.tagline" | "site.pdb.tagline" | "site.elucidation.tagline" | "site.equilibrium.tagline" | "site.polycarp.tagline" | "site.3d.tagline" | "site.periodic-table.tagline" | "site.database.tagline" | "site.symmetry.tagline" | "site.osiris.tagline" | "site.atoms.tagline" | "site.moles.tagline" | "site.inorganic.tagline" | "share.button" | "share.buttonTitle" | "share.dialogTitle" | "share.lead" | "share.layout" | "share.embed" | "share.embedHint" | "share.showOnPage" | "share.custom" | "share.link" | "share.copyLink" | "share.openInNewTab" | "share.iframe" | "share.copyIframe" | "share.done" | "cite.button" | "cite.copyReferenceAs" | "cite.pleaseCiteBoth" | "cite.pleaseCiteEvery" | "cite.copyBothAs" | "cite.copyEveryAs" | "cite.importIntoManager" | "cite.openArticle" | "cite.copyThisAs" | "cite.importThis" | "cite.copied" | "cite.copyFailed" | "cite.format.doi" | "cite.download.ris" | "cite.download.bibtex" | "clipboard.copied" | "clipboard.failed" | "clipboard.copy" | "clipboard.copyThe" | "clipboard.copyValue" | "clipboard.copyToClipboard" | "about.providedBy" | "about.whatYouCanDo" | "about.builtOn" | "about.howToCite" | "about.citeWork" | "about.built" | "about.builtFromCommit" | "about.nameList" | "credits.openbabel.description" | "credits.openchemlib.description" | "credits.openchemlib-utils.description" | "credits.osiris-property-explorer.description" | "credits.react-ocl.description" | "credits.react-mf.description" | "credits.mass-tools.description" | "credits.chem-equilibrium.description" | "credits.ml-matrix.description" | "credits.ml-xsadd.description" | "credits.cif-to-json.description" | "credits.ml-spectra-processing.description" | "credits.occ.description" | "credits.xtb-wasm.description" | "credits.molstar.description" | "credits.blueprint.description" | "credits.react-science.description" | "credits.react-cheminfo.description" | "credits.cheminfo-font.description" | "credits.nivo.description" | "credits.mathjax.description" | "credits.lexical.description" | "credits.katex.description" | "credits.dnd-kit.description" | "credits.react-roi.description" | "credits.file-collection.description" | "credits.zip-js.description" | "credits.preact-signals.description" | "credits.fastify.description" | "credits.sqlite.description" | "credits.sqlite-wasm.description" | "credits.pouchdb.description" | "credits.chemexper.description" | "credits.react.description" | "credits.vite.description" | "help.label" | "help.learnMore" | "help.on" | "confirm.delete" | "confirm.cancel" | "error.title" | "error.tryAgain" | "error.noMessage" | "capsule.filter" | "color.scales" | "color.done" | "color.custom" | "color.customEllipsis" | "color.inUse" | "color.colourScale" | "color.legendLabel" | "color.scaleBeingEdited" | "color.anchorColour" | "color.anchorPosition" | "color.removeAnchor" | "color.addColour" | "color.path" | "color.interpolation.rgb" | "color.interpolation.hsv" | "color.interpolation.hsv-long" | "color.kind.sequential" | "color.kind.diverging" | "color.kind.cyclic" | "color.scale.viridis.label" | "color.scale.viridis.description" | "color.scale.plasma.label" | "color.scale.plasma.description" | "color.scale.magma.label" | "color.scale.magma.description" | "color.scale.inferno.label" | "color.scale.inferno.description" | "color.scale.cividis.label" | "color.scale.cividis.description" | "color.scale.turbo.label" | "color.scale.turbo.description" | "color.scale.greys.label" | "color.scale.greys.description" | "color.scale.cool-warm.label" | "color.scale.cool-warm.description" | "color.scale.blue-red.label" | "color.scale.blue-red.description" | "color.scale.rainbow.label" | "color.scale.rainbow.description" | "download.save" | "download.saveFigure" | "download.saveThisFigure" | "download.format" | "download.formatHelp" | "download.resolution" | "download.resolutionHelp" | "download.resolutionExample" | "download.noFigure" | "download.hintRasterSvg" | "download.hintSvg" | "download.hintPng" | "download.hintCopied" | "download.copyUnsupported" | "download.size" | "download.sizeHelp" | "download.sizeScreen" | "download.sizeColumn" | "download.sizeCustom" | "download.customSize" | "download.width" | "download.height" | "pedagogy.check" | "pedagogy.revealHint" | "pedagogy.revealHintCount" | "pedagogy.revealHintLadder" | "pedagogy.hideSolution" | "pedagogy.revealSolution" | "pedagogy.reset" | "pedagogy.hints" | "pedagogy.solvedCount" | "pedagogy.clearAll" | "pedagogy.keepAnswers" | "pedagogy.clearEverything" | "pedagogy.clearWarning" | "pedagogy.filterTerms" | "pedagogy.noTermDefined" | "pedagogy.noTermMatches" | "pedagogy.example" | "pedagogy.input" | "pedagogy.previous" | "pedagogy.next" | "pedagogy.stepOf" | "slides.exit" | "slides.previousSlide" | "slides.nextSlide" | "slides.toggleFullscreen" | "slides.backToSlides" | "slides.backToSlide" | "slides.noAddress" | "slides.liveDemos" | "slides.noTalkYet" | "overlay.options" | "overlay.whatAmILookingAt" | "overlay.reset" | "overlay.hoverAName" | "overlay.dismiss" | "axis.scale" | "axis.xScale" | "axis.yScale" | "axis.linear" | "axis.logarithmic" | "axis.scaleHelp" | "delimited.copyTable" | "delimited.copyOrDownload" | "delimited.close" | "delimited.separator" | "delimited.save" | "delimited.copy" | "delimited.tableAsText" | "chart.measurement" | "chart.measurements" | "delimited.descriptionOne" | "delimited.descriptionMany" | "structure.guide.atom.title" | "structure.guide.atom.element" | "structure.guide.atom.group" | "structure.guide.atom.applyOrForget" | "structure.guide.atom.chain" | "structure.guide.atom.charge" | "structure.guide.atom.radical" | "structure.guide.atom.spin" | "structure.guide.atom.attachment" | "structure.guide.atom.query" | "structure.guide.atom.halogen" | "structure.guide.atom.delete" | "structure.guide.atom.note" | "structure.guide.bond.title" | "structure.guide.bond.order" | "structure.guide.bond.zeroOrder" | "structure.guide.bond.stereo" | "structure.guide.bond.unknownGeometry" | "structure.guide.bond.threeRing" | "structure.guide.bond.ring" | "structure.guide.bond.benzene" | "structure.guide.bond.query" | "structure.guide.bond.delete" | "structure.guide.anywhere.title" | "structure.guide.anywhere.undo" | "structure.guide.anywhere.copy" | "structure.guide.anywhere.paste" | "structure.guide.anywhere.deleteSelection" | "structure.guide.anywhere.flip" | "structure.guide.anywhere.help" | "structure.guide.anywhere.note" | "structure.guide.selecting.title" | "structure.guide.selecting.lasso" | "structure.guide.selecting.rectangle" | "structure.guide.selecting.add" | "structure.guide.selecting.move" | "structure.guide.selecting.duplicate" | "structure.guide.selecting.queryFeatures" | "structure.guide.selecting.note" | "structure.guide.stereochemistry.title" | "structure.guide.stereochemistry.note" | "structure.input.type" | "structure.input.or" | "structure.input.drag" | "structure.input.plusDrag" | "structure.input.dragSelection" | "structure.input.plusDragSelection" | "structure.input.doubleClick" | "structure.docs.toolsAndKeys" | "structure.docs.atomProperties" | "structure.docs.stereochemistry" | "structure.help.hoverToolbar" | "structure.help.learnMore" | "structure.mouseAndKeyboard" | "structure.tool.clear.name" | "structure.tool.clear.description" | "structure.tool.cleanUp.name" | "structure.tool.cleanUp.description" | "structure.tool.select.name" | "structure.tool.select.description" | "structure.tool.unknownConfiguration.name" | "structure.tool.unknownConfiguration.description" | "structure.tool.delete.name" | "structure.tool.delete.description" | "structure.tool.singleBond.name" | "structure.tool.singleBond.description" | "structure.tool.upBond.name" | "structure.tool.upBond.description" | "structure.tool.positiveCharge.name" | "structure.tool.positiveCharge.description" | "structure.tool.undo.name" | "structure.tool.undo.description" | "structure.tool.zoomAndRotate.name" | "structure.tool.zoomAndRotate.description" | "structure.tool.atomMapping.name" | "structure.tool.atomMapping.description" | "structure.tool.enhancedStereo.name" | "structure.tool.enhancedStereo.description" | "structure.tool.text.name" | "structure.tool.text.description" | "structure.tool.chain.name" | "structure.tool.chain.description" | "structure.tool.downBond.name" | "structure.tool.downBond.description" | "structure.tool.negativeCharge.name" | "structure.tool.negativeCharge.description" | "structure.tool.anyAtom.name" | "structure.tool.anyAtom.description" | "structure.tool.ring3.name" | "structure.tool.ring3.description" | "structure.tool.ring5.name" | "structure.tool.ring5.description" | "structure.tool.ring7.name" | "structure.tool.ring7.description" | "structure.tool.ring4.name" | "structure.tool.ring4.description" | "structure.tool.ring6.name" | "structure.tool.ring6.description" | "structure.tool.benzene.name" | "structure.tool.benzene.description" | "structure.tool.carbon.name" | "structure.tool.carbon.description" | "structure.tool.nitrogen.name" | "structure.tool.nitrogen.description" | "structure.tool.oxygen.name" | "structure.tool.oxygen.description" | "structure.tool.fluorine.name" | "structure.tool.fluorine.description" | "structure.tool.bromine.name" | "structure.tool.bromine.description" | "structure.tool.hydrogen.name" | "structure.tool.hydrogen.description" | "structure.tool.silicon.name" | "structure.tool.silicon.description" | "structure.tool.phosphorus.name" | "structure.tool.phosphorus.description" | "structure.tool.sulfur.name" | "structure.tool.sulfur.description" | "structure.tool.chlorine.name" | "structure.tool.chlorine.description" | "structure.tool.iodine.name" | "structure.tool.iodine.description" | "structure.tool.reactionOnly" | "structure.tool.unavailable" | "structure.loadingEditor" | "periodic.table" | "periodic.group" | "periodic.period" | "periodic.cellLabel" | "periodic.category.alkali-metal" | "periodic.category.alkaline-earth-metal" | "periodic.category.transition-metal" | "periodic.category.post-transition-metal" | "periodic.category.metalloid" | "periodic.category.nonmetal" | "periodic.category.halogen" | "periodic.category.noble-gas" | "periodic.category.lanthanoid" | "periodic.category.actinoid" | "molecule3d.view" | "molecule3d.resetView" | "molecule3d.spin" | "molecule3d.surface" | "molecule3d.molecularSurface" | "molecule3d.displayOptions" | "molecule3d.exportImage" | "molecule3d.measure" | "molecule3d.clearMeasurements" | "molecule3d.measurement.distance" | "molecule3d.measurement.angle" | "molecule3d.measurement.dihedral" | "molecule3d.measurementTooltip" | "molecule3d.representation.ball-and-stick" | "molecule3d.representation.spacefill" | "molecule3d.representation.stick" | "molecule3d.size" | "molecule3d.surfaceOpacity" | "molecule3d.solventProbe" | "molecule3d.solventProbeHelp" | "molecule3d.surfaceColour" | "molecule3d.colour" | "molecule3d.coloring.uniform" | "molecule3d.coloring.element" | "molecule3d.coloring.polarity" | "molecule3d.neutral" | "molecule3d.tpsaHelp" | "molecule3d.loadingViewer" | "molecule3d.couldNotDraw" | "molecule3d.gesture.rotate" | "molecule3d.gesture.rollDrag" | "molecule3d.gesture.rollKeys" | "molecule3d.gesture.moveDrag" | "molecule3d.gesture.moveCtrl" | "molecule3d.gesture.zoom" | "molecule3d.gesture.clip" | "molecule3d.gesture.centreAtom" | "molecule3d.gesture.centreMolecule" | "molecule3d.input.drag" | "molecule3d.input.plus" | "molecule3d.input.plusDrag" | "molecule3d.input.plusScroll" | "molecule3d.input.or" | "molecule3d.input.rightDrag" | "molecule3d.input.scroll" | "molecule3d.input.clickAtom" | "molecule3d.input.clickBackground" | "molecule3d.helpNote" | "orbital.couldNotDraw" | "orbital.sampling" | "orbital.showAxes" | "orbital.axesTitle" | "orbital.axesBody" | "orbital.axesExample" | "orbital.spin" | "orbital.spinTitle" | "orbital.spinBody" | "orbital.resetTitle" | "orbital.resetBody" | "viewer.capability.noWindow" | "viewer.capability.noContext" | "viewer.capability.noFloatTextures" | "viewer.capability.ready" | "conformers.strategy.adaptive-random" | "conformers.strategy.likely-random" | "conformers.strategy.pure-random" | "conformers.strategy.likely-systematic" | "conformers.strategyDetail.adaptive-random" | "conformers.strategyDetail.likely-random" | "conformers.strategyDetail.pure-random" | "conformers.strategyDetail.likely-systematic" | "conformers.minimisation.none" | "number.increment" | "number.decrement" | "range.lowest" | "range.highest" | "range.lowestIs" | "range.highestIs" | "range.noLowerBound" | "range.noUpperBound" | "range.typeValue" | "range.clear">;
21
21
  //# sourceMappingURL=chromeCatalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chromeCatalog.d.ts","sourceRoot":"","sources":["../../../src/i18n/core/chromeCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,uBAAuB,CAAuB;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,2DAA2D;AAC3D,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAElD,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAC;AAExC;;;;GAIG;AACH,eAAO,MAAM,cAAc,uhaAgBzB,CAAC"}
1
+ {"version":3,"file":"chromeCatalog.d.ts","sourceRoot":"","sources":["../../../src/i18n/core/chromeCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,uBAAuB,CAAuB;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,2DAA2D;AAC3D,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAElD,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAC;AAExC;;;;GAIG;AACH,eAAO,MAAM,cAAc,mraAgBzB,CAAC"}
@@ -459,5 +459,13 @@
459
459
  "molecule3d.input.clickBackground": "Den Hintergrund anklicken",
460
460
  "molecule3d.helpNote": "Die Tasten wirken, solange der Zeiger über dem Molekül ist. Auf dem Mac ist Ctrl die Control-Taste, nicht ⌘. Bei eingeschaltetem Messwerkzeug wählt ein Klick ein Atom.",
461
461
  "number.increment": "Erhöhen",
462
- "number.decrement": "Verringern"
462
+ "number.decrement": "Verringern",
463
+ "range.lowest": "{label}, Minimum",
464
+ "range.highest": "{label}, Maximum",
465
+ "range.lowestIs": "{label}, Minimum: {value}",
466
+ "range.highestIs": "{label}, Maximum: {value}",
467
+ "range.noLowerBound": "{label}: keine Untergrenze",
468
+ "range.noUpperBound": "{label}: keine Obergrenze",
469
+ "range.typeValue": "Klicken, um einen Wert einzugeben",
470
+ "range.clear": "{label} zurücksetzen"
463
471
  }
@@ -459,5 +459,13 @@
459
459
  "conformers.strategyDetail.likely-systematic": "Walks the torsion combinations in decreasing likelihood, so the first conformers are the most probable ones and the set is reproducible.",
460
460
  "conformers.minimisation.none": "None (no energies)",
461
461
  "number.increment": "Increase",
462
- "number.decrement": "Decrease"
462
+ "number.decrement": "Decrease",
463
+ "range.lowest": "{label}, lowest",
464
+ "range.highest": "{label}, highest",
465
+ "range.lowestIs": "{label}, lowest: {value}",
466
+ "range.highestIs": "{label}, highest: {value}",
467
+ "range.noLowerBound": "{label}: no lower bound",
468
+ "range.noUpperBound": "{label}: no upper bound",
469
+ "range.typeValue": "Click to type a value",
470
+ "range.clear": "Clear {label}"
463
471
  }
@@ -459,5 +459,13 @@
459
459
  "molecule3d.input.clickBackground": "Hacer clic en el fondo",
460
460
  "molecule3d.helpNote": "Las teclas actúan mientras el puntero está sobre la molécula. En un Mac, Ctrl es la tecla Control, no ⌘. Con una herramienta de medida activa, un clic elige un átomo.",
461
461
  "number.increment": "Aumentar",
462
- "number.decrement": "Disminuir"
462
+ "number.decrement": "Disminuir",
463
+ "range.lowest": "{label}, mínimo",
464
+ "range.highest": "{label}, máximo",
465
+ "range.lowestIs": "{label}, mínimo: {value}",
466
+ "range.highestIs": "{label}, máximo: {value}",
467
+ "range.noLowerBound": "{label}: sin límite inferior",
468
+ "range.noUpperBound": "{label}: sin límite superior",
469
+ "range.typeValue": "Haga clic para escribir un valor",
470
+ "range.clear": "Borrar {label}"
463
471
  }
@@ -459,5 +459,13 @@
459
459
  "molecule3d.input.clickBackground": "Cliquer le fond",
460
460
  "molecule3d.helpNote": "Les touches agissent tant que le pointeur est sur la molécule. Sur un Mac, Ctrl est la touche Contrôle, pas ⌘. Avec un outil de mesure actif, un clic choisit un atome.",
461
461
  "number.increment": "Augmenter",
462
- "number.decrement": "Diminuer"
462
+ "number.decrement": "Diminuer",
463
+ "range.lowest": "{label}, minimum",
464
+ "range.highest": "{label}, maximum",
465
+ "range.lowestIs": "{label}, minimum : {value}",
466
+ "range.highestIs": "{label}, maximum : {value}",
467
+ "range.noLowerBound": "{label} : pas de borne inférieure",
468
+ "range.noUpperBound": "{label} : pas de borne supérieure",
469
+ "range.typeValue": "Cliquer pour saisir une valeur",
470
+ "range.clear": "Effacer {label}"
463
471
  }
@@ -459,5 +459,13 @@
459
459
  "conformers.strategyDetail.likely-systematic": "Percorre le combinazioni di torsioni per probabilità decrescente, così i primi conformeri sono i più probabili e l'insieme è riproducibile.",
460
460
  "conformers.minimisation.none": "Nessuna (senza energie)",
461
461
  "number.increment": "Aumenta",
462
- "number.decrement": "Diminuisci"
462
+ "number.decrement": "Diminuisci",
463
+ "range.lowest": "{label}, minimo",
464
+ "range.highest": "{label}, massimo",
465
+ "range.lowestIs": "{label}, minimo: {value}",
466
+ "range.highestIs": "{label}, massimo: {value}",
467
+ "range.noLowerBound": "{label}: nessun limite inferiore",
468
+ "range.noUpperBound": "{label}: nessun limite superiore",
469
+ "range.typeValue": "Fai clic per inserire un valore",
470
+ "range.clear": "Cancella {label}"
463
471
  }
@@ -1,2 +1,2 @@
1
- export { isPartialNumber, numberText, readNumber, stepNumber, } from './numberText.ts';
1
+ export { isPartialNumber, numberText, readNumber, snapToStep, stepNumber, } from './numberText.ts';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/number/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/number/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,iBAAiB,CAAC"}
@@ -1,2 +1,2 @@
1
- export { isPartialNumber, numberText, readNumber, stepNumber, } from "./numberText.js";
1
+ export { isPartialNumber, numberText, readNumber, snapToStep, stepNumber, } from "./numberText.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/number/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/number/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,iBAAiB,CAAC"}
@@ -43,4 +43,17 @@ export declare function numberText(value: number | undefined): string;
43
43
  * @returns The number the box moves to.
44
44
  */
45
45
  export declare function stepNumber(value: number, delta: number): number;
46
+ /**
47
+ * A number moved onto the grid of steps laid from an origin.
48
+ *
49
+ * Rounded to the decimals the step and the origin carry, for the reason
50
+ * {@link stepNumber} is: a slider dragged in steps of `0.1` must report `0.3`,
51
+ * because that is what ends up written in the link.
52
+ * @param value - Where the number is now.
53
+ * @param step - The spacing of the grid. A step that is not above zero leaves
54
+ * the number where it is.
55
+ * @param origin - A point the grid passes through. Defaults to `0`.
56
+ * @returns The grid point nearest the number.
57
+ */
58
+ export declare function snapToStep(value: number, step: number, origin?: number): number;
46
59
  //# sourceMappingURL=numberText.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"numberText.d.ts","sourceRoot":"","sources":["../../../src/number/core/numberText.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,GAAG,SAAS,CAO5E;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/D"}
1
+ {"version":3,"file":"numberText.d.ts","sourceRoot":"","sources":["../../../src/number/core/numberText.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,GAAG,SAAS,CAO5E;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,CAM1E"}
@@ -73,6 +73,26 @@ export function stepNumber(value, delta) {
73
73
  const factor = 10 ** decimals;
74
74
  return Math.round(moved * factor) / factor;
75
75
  }
76
+ /**
77
+ * A number moved onto the grid of steps laid from an origin.
78
+ *
79
+ * Rounded to the decimals the step and the origin carry, for the reason
80
+ * {@link stepNumber} is: a slider dragged in steps of `0.1` must report `0.3`,
81
+ * because that is what ends up written in the link.
82
+ * @param value - Where the number is now.
83
+ * @param step - The spacing of the grid. A step that is not above zero leaves
84
+ * the number where it is.
85
+ * @param origin - A point the grid passes through. Defaults to `0`.
86
+ * @returns The grid point nearest the number.
87
+ */
88
+ export function snapToStep(value, step, origin = 0) {
89
+ if (!(step > 0) || !Number.isFinite(value))
90
+ return value;
91
+ const snapped = origin + Math.round((value - origin) / step) * step;
92
+ const decimals = Math.max(decimalsOf(step), decimalsOf(origin));
93
+ const factor = 10 ** decimals;
94
+ return Math.round(snapped * factor) / factor;
95
+ }
76
96
  /**
77
97
  * How many decimals a number is written with.
78
98
  * @param value - The number.
@@ -1 +1 @@
1
- {"version":3,"file":"numberText.js","sourceRoot":"","sources":["../../../src/number/core/numberText.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wDAAwD;AACxD,MAAM,MAAM,GAAG,+CAA+C,CAAC;AAE/D,0EAA0E;AAC1E,MAAM,OAAO,GAAG,+CAA+C,CAAC;AAEhE,yEAAyE;AACzE,MAAM,IAAI,GAAG,SAAS,CAAC;AAEvB,sEAAsE;AACtE,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAO,GAAG,KAAK;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,KAAa;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5B,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"numberText.js","sourceRoot":"","sources":["../../../src/number/core/numberText.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wDAAwD;AACxD,MAAM,MAAM,GAAG,+CAA+C,CAAC;AAE/D,0EAA0E;AAC1E,MAAM,OAAO,GAAG,+CAA+C,CAAC;AAEhE,yEAAyE;AACzE,MAAM,IAAI,GAAG,SAAS,CAAC;AAEvB,sEAAsE;AACtE,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAO,GAAG,KAAK;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,KAAa;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5B,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,IAAY,EAAE,MAAM,GAAG,CAAC;IAChE,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { RangeBounds, RangeDomain, RangeHandles } from './rangeBounds.ts';
2
+ export { OPEN_RANGE, isRangeBounded, isRangeDomain, movedRange, rangeHandles, sameRange, settleHandles, } from './rangeBounds.ts';
3
+ export { rangeHistogramPath } from './rangeHistogram.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/range/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,EACb,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { OPEN_RANGE, isRangeBounded, isRangeDomain, movedRange, rangeHandles, sameRange, settleHandles, } from "./rangeBounds.js";
2
+ export { rangeHistogramPath } from "./rangeHistogram.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/range/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,EACb,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * What a range filter keeps, and how its two handles map to it.
3
+ *
4
+ * A filter is two bounds, either of which may be left open. A handle parked at
5
+ * the end of the track is an open side rather than a bound at the track's end,
6
+ * because the track only covers the values the page knows about: a molecule
7
+ * heavier than the heaviest one in the statistics must not be cut by a filter
8
+ * nobody touched.
9
+ */
10
+ /** A lowest and a highest value kept, either of which may be left open. */
11
+ export interface RangeBounds {
12
+ /** The lowest value kept, or `null` when nothing is cut from below. */
13
+ readonly min: number | null;
14
+ /** The highest value kept, or `null` when nothing is cut from above. */
15
+ readonly max: number | null;
16
+ }
17
+ /** The two ends of a slider's track, low first. */
18
+ export type RangeDomain = readonly [number, number];
19
+ /** Where the two handles of a slider stand, low first. */
20
+ export type RangeHandles = readonly [number, number];
21
+ /** A range that keeps everything. */
22
+ export declare const OPEN_RANGE: RangeBounds;
23
+ /**
24
+ * Whether a range cuts anything at all.
25
+ * @param range - The range.
26
+ * @returns Whether either side carries a bound.
27
+ */
28
+ export declare function isRangeBounded(range: RangeBounds): boolean;
29
+ /**
30
+ * Whether two ranges keep the same values.
31
+ * @param left - One range.
32
+ * @param right - The other.
33
+ * @returns Whether both sides agree, an open side matching only an open side.
34
+ */
35
+ export declare function sameRange(left: RangeBounds, right: RangeBounds): boolean;
36
+ /**
37
+ * Whether a track can be drawn: two finite ends, the high one above the low.
38
+ * Statistics that have not arrived yet are usually a track of `[0, 0]`.
39
+ * @param domain - The two ends.
40
+ * @returns Whether a slider can be laid along it.
41
+ */
42
+ export declare function isRangeDomain(domain: RangeDomain): boolean;
43
+ /**
44
+ * Where the handles stand for a range: an open side at the end of the track,
45
+ * and a bound past the track held at its end.
46
+ * @param range - The range.
47
+ * @param domain - The track, already checked with {@link isRangeDomain}.
48
+ * @returns The two handle positions, low first.
49
+ */
50
+ export declare function rangeHandles(range: RangeBounds, domain: RangeDomain): RangeHandles;
51
+ /**
52
+ * The range two handles stand for once they have moved.
53
+ *
54
+ * Only a handle that moved changes its side. A bound past the end of the track
55
+ * sits at that end, and dragging the other handle must not turn it into an
56
+ * open side; a handle the reader took to the end of the track, on the other
57
+ * hand, opens its side.
58
+ * @param from - The range before the handles moved.
59
+ * @param handles - Where the handles are now.
60
+ * @param domain - The track.
61
+ * @returns The range the reader asked for.
62
+ */
63
+ export declare function movedRange(from: RangeBounds, handles: RangeHandles, domain: RangeDomain): RangeBounds;
64
+ /**
65
+ * Where handles settle while they are dragged: a moved handle onto the step
66
+ * grid laid from the low end of the track, an untouched one where it stood.
67
+ *
68
+ * Snapping the untouched handle too would move a bound the reader typed, say
69
+ * `1.23` on a track stepped by `0.5`, the moment the other handle is dragged.
70
+ * The ends of the track are kept even when they are off the grid, since an end
71
+ * is what opens a side.
72
+ * @param next - Where the slider reports the handles.
73
+ * @param from - The range before the drag started.
74
+ * @param step - The grid spacing.
75
+ * @param domain - The track.
76
+ * @returns The handle positions to draw and to report.
77
+ */
78
+ export declare function settleHandles(next: RangeHandles, from: RangeBounds, step: number, domain: RangeDomain): RangeHandles;
79
+ //# sourceMappingURL=rangeBounds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rangeBounds.d.ts","sourceRoot":"","sources":["../../../src/range/core/rangeBounds.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD,0DAA0D;AAC1D,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErD,qCAAqC;AACrC,eAAO,MAAM,UAAU,EAAE,WAAqD,CAAC;AAE/E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAExE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAG1D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,WAAW,GAClB,YAAY,CAKd;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,WAAW,GAClB,WAAW,CAQb;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,GAClB,YAAY,CAMd"}