cx 26.2.1 → 26.2.3

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 (324) hide show
  1. package/build/charts/Chart.d.ts.map +1 -1
  2. package/build/charts/Chart.js +5 -4
  3. package/build/charts/ColumnBarBase.d.ts +3 -3
  4. package/build/charts/ColumnBarBase.d.ts.map +1 -1
  5. package/build/charts/ColumnBarBase.js +1 -1
  6. package/build/charts/Legend.d.ts.map +1 -1
  7. package/build/charts/Legend.js +11 -4
  8. package/build/charts/Marker.d.ts +3 -3
  9. package/build/charts/Marker.d.ts.map +1 -1
  10. package/build/charts/MarkerLine.d.ts +7 -7
  11. package/build/charts/MarkerLine.d.ts.map +1 -1
  12. package/build/charts/MarkerLine.js +14 -10
  13. package/build/charts/PieChart.d.ts +4 -4
  14. package/build/charts/PieChart.d.ts.map +1 -1
  15. package/build/charts/PieChart.js +36 -14
  16. package/build/charts/PieLabel.d.ts.map +1 -1
  17. package/build/charts/PieLabel.js +2 -1
  18. package/build/charts/RangeMarker.d.ts +3 -3
  19. package/build/charts/RangeMarker.d.ts.map +1 -1
  20. package/build/charts/RangeMarker.js +1 -1
  21. package/build/charts/axis/TimeAxis.d.ts +3 -3
  22. package/build/charts/axis/TimeAxis.d.ts.map +1 -1
  23. package/build/charts/axis/TimeAxis.js +70 -21
  24. package/build/charts/helpers/ValueAtFinder.d.ts +1 -1
  25. package/build/charts/helpers/ValueAtFinder.d.ts.map +1 -1
  26. package/build/charts/helpers/ValueAtFinder.js +5 -2
  27. package/build/data/StructuredSelector.js +3 -4
  28. package/build/data/createAccessorModelProxy.d.ts +6 -11
  29. package/build/data/createAccessorModelProxy.d.ts.map +1 -1
  30. package/build/data/createAccessorModelProxy.js +1 -3
  31. package/build/svg/Ellipse.d.ts +5 -4
  32. package/build/svg/Ellipse.d.ts.map +1 -1
  33. package/build/svg/Ellipse.js +9 -6
  34. package/build/svg/Line.d.ts +1 -0
  35. package/build/svg/Line.d.ts.map +1 -1
  36. package/build/svg/Line.js +4 -1
  37. package/build/svg/Text.d.ts +12 -6
  38. package/build/svg/Text.d.ts.map +1 -1
  39. package/build/svg/Text.js +12 -4
  40. package/build/ui/Controller.d.ts +2 -0
  41. package/build/ui/Controller.d.ts.map +1 -1
  42. package/build/ui/Controller.js +3 -0
  43. package/build/ui/HoverSync.d.ts.map +1 -1
  44. package/build/ui/HoverSync.js +7 -2
  45. package/build/ui/Prop.d.ts +1 -1
  46. package/build/ui/Prop.d.ts.map +1 -1
  47. package/build/ui/Text.d.ts +3 -3
  48. package/build/ui/Text.d.ts.map +1 -1
  49. package/build/ui/Text.js +5 -5
  50. package/build/ui/adapter/GroupAdapter.d.ts.map +1 -1
  51. package/build/ui/adapter/GroupAdapter.js +20 -10
  52. package/build/ui/app/History.js +1 -1
  53. package/build/widgets/List.d.ts.map +1 -1
  54. package/build/widgets/List.js +6 -7
  55. package/build/widgets/drag-drop/DropZone.d.ts +3 -3
  56. package/build/widgets/drag-drop/DropZone.d.ts.map +1 -1
  57. package/build/widgets/form/Calendar.d.ts.map +1 -1
  58. package/build/widgets/form/Calendar.js +30 -11
  59. package/build/widgets/form/ColorField.d.ts.map +1 -1
  60. package/build/widgets/form/ColorField.js +16 -7
  61. package/build/widgets/form/DateTimeField.d.ts.map +1 -1
  62. package/build/widgets/form/DateTimeField.js +23 -10
  63. package/build/widgets/form/Field.d.ts +2 -0
  64. package/build/widgets/form/Field.d.ts.map +1 -1
  65. package/build/widgets/form/Field.js +11 -5
  66. package/build/widgets/form/LookupField.d.ts +1 -1
  67. package/build/widgets/form/LookupField.d.ts.map +1 -1
  68. package/build/widgets/form/LookupField.js +6 -6
  69. package/build/widgets/form/MonthField.d.ts.map +1 -1
  70. package/build/widgets/form/MonthField.js +15 -7
  71. package/build/widgets/form/MonthPicker.d.ts +1 -2
  72. package/build/widgets/form/MonthPicker.d.ts.map +1 -1
  73. package/build/widgets/form/MonthPicker.js +84 -41
  74. package/build/widgets/form/NumberField.d.ts +2 -0
  75. package/build/widgets/form/NumberField.d.ts.map +1 -1
  76. package/build/widgets/form/NumberField.js +45 -15
  77. package/build/widgets/form/TextField.d.ts +1 -9
  78. package/build/widgets/form/TextField.d.ts.map +1 -1
  79. package/build/widgets/form/TextField.js +1 -1
  80. package/build/widgets/grid/Grid.d.ts +2 -2
  81. package/build/widgets/grid/Grid.d.ts.map +1 -1
  82. package/build/widgets/grid/Grid.js +9 -4
  83. package/build/widgets/grid/Pagination.d.ts.map +1 -1
  84. package/build/widgets/grid/Pagination.js +4 -4
  85. package/build/widgets/grid/TreeNode.d.ts.map +1 -1
  86. package/build/widgets/grid/TreeNode.js +10 -2
  87. package/build/widgets/icons/folder.d.ts.map +1 -1
  88. package/build/widgets/icons/folder.js +1 -0
  89. package/build/widgets/icons/forward.d.ts.map +1 -1
  90. package/build/widgets/icons/forward.js +4 -3
  91. package/build/widgets/icons/loading.d.ts.map +1 -1
  92. package/build/widgets/icons/loading.js +6 -5
  93. package/build/widgets/icons/square.d.ts.map +1 -1
  94. package/build/widgets/icons/square.js +3 -3
  95. package/build/widgets/index.d.ts +3 -1
  96. package/build/widgets/index.d.ts.map +1 -1
  97. package/build/widgets/index.js +3 -1
  98. package/build/widgets/overlay/ContextMenu.d.ts.map +1 -1
  99. package/build/widgets/overlay/ContextMenu.js +2 -0
  100. package/build/widgets/overlay/Dropdown.d.ts +2 -1
  101. package/build/widgets/overlay/Dropdown.d.ts.map +1 -1
  102. package/build/widgets/overlay/Dropdown.js +75 -20
  103. package/build/widgets/overlay/MsgBox.d.ts +1 -0
  104. package/build/widgets/overlay/MsgBox.d.ts.map +1 -1
  105. package/build/widgets/overlay/MsgBox.js +2 -2
  106. package/build/widgets/overlay/Overlay.d.ts +32 -2
  107. package/build/widgets/overlay/Overlay.d.ts.map +1 -1
  108. package/build/widgets/overlay/Overlay.js +47 -16
  109. package/build/widgets/overlay/Toast.d.ts +1 -1
  110. package/build/widgets/overlay/Toast.d.ts.map +1 -1
  111. package/build/widgets/overlay/Toast.js +4 -1
  112. package/build/widgets/overlay/Tooltip.d.ts +6 -0
  113. package/build/widgets/overlay/Tooltip.d.ts.map +1 -1
  114. package/build/widgets/overlay/Tooltip.js +24 -9
  115. package/build/widgets/overlay/Window.d.ts.map +1 -1
  116. package/build/widgets/overlay/Window.js +24 -9
  117. package/dist/charts.css +325 -272
  118. package/dist/charts.js +11 -5
  119. package/dist/data.js +2 -2
  120. package/dist/manifest.js +892 -880
  121. package/dist/svg.css +14 -8
  122. package/dist/svg.js +9 -1
  123. package/dist/ui.js +29 -16
  124. package/dist/widgets.css +997 -294
  125. package/dist/widgets.js +317 -121
  126. package/package.json +1 -1
  127. package/src/charts/Bar.scss +13 -10
  128. package/src/charts/BarGraph.scss +31 -29
  129. package/src/charts/BubbleGraph.scss +11 -8
  130. package/src/charts/Chart.ts +5 -3
  131. package/src/charts/Column.scss +13 -10
  132. package/src/charts/ColumnBarBase.tsx +255 -230
  133. package/src/charts/ColumnGraph.scss +13 -11
  134. package/src/charts/Gridlines.scss +10 -8
  135. package/src/charts/Legend.scss +57 -50
  136. package/src/charts/Legend.tsx +257 -213
  137. package/src/charts/LegendEntry.scss +35 -29
  138. package/src/charts/LineGraph.scss +28 -25
  139. package/src/charts/Marker.scss +12 -10
  140. package/src/charts/Marker.tsx +3 -2
  141. package/src/charts/MarkerLine.scss +11 -8
  142. package/src/charts/MarkerLine.tsx +196 -177
  143. package/src/charts/PieChart.scss +12 -9
  144. package/src/charts/PieChart.tsx +717 -591
  145. package/src/charts/PieLabel.tsx +99 -81
  146. package/src/charts/Range.scss +11 -8
  147. package/src/charts/RangeMarker.tsx +204 -187
  148. package/src/charts/ScatterGraph.scss +12 -9
  149. package/src/charts/axis/Axis.scss +6 -5
  150. package/src/charts/axis/CategoryAxis.scss +10 -8
  151. package/src/charts/axis/NumericAxis.scss +9 -6
  152. package/src/charts/axis/TimeAxis.scss +9 -6
  153. package/src/charts/axis/TimeAxis.tsx +753 -637
  154. package/src/charts/axis/index.scss +4 -5
  155. package/src/charts/axis/variables.scss +4 -2
  156. package/src/charts/helpers/ValueAtFinder.ts +19 -5
  157. package/src/charts/index.scss +16 -19
  158. package/src/charts/maps.scss +0 -0
  159. package/src/charts/palette.scss +11 -31
  160. package/src/charts/palette.variables.scss +23 -0
  161. package/src/charts/variables.scss +35 -3
  162. package/src/data/StructuredSelector.ts +2 -2
  163. package/src/data/createAccessorModelProxy.ts +66 -74
  164. package/src/index.scss +5 -6
  165. package/src/maps.scss +5 -0
  166. package/src/svg/Ellipse.tsx +62 -55
  167. package/src/svg/Line.tsx +57 -42
  168. package/src/svg/Svg.scss +6 -6
  169. package/src/svg/Text.scss +19 -0
  170. package/src/svg/Text.tsx +172 -116
  171. package/src/svg/index.scss +3 -2
  172. package/src/svg/maps.scss +0 -0
  173. package/src/svg/variables.scss +0 -0
  174. package/src/ui/Container.spec.ts +59 -0
  175. package/src/ui/Controller.spec.tsx +30 -0
  176. package/src/ui/Controller.ts +5 -0
  177. package/src/ui/HoverSync.tsx +179 -147
  178. package/src/ui/Prop.ts +1 -1
  179. package/src/ui/Text.ts +12 -9
  180. package/src/ui/adapter/GroupAdapter.spec.ts +42 -0
  181. package/src/ui/adapter/GroupAdapter.ts +25 -14
  182. package/src/ui/app/History.ts +1 -1
  183. package/src/ui/index.scss +1 -1
  184. package/src/ui/layout/LabelsLeftLayout.scss +5 -7
  185. package/src/ui/layout/LabelsTopLayout.scss +4 -6
  186. package/src/ui/layout/index.scss +2 -3
  187. package/src/ui/maps.scss +0 -0
  188. package/src/ui/variables.scss +1 -2
  189. package/src/util/index.scss +4 -2
  190. package/src/util/maps.scss +1 -0
  191. package/src/util/scss/besm.scss +15 -0
  192. package/src/util/scss/calc.scss +103 -11
  193. package/src/util/scss/defaults.scss +24 -0
  194. package/src/util/scss/elements.scss +78 -0
  195. package/src/util/scss/global.scss +15 -0
  196. package/src/util/scss/include.scss +17 -9
  197. package/src/util/scss/index.scss +1 -9
  198. package/src/util/scss/maps.scss +2 -0
  199. package/src/util/scss/pad-size.scss +9 -0
  200. package/src/util/scss/padding.scss +6 -0
  201. package/src/util/scss/screen-size.scss +5 -0
  202. package/src/util/scss/variables.scss +6 -0
  203. package/src/util/variables.scss +1 -0
  204. package/src/variables.scss +5 -217
  205. package/src/widgets/Button.maps.scss +103 -0
  206. package/src/widgets/Button.scss +33 -9
  207. package/src/widgets/Button.variables.scss +8 -104
  208. package/src/widgets/CxCredit.scss +2 -0
  209. package/src/widgets/FlexBox.scss +16 -11
  210. package/src/widgets/Heading.scss +6 -0
  211. package/src/widgets/HighlightedSearchText.scss +8 -1
  212. package/src/widgets/Icon.scss +6 -0
  213. package/src/widgets/List.scss +7 -0
  214. package/src/widgets/List.tsx +6 -7
  215. package/src/widgets/ProgressBar.scss +9 -0
  216. package/src/widgets/Resizer.scss +9 -7
  217. package/src/widgets/Section.scss +53 -56
  218. package/src/widgets/animations.scss +4 -2
  219. package/src/widgets/box.scss +47 -0
  220. package/src/widgets/drag-drop/DragClone.scss +12 -4
  221. package/src/widgets/drag-drop/DragHandle.scss +12 -6
  222. package/src/widgets/drag-drop/DragSource.scss +12 -6
  223. package/src/widgets/drag-drop/DropZone.scss +9 -0
  224. package/src/widgets/drag-drop/DropZone.tsx +3 -3
  225. package/src/widgets/drag-drop/index.scss +4 -4
  226. package/src/widgets/drag-drop/maps.scss +7 -0
  227. package/src/widgets/drag-drop/variables.scss +8 -5
  228. package/src/widgets/form/Calendar.maps.scss +54 -0
  229. package/src/widgets/form/Calendar.scss +49 -11
  230. package/src/widgets/form/Calendar.tsx +755 -653
  231. package/src/widgets/form/Calendar.variables.scss +3 -46
  232. package/src/widgets/form/Checkbox.maps.scss +34 -0
  233. package/src/widgets/form/Checkbox.scss +14 -3
  234. package/src/widgets/form/Checkbox.variables.scss +4 -36
  235. package/src/widgets/form/ColorField.scss +21 -2
  236. package/src/widgets/form/ColorField.tsx +485 -431
  237. package/src/widgets/form/ColorPicker.maps.scss +21 -0
  238. package/src/widgets/form/ColorPicker.scss +26 -9
  239. package/src/widgets/form/ColorPicker.variables.scss +3 -16
  240. package/src/widgets/form/DateTimeField.scss +54 -21
  241. package/src/widgets/form/DateTimeField.tsx +697 -615
  242. package/src/widgets/form/DateTimePicker.scss +14 -4
  243. package/src/widgets/form/Field.maps.scss +122 -0
  244. package/src/widgets/form/Field.scss +54 -18
  245. package/src/widgets/form/Field.tsx +611 -504
  246. package/src/widgets/form/Field.variables.scss +46 -0
  247. package/src/widgets/form/HelpText.scss +8 -5
  248. package/src/widgets/form/Label.scss +10 -3
  249. package/src/widgets/form/LookupField.maps.scss +26 -0
  250. package/src/widgets/form/LookupField.scss +54 -24
  251. package/src/widgets/form/LookupField.tsx +25 -21
  252. package/src/widgets/form/MonthField.scss +48 -26
  253. package/src/widgets/form/MonthField.tsx +645 -567
  254. package/src/widgets/form/MonthPicker.maps.scss +50 -0
  255. package/src/widgets/form/MonthPicker.scss +44 -35
  256. package/src/widgets/form/MonthPicker.tsx +954 -724
  257. package/src/widgets/form/MonthPicker.variables.scss +24 -0
  258. package/src/widgets/form/NumberField.scss +19 -2
  259. package/src/widgets/form/NumberField.tsx +576 -466
  260. package/src/widgets/form/Radio.maps.scss +36 -0
  261. package/src/widgets/form/Radio.scss +12 -2
  262. package/src/widgets/form/Radio.variables.scss +3 -42
  263. package/src/widgets/form/Select.scss +25 -9
  264. package/src/widgets/form/Slider.scss +23 -14
  265. package/src/widgets/form/Switch.scss +18 -8
  266. package/src/widgets/form/TextArea.scss +14 -1
  267. package/src/widgets/form/TextField.scss +24 -3
  268. package/src/widgets/form/TextField.tsx +9 -21
  269. package/src/widgets/form/UploadButton.scss +14 -6
  270. package/src/widgets/form/ValidationError.scss +10 -6
  271. package/src/widgets/form/Wheel.scss +14 -4
  272. package/src/widgets/form/index.scss +22 -24
  273. package/src/widgets/form/maps.scss +81 -0
  274. package/src/widgets/form/variables.scss +111 -355
  275. package/src/widgets/grid/Grid.scss +19 -2
  276. package/src/widgets/grid/Grid.spec.ts +42 -0
  277. package/src/widgets/grid/Grid.tsx +15 -7
  278. package/src/widgets/grid/Pagination.scss +11 -2
  279. package/src/widgets/grid/Pagination.tsx +110 -102
  280. package/src/widgets/grid/TreeNode.scss +25 -8
  281. package/src/widgets/grid/TreeNode.tsx +127 -116
  282. package/src/widgets/grid/index.scss +3 -4
  283. package/src/widgets/grid/maps.scss +110 -0
  284. package/src/widgets/grid/variables.scss +48 -137
  285. package/src/widgets/icons/folder.tsx +1 -2
  286. package/src/widgets/icons/forward.tsx +23 -20
  287. package/src/widgets/icons/loading.tsx +22 -19
  288. package/src/widgets/icons/square.tsx +20 -17
  289. package/src/widgets/index.scss +16 -16
  290. package/src/widgets/index.ts +63 -58
  291. package/src/widgets/lists.scss +42 -0
  292. package/src/widgets/maps.scss +139 -0
  293. package/src/widgets/nav/Link.scss +14 -1
  294. package/src/widgets/nav/Menu.scss +13 -7
  295. package/src/widgets/nav/Menu.variables.scss +1 -12
  296. package/src/widgets/nav/MenuItem.scss +21 -6
  297. package/src/widgets/nav/Scroller.scss +11 -2
  298. package/src/widgets/nav/Tab.maps.scss +78 -0
  299. package/src/widgets/nav/Tab.scss +12 -6
  300. package/src/widgets/nav/Tab.variables.scss +7 -76
  301. package/src/widgets/nav/cover.scss +6 -4
  302. package/src/widgets/nav/index.scss +6 -6
  303. package/src/widgets/nav/maps.scss +32 -0
  304. package/src/widgets/nav/variables.scss +4 -11
  305. package/src/widgets/overlay/ContextMenu.ts +3 -0
  306. package/src/widgets/overlay/Dropdown.scss +47 -16
  307. package/src/widgets/overlay/Dropdown.tsx +851 -676
  308. package/src/widgets/overlay/MsgBox.tsx +125 -111
  309. package/src/widgets/overlay/Overlay.scss +60 -40
  310. package/src/widgets/overlay/Overlay.tsx +948 -800
  311. package/src/widgets/overlay/Toast.scss +42 -34
  312. package/src/widgets/overlay/Toast.ts +11 -1
  313. package/src/widgets/overlay/Tooltip.scss +27 -96
  314. package/src/widgets/overlay/Tooltip.tsx +376 -309
  315. package/src/widgets/overlay/Window.maps.scss +51 -0
  316. package/src/widgets/overlay/Window.scss +17 -17
  317. package/src/widgets/overlay/Window.tsx +291 -236
  318. package/src/widgets/overlay/Window.variables.scss +2 -43
  319. package/src/widgets/overlay/index.d.ts +11 -11
  320. package/src/widgets/overlay/index.scss +6 -15
  321. package/src/widgets/overlay/maps.scss +44 -0
  322. package/src/widgets/overlay/variables.scss +11 -42
  323. package/src/widgets/variables.scss +33 -117
  324. package/src/global.scss +0 -14
