react-cheminfo 0.15.0 → 0.17.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 (157) hide show
  1. package/README.md +96 -0
  2. package/lib/core.d.ts +1 -0
  3. package/lib/core.d.ts.map +1 -1
  4. package/lib/core.js +1 -0
  5. package/lib/core.js.map +1 -1
  6. package/lib/credits/core/credits.d.ts +17 -0
  7. package/lib/credits/core/credits.d.ts.map +1 -1
  8. package/lib/credits/core/credits.js +20 -0
  9. package/lib/credits/core/credits.js.map +1 -1
  10. package/lib/ecosystem/core/sites.d.ts.map +1 -1
  11. package/lib/ecosystem/core/sites.js +40 -0
  12. package/lib/ecosystem/core/sites.js.map +1 -1
  13. package/lib/ecosystem/core/types.d.ts +1 -1
  14. package/lib/ecosystem/core/types.d.ts.map +1 -1
  15. package/lib/ecosystem/ui/glyphs.d.ts.map +1 -1
  16. package/lib/ecosystem/ui/glyphs.js +11 -0
  17. package/lib/ecosystem/ui/glyphs.js.map +1 -1
  18. package/lib/parallel/core/index.d.ts +29 -0
  19. package/lib/parallel/core/index.d.ts.map +1 -0
  20. package/lib/parallel/core/index.js +22 -0
  21. package/lib/parallel/core/index.js.map +1 -0
  22. package/lib/parallel/core/parallelAxes.d.ts +103 -0
  23. package/lib/parallel/core/parallelAxes.d.ts.map +1 -0
  24. package/lib/parallel/core/parallelAxes.js +146 -0
  25. package/lib/parallel/core/parallelAxes.js.map +1 -0
  26. package/lib/parallel/core/parallelBrush.d.ts +100 -0
  27. package/lib/parallel/core/parallelBrush.d.ts.map +1 -0
  28. package/lib/parallel/core/parallelBrush.js +149 -0
  29. package/lib/parallel/core/parallelBrush.js.map +1 -0
  30. package/lib/parallel/core/parallelExtent.d.ts +28 -0
  31. package/lib/parallel/core/parallelExtent.d.ts.map +1 -0
  32. package/lib/parallel/core/parallelExtent.js +47 -0
  33. package/lib/parallel/core/parallelExtent.js.map +1 -0
  34. package/lib/parallel/core/parallelFilter.d.ts +49 -0
  35. package/lib/parallel/core/parallelFilter.d.ts.map +1 -0
  36. package/lib/parallel/core/parallelFilter.js +107 -0
  37. package/lib/parallel/core/parallelFilter.js.map +1 -0
  38. package/lib/parallel/core/parallelHit.d.ts +47 -0
  39. package/lib/parallel/core/parallelHit.d.ts.map +1 -0
  40. package/lib/parallel/core/parallelHit.js +81 -0
  41. package/lib/parallel/core/parallelHit.js.map +1 -0
  42. package/lib/parallel/core/parallelOrder.d.ts +36 -0
  43. package/lib/parallel/core/parallelOrder.d.ts.map +1 -0
  44. package/lib/parallel/core/parallelOrder.js +65 -0
  45. package/lib/parallel/core/parallelOrder.js.map +1 -0
  46. package/lib/parallel/core/parallelPaint.d.ts +108 -0
  47. package/lib/parallel/core/parallelPaint.d.ts.map +1 -0
  48. package/lib/parallel/core/parallelPaint.js +169 -0
  49. package/lib/parallel/core/parallelPaint.js.map +1 -0
  50. package/lib/parallel/core/parallelPalette.d.ts +40 -0
  51. package/lib/parallel/core/parallelPalette.d.ts.map +1 -0
  52. package/lib/parallel/core/parallelPalette.js +81 -0
  53. package/lib/parallel/core/parallelPalette.js.map +1 -0
  54. package/lib/parallel/core/parallelSelection.d.ts +43 -0
  55. package/lib/parallel/core/parallelSelection.d.ts.map +1 -0
  56. package/lib/parallel/core/parallelSelection.js +87 -0
  57. package/lib/parallel/core/parallelSelection.js.map +1 -0
  58. package/lib/parallel/core/parallelTicks.d.ts +34 -0
  59. package/lib/parallel/core/parallelTicks.d.ts.map +1 -0
  60. package/lib/parallel/core/parallelTicks.js +119 -0
  61. package/lib/parallel/core/parallelTicks.js.map +1 -0
  62. package/lib/parallel/core/parallelTypes.d.ts +140 -0
  63. package/lib/parallel/core/parallelTypes.d.ts.map +1 -0
  64. package/lib/parallel/core/parallelTypes.js +29 -0
  65. package/lib/parallel/core/parallelTypes.js.map +1 -0
  66. package/lib/parallel/ui/ParallelAxesLayer.d.ts +28 -0
  67. package/lib/parallel/ui/ParallelAxesLayer.d.ts.map +1 -0
  68. package/lib/parallel/ui/ParallelAxesLayer.js +29 -0
  69. package/lib/parallel/ui/ParallelAxesLayer.js.map +1 -0
  70. package/lib/parallel/ui/ParallelCoordinates.d.ts +21 -0
  71. package/lib/parallel/ui/ParallelCoordinates.d.ts.map +1 -0
  72. package/lib/parallel/ui/ParallelCoordinates.js +114 -0
  73. package/lib/parallel/ui/ParallelCoordinates.js.map +1 -0
  74. package/lib/parallel/ui/ParallelLabels.d.ts +32 -0
  75. package/lib/parallel/ui/ParallelLabels.d.ts.map +1 -0
  76. package/lib/parallel/ui/ParallelLabels.js +37 -0
  77. package/lib/parallel/ui/ParallelLabels.js.map +1 -0
  78. package/lib/parallel/ui/ParallelTooltip.d.ts +26 -0
  79. package/lib/parallel/ui/ParallelTooltip.d.ts.map +1 -0
  80. package/lib/parallel/ui/ParallelTooltip.js +30 -0
  81. package/lib/parallel/ui/ParallelTooltip.js.map +1 -0
  82. package/lib/parallel/ui/index.d.ts +29 -0
  83. package/lib/parallel/ui/index.d.ts.map +1 -0
  84. package/lib/parallel/ui/index.js +20 -0
  85. package/lib/parallel/ui/index.js.map +1 -0
  86. package/lib/parallel/ui/parallelCoordinatesProps.d.ts +203 -0
  87. package/lib/parallel/ui/parallelCoordinatesProps.d.ts.map +1 -0
  88. package/lib/parallel/ui/parallelCoordinatesProps.js +11 -0
  89. package/lib/parallel/ui/parallelCoordinatesProps.js.map +1 -0
  90. package/lib/parallel/ui/parallelGestureModel.d.ts +83 -0
  91. package/lib/parallel/ui/parallelGestureModel.d.ts.map +1 -0
  92. package/lib/parallel/ui/parallelGestureModel.js +110 -0
  93. package/lib/parallel/ui/parallelGestureModel.js.map +1 -0
  94. package/lib/parallel/ui/parallelInk.d.ts +76 -0
  95. package/lib/parallel/ui/parallelInk.d.ts.map +1 -0
  96. package/lib/parallel/ui/parallelInk.js +113 -0
  97. package/lib/parallel/ui/parallelInk.js.map +1 -0
  98. package/lib/parallel/ui/parallelPlotModel.d.ts +55 -0
  99. package/lib/parallel/ui/parallelPlotModel.d.ts.map +1 -0
  100. package/lib/parallel/ui/parallelPlotModel.js +113 -0
  101. package/lib/parallel/ui/parallelPlotModel.js.map +1 -0
  102. package/lib/parallel/ui/parallelStyles.d.ts +106 -0
  103. package/lib/parallel/ui/parallelStyles.d.ts.map +1 -0
  104. package/lib/parallel/ui/parallelStyles.js +153 -0
  105. package/lib/parallel/ui/parallelStyles.js.map +1 -0
  106. package/lib/parallel/ui/useParallelAxisDrag.d.ts +60 -0
  107. package/lib/parallel/ui/useParallelAxisDrag.d.ts.map +1 -0
  108. package/lib/parallel/ui/useParallelAxisDrag.js +96 -0
  109. package/lib/parallel/ui/useParallelAxisDrag.js.map +1 -0
  110. package/lib/parallel/ui/useParallelCanvas.d.ts +49 -0
  111. package/lib/parallel/ui/useParallelCanvas.d.ts.map +1 -0
  112. package/lib/parallel/ui/useParallelCanvas.js +58 -0
  113. package/lib/parallel/ui/useParallelCanvas.js.map +1 -0
  114. package/lib/parallel/ui/useParallelGesture.d.ts +72 -0
  115. package/lib/parallel/ui/useParallelGesture.d.ts.map +1 -0
  116. package/lib/parallel/ui/useParallelGesture.js +164 -0
  117. package/lib/parallel/ui/useParallelGesture.js.map +1 -0
  118. package/lib/structure/ui/useToolbarFloor.d.ts.map +1 -1
  119. package/lib/structure/ui/useToolbarFloor.js +29 -22
  120. package/lib/structure/ui/useToolbarFloor.js.map +1 -1
  121. package/lib/ui.d.ts +1 -0
  122. package/lib/ui.d.ts.map +1 -1
  123. package/lib/ui.js +1 -0
  124. package/lib/ui.js.map +1 -1
  125. package/package.json +1 -1
  126. package/src/core.ts +1 -0
  127. package/src/credits/core/credits.ts +21 -0
  128. package/src/ecosystem/core/sites.ts +40 -0
  129. package/src/ecosystem/core/types.ts +4 -1
  130. package/src/ecosystem/ui/glyphs.tsx +46 -0
  131. package/src/parallel/core/index.ts +96 -0
  132. package/src/parallel/core/parallelAxes.ts +207 -0
  133. package/src/parallel/core/parallelBrush.ts +211 -0
  134. package/src/parallel/core/parallelExtent.ts +56 -0
  135. package/src/parallel/core/parallelFilter.ts +131 -0
  136. package/src/parallel/core/parallelHit.ts +106 -0
  137. package/src/parallel/core/parallelOrder.ts +73 -0
  138. package/src/parallel/core/parallelPaint.ts +242 -0
  139. package/src/parallel/core/parallelPalette.ts +93 -0
  140. package/src/parallel/core/parallelSelection.ts +99 -0
  141. package/src/parallel/core/parallelTicks.ts +168 -0
  142. package/src/parallel/core/parallelTypes.ts +159 -0
  143. package/src/parallel/ui/ParallelAxesLayer.tsx +129 -0
  144. package/src/parallel/ui/ParallelCoordinates.tsx +252 -0
  145. package/src/parallel/ui/ParallelLabels.tsx +77 -0
  146. package/src/parallel/ui/ParallelTooltip.tsx +55 -0
  147. package/src/parallel/ui/index.ts +65 -0
  148. package/src/parallel/ui/parallelCoordinatesProps.ts +217 -0
  149. package/src/parallel/ui/parallelGestureModel.ts +159 -0
  150. package/src/parallel/ui/parallelInk.ts +182 -0
  151. package/src/parallel/ui/parallelPlotModel.ts +130 -0
  152. package/src/parallel/ui/parallelStyles.ts +188 -0
  153. package/src/parallel/ui/useParallelAxisDrag.ts +147 -0
  154. package/src/parallel/ui/useParallelCanvas.ts +104 -0
  155. package/src/parallel/ui/useParallelGesture.ts +260 -0
  156. package/src/structure/ui/useToolbarFloor.ts +27 -22
  157. package/src/ui.ts +1 -0
