react-cheminfo 0.22.0 → 0.23.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 (206) hide show
  1. package/README.md +13 -3
  2. package/lib/overlay/core/index.d.ts +2 -2
  3. package/lib/overlay/core/index.d.ts.map +1 -1
  4. package/lib/overlay/core/index.js +1 -1
  5. package/lib/overlay/core/index.js.map +1 -1
  6. package/lib/overlay/core/overlayMarks.d.ts +20 -5
  7. package/lib/overlay/core/overlayMarks.d.ts.map +1 -1
  8. package/lib/overlay/core/overlayMarks.js +31 -5
  9. package/lib/overlay/core/overlayMarks.js.map +1 -1
  10. package/lib/overlay/ui/OverlayLegendMark.js +5 -0
  11. package/lib/overlay/ui/OverlayLegendMark.js.map +1 -1
  12. package/lib/projection/core/index.d.ts +4 -4
  13. package/lib/projection/core/index.d.ts.map +1 -1
  14. package/lib/projection/core/index.js +2 -2
  15. package/lib/projection/core/index.js.map +1 -1
  16. package/lib/projection/core/projectionCopy.d.ts +2 -0
  17. package/lib/projection/core/projectionCopy.d.ts.map +1 -1
  18. package/lib/projection/core/projectionCopy.js +1 -0
  19. package/lib/projection/core/projectionCopy.js.map +1 -1
  20. package/lib/projection/core/projectionGroupings.d.ts +44 -0
  21. package/lib/projection/core/projectionGroupings.d.ts.map +1 -0
  22. package/lib/projection/core/projectionGroupings.js +132 -0
  23. package/lib/projection/core/projectionGroupings.js.map +1 -0
  24. package/lib/projection/core/projectionOptions.d.ts +16 -6
  25. package/lib/projection/core/projectionOptions.d.ts.map +1 -1
  26. package/lib/projection/core/projectionOptions.js +7 -1
  27. package/lib/projection/core/projectionOptions.js.map +1 -1
  28. package/lib/projection/core/projectionPanelWords.d.ts +6 -0
  29. package/lib/projection/core/projectionPanelWords.d.ts.map +1 -1
  30. package/lib/projection/core/projectionPanelWords.js +4 -0
  31. package/lib/projection/core/projectionPanelWords.js.map +1 -1
  32. package/lib/projection/core/projectionSamples.d.ts +63 -32
  33. package/lib/projection/core/projectionSamples.d.ts.map +1 -1
  34. package/lib/projection/core/projectionSamples.js +1 -80
  35. package/lib/projection/core/projectionSamples.js.map +1 -1
  36. package/lib/projection/core/projectionStrings.d.ts +2 -0
  37. package/lib/projection/core/projectionStrings.d.ts.map +1 -1
  38. package/lib/projection/core/projectionStrings.js +10 -1
  39. package/lib/projection/core/projectionStrings.js.map +1 -1
  40. package/lib/projection/core/resolveProjectionOptions.d.ts +8 -3
  41. package/lib/projection/core/resolveProjectionOptions.d.ts.map +1 -1
  42. package/lib/projection/core/resolveProjectionOptions.js +58 -5
  43. package/lib/projection/core/resolveProjectionOptions.js.map +1 -1
  44. package/lib/projection/ui/ProjectionBar.d.ts +1 -1
  45. package/lib/projection/ui/ProjectionBar.d.ts.map +1 -1
  46. package/lib/projection/ui/ProjectionBar.js +3 -1
  47. package/lib/projection/ui/ProjectionBar.js.map +1 -1
  48. package/lib/projection/ui/ProjectionGroupingPickers.d.ts +38 -0
  49. package/lib/projection/ui/ProjectionGroupingPickers.d.ts.map +1 -0
  50. package/lib/projection/ui/ProjectionGroupingPickers.js +33 -0
  51. package/lib/projection/ui/ProjectionGroupingPickers.js.map +1 -0
  52. package/lib/projection/ui/ProjectionMapControls.d.ts +6 -7
  53. package/lib/projection/ui/ProjectionMapControls.d.ts.map +1 -1
  54. package/lib/projection/ui/ProjectionMapControls.js +11 -9
  55. package/lib/projection/ui/ProjectionMapControls.js.map +1 -1
  56. package/lib/projection/ui/ProjectionMapLegend.d.ts.map +1 -1
  57. package/lib/projection/ui/ProjectionMapLegend.js +1 -1
  58. package/lib/projection/ui/ProjectionMapLegend.js.map +1 -1
  59. package/lib/projection/ui/ProjectionMapMore.d.ts +2 -2
  60. package/lib/projection/ui/ProjectionMapMore.d.ts.map +1 -1
  61. package/lib/projection/ui/ProjectionMapMore.js +7 -5
  62. package/lib/projection/ui/ProjectionMapMore.js.map +1 -1
  63. package/lib/projection/ui/ProjectionMapTab.d.ts +15 -6
  64. package/lib/projection/ui/ProjectionMapTab.d.ts.map +1 -1
  65. package/lib/projection/ui/ProjectionMapTab.js +11 -7
  66. package/lib/projection/ui/ProjectionMapTab.js.map +1 -1
  67. package/lib/projection/ui/ProjectionPairsMore.d.ts +3 -7
  68. package/lib/projection/ui/ProjectionPairsMore.d.ts.map +1 -1
  69. package/lib/projection/ui/ProjectionPairsMore.js +4 -5
  70. package/lib/projection/ui/ProjectionPairsMore.js.map +1 -1
  71. package/lib/projection/ui/ProjectionPairsTab.d.ts.map +1 -1
  72. package/lib/projection/ui/ProjectionPairsTab.js +2 -2
  73. package/lib/projection/ui/ProjectionPairsTab.js.map +1 -1
  74. package/lib/projection/ui/ProjectionPanel.d.ts +1 -1
  75. package/lib/projection/ui/ProjectionPanel.d.ts.map +1 -1
  76. package/lib/projection/ui/ProjectionPanel.js +1 -1
  77. package/lib/projection/ui/ProjectionPanel.js.map +1 -1
  78. package/lib/projection/ui/ProjectionReadout.d.ts +7 -1
  79. package/lib/projection/ui/ProjectionReadout.d.ts.map +1 -1
  80. package/lib/projection/ui/ProjectionReadout.js +19 -7
  81. package/lib/projection/ui/ProjectionReadout.js.map +1 -1
  82. package/lib/projection/ui/ProjectionSpaceControls.d.ts +3 -5
  83. package/lib/projection/ui/ProjectionSpaceControls.d.ts.map +1 -1
  84. package/lib/projection/ui/ProjectionSpaceControls.js +9 -7
  85. package/lib/projection/ui/ProjectionSpaceControls.js.map +1 -1
  86. package/lib/projection/ui/ProjectionSpaceMore.d.ts +2 -2
  87. package/lib/projection/ui/ProjectionSpaceMore.d.ts.map +1 -1
  88. package/lib/projection/ui/ProjectionSpaceMore.js +5 -4
  89. package/lib/projection/ui/ProjectionSpaceMore.js.map +1 -1
  90. package/lib/projection/ui/ProjectionSpaceTab.d.ts +11 -3
  91. package/lib/projection/ui/ProjectionSpaceTab.d.ts.map +1 -1
  92. package/lib/projection/ui/ProjectionSpaceTab.js +7 -4
  93. package/lib/projection/ui/ProjectionSpaceTab.js.map +1 -1
  94. package/lib/projection/ui/ProjectionViewer.d.ts.map +1 -1
  95. package/lib/projection/ui/ProjectionViewer.js +1 -0
  96. package/lib/projection/ui/ProjectionViewer.js.map +1 -1
  97. package/lib/projection/ui/projectionBarReadings.d.ts +4 -1
  98. package/lib/projection/ui/projectionBarReadings.d.ts.map +1 -1
  99. package/lib/projection/ui/projectionBarReadings.js +14 -4
  100. package/lib/projection/ui/projectionBarReadings.js.map +1 -1
  101. package/lib/projection/ui/projectionBarSlots.d.ts +4 -2
  102. package/lib/projection/ui/projectionBarSlots.d.ts.map +1 -1
  103. package/lib/projection/ui/projectionBarSlots.js +3 -7
  104. package/lib/projection/ui/projectionBarSlots.js.map +1 -1
  105. package/lib/projection/ui/projectionMapChoices.d.ts +31 -6
  106. package/lib/projection/ui/projectionMapChoices.d.ts.map +1 -1
  107. package/lib/projection/ui/projectionMapChoices.js +58 -9
  108. package/lib/projection/ui/projectionMapChoices.js.map +1 -1
  109. package/lib/projection/ui/projectionMapChrome.d.ts +3 -9
  110. package/lib/projection/ui/projectionMapChrome.d.ts.map +1 -1
  111. package/lib/projection/ui/projectionMapChrome.js +41 -27
  112. package/lib/projection/ui/projectionMapChrome.js.map +1 -1
  113. package/lib/projection/ui/projectionMapCorner.d.ts +25 -0
  114. package/lib/projection/ui/projectionMapCorner.d.ts.map +1 -0
  115. package/lib/projection/ui/projectionMapCorner.js +46 -0
  116. package/lib/projection/ui/projectionMapCorner.js.map +1 -0
  117. package/lib/projection/ui/projectionMapModel.d.ts +9 -18
  118. package/lib/projection/ui/projectionMapModel.d.ts.map +1 -1
  119. package/lib/projection/ui/projectionMapModel.js +14 -39
  120. package/lib/projection/ui/projectionMapModel.js.map +1 -1
  121. package/lib/projection/ui/projectionMapView.d.ts +3 -1
  122. package/lib/projection/ui/projectionMapView.d.ts.map +1 -1
  123. package/lib/projection/ui/projectionMapView.js +9 -4
  124. package/lib/projection/ui/projectionMapView.js.map +1 -1
  125. package/lib/projection/ui/projectionSelectionSentence.d.ts +10 -0
  126. package/lib/projection/ui/projectionSelectionSentence.d.ts.map +1 -0
  127. package/lib/projection/ui/projectionSelectionSentence.js +18 -0
  128. package/lib/projection/ui/projectionSelectionSentence.js.map +1 -0
  129. package/lib/projection/ui/projectionStateApi.d.ts +47 -0
  130. package/lib/projection/ui/projectionStateApi.d.ts.map +1 -0
  131. package/lib/projection/ui/projectionStateApi.js +9 -0
  132. package/lib/projection/ui/projectionStateApi.js.map +1 -0
  133. package/lib/projection/ui/projectionTabModels.js +1 -1
  134. package/lib/projection/ui/projectionTabModels.js.map +1 -1
  135. package/lib/projection/ui/useProjectionState.d.ts +1 -29
  136. package/lib/projection/ui/useProjectionState.d.ts.map +1 -1
  137. package/lib/projection/ui/useProjectionState.js +13 -5
  138. package/lib/projection/ui/useProjectionState.js.map +1 -1
  139. package/lib/scatter/core/index.d.ts +1 -0
  140. package/lib/scatter/core/index.d.ts.map +1 -1
  141. package/lib/scatter/core/index.js +1 -0
  142. package/lib/scatter/core/index.js.map +1 -1
  143. package/lib/scatter/core/pointShape.d.ts +18 -0
  144. package/lib/scatter/core/pointShape.d.ts.map +1 -0
  145. package/lib/scatter/core/pointShape.js +70 -0
  146. package/lib/scatter/core/pointShape.js.map +1 -0
  147. package/lib/scatter/ui/ScatterPlot.d.ts.map +1 -1
  148. package/lib/scatter/ui/ScatterPlot.js +3 -2
  149. package/lib/scatter/ui/ScatterPlot.js.map +1 -1
  150. package/lib/scatter/ui/ScatterPointLayer.d.ts +14 -1
  151. package/lib/scatter/ui/ScatterPointLayer.d.ts.map +1 -1
  152. package/lib/scatter/ui/ScatterPointLayer.js +15 -3
  153. package/lib/scatter/ui/ScatterPointLayer.js.map +1 -1
  154. package/lib/scatter/ui/scatterFigureProps.d.ts +13 -0
  155. package/lib/scatter/ui/scatterFigureProps.d.ts.map +1 -1
  156. package/lib/scatter/ui/scatterMarkGlyph.d.ts +2 -1
  157. package/lib/scatter/ui/scatterMarkGlyph.d.ts.map +1 -1
  158. package/lib/scatter/ui/scatterMarkGlyph.js +7 -1
  159. package/lib/scatter/ui/scatterMarkGlyph.js.map +1 -1
  160. package/lib/scatter3d/ui/ScatterCloud.d.ts.map +1 -1
  161. package/lib/scatter3d/ui/ScatterCloud.js +2 -1
  162. package/lib/scatter3d/ui/ScatterCloud.js.map +1 -1
  163. package/package.json +1 -1
  164. package/src/overlay/core/index.ts +6 -2
  165. package/src/overlay/core/overlayMarks.ts +51 -6
  166. package/src/overlay/ui/OverlayLegendMark.tsx +5 -0
  167. package/src/projection/core/index.ts +11 -3
  168. package/src/projection/core/projectionCopy.ts +3 -0
  169. package/src/projection/core/projectionGroupings.ts +174 -0
  170. package/src/projection/core/projectionOptions.ts +18 -7
  171. package/src/projection/core/projectionPanelWords.ts +10 -0
  172. package/src/projection/core/projectionSamples.ts +62 -120
  173. package/src/projection/core/projectionStrings.ts +12 -1
  174. package/src/projection/core/resolveProjectionOptions.ts +66 -4
  175. package/src/projection/ui/ProjectionBar.tsx +4 -2
  176. package/src/projection/ui/ProjectionGroupingPickers.tsx +91 -0
  177. package/src/projection/ui/ProjectionMapControls.tsx +29 -32
  178. package/src/projection/ui/ProjectionMapLegend.tsx +1 -1
  179. package/src/projection/ui/ProjectionMapMore.tsx +14 -4
  180. package/src/projection/ui/ProjectionMapTab.tsx +27 -9
  181. package/src/projection/ui/ProjectionPairsMore.tsx +12 -21
  182. package/src/projection/ui/ProjectionPairsTab.tsx +5 -2
  183. package/src/projection/ui/ProjectionPanel.tsx +7 -3
  184. package/src/projection/ui/ProjectionReadout.tsx +28 -8
  185. package/src/projection/ui/ProjectionSpaceControls.tsx +20 -27
  186. package/src/projection/ui/ProjectionSpaceMore.tsx +12 -3
  187. package/src/projection/ui/ProjectionSpaceTab.tsx +23 -6
  188. package/src/projection/ui/ProjectionViewer.tsx +1 -0
  189. package/src/projection/ui/projectionBarReadings.ts +24 -8
  190. package/src/projection/ui/projectionBarSlots.tsx +10 -9
  191. package/src/projection/ui/projectionMapChoices.ts +71 -14
  192. package/src/projection/ui/projectionMapChrome.ts +55 -30
  193. package/src/projection/ui/projectionMapCorner.ts +67 -0
  194. package/src/projection/ui/projectionMapModel.ts +20 -59
  195. package/src/projection/ui/projectionMapView.ts +15 -8
  196. package/src/projection/ui/projectionSelectionSentence.ts +22 -0
  197. package/src/projection/ui/projectionStateApi.ts +57 -0
  198. package/src/projection/ui/projectionTabModels.ts +1 -1
  199. package/src/projection/ui/useProjectionState.ts +33 -37
  200. package/src/scatter/core/index.ts +1 -0
  201. package/src/scatter/core/pointShape.ts +80 -0
  202. package/src/scatter/ui/ScatterPlot.tsx +4 -1
  203. package/src/scatter/ui/ScatterPointLayer.tsx +39 -11
  204. package/src/scatter/ui/scatterFigureProps.ts +13 -0
  205. package/src/scatter/ui/scatterMarkGlyph.tsx +9 -1
  206. package/src/scatter3d/ui/ScatterCloud.tsx +3 -0