@@ -1,50 +1,57 @@
1
- @use "sass:map";
2
-
3
- @mixin cx-legend($name: "legend", $besm: $cx-besm) {
4
- $block: map.get($besm, block);
5
- $element: map.get($besm, element);
6
- $state: map.get($besm, state);
7
-
8
- .#{$block}#{$name} {
9
- display: flex;
10
- justify-content: center;
11
- align-items: flex-start;
12
- flex-wrap: wrap;
13
- gap: 5px 10px;
14
- }
15
-
16
- .#{$block}#{$name}.#{$state}vertical {
17
- flex-direction: column;
18
- }
19
-
20
- .#{$element}#{$name}-entry {
21
- display: flex;
22
- align-items: center;
23
- padding: 5px;
24
- gap: 5px;
25
- font-size: smaller;
26
- position: relative;
27
- box-sizing: border-box;
28
- cursor: pointer;
29
- }
30
-
31
- .#{$element}#{$name}-svg {
32
- flex-shrink: 0;
33
- }
34
-
35
- .#{$element}#{$name}-shape {
36
- fill: rgba(128, 128, 128, 0.1);
37
- }
38
-
39
- .#{$element}#{$name}-value {
40
- order: 3;
41
- }
42
-
43
- .#{$element}#{$name}-entry-text {
44
- order: 2;
45
- }
46
- }
47
-
48
- @if (cx-should-include("cx/charts/Legend")) {
49
- @include cx-legend();
50
- }
1
+ @use "sass:math";
2
+ @use "sass:map";
3
+ @use "../util/scss/besm.scss" as *;
4
+ @use "../util/scss/include.scss" as *;
5
+ @use "../util/scss/add-rules.scss" as *;
6
+ @use "../util/scss/clockwise.scss" as *;
7
+ @use "./variables" as *;
8
+
9
+ @mixin cx-legend($name: "legend", $besm: $cx-besm) {
10
+ $block: map.get($besm, block);
11
+ $element: map.get($besm, element);
12
+ $state: map.get($besm, state);
13
+
14
+ .#{$block}#{$name} {
15
+ display: flex;
16
+ justify-content: center;
17
+ align-items: flex-start;
18
+ flex-wrap: wrap;
19
+ gap: $cx-default-chart-legend-gap;
20
+ }
21
+
22
+ .#{$block}#{$name}.#{$state}vertical {
23
+ flex-direction: column;
24
+ }
25
+
26
+ .#{$element}#{$name}-entry {
27
+ display: flex;
28
+ align-items: center;
29
+ padding: $cx-default-chart-legend-padding;
30
+ gap: $cx-default-chart-legend-entry-gap;
31
+ font-size: $cx-default-chart-legend-font-size;
32
+ position: relative;
33
+ box-sizing: border-box;
34
+ cursor: pointer;
35
+ }
36
+
37
+ .#{$element}#{$name}-svg {
38
+ flex-shrink: 0;
39
+ }
40
+
41
+ .#{$element}#{$name}-shape {
42
+ fill: $cx-default-chart-legend-shape-color;
43
+ stroke-width: $cx-default-chart-legend-shape-stroke-width;
44
+ }
45
+
46
+ .#{$element}#{$name}-value {
47
+ order: 3;
48
+ }
49
+
50
+ .#{$element}#{$name}-entry-text {
51
+ order: 2;
52
+ }
53
+ }
54
+
55
+ @if (cx-should-include("cx/charts/Legend")) {
56
+ @include cx-legend();
57
+ }
@@ -1,7 +1,11 @@
1
1
  /** @jsxImportSource react */
