@watermarkinsights/ripple 4.2.0-0 → 4.2.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 (375) hide show
  1. package/dist/cjs/chartFunctions-2c3e010e.js +600 -0
  2. package/dist/cjs/{functions-4208c444.js → functions-91da05e9.js} +362 -362
  3. package/dist/cjs/{global-38728020.js → global-b85941b0.js} +29 -24
  4. package/dist/cjs/{index-f8ef86de.js → index-fae02cd7.js} +150 -436
  5. package/dist/cjs/interfaces-245d7bff.js +38 -0
  6. package/dist/cjs/intl-fa3bb4ae.js +179 -0
  7. package/dist/cjs/loader.cjs.js +13 -4
  8. package/dist/cjs/priv-chart-popover.cjs.entry.js +85 -85
  9. package/dist/cjs/priv-datepicker.cjs.entry.js +637 -637
  10. package/dist/cjs/priv-navigator-button.cjs.entry.js +18 -18
  11. package/dist/cjs/priv-navigator-item.cjs.entry.js +21 -21
  12. package/dist/cjs/ripple.cjs.js +7 -4
  13. package/dist/cjs/wm-action-menu_2.cjs.entry.js +314 -314
  14. package/dist/cjs/wm-button.cjs.entry.js +174 -174
  15. package/dist/cjs/wm-chart-slice.cjs.entry.js +17 -17
  16. package/dist/cjs/wm-chart.cjs.entry.js +164 -164
  17. package/dist/cjs/wm-datepicker.cjs.entry.js +160 -160
  18. package/dist/cjs/wm-file-list.cjs.entry.js +10 -10
  19. package/dist/cjs/wm-file.cjs.entry.js +178 -178
  20. package/dist/cjs/wm-input.cjs.entry.js +102 -102
  21. package/dist/cjs/wm-line-chart.cjs.entry.js +448 -448
  22. package/dist/cjs/wm-modal-footer.cjs.entry.js +27 -27
  23. package/dist/cjs/wm-modal-header.cjs.entry.js +21 -21
  24. package/dist/cjs/wm-modal.cjs.entry.js +92 -92
  25. package/dist/cjs/wm-navigation_3.cjs.entry.js +180 -180
  26. package/dist/cjs/wm-navigator.cjs.entry.js +251 -251
  27. package/dist/cjs/wm-option_2.cjs.entry.js +712 -712
  28. package/dist/cjs/wm-pagination.cjs.entry.js +169 -169
  29. package/dist/cjs/wm-progress-indicator_3.cjs.entry.js +151 -151
  30. package/dist/cjs/wm-search.cjs.entry.js +192 -192
  31. package/dist/cjs/wm-snackbar.cjs.entry.js +114 -114
  32. package/dist/cjs/wm-tab-item_3.cjs.entry.js +247 -247
  33. package/dist/cjs/wm-tag-input.cjs.entry.js +849 -849
  34. package/dist/cjs/wm-tag-option.cjs.entry.js +33 -33
  35. package/dist/cjs/wm-timepicker.cjs.entry.js +270 -270
  36. package/dist/cjs/wm-toggletip.cjs.entry.js +100 -100
  37. package/dist/cjs/wm-uploader.cjs.entry.js +198 -198
  38. package/dist/cjs/wm-wrapper.cjs.entry.js +12 -12
  39. package/dist/collection/collection-manifest.json +41 -41
  40. package/dist/collection/components/charts/chartFunctions.js +456 -456
  41. package/dist/collection/components/charts/chartFunctions.spec.js +13 -13
  42. package/dist/collection/components/charts/priv-chart-popover/priv-chart-popover.e2e.js +73 -73
  43. package/dist/collection/components/charts/priv-chart-popover/priv-chart-popover.js +254 -257
  44. package/dist/collection/components/charts/screenshots.e2e.js +30 -30
  45. package/dist/collection/components/charts/wm-chart/wm-chart-slice.js +121 -121
  46. package/dist/collection/components/charts/wm-chart/wm-chart.e2e.js +160 -160
  47. package/dist/collection/components/charts/wm-chart/wm-chart.js +381 -382
  48. package/dist/collection/components/charts/wm-chart/wm-chart.spec.js +26 -26
  49. package/dist/collection/components/charts/wm-line-chart/wm-line-chart.css +2 -1
  50. package/dist/collection/components/charts/wm-line-chart/wm-line-chart.e2e.js +138 -138
  51. package/dist/collection/components/charts/wm-line-chart/wm-line-chart.js +717 -717
  52. package/dist/collection/components/charts/wm-line-chart/wm-line-chart.spec.js +106 -106
  53. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-indicator.js +202 -202
  54. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.e2e.js +54 -54
  55. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.js +136 -136
  56. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.spec.js +31 -31
  57. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-slice.js +119 -119
  58. package/dist/collection/components/wm-action-menu/wm-action-menu.e2e.js +187 -187
  59. package/dist/collection/components/wm-action-menu/wm-action-menu.js +435 -435
  60. package/dist/collection/components/wm-action-menu/wm-action-menu.spec.js +35 -35
  61. package/dist/collection/components/wm-button/wm-button.e2e.js +58 -58
  62. package/dist/collection/components/wm-button/wm-button.js +452 -454
  63. package/dist/collection/components/wm-button/wm-button.spec.js +63 -63
  64. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.js +939 -943
  65. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.spec.js +71 -71
  66. package/dist/collection/components/wm-datepicker/wm-datepicker.css +2 -1
  67. package/dist/collection/components/wm-datepicker/wm-datepicker.e2e.js +359 -359
  68. package/dist/collection/components/wm-datepicker/wm-datepicker.js +413 -415
  69. package/dist/collection/components/wm-datepicker/wm-datepicker.spec.js +13 -13
  70. package/dist/collection/components/wm-file/wm-file.js +380 -380
  71. package/dist/collection/components/wm-file/wm-file.spec.js +107 -107
  72. package/dist/collection/components/wm-file-list/wm-file-list.js +42 -42
  73. package/dist/collection/components/wm-file-list/wm-file-list.spec.js +47 -47
  74. package/dist/collection/components/wm-input/wm-input.e2e.js +26 -26
  75. package/dist/collection/components/wm-input/wm-input.js +453 -453
  76. package/dist/collection/components/wm-input/wm-input.spec.js +168 -168
  77. package/dist/collection/components/wm-menuitem/wm-menuitem.e2e.js +18 -18
  78. package/dist/collection/components/wm-menuitem/wm-menuitem.js +436 -446
  79. package/dist/collection/components/wm-menuitem/wm-menuitem.spec.js +46 -46
  80. package/dist/collection/components/wm-modal/wm-modal-footer.js +130 -130
  81. package/dist/collection/components/wm-modal/wm-modal-footer.spec.js +8 -8
  82. package/dist/collection/components/wm-modal/wm-modal-header.js +68 -68
  83. package/dist/collection/components/wm-modal/wm-modal-header.spec.js +5 -5
  84. package/dist/collection/components/wm-modal/wm-modal.css +1 -0
  85. package/dist/collection/components/wm-modal/wm-modal.e2e.js +65 -65
  86. package/dist/collection/components/wm-modal/wm-modal.js +296 -299
  87. package/dist/collection/components/wm-modal/wm-modal.spec.js +22 -22
  88. package/dist/collection/components/wm-navigation/wm-navigation-hamburger.css +1 -0
  89. package/dist/collection/components/wm-navigation/wm-navigation-hamburger.js +112 -112
  90. package/dist/collection/components/wm-navigation/wm-navigation-item.js +125 -125
  91. package/dist/collection/components/wm-navigation/wm-navigation.css +3 -1
  92. package/dist/collection/components/wm-navigation/wm-navigation.e2e.js +86 -86
  93. package/dist/collection/components/wm-navigation/wm-navigation.js +209 -209
  94. package/dist/collection/components/wm-navigation/wm-navigation.spec.js +79 -79
  95. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.e2e.js +30 -30
  96. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.js +103 -103
  97. package/dist/collection/components/wm-navigator/priv-navigator-item/priv-navigator-item.js +118 -119
  98. package/dist/collection/components/wm-navigator/wm-navigator.e2e.js +180 -180
  99. package/dist/collection/components/wm-navigator/wm-navigator.js +454 -454
  100. package/dist/collection/components/wm-navigator/wm-navigator.spec.js +153 -153
  101. package/dist/collection/components/wm-option/wm-option.css +1 -1
  102. package/dist/collection/components/wm-option/wm-option.e2e.js +19 -19
  103. package/dist/collection/components/wm-option/wm-option.js +463 -474
  104. package/dist/collection/components/wm-option/wm-option.spec.js +39 -39
  105. package/dist/collection/components/wm-pagination/wm-pagination.e2e.js +301 -301
  106. package/dist/collection/components/wm-pagination/wm-pagination.js +327 -327
  107. package/dist/collection/components/wm-search/wm-search.e2e.js +69 -69
  108. package/dist/collection/components/wm-search/wm-search.js +414 -415
  109. package/dist/collection/components/wm-search/wm-search.spec.js +64 -64
  110. package/dist/collection/components/wm-select/wm-select.css +1 -0
  111. package/dist/collection/components/wm-select/wm-select.e2e.js +443 -443
  112. package/dist/collection/components/wm-select/wm-select.js +966 -967
  113. package/dist/collection/components/wm-select/wm-select.spec.js +250 -250
  114. package/dist/collection/components/wm-snackbar/wm-snackbar.e2e.js +114 -114
  115. package/dist/collection/components/wm-snackbar/wm-snackbar.js +207 -209
  116. package/dist/collection/components/wm-snackbar/wm-snackbar.spec.js +4 -4
  117. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.js +188 -190
  118. package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.js +261 -261
  119. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.js +104 -104
  120. package/dist/collection/components/wm-tabs/wm-tabs.e2e.js +79 -79
  121. package/dist/collection/components/wm-tabs/wm-tabs.spec.js +6 -6
  122. package/dist/collection/components/wm-tag-input/wm-tag-input.css +4 -2
  123. package/dist/collection/components/wm-tag-input/wm-tag-input.e2e.js +168 -168
  124. package/dist/collection/components/wm-tag-input/wm-tag-input.js +1159 -1159
  125. package/dist/collection/components/wm-tag-input/wm-tag-input.spec.js +147 -147
  126. package/dist/collection/components/wm-tag-input/wm-tag-option/wm-tag-option.js +234 -236
  127. package/dist/collection/components/wm-timepicker/wm-timepicker.css +2 -1
  128. package/dist/collection/components/wm-timepicker/wm-timepicker.e2e.js +147 -147
  129. package/dist/collection/components/wm-timepicker/wm-timepicker.js +527 -531
  130. package/dist/collection/components/wm-timepicker/wm-timepicker.spec.js +151 -151
  131. package/dist/collection/components/wm-toggletip/wm-toggletip.css +1 -1
  132. package/dist/collection/components/wm-toggletip/wm-toggletip.e2e.js +61 -61
  133. package/dist/collection/components/wm-toggletip/wm-toggletip.js +208 -209
  134. package/dist/collection/components/wm-toggletip/wm-toggletip.spec.js +16 -16
  135. package/dist/collection/components/wm-uploader/wm-uploader.e2e.js +56 -56
  136. package/dist/collection/components/wm-uploader/wm-uploader.js +422 -423
  137. package/dist/collection/components/wm-uploader/wm-uploader.spec.js +149 -149
  138. package/dist/collection/components/wm-wrapper/wm-wrapper.js +26 -26
  139. package/dist/collection/global/__mocks__/functions.js +1 -1
  140. package/dist/collection/global/functions.js +510 -510
  141. package/dist/collection/global/functions.spec.js +123 -123
  142. package/dist/collection/global/global.js +16 -16
  143. package/dist/collection/global/interfaces.js +39 -39
  144. package/dist/collection/global/intl.js +162 -162
  145. package/dist/collection/global/services/__mocks__/http-service.js +112 -112
  146. package/dist/collection/global/services/http-service.js +41 -41
  147. package/dist/collection/global/themes/default.js +9 -4
  148. package/dist/collection/global/themes/neutral.js +4 -4
  149. package/dist/collection/lang/lang.spec.js +13 -13
  150. package/dist/esm/chartFunctions-36634c04.js +584 -0
  151. package/dist/esm/{functions-d0e70094.js → functions-5afd09f4.js} +362 -362
  152. package/dist/esm/{global-462b022e.js → global-91088105.js} +29 -24
  153. package/dist/esm/{index-f164fbca.js → index-7e11ea42.js} +150 -436
  154. package/dist/esm/interfaces-89cad2fc.js +35 -0
  155. package/dist/esm/intl-e2da750a.js +174 -0
  156. package/dist/esm/loader.js +14 -5
  157. package/dist/esm/polyfills/css-shim.js +1 -0
  158. package/dist/esm/priv-chart-popover.entry.js +85 -85
  159. package/dist/esm/priv-datepicker.entry.js +637 -637
  160. package/dist/esm/priv-navigator-button.entry.js +18 -18
  161. package/dist/esm/priv-navigator-item.entry.js +21 -21
  162. package/dist/esm/ripple.js +8 -5
  163. package/dist/esm/wm-action-menu_2.entry.js +314 -314
  164. package/dist/esm/wm-button.entry.js +174 -174
  165. package/dist/esm/wm-chart-slice.entry.js +17 -17
  166. package/dist/esm/wm-chart.entry.js +164 -164
  167. package/dist/esm/wm-datepicker.entry.js +160 -160
  168. package/dist/esm/wm-file-list.entry.js +10 -10
  169. package/dist/esm/wm-file.entry.js +178 -178
  170. package/dist/esm/wm-input.entry.js +102 -102
  171. package/dist/esm/wm-line-chart.entry.js +448 -448
  172. package/dist/esm/wm-modal-footer.entry.js +27 -27
  173. package/dist/esm/wm-modal-header.entry.js +21 -21
  174. package/dist/esm/wm-modal.entry.js +92 -92
  175. package/dist/esm/wm-navigation_3.entry.js +180 -180
  176. package/dist/esm/wm-navigator.entry.js +251 -251
  177. package/dist/esm/wm-option_2.entry.js +712 -712
  178. package/dist/esm/wm-pagination.entry.js +169 -169
  179. package/dist/esm/wm-progress-indicator_3.entry.js +151 -151
  180. package/dist/esm/wm-search.entry.js +192 -192
  181. package/dist/esm/wm-snackbar.entry.js +114 -114
  182. package/dist/esm/wm-tab-item_3.entry.js +247 -247
  183. package/dist/esm/wm-tag-input.entry.js +849 -849
  184. package/dist/esm/wm-tag-option.entry.js +33 -33
  185. package/dist/esm/wm-timepicker.entry.js +270 -270
  186. package/dist/esm/wm-toggletip.entry.js +100 -100
  187. package/dist/esm/wm-uploader.entry.js +198 -198
  188. package/dist/esm/wm-wrapper.entry.js +12 -12
  189. package/dist/esm-es5/chartFunctions-36634c04.js +1 -0
  190. package/dist/esm-es5/functions-5afd09f4.js +1 -0
  191. package/dist/esm-es5/global-91088105.js +1 -0
  192. package/dist/esm-es5/index-7e11ea42.js +2 -0
  193. package/dist/esm-es5/{intl-05c9e0c9.js → intl-e2da750a.js} +1 -1
  194. package/dist/esm-es5/loader.js +1 -1
  195. package/dist/esm-es5/priv-chart-popover.entry.js +1 -1
  196. package/dist/esm-es5/priv-datepicker.entry.js +1 -1
  197. package/dist/esm-es5/priv-navigator-button.entry.js +1 -1
  198. package/dist/esm-es5/priv-navigator-item.entry.js +1 -1
  199. package/dist/esm-es5/ripple.js +1 -1
  200. package/dist/esm-es5/wm-action-menu_2.entry.js +1 -1
  201. package/dist/esm-es5/wm-button.entry.js +1 -1
  202. package/dist/esm-es5/wm-chart-slice.entry.js +1 -1
  203. package/dist/esm-es5/wm-chart.entry.js +1 -1
  204. package/dist/esm-es5/wm-datepicker.entry.js +1 -1
  205. package/dist/esm-es5/wm-file-list.entry.js +1 -1
  206. package/dist/esm-es5/wm-file.entry.js +1 -1
  207. package/dist/esm-es5/wm-input.entry.js +1 -1
  208. package/dist/esm-es5/wm-line-chart.entry.js +1 -1
  209. package/dist/esm-es5/wm-modal-footer.entry.js +1 -1
  210. package/dist/esm-es5/wm-modal-header.entry.js +1 -1
  211. package/dist/esm-es5/wm-modal.entry.js +1 -1
  212. package/dist/esm-es5/wm-navigation_3.entry.js +1 -1
  213. package/dist/esm-es5/wm-navigator.entry.js +1 -1
  214. package/dist/esm-es5/wm-option_2.entry.js +1 -1
  215. package/dist/esm-es5/wm-pagination.entry.js +1 -1
  216. package/dist/esm-es5/wm-progress-indicator_3.entry.js +1 -1
  217. package/dist/esm-es5/wm-search.entry.js +1 -1
  218. package/dist/esm-es5/wm-snackbar.entry.js +1 -1
  219. package/dist/esm-es5/wm-tab-item_3.entry.js +1 -1
  220. package/dist/esm-es5/wm-tag-input.entry.js +1 -1
  221. package/dist/esm-es5/wm-tag-option.entry.js +1 -1
  222. package/dist/esm-es5/wm-timepicker.entry.js +1 -1
  223. package/dist/esm-es5/wm-toggletip.entry.js +1 -1
  224. package/dist/esm-es5/wm-uploader.entry.js +1 -1
  225. package/dist/esm-es5/wm-wrapper.entry.js +1 -1
  226. package/dist/loader/index.d.ts +1 -1
  227. package/dist/ripple/p-00acacbe.system.entry.js +1 -0
  228. package/dist/ripple/{p-3446852f.system.entry.js → p-0631be01.system.entry.js} +1 -1
  229. package/dist/ripple/{p-ad6dc751.entry.js → p-0aecac86.entry.js} +1 -1
  230. package/dist/ripple/{p-c717d895.entry.js → p-0d9f70ab.entry.js} +1 -1
  231. package/dist/ripple/{p-b253d2fc.entry.js → p-0f1ff645.entry.js} +1 -1
  232. package/dist/ripple/{p-63f75d43.entry.js → p-1205fdc1.entry.js} +1 -1
  233. package/dist/ripple/{p-27f47edc.entry.js → p-1283e85d.entry.js} +1 -1
  234. package/dist/ripple/{p-43e2a49a.entry.js → p-13594c2e.entry.js} +1 -1
  235. package/dist/ripple/{p-5a921e55.entry.js → p-13af8346.entry.js} +1 -1
  236. package/dist/ripple/{p-ceced3d9.system.entry.js → p-15497721.system.entry.js} +1 -1
  237. package/dist/ripple/p-16363e1c.system.entry.js +1 -0
  238. package/dist/ripple/{p-3a070f35.entry.js → p-19773c40.entry.js} +1 -1
  239. package/dist/ripple/{p-b4d862e1.system.entry.js → p-1cde16a7.system.entry.js} +1 -1
  240. package/dist/ripple/{p-f711c914.entry.js → p-20f5c695.entry.js} +1 -1
  241. package/dist/ripple/{p-13ca30d8.js → p-24b08e1f.js} +1 -1
  242. package/dist/ripple/{p-2c834d27.system.entry.js → p-2a95b63f.system.entry.js} +1 -1
  243. package/dist/ripple/{p-c96a5c94.system.entry.js → p-2e773564.system.entry.js} +1 -1
  244. package/dist/ripple/p-30bf24f8.system.js +2 -0
  245. package/dist/ripple/p-3248c0fa.system.entry.js +1 -0
  246. package/dist/ripple/{p-473ff44e.system.entry.js → p-32b1126c.system.entry.js} +1 -1
  247. package/dist/ripple/{p-aadf8c59.entry.js → p-36049d2f.entry.js} +1 -1
  248. package/dist/ripple/p-3aca2871.js +1 -0
  249. package/dist/ripple/{p-633cd89a.system.entry.js → p-3becce62.system.entry.js} +1 -1
  250. package/dist/ripple/{p-58174f4e.entry.js → p-3c80bf67.entry.js} +1 -1
  251. package/dist/ripple/p-40fcae38.system.js +1 -0
  252. package/dist/ripple/p-47c20b05.entry.js +1 -0
  253. package/dist/ripple/p-4825101c.system.js +1 -0
  254. package/dist/ripple/p-56d64283.system.entry.js +1 -0
  255. package/dist/ripple/p-5e85967a.system.js +1 -0
  256. package/dist/ripple/{p-067d7922.system.entry.js → p-622a7791.system.entry.js} +1 -1
  257. package/dist/ripple/{p-aba5a00e.system.entry.js → p-676c1089.system.entry.js} +1 -1
  258. package/dist/ripple/{p-153701f9.entry.js → p-6abb903c.entry.js} +1 -1
  259. package/dist/ripple/{p-9e25bfd5.entry.js → p-7529706d.entry.js} +1 -1
  260. package/dist/ripple/{p-de349bee.entry.js → p-7962f562.entry.js} +1 -1
  261. package/dist/ripple/{p-8d4734ad.entry.js → p-80aef387.entry.js} +1 -1
  262. package/dist/ripple/{p-8cace32f.entry.js → p-84a7e757.entry.js} +1 -1
  263. package/dist/ripple/{p-9fecbc8a.system.js → p-85f744ed.system.js} +1 -1
  264. package/dist/ripple/{p-05d4e49b.js → p-863e737a.js} +1 -1
  265. package/dist/ripple/{p-7e56da2e.system.entry.js → p-8ea68cb3.system.entry.js} +1 -1
  266. package/dist/ripple/{p-1402cfa2.system.js → p-8f3f903f.system.js} +1 -1
  267. package/dist/ripple/{p-c249063c.entry.js → p-8f8c3705.entry.js} +1 -1
  268. package/dist/ripple/{p-67d48c33.system.entry.js → p-90ea7e3a.system.entry.js} +1 -1
  269. package/dist/ripple/{p-a82a8931.entry.js → p-9288659b.entry.js} +1 -1
  270. package/dist/ripple/{p-f7aa5a73.entry.js → p-935513f8.entry.js} +1 -1
  271. package/dist/ripple/{p-8b83de0a.entry.js → p-a0bf5eef.entry.js} +1 -1
  272. package/dist/ripple/{p-06776596.system.entry.js → p-a1e95b05.system.entry.js} +1 -1
  273. package/dist/ripple/{p-25446670.entry.js → p-a52c5a1c.entry.js} +1 -1
  274. package/dist/ripple/p-a5b23781.system.entry.js +1 -0
  275. package/dist/ripple/p-a6be3cca.system.entry.js +1 -0
  276. package/dist/ripple/p-a9c096b5.entry.js +1 -0
  277. package/dist/ripple/p-aafa111a.system.js +1 -0
  278. package/dist/ripple/{p-1d8b0039.entry.js → p-ad37cdfd.entry.js} +1 -1
  279. package/dist/ripple/{p-350fe5da.entry.js → p-ae674a54.entry.js} +1 -1
  280. package/dist/ripple/{p-e24ddae1.entry.js → p-b3c73bc9.entry.js} +1 -1
  281. package/dist/ripple/{p-e8b58666.system.entry.js → p-b3e08b14.system.entry.js} +1 -1
  282. package/dist/ripple/p-b5bedd63.js +2 -0
  283. package/dist/ripple/{p-a69c37e0.entry.js → p-b71a83e3.entry.js} +1 -1
  284. package/dist/ripple/p-bd537299.system.entry.js +1 -0
  285. package/dist/ripple/{p-42ebfcfa.entry.js → p-c41603e6.entry.js} +1 -1
  286. package/dist/ripple/{p-5a4d9897.system.entry.js → p-c5e8f8a5.system.entry.js} +1 -1
  287. package/dist/ripple/{p-7a8816d9.system.entry.js → p-c76bbedf.system.entry.js} +1 -1
  288. package/dist/ripple/{p-3af72848.js → p-c7b5ac39.js} +1 -1
  289. package/dist/ripple/{p-361cc8fc.system.entry.js → p-cbd8a60b.system.entry.js} +1 -1
  290. package/dist/ripple/{p-3583d113.system.entry.js → p-d04ba5f8.system.entry.js} +1 -1
  291. package/dist/ripple/{p-1fa2a756.system.entry.js → p-d0f1b8c4.system.entry.js} +1 -1
  292. package/dist/ripple/{p-bdd4f919.system.entry.js → p-d496bc44.system.entry.js} +1 -1
  293. package/dist/ripple/{p-7e8daaac.entry.js → p-deb4f5a2.entry.js} +1 -1
  294. package/dist/ripple/{p-91ad0233.system.entry.js → p-e3f0b57f.system.entry.js} +1 -1
  295. package/dist/ripple/{p-f1a92576.system.entry.js → p-e4919f95.system.entry.js} +1 -1
  296. package/dist/ripple/{p-49118468.entry.js → p-ed942b42.entry.js} +1 -1
  297. package/dist/ripple/{p-0ecbf569.system.entry.js → p-f30839a1.system.entry.js} +1 -1
  298. package/dist/ripple/{p-d3f9d028.system.entry.js → p-ff14e4ec.system.entry.js} +1 -1
  299. package/dist/ripple/ripple.esm.js +1 -1
  300. package/dist/ripple/ripple.js +20 -16
  301. package/dist/types/components/charts/chartFunctions.d.ts +13 -13
  302. package/dist/types/components/charts/priv-chart-popover/priv-chart-popover.d.ts +24 -24
  303. package/dist/types/components/charts/wm-chart/wm-chart-slice.d.ts +8 -8
  304. package/dist/types/components/charts/wm-chart/wm-chart.d.ts +39 -39
  305. package/dist/types/components/charts/wm-line-chart/wm-line-chart.d.ts +73 -73
  306. package/dist/types/components/charts/wm-progress-monitor/wm-progress-indicator.d.ts +26 -26
  307. package/dist/types/components/charts/wm-progress-monitor/wm-progress-monitor.d.ts +17 -17
  308. package/dist/types/components/charts/wm-progress-monitor/wm-progress-slice.d.ts +7 -7
  309. package/dist/types/components/wm-action-menu/wm-action-menu.d.ts +43 -43
  310. package/dist/types/components/wm-button/wm-button.d.ts +40 -40
  311. package/dist/types/components/wm-datepicker/priv-datepicker/priv-datepicker.d.ts +76 -76
  312. package/dist/types/components/wm-datepicker/wm-datepicker.d.ts +31 -31
  313. package/dist/types/components/wm-file/wm-file.d.ts +40 -40
  314. package/dist/types/components/wm-file-list/wm-file-list.d.ts +3 -3
  315. package/dist/types/components/wm-input/wm-input.d.ts +46 -46
  316. package/dist/types/components/wm-menuitem/wm-menuitem.d.ts +31 -31
  317. package/dist/types/components/wm-modal/wm-modal-footer.d.ts +11 -11
  318. package/dist/types/components/wm-modal/wm-modal-header.d.ts +7 -7
  319. package/dist/types/components/wm-modal/wm-modal.d.ts +24 -24
  320. package/dist/types/components/wm-navigation/wm-navigation-hamburger.d.ts +13 -13
  321. package/dist/types/components/wm-navigation/wm-navigation-item.d.ts +10 -10
  322. package/dist/types/components/wm-navigation/wm-navigation.d.ts +23 -23
  323. package/dist/types/components/wm-navigator/priv-navigator-button/priv-navigator-button.d.ts +7 -7
  324. package/dist/types/components/wm-navigator/priv-navigator-item/priv-navigator-item.d.ts +10 -10
  325. package/dist/types/components/wm-navigator/wm-navigator.d.ts +57 -57
  326. package/dist/types/components/wm-option/wm-option.d.ts +36 -36
  327. package/dist/types/components/wm-pagination/wm-pagination.d.ts +27 -27
  328. package/dist/types/components/wm-search/wm-search.d.ts +73 -73
  329. package/dist/types/components/wm-select/wm-select.d.ts +99 -99
  330. package/dist/types/components/wm-snackbar/wm-snackbar.d.ts +24 -24
  331. package/dist/types/components/wm-tabs/wm-tab-item/wm-tab-item.d.ts +30 -30
  332. package/dist/types/components/wm-tabs/wm-tab-list/wm-tab-list.d.ts +41 -41
  333. package/dist/types/components/wm-tabs/wm-tab-panel/wm-tab-panel.d.ts +16 -16
  334. package/dist/types/components/wm-timepicker/wm-timepicker.d.ts +48 -48
  335. package/dist/types/components/wm-toggletip/wm-toggletip.d.ts +20 -20
  336. package/dist/types/components/wm-uploader/wm-uploader.d.ts +47 -47
  337. package/dist/types/components/wm-wrapper/wm-wrapper.d.ts +4 -4
  338. package/dist/types/components.d.ts +0 -382
  339. package/dist/types/global/__mocks__/functions.d.ts +1 -1
  340. package/dist/types/global/functions.d.ts +4 -4
  341. package/dist/types/global/interfaces.d.ts +49 -49
  342. package/dist/types/global/intl.d.ts +31 -31
  343. package/dist/types/global/services/__mocks__/http-service.d.ts +1 -1
  344. package/dist/types/stencil-public-runtime.d.ts +5 -46
  345. package/package.json +1 -1
  346. package/dist/cjs/chartFunctions-cecf8134.js +0 -600
  347. package/dist/cjs/interfaces-ad9e80a6.js +0 -38
  348. package/dist/cjs/intl-3fafc6d1.js +0 -179
  349. package/dist/esm/chartFunctions-23173fce.js +0 -584
  350. package/dist/esm/interfaces-9b75fb61.js +0 -35
  351. package/dist/esm/intl-05c9e0c9.js +0 -174
  352. package/dist/esm-es5/chartFunctions-23173fce.js +0 -1
  353. package/dist/esm-es5/functions-d0e70094.js +0 -1
  354. package/dist/esm-es5/global-462b022e.js +0 -1
  355. package/dist/esm-es5/index-f164fbca.js +0 -2
  356. package/dist/ripple/p-09d62ddd.entry.js +0 -1
  357. package/dist/ripple/p-0fe97e85.system.js +0 -2
  358. package/dist/ripple/p-1453ea51.system.entry.js +0 -1
  359. package/dist/ripple/p-1cc91907.system.js +0 -1
  360. package/dist/ripple/p-26602428.system.js +0 -1
  361. package/dist/ripple/p-30b17818.system.entry.js +0 -1
  362. package/dist/ripple/p-3deccefa.system.js +0 -1
  363. package/dist/ripple/p-4de51706.js +0 -2
  364. package/dist/ripple/p-8133ee44.system.entry.js +0 -1
  365. package/dist/ripple/p-88406560.system.entry.js +0 -1
  366. package/dist/ripple/p-8f76a838.system.entry.js +0 -1
  367. package/dist/ripple/p-a99b05de.system.entry.js +0 -1
  368. package/dist/ripple/p-b56e0d1e.entry.js +0 -1
  369. package/dist/ripple/p-c18b398c.system.js +0 -1
  370. package/dist/ripple/p-cb674aad.js +0 -1
  371. package/dist/ripple/p-e66bbd87.system.entry.js +0 -1
  372. package/dist/types/components/wm-tag-input/wm-tag-input.d.ts +0 -117
  373. package/dist/types/components/wm-tag-input/wm-tag-option/wm-tag-option.d.ts +0 -18
  374. /package/dist/esm-es5/{interfaces-9b75fb61.js → interfaces-89cad2fc.js} +0 -0
  375. /package/dist/ripple/{p-196eb2f3.js → p-c0c111fd.js} +0 -0