@@ -11,8 +11,10 @@
11
11
  import { useCallback, useMemo, useState } from 'react';
12
12
  import { chartClampViewport } from "../../chart/core/chartViewport.js";
13
13
  import { DEFAULT_ORBIT_CAMERA } from "../../scatter3d/core/orbitCamera.js";
14
- import { projectionMapChrome, projectionSelectionSentence, } from "./projectionMapChrome.js";
14
+ import { NO_GROUPING } from "../core/projectionOptions.js";
15
+ import { projectionMapChrome } from "./projectionMapChrome.js";
15
16
  import { MINIMUM_OUTLINE_POINTS, projectionMapDomain, projectionMapViewport, } from "./projectionMapModel.js";
17
+ import { projectionSelectionSentence } from "./projectionSelectionSentence.js";
16
18
  import { MINIMUM_SHELL_POINTS } from "./projectionSpaceModel.js";
17
19
  /**
18
20
  * The map's frame, its last report, and the words around it.
@@ -20,7 +22,7 @@ import { MINIMUM_SHELL_POINTS } from "./projectionSpaceModel.js";
20
22
  * @returns See {@link ProjectionMapView}.
21
23
  */
22
24
  export function useProjectionMapView(input) {
23
- const { result, copy, groups, options, selected, onSettle } = input;
25
+ const { result, copy, groups, shapes, options, selected, onSettle } = input;
24
26
  const { scores, fittedCount, markers } = result;
25
27
  const { colorBy, ellipse, showGroupMeans, xAxis, yAxis } = options;
26
28
  const [zoom, setZoom] = useState(null);
@@ -51,11 +53,12 @@ export function useProjectionMapView(input) {
51
53
  setCamera(DEFAULT_ORBIT_CAMERA);
52
54
  setCloudZoom(1);
53
55
  }, []);
