@nordicsemiconductor/pc-nrfconnect-shared 60.0.0-pre1 → 76.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 (323) hide show
  1. package/Changelog.md +222 -5
  2. package/config/colors.js +46 -0
  3. package/config/tailwind.config.js +25 -0
  4. package/config/tsconfig.json +2 -1
  5. package/dist/bootstrap.css +8951 -0
  6. package/package.json +28 -10
  7. package/scripts/esbuild-renderer.js +25 -17
  8. package/scripts/nordic-publish.js +89 -0
  9. package/src/About/About.tsx +9 -3
  10. package/src/About/ApplicationCard.tsx +20 -22
  11. package/src/About/DeviceCard.tsx +28 -26
  12. package/src/About/DocumentationCard.tsx +12 -9
  13. package/src/About/Section.tsx +5 -5
  14. package/src/About/SupportCard.tsx +61 -56
  15. package/src/App/App.tsx +36 -11
  16. package/src/App/appLayout.ts +0 -1
  17. package/src/App/preflight.scss +443 -0
  18. package/src/App/tailwind.css +12 -0
  19. package/src/Button/Button.tsx +34 -24
  20. package/src/Device/DeviceSelector/DeviceSelector.tsx +5 -2
  21. package/src/Device/DeviceSetup/DeviceSetupView.tsx +6 -3
  22. package/src/Device/deviceAutoSelectSlice.ts +14 -8
  23. package/src/Device/deviceLibWrapper.ts +0 -1
  24. package/src/Device/deviceLister.ts +68 -40
  25. package/src/Device/deviceSetup.ts +15 -20
  26. package/src/Device/jprogOperations.ts +5 -5
  27. package/src/Device/sdfuOperations.ts +43 -37
  28. package/src/Dialog/dialog.scss +0 -4
  29. package/src/Dropdown/Dropdown.module.scss +2 -70
  30. package/src/Dropdown/Dropdown.tsx +20 -14
  31. package/src/ErrorBoundary/ErrorBoundary.test.tsx +1 -18
  32. package/src/FlashMessage/FlashMessage.tsx +159 -0
  33. package/src/FlashMessage/FlashMessageSlice.ts +88 -0
  34. package/src/FlashMessage/flashMessage.css +32 -0
  35. package/src/NavBar/NavMenu.tsx +1 -2
  36. package/src/NavBar/NavMenuItem.tsx +5 -7
  37. package/src/NavBar/nav-bar.scss +2 -1
  38. package/src/NavBar/nav-menu-item.scss +0 -5
  39. package/src/NumberInputWithSlider/NumberInputSliderWithUnit.tsx +74 -0
  40. package/src/Panes/FeedbackPane.tsx +83 -48
  41. package/src/SerialPort/ConflictingSettingsDialog.tsx +50 -66
  42. package/src/StateSelector/StateSelector.tsx +1 -1
  43. package/src/Stepper/Stepper.tsx +2 -3
  44. package/src/index.ts +14 -3
  45. package/src/store.ts +10 -3
  46. package/src/utils/colors.ts +147 -12
  47. package/src/utils/usageData.ts +59 -52
  48. package/src/utils/useFocusedOnVisible.ts +26 -0
  49. package/src/variables.scss +5 -5
  50. package/typings/generated/main/index.d.ts +1 -0
  51. package/typings/generated/main/index.d.ts.map +1 -0
  52. package/typings/generated/src/About/About.d.ts +6 -2
  53. package/typings/generated/src/About/About.d.ts.map +1 -0
  54. package/typings/generated/src/About/AboutButton.d.ts +1 -0
  55. package/typings/generated/src/About/AboutButton.d.ts.map +1 -0
  56. package/typings/generated/src/About/ApplicationCard.d.ts +1 -0
  57. package/typings/generated/src/About/ApplicationCard.d.ts.map +1 -0
  58. package/typings/generated/src/About/DeviceCard.d.ts +1 -0
  59. package/typings/generated/src/About/DeviceCard.d.ts.map +1 -0
  60. package/typings/generated/src/About/DocumentationCard.d.ts +5 -2
  61. package/typings/generated/src/About/DocumentationCard.d.ts.map +1 -0
  62. package/typings/generated/src/About/DocumentationSection.d.ts +1 -0
  63. package/typings/generated/src/About/DocumentationSection.d.ts.map +1 -0
  64. package/typings/generated/src/About/Section.d.ts +1 -1
  65. package/typings/generated/src/About/Section.d.ts.map +1 -0
  66. package/typings/generated/src/About/ShortcutButton.d.ts +1 -0
  67. package/typings/generated/src/About/ShortcutButton.d.ts.map +1 -0
  68. package/typings/generated/src/About/SupportCard.d.ts +1 -0
  69. package/typings/generated/src/About/SupportCard.d.ts.map +1 -0
  70. package/typings/generated/src/About/shortcutSlice.d.ts +1 -0
  71. package/typings/generated/src/About/shortcutSlice.d.ts.map +1 -0
  72. package/typings/generated/src/Alert/Alert.d.ts +1 -0
  73. package/typings/generated/src/Alert/Alert.d.ts.map +1 -0
  74. package/typings/generated/src/App/App.d.ts +4 -0
  75. package/typings/generated/src/App/App.d.ts.map +1 -0
  76. package/typings/generated/src/App/App.test.d.ts +1 -0
  77. package/typings/generated/src/App/App.test.d.ts.map +1 -0
  78. package/typings/generated/src/App/ConnectedToStore.d.ts +1 -0
  79. package/typings/generated/src/App/ConnectedToStore.d.ts.map +1 -0
  80. package/typings/generated/src/App/VisibilityBar.d.ts +1 -0
  81. package/typings/generated/src/App/VisibilityBar.d.ts.map +1 -0
  82. package/typings/generated/src/App/appLayout.d.ts +1 -1
  83. package/typings/generated/src/App/appLayout.d.ts.map +1 -0
  84. package/typings/generated/src/Button/Button.d.ts +2 -1
  85. package/typings/generated/src/Button/Button.d.ts.map +1 -0
  86. package/typings/generated/src/Card/Card.d.ts +1 -0
  87. package/typings/generated/src/Card/Card.d.ts.map +1 -0
  88. package/typings/generated/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.d.ts +1 -0
  89. package/typings/generated/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.d.ts.map +1 -0
  90. package/typings/generated/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.d.ts +1 -0
  91. package/typings/generated/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.d.ts.map +1 -0
  92. package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts +1 -0
  93. package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts.map +1 -0
  94. package/typings/generated/src/Device/DeviceSelector/DeviceIcon.d.ts +1 -0
  95. package/typings/generated/src/Device/DeviceSelector/DeviceIcon.d.ts.map +1 -0
  96. package/typings/generated/src/Device/DeviceSelector/DeviceList/AnimatedList.d.ts +1 -0
  97. package/typings/generated/src/Device/DeviceSelector/DeviceList/AnimatedList.d.ts.map +1 -0
  98. package/typings/generated/src/Device/DeviceSelector/DeviceList/BrokenDevice.d.ts +1 -0
  99. package/typings/generated/src/Device/DeviceSelector/DeviceList/BrokenDevice.d.ts.map +1 -0
  100. package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts +1 -0
  101. package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts.map +1 -0
  102. package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts +1 -0
  103. package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts.map +1 -0
  104. package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts +1 -0
  105. package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts.map +1 -0
  106. package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts +1 -0
  107. package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts.map +1 -0
  108. package/typings/generated/src/Device/DeviceSelector/DeviceList/RenameDevice.d.ts +1 -0
  109. package/typings/generated/src/Device/DeviceSelector/DeviceList/RenameDevice.d.ts.map +1 -0
  110. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts +1 -0
  111. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts.map +1 -0
  112. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.test.d.ts +1 -0
  113. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.test.d.ts.map +1 -0
  114. package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts +1 -0
  115. package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts.map +1 -0
  116. package/typings/generated/src/Device/DeviceSelector/SelectDevice.d.ts +1 -0
  117. package/typings/generated/src/Device/DeviceSelector/SelectDevice.d.ts.map +1 -0
  118. package/typings/generated/src/Device/DeviceSelector/SelectedDevice.d.ts +1 -0
  119. package/typings/generated/src/Device/DeviceSelector/SelectedDevice.d.ts.map +1 -0
  120. package/typings/generated/src/Device/DeviceSetup/DeviceSetupView.d.ts +1 -0
  121. package/typings/generated/src/Device/DeviceSetup/DeviceSetupView.d.ts.map +1 -0
  122. package/typings/generated/src/Device/deviceAutoSelectSlice.d.ts +3 -1
  123. package/typings/generated/src/Device/deviceAutoSelectSlice.d.ts.map +1 -0
  124. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +1 -0
  125. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts.map +1 -0
  126. package/typings/generated/src/Device/deviceLibWrapper.d.ts +1 -0
  127. package/typings/generated/src/Device/deviceLibWrapper.d.ts.map +1 -0
  128. package/typings/generated/src/Device/deviceLibWrapper.test.d.ts +1 -0
  129. package/typings/generated/src/Device/deviceLibWrapper.test.d.ts.map +1 -0
  130. package/typings/generated/src/Device/deviceLister.d.ts +4 -2
  131. package/typings/generated/src/Device/deviceLister.d.ts.map +1 -0
  132. package/typings/generated/src/Device/deviceLister.test.d.ts +1 -0
  133. package/typings/generated/src/Device/deviceLister.test.d.ts.map +1 -0
  134. package/typings/generated/src/Device/deviceSetup.d.ts +8 -7
  135. package/typings/generated/src/Device/deviceSetup.d.ts.map +1 -0
  136. package/typings/generated/src/Device/deviceSetupSlice.d.ts +1 -0
  137. package/typings/generated/src/Device/deviceSetupSlice.d.ts.map +1 -0
  138. package/typings/generated/src/Device/deviceSlice.d.ts +1 -0
  139. package/typings/generated/src/Device/deviceSlice.d.ts.map +1 -0
  140. package/typings/generated/src/Device/dfu-cc.d.ts +1 -0
  141. package/typings/generated/src/Device/dfu-cc.d.ts.map +1 -0
  142. package/typings/generated/src/Device/initPacket.d.ts +1 -0
  143. package/typings/generated/src/Device/initPacket.d.ts.map +1 -0
  144. package/typings/generated/src/Device/jprogOperations.d.ts +1 -0
  145. package/typings/generated/src/Device/jprogOperations.d.ts.map +1 -0
  146. package/typings/generated/src/Device/sdfuOperations.d.ts +4 -3
  147. package/typings/generated/src/Device/sdfuOperations.d.ts.map +1 -0
  148. package/typings/generated/src/Dialog/Dialog.d.ts +1 -0
  149. package/typings/generated/src/Dialog/Dialog.d.ts.map +1 -0
  150. package/typings/generated/src/Dialog/Dialog.test.d.ts +1 -0
  151. package/typings/generated/src/Dialog/Dialog.test.d.ts.map +1 -0
  152. package/typings/generated/src/Dropdown/Dropdown.d.ts +3 -1
  153. package/typings/generated/src/Dropdown/Dropdown.d.ts.map +1 -0
  154. package/typings/generated/src/Dropdown/Dropdown.test.d.ts +1 -0
  155. package/typings/generated/src/Dropdown/Dropdown.test.d.ts.map +1 -0
  156. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +1 -0
  157. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts.map +1 -0
  158. package/typings/generated/src/ErrorBoundary/ErrorBoundary.test.d.ts +1 -0
  159. package/typings/generated/src/ErrorBoundary/ErrorBoundary.test.d.ts.map +1 -0
  160. package/typings/generated/src/ErrorDialog/ErrorDialog.d.ts +1 -0
  161. package/typings/generated/src/ErrorDialog/ErrorDialog.d.ts.map +1 -0
  162. package/typings/generated/src/ErrorDialog/ErrorDialog.test.d.ts +1 -0
  163. package/typings/generated/src/ErrorDialog/ErrorDialog.test.d.ts.map +1 -0
  164. package/typings/generated/src/ErrorDialog/errorDialogSlice.d.ts +1 -0
  165. package/typings/generated/src/ErrorDialog/errorDialogSlice.d.ts.map +1 -0
  166. package/typings/generated/src/ErrorDialog/errorDialogSlice.test.d.ts +1 -0
  167. package/typings/generated/src/ErrorDialog/errorDialogSlice.test.d.ts.map +1 -0
  168. package/typings/generated/src/FactoryReset/FactoryResetButton.d.ts +1 -0
  169. package/typings/generated/src/FactoryReset/FactoryResetButton.d.ts.map +1 -0
  170. package/typings/generated/src/FactoryReset/FactoryResetButton.test.d.ts +1 -0
  171. package/typings/generated/src/FactoryReset/FactoryResetButton.test.d.ts.map +1 -0
  172. package/typings/generated/src/FlashMessage/FlashMessage.d.ts +5 -0
  173. package/typings/generated/src/FlashMessage/FlashMessage.d.ts.map +1 -0
  174. package/typings/generated/src/FlashMessage/FlashMessageSlice.d.ts +20 -0
  175. package/typings/generated/src/FlashMessage/FlashMessageSlice.d.ts.map +1 -0
  176. package/typings/generated/src/InlineInput/InlineInput.d.ts +1 -0
  177. package/typings/generated/src/InlineInput/InlineInput.d.ts.map +1 -0
  178. package/typings/generated/src/InlineInput/NumberInlineInput.d.ts +1 -0
  179. package/typings/generated/src/InlineInput/NumberInlineInput.d.ts.map +1 -0
  180. package/typings/generated/src/Log/LogEntry.d.ts +1 -0
  181. package/typings/generated/src/Log/LogEntry.d.ts.map +1 -0
  182. package/typings/generated/src/Log/LogViewer.d.ts +1 -0
  183. package/typings/generated/src/Log/LogViewer.d.ts.map +1 -0
  184. package/typings/generated/src/Log/logSlice.d.ts +1 -0
  185. package/typings/generated/src/Log/logSlice.d.ts.map +1 -0
  186. package/typings/generated/src/Log/syncLogToStore.d.ts +1 -0
  187. package/typings/generated/src/Log/syncLogToStore.d.ts.map +1 -0
  188. package/typings/generated/src/Logo/Logo.d.ts +1 -0
  189. package/typings/generated/src/Logo/Logo.d.ts.map +1 -0
  190. package/typings/generated/src/Main/Main.d.ts +1 -0
  191. package/typings/generated/src/Main/Main.d.ts.map +1 -0
  192. package/typings/generated/src/MasonryLayout/MasonryLayout.d.ts +1 -0
  193. package/typings/generated/src/MasonryLayout/MasonryLayout.d.ts.map +1 -0
  194. package/typings/generated/src/NavBar/NavBar.d.ts +1 -0
  195. package/typings/generated/src/NavBar/NavBar.d.ts.map +1 -0
  196. package/typings/generated/src/NavBar/NavMenu.d.ts +1 -0
  197. package/typings/generated/src/NavBar/NavMenu.d.ts.map +1 -0
  198. package/typings/generated/src/NavBar/NavMenu.test.d.ts +1 -0
  199. package/typings/generated/src/NavBar/NavMenu.test.d.ts.map +1 -0
  200. package/typings/generated/src/NavBar/NavMenuItem.d.ts +1 -1
  201. package/typings/generated/src/NavBar/NavMenuItem.d.ts.map +1 -0
  202. package/typings/generated/src/NumberInputWithSlider/NumberInputSliderWithUnit.d.ts +14 -0
  203. package/typings/generated/src/NumberInputWithSlider/NumberInputSliderWithUnit.d.ts.map +1 -0
  204. package/typings/generated/src/OpenApp/openApp.d.ts +1 -0
  205. package/typings/generated/src/OpenApp/openApp.d.ts.map +1 -0
  206. package/typings/generated/src/Panes/FeedbackPane.d.ts +5 -1
  207. package/typings/generated/src/Panes/FeedbackPane.d.ts.map +1 -0
  208. package/typings/generated/src/PseudoButton/PseudoButton.d.ts +1 -0
  209. package/typings/generated/src/PseudoButton/PseudoButton.d.ts.map +1 -0
  210. package/typings/generated/src/SerialPort/ConflictingSettingsDialog.d.ts +1 -0
  211. package/typings/generated/src/SerialPort/ConflictingSettingsDialog.d.ts.map +1 -0
  212. package/typings/generated/src/SerialPort/SerialPort.d.ts +1 -0
  213. package/typings/generated/src/SerialPort/SerialPort.d.ts.map +1 -0
  214. package/typings/generated/src/SerialPort/SerialPort.test.d.ts +1 -0
  215. package/typings/generated/src/SerialPort/SerialPort.test.d.ts.map +1 -0
  216. package/typings/generated/src/Shortcuts/ShortcutItem.d.ts +1 -0
  217. package/typings/generated/src/Shortcuts/ShortcutItem.d.ts.map +1 -0
  218. package/typings/generated/src/Shortcuts/ShortcutModal.d.ts +1 -0
  219. package/typings/generated/src/Shortcuts/ShortcutModal.d.ts.map +1 -0
  220. package/typings/generated/src/SidePanel/Group.d.ts +1 -0
  221. package/typings/generated/src/SidePanel/Group.d.ts.map +1 -0
  222. package/typings/generated/src/SidePanel/SidePanel.d.ts +1 -0
  223. package/typings/generated/src/SidePanel/SidePanel.d.ts.map +1 -0
  224. package/typings/generated/src/Slider/Bar.d.ts +1 -0
  225. package/typings/generated/src/Slider/Bar.d.ts.map +1 -0
  226. package/typings/generated/src/Slider/Factor.test.d.ts +1 -0
  227. package/typings/generated/src/Slider/Factor.test.d.ts.map +1 -0
  228. package/typings/generated/src/Slider/Handle.d.ts +1 -0
  229. package/typings/generated/src/Slider/Handle.d.ts.map +1 -0
  230. package/typings/generated/src/Slider/Slider.d.ts +1 -0
  231. package/typings/generated/src/Slider/Slider.d.ts.map +1 -0
  232. package/typings/generated/src/Slider/Slider.test.d.ts +1 -0
  233. package/typings/generated/src/Slider/Slider.test.d.ts.map +1 -0
  234. package/typings/generated/src/Slider/Ticks.d.ts +1 -0
  235. package/typings/generated/src/Slider/Ticks.d.ts.map +1 -0
  236. package/typings/generated/src/Slider/factor.d.ts +1 -0
  237. package/typings/generated/src/Slider/factor.d.ts.map +1 -0
  238. package/typings/generated/src/Slider/percentage.d.ts +1 -0
  239. package/typings/generated/src/Slider/percentage.d.ts.map +1 -0
  240. package/typings/generated/src/Slider/range.d.ts +1 -0
  241. package/typings/generated/src/Slider/range.d.ts.map +1 -0
  242. package/typings/generated/src/StartStopButton/StartStopButton.d.ts +1 -0
  243. package/typings/generated/src/StartStopButton/StartStopButton.d.ts.map +1 -0
  244. package/typings/generated/src/StateSelector/StateSelector.d.ts +1 -0
  245. package/typings/generated/src/StateSelector/StateSelector.d.ts.map +1 -0
  246. package/typings/generated/src/Stepper/Stepper.d.ts +1 -0
  247. package/typings/generated/src/Stepper/Stepper.d.ts.map +1 -0
  248. package/typings/generated/src/Toggle/Toggle.d.ts +1 -0
  249. package/typings/generated/src/Toggle/Toggle.d.ts.map +1 -0
  250. package/typings/generated/src/index.d.ts +8 -4
  251. package/typings/generated/src/index.d.ts.map +1 -0
  252. package/typings/generated/src/logging/appTransport.d.ts +1 -0
  253. package/typings/generated/src/logging/appTransport.d.ts.map +1 -0
  254. package/typings/generated/src/logging/appTransport.test.d.ts +1 -0
  255. package/typings/generated/src/logging/appTransport.test.d.ts.map +1 -0
  256. package/typings/generated/src/logging/describeError.d.ts +1 -0
  257. package/typings/generated/src/logging/describeError.d.ts.map +1 -0
  258. package/typings/generated/src/logging/describeError.test.d.ts +1 -0
  259. package/typings/generated/src/logging/describeError.test.d.ts.map +1 -0
  260. package/typings/generated/src/logging/index.d.ts +1 -0
  261. package/typings/generated/src/logging/index.d.ts.map +1 -0
  262. package/typings/generated/src/logging/logBuffer.d.ts +1 -0
  263. package/typings/generated/src/logging/logBuffer.d.ts.map +1 -0
  264. package/typings/generated/src/logging/logBuffer.test.d.ts +1 -0
  265. package/typings/generated/src/logging/logBuffer.test.d.ts.map +1 -0
  266. package/typings/generated/src/logging/sendInitialLogMessages.d.ts +1 -0
  267. package/typings/generated/src/logging/sendInitialLogMessages.d.ts.map +1 -0
  268. package/typings/generated/src/store.d.ts +21 -18
  269. package/typings/generated/src/store.d.ts.map +1 -0
  270. package/typings/generated/src/utils/AppTypes.d.ts +1 -0
  271. package/typings/generated/src/utils/AppTypes.d.ts.map +1 -0
  272. package/typings/generated/src/utils/appDirs.d.ts +1 -0
  273. package/typings/generated/src/utils/appDirs.d.ts.map +1 -0
  274. package/typings/generated/src/utils/bleChannels.d.ts +1 -0
  275. package/typings/generated/src/utils/bleChannels.d.ts.map +1 -0
  276. package/typings/generated/src/utils/classNames.d.ts +1 -0
  277. package/typings/generated/src/utils/classNames.d.ts.map +1 -0
  278. package/typings/generated/src/utils/classNames.test.d.ts +1 -0
  279. package/typings/generated/src/utils/classNames.test.d.ts.map +1 -0
  280. package/typings/generated/src/utils/colors.d.ts +126 -3
  281. package/typings/generated/src/utils/colors.d.ts.map +1 -0
  282. package/typings/generated/src/utils/describeVersion.d.ts +1 -0
  283. package/typings/generated/src/utils/describeVersion.d.ts.map +1 -0
  284. package/typings/generated/src/utils/environment.d.ts +1 -0
  285. package/typings/generated/src/utils/environment.d.ts.map +1 -0
  286. package/typings/generated/src/utils/logLibVersions.d.ts +1 -0
  287. package/typings/generated/src/utils/logLibVersions.d.ts.map +1 -0
  288. package/typings/generated/src/utils/open.d.ts +1 -0
  289. package/typings/generated/src/utils/open.d.ts.map +1 -0
  290. package/typings/generated/src/utils/packageJson.d.ts +1 -0
  291. package/typings/generated/src/utils/packageJson.d.ts.map +1 -0
  292. package/typings/generated/src/utils/persistentStore.d.ts +1 -0
  293. package/typings/generated/src/utils/persistentStore.d.ts.map +1 -0
  294. package/typings/generated/src/utils/systemReport.d.ts +1 -0
  295. package/typings/generated/src/utils/systemReport.d.ts.map +1 -0
  296. package/typings/generated/src/utils/truncateMiddle.d.ts +1 -0
  297. package/typings/generated/src/utils/truncateMiddle.d.ts.map +1 -0
  298. package/typings/generated/src/utils/truncateMiddle.test.d.ts +1 -0
  299. package/typings/generated/src/utils/truncateMiddle.test.d.ts.map +1 -0
  300. package/typings/generated/src/utils/usageData.d.ts +4 -3
  301. package/typings/generated/src/utils/usageData.d.ts.map +1 -0
  302. package/typings/generated/src/utils/useFocusedOnVisible.d.ts +11 -0
  303. package/typings/generated/src/utils/useFocusedOnVisible.d.ts.map +1 -0
  304. package/typings/generated/src/utils/useHotKey.d.ts +1 -0
  305. package/typings/generated/src/utils/useHotKey.d.ts.map +1 -0
  306. package/typings/generated/src/utils/useStopwatch.d.ts +1 -0
  307. package/typings/generated/src/utils/useStopwatch.d.ts.map +1 -0
  308. package/typings/generated/src/utils/useStopwatch.test.d.ts +1 -0
  309. package/typings/generated/src/utils/useStopwatch.test.d.ts.map +1 -0
  310. package/typings/generated/test/dispatchTo.d.ts +1 -0
  311. package/typings/generated/test/dispatchTo.d.ts.map +1 -0
  312. package/typings/generated/test/testrenderer.d.ts +1 -0
  313. package/typings/generated/test/testrenderer.d.ts.map +1 -0
  314. package/.github/ISSUE_TEMPLATE/custom.md +0 -10
  315. package/.husky/pre-push +0 -3
  316. package/.renovaterc.json +0 -10
  317. package/azure-pipelines.yml +0 -34
  318. package/jest.config.js +0 -7
  319. package/src/About/documentationSlice.ts +0 -41
  320. package/src/About/section.scss +0 -15
  321. package/src/Button/button.module.scss +0 -154
  322. package/tsconfig.json +0 -9
  323. package/typings/generated/src/About/documentationSlice.d.ts +0 -12