2
2
 
3
3
  import { Widget, VDOM, WidgetConfig } from "../ui/Widget";
4
- import { HtmlElement, HtmlElementConfig, HtmlElementInstance } from "../widgets/HtmlElement";
4
+ import {
5
+ HtmlElement,
6
+ HtmlElementConfig,
7
+ HtmlElementInstance,
8
+ } from "../widgets/HtmlElement";
5
9
  import { PureContainer } from "../ui/PureContainer";
6
10
  import { getShape } from "./shapes";
7
11
  import { isUndefined } from "../util/isUndefined";
@@ -14,222 +18,249 @@ import { RenderingContext } from "../ui/RenderingContext";
14
18
  import { StringProp, StyleProp, BooleanProp } from "../ui/Prop";
15
19
 
16
20
  export interface LegendEntryData {
17
- name: string;
18
- displayText?: string;
19
- active?: boolean;
20
- colorIndex?: number;
21
- disabled?: boolean;
22
- selected?: boolean;
23
- style?: any;
24
- shape?: string;
25
- shapeSize?: number;
26
- hoverSync?: any;
27
- hoverChannel?: string;
28
- hoverId?: any;
29
- onClick?: (e: MouseEvent) => void;
30
- value?: number;
21
+ name: string;
22
+ displayText?: string;
23
+ active?: boolean;
24
+ colorIndex?: number;
25
+ disabled?: boolean;
26
+ selected?: boolean;
27
+ style?: any;
28
+ shape?: string;
29
+ shapeSize?: number;
30
+ hoverSync?: any;
31
+ hoverChannel?: string;
32
+ hoverId?: any;
33
+ onClick?: (e: MouseEvent) => void;
34
+ value?: number;
31
35
  }
32
36
 
33
-
34
37
  export interface LegendConfig extends HtmlElementConfig {
35
- /** Name of the legend. Default is `legend`. */
36
- name?: string;
38
+ /** Name of the legend. Default is `legend`. */
39
+ name?: string;
37
40
 
38
- /** Default shape to use for all entries. */
39
- shape?: StringProp;
41
+ /** Default shape to use for all entries. */
42
+ shape?: StringProp;
40
43
 
41
- /** Style applied to each entry. */
42
- entryStyle?: StyleProp;
44
+ /** Style applied to each entry. */
45
+ entryStyle?: StyleProp;
43
46
 
44
- /** CSS class applied to each entry. */
45
- entryClass?: StringProp;
47
+ /** CSS class applied to each entry. */
48
+ entryClass?: StringProp;
46
49
 
47
- /** Style applied to the value display. */
48
- valueStyle?: StyleProp;
50
+ /** Style applied to the value display. */
51
+ valueStyle?: StyleProp;
49
52
 
50
- /** CSS class applied to the value display. */
51
- valueClass?: StringProp;
53
+ /** CSS class applied to the value display. */
54
+ valueClass?: StringProp;
52
55
 
53
- /** Set to `true` to show values next to legend entries. */
54
- showValues?: BooleanProp;
56
+ /** Set to `true` to show values next to legend entries. */
57
+ showValues?: BooleanProp;
55
58
 
56
- /** Format used for displaying values. Default is `s`. */
57
- valueFormat?: string;
59
+ /** Format used for displaying values. Default is `s`. */
60
+ valueFormat?: string;
58
61
 
59
- /** Set to `true` for vertical layout. */
60
- vertical?: boolean;
62
+ /** Set to `true` for vertical layout. */
63
+ vertical?: boolean;
61
64
 
62
- /** Size of the shape in pixels. Default is `18`. */
63
- shapeSize?: number;
65
+ /** Size of the shape in pixels. Default is `18`. */
66
+ shapeSize?: number;
64
67
 
65
- /** Size of the SVG container in pixels. Default is `20`. */
66
- svgSize?: number;
68
+ /** Size of the SVG container in pixels. Default is `20`. */
69
+ svgSize?: number;
67
70
  }
68
71
 
69
72
  export interface LegendInstance extends HtmlElementInstance {
70
- legends: Record<string, { entries: LegendEntryData[]; names: Record<string, LegendEntryData> }>;
73
+ legends: Record<
74
+ string,
75
+ { entries: LegendEntryData[]; names: Record<string, LegendEntryData> }
76
+ >;
71
77
  }
72
78
 
73
79
  export class Legend extends HtmlElement {
74
- declare baseClass: string;
75
- declare name: string;
76
- declare vertical: boolean;
77
- declare shapeSize: number;
78
- declare shape: string | null;
79
- declare svgSize: number;
80
- declare showValues: boolean;
81
- declare valueFormat: string;
82
- declare entryStyle: any;
83
- declare valueStyle: any;
84
-
85
- static Scope: typeof PureContainer;
86
-
87
- constructor(config: LegendConfig) {
88
- super(config);
89
- }
90
-
91
- declareData(...args: any[]): void {
92
- super.declareData(...args, {
93
- shape: undefined,
94
- entryStyle: { structured: true },
95
- entryClass: { structured: true },
96
- valueStyle: { structured: true },
97
- valueClass: { structured: true },
98
- showValues: undefined,
99
- });
100
- }
101
-
102
- init(): void {
103
- this.entryStyle = parseStyle(this.entryStyle);
104
- this.valueStyle = parseStyle(this.valueStyle);
105
- super.init();
106
- }
107
-
108
- prepareData(context: RenderingContext, instance: LegendInstance): void {
109
- let { data } = instance;
110
- data.stateMods = Object.assign(data.stateMods || {}, {
111
- vertical: this.vertical,
112
- });
113
- super.prepareData(context, instance);
114
- }
115
-
116
- isValidHtmlAttribute(attrName: string): string | false {
117
- switch (attrName) {
118
- case "shapeSize":
119
- case "svgSize":
120
- case "shape":
121
- case "entryStyle":
122
- case "entryClass":
123
- case "valueStyle":
124
- case "valueClass":
125
- case "showValues":
126
- case "valueFormat":
127
- return false;
128
-
129
- default:
130
- return super.isValidHtmlAttribute(attrName);
131
- }
132
- }
133
-
134
- explore(context: RenderingContext, instance: LegendInstance): void {
135
- if (!context.legends) context.legends = {};
136
-
137
- instance.legends = context.legends;
138
-
139
- context.addLegendEntry = (legendName: string | false, entry: LegendEntryData) => {
140
- if (!legendName) return;
141
-
142
- //case when all legends are scoped and new entry is added outside the scope
143
- if (!context.legends) return;
144
-
145
- let legend = context.legends[legendName];
146
- if (!legend)
147
- legend = context.legends[legendName] = {
148
- entries: [],
149
- names: {},
150
- };
151
-
152
- if (!legend.names[entry.name]) {
153
- legend.entries.push(entry);
154
- legend.names[entry.name] = entry;
155
- }
156
- };
157
-
158
- super.explore(context, instance);
159
- }
160
-
161
- renderChildren(context: RenderingContext, instance: LegendInstance): React.ReactNode[] {
162
- const CSS = this.CSS;
163
-
164
- let entries = instance.legends[this.name] && instance.legends[this.name].entries,
165
- list: React.ReactNode;
166
-
167
- let { entryClass, entryStyle, shape, valueClass, valueStyle } = instance.data;
168
- let valueFormatter = Format.parse(this.valueFormat);
169
-
170
- let valueClasses = this.showValues ? CSS.expand(CSS.element(this.baseClass, "value"), valueClass) : undefined;
171
- let entryTextClass = CSS.element(this.baseClass, "entry-text");
172
-
173
- if (isNonEmptyArray(entries)) {
174
- list = entries.map((e: LegendEntryData, i: number) =>
175
- withHoverSync(i, e.hoverSync, e.hoverChannel, e.hoverId, ({ onMouseMove, onMouseLeave, hover }) => (
176
- <div
177
- key={i}
178
- className={CSS.expand(
179
- CSS.element(this.baseClass, "entry", {
180
- "color-root": true,
181
- hover,
182
- disabled: e.disabled,
183
- selected: e.selected,
184
- }),
185
- entryClass,
186
- )}
187
- style={entryStyle}
188
- onClick={e.onClick as any}
189
- onMouseMove={onMouseMove}
190
- onMouseLeave={onMouseLeave}
191
- >
192
- {this.renderShape(e, shape)}
193
- <div className={entryTextClass}>{e.displayText || e.name}</div>
194
- {this.showValues && (
195
- <div className={valueClasses} style={valueStyle}>
196
- {valueFormatter(e.value)}
197
- </div>
198
- )}
199
- </div>
200
- )),
201
- );
80
+ declare baseClass: string;
81
+ declare name: string;
82
+ declare vertical: boolean;
83
+ declare shapeSize: number;
84
+ declare shape: string | null;
85
+ declare svgSize: number;
86
+ declare showValues: boolean;
87
+ declare valueFormat: string;
88
+ declare entryStyle: any;
89
+ declare valueStyle: any;
90
+
91
+ static Scope: typeof PureContainer;
92
+
93
+ constructor(config: LegendConfig) {
94
+ super(config);
95
+ }
96
+
97
+ declareData(...args: any[]): void {
98
+ super.declareData(...args, {
99
+ shape: undefined,
100
+ entryStyle: { structured: true },
101
+ entryClass: { structured: true },
102
+ valueStyle: { structured: true },
103
+ valueClass: { structured: true },
104
+ showValues: undefined,
105
+ });
106
+ }
107
+
108
+ init(): void {
109
+ this.entryStyle = parseStyle(this.entryStyle);
110
+ this.valueStyle = parseStyle(this.valueStyle);
111
+ super.init();
112
+ }
113
+
114
+ prepareData(context: RenderingContext, instance: LegendInstance): void {
115
+ let { data } = instance;
116
+ data.stateMods = Object.assign(data.stateMods || {}, {
117
+ vertical: this.vertical,
118
+ });
119
+ super.prepareData(context, instance);
120
+ }
121
+
122
+ isValidHtmlAttribute(attrName: string): string | false {
123
+ switch (attrName) {
124
+ case "shapeSize":
125
+ case "svgSize":
126
+ case "shape":
127
+ case "entryStyle":
128
+ case "entryClass":
129
+ case "valueStyle":
130
+ case "valueClass":
131
+ case "showValues":
132
+ case "valueFormat":
133
+ return false;
134
+
135
+ default:
136
+ return super.isValidHtmlAttribute(attrName);
137
+ }
138
+ }
139
+
140
+ explore(context: RenderingContext, instance: LegendInstance): void {
141
+ if (!context.legends) context.legends = {};
142
+
143
+ instance.legends = context.legends;
144
+
145
+ context.addLegendEntry = (
146
+ legendName: string | false,
147
+ entry: LegendEntryData,
148
+ ) => {
149
+ if (!legendName) return;
150
+
151
+ //case when all legends are scoped and new entry is added outside the scope
152
+ if (!context.legends) return;
153
+
154
+ let legend = context.legends[legendName];
155
+ if (!legend)
156
+ legend = context.legends[legendName] = {
157
+ entries: [],
158
+ names: {},
159
+ };
160
+
161
+ if (!legend.names[entry.name]) {
162
+ legend.entries.push(entry);
163
+ legend.names[entry.name] = entry;
202
164
  }
203
-
204
- return [list, super.renderChildren(context, instance)];
205
- }
206
-
207
- renderShape(entry: LegendEntryData, legendEntriesShape: string | null | undefined): React.ReactNode {
208
- const className = this.CSS.element(this.baseClass, "shape", {
209
- [`color-${entry.colorIndex}`]: entry.colorIndex != null && (isUndefined(entry.active) || entry.active),
210
- });
211
- const shape = getShape(legendEntriesShape || entry.shape || "square");
212
-
213
- // if the entry has a custom fill or stroke set, use it for both values
214
- let style = { ...entry.style };
215
- style.fill = style.fill ?? style.stroke;
216
- style.stroke = style.stroke ?? style.fill;
217
-
218
- return (
219
- <svg
220
- className={this.CSS.element(this.baseClass, "svg")}
221
- style={{
222
- width: `${this.svgSize}px`,
223
- height: `${this.svgSize}px`,
224
- }}
225
- >
226
- {shape(this.svgSize / 2, this.svgSize / 2, entry.shapeSize || this.shapeSize, {
227
- style,
228
- className,
229
- })}
230
- </svg>
165
+ };
166
+
167
+ super.explore(context, instance);
168
+ }
169
+
170
+ renderChildren(
171
+ context: RenderingContext,
172
+ instance: LegendInstance,
173
+ ): React.ReactNode[] {
174
+ const CSS = this.CSS;
175
+
176
+ let entries =
177
+ instance.legends[this.name] && instance.legends[this.name].entries,
178
+ list: React.ReactNode;
179
+
180
+ let { entryClass, entryStyle, shape, valueClass, valueStyle } =
181
+ instance.data;
182
+ let valueFormatter = Format.parse(this.valueFormat);
183
+
184
+ let valueClasses = this.showValues
185
+ ? CSS.expand(CSS.element(this.baseClass, "value"), valueClass)
186
+ : undefined;
187
+ let entryTextClass = CSS.element(this.baseClass, "entry-text");
188
+
189
+ if (isNonEmptyArray(entries)) {
190
+ list = entries.map((e: LegendEntryData, i: number) =>
191
+ withHoverSync(
192
+ i,
193
+ e.hoverSync,
194
+ e.hoverChannel,
195
+ e.hoverId,
196
+ ({ onMouseMove, onMouseLeave, hover }) => (
197
+ <div
198
+ key={i}
199
+ className={CSS.expand(
200
+ CSS.element(this.baseClass, "entry", {
201
+ "color-root": true,
202
+ hover,
203
+ disabled: e.disabled,
204
+ selected: e.selected,
205
+ }),
206
+ entryClass,
207
+ )}
208
+ style={entryStyle}
209
+ onClick={e.onClick as any}
210
+ onMouseMove={onMouseMove}
211
+ onMouseLeave={onMouseLeave}
212
+ >
213
+ {this.renderShape(e, shape)}
214
+ <div className={entryTextClass}>{e.displayText || e.name}</div>
215
+ {this.showValues && (
216
+ <div className={valueClasses} style={valueStyle}>
217
+ {valueFormatter(e.value)}
218
+ </div>
219
+ )}
220
+ </div>
221
+ ),
222
+ ),
231
223
  );
232
- }
224
+ }
225
+
226
+ return [list, super.renderChildren(context, instance)];
227
+ }
228
+
229
+ renderShape(
230
+ entry: LegendEntryData,
231
+ legendEntriesShape: string | null | undefined,
232
+ ): React.ReactNode {
233
+ const className = this.CSS.element(this.baseClass, "shape", {
234
+ [`color-${entry.colorIndex}`]:
235
+ entry.colorIndex != null && (isUndefined(entry.active) || entry.active),
236
+ });
237
+ const shape = getShape(legendEntriesShape || entry.shape || "square");
238
+
239
+ // if the entry has a custom fill or stroke set, use it for both values
240
+ let style = { ...entry.style };
241
+ if (hasVisibleValue(style.stroke) && !style.fill) style.fill = style.stroke;
242
+ if (hasVisibleValue(style.fill) && !style.stroke) style.stroke = style.fill;
243
+
244
+ return (
245
+ <svg
246
+ className={this.CSS.element(this.baseClass, "svg")}
247
+ style={{
248
+ width: `${this.svgSize}px`,
249
+ height: `${this.svgSize}px`,
250
+ }}
251
+ >
252
+ {shape(
253
+ this.svgSize / 2,
254
+ this.svgSize / 2,
255
+ entry.shapeSize || this.shapeSize,
256
+ {
257
+ style,
258
+ className,
259
+ },
260
+ )}
261
+ </svg>
262
+ );
263
+ }
233
264
  }
234
265
 
235
266
  Legend.prototype.name = "legend";
@@ -245,26 +276,39 @@ Legend.prototype.valueFormat = "s";
245
276
  Widget.alias("legend", Legend);
246
277
 
247
278
  interface LegendScopeInstance extends Instance {
248
- legends: Record<string, { entries: LegendEntryData[]; names: Record<string, LegendEntryData> }>;
279
+ legends: Record<
280
+ string,
281
+ { entries: LegendEntryData[]; names: Record<string, LegendEntryData> }
282
+ >;
249
283
  }
250
284
 
251
285
  Legend.Scope = class extends PureContainer {
252
- explore(context: RenderingContext, instance: LegendScopeInstance): void {
253
- context.push("legends", (instance.legends = {}));
254
- super.explore(context, instance);
255
- }
256
-
257
- exploreCleanup(context: RenderingContext, instance: LegendScopeInstance): void {
258
- context.pop("legends");
259
- }
260
-
261
- prepare(context: RenderingContext, instance: LegendScopeInstance): void {
262
- context.push("legends", instance.legends);
263
- }
264
-
265
- prepareCleanup(context: RenderingContext, instance: LegendScopeInstance): void {
266
- context.pop("legends");
267
- }
286
+ explore(context: RenderingContext, instance: LegendScopeInstance): void {
287
+ context.push("legends", (instance.legends = {}));
288
+ super.explore(context, instance);
289
+ }
290
+
291
+ exploreCleanup(
292
+ context: RenderingContext,
293
+ instance: LegendScopeInstance,
294
+ ): void {
295
+ context.pop("legends");
296
+ }
297
+
298
+ prepare(context: RenderingContext, instance: LegendScopeInstance): void {
299
+ context.push("legends", instance.legends);
300
+ }
301
+
302
+ prepareCleanup(
303
+ context: RenderingContext,
304
+ instance: LegendScopeInstance,
305
+ ): void {
306
+ context.pop("legends");
307
+ }
268
308
  };
269
309
 
270
310
  export const LegendScope = Legend.Scope;
311
+
312
+ function hasVisibleValue(value: string) {
313
+ return value && value != "transparent" && value != "none";
314
+ }