@cloudscape-design/chart-components 1.0.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 (246) hide show
  1. package/LICENSE +175 -0
  2. package/NOTICE +1 -0
  3. package/README.md +25 -0
  4. package/cartesian-chart/chart-cartesian-internal.d.ts +10 -0
  5. package/cartesian-chart/chart-cartesian-internal.js +99 -0
  6. package/cartesian-chart/chart-cartesian-internal.js.map +1 -0
  7. package/cartesian-chart/chart-series-cartesian.d.ts +7 -0
  8. package/cartesian-chart/chart-series-cartesian.js +95 -0
  9. package/cartesian-chart/chart-series-cartesian.js.map +1 -0
  10. package/cartesian-chart/index.d.ts +5 -0
  11. package/cartesian-chart/index.js +133 -0
  12. package/cartesian-chart/index.js.map +1 -0
  13. package/cartesian-chart/interfaces.d.ts +166 -0
  14. package/cartesian-chart/interfaces.js +4 -0
  15. package/cartesian-chart/interfaces.js.map +1 -0
  16. package/cartesian-chart/test-classes/styles.css.js +6 -0
  17. package/cartesian-chart/test-classes/styles.scoped.css +7 -0
  18. package/cartesian-chart/test-classes/styles.selectors.js +7 -0
  19. package/core/chart-api/chart-extra-axis-titles.d.ts +10 -0
  20. package/core/chart-api/chart-extra-axis-titles.js +42 -0
  21. package/core/chart-api/chart-extra-axis-titles.js.map +1 -0
  22. package/core/chart-api/chart-extra-context.d.ts +41 -0
  23. package/core/chart-api/chart-extra-context.js +93 -0
  24. package/core/chart-api/chart-extra-context.js.map +1 -0
  25. package/core/chart-api/chart-extra-highlight.d.ts +20 -0
  26. package/core/chart-api/chart-extra-highlight.js +205 -0
  27. package/core/chart-api/chart-extra-highlight.js.map +1 -0
  28. package/core/chart-api/chart-extra-legend.d.ts +27 -0
  29. package/core/chart-api/chart-extra-legend.js +118 -0
  30. package/core/chart-api/chart-extra-legend.js.map +1 -0
  31. package/core/chart-api/chart-extra-navigation.d.ts +84 -0
  32. package/core/chart-api/chart-extra-navigation.js +470 -0
  33. package/core/chart-api/chart-extra-navigation.js.map +1 -0
  34. package/core/chart-api/chart-extra-nodata.d.ts +15 -0
  35. package/core/chart-api/chart-extra-nodata.js +45 -0
  36. package/core/chart-api/chart-extra-nodata.js.map +1 -0
  37. package/core/chart-api/chart-extra-pointer.d.ts +33 -0
  38. package/core/chart-api/chart-extra-pointer.js +173 -0
  39. package/core/chart-api/chart-extra-pointer.js.map +1 -0
  40. package/core/chart-api/chart-extra-tooltip.d.ts +33 -0
  41. package/core/chart-api/chart-extra-tooltip.js +209 -0
  42. package/core/chart-api/chart-extra-tooltip.js.map +1 -0
  43. package/core/chart-api/index.d.ts +75 -0
  44. package/core/chart-api/index.js +383 -0
  45. package/core/chart-api/index.js.map +1 -0
  46. package/core/chart-container.d.ts +20 -0
  47. package/core/chart-container.js +55 -0
  48. package/core/chart-container.js.map +1 -0
  49. package/core/chart-core.d.ts +7 -0
  50. package/core/chart-core.js +287 -0
  51. package/core/chart-core.js.map +1 -0
  52. package/core/components/core-application.d.ts +6 -0
  53. package/core/components/core-application.js +16 -0
  54. package/core/components/core-application.js.map +1 -0
  55. package/core/components/core-filters.d.ts +9 -0
  56. package/core/components/core-filters.js +22 -0
  57. package/core/components/core-filters.js.map +1 -0
  58. package/core/components/core-legend.d.ts +13 -0
  59. package/core/components/core-legend.js +27 -0
  60. package/core/components/core-legend.js.map +1 -0
  61. package/core/components/core-no-data.d.ts +6 -0
  62. package/core/components/core-no-data.js +48 -0
  63. package/core/components/core-no-data.js.map +1 -0
  64. package/core/components/core-slots.d.ts +7 -0
  65. package/core/components/core-slots.js +11 -0
  66. package/core/components/core-slots.js.map +1 -0
  67. package/core/components/core-tooltip.d.ts +7 -0
  68. package/core/components/core-tooltip.js +183 -0
  69. package/core/components/core-tooltip.js.map +1 -0
  70. package/core/components/core-vertical-axis-title.d.ts +5 -0
  71. package/core/components/core-vertical-axis-title.js +15 -0
  72. package/core/components/core-vertical-axis-title.js.map +1 -0
  73. package/core/formatters.d.ts +2 -0
  74. package/core/formatters.js +113 -0
  75. package/core/formatters.js.map +1 -0
  76. package/core/i18n-utils.d.ts +21 -0
  77. package/core/i18n-utils.js +18 -0
  78. package/core/i18n-utils.js.map +1 -0
  79. package/core/interfaces.d.ts +436 -0
  80. package/core/interfaces.js +4 -0
  81. package/core/interfaces.js.map +1 -0
  82. package/core/styles.css.js +25 -0
  83. package/core/styles.scoped.css +115 -0
  84. package/core/styles.selectors.js +26 -0
  85. package/core/test-classes/styles.css.js +33 -0
  86. package/core/test-classes/styles.scoped.css +34 -0
  87. package/core/test-classes/styles.selectors.js +34 -0
  88. package/core/utils.d.ts +45 -0
  89. package/core/utils.js +262 -0
  90. package/core/utils.js.map +1 -0
  91. package/index.d.ts +4 -0
  92. package/index.js +5 -0
  93. package/index.js.map +1 -0
  94. package/internal/api-docs/components/cartesian-chart.js +571 -0
  95. package/internal/api-docs/components/index.d.ts +3 -0
  96. package/internal/api-docs/components/index.js +4 -0
  97. package/internal/api-docs/components/interfaces.d.ts +81 -0
  98. package/internal/api-docs/components/pie-chart.js +430 -0
  99. package/internal/api-docs/test-utils-doc/dom.js +4 -0
  100. package/internal/api-docs/test-utils-doc/selectors.js +4 -0
  101. package/internal/base-component/get-data-attributes.d.ts +1 -0
  102. package/internal/base-component/get-data-attributes.js +12 -0
  103. package/internal/base-component/get-data-attributes.js.map +1 -0
  104. package/internal/base-component/use-base-component.d.ts +13 -0
  105. package/internal/base-component/use-base-component.js +18 -0
  106. package/internal/base-component/use-base-component.js.map +1 -0
  107. package/internal/base-component/use-telemetry.d.ts +2 -0
  108. package/internal/base-component/use-telemetry.js +8 -0
  109. package/internal/base-component/use-telemetry.js.map +1 -0
  110. package/internal/chart-styles.d.ts +88 -0
  111. package/internal/chart-styles.js +145 -0
  112. package/internal/chart-styles.js.map +1 -0
  113. package/internal/components/chart-legend/index.d.ts +14 -0
  114. package/internal/components/chart-legend/index.js +245 -0
  115. package/internal/components/chart-legend/index.js.map +1 -0
  116. package/internal/components/chart-legend/styles.css.js +22 -0
  117. package/internal/components/chart-legend/styles.scoped.css +233 -0
  118. package/internal/components/chart-legend/styles.selectors.js +23 -0
  119. package/internal/components/chart-legend/test-classes/styles.css.js +11 -0
  120. package/internal/components/chart-legend/test-classes/styles.scoped.css +12 -0
  121. package/internal/components/chart-legend/test-classes/styles.selectors.js +12 -0
  122. package/internal/components/chart-series-filter/index.d.ts +17 -0
  123. package/internal/components/chart-series-filter/index.js +14 -0
  124. package/internal/components/chart-series-filter/index.js.map +1 -0
  125. package/internal/components/interfaces.d.ts +17 -0
  126. package/internal/components/interfaces.js +4 -0
  127. package/internal/components/interfaces.js.map +1 -0
  128. package/internal/components/series-details/index.d.ts +23 -0
  129. package/internal/components/series-details/index.js +45 -0
  130. package/internal/components/series-details/index.js.map +1 -0
  131. package/internal/components/series-details/styles.css.js +22 -0
  132. package/internal/components/series-details/styles.scoped.css +150 -0
  133. package/internal/components/series-details/styles.selectors.js +23 -0
  134. package/internal/components/series-details/test-classes/styles.css.js +10 -0
  135. package/internal/components/series-details/test-classes/styles.scoped.css +11 -0
  136. package/internal/components/series-details/test-classes/styles.selectors.js +11 -0
  137. package/internal/components/series-marker/index.d.ts +8 -0
  138. package/internal/components/series-marker/index.js +45 -0
  139. package/internal/components/series-marker/index.js.map +1 -0
  140. package/internal/components/series-marker/interfaces.d.ts +1 -0
  141. package/internal/components/series-marker/interfaces.js +4 -0
  142. package/internal/components/series-marker/interfaces.js.map +1 -0
  143. package/internal/components/series-marker/render-marker.d.ts +3 -0
  144. package/internal/components/series-marker/render-marker.js +74 -0
  145. package/internal/components/series-marker/render-marker.js.map +1 -0
  146. package/internal/components/series-marker/styles.css.js +7 -0
  147. package/internal/components/series-marker/styles.scoped.css +55 -0
  148. package/internal/components/series-marker/styles.selectors.js +8 -0
  149. package/internal/environment.d.ts +4 -0
  150. package/internal/environment.js +5 -0
  151. package/internal/environment.json +7 -0
  152. package/internal/events/index.d.ts +23 -0
  153. package/internal/events/index.js +41 -0
  154. package/internal/events/index.js.map +1 -0
  155. package/internal/generated/styles/tokens.d.ts +756 -0
  156. package/internal/generated/styles/tokens.js +756 -0
  157. package/internal/generated/theming/index.cjs +12584 -0
  158. package/internal/generated/theming/index.cjs.d.ts +2399 -0
  159. package/internal/generated/theming/index.d.ts +2399 -0
  160. package/internal/generated/theming/index.js +12584 -0
  161. package/internal/manifest.json +3 -0
  162. package/internal/styles.css.js +6 -0
  163. package/internal/styles.scoped.css +13 -0
  164. package/internal/styles.selectors.js +7 -0
  165. package/internal/utils/apply-display-name.d.ts +1 -0
  166. package/internal/utils/apply-display-name.js +6 -0
  167. package/internal/utils/apply-display-name.js.map +1 -0
  168. package/internal/utils/async-store.d.ts +19 -0
  169. package/internal/utils/async-store.js +58 -0
  170. package/internal/utils/async-store.js.map +1 -0
  171. package/internal/utils/chart-series.d.ts +8 -0
  172. package/internal/utils/chart-series.js +11 -0
  173. package/internal/utils/chart-series.js.map +1 -0
  174. package/internal/utils/renderer-utils.d.ts +17 -0
  175. package/internal/utils/renderer-utils.js +95 -0
  176. package/internal/utils/renderer-utils.js.map +1 -0
  177. package/internal/utils/series-data.d.ts +2 -0
  178. package/internal/utils/series-data.js +8 -0
  179. package/internal/utils/series-data.js.map +1 -0
  180. package/internal/utils/test-i18n-provider.d.ts +8 -0
  181. package/internal/utils/test-i18n-provider.js +8 -0
  182. package/internal/utils/test-i18n-provider.js.map +1 -0
  183. package/internal/utils/use-previous.d.ts +4 -0
  184. package/internal/utils/use-previous.js +14 -0
  185. package/internal/utils/use-previous.js.map +1 -0
  186. package/internal/utils/utils.d.ts +16 -0
  187. package/internal/utils/utils.js +49 -0
  188. package/internal/utils/utils.js.map +1 -0
  189. package/internal-do-not-use/core-chart/index.d.ts +4 -0
  190. package/internal-do-not-use/core-chart/index.js +13 -0
  191. package/internal-do-not-use/core-chart/index.js.map +1 -0
  192. package/internal-do-not-use/core-legend/index.d.ts +2 -0
  193. package/internal-do-not-use/core-legend/index.js +11 -0
  194. package/internal-do-not-use/core-legend/index.js.map +1 -0
  195. package/package.json +106 -0
  196. package/pie-chart/chart-inner-area.d.ts +10 -0
  197. package/pie-chart/chart-inner-area.js +63 -0
  198. package/pie-chart/chart-inner-area.js.map +1 -0
  199. package/pie-chart/chart-pie-internal.d.ts +11 -0
  200. package/pie-chart/chart-pie-internal.js +103 -0
  201. package/pie-chart/chart-pie-internal.js.map +1 -0
  202. package/pie-chart/index.d.ts +5 -0
  203. package/pie-chart/index.js +48 -0
  204. package/pie-chart/index.js.map +1 -0
  205. package/pie-chart/interfaces.d.ts +101 -0
  206. package/pie-chart/interfaces.js +4 -0
  207. package/pie-chart/interfaces.js.map +1 -0
  208. package/pie-chart/test-classes/styles.css.js +8 -0
  209. package/pie-chart/test-classes/styles.scoped.css +9 -0
  210. package/pie-chart/test-classes/styles.selectors.js +9 -0
  211. package/test-utils/dom/cartesian-chart/index.d.ts +14 -0
  212. package/test-utils/dom/cartesian-chart/index.js +24 -0
  213. package/test-utils/dom/cartesian-chart/index.js.map +1 -0
  214. package/test-utils/dom/cartesian-chart/tooltip.d.ts +28 -0
  215. package/test-utils/dom/cartesian-chart/tooltip.js +48 -0
  216. package/test-utils/dom/cartesian-chart/tooltip.js.map +1 -0
  217. package/test-utils/dom/index.d.ts +46 -0
  218. package/test-utils/dom/index.js +35 -0
  219. package/test-utils/dom/index.js.map +1 -0
  220. package/test-utils/dom/internal/base.d.ts +93 -0
  221. package/test-utils/dom/internal/base.js +146 -0
  222. package/test-utils/dom/internal/base.js.map +1 -0
  223. package/test-utils/dom/internal/core.d.ts +14 -0
  224. package/test-utils/dom/internal/core.js +37 -0
  225. package/test-utils/dom/internal/core.js.map +1 -0
  226. package/test-utils/dom/pie-chart/index.d.ts +17 -0
  227. package/test-utils/dom/pie-chart/index.js +29 -0
  228. package/test-utils/dom/pie-chart/index.js.map +1 -0
  229. package/test-utils/selectors/cartesian-chart/index.d.ts +14 -0
  230. package/test-utils/selectors/cartesian-chart/index.js +24 -0
  231. package/test-utils/selectors/cartesian-chart/index.js.map +1 -0
  232. package/test-utils/selectors/cartesian-chart/tooltip.d.ts +28 -0
  233. package/test-utils/selectors/cartesian-chart/tooltip.js +48 -0
  234. package/test-utils/selectors/cartesian-chart/tooltip.js.map +1 -0
  235. package/test-utils/selectors/index.d.ts +46 -0
  236. package/test-utils/selectors/index.js +32 -0
  237. package/test-utils/selectors/index.js.map +1 -0
  238. package/test-utils/selectors/internal/base.d.ts +93 -0
  239. package/test-utils/selectors/internal/base.js +146 -0
  240. package/test-utils/selectors/internal/base.js.map +1 -0
  241. package/test-utils/selectors/internal/core.d.ts +14 -0
  242. package/test-utils/selectors/internal/core.js +37 -0
  243. package/test-utils/selectors/internal/core.js.map +1 -0
  244. package/test-utils/selectors/pie-chart/index.d.ts +17 -0
  245. package/test-utils/selectors/pie-chart/index.js +29 -0
  246. package/test-utils/selectors/pie-chart/index.js.map +1 -0