@@ -11,13 +11,13 @@ import nrfDeviceLib, {
11
11
  } from '@nordicsemiconductor/nrf-device-lib-js';
12
12
 
13
13
  import logger from '../logging';
14
- import type { AppDispatch, RootState } from '../store';
14
+ import type { AppThunk, RootState } from '../store';
15
15
  import {
16
- clearWaitForDevice,
17
16
  clearWaitForDeviceTimeout,
18
17
  setArrivedButWrongWhen,
19
18
  setDisconnectedTime,
20
19
  setLastArrivedDeviceId,
20
+ setOnCancelTimeout,
21
21
  setWaitForDeviceTimeout,
22
22
  WaitForDevice,
23
23
  } from './deviceAutoSelectSlice';
@@ -72,10 +72,12 @@ const shouldAutoReselect = (
72
72
  };
73
73
 
74
74
  const initAutoReconnectTimeout =
75
- (onTimeout: () => void, waitForDevice: WaitForDevice) =>
76
- (dispatch: AppDispatch) => {
75
+ (onTimeout: () => void, waitForDevice: WaitForDevice): AppThunk =>
76
+ dispatch => {
77
77
  const timeout = waitForDevice.timeout;
78
78
 
79
+ dispatch(setOnCancelTimeout(onTimeout));
80
+
79
81
  dispatch(
80
82
  setWaitForDeviceTimeout(
81
83
  setTimeout(() => {
@@ -86,8 +88,7 @@ const initAutoReconnectTimeout =
86
88
  timeout / 1000
87
89
  } seconds.`
88
90
  );
89
- dispatch(clearWaitForDeviceTimeout());
90
- onTimeout();
91
+ dispatch(clearWaitForDevice());
91
92
  logger.warn(
92
93
  `Failed to detect device after reboot. Timed out after ${
93
94
  timeout / 1000
@@ -135,6 +136,33 @@ export const hasValidDeviceTraits = (
135
136
  rule => requiredTraits[rule as keyof DeviceTraits] === false
136
137
  );
137
138
 
139
+ const removeDeviceFromList =
140
+ (
141
+ removedDevice: Device,
142
+ onDeviceDeselected: () => void,
143
+ onDeviceDisconnected: (device: Device) => void
144
+ ): AppThunk =>
145
+ (dispatch, getState) => {
146
+ if (
147
+ removedDevice.serialNumber ===
148
+ getState().device.selectedSerialNumber
149
+ ) {
150
+ onDeviceDeselected();
151
+ }
152
+
153
+ if (
154
+ removedDevice.serialNumber ===
155
+ getState().device.selectedSerialNumber &&
156
+ !getState().deviceAutoSelect.waitForDevice
157
+ ) {
158
+ dispatch(closeDeviceSetupDialog());
159
+ }
160
+
161
+ if (!getState().deviceAutoSelect.arrivedButWrongWhen) {
162
+ dispatch(removeDevice(removedDevice));
163
+ onDeviceDisconnected(removedDevice);
164
+ }
165
+ };
138
166
  /*
139
167
  * Starts watching for devices with the given traits. See the nrf-device-lib
140
168
  * library for available traits. Whenever devices are attached/detached, this
@@ -147,31 +175,9 @@ export const startWatchingDevices =
147
175
  onDeviceDisconnected: (device: Device) => void,
148
176
  onDeviceDeselected: () => void,
149
177
  doSelectDevice: (device: Device, autoReselected: boolean) => void
150
- ) =>
151
- async (dispatch: AppDispatch, getState: () => RootState) => {
178
+ ): AppThunk<RootState, Promise<void>> =>
179
+ async (dispatch, getState) => {
152
180
  const updateDeviceList = (event: HotplugEvent) => {
153
- const removeDeviceFromList = (remove: Device) => {
154
- if (
155
- remove.serialNumber ===
156
- getState().device.selectedSerialNumber
157
- ) {
158
- onDeviceDeselected();
159
- }
160
-
161
- if (
162
- remove.serialNumber ===
163
- getState().device.selectedSerialNumber &&
164
- !getState().deviceAutoSelect.waitForDevice
165
- ) {
166
- dispatch(closeDeviceSetupDialog());
167
- }
168
-
169
- if (!getState().deviceAutoSelect.arrivedButWrongWhen) {
170
- dispatch(removeDevice(remove));
171
- onDeviceDisconnected(remove);
172
- }
173
- };
174
-
175
181
  switch (event.event_type) {
176
182
  case 'NRFDL_DEVICE_EVENT_ARRIVED':
177
183
  if (!event.device) {
@@ -276,11 +282,11 @@ export const startWatchingDevices =
276
282
  'Wait For Device was successfully'
277
283
  );
278
284
 
279
- if (waitForDevice.once) {
280
- dispatch(clearWaitForDevice());
281
- } else {
282
- dispatch(clearWaitForDeviceTimeout());
283
- }
285
+ dispatch(
286
+ clearWaitForDeviceTimeout(
287
+ waitForDevice.once
288
+ )
289
+ );
284
290
 
285
291
  if (waitForDevice.onSuccess)
286
292
  waitForDevice.onSuccess(
@@ -314,19 +320,35 @@ export const startWatchingDevices =
314
320
  dispatch(
315
321
  initAutoReconnectTimeout(
316
322
  () =>
317
- removeDeviceFromList(
318
- device
323
+ dispatch(
324
+ removeDeviceFromList(
325
+ device,
326
+ onDeviceDeselected,
327
+ onDeviceDisconnected
328
+ )
319
329
  ),
320
330
  waitForDevice
321
331
  )
322
332
  );
323
333
  } else {
324
- removeDeviceFromList(device);
334
+ dispatch(
335
+ removeDeviceFromList(
336
+ device,
337
+ onDeviceDeselected,
338
+ onDeviceDisconnected
339
+ )
340
+ );
325
341
  }
326
342
 
327
343
  dispatch(setDisconnectedTime(Date.now()));
328
344
  } else {
329
- removeDeviceFromList(device);
345
+ dispatch(
346
+ removeDeviceFromList(
347
+ device,
348
+ onDeviceDeselected,
349
+ onDeviceDisconnected
350
+ )
351
+ );
330
352
  }
331
353
  }
332
354
  });
@@ -377,6 +399,13 @@ const getAutoSelectDeviceCLISerial = () => {
377
399
  return serialIndex > -1 ? argv[serialIndex + 1] : undefined;
378
400
  };
379
401
 
402
+ export const clearWaitForDevice = (): AppThunk => (dispatch, getState) => {
403
+ if (getState().deviceAutoSelect.autoReconnectTimeout) {
404
+ getState().deviceAutoSelect.onCancelTimeout?.();
405
+ }
406
+ dispatch(clearWaitForDeviceTimeout(true));
407
+ };
408
+
380
409
  /**
381
410
  * Stops watching for devices.
382
411
  *
@@ -386,7 +415,6 @@ export const stopWatchingDevices = () => {
386
415
  // Not sure, if this guard clause is really needed
387
416
  if (getDeviceLibContext() && hotplugTaskId !== null) {
388
417
  try {
389
- // @ts-expect-error Type will be updated in device-lib-js
390
418
  nrfDeviceLib.stopHotplugEvents(hotplugTaskId);
391
419
  hotplugTaskId = null;
392
420
  } catch (error) {
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import logger from '../logging';
7
7
  import describeError from '../logging/describeError';
8
- import { AppDispatch, RootState } from '../store';
8
+ import { AppThunk, RootState } from '../store';
9
9
  import {
10
10
  closeDeviceSetupDialog,
11
11
  openDeviceSetupDialog,
@@ -39,24 +39,18 @@ export interface DeviceSetup {
39
39
  description?: string;
40
40
  programDevice: (
41
41
  onProgress: (progress: number, message?: string) => void
42
- ) => (
43
- dispatch: AppDispatch,
44
- getState: () => RootState
45
- ) => Promise<Device>;
42
+ ) => AppThunk<RootState, Promise<Device>>;
46
43
  }[]; // The list of all firmware that can be applied for this device with the program function for that fw item
47
- isExpectedFirmware: (device: Device) => (
48
- dispatch: AppDispatch,
49
- getState: () => RootState
50
- ) => Promise<{
51
- device: Device;
52
- validFirmware: boolean;
53
- }>; // returns true if device has one of the expected firmware returned by getFirmwareOptions
44
+ isExpectedFirmware: (device: Device) => AppThunk<
45
+ RootState,
46
+ Promise<{
47
+ device: Device;
48
+ validFirmware: boolean;
49
+ }>
50
+ >; // returns true if device has one of the expected firmware returned by getFirmwareOptions
54
51
  tryToSwitchToApplicationMode: (
55
52
  device: Device
56
- ) => (
57
- dispatch: AppDispatch,
58
- getState: () => RootState
59
- ) => Promise<Device | null>; // returns the device after switched to app mode. If this is not possible or not relevant return null
53
+ ) => AppThunk<RootState, Promise<Device | null>>; // returns the device after switched to app mode. If this is not possible or not relevant return null
60
54
  }
61
55
 
62
56
  export interface DeviceSetupConfig {
@@ -74,8 +68,8 @@ export const prepareDevice =
74
68
  onFail: (reason?: unknown) => void,
75
69
  checkCurrentFirmwareVersion = true,
76
70
  requireUserConfirmation = true
77
- ) =>
78
- async (dispatch: AppDispatch) => {
71
+ ): AppThunk<RootState, Promise<void>> =>
72
+ async dispatch => {
79
73
  const onSuccessWrapper = (d: Device) => {
80
74
  onSuccess(d);
81
75
  dispatch(closeDeviceSetupDialog());
@@ -221,6 +215,7 @@ export const prepareDevice =
221
215
  message:
222
216
  deviceSetupConfig.choiceMessage ??
223
217
  'Which firmware do you want to program?',
218
+ choices,
224
219
  })
225
220
  );
226
221
  }
@@ -232,8 +227,8 @@ export const setupDevice =
232
227
  deviceSetupConfig: DeviceSetupConfig,
233
228
  onDeviceIsReady: (device: Device) => void,
234
229
  doDeselectDevice: () => void
235
- ) =>
236
- (dispatch: AppDispatch, getState: () => RootState) =>
230
+ ): AppThunk<RootState> =>
231
+ (dispatch, getState) =>
237
232
  dispatch(
238
233
  prepareDevice(
239
234
  device,
@@ -14,7 +14,7 @@ import nrfDeviceLib, {
14
14
  } from '@nordicsemiconductor/nrf-device-lib-js';
15
15
 
16
16
  import logger from '../logging';
17
- import type { AppDispatch, RootState } from '../store';
17
+ import type { AppThunk, RootState } from '../store';
18
18
  import { getDeviceLibContext } from './deviceLibWrapper';
19
19
  import { DeviceSetup, JprogEntry } from './deviceSetup';
20
20
  import { Device, setReadbackProtected } from './deviceSlice';
@@ -100,8 +100,8 @@ const programDeviceWithFw =
100
100
  device: Device,
101
101
  selectedFw: JprogEntry,
102
102
  onProgress: (progress: number, message?: string) => void
103
- ) =>
104
- async (dispatch: AppDispatch, getState: () => RootState) => {
103
+ ): AppThunk<RootState, Promise<Device>> =>
104
+ async (dispatch, getState) => {
105
105
  try {
106
106
  if (getState().device.readbackProtection === 'protected') {
107
107
  logger.info('Recovering device');
@@ -163,12 +163,12 @@ export const jprogDeviceSetup = (
163
163
  firmwareOptions(device, firmware).map(firmwareOption => ({
164
164
  key: firmwareOption.key,
165
165
  description: firmwareOption.description,
166
- programDevice: onProgress => (dispatch: AppDispatch) =>
166
+ programDevice: onProgress => dispatch =>
167
167
  dispatch(
168
168
  programDeviceWithFw(device, firmwareOption, onProgress)
169
169
  ),
170
170
  })),
171
- isExpectedFirmware: (device: Device) => (dispatch: AppDispatch) => {
171
+ isExpectedFirmware: (device: Device) => dispatch => {
172
172
  const fwVersions = firmwareOptions(device, firmware);
173
173
  if (fwVersions.length === 0) {
174
174
  return Promise.resolve({
@@ -11,7 +11,7 @@ import fs from 'fs';
11
11
  import MemoryMap from 'nrf-intel-hex';
12
12
 
13
13
  import logger from '../logging';
14
- import { AppDispatch } from '../store';
14
+ import { AppThunk, RootState } from '../store';
15
15
  import { getAppFile } from '../utils/appDirs';
16
16
  import { setWaitForDevice } from './deviceAutoSelectSlice';
17
17
  import { getDeviceLibContext } from './deviceLibWrapper';
@@ -87,8 +87,8 @@ const updateBootloader =
87
87
  onSuccess: (device: Device) => void,
88
88
  onFail: (reason?: unknown) => void,
89
89
  onProgress: (progress: number, message?: string) => void
90
- ) =>
91
- async (dispatch: AppDispatch) => {
90
+ ): AppThunk =>
91
+ async dispatch => {
92
92
  logger.info(`Update Bootloader ${device}`);
93
93
  const zip = new AdmZip(getAppFile(LATEST_BOOTLOADER));
94
94
  const zipBuffer = zip.toBuffer();
@@ -153,8 +153,8 @@ const switchToDeviceMode =
153
153
  mcuState: nrfDeviceLib.MCUState,
154
154
  onSuccess: (device: Device) => void,
155
155
  onFail: (reason?: unknown) => void
156
- ) =>
157
- (dispatch: AppDispatch) => {
156
+ ): AppThunk =>
157
+ dispatch => {
158
158
  nrfDeviceLib
159
159
  .deviceControlSetMcuState(
160
160
  getDeviceLibContext(),
@@ -183,8 +183,8 @@ export const switchToBootloaderMode =
183
183
  device: Device,
184
184
  onSuccess: (device: Device) => void,
185
185
  onFail: (reason?: unknown) => void
186
- ) =>
187
- (dispatch: AppDispatch) => {
186
+ ): AppThunk =>
187
+ dispatch => {
188
188
  if (!isDeviceInDFUBootloader(device)) {
189
189
  dispatch(
190
190
  switchToDeviceMode(
@@ -210,22 +210,28 @@ export const switchToApplicationMode =
210
210
  device: Device,
211
211
  onSuccess: (device: Device) => void,
212
212
  onFail: (reason?: unknown) => void
213
- ) =>
214
- (dispatch: AppDispatch) => {
215
- dispatch(
216
- switchToDeviceMode(
217
- device,
218
- 'NRFDL_MCU_STATE_APPLICATION',
219
- d => {
220
- if (isDeviceInDFUBootloader(d))
221
- onFail(
222
- new Error('Failed to switch to Application Mode')
223
- );
224
- else onSuccess(d);
225
- },
226
- onFail
227
- )
228
- );
213
+ ): AppThunk =>
214
+ dispatch => {
215
+ if (isDeviceInDFUBootloader(device)) {
216
+ dispatch(
217
+ switchToDeviceMode(
218
+ device,
219
+ 'NRFDL_MCU_STATE_APPLICATION',
220
+ d => {
221
+ if (isDeviceInDFUBootloader(d))
222
+ onFail(
223
+ new Error(
224
+ 'Failed to switch to Application Mode'
225
+ )
226
+ );
227
+ else onSuccess(d);
228
+ },
229
+ onFail
230
+ )
231
+ );
232
+ } else {
233
+ onSuccess(device);
234
+ }
229
235
  };
230
236
 
231
237
  const isLatestBootloader = async (device: Device) => {
@@ -253,8 +259,8 @@ const askAndUpdateBootloader =
253
259
  onSuccess: (device: Device) => void,
254
260
  onFail: (reason?: unknown) => void,
255
261
  onProgress: (progress: number, message?: string) => void
256
- ) =>
257
- (dispatch: AppDispatch) => {
262
+ ): AppThunk =>
263
+ dispatch => {
258
264
  dispatch(
259
265
  switchToBootloaderMode(
260
266
  device,
@@ -413,8 +419,8 @@ const programInDFUBootloader =
413
419
  onProgress: (progress: number, message?: string) => void,
414
420
  onSuccess: (device: Device) => void,
415
421
  onFail: (reason?: unknown) => void
416
- ) =>
417
- async (dispatch: AppDispatch) => {
422
+ ): AppThunk<RootState, Promise<void>> =>
423
+ async dispatch => {
418
424
  logger.debug(
419
425
  `${device.serialNumber} on ${device.serialport?.comName} is now in DFU-Bootloader...`
420
426
  );
@@ -526,8 +532,8 @@ const programDeviceWithFw =
526
532
  device: Device,
527
533
  selectedFw: DfuEntry,
528
534
  onProgress: (progress: number, message?: string) => void
529
- ) =>
530
- (dispatch: AppDispatch) =>
535
+ ): AppThunk<RootState, Promise<Device>> =>
536
+ dispatch =>
531
537
  new Promise<Device>((resolve, reject) => {
532
538
  const action = (d: Device) => {
533
539
  dispatch(
@@ -560,7 +566,7 @@ export const sdfuDeviceSetup = (
560
566
  dfuFirmware.map(firmwareOption => ({
561
567
  key: firmwareOption.key,
562
568
  description: firmwareOption.description,
563
- programDevice: onProgress => (dispatch: AppDispatch) =>
569
+ programDevice: onProgress => dispatch =>
564
570
  dispatch(
565
571
  programDeviceWithFw(device, firmwareOption, onProgress)
566
572
  ),
@@ -577,12 +583,12 @@ export const sdfuDeviceSetup = (
577
583
 
578
584
  const { semVer } = device.dfuTriggerVersion;
579
585
 
580
- if (dfuFirmware.filter(fw => fw.semver === semVer).length > 0) {
581
- resolve({
582
- device,
583
- validFirmware: true,
584
- });
585
- }
586
+ resolve({
587
+ device,
588
+ validFirmware:
589
+ dfuFirmware.filter(fw => fw.semver === semVer).length >
590
+ 0,
591
+ });
586
592
  } else {
587
593
  resolve({
588
594
  device,
@@ -590,7 +596,7 @@ export const sdfuDeviceSetup = (
590
596
  });
591
597
  }
592
598
  }),
593
- tryToSwitchToApplicationMode: device => (dispatch: AppDispatch) =>
599
+ tryToSwitchToApplicationMode: device => dispatch =>
594
600
  new Promise<Device>((resolve, reject) => {
595
601
  dispatch(switchToApplicationMode(device, resolve, reject));
596
602
  }),
@@ -52,9 +52,5 @@
52
52
  flex-direction: row-reverse;
53
53
  justify-content: end;
54
54
  display: flex;
55
-
56
- button {
57
- padding: 0 16px;
58
- }
59
55
  }
60
56
  }
@@ -1,83 +1,15 @@
1
1
  /*
2
- * Copyright (c) 2015 Nordic Semiconductor ASA
2
+ * Copyright (c) 2023 Nordic Semiconductor ASA
3
3
  *
4
4
  * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
5
  */
6
6
 
7
7
  @import '../../styles';
8
8
 
9
- $dropdown-item-height: 24px; //px unit dependency in dropdown.tsx
10
-
11
- :export {
12
- dropdownItemHeight: $dropdown-item-height;
13
- }
14
-
15
- .container {
16
- position: relative;
17
- width: 100%;
18
- }
19
-
20
- .label {
21
- font-size: 12px;
22
- margin-bottom: 4px !important;
23
- }
24
-
25
- .btn {
26
- width: 100%;
27
- height: 32px;
28
- padding: 0 8px;
29
- background: $gray-700;
30
- color: $white;
31
- display: flex;
32
- justify-content: space-between;
33
- align-items: center;
34
- border: none;
35
- }
36
-
37
- .mdi {
38
- font-size: 18px;
39
- }
40
-
41
- .btnActive .mdi {
42
- transform: rotate(180deg);
43
- }
44
-
45
9
  .content {
46
- background: $gray-700;
47
- color: $white;
48
- position: absolute;
49
- width: 100%;
50
- right: 0;
51
- padding: 0;
52
- border-top: solid 2px $gray-600;
53
- z-index: 2;
54
-
55
10
  &[data-height='true'] {
56
- overflow-y: scroll; // Make Scroll Fixed Height Scrolable
11
+ overflow-y: scroll; // Make Scroll Fixed Height Scrollable
57
12
 
58
13
  @include scrollbars($gray-700);
59
14
  }
60
15
  }
61
-
62
- .itemsInactive {
63
- display: none;
64
- }
65
-
66
- .item {
67
- color: $white;
68
- padding: 4px 8px;
69
- height: $dropdown-item-height;
70
- background-color: transparent;
71
- border: 0;
72
- width: 100%;
73
- text-align: inherit;
74
- display: block;
75
- clear: both;
76
- font-weight: 400;
77
- white-space: nowrap;
78
- }
79
-
80
- .item:hover,
81
- .item:focus {
82
- background: $gray-600;
83
- }
@@ -7,6 +7,8 @@
7
7
  import React, { useState } from 'react';
8
8
  import FormLabel from 'react-bootstrap/FormLabel';
9
9
 
10
+ import classNames from '../utils/classNames';
11
+
10
12
  import styles from './Dropdown.module.scss';
11
13
 
12
14
  export interface DropdownItem {
@@ -22,6 +24,7 @@ export interface DropdownProps {
22
24
  disabled?: boolean;
23
25
  selectedItem: DropdownItem;
24
26
  numItemsBeforeScroll?: number;
27
+ className?: string;
25
28
  }
26
29
 
27
30
  export default ({
@@ -32,6 +35,7 @@ export default ({
32
35
  disabled = false,
33
36
  selectedItem,
34
37
  numItemsBeforeScroll = 0,
38
+ className = '',
35
39
  }: DropdownProps) => {
36
40
  const [isActive, setIsActive] = useState(false);
37
41
 
@@ -42,20 +46,20 @@ export default ({
42
46
 
43
47
  return (
44
48
  <div
45
- className={styles.container}
49
+ className={`tw-preflight tw-relative tw-w-full ${className}`}
46
50
  onBlur={event => {
47
51
  if (!event.currentTarget.contains(event.relatedTarget)) {
48
52
  setIsActive(false);
49
53
  }
50
54
  }}
51
55
  >
52
- {label && <FormLabel className={styles.label}>{label}</FormLabel>}
56
+ {label && (
57
+ <FormLabel className="tw-mb-1 tw-text-xs">{label}</FormLabel>
58
+ )}
53
59
  <button
54
60
  id={id}
55
61
  type="button"
56
- className={`${styles.btn} ${
57
- isActive ? styles.btnActive : styles.btnInactive
58
- }`}
62
+ className="tw-flex tw-h-8 tw-w-full tw-items-center tw-justify-between tw-border-0 tw-bg-gray-700 tw-px-2 tw-text-white"
59
63
  onClick={() => setIsActive(!isActive)}
60
64
  disabled={disabled}
61
65
  >
@@ -64,7 +68,11 @@ export default ({
64
68
  ? ''
65
69
  : selectedItem.label}
66
70
  </span>
67
- <span className={`mdi mdi-chevron-down ${styles.mdi}`} />
71
+ <span
72
+ className={`mdi mdi-chevron-down tw-text-lg ${classNames(
73
+ isActive && 'tw-rotate-180'
74
+ )}`}
75
+ />
68
76
  </button>
69
77
  {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- We need an interactive handler as described below */}
70
78
  <div
@@ -75,10 +83,7 @@ export default ({
75
83
  style={
76
84
  numItemsBeforeScroll > 0
77
85
  ? {
78
- maxHeight: `${
79
- numItemsBeforeScroll *
80
- Number.parseInt(styles.dropdownItemHeight, 10)
81
- }px`,
86
+ maxHeight: `${numItemsBeforeScroll * 24}px`,
82
87
  }
83
88
  : {}
84
89
  }
@@ -86,14 +91,15 @@ export default ({
86
91
  numItemsBeforeScroll > 0 &&
87
92
  items.length > numItemsBeforeScroll
88
93
  }
89
- className={`${styles.content} ${
90
- isActive ? styles.itemsActive : styles.itemsInactive
91
- }`}
94
+ className={`tw-text-while tw-absolute tw-right-0 tw-z-10 tw-w-full tw-border-t-2 tw-border-solid tw-border-gray-600 tw-bg-gray-700 tw-p-0 ${classNames(
95
+ styles.content,
96
+ !isActive && 'tw-hidden'
97
+ )}`}
92
98
  >
93
99
  {items.map(item => (
94
100
  <button
95
101
  type="button"
96
- className={styles.item}
102
+ className="tw-bg-transparent tw-clear-both tw-block tw-h-6 tw-w-full tw-whitespace-nowrap tw-border-0 tw-px-2 tw-py-1 tw-text-left tw-font-normal tw-text-white hover:tw-bg-gray-600 focus:tw-bg-gray-600"
97
103
  key={item.value}
98
104
  onClick={() => onClickItem(item)}
99
105
  >
@@ -5,23 +5,16 @@
5
5
  */
6
6
 
7
7
  import React from 'react';
8
- import reactGA from 'react-ga';
9
- import { fireEvent, screen, waitFor } from '@testing-library/react';
8
+ import { fireEvent, screen } from '@testing-library/react';
10
9
 
11
10
  import render from '../../test/testrenderer';
12
11
  import { getAppSpecificStore as store } from '../utils/persistentStore';
13
12
  import { generateSystemReport } from '../utils/systemReport';
14
13
  import ErrorBoundary from './ErrorBoundary';
15
14
 
16
- const mockReactGA = reactGA;
17
-
18
15
  jest.mock('../utils/systemReport');
19
- jest.mock('react-ga');
20
16
  jest.mock('../utils/usageData', () => ({
21
17
  ...jest.requireActual('../utils/usageData'),
22
- init: jest.fn(() => {
23
- mockReactGA.initialize('');
24
- }),
25
18
  sendErrorReport: jest.fn(),
26
19
  isEnabled: () => true,
27
20
  }));
@@ -50,16 +43,6 @@ describe('ErrorBoundary', () => {
50
43
  jest.clearAllMocks();
51
44
  });
52
45
 
53
- it('should send GA event', async () => {
54
- render(
55
- <ErrorBoundary>
56
- <Child />
57
- </ErrorBoundary>
58
- );
59
-
60
- await waitFor(() => expect(reactGA.initialize).toHaveBeenCalled());
61
- });
62
-
63
46
  it('can take custom reporting functions', () => {
64
47
  const sendUsageData = jest.fn();
65
48