@@ -0,0 +1,164 @@
1
+ /**
2
+ * One pointer over the whole figure, serving both the brush and the hover.
3
+ *
4
+ * A hook cannot be called inside a `map`, so a brush per axis would have to
5
+ * live in refs and be attached by hand; one surface that works out from the
6
+ * press which axis was grabbed has no such problem, and it gives the hover
7
+ * search the same once-a-frame coalescing the drag already pays for.
8
+ *
9
+ * The band follows the pointer live and the interval is reported on release
10
+ * only: a table filtering on the reported interval is asked to re-render once
11
+ * per gesture rather than sixty times a second.
12
+ */
13
+ import { useMemo, useRef, useState } from 'react';
14
+ import { useCapturedPointer } from "../../scatter/ui/useCapturedPointer.js";
15
+ import { PARALLEL_MARGIN } from "../core/parallelAxes.js";
16
+ import { parallelBandAt, parallelBandOf, parallelBrushTarget, } from "../core/parallelBrush.js";
17
+ import { parallelNearestRow } from "../core/parallelHit.js";
18
+ import { parallelRangeList } from "../core/parallelSelection.js";
19
+ import { parallelAxisById, parallelAxisNear, parallelBandsOf, parallelCommitOf, parallelPointOf, } from "./parallelGestureModel.js";
20
+ /**
21
+ * The brush and the hover, over one surface.
22
+ * @param options - See {@link ParallelGestureOptions}.
23
+ * @returns The gesture. See {@link ParallelGesture}.
24
+ */
25
+ export function useParallelGesture(options) {
26
+ const { layouts, values, count, innerHeight, included, ranges } = options;
27
+ const { several = false } = options;
28
+ const { onRangeChange, onRangePreview, onHoverChange, onRowClick } = options;
29
+ const [draft, setDraft] = useState(null);
30
+ const [ownHovered, setOwnHovered] = useState(-1);
31
+ const [pointer, setPointer] = useState(null);
32
+ const hovered = options.hovered ?? ownHovered;
33
+ const dragRef = useRef(null);
34
+ const pointRef = useRef({ x: 0, y: 0 });
35
+ const reportedRef = useRef(-1);
36
+ const claimedRef = useRef(false);
37
+ function commit(drag, band) {
38
+ const layout = parallelAxisById(layouts, drag.axis);
39
+ if (layout === undefined)
40
+ return parallelRangeList(ranges[drag.axis]);
41
+ return parallelCommitOf({
42
+ list: parallelRangeList(ranges[drag.axis]),
43
+ index: drag.index,
44
+ band,
45
+ layout,
46
+ still: unmoved(drag, band),
47
+ several,
48
+ });
49
+ }
50
+ function report(index) {
51
+ if (index === reportedRef.current)
52
+ return;
53
+ reportedRef.current = index;
54
+ setOwnHovered(index);
55
+ onHoverChange?.(index);
56
+ }
57
+ function findRow(point) {
58
+ return parallelNearestRow(point, layouts, values, count, included ?? undefined);
59
+ }
60
+ function press(event) {
61
+ const point = parallelPointOf(event);
62
+ const index = parallelAxisNear(point.x, layouts);
63
+ const layout = layouts[index];
64
+ if (layout === undefined || point.y < 0 || point.y > innerHeight) {
65
+ claimedRef.current = false;
66
+ return false;
67
+ }
68
+ const list = parallelRangeList(ranges[layout.id]);
69
+ const bands = [];
70
+ for (const range of list)
71
+ bands.push(parallelBandOf(range, layout));
72
+ const target = parallelBrushTarget(point.y, bands);
73
+ const held = target.index === -1 ? undefined : bands[target.index];
74
+ const drag = {
75
+ axis: layout.id,
76
+ index: target.index,
77
+ grip: target.grip,
78
+ originY: point.y,
79
+ origin: held ?? { top: point.y, bottom: point.y },
80
+ };
81
+ dragRef.current = drag;
82
+ pointRef.current = point;
83
+ claimedRef.current = true;
84
+ setDraft({
85
+ axis: layout.id,
86
+ index: target.index,
87
+ band: parallelBandAt(drag, point.y, innerHeight),
88
+ });
89
+ return true;
90
+ }
91
+ function frame(claimed) {
92
+ const point = pointRef.current;
93
+ const drag = dragRef.current;
94
+ if (claimed && drag !== null) {
95
+ const band = parallelBandAt(drag, point.y, innerHeight);
96
+ setDraft({ axis: drag.axis, index: drag.index, band });
97
+ onRangePreview?.(drag.axis, commit(drag, band));
98
+ return;
99
+ }
100
+ setPointer({
101
+ x: point.x + PARALLEL_MARGIN.left,
102
+ y: point.y + PARALLEL_MARGIN.top,
103
+ });
104
+ report(findRow(point));
105
+ }
106
+ function release(event, keep) {
107
+ const drag = dragRef.current;
108
+ dragRef.current = null;
109
+ setDraft(null);
110
+ if (drag === null)
111
+ return;
112
+ if (event !== null)
113
+ pointRef.current = parallelPointOf(event);
114
+ if (!keep) {
115
+ onRangePreview?.(drag.axis, parallelRangeList(ranges[drag.axis]));
116
+ return;
117
+ }
118
+ const kept = commit(drag, parallelBandAt(drag, pointRef.current.y, innerHeight));
119
+ onRangePreview?.(drag.axis, kept);
120
+ onRangeChange(drag.axis, kept);
121
+ }
122
+ const { surface } = useCapturedPointer({
123
+ touch: false,
124
+ cursor: 'crosshair',
125
+ onPress: press,
126
+ onMove: (event) => {
127
+ pointRef.current = parallelPointOf(event);
128
+ return true;
129
+ },
130
+ onFrame: frame,
131
+ onRelease: release,
132
+ onLeave: () => {
133
+ setPointer(null);
134
+ report(-1);
135
+ },
136
+ });
137
+ const bands = useMemo(() => parallelBandsOf(layouts, ranges, draft), [layouts, ranges, draft]);
138
+ function handleClick(event) {
139
+ if (claimedRef.current || onRowClick === undefined)
140
+ return;
141
+ onRowClick(findRow(parallelPointOf(event)));
142
+ }
143
+ return {
144
+ surface,
145
+ onClick: handleClick,
146
+ bands,
147
+ hovered,
148
+ pointer,
149
+ brushing: draft !== null,
150
+ };
151
+ }
152
+ /**
153
+ * Whether a press took hold of an interval and let it go where it found it,
154
+ * which is a click on that interval rather than a move of it.
155
+ * @param drag - The drag, as it began.
156
+ * @param band - The band as the pointer left it.
157
+ * @returns Whether nothing moved.
158
+ */
159
+ function unmoved(drag, band) {
160
+ return (drag.index !== -1 &&
161
+ band.top === drag.origin.top &&
162
+ band.bottom === drag.origin.bottom);
163
+ }
164
+ //# sourceMappingURL=useParallelGesture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useParallelGesture.js","sourceRoot":"","sources":["../../../src/parallel/ui/useParallelGesture.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useToolbarFloor.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/useToolbarFloor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,GAAE,mBAAwB,GAChC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAyClC"}
1
+ {"version":3,"file":"useToolbarFloor.d.ts","sourceRoot":"","sources":["../../../src/structure/ui/useToolbarFloor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,GAAE,mBAAwB,GAChC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAiDlC"}
@@ -16,40 +16,47 @@ export function useToolbarFloor(options = {}) {
16
16
  const container = containerRef.current;
17
17
  if (container === null)
18
18
  return;
19
- let observer = null;
20
- let frame = 0;
21
- let attempts = 0;
22
- // The editor builds itself asynchronously, so the toolbar is usually not
23
- // there yet on the first look; watching for it is what keeps a slow first
24
- // paint from leaving the container at its unmeasured height for good.
19
+ let toolbar = null;
20
+ let size = null;
25
21
  const attach = () => {
26
- const toolbar = findToolbar(container);
27
- if (toolbar === null) {
28
- attempts++;
29
- if (attempts > MAX_ATTEMPTS)
30
- return;
31
- frame = globalThis.requestAnimationFrame(attach);
22
+ const found = findToolbar(container);
23
+ if (found === null)
32
24
  return;
33
- }
34
- observer = new ResizeObserver(() => {
25
+ size?.disconnect();
26
+ toolbar = found;
27
+ size = new ResizeObserver(() => {
35
28
  // offsetHeight, because a dialog opens under a scaling transform and a
36
29
  // measured rectangle would be that of the half drawn toolbar.
37
- const floor = toolbarFloorHeight(toolbar.offsetHeight, minHeight);
38
- container.style.minHeight = `${floor}px`;
30
+ const height = found.offsetHeight;
31
+ // Zero is a toolbar being torn down or not yet laid out, never a
32
+ // toolbar that needs no room: writing the fallback for it would undo a
33
+ // correct floor and leave the palette cut off.
34
+ if (height === 0)
35
+ return;
36
+ container.style.minHeight = `${toolbarFloorHeight(height, minHeight)}px`;
39
37
  });
40
- observer.observe(toolbar);
38
+ size.observe(found);
41
39
  };
40
+ // The editor is imported lazily and builds itself asynchronously, so it is
41
+ // almost never there on the first look, and how long it takes is a cold
42
+ // module graph and a network away from anything this code can predict. So
43
+ // the arrival is watched for rather than waited out: a deadline that
44
+ // expires leaves the toolbar cut off for the life of the page, with
45
+ // nothing on screen to say why.
46
+ const arrivals = new MutationObserver(() => {
47
+ if (toolbar?.isConnected === true)
48
+ return;
49
+ attach();
50
+ });
51
+ arrivals.observe(container, { childList: true, subtree: true });
42
52
  attach();
43
53
  return () => {
44
- if (frame !== 0)
45
- globalThis.cancelAnimationFrame(frame);
46
- observer?.disconnect();
54
+ arrivals.disconnect();
55
+ size?.disconnect();
47
56
  };
48
57
  }, [minHeight, revision]);
49
58
  return containerRef;
50
59
  }
51
- /** Roughly two seconds of frames, after which the editor is not coming. */
52
- const MAX_ATTEMPTS = 120;
53
60
  /**
54
61
  * Find the toolbar canvas of the editor.
55
62
  *
@@ -1 +1 @@
1
- {"version":3,"file":"useToolbarFloor.js","sourceRoot":"","sources":["../../../src/structure/ui/useToolbarFloor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAkB7D;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,UAA+B,EAAE;IAEjC,MAAM,EAAE,SAAS,GAAG,GAAG,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAElD,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO;QAE/B,IAAI,QAAQ,GAA0B,IAAI,CAAC;QAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,yEAAyE;QACzE,0EAA0E;QAC1E,sEAAsE;QACtE,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,QAAQ,EAAE,CAAC;gBACX,IAAI,QAAQ,GAAG,YAAY;oBAAE,OAAO;gBACpC,KAAK,GAAG,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YACD,QAAQ,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE;gBACjC,uEAAuE;gBACvE,8DAA8D;gBAC9D,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;gBAClE,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,KAAK,IAAI,CAAC;YAC3C,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,MAAM,EAAE,CAAC;QAET,OAAO,GAAG,EAAE;YACV,IAAI,KAAK,KAAK,CAAC;gBAAE,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACxD,QAAQ,EAAE,UAAU,EAAE,CAAC;QACzB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,2EAA2E;AAC3E,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,SAAsB;IACzC,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;YACvD,IAAI,KAAK,YAAY,iBAAiB;gBAAE,OAAO,KAAK,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"useToolbarFloor.js","sourceRoot":"","sources":["../../../src/structure/ui/useToolbarFloor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAkB7D;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,UAA+B,EAAE;IAEjC,MAAM,EAAE,SAAS,GAAG,GAAG,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAElD,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO;QAE/B,IAAI,OAAO,GAA6B,IAAI,CAAC;QAC7C,IAAI,IAAI,GAA0B,IAAI,CAAC;QAEvC,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO;YAC3B,IAAI,EAAE,UAAU,EAAE,CAAC;YACnB,OAAO,GAAG,KAAK,CAAC;YAChB,IAAI,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE;gBAC7B,uEAAuE;gBACvE,8DAA8D;gBAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;gBAClC,iEAAiE;gBACjE,uEAAuE;gBACvE,+CAA+C;gBAC/C,IAAI,MAAM,KAAK,CAAC;oBAAE,OAAO;gBACzB,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC;YAC3E,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,2EAA2E;QAC3E,wEAAwE;QACxE,0EAA0E;QAC1E,qEAAqE;QACrE,oEAAoE;QACpE,gCAAgC;QAChC,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;YACzC,IAAI,OAAO,EAAE,WAAW,KAAK,IAAI;gBAAE,OAAO;YAC1C,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,EAAE,CAAC;QAET,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,EAAE,UAAU,EAAE,CAAC;QACrB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,SAAsB;IACzC,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;YACvD,IAAI,KAAK,YAAY,iBAAiB;gBAAE,OAAO,KAAK,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/lib/ui.d.ts CHANGED
@@ -15,6 +15,7 @@ export * from './error/ui/index.ts';
15
15
  export * from './help/ui/index.ts';
16
16
  export * from './hooks/ui/index.ts';
17
17
  export * from './overlay/ui/index.ts';
18
+ export * from './parallel/ui/index.ts';
18
19
  export * from './pedagogy/ui/index.ts';
19
20
  export * from './periodic/ui/index.ts';
20
21
  export * from './projection/ui/index.ts';
package/lib/ui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
package/lib/ui.js CHANGED
@@ -15,6 +15,7 @@ export * from "./error/ui/index.js";
15
15
  export * from "./help/ui/index.js";
16
16
  export * from "./hooks/ui/index.js";
17
17
  export * from "./overlay/ui/index.js";
18
+ export * from "./parallel/ui/index.js";
18
19
  export * from "./pedagogy/ui/index.js";
19
20
  export * from "./periodic/ui/index.js";
20
21
  export * from "./projection/ui/index.js";
package/lib/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-cheminfo",
3
- "version": "0.15.0",
3
+ "version": "0.17.0",
4
4
  "license": "MIT",
5
5
  "description": "React components, hooks and framework-free helpers shared by the cheminfo sites: site chrome, citations, sharing, routing, pedagogy, charts, and the structure, orbital and 3D molecule viewers",
6
6
  "author": "Luc Patiny",
package/src/core.ts CHANGED
@@ -12,6 +12,7 @@ export * from './error/core/index.ts';
12
12
  export * from './format/core/index.ts';
13
13
  export * from './orbital/core/index.ts';
14
14
  export * from './overlay/core/index.ts';
15
+ export * from './parallel/core/index.ts';
15
16
  export * from './pedagogy/core/index.ts';
16
17
  export * from './periodic/core/index.ts';
17
18
  export * from './projection/core/index.ts';
@@ -77,6 +77,13 @@ export const CREDITS = [
77
77
  description: 'the structure helpers built on top of OpenChemLib.',
78
78
  license: 'MIT',
79
79
  },
80
+ {
81
+ id: 'osiris-property-explorer',
82
+ name: 'OSIRIS Property Explorer',
83
+ href: 'https://www.organic-chemistry.org/prog/peo/',
84
+ description:
85
+ 'the original toxicity and property predictions, by Thomas Sander at Actelion, now Idorsia.',
86
+ },
80
87
  {
81
88
  id: 'react-ocl',
82
89
  name: 'react-ocl',
@@ -115,6 +122,20 @@ export const CREDITS = [
115
122
  description: 'the linear algebra behind the numbers on the page.',
116
123
  license: 'MIT',
117
124
  },
125
+ {
126
+ id: 'ml-xsadd',
127
+ name: 'ml-xsadd',
128
+ href: 'https://github.com/mljs/xsadd',
129
+ description: 'the seeded generator a reproducible series is drawn from.',
130
+ license: 'MIT',
131
+ },
132
+ {
133
+ id: 'cif-to-json',
134
+ name: 'cif-to-json',
135
+ href: 'https://github.com/cheminfo/cif-to-json',
136
+ description: 'the reader that turns a crystallographic file into data.',
137
+ license: 'MIT',
138
+ },
118
139
  {
119
140
  id: 'ml-spectra-processing',
120
141
  name: 'ml-spectra-processing',
@@ -79,6 +79,19 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
79
79
  brandAlt: '#d63384',
80
80
  mark: { plate: '#5b52e0', accent: '#ff8ac2' },
81
81
  },
82
+ {
83
+ id: 'dbe',
84
+ name: { lead: 'dbe', alt: 'cheminfo', dot: true },
85
+ host: 'dbe.cheminfo.org',
86
+ repository: 'https://github.com/cheminfo/dbe.cheminfo.org',
87
+ tagline: 'Count rings and double bonds from a formula or a structure.',
88
+ group: 'basics',
89
+ brand: '#63123f',
90
+ // The emerald the mark's double bond is drawn in sits at 2.5:1 on white,
91
+ // so the second half of the wordmark takes this darkened form instead.
92
+ brandAlt: '#047857',
93
+ mark: { plate: '#63123f', accent: '#10b981' },
94
+ },
82
95
  {
83
96
  id: 'nmrium',
84
97
  name: { lead: 'NMR', alt: 'ium' },
@@ -236,6 +249,33 @@ export const ECOSYSTEM_SITES: readonly EcosystemSite[] = [
236
249
  brandAlt: '#0b6e85',
237
250
  mark: { plate: '#7c2d12', accent: '#06b6d4' },
238
251
  },
252
+ {
253
+ id: 'symmetry',
254
+ name: { lead: 'Symme', alt: 'Try' },
255
+ host: 'symmetry.cheminfo.org',
256
+ repository: 'https://github.com/cheminfo/symmetry.cheminfo.org',
257
+ tagline: 'Find the symmetry of a molecule, a crystal or a pattern.',
258
+ group: 'basics',
259
+ brand: '#9f1239',
260
+ // The gold that carries the apex of the mark sits at 2.2:1 on white, so
261
+ // the second half of the wordmark takes this darkened amber instead.
262
+ brandAlt: '#b45309',
263
+ mark: { plate: '#9f1239', accent: '#f59e0b' },
264
+ },
265
+ {
266
+ id: 'osiris',
267
+ name: { lead: 'osiris', alt: 'cheminfo', dot: true },
268
+ host: 'osiris.cheminfo.org',
269
+ repository: 'https://github.com/cheminfo/osiris.cheminfo.org',
270
+ tagline: 'Predicted toxicity risks and properties, one molecule or many.',
271
+ group: 'research',
272
+ brand: '#854d0e',
273
+ // The lapis and the gold are equiluminant — 1.02:1 against each other — so
274
+ // the mark draws the same blue lightened, and this darkened form is what
275
+ // the second half of the wordmark is set in.
276
+ brandAlt: '#1d4ed8',
277
+ mark: { plate: '#854d0e', accent: '#60a5fa' },
278
+ },
239
279
  ];
240
280
 
241
281
  /**
@@ -8,6 +8,7 @@ export type SiteId =
8
8
  | 'smiles'
9
9
  | 'openbabel'
10
10
  | 'chemcalc'
11
+ | 'dbe'
11
12
  | 'nmrium'
12
13
  | 'metabo'
13
14
  | 'derepflow'
@@ -21,7 +22,9 @@ export type SiteId =
21
22
  | 'polycarp'
22
23
  | '3d'
23
24
  | 'periodic-table'
24
- | 'database';
25
+ | 'database'
26
+ | 'symmetry'
27
+ | 'osiris';
25
28
 
26
29
  /** A site's name, split the way its own wordmark splits it. */
27
30
  export interface SiteName {
@@ -129,6 +129,18 @@ export const GLYPHS: Record<SiteId, (alt: string) => ReactNode> = {
129
129
  <path d="M23 24V18" stroke="#ffffff" />
130
130
  </g>
131
131
  ),
132
+ // A ring with a double bond drawn inside it: the two things a DBE adds up,
133
+ // and the equals sign the E of the name already is.
134
+ dbe: (alt) => (
135
+ <g fill="none" strokeLinecap="round" strokeLinejoin="round">
136
+ <path
137
+ d="M16 5 25.53 10.5 25.53 21.5 16 27 6.47 21.5 6.47 10.5Z"
138
+ stroke="#ffffff"
139
+ strokeWidth="2.4"
140
+ />
141
+ <path d="M10.8 12.9h10.4M10.8 19.1h10.4" stroke={alt} strokeWidth="2.9" />
142
+ </g>
143
+ ),
132
144
  // The ring and the substituent dots of the DerepFlow logo do not survive
133
145
  // 16 px, so the mark keeps the two elements that carry its meaning: the
134
146
  // compound, and the tick that says it has been identified.
@@ -363,4 +375,38 @@ export const GLYPHS: Record<SiteId, (alt: string) => ReactNode> = {
363
375
  <ellipse cx="16" cy="9.4" rx="10.2" ry="3.9" fill={alt} />
364
376
  </>
365
377
  ),
378
+ // A tetrahedron seen from slightly above, four balls at its corners: the
379
+ // first shape a chemist meets symmetry in. The apex carries the answering
380
+ // colour, which is also the C3 axis every base triangle turns about.
381
+ symmetry: (alt) => (
382
+ <>
383
+ <g stroke="#ffffff" strokeWidth="1.8" strokeLinecap="round" fill="none">
384
+ <path d="M16 6.4 6.6 24.4M16 6.4 25.4 24.4M16 6.4 16 17.6" />
385
+ <path d="M6.6 24.4 25.4 24.4" />
386
+ <path d="M6.6 24.4 16 17.6M25.4 24.4 16 17.6" opacity="0.5" />
387
+ </g>
388
+ <circle cx="16" cy="17.6" r="2.5" fill="#ffffff" opacity="0.55" />
389
+ <circle cx="6.6" cy="24.4" r="3.2" fill="#ffffff" />
390
+ <circle cx="25.4" cy="24.4" r="3.2" fill="#ffffff" />
391
+ <circle cx="16" cy="6.4" r="3.6" fill={alt} />
392
+ </>
393
+ ),
394
+ // Three axes with one line crossing them: a parallel-coordinates plot, which
395
+ // is how this site reads a set of molecules against one another. The line
396
+ // carries the answering colour because the line is the molecule.
397
+ osiris: (alt) => (
398
+ <>
399
+ <g stroke="#ffffff" strokeWidth="2.2" strokeLinecap="round" fill="none">
400
+ <path d="M7.4 6.8V25.2M16 6.8V25.2M24.6 6.8V25.2" />
401
+ </g>
402
+ <path
403
+ d="M7.4 21.6 16 10.4 24.6 17.2"
404
+ fill="none"
405
+ stroke={alt}
406
+ strokeWidth="3.2"
407
+ strokeLinecap="round"
408
+ strokeLinejoin="round"
409
+ />
410
+ </>
411
+ ),
366
412
  };
@@ -0,0 +1,96 @@
1
+ /**
2
+ * What a parallel-coordinates figure has to work out before it can draw: where
3
+ * each axis stands, how a value on it becomes a pixel, which row the pointer
4
+ * is over, which rows the brushes keep, and the canvas pass that paints them.
5
+ *
6
+ * The brush is the part worth reading twice. It is a pure function of a press
7
+ * and a pointer rather than a behaviour attached to an element, so every one
8
+ * of its four gestures — create, move, resize from either edge, clear — is
9
+ * covered by tests in a runtime with no DOM, and the figure stays declarative.
10
+ */
11
+
12
+ export type { ParallelAxisLayout, ParallelAxisPixels } from './parallelAxes.ts';
13
+ export {
14
+ PARALLEL_MARGIN,
15
+ parallelAxisLayouts,
16
+ parallelAxisPixels,
17
+ parallelPixelAt,
18
+ parallelValueToY,
19
+ parallelYToValue,
20
+ } from './parallelAxes.ts';
21
+ export type {
22
+ ParallelBand,
23
+ ParallelBrushDrag,
24
+ ParallelBrushGrip,
25
+ ParallelBrushTarget,
26
+ } from './parallelBrush.ts';
27
+ export {
28
+ PARALLEL_BRUSH_HALF_WIDTH,
29
+ PARALLEL_BRUSH_HANDLE_REACH,
30
+ PARALLEL_BRUSH_SMALLEST,
31
+ parallelBandAt,
32
+ parallelBandOf,
33
+ parallelBrushGrip,
34
+ parallelBrushTarget,
35
+ parallelIsBand,
36
+ parallelRangeOf,
37
+ } from './parallelBrush.ts';
38
+ export type { ParallelExtent } from './parallelExtent.ts';
39
+ export {
40
+ PARALLEL_DEGENERATE_PADDING,
41
+ parallelExtent,
42
+ } from './parallelExtent.ts';
43
+ export {
44
+ parallelIncludedMask,
45
+ parallelKeptCount,
46
+ parallelRangeKeeps,
47
+ parallelSelectionKeeps,
48
+ } from './parallelFilter.ts';
49
+ export type { ParallelPoint, ParallelSegment } from './parallelHit.ts';
50
+ export {
51
+ PARALLEL_HOVER_TOLERANCE,
52
+ parallelNearestRow,
53
+ parallelSegmentAt,
54
+ } from './parallelHit.ts';
55
+ export {
56
+ parallelAxisOrder,
57
+ parallelDropIndex,
58
+ parallelMoveAxis,
59
+ } from './parallelOrder.ts';
60
+ export type {
61
+ ParallelHighlight,
62
+ ParallelHighlightPaint,
63
+ ParallelPaint,
64
+ } from './parallelPaint.ts';
65
+ export {
66
+ PARALLEL_INCLUDED_ALPHA,
67
+ paintParallelHighlights,
68
+ paintParallelLines,
69
+ preparePlotCanvas,
70
+ traceParallelRow,
71
+ } from './parallelPaint.ts';
72
+ export {
73
+ PARALLEL_PALETTE_STEPS,
74
+ PARALLEL_PALETTE_UNKNOWN,
75
+ parallelColorSteps,
76
+ parallelPalette,
77
+ } from './parallelPalette.ts';
78
+ export {
79
+ parallelHasRange,
80
+ parallelMergeRanges,
81
+ parallelRangeList,
82
+ parallelWriteRange,
83
+ } from './parallelSelection.ts';
84
+ export type { ParallelGraduation } from './parallelTicks.ts';
85
+ export { PARALLEL_TICK_COUNT, parallelTicks } from './parallelTicks.ts';
86
+ export type {
87
+ ParallelAxis,
88
+ ParallelAxisScale,
89
+ ParallelAxisSource,
90
+ ParallelColorBy,
91
+ ParallelRange,
92
+ ParallelRanges,
93
+ ParallelSelection,
94
+ ParallelTick,
95
+ } from './parallelTypes.ts';
96
+ export { parallelAxisOf } from './parallelTypes.ts';