@@ -0,0 +1,145 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { colorBackgroundContainerContent, colorChartsLineTick, colorChartsPaletteCategorical1, colorChartsPaletteCategorical2, colorChartsPaletteCategorical3, colorChartsPaletteCategorical4, colorChartsPaletteCategorical5, colorChartsPaletteCategorical6, colorChartsPaletteCategorical7, colorChartsPaletteCategorical8, colorChartsPaletteCategorical9, colorChartsPaletteCategorical10, colorChartsThresholdNeutral, colorTextBodyDefault, colorTextBodySecondary, fontFamilyBase, fontSizeBodyM, fontSizeBodyS, fontWeightHeadingS, } from "@cloudscape-design/design-tokens";
4
+ import styles from "./styles.css.js";
5
+ // Here we define chart styles and colors, used across multiple components, including core chart, cartesian- and pie charts,
6
+ // series markers.
7
+ export const colors = [
8
+ colorChartsPaletteCategorical1,
9
+ colorChartsPaletteCategorical2,
10
+ colorChartsPaletteCategorical3,
11
+ colorChartsPaletteCategorical4,
12
+ colorChartsPaletteCategorical5,
13
+ colorChartsPaletteCategorical6,
14
+ colorChartsPaletteCategorical7,
15
+ colorChartsPaletteCategorical8,
16
+ colorChartsPaletteCategorical9,
17
+ colorChartsPaletteCategorical10,
18
+ ];
19
+ export const chart = {
20
+ spacing: [10, 10, 0, 0],
21
+ backgroundColor: "transparent",
22
+ };
23
+ export const axisTitleCss = {
24
+ color: colorTextBodyDefault,
25
+ fontSize: fontSizeBodyM,
26
+ fontWeight: fontWeightHeadingS,
27
+ };
28
+ export const axisLabelsCss = {
29
+ color: colorTextBodySecondary,
30
+ fontSize: fontSizeBodyS,
31
+ };
32
+ export const xAxisOptions = {
33
+ tickColor: colorChartsLineTick,
34
+ lineColor: colorChartsLineTick,
35
+ gridLineColor: colorChartsLineTick,
36
+ lineWidth: 1,
37
+ crosshair: false,
38
+ };
39
+ export const yAxisOptions = {
40
+ tickColor: colorChartsLineTick,
41
+ lineColor: colorChartsLineTick,
42
+ gridLineColor: colorChartsLineTick,
43
+ lineWidth: 0,
44
+ crosshair: false,
45
+ };
46
+ export const chartPlotCss = {
47
+ font: fontFamilyBase,
48
+ color: colorTextBodyDefault,
49
+ fontSize: fontSizeBodyM,
50
+ };
51
+ export const seriesBorderColor = colorBackgroundContainerContent;
52
+ export const hiddenSeriesMarker = { enabled: false, radius: 3, symbol: "circle" };
53
+ export const areaSeries = {
54
+ fillOpacity: 0.4,
55
+ marker: hiddenSeriesMarker,
56
+ };
57
+ export const lineSeries = {
58
+ marker: hiddenSeriesMarker,
59
+ };
60
+ export const columnSeries = {
61
+ groupPadding: 0.075,
62
+ borderRadius: 4,
63
+ borderWidth: 2,
64
+ marker: hiddenSeriesMarker,
65
+ };
66
+ export const errorbarSeries = {
67
+ color: colorChartsThresholdNeutral,
68
+ stemColor: colorChartsThresholdNeutral,
69
+ whiskerColor: colorChartsThresholdNeutral,
70
+ };
71
+ export const pieSeries = {
72
+ borderWidth: 2,
73
+ // This sets the color of the empty pie/donut ring.
74
+ // See: https://github.com/highcharts/highcharts/issues/23073.
75
+ color: "transparent",
76
+ size: "60%",
77
+ };
78
+ export const donutSeries = {
79
+ ...pieSeries,
80
+ innerSize: "80%",
81
+ };
82
+ export const pieSeriesDataLabels = {
83
+ connectorColor: colorChartsThresholdNeutral,
84
+ };
85
+ export const dimmedPlotLineOpacity = 0.4;
86
+ export const seriesDataLabelsCss = {
87
+ font: fontFamilyBase,
88
+ color: colorTextBodyDefault,
89
+ fontSize: fontSizeBodyM,
90
+ fontWeight: fontWeightHeadingS,
91
+ textOutline: "",
92
+ };
93
+ export const seriesOpacityInactive = 0.3;
94
+ export const verticalAxisTitleBlockSize = 24;
95
+ export const verticalAxisTitleMargin = 4;
96
+ export const navigationFocusOutline = {
97
+ class: styles["focus-outline"],
98
+ "stroke-width": 2,
99
+ rx: 4,
100
+ zIndex: 10,
101
+ };
102
+ export const cursorLine = {
103
+ fill: colorChartsLineTick,
104
+ zIndex: 5,
105
+ style: "pointer-events: none",
106
+ };
107
+ export const focusOutlineOffsets = {
108
+ chart: -1,
109
+ group: 4,
110
+ point: 6,
111
+ pointByType: { column: 2, pie: 2 },
112
+ };
113
+ export const thresholdSeries = {
114
+ dashStyle: "ShortDash",
115
+ lineWidth: 0,
116
+ color: colorChartsThresholdNeutral,
117
+ };
118
+ export const thresholdPlotLine = {
119
+ width: 2,
120
+ dashStyle: "ShortDash",
121
+ zIndex: 3,
122
+ color: colorChartsThresholdNeutral,
123
+ };
124
+ export const chatPlotBaseline = {
125
+ color: colorChartsLineTick,
126
+ width: 2,
127
+ zIndex: 2,
128
+ };
129
+ export const innerAreaTitleCss = {
130
+ fontSize: "28",
131
+ fontWeight: "bold",
132
+ };
133
+ export const innerAreaDescriptionCss = {
134
+ fontSize: "18",
135
+ fontWeight: "bold",
136
+ color: colorTextBodySecondary,
137
+ };
138
+ export const segmentDescriptionCss = {
139
+ fontFamily: fontFamilyBase,
140
+ fontWeight: "normal",
141
+ fontSize: fontSizeBodyS,
142
+ color: colorTextBodySecondary,
143
+ };
144
+ export const tooltipSnap = 4;
145
+ //# sourceMappingURL=chart-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-styles.js","sourceRoot":"","sources":["../../../src/internal/chart-styles.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type Highcharts from \"highcharts\";\n\nimport {\n colorBackgroundContainerContent,\n colorChartsLineTick,\n colorChartsPaletteCategorical1,\n colorChartsPaletteCategorical2,\n colorChartsPaletteCategorical3,\n colorChartsPaletteCategorical4,\n colorChartsPaletteCategorical5,\n colorChartsPaletteCategorical6,\n colorChartsPaletteCategorical7,\n colorChartsPaletteCategorical8,\n colorChartsPaletteCategorical9,\n colorChartsPaletteCategorical10,\n colorChartsThresholdNeutral,\n colorTextBodyDefault,\n colorTextBodySecondary,\n fontFamilyBase,\n fontSizeBodyM,\n fontSizeBodyS,\n fontWeightHeadingS,\n} from \"@cloudscape-design/design-tokens\";\n\nimport styles from \"./styles.css.js\";\n\n// Here we define chart styles and colors, used across multiple components, including core chart, cartesian- and pie charts,\n// series markers.\n\nexport const colors = [\n colorChartsPaletteCategorical1,\n colorChartsPaletteCategorical2,\n colorChartsPaletteCategorical3,\n colorChartsPaletteCategorical4,\n colorChartsPaletteCategorical5,\n colorChartsPaletteCategorical6,\n colorChartsPaletteCategorical7,\n colorChartsPaletteCategorical8,\n colorChartsPaletteCategorical9,\n colorChartsPaletteCategorical10,\n];\n\nexport const chart: Highcharts.ChartOptions = {\n spacing: [10, 10, 0, 0],\n backgroundColor: \"transparent\",\n};\n\nexport const axisTitleCss: Highcharts.CSSObject = {\n color: colorTextBodyDefault,\n fontSize: fontSizeBodyM,\n fontWeight: fontWeightHeadingS,\n};\n\nexport const axisLabelsCss: Highcharts.CSSObject = {\n color: colorTextBodySecondary,\n fontSize: fontSizeBodyS,\n};\n\nexport const xAxisOptions: Highcharts.XAxisOptions = {\n tickColor: colorChartsLineTick,\n lineColor: colorChartsLineTick,\n gridLineColor: colorChartsLineTick,\n lineWidth: 1,\n crosshair: false,\n};\n\nexport const yAxisOptions: Highcharts.YAxisOptions = {\n tickColor: colorChartsLineTick,\n lineColor: colorChartsLineTick,\n gridLineColor: colorChartsLineTick,\n lineWidth: 0,\n crosshair: false,\n};\n\nexport const chartPlotCss: Highcharts.CSSObject = {\n font: fontFamilyBase,\n color: colorTextBodyDefault,\n fontSize: fontSizeBodyM,\n};\n\nexport const seriesBorderColor = colorBackgroundContainerContent;\n\nexport const hiddenSeriesMarker = { enabled: false, radius: 3, symbol: \"circle\" };\n\nexport const areaSeries = {\n fillOpacity: 0.4,\n marker: hiddenSeriesMarker,\n};\n\nexport const lineSeries = {\n marker: hiddenSeriesMarker,\n};\n\nexport const columnSeries = {\n groupPadding: 0.075,\n borderRadius: 4,\n borderWidth: 2,\n marker: hiddenSeriesMarker,\n};\n\nexport const errorbarSeries = {\n color: colorChartsThresholdNeutral,\n stemColor: colorChartsThresholdNeutral,\n whiskerColor: colorChartsThresholdNeutral,\n};\n\nexport const pieSeries = {\n borderWidth: 2,\n // This sets the color of the empty pie/donut ring.\n // See: https://github.com/highcharts/highcharts/issues/23073.\n color: \"transparent\",\n size: \"60%\",\n};\nexport const donutSeries = {\n ...pieSeries,\n innerSize: \"80%\",\n};\n\nexport const pieSeriesDataLabels = {\n connectorColor: colorChartsThresholdNeutral,\n};\n\nexport const dimmedPlotLineOpacity = 0.4;\n\nexport const seriesDataLabelsCss: Highcharts.CSSObject = {\n font: fontFamilyBase,\n color: colorTextBodyDefault,\n fontSize: fontSizeBodyM,\n fontWeight: fontWeightHeadingS,\n textOutline: \"\",\n};\n\nexport const seriesOpacityInactive = 0.3;\n\nexport const verticalAxisTitleBlockSize = 24;\nexport const verticalAxisTitleMargin = 4;\n\nexport const navigationFocusOutline = {\n class: styles[\"focus-outline\"],\n \"stroke-width\": 2,\n rx: 4,\n zIndex: 10,\n};\n\nexport const cursorLine = {\n fill: colorChartsLineTick,\n zIndex: 5,\n style: \"pointer-events: none\",\n};\n\nexport const focusOutlineOffsets = {\n chart: -1,\n group: 4,\n point: 6,\n pointByType: { column: 2, pie: 2 } as Record<string, number | undefined>,\n};\n\nexport const thresholdSeries: Partial<Highcharts.SeriesLineOptions> = {\n dashStyle: \"ShortDash\",\n lineWidth: 0,\n color: colorChartsThresholdNeutral,\n};\n\nexport const thresholdPlotLine: Partial<Highcharts.XAxisPlotLinesOptions | Highcharts.YAxisPlotLinesOptions> = {\n width: 2,\n dashStyle: \"ShortDash\",\n zIndex: 3,\n color: colorChartsThresholdNeutral,\n};\n\nexport const chatPlotBaseline: Partial<Highcharts.XAxisPlotLinesOptions> = {\n color: colorChartsLineTick,\n width: 2,\n zIndex: 2,\n};\n\nexport const innerAreaTitleCss: Highcharts.CSSObject = {\n fontSize: \"28\",\n fontWeight: \"bold\",\n};\n\nexport const innerAreaDescriptionCss: Highcharts.CSSObject = {\n fontSize: \"18\",\n fontWeight: \"bold\",\n color: colorTextBodySecondary,\n};\n\nexport const segmentDescriptionCss: React.CSSProperties = {\n fontFamily: fontFamilyBase,\n fontWeight: \"normal\",\n fontSize: fontSizeBodyS,\n color: colorTextBodySecondary,\n};\n\nexport const tooltipSnap = 4;\n"]}
@@ -0,0 +1,14 @@
1
+ /// <reference types="react" />
2
+ import { GetLegendTooltipContentProps, LegendItem, LegendTooltipContent } from "../interfaces";
3
+ export interface ChartLegendProps {
4
+ items: readonly LegendItem[];
5
+ legendTitle?: string;
6
+ ariaLabel?: string;
7
+ actions?: React.ReactNode;
8
+ position: "bottom" | "side";
9
+ onItemHighlightEnter: (item: LegendItem) => void;
10
+ onItemHighlightExit: () => void;
11
+ onItemVisibilityChange: (hiddenItems: string[]) => void;
12
+ getTooltipContent: (props: GetLegendTooltipContentProps) => null | LegendTooltipContent;
13
+ }
14
+ export declare const ChartLegend: ({ items, legendTitle, ariaLabel, actions, position, onItemVisibilityChange, onItemHighlightEnter, onItemHighlightExit, getTooltipContent, }: ChartLegendProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,245 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ import { forwardRef, useEffect, useMemo, useRef, useState } from "react";
5
+ import clsx from "clsx";
6
+ import { circleIndex, handleKey, KeyCode, SingleTabStopNavigationProvider, useMergeRefs, useSingleTabStopNavigation, } from "@cloudscape-design/component-toolkit/internal";
7
+ import Box from "@cloudscape-design/components/box";
8
+ import { InternalChartTooltip } from "@cloudscape-design/components/internal/do-not-use/chart-tooltip";
9
+ import { DebouncedCall } from "../../utils/utils";
10
+ import styles from "./styles.css.js";
11
+ import testClasses from "./test-classes/styles.css.js";
12
+ const TOOLTIP_BLUR_DELAY = 50;
13
+ const HIGHLIGHT_LOST_DELAY = 50;
14
+ const SCROLL_DELAY = 100;
15
+ export const ChartLegend = ({ items, legendTitle, ariaLabel, actions, position, onItemVisibilityChange, onItemHighlightEnter, onItemHighlightExit, getTooltipContent, }) => {
16
+ var _a;
17
+ const containerRef = useRef(null);
18
+ const elementsByIndexRef = useRef([]);
19
+ const elementsByIdRef = useRef({});
20
+ const tooltipRef = useRef(null);
21
+ const highlightControl = useMemo(() => new DebouncedCall(), []);
22
+ const scrollIntoViewControl = useMemo(() => new DebouncedCall(), []);
23
+ const [selectedIndex, setSelectedIndex] = useState(0);
24
+ const [tooltipItemId, setTooltipItemId] = useState(null);
25
+ const { showTooltip, hideTooltip } = useMemo(() => {
26
+ const control = new DebouncedCall();
27
+ return {
28
+ showTooltip(itemId) {
29
+ control.call(() => setTooltipItemId(itemId));
30
+ },
31
+ hideTooltip(lock = false) {
32
+ control.call(() => setTooltipItemId(null), TOOLTIP_BLUR_DELAY);
33
+ if (lock) {
34
+ control.lock(TOOLTIP_BLUR_DELAY);
35
+ }
36
+ },
37
+ };
38
+ }, []);
39
+ useEffect(() => {
40
+ if (!tooltipItemId) {
41
+ return;
42
+ }
43
+ const onDocumentKeyDown = (event) => {
44
+ var _a;
45
+ if (event.keyCode === KeyCode.escape) {
46
+ hideTooltip(true);
47
+ (_a = elementsByIdRef.current[tooltipItemId]) === null || _a === void 0 ? void 0 : _a.focus();
48
+ }
49
+ };
50
+ document.addEventListener("keydown", onDocumentKeyDown, true);
51
+ return () => {
52
+ document.removeEventListener("keydown", onDocumentKeyDown, true);
53
+ };
54
+ }, [items, tooltipItemId, hideTooltip]);
55
+ const isMouseInContainer = useRef(false);
56
+ // Scrolling to the highlighted legend item.
57
+ useEffect(() => {
58
+ const highlightedIndex = items.findIndex((item) => item.highlighted);
59
+ if (highlightedIndex === -1) {
60
+ return;
61
+ }
62
+ scrollIntoViewControl.call(() => {
63
+ var _a;
64
+ if (isMouseInContainer.current) {
65
+ return;
66
+ }
67
+ const container = containerRef.current;
68
+ const element = (_a = elementsByIndexRef.current) === null || _a === void 0 ? void 0 : _a[highlightedIndex];
69
+ if (!container || !element) {
70
+ return;
71
+ }
72
+ const elementRect = element.getBoundingClientRect();
73
+ const containerRect = container.getBoundingClientRect();
74
+ const isVisible = elementRect.top >= containerRect.top && elementRect.bottom <= containerRect.bottom;
75
+ if (!isVisible) {
76
+ const elementCenter = elementRect.top + elementRect.height / 2;
77
+ const containerCenter = containerRect.top + containerRect.height / 2;
78
+ const top = container.scrollTop + (elementCenter - containerCenter);
79
+ container.scrollTo({ top, behavior: "smooth" });
80
+ }
81
+ }, SCROLL_DELAY);
82
+ }, [items, scrollIntoViewControl]);
83
+ const showHighlight = (itemId) => {
84
+ const item = items.find((item) => item.id === itemId);
85
+ if (item === null || item === void 0 ? void 0 : item.visible) {
86
+ highlightControl.cancelPrevious();
87
+ onItemHighlightEnter(item);
88
+ }
89
+ };
90
+ const clearHighlight = () => {
91
+ highlightControl.call(onItemHighlightExit, HIGHLIGHT_LOST_DELAY);
92
+ };
93
+ const navigationAPI = useRef(null);
94
+ function onFocus(index, itemId) {
95
+ setSelectedIndex(index);
96
+ navigationAPI.current.updateFocusTarget();
97
+ showHighlight(itemId);
98
+ showTooltip(itemId);
99
+ }
100
+ function onBlur(event) {
101
+ navigationAPI.current.updateFocusTarget();
102
+ // Hide tooltip and clear highlight unless focus moves inside tooltip;
103
+ if (tooltipRef.current && event.relatedTarget && !tooltipRef.current.contains(event.relatedTarget)) {
104
+ clearHighlight();
105
+ hideTooltip();
106
+ }
107
+ }
108
+ function focusElement(index) {
109
+ var _a;
110
+ (_a = elementsByIndexRef.current[index]) === null || _a === void 0 ? void 0 : _a.focus();
111
+ }
112
+ function onKeyDown(event) {
113
+ if (event.keyCode === KeyCode.right ||
114
+ event.keyCode === KeyCode.left ||
115
+ event.keyCode === KeyCode.up ||
116
+ event.keyCode === KeyCode.down ||
117
+ event.keyCode === KeyCode.home ||
118
+ event.keyCode === KeyCode.end ||
119
+ event.keyCode === KeyCode.escape) {
120
+ // Preventing default fixes an issue in Safari+VO when VO additionally interprets arrow keys as its commands.
121
+ event.preventDefault();
122
+ const range = [0, items.length - 1];
123
+ handleKey(event, {
124
+ onInlineStart: () => focusElement(circleIndex(selectedIndex - 1, range)),
125
+ onInlineEnd: () => focusElement(circleIndex(selectedIndex + 1, range)),
126
+ onBlockStart: () => focusElement(circleIndex(selectedIndex - 1, range)),
127
+ onBlockEnd: () => focusElement(circleIndex(selectedIndex + 1, range)),
128
+ onHome: () => focusElement(0),
129
+ onEnd: () => focusElement(items.length - 1),
130
+ onEscape: () => onItemHighlightExit(),
131
+ });
132
+ }
133
+ }
134
+ function getNextFocusTarget() {
135
+ var _a;
136
+ if (containerRef.current) {
137
+ const buttons = Array.from(containerRef.current.querySelectorAll(`.${styles.item}`));
138
+ return (_a = buttons[selectedIndex]) !== null && _a !== void 0 ? _a : null;
139
+ }
140
+ return null;
141
+ }
142
+ function onUnregisterActive(focusableElement, navigationAPI) {
143
+ var _a;
144
+ const target = (_a = navigationAPI.current) === null || _a === void 0 ? void 0 : _a.getFocusTarget();
145
+ if (target && target.dataset.itemid !== focusableElement.dataset.itemid) {
146
+ target.focus();
147
+ }
148
+ }
149
+ useEffect(() => {
150
+ navigationAPI.current.updateFocusTarget();
151
+ });
152
+ const toggleItem = (itemId) => {
153
+ const visibleItems = items.filter((i) => i.visible).map((i) => i.id);
154
+ if (visibleItems.includes(itemId)) {
155
+ onItemVisibilityChange(visibleItems.filter((visibleItemId) => visibleItemId !== itemId));
156
+ }
157
+ else {
158
+ onItemVisibilityChange([...visibleItems, itemId]);
159
+ }
160
+ // Needed for touch devices.
161
+ onItemHighlightExit();
162
+ };
163
+ const selectItem = (itemId) => {
164
+ const visibleItems = items.filter((i) => i.visible).map((i) => i.id);
165
+ if (visibleItems.length === 1 && visibleItems[0] === itemId) {
166
+ onItemVisibilityChange(items.map((i) => i.id));
167
+ }
168
+ else {
169
+ onItemVisibilityChange([itemId]);
170
+ }
171
+ // Needed for touch devices.
172
+ onItemHighlightExit();
173
+ };
174
+ const tooltipTrack = useRef(null);
175
+ const tooltipTarget = (_a = items.find((item) => item.id === tooltipItemId)) !== null && _a !== void 0 ? _a : null;
176
+ tooltipTrack.current = tooltipItemId ? elementsByIdRef.current[tooltipItemId] : null;
177
+ const tooltipContent = tooltipTarget && getTooltipContent({ legendItem: tooltipTarget });
178
+ const tooltipPosition = position === "bottom" ? "bottom" : "left";
179
+ return (_jsx(SingleTabStopNavigationProvider, { ref: navigationAPI, navigationActive: true, getNextFocusTarget: () => getNextFocusTarget(), onUnregisterActive: (element) => onUnregisterActive(element, navigationAPI), children: _jsxs("div", { ref: containerRef, role: "toolbar", "aria-label": legendTitle || ariaLabel, className: clsx(testClasses.root, styles.root, {
180
+ [styles["root-side"]]: position === "side",
181
+ }), onMouseEnter: () => (isMouseInContainer.current = true), onMouseLeave: () => (isMouseInContainer.current = false), children: [legendTitle && (_jsx(Box, { fontWeight: "bold", className: testClasses.title, children: legendTitle })), _jsxs("div", {
182
+ // The list element is not focusable. However, the focus lands on it regardless, when testing in Firefox.
183
+ // Setting the tab index to -1 does fix the problem.
184
+ tabIndex: -1, className: clsx(styles.list, {
185
+ [styles["list-bottom"]]: position === "bottom",
186
+ [styles["list-side"]]: position === "side",
187
+ }), children: [actions && (_jsx(_Fragment, { children: _jsxs("div", { className: clsx(testClasses.actions, styles.actions, {
188
+ [styles["actions-bottom"]]: position === "bottom",
189
+ [styles["actions-side"]]: position === "side",
190
+ }), children: [actions, _jsx("div", { className: clsx(styles["actions-divider"], {
191
+ [styles["actions-divider-bottom"]]: position === "bottom",
192
+ [styles["actions-divider-side"]]: position === "side",
193
+ }) })] }) })), _jsx("div", { className: clsx({
194
+ [styles["legend-bottom"]]: position === "bottom",
195
+ [styles["legend-side"]]: position === "side",
196
+ }), children: items.map((item, index) => {
197
+ const handlers = {
198
+ onMouseEnter: () => {
199
+ showHighlight(item.id);
200
+ showTooltip(item.id);
201
+ },
202
+ onMouseLeave: () => {
203
+ clearHighlight();
204
+ hideTooltip();
205
+ },
206
+ onFocus: () => {
207
+ onFocus(index, item.id);
208
+ },
209
+ onBlur: (event) => {
210
+ onBlur(event);
211
+ },
212
+ onKeyDown,
213
+ };
214
+ const thisTriggerRef = (elem) => {
215
+ if (elem) {
216
+ elementsByIndexRef.current[index] = elem;
217
+ elementsByIdRef.current[item.id] = elem;
218
+ }
219
+ else {
220
+ delete elementsByIndexRef.current[index];
221
+ delete elementsByIdRef.current[index];
222
+ }
223
+ };
224
+ return (_jsx(LegendItemTrigger, { ...handlers, ref: thisTriggerRef, onClick: (event) => {
225
+ if (event.metaKey || event.ctrlKey) {
226
+ toggleItem(item.id);
227
+ }
228
+ else {
229
+ selectItem(item.id);
230
+ }
231
+ }, isHighlighted: item.highlighted, someHighlighted: items.some((item) => item.highlighted), itemId: item.id, label: item.name, visible: item.visible, marker: item.marker }, index));
232
+ }) })] }), tooltipContent && (_jsx(InternalChartTooltip, { trackRef: tooltipTrack, trackKey: tooltipTarget.id, container: null, dismissButton: false, onDismiss: () => { }, position: tooltipPosition, title: tooltipContent.header, onMouseEnter: () => showTooltip(tooltipTarget.id), onMouseLeave: () => hideTooltip(), onBlur: () => hideTooltip(), footer: tooltipContent.footer && (_jsxs(_Fragment, { children: [_jsx("hr", { "aria-hidden": true }), tooltipContent.footer] })), children: tooltipContent.body }))] }) }));
233
+ };
234
+ const LegendItemTrigger = forwardRef(({ isHighlighted, someHighlighted, itemId, label, marker, visible, onClick, triggerRef, onMouseEnter, onMouseLeave, onFocus, onBlur, onKeyDown, }, ref) => {
235
+ const refObject = useRef(null);
236
+ const mergedRef = useMergeRefs(ref, triggerRef, refObject);
237
+ const { tabIndex } = useSingleTabStopNavigation(refObject);
238
+ return (_jsxs("button", { "data-itemid": itemId, "aria-pressed": visible, "aria-current": isHighlighted, className: clsx(testClasses.item, styles.item, {
239
+ [styles["item--inactive"]]: !visible,
240
+ [testClasses["hidden-item"]]: !visible,
241
+ [styles["item--dimmed"]]: someHighlighted && !isHighlighted,
242
+ [testClasses["dimmed-item"]]: someHighlighted && !isHighlighted,
243
+ }), ref: mergedRef, tabIndex: tabIndex, onClick: onClick, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onFocus: onFocus, onBlur: onBlur, onKeyDown: onKeyDown, children: [marker, _jsx("span", { className: styles["item-label"], children: label })] }));
244
+ });
245
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/internal/components/chart-legend/index.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { forwardRef, Ref, useEffect, useMemo, useRef, useState } from \"react\";\nimport clsx from \"clsx\";\n\nimport {\n circleIndex,\n handleKey,\n KeyCode,\n SingleTabStopNavigationAPI,\n SingleTabStopNavigationProvider,\n useMergeRefs,\n useSingleTabStopNavigation,\n} from \"@cloudscape-design/component-toolkit/internal\";\nimport Box from \"@cloudscape-design/components/box\";\nimport { InternalChartTooltip } from \"@cloudscape-design/components/internal/do-not-use/chart-tooltip\";\n\nimport { DebouncedCall } from \"../../utils/utils\";\nimport { GetLegendTooltipContentProps, LegendItem, LegendTooltipContent } from \"../interfaces\";\n\nimport styles from \"./styles.css.js\";\nimport testClasses from \"./test-classes/styles.css.js\";\n\nconst TOOLTIP_BLUR_DELAY = 50;\nconst HIGHLIGHT_LOST_DELAY = 50;\nconst SCROLL_DELAY = 100;\n\nexport interface ChartLegendProps {\n items: readonly LegendItem[];\n legendTitle?: string;\n ariaLabel?: string;\n actions?: React.ReactNode;\n position: \"bottom\" | \"side\";\n onItemHighlightEnter: (item: LegendItem) => void;\n onItemHighlightExit: () => void;\n onItemVisibilityChange: (hiddenItems: string[]) => void;\n getTooltipContent: (props: GetLegendTooltipContentProps) => null | LegendTooltipContent;\n}\n\nexport const ChartLegend = ({\n items,\n legendTitle,\n ariaLabel,\n actions,\n position,\n onItemVisibilityChange,\n onItemHighlightEnter,\n onItemHighlightExit,\n getTooltipContent,\n}: ChartLegendProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const elementsByIndexRef = useRef<Record<number, HTMLElement>>([]);\n const elementsByIdRef = useRef<Record<string, HTMLElement>>({});\n const tooltipRef = useRef<HTMLElement>(null);\n const highlightControl = useMemo(() => new DebouncedCall(), []);\n const scrollIntoViewControl = useMemo(() => new DebouncedCall(), []);\n const [selectedIndex, setSelectedIndex] = useState<number>(0);\n const [tooltipItemId, setTooltipItemId] = useState<string | null>(null);\n const { showTooltip, hideTooltip } = useMemo(() => {\n const control = new DebouncedCall();\n return {\n showTooltip(itemId: string) {\n control.call(() => setTooltipItemId(itemId));\n },\n hideTooltip(lock = false) {\n control.call(() => setTooltipItemId(null), TOOLTIP_BLUR_DELAY);\n if (lock) {\n control.lock(TOOLTIP_BLUR_DELAY);\n }\n },\n };\n }, []);\n\n useEffect(() => {\n if (!tooltipItemId) {\n return;\n }\n const onDocumentKeyDown = (event: KeyboardEvent) => {\n if (event.keyCode === KeyCode.escape) {\n hideTooltip(true);\n elementsByIdRef.current[tooltipItemId]?.focus();\n }\n };\n document.addEventListener(\"keydown\", onDocumentKeyDown, true);\n return () => {\n document.removeEventListener(\"keydown\", onDocumentKeyDown, true);\n };\n }, [items, tooltipItemId, hideTooltip]);\n const isMouseInContainer = useRef<boolean>(false);\n\n // Scrolling to the highlighted legend item.\n useEffect(() => {\n const highlightedIndex = items.findIndex((item) => item.highlighted);\n if (highlightedIndex === -1) {\n return;\n }\n scrollIntoViewControl.call(() => {\n if (isMouseInContainer.current) {\n return;\n }\n const container = containerRef.current;\n const element = elementsByIndexRef.current?.[highlightedIndex];\n if (!container || !element) {\n return;\n }\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const isVisible = elementRect.top >= containerRect.top && elementRect.bottom <= containerRect.bottom;\n if (!isVisible) {\n const elementCenter = elementRect.top + elementRect.height / 2;\n const containerCenter = containerRect.top + containerRect.height / 2;\n const top = container.scrollTop + (elementCenter - containerCenter);\n container.scrollTo({ top, behavior: \"smooth\" });\n }\n }, SCROLL_DELAY);\n }, [items, scrollIntoViewControl]);\n\n const showHighlight = (itemId: string) => {\n const item = items.find((item) => item.id === itemId);\n if (item?.visible) {\n highlightControl.cancelPrevious();\n onItemHighlightEnter(item);\n }\n };\n const clearHighlight = () => {\n highlightControl.call(onItemHighlightExit, HIGHLIGHT_LOST_DELAY);\n };\n\n const navigationAPI = useRef<SingleTabStopNavigationAPI>(null);\n\n function onFocus(index: number, itemId: string) {\n setSelectedIndex(index);\n navigationAPI.current!.updateFocusTarget();\n showHighlight(itemId);\n showTooltip(itemId);\n }\n\n function onBlur(event: React.FocusEvent) {\n navigationAPI.current!.updateFocusTarget();\n\n // Hide tooltip and clear highlight unless focus moves inside tooltip;\n if (tooltipRef.current && event.relatedTarget && !tooltipRef.current.contains(event.relatedTarget)) {\n clearHighlight();\n hideTooltip();\n }\n }\n\n function focusElement(index: number) {\n elementsByIndexRef.current[index]?.focus();\n }\n\n function onKeyDown(event: React.KeyboardEvent<HTMLElement>) {\n if (\n event.keyCode === KeyCode.right ||\n event.keyCode === KeyCode.left ||\n event.keyCode === KeyCode.up ||\n event.keyCode === KeyCode.down ||\n event.keyCode === KeyCode.home ||\n event.keyCode === KeyCode.end ||\n event.keyCode === KeyCode.escape\n ) {\n // Preventing default fixes an issue in Safari+VO when VO additionally interprets arrow keys as its commands.\n event.preventDefault();\n\n const range = [0, items.length - 1] as [number, number];\n\n handleKey(event, {\n onInlineStart: () => focusElement(circleIndex(selectedIndex - 1, range)),\n onInlineEnd: () => focusElement(circleIndex(selectedIndex + 1, range)),\n onBlockStart: () => focusElement(circleIndex(selectedIndex - 1, range)),\n onBlockEnd: () => focusElement(circleIndex(selectedIndex + 1, range)),\n onHome: () => focusElement(0),\n onEnd: () => focusElement(items.length - 1),\n onEscape: () => onItemHighlightExit(),\n });\n }\n }\n\n function getNextFocusTarget(): null | HTMLElement {\n if (containerRef.current) {\n const buttons: HTMLButtonElement[] = Array.from(containerRef.current.querySelectorAll(`.${styles.item}`));\n return buttons[selectedIndex] ?? null;\n }\n return null;\n }\n\n function onUnregisterActive(\n focusableElement: HTMLElement,\n navigationAPI: React.RefObject<{ getFocusTarget: () => HTMLElement | null }>,\n ) {\n const target = navigationAPI.current?.getFocusTarget();\n\n if (target && target.dataset.itemid !== focusableElement.dataset.itemid) {\n target.focus();\n }\n }\n\n useEffect(() => {\n navigationAPI.current!.updateFocusTarget();\n });\n\n const toggleItem = (itemId: string) => {\n const visibleItems = items.filter((i) => i.visible).map((i) => i.id);\n if (visibleItems.includes(itemId)) {\n onItemVisibilityChange(visibleItems.filter((visibleItemId) => visibleItemId !== itemId));\n } else {\n onItemVisibilityChange([...visibleItems, itemId]);\n }\n // Needed for touch devices.\n onItemHighlightExit();\n };\n\n const selectItem = (itemId: string) => {\n const visibleItems = items.filter((i) => i.visible).map((i) => i.id);\n if (visibleItems.length === 1 && visibleItems[0] === itemId) {\n onItemVisibilityChange(items.map((i) => i.id));\n } else {\n onItemVisibilityChange([itemId]);\n }\n // Needed for touch devices.\n onItemHighlightExit();\n };\n\n const tooltipTrack = useRef<null | HTMLElement>(null);\n const tooltipTarget = items.find((item) => item.id === tooltipItemId) ?? null;\n tooltipTrack.current = tooltipItemId ? elementsByIdRef.current[tooltipItemId] : null;\n const tooltipContent = tooltipTarget && getTooltipContent({ legendItem: tooltipTarget });\n const tooltipPosition = position === \"bottom\" ? \"bottom\" : \"left\";\n\n return (\n <SingleTabStopNavigationProvider\n ref={navigationAPI}\n navigationActive={true}\n getNextFocusTarget={() => getNextFocusTarget()}\n onUnregisterActive={(element: HTMLElement) => onUnregisterActive(element, navigationAPI)}\n >\n <div\n ref={containerRef}\n role=\"toolbar\"\n aria-label={legendTitle || ariaLabel}\n className={clsx(testClasses.root, styles.root, {\n [styles[\"root-side\"]]: position === \"side\",\n })}\n onMouseEnter={() => (isMouseInContainer.current = true)}\n onMouseLeave={() => (isMouseInContainer.current = false)}\n >\n {legendTitle && (\n <Box fontWeight=\"bold\" className={testClasses.title}>\n {legendTitle}\n </Box>\n )}\n\n <div\n // The list element is not focusable. However, the focus lands on it regardless, when testing in Firefox.\n // Setting the tab index to -1 does fix the problem.\n tabIndex={-1}\n className={clsx(styles.list, {\n [styles[\"list-bottom\"]]: position === \"bottom\",\n [styles[\"list-side\"]]: position === \"side\",\n })}\n >\n {actions && (\n <>\n <div\n className={clsx(testClasses.actions, styles.actions, {\n [styles[\"actions-bottom\"]]: position === \"bottom\",\n [styles[\"actions-side\"]]: position === \"side\",\n })}\n >\n {actions}\n <div\n className={clsx(styles[\"actions-divider\"], {\n [styles[\"actions-divider-bottom\"]]: position === \"bottom\",\n [styles[\"actions-divider-side\"]]: position === \"side\",\n })}\n />\n </div>\n </>\n )}\n <div\n className={clsx({\n [styles[\"legend-bottom\"]]: position === \"bottom\",\n [styles[\"legend-side\"]]: position === \"side\",\n })}\n >\n {items.map((item, index) => {\n const handlers = {\n onMouseEnter: () => {\n showHighlight(item.id);\n showTooltip(item.id);\n },\n onMouseLeave: () => {\n clearHighlight();\n hideTooltip();\n },\n onFocus: () => {\n onFocus(index, item.id);\n },\n onBlur: (event: React.FocusEvent) => {\n onBlur(event);\n },\n onKeyDown,\n };\n const thisTriggerRef = (elem: null | HTMLElement) => {\n if (elem) {\n elementsByIndexRef.current[index] = elem;\n elementsByIdRef.current[item.id] = elem;\n } else {\n delete elementsByIndexRef.current[index];\n delete elementsByIdRef.current[index];\n }\n };\n return (\n <LegendItemTrigger\n key={index}\n {...handlers}\n ref={thisTriggerRef}\n onClick={(event) => {\n if (event.metaKey || event.ctrlKey) {\n toggleItem(item.id);\n } else {\n selectItem(item.id);\n }\n }}\n isHighlighted={item.highlighted}\n someHighlighted={items.some((item) => item.highlighted)}\n itemId={item.id}\n label={item.name}\n visible={item.visible}\n marker={item.marker}\n />\n );\n })}\n </div>\n </div>\n {tooltipContent && (\n <InternalChartTooltip\n trackRef={tooltipTrack}\n trackKey={tooltipTarget.id}\n container={null}\n dismissButton={false}\n onDismiss={() => {}}\n position={tooltipPosition}\n title={tooltipContent.header}\n onMouseEnter={() => showTooltip(tooltipTarget.id)}\n onMouseLeave={() => hideTooltip()}\n onBlur={() => hideTooltip()}\n footer={\n tooltipContent.footer && (\n <>\n <hr aria-hidden={true} />\n {tooltipContent.footer}\n </>\n )\n }\n >\n {tooltipContent.body}\n </InternalChartTooltip>\n )}\n </div>\n </SingleTabStopNavigationProvider>\n );\n};\n\nconst LegendItemTrigger = forwardRef(\n (\n {\n isHighlighted,\n someHighlighted,\n itemId,\n label,\n marker,\n visible,\n onClick,\n triggerRef,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n onKeyDown,\n }: {\n isHighlighted?: boolean;\n someHighlighted?: boolean;\n itemId: string;\n label: string;\n marker?: React.ReactNode;\n visible: boolean;\n onClick: (event: React.MouseEvent) => void;\n onMarkerClick?: () => void;\n triggerRef?: Ref<HTMLElement>;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n onFocus?: () => void;\n onBlur?: (event: React.FocusEvent) => void;\n onKeyDown?: (event: React.KeyboardEvent<HTMLElement>) => void;\n },\n ref: Ref<HTMLButtonElement>,\n ) => {\n const refObject = useRef<HTMLDivElement>(null);\n const mergedRef = useMergeRefs(ref, triggerRef, refObject);\n const { tabIndex } = useSingleTabStopNavigation(refObject);\n return (\n <button\n data-itemid={itemId}\n aria-pressed={visible}\n aria-current={isHighlighted}\n className={clsx(testClasses.item, styles.item, {\n [styles[\"item--inactive\"]]: !visible,\n [testClasses[\"hidden-item\"]]: !visible,\n [styles[\"item--dimmed\"]]: someHighlighted && !isHighlighted,\n [testClasses[\"dimmed-item\"]]: someHighlighted && !isHighlighted,\n })}\n ref={mergedRef}\n tabIndex={tabIndex}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n >\n {marker}\n <span className={styles[\"item-label\"]}>{label}</span>\n </button>\n );\n },\n);\n"]}
@@ -0,0 +1,22 @@
1
+
2
+ import './styles.scoped.css';
3
+ export default {
4
+ "focus-outline": "awsui_focus-outline_1kjc7_lk6jz_15",
5
+ "item": "awsui_item_1kjc7_lk6jz_27",
6
+ "root": "awsui_root_1kjc7_lk6jz_41",
7
+ "root-side": "awsui_root-side_1kjc7_lk6jz_81",
8
+ "list": "awsui_list_1kjc7_lk6jz_86",
9
+ "list-bottom": "awsui_list-bottom_1kjc7_lk6jz_96",
10
+ "list-side": "awsui_list-side_1kjc7_lk6jz_102",
11
+ "legend-bottom": "awsui_legend-bottom_1kjc7_lk6jz_107",
12
+ "legend-side": "awsui_legend-side_1kjc7_lk6jz_116",
13
+ "item--inactive": "awsui_item--inactive_1kjc7_lk6jz_187",
14
+ "item--dimmed": "awsui_item--dimmed_1kjc7_lk6jz_193",
15
+ "item-label": "awsui_item-label_1kjc7_lk6jz_197",
16
+ "actions": "awsui_actions_1kjc7_lk6jz_207",
17
+ "actions-bottom": "awsui_actions-bottom_1kjc7_lk6jz_212",
18
+ "actions-side": "awsui_actions-side_1kjc7_lk6jz_216",
19
+ "actions-divider-bottom": "awsui_actions-divider-bottom_1kjc7_lk6jz_221",
20
+ "actions-divider-side": "awsui_actions-divider-side_1kjc7_lk6jz_228"
21
+ };
22
+