@@ -2,464 +2,464 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- const index = require('./index-f8ef86de.js');
6
- const functions = require('./functions-4208c444.js');
7
- const chartFunctions = require('./chartFunctions-cecf8134.js');
8
- const intl = require('./intl-3fafc6d1.js');
5
+ const index = require('./index-fae02cd7.js');
6
+ const functions = require('./functions-91da05e9.js');
7
+ const chartFunctions = require('./chartFunctions-2c3e010e.js');
8
+ const intl = require('./intl-fa3bb4ae.js');
9
9
 
10
10
  const wmLineChartCss = ":host{--wmcolor-linechart-currentposition:var(--wmcolor-lavender);--wmcolor-linechart-delta-text-negative:var(--wmcolor-text-negative);--wmcolor-linechart-delta-text-positive:var(--wmcolor-text-positive);--wmcolor-linechart-gridline:var(--wmcolor-chart-gridline);--wmcolor-linechart-highlight-background:var(--wmcolor-background-highlight);--wmcolor-linechart-popover-background:var(--wmcolor-chart-popover-background);display:block;height:500px;width:100%;font-size:14px;overflow-y:visible;overflow-x:auto}:host .component-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:562px;width:100%;height:100%;outline:none}:host .icon{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;position:relative;color:var(--iconColor);-webkit-transform:var(--translation, unset);transform:var(--translation, unset)}:host .icon:before{display:inline-block;font:normal normal normal 24px/1 \"Material Design Icons\";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:var(--icon);padding:0 3px;z-index:1}:host .icon:after{color:white;position:absolute;left:3px;-webkit-transform:scale(180%);transform:scale(180%);display:inline-block;font:normal normal normal 24px/1 \"Material Design Icons\";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:var(--icon);z-index:0}:host .legend{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:8px 16px;margin-top:4px;margin-bottom:16px}:host .legend .legend-label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;cursor:default;font-weight:600}:host .legend .legend-label.faded{opacity:0.3}:host .legend .legend-label .icon{margin-right:4px}:host .legend .visibility-toggle{margin-left:4px}:host .chart-wrapper{position:relative;-ms-flex-positive:1;flex-grow:1;display:grid;grid-template-columns:auto auto 1fr;grid-template-rows:1fr auto auto;margin-right:16px}:host .chart-label{font-size:14px;font-weight:600}:host .chart-label.--y-axis{height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;width:var(--labelWidth);align-self:center;margin-right:16px;grid-area:1/1/2/2;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}:host .chart-label.--x-axis{margin-top:16px;text-align:center;grid-area:3/3/4/4}:host .y-intervals{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:justify;justify-content:space-between;grid-area:1/2/2/3;margin-right:4px}:host .y-intervals .y-interval{text-align:right}:host .x-intervals{display:grid;grid-template-columns:var(--columns);grid-area:2/3/3/4;line-height:1;margin-top:4px}:host .x-intervals .x-interval{text-align:center}:host .x-intervals .x-interval:first-child{text-align:left}:host .x-intervals .x-interval:last-child{text-align:right}:host .x-intervals .x-interval.hidden{visibility:hidden}:host .plot-area{position:relative;grid-area:1/3/2/4;background-image:linear-gradient(90deg, var(--wmcolor-linechart-gridline) 1px, transparent 1px);border-bottom:1px solid var(--wmcolor-linechart-gridline);background-size:var(--backgroundSize)}:host .plot-area.right-border{border-right:1px solid var(--wmcolor-linechart-gridline)}:host .line{position:absolute;width:100%;height:100%}:host .line .icon{position:absolute;-webkit-transform:var(--translation);transform:var(--translation);left:var(--xPosition);top:var(--yPosition);z-index:1}:host .line .icon:focus{z-index:2;outline:none}:host .line .icon:focus:before{-webkit-box-shadow:0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px var(--wmcolor-interactive-focus);-moz-box-shadow:0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px var(--wmcolor-interactive-focus);box-shadow:0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px var(--wmcolor-interactive-focus);border-radius:3px}:host .line .icon:focus:before::-moz-focus-inner{border:0}:host .line .line-svg{height:100%;width:100%}:host .line.faded{opacity:0.3}:host .line.focused{z-index:1}:host .line.hidden{visibility:hidden}:host .hover-area-wrapper{position:absolute;width:100%;height:100%;top:0;left:0;display:grid;grid-template-rows:1fr;grid-template-columns:var(--columns)}:host .hover-indicator{-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;height:100%;width:2px;border:1px solid var(--wmcolor-linechart-currentposition);-webkit-transform:translateX(-50%);transform:translateX(-50%);left:var(--xPosition);grid-column:3/4;grid-row:1/2;pointer-events:none}:host .popover{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:400px;background-color:var(--wmcolor-linechart-popover-background);position:absolute;top:var(--topPosition, 0);left:var(--leftPosition, unset);right:var(--rightPosition, unset);padding:16px;border-radius:5px;-webkit-box-shadow:0px 2px 10px 0px rgba(0, 0, 0, 0.09);box-shadow:0px 2px 10px 0px rgba(0, 0, 0, 0.09);-webkit-transform:translateY(-50%);transform:translateY(-50%);line-height:1;z-index:3;grid-column:3/4;grid-row:1/2;pointer-events:none;-webkit-box-sizing:border-box;box-sizing:border-box}:host .popover .title{font-size:16px;font-weight:600}:host .popover .comparison-title{font-style:italic;margin-top:4px}:host .popover .unit{font-size:12px;font-weight:600}:host .popover .unit.--x{margin-left:4px}:host .popover .popover-table{margin-top:16px}:host .popover .popover-table .popover-row{line-height:1}:host .popover .popover-table .popover-row:not(:last-child) td{padding-bottom:8px}:host .popover .popover-table .popover-row .row-label{font-weight:600;padding-right:16px;overflow-wrap:anywhere}:host .popover .popover-table .popover-row .row-label .icon{margin-right:4px}:host .popover .popover-table .popover-row .row-value,:host .popover .popover-table .popover-row .delta{text-align:right;white-space:nowrap}:host .popover .popover-table .popover-row .delta{padding-left:12px;font-weight:600}:host .popover .popover-table .popover-row .delta.--positive{color:var(--wmcolor-linechart-delta-text-positive)}:host .popover .popover-table .popover-row .delta.--negative{color:var(--wmcolor-linechart-delta-text-negative)}:host .highlight{position:absolute;height:100%;background-color:color-mix(in srgb, var(--wmcolor-linechart-highlight-background) 60%, transparent);left:var(--startPercentage);right:var(--endPercentage)}:host .sr-only{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;border:0 !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;white-space:nowrap !important;margin:-1px !important}";