54
- const colored = colorBy === 'group' && groups.entries.length > 0;
56
+ const colored = colorBy !== NO_GROUPING && groups.entries.length > 0;
55
57
  const chrome = useMemo(() => projectionMapChrome({
56
58
  copy,
57
59
  groups,
58
60
  colored,
61
+ shapes,
59
62
  ellipse: colored ? ellipse : null,
60
63
  minimumPoints: MINIMUM_OUTLINE_POINTS,
61
64
  showGroupMeans,
@@ -66,6 +69,7 @@ export function useProjectionMapView(input) {
66
69
  copy,
67
70
  groups,
68
71
  colored,
72
+ shapes,
69
73
  ellipse,
70
74
  showGroupMeans,
71
75
  markers,
@@ -76,6 +80,7 @@ export function useProjectionMapView(input) {
76
80
  copy,
77
81
  groups,
78
82
  colored,
83
+ shapes,
79
84
  ellipse: colored ? ellipse : null,
80
85
  minimumPoints: MINIMUM_SHELL_POINTS,
81
86
  showGroupMeans: false,
@@ -83,7 +88,7 @@ export function useProjectionMapView(input) {
83
88
  fittedCount: fittedCount ?? scores.rows,
84
89
  total: scores.rows,
85
90
  figure: 'space',
86
- }), [copy, groups, colored, ellipse, fittedCount, scores]);
91
+ }), [copy, groups, colored, shapes, ellipse, fittedCount, scores]);
87
92
  const settle = useCallback((change) => {
88
93
  setReport((previous) => ({
89
94
  text: projectionSelectionSentence(copy, change.indices.length, scores.rows),
@@ -1 +1 @@
1
- {"version":3,"file":"projectionMapView.js","sourceRoot":"","sources":["../../../src/projection/ui/projectionMapView.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projectionMapView.js","sourceRoot":"","sources":["../../../src/projection/ui/projectionMapView.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAGvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAY3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAoDjE;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAA6B;IAE7B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC5E,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAChD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEnE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAmB,IAAI,CAAC,CAAC;IACzD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAyB,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAc,oBAAoB,CAAC,CAAC;IACxE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE9C,wEAAwE;IACxE,sEAAsE;IACtE,uEAAuE;IACvE,MAAM,QAAQ,GACZ,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;QAC3D,CAAC,CAAC,IAAI,CAAC,QAAQ;QACf,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,IAA0B,EAAE,EAAE;QAC7B,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC,EACD,CAAC,KAAK,EAAE,KAAK,CAAC,CACf,CAAC;IAEF,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAClC,WAAW,CACT,kBAAkB,CAChB;YACE,CAAC,EAAE,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC;YACrC,CAAC,EAAE,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC;SACtC,EACD,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CACtD,CACF,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAElD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAChC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,OAAO,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CACH,mBAAmB,CAAC;QAClB,IAAI;QACJ,MAAM;QACN,OAAO;QACP,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QACjC,aAAa,EAAE,sBAAsB;QACrC,cAAc;QACd,OAAO,EAAE,OAAO,IAAI,UAAU;QAC9B,WAAW,EAAE,WAAW,IAAI,MAAM,CAAC,IAAI;QACvC,KAAK,EAAE,MAAM,CAAC,IAAI;KACnB,CAAC,EACJ;QACE,IAAI;QACJ,MAAM;QACN,OAAO;QACP,MAAM;QACN,OAAO;QACP,cAAc;QACd,OAAO;QACP,WAAW;QACX,MAAM;KACP,CACF,CAAC;IAEF,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CACH,mBAAmB,CAAC;QAClB,IAAI;QACJ,MAAM;QACN,OAAO;QACP,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QACjC,aAAa,EAAE,oBAAoB;QACnC,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,UAAU;QACnB,WAAW,EAAE,WAAW,IAAI,MAAM,CAAC,IAAI;QACvC,KAAK,EAAE,MAAM,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO;KAChB,CAAC,EACJ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAC9D,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,MAAuB,EAAE,EAAE;QAC1B,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,2BAA2B,CAC/B,IAAI,EACJ,MAAM,CAAC,OAAO,CAAC,MAAM,EACrB,MAAM,CAAC,IAAI,CACZ;YACD,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;SAC5B,CAAC,CAAC,CAAC;QACJ,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,EACD,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CACzB,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO;QACL,MAAM;QACN,WAAW;QACX,QAAQ;QACR,WAAW;QACX,MAAM;QACN,SAAS;QACT,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,YAAY;QACrB,cAAc;QACd,MAAM;QACN,MAAM;QACN,eAAe;QACf,SAAS;QACT,cAAc;KACf,CAAC;AACJ,CAAC;AAYD,MAAM,YAAY,GAAsB,EAAE,CAAC;AAC3C,MAAM,UAAU,GAAgC,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ProjectionCopy } from '../core/projectionCopy.ts';
2
+ /**
3
+ * The sentence reporting what a gesture picked out.
4
+ * @param copy - The words the map writes.
5
+ * @param count - How many samples are selected.
6
+ * @param total - How many there are in all.
7
+ * @returns The sentence.
8
+ */
9
+ export declare function projectionSelectionSentence(copy: ProjectionCopy, count: number, total: number): string;
10
+ //# sourceMappingURL=projectionSelectionSentence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectionSelectionSentence.d.ts","sourceRoot":"","sources":["../../../src/projection/ui/projectionSelectionSentence.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,MAAM,CAMR"}
@@ -0,0 +1,18 @@
1
+ import { formatInteger } from "../../format/core/numbers.js";
2
+ import { fillCopy } from "../core/fillCopy.js";
3
+ /**
4
+ * The sentence reporting what a gesture picked out.
5
+ * @param copy - The words the map writes.
6
+ * @param count - How many samples are selected.
7
+ * @param total - How many there are in all.
8
+ * @returns The sentence.
9
+ */
10
+ export function projectionSelectionSentence(copy, count, total) {
11
+ if (count === 0)
12
+ return copy.sentence.selectionNone;
13
+ return fillCopy(copy.sentence.selection, {
14
+ count: formatInteger(count),
15
+ total: formatInteger(total),
16
+ });
17
+ }
18
+ //# sourceMappingURL=projectionSelectionSentence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectionSelectionSentence.js","sourceRoot":"","sources":["../../../src/projection/ui/projectionSelectionSentence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAoB,EACpB,KAAa,EACb,KAAa;IAEb,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;IACpD,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;QACvC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;QAC3B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;KAC5B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * What the one hook every tab shares hands out.
3
+ *
4
+ * The type lives beside the hook rather than inside it because the hook is
5
+ * short and its answer is not: a reader looking for how the state is kept
6
+ * should not have to scroll past a page of documented fields to find it.
7
+ */
8
+ import type { ScatterSelectionMode } from '../../scatter/core/scatterSelection.ts';
9
+ import type { SelectionChange } from '../../scatter/ui/useScatterSelection.ts';
10
+ import type { ProjectionOptions } from '../core/projectionOptions.ts';
11
+ import type { ProjectionGrouping, ResolvedProjectionGroups, ResolvedProjectionShapes } from '../core/projectionSamples.ts';
12
+ import type { ProjectionTab } from '../core/projectionTabs.ts';
13
+ import type { ProjectionSelection } from './projectionSelection.ts';
14
+ /** What every tab reads, and the five ways any of them changes it. */
15
+ export interface ProjectionStateApi {
16
+ /** The tabs this result can fill, in reading order. */
17
+ tabs: readonly ProjectionTab[];
18
+ /** The one showing. */
19
+ tab: ProjectionTab;
20
+ /** Move to another tab. One the result cannot fill is ignored. */
21
+ setTab: (tab: ProjectionTab) => void;
22
+ /**
23
+ * The grouping the dots are coloured by, resolved once per change; empty
24
+ * while the colour stands for nothing.
25
+ */
26
+ groups: ResolvedProjectionGroups;
27
+ /**
28
+ * The grouping the dots are shaped by, resolved once per change, or `null`
29
+ * while they are all discs.
30
+ */
31
+ shapes: ResolvedProjectionShapes | null;
32
+ /** Every grouping the samples carry, for the pickers that choose between them. */
33
+ groupings: readonly ProjectionGrouping[];
34
+ /** Every option, already made safe against the result. */
35
+ options: ProjectionOptions;
36
+ /** Change some of them; the rest are carried over and checked again. */
37
+ setOptions: (patch: Partial<ProjectionOptions>) => void;
38
+ /** The selected rows, as indices, which is what a plot draws. */
39
+ selected: readonly number[];
40
+ /** Settle a selection a plot's own gesture produced. */
41
+ settleSelection: (change: SelectionChange) => void;
42
+ /** Settle one from elsewhere — a legend entry, a table beside the figure. */
43
+ selectRows: (rows: readonly number[], mode: ScatterSelectionMode, source: ProjectionSelection['source']) => void;
44
+ /** Draw one pair of axes on the map, which is what a cell of the grid does. */
45
+ selectPair: (xAxis: number, yAxis: number) => void;
46
+ }
47
+ //# sourceMappingURL=projectionStateApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectionStateApi.d.ts","sourceRoot":"","sources":["../../../src/projection/ui/projectionStateApi.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EACV,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,sEAAsE;AACtE,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/B,uBAAuB;IACvB,GAAG,EAAE,aAAa,CAAC;IACnB,kEAAkE;IAClE,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACrC;;;OAGG;IACH,MAAM,EAAE,wBAAwB,CAAC;IACjC;;;OAGG;IACH,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACxC,kFAAkF;IAClF,SAAS,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACzC,0DAA0D;IAC1D,OAAO,EAAE,iBAAiB,CAAC;IAC3B,wEAAwE;IACxE,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACxD,iEAAiE;IACjE,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,wDAAwD;IACxD,eAAe,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,6EAA6E;IAC7E,UAAU,EAAE,CACV,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,KAClC,IAAI,CAAC;IACV,+EAA+E;IAC/E,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * What the one hook every tab shares hands out.
3
+ *
4
+ * The type lives beside the hook rather than inside it because the hook is
5
+ * short and its answer is not: a reader looking for how the state is kept
6
+ * should not have to scroll past a page of documented fields to find it.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=projectionStateApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectionStateApi.js","sourceRoot":"","sources":["../../../src/projection/ui/projectionStateApi.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -40,7 +40,7 @@ export function useProjectionModels(input) {
40
40
  return {
41
41
  profiles,
42
42
  shares,
43
- sampleName: samples.ids[one] ?? `Row ${one + 1}`,
43
+ sampleName: samples.labels?.[one] ?? samples.ids[one] ?? `Row ${one + 1}`,
44
44
  };
45
45
  }
46
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"projectionTabModels.js","sourceRoot":"","sources":["../../../src/projection/ui/projectionTabModels.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAIhC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAqC7D;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAA4B;IAE5B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1C,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,OAAO,CAAyB,GAAG,EAAE;QACpD,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,eAAe,CAAC;YACrB,QAAQ;YACR,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,aAAa;YAC3B,KAAK,EAAE,OAAO,CAAC,cAAc;YAC7B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,OAAO,CAAC,aAAa;YAC5B,WAAW;YACX,YAAY,EACV,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC;SACvE,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,EAC5D,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAC5B,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,MAAM;QACN,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC,EAAE;KACjD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,MAAM,CAAC,CAAC;IACzC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"projectionTabModels.js","sourceRoot":"","sources":["../../../src/projection/ui/projectionTabModels.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAIhC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAqC7D;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAA4B;IAE5B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1C,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,OAAO,CAAyB,GAAG,EAAE;QACpD,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,eAAe,CAAC;YACrB,QAAQ;YACR,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,aAAa;YAC3B,KAAK,EAAE,OAAO,CAAC,cAAc;YAC7B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,OAAO,CAAC,aAAa;YAC5B,WAAW;YACX,YAAY,EACV,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC;SACvE,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,EAC5D,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAC5B,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,MAAM;QACN,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC,EAAE;KAC1E,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,MAAM,CAAC,CAAC;IACzC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,9 +1,4 @@
1
- import type { ScatterSelectionMode } from '../../scatter/core/scatterSelection.ts';
2
- import type { SelectionChange } from '../../scatter/ui/useScatterSelection.ts';
3
- import type { ProjectionOptions } from '../core/projectionOptions.ts';
4
- import type { ResolvedProjectionGroups } from '../core/projectionSamples.ts';
5
- import type { ProjectionTab } from '../core/projectionTabs.ts';
6
- import type { ProjectionSelection } from './projectionSelection.ts';
1
+ import type { ProjectionStateApi } from './projectionStateApi.ts';
7
2
  import type { ProjectionViewerProps } from './projectionViewerProps.ts';
8
3
  /**
9
4
  * What {@link useProjectionState} needs: the run, the rows, and the three
@@ -14,29 +9,6 @@ import type { ProjectionViewerProps } from './projectionViewerProps.ts';
14
9
  * hook actually applies and the two cannot drift apart.
15
10
  */
16
11
  type ProjectionStateOptions = Pick<ProjectionViewerProps, 'result' | 'samples' | 'tab' | 'defaultTab' | 'onTabChange' | 'selected' | 'defaultSelected' | 'onSelectionChange' | 'options' | 'panels' | 'defaultOptions' | 'onOptionsChange'>;
17
- /** What every tab reads, and the five ways any of them changes it. */
18
- export interface ProjectionStateApi {
19
- /** The tabs this result can fill, in reading order. */
20
- tabs: readonly ProjectionTab[];
21
- /** The one showing. */
22
- tab: ProjectionTab;
23
- /** Move to another tab. One the result cannot fill is ignored. */
24
- setTab: (tab: ProjectionTab) => void;
25
- /** The groups as every figure draws them, resolved once per change. */
26
- groups: ResolvedProjectionGroups;
27
- /** Every option, already made safe against the result. */
28
- options: ProjectionOptions;
29
- /** Change some of them; the rest are carried over and checked again. */
30
- setOptions: (patch: Partial<ProjectionOptions>) => void;
31
- /** The selected rows, as indices, which is what a plot draws. */
32
- selected: readonly number[];
33
- /** Settle a selection a plot's own gesture produced. */
34
- settleSelection: (change: SelectionChange) => void;
35
- /** Settle one from elsewhere — a legend entry, a table beside the figure. */
36
- selectRows: (rows: readonly number[], mode: ScatterSelectionMode, source: ProjectionSelection['source']) => void;
37
- /** Draw one pair of axes on the map, which is what a cell of the grid does. */
38
- selectPair: (xAxis: number, yAxis: number) => void;
39
- }
40
12
  /**
41
13
  * The tab, the pair of axes, the selection and the options, controlled or not.
42
14
  *
@@ -1 +1 @@
1
- {"version":3,"file":"useProjectionState.d.ts","sourceRoot":"","sources":["../../../src/projection/ui/useProjectionState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAE7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAMpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;;;;GAOG;AACH,KAAK,sBAAsB,GAAG,IAAI,CAChC,qBAAqB,EACnB,QAAQ,GACR,SAAS,GACT,KAAK,GACL,YAAY,GACZ,aAAa,GACb,UAAU,GACV,iBAAiB,GACjB,mBAAmB,GACnB,SAAS,GACT,QAAQ,GACR,gBAAgB,GAChB,iBAAiB,CACpB,CAAC;AAEF,sEAAsE;AACtE,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/B,uBAAuB;IACvB,GAAG,EAAE,aAAa,CAAC;IACnB,kEAAkE;IAClE,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACrC,uEAAuE;IACvE,MAAM,EAAE,wBAAwB,CAAC;IACjC,0DAA0D;IAC1D,OAAO,EAAE,iBAAiB,CAAC;IAC3B,wEAAwE;IACxE,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACxD,iEAAiE;IACjE,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,wDAAwD;IACxD,eAAe,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,6EAA6E;IAC7E,UAAU,EAAE,CACV,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,KAClC,IAAI,CAAC;IACV,+EAA+E;IAC/E,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,sBAAsB,GAC9B,kBAAkB,CA0GpB"}
1
+ {"version":3,"file":"useProjectionState.d.ts","sourceRoot":"","sources":["../../../src/projection/ui/useProjectionState.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;;;;GAOG;AACH,KAAK,sBAAsB,GAAG,IAAI,CAChC,qBAAqB,EACnB,QAAQ,GACR,SAAS,GACT,KAAK,GACL,YAAY,GACZ,aAAa,GACb,UAAU,GACV,iBAAiB,GACjB,mBAAmB,GACnB,SAAS,GACT,QAAQ,GACR,gBAAgB,GAChB,iBAAiB,CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,sBAAsB,GAC9B,kBAAkB,CA0HpB"}
@@ -1,5 +1,5 @@
1
1
  import { useCallback, useMemo, useState } from 'react';
2
- import { resolveProjectionGroups } from "../core/projectionSamples.js";
2
+ import { projectionGrouping, resolveProjectionGroups, resolveProjectionShapes, } from "../core/projectionGroupings.js";
3
3
  import { projectionTabs } from "../core/projectionTabs.js";
4
4
  import { resolveProjectionOptions } from "../core/resolveProjectionOptions.js";
5
5
  import { indexProjectionIds, projectionNamesOf, projectionRowsOf, } from "./projectionSelection.js";
@@ -33,8 +33,12 @@ export function useProjectionState(options) {
33
33
  const [ownTab, setOwnTab] = useState(defaultTab);
34
34
  const [ownSelected, setOwnSelected] = useState(() => projectionRowsOf(defaultSelected, rowOfId));
35
35
  const [ownOptions, setOwnOptions] = useState(() => defaultOptions ?? {});
36
- const groups = useMemo(() => resolveProjectionGroups(samples, result.scores.rows), [result, samples]);
37
- const settled = useMemo(() => resolveProjectionOptions(heldOptions ?? ownOptions, result), [heldOptions, ownOptions, result]);
36
+ const groupings = samples.groupings ?? NO_GROUPINGS;
37
+ const settled = useMemo(() => resolveProjectionOptions(heldOptions ?? ownOptions, result, groupings), [groupings, heldOptions, ownOptions, result]);
38
+ const { colorBy, shapeBy } = settled;
39
+ const rowCount = result.scores.rows;
40
+ const groups = useMemo(() => resolveProjectionGroups(projectionGrouping(samples, colorBy), rowCount), [colorBy, rowCount, samples]);
41
+ const shapes = useMemo(() => resolveProjectionShapes(projectionGrouping(samples, shapeBy), rowCount), [rowCount, samples, shapeBy]);
38
42
  const setTab = useCallback((wanted) => {
39
43
  const reachable = inReach(wanted, tabs);
40
44
  if (reachable === undefined)
@@ -44,11 +48,11 @@ export function useProjectionState(options) {
44
48
  onTabChange?.(reachable);
45
49
  }, [onTabChange, tab, tabs]);
46
50
  const setOptions = useCallback((patch) => {
47
- const next = resolveProjectionOptions({ ...settled, ...patch }, result);
51
+ const next = resolveProjectionOptions({ ...settled, ...patch }, result, groupings);
48
52
  if (heldOptions === undefined)
49
53
  setOwnOptions(next);
50
54
  onOptionsChange?.(next);
51
- }, [heldOptions, onOptionsChange, result, settled]);
55
+ }, [groupings, heldOptions, onOptionsChange, result, settled]);
52
56
  const selectRows = useCallback((rows, mode, source) => {
53
57
  if (selected === undefined)
54
58
  setOwnSelected(rows);
@@ -74,6 +78,8 @@ export function useProjectionState(options) {
74
78
  tab: inReach(tab, tabs) ?? inReach(ownTab, tabs) ?? tabs[0] ?? 'map',
75
79
  setTab,
76
80
  groups,
81
+ shapes,
82
+ groupings,
77
83
  options: settled,
78
84
  setOptions,
79
85
  selected: selected === undefined
@@ -104,4 +110,6 @@ function inReach(wanted, tabs) {
104
110
  }
105
111
  return undefined;
106
112
  }
113
+ /** No groupings at all, shared so an absent list keeps one identity. */
114
+ const NO_GROUPINGS = [];
107
115
  //# sourceMappingURL=useProjectionState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useProjectionState.js","sourceRoot":"","sources":["../../../src/projection/ui/useProjectionState.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useProjectionState.js","sourceRoot":"","sources":["../../../src/projection/ui/useProjectionState.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ export { ellipsePolygon, projectEllipse } from './ellipseProjection.ts';
19
19
  export type { LassoPath } from './lassoPath.ts';
20
20
  export { appendLassoPoint, createLassoPath, lassoPathData, resetLassoPath, } from './lassoPath.ts';
21
21
  export { pointInPolygon, pointsInPolygon, polygonBounds } from './polygon.ts';
22
+ export { pointShapePath } from './pointShape.ts';
22
23
  export type { ScatterGroupMoments } from './scatterGroupMoments.ts';
23
24
  export type { ScatterGroupSpread, ScatterGroupSpreadOptions, } from './scatterGroupSpread.ts';
24
25
  export { scatterGroupSpread, scatterPairEllipse, scatterSkippedGroups, } from './scatterGroupSpread.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scatter/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EACV,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scatter/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EACV,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -15,6 +15,7 @@ export { coverageForStandardDeviations, standardDeviationsForCoverage, } from ".
15
15
  export { ellipsePolygon, projectEllipse } from "./ellipseProjection.js";
16
16
  export { appendLassoPoint, createLassoPath, lassoPathData, resetLassoPath, } from "./lassoPath.js";
17
17
  export { pointInPolygon, pointsInPolygon, polygonBounds } from "./polygon.js";
18
+ export { pointShapePath } from "./pointShape.js";
18
19
  export { scatterGroupSpread, scatterPairEllipse, scatterSkippedGroups, } from "./scatterGroupSpread.js";
19
20
  export { mergeScatterSelection, scatterSelectedIndices, scatterSelectionMask, } from "./scatterSelection.js";
20
21
  export { nearestPointIndex, pointsWithinBounds } from "./screenPoints.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scatter/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAM9E,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scatter/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMjD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { OverlayMarkShape } from '../../overlay/core/overlayMarks.ts';
2
+ /**
3
+ * The outline of a mark drawn as a filled polygon — a sample shaped by a
4
+ * second grouping, or a marker drawn in one of those shapes — as SVG path data.
5
+ *
6
+ * Every shape covers the area of the disc it stands in for. The eye weighs a
7
+ * mark by its ink, so a square drawn in the disc's own box would make its
8
+ * group read as the heavier one — which is a claim about the data that nothing
9
+ * in the data supports.
10
+ * @param shape - The shape.
11
+ * @param x - Horizontal centre, in pixels.
12
+ * @param y - Vertical centre, in pixels.
13
+ * @param radius - Radius of the disc the shape stands in for, in pixels.
14
+ * @returns The path data, or `null` for a disc, which is drawn as a circle,
15
+ * and for every mark that is not a filled polygon.
16
+ */
17
+ export declare function pointShapePath(shape: OverlayMarkShape, x: number, y: number, radius: number): string | null;
18
+ //# sourceMappingURL=pointShape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointShape.d.ts","sourceRoot":"","sources":["../../../src/scatter/core/pointShape.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAE3E;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,gBAAgB,EACvB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAiCf"}
@@ -0,0 +1,70 @@
1
+ import { chartRoundPixel } from "../../chart/core/chartScale.js";
2
+ /**
3
+ * The outline of a mark drawn as a filled polygon — a sample shaped by a
4
+ * second grouping, or a marker drawn in one of those shapes — as SVG path data.
5
+ *
6
+ * Every shape covers the area of the disc it stands in for. The eye weighs a
7
+ * mark by its ink, so a square drawn in the disc's own box would make its
8
+ * group read as the heavier one — which is a claim about the data that nothing
9
+ * in the data supports.
10
+ * @param shape - The shape.
11
+ * @param x - Horizontal centre, in pixels.
12
+ * @param y - Vertical centre, in pixels.
13
+ * @param radius - Radius of the disc the shape stands in for, in pixels.
14
+ * @returns The path data, or `null` for a disc, which is drawn as a circle,
15
+ * and for every mark that is not a filled polygon.
16
+ */
17
+ export function pointShapePath(shape, x, y, radius) {
18
+ if (shape === 'square') {
19
+ const half = SQUARE_HALF * radius;
20
+ return polygon([
21
+ [x - half, y - half],
22
+ [x + half, y - half],
23
+ [x + half, y + half],
24
+ [x - half, y + half],
25
+ ]);
26
+ }
27
+ if (shape === 'diamond') {
28
+ const reach = DIAMOND_REACH * radius;
29
+ return polygon([
30
+ [x, y - reach],
31
+ [x + reach, y],
32
+ [x, y + reach],
33
+ [x - reach, y],
34
+ ]);
35
+ }
36
+ if (shape === 'triangle' || shape === 'triangle-down') {
37
+ // The centroid sits on the point, so the triangle is balanced on the
38
+ // sample rather than hanging from it.
39
+ const tip = TRIANGLE_TIP * radius;
40
+ const half = TRIANGLE_HALF_BASE * radius;
41
+ const base = (TRIANGLE_TIP / 2) * radius;
42
+ const flip = shape === 'triangle' ? 1 : -1;
43
+ return polygon([
44
+ [x, y - flip * tip],
45
+ [x + half, y + flip * base],
46
+ [x - half, y + flip * base],
47
+ ]);
48
+ }
49
+ return null;
50
+ }
51
+ function polygon(corners) {
52
+ let path = '';
53
+ for (const [x, y] of corners) {
54
+ path += `${path === '' ? 'M' : 'L'}${chartRoundPixel(x)} ${chartRoundPixel(y)}`;
55
+ }
56
+ return `${path}Z`;
57
+ }
58
+ /** Half the side of a square as large as a disc of radius one: √π / 2. */
59
+ const SQUARE_HALF = Math.sqrt(Math.PI) / 2;
60
+ /** How far a diamond as large as that disc reaches from its centre: √(π / 2). */
61
+ const DIAMOND_REACH = Math.sqrt(Math.PI / 2);
62
+ /**
63
+ * The side of an equilateral triangle as large as that disc is √(4π / √3). Its
64
+ * tip stands side / √3 from the centroid, and its base half as far on the other
65
+ * side.
66
+ */
67
+ const TRIANGLE_SIDE = Math.sqrt((4 * Math.PI) / Math.sqrt(3));
68
+ const TRIANGLE_TIP = TRIANGLE_SIDE / Math.sqrt(3);
69
+ const TRIANGLE_HALF_BASE = TRIANGLE_SIDE / 2;
70
+ //# sourceMappingURL=pointShape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointShape.js","sourceRoot":"","sources":["../../../src/scatter/core/pointShape.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScatterPlot.d.ts","sourceRoot":"","sources":["../../../src/scatter/ui/ScatterPlot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,YAAY,EAAE,MAAM,OAAO,CAAC;AAezE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAK9D;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAiIjE"}
1
+ {"version":3,"file":"ScatterPlot.d.ts","sourceRoot":"","sources":["../../../src/scatter/ui/ScatterPlot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,YAAY,EAAE,MAAM,OAAO,CAAC;AAezE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAK9D;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAoIjE"}
@@ -23,7 +23,8 @@ import { useScatterLabels } from "./useScatterLabels.js";
23
23
  */
24
24
  export function ScatterPlot(props) {
25
25
  const { x, y, width, height, xAxis, yAxis, groupOf, groups } = props;
26
- const { mutedGroups, ellipse = null, ellipseMinimumPoints } = props;
26
+ const { mutedGroups, shapeOf, shapes } = props;
27
+ const { ellipse = null, ellipseMinimumPoints } = props;
27
28
  const { ellipseFillOpacity, showGroupMeans, markers } = props;
28
29
  const { pointRadius = 3.5, outlinedFrom, pointLabels } = props;
29
30
  const { showGroupLabels = false, selected, defaultSelected } = props;
@@ -78,6 +79,6 @@ export function ScatterPlot(props) {
78
79
  }
79
80
  onPointDoubleClick(opened);
80
81
  }
81
- return (_jsx(ChartFrame, { width: width, height: height, x: frame.xAxis, y: frame.yAxis, geometry: geometry, busy: interaction.lasso.drawing, overlay: overlay, className: className, testId: testId, label: label ?? scatterPlotLabel(xAxis, yAxis, points.x.length), children: () => (_jsxs(_Fragment, { children: [ellipse === null || groupOf === undefined ? null : (_jsx(ScatterEllipseLayer, { x: x, y: y, groupOf: groupOf, colors: ink.colors, opacities: ink.opacities, scaleX: toX, scaleY: toY, size: ellipse, minimumPoints: ellipseMinimumPoints, fillOpacity: ellipseFillOpacity })), _jsx(ScatterPointLayer, { points: points, groupOf: groupOf, colors: ink.colors, opacities: ink.opacities, radius: pointRadius, outlinedFrom: outlinedFrom }), _jsx(ScatterMarkLayer, { points: points, selected: interaction.selection.mask, hovered: interaction.hover.hovered, focused: interaction.keyboard.cursor, radius: pointRadius, groupOf: groupOf, colors: ink.colors, showGroupMeans: showGroupMeans, marks: scatterPixelMarks(markers, toX, toY) }), _jsx(ScatterOverlayLayers, { labels: labels, radius: pointRadius, lassoPath: interaction.lasso.pathData }), _jsx("rect", { ...rect, ref: surface, fill: "transparent", tabIndex: 0, onKeyDown: interaction.keyboard.onKeyDown, onDoubleClick: handleDoubleClick, ...interaction.surface })] })) }));
82
+ return (_jsx(ChartFrame, { width: width, height: height, x: frame.xAxis, y: frame.yAxis, geometry: geometry, busy: interaction.lasso.drawing, overlay: overlay, className: className, testId: testId, label: label ?? scatterPlotLabel(xAxis, yAxis, points.x.length), children: () => (_jsxs(_Fragment, { children: [ellipse === null || groupOf === undefined ? null : (_jsx(ScatterEllipseLayer, { x: x, y: y, groupOf: groupOf, colors: ink.colors, opacities: ink.opacities, scaleX: toX, scaleY: toY, size: ellipse, minimumPoints: ellipseMinimumPoints, fillOpacity: ellipseFillOpacity })), _jsx(ScatterPointLayer, { points: points, groupOf: groupOf, colors: ink.colors, opacities: ink.opacities, shapeOf: shapeOf, shapes: shapes, radius: pointRadius, outlinedFrom: outlinedFrom }), _jsx(ScatterMarkLayer, { points: points, selected: interaction.selection.mask, hovered: interaction.hover.hovered, focused: interaction.keyboard.cursor, radius: pointRadius, groupOf: groupOf, colors: ink.colors, showGroupMeans: showGroupMeans, marks: scatterPixelMarks(markers, toX, toY) }), _jsx(ScatterOverlayLayers, { labels: labels, radius: pointRadius, lassoPath: interaction.lasso.pathData }), _jsx("rect", { ...rect, ref: surface, fill: "transparent", tabIndex: 0, onKeyDown: interaction.keyboard.onKeyDown, onDoubleClick: handleDoubleClick, ...interaction.surface })] })) }));
82
83
  }
83
84
  //# sourceMappingURL=ScatterPlot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScatterPlot.js","sourceRoot":"","sources":["../../../src/scatter/ui/ScatterPlot.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA+B,CAAC;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA2B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA4B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAyB,CAAC;AAC5D,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACrE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI,EAAE,oBAAoB,EAAE,GAAG,KAAK,CAAC;IACpE,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC9D,MAAM,EAAE,WAAW,GAAG,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAC/D,MAAM,EAAE,eAAe,GAAG,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IACrE,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAC5E,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC1E,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACvE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAE3C,MAAM,KAAK,GAAG,eAAe,CAAC;QAC5B,CAAC;QACD,CAAC;QACD,KAAK;QACL,MAAM;QACN,KAAK;QACL,KAAK;QACL,QAAQ;QACR,gBAAgB;QAChB,SAAS;QACT,cAAc;KACf,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3D,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,GAAG,GAAG,OAAO,CACjB,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,EAC1C,CAAC,MAAM,EAAE,WAAW,CAAC,CACtB,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE;QACtC,WAAW;QACX,eAAe;QACf,MAAM;QACN,OAAO;QACP,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,qBAAqB,CAAC;QACxC,MAAM;QACN,OAAO,EAAE,IAAI,CAAC,CAAC;QACf,OAAO,EAAE,IAAI,CAAC,CAAC;QACf,QAAQ;QACR,eAAe;QACf,iBAAiB;QACjB,UAAU;QACV,UAAU;QACV,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,WAAW,GAAG,mBAAmB;QAC9C,aAAa;QACb,WAAW;QACX,aAAa;KACd,CAAC,CAAC;IAEH,SAAS,iBAAiB,CAAC,KAAsC;QAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,MAAM,KAAK,IAAI,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACxD,KAAK,EAAE,CAAC;YACR,OAAO;QACT,CAAC;QACD,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CACL,KAAC,UAAU,IACT,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,KAAK,CAAC,KAAK,EACd,CAAC,EAAE,KAAK,CAAC,KAAK,EACd,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,EAC/B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,IAAI,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAE9D,GAAG,EAAE,CAAC,CACL,8BACG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAClD,KAAC,mBAAmB,IAClB,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,GAAG,CAAC,MAAM,EAClB,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,oBAAoB,EACnC,WAAW,EAAE,kBAAkB,GAC/B,CACH,EACD,KAAC,iBAAiB,IAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,GAAG,CAAC,MAAM,EAClB,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,YAAY,GAC1B,EACF,KAAC,gBAAgB,IACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,WAAW,CAAC,SAAS,CAAC,IAAI,EACpC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,EAClC,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,EACpC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,GAAG,CAAC,MAAM,EAClB,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAC3C,EACF,KAAC,oBAAoB,IACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,GACrC,EACF,kBACM,IAAI,EACR,GAAG,EAAE,OAAO,EACZ,IAAI,EAAC,aAAa,EAClB,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,SAAS,EACzC,aAAa,EAAE,iBAAiB,KAC5B,WAAW,CAAC,OAAO,GACvB,IACD,CACJ,GACU,CACd,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ScatterPlot.js","sourceRoot":"","sources":["../../../src/scatter/ui/ScatterPlot.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { ReactElement } from 'react';
2
+ import type { OverlaySampleShape } from '../../overlay/core/overlayMarks.ts';
2
3
  import type { ScreenPoints } from '../core/screenPoints.ts';
3
4
  /** What {@link ScatterPointLayer} draws. */
4
5
  export interface ScatterPointLayerProps {
@@ -26,6 +27,17 @@ export interface ScatterPointLayerProps {
26
27
  * @default undefined — every group is drawn at full strength
27
28
  */
28
29
  opacities?: readonly number[];
30
+ /**
31
+ * Which shape each point takes, as an index into `shapes`. An entry of `-1`,
32
+ * or one outside the range, is a disc.
33
+ * @default undefined — every point is a disc
34
+ */
35
+ shapeOf?: ArrayLike<number>;
36
+ /**
37
+ * The shapes, in the order `shapeOf` names them.
38
+ * @default undefined
39
+ */
40
+ shapes?: readonly OverlaySampleShape[];
29
41
  /**
30
42
  * Colour of a point belonging to no group. It has to be the one ink on the
31
43
  * plot that names nothing, or a reader counts it as one more group.
@@ -71,7 +83,8 @@ export interface ScatterPointLayerProps {
71
83
  *
72
84
  * A hollow dot is the same dot at the same radius with its colour moved from
73
85
  * the fill to the stroke, so the two read as one kind of thing seen at two
74
- * levels of confidence rather than as two unrelated marks.
86
+ * levels of confidence rather than as two unrelated marks. A shaped point
87
+ * follows the same rule, and covers the area of the disc it stands in for.
75
88
  * @param props - See {@link ScatterPointLayerProps}.
76
89
  * @returns The cloud.
77
90
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ScatterPointLayer.d.ts","sourceRoot":"","sources":["../../../src/scatter/ui/ScatterPointLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAK1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,4CAA4C;AAC5C,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,MAAM,EAAE,YAAY,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,8CACrB,sBAAsB,KAC5B,YAAY,CA+Cb,CAAC"}
1
+ {"version":3,"file":"ScatterPointLayer.d.ts","sourceRoot":"","sources":["../../../src/scatter/ui/ScatterPointLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAK1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,4CAA4C;AAC5C,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,MAAM,EAAE,YAAY,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,8CACrB,sBAAsB,KAC5B,YAAY,CA6Db,CAAC"}
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { memo } from 'react';
3
3
  import { chartGroupIndex } from "../../chart/core/chartGroups.js";
4
4
  import { chartRoundPixel } from "../../chart/core/chartScale.js";
5
+ import { pointShapePath } from "../core/pointShape.js";
5
6
  /**
6
7
  * Every sample as one dot, and nothing else.
7
8
  *
@@ -13,18 +14,20 @@ import { chartRoundPixel } from "../../chart/core/chartScale.js";
13
14
  *
14
15
  * A hollow dot is the same dot at the same radius with its colour moved from
15
16
  * the fill to the stroke, so the two read as one kind of thing seen at two
16
- * levels of confidence rather than as two unrelated marks.
17
+ * levels of confidence rather than as two unrelated marks. A shaped point
18
+ * follows the same rule, and covers the area of the disc it stands in for.
17
19
  * @param props - See {@link ScatterPointLayerProps}.
18
20
  * @returns The cloud.
19
21
  */
20
22
  export const ScatterPointLayer = memo(function ScatterPointLayer(props) {
21
- const { points, groupOf, colors, opacities, fallbackColor = 'var(--text-faint)', radius = 3.5, radii, order, outlinedFrom, } = props;
23
+ const { points, groupOf, colors, opacities, shapeOf, shapes, fallbackColor = 'var(--text-faint)', radius = 3.5, radii, order, outlinedFrom, } = props;
22
24
  const xs = points.x;
23
25
  const ys = points.y;
24
26
  const count = Math.min(xs.length, ys.length);
25
27
  const steps = order === undefined ? count : Math.min(count, order.length);
26
28
  const hollowFrom = outlineStart(outlinedFrom, count);
27
29
  const groups = colors?.length ?? 0;
30
+ const shapeCount = shapes?.length ?? 0;
28
31
  const ink = groupInk(colors, opacities, fallbackColor);
29
32
  const dots = [];
30
33
  for (let step = 0; step < steps; step++) {
@@ -39,7 +42,16 @@ export const ScatterPointLayer = memo(function ScatterPointLayer(props) {
39
42
  const color = ink.colors[slot] ?? fallbackColor;
40
43
  const hollow = index >= hollowFrom;
41
44
  const size = radii?.[index];
42
- dots.push(_jsx("circle", { cx: chartRoundPixel(x), cy: chartRoundPixel(y), r: size === undefined ? radius : chartRoundPixel(size), fill: hollow ? 'none' : color, stroke: hollow ? color : undefined, strokeWidth: hollow ? OUTLINE_WIDTH : undefined, opacity: ink.opacities[slot] }, index));
45
+ const reach = size === undefined ? radius : chartRoundPixel(size);
46
+ const shape = shapes?.[chartGroupIndex(shapeOf, index, shapeCount)];
47
+ const outline = shape === undefined ? null : pointShapePath(shape, x, y, reach);
48
+ const paint = {
49
+ fill: hollow ? 'none' : color,
50
+ stroke: hollow ? color : undefined,
51
+ strokeWidth: hollow ? OUTLINE_WIDTH : undefined,
52
+ opacity: ink.opacities[slot],
53
+ };
54
+ dots.push(outline === null ? (_jsx("circle", { cx: chartRoundPixel(x), cy: chartRoundPixel(y), r: reach, ...paint }, index)) : (_jsx("path", { d: outline, ...paint }, index)));
43
55
  }
44
56
  return _jsx("g", { "data-layer": "points", children: dots });
45
57
  });