@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.
- package/Changelog.md +222 -5
- package/config/colors.js +46 -0
- package/config/tailwind.config.js +25 -0
- package/config/tsconfig.json +2 -1
- package/dist/bootstrap.css +8951 -0
- package/package.json +28 -10
- package/scripts/esbuild-renderer.js +25 -17
- package/scripts/nordic-publish.js +89 -0
- package/src/About/About.tsx +9 -3
- package/src/About/ApplicationCard.tsx +20 -22
- package/src/About/DeviceCard.tsx +28 -26
- package/src/About/DocumentationCard.tsx +12 -9
- package/src/About/Section.tsx +5 -5
- package/src/About/SupportCard.tsx +61 -56
- package/src/App/App.tsx +36 -11
- package/src/App/appLayout.ts +0 -1
- package/src/App/preflight.scss +443 -0
- package/src/App/tailwind.css +12 -0
- package/src/Button/Button.tsx +34 -24
- package/src/Device/DeviceSelector/DeviceSelector.tsx +5 -2
- package/src/Device/DeviceSetup/DeviceSetupView.tsx +6 -3
- package/src/Device/deviceAutoSelectSlice.ts +14 -8
- package/src/Device/deviceLibWrapper.ts +0 -1
- package/src/Device/deviceLister.ts +68 -40
- package/src/Device/deviceSetup.ts +15 -20
- package/src/Device/jprogOperations.ts +5 -5
- package/src/Device/sdfuOperations.ts +43 -37
- package/src/Dialog/dialog.scss +0 -4
- package/src/Dropdown/Dropdown.module.scss +2 -70
- package/src/Dropdown/Dropdown.tsx +20 -14
- package/src/ErrorBoundary/ErrorBoundary.test.tsx +1 -18
- package/src/FlashMessage/FlashMessage.tsx +159 -0
- package/src/FlashMessage/FlashMessageSlice.ts +88 -0
- package/src/FlashMessage/flashMessage.css +32 -0
- package/src/NavBar/NavMenu.tsx +1 -2
- package/src/NavBar/NavMenuItem.tsx +5 -7
- package/src/NavBar/nav-bar.scss +2 -1
- package/src/NavBar/nav-menu-item.scss +0 -5
- package/src/NumberInputWithSlider/NumberInputSliderWithUnit.tsx +74 -0
- package/src/Panes/FeedbackPane.tsx +83 -48
- package/src/SerialPort/ConflictingSettingsDialog.tsx +50 -66
- package/src/StateSelector/StateSelector.tsx +1 -1
- package/src/Stepper/Stepper.tsx +2 -3
- package/src/index.ts +14 -3
- package/src/store.ts +10 -3
- package/src/utils/colors.ts +147 -12
- package/src/utils/usageData.ts +59 -52
- package/src/utils/useFocusedOnVisible.ts +26 -0
- package/src/variables.scss +5 -5
- package/typings/generated/main/index.d.ts +1 -0
- package/typings/generated/main/index.d.ts.map +1 -0
- package/typings/generated/src/About/About.d.ts +6 -2
- package/typings/generated/src/About/About.d.ts.map +1 -0
- package/typings/generated/src/About/AboutButton.d.ts +1 -0
- package/typings/generated/src/About/AboutButton.d.ts.map +1 -0
- package/typings/generated/src/About/ApplicationCard.d.ts +1 -0
- package/typings/generated/src/About/ApplicationCard.d.ts.map +1 -0
- package/typings/generated/src/About/DeviceCard.d.ts +1 -0
- package/typings/generated/src/About/DeviceCard.d.ts.map +1 -0
- package/typings/generated/src/About/DocumentationCard.d.ts +5 -2
- package/typings/generated/src/About/DocumentationCard.d.ts.map +1 -0
- package/typings/generated/src/About/DocumentationSection.d.ts +1 -0
- package/typings/generated/src/About/DocumentationSection.d.ts.map +1 -0
- package/typings/generated/src/About/Section.d.ts +1 -1
- package/typings/generated/src/About/Section.d.ts.map +1 -0
- package/typings/generated/src/About/ShortcutButton.d.ts +1 -0
- package/typings/generated/src/About/ShortcutButton.d.ts.map +1 -0
- package/typings/generated/src/About/SupportCard.d.ts +1 -0
- package/typings/generated/src/About/SupportCard.d.ts.map +1 -0
- package/typings/generated/src/About/shortcutSlice.d.ts +1 -0
- package/typings/generated/src/About/shortcutSlice.d.ts.map +1 -0
- package/typings/generated/src/Alert/Alert.d.ts +1 -0
- package/typings/generated/src/Alert/Alert.d.ts.map +1 -0
- package/typings/generated/src/App/App.d.ts +4 -0
- package/typings/generated/src/App/App.d.ts.map +1 -0
- package/typings/generated/src/App/App.test.d.ts +1 -0
- package/typings/generated/src/App/App.test.d.ts.map +1 -0
- package/typings/generated/src/App/ConnectedToStore.d.ts +1 -0
- package/typings/generated/src/App/ConnectedToStore.d.ts.map +1 -0
- package/typings/generated/src/App/VisibilityBar.d.ts +1 -0
- package/typings/generated/src/App/VisibilityBar.d.ts.map +1 -0
- package/typings/generated/src/App/appLayout.d.ts +1 -1
- package/typings/generated/src/App/appLayout.d.ts.map +1 -0
- package/typings/generated/src/Button/Button.d.ts +2 -1
- package/typings/generated/src/Button/Button.d.ts.map +1 -0
- package/typings/generated/src/Card/Card.d.ts +1 -0
- package/typings/generated/src/Card/Card.d.ts.map +1 -0
- package/typings/generated/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.d.ts +1 -0
- package/typings/generated/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.d.ts.map +1 -0
- package/typings/generated/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.d.ts +1 -0
- package/typings/generated/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceIcon.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceIcon.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/AnimatedList.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/AnimatedList.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/BrokenDevice.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/BrokenDevice.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/RenameDevice.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/RenameDevice.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.test.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.test.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/SelectDevice.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/SelectDevice.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/SelectedDevice.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/SelectedDevice.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSetup/DeviceSetupView.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSetup/DeviceSetupView.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceAutoSelectSlice.d.ts +3 -1
- package/typings/generated/src/Device/deviceAutoSelectSlice.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +1 -0
- package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceLibWrapper.d.ts +1 -0
- package/typings/generated/src/Device/deviceLibWrapper.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceLibWrapper.test.d.ts +1 -0
- package/typings/generated/src/Device/deviceLibWrapper.test.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceLister.d.ts +4 -2
- package/typings/generated/src/Device/deviceLister.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceLister.test.d.ts +1 -0
- package/typings/generated/src/Device/deviceLister.test.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceSetup.d.ts +8 -7
- package/typings/generated/src/Device/deviceSetup.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceSetupSlice.d.ts +1 -0
- package/typings/generated/src/Device/deviceSetupSlice.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceSlice.d.ts +1 -0
- package/typings/generated/src/Device/deviceSlice.d.ts.map +1 -0
- package/typings/generated/src/Device/dfu-cc.d.ts +1 -0
- package/typings/generated/src/Device/dfu-cc.d.ts.map +1 -0
- package/typings/generated/src/Device/initPacket.d.ts +1 -0
- package/typings/generated/src/Device/initPacket.d.ts.map +1 -0
- package/typings/generated/src/Device/jprogOperations.d.ts +1 -0
- package/typings/generated/src/Device/jprogOperations.d.ts.map +1 -0
- package/typings/generated/src/Device/sdfuOperations.d.ts +4 -3
- package/typings/generated/src/Device/sdfuOperations.d.ts.map +1 -0
- package/typings/generated/src/Dialog/Dialog.d.ts +1 -0
- package/typings/generated/src/Dialog/Dialog.d.ts.map +1 -0
- package/typings/generated/src/Dialog/Dialog.test.d.ts +1 -0
- package/typings/generated/src/Dialog/Dialog.test.d.ts.map +1 -0
- package/typings/generated/src/Dropdown/Dropdown.d.ts +3 -1
- package/typings/generated/src/Dropdown/Dropdown.d.ts.map +1 -0
- package/typings/generated/src/Dropdown/Dropdown.test.d.ts +1 -0
- package/typings/generated/src/Dropdown/Dropdown.test.d.ts.map +1 -0
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +1 -0
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts.map +1 -0
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.test.d.ts +1 -0
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.test.d.ts.map +1 -0
- package/typings/generated/src/ErrorDialog/ErrorDialog.d.ts +1 -0
- package/typings/generated/src/ErrorDialog/ErrorDialog.d.ts.map +1 -0
- package/typings/generated/src/ErrorDialog/ErrorDialog.test.d.ts +1 -0
- package/typings/generated/src/ErrorDialog/ErrorDialog.test.d.ts.map +1 -0
- package/typings/generated/src/ErrorDialog/errorDialogSlice.d.ts +1 -0
- package/typings/generated/src/ErrorDialog/errorDialogSlice.d.ts.map +1 -0
- package/typings/generated/src/ErrorDialog/errorDialogSlice.test.d.ts +1 -0
- package/typings/generated/src/ErrorDialog/errorDialogSlice.test.d.ts.map +1 -0
- package/typings/generated/src/FactoryReset/FactoryResetButton.d.ts +1 -0
- package/typings/generated/src/FactoryReset/FactoryResetButton.d.ts.map +1 -0
- package/typings/generated/src/FactoryReset/FactoryResetButton.test.d.ts +1 -0
- package/typings/generated/src/FactoryReset/FactoryResetButton.test.d.ts.map +1 -0
- package/typings/generated/src/FlashMessage/FlashMessage.d.ts +5 -0
- package/typings/generated/src/FlashMessage/FlashMessage.d.ts.map +1 -0
- package/typings/generated/src/FlashMessage/FlashMessageSlice.d.ts +20 -0
- package/typings/generated/src/FlashMessage/FlashMessageSlice.d.ts.map +1 -0
- package/typings/generated/src/InlineInput/InlineInput.d.ts +1 -0
- package/typings/generated/src/InlineInput/InlineInput.d.ts.map +1 -0
- package/typings/generated/src/InlineInput/NumberInlineInput.d.ts +1 -0
- package/typings/generated/src/InlineInput/NumberInlineInput.d.ts.map +1 -0
- package/typings/generated/src/Log/LogEntry.d.ts +1 -0
- package/typings/generated/src/Log/LogEntry.d.ts.map +1 -0
- package/typings/generated/src/Log/LogViewer.d.ts +1 -0
- package/typings/generated/src/Log/LogViewer.d.ts.map +1 -0
- package/typings/generated/src/Log/logSlice.d.ts +1 -0
- package/typings/generated/src/Log/logSlice.d.ts.map +1 -0
- package/typings/generated/src/Log/syncLogToStore.d.ts +1 -0
- package/typings/generated/src/Log/syncLogToStore.d.ts.map +1 -0
- package/typings/generated/src/Logo/Logo.d.ts +1 -0
- package/typings/generated/src/Logo/Logo.d.ts.map +1 -0
- package/typings/generated/src/Main/Main.d.ts +1 -0
- package/typings/generated/src/Main/Main.d.ts.map +1 -0
- package/typings/generated/src/MasonryLayout/MasonryLayout.d.ts +1 -0
- package/typings/generated/src/MasonryLayout/MasonryLayout.d.ts.map +1 -0
- package/typings/generated/src/NavBar/NavBar.d.ts +1 -0
- package/typings/generated/src/NavBar/NavBar.d.ts.map +1 -0
- package/typings/generated/src/NavBar/NavMenu.d.ts +1 -0
- package/typings/generated/src/NavBar/NavMenu.d.ts.map +1 -0
- package/typings/generated/src/NavBar/NavMenu.test.d.ts +1 -0
- package/typings/generated/src/NavBar/NavMenu.test.d.ts.map +1 -0
- package/typings/generated/src/NavBar/NavMenuItem.d.ts +1 -1
- package/typings/generated/src/NavBar/NavMenuItem.d.ts.map +1 -0
- package/typings/generated/src/NumberInputWithSlider/NumberInputSliderWithUnit.d.ts +14 -0
- package/typings/generated/src/NumberInputWithSlider/NumberInputSliderWithUnit.d.ts.map +1 -0
- package/typings/generated/src/OpenApp/openApp.d.ts +1 -0
- package/typings/generated/src/OpenApp/openApp.d.ts.map +1 -0
- package/typings/generated/src/Panes/FeedbackPane.d.ts +5 -1
- package/typings/generated/src/Panes/FeedbackPane.d.ts.map +1 -0
- package/typings/generated/src/PseudoButton/PseudoButton.d.ts +1 -0
- package/typings/generated/src/PseudoButton/PseudoButton.d.ts.map +1 -0
- package/typings/generated/src/SerialPort/ConflictingSettingsDialog.d.ts +1 -0
- package/typings/generated/src/SerialPort/ConflictingSettingsDialog.d.ts.map +1 -0
- package/typings/generated/src/SerialPort/SerialPort.d.ts +1 -0
- package/typings/generated/src/SerialPort/SerialPort.d.ts.map +1 -0
- package/typings/generated/src/SerialPort/SerialPort.test.d.ts +1 -0
- package/typings/generated/src/SerialPort/SerialPort.test.d.ts.map +1 -0
- package/typings/generated/src/Shortcuts/ShortcutItem.d.ts +1 -0
- package/typings/generated/src/Shortcuts/ShortcutItem.d.ts.map +1 -0
- package/typings/generated/src/Shortcuts/ShortcutModal.d.ts +1 -0
- package/typings/generated/src/Shortcuts/ShortcutModal.d.ts.map +1 -0
- package/typings/generated/src/SidePanel/Group.d.ts +1 -0
- package/typings/generated/src/SidePanel/Group.d.ts.map +1 -0
- package/typings/generated/src/SidePanel/SidePanel.d.ts +1 -0
- package/typings/generated/src/SidePanel/SidePanel.d.ts.map +1 -0
- package/typings/generated/src/Slider/Bar.d.ts +1 -0
- package/typings/generated/src/Slider/Bar.d.ts.map +1 -0
- package/typings/generated/src/Slider/Factor.test.d.ts +1 -0
- package/typings/generated/src/Slider/Factor.test.d.ts.map +1 -0
- package/typings/generated/src/Slider/Handle.d.ts +1 -0
- package/typings/generated/src/Slider/Handle.d.ts.map +1 -0
- package/typings/generated/src/Slider/Slider.d.ts +1 -0
- package/typings/generated/src/Slider/Slider.d.ts.map +1 -0
- package/typings/generated/src/Slider/Slider.test.d.ts +1 -0
- package/typings/generated/src/Slider/Slider.test.d.ts.map +1 -0
- package/typings/generated/src/Slider/Ticks.d.ts +1 -0
- package/typings/generated/src/Slider/Ticks.d.ts.map +1 -0
- package/typings/generated/src/Slider/factor.d.ts +1 -0
- package/typings/generated/src/Slider/factor.d.ts.map +1 -0
- package/typings/generated/src/Slider/percentage.d.ts +1 -0
- package/typings/generated/src/Slider/percentage.d.ts.map +1 -0
- package/typings/generated/src/Slider/range.d.ts +1 -0
- package/typings/generated/src/Slider/range.d.ts.map +1 -0
- package/typings/generated/src/StartStopButton/StartStopButton.d.ts +1 -0
- package/typings/generated/src/StartStopButton/StartStopButton.d.ts.map +1 -0
- package/typings/generated/src/StateSelector/StateSelector.d.ts +1 -0
- package/typings/generated/src/StateSelector/StateSelector.d.ts.map +1 -0
- package/typings/generated/src/Stepper/Stepper.d.ts +1 -0
- package/typings/generated/src/Stepper/Stepper.d.ts.map +1 -0
- package/typings/generated/src/Toggle/Toggle.d.ts +1 -0
- package/typings/generated/src/Toggle/Toggle.d.ts.map +1 -0
- package/typings/generated/src/index.d.ts +8 -4
- package/typings/generated/src/index.d.ts.map +1 -0
- package/typings/generated/src/logging/appTransport.d.ts +1 -0
- package/typings/generated/src/logging/appTransport.d.ts.map +1 -0
- package/typings/generated/src/logging/appTransport.test.d.ts +1 -0
- package/typings/generated/src/logging/appTransport.test.d.ts.map +1 -0
- package/typings/generated/src/logging/describeError.d.ts +1 -0
- package/typings/generated/src/logging/describeError.d.ts.map +1 -0
- package/typings/generated/src/logging/describeError.test.d.ts +1 -0
- package/typings/generated/src/logging/describeError.test.d.ts.map +1 -0
- package/typings/generated/src/logging/index.d.ts +1 -0
- package/typings/generated/src/logging/index.d.ts.map +1 -0
- package/typings/generated/src/logging/logBuffer.d.ts +1 -0
- package/typings/generated/src/logging/logBuffer.d.ts.map +1 -0
- package/typings/generated/src/logging/logBuffer.test.d.ts +1 -0
- package/typings/generated/src/logging/logBuffer.test.d.ts.map +1 -0
- package/typings/generated/src/logging/sendInitialLogMessages.d.ts +1 -0
- package/typings/generated/src/logging/sendInitialLogMessages.d.ts.map +1 -0
- package/typings/generated/src/store.d.ts +21 -18
- package/typings/generated/src/store.d.ts.map +1 -0
- package/typings/generated/src/utils/AppTypes.d.ts +1 -0
- package/typings/generated/src/utils/AppTypes.d.ts.map +1 -0
- package/typings/generated/src/utils/appDirs.d.ts +1 -0
- package/typings/generated/src/utils/appDirs.d.ts.map +1 -0
- package/typings/generated/src/utils/bleChannels.d.ts +1 -0
- package/typings/generated/src/utils/bleChannels.d.ts.map +1 -0
- package/typings/generated/src/utils/classNames.d.ts +1 -0
- package/typings/generated/src/utils/classNames.d.ts.map +1 -0
- package/typings/generated/src/utils/classNames.test.d.ts +1 -0
- package/typings/generated/src/utils/classNames.test.d.ts.map +1 -0
- package/typings/generated/src/utils/colors.d.ts +126 -3
- package/typings/generated/src/utils/colors.d.ts.map +1 -0
- package/typings/generated/src/utils/describeVersion.d.ts +1 -0
- package/typings/generated/src/utils/describeVersion.d.ts.map +1 -0
- package/typings/generated/src/utils/environment.d.ts +1 -0
- package/typings/generated/src/utils/environment.d.ts.map +1 -0
- package/typings/generated/src/utils/logLibVersions.d.ts +1 -0
- package/typings/generated/src/utils/logLibVersions.d.ts.map +1 -0
- package/typings/generated/src/utils/open.d.ts +1 -0
- package/typings/generated/src/utils/open.d.ts.map +1 -0
- package/typings/generated/src/utils/packageJson.d.ts +1 -0
- package/typings/generated/src/utils/packageJson.d.ts.map +1 -0
- package/typings/generated/src/utils/persistentStore.d.ts +1 -0
- package/typings/generated/src/utils/persistentStore.d.ts.map +1 -0
- package/typings/generated/src/utils/systemReport.d.ts +1 -0
- package/typings/generated/src/utils/systemReport.d.ts.map +1 -0
- package/typings/generated/src/utils/truncateMiddle.d.ts +1 -0
- package/typings/generated/src/utils/truncateMiddle.d.ts.map +1 -0
- package/typings/generated/src/utils/truncateMiddle.test.d.ts +1 -0
- package/typings/generated/src/utils/truncateMiddle.test.d.ts.map +1 -0
- package/typings/generated/src/utils/usageData.d.ts +4 -3
- package/typings/generated/src/utils/usageData.d.ts.map +1 -0
- package/typings/generated/src/utils/useFocusedOnVisible.d.ts +11 -0
- package/typings/generated/src/utils/useFocusedOnVisible.d.ts.map +1 -0
- package/typings/generated/src/utils/useHotKey.d.ts +1 -0
- package/typings/generated/src/utils/useHotKey.d.ts.map +1 -0
- package/typings/generated/src/utils/useStopwatch.d.ts +1 -0
- package/typings/generated/src/utils/useStopwatch.d.ts.map +1 -0
- package/typings/generated/src/utils/useStopwatch.test.d.ts +1 -0
- package/typings/generated/src/utils/useStopwatch.test.d.ts.map +1 -0
- package/typings/generated/test/dispatchTo.d.ts +1 -0
- package/typings/generated/test/dispatchTo.d.ts.map +1 -0
- package/typings/generated/test/testrenderer.d.ts +1 -0
- package/typings/generated/test/testrenderer.d.ts.map +1 -0
- package/.github/ISSUE_TEMPLATE/custom.md +0 -10
- package/.husky/pre-push +0 -3
- package/.renovaterc.json +0 -10
- package/azure-pipelines.yml +0 -34
- package/jest.config.js +0 -7
- package/src/About/documentationSlice.ts +0 -41
- package/src/About/section.scss +0 -15
- package/src/Button/button.module.scss +0 -154
- package/tsconfig.json +0 -9
- package/typings/generated/src/About/documentationSlice.d.ts +0 -12
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
8
|
+
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
|
9
|
+
import React, { useRef, useState } from 'react';
|
|
10
|
+
import { useDispatch, useSelector } from 'react-redux';
|
|
11
|
+
import { mdiClose } from '@mdi/js';
|
|
12
|
+
import Icon from '@mdi/react';
|
|
13
|
+
|
|
14
|
+
import classNames from '../utils/classNames';
|
|
15
|
+
import { colors } from '../utils/colors';
|
|
16
|
+
import { FlashMessage, getMessages, removeMessage } from './FlashMessageSlice';
|
|
17
|
+
|
|
18
|
+
import './flashMessage.css';
|
|
19
|
+
|
|
20
|
+
const SLIDE_IN_DURATION_MS = 300;
|
|
21
|
+
const SLIDE_IN_ANIMATION = `${SLIDE_IN_DURATION_MS}ms slide-in`;
|
|
22
|
+
|
|
23
|
+
const SLIDE_OUT_DURATION_MS = 1000;
|
|
24
|
+
const SLIDE_OUT_ANIMATION = (dismissTime: number) =>
|
|
25
|
+
`${SLIDE_OUT_DURATION_MS}ms slide-out ${
|
|
26
|
+
dismissTime - SLIDE_OUT_DURATION_MS
|
|
27
|
+
}ms`;
|
|
28
|
+
|
|
29
|
+
const LOADER_ANIMATION = (dismissTime: number) =>
|
|
30
|
+
`${
|
|
31
|
+
dismissTime - SLIDE_OUT_DURATION_MS
|
|
32
|
+
}ms flash-message-loader linear forwards`;
|
|
33
|
+
|
|
34
|
+
interface FlashMessageProps {
|
|
35
|
+
flashMessage: FlashMessage;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const FlashMessage = ({ flashMessage }: FlashMessageProps) => {
|
|
39
|
+
const { id, message, variant, dismissTime } = flashMessage;
|
|
40
|
+
|
|
41
|
+
const dispatch = useDispatch();
|
|
42
|
+
const divRef = useRef(null);
|
|
43
|
+
const [fadeoutTimer, setFadeoutTimer] = useState<string>(
|
|
44
|
+
dismissTime == null ? 'unset' : `${dismissTime}ms`
|
|
45
|
+
);
|
|
46
|
+
const timeoutHandler = useRef<NodeJS.Timeout | undefined>(undefined);
|
|
47
|
+
|
|
48
|
+
if (timeoutHandler.current == null && dismissTime != null) {
|
|
49
|
+
timeoutHandler.current = setTimeout(() => {
|
|
50
|
+
dispatch(removeMessage(id));
|
|
51
|
+
}, dismissTime);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const close = () => {
|
|
55
|
+
clearTimeout(timeoutHandler.current);
|
|
56
|
+
dispatch(removeMessage(id));
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const addFadeout = () => {
|
|
60
|
+
if (dismissTime) {
|
|
61
|
+
timeoutHandler.current = setTimeout(() => {
|
|
62
|
+
dispatch(removeMessage(id));
|
|
63
|
+
}, dismissTime);
|
|
64
|
+
setFadeoutTimer(`${dismissTime}ms`);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const removeFadeout = () => {
|
|
69
|
+
clearTimeout(timeoutHandler.current);
|
|
70
|
+
setFadeoutTimer('unset');
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const initialRender = () => divRef.current == null;
|
|
74
|
+
|
|
75
|
+
return (
|
|
76
|
+
<div
|
|
77
|
+
ref={divRef}
|
|
78
|
+
className={`tw-flex tw-w-full tw-flex-col tw-justify-between tw-p-4 tw-text-white ${classNames(
|
|
79
|
+
variant === 'error' && 'tw-bg-red',
|
|
80
|
+
variant === 'success' && 'tw-bg-green',
|
|
81
|
+
variant === 'info' && 'tw-bg-nordicBlue',
|
|
82
|
+
variant === 'warning' && 'tw-bg-orange'
|
|
83
|
+
)}`}
|
|
84
|
+
style={{
|
|
85
|
+
zIndex: 1000,
|
|
86
|
+
animation:
|
|
87
|
+
fadeoutTimer !== 'unset'
|
|
88
|
+
? flashMessageAnimations(initialRender(), dismissTime)
|
|
89
|
+
: 'unset',
|
|
90
|
+
}}
|
|
91
|
+
onMouseEnter={removeFadeout}
|
|
92
|
+
onMouseLeave={addFadeout}
|
|
93
|
+
>
|
|
94
|
+
<div className="tw-flex tw-w-full tw-justify-between">
|
|
95
|
+
{message}
|
|
96
|
+
<div onClick={close}>
|
|
97
|
+
<Icon path={mdiClose} size={0.8} />
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
{dismissTime != null ? (
|
|
101
|
+
<div
|
|
102
|
+
style={{
|
|
103
|
+
backgroundColor: colors.white,
|
|
104
|
+
width: 'calc(100% + 32px)',
|
|
105
|
+
height: '2px',
|
|
106
|
+
margin: '-16px',
|
|
107
|
+
marginTop: '8px',
|
|
108
|
+
animation:
|
|
109
|
+
fadeoutTimer !== 'unset'
|
|
110
|
+
? LOADER_ANIMATION(dismissTime)
|
|
111
|
+
: 'unset',
|
|
112
|
+
}}
|
|
113
|
+
/>
|
|
114
|
+
) : null}
|
|
115
|
+
</div>
|
|
116
|
+
);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const FlashMessages = () => {
|
|
120
|
+
const messages = useSelector(getMessages);
|
|
121
|
+
|
|
122
|
+
if (messages.length === 0) return null;
|
|
123
|
+
|
|
124
|
+
return (
|
|
125
|
+
<div
|
|
126
|
+
style={{
|
|
127
|
+
position: 'absolute',
|
|
128
|
+
bottom: '32px',
|
|
129
|
+
right: '16px',
|
|
130
|
+
width: '256px',
|
|
131
|
+
gap: '16px',
|
|
132
|
+
display: 'flex',
|
|
133
|
+
flexDirection: 'column-reverse',
|
|
134
|
+
}}
|
|
135
|
+
>
|
|
136
|
+
{messages.map(flashMessage => (
|
|
137
|
+
<FlashMessage
|
|
138
|
+
key={flashMessage.id}
|
|
139
|
+
flashMessage={flashMessage}
|
|
140
|
+
/>
|
|
141
|
+
))}
|
|
142
|
+
</div>
|
|
143
|
+
);
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const flashMessageAnimations = (
|
|
147
|
+
initialRender2: boolean,
|
|
148
|
+
dismissTime2?: number
|
|
149
|
+
): string => {
|
|
150
|
+
if (!dismissTime2) {
|
|
151
|
+
return initialRender2 ? SLIDE_IN_ANIMATION : 'unset';
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return `${SLIDE_OUT_ANIMATION(dismissTime2)},${
|
|
155
|
+
initialRender2 ? SLIDE_IN_ANIMATION : ''
|
|
156
|
+
}`;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
export default FlashMessages;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { createSlice, nanoid, PayloadAction } from '@reduxjs/toolkit';
|
|
8
|
+
|
|
9
|
+
import type { AppThunk, RootState } from '../store';
|
|
10
|
+
|
|
11
|
+
export interface FlashMessages {
|
|
12
|
+
messages: FlashMessage[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type FlashMessageVariant = 'success' | 'warning' | 'error' | 'info';
|
|
16
|
+
|
|
17
|
+
export interface FlashMessage {
|
|
18
|
+
id: string;
|
|
19
|
+
message: string;
|
|
20
|
+
variant: FlashMessageVariant;
|
|
21
|
+
dismissTime?: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type FlashMessagePayload = Omit<FlashMessage, 'id'>;
|
|
25
|
+
|
|
26
|
+
const initialState: FlashMessages = {
|
|
27
|
+
messages: [],
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const slice = createSlice({
|
|
31
|
+
name: 'flashMessages',
|
|
32
|
+
initialState,
|
|
33
|
+
reducers: {
|
|
34
|
+
addNewMessage: (
|
|
35
|
+
state,
|
|
36
|
+
{ payload: message }: PayloadAction<FlashMessagePayload>
|
|
37
|
+
) => {
|
|
38
|
+
state.messages.push({ ...message, id: nanoid() });
|
|
39
|
+
},
|
|
40
|
+
removeMessage: (state, { payload: id }: PayloadAction<string>) => {
|
|
41
|
+
state.messages = state.messages.filter(
|
|
42
|
+
message => message.id !== id
|
|
43
|
+
);
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export const newCopiedFlashMessage = (): AppThunk => dispatch =>
|
|
49
|
+
dispatch(newInfoFlashMessage('Copied to clipboard!', 3000));
|
|
50
|
+
|
|
51
|
+
export const newSuccessFlashMessage =
|
|
52
|
+
(message: string, dismissTime?: number): AppThunk =>
|
|
53
|
+
dispatch =>
|
|
54
|
+
dispatch(newFlashMessage({ message, variant: 'success', dismissTime }));
|
|
55
|
+
|
|
56
|
+
export const newWarningFlashMessage =
|
|
57
|
+
(message: string, dismissTime?: number): AppThunk =>
|
|
58
|
+
dispatch =>
|
|
59
|
+
dispatch(newFlashMessage({ message, variant: 'warning', dismissTime }));
|
|
60
|
+
|
|
61
|
+
export const newErrorFlashMessage =
|
|
62
|
+
(message: string, dismissTime?: number): AppThunk =>
|
|
63
|
+
dispatch =>
|
|
64
|
+
dispatch(newFlashMessage({ message, variant: 'error', dismissTime }));
|
|
65
|
+
|
|
66
|
+
export const newInfoFlashMessage =
|
|
67
|
+
(message: string, dismissTime?: number): AppThunk =>
|
|
68
|
+
dispatch =>
|
|
69
|
+
dispatch(newFlashMessage({ message, variant: 'info', dismissTime }));
|
|
70
|
+
|
|
71
|
+
const newFlashMessage =
|
|
72
|
+
({ message, variant, dismissTime }: FlashMessagePayload): AppThunk =>
|
|
73
|
+
dispatch => {
|
|
74
|
+
dispatch(
|
|
75
|
+
addNewMessage({
|
|
76
|
+
message,
|
|
77
|
+
variant,
|
|
78
|
+
dismissTime,
|
|
79
|
+
})
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const getMessages = (state: RootState) => state.flashMessages.messages;
|
|
84
|
+
|
|
85
|
+
export const {
|
|
86
|
+
reducer,
|
|
87
|
+
actions: { addNewMessage, removeMessage },
|
|
88
|
+
} = slice;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
@keyframes flash-message-loader {
|
|
8
|
+
from {
|
|
9
|
+
width: 100%;
|
|
10
|
+
}
|
|
11
|
+
to {
|
|
12
|
+
width: 0;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@keyframes slide-in {
|
|
17
|
+
from {
|
|
18
|
+
transform: translateX(110%);
|
|
19
|
+
}
|
|
20
|
+
to {
|
|
21
|
+
transform: translateX(0);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@keyframes slide-out {
|
|
26
|
+
from {
|
|
27
|
+
transform: translateX(0);
|
|
28
|
+
}
|
|
29
|
+
to {
|
|
30
|
+
transform: translateX(110%);
|
|
31
|
+
}
|
|
32
|
+
}
|
package/src/NavBar/NavMenu.tsx
CHANGED
|
@@ -36,12 +36,11 @@ const NavMenu = () => {
|
|
|
36
36
|
});
|
|
37
37
|
|
|
38
38
|
return (
|
|
39
|
-
<div data-testid="nav-menu">
|
|
39
|
+
<div data-testid="nav-menu" className="d-flex ml-3 flex-wrap">
|
|
40
40
|
{paneNames.map((name, index: number) => (
|
|
41
41
|
<NavMenuItem
|
|
42
42
|
key={name}
|
|
43
43
|
index={index}
|
|
44
|
-
isFirst={index === 0}
|
|
45
44
|
isSelected={currentPane === index}
|
|
46
45
|
label={name}
|
|
47
46
|
/>
|
|
@@ -8,33 +8,31 @@ import React, { FC } from 'react';
|
|
|
8
8
|
import { useDispatch } from 'react-redux';
|
|
9
9
|
|
|
10
10
|
import { setCurrentPane } from '../App/appLayout';
|
|
11
|
-
import Button from '../Button/Button';
|
|
12
11
|
import classNames from '../utils/classNames';
|
|
13
12
|
|
|
14
13
|
import './nav-menu-item.scss';
|
|
15
14
|
|
|
16
15
|
interface Props {
|
|
17
16
|
index: number;
|
|
18
|
-
isFirst: boolean;
|
|
19
17
|
isSelected: boolean;
|
|
20
18
|
label: string;
|
|
21
19
|
}
|
|
22
20
|
|
|
23
|
-
const NavMenuItem: FC<Props> = ({ index,
|
|
21
|
+
const NavMenuItem: FC<Props> = ({ index, isSelected, label }) => {
|
|
24
22
|
const dispatch = useDispatch();
|
|
25
23
|
|
|
26
24
|
return (
|
|
27
|
-
<
|
|
28
|
-
|
|
25
|
+
<button
|
|
26
|
+
type="button"
|
|
29
27
|
className={classNames(
|
|
30
28
|
'core19-nav-menu-item',
|
|
31
29
|
isSelected && 'selected',
|
|
32
|
-
|
|
30
|
+
'mr-4'
|
|
33
31
|
)}
|
|
34
32
|
onClick={() => dispatch(setCurrentPane(index))}
|
|
35
33
|
>
|
|
36
34
|
{label}
|
|
37
|
-
</
|
|
35
|
+
</button>
|
|
38
36
|
);
|
|
39
37
|
};
|
|
40
38
|
|
package/src/NavBar/nav-bar.scss
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
@import
|
|
7
|
+
@import '../variables';
|
|
8
8
|
|
|
9
9
|
.core19-nav-bar {
|
|
10
10
|
width: 100%;
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
.core19-nav-bar-device-selector {
|
|
23
23
|
width: $side-panel-width;
|
|
24
|
+
min-width: $side-panel-width;
|
|
24
25
|
align-self: start;
|
|
25
26
|
}
|
|
26
27
|
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import React from 'react';
|
|
8
|
+
|
|
9
|
+
import NumberInlineInput from '../InlineInput/NumberInlineInput';
|
|
10
|
+
import { RangeOrValues } from '../Slider/range';
|
|
11
|
+
import Slider from '../Slider/Slider';
|
|
12
|
+
import classNames from '../utils/classNames';
|
|
13
|
+
|
|
14
|
+
export default ({
|
|
15
|
+
range,
|
|
16
|
+
value,
|
|
17
|
+
onChange,
|
|
18
|
+
onChangeComplete,
|
|
19
|
+
className,
|
|
20
|
+
disabled,
|
|
21
|
+
label,
|
|
22
|
+
unit,
|
|
23
|
+
}: {
|
|
24
|
+
range: RangeOrValues;
|
|
25
|
+
value: number;
|
|
26
|
+
onChange: (value: number) => void;
|
|
27
|
+
onChangeComplete?: (value: number) => void;
|
|
28
|
+
className?: string;
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
label?: React.ReactNode;
|
|
31
|
+
unit?: React.ReactNode;
|
|
32
|
+
}) => (
|
|
33
|
+
<div
|
|
34
|
+
className={`tw-flex tw-flex-col tw-gap-1 tw-text-xs ${classNames(
|
|
35
|
+
className
|
|
36
|
+
)}`}
|
|
37
|
+
>
|
|
38
|
+
{label && (
|
|
39
|
+
<div className="tw-flex tw-justify-between">
|
|
40
|
+
{label}
|
|
41
|
+
<div className="tw-flex tw-flex-row">
|
|
42
|
+
<NumberInlineInput
|
|
43
|
+
value={value}
|
|
44
|
+
range={range}
|
|
45
|
+
onChange={onChange}
|
|
46
|
+
onChangeComplete={onChangeComplete}
|
|
47
|
+
disabled={disabled}
|
|
48
|
+
/>
|
|
49
|
+
{unit}
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
)}
|
|
53
|
+
{Array.isArray(range) ? (
|
|
54
|
+
<Slider
|
|
55
|
+
values={[range.indexOf(value)]}
|
|
56
|
+
onChange={[i => onChange(range[i])]}
|
|
57
|
+
onChangeComplete={() => onChangeComplete?.(value)}
|
|
58
|
+
range={{
|
|
59
|
+
min: 0,
|
|
60
|
+
max: range.length - 1,
|
|
61
|
+
}}
|
|
62
|
+
disabled={disabled}
|
|
63
|
+
/>
|
|
64
|
+
) : (
|
|
65
|
+
<Slider
|
|
66
|
+
values={[value]}
|
|
67
|
+
onChange={[onChange]}
|
|
68
|
+
onChangeComplete={() => onChangeComplete?.(value)}
|
|
69
|
+
range={range}
|
|
70
|
+
disabled={disabled}
|
|
71
|
+
/>
|
|
72
|
+
)}
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
@@ -4,22 +4,41 @@
|
|
|
4
4
|
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import React, { useState } from 'react';
|
|
7
|
+
import React, { useMemo, useState } from 'react';
|
|
8
8
|
|
|
9
9
|
import Button from '../Button/Button';
|
|
10
|
+
import Dropdown, { DropdownItem } from '../Dropdown/Dropdown';
|
|
10
11
|
import logger from '../logging';
|
|
11
12
|
import { isDevelopment } from '../utils/environment';
|
|
12
13
|
import packageJson from '../utils/packageJson';
|
|
13
14
|
|
|
14
|
-
export
|
|
15
|
+
export interface FeedbackPaneProps {
|
|
16
|
+
categories?: string[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default ({ categories }: FeedbackPaneProps) => {
|
|
15
20
|
const [feedback, setFeedback] = useState('');
|
|
16
21
|
const [sayThankYou, setSayThankYou] = useState(false);
|
|
17
22
|
|
|
23
|
+
const categoryItems = useMemo(() => {
|
|
24
|
+
if (!categories?.length) return undefined;
|
|
25
|
+
|
|
26
|
+
const items = ['Select a category', ...categories].map(category => ({
|
|
27
|
+
label: category,
|
|
28
|
+
value: category,
|
|
29
|
+
}));
|
|
30
|
+
return items;
|
|
31
|
+
}, [categories]);
|
|
32
|
+
|
|
33
|
+
const [selectedCategory, setSelectedCategory] = useState<
|
|
34
|
+
DropdownItem | undefined
|
|
35
|
+
>(categoryItems ? categoryItems[0] : undefined);
|
|
36
|
+
|
|
18
37
|
if (sayThankYou === true) {
|
|
19
38
|
return (
|
|
20
|
-
<div className="
|
|
21
|
-
<div className="
|
|
22
|
-
<b className="mb-3">Thank you!</b>
|
|
39
|
+
<div className="tw-preflight tw-flex tw-w-full tw-justify-center">
|
|
40
|
+
<div className="tw-mb-3 tw-flex tw-flex-col tw-items-start tw-justify-center tw-bg-white tw-px-3 tw-py-4">
|
|
41
|
+
<b className="tw-mb-3">Thank you!</b>
|
|
23
42
|
<section>
|
|
24
43
|
<p>
|
|
25
44
|
We value your feedback and any ideas you may have
|
|
@@ -32,7 +51,7 @@ export default () => {
|
|
|
32
51
|
</section>
|
|
33
52
|
<Button
|
|
34
53
|
large
|
|
35
|
-
className="align-self-end"
|
|
54
|
+
className="tw-align-self-end tw-self-end"
|
|
36
55
|
onClick={() => {
|
|
37
56
|
setSayThankYou(false);
|
|
38
57
|
setFeedback('');
|
|
@@ -47,56 +66,67 @@ export default () => {
|
|
|
47
66
|
}
|
|
48
67
|
|
|
49
68
|
return (
|
|
50
|
-
<div className="
|
|
51
|
-
<div className="
|
|
52
|
-
<b
|
|
53
|
-
<
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
<div className="tw-preflight tw-flex tw-w-full tw-justify-center">
|
|
70
|
+
<div className="tw-mb-3 tw-flex tw-flex-col tw-items-start tw-justify-center tw-gap-4 tw-bg-white tw-px-3 tw-py-4">
|
|
71
|
+
<b>Give Feedback</b>
|
|
72
|
+
<p>
|
|
73
|
+
We value your feedback and any ideas you may have for
|
|
74
|
+
improving our applications. Please use the form below to
|
|
75
|
+
give feedback.
|
|
76
|
+
</p>
|
|
77
|
+
<p>
|
|
78
|
+
Note: this is not a support channel, and you will not
|
|
79
|
+
receive a response. For help and support, visit the{' '}
|
|
80
|
+
<a
|
|
81
|
+
href="https://devzone.nordicsemi.com/"
|
|
82
|
+
target="_blank"
|
|
83
|
+
rel="noreferrer noopener"
|
|
84
|
+
className="tw-text-nordicBlue"
|
|
85
|
+
>
|
|
86
|
+
Nordic DevZone
|
|
87
|
+
</a>
|
|
88
|
+
.
|
|
89
|
+
</p>
|
|
90
|
+
<form className="tw-flex tw-w-full tw-flex-col tw-gap-4">
|
|
91
|
+
{categoryItems?.length && (
|
|
92
|
+
<div className="tw-w-52">
|
|
93
|
+
<Dropdown
|
|
94
|
+
items={categoryItems}
|
|
95
|
+
onSelect={setSelectedCategory}
|
|
96
|
+
selectedItem={
|
|
97
|
+
selectedCategory || categoryItems[0]
|
|
98
|
+
}
|
|
99
|
+
/>
|
|
100
|
+
</div>
|
|
101
|
+
)}
|
|
102
|
+
<div>
|
|
74
103
|
<b>What is your feedback?</b>
|
|
75
104
|
<textarea
|
|
76
105
|
name="feedback-text"
|
|
77
|
-
className="w-
|
|
78
|
-
style={{ height: '8rem' }}
|
|
106
|
+
className="tw-h-32 tw-w-full tw-border tw-border-gray-700"
|
|
79
107
|
required
|
|
80
108
|
value={feedback}
|
|
81
109
|
onChange={e => setFeedback(e.target.value)}
|
|
82
110
|
/>
|
|
83
|
-
</
|
|
111
|
+
</div>
|
|
84
112
|
</form>
|
|
85
|
-
<
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
</
|
|
89
|
-
<
|
|
90
|
-
|
|
91
|
-
<li>Your feedback</li>
|
|
92
|
-
<li>Operating system</li>
|
|
93
|
-
</ul>
|
|
94
|
-
</section>
|
|
113
|
+
<p>We only collect this information when you send feedback:</p>
|
|
114
|
+
<ul className="tw-list-disc tw-pl-8">
|
|
115
|
+
<li>Application name</li>
|
|
116
|
+
<li>Your feedback</li>
|
|
117
|
+
<li>Operating system</li>
|
|
118
|
+
</ul>
|
|
95
119
|
<Button
|
|
96
120
|
large
|
|
97
|
-
className="
|
|
121
|
+
className="tw-self-end"
|
|
98
122
|
variant="primary"
|
|
99
|
-
onClick={() =>
|
|
123
|
+
onClick={() =>
|
|
124
|
+
handleFormData(
|
|
125
|
+
feedback,
|
|
126
|
+
setSayThankYou,
|
|
127
|
+
selectedCategory?.value
|
|
128
|
+
)
|
|
129
|
+
}
|
|
100
130
|
disabled={feedback === ''}
|
|
101
131
|
>
|
|
102
132
|
Send Feedback
|
|
@@ -108,19 +138,24 @@ export default () => {
|
|
|
108
138
|
|
|
109
139
|
const formURL =
|
|
110
140
|
isDevelopment === true
|
|
111
|
-
? 'https://formkeep.com/f/
|
|
141
|
+
? 'https://formkeep.com/f/87deb409a565'
|
|
112
142
|
: 'https://formkeep.com/f/36b394b92851';
|
|
113
143
|
|
|
114
144
|
const handleFormData = async (
|
|
115
145
|
feedback: string,
|
|
116
|
-
setResponse: (response: boolean) => void
|
|
146
|
+
setResponse: (response: boolean) => void,
|
|
147
|
+
category?: string
|
|
117
148
|
) => {
|
|
118
|
-
const data = {
|
|
149
|
+
const data: Record<string, unknown> = {
|
|
119
150
|
name: getAppName(),
|
|
120
151
|
feedback,
|
|
121
152
|
platform: process.platform,
|
|
122
153
|
};
|
|
123
154
|
|
|
155
|
+
if (category && category !== 'Select a category') {
|
|
156
|
+
data.category = category;
|
|
157
|
+
}
|
|
158
|
+
|
|
124
159
|
try {
|
|
125
160
|
const response = await fetch(formURL, {
|
|
126
161
|
method: 'POST',
|