11
11
 
12
12
  const LineChart = class {
13
- constructor(hostRef) {
14
- index.registerInstance(this, hostRef);
15
- this.minTickWidth = 120;
16
- this.popoverData = [];
17
- this.focusedDataPoint = [0, 0];
18
- this.dataPointMatrix = [];
19
- this.xIntervals = [];
20
- this.displayedXIntervals = [];
21
- this.yIntervals = [];
22
- this.lineStyles = [
23
- { color: "#8b86ca", icon: "f536" },
24
- { color: "#2e1b46", icon: "f12f" },
25
- { color: "#0089e4", icon: "f763" },
26
- { color: "#088000", icon: "f4ce" },
27
- { color: "#ea8500", icon: "f70a" },
28
- { color: "#d54f41", icon: "f536" },
29
- { color: "#146ca9", icon: "f6ff" }, // blue, upside down triangle
30
- ];
31
- this.debouncedResize = functions.debounce(async () => {
32
- this.displayedXIntervals = this.determineDisplayedXIntervals();
33
- }, 100);
34
- this.label = undefined;
35
- this.description = "";
36
- this.xAxisLabel = undefined;
37
- this.yAxisLabel = undefined;
38
- this.lineData = undefined;
39
- this.units = "null,null";
40
- this.labelWidth = "120px";
41
- this.highlightQualifier = "highlighted";
42
- this.highlightStart = undefined;
43
- this.highlightEnd = undefined;
44
- this.visibilityToggles = false;
45
- this.showDeltas = false;
46
- this.yRange = undefined;
47
- this.parsedLineData = {};
48
- this.displayedPopover = -1;
49
- this.focusedLine = -1;
50
- this.hiddenLines = [];
51
- this.isTabbing = false;
52
- this.intervalSkip = 0;
53
- this.announcement = "";
54
- }
55
- parseData() {
56
- this.parsedLineData = JSON.parse(this.lineData);
57
- this.yIntervals = this.calcYIntervals().reverse(); // needed before building dataPointMatrix
58
- this.xIntervals = Object.keys(Object.values(this.parsedLineData)[0]);
59
- this.displayedXIntervals = this.determineDisplayedXIntervals();
60
- this.dataPointMatrix = Object.entries(this.parsedLineData).map((entry) => this.buildLineDataPointDetails(entry[0], entry[1]));
61
- this.popoverData = functions.transposeMatrix(this.dataPointMatrix);
62
- }
63
- handleIntervalSkip() {
64
- // if intervalSkip ever changes, dataPointMatrix must be regenerated to account for chart spacers
65
- this.parseData();
66
- }
67
- get hasPartialInterval() {
68
- // if chart width is too small, an odd # of intervals like 1,2,3,4,5,6,7 can be shortened to 1,3,5,7 or 1,4,7
69
- // but an even # like 1,2,3,4,5,6,7,8 will be shortened to 1,3,5,7 (can't show first and last interval)
70
- // in these cases, show a partial interval must be shown in order to still provide space to plot the 8th data point
71
- // e.g intervals will be 1-3, 3-5, 5-7, 7-8
72
- return this.intervalSkip > 0 && this.xIntervals.length % 2 === 0;
73
- }
74
- get parsedUnits() {
75
- return functions.csvToArray(this.units).map((unit) => (unit === "null" ? null : unit));
76
- }
77
- get visibilityToggleEls() {
78
- return this.legendEl.querySelectorAll("wm-button");
79
- }
80
- get lineEls() {
81
- return this.plotAreaEl.querySelectorAll(".line");
82
- }
83
- get firstVisibleLineIdx() {
84
- let firstVisibleLineIdx = 0;
85
- while (this.hiddenLines.includes(firstVisibleLineIdx)) {
86
- firstVisibleLineIdx++;
87
- }
88
- return firstVisibleLineIdx < this.dataPointMatrix.length ? firstVisibleLineIdx : -1;
89
- }
90
- toggleTabbingOn() {
91
- this.isTabbing = true;
92
- }
93
- toggleTabbingOff() {
94
- this.isTabbing = false;
95
- }
96
- componentWillLoad() {
97
- this.parseData();
98
- }
99
- componentDidLoad() {
100
- const resizeObserver = new ResizeObserver(() => this.debouncedResize());
101
- resizeObserver.observe(this.el);
102
- }
103
- handleVisibilityToggleKeydown(ev, toggleIdx) {
104
- switch (ev.key) {
105
- case "Tab":
106
- if (!ev.shiftKey && this.firstVisibleLineIdx !== -1) {
107
- ev.preventDefault();
108
- this.announce(this.lineFocusMessage(this.firstVisibleLineIdx));
109
- this.focusDataPoint(this.firstVisibleLineIdx, 0);
110
- }
111
- break;
112
- case "ArrowUp":
113
- case "ArrowLeft":
114
- ev.preventDefault();
115
- const prevToggleIdx = functions.wrapAround(toggleIdx, -1, this.dataPointMatrix.length - 1);
116
- this.visibilityToggleEls[prevToggleIdx].focus();
117
- break;
118
- case "ArrowDown":
119
- case "ArrowRight":
120
- ev.preventDefault();
121
- const nextToggleIdx = functions.wrapAround(toggleIdx, 1, this.dataPointMatrix.length - 1);
122
- this.visibilityToggleEls[nextToggleIdx].focus();
123
- break;
124
- }
125
- }
126
- handleDataPointKeydown(ev) {
127
- const [lineIdx, pointIdx] = this.focusedDataPoint;
128
- const lineLength = this.lineEls[lineIdx].querySelectorAll(".point").length;
129
- const numLines = this.dataPointMatrix.length;
130
- switch (ev.key) {
131
- case "Tab":
132
- if (ev.shiftKey && this.visibilityToggles) {
133
- ev.preventDefault();
134
- this.visibilityToggleEls[0].focus();
135
- }
136
- break;
137
- case "ArrowUp":
138
- ev.preventDefault();
139
- let prevLineIdx = lineIdx;
140
- do
141
- prevLineIdx = functions.wrapAround(prevLineIdx, -1, numLines - 1);
142
- while (this.hiddenLines.includes(prevLineIdx));
143
- this.announce(this.lineFocusMessage(prevLineIdx));
144
- this.focusDataPoint(prevLineIdx, pointIdx);
145
- break;
146
- case "ArrowDown":
147
- ev.preventDefault();
148
- let nextLineIdx = lineIdx;
149
- do
150
- nextLineIdx = functions.wrapAround(nextLineIdx, 1, numLines - 1);
151
- while (this.hiddenLines.includes(nextLineIdx));
152
- this.announce(this.lineFocusMessage(nextLineIdx));
153
- this.focusDataPoint(nextLineIdx, pointIdx);
154
- break;
155
- case "ArrowLeft":
156
- ev.preventDefault();
157
- const prevPointIdx = functions.wrapAround(pointIdx, -1, lineLength - 1);
158
- this.focusDataPoint(lineIdx, prevPointIdx);
159
- break;
160
- case "ArrowRight":
161
- ev.preventDefault();
162
- const nextPointIdx = functions.wrapAround(pointIdx, 1, lineLength - 1);
163
- this.focusDataPoint(lineIdx, nextPointIdx);
164
- break;
165
- }
166
- }
167
- announce(message) {
168
- // \u00A0 is a non-breaking space character, which causes the message to be read as a new one
169
- if (this.liveRegionEl.textContent === message) {
170
- message += "\u00A0";
171
- }
172
- this.announcement = message;
173
- }
174
- lineFocusMessage(lineIdx) {
175
- const label = this.dataPointMatrix[lineIdx][0].lineLabel;
176
- const numDataPoints = this.dataPointMatrix[lineIdx].filter((datapoint) => datapoint.yValue !== null).length;
177
- return `${label}, line ${lineIdx + 1} of ${this.dataPointMatrix.length} with ${numDataPoints} data points`;
178
- }
179
- focusDataPoint(lineIdx, pointIdx) {
180
- const lineEl = this.lineEls[lineIdx];
181
- const pointEl = lineEl.querySelectorAll(".point")[pointIdx];
182
- const allPoints = this.plotAreaEl.querySelectorAll(".point");
183
- allPoints.forEach((point) => (point.tabIndex = -1));
184
- pointEl.tabIndex = 0;
185
- pointEl.focus();
186
- this.focusedDataPoint = [lineIdx, pointIdx];
187
- }
188
- focusDataPointByEl(pointEl) {
189
- const lineIdx = parseInt(pointEl.dataset.lineidx);
190
- const pointIdx = Array.from(pointEl.parentElement.querySelectorAll(".point")).indexOf(pointEl);
191
- const allPoints = this.plotAreaEl.querySelectorAll(".point");
192
- allPoints.forEach((point) => (point.tabIndex = -1));
193
- pointEl.tabIndex = 0;
194
- pointEl.focus();
195
- this.focusedDataPoint = [lineIdx, pointIdx];
196
- }
197
- calcYIntervals() {
198
- let yIntervals = [];
199
- if (this.yRange) {
200
- yIntervals = functions.csvToArray(this.yRange).map((val) => parseInt(val));
201
- }
202
- else {
203
- // gather all yValues
204
- let allYValues = [];
205
- const lines = Object.values(this.parsedLineData).flat();
206
- lines.forEach((line) => allYValues.push(...Object.values(line)));
207
- const filteredYValues = allYValues.filter((val) => val !== null);
208
- // get max and min yValues in data
209
- let minYValue = Math.min(...filteredYValues);
210
- const maxYValue = Math.max(...filteredYValues);
211
- // calculate neat yInterval
212
- let interval = chartFunctions.getInterval(maxYValue - minYValue, 4);
213
- // find new min below smallest yValue that divides cleanly by interval
214
- let counter = interval;
215
- while (minYValue % interval !== 0 && counter > 0) {
216
- minYValue--;
217
- counter--;
218
- }
219
- // calculate new interval using new min
220
- interval = chartFunctions.getInterval(maxYValue - minYValue, 4);
221
- let current = minYValue;
222
- // determine top interval, no more than one tick above max yValue
223
- while (current <= maxYValue + interval) {
224
- yIntervals.push(current);
225
- current += interval;
226
- }
227
- }
228
- return yIntervals;
229
- }
230
- determineDisplayedXIntervals() {
231
- // if component has display: none, plotAreaEl is truthy, but it's clientWidth is 0. This caused a crash when component was hidden in a tab
232
- const maxTicks = this.plotAreaEl && this.plotAreaEl.clientWidth > 0
233
- ? Math.round(this.plotAreaEl.clientWidth / this.minTickWidth)
234
- : this.xIntervals.length;
235
- const { skipInterval, skippedList } = functions.getSmallestSkipInterval(this.xIntervals, maxTicks);
236
- this.intervalSkip = skipInterval;
237
- return skippedList;
238
- }
239
- buildLineDataPointDetails(lineLabel, line) {
240
- let dataPointDetailsList = [];
241
- const lineDataPoints = Object.entries(line);
242
- let isHighlighted;
243
- lineDataPoints.forEach((entry, pointIdx) => {
244
- const [xValue, yValue] = entry;
245
- let xPositionPercent = (100 / (lineDataPoints.length - 1)) * pointIdx;
246
- const yPositionPercent = yValue === null
247
- ? null
248
- : 100 - functions.calcPercentageInRange(yValue, this.yIntervals[this.yIntervals.length - 1], this.yIntervals[0]);
249
- // add space between first points and y-axis
250
- if (pointIdx === 0) {
251
- xPositionPercent +=
252
- this.plotAreaEl && this.plotAreaEl.clientWidth > 0 ? (8 / this.plotAreaEl.clientWidth) * 100 : 1;
253
- }
254
- if (xValue === this.highlightStart && !isHighlighted) {
255
- isHighlighted = true;
256
- }
257
- dataPointDetailsList.push({
258
- lineLabel: lineLabel,
259
- xValue: xValue,
260
- yValue: yValue,
261
- xPositionPercent: xPositionPercent,
262
- yPositionPercent: yPositionPercent,
263
- highlighted: isHighlighted,
264
- });
265
- // because highlight range is inclusive, disable after pushing details
266
- if (xValue === this.highlightEnd && isHighlighted) {
267
- isHighlighted = false;
268
- }
269
- });
270
- return dataPointDetailsList;
271
- }
272
- toggleLineVisibility(lineIdx) {
273
- if (this.hiddenLines.includes(lineIdx)) {
274
- this.hiddenLines = this.hiddenLines.filter((num) => num !== lineIdx);
275
- }
276
- else {
277
- this.hiddenLines.push(lineIdx);
278
- }
279
- index.forceUpdate(this.el);
280
- }
281
- resetDataPointFocus() {
282
- this.displayedPopover = -1;
283
- const allPoints = this.plotAreaEl.querySelectorAll(".point");
284
- allPoints.forEach((point) => (point.tabIndex = -1));
285
- if (this.firstVisibleLineIdx !== -1) {
286
- const lineEl = this.lineEls[this.firstVisibleLineIdx];
287
- const pointEl = lineEl.querySelectorAll(".point")[0];
288
- pointEl.tabIndex = 0;
289
- this.focusedDataPoint = [this.firstVisibleLineIdx, 0];
290
- }
291
- }
292
- calcDelta(dataPoint, prevDataPoint) {
293
- let delta;
294
- if (dataPoint.yValue === null || prevDataPoint.yValue === null) {
295
- // display "No data" when either of the datapoints is missing
296
- delta = intl.lineChartMessages.noData;
297
- }
298
- else if (dataPoint.yValue == prevDataPoint.yValue) {
299
- // display "0%" if datapoints are equal
300
- delta = "0%";
13
+ constructor(hostRef) {
14
+ index.registerInstance(this, hostRef);
15
+ this.minTickWidth = 120;
16
+ this.popoverData = [];
17
+ this.focusedDataPoint = [0, 0];
18
+ this.dataPointMatrix = [];
19
+ this.xIntervals = [];
20
+ this.displayedXIntervals = [];
21
+ this.yIntervals = [];
22
+ this.lineStyles = [
23
+ { color: "#8b86ca", icon: "f536" },
24
+ { color: "#2e1b46", icon: "f12f" },
25
+ { color: "#0089e4", icon: "f763" },
26
+ { color: "#088000", icon: "f4ce" },
27
+ { color: "#ea8500", icon: "f70a" },
28
+ { color: "#d54f41", icon: "f536" },
29
+ { color: "#146ca9", icon: "f6ff" }, // blue, upside down triangle
30
+ ];
31
+ this.debouncedResize = functions.debounce(async () => {
32
+ this.displayedXIntervals = this.determineDisplayedXIntervals();
33
+ }, 100);
34
+ this.label = undefined;
35
+ this.description = "";
36
+ this.xAxisLabel = undefined;
37
+ this.yAxisLabel = undefined;
38
+ this.lineData = undefined;
39
+ this.units = "null,null";
40
+ this.labelWidth = "120px";
41
+ this.highlightQualifier = "highlighted";
42
+ this.highlightStart = undefined;
43
+ this.highlightEnd = undefined;
44
+ this.visibilityToggles = false;
45
+ this.showDeltas = false;
46
+ this.yRange = undefined;
47
+ this.parsedLineData = {};
48
+ this.displayedPopover = -1;
49
+ this.focusedLine = -1;
50
+ this.hiddenLines = [];
51
+ this.isTabbing = false;
52
+ this.intervalSkip = 0;
53
+ this.announcement = "";
54
+ }
55
+ parseData() {
56
+ this.parsedLineData = JSON.parse(this.lineData);
57
+ this.yIntervals = this.calcYIntervals().reverse(); // needed before building dataPointMatrix
58
+ this.xIntervals = Object.keys(Object.values(this.parsedLineData)[0]);
59
+ this.displayedXIntervals = this.determineDisplayedXIntervals();
60
+ this.dataPointMatrix = Object.entries(this.parsedLineData).map((entry) => this.buildLineDataPointDetails(entry[0], entry[1]));
61
+ this.popoverData = functions.transposeMatrix(this.dataPointMatrix);
62
+ }
63
+ handleIntervalSkip() {
64
+ // if intervalSkip ever changes, dataPointMatrix must be regenerated to account for chart spacers
65
+ this.parseData();
66
+ }
67
+ get hasPartialInterval() {
68
+ // if chart width is too small, an odd # of intervals like 1,2,3,4,5,6,7 can be shortened to 1,3,5,7 or 1,4,7
69
+ // but an even # like 1,2,3,4,5,6,7,8 will be shortened to 1,3,5,7 (can't show first and last interval)
70
+ // in these cases, show a partial interval must be shown in order to still provide space to plot the 8th data point
71
+ // e.g intervals will be 1-3, 3-5, 5-7, 7-8
72
+ return this.intervalSkip > 0 && this.xIntervals.length % 2 === 0;
73
+ }
74
+ get parsedUnits() {
75
+ return functions.csvToArray(this.units).map((unit) => (unit === "null" ? null : unit));
76
+ }
77
+ get visibilityToggleEls() {
78
+ return this.legendEl.querySelectorAll("wm-button");
79
+ }
80
+ get lineEls() {
81
+ return this.plotAreaEl.querySelectorAll(".line");
82
+ }
83
+ get firstVisibleLineIdx() {
84
+ let firstVisibleLineIdx = 0;
85
+ while (this.hiddenLines.includes(firstVisibleLineIdx)) {
86
+ firstVisibleLineIdx++;
87
+ }
88
+ return firstVisibleLineIdx < this.dataPointMatrix.length ? firstVisibleLineIdx : -1;
89
+ }
90
+ toggleTabbingOn() {
91
+ this.isTabbing = true;
92
+ }
93
+ toggleTabbingOff() {
94
+ this.isTabbing = false;
95
+ }
96
+ componentWillLoad() {
97
+ this.parseData();
98
+ }
99
+ componentDidLoad() {
100
+ const resizeObserver = new ResizeObserver(() => this.debouncedResize());
101
+ resizeObserver.observe(this.el);
102
+ }
103
+ handleVisibilityToggleKeydown(ev, toggleIdx) {
104
+ switch (ev.key) {
105
+ case "Tab":
106
+ if (!ev.shiftKey && this.firstVisibleLineIdx !== -1) {
107
+ ev.preventDefault();
108
+ this.announce(this.lineFocusMessage(this.firstVisibleLineIdx));
109
+ this.focusDataPoint(this.firstVisibleLineIdx, 0);
301
110
  }
302
- else if (prevDataPoint.yValue == 0) {
303
- // display "-" for % increase if prev data point is 0, as the technical number would be infinity
304
- delta = "-";
111
+ break;
112
+ case "ArrowUp":
113
+ case "ArrowLeft":
114
+ ev.preventDefault();
115
+ const prevToggleIdx = functions.wrapAround(toggleIdx, -1, this.dataPointMatrix.length - 1);
116
+ this.visibilityToggleEls[prevToggleIdx].focus();
117
+ break;
118
+ case "ArrowDown":
119
+ case "ArrowRight":
120
+ ev.preventDefault();
121
+ const nextToggleIdx = functions.wrapAround(toggleIdx, 1, this.dataPointMatrix.length - 1);
122
+ this.visibilityToggleEls[nextToggleIdx].focus();
123
+ break;
124
+ }
125
+ }
126
+ handleDataPointKeydown(ev) {
127
+ const [lineIdx, pointIdx] = this.focusedDataPoint;
128
+ const lineLength = this.lineEls[lineIdx].querySelectorAll(".point").length;
129
+ const numLines = this.dataPointMatrix.length;
130
+ switch (ev.key) {
131
+ case "Tab":
132
+ if (ev.shiftKey && this.visibilityToggles) {
133
+ ev.preventDefault();
134
+ this.visibilityToggleEls[0].focus();
305
135
  }
306
- else {
307
- const changePercent = ((dataPoint.yValue - prevDataPoint.yValue) / prevDataPoint.yValue) * 100;
308
- const roundedPercent = Math.round(changePercent * 100) / 100;
309
- delta = `${roundedPercent > 0 ? "+" : ""}${roundedPercent}%`;
310
- }
311
- return delta;
312
- }
313
- renderLegend() {
314
- const lineLabels = Object.keys(this.parsedLineData);
315
- return (index.h("div", { ref: (el) => (this.legendEl = el), class: "legend" }, lineLabels.map((lineLabel, lineIdx) => {
316
- const isHidden = this.hiddenLines.includes(lineIdx);
317
- const isFaded = this.focusedLine !== -1 && this.focusedLine !== lineIdx;
318
- return (index.h("div", { id: `legend-label-${lineIdx}`, class: `legend-label ${isFaded ? "faded" : ""}`, onMouseEnter: () => (this.focusedLine = isHidden ? -1 : lineIdx), onMouseLeave: () => (this.focusedLine = -1) }, this.renderIcon(lineIdx), lineLabel, this.visibilityToggles && this.renderVisibilityToggle(lineLabel, lineIdx, isHidden)));
319
- })));
320
- }
321
- renderVisibilityToggle(lineLabel, lineIdx, isHidden) {
322
- return (index.h("wm-button", { id: `visibility-button-${lineIdx}`, class: "visibility-toggle", "label-for-identical-buttons": `${lineIdx === 0 ? `Toggle line visibility list with ${this.dataPointMatrix.length} items` : ""} ${isHidden ? intl.globalMessages.show : intl.globalMessages.hide} ${lineLabel} toggle ${isHidden ? "pressed" : ""}`, "button-type": "navigational", tooltip: isHidden ? intl.globalMessages.show : intl.globalMessages.hide, tooltipPosition: "bottom", icon: isHidden ? "f209" : "f208", onClick: () => this.toggleLineVisibility(lineIdx), onKeyDown: (ev) => this.handleVisibilityToggleKeydown(ev, lineIdx), onFocus: () => (this.displayedPopover = -1) }));
323
- }
324
- renderIcon(lineIdx) {
136
+ break;
137
+ case "ArrowUp":
138
+ ev.preventDefault();
139
+ let prevLineIdx = lineIdx;
140
+ do
141
+ prevLineIdx = functions.wrapAround(prevLineIdx, -1, numLines - 1);
142
+ while (this.hiddenLines.includes(prevLineIdx));
143
+ this.announce(this.lineFocusMessage(prevLineIdx));
144
+ this.focusDataPoint(prevLineIdx, pointIdx);
145
+ break;
146
+ case "ArrowDown":
147
+ ev.preventDefault();
148
+ let nextLineIdx = lineIdx;
149
+ do
150
+ nextLineIdx = functions.wrapAround(nextLineIdx, 1, numLines - 1);
151
+ while (this.hiddenLines.includes(nextLineIdx));
152
+ this.announce(this.lineFocusMessage(nextLineIdx));
153
+ this.focusDataPoint(nextLineIdx, pointIdx);
154
+ break;
155
+ case "ArrowLeft":
156
+ ev.preventDefault();
157
+ const prevPointIdx = functions.wrapAround(pointIdx, -1, lineLength - 1);
158
+ this.focusDataPoint(lineIdx, prevPointIdx);
159
+ break;
160
+ case "ArrowRight":
161
+ ev.preventDefault();
162
+ const nextPointIdx = functions.wrapAround(pointIdx, 1, lineLength - 1);
163
+ this.focusDataPoint(lineIdx, nextPointIdx);
164
+ break;
165
+ }
166
+ }
167
+ announce(message) {
168
+ // \u00A0 is a non-breaking space character, which causes the message to be read as a new one
169
+ if (this.liveRegionEl.textContent === message) {
170
+ message += "\u00A0";
171
+ }
172
+ this.announcement = message;
173
+ }
174
+ lineFocusMessage(lineIdx) {
175
+ const label = this.dataPointMatrix[lineIdx][0].lineLabel;
176
+ const numDataPoints = this.dataPointMatrix[lineIdx].filter((datapoint) => datapoint.yValue !== null).length;
177
+ return `${label}, line ${lineIdx + 1} of ${this.dataPointMatrix.length} with ${numDataPoints} data points`;
178
+ }
179
+ focusDataPoint(lineIdx, pointIdx) {
180
+ const lineEl = this.lineEls[lineIdx];
181
+ const pointEl = lineEl.querySelectorAll(".point")[pointIdx];
182
+ const allPoints = this.plotAreaEl.querySelectorAll(".point");
183
+ allPoints.forEach((point) => (point.tabIndex = -1));
184
+ pointEl.tabIndex = 0;
185
+ pointEl.focus();
186
+ this.focusedDataPoint = [lineIdx, pointIdx];
187
+ }
188
+ focusDataPointByEl(pointEl) {
189
+ const lineIdx = parseInt(pointEl.dataset.lineidx);
190
+ const pointIdx = Array.from(pointEl.parentElement.querySelectorAll(".point")).indexOf(pointEl);
191
+ const allPoints = this.plotAreaEl.querySelectorAll(".point");
192
+ allPoints.forEach((point) => (point.tabIndex = -1));
193
+ pointEl.tabIndex = 0;
194
+ pointEl.focus();
195
+ this.focusedDataPoint = [lineIdx, pointIdx];
196
+ }
197
+ calcYIntervals() {
198
+ let yIntervals = [];
199
+ if (this.yRange) {
200
+ yIntervals = functions.csvToArray(this.yRange).map((val) => parseInt(val));
201
+ }
202
+ else {
203
+ // gather all yValues
204
+ let allYValues = [];
205
+ const lines = Object.values(this.parsedLineData).flat();
206
+ lines.forEach((line) => allYValues.push(...Object.values(line)));
207
+ const filteredYValues = allYValues.filter((val) => val !== null);
208
+ // get max and min yValues in data
209
+ let minYValue = Math.min(...filteredYValues);
210
+ const maxYValue = Math.max(...filteredYValues);
211
+ // calculate neat yInterval
212
+ let interval = chartFunctions.getInterval(maxYValue - minYValue, 4);
213
+ // find new min below smallest yValue that divides cleanly by interval
214
+ let counter = interval;
215
+ while (minYValue % interval !== 0 && counter > 0) {
216
+ minYValue--;
217
+ counter--;
218
+ }
219
+ // calculate new interval using new min
220
+ interval = chartFunctions.getInterval(maxYValue - minYValue, 4);
221
+ let current = minYValue;
222
+ // determine top interval, no more than one tick above max yValue
223
+ while (current <= maxYValue + interval) {
224
+ yIntervals.push(current);
225
+ current += interval;
226
+ }
227
+ }
228
+ return yIntervals;
229
+ }
230
+ determineDisplayedXIntervals() {
231
+ // if component has display: none, plotAreaEl is truthy, but it's clientWidth is 0. This caused a crash when component was hidden in a tab
232
+ const maxTicks = this.plotAreaEl && this.plotAreaEl.clientWidth > 0
233
+ ? Math.round(this.plotAreaEl.clientWidth / this.minTickWidth)
234
+ : this.xIntervals.length;
235
+ const { skipInterval, skippedList } = functions.getSmallestSkipInterval(this.xIntervals, maxTicks);
236
+ this.intervalSkip = skipInterval;
237
+ return skippedList;
238
+ }
239
+ buildLineDataPointDetails(lineLabel, line) {
240
+ let dataPointDetailsList = [];
241
+ const lineDataPoints = Object.entries(line);
242
+ let isHighlighted;
243
+ lineDataPoints.forEach((entry, pointIdx) => {
244
+ const [xValue, yValue] = entry;
245
+ let xPositionPercent = (100 / (lineDataPoints.length - 1)) * pointIdx;
246
+ const yPositionPercent = yValue === null
247
+ ? null
248
+ : 100 - functions.calcPercentageInRange(yValue, this.yIntervals[this.yIntervals.length - 1], this.yIntervals[0]);
249
+ // add space between first points and y-axis
250
+ if (pointIdx === 0) {
251
+ xPositionPercent +=
252
+ this.plotAreaEl && this.plotAreaEl.clientWidth > 0 ? (8 / this.plotAreaEl.clientWidth) * 100 : 1;
253
+ }
254
+ if (xValue === this.highlightStart && !isHighlighted) {
255
+ isHighlighted = true;
256
+ }
257
+ dataPointDetailsList.push({
258
+ lineLabel: lineLabel,
259
+ xValue: xValue,
260
+ yValue: yValue,
261
+ xPositionPercent: xPositionPercent,
262
+ yPositionPercent: yPositionPercent,
263
+ highlighted: isHighlighted,
264
+ });
265
+ // because highlight range is inclusive, disable after pushing details
266
+ if (xValue === this.highlightEnd && isHighlighted) {
267
+ isHighlighted = false;
268
+ }
269
+ });
270
+ return dataPointDetailsList;
271
+ }
272
+ toggleLineVisibility(lineIdx) {
273
+ if (this.hiddenLines.includes(lineIdx)) {
274
+ this.hiddenLines = this.hiddenLines.filter((num) => num !== lineIdx);
275
+ }
276
+ else {
277
+ this.hiddenLines.push(lineIdx);
278
+ }
279
+ index.forceUpdate(this.el);
280
+ }
281
+ resetDataPointFocus() {
282
+ this.displayedPopover = -1;
283
+ const allPoints = this.plotAreaEl.querySelectorAll(".point");
284
+ allPoints.forEach((point) => (point.tabIndex = -1));
285
+ if (this.firstVisibleLineIdx !== -1) {
286
+ const lineEl = this.lineEls[this.firstVisibleLineIdx];
287
+ const pointEl = lineEl.querySelectorAll(".point")[0];
288
+ pointEl.tabIndex = 0;
289
+ this.focusedDataPoint = [this.firstVisibleLineIdx, 0];
290
+ }
291
+ }
292
+ calcDelta(dataPoint, prevDataPoint) {
293
+ let delta;
294
+ if (dataPoint.yValue === null || prevDataPoint.yValue === null) {
295
+ // display "No data" when either of the datapoints is missing
296
+ delta = intl.lineChartMessages.noData;
297
+ }
298
+ else if (dataPoint.yValue == prevDataPoint.yValue) {
299
+ // display "0%" if datapoints are equal
300
+ delta = "0%";
301
+ }
302
+ else if (prevDataPoint.yValue == 0) {
303
+ // display "-" for % increase if prev data point is 0, as the technical number would be infinity
304
+ delta = "-";
305
+ }
306
+ else {
307
+ const changePercent = ((dataPoint.yValue - prevDataPoint.yValue) / prevDataPoint.yValue) * 100;
308
+ const roundedPercent = Math.round(changePercent * 100) / 100;
309
+ delta = `${roundedPercent > 0 ? "+" : ""}${roundedPercent}%`;
310
+ }
311
+ return delta;
312
+ }
313
+ renderLegend() {
314
+ const lineLabels = Object.keys(this.parsedLineData);
315
+ return (index.h("div", { ref: (el) => (this.legendEl = el), class: "legend" }, lineLabels.map((lineLabel, lineIdx) => {
316
+ const isHidden = this.hiddenLines.includes(lineIdx);
317
+ const isFaded = this.focusedLine !== -1 && this.focusedLine !== lineIdx;
318
+ return (index.h("div", { id: `legend-label-${lineIdx}`, class: `legend-label ${isFaded ? "faded" : ""}`, onMouseEnter: () => (this.focusedLine = isHidden ? -1 : lineIdx), onMouseLeave: () => (this.focusedLine = -1) }, this.renderIcon(lineIdx), lineLabel, this.visibilityToggles && this.renderVisibilityToggle(lineLabel, lineIdx, isHidden)));
319
+ })));
320
+ }
321
+ renderVisibilityToggle(lineLabel, lineIdx, isHidden) {
322
+ return (index.h("wm-button", { id: `visibility-button-${lineIdx}`, class: "visibility-toggle", "label-for-identical-buttons": `${lineIdx === 0 ? `Toggle line visibility list with ${this.dataPointMatrix.length} items` : ""} ${isHidden ? intl.globalMessages.show : intl.globalMessages.hide} ${lineLabel} toggle ${isHidden ? "pressed" : ""}`, "button-type": "navigational", tooltip: isHidden ? intl.globalMessages.show : intl.globalMessages.hide, tooltipPosition: "bottom", icon: isHidden ? "f209" : "f208", onClick: () => this.toggleLineVisibility(lineIdx), onKeyDown: (ev) => this.handleVisibilityToggleKeydown(ev, lineIdx), onFocus: () => (this.displayedPopover = -1) }));
323
+ }
324
+ renderIcon(lineIdx) {
325
+ const { color, icon } = this.lineStyles[lineIdx];
326
+ const iconStyle = {
327
+ "--iconColor": color,
328
+ "--icon": `"\\${icon}"`,
329
+ "--translation": lineIdx === 5 ? "rotate(180deg)" : "unset",
330
+ };
331
+ return index.h("span", { class: "icon", style: iconStyle });
332
+ }
333
+ renderXIntervals() {
334
+ const gridStyle = {
335
+ "--columns": `.5fr repeat(${this.xIntervals.length - 2}, 1fr) .5fr`,
336
+ };
337
+ return (index.h("div", { class: "x-intervals", style: gridStyle }, this.xIntervals.map((interval) => (index.h("span", { class: `x-interval ${this.displayedXIntervals.includes(interval) ? "" : "hidden"}` }, interval)))));
338
+ }
339
+ renderYIntervals() {
340
+ return (index.h("div", { ref: (el) => (this.yIntervalsEl = el), class: "y-intervals" }, this.yIntervals.map((yInterval) => (index.h("span", { class: "y-interval" }, chartFunctions.abbrNumber(yInterval))))));
341
+ }
342
+ renderData() {
343
+ return this.dataPointMatrix.map((_, lineIdx) => {
344
+ let focusState = this.focusedLine === lineIdx ? "focused" : "faded";
345
+ const isHidden = this.hiddenLines.includes(lineIdx);
346
+ return (index.h("div", { class: `line ${this.focusedLine !== -1 ? focusState : ""} ${isHidden ? "hidden" : ""}` }, this.renderLines(lineIdx), this.renderPoints(lineIdx)));
347
+ });
348
+ }
349
+ renderPoints(lineIdx) {
350
+ const lineDataPoints = this.dataPointMatrix[lineIdx];
351
+ return (index.h("div", { class: "line-icons" }, lineDataPoints.map((dataPoint, pointIdx) => {
352
+ const { lineLabel, xValue, yValue, xPositionPercent, yPositionPercent, highlighted } = dataPoint;
353
+ if (yValue !== null) {
325
354
  const { color, icon } = this.lineStyles[lineIdx];
355
+ const firstPointTabIndex = lineIdx === 0 && pointIdx === 0 ? 0 : undefined;
326
356
  const iconStyle = {
327
- "--iconColor": color,
328
- "--icon": `"\\${icon}"`,
329
- "--translation": lineIdx === 5 ? "rotate(180deg)" : "unset",
330
- };
331
- return index.h("span", { class: "icon", style: iconStyle });
332
- }
333
- renderXIntervals() {
334
- const gridStyle = {
335
- "--columns": `.5fr repeat(${this.xIntervals.length - 2}, 1fr) .5fr`,
357
+ "--icon": `"\\${icon}"`,
358
+ "--iconColor": color,
359
+ "--xPosition": xPositionPercent + "%",
360
+ "--yPosition": yPositionPercent + "%",
361
+ "--translation": lineIdx === 5 ? "translate(-50%, -50%) rotate(180deg)" : "translate(-50%, -50%)",
336
362
  };
337
- return (index.h("div", { class: "x-intervals", style: gridStyle }, this.xIntervals.map((interval) => (index.h("span", { class: `x-interval ${this.displayedXIntervals.includes(interval) ? "" : "hidden"}` }, interval)))));
338
- }
339
- renderYIntervals() {
340
- return (index.h("div", { ref: (el) => (this.yIntervalsEl = el), class: "y-intervals" }, this.yIntervals.map((yInterval) => (index.h("span", { class: "y-interval" }, chartFunctions.abbrNumber(yInterval))))));
341
- }
342
- renderData() {
343
- return this.dataPointMatrix.map((_, lineIdx) => {
344
- let focusState = this.focusedLine === lineIdx ? "focused" : "faded";
345
- const isHidden = this.hiddenLines.includes(lineIdx);
346
- return (index.h("div", { class: `line ${this.focusedLine !== -1 ? focusState : ""} ${isHidden ? "hidden" : ""}` }, this.renderLines(lineIdx), this.renderPoints(lineIdx)));
347
- });
348
- }
349
- renderPoints(lineIdx) {
350
- const lineDataPoints = this.dataPointMatrix[lineIdx];
351
- return (index.h("div", { class: "line-icons" }, lineDataPoints.map((dataPoint, pointIdx) => {
352
- const { lineLabel, xValue, yValue, xPositionPercent, yPositionPercent, highlighted } = dataPoint;
353
- if (yValue !== null) {
354
- const { color, icon } = this.lineStyles[lineIdx];
355
- const firstPointTabIndex = lineIdx === 0 && pointIdx === 0 ? 0 : undefined;
356
- const iconStyle = {
357
- "--icon": `"\\${icon}"`,
358
- "--iconColor": color,
359
- "--xPosition": xPositionPercent + "%",
360
- "--yPosition": yPositionPercent + "%",
361
- "--translation": lineIdx === 5 ? "translate(-50%, -50%) rotate(180deg)" : "translate(-50%, -50%)",
362
- };
363
- let ariaLabel = `${lineLabel} ${highlighted ? this.highlightQualifier : ""} ${this.xAxisLabel} ${xValue + (this.parsedUnits[0] ? this.parsedUnits[0] : "")}, ${this.yAxisLabel}: ${yValue + (this.parsedUnits[1] ? this.parsedUnits[1] : "")}`;
364
- if (this.showDeltas && pointIdx > 0) {
365
- const prevDataPoint = lineDataPoints[pointIdx - 1];
366
- const changeSinceMessage = intl.lineChartMessages.getChangeSince(prevDataPoint.xValue);
367
- ariaLabel += `, ${changeSinceMessage} ${this.calcDelta(dataPoint, prevDataPoint)}`;
368
- }
369
- return (index.h("span", { id: `${lineLabel}-${pointIdx}`, role: "img", "aria-label": ariaLabel, tabIndex: firstPointTabIndex, class: "point icon", style: iconStyle, "data-lineidx": lineIdx, "data-xvalue": xValue, onKeyDown: (ev) => this.handleDataPointKeydown(ev), onFocus: () => (this.displayedPopover = pointIdx), onClick: (ev) => this.focusDataPointByEl(ev.target), onMouseEnter: () => (this.displayedPopover = pointIdx) }));
370
- }
371
- })));
372
- }
373
- renderLines(lineIdx) {
374
- const lineDataPoints = this.dataPointMatrix[lineIdx];
375
- return (index.h("svg", { class: "line-svg" }, lineDataPoints.map((dataPoint, pointIdx) => {
376
- const shouldDraw = dataPoint.yValue !== null &&
377
- pointIdx !== lineDataPoints.length - 1 &&
378
- lineDataPoints[pointIdx + 1].yValue !== null;
379
- if (shouldDraw) {
380
- const { color } = this.lineStyles[lineIdx];
381
- const { xPositionPercent: xStart, yPositionPercent: yStart } = dataPoint;
382
- const { xPositionPercent: xEnd, yPositionPercent: yEnd } = lineDataPoints[pointIdx + 1];
383
- return (index.h("line", { x1: xStart + "%", y1: yStart + "%", x2: xEnd + "%", y2: yEnd + "%", stroke: color, "stroke-width": "2px" }));
384
- }
385
- })));
386
- }
387
- renderHoverAreas() {
388
- const hoverAreaStyle = { "--columns": `.5fr repeat(${this.xIntervals.length - 2}, 1fr) .5fr` };
389
- return (index.h("div", { class: "hover-area-wrapper", style: hoverAreaStyle, onMouseLeave: () => (this.displayedPopover = -1) }, this.xIntervals.map((_, idx) => (index.h("div", { onMouseEnter: () => (this.displayedPopover = idx) })))));
390
- }
391
- renderPopover() {
392
- const displayedPopoverData = this.popoverData[this.displayedPopover];
393
- const xPosition = displayedPopoverData[0].xPositionPercent;
394
- const yPositions = displayedPopoverData
395
- .map((point) => point.yPositionPercent)
396
- .filter((yPosition) => yPosition !== null);
397
- const averageYPosition = yPositions.reduce((acc, cur) => acc + cur, 0) / yPositions.length;
398
- const referencePointEl = this.plotAreaEl.querySelector(`.point[data-xvalue="${this.dataPointMatrix[0][this.displayedPopover].xValue}"]`);
399
- const componentBoundingClientRect = this.el.getBoundingClientRect();
400
- const referencePointBoundingClientRect = referencePointEl.getBoundingClientRect();
401
- const rightSpaceAvailable = componentBoundingClientRect.right - referencePointBoundingClientRect.right;
402
- const leftSpaceAvailable = referencePointBoundingClientRect.left - componentBoundingClientRect.left;
403
- const hasRoomRight = rightSpaceAvailable >= (this.popoverEl ? Math.min(this.popoverEl.clientWidth, 400) : 400);
404
- const hasRoomLeft = leftSpaceAvailable >= (this.popoverEl ? Math.min(this.popoverEl.clientWidth, 400) : 400);
405
- const percentMargin = (8 / this.plotAreaEl.clientWidth) * 100;
406
- let popoverStyle = {
407
- "--leftPosition": hasRoomRight ? xPosition + percentMargin + "%" : "unset",
408
- "--rightPosition": hasRoomLeft ? 100 - xPosition + percentMargin + "%" : "unset",
409
- "--topPosition": averageYPosition + "%",
410
- transform: "translateY(-50%)", // vertically center for averageYPosition
411
- };
412
- if (!hasRoomLeft && !hasRoomRight) {
413
- // if there's not enough room to the left and right, position "detached" from the data points towards the top of the chart
414
- const displaceLeft = `0px - ${this.labelWidth} - 20px - ${this.yIntervalsEl.clientWidth + "px"} + ${this.el.scrollLeft + "px"} + 2px`;
415
- popoverStyle = {
416
- "--leftPosition": `0%`,
417
- "--topPosition": "0%",
418
- maxWidth: Math.min(this.el.clientWidth - 2, 400) + "px",
419
- transform: `translateX(calc(${displaceLeft}))`, // align with left edge of component
420
- };
363
+ let ariaLabel = `${lineLabel} ${highlighted ? this.highlightQualifier : ""} ${this.xAxisLabel} ${xValue + (this.parsedUnits[0] ? this.parsedUnits[0] : "")}, ${this.yAxisLabel}: ${yValue + (this.parsedUnits[1] ? this.parsedUnits[1] : "")}`;
364
+ if (this.showDeltas && pointIdx > 0) {
365
+ const prevDataPoint = lineDataPoints[pointIdx - 1];
366
+ const changeSinceMessage = intl.lineChartMessages.getChangeSince(prevDataPoint.xValue);
367
+ ariaLabel += `, ${changeSinceMessage} ${this.calcDelta(dataPoint, prevDataPoint)}`;
421
368
  }
422
- return (index.h("div", { ref: (el) => (this.popoverEl = el), class: "popover", style: popoverStyle }, index.h("div", { class: "title" }, displayedPopoverData[0].xValue, this.parsedUnits[0] && index.h("span", { class: "unit --x" }, "(", this.parsedUnits[0], ")")), this.showDeltas && this.displayedPopover > 0 && (index.h("div", { class: "comparison-title" }, intl.lineChartMessages.getChangeSince(this.popoverData[this.displayedPopover - 1][0].xValue))), this.renderPopoverTable()));
423
- }
424
- renderPopoverTable() {
425
- const displayedPopoverData = this.popoverData[this.displayedPopover];
426
- return (index.h("table", { class: "popover-table" }, displayedPopoverData.map((dataPoint, lineIdx) => {
427
- if (!this.hiddenLines.includes(lineIdx)) {
428
- const { lineLabel, yValue } = dataPoint;
429
- const prevDataPoint = this.displayedPopover > 0 ? this.popoverData[this.displayedPopover - 1][lineIdx] : null;
430
- const localizedYValue = yValue !== null ? new Intl.NumberFormat().format(yValue) : null;
431
- return (index.h("tr", { class: "popover-row" }, index.h("td", null, this.renderIcon(lineIdx)), index.h("td", { class: "row-label" }, lineLabel), index.h("td", { class: "row-value" }, yValue === null ? intl.lineChartMessages.noData : localizedYValue, yValue !== null && this.parsedUnits[1] && index.h("span", { class: "unit --y" }, this.parsedUnits[1])), this.showDeltas && prevDataPoint && this.renderDeltas(dataPoint, prevDataPoint)));
432
- }
433
- })));
434
- }
435
- renderDeltas(dataPoint, prevDataPoint) {
436
- const delta = this.calcDelta(dataPoint, prevDataPoint);
437
- const deltaColor = delta.toString()[0] == "+" || delta == "-" ? "positive" : delta.toString()[0] == "-" ? "negative" : "";
438
- return prevDataPoint && index.h("td", { class: `delta --${deltaColor}` }, delta);
439
- }
440
- renderHoverIndicator() {
441
- const xPosition = this.dataPointMatrix[0][this.displayedPopover].xPositionPercent;
442
- const indicatorStyle = { "--xPosition": xPosition + "%" };
443
- return index.h("div", { class: "hover-indicator", style: indicatorStyle });
444
- }
445
- renderHighlight() {
446
- const startPercentage = this.dataPointMatrix[0][this.xIntervals.indexOf(this.highlightStart)].xPositionPercent;
447
- const endPercentage = this.highlightEnd
448
- ? 100 - this.dataPointMatrix[0][this.xIntervals.indexOf(this.highlightEnd)].xPositionPercent
449
- : 0;
450
- const highlightStyle = { "--startPercentage": startPercentage + "%", "--endPercentage": endPercentage + "%" };
451
- return index.h("div", { class: "highlight", style: highlightStyle });
452
- }
453
- render() {
454
- return (index.h(index.Host, { onBlur: () => this.resetDataPointFocus(), onMouseLeave: () => (this.displayedPopover = -1) }, index.h("div", { class: "component-wrapper", role: "application", "aria-roledescription": intl.chartMessages.interactiveChart, "aria-label": this.label, "aria-describedby": "chart-description" }, this.renderLegend(), index.h("div", { class: "chart-wrapper" }, index.h("div", { class: "chart-label --y-axis", style: { "--labelWidth": this.labelWidth } }, this.yAxisLabel, this.parsedUnits[1] && ` (${this.parsedUnits[1]})`), this.renderYIntervals(), index.h("div", { ref: (el) => (this.plotAreaEl = el), class: `plot-area ${this.hasPartialInterval ? "" : "right-border"}`, style: {
455
- "--backgroundSize": `${this.dataPointMatrix[0][this.xIntervals.indexOf(this.displayedXIntervals[1])].xPositionPercent}%`,
456
- } }, this.highlightStart && this.renderHighlight(), this.renderData(), this.renderHoverAreas()), this.displayedPopover !== -1 && this.renderHoverIndicator(), this.displayedPopover !== -1 && this.renderPopover(), this.renderXIntervals(), index.h("div", { class: "chart-label --x-axis" }, this.xAxisLabel, this.parsedUnits[0] && ` (${this.parsedUnits[0]})`)), index.h("div", { id: "chart-description", class: "sr-only" }, `${intl.lineChartMessages.instructions} ${this.description}`), index.h("div", { ref: (el) => (this.liveRegionEl = el), "aria-live": "polite", class: "sr-only" }, this.announcement))));
457
- }
458
- get el() { return index.getElement(this); }
459
- static get watchers() { return {
460
- "lineData": ["parseData"],
461
- "intervalSkip": ["handleIntervalSkip"]
462
- }; }
369
+ return (index.h("span", { id: `${lineLabel}-${pointIdx}`, role: "img", "aria-label": ariaLabel, tabIndex: firstPointTabIndex, class: "point icon", style: iconStyle, "data-lineidx": lineIdx, "data-xvalue": xValue, onKeyDown: (ev) => this.handleDataPointKeydown(ev), onFocus: () => (this.displayedPopover = pointIdx), onClick: (ev) => this.focusDataPointByEl(ev.target), onMouseEnter: () => (this.displayedPopover = pointIdx) }));
370
+ }
371
+ })));
372
+ }
373
+ renderLines(lineIdx) {
374
+ const lineDataPoints = this.dataPointMatrix[lineIdx];
375
+ return (index.h("svg", { class: "line-svg" }, lineDataPoints.map((dataPoint, pointIdx) => {
376
+ const shouldDraw = dataPoint.yValue !== null &&
377
+ pointIdx !== lineDataPoints.length - 1 &&
378
+ lineDataPoints[pointIdx + 1].yValue !== null;
379
+ if (shouldDraw) {
380
+ const { color } = this.lineStyles[lineIdx];
381
+ const { xPositionPercent: xStart, yPositionPercent: yStart } = dataPoint;
382
+ const { xPositionPercent: xEnd, yPositionPercent: yEnd } = lineDataPoints[pointIdx + 1];
383
+ return (index.h("line", { x1: xStart + "%", y1: yStart + "%", x2: xEnd + "%", y2: yEnd + "%", stroke: color, "stroke-width": "2px" }));
384
+ }
385
+ })));
386
+ }
387
+ renderHoverAreas() {
388
+ const hoverAreaStyle = { "--columns": `.5fr repeat(${this.xIntervals.length - 2}, 1fr) .5fr` };
389
+ return (index.h("div", { class: "hover-area-wrapper", style: hoverAreaStyle, onMouseLeave: () => (this.displayedPopover = -1) }, this.xIntervals.map((_, idx) => (index.h("div", { onMouseEnter: () => (this.displayedPopover = idx) })))));
390
+ }
391
+ renderPopover() {
392
+ const displayedPopoverData = this.popoverData[this.displayedPopover];
393
+ const xPosition = displayedPopoverData[0].xPositionPercent;
394
+ const yPositions = displayedPopoverData
395
+ .map((point) => point.yPositionPercent)
396
+ .filter((yPosition) => yPosition !== null);
397
+ const averageYPosition = yPositions.reduce((acc, cur) => acc + cur, 0) / yPositions.length;
398
+ const referencePointEl = this.plotAreaEl.querySelector(`.point[data-xvalue="${this.dataPointMatrix[0][this.displayedPopover].xValue}"]`);
399
+ const componentBoundingClientRect = this.el.getBoundingClientRect();
400
+ const referencePointBoundingClientRect = referencePointEl.getBoundingClientRect();
401
+ const rightSpaceAvailable = componentBoundingClientRect.right - referencePointBoundingClientRect.right;
402
+ const leftSpaceAvailable = referencePointBoundingClientRect.left - componentBoundingClientRect.left;
403
+ const hasRoomRight = rightSpaceAvailable >= (this.popoverEl ? Math.min(this.popoverEl.clientWidth, 400) : 400);
404
+ const hasRoomLeft = leftSpaceAvailable >= (this.popoverEl ? Math.min(this.popoverEl.clientWidth, 400) : 400);
405
+ const percentMargin = (8 / this.plotAreaEl.clientWidth) * 100;
406
+ let popoverStyle = {
407
+ "--leftPosition": hasRoomRight ? xPosition + percentMargin + "%" : "unset",
408
+ "--rightPosition": hasRoomLeft ? 100 - xPosition + percentMargin + "%" : "unset",
409
+ "--topPosition": averageYPosition + "%",
410
+ transform: "translateY(-50%)", // vertically center for averageYPosition
411
+ };
412
+ if (!hasRoomLeft && !hasRoomRight) {
413
+ // if there's not enough room to the left and right, position "detached" from the data points towards the top of the chart
414
+ const displaceLeft = `0px - ${this.labelWidth} - 20px - ${this.yIntervalsEl.clientWidth + "px"} + ${this.el.scrollLeft + "px"} + 2px`;
415
+ popoverStyle = {
416
+ "--leftPosition": `0%`,
417
+ "--topPosition": "0%",
418
+ maxWidth: Math.min(this.el.clientWidth - 2, 400) + "px",
419
+ transform: `translateX(calc(${displaceLeft}))`, // align with left edge of component
420
+ };
421
+ }
422
+ return (index.h("div", { ref: (el) => (this.popoverEl = el), class: "popover", style: popoverStyle }, index.h("div", { class: "title" }, displayedPopoverData[0].xValue, this.parsedUnits[0] && index.h("span", { class: "unit --x" }, "(", this.parsedUnits[0], ")")), this.showDeltas && this.displayedPopover > 0 && (index.h("div", { class: "comparison-title" }, intl.lineChartMessages.getChangeSince(this.popoverData[this.displayedPopover - 1][0].xValue))), this.renderPopoverTable()));
423
+ }
424
+ renderPopoverTable() {
425
+ const displayedPopoverData = this.popoverData[this.displayedPopover];
426
+ return (index.h("table", { class: "popover-table" }, displayedPopoverData.map((dataPoint, lineIdx) => {
427
+ if (!this.hiddenLines.includes(lineIdx)) {
428
+ const { lineLabel, yValue } = dataPoint;
429
+ const prevDataPoint = this.displayedPopover > 0 ? this.popoverData[this.displayedPopover - 1][lineIdx] : null;
430
+ const localizedYValue = yValue !== null ? new Intl.NumberFormat().format(yValue) : null;
431
+ return (index.h("tr", { class: "popover-row" }, index.h("td", null, this.renderIcon(lineIdx)), index.h("td", { class: "row-label" }, lineLabel), index.h("td", { class: "row-value" }, yValue === null ? intl.lineChartMessages.noData : localizedYValue, yValue !== null && this.parsedUnits[1] && index.h("span", { class: "unit --y" }, this.parsedUnits[1])), this.showDeltas && prevDataPoint && this.renderDeltas(dataPoint, prevDataPoint)));
432
+ }
433
+ })));
434
+ }
435
+ renderDeltas(dataPoint, prevDataPoint) {
436
+ const delta = this.calcDelta(dataPoint, prevDataPoint);
437
+ const deltaColor = delta.toString()[0] == "+" || delta == "-" ? "positive" : delta.toString()[0] == "-" ? "negative" : "";
438
+ return prevDataPoint && index.h("td", { class: `delta --${deltaColor}` }, delta);
439
+ }
440
+ renderHoverIndicator() {
441
+ const xPosition = this.dataPointMatrix[0][this.displayedPopover].xPositionPercent;
442
+ const indicatorStyle = { "--xPosition": xPosition + "%" };
443
+ return index.h("div", { class: "hover-indicator", style: indicatorStyle });
444
+ }
445
+ renderHighlight() {
446
+ const startPercentage = this.dataPointMatrix[0][this.xIntervals.indexOf(this.highlightStart)].xPositionPercent;
447
+ const endPercentage = this.highlightEnd
448
+ ? 100 - this.dataPointMatrix[0][this.xIntervals.indexOf(this.highlightEnd)].xPositionPercent
449
+ : 0;
450
+ const highlightStyle = { "--startPercentage": startPercentage + "%", "--endPercentage": endPercentage + "%" };
451
+ return index.h("div", { class: "highlight", style: highlightStyle });
452
+ }
453
+ render() {
454
+ return (index.h(index.Host, { onBlur: () => this.resetDataPointFocus(), onMouseLeave: () => (this.displayedPopover = -1) }, index.h("div", { class: "component-wrapper", role: "application", "aria-roledescription": intl.chartMessages.interactiveChart, "aria-label": this.label, "aria-describedby": "chart-description" }, this.renderLegend(), index.h("div", { class: "chart-wrapper" }, index.h("div", { class: "chart-label --y-axis", style: { "--labelWidth": this.labelWidth } }, this.yAxisLabel, this.parsedUnits[1] && ` (${this.parsedUnits[1]})`), this.renderYIntervals(), index.h("div", { ref: (el) => (this.plotAreaEl = el), class: `plot-area ${this.hasPartialInterval ? "" : "right-border"}`, style: {
455
+ "--backgroundSize": `${this.dataPointMatrix[0][this.xIntervals.indexOf(this.displayedXIntervals[1])].xPositionPercent}%`,
456
+ } }, this.highlightStart && this.renderHighlight(), this.renderData(), this.renderHoverAreas()), this.displayedPopover !== -1 && this.renderHoverIndicator(), this.displayedPopover !== -1 && this.renderPopover(), this.renderXIntervals(), index.h("div", { class: "chart-label --x-axis" }, this.xAxisLabel, this.parsedUnits[0] && ` (${this.parsedUnits[0]})`)), index.h("div", { id: "chart-description", class: "sr-only" }, `${intl.lineChartMessages.instructions} ${this.description}`), index.h("div", { ref: (el) => (this.liveRegionEl = el), "aria-live": "polite", class: "sr-only" }, this.announcement))));
457
+ }
458
+ get el() { return index.getElement(this); }
459
+ static get watchers() { return {
460
+ "lineData": ["parseData"],
461
+ "intervalSkip": ["handleIntervalSkip"]
462
+ }; }
463
463
  };
464
464
  LineChart.style = wmLineChartCss;
465
465