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
@@ -1 +1 @@
1
- {"version":3,"file":"ScatterPointLayer.js","sourceRoot":"","sources":["../../../src/scatter/ui/ScatterPointLayer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScatterPointLayer.js","sourceRoot":"","sources":["../../../src/scatter/ui/ScatterPointLayer.tsx"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@
7
7
  * own props add only what its frame needs.
8
8
  */
9
9
  import type { ReactNode } from 'react';
10
+ import type { OverlaySampleShape } from '../../overlay/core/overlayMarks.ts';
10
11
  import type { ScatterSelectionMode } from '../core/scatterSelection.ts';
11
12
  import type { SelectionChange } from './useScatterSelection.ts';
12
13
  /** One group of points on a scatter plot. */
@@ -55,6 +56,18 @@ export interface ScatterGroupProps {
55
56
  * @default undefined — every group is drawn in full
56
57
  */
57
58
  mutedGroups?: ReadonlySet<string>;
59
+ /**
60
+ * Which shape each point takes, as an index into `shapes`: a second
61
+ * grouping of the same points, drawn while colour keeps the first. A point
62
+ * with `-1`, `NaN`, or an index outside the range, is a disc.
63
+ * @default undefined — every point is a disc
64
+ */
65
+ shapeOf?: ArrayLike<number>;
66
+ /**
67
+ * The shapes, in the order `shapeOf` names them.
68
+ * @default undefined
69
+ */
70
+ shapes?: readonly OverlaySampleShape[];
58
71
  /**
59
72
  * Radius of a dot, in pixels. A cloud draws the dot at the middle of its box
60
73
  * at this size, one at the front larger and one at the back smaller.
@@ -1 +1 @@
1
- {"version":3,"file":"scatterFigureProps.d.ts","sourceRoot":"","sources":["../../../src/scatter/ui/scatterFigureProps.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2DAA2D;AAC3D,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,CAAC,EAAE,MAAM,CAAC;IACV,uDAAuD;IACvD,CAAC,EAAE,MAAM,CAAC;IACV;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IACjC;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChD;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,2EAA2E;AAC3E,MAAM,WAAW,uBAAuB;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B;;;OAGG;IACH,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACtD;;;;OAIG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;;;;;;;;;;;OAYG;IACH,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACvD;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"scatterFigureProps.d.ts","sourceRoot":"","sources":["../../../src/scatter/ui/scatterFigureProps.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2DAA2D;AAC3D,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,CAAC,EAAE,MAAM,CAAC;IACV,uDAAuD;IACvD,CAAC,EAAE,MAAM,CAAC;IACV;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IACjC;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChD;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,2EAA2E;AAC3E,MAAM,WAAW,uBAAuB;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B;;;OAGG;IACH,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACtD;;;;OAIG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;;;;;;;;;;;OAYG;IACH,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACvD;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -27,7 +27,8 @@ export interface ScatterPixelMark {
27
27
  * One mark, drawn as the glyph its shape asks for.
28
28
  *
29
29
  * A rule laid across the cloud names no point, so the two rule shapes are
30
- * drawn as the default cross.
30
+ * drawn as the default cross. The three filled polygons are the shapes a
31
+ * sample can take, drawn as large as the disc they stand in for.
31
32
  * @param mark - What to draw, already in the frame's pixels.
32
33
  * @param size - Side of the square the glyph is drawn in, in pixels.
33
34
  * @param key - What React reconciles the glyph by.
@@ -1 +1 @@
1
- {"version":3,"file":"scatterMarkGlyph.d.ts","sourceRoot":"","sources":["../../../src/scatter/ui/scatterMarkGlyph.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAE3E,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,CAAC,EAAE,MAAM,CAAC;IACV,gDAAgD;IAChD,CAAC,EAAE,MAAM,CAAC;IACV,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,YAAY,CAgDd"}
1
+ {"version":3,"file":"scatterMarkGlyph.d.ts","sourceRoot":"","sources":["../../../src/scatter/ui/scatterMarkGlyph.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAG3E,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,CAAC,EAAE,MAAM,CAAC;IACV,gDAAgD;IAChD,CAAC,EAAE,MAAM,CAAC;IACV,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,YAAY,CAsDd"}
@@ -1,10 +1,12 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { chartRoundPixel } from "../../chart/core/chartScale.js";
3
+ import { pointShapePath } from "../core/pointShape.js";
3
4
  /**
4
5
  * One mark, drawn as the glyph its shape asks for.
5
6
  *
6
7
  * A rule laid across the cloud names no point, so the two rule shapes are
7
- * drawn as the default cross.
8
+ * drawn as the default cross. The three filled polygons are the shapes a
9
+ * sample can take, drawn as large as the disc they stand in for.
8
10
  * @param mark - What to draw, already in the frame's pixels.
9
11
  * @param size - Side of the square the glyph is drawn in, in pixels.
10
12
  * @param key - What React reconciles the glyph by.
@@ -28,6 +30,10 @@ export function markGlyph(mark, size, key) {
28
30
  if (shape === 'square') {
29
31
  return (_jsx("rect", { ...shared, x: near, y: top, width: size, height: size, fill: color, stroke: "none" }, key));
30
32
  }
33
+ const polygon = pointShapePath(shape, x, y, half);
34
+ if (polygon !== null) {
35
+ return (_jsx("path", { ...shared, d: polygon, fill: color, stroke: "none" }, key));
36
+ }
31
37
  return (_jsx("path", { ...shared, d: `M${near} ${top}L${far} ${foot}M${far} ${top}L${near} ${foot}`, fill: "none", stroke: color }, key));
32
38
  }
33
39
  //# sourceMappingURL=scatterMarkGlyph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scatterMarkGlyph.js","sourceRoot":"","sources":["../../../src/scatter/ui/scatterMarkGlyph.tsx"],"names":[],"mappings":";AAUA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAoBjE;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CACvB,IAAsB,EACtB,IAAY,EACZ,GAAW;IAEX,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,wEAAwE;IACxE,yEAAyE;IACzE,uDAAuD;IACvD,MAAM,MAAM,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACtC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,KAAK,KAAK,KAAK,CAAC;QAC/B,OAAO,CACL,oBAEM,MAAM,EACV,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,EACtB,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,EACtB,CAAC,EAAE,IAAI,EACP,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAC7B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAN1B,GAAG,CAOR,CACH,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,CACL,kBAEM,MAAM,EACV,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,GAAG,EACN,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,IAAI,EAAE,KAAK,EACX,MAAM,EAAC,MAAM,IAPR,GAAG,CAQR,CACH,CAAC;IACJ,CAAC;IACD,OAAO,CACL,kBAEM,MAAM,EACV,CAAC,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,EACjE,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,KAAK,IAJR,GAAG,CAKR,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"scatterMarkGlyph.js","sourceRoot":"","sources":["../../../src/scatter/ui/scatterMarkGlyph.tsx"],"names":[],"mappings":";AAUA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAmBvD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CACvB,IAAsB,EACtB,IAAY,EACZ,GAAW;IAEX,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,wEAAwE;IACxE,yEAAyE;IACzE,uDAAuD;IACvD,MAAM,MAAM,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACtC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,KAAK,KAAK,KAAK,CAAC;QAC/B,OAAO,CACL,oBAEM,MAAM,EACV,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,EACtB,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,EACtB,CAAC,EAAE,IAAI,EACP,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAC7B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAN1B,GAAG,CAOR,CACH,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,CACL,kBAEM,MAAM,EACV,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,GAAG,EACN,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,IAAI,EAAE,KAAK,EACX,MAAM,EAAC,MAAM,IAPR,GAAG,CAQR,CACH,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,CACL,kBAAoB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAC,MAAM,IAAvD,GAAG,CAAuD,CACtE,CAAC;IACJ,CAAC;IACD,OAAO,CACL,kBAEM,MAAM,EACV,CAAC,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,EACjE,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,KAAK,IAJR,GAAG,CAKR,CACH,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScatterCloud.d.ts","sourceRoot":"","sources":["../../../src/scatter3d/ui/ScatterCloud.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,YAAY,EAAE,MAAM,OAAO,CAAC;AAwBzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CAyLnE"}
1
+ {"version":3,"file":"ScatterCloud.d.ts","sourceRoot":"","sources":["../../../src/scatter3d/ui/ScatterCloud.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,YAAY,EAAE,MAAM,OAAO,CAAC;AAwBzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CA4LnE"}
@@ -37,6 +37,7 @@ import { useOrbitDrag } from "./useOrbitDrag.js";
37
37
  export function ScatterCloud(props) {
38
38
  const { x, y, z, width, height, xLabel, yLabel, zLabel } = props;
39
39
  const { groupOf, groups, mutedGroups, ellipsoid = null } = props;
40
+ const { shapeOf, shapes } = props;
40
41
  const { ellipsoidMinimumPoints, ellipsoidFillOpacity } = props;
41
42
  const { showGroupLabels = false, pointLabels, pointRadius = 3.5 } = props;
42
43
  const { outlinedFrom, selected, defaultSelected, onSelectionChange } = props;
@@ -134,7 +135,7 @@ export function ScatterCloud(props) {
134
135
  delay: wheelZoomDelay ?? CHART_WHEEL_DWELL,
135
136
  onZoom: onWheel,
136
137
  });
137
- return (_jsxs("div", { className: className, "data-testid": testId, style: { position: 'relative', width, height }, role: "img", "aria-label": label ?? cloudLabel(xLabel, yLabel, zLabel, cube.length), children: [_jsxs("svg", { width: width, height: height, style: SVG_STYLE, children: [_jsx(CloudFrameLayer, { camera: camera, viewport: view.viewport, xLabel: xLabel, yLabel: yLabel, zLabel: zLabel }), _jsx(CloudShellLayer, { shells: shells, camera: camera, viewport: view.viewport, fillOpacity: ellipsoidFillOpacity }), _jsx(ScatterPointLayer, { points: cloud.points, order: cloud.order, radii: radii, groupOf: groupOf, colors: ink.colors, opacities: ink.opacities, radius: pointRadius, outlinedFrom: outlinedFrom }), _jsx(ScatterMarkLayer, { points: cloud.points, selected: interaction.selection.mask, hovered: interaction.hover.hovered, focused: interaction.keyboard.cursor, radius: pointRadius }), _jsx(ScatterOverlayLayers, { labels: labels, radius: pointRadius, lassoPath: interaction.lasso.pathData }), _jsx("rect", { x: 0, y: 0, width: Math.max(0, width), height: Math.max(0, height), ref: wheelSurface, fill: "transparent", tabIndex: 0, onKeyDown: interaction.keyboard.onKeyDown, onDoubleClick: handleDoubleClick, ...(selecting ? interaction.surface : orbit.surface) })] }), overlay] }));
138
+ return (_jsxs("div", { className: className, "data-testid": testId, style: { position: 'relative', width, height }, role: "img", "aria-label": label ?? cloudLabel(xLabel, yLabel, zLabel, cube.length), children: [_jsxs("svg", { width: width, height: height, style: SVG_STYLE, children: [_jsx(CloudFrameLayer, { camera: camera, viewport: view.viewport, xLabel: xLabel, yLabel: yLabel, zLabel: zLabel }), _jsx(CloudShellLayer, { shells: shells, camera: camera, viewport: view.viewport, fillOpacity: ellipsoidFillOpacity }), _jsx(ScatterPointLayer, { points: cloud.points, order: cloud.order, radii: radii, groupOf: groupOf, colors: ink.colors, opacities: ink.opacities, shapeOf: shapeOf, shapes: shapes, radius: pointRadius, outlinedFrom: outlinedFrom }), _jsx(ScatterMarkLayer, { points: cloud.points, selected: interaction.selection.mask, hovered: interaction.hover.hovered, focused: interaction.keyboard.cursor, radius: pointRadius }), _jsx(ScatterOverlayLayers, { labels: labels, radius: pointRadius, lassoPath: interaction.lasso.pathData }), _jsx("rect", { x: 0, y: 0, width: Math.max(0, width), height: Math.max(0, height), ref: wheelSurface, fill: "transparent", tabIndex: 0, onKeyDown: interaction.keyboard.onKeyDown, onDoubleClick: handleDoubleClick, ...(selecting ? interaction.surface : orbit.surface) })] }), overlay] }));
138
139
  }
139
140
  /**
140
141
  * How much further than a dot's own radius the pointer may be and still catch
@@ -1 +1 @@
1
- {"version":3,"file":"ScatterCloud.js","sourceRoot":"","sources":["../../../src/scatter3d/ui/ScatterCloud.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScatterCloud.js","sourceRoot":"","sources":["../../../src/scatter3d/ui/ScatterCloud.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-cheminfo",
3
- "version": "0.22.0",
3
+ "version": "0.23.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",
@@ -11,8 +11,12 @@ export type { EmptiestCornerOptions } from './emptiestCorner.ts';
11
11
  export { emptiestCorner } from './emptiestCorner.ts';
12
12
  export type { OverlayBarFoldOptions } from './overlayCollapse.ts';
13
13
  export { overlayBarFolded, shouldCollapseOverlay } from './overlayCollapse.ts';
14
- export type { OverlayMarkShape } from './overlayMarks.ts';
15
- export { OVERLAY_MARK_SHAPES, isFilledMark } from './overlayMarks.ts';
14
+ export type { OverlayMarkShape, OverlaySampleShape } from './overlayMarks.ts';
15
+ export {
16
+ OVERLAY_MARK_SHAPES,
17
+ OVERLAY_SAMPLE_SHAPES,
18
+ isFilledMark,
19
+ } from './overlayMarks.ts';
16
20
  export type {
17
21
  OverlayDensity,
18
22
  OverlayMetrics,
@@ -10,25 +10,62 @@
10
10
 
11
11
  /** Which mark a legend entry, a marker or a series stands for. */
12
12
  export type OverlayMarkShape =
13
- 'dot' | 'ring' | 'square' | 'line' | 'dashed' | 'cross';
13
+ | 'dot'
14
+ | 'ring'
15
+ | 'square'
16
+ | 'triangle'
17
+ | 'diamond'
18
+ | 'triangle-down'
19
+ | 'line'
20
+ | 'dashed'
21
+ | 'cross';
22
+
23
+ /**
24
+ * The shapes a sample's own dot can take, which is how a second grouping of
25
+ * the same samples is drawn while colour keeps the first.
26
+ */
27
+ export type OverlaySampleShape = Extract<
28
+ OverlayMarkShape,
29
+ 'dot' | 'square' | 'triangle' | 'diamond' | 'triangle-down'
30
+ >;
14
31
 
15
32
  /**
16
33
  * Every mark, in the order a picker offers them.
17
34
  *
18
- * The first three separate one filled thing from another by colour alone; the
19
- * last three carry a second meaning on one figure — a line for a component
20
- * beside dots for the samples — which is what keeps a figure readable when the
21
- * colours run out or the reader does not separate two of them.
35
+ * The filled ones come first and separate one thing from another by colour or
36
+ * by outline alone; the last three carry a second meaning on one figure — a
37
+ * line for a component beside dots for the samples — which is what keeps a
38
+ * figure readable when the colours run out or the reader does not separate two
39
+ * of them.
22
40
  */
23
41
  export const OVERLAY_MARK_SHAPES: readonly OverlayMarkShape[] = [
24
42
  'dot',
25
43
  'ring',
26
44
  'square',
45
+ 'triangle',
46
+ 'diamond',
47
+ 'triangle-down',
27
48
  'line',
28
49
  'dashed',
29
50
  'cross',
30
51
  ];
31
52
 
53
+ /**
54
+ * The shapes a second grouping is given, in the order its groups are listed.
55
+ *
56
+ * Five, because that is about where a reader stops telling small shapes apart
57
+ * at a glance. None of them is a ring or a cross: a ring is a sample placed
58
+ * into a finished model and a cross is a group's average, and a sample drawn
59
+ * as either would be read as one of those.
60
+ */
61
+ export const OVERLAY_SAMPLE_SHAPES: readonly OverlaySampleShape[] = [
62
+ 'dot',
63
+ 'square',
64
+ 'triangle',
65
+ 'diamond',
66
+ 'triangle-down',
67
+ ];
68
+
32
69
  /**
33
70
  * Whether a mark is drawn as a solid area rather than as a stroke.
34
71
  *
@@ -39,5 +76,13 @@ export const OVERLAY_MARK_SHAPES: readonly OverlayMarkShape[] = [
39
76
  * @returns `true` for the filled marks, `false` for the drawn ones.
40
77
  */
41
78
  export function isFilledMark(shape: OverlayMarkShape): boolean {
42
- return shape === 'dot' || shape === 'square';
79
+ return FILLED_MARKS.has(shape);
43
80
  }
81
+
82
+ const FILLED_MARKS: ReadonlySet<OverlayMarkShape> = new Set<OverlayMarkShape>([
83
+ 'dot',
84
+ 'square',
85
+ 'triangle',
86
+ 'diamond',
87
+ 'triangle-down',
88
+ ]);
@@ -73,6 +73,11 @@ const MARK_GEOMETRY: Record<OverlayMarkShape, ReactElement> = {
73
73
  dot: <circle cx="6" cy="6" r="4.2" />,
74
74
  ring: <circle cx="6" cy="6" r="3.4" strokeWidth="2.2" />,
75
75
  square: <rect x="2" y="2" width="8" height="8" rx="1.5" />,
76
+ // Balanced on the centre of the box, as the dots they name are balanced on
77
+ // their samples.
78
+ triangle: <path d="M6 0.8L10.5 8.6L1.5 8.6Z" />,
79
+ diamond: <path d="M6 1L11 6L6 11L1 6Z" />,
80
+ 'triangle-down': <path d="M1.5 3.4L10.5 3.4L6 11.2Z" />,
76
81
  line: <line x1="0.5" y1="6" x2="11.5" y2="6" strokeWidth="2.8" />,
77
82
  dashed: (
78
83
  <line
@@ -35,13 +35,15 @@ export type { ProjectionCopy } from './projectionCopy.ts';
35
35
  export { PROJECTION_COPY } from './projectionCopy.ts';
36
36
  export type { ProjectionCopyPatch } from './projectionCopyPatch.ts';
37
37
  export type {
38
- ProjectionColorBy,
39
38
  ProjectionOptionId,
40
39
  ProjectionOptions,
41
40
  ProjectionVariablesView,
42
41
  } from './projectionOptions.ts';
43
42
  export { mergeProjectionCopy } from './mergeProjectionCopy.ts';
44
- export { DEFAULT_PROJECTION_OPTIONS } from './projectionOptions.ts';
43
+ export {
44
+ DEFAULT_PROJECTION_OPTIONS,
45
+ NO_GROUPING,
46
+ } from './projectionOptions.ts';
45
47
  export type {
46
48
  ProjectionChoiceWords,
47
49
  ProjectionOutlineWords,
@@ -56,10 +58,16 @@ export type {
56
58
  } from './projectionResult.ts';
57
59
  export type {
58
60
  ProjectionField,
61
+ ProjectionGrouping,
59
62
  ProjectionSamples,
60
63
  ResolvedProjectionGroups,
64
+ ResolvedProjectionShapes,
61
65
  } from './projectionSamples.ts';
62
- export { resolveProjectionGroups } from './projectionSamples.ts';
66
+ export {
67
+ projectionGrouping,
68
+ resolveProjectionGroups,
69
+ resolveProjectionShapes,
70
+ } from './projectionGroupings.ts';
63
71
  export type {
64
72
  ProjectionBarWords,
65
73
  ProjectionHelp,
@@ -86,6 +86,8 @@ export interface ProjectionCopy {
86
86
  projected: string;
87
87
  /** The title of a key whose colour stands for nothing, so only shape is left. */
88
88
  shapes: string;
89
+ /** What the shape stands for, after what the colour does. Carries `{shapes}`. */
90
+ shapedBy: string;
89
91
  };
90
92
  /** The sentences the viewer builds from the data. */
91
93
  sentence: {
@@ -208,6 +210,7 @@ export const PROJECTION_COPY: ProjectionCopy = {
208
210
  notOutlined: 'Not outlined: too few samples.',
209
211
  projected: 'Hollow = added after the map was built',
210
212
  shapes: 'Shape = what each mark is.',
213
+ shapedBy: 'Shape = {shapes}.',
211
214
  },
212
215
  sentence: {
213
216
  sharesFirst:
@@ -0,0 +1,174 @@
1
+ /**
2
+ * How the groupings a page hands in become what a figure draws: the one that
3
+ * colours the dots, painted from the shared palette, and the one that shapes
4
+ * them, given one shape per group.
5
+ *
6
+ * Both are cut the same way — the page's own order first, then every group in
7
+ * the order its first row names it — so a group keeps its colour and its shape
8
+ * however the rows are filtered.
9
+ */
10
+
11
+ import {
12
+ CHART_SERIES_COLORS,
13
+ chartSeriesColor,
14
+ } from '../../chart/core/chartPalette.ts';
15
+ import { OVERLAY_SAMPLE_SHAPES } from '../../overlay/core/overlayMarks.ts';
16
+
17
+ import type {
18
+ ProjectionGrouping,
19
+ ProjectionSamples,
20
+ ResolvedProjectionGroups,
21
+ ResolvedProjectionShapes,
22
+ } from './projectionSamples.ts';
23
+
24
+ /**
25
+ * The grouping a set of samples is coloured by, in a shape a legend and a plot
26
+ * can both read.
27
+ *
28
+ * A group named in `order` but held by no row is kept, so a legend does not
29
+ * reshuffle when a filter empties one; a row naming a group that is not in
30
+ * `order` is appended in the order it appears.
31
+ * @param grouping - The grouping, or nothing when the dots are not coloured.
32
+ * @param count - How many rows there are, which is the score matrix's height.
33
+ * @returns The resolved groups. No grouping gives no entries at all, and every
34
+ * row lands at `-1`.
35
+ */
36
+ export function resolveProjectionGroups(
37
+ grouping: ProjectionGrouping | undefined,
38
+ count: number,
39
+ ): ResolvedProjectionGroups {
40
+ const { label, entries, rowOf } = partition(grouping, count);
41
+ const colored = entries.map((entry) => ({ ...entry, color: '' }));
42
+ paintGroups(colored, grouping?.colors);
43
+ return { label, entries: colored, groupOf: rowOf };
44
+ }
45
+
46
+ /**
47
+ * The grouping a set of samples is shaped by, one shape per group.
48
+ *
49
+ * A grouping of more groups than there are shapes is refused as a whole rather
50
+ * than drawn with two groups sharing a shape, or with the last ones falling
51
+ * back to a disc: either would put two groups under one mark, which is the one
52
+ * thing a key cannot undo.
53
+ * @param grouping - The grouping, or nothing when the dots are not shaped.
54
+ * @param count - How many rows there are, which is the score matrix's height.
55
+ * @returns The resolved shapes, or `null` when there is no grouping or its
56
+ * groups outnumber the shapes.
57
+ */
58
+ export function resolveProjectionShapes(
59
+ grouping: ProjectionGrouping | undefined,
60
+ count: number,
61
+ ): ResolvedProjectionShapes | null {
62
+ if (grouping === undefined) return null;
63
+ const { label, entries, rowOf } = partition(grouping, count);
64
+ if (entries.length > OVERLAY_SAMPLE_SHAPES.length) return null;
65
+ const shaped = entries.map((entry, index) => ({
66
+ ...entry,
67
+ shape: OVERLAY_SAMPLE_SHAPES[index] ?? 'dot',
68
+ }));
69
+ return { label, entries: shaped, shapeOf: rowOf };
70
+ }
71
+
72
+ /**
73
+ * The grouping carrying an id.
74
+ * @param samples - Who the rows are.
75
+ * @param id - The id asked for.
76
+ * @returns The grouping, or `undefined` when none carries it.
77
+ */
78
+ export function projectionGrouping(
79
+ samples: ProjectionSamples,
80
+ id: string,
81
+ ): ProjectionGrouping | undefined {
82
+ for (const grouping of samples.groupings ?? NO_GROUPINGS) {
83
+ if (grouping.id === id) return grouping;
84
+ }
85
+ return undefined;
86
+ }
87
+
88
+ const NO_GROUP = -1;
89
+ const DEFAULT_GROUP_LABEL = 'Group';
90
+ const NO_GROUPINGS: readonly ProjectionGrouping[] = [];
91
+
92
+ interface GroupEntry {
93
+ id: string;
94
+ label: string;
95
+ count: number;
96
+ }
97
+
98
+ interface ColoredEntry extends GroupEntry {
99
+ color: string;
100
+ }
101
+
102
+ function partition(
103
+ grouping: ProjectionGrouping | undefined,
104
+ count: number,
105
+ ): { label: string; entries: GroupEntry[]; rowOf: Int32Array } {
106
+ const rowCount = Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0;
107
+ const label = grouping?.label ?? DEFAULT_GROUP_LABEL;
108
+ const rowOf = new Int32Array(rowCount).fill(NO_GROUP);
109
+ const entries: GroupEntry[] = [];
110
+ if (grouping === undefined) return { label, entries, rowOf };
111
+
112
+ const indexOfGroup = new Map<string, number>();
113
+ for (const id of grouping.order ?? []) {
114
+ appendGroup(entries, indexOfGroup, id);
115
+ }
116
+ for (let row = 0; row < rowCount; row++) {
117
+ const id = grouping.groups[row];
118
+ if (id === undefined) continue;
119
+ const at = appendGroup(entries, indexOfGroup, id);
120
+ rowOf[row] = at;
121
+ const entry = entries[at];
122
+ if (entry !== undefined) entry.count++;
123
+ }
124
+ return { label, entries, rowOf };
125
+ }
126
+
127
+ function appendGroup(
128
+ entries: GroupEntry[],
129
+ indexOfGroup: Map<string, number>,
130
+ id: string,
131
+ ): number {
132
+ const known = indexOfGroup.get(id);
133
+ if (known !== undefined) return known;
134
+ const at = entries.length;
135
+ indexOfGroup.set(id, at);
136
+ entries.push({ id, label: id, count: 0 });
137
+ return at;
138
+ }
139
+
140
+ function paintGroups(
141
+ entries: ColoredEntry[],
142
+ pinned: Readonly<Record<string, string>> | undefined,
143
+ ): void {
144
+ // Every pinned colour is taken out of the palette before any group draws
145
+ // from it, so pinning the third group's hue onto the first does not leave
146
+ // two groups wearing it.
147
+ const taken = new Set<string>();
148
+ if (pinned !== undefined) {
149
+ for (const entry of entries) {
150
+ const color = pinned[entry.id];
151
+ if (color !== undefined) taken.add(color.toLowerCase());
152
+ }
153
+ }
154
+
155
+ let cursor = 0;
156
+ for (const entry of entries) {
157
+ const own = pinned?.[entry.id];
158
+ if (own !== undefined) {
159
+ entry.color = own;
160
+ continue;
161
+ }
162
+ let color = chartSeriesColor(cursor, 'group');
163
+ while (
164
+ cursor < CHART_SERIES_COLORS.length &&
165
+ taken.has(color.toLowerCase())
166
+ ) {
167
+ cursor++;
168
+ color = chartSeriesColor(cursor, 'group');
169
+ }
170
+ cursor++;
171
+ taken.add(color.toLowerCase());
172
+ entry.color = color;
173
+ }
174
+ }
@@ -14,10 +14,10 @@ export type ProjectionVariablesView =
14
14
  | 'sample';
15
15
 
16
16
  /**
17
- * What decides a dot's colour on the map: `'group'`, `'none'`, or nothing else
18
- * in this release.
17
+ * The word for "no grouping" wherever an option names one, which is why no
18
+ * grouping may be called it.
19
19
  */
20
- export type ProjectionColorBy = 'group' | 'none';
20
+ export const NO_GROUPING = 'none';
21
21
 
22
22
  /** What the figure is currently showing. Every field is a control in the floating bar. */
23
23
  export interface ProjectionOptions {
@@ -43,10 +43,20 @@ export interface ProjectionOptions {
43
43
  */
44
44
  cloudGesture: CloudGesture;
45
45
  /**
46
- * What decides a dot's colour.
47
- * @default 'group'
46
+ * Which grouping colours the dots, by its id, or `'none'`. An id no grouping
47
+ * carries — the empty string, or one saved on other data — takes the first
48
+ * grouping.
49
+ * @default ''
48
50
  */
49
- colorBy: ProjectionColorBy;
51
+ colorBy: string;
52
+ /**
53
+ * Which grouping gives the dots their shapes, by its id, or `'none'`. An id
54
+ * no grouping carries takes the second grouping — the first when the colour
55
+ * has taken the second — and a grouping of more groups than there are
56
+ * shapes is not drawn.
57
+ * @default ''
58
+ */
59
+ shapeBy: string;
50
60
  /**
51
61
  * How large the group outlines are, or `null` for none.
52
62
  * @default { kind: 'coverage', probability: 0.95 }
@@ -134,7 +144,8 @@ export const DEFAULT_PROJECTION_OPTIONS: ProjectionOptions = {
134
144
  yAxis: 1,
135
145
  zAxis: 2,
136
146
  cloudGesture: 'turn',
137
- colorBy: 'group',
147
+ colorBy: '',
148
+ shapeBy: '',
138
149
  ellipse: { kind: 'coverage', probability: 0.95 },
139
150
  pointRadius: 3.5,
140
151
  showGroupMeans: false,
@@ -44,6 +44,12 @@ export interface ProjectionPanelWords {
44
44
  export interface ProjectionReasonWords {
45
45
  /** Why the colour cannot be set: the samples carry no groups. */
46
46
  noGroups: string;
47
+ /** Why the shape cannot be set: the samples carry no groups. */
48
+ noGroupsToShape: string;
49
+ /** Why a grouping is greyed in the shape picker: the colour already draws it. */
50
+ shapeIsColour: string;
51
+ /** Why a grouping is greyed in the shape picker: it has more groups than shapes. */
52
+ tooManyShapes: string;
47
53
  /** Why the map's outlines cannot be set while nothing is coloured. */
48
54
  uncolouredOutlines: string;
49
55
  /** Why the cloud's shells cannot be set while nothing is coloured. */
@@ -97,6 +103,7 @@ export const PROJECTION_PANEL_WORDS: ProjectionPanelWords = {
97
103
  zAxis: 'Into',
98
104
  cloudGesture: 'Drag does',
99
105
  colorBy: 'Colour by',
106
+ shapeBy: 'Shape by',
100
107
  ellipse: 'Outlines',
101
108
  pointRadius: 'Dot size',
102
109
  showGroupMeans: 'Averages',
@@ -124,6 +131,9 @@ export const PROJECTION_PANEL_WORDS: ProjectionPanelWords = {
124
131
  /** The reasons a greyed control gives when a site overrides nothing. */
125
132
  export const PROJECTION_REASON_WORDS: ProjectionReasonWords = {
126
133
  noGroups: 'These samples carry no groups to colour by.',
134
+ noGroupsToShape: 'These samples carry no groups to shape by.',
135
+ shapeIsColour: 'The colour already stands for these groups.',
136
+ tooManyShapes: 'More groups than there are shapes to tell apart.',
127
137
  uncolouredOutlines:
128
138
  'Outlines follow the groups, so colour the map by them first.',
129
139
  uncolouredShells: