main 826f22f5b343 cached
492 files
1.4 MB
431.5k tokens
670 symbols
1 requests
Download .txt
Showing preview only (1,607K chars total). Download the full file or copy to clipboard to get everything.
Repository: responsively-org/responsively-app
Branch: main
Commit: 826f22f5b343
Files: 492
Total size: 1.4 MB

Directory structure:
gitextract_p5en9k53/

├── .all-contributorsrc
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── 01-bug-report.md
│   │   └── 02-feature-request.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   ├── opencollective.yml
│   ├── stale.yml
│   └── workflows/
│       ├── codeql-analysis.yml
│       ├── publish.yml
│       └── test.yml
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── MAINTAINERS.md
├── README.md
├── SECURITY.md
├── browser-extension/
│   ├── .gitignore
│   ├── .vscode/
│   │   └── settings.json
│   ├── package.json
│   ├── public/
│   │   ├── manifest.json
│   │   └── popup.html
│   ├── src/
│   │   ├── background.js
│   │   └── popup.js
│   └── webpack.config.js
├── desktop-app/
│   ├── . prettierignore
│   ├── .editorconfig
│   ├── .erb/
│   │   ├── configs/
│   │   │   ├── .eslintrc
│   │   │   ├── webpack.config.base.ts
│   │   │   ├── webpack.config.eslint.ts
│   │   │   ├── webpack.config.main.prod.ts
│   │   │   ├── webpack.config.preload-webview.dev.ts
│   │   │   ├── webpack.config.preload.dev.ts
│   │   │   ├── webpack.config.renderer.dev.dll.ts
│   │   │   ├── webpack.config.renderer.dev.ts
│   │   │   ├── webpack.config.renderer.prod.ts
│   │   │   └── webpack.paths.ts
│   │   ├── mocks/
│   │   │   └── fileMock.js
│   │   └── scripts/
│   │       ├── .eslintrc
│   │       ├── check-build-exists.ts
│   │       ├── check-native-dep.js
│   │       ├── check-node-env.js
│   │       ├── check-port-in-use.js
│   │       ├── clean.js
│   │       ├── delete-source-maps.js
│   │       ├── electron-rebuild.js
│   │       ├── link-modules.ts
│   │       └── notarize.js
│   ├── .eslintignore
│   ├── .eslintrc.js
│   ├── .gitattributes
│   ├── .gitignore
│   ├── .husky/
│   │   └── pre-commit
│   ├── .prettierrc
│   ├── .vscode/
│   │   └── settings.json
│   ├── CHANGELOG.md
│   ├── CODE_OF_CONDUCT.md
│   ├── LICENSE
│   ├── README.md
│   ├── assets/
│   │   ├── assets.d.ts
│   │   └── entitlements.mac.plist
│   ├── declarations.d.ts
│   ├── package.json
│   ├── postcss.config.js
│   ├── postinstall.ts
│   ├── release/
│   │   └── app/
│   │       └── package.json
│   ├── setupTests.ts
│   ├── src/
│   │   ├── __tests__/
│   │   │   └── App.test.tsx
│   │   ├── common/
│   │   │   ├── constants.ts
│   │   │   ├── deviceList.ts
│   │   │   └── webViewUtils.ts
│   │   ├── main/
│   │   │   ├── app-meta/
│   │   │   │   └── index.ts
│   │   │   ├── app-updater.ts
│   │   │   ├── browser-sync.ts
│   │   │   ├── cli.ts
│   │   │   ├── dev-entry.cjs
│   │   │   ├── devtools/
│   │   │   │   └── index.ts
│   │   │   ├── http-basic-auth/
│   │   │   │   └── index.ts
│   │   │   ├── main.ts
│   │   │   ├── menu/
│   │   │   │   ├── help.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── view.ts
│   │   │   ├── native-functions/
│   │   │   │   └── index.ts
│   │   │   ├── preload-webview.ts
│   │   │   ├── preload.ts
│   │   │   ├── protocol-handler/
│   │   │   │   └── index.ts
│   │   │   ├── screenshot/
│   │   │   │   ├── index.ts
│   │   │   │   └── webpage.ts
│   │   │   ├── util.ts
│   │   │   ├── web-permissions/
│   │   │   │   ├── PermissionsManager.ts
│   │   │   │   └── index.ts
│   │   │   ├── webview-context-menu/
│   │   │   │   ├── common.ts
│   │   │   │   └── register.ts
│   │   │   └── webview-storage-manager/
│   │   │       └── index.ts
│   │   ├── renderer/
│   │   │   ├── App.css
│   │   │   ├── AppContent.tsx
│   │   │   ├── components/
│   │   │   │   ├── AboutDialog/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Accordion/
│   │   │   │   │   ├── Accordion.tsx
│   │   │   │   │   ├── AccordionItem.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Button/
│   │   │   │   │   ├── Button.test.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ButtonGroup/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ConfirmDialog/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── DeviceManager/
│   │   │   │   │   ├── DeviceDetailsModal.tsx
│   │   │   │   │   ├── DeviceLabel.tsx
│   │   │   │   │   ├── PreviewSuites/
│   │   │   │   │   │   ├── CreateSuiteButton/
│   │   │   │   │   │   │   ├── CreateSuiteModal.tsx
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── ManageSuitesTool/
│   │   │   │   │   │   │   ├── ManageSuitesTool.test.tsx
│   │   │   │   │   │   │   ├── ManageSuitesTool.tsx
│   │   │   │   │   │   │   ├── ManageSuitesToolError.test.tsx
│   │   │   │   │   │   │   ├── ManageSuitesToolError.tsx
│   │   │   │   │   │   │   ├── helpers.test.tsx
│   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   ├── test.json
│   │   │   │   │   │   │   ├── utils.test.ts
│   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   ├── Suite.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Divider/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── DropDown/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── FileUploader/
│   │   │   │   │   ├── FileUploader.test.tsx
│   │   │   │   │   ├── FileUploader.tsx
│   │   │   │   │   ├── hooks/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── useFileUpload.test.tsx
│   │   │   │   │   │   └── useFileUpload.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── InfoPopups/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Input/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── KeyboardShortcutsManager/
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── useKeyboardShortcut.ts
│   │   │   │   │   └── useMousetrapEmitter.ts
│   │   │   │   ├── Modal/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ModalLoader/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Notifications/
│   │   │   │   │   ├── Notification.tsx
│   │   │   │   │   ├── NotificationEmptyStatus.tsx
│   │   │   │   │   ├── Notifications.tsx
│   │   │   │   │   └── NotificationsBubble.tsx
│   │   │   │   ├── Previewer/
│   │   │   │   │   ├── Device/
│   │   │   │   │   │   ├── ColorBlindnessTools/
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── DesignOverlay/
│   │   │   │   │   │   │   ├── index.test.tsx
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── DesignOverlayControls/
│   │   │   │   │   │   │   ├── index.test.tsx
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── Toolbar.tsx
│   │   │   │   │   │   ├── assets.ts
│   │   │   │   │   │   ├── common.ts
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── DevtoolsResizer/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Guides/
│   │   │   │   │   │   ├── guide.css
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── IndividualLayoutToolBar/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.css
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ReleaseNotes/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Select/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Spinner/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Sponsorship/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Toggle/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ToolBar/
│   │   │   │   │   ├── AddressBar/
│   │   │   │   │   │   ├── AuthModal.tsx
│   │   │   │   │   │   ├── BookmarkButton.tsx
│   │   │   │   │   │   ├── SitePermissions/
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── SuggestionList.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── ColorBlindnessControls/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── ColorSchemeToggle/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Menu/
│   │   │   │   │   │   ├── Flyout/
│   │   │   │   │   │   │   ├── AllowInSecureSSL/
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── Bookmark/
│   │   │   │   │   │   │   │   ├── ViewAllBookmarks/
│   │   │   │   │   │   │   │   │   ├── BookmarkFlyout.tsx
│   │   │   │   │   │   │   │   │   ├── BookmarkListButton.tsx
│   │   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── ClearHistory/
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── Devtools/
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── PreviewLayout/
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── Settings/
│   │   │   │   │   │   │   │   ├── SettingsContent.test.tsx
│   │   │   │   │   │   │   │   ├── SettingsContent.tsx
│   │   │   │   │   │   │   │   ├── SettingsContentHeaders.tsx
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── UITheme/
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── Zoom.tsx
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── NavigationControls.tsx
│   │   │   │   │   ├── PreviewSuiteSelector/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Shortcuts/
│   │   │   │   │   │   ├── ShortcutsModal/
│   │   │   │   │   │   │   ├── ShortcutButton.tsx
│   │   │   │   │   │   │   ├── ShortcutName.tsx
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── VisionSimulationDropDown/
│   │   │   │   │   └── index.tsx
│   │   │   │   └── useLocalStorage/
│   │   │   │       └── useLocalStorage.tsx
│   │   │   ├── context/
│   │   │   │   └── ThemeProvider/
│   │   │   │       └── index.tsx
│   │   │   ├── index.ejs
│   │   │   ├── index.tsx
│   │   │   ├── lib/
│   │   │   │   └── pubsub/
│   │   │   │       ├── index.test.ts
│   │   │   │       └── index.ts
│   │   │   ├── preload.d.ts
│   │   │   └── store/
│   │   │       ├── features/
│   │   │       │   ├── bookmarks/
│   │   │       │   │   └── index.ts
│   │   │       │   ├── design-overlay/
│   │   │       │   │   ├── index.test.ts
│   │   │       │   │   └── index.ts
│   │   │       │   ├── device-manager/
│   │   │       │   │   ├── index.ts
│   │   │       │   │   └── utils.ts
│   │   │       │   ├── devtools/
│   │   │       │   │   └── index.ts
│   │   │       │   ├── renderer/
│   │   │       │   │   └── index.ts
│   │   │       │   ├── ruler/
│   │   │       │   │   └── index.ts
│   │   │       │   └── ui/
│   │   │       │       └── index.ts
│   │   │       └── index.ts
│   │   └── store/
│   │       ├── index.ts
│   │       └── migrations.ts
│   ├── tailwind.config.js
│   ├── tsconfig.json
│   └── vitest.config.ts
├── desktop-app-legacy/
│   ├── .dockerignore
│   ├── .editorconfig
│   ├── .eslintignore
│   ├── .eslintrc
│   ├── .flowconfig
│   ├── .gitattributes
│   ├── .github/
│   │   ├── ISSUE_TEMPLATE.md
│   │   └── stale.yml
│   ├── .gitignore
│   ├── .nvmrc
│   ├── .prettierignore
│   ├── .prettierrc
│   ├── .stylelintrc
│   ├── .testcafe-electron-rc
│   ├── .travis.yml
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── add-osx-cert.sh
│   ├── app/
│   │   ├── AppContent.js
│   │   ├── actions/
│   │   │   ├── bookmarks.js
│   │   │   ├── browser.js
│   │   │   ├── networkConfig.js
│   │   │   └── statusBar.js
│   │   ├── app-updater.js
│   │   ├── app.global.css
│   │   ├── app.html
│   │   ├── app.icns
│   │   ├── components/
│   │   │   ├── AddressInput.js
│   │   │   ├── AppNotification/
│   │   │   │   ├── AppNotification.js
│   │   │   │   └── styles.module.css
│   │   │   ├── BookmarksBar/
│   │   │   │   ├── BookmarkEditDialog.js
│   │   │   │   └── index.js
│   │   │   ├── ClearNetworkCache/
│   │   │   │   └── index.js
│   │   │   ├── CreateIssue/
│   │   │   │   └── index.js
│   │   │   ├── DevToolsResizer/
│   │   │   │   ├── index.js
│   │   │   │   └── style.module.css
│   │   │   ├── DeviceDrawer/
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── DeviceManager/
│   │   │   │   ├── AddDevice/
│   │   │   │   │   └── index.js
│   │   │   │   ├── DeviceItem.js
│   │   │   │   ├── DeviceList.js
│   │   │   │   ├── OSIcon.js
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── DevicesOverview/
│   │   │   │   └── index.js
│   │   │   ├── DevicesPreviewer/
│   │   │   │   ├── index.js
│   │   │   │   ├── index.test.js
│   │   │   │   └── useStyles.js
│   │   │   ├── Drawer.js
│   │   │   ├── ErrorBoundary/
│   │   │   │   └── index.js
│   │   │   ├── ExtensionsManager/
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── Header/
│   │   │   │   ├── index.js
│   │   │   │   └── index.test.js
│   │   │   ├── Headway.js
│   │   │   ├── HorizontalSpacer/
│   │   │   │   └── index.js
│   │   │   ├── HttpAuthDialog/
│   │   │   │   └── index.js
│   │   │   ├── KebabMenu.js
│   │   │   ├── LeftIconsPane/
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── LinkHoverDisplay/
│   │   │   │   └── index.js
│   │   │   ├── LiveCssEditor/
│   │   │   │   ├── index.js
│   │   │   │   └── useStyles.js
│   │   │   ├── NavigationControls/
│   │   │   │   ├── index.js
│   │   │   │   └── index.test.js
│   │   │   ├── NetworkConfiguration/
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── NetworkProxy/
│   │   │   │   ├── ProxyManager/
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── NetworkThrottling/
│   │   │   │   ├── ProfileManager/
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── styles.css
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── NotificationMessage/
│   │   │   │   └── index.js
│   │   │   ├── PageNavigator/
│   │   │   │   └── index.js
│   │   │   ├── PermissionPopup/
│   │   │   │   ├── index.js
│   │   │   │   └── styles.module.css
│   │   │   ├── PrefersColorSchemeSwitch/
│   │   │   │   └── index.js
│   │   │   ├── PreviewerLayoutSelector/
│   │   │   │   └── index.js
│   │   │   ├── QuickFilterDevices/
│   │   │   │   └── index.js
│   │   │   ├── Renderer/
│   │   │   │   ├── index.js
│   │   │   │   └── index.test.js
│   │   │   ├── ScreenShotSavePreference/
│   │   │   │   └── index.js
│   │   │   ├── ScreenshotManager/
│   │   │   │   └── index.js
│   │   │   ├── ScrollControls/
│   │   │   │   ├── index.js
│   │   │   │   └── index.test.js
│   │   │   ├── Select.js
│   │   │   ├── Spinner/
│   │   │   │   └── index.js
│   │   │   ├── StatusBar/
│   │   │   │   ├── Announcement.js
│   │   │   │   ├── index.js
│   │   │   │   └── useStyles.js
│   │   │   ├── ToggleTouch/
│   │   │   │   └── index.js
│   │   │   ├── UrlSearchResults/
│   │   │   │   ├── index.js
│   │   │   │   └── useStyles.js
│   │   │   ├── UserPreferences/
│   │   │   │   ├── index.js
│   │   │   │   └── useStyles.js
│   │   │   ├── WebView/
│   │   │   │   ├── index.js
│   │   │   │   ├── index.test.js
│   │   │   │   ├── screenshotUtil.js
│   │   │   │   └── style.module.css
│   │   │   ├── ZenButton/
│   │   │   │   └── index.js
│   │   │   ├── ZoomInput/
│   │   │   │   ├── index.js
│   │   │   │   ├── index.test.js
│   │   │   │   ├── otherStyles.css
│   │   │   │   └── styles.module.css
│   │   │   ├── icons/
│   │   │   │   ├── Apple.js
│   │   │   │   ├── ArrowLeft.js
│   │   │   │   ├── ArrowRight.js
│   │   │   │   ├── Bug.js
│   │   │   │   ├── CSSEditor.js
│   │   │   │   ├── Chevron.js
│   │   │   │   ├── Cross.js
│   │   │   │   ├── CrossChrome.js
│   │   │   │   ├── CrossThin.js
│   │   │   │   ├── DarkColorScheme.js
│   │   │   │   ├── DeleteCookie.js
│   │   │   │   ├── DeleteStorage.js
│   │   │   │   ├── DesignMode.js
│   │   │   │   ├── DeviceRotate.js
│   │   │   │   ├── Devices.js
│   │   │   │   ├── DockBottom.js
│   │   │   │   ├── DockRight.js
│   │   │   │   ├── DoubleLeftArrow.js
│   │   │   │   ├── Filter.js
│   │   │   │   ├── Focus.js
│   │   │   │   ├── FullScreenshot.js
│   │   │   │   ├── Gift.js
│   │   │   │   ├── Github.js
│   │   │   │   ├── Globe.js
│   │   │   │   ├── GoArrow.js
│   │   │   │   ├── Home.js
│   │   │   │   ├── HomePlus.js
│   │   │   │   ├── InspectElement.js
│   │   │   │   ├── InspectElementChrome.js
│   │   │   │   ├── Kebab.js
│   │   │   │   ├── Layout.js
│   │   │   │   ├── LightBulb.js
│   │   │   │   ├── LightColorScheme.js
│   │   │   │   ├── Logo.js
│   │   │   │   ├── Maximize.js
│   │   │   │   ├── Minimize.js
│   │   │   │   ├── Muted.js
│   │   │   │   ├── Network.js
│   │   │   │   ├── PageNavigator.js
│   │   │   │   ├── Pictures.js
│   │   │   │   ├── Proxy.js
│   │   │   │   ├── Reload.js
│   │   │   │   ├── RoadMap.js
│   │   │   │   ├── Screenshot.js
│   │   │   │   ├── ScrollDown.js
│   │   │   │   ├── ScrollUp.js
│   │   │   │   ├── Start.js
│   │   │   │   ├── TickAnimation/
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── styles.css
│   │   │   │   ├── ToggleTouch.js
│   │   │   │   ├── Twitter.js
│   │   │   │   ├── UnDock.js
│   │   │   │   ├── Unfocus.js
│   │   │   │   ├── Unmuted.js
│   │   │   │   ├── Unplug.js
│   │   │   │   ├── Windows.js
│   │   │   │   ├── Zoom.js
│   │   │   │   └── styles.module.css
│   │   │   ├── useCommonStyles.js
│   │   │   ├── useCreateTheme.js
│   │   │   └── useIsDarkTheme.js
│   │   ├── constants/
│   │   │   ├── DrawerContents.js
│   │   │   ├── browserSync.js
│   │   │   ├── chromeEmulatedDevices.js
│   │   │   ├── devices.js
│   │   │   ├── index.js
│   │   │   ├── license.js
│   │   │   ├── permissionsManagement.js
│   │   │   ├── previewerLayouts.js
│   │   │   ├── pubsubEvents.js
│   │   │   ├── routes.js
│   │   │   ├── searchResultSettings.js
│   │   │   ├── settingKeys.js
│   │   │   ├── theme.js
│   │   │   └── values.js
│   │   ├── containers/
│   │   │   ├── AddDeviceContainer/
│   │   │   │   └── index.js
│   │   │   ├── AddressBar/
│   │   │   │   └── index.js
│   │   │   ├── BookmarksBarContainer/
│   │   │   │   └── index.js
│   │   │   ├── Browser/
│   │   │   │   └── index.js
│   │   │   ├── DevToolResizerContainer/
│   │   │   │   └── index.js
│   │   │   ├── DeviceDrawerContainer/
│   │   │   │   └── index.js
│   │   │   ├── DeviceManagerContainer/
│   │   │   │   └── index.js
│   │   │   ├── DevicePreviewerContainer/
│   │   │   │   └── index.js
│   │   │   ├── DevicesOverviewContainer/
│   │   │   │   └── index.js
│   │   │   ├── DrawerContainer/
│   │   │   │   └── index.js
│   │   │   ├── ExtensionsManagerContainer/
│   │   │   │   └── index.js
│   │   │   ├── HeaderContainer/
│   │   │   │   └── index.js
│   │   │   ├── HomePage.js
│   │   │   ├── LeftIconsPaneContainer/
│   │   │   │   └── index.js
│   │   │   ├── LinkHoverDisplayContainer/
│   │   │   │   └── index.js
│   │   │   ├── NavigationControlsContainer/
│   │   │   │   └── index.js
│   │   │   ├── NetworkConfigurationContainer/
│   │   │   │   └── index.js
│   │   │   ├── PageNavigatorContainer/
│   │   │   │   └── index.js
│   │   │   ├── QuickFilterDevicesContainer/
│   │   │   │   └── index.js
│   │   │   ├── Root.js
│   │   │   ├── ScrollControlsContainer/
│   │   │   │   └── index.js
│   │   │   ├── StatusBarContainer/
│   │   │   │   └── index.js
│   │   │   ├── UserPreferencesContainer/
│   │   │   │   └── index.js
│   │   │   ├── WebViewContainer/
│   │   │   │   └── index.js
│   │   │   └── ZoomContainer/
│   │   │       └── index.js
│   │   ├── imageWorker.js
│   │   ├── index.js
│   │   ├── main.dev.js
│   │   ├── menu.js
│   │   ├── move-to-applications.js
│   │   ├── preload.js
│   │   ├── reducers/
│   │   │   ├── bookmarks.js
│   │   │   ├── browser.js
│   │   │   ├── index.js
│   │   │   ├── statusBar.js
│   │   │   └── types.js
│   │   ├── services/
│   │   │   ├── browserSync/
│   │   │   │   └── index.js
│   │   │   ├── db/
│   │   │   │   ├── appMetadata.js
│   │   │   │   └── index.js
│   │   │   └── searchUrlSuggestions/
│   │   │       └── index.js
│   │   ├── settings/
│   │   │   ├── migration.js
│   │   │   ├── statusBarSettings.js
│   │   │   └── userPreferenceSettings.js
│   │   ├── shortcut-manager/
│   │   │   ├── main-shortcut-manager.js
│   │   │   ├── renderer-shortcut-manager.js
│   │   │   └── shared.js
│   │   ├── shortcuts.html
│   │   ├── store/
│   │   │   ├── configureStore.dev.js
│   │   │   ├── configureStore.js
│   │   │   └── configureStore.prod.js
│   │   └── utils/
│   │       ├── .gitkeep
│   │       ├── TextAreaWithCopyButton.js
│   │       ├── analytics.js
│   │       ├── browserSync.js
│   │       ├── browserUtils.js
│   │       ├── deviceManagerUtils.js
│   │       ├── filterUtils.js
│   │       ├── generalUtils.js
│   │       ├── iconUtils.js
│   │       ├── logUtils.js
│   │       ├── navigatorUtils.js
│   │       ├── permissionUtils.js
│   │       ├── proxyUtils.js
│   │       ├── stringUtils.js
│   │       └── urlUtils.js
│   ├── appveyor.yml
│   ├── babel.config.js
│   ├── build/
│   │   └── entitlements.mac.plist
│   ├── configs/
│   │   ├── webpack.config.base.js
│   │   ├── webpack.config.eslint.js
│   │   ├── webpack.config.main.prod.babel.js
│   │   ├── webpack.config.renderer.dev.babel.js
│   │   ├── webpack.config.renderer.dev.dll.babel.js
│   │   └── webpack.config.renderer.prod.babel.js
│   ├── flow-typed/
│   │   ├── electron.js
│   │   └── module_vx.x.x.js
│   ├── internals/
│   │   ├── flow/
│   │   │   ├── CSSModule.js.flow
│   │   │   └── WebpackAsset.js.flow
│   │   ├── mocks/
│   │   │   └── fileMock.js
│   │   └── scripts/
│   │       ├── CheckBuiltsExist.js
│   │       ├── CheckNodeEnv.js
│   │       └── CheckPortInUse.js
│   ├── package.json
│   ├── renovate.json
│   ├── resources/
│   │   ├── icon.gvdesign
│   │   ├── icon.icns
│   │   └── icon.old.icns
│   └── scripts/
│       ├── chocolatey/
│       │   ├── generateChocoPkg.js
│       │   └── responsively/
│       │       ├── responsively.nuspec
│       │       └── tools/
│       │           ├── LICENSE.txt
│       │           ├── VERIFICATION.txt
│       │           ├── chocolateyinstall.ps1
│       │           └── chocolateyuninstall.ps1
│       ├── extraPublishFiles.js
│       ├── generate-checksums.js
│       └── notarize.js
└── dev.code-workspace

================================================
FILE CONTENTS
================================================

================================================
FILE: .all-contributorsrc
================================================
{
  "files": [
    "README.md"
  ],
  "imageSize": 100,
  "commit": false,
  "contributors": [
    {
      "login": "manojVivek",
      "name": "Manoj Vivek",
      "avatar_url": "https://avatars1.githubusercontent.com/u/1283424?v=4",
      "profile": "http://x.com/vivek_jonam",
      "contributions": [
        "code",
        "test",
        "projectManagement"
      ]
    },
    {
      "login": "esprush",
      "name": "Suresh P",
      "avatar_url": "https://avatars0.githubusercontent.com/u/26249498?v=4",
      "profile": "https://github.com/esprush",
      "contributions": [
        "code",
        "test",
        "projectManagement"
      ]
    },
    {
      "login": "sprabowo",
      "name": "Sigit Prabowo",
      "avatar_url": "https://avatars2.githubusercontent.com/u/11748183?v=4",
      "profile": "https://github.com/sprabowo",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "leon0707",
      "name": "Leon Feng",
      "avatar_url": "https://avatars1.githubusercontent.com/u/523684?v=4",
      "profile": "https://github.com/leon0707",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "kishoreio",
      "name": "Kishore S",
      "avatar_url": "https://avatars2.githubusercontent.com/u/30261988?v=4",
      "profile": "https://github.com/kishoreio",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "jjavierdguezas",
      "name": "José Javier Rodríguez Zas",
      "avatar_url": "https://avatars2.githubusercontent.com/u/13673443?v=4",
      "profile": "https://jjavierdguezas.github.io",
      "contributions": [
        "code",
        "test"
      ]
    },
    {
      "login": "romanakash",
      "name": "Roman Akash",
      "avatar_url": "https://avatars1.githubusercontent.com/u/40427975?v=4",
      "profile": "https://github.com/romanakash",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "RomainFrancony",
      "name": "Romain Francony",
      "avatar_url": "https://avatars3.githubusercontent.com/u/22396965?v=4",
      "profile": "https://github.com/RomainFrancony",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "AARYAN-MAHENDRA",
      "name": "AARYAN-MAHENDRA",
      "avatar_url": "https://avatars1.githubusercontent.com/u/64866670?v=4",
      "profile": "https://github.com/AARYAN-MAHENDRA",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Nothing-Works",
      "name": "Andy",
      "avatar_url": "https://avatars3.githubusercontent.com/u/18606648?v=4",
      "profile": "https://github.com/Nothing-Works",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Kidcredo",
      "name": "Ryan Pais",
      "avatar_url": "https://avatars0.githubusercontent.com/u/15522605?v=4",
      "profile": "https://github.com/Kidcredo",
      "contributions": [
        "code",
        "test"
      ]
    },
    {
      "login": "Grafikart",
      "name": "Jonathan",
      "avatar_url": "https://avatars1.githubusercontent.com/u/395137?v=4",
      "profile": "https://grafikart.fr",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "heygema",
      "name": "Gema Anggada ✌︎",
      "avatar_url": "https://avatars1.githubusercontent.com/u/10743728?v=4",
      "profile": "https://github.com/heygema",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "jonathanurias96",
      "name": "jonathanurias96",
      "avatar_url": "https://avatars2.githubusercontent.com/u/57416786?v=4",
      "profile": "https://github.com/jonathanurias96",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "falecci",
      "name": "Federico Alecci",
      "avatar_url": "https://avatars2.githubusercontent.com/u/17703824?v=4",
      "profile": "https://falecci.dev",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "MuminjonGuru",
      "name": "Abduraimov Muminjon",
      "avatar_url": "https://avatars1.githubusercontent.com/u/24930020?v=4",
      "profile": "https://linkedin.com/in/muminjon-abduraimov/",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "vlazaroes",
      "name": "Víctor Lázaro",
      "avatar_url": "https://avatars1.githubusercontent.com/u/38981659?v=4",
      "profile": "https://www.vlazaro.es/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "kvnam",
      "name": "Kavita Nambissan",
      "avatar_url": "https://avatars0.githubusercontent.com/u/3608742?v=4",
      "profile": "https://github.com/kvnam",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "prashantpalikhe",
      "name": "Prashant Palikhe",
      "avatar_url": "https://avatars0.githubusercontent.com/u/2657709?v=4",
      "profile": "https://x.com/PrashantPalikhe",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "jaunesarmiento",
      "name": "Jaune Sarmiento",
      "avatar_url": "https://avatars1.githubusercontent.com/u/1166928?v=4",
      "profile": "https://github.com/jaunesarmiento",
      "contributions": [
        "content"
      ]
    },
    {
      "login": "diego-vieira",
      "name": "Diego Vieira",
      "avatar_url": "https://avatars2.githubusercontent.com/u/930792?v=4",
      "profile": "https://github.com/diego-vieira",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "pajaydev",
      "name": "Ajaykumar",
      "avatar_url": "https://avatars0.githubusercontent.com/u/21375014?v=4",
      "profile": "https://github.com/pajaydev",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "kirubakarthikeyan",
      "name": "Kiruba Karan",
      "avatar_url": "https://avatars0.githubusercontent.com/u/38885946?v=4",
      "profile": "https://github.com/kirubakarthikeyan",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "sebasrodriguez",
      "name": "Sebastián Rodríguez",
      "avatar_url": "https://avatars1.githubusercontent.com/u/1605931?v=4",
      "profile": "https://github.com/sebasrodriguez",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "karthick3018",
      "name": "Karthick Raja",
      "avatar_url": "https://avatars1.githubusercontent.com/u/47154512?v=4",
      "profile": "https://github.com/karthick3018",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "jzabala",
      "name": "Johnny Zabala",
      "avatar_url": "https://avatars0.githubusercontent.com/u/1315054?v=4",
      "profile": "https://github.com/jzabala",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "rossmoody",
      "name": "Ross Moody",
      "avatar_url": "https://avatars0.githubusercontent.com/u/29072694?v=4",
      "profile": "http://rossmoody.com",
      "contributions": [
        "design"
      ]
    },
    {
      "login": "mehrdad-shokri",
      "name": "Mehrdad Shokri",
      "avatar_url": "https://avatars1.githubusercontent.com/u/13661520?v=4",
      "profile": "https://shokri.me",
      "contributions": [
        "infra"
      ]
    },
    {
      "login": "abakermi",
      "name": "Abdelhak Akermi",
      "avatar_url": "https://avatars1.githubusercontent.com/u/60294727?v=4",
      "profile": "https://github.com/abakermi",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "crperezt",
      "name": "Carlos Perez",
      "avatar_url": "https://avatars0.githubusercontent.com/u/20329014?v=4",
      "profile": "https://github.com/crperezt",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "JayArya",
      "name": "Jayant Arya",
      "avatar_url": "https://avatars0.githubusercontent.com/u/42388314?v=4",
      "profile": "https://github.com/JayArya",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "JohnRawlins",
      "name": "John Rawlins",
      "avatar_url": "https://avatars3.githubusercontent.com/u/42707277?v=4",
      "profile": "https://github.com/JohnRawlins",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "lepasq",
      "name": "lepasq",
      "avatar_url": "https://avatars3.githubusercontent.com/u/53230128?v=4",
      "profile": "https://github.com/lepasq",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "mrfelfel",
      "name": "mrfelfel",
      "avatar_url": "https://avatars0.githubusercontent.com/u/19575588?v=4",
      "profile": "https://github.com/mrfelfel",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "gorogoroumaru",
      "name": "gorogoroumaru",
      "avatar_url": "https://avatars3.githubusercontent.com/u/30716350?v=4",
      "profile": "https://x.com/gorogoroumaru",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "ruisaraiva19",
      "name": "Rui Saraiva",
      "avatar_url": "https://avatars2.githubusercontent.com/u/7356098?v=4",
      "profile": "http://ruisaraiva.dev",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "MBakirci",
      "name": "Mehmet Bakirci",
      "avatar_url": "https://avatars2.githubusercontent.com/u/9880089?v=4",
      "profile": "http://www.bakirci.nl",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "JLambertazzo",
      "name": "Julien Bertazzo Lambert",
      "avatar_url": "https://avatars0.githubusercontent.com/u/42924425?v=4",
      "profile": "https://github.com/JLambertazzo",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "sidthesloth92",
      "name": "Dinesh Balaji",
      "avatar_url": "https://avatars3.githubusercontent.com/u/4656109?v=4",
      "profile": "http://dbwriteups.wordpress.com",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "med1001",
      "name": "MedBMoussa",
      "avatar_url": "https://avatars3.githubusercontent.com/u/26111211?v=4",
      "profile": "https://github.com/med1001",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "lucievr",
      "name": "Lucie Vrsovska",
      "avatar_url": "https://avatars.githubusercontent.com/u/46979603?v=4",
      "profile": "http://www.lucie.dev",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "jcabak",
      "name": "Jakub Cabak",
      "avatar_url": "https://avatars.githubusercontent.com/u/1818155?v=4",
      "profile": "https://github.com/jcabak",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "durgakiran",
      "name": "Palakurthi Durga Kiran Kumar",
      "avatar_url": "https://avatars.githubusercontent.com/u/17452039?v=4",
      "profile": "https://github.com/durgakiran",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "karllabrador",
      "name": "Karl Labrador",
      "avatar_url": "https://avatars.githubusercontent.com/u/58193703?v=4",
      "profile": "https://github.com/karllabrador",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "rishichawda",
      "name": "Rishi Kumar Chawda",
      "avatar_url": "https://avatars.githubusercontent.com/u/26366288?v=4",
      "profile": "http://rishikc.com",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "crocarneiro",
      "name": "Carlos Rafael de Oliveira Carneiro",
      "avatar_url": "https://avatars.githubusercontent.com/u/10589421?v=4",
      "profile": "https://github.com/crocarneiro",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "zachOS-tech",
      "name": "Zach Hoskins",
      "avatar_url": "https://avatars.githubusercontent.com/u/50255197?v=4",
      "profile": "http://zachos.tech",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "kiwan97",
      "name": "KIWAN KIM",
      "avatar_url": "https://avatars.githubusercontent.com/u/25267859?v=4",
      "profile": "https://github.com/kiwan97",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "agaertner",
      "name": "Andreas",
      "avatar_url": "https://avatars.githubusercontent.com/u/13819164?v=4",
      "profile": "https://github.com/agaertner",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "p4nu",
      "name": "Panu Valtanen",
      "avatar_url": "https://avatars.githubusercontent.com/u/28947061?v=4",
      "profile": "https://www.linkedin.com/in/panu-valtanen-446ba9108/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "d19dotca",
      "name": "Dustin Dauncey",
      "avatar_url": "https://avatars.githubusercontent.com/u/8153796?v=4",
      "profile": "http://www.d19.ca",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "heagan01",
      "name": "heagan01",
      "avatar_url": "https://avatars.githubusercontent.com/u/54394590?v=4",
      "profile": "https://github.com/heagan01",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Th0masCat",
      "name": "Sahil Jangra",
      "avatar_url": "https://avatars.githubusercontent.com/u/74812563?v=4",
      "profile": "https://github.com/Th0masCat",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "nopdotcom",
      "name": "Jay Carlson",
      "avatar_url": "https://avatars.githubusercontent.com/u/1357866?v=4",
      "profile": "https://github.com/nopdotcom",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Mikadifo",
      "name": "Michael Padilla",
      "avatar_url": "https://avatars.githubusercontent.com/u/51935560?v=4",
      "profile": "http://mikadifo.com",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "NarrowCode",
      "name": "Andreas Steinkellner",
      "avatar_url": "https://avatars.githubusercontent.com/u/6213380?v=4",
      "profile": "https://narrowcode.xyz",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "aniknia",
      "name": "aniknia",
      "avatar_url": "https://avatars.githubusercontent.com/u/40159649?v=4",
      "profile": "http://niknia.dev",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "WayneRocha",
      "name": "Wayne Rocha",
      "avatar_url": "https://avatars.githubusercontent.com/u/62760711?v=4",
      "profile": "https://github.com/WayneRocha",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "crbon",
      "name": "crbon",
      "avatar_url": "https://avatars.githubusercontent.com/u/2604330?v=4",
      "profile": "https://github.com/crbon",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "themohammadsa",
      "name": "Mohammad S",
      "avatar_url": "https://avatars.githubusercontent.com/u/59393936?v=4",
      "profile": "https://linktr.ee/themohammadsa",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "ReshadSadik",
      "name": "Reshad Sadik",
      "avatar_url": "https://avatars.githubusercontent.com/u/66641469?v=4",
      "profile": "https://github.com/ReshadSadik",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "PeterKwesiAnsah",
      "name": "Kwesi Ansah",
      "avatar_url": "https://avatars.githubusercontent.com/u/31078314?v=4",
      "profile": "https://github.com/PeterKwesiAnsah",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "monalisamsteccentric",
      "name": "Monalisa Sahoo",
      "avatar_url": "https://avatars.githubusercontent.com/u/65477771?v=4",
      "profile": "https://github.com/monalisamsteccentric",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "codewithmitesh",
      "name": "Mitesh Tank",
      "avatar_url": "https://avatars.githubusercontent.com/u/85953650?v=4",
      "profile": "https://github.com/codewithmitesh",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Ryan0204",
      "name": "Ryan",
      "avatar_url": "https://avatars.githubusercontent.com/u/82715592?v=4",
      "profile": "https://github.com/Ryan0204",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "jibranabsarulislam",
      "name": "jayway",
      "avatar_url": "https://avatars.githubusercontent.com/u/70596906?v=4",
      "profile": "https://www.jibran.me",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "afermon",
      "name": "Alex Fernandez",
      "avatar_url": "https://avatars.githubusercontent.com/u/3981106?v=4",
      "profile": "https://www.xicre.com",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Danial-Gharib",
      "name": "Danial Gharib",
      "avatar_url": "https://avatars.githubusercontent.com/u/90343552?v=4",
      "profile": "https://github.com/Danial-Gharib",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "amenk",
      "name": "Alexander Menk",
      "avatar_url": "https://avatars.githubusercontent.com/u/1087128?v=4",
      "profile": "http://www.x.com/s3lf",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "tunahangediz",
      "name": "Tunahan Gediz",
      "avatar_url": "https://avatars.githubusercontent.com/u/75015671?v=4",
      "profile": "http://tunahangediz.com",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "jeffbowen",
      "name": "Jeff Bowen",
      "avatar_url": "https://avatars.githubusercontent.com/u/272795?v=4",
      "profile": "https://refer.codes/jeff",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "ParamBirje",
      "name": "Param Birje",
      "avatar_url": "https://avatars.githubusercontent.com/u/87022870?v=4",
      "profile": "https://github.com/ParamBirje",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "prajjwalyd",
      "name": "Prajjwal Yadav",
      "avatar_url": "https://avatars.githubusercontent.com/u/111794524?v=4",
      "profile": "https://github.com/prajjwalyd",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "lyncasterc",
      "name": "Steven Cabrera",
      "avatar_url": "https://avatars.githubusercontent.com/u/49458912?v=4",
      "profile": "https://github.com/lyncasterc",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "negar-75",
      "name": "negar nasiri",
      "avatar_url": "https://avatars.githubusercontent.com/u/113235504?v=4",
      "profile": "https://github.com/negar-75",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "gauravsingh94",
      "name": "Gaurav Singh",
      "avatar_url": "https://avatars.githubusercontent.com/u/99260988?v=4",
      "profile": "https://github.com/gauravsingh94",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "NishidhJain",
      "name": "Nishidh Jain",
      "avatar_url": "https://avatars.githubusercontent.com/u/61869195?v=4",
      "profile": "https://github.com/NishidhJain",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "mishrasamiksha",
      "name": "Samiksha Mishra",
      "avatar_url": "https://avatars.githubusercontent.com/u/38784342?v=4",
      "profile": "https://github.com/mishrasamiksha",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "astuanax",
      "name": "Len Dierickx",
      "avatar_url": "https://avatars.githubusercontent.com/u/1730624?v=4",
      "profile": "http://www.astuanax.com",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "surajbobade",
      "name": "Suraj Bobade",
      "avatar_url": "https://avatars.githubusercontent.com/u/102910293?v=4",
      "profile": "https://github.com/surajbobade",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "sagarhedaoo",
      "name": "Sagar Hedaoo",
      "avatar_url": "https://avatars.githubusercontent.com/u/10000167?v=4",
      "profile": "https://sagarhedaoo.com/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "violetadev",
      "name": "V",
      "avatar_url": "https://avatars.githubusercontent.com/u/36138541?v=4",
      "profile": "http://www.violeta.dev",
      "contributions": [
        "code",
        "test"
      ]
    },
    {
      "login": "minowau",
      "name": "Prabhas Jupalli",
      "avatar_url": "https://avatars.githubusercontent.com/u/139740712?v=4",
      "profile": "https://github.com/minowau",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Pulkitxm",
      "name": "Pulkit",
      "avatar_url": "https://avatars.githubusercontent.com/u/65671483?v=4",
      "profile": "http://devpulkit.in",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "brandonyee-cs",
      "name": "Brandon Yee",
      "avatar_url": "https://avatars.githubusercontent.com/u/139765638?v=4",
      "profile": "https://github.com/brandonyee-cs",
      "contributions": [
        "content"
      ]
    },
    {
      "login": "wp043",
      "name": "Wendy Pan",
      "avatar_url": "https://avatars.githubusercontent.com/u/110360465?v=4",
      "profile": "https://github.com/wp043",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "pranavithape",
      "name": "Pranav Ithape",
      "avatar_url": "https://avatars.githubusercontent.com/u/170559714?v=4",
      "profile": "https://github.com/pranavithape",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Sukrit-Prakash",
      "name": "SUKRIT PRAKASH SINGH",
      "avatar_url": "https://avatars.githubusercontent.com/u/136228545?v=4",
      "profile": "https://github.com/Sukrit-Prakash",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "aryan262",
      "name": "Aryan Panchal",
      "avatar_url": "https://avatars.githubusercontent.com/u/97938438?v=4",
      "profile": "https://github.com/aryan262",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "samranahm",
      "name": "Samran Ahmed",
      "avatar_url": "https://avatars.githubusercontent.com/u/149153498?v=4",
      "profile": "https://github.com/samranahm",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "asatyam",
      "name": "SatyamAgrawal",
      "avatar_url": "https://avatars.githubusercontent.com/u/95954551?v=4",
      "profile": "https://github.com/Asatyam",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "saiTharunDusa",
      "name": "Sai Tharun Dusa",
      "avatar_url": "https://avatars.githubusercontent.com/u/169873642?v=4",
      "profile": "https://github.com/saiTharunDusa",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "happymvp",
      "name": "Pavlo",
      "avatar_url": "https://avatars.githubusercontent.com/u/179954458?v=4",
      "profile": "http://happymvp.com",
      "contributions": [
        "code",
        "test"
      ]
    },
    {
      "login": "AnalyticalDataArtisan",
      "name": "AnalyticalDataArtisan",
      "avatar_url": "https://avatars.githubusercontent.com/u/183036785?v=4",
      "profile": "https://github.com/AnalyticalDataArtisan",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Kieren-Foenander",
      "name": "Kieren-Foenander",
      "avatar_url": "https://avatars.githubusercontent.com/u/68266113?v=4",
      "profile": "https://github.com/Kieren-Foenander",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Trishix",
      "name": "Trishit Swarnakar",
      "avatar_url": "https://avatars.githubusercontent.com/u/170200412?v=4",
      "profile": "https://github.com/Trishix",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "cseas",
      "name": "Abhijeet Singh",
      "avatar_url": "https://avatars.githubusercontent.com/u/29686866?v=4",
      "profile": "https://blog.absingh.com/",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "meezumi",
      "name": "aaryan",
      "avatar_url": "https://avatars.githubusercontent.com/u/93996658?v=4",
      "profile": "http://aaryancreates.framer.media",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "mklikushin",
      "name": "Michael Klikushin",
      "avatar_url": "https://avatars.githubusercontent.com/u/135151016?v=4",
      "profile": "https://github.com/mklikushin",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "bhnprksh222",
      "name": "Bhanu Prakash",
      "avatar_url": "https://avatars.githubusercontent.com/u/48930756?v=4",
      "profile": "https://github.com/bhnprksh222",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "sayagodev",
      "name": "Saúl Sáyago",
      "avatar_url": "https://avatars.githubusercontent.com/u/67727553?v=4",
      "profile": "http://sayago.dev",
      "contributions": [
        "code"
      ]
    }
  ],
  "contributorsPerLine": 5,
  "projectName": "responsively-app",
  "projectOwner": "responsively-org",
  "repoType": "github",
  "repoHost": "https://github.com",
  "skipCi": true,
  "commitConvention": "none",
  "commitType": "docs"
}


================================================
FILE: .gitattributes
================================================
/desktop-app-legacy/* export-ignore


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: responsively-org # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: responsively
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/ISSUE_TEMPLATE/01-bug-report.md
================================================
---
name: "\U0001F41E Bug report"
about: Report a bug in Responsively
---

<!-- 🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
Hi there! 😄

To expedite issue processing please search open and closed issues before submitting a new one. Existing issues often contain information about workarounds, resolution, or progress updates.
🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅 -->

# 🐞 bug report

### ✍️ Description

<!-- A clear and concise description of the problem. -->

### 🕵🏼‍♂️ Is this a regression?

<!-- Did this behavior use to work in the previous version? -->

### 🔬 Minimal Reproduction

<!-- Clear steps to re-produce the issue. -->

### 🌍 Your Environment

<!-- Press `Ctrl/Cmd + F1` and paste it here. -->
<pre><code>

</code></pre>

### 🔥 Exception or Error or Screenshot

<pre><code>

</code></pre>


================================================
FILE: .github/ISSUE_TEMPLATE/02-feature-request.md
================================================
---
name: "\U0001F680 Feature request"
about: Suggest a feature for Responsively.
---

# 🚀 Feature Request

### 📝 Description

<!-- A clear and concise description of the problem or missing capability. -->

### ✨ Describe the solution you'd like

<!-- If you have a solution in mind, please describe it. -->

### ✍️ Describe alternatives you've considered

<!-- Have you considered any alternative solutions or workarounds? -->


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
# ✨ Pull Request

### 📓 Referenced Issue

<!-- Please link the related issue. Use # before the issue number and use the verbs 'fixes', 'resolves' to auto-link it, for eg, Fixes: #&lt;issue-number&gt; -->

### ℹ️ About the PR

<!-- Please provide a description of your solution if it is not clear in the related issue or if the PR has a breaking change. If there is an interesting topic to discuss or you have questions or there is an issue with electron or another library that you have used. -->

### 🖼️ Testing Scenarios / Screenshots

<!-- Please include screenshots or gif to showcase the final output. Also, try to explain the testing you did to validate your change.  -->


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "npm" # See documentation for possible values
    directory: "/desktop-app" # Location of package manifests
    schedule:
      interval: "daily"


================================================
FILE: .github/opencollective.yml
================================================
collective: responsively


================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
  - discussion
  - security
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
  This issue has been automatically marked as stale because it has not had
  recent activity. It will be closed if no further activity occurs. Thank you
  for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"

on:
  push:
    branches: [ "main" ]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [ "main" ]
  schedule:
    - cron: '44 16 * * 4'

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write
    defaults:
      run:
        working-directory: ./desktop-app

    strategy:
      fail-fast: false
      matrix:
        language: [ 'javascript' ]
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support

    steps:
    - name: Checkout repository
      uses: actions/checkout@v4

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v3
      with:
        languages: ${{ matrix.language }}
        # If you wish to specify custom queries, you can do so here or in a config file.
        # By default, queries listed here will override any specified in a config file.
        # Prefix the list here with "+" to use these queries and those in the config file.
        
        # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
        # queries: security-extended,security-and-quality

        
    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    - name: Autobuild
      uses: github/codeql-action/autobuild@v3

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun

    #   If the Autobuild fails above, remove it and uncomment the following three lines. 
    #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.

    # - run: |
    #   echo "Run, Build Application using script"
    #   ./location_of_script_within_repo/buildscript.sh

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v3

================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish

on:
  workflow_dispatch:

jobs:
  publish:
    runs-on: ${{ matrix.os }}
    defaults:
      run:
        working-directory: ./desktop-app

    strategy:
      matrix:
        os: [macos-13]

    steps:
      - name: Checkout git repo
        uses: actions/checkout@v4

      - name: Install Node and NPM
        uses: actions/setup-node@v4
        with:
          node-version: 24
          cache: ${{ !env.ACT && 'npm' || '' }} # Disable cache for nektos/act
          cache-dependency-path: ./desktop-app/yarn.lock

      - name: Install and build
        run: |
          yarn install
          yarn run postinstall
          yarn run build

      - name: Bump version
        run: |
          cd release/app
          yarn version --preid beta --prerelease
          git push

      - name: Publish releases
        env:
          # These values are used for auto updates signing
          APPLE_ID: ${{ secrets.APPLEID }}
          APPLE_ID_PASS: ${{ secrets.APPLEIDPASS }}
          CSC_LINK: ${{ secrets.CSC_LINK }}
          CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
          # This is used for uploading release assets to github
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          yarn exec electron-builder -- --publish always --win --mac --linux --arm64 --x64


================================================
FILE: .github/workflows/test.yml
================================================
name: Test

on: [push, pull_request]

jobs:
  test:
    runs-on: ${{ matrix.os }}
    defaults:
      run:
        working-directory: ./desktop-app

    strategy:
      matrix:
        os: [macos-latest]
      fail-fast: false

    steps:
      - name: Check out Git repository
        uses: actions/checkout@v4

      - name: Install Node.js and NPM
        uses: actions/setup-node@v4
        with:
          node-version: 24
          cache: ${{ !env.ACT && 'npm' || '' }} # Disable cache for nektos/act
          cache-dependency-path: ./desktop-app/yarn.lock

      - name: yarn install
        run: |
          yarn install --network-timeout 120000

      - name: yarn test
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          yarn run package
          yarn run lint
          yarn exec tsc
          yarn test


================================================
FILE: .gitignore
================================================
.DS_Store
.idea


================================================
FILE: CONTRIBUTING.md
================================================

## Contributing

Contributions are welcome and always appreciated!

To begin working on an issue, simply leave a comment indicating that you're taking it on. There's no need to be officially assigned to the issue before you start.

### Before Starting
Do keep in mind before you start working on an issue / posting a PR:
- Search existing PRs related to that issue which might close them
- Confirm if other contributors are working on the same issue

### Tips & Things to Consider
- We are active in Discord and can help out if you get stuck, [join us!](https://responsively.app/join-discord)
- PRs with tests are highly appreciated
- Avoid adding third party libraries, whenever possible
- Unless you are helping out by updating dependencies, you should not be uploading your yarn.lock or updating any dependencies in your PR
- If you are unsure where to start, contact us and we will point you to a first good issue

## Run Locally
Ensure you have the following dependencies installed:
- Install `node` and `yarn`
- Configure your IDE to support ESLint and Prettier extensions.

After having above installed, proceed through the following steps to setup the codebase locally.

- Fork the project & [clone](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) it locally.

![fork-project](https://github.com/responsively-org/responsively-app/assets/87022870/2cae8b2a-850c-4f80-8ede-32eba622a854)

- Create a new separate branch.

```bash
git checkout -b BRANCH_NAME
```
- Go to the desktop-app directory.

```bash
cd desktop-app
```

- Run the following command to install dependencies inside the desktop-app directory.

```bash
yarn
```

- This will start the app for local development with live reloading.

```bash
yarn dev
```

## Running Tests

It is crucial to test your code before submitting a pull request. Please ensure that you can make a complete production build before you submit your code for merging.

- Build the project
```bash
yarn build
```

- Now test your code using the following command
```bash
yarn test
```

Make sure the tests have successfully passed. 

## Pull Request

🎉 Now that you're ready to submit your code for merging, there are some points to keep in mind.

- Fill your PR description template accordingly.
    - Have an appropriate title and description.
    - Include relevant screenshots/gifs.

- If your PR fixes some issue, be sure to add this line with the issue **in the body** of the Pull Request description.
```text
Fixes #00000
```

- If your PR is referencing an issue
```text
Refs #00000
```

- Ensure that "Allow edits from maintainers" option is checked.

## Community
Need help on a solution from fellow contributors or want to discuss about a feature/issue? 

Join our [Discord](https://responsively.app/join-discord)!

================================================
FILE: LICENSE
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published
    by the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.


================================================
FILE: MAINTAINERS.md
================================================
# Project Maintainer

## How to become a maintainer
The following are the criteria to get considered becoming a maintainer:
- Implemented two or more features to the project.
- Being active and sticking around on GitHub and Discord, engaging with other user's on their problems and providing useful solutions.

Contributors who match the above criteria would be evaluated by the existing maintainers and invited as maintainers if they see fit.

## Responsibilities
As a project maintainer for Responsively App, your responsibilities include:

#### Code/Tech:
- Do issue triage on user reported bugs.
- Review and merge contributions.
- Advise new contributors on better practices in their code.
- Automate any manual process in the project/CI workflow.
- Constantly strive to improve the DX of the project

#### Community
- Be nice to everyone on Discord and GitHub.
- Try and provide sensible solution to user reported problems.

Always feel free to reach out to `p.manoj.vivek@gmail.com` or `manojVivek` on Discord if you have any questions. 


================================================
FILE: README.md
================================================
<div align="center">
  <img src="https://responsively.app/assets/img/logo.png" alt="Responsively Logo" width="150">
  <h1>Responsively App <a href="https://github.com/responsively-org/responsively-app/releases/latest" target="_blank"><img alt="GitHub release" src="https://img.shields.io/github/v/release/responsively-org/responsively-app"></a></h1>
  <strong>A must-have dev tool for web developers for quicker responsive web development. 🚀</strong>
  <h6>Save time by becoming 5x faster!</h6>
</div>
<br>

<p align="center">
  <a href="https://x.com/ResponsivelyApp" target="_blank">
    <img src="https://img.shields.io/twitter/follow/responsivelyApp?color=26A0ED&label=Follow&logo=twitter&logoColor=white&style=flat" alt="Twitter">
  </a>

  <a href="#contributors-" target="_blank">
    <img src="https://img.shields.io/github/all-contributors/responsively-org/responsively-app?style=flat" alt="contributors">
  </a>

  <a href="https://responsively.app/join-discord" target="_blank">
    <img src="https://img.shields.io/badge/Join%20-Discord-blue?logo=discord&logoColor=white" alt="Discord">
  </a>

  <a href="https://xscode.com/manojvivek/responsively-app" target="_blank">
    <img src="https://img.shields.io/badge/Available%20on-xs%3Acode-blue?style=?style=flat&logo=appveyor&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRF////////VXz1bAAAAAJ0Uk5T/wDltzBKAAAAlUlEQVR42uzXSwqAMAwE0Mn9L+3Ggtgkk35QwcnSJo9S+yGwM9DCooCbgn4YrJ4CIPUcQF7/XSBbx2TEz4sAZ2q1RAECBAiYBlCtvwN+KiYAlG7UDGj59MViT9hOwEqAhYCtAsUZvL6I6W8c2wcbd+LIWSCHSTeSAAECngN4xxIDSK9f4B9t377Wd7H5Nt7/Xz8eAgwAvesLRjYYPuUAAAAASUVORK5CYII=" alt="XS:Code">
  </a>

  <a href="https://github.com/responsively-org/responsively-app/issues" target="_blank">
    <img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat" alt="PRs Welcome">
  </a>

   <a href="https://opencollective.com/responsively" target="_blank">
    <img alt="Open Collective backers and sponsors" src="https://img.shields.io/opencollective/all/responsively">
  </a>
</p>

<p align="center">
  <a href="https://www.producthunt.com/posts/responsively?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-responsively" target="_blank">
    <img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=200375&theme=light&period=daily" alt="ProductHunt">
  </a>
</p>

<p align="center">
  Download Now (free!): <a href="https://responsively.app/download" target="_blank">
    responsively.app
  </a>
</p>
<br>

## Responsively App

> A modified browser built using [Electron](https://www.electronjs.org/) that helps in responsive web development.
> <br>

![Quick Demo](https://responsively.app/assets/img/responsively-app.gif)

## Features

1. Mirrored User-interactions across all devices.
2. Customizable preview layout to suit all your needs.
3. One handy elements inspector for all devices in preview.
4. 30+ built-in device profiles with the option to add custom devices.
5. One-click screenshots on all your devices.
6. Hot reloading is supported for developers.

Please visit the website to learn more about the application - https://responsively.app

## Download

The application is available for Mac, Windows and Linux platforms. Please <a href="https://responsively.app/download" target="_blank">download it from responsively.app</a>

Alternatively, MacOS users can use [`brew`](https://formulae.brew.sh/cask/responsively) <a href="https://formulae.brew.sh/cask/responsively" target="_blank"> <img src="https://badgen.net/homebrew/cask/dy/responsively" alt="Homebrew installs"></a>

```bash
brew install --cask responsively
```

Also, Windows users can use [`chocolatey`](https://chocolatey.org/packages/responsively/) <a href="https://chocolatey.org/packages/responsively/" target="_blank"> <img src="https://img.shields.io/chocolatey/dt/responsively" alt="Chocolatey installs"></a>

```bash
choco install responsively
```

or [`winget`](https://github.com/microsoft/winget-cli):

```bash
winget install ResponsivelyApp
```

Linux users using an RPM Package Manager can use `rpm`

```bash
sudo rpm -i https://github.com/responsively-org/responsively-app/releases/download/v[VERSION]/Responsively-App-[VERSION].x86_64.rpm
```

otherwise, download an AppImage from [the releases page](https://github.com/responsively-org/responsively-app/releases)

Follow us on Twitter for future updates - [![Twitter Follow](https://img.shields.io/twitter/follow/ResponsivelyApp?style=social)](https://x.com/ResponsivelyApp)

## Browser Extension

Install the handy browser extension to easily send links from your browser to the app and preview instantly.

- [Download for Chrome](https://chrome.google.com/webstore/detail/responsively-helper/jhphiidjkooiaollfiknkokgodbaddcj) <a href="https://chrome.google.com/webstore/detail/responsively-helper/jhphiidjkooiaollfiknkokgodbaddcj" target="_blank"><img alt="Chrome Web Store" src="https://img.shields.io/chrome-web-store/users/jhphiidjkooiaollfiknkokgodbaddcj?color=blue"></a>
- [Download for Firefox](https://addons.mozilla.org/en-US/firefox/addon/responsively-helper/) <a href="https://addons.mozilla.org/en-US/firefox/addon/responsively-helper/" target="_blank"><img alt="Mozilla Add-on" src="https://img.shields.io/amo/users/responsively-helper"></a>
- [Download for Edge](https://microsoftedge.microsoft.com/addons/detail/responsively-helper/ooiejjgflcgkbbehheengalibfehaojn) <a href="https://microsoftedge.microsoft.com/addons/detail/responsively-helper/ooiejjgflcgkbbehheengalibfehaojn" target="_blank"><img alt="Edge Add-on" src="https://img.shields.io/badge/dynamic/json?label=users&query=%24.activeInstallCount&url=https%3A%2F%2Fmicrosoftedge.microsoft.com%2Faddons%2Fgetproductdetailsbycrxid%2Fooiejjgflcgkbbehheengalibfehaojn"></a>

## Issues

If you face any problems while using the application, please open an issue here - https://github.com/responsively-org/responsively-app/issues

## Roadmap

Here is the roadmap of the desktop app - https://github.com/responsively-org/responsively-app/projects/

## Gold sponsors 🥇
<table style="width: 100%; border: none;" cellspacing="0" cellpadding="0" border="0" align="center" id="sponsors">
  <tr>
    <td style="border: none;"><a href="https://www.testmuai.com/?utm_medium=sponsor&utm_source=responsively-app" target="_blank">
            <img src="https://responsively.app/_next/static/media/testmu.a5a8be46.svg" style="vertical-align: middle;" width="280" />
        </a></td>
    <td rowspan="3" style="border: none;"><a href="https://github.com/sponsors/responsively-org" target="_blank">
    <img src="https://user-images.githubusercontent.com/1283424/142834528-4cd5b8eb-eeae-4437-b749-d09c96dde160.png" height="120px" alt="Sponsor to add your company logo here">
  </a></td>
  </tr>
</table>



[Become a sponsor and have your company logo here](https://opencollective.com/responsively)

## Contribute

To get started with contributing your awesome ideas to Responsively, follow the [comprehensive guide here](https://github.com/responsively-org/responsively-app/blob/main/CONTRIBUTING.md)!

## Get in touch

Come say hi to us on [Discord](https://responsively.app/join-discord)! :wave:

## Contributors ✨

Thanks go to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tbody>
    <tr>
      <td align="center" valign="top" width="20%"><a href="http://x.com/vivek_jonam"><img src="https://avatars1.githubusercontent.com/u/1283424?v=4?s=100" width="100px;" alt="Manoj Vivek"/><br /><sub><b>Manoj Vivek</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=manojVivek" title="Code">💻</a> <a href="https://github.com/responsively-org/responsively-app/commits?author=manojVivek" title="Tests">⚠️</a> <a href="#projectManagement-manojVivek" title="Project Management">📆</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/esprush"><img src="https://avatars0.githubusercontent.com/u/26249498?v=4?s=100" width="100px;" alt="Suresh P"/><br /><sub><b>Suresh P</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=esprush" title="Code">💻</a> <a href="https://github.com/responsively-org/responsively-app/commits?author=esprush" title="Tests">⚠️</a> <a href="#projectManagement-esprush" title="Project Management">📆</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/sprabowo"><img src="https://avatars2.githubusercontent.com/u/11748183?v=4?s=100" width="100px;" alt="Sigit Prabowo"/><br /><sub><b>Sigit Prabowo</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=sprabowo" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/leon0707"><img src="https://avatars1.githubusercontent.com/u/523684?v=4?s=100" width="100px;" alt="Leon Feng"/><br /><sub><b>Leon Feng</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=leon0707" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/kishoreio"><img src="https://avatars2.githubusercontent.com/u/30261988?v=4?s=100" width="100px;" alt="Kishore S"/><br /><sub><b>Kishore S</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=kishoreio" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://jjavierdguezas.github.io"><img src="https://avatars2.githubusercontent.com/u/13673443?v=4?s=100" width="100px;" alt="José Javier Rodríguez Zas"/><br /><sub><b>José Javier Rodríguez Zas</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=jjavierdguezas" title="Code">💻</a> <a href="https://github.com/responsively-org/responsively-app/commits?author=jjavierdguezas" title="Tests">⚠️</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/romanakash"><img src="https://avatars1.githubusercontent.com/u/40427975?v=4?s=100" width="100px;" alt="Roman Akash"/><br /><sub><b>Roman Akash</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=romanakash" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/RomainFrancony"><img src="https://avatars3.githubusercontent.com/u/22396965?v=4?s=100" width="100px;" alt="Romain Francony"/><br /><sub><b>Romain Francony</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=RomainFrancony" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/AARYAN-MAHENDRA"><img src="https://avatars1.githubusercontent.com/u/64866670?v=4?s=100" width="100px;" alt="AARYAN-MAHENDRA"/><br /><sub><b>AARYAN-MAHENDRA</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=AARYAN-MAHENDRA" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/Nothing-Works"><img src="https://avatars3.githubusercontent.com/u/18606648?v=4?s=100" width="100px;" alt="Andy"/><br /><sub><b>Andy</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Nothing-Works" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://github.com/Kidcredo"><img src="https://avatars0.githubusercontent.com/u/15522605?v=4?s=100" width="100px;" alt="Ryan Pais"/><br /><sub><b>Ryan Pais</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Kidcredo" title="Code">💻</a> <a href="https://github.com/responsively-org/responsively-app/commits?author=Kidcredo" title="Tests">⚠️</a></td>
      <td align="center" valign="top" width="20%"><a href="https://grafikart.fr"><img src="https://avatars1.githubusercontent.com/u/395137?v=4?s=100" width="100px;" alt="Jonathan"/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Grafikart" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/heygema"><img src="https://avatars1.githubusercontent.com/u/10743728?v=4?s=100" width="100px;" alt="Gema Anggada ✌︎"/><br /><sub><b>Gema Anggada ✌︎</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=heygema" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/jonathanurias96"><img src="https://avatars2.githubusercontent.com/u/57416786?v=4?s=100" width="100px;" alt="jonathanurias96"/><br /><sub><b>jonathanurias96</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=jonathanurias96" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://falecci.dev"><img src="https://avatars2.githubusercontent.com/u/17703824?v=4?s=100" width="100px;" alt="Federico Alecci"/><br /><sub><b>Federico Alecci</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=falecci" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://linkedin.com/in/muminjon-abduraimov/"><img src="https://avatars1.githubusercontent.com/u/24930020?v=4?s=100" width="100px;" alt="Abduraimov Muminjon"/><br /><sub><b>Abduraimov Muminjon</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=MuminjonGuru" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="20%"><a href="https://www.vlazaro.es/"><img src="https://avatars1.githubusercontent.com/u/38981659?v=4?s=100" width="100px;" alt="Víctor Lázaro"/><br /><sub><b>Víctor Lázaro</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=vlazaroes" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/kvnam"><img src="https://avatars0.githubusercontent.com/u/3608742?v=4?s=100" width="100px;" alt="Kavita Nambissan"/><br /><sub><b>Kavita Nambissan</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=kvnam" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://x.com/PrashantPalikhe"><img src="https://avatars0.githubusercontent.com/u/2657709?v=4?s=100" width="100px;" alt="Prashant Palikhe"/><br /><sub><b>Prashant Palikhe</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=prashantpalikhe" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/jaunesarmiento"><img src="https://avatars1.githubusercontent.com/u/1166928?v=4?s=100" width="100px;" alt="Jaune Sarmiento"/><br /><sub><b>Jaune Sarmiento</b></sub></a><br /><a href="#content-jaunesarmiento" title="Content">🖋</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://github.com/diego-vieira"><img src="https://avatars2.githubusercontent.com/u/930792?v=4?s=100" width="100px;" alt="Diego Vieira"/><br /><sub><b>Diego Vieira</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=diego-vieira" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/pajaydev"><img src="https://avatars0.githubusercontent.com/u/21375014?v=4?s=100" width="100px;" alt="Ajaykumar"/><br /><sub><b>Ajaykumar</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=pajaydev" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/kirubakarthikeyan"><img src="https://avatars0.githubusercontent.com/u/38885946?v=4?s=100" width="100px;" alt="Kiruba Karan"/><br /><sub><b>Kiruba Karan</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=kirubakarthikeyan" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/sebasrodriguez"><img src="https://avatars1.githubusercontent.com/u/1605931?v=4?s=100" width="100px;" alt="Sebastián Rodríguez"/><br /><sub><b>Sebastián Rodríguez</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=sebasrodriguez" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/karthick3018"><img src="https://avatars1.githubusercontent.com/u/47154512?v=4?s=100" width="100px;" alt="Karthick Raja"/><br /><sub><b>Karthick Raja</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=karthick3018" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://github.com/jzabala"><img src="https://avatars0.githubusercontent.com/u/1315054?v=4?s=100" width="100px;" alt="Johnny Zabala"/><br /><sub><b>Johnny Zabala</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=jzabala" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://rossmoody.com"><img src="https://avatars0.githubusercontent.com/u/29072694?v=4?s=100" width="100px;" alt="Ross Moody"/><br /><sub><b>Ross Moody</b></sub></a><br /><a href="#design-rossmoody" title="Design">🎨</a></td>
      <td align="center" valign="top" width="20%"><a href="https://shokri.me"><img src="https://avatars1.githubusercontent.com/u/13661520?v=4?s=100" width="100px;" alt="Mehrdad Shokri"/><br /><sub><b>Mehrdad Shokri</b></sub></a><br /><a href="#infra-mehrdad-shokri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/abakermi"><img src="https://avatars1.githubusercontent.com/u/60294727?v=4?s=100" width="100px;" alt="Abdelhak Akermi"/><br /><sub><b>Abdelhak Akermi</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=abakermi" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/crperezt"><img src="https://avatars0.githubusercontent.com/u/20329014?v=4?s=100" width="100px;" alt="Carlos Perez"/><br /><sub><b>Carlos Perez</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=crperezt" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://github.com/JayArya"><img src="https://avatars0.githubusercontent.com/u/42388314?v=4?s=100" width="100px;" alt="Jayant Arya"/><br /><sub><b>Jayant Arya</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=JayArya" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/JohnRawlins"><img src="https://avatars3.githubusercontent.com/u/42707277?v=4?s=100" width="100px;" alt="John Rawlins"/><br /><sub><b>John Rawlins</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=JohnRawlins" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/lepasq"><img src="https://avatars3.githubusercontent.com/u/53230128?v=4?s=100" width="100px;" alt="lepasq"/><br /><sub><b>lepasq</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=lepasq" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/mrfelfel"><img src="https://avatars0.githubusercontent.com/u/19575588?v=4?s=100" width="100px;" alt="mrfelfel"/><br /><sub><b>mrfelfel</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=mrfelfel" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://x.com/gorogoroumaru"><img src="https://avatars3.githubusercontent.com/u/30716350?v=4?s=100" width="100px;" alt="gorogoroumaru"/><br /><sub><b>gorogoroumaru</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=gorogoroumaru" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="http://ruisaraiva.dev"><img src="https://avatars2.githubusercontent.com/u/7356098?v=4?s=100" width="100px;" alt="Rui Saraiva"/><br /><sub><b>Rui Saraiva</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=ruisaraiva19" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://www.bakirci.nl"><img src="https://avatars2.githubusercontent.com/u/9880089?v=4?s=100" width="100px;" alt="Mehmet Bakirci"/><br /><sub><b>Mehmet Bakirci</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=MBakirci" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/JLambertazzo"><img src="https://avatars0.githubusercontent.com/u/42924425?v=4?s=100" width="100px;" alt="Julien Bertazzo Lambert"/><br /><sub><b>Julien Bertazzo Lambert</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=JLambertazzo" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://dbwriteups.wordpress.com"><img src="https://avatars3.githubusercontent.com/u/4656109?v=4?s=100" width="100px;" alt="Dinesh Balaji"/><br /><sub><b>Dinesh Balaji</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=sidthesloth92" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/med1001"><img src="https://avatars3.githubusercontent.com/u/26111211?v=4?s=100" width="100px;" alt="MedBMoussa"/><br /><sub><b>MedBMoussa</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=med1001" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="http://www.lucie.dev"><img src="https://avatars.githubusercontent.com/u/46979603?v=4?s=100" width="100px;" alt="Lucie Vrsovska"/><br /><sub><b>Lucie Vrsovska</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=lucievr" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/jcabak"><img src="https://avatars.githubusercontent.com/u/1818155?v=4?s=100" width="100px;" alt="Jakub Cabak"/><br /><sub><b>Jakub Cabak</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=jcabak" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/durgakiran"><img src="https://avatars.githubusercontent.com/u/17452039?v=4?s=100" width="100px;" alt="Palakurthi Durga Kiran Kumar"/><br /><sub><b>Palakurthi Durga Kiran Kumar</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=durgakiran" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/karllabrador"><img src="https://avatars.githubusercontent.com/u/58193703?v=4?s=100" width="100px;" alt="Karl Labrador"/><br /><sub><b>Karl Labrador</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=karllabrador" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://rishikc.com"><img src="https://avatars.githubusercontent.com/u/26366288?v=4?s=100" width="100px;" alt="Rishi Kumar Chawda"/><br /><sub><b>Rishi Kumar Chawda</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=rishichawda" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://github.com/crocarneiro"><img src="https://avatars.githubusercontent.com/u/10589421?v=4?s=100" width="100px;" alt="Carlos Rafael de Oliveira Carneiro"/><br /><sub><b>Carlos Rafael de Oliveira Carneiro</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=crocarneiro" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://zachos.tech"><img src="https://avatars.githubusercontent.com/u/50255197?v=4?s=100" width="100px;" alt="Zach Hoskins"/><br /><sub><b>Zach Hoskins</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=zachOS-tech" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/kiwan97"><img src="https://avatars.githubusercontent.com/u/25267859?v=4?s=100" width="100px;" alt="KIWAN KIM"/><br /><sub><b>KIWAN KIM</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=kiwan97" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/agaertner"><img src="https://avatars.githubusercontent.com/u/13819164?v=4?s=100" width="100px;" alt="Andreas"/><br /><sub><b>Andreas</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=agaertner" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://www.linkedin.com/in/panu-valtanen-446ba9108/"><img src="https://avatars.githubusercontent.com/u/28947061?v=4?s=100" width="100px;" alt="Panu Valtanen"/><br /><sub><b>Panu Valtanen</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=p4nu" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="http://www.d19.ca"><img src="https://avatars.githubusercontent.com/u/8153796?v=4?s=100" width="100px;" alt="Dustin Dauncey"/><br /><sub><b>Dustin Dauncey</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=d19dotca" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/heagan01"><img src="https://avatars.githubusercontent.com/u/54394590?v=4?s=100" width="100px;" alt="heagan01"/><br /><sub><b>heagan01</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=heagan01" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/Th0masCat"><img src="https://avatars.githubusercontent.com/u/74812563?v=4?s=100" width="100px;" alt="Sahil Jangra"/><br /><sub><b>Sahil Jangra</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Th0masCat" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/nopdotcom"><img src="https://avatars.githubusercontent.com/u/1357866?v=4?s=100" width="100px;" alt="Jay Carlson"/><br /><sub><b>Jay Carlson</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=nopdotcom" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://mikadifo.com"><img src="https://avatars.githubusercontent.com/u/51935560?v=4?s=100" width="100px;" alt="Michael Padilla"/><br /><sub><b>Michael Padilla</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Mikadifo" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://narrowcode.xyz"><img src="https://avatars.githubusercontent.com/u/6213380?v=4?s=100" width="100px;" alt="Andreas Steinkellner"/><br /><sub><b>Andreas Steinkellner</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=NarrowCode" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://niknia.dev"><img src="https://avatars.githubusercontent.com/u/40159649?v=4?s=100" width="100px;" alt="aniknia"/><br /><sub><b>aniknia</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=aniknia" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/WayneRocha"><img src="https://avatars.githubusercontent.com/u/62760711?v=4?s=100" width="100px;" alt="Wayne Rocha"/><br /><sub><b>Wayne Rocha</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=WayneRocha" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/crbon"><img src="https://avatars.githubusercontent.com/u/2604330?v=4?s=100" width="100px;" alt="crbon"/><br /><sub><b>crbon</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=crbon" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://linktr.ee/themohammadsa"><img src="https://avatars.githubusercontent.com/u/59393936?v=4?s=100" width="100px;" alt="Mohammad S"/><br /><sub><b>Mohammad S</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=themohammadsa" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://github.com/ReshadSadik"><img src="https://avatars.githubusercontent.com/u/66641469?v=4?s=100" width="100px;" alt="Reshad Sadik"/><br /><sub><b>Reshad Sadik</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=ReshadSadik" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/PeterKwesiAnsah"><img src="https://avatars.githubusercontent.com/u/31078314?v=4?s=100" width="100px;" alt="Kwesi Ansah"/><br /><sub><b>Kwesi Ansah</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=PeterKwesiAnsah" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/monalisamsteccentric"><img src="https://avatars.githubusercontent.com/u/65477771?v=4?s=100" width="100px;" alt="Monalisa Sahoo"/><br /><sub><b>Monalisa Sahoo</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=monalisamsteccentric" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/codewithmitesh"><img src="https://avatars.githubusercontent.com/u/85953650?v=4?s=100" width="100px;" alt="Mitesh Tank"/><br /><sub><b>Mitesh Tank</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=codewithmitesh" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/Ryan0204"><img src="https://avatars.githubusercontent.com/u/82715592?v=4?s=100" width="100px;" alt="Ryan"/><br /><sub><b>Ryan</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Ryan0204" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://www.jibran.me"><img src="https://avatars.githubusercontent.com/u/70596906?v=4?s=100" width="100px;" alt="jayway"/><br /><sub><b>jayway</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=jibranabsarulislam" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://www.xicre.com"><img src="https://avatars.githubusercontent.com/u/3981106?v=4?s=100" width="100px;" alt="Alex Fernandez"/><br /><sub><b>Alex Fernandez</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=afermon" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/Danial-Gharib"><img src="https://avatars.githubusercontent.com/u/90343552?v=4?s=100" width="100px;" alt="Danial Gharib"/><br /><sub><b>Danial Gharib</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Danial-Gharib" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://www.x.com/s3lf"><img src="https://avatars.githubusercontent.com/u/1087128?v=4?s=100" width="100px;" alt="Alexander Menk"/><br /><sub><b>Alexander Menk</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=amenk" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="20%"><a href="http://tunahangediz.com"><img src="https://avatars.githubusercontent.com/u/75015671?v=4?s=100" width="100px;" alt="Tunahan Gediz"/><br /><sub><b>Tunahan Gediz</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=tunahangediz" title="Documentation">📖</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://refer.codes/jeff"><img src="https://avatars.githubusercontent.com/u/272795?v=4?s=100" width="100px;" alt="Jeff Bowen"/><br /><sub><b>Jeff Bowen</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=jeffbowen" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/ParamBirje"><img src="https://avatars.githubusercontent.com/u/87022870?v=4?s=100" width="100px;" alt="Param Birje"/><br /><sub><b>Param Birje</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=ParamBirje" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/prajjwalyd"><img src="https://avatars.githubusercontent.com/u/111794524?v=4?s=100" width="100px;" alt="Prajjwal Yadav"/><br /><sub><b>Prajjwal Yadav</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=prajjwalyd" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/lyncasterc"><img src="https://avatars.githubusercontent.com/u/49458912?v=4?s=100" width="100px;" alt="Steven Cabrera"/><br /><sub><b>Steven Cabrera</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=lyncasterc" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/negar-75"><img src="https://avatars.githubusercontent.com/u/113235504?v=4?s=100" width="100px;" alt="negar nasiri"/><br /><sub><b>negar nasiri</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=negar-75" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://github.com/gauravsingh94"><img src="https://avatars.githubusercontent.com/u/99260988?v=4?s=100" width="100px;" alt="Gaurav Singh"/><br /><sub><b>Gaurav Singh</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=gauravsingh94" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/NishidhJain"><img src="https://avatars.githubusercontent.com/u/61869195?v=4?s=100" width="100px;" alt="Nishidh Jain"/><br /><sub><b>Nishidh Jain</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=NishidhJain" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/mishrasamiksha"><img src="https://avatars.githubusercontent.com/u/38784342?v=4?s=100" width="100px;" alt="Samiksha Mishra"/><br /><sub><b>Samiksha Mishra</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=mishrasamiksha" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="20%"><a href="http://www.astuanax.com"><img src="https://avatars.githubusercontent.com/u/1730624?v=4?s=100" width="100px;" alt="Len Dierickx"/><br /><sub><b>Len Dierickx</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=astuanax" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/surajbobade"><img src="https://avatars.githubusercontent.com/u/102910293?v=4?s=100" width="100px;" alt="Suraj Bobade"/><br /><sub><b>Suraj Bobade</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=surajbobade" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://sagarhedaoo.com/"><img src="https://avatars.githubusercontent.com/u/10000167?v=4?s=100" width="100px;" alt="Sagar Hedaoo"/><br /><sub><b>Sagar Hedaoo</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=sagarhedaoo" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://www.violeta.dev"><img src="https://avatars.githubusercontent.com/u/36138541?v=4?s=100" width="100px;" alt="V"/><br /><sub><b>V</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=violetadev" title="Code">💻</a> <a href="https://github.com/responsively-org/responsively-app/commits?author=violetadev" title="Tests">⚠️</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/minowau"><img src="https://avatars.githubusercontent.com/u/139740712?v=4?s=100" width="100px;" alt="Prabhas Jupalli"/><br /><sub><b>Prabhas Jupalli</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=minowau" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://devpulkit.in"><img src="https://avatars.githubusercontent.com/u/65671483?v=4?s=100" width="100px;" alt="Pulkit"/><br /><sub><b>Pulkit</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Pulkitxm" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/brandonyee-cs"><img src="https://avatars.githubusercontent.com/u/139765638?v=4?s=100" width="100px;" alt="Brandon Yee"/><br /><sub><b>Brandon Yee</b></sub></a><br /><a href="#content-brandonyee-cs" title="Content">🖋</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://github.com/wp043"><img src="https://avatars.githubusercontent.com/u/110360465?v=4?s=100" width="100px;" alt="Wendy Pan"/><br /><sub><b>Wendy Pan</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=wp043" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/pranavithape"><img src="https://avatars.githubusercontent.com/u/170559714?v=4?s=100" width="100px;" alt="Pranav Ithape"/><br /><sub><b>Pranav Ithape</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=pranavithape" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/Sukrit-Prakash"><img src="https://avatars.githubusercontent.com/u/136228545?v=4?s=100" width="100px;" alt="SUKRIT PRAKASH SINGH"/><br /><sub><b>SUKRIT PRAKASH SINGH</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Sukrit-Prakash" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/aryan262"><img src="https://avatars.githubusercontent.com/u/97938438?v=4?s=100" width="100px;" alt="Aryan Panchal"/><br /><sub><b>Aryan Panchal</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=aryan262" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/samranahm"><img src="https://avatars.githubusercontent.com/u/149153498?v=4?s=100" width="100px;" alt="Samran Ahmed"/><br /><sub><b>Samran Ahmed</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=samranahm" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://github.com/Asatyam"><img src="https://avatars.githubusercontent.com/u/95954551?v=4?s=100" width="100px;" alt="SatyamAgrawal"/><br /><sub><b>SatyamAgrawal</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=asatyam" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/saiTharunDusa"><img src="https://avatars.githubusercontent.com/u/169873642?v=4?s=100" width="100px;" alt="Sai Tharun Dusa"/><br /><sub><b>Sai Tharun Dusa</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=saiTharunDusa" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="http://happymvp.com"><img src="https://avatars.githubusercontent.com/u/179954458?v=4?s=100" width="100px;" alt="Pavlo"/><br /><sub><b>Pavlo</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=happymvp" title="Code">💻</a> <a href="https://github.com/responsively-org/responsively-app/commits?author=happymvp" title="Tests">⚠️</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/AnalyticalDataArtisan"><img src="https://avatars.githubusercontent.com/u/183036785?v=4?s=100" width="100px;" alt="AnalyticalDataArtisan"/><br /><sub><b>AnalyticalDataArtisan</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=AnalyticalDataArtisan" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/Kieren-Foenander"><img src="https://avatars.githubusercontent.com/u/68266113?v=4?s=100" width="100px;" alt="Kieren-Foenander"/><br /><sub><b>Kieren-Foenander</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Kieren-Foenander" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="https://github.com/Trishix"><img src="https://avatars.githubusercontent.com/u/170200412?v=4?s=100" width="100px;" alt="Trishit Swarnakar"/><br /><sub><b>Trishit Swarnakar</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=Trishix" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://blog.absingh.com/"><img src="https://avatars.githubusercontent.com/u/29686866?v=4?s=100" width="100px;" alt="Abhijeet Singh"/><br /><sub><b>Abhijeet Singh</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=cseas" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="20%"><a href="http://aaryancreates.framer.media"><img src="https://avatars.githubusercontent.com/u/93996658?v=4?s=100" width="100px;" alt="aaryan"/><br /><sub><b>aaryan</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=meezumi" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/mklikushin"><img src="https://avatars.githubusercontent.com/u/135151016?v=4?s=100" width="100px;" alt="Michael Klikushin"/><br /><sub><b>Michael Klikushin</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=mklikushin" title="Code">💻</a></td>
      <td align="center" valign="top" width="20%"><a href="https://github.com/bhnprksh222"><img src="https://avatars.githubusercontent.com/u/48930756?v=4?s=100" width="100px;" alt="Bhanu Prakash"/><br /><sub><b>Bhanu Prakash</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=bhnprksh222" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="20%"><a href="http://sayago.dev"><img src="https://avatars.githubusercontent.com/u/67727553?v=4?s=100" width="100px;" alt="Saúl Sáyago"/><br /><sub><b>Saúl Sáyago</b></sub></a><br /><a href="https://github.com/responsively-org/responsively-app/commits?author=sayagodev" title="Code">💻</a></td>
    </tr>
  </tbody>
</table>

<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind are welcome!


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

Below are the versions that are currently being supported with security updates.

| Version | Supported          |
| ------- | ------------------ |
| 1.x.x   | :white_check_mark: |
| < 1.0   | :x:                |

## Reporting a Vulnerability

Vulnerabilities can be reported in the following ways:
1. Create an issue required details (here)[https://github.com/responsively-org/responsively-app/issues].
2. Send an email to `p.manoj.vivek` at `gmail.com` with details.


================================================
FILE: browser-extension/.gitignore
================================================
node_modules
yarn.lock
dist
setCreds.sh
web-ext-artifacts


================================================
FILE: browser-extension/.vscode/settings.json
================================================
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode"
}


================================================
FILE: browser-extension/package.json
================================================
{
	"name": "Responsively-Helper",
	"version": "0.0.1",
	"description": "An extension to open current browser page in Responsively app",
	"private": true,
	"scripts": {
		"lint": "run-p lint:*",
		"lint:js": "xo",
		"lint:css": "stylelint source/**/*.css",
		"lint-fix": "run-p 'lint:* -- --fix'",
		"test": "run-s lint:* build",
		"start": "webpack serve --mode=development --hot --open",
 	 	"build": "webpack --mode=production",
		"release:cws": "webstore upload --source=dist --auto-publish",
		"release:amo": "web-ext-submit --source-dir dist",
		"release": "run-s build release:*"
	},
	"devDependencies": {
		"@babel/core": "^7.10.1",
		"@babel/plugin-proposal-class-properties": "^7.10.1",
		"@babel/plugin-proposal-object-rest-spread": "^7.10.1",
		"@babel/plugin-transform-react-constant-elements": "^7.10.1",
		"@babel/plugin-transform-runtime": "^7.10.1",
		"@babel/preset-env": "^7.10.1",
		"@babel/preset-react": "^7.10.1",
		"@ianwalter/web-ext-webpack-plugin": "^0.1.0",
		"babel-loader": "^8.1.0",
		"chrome-webstore-upload-cli": "^1.2.0",
		"copy-webpack-plugin": "^5.0.3",
		"daily-version": "^0.12.0",
		"dot-json": "^1.1.0",
		"eslint": "^6.1.0",
		"eslint-config-xo": "^0.26.0",
		"npm-run-all": "^4.1.5",
		"size-plugin": "^1.2.0",
		"stylelint": "^10.1.0",
		"stylelint-config-xo": "^0.15.0",
		"terser-webpack-plugin": "^1.3.0",
		"web-ext": "^4.2.0",
		"web-ext-submit": "^4.2.0",
		"webpack": "^4.36.1",
		"webpack-cli": "^3.3.6",
		"xo": "^0.24.0"
	},
	"dependencies": {
		"custom-protocol-check": "^1.1.0",
		"react": "^16.13.1",
		"react-dom": "^16.13.1",
		"url-loader": "^4.1.0",
		"webextension-polyfill": "^0.4.0"
	},
	"xo": {
		"envs": [
			"browser"
		],
		"ignores": [
			"dist"
		],
		"globals": [
			"browser"
		]
	},
	"stylelint": {
		"extends": "stylelint-config-xo"
	}
}


================================================
FILE: browser-extension/public/manifest.json
================================================
{
	"name": "Responsively Helper",
	"version": "0.0.2",
	"description": "An extension to open current browser page in Responsively app",
	"homepage_url": "https://responsively.app",
	"manifest_version": 2,
	"icons": {
		"128": "logo_128.png",
		"48": "logo_48.png",
		"16": "logo_16.png"
	},
	"background": {
		"persistent": false,
		"scripts": [
			"browser-polyfill.min.js",
			"background.js"
		]
	},
	"browser_action": {
    "default_icon": "logo_128.png",
		"default_title": "Open page in Responsively app",
		"default_popup": "popup.html"
	},
	"permissions": [
		"activeTab"
 ]
}


================================================
FILE: browser-extension/public/popup.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    />
    <style>
      body {
        margin: 0;
        overflow: hidden;
        width: 340px;
        background-color: #1d1b26;
        box-sizing: border-box;
      }

      .header {
        display: flex;
        justify-content: center;
        margin: 10px 0 20px;
      }

      .logo {
        height: 48px;
      }

      .anchorButton {
        color: #fd2d55;
        border-color: #fd2d55;
        display: flex;
        justify-content: center;
        border: 1px solid;
        padding: 5px;
        border-radius: 3px;
        text-decoration: none;
      }

      .popup {
        height: 200px;
        color: #fff;
        padding: 25px;
      }

      .flexCenter {
        display: flex;
        justify-content: center;
        align-items: center;
      }

      .textJustify {
        text-align: justify;
      }

      .loadingSpinner {
        height: 50px;
      }
    </style>
    <script src="browser-polyfill.min.js"></script>
  </head>
  <body>
    <div class="header">
      <img class="logo" src="logo_128.png" alt="Responsively App" />
    </div>
    <div id="app"></div>
    <script src="popup.js"></script>
  </body>
</html>


================================================
FILE: browser-extension/src/background.js
================================================
browser.browserAction.onClicked.addListener((tab) => {
  browser.tabs.executeScript({
    file: './openURL.js'
  });
});


================================================
FILE: browser-extension/src/popup.js
================================================
import openCustomProtocolURI from "custom-protocol-check";
import React, { useEffect, useState, useCallback } from "react";
import ReactDOM from "react-dom";
import spinner from "./spinner.svg";

const isChrome = () => {
  // IE11 returns undefined for window.chrome
  // and new Opera 30 outputs true for window.chrome
  // but needs to check if window.opr is not undefined
  // and new IE Edge outputs to true for window.chrome
  // and if not iOS Chrome check
  const isChromium = window.chrome;
  const winNav = window.navigator;
  const vendorName = winNav.vendor;
  const isOpera = typeof window.opr !== "undefined";
  const isIEedge = winNav.userAgent.indexOf("Edge") > -1;
  const isIOSChrome = winNav.userAgent.match("CriOS");
  return (
    (isChromium !== null &&
      typeof isChromium !== "undefined" &&
      vendorName === "Google Inc." &&
      isOpera === false &&
      isIEedge === false) ||
    isIOSChrome
  );
};

const URLOpenerNonChrome = () => {
  const [status, setStatus] = useState("loading");
  const checkProtocolAndUpdateStatus = useCallback(async () => {
    const [tab] = await window.browser.tabs.query({ currentWindow: true, active: true });
    if (!tab || !tab.url) {
      setStatus("false");
      return;
    }
    openCustomProtocolURI(
      `responsively://${tab.url}`,
      () => setStatus("false"),
      () => setStatus("true")
    );
  }, []);

  useEffect(() => {
    checkProtocolAndUpdateStatus();
  }, [checkProtocolAndUpdateStatus]);

  if (status === "loading") {
    return (
      <div className="popup">
        <div className="flexCenter">
          <img className="loadingSpinner" src={spinner} />
        </div>
      </div>
    );
  }
  if (status === "false") {
    return (
      <div className="popup">
        <div className="textJustify">
          It looks like you dont have Responsively App installed to preview the
          page in responsive mode.
        </div>
        <br />
        <br />
        <br />
        Please install the app and open it once to continue using the extension.
        <br />
        <div className="flexCenter">
          <a
            className="anchorButton"
            onClick={() => setTimeout(() => window.close(), 200)}
            href="https://responsively.app"
            target="_blank"
          >
            Install Now
          </a>
        </div>
      </div>
    );
  }
  return null;
};

const URLOpenerChrome = () => {
  const updateTabURL = useCallback(async () => {
    const [tab] = await window.browser.tabs.query({ currentWindow: true, active: true });
    if (!tab || !tab.url) {
      return;
    }
    window.browser.tabs.update({ url: `responsively://${tab.url}` });
  }, []);

  useEffect(() => {
    updateTabURL();
    setTimeout(() => {
      window.close();
    }, 5000);
  }, [updateTabURL]);

  return (
    <div className="popup">
      <div className="textJustify">
        If you have any issues seeing the responsive preview, please make sure
        Responsively app is installed.
      </div>
      <br />
      <br />
      <div className="flexCenter">
        <a
          className="anchorButton"
          onClick={() => setTimeout(() => window.close(), 200)}
          href="https://responsively.app"
          target="_blank"
        >
          Install Now
        </a>
      </div>
      <br />
      <br />
    </div>
  );
};

ReactDOM.render(
  isChrome() ? <URLOpenerChrome /> : <URLOpenerNonChrome />,
  document.getElementById("app")
);

// HMR integration
if (module.hot) {
  module.hot.accept('./popup', () => {
    const NextPopup = require('./popup').default;
    ReactDOM.render(<NextPopup />, document.getElementById('app'));
  });
}


================================================
FILE: browser-extension/webpack.config.js
================================================
const webpack = require('webpack');
const path = require('path');
const SizePlugin = require('size-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const WebExtWebpackPlugin = require('@ianwalter/web-ext-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  devtool: 'source-map',
  stats: 'errors-only',
  entry: {
    background: './src/background',
    popup: './src/popup',
    // Add HMR client
    main: [
      'webpack-hot-middleware/client?reload=true', // Use 'reload=true' for CSS
      './src/index.js', // Adjust to your main file
    ],
  },
  output: {
    path: path.join(__dirname, 'dist'),
    filename: '[name].js',
    publicPath: '/', // Required for HMR
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        include: [
          path.resolve(__dirname, "src")
        ],
        use: {
          loader: 'babel-loader',
          options: {
            presets: [
              ["@babel/preset-env", { modules: false }],
              "@babel/preset-react"
            ],
            plugins: [
              "@babel/plugin-transform-react-constant-elements",
              "@babel/plugin-proposal-object-rest-spread",
              "@babel/plugin-proposal-class-properties",
              "@babel/plugin-transform-runtime",
              'react-refresh/babel', // Add React Refresh for HMR
            ],
          },
        },
      },
      {
        test: /\.(svg|gif|png|jpg)$/,
        use: 'url-loader',
      }
    ],
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(), // Enable HMR
    new SizePlugin(),
    new CopyWebpackPlugin({
      patterns: [
        {
          from: '**/*',
          context: 'public',
        },
        {
          from: 'node_modules/webextension-polyfill/dist/browser-polyfill.min.js'
        }
      ],
    }),
    new WebExtWebpackPlugin({ sourceDir: path.join(__dirname, 'dist'), verbose: true }),
  ],
  optimization: {
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          mangle: false,
          compress: false,
          output: {
            beautify: true,
            indent_level: 2
          }
        }
      })
    ]
  }
};


================================================
FILE: desktop-app/. prettierignore
================================================
.erb/*

================================================
FILE: desktop-app/.editorconfig
================================================
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.md]
trim_trailing_whitespace = false


================================================
FILE: desktop-app/.erb/configs/.eslintrc
================================================
{
  "rules": {
    "no-console": "off",
    "global-require": "off",
    "import/no-dynamic-require": "off"
  }
}


================================================
FILE: desktop-app/.erb/configs/webpack.config.base.ts
================================================
/**
 * Base webpack config used across other specific configs
 */

import webpack from 'webpack';
import TsconfigPathsPlugins from 'tsconfig-paths-webpack-plugin';
import webpackPaths from './webpack.paths';
import { dependencies as externals } from '../../release/app/package.json';

const configuration: webpack.Configuration = {
  externals: [...Object.keys(externals || {})],

  stats: 'errors-only',

  module: {
    rules: [
      {
        test: /\.[jt]sx?$/,
        exclude: /node_modules/,
        use: {
          loader: 'ts-loader',
          options: {
            // Remove this line to enable type checking in webpack builds
            transpileOnly: true,
            compilerOptions: {
              module: 'esnext',
            },
          },
        },
      },
    ],
  },

  output: {
    path: webpackPaths.srcPath,
    // https://github.com/webpack/webpack/issues/1114
    library: {
      type: 'commonjs2',
    },
  },

  /**
   * Determine the array of extensions that should be used to resolve modules.
   */
  resolve: {
    extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'],
    modules: [webpackPaths.srcPath, 'node_modules'],
    // There is no need to add aliases here, the paths in tsconfig get mirrored
    plugins: [new TsconfigPathsPlugins()],
  },

  plugins: [
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'production',
    }),
  ],
};

export default configuration;


================================================
FILE: desktop-app/.erb/configs/webpack.config.eslint.ts
================================================
/* eslint import/no-unresolved: off, import/no-self-import: off */

module.exports = require('./webpack.config.renderer.dev').default;


================================================
FILE: desktop-app/.erb/configs/webpack.config.main.prod.ts
================================================
/**
 * Webpack config for production electron main process
 */

import path from 'path';
import webpack from 'webpack';
import { merge } from 'webpack-merge';
import TerserPlugin from 'terser-webpack-plugin';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
import checkNodeEnv from '../scripts/check-node-env';
import deleteSourceMaps from '../scripts/delete-source-maps';

checkNodeEnv('production');
deleteSourceMaps();

const devtoolsConfig =
  process.env.DEBUG_PROD === 'true'
    ? {
        devtool: 'source-map',
      }
    : {};

const configuration: webpack.Configuration = {
  ...devtoolsConfig,

  mode: 'production',

  target: 'electron-main',

  entry: {
    main: path.join(webpackPaths.srcMainPath, 'main.ts'),
    preload: path.join(webpackPaths.srcMainPath, 'preload.ts'),
    'preload-webview': path.join(
      webpackPaths.srcMainPath,
      'preload-webview.ts'
    ),
  },

  externals: ['fsevents'],

  output: {
    path: webpackPaths.distMainPath,
    filename: '[name].js',
    library: {
      type: 'umd',
    },
  },

  optimization: {
    minimizer: [
      new TerserPlugin({
        parallel: true,
      }),
    ],
  },

  plugins: [
    new BundleAnalyzerPlugin({
      analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
    }),

    /**
     * Create global constants which can be configured at compile time.
     *
     * Useful for allowing different behaviour between development builds and
     * release builds
     *
     * NODE_ENV should be production so that modules do not perform certain
     * development checks
     */
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'production',
      DEBUG_PROD: false,
      START_MINIMIZED: false,
    }),

    new webpack.DefinePlugin({
      'process.type': '"browser"',
    }),
  ],

  /**
   * Disables webpack processing of __dirname and __filename.
   * If you run the bundle in node.js it falls back to these values of node.js.
   * https://github.com/webpack/webpack/issues/2010
   */
  node: {
    __dirname: false,
    __filename: false,
  },
};

export default merge(baseConfig, configuration);


================================================
FILE: desktop-app/.erb/configs/webpack.config.preload-webview.dev.ts
================================================
import path from 'path';
import webpack from 'webpack';
import { merge } from 'webpack-merge';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
import checkNodeEnv from '../scripts/check-node-env';

// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
// at the dev webpack config is not accidentally run in a production environment
if (process.env.NODE_ENV === 'production') {
  checkNodeEnv('development');
}

const configuration: webpack.Configuration = {
  devtool: 'inline-source-map',

  mode: 'development',

  target: 'electron-preload',

  entry: path.join(webpackPaths.srcMainPath, 'preload-webview.ts'),

  output: {
    path: webpackPaths.dllPath,
    filename: 'preload-webview.js',
    library: {
      type: 'umd',
    },
  },

  plugins: [
    new BundleAnalyzerPlugin({
      analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
    }),

    /**
     * Create global constants which can be configured at compile time.
     *
     * Useful for allowing different behaviour between development builds and
     * release builds
     *
     * NODE_ENV should be production so that modules do not perform certain
     * development checks
     *
     * By default, use 'development' as NODE_ENV. This can be overriden with
     * 'staging', for example, by changing the ENV variables in the npm scripts
     */
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'development',
    }),

    new webpack.LoaderOptionsPlugin({
      debug: true,
    }),
  ],

  /**
   * Disables webpack processing of __dirname and __filename.
   * If you run the bundle in node.js it falls back to these values of node.js.
   * https://github.com/webpack/webpack/issues/2010
   */
  node: {
    __dirname: false,
    __filename: false,
  },

  watch: true,
};

export default merge(baseConfig, configuration);


================================================
FILE: desktop-app/.erb/configs/webpack.config.preload.dev.ts
================================================
import path from 'path';
import webpack from 'webpack';
import { merge } from 'webpack-merge';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
import checkNodeEnv from '../scripts/check-node-env';

// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
// at the dev webpack config is not accidentally run in a production environment
if (process.env.NODE_ENV === 'production') {
  checkNodeEnv('development');
}

const configuration: webpack.Configuration = {
  devtool: 'inline-source-map',

  mode: 'development',

  target: 'electron-preload',

  entry: path.join(webpackPaths.srcMainPath, 'preload.ts'),

  output: {
    path: webpackPaths.dllPath,
    filename: 'preload.js',
    library: {
      type: 'umd',
    },
  },

  plugins: [
    new BundleAnalyzerPlugin({
      analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
    }),

    /**
     * Create global constants which can be configured at compile time.
     *
     * Useful for allowing different behaviour between development builds and
     * release builds
     *
     * NODE_ENV should be production so that modules do not perform certain
     * development checks
     *
     * By default, use 'development' as NODE_ENV. This can be overriden with
     * 'staging', for example, by changing the ENV variables in the npm scripts
     */
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'development',
    }),

    new webpack.LoaderOptionsPlugin({
      debug: true,
    }),
  ],

  /**
   * Disables webpack processing of __dirname and __filename.
   * If you run the bundle in node.js it falls back to these values of node.js.
   * https://github.com/webpack/webpack/issues/2010
   */
  node: {
    __dirname: false,
    __filename: false,
  },

  watch: true,
};

export default merge(baseConfig, configuration);


================================================
FILE: desktop-app/.erb/configs/webpack.config.renderer.dev.dll.ts
================================================
/**
 * Builds the DLL for development electron renderer process
 */

import webpack from 'webpack';
import path from 'path';
import { merge } from 'webpack-merge';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
import { dependencies } from '../../package.json';
import checkNodeEnv from '../scripts/check-node-env';

checkNodeEnv('development');

const dist = webpackPaths.dllPath;

const configuration: webpack.Configuration = {
  context: webpackPaths.rootPath,

  devtool: 'eval',

  mode: 'development',

  target: 'electron-renderer',

  externals: ['fsevents', 'crypto-browserify'],

  /**
   * Use `module` from `webpack.config.renderer.dev.js`
   */
  module: require('./webpack.config.renderer.dev').default.module,

  entry: {
    renderer: Object.keys(dependencies || {}),
  },

  output: {
    path: dist,
    filename: '[name].dev.dll.js',
    library: {
      name: 'renderer',
      type: 'var',
    },
  },

  plugins: [
    new webpack.DllPlugin({
      path: path.join(dist, '[name].json'),
      name: '[name]',
    }),

    /**
     * Create global constants which can be configured at compile time.
     *
     * Useful for allowing different behaviour between development builds and
     * release builds
     *
     * NODE_ENV should be production so that modules do not perform certain
     * development checks
     */
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'development',
    }),

    new webpack.LoaderOptionsPlugin({
      debug: true,
      options: {
        context: webpackPaths.srcPath,
        output: {
          path: webpackPaths.dllPath,
        },
      },
    }),
  ],
};

export default merge(baseConfig, configuration);


================================================
FILE: desktop-app/.erb/configs/webpack.config.renderer.dev.ts
================================================
import 'webpack-dev-server';
import path from 'path';
import fs from 'fs';
import webpack from 'webpack';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import chalk from 'chalk';
import { merge } from 'webpack-merge';
import { execSync, spawn } from 'child_process';
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
import checkNodeEnv from '../scripts/check-node-env';

// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
// at the dev webpack config is not accidentally run in a production environment
if (process.env.NODE_ENV === 'production') {
  checkNodeEnv('development');
}

const port = process.env.PORT || 1212;
const manifest = path.resolve(webpackPaths.dllPath, 'renderer.json');
const skipDLLs =
  module.parent?.filename.includes('webpack.config.renderer.dev.dll') ||
  module.parent?.filename.includes('webpack.config.eslint');

/**
 * Warn if the DLL is not built
 */
if (
  !skipDLLs &&
  !(fs.existsSync(webpackPaths.dllPath) && fs.existsSync(manifest))
) {
  console.log(
    chalk.black.bgYellow.bold(
      'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"'
    )
  );
  execSync('npm run postinstall');
}

const configuration: webpack.Configuration = {
  devtool: 'inline-source-map',

  mode: 'development',

  target: ['web', 'electron-renderer'],

  entry: [
    `webpack-dev-server/client?http://localhost:${port}/dist`,
    'webpack/hot/only-dev-server',
    path.join(webpackPaths.srcRendererPath, 'index.tsx'),
  ],

  output: {
    path: webpackPaths.distRendererPath,
    publicPath: '/',
    filename: 'renderer.dev.js',
    library: {
      type: 'umd',
    },
  },

  module: {
    rules: [
      {
        test: /\.s?css$/,
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              modules: true,
              sourceMap: true,
              importLoaders: 1,
            },
          },
          {
            loader: 'sass-loader',
            options: {
              api: 'modern',
            },
          },
        ],
        include: /\.module\.s?(c|a)ss$/,
      },
      {
        test: /\.s?css$/,
        use: [
          'style-loader',
          'css-loader',
          {
            loader: 'sass-loader',
            options: {
              api: 'modern',
            },
          },
          {
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                plugins: [require('tailwindcss'), require('autoprefixer')],
              },
            },
          },
        ],
        exclude: /\.module\.s?(c|a)ss$/,
      },
      // Fonts
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/i,
        type: 'asset/resource',
      },
      // Images
      {
        test: /\.(png|jpg|jpeg|gif)$/i,
        type: 'asset/resource',
      },
      // SVG
      {
        test: /\.svg$/,
        use: [
          {
            loader: '@svgr/webpack',
            options: {
              prettier: false,
              svgo: false,
              svgoConfig: {
                plugins: [{ removeViewBox: false }],
              },
              titleProp: true,
              ref: true,
            },
          },
          'file-loader',
        ],
      },
      {
        test: /\.(mp3)$/i,
        use: [
          {
            loader: 'file-loader',
          },
        ],
      },
    ],
  },
  plugins: [
    ...(skipDLLs
      ? []
      : [
          new webpack.DllReferencePlugin({
            context: webpackPaths.dllPath,
            manifest: require(manifest),
            sourceType: 'var',
          }),
        ]),

    new webpack.NoEmitOnErrorsPlugin(),

    /**
     * Create global constants which can be configured at compile time.
     *
     * Useful for allowing different behaviour between development builds and
     * release builds
     *
     * NODE_ENV should be production so that modules do not perform certain
     * development checks
     *
     * By default, use 'development' as NODE_ENV. This can be overriden with
     * 'staging', for example, by changing the ENV variables in the npm scripts
     */
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'development',
    }),

    new webpack.LoaderOptionsPlugin({
      debug: true,
    }),

    new ReactRefreshWebpackPlugin(),

    new HtmlWebpackPlugin({
      filename: path.join('index.html'),
      template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
      minify: {
        collapseWhitespace: true,
        removeAttributeQuotes: true,
        removeComments: true,
      },
      isBrowser: false,
      env: process.env.NODE_ENV,
      isDevelopment: process.env.NODE_ENV !== 'production',
      nodeModules: webpackPaths.appNodeModulesPath,
    }),
  ],

  node: {
    __dirname: false,
    __filename: false,
  },

  devServer: {
    port,
    compress: true,
    hot: true,
    headers: { 'Access-Control-Allow-Origin': '*' },
    static: {
      publicPath: '/',
    },
    historyApiFallback: {
      verbose: true,
    },
    setupMiddlewares(middlewares) {
      console.log('Starting preload.js builder...');
      const preloadProcess = spawn('npm', ['run', 'start:preload'], {
        shell: true,
        stdio: 'inherit',
      })
        .on('close', (code: number) => process.exit(code!))
        .on('error', (spawnError) => console.error(spawnError));

      console.log('Starting preload-webview.js builder...');
      const preloadWebviewProcess = spawn(
        'npm',
        ['run', 'start:preloadWebview'],
        {
          shell: true,
          stdio: 'inherit',
        }
      )
        .on('close', (code: number) => process.exit(code!))
        .on('error', (spawnError) => console.error(spawnError));

      console.log('Starting Main Process...');
      let args = ['run', 'start:main'];
      if (process.env.MAIN_ARGS) {
        args = args.concat(
          ['--', ...process.env.MAIN_ARGS.matchAll(/"[^"]+"|[^\s"]+/g)].flat()
        );
      }
      spawn('npm', args, {
        shell: true,
        stdio: 'inherit',
      })
        .on('close', (code: number) => {
          preloadProcess.kill();
          preloadWebviewProcess.kill();
          process.exit(code!);
        })
        .on('error', (spawnError) => console.error(spawnError));
      return middlewares;
    },
  },
};

export default merge(baseConfig, configuration);


================================================
FILE: desktop-app/.erb/configs/webpack.config.renderer.prod.ts
================================================
/**
 * Build config for electron renderer process
 */

import path from 'path';
import webpack from 'webpack';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
import { merge } from 'webpack-merge';
import TerserPlugin from 'terser-webpack-plugin';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
import checkNodeEnv from '../scripts/check-node-env';
import deleteSourceMaps from '../scripts/delete-source-maps';

checkNodeEnv('production');
deleteSourceMaps();

const devtoolsConfig =
  process.env.DEBUG_PROD === 'true'
    ? {
        devtool: 'source-map',
      }
    : {};

const configuration: webpack.Configuration = {
  ...devtoolsConfig,

  mode: 'production',

  target: ['web', 'electron-renderer'],

  entry: [path.join(webpackPaths.srcRendererPath, 'index.tsx')],

  externals: ['fsevents'],

  output: {
    path: webpackPaths.distRendererPath,
    publicPath: './',
    filename: 'renderer.js',
    library: {
      type: 'umd',
    },
  },

  module: {
    rules: [
      {
        test: /\.s?(a|c)ss$/,
        use: [
          MiniCssExtractPlugin.loader,
          {
            loader: 'css-loader',
            options: {
              modules: true,
              sourceMap: true,
              importLoaders: 1,
            },
          },
          {
            loader: 'sass-loader',
            options: {
              api: 'modern',
            },
          },
        ],
        include: /\.module\.s?(c|a)ss$/,
      },
      {
        test: /\.s?(a|c)ss$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          {
            loader: 'sass-loader',
            options: {
              api: 'modern',
            },
          },
          {
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                plugins: [require('tailwindcss'), require('autoprefixer')],
              },
            },
          },
        ],
        exclude: /\.module\.s?(c|a)ss$/,
      },
      // Fonts
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/i,
        type: 'asset/resource',
      },
      // Images
      {
        test: /\.(png|svg|jpg|jpeg|gif)$/i,
        type: 'asset/resource',
      },
      // SVG
      {
        test: /\.svg$/,
        use: [
          {
            loader: '@svgr/webpack',
            options: {
              prettier: false,
              svgo: false,
              svgoConfig: {
                plugins: [{ removeViewBox: false }],
              },
              titleProp: true,
              ref: true,
            },
          },
          'file-loader',
        ],
      },
      {
        test: /\.(mp3)$/i,
        use: [
          {
            loader: 'file-loader',
          },
        ],
      },
    ],
  },

  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        parallel: true,
      }),
      new CssMinimizerPlugin(),
    ],
  },

  plugins: [
    /**
     * Create global constants which can be configured at compile time.
     *
     * Useful for allowing different behaviour between development builds and
     * release builds
     *
     * NODE_ENV should be production so that modules do not perform certain
     * development checks
     */
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'production',
      DEBUG_PROD: false,
    }),

    new MiniCssExtractPlugin({
      filename: 'style.css',
    }),

    new BundleAnalyzerPlugin({
      analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
    }),

    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
      minify: {
        collapseWhitespace: true,
        removeAttributeQuotes: true,
        removeComments: true,
      },
      isBrowser: false,
      isDevelopment: process.env.NODE_ENV !== 'production',
    }),

    new webpack.DefinePlugin({
      'process.type': '"browser"',
    }),
  ],
};

export default merge(baseConfig, configuration);


================================================
FILE: desktop-app/.erb/configs/webpack.paths.ts
================================================
const path = require('path');

const rootPath = path.join(__dirname, '../..');

const dllPath = path.join(__dirname, '../dll');

const srcPath = path.join(rootPath, 'src');
const srcMainPath = path.join(srcPath, 'main');
const srcRendererPath = path.join(srcPath, 'renderer');

const releasePath = path.join(rootPath, 'release');
const appPath = path.join(releasePath, 'app');
const appPackagePath = path.join(appPath, 'package.json');
const appNodeModulesPath = path.join(appPath, 'node_modules');
const srcNodeModulesPath = path.join(srcPath, 'node_modules');

const distPath = path.join(appPath, 'dist');
const distMainPath = path.join(distPath, 'main');
const distRendererPath = path.join(distPath, 'renderer');

const buildPath = path.join(releasePath, 'build');

export default {
  rootPath,
  dllPath,
  srcPath,
  srcMainPath,
  srcRendererPath,
  releasePath,
  appPath,
  appPackagePath,
  appNodeModulesPath,
  srcNodeModulesPath,
  distPath,
  distMainPath,
  distRendererPath,
  buildPath,
};


================================================
FILE: desktop-app/.erb/mocks/fileMock.js
================================================
export default 'test-file-stub';


================================================
FILE: desktop-app/.erb/scripts/.eslintrc
================================================
{
  "rules": {
    "no-console": "off",
    "global-require": "off",
    "import/no-dynamic-require": "off",
    "import/no-extraneous-dependencies": "off"
  }
}


================================================
FILE: desktop-app/.erb/scripts/check-build-exists.ts
================================================
// Check if the renderer and main bundles are built
import path from 'path';
import chalk from 'chalk';
import fs from 'fs';
import webpackPaths from '../configs/webpack.paths';

const mainPath = path.join(webpackPaths.distMainPath, 'main.js');
const rendererPath = path.join(webpackPaths.distRendererPath, 'renderer.js');

if (!fs.existsSync(mainPath)) {
  throw new Error(
    chalk.whiteBright.bgRed.bold(
      'The main process is not built yet. Build it by running "yarn run build:main"'
    )
  );
}

if (!fs.existsSync(rendererPath)) {
  throw new Error(
    chalk.whiteBright.bgRed.bold(
      'The renderer process is not built yet. Build it by running "yarn run build:renderer"'
    )
  );
}


================================================
FILE: desktop-app/.erb/scripts/check-native-dep.js
================================================
import fs from 'fs';
import chalk from 'chalk';
import {execSync} from 'child_process';
import {dependencies} from '../../package.json';

if (dependencies) {
  const dependenciesKeys = Object.keys(dependencies);
  const nativeDeps = fs
    .readdirSync('node_modules')
    .filter((folder) => fs.existsSync(`node_modules/${folder}/binding.gyp`));
  if (nativeDeps.length === 0) {
    process.exit(0);
  }
  try {
    // Find the reason for why the dependency is installed. If it is installed
    // because of a devDependency then that is okay. Warn when it is installed
    // because of a dependency
    const {dependencies: dependenciesObject} = JSON.parse(
      execSync(`npm ls ${nativeDeps.join(' ')} --json`).toString()
    );
    const rootDependencies = Object.keys(dependenciesObject);
    const filteredRootDependencies = rootDependencies.filter((rootDependency) =>
      dependenciesKeys.includes(rootDependency)
    );
    if (filteredRootDependencies.length > 0) {
      const plural = filteredRootDependencies.length > 1;
      console.log(`
 ${chalk.whiteBright.bgYellow.bold('Webpack does not work with native dependencies.')}
${chalk.bold(filteredRootDependencies.join(', '))} ${
        plural ? 'are native dependencies' : 'is a native dependency'
      } and should be installed inside of the "./release/app" folder.
 First, uninstall the packages from "./package.json":
${chalk.whiteBright.bgGreen.bold('npm uninstall your-package')}
 ${chalk.bold('Then, instead of installing the package to the root "./package.json":')}
${chalk.whiteBright.bgRed.bold('npm install your-package')}
 ${chalk.bold('Install the package to "./release/app/package.json"')}
${chalk.whiteBright.bgGreen.bold('cd ./release/app && npm install your-package')}
 Read more about native dependencies at:
${chalk.bold(
  'https://electron-react-boilerplate.js.org/docs/adding-dependencies/#module-structure'
)}
 `);
      process.exit(1);
    }
  } catch (e) {
    console.log('Native dependencies could not be checked');
  }
}


================================================
FILE: desktop-app/.erb/scripts/check-node-env.js
================================================
import chalk from 'chalk';

export default function checkNodeEnv(expectedEnv) {
  if (!expectedEnv) {
    throw new Error('"expectedEnv" not set');
  }

  if (process.env.NODE_ENV !== expectedEnv) {
    console.log(
      chalk.whiteBright.bgRed.bold(
        `"process.env.NODE_ENV" must be "${expectedEnv}" to use this webpack config`
      )
    );
    process.exit(2);
  }
}


================================================
FILE: desktop-app/.erb/scripts/check-port-in-use.js
================================================
import chalk from 'chalk';
import detectPort from 'detect-port';

const port = process.env.PORT || '1212';

detectPort(port, (err, availablePort) => {
  if (port !== String(availablePort)) {
    throw new Error(
      chalk.whiteBright.bgRed.bold(
        `Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 yarn start`
      )
    );
  } else {
    process.exit(0);
  }
});


================================================
FILE: desktop-app/.erb/scripts/clean.js
================================================
import rimraf from 'rimraf';
import webpackPaths from '../configs/webpack.paths';

const foldersToRemove = [webpackPaths.distPath, webpackPaths.buildPath, webpackPaths.dllPath];

foldersToRemove.forEach((folder) => {
  rimraf.sync(folder);
});


================================================
FILE: desktop-app/.erb/scripts/delete-source-maps.js
================================================
import path from 'path';
import rimraf from 'rimraf';
import webpackPaths from '../configs/webpack.paths';

export default function deleteSourceMaps() {
  rimraf.sync(path.join(webpackPaths.distMainPath, '*.js.map'));
  rimraf.sync(path.join(webpackPaths.distRendererPath, '*.js.map'));
}


================================================
FILE: desktop-app/.erb/scripts/electron-rebuild.js
================================================
import {execSync} from 'child_process';
import fs from 'fs';
import {dependencies} from '../../release/app/package.json';
import webpackPaths from '../configs/webpack.paths';

if (Object.keys(dependencies || {}).length > 0 && fs.existsSync(webpackPaths.appNodeModulesPath)) {
  const electronRebuildCmd =
    '../../node_modules/.bin/electron-rebuild --force --types prod,dev,optional --module-dir .';
  const cmd =
    process.platform === 'win32' ? electronRebuildCmd.replace(/\//g, '\\') : electronRebuildCmd;
  execSync(cmd, {
    cwd: webpackPaths.appPath,
    stdio: 'inherit',
  });
}


================================================
FILE: desktop-app/.erb/scripts/link-modules.ts
================================================
import fs from 'fs';
import webpackPaths from '../configs/webpack.paths';

const {srcNodeModulesPath} = webpackPaths;
const {appNodeModulesPath} = webpackPaths;

if (!fs.existsSync(srcNodeModulesPath) && fs.existsSync(appNodeModulesPath)) {
  fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, 'junction');
}


================================================
FILE: desktop-app/.erb/scripts/notarize.js
================================================
const {notarize} = require('@electron/notarize');

exports.default = async function notarizeMacos(context) {
  const {electronPlatformName, appOutDir} = context;
  if (electronPlatformName !== 'darwin') {
    return;
  }

  if (process.env.CI !== 'true') {
    console.warn('Skipping notarizing step. Packaging is not running in CI');
    return;
  }

  if (
    !('APPLE_ID' in process.env && 'APPLE_ID_PASS' in process.env && 'APPLE_TEAM_ID' in process.env)
  ) {
    console.warn(
      'Skipping notarizing step. APPLE_ID, APPLE_ID_PASS, and APPLE_TEAM_ID env variables must be set'
    );
    return;
  }

  const appName = context.packager.appInfo.productFilename;

  await notarize({
    appPath: `${appOutDir}/${appName}.app`,
    appleId: process.env.APPLE_ID,
    appleIdPassword: process.env.APPLE_ID_PASS,
    teamId: process.env.APPLE_TEAM_ID,
  });
};


================================================
FILE: desktop-app/.eslintignore
================================================
# Logs
logs
*.log

# Runtime data
pids
*.pid
*.seed

# Coverage directory used by tools like istanbul
coverage
.eslintcache

# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules

# OSX
.DS_Store

release/app/dist
release/build
.erb/dll

.idea
npm-debug.log.*
*.css.d.ts
*.sass.d.ts
*.scss.d.ts

# eslint ignores hidden directories by default:
# https://github.com/eslint/eslint/issues/8429
!.erb
.erb/configs/


================================================
FILE: desktop-app/.eslintrc.js
================================================
module.exports = {
  env: {
    browser: true,
    node: true,
    es2021: true,
  },
  parser: '@typescript-eslint/parser',
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:react/recommended',
    'plugin:react-hooks/recommended',
    'plugin:import/recommended',
    'plugin:import/typescript',
    'plugin:jsx-a11y/recommended',
    'plugin:promise/recommended',
    'plugin:prettier/recommended', // must be last — disables conflicting rules
  ],
  rules: {
    'import/no-extraneous-dependencies': 'off',
    'import/no-unresolved': 'error',
    'import/prefer-default-export': 'off',
    'import/extensions': [
      'error',
      'ignorePackages',
      {ts: 'never', tsx: 'never', js: 'never', jsx: 'never'},
    ],

    // Since React 17 and typescript 4.1 you can safely disable the rule
    'react/react-in-jsx-scope': 'off',
    'react/require-default-props': 'off',

    // Relax rules that are too noisy for this codebase
    '@typescript-eslint/no-var-requires': 'off',
    '@typescript-eslint/no-explicit-any': 'warn',
    '@typescript-eslint/no-empty-function': 'warn',
  },
  parserOptions: {
    ecmaVersion: 2020,
    sourceType: 'module',
    project: './tsconfig.json',
    tsconfigRootDir: __dirname,
    createDefaultProgram: true,
  },
  settings: {
    react: {
      version: 'detect',
    },
    'import/resolver': {
      // See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below
      node: {},
      webpack: {
        config: require.resolve('./.erb/configs/webpack.config.eslint.ts'),
      },
      typescript: {},
    },
    'import/parsers': {
      '@typescript-eslint/parser': ['.ts', '.tsx'],
    },
  },
};


================================================
FILE: desktop-app/.gitattributes
================================================
*       text    eol=lf
*.exe   binary
*.png   binary
*.jpg   binary
*.jpeg  binary
*.ico   binary
*.icns  binary
*.eot   binary
*.otf   binary
*.ttf   binary
*.woff  binary
*.woff2 binary


================================================
FILE: desktop-app/.gitignore
================================================
# Logs
logs
*.log

# Runtime data
pids
*.pid
*.seed

# Coverage directory used by tools like istanbul
coverage
.eslintcache

# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules

# OSX
.DS_Store

release/app/dist
release/build
.erb/dll

.idea
npm-debug.log.*
*.css.d.ts
*.sass.d.ts
*.scss.d.ts


================================================
FILE: desktop-app/.husky/pre-commit
================================================
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged


================================================
FILE: desktop-app/.prettierrc
================================================
{
  "overrides": [
    {
      "files": [".prettierrc", ".babelrc", ".eslintrc", ".stylelintrc"],
      "options": {
        "parser": "json"
      }
    }
  ],
  "arrowParens": "always",
  "singleQuote": true,
  "bracketSpacing": false,
  "printWidth": 100,
  "tailwindConfig": "./tailwind.config.js",
  "trailingComma": "es5"
}

================================================
FILE: desktop-app/.vscode/settings.json
================================================
{
  "files.associations": {
    ".eslintrc": "jsonc",
    ".prettierrc": "jsonc",
    ".eslintignore": "ignore"
  },
  
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "html",
    "typescriptreact"
  ],

  "javascript.validate.enable": false,
  "javascript.format.enable": false,
  "typescript.format.enable": false,

  "search.exclude": {
    ".git": true,
    ".eslintcache": true,
    ".erb/dll": true,
    "release/{build,app/dist}": true,
    "node_modules": true,
    "npm-debug.log.*": true,
    "test/**/__snapshots__": true,
    "package-lock.json": true,
    "*.{css,sass,scss}.d.ts": true
  }
}


================================================
FILE: desktop-app/CHANGELOG.md
================================================
# 2.1.0

- Migrate to `css-minifier-webpack-plugin`

# 2.0.1

## Fixes

- Fix broken css linking in production build

# 2.0.0

## Breaking Changes

- drop redux
- remove counter example app
- simplify directory structure
- move `dll` dir to `.erb` dir
- fix icon/font import paths
- migrate to `react-refresh` from `react-hot-loader`
- migrate to webpack@5
- migrate to electron@11
- remove e2e tests and testcafe integration
- rename `app` dir to more conventional `src` dir
- rename `resources` dir to `assets`
- simplify npm scripts
- drop stylelint
- simplify styling of boilerplate app
- remove `START_HOT` env variable
- notarize support
- landing page boilerplate
- docs updates
- restore removed debugging support

# 1.4.0

- Migrate to `eslint-config-erb@2`
- Rename `dev` npm script to `start`
- GitHub Actions: only publish GitHub releases when on master branch

# 1.3.1

- Fix sass building bug ([#2540](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2540))
- Fix CI bug related to E2E tests and network timeouts
- Move automated dependency PRs to `next` ([#2554](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2554))
- Bump dependencies to patch semver

# 1.3.0

- Fixes E2E tests ([#2516](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2516))
- Fixes preload entrypoint ([#2503](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2503))
- Downgrade to `electron@8`
- Bump dependencies to latest semver

# 1.2.0

- Migrate to redux toolkit
- Lazy load routes with react suspense
- Drop support for azure-pipelines and use only github actions
- Bump all deps to latest semver
- Remove `test-e2e` script from tests (blocked on release of https://github.com/DevExpress/testcafe-browser-provider-electron/pull/65)
- Swap `typed-css-modules-webpack-plugin` for `typings-for-css-modules-loader`
- Use latest version of `eslint-config-erb`
- Remove unnecessary file extensions from ts exclude
- Add experimental support for vscode debugging
- Revert https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2365 as default for users, provide as opt in option

# 1.1.0

- Fix #2402
- Simplify configs (https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2406)

# 1.0.0

- Migrate to TypeScript from Flow ([#2363](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2363))
- Use browserslist for `@babel/preset-env` targets ([#2368](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2368))
- Use preload script, disable `nodeIntegration` in renderer process for [improved security](https://www.electronjs.org/docs/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content) ([#2365](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2365))
- Add support for azure pipelines ([#2369](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2369))
- Disable sourcemaps in production

# 0.18.1 (2019.12.12)

- Fix HMR env bug ([#2343](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2343))
- Bump all deps to latest semver
- Bump to `electron@7`

# 0.18.0 (2019.11.19)

- Bump electron to `electron@6` (`electron@7` introduces breaking changes to testcafe end to end tests)
- Revert back to [two `package.json` structure](https://www.electron.build/tutorials/two-package-structure)
- Bump all deps to latest semver

# 0.17.1 (2018.11.20)

- Fix `yarn test-e2e` and testcafe for single package.json structure
- Fixes incorrect path in `yarn start` script
- Bumped deps
- Bump g++ in travis
- Change clone arguments to clone only master
- Change babel config to target current electron version

For full change list, see https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2021

# 0.17.0 (2018.10.30)

- upgraded to `babel@7` (thanks to @vikr01 🎉🎉🎉)
- migrated from [two `package.json` structure](https://www.electron.build/tutorials/two-package-structure) (thanks to @HyperSprite!)
- initial auto update support (experimental)
- migrate from greenkeeper to [renovate](https://renovatebot.com)
- added issue template
- use `babel-preset-env` to target current electron version
- add [opencollective](https://opencollective.com/electron-react-boilerplate-594) banner message display in postinstall script (help support ERB 🙏)
- fix failing ci issues

# 0.16.0 (2018.10.3)

- removed unused dependencies
- migrate from `react-redux-router` to `connect-react-router`
- move webpack configs to `./webpack` dir
- use `g++` on travis when testing linux
- migrate from `spectron` to `testcafe` for e2e tests
- add linting support for config styles
- changed stylelint config
- temporarily disabled flow in appveyor to make ci pass
- added necessary infra to publish releases from ci

# 0.15.0 (2018.8.25)

- Performance: cache webpack uglify results
- Feature: add start minimized feature
- Feature: lint and fix styles with prettier and stylelint
- Feature: add greenkeeper support

# 0.14.0 (2018.5.24)

- Improved CI timings
- Migrated README commands to yarn from npm
- Improved vscode config
- Updated all dependencies to latest semver
- Fix `electron-rebuild` script bug
- Migrated to `mini-css-extract-plugin` from `extract-text-plugin`
- Added `optimize-css-assets-webpack-plugin`
- Run `prettier` on json, css, scss, and more filetypes

# 0.13.3 (2018.5.24)

- Add git precommit hook, when git commit will use `prettier` to format git add code
- Add format code function in `lint-fix` npm script which can use `prettier` to format project js code

# 0.13.2 (2018.1.31)

- Hot Module Reload (HMR) fixes
- Bumped all dependencies to latest semver
- Prevent error propagation of `CheckNativeDeps` script

# 0.13.1 (2018.1.13)

- Hot Module Reload (HMR) fixes
- Bumped all dependencies to latest semver
- Fixed electron-rebuild script
- Fixed tests scripts to run on all platforms
- Skip redux logs in console in test ENV

# 0.13.0 (2018.1.6)

#### Additions

- Add native dependencies check on postinstall
- Updated all dependencies to latest semver

# 0.12.0 (2017.7.8)

#### Misc

- Removed `babel-polyfill`
- Renamed and alphabetized npm scripts

#### Breaking

- Changed node dev `__dirname` and `__filename` to node built in fn's (https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/1035)
- Renamed `src/bundle.js` to `src/renderer.prod.js` for consistency
- Renamed `dll/vendor.js` to `dll/renderer.dev.dll.js` for consistency

#### Additions

- Enable node_modules cache on CI

# 0.11.2 (2017.5.1)

Yay! Another patch release. This release mostly includes refactorings and router bug fixes. Huge thanks to @anthonyraymond!

⚠️ Windows electron builds are failing because of [this issue](https://github.com/electron/electron/issues/9321). This is not an issue with the boilerplate ⚠️

#### Breaking

- **Renamed `./src/main.development.js` => `./src/main.{dev,prod}.js`:** [#963](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/963)

#### Fixes

- **Fixed reloading when not on `/` path:** [#958](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/958) [#949](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/949)

#### Additions

- **Added support for stylefmt:** [#960](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/960)

# 0.11.1 (2017.4.23)

You can now debug the production build with devtools like so:

```
DEBUG_PROD=true npm run package
```

🎉🎉🎉

#### Additions

- **Added support for debugging production build:** [#fab245a](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/941/commits/fab245a077d02a09630f74270806c0c534a4ff95)

#### Bug Fixes

- **Fixed bug related to importing native dependencies:** [#933](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/933)

#### Improvements

- **Updated all deps to latest semver**

# 0.11.0 (2017.4.19)

Here's the most notable changes since `v0.10.0`. Its been about a year since a release has been pushed. Expect a new release to be published every 3-4 weeks.

#### Breaking Changes

- **Dropped support for node < 6**
- **Refactored webpack config files**
- **Migrate to two-package.json project structure**
- **Updated all devDeps to latest semver**
- **Migrated to Jest:** [#768](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/768)
- **Migrated to `react-router@4`**
- **Migrated to `electron-builder@4`**
- **Migrated to `webpack@2`**
- **Migrated to `react-hot-loader@3`**
- **Changed default live reload server PORT to `1212` from `3000`**

#### Additions

- **Added support for Yarn:** [#451](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/451)
- **Added support for Flow:** [#425](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/425)
- **Added support for stylelint:** [#911](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/911)
- **Added support for electron-builder:** [#876](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/876)
- **Added optional support for SASS:** [#880](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/880)
- **Added support for eslint-plugin-flowtype:** [#911](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/911)
- **Added support for appveyor:** [#280](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/280)
- **Added support for webpack dlls:** [#860](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/860)
- **Route based code splitting:** [#884](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/884)
- **Added support for Webpack Bundle Analyzer:** [#922](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/922)

#### Improvements

- **Parallelize renderer and main build processes when running `npm run build`**
- **Dynamically generate electron app menu**
- **Improved vscode integration:** [#856](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/856)

#### Bug Fixes

- **Fixed hot module replacement race condition bug:** [#917](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/917) [#920](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/920)

# 0.10.0 (2016.4.18)

#### Improvements

- **Use Babel in main process with Webpack build:** [#201](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/201)
- **Change targets to built-in support by webpack:** [#197](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/197)
- **use es2015 syntax for webpack configs:** [#195](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/195)
- **Open application when webcontent is loaded:** [#192](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/192)
- **Upgraded dependencies**

#### Bug fixed

- **Fix `npm list electron-prebuilt` in package.js:** [#188](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/188)

# 0.9.0 (2016.3.23)

#### Improvements

- **Added [redux-logger](https://github.com/fcomb/redux-logger)**
- **Upgraded [react-router-redux](https://github.com/reactjs/react-router-redux) to v4**
- **Upgraded dependencies**
- **Added `npm run dev` command:** [#162](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/162)
- **electron to v0.37.2**

#### Breaking Changes

- **css module as default:** [#154](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/154).
- **set default NODE_ENV to production:** [#140](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/140)

# 0.8.0 (2016.2.17)

#### Bug fixed

- **Fix lint errors**
- **Fix Webpack publicPath for production builds**: [#119](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/119).
- **package script now chooses correct OS icon extension**

#### Improvements

- **babel 6**
- **Upgrade Dependencies**
- **Enable CSS source maps**
- **Add json-loader**: [#128](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/128).
- **react-router 2.0 and react-router-redux 3.0**

# 0.7.1 (2015.12.27)

#### Bug fixed

- **Fixed npm script on windows 10:** [#103](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/103).
- **history and react-router version bump**: [#109](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/109), [#110](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/110).

#### Improvements

- **electron 0.36**

# 0.7.0 (2015.12.16)

#### Bug fixed

- **Fixed process.env.NODE_ENV variable in webpack:** [#74](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/74).
- **add missing object-assign**: [#76](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/76).
- **packaging in npm@3:** [#77](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/77).
- **compatibility in windows:** [#100](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/100).
- **disable chrome debugger in production env:** [#102](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/102).

#### Improvements

- **redux**
- **css-modules**
- **upgrade to react-router 1.x**
- **unit tests**
- **e2e tests**
- **travis-ci**
- **upgrade to electron 0.35.x**
- **use es2015**
- **check dev engine for node and npm**

# 0.6.5 (2015.11.7)

#### Improvements

- **Bump style-loader to 0.13**
- **Bump css-loader to 0.22**

# 0.6.4 (2015.10.27)

#### Improvements

- **Bump electron-debug to 0.3**

# 0.6.3 (2015.10.26)

#### Improvements

- **Initialize ExtractTextPlugin once:** [#64](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/64).

# 0.6.2 (2015.10.18)

#### Bug fixed

- **Babel plugins production env not be set properly:** [#57](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/57).

# 0.6.1 (2015.10.17)

#### Improvements

- **Bump electron to v0.34.0**

# 0.6.0 (2015.10.16)

#### Breaking Changes

- **From react-hot-loader to react-transform**

# 0.5.2 (2015.10.15)

#### Improvements

- **Run tests with babel-register:** [#29](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/29).

# 0.5.1 (2015.10.12)

#### Bug fixed

- **Fix #51:** use `path.join(__dirname` instead of `./`.

# 0.5.0 (2015.10.11)

#### Improvements

- **Simplify webpack config** see [#50](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/50).

#### Breaking Changes

- **webpack configs**
- **port changed:** changed default port from 2992 to 3000.
- **npm scripts:** remove `start-dev` and `dev-server`. rename `hot-dev-server` to `hot-server`.

# 0.4.3 (2015.9.22)

#### Bug fixed

- **Fix #45 zeromq crash:** bump version of `electron-prebuilt`.

# 0.4.2 (2015.9.15)

#### Bug fixed

- **run start-hot breaks chrome refresh(CTRL+R) (#42)**: bump `electron-debug` to `0.2.1`

# 0.4.1 (2015.9.11)

#### Improvements

- **use electron-prebuilt version for packaging (#33)**

# 0.4.0 (2015.9.5)

#### Improvements

- **update dependencies**

# 0.3.0 (2015.8.31)

#### Improvements

- **eslint-config-airbnb**

# 0.2.10 (2015.8.27)

#### Features

- **custom placeholder icon**

#### Improvements

- **electron-renderer as target:** via [webpack-target-electron-renderer](https://github.com/chentsulin/webpack-target-electron-renderer)

# 0.2.9 (2015.8.18)

#### Bug fixed

- **Fix hot-reload**

# 0.2.8 (2015.8.13)

#### Improvements

- **bump electron-debug**
- **babelrc**
- **organize webpack scripts**

# 0.2.7 (2015.7.9)

#### Bug fixed

- **defaultProps:** fix typos.

# 0.2.6 (2015.7.3)

#### Features

- **menu**

#### Bug fixed

- **package.js:** include webpack build.

# 0.2.5 (2015.7.1)

#### Features

- **NPM Script:** support multi-platform
- **package:** `--all` option

# 0.2.4 (2015.6.9)

#### Bug fixed

- **Eslint:** typo, [#17](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/17) and improve `.eslintrc`

# 0.2.3 (2015.6.3)

#### Features

- **Package Version:** use latest release electron version as default
- **Ignore Large peerDependencies**

#### Bug fixed

- **Npm Script:** typo, [#6](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/6)
- **Missing css:** [#7](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/7)

# 0.2.2 (2015.6.2)

#### Features

- **electron-debug**

#### Bug fixed

- **Webpack:** add `.json` and `.node` to extensions for imitating node require.
- **Webpack:** set `node_modules` to externals for native module support.

# 0.2.1 (2015.5.30)

#### Bug fixed

- **Webpack:** #1, change build target to `atom`.

# 0.2.0 (2015.5.30)

#### Features

- **Ignore:** `test`, `tools`, `release` folder and devDependencies in `package.json`.
- **Support asar**
- **Support icon**

# 0.1.0 (2015.5.27)

#### Features

- **Webpack:** babel, react-hot, ...
- **Flux:** actions, api, components, containers, stores..
- **Package:** darwin (osx), linux and win32 (windows) platform.


================================================
FILE: desktop-app/CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
 advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
 address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
 professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at electronreactboilerplate@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq


================================================
FILE: desktop-app/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015-present Electron React Boilerplate

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: desktop-app/README.md
================================================
<img src=".erb/img/erb-banner.svg" width="100%" />

<br>

<p>
  Electron React Boilerplate uses <a href="https://electron.atom.io/">Electron</a>, <a href="https://facebook.github.io/react/">React</a>, <a href="https://github.com/reactjs/react-router">React Router</a>, <a href="https://webpack.js.org/">Webpack</a> and <a href="https://www.npmjs.com/package/react-refresh">React Fast Refresh</a>.
</p>

<br>

<div align="center">

[![Build Status][github-actions-status]][github-actions-url]
[![Github Tag][github-tag-image]][github-tag-url]
[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/Fjy3vfgy5q)

[![OpenCollective](https://opencollective.com/electron-react-boilerplate-594/backers/badge.svg)](#backers)
[![OpenCollective](https://opencollective.com/electron-react-boilerplate-594/sponsors/badge.svg)](#sponsors)
[![StackOverflow][stackoverflow-img]][stackoverflow-url]

</div>

## Install

Clone the repo and install dependencies:

```bash
git clone --depth 1 --branch main https://github.com/electron-react-boilerplate/electron-react-boilerplate.git your-project-name
cd your-project-name
npm install
```

**Having issues installing? See our [debugging guide](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/400)**

## Starting Development

Start the app in the `dev` environment:

```bash
npm start
```

## Packaging for Production

To package apps for the local platform:

```bash
npm run package
```

## Docs

See our [docs and guides here](https://electron-react-boilerplate.js.org/docs/installation)

## Community

Join our Discord: https://discord.gg/Fjy3vfgy5q

## Donations

**Donations will ensure the following:**

- 🔨 Long term maintenance of the project
- 🛣 Progress on the [roadmap](https://electron-react-boilerplate.js.org/docs/roadmap)
- 🐛 Quick responses to bug reports and help requests

## Backers

Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/electron-react-boilerplate-594#backer)]

<a href="https://opencollective.com/electron-react-boilerplate-594/backer/0/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/0/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/1/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/1/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/2/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/2/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/3/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/3/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/4/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/4/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/5/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/5/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/6/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/6/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/7/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/7/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/8/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/8/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/9/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/9/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/10/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/10/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/11/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/11/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/12/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/12/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/13/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/13/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/14/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/14/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/15/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/15/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/16/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/16/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/17/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/17/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/18/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/18/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/19/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/19/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/20/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/20/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/21/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/21/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/22/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/22/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/23/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/23/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/24/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/24/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/25/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/25/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/26/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/26/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/27/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/27/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/28/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/28/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/backer/29/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/backer/29/avatar.svg"></a>

## Sponsors

Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/electron-react-boilerplate-594-594#sponsor)]

<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/0/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/1/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/2/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/3/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/4/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/5/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/6/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/7/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/8/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/9/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/9/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/10/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/10/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/11/website" target="_blank"><img src="https://opencollective.com/electron-react-boilerplate-594/sponsor/11/avatar.svg"></a>
<a href="https://opencollective.com/electron-react-boilerplate-594/sponsor/12/website" target="_blank"><img src="https://opencollective.
Download .txt
gitextract_p5en9k53/

├── .all-contributorsrc
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── 01-bug-report.md
│   │   └── 02-feature-request.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   ├── opencollective.yml
│   ├── stale.yml
│   └── workflows/
│       ├── codeql-analysis.yml
│       ├── publish.yml
│       └── test.yml
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── MAINTAINERS.md
├── README.md
├── SECURITY.md
├── browser-extension/
│   ├── .gitignore
│   ├── .vscode/
│   │   └── settings.json
│   ├── package.json
│   ├── public/
│   │   ├── manifest.json
│   │   └── popup.html
│   ├── src/
│   │   ├── background.js
│   │   └── popup.js
│   └── webpack.config.js
├── desktop-app/
│   ├── . prettierignore
│   ├── .editorconfig
│   ├── .erb/
│   │   ├── configs/
│   │   │   ├── .eslintrc
│   │   │   ├── webpack.config.base.ts
│   │   │   ├── webpack.config.eslint.ts
│   │   │   ├── webpack.config.main.prod.ts
│   │   │   ├── webpack.config.preload-webview.dev.ts
│   │   │   ├── webpack.config.preload.dev.ts
│   │   │   ├── webpack.config.renderer.dev.dll.ts
│   │   │   ├── webpack.config.renderer.dev.ts
│   │   │   ├── webpack.config.renderer.prod.ts
│   │   │   └── webpack.paths.ts
│   │   ├── mocks/
│   │   │   └── fileMock.js
│   │   └── scripts/
│   │       ├── .eslintrc
│   │       ├── check-build-exists.ts
│   │       ├── check-native-dep.js
│   │       ├── check-node-env.js
│   │       ├── check-port-in-use.js
│   │       ├── clean.js
│   │       ├── delete-source-maps.js
│   │       ├── electron-rebuild.js
│   │       ├── link-modules.ts
│   │       └── notarize.js
│   ├── .eslintignore
│   ├── .eslintrc.js
│   ├── .gitattributes
│   ├── .gitignore
│   ├── .husky/
│   │   └── pre-commit
│   ├── .prettierrc
│   ├── .vscode/
│   │   └── settings.json
│   ├── CHANGELOG.md
│   ├── CODE_OF_CONDUCT.md
│   ├── LICENSE
│   ├── README.md
│   ├── assets/
│   │   ├── assets.d.ts
│   │   └── entitlements.mac.plist
│   ├── declarations.d.ts
│   ├── package.json
│   ├── postcss.config.js
│   ├── postinstall.ts
│   ├── release/
│   │   └── app/
│   │       └── package.json
│   ├── setupTests.ts
│   ├── src/
│   │   ├── __tests__/
│   │   │   └── App.test.tsx
│   │   ├── common/
│   │   │   ├── constants.ts
│   │   │   ├── deviceList.ts
│   │   │   └── webViewUtils.ts
│   │   ├── main/
│   │   │   ├── app-meta/
│   │   │   │   └── index.ts
│   │   │   ├── app-updater.ts
│   │   │   ├── browser-sync.ts
│   │   │   ├── cli.ts
│   │   │   ├── dev-entry.cjs
│   │   │   ├── devtools/
│   │   │   │   └── index.ts
│   │   │   ├── http-basic-auth/
│   │   │   │   └── index.ts
│   │   │   ├── main.ts
│   │   │   ├── menu/
│   │   │   │   ├── help.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── view.ts
│   │   │   ├── native-functions/
│   │   │   │   └── index.ts
│   │   │   ├── preload-webview.ts
│   │   │   ├── preload.ts
│   │   │   ├── protocol-handler/
│   │   │   │   └── index.ts
│   │   │   ├── screenshot/
│   │   │   │   ├── index.ts
│   │   │   │   └── webpage.ts
│   │   │   ├── util.ts
│   │   │   ├── web-permissions/
│   │   │   │   ├── PermissionsManager.ts
│   │   │   │   └── index.ts
│   │   │   ├── webview-context-menu/
│   │   │   │   ├── common.ts
│   │   │   │   └── register.ts
│   │   │   └── webview-storage-manager/
│   │   │       └── index.ts
│   │   ├── renderer/
│   │   │   ├── App.css
│   │   │   ├── AppContent.tsx
│   │   │   ├── components/
│   │   │   │   ├── AboutDialog/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Accordion/
│   │   │   │   │   ├── Accordion.tsx
│   │   │   │   │   ├── AccordionItem.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Button/
│   │   │   │   │   ├── Button.test.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ButtonGroup/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ConfirmDialog/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── DeviceManager/
│   │   │   │   │   ├── DeviceDetailsModal.tsx
│   │   │   │   │   ├── DeviceLabel.tsx
│   │   │   │   │   ├── PreviewSuites/
│   │   │   │   │   │   ├── CreateSuiteButton/
│   │   │   │   │   │   │   ├── CreateSuiteModal.tsx
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── ManageSuitesTool/
│   │   │   │   │   │   │   ├── ManageSuitesTool.test.tsx
│   │   │   │   │   │   │   ├── ManageSuitesTool.tsx
│   │   │   │   │   │   │   ├── ManageSuitesToolError.test.tsx
│   │   │   │   │   │   │   ├── ManageSuitesToolError.tsx
│   │   │   │   │   │   │   ├── helpers.test.tsx
│   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   ├── test.json
│   │   │   │   │   │   │   ├── utils.test.ts
│   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   ├── Suite.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Divider/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── DropDown/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── FileUploader/
│   │   │   │   │   ├── FileUploader.test.tsx
│   │   │   │   │   ├── FileUploader.tsx
│   │   │   │   │   ├── hooks/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── useFileUpload.test.tsx
│   │   │   │   │   │   └── useFileUpload.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── InfoPopups/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Input/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── KeyboardShortcutsManager/
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── useKeyboardShortcut.ts
│   │   │   │   │   └── useMousetrapEmitter.ts
│   │   │   │   ├── Modal/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ModalLoader/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Notifications/
│   │   │   │   │   ├── Notification.tsx
│   │   │   │   │   ├── NotificationEmptyStatus.tsx
│   │   │   │   │   ├── Notifications.tsx
│   │   │   │   │   └── NotificationsBubble.tsx
│   │   │   │   ├── Previewer/
│   │   │   │   │   ├── Device/
│   │   │   │   │   │   ├── ColorBlindnessTools/
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── DesignOverlay/
│   │   │   │   │   │   │   ├── index.test.tsx
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── DesignOverlayControls/
│   │   │   │   │   │   │   ├── index.test.tsx
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── Toolbar.tsx
│   │   │   │   │   │   ├── assets.ts
│   │   │   │   │   │   ├── common.ts
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── DevtoolsResizer/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Guides/
│   │   │   │   │   │   ├── guide.css
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── IndividualLayoutToolBar/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.css
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ReleaseNotes/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Select/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Spinner/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Sponsorship/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Toggle/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ToolBar/
│   │   │   │   │   ├── AddressBar/
│   │   │   │   │   │   ├── AuthModal.tsx
│   │   │   │   │   │   ├── BookmarkButton.tsx
│   │   │   │   │   │   ├── SitePermissions/
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── SuggestionList.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── ColorBlindnessControls/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── ColorSchemeToggle/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Menu/
│   │   │   │   │   │   ├── Flyout/
│   │   │   │   │   │   │   ├── AllowInSecureSSL/
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── Bookmark/
│   │   │   │   │   │   │   │   ├── ViewAllBookmarks/
│   │   │   │   │   │   │   │   │   ├── BookmarkFlyout.tsx
│   │   │   │   │   │   │   │   │   ├── BookmarkListButton.tsx
│   │   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── ClearHistory/
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── Devtools/
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── PreviewLayout/
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── Settings/
│   │   │   │   │   │   │   │   ├── SettingsContent.test.tsx
│   │   │   │   │   │   │   │   ├── SettingsContent.tsx
│   │   │   │   │   │   │   │   ├── SettingsContentHeaders.tsx
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── UITheme/
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── Zoom.tsx
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── NavigationControls.tsx
│   │   │   │   │   ├── PreviewSuiteSelector/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Shortcuts/
│   │   │   │   │   │   ├── ShortcutsModal/
│   │   │   │   │   │   │   ├── ShortcutButton.tsx
│   │   │   │   │   │   │   ├── ShortcutName.tsx
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── VisionSimulationDropDown/
│   │   │   │   │   └── index.tsx
│   │   │   │   └── useLocalStorage/
│   │   │   │       └── useLocalStorage.tsx
│   │   │   ├── context/
│   │   │   │   └── ThemeProvider/
│   │   │   │       └── index.tsx
│   │   │   ├── index.ejs
│   │   │   ├── index.tsx
│   │   │   ├── lib/
│   │   │   │   └── pubsub/
│   │   │   │       ├── index.test.ts
│   │   │   │       └── index.ts
│   │   │   ├── preload.d.ts
│   │   │   └── store/
│   │   │       ├── features/
│   │   │       │   ├── bookmarks/
│   │   │       │   │   └── index.ts
│   │   │       │   ├── design-overlay/
│   │   │       │   │   ├── index.test.ts
│   │   │       │   │   └── index.ts
│   │   │       │   ├── device-manager/
│   │   │       │   │   ├── index.ts
│   │   │       │   │   └── utils.ts
│   │   │       │   ├── devtools/
│   │   │       │   │   └── index.ts
│   │   │       │   ├── renderer/
│   │   │       │   │   └── index.ts
│   │   │       │   ├── ruler/
│   │   │       │   │   └── index.ts
│   │   │       │   └── ui/
│   │   │       │       └── index.ts
│   │   │       └── index.ts
│   │   └── store/
│   │       ├── index.ts
│   │       └── migrations.ts
│   ├── tailwind.config.js
│   ├── tsconfig.json
│   └── vitest.config.ts
├── desktop-app-legacy/
│   ├── .dockerignore
│   ├── .editorconfig
│   ├── .eslintignore
│   ├── .eslintrc
│   ├── .flowconfig
│   ├── .gitattributes
│   ├── .github/
│   │   ├── ISSUE_TEMPLATE.md
│   │   └── stale.yml
│   ├── .gitignore
│   ├── .nvmrc
│   ├── .prettierignore
│   ├── .prettierrc
│   ├── .stylelintrc
│   ├── .testcafe-electron-rc
│   ├── .travis.yml
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── add-osx-cert.sh
│   ├── app/
│   │   ├── AppContent.js
│   │   ├── actions/
│   │   │   ├── bookmarks.js
│   │   │   ├── browser.js
│   │   │   ├── networkConfig.js
│   │   │   └── statusBar.js
│   │   ├── app-updater.js
│   │   ├── app.global.css
│   │   ├── app.html
│   │   ├── app.icns
│   │   ├── components/
│   │   │   ├── AddressInput.js
│   │   │   ├── AppNotification/
│   │   │   │   ├── AppNotification.js
│   │   │   │   └── styles.module.css
│   │   │   ├── BookmarksBar/
│   │   │   │   ├── BookmarkEditDialog.js
│   │   │   │   └── index.js
│   │   │   ├── ClearNetworkCache/
│   │   │   │   └── index.js
│   │   │   ├── CreateIssue/
│   │   │   │   └── index.js
│   │   │   ├── DevToolsResizer/
│   │   │   │   ├── index.js
│   │   │   │   └── style.module.css
│   │   │   ├── DeviceDrawer/
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── DeviceManager/
│   │   │   │   ├── AddDevice/
│   │   │   │   │   └── index.js
│   │   │   │   ├── DeviceItem.js
│   │   │   │   ├── DeviceList.js
│   │   │   │   ├── OSIcon.js
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── DevicesOverview/
│   │   │   │   └── index.js
│   │   │   ├── DevicesPreviewer/
│   │   │   │   ├── index.js
│   │   │   │   ├── index.test.js
│   │   │   │   └── useStyles.js
│   │   │   ├── Drawer.js
│   │   │   ├── ErrorBoundary/
│   │   │   │   └── index.js
│   │   │   ├── ExtensionsManager/
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── Header/
│   │   │   │   ├── index.js
│   │   │   │   └── index.test.js
│   │   │   ├── Headway.js
│   │   │   ├── HorizontalSpacer/
│   │   │   │   └── index.js
│   │   │   ├── HttpAuthDialog/
│   │   │   │   └── index.js
│   │   │   ├── KebabMenu.js
│   │   │   ├── LeftIconsPane/
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── LinkHoverDisplay/
│   │   │   │   └── index.js
│   │   │   ├── LiveCssEditor/
│   │   │   │   ├── index.js
│   │   │   │   └── useStyles.js
│   │   │   ├── NavigationControls/
│   │   │   │   ├── index.js
│   │   │   │   └── index.test.js
│   │   │   ├── NetworkConfiguration/
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── NetworkProxy/
│   │   │   │   ├── ProxyManager/
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── NetworkThrottling/
│   │   │   │   ├── ProfileManager/
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── styles.css
│   │   │   │   ├── index.js
│   │   │   │   └── styles.css
│   │   │   ├── NotificationMessage/
│   │   │   │   └── index.js
│   │   │   ├── PageNavigator/
│   │   │   │   └── index.js
│   │   │   ├── PermissionPopup/
│   │   │   │   ├── index.js
│   │   │   │   └── styles.module.css
│   │   │   ├── PrefersColorSchemeSwitch/
│   │   │   │   └── index.js
│   │   │   ├── PreviewerLayoutSelector/
│   │   │   │   └── index.js
│   │   │   ├── QuickFilterDevices/
│   │   │   │   └── index.js
│   │   │   ├── Renderer/
│   │   │   │   ├── index.js
│   │   │   │   └── index.test.js
│   │   │   ├── ScreenShotSavePreference/
│   │   │   │   └── index.js
│   │   │   ├── ScreenshotManager/
│   │   │   │   └── index.js
│   │   │   ├── ScrollControls/
│   │   │   │   ├── index.js
│   │   │   │   └── index.test.js
│   │   │   ├── Select.js
│   │   │   ├── Spinner/
│   │   │   │   └── index.js
│   │   │   ├── StatusBar/
│   │   │   │   ├── Announcement.js
│   │   │   │   ├── index.js
│   │   │   │   └── useStyles.js
│   │   │   ├── ToggleTouch/
│   │   │   │   └── index.js
│   │   │   ├── UrlSearchResults/
│   │   │   │   ├── index.js
│   │   │   │   └── useStyles.js
│   │   │   ├── UserPreferences/
│   │   │   │   ├── index.js
│   │   │   │   └── useStyles.js
│   │   │   ├── WebView/
│   │   │   │   ├── index.js
│   │   │   │   ├── index.test.js
│   │   │   │   ├── screenshotUtil.js
│   │   │   │   └── style.module.css
│   │   │   ├── ZenButton/
│   │   │   │   └── index.js
│   │   │   ├── ZoomInput/
│   │   │   │   ├── index.js
│   │   │   │   ├── index.test.js
│   │   │   │   ├── otherStyles.css
│   │   │   │   └── styles.module.css
│   │   │   ├── icons/
│   │   │   │   ├── Apple.js
│   │   │   │   ├── ArrowLeft.js
│   │   │   │   ├── ArrowRight.js
│   │   │   │   ├── Bug.js
│   │   │   │   ├── CSSEditor.js
│   │   │   │   ├── Chevron.js
│   │   │   │   ├── Cross.js
│   │   │   │   ├── CrossChrome.js
│   │   │   │   ├── CrossThin.js
│   │   │   │   ├── DarkColorScheme.js
│   │   │   │   ├── DeleteCookie.js
│   │   │   │   ├── DeleteStorage.js
│   │   │   │   ├── DesignMode.js
│   │   │   │   ├── DeviceRotate.js
│   │   │   │   ├── Devices.js
│   │   │   │   ├── DockBottom.js
│   │   │   │   ├── DockRight.js
│   │   │   │   ├── DoubleLeftArrow.js
│   │   │   │   ├── Filter.js
│   │   │   │   ├── Focus.js
│   │   │   │   ├── FullScreenshot.js
│   │   │   │   ├── Gift.js
│   │   │   │   ├── Github.js
│   │   │   │   ├── Globe.js
│   │   │   │   ├── GoArrow.js
│   │   │   │   ├── Home.js
│   │   │   │   ├── HomePlus.js
│   │   │   │   ├── InspectElement.js
│   │   │   │   ├── InspectElementChrome.js
│   │   │   │   ├── Kebab.js
│   │   │   │   ├── Layout.js
│   │   │   │   ├── LightBulb.js
│   │   │   │   ├── LightColorScheme.js
│   │   │   │   ├── Logo.js
│   │   │   │   ├── Maximize.js
│   │   │   │   ├── Minimize.js
│   │   │   │   ├── Muted.js
│   │   │   │   ├── Network.js
│   │   │   │   ├── PageNavigator.js
│   │   │   │   ├── Pictures.js
│   │   │   │   ├── Proxy.js
│   │   │   │   ├── Reload.js
│   │   │   │   ├── RoadMap.js
│   │   │   │   ├── Screenshot.js
│   │   │   │   ├── ScrollDown.js
│   │   │   │   ├── ScrollUp.js
│   │   │   │   ├── Start.js
│   │   │   │   ├── TickAnimation/
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── styles.css
│   │   │   │   ├── ToggleTouch.js
│   │   │   │   ├── Twitter.js
│   │   │   │   ├── UnDock.js
│   │   │   │   ├── Unfocus.js
│   │   │   │   ├── Unmuted.js
│   │   │   │   ├── Unplug.js
│   │   │   │   ├── Windows.js
│   │   │   │   ├── Zoom.js
│   │   │   │   └── styles.module.css
│   │   │   ├── useCommonStyles.js
│   │   │   ├── useCreateTheme.js
│   │   │   └── useIsDarkTheme.js
│   │   ├── constants/
│   │   │   ├── DrawerContents.js
│   │   │   ├── browserSync.js
│   │   │   ├── chromeEmulatedDevices.js
│   │   │   ├── devices.js
│   │   │   ├── index.js
│   │   │   ├── license.js
│   │   │   ├── permissionsManagement.js
│   │   │   ├── previewerLayouts.js
│   │   │   ├── pubsubEvents.js
│   │   │   ├── routes.js
│   │   │   ├── searchResultSettings.js
│   │   │   ├── settingKeys.js
│   │   │   ├── theme.js
│   │   │   └── values.js
│   │   ├── containers/
│   │   │   ├── AddDeviceContainer/
│   │   │   │   └── index.js
│   │   │   ├── AddressBar/
│   │   │   │   └── index.js
│   │   │   ├── BookmarksBarContainer/
│   │   │   │   └── index.js
│   │   │   ├── Browser/
│   │   │   │   └── index.js
│   │   │   ├── DevToolResizerContainer/
│   │   │   │   └── index.js
│   │   │   ├── DeviceDrawerContainer/
│   │   │   │   └── index.js
│   │   │   ├── DeviceManagerContainer/
│   │   │   │   └── index.js
│   │   │   ├── DevicePreviewerContainer/
│   │   │   │   └── index.js
│   │   │   ├── DevicesOverviewContainer/
│   │   │   │   └── index.js
│   │   │   ├── DrawerContainer/
│   │   │   │   └── index.js
│   │   │   ├── ExtensionsManagerContainer/
│   │   │   │   └── index.js
│   │   │   ├── HeaderContainer/
│   │   │   │   └── index.js
│   │   │   ├── HomePage.js
│   │   │   ├── LeftIconsPaneContainer/
│   │   │   │   └── index.js
│   │   │   ├── LinkHoverDisplayContainer/
│   │   │   │   └── index.js
│   │   │   ├── NavigationControlsContainer/
│   │   │   │   └── index.js
│   │   │   ├── NetworkConfigurationContainer/
│   │   │   │   └── index.js
│   │   │   ├── PageNavigatorContainer/
│   │   │   │   └── index.js
│   │   │   ├── QuickFilterDevicesContainer/
│   │   │   │   └── index.js
│   │   │   ├── Root.js
│   │   │   ├── ScrollControlsContainer/
│   │   │   │   └── index.js
│   │   │   ├── StatusBarContainer/
│   │   │   │   └── index.js
│   │   │   ├── UserPreferencesContainer/
│   │   │   │   └── index.js
│   │   │   ├── WebViewContainer/
│   │   │   │   └── index.js
│   │   │   └── ZoomContainer/
│   │   │       └── index.js
│   │   ├── imageWorker.js
│   │   ├── index.js
│   │   ├── main.dev.js
│   │   ├── menu.js
│   │   ├── move-to-applications.js
│   │   ├── preload.js
│   │   ├── reducers/
│   │   │   ├── bookmarks.js
│   │   │   ├── browser.js
│   │   │   ├── index.js
│   │   │   ├── statusBar.js
│   │   │   └── types.js
│   │   ├── services/
│   │   │   ├── browserSync/
│   │   │   │   └── index.js
│   │   │   ├── db/
│   │   │   │   ├── appMetadata.js
│   │   │   │   └── index.js
│   │   │   └── searchUrlSuggestions/
│   │   │       └── index.js
│   │   ├── settings/
│   │   │   ├── migration.js
│   │   │   ├── statusBarSettings.js
│   │   │   └── userPreferenceSettings.js
│   │   ├── shortcut-manager/
│   │   │   ├── main-shortcut-manager.js
│   │   │   ├── renderer-shortcut-manager.js
│   │   │   └── shared.js
│   │   ├── shortcuts.html
│   │   ├── store/
│   │   │   ├── configureStore.dev.js
│   │   │   ├── configureStore.js
│   │   │   └── configureStore.prod.js
│   │   └── utils/
│   │       ├── .gitkeep
│   │       ├── TextAreaWithCopyButton.js
│   │       ├── analytics.js
│   │       ├── browserSync.js
│   │       ├── browserUtils.js
│   │       ├── deviceManagerUtils.js
│   │       ├── filterUtils.js
│   │       ├── generalUtils.js
│   │       ├── iconUtils.js
│   │       ├── logUtils.js
│   │       ├── navigatorUtils.js
│   │       ├── permissionUtils.js
│   │       ├── proxyUtils.js
│   │       ├── stringUtils.js
│   │       └── urlUtils.js
│   ├── appveyor.yml
│   ├── babel.config.js
│   ├── build/
│   │   └── entitlements.mac.plist
│   ├── configs/
│   │   ├── webpack.config.base.js
│   │   ├── webpack.config.eslint.js
│   │   ├── webpack.config.main.prod.babel.js
│   │   ├── webpack.config.renderer.dev.babel.js
│   │   ├── webpack.config.renderer.dev.dll.babel.js
│   │   └── webpack.config.renderer.prod.babel.js
│   ├── flow-typed/
│   │   ├── electron.js
│   │   └── module_vx.x.x.js
│   ├── internals/
│   │   ├── flow/
│   │   │   ├── CSSModule.js.flow
│   │   │   └── WebpackAsset.js.flow
│   │   ├── mocks/
│   │   │   └── fileMock.js
│   │   └── scripts/
│   │       ├── CheckBuiltsExist.js
│   │       ├── CheckNodeEnv.js
│   │       └── CheckPortInUse.js
│   ├── package.json
│   ├── renovate.json
│   ├── resources/
│   │   ├── icon.gvdesign
│   │   ├── icon.icns
│   │   └── icon.old.icns
│   └── scripts/
│       ├── chocolatey/
│       │   ├── generateChocoPkg.js
│       │   └── responsively/
│       │       ├── responsively.nuspec
│       │       └── tools/
│       │           ├── LICENSE.txt
│       │           ├── VERIFICATION.txt
│       │           ├── chocolateyinstall.ps1
│       │           └── chocolateyuninstall.ps1
│       ├── extraPublishFiles.js
│       ├── generate-checksums.js
│       └── notarize.js
└── dev.code-workspace
Download .txt
SYMBOL INDEX (670 symbols across 207 files)

FILE: desktop-app-legacy/app/actions/bookmarks.js
  constant TOGGLE_BOOKMARK (line 1) | const TOGGLE_BOOKMARK = 'TOGGLE_BOOKMARK';
  constant EDIT_BOOKMARK (line 2) | const EDIT_BOOKMARK = 'EDIT_BOOKMARK';
  function toggleBookmarkUrl (line 5) | function toggleBookmarkUrl(url, pageMeta = {}) {
  function editBookmark (line 14) | function editBookmark(bookmark, {title, url}) {

FILE: desktop-app-legacy/app/actions/browser.js
  constant NEW_ADDRESS (line 26) | const NEW_ADDRESS = 'NEW_ADDRESS';
  constant NEW_PAGE_META_FIELD (line 27) | const NEW_PAGE_META_FIELD = 'NEW_PAGE_META_FIELD';
  constant NEW_DEV_TOOLS_CONFIG (line 28) | const NEW_DEV_TOOLS_CONFIG = 'NEW_DEV_TOOLS_CONFIG';
  constant NEW_HOMEPAGE (line 29) | const NEW_HOMEPAGE = 'NEW_HOMEPAGE';
  constant NEW_ZOOM_LEVEL (line 30) | const NEW_ZOOM_LEVEL = 'NEW_ZOOM_LEVEL';
  constant NEW_SCROLL_POSITION (line 31) | const NEW_SCROLL_POSITION = 'NEW_SCROLL_POSITION';
  constant NEW_NAVIGATOR_STATUS (line 32) | const NEW_NAVIGATOR_STATUS = 'NEW_NAVIGATOR_STATUS';
  constant NEW_INSPECTOR_STATUS (line 33) | const NEW_INSPECTOR_STATUS = 'NEW_INSPECTOR_STATUS';
  constant NEW_CSS_EDITOR_STATUS (line 34) | const NEW_CSS_EDITOR_STATUS = 'NEW_CSS_EDITOR_STATUS';
  constant NEW_CSS_EDITOR_POSITION (line 35) | const NEW_CSS_EDITOR_POSITION = 'NEW_CSS_EDITOR_POSITION';
  constant NEW_CSS_EDITOR_CONTENT (line 36) | const NEW_CSS_EDITOR_CONTENT = 'NEW_CSS_EDITOR_CONTENT';
  constant NEW_DRAWER_CONTENT (line 37) | const NEW_DRAWER_CONTENT = 'NEW_DRAWER_CONTENT';
  constant NEW_PREVIEWER_CONFIG (line 38) | const NEW_PREVIEWER_CONFIG = 'NEW_PREVIEWER_CONFIG';
  constant NEW_ACTIVE_DEVICES (line 39) | const NEW_ACTIVE_DEVICES = 'NEW_ACTIVE_DEVICES';
  constant NEW_CUSTOM_DEVICE (line 40) | const NEW_CUSTOM_DEVICE = 'NEW_CUSTOM_DEVICE';
  constant LOAD_CUSTOM_DEVICES (line 41) | const LOAD_CUSTOM_DEVICES = 'LOAD_CUSTOM_DEVICES';
  constant DELETE_CUSTOM_DEVICE (line 42) | const DELETE_CUSTOM_DEVICE = 'DELETE_CUSTOM_DEVICE';
  constant NEW_FILTERS (line 43) | const NEW_FILTERS = 'NEW_FILTERS';
  constant NEW_USER_PREFERENCES (line 44) | const NEW_USER_PREFERENCES = 'NEW_USER_PREFERENCES';
  constant TOGGLE_BOOKMARK (line 45) | const TOGGLE_BOOKMARK = 'TOGGLE_BOOKMARK';
  constant NEW_WINDOW_SIZE (line 46) | const NEW_WINDOW_SIZE = 'NEW_WINDOW_SIZE';
  constant DEVICE_LOADING (line 47) | const DEVICE_LOADING = 'DEVICE_LOADING';
  constant NEW_FOCUSED_DEVICE (line 48) | const NEW_FOCUSED_DEVICE = 'NEW_FOCUSED_DEVICE';
  constant TOGGLE_ALL_DEVICES_MUTED (line 49) | const TOGGLE_ALL_DEVICES_MUTED = 'TOGGLE_ALL_DEVICES_MUTED';
  constant TOGGLE_DEVICE_MUTED (line 50) | const TOGGLE_DEVICE_MUTED = 'TOGGLE_DEVICE_MUTED';
  constant NEW_THEME (line 51) | const NEW_THEME = 'NEW_THEME';
  constant TOGGLE_ALL_DEVICES_DESIGN_MODE (line 52) | const TOGGLE_ALL_DEVICES_DESIGN_MODE = 'TOGGLE_ALL_DEVICES_DESIGN_MODE';
  constant TOGGLE_DEVICE_DESIGN_MODE (line 53) | const TOGGLE_DEVICE_DESIGN_MODE = 'TOGGLE_DEVICE_DESIGN_MODE';
  constant SET_HEADER_VISIBILITY (line 54) | const SET_HEADER_VISIBILITY = 'SET_HEADER_VISIBILITY';
  constant SET_LEFT_PANE_VISIBILITY (line 55) | const SET_LEFT_PANE_VISIBILITY = 'SET_LEFT_PANE_VISIBILITY';
  constant SET_HOVERED_LINK (line 56) | const SET_HOVERED_LINK = 'SET_HOVERED_LINK';
  constant SET_STARTUP_PAGE (line 57) | const SET_STARTUP_PAGE = 'SET_STARTUP_PAGE';
  constant UPDATE_PAGE_NAVIGATOR (line 58) | const UPDATE_PAGE_NAVIGATOR = 'UPDATE_PAGE_NAVIGATOR';
  constant TOGGLE_PAGE_NAVIGATOR (line 59) | const TOGGLE_PAGE_NAVIGATOR = 'TOGGLE_PAGE_NAVIGATOR';
  function newAddress (line 61) | function newAddress(address) {
  function newPageMetaField (line 68) | function newPageMetaField(name, value) {
  function newWindowSize (line 76) | function newWindowSize(size) {
  function newDevToolsConfig (line 83) | function newDevToolsConfig(config) {
  function newHomepage (line 90) | function newHomepage(homepage) {
  function newInspectorState (line 97) | function newInspectorState(status) {
  function newCSSEditorState (line 104) | function newCSSEditorState(status) {
  function newCSSEditorPosition (line 111) | function newCSSEditorPosition(position) {
  function newCSSEditorContent (line 118) | function newCSSEditorContent(content) {
  function newUserPreferences (line 125) | function newUserPreferences(userPreferences) {
  function newZoomLevel (line 132) | function newZoomLevel(zoomLevel) {
  function newScrollPosition (line 139) | function newScrollPosition(scrollPosition) {
  function newNavigatorStatus (line 146) | function newNavigatorStatus(navigatorStatus) {
  function newDrawerContent (line 153) | function newDrawerContent(drawer) {
  function newPreviewerConfig (line 160) | function newPreviewerConfig(previewer) {
  function newFocusedDevice (line 167) | function newFocusedDevice(previewer) {
  function newActiveDevices (line 174) | function newActiveDevices(devices) {
  function newCustomDevice (line 181) | function newCustomDevice(device) {
  function loadCustomDevices (line 188) | function loadCustomDevices(devices) {
  function deleteCustomDevice (line 195) | function deleteCustomDevice(device) {
  function newFilters (line 202) | function newFilters(filters) {
  function newDeviceLoading (line 209) | function newDeviceLoading(device) {
  function toggleAllDevicesMuted (line 216) | function toggleAllDevicesMuted(allDevicesMuted) {
  function toggleDeviceMuted (line 223) | function toggleDeviceMuted(deviceId, isMuted) {
  function toggleAllDevicesDesignMode (line 231) | function toggleAllDevicesDesignMode() {
  function toggleDeviceDesignMode (line 237) | function toggleDeviceDesignMode(deviceId) {
  function onAddressChange (line 244) | function onAddressChange(newURL, force) {
  function onPageMetaFieldUpdate (line 262) | function onPageMetaFieldUpdate(name, value) {
  function isHashOnlyChange (line 268) | function isHashOnlyChange(newURL, oldURL) {
  function onZoomChange (line 280) | function onZoomChange(newLevel) {
  function onScrollChange (line 295) | function onScrollChange({x: newX, y: newY}) {
  function updateNavigatorStatus (line 311) | function updateNavigatorStatus({
  function openDrawerAndSetContent (line 338) | function openDrawerAndSetContent(_newDrawerContent) {
  function changeDrawerOpenState (line 359) | function changeDrawerOpenState(newOpenState) {
  function setPreviewLayout (line 378) | function setPreviewLayout(newLayout) {
  function setFocusedDevice (line 397) | function setFocusedDevice(focusedDeviceId) {
  function setActiveDevices (line 416) | function setActiveDevices(newDevices) {
  function addCustomDevice (line 431) | function addCustomDevice(newDevice) {
  function deleteDevice (line 445) | function deleteDevice(device) {
  function toggleFilter (line 451) | function toggleFilter(filterField, value) {
  function goToHomepage (line 469) | function goToHomepage() {
  function gotoUrl (line 484) | function gotoUrl(url) {
  function onDevToolsModeChange (line 498) | function onDevToolsModeChange(newMode) {
  function onWindowResize (line 560) | function onWindowResize(size) {
  function onDevToolsResize (line 592) | function onDevToolsResize(size) {
  function onDevToolsOpen (line 615) | function onDevToolsOpen(newDeviceId, newWebViewId, force) {
  function onDevToolsClose (line 663) | function onDevToolsClose(devToolsInfo, closeAll) {
  function downloadPreferences (line 702) | function downloadPreferences(url) {
  function uploadPreferences (line 708) | function uploadPreferences() {
  function setCurrentAddressAsHomepage (line 735) | function setCurrentAddressAsHomepage() {
  function onUserPreferencesChange (line 749) | function onUserPreferencesChange(userPreferences) {
  function triggerScrollDown (line 755) | function triggerScrollDown() {
  function toggleEventMirroringAllDevices (line 761) | function toggleEventMirroringAllDevices(status: boolean) {
  function screenshotAllDevices (line 767) | function screenshotAllDevices() {
  function flipOrientationAllDevices (line 773) | function flipOrientationAllDevices() {
  function onAllDevicesMutedChange (line 779) | function onAllDevicesMutedChange() {
  function onDeviceMutedChange (line 790) | function onDeviceMutedChange(deviceId, isMuted) {
  function onToggleAllDeviceDesignMode (line 796) | function onToggleAllDeviceDesignMode() {
  function onToggleDeviceDesignMode (line 807) | function onToggleDeviceDesignMode(deviceId) {
  function toggleInspector (line 813) | function toggleInspector() {
  function toggleCSSEditor (line 823) | function toggleCSSEditor() {
  function changeCSSEditorPosition (line 835) | function changeCSSEditorPosition(newPosition) {
  function onCSSEditorContentChange (line 851) | function onCSSEditorContentChange(newContent) {
  function deviceLoadingChange (line 867) | function deviceLoadingChange(deviceInfo) {
  function triggerScrollUp (line 873) | function triggerScrollUp() {
  function triggerNavigationBack (line 879) | function triggerNavigationBack() {
  function triggerNavigationForward (line 885) | function triggerNavigationForward() {
  function triggerNavigationReload (line 891) | function triggerNavigationReload(_, args) {
  function triggerStopLoading (line 898) | function triggerStopLoading(_, args) {
  function deleteCookies (line 904) | function deleteCookies() {
  function deleteStorage (line 910) | function deleteStorage() {
  function reloadCSS (line 929) | function reloadCSS() {
  function setTheme (line 935) | function setTheme(theme) {
  function setHeaderVisibility (line 946) | function setHeaderVisibility(isVisible: boolean) {
  function setLeftPaneVisibility (line 957) | function setLeftPaneVisibility(isVisible: boolean) {
  function setHoveredLink (line 970) | function setHoveredLink(url) {
  function setStartupPage (line 977) | function setStartupPage(value: 'BLANK' | 'HOME') {
  function changeStartupPage (line 984) | function changeStartupPage(value: 'BLANK' | 'HOME') {
  function updatePageNavigator (line 990) | function updatePageNavigator(selector, index) {
  function resetPageNavigator (line 998) | function resetPageNavigator() {
  function navigateToNextSelector (line 1010) | function navigateToNextSelector(selector) {
  function navigateToPrevSelector (line 1029) | function navigateToPrevSelector(selector) {
  function setPageNavigatorActive (line 1048) | function setPageNavigatorActive(active) {
  function onChangePageNavigatorActive (line 1055) | function onChangePageNavigatorActive(active) {

FILE: desktop-app-legacy/app/actions/networkConfig.js
  constant CHANGE_ACTIVE_THROTTLING_PROFILE (line 10) | const CHANGE_ACTIVE_THROTTLING_PROFILE =
  constant SAVE_THROTTLING_PROFILES (line 12) | const SAVE_THROTTLING_PROFILES = 'SAVE_THROTTLING_PROFILES';
  constant TOGGLE_USE_PROXY (line 14) | const TOGGLE_USE_PROXY = 'TOGGLE_USE_PROXY';
  constant CHANGE_PROXY_PROFILE (line 15) | const CHANGE_PROXY_PROFILE = 'CHANGE_PROXY_PROFILE';
  function changeActiveThrottlingProfile (line 17) | function changeActiveThrottlingProfile(title = 'Online') {
  function saveThrottlingProfilesList (line 24) | function saveThrottlingProfilesList(profiles) {
  function onActiveThrottlingProfileChanged (line 31) | function onActiveThrottlingProfileChanged(title) {
  function onThrottlingProfilesListChanged (line 48) | function onThrottlingProfilesListChanged(profiles) {
  function onClearNetworkCache (line 56) | function onClearNetworkCache() {
  function toggleUseProxy (line 62) | function toggleUseProxy(useProxy: boolean = false) {
  function changeProxyProfile (line 69) | function changeProxyProfile(profile) {
  function onToggleUseProxy (line 76) | function onToggleUseProxy(useProxy: boolean = false) {
  function onProxyProfileChanged (line 91) | function onProxyProfileChanged(profile) {

FILE: desktop-app-legacy/app/actions/statusBar.js
  constant TOGGLE_STATUS_BAR_VISIBILITY (line 4) | const TOGGLE_STATUS_BAR_VISIBILITY = 'TOGGLE_STATUS_BAR_VISIBILITY';
  function toggleStatusBarVisibility (line 6) | function toggleStatusBarVisibility() {

FILE: desktop-app-legacy/app/app-updater.js
  class AppUpdater (line 19) | class AppUpdater extends EventEmitter {
    method constructor (line 28) | constructor() {
    method getCurrentStatus (line 49) | getCurrentStatus() {
    method checkForUpdatesAndNotify (line 53) | checkForUpdatesAndNotify() {
    method handleStatusChange (line 84) | handleStatusChange(nextStatus: string, backToIdle: boolean) {

FILE: desktop-app-legacy/app/components/AddressInput.js
  class AddressBar (line 22) | class AddressBar extends React.Component {
    method constructor (line 25) | constructor(props) {
    method componentDidMount (line 37) | componentDidMount() {
    method componentWillUnmount (line 41) | componentWillUnmount() {
    method getDerivedStateFromProps (line 45) | static getDerivedStateFromProps(props, state) {
    method render (line 55) | render() {
  constant MAX_SUGGESTIONS (line 285) | const MAX_SUGGESTIONS = 8;

FILE: desktop-app-legacy/app/components/AppNotification/AppNotification.js
  function updateNotificationStatus (line 12) | function updateNotificationStatus(id, action) {
  function checkIfInteracted (line 23) | function checkIfInteracted(id) {

FILE: desktop-app-legacy/app/components/BookmarksBar/BookmarkEditDialog.js
  function BookmarkEditDialog (line 9) | function BookmarkEditDialog({

FILE: desktop-app-legacy/app/components/ClearNetworkCache/index.js
  function ClearNetworkCache (line 7) | function ClearNetworkCache(props) {

FILE: desktop-app-legacy/app/components/CreateIssue/index.js
  function CreateIssue (line 59) | function CreateIssue(props) {

FILE: desktop-app-legacy/app/components/DeviceDrawer/index.js
  function DeviceDrawer (line 11) | function DeviceDrawer({

FILE: desktop-app-legacy/app/components/DeviceManager/AddDevice/index.js
  function AddDevice (line 73) | function AddDevice(props) {

FILE: desktop-app-legacy/app/components/DeviceManager/DeviceItem.js
  function DeviceItem (line 16) | function DeviceItem({device, index, enableCustomDeviceDeletion, deleteDe...

FILE: desktop-app-legacy/app/components/DeviceManager/DeviceList.js
  function DeviceList (line 12) | function DeviceList({

FILE: desktop-app-legacy/app/components/DeviceManager/OSIcon.js
  function OSIcon (line 10) | function OSIcon({os, color}) {

FILE: desktop-app-legacy/app/components/DeviceManager/index.js
  function DeviceManager (line 24) | function DeviceManager(props) {

FILE: desktop-app-legacy/app/components/DevicesOverview/index.js
  function DevicesOverview (line 8) | function DevicesOverview(props) {

FILE: desktop-app-legacy/app/components/DevicesPreviewer/index.js
  function DevicesPreviewer (line 22) | function DevicesPreviewer(props) {

FILE: desktop-app-legacy/app/components/Drawer.js
  function Drawer (line 18) | function Drawer(props) {
  function getDrawerContent (line 73) | function getDrawerContent(type) {

FILE: desktop-app-legacy/app/components/ErrorBoundary/index.js
  class ErrorBoundary (line 8) | class ErrorBoundary extends React.Component {
    method getDerivedStateFromError (line 9) | static getDerivedStateFromError(error) {
    method componentDidCatch (line 17) | componentDidCatch(error, errorInfo) {
    method constructor (line 29) | constructor(props) {
    method render (line 34) | render() {

FILE: desktop-app-legacy/app/components/ExtensionsManager/index.js
  function ExtensionsManager (line 45) | function ExtensionsManager({triggerNavigationReload}) {
  function ExtensionItem (line 227) | function ExtensionItem({extension, onDelete}) {

FILE: desktop-app-legacy/app/components/Headway.js
  function Headway (line 7) | function Headway() {

FILE: desktop-app-legacy/app/components/HttpAuthDialog/index.js
  function HttpAuthDialog (line 11) | function HttpAuthDialog() {

FILE: desktop-app-legacy/app/components/NavigationControls/index.js
  class NavigationControls (line 15) | class NavigationControls extends Component {
    method componentDidMount (line 16) | componentDidMount() {
    method componentWillUnmount (line 21) | componentWillUnmount() {
    method render (line 29) | render() {

FILE: desktop-app-legacy/app/components/NetworkConfiguration/index.js
  function NetworkConfiguration (line 9) | function NetworkConfiguration({

FILE: desktop-app-legacy/app/components/NetworkProxy/ProxyManager/index.js
  function ProtocolSelector (line 32) | function ProtocolSelector({value, onChange, allowUseDefault = false}) {
  function NumberFormatCustom (line 43) | function NumberFormatCustom(props) {
  function ProxyManager (line 115) | function ProxyManager({proxy, onSave}) {

FILE: desktop-app-legacy/app/components/NetworkProxy/index.js
  function NetworkProxy (line 34) | function NetworkProxy({

FILE: desktop-app-legacy/app/components/NetworkThrottling/ProfileManager/index.js
  function NumberFormatCustom (line 19) | function NumberFormatCustom(props) {
  function ProfileManager (line 40) | function ProfileManager({profiles, onSave}) {

FILE: desktop-app-legacy/app/components/NetworkThrottling/index.js
  function NetworkThrottling (line 27) | function NetworkThrottling({

FILE: desktop-app-legacy/app/components/NotificationMessage/index.js
  function NotificationMessage (line 5) | function NotificationMessage(props) {

FILE: desktop-app-legacy/app/components/PageNavigator/index.js
  constant INPUT_SOURCES (line 16) | const INPUT_SOURCES = {TEXT_BOX: 'TEXT_BOX', OPTION_CLICK: 'OPTION_CLICK'};

FILE: desktop-app-legacy/app/components/PermissionPopup/index.js
  function getMessage (line 63) | function getMessage(info) {
  function PermissionPopup (line 73) | function PermissionPopup() {

FILE: desktop-app-legacy/app/components/PrefersColorSchemeSwitch/index.js
  function PrefersColorSchemeSwitch (line 7) | function PrefersColorSchemeSwitch({iconProps}) {

FILE: desktop-app-legacy/app/components/PreviewerLayoutSelector/index.js
  function PreviewerLayoutSelector (line 12) | function PreviewerLayoutSelector(props) {

FILE: desktop-app-legacy/app/components/QuickFilterDevices/index.js
  function QuickFilterDevices (line 15) | function QuickFilterDevices(props) {

FILE: desktop-app-legacy/app/components/Renderer/index.js
  function Renderer (line 16) | function Renderer(props) {

FILE: desktop-app-legacy/app/components/ScreenShotSavePreference/index.js
  function ScreenShotSavePreference (line 10) | function ScreenShotSavePreference({

FILE: desktop-app-legacy/app/components/ScreenshotManager/index.js
  function Screenshotmanager (line 3) | function Screenshotmanager(props) {

FILE: desktop-app-legacy/app/components/Select.js
  function Select (line 6) | function Select(props) {

FILE: desktop-app-legacy/app/components/ToggleTouch/index.js
  function ToggleTouch (line 8) | function ToggleTouch({iconProps}) {

FILE: desktop-app-legacy/app/components/UserPreferences/index.js
  function UserPreference (line 32) | function UserPreference({

FILE: desktop-app-legacy/app/components/WebView/index.js
  constant MESSAGE_TYPES (line 58) | const MESSAGE_TYPES = {
  method constructor (line 69) | constructor(props) {
  method componentDidMount (line 96) | componentDidMount() {
  method componentDidUpdate (line 306) | componentDidUpdate(prevProps) {
  method getWebContentsId (line 322) | getWebContentsId() {
  method getWebContents (line 326) | getWebContents() {
  method getWebContentForId (line 330) | getWebContentForId(id) {
  method componentWillUnmount (line 334) | componentWillUnmount() {
  method if (line 612) | if (type !== MESSAGE_TYPES.toggleEventMirroring && this.state.isUnplugge...
  method switch (line 615) | switch (type) {
  method if (line 759) | if (this.state.isUnplugged) {
  method switch (line 819) | switch (method) {
  method if (line 851) | if (!this.props.browser.isInspecting) {

FILE: desktop-app-legacy/app/components/WebView/screenshotUtil.js
  class WebViewUtils (line 100) | class WebViewUtils {
    method constructor (line 105) | constructor(webView, setFullDocumentDimensions) {
    method getWindowSizeAndScrollDetails (line 113) | getWindowSizeAndScrollDetails(): Promise {
    method scrollTo (line 133) | async scrollTo(scrollX: number, scrollY: number, doDelay = false): Pro...
    method hideScrollbarAndFixedPositionedElements (line 148) | async hideScrollbarAndFixedPositionedElements(
    method unHideScrollbarAndFixedPositionedElements (line 177) | async unHideScrollbarAndFixedPositionedElements(
    method getScrollPercent (line 195) | async getScrollPercent(): Promise<Number> {
    method scrollViewPort (line 212) | async scrollViewPort(): Promise {
    method setWhiteBG (line 226) | async setWhiteBG() {
    method setScrollBehaviorToAuto (line 249) | async setScrollBehaviorToAuto() {
    method resetScrollBehavior (line 257) | async resetScrollBehavior() {
    method resetBG (line 265) | async resetBG() {
    method doFullPageScrollToLoadLazyLoadedSections (line 273) | async doFullPageScrollToLoadLazyLoadedSections(): Promise {
    method captureFullPageV2 (line 284) | async captureFullPageV2({dir, file}) {
    method getViewportImage (line 311) | async getViewportImage({dir, file}): Promise {
    method writeNativeImageToFile (line 318) | async writeNativeImageToFile(image, dir, file) {
    method getFullScreenImages (line 325) | async getFullScreenImages(promiseWorker: PromiseWorker): Promise {
    method takeSnapshot (line 386) | async takeSnapshot(options): Promise {
  function _getScreenshotFileName (line 401) | function _getScreenshotFileName(

FILE: desktop-app-legacy/app/components/ZoomInput/index.js
  function BrowserZoom (line 21) | function BrowserZoom(props) {

FILE: desktop-app-legacy/app/components/icons/CrossChrome.js
  function CrossChrome (line 3) | function CrossChrome({width, height, color, padding, margin}) {

FILE: desktop-app-legacy/app/components/icons/DockBottom.js
  function DockBottom (line 5) | function DockBottom({width, height, color, padding, margin}) {

FILE: desktop-app-legacy/app/components/icons/DockRight.js
  function DockRight (line 5) | function DockRight({width, height, color, padding, margin}) {

FILE: desktop-app-legacy/app/components/icons/Filter.js
  function Filter (line 3) | function Filter({width, height, color, className}) {

FILE: desktop-app-legacy/app/components/icons/Gift.js
  function Gift (line 3) | function Gift({width, height, color, className}) {

FILE: desktop-app-legacy/app/components/icons/Github.js
  function Github (line 3) | function Github({

FILE: desktop-app-legacy/app/components/icons/Globe.js
  function Globe (line 3) | function Globe({

FILE: desktop-app-legacy/app/components/icons/InspectElementChrome.js
  function InspectElementChrome (line 6) | function InspectElementChrome({

FILE: desktop-app-legacy/app/components/icons/Kebab.js
  function Kebab (line 3) | function Kebab({width, height, color, padding, margin}) {

FILE: desktop-app-legacy/app/components/icons/Logo.js
  function Logo (line 5) | function Logo({

FILE: desktop-app-legacy/app/components/icons/Muted.js
  function Muted (line 3) | function Muted({width, height, color, padding, margin}) {

FILE: desktop-app-legacy/app/components/icons/RoadMap.js
  function RoadMap (line 3) | function RoadMap({

FILE: desktop-app-legacy/app/components/icons/Start.js
  function Start (line 3) | function Start({width, height, strokeColor, fillColor, padding, margin}) {

FILE: desktop-app-legacy/app/components/icons/Twitter.js
  function Twitter (line 3) | function Twitter({

FILE: desktop-app-legacy/app/components/icons/UnDock.js
  function UnDock (line 6) | function UnDock({

FILE: desktop-app-legacy/app/components/useCreateTheme.js
  function useCreateTheme (line 6) | function useCreateTheme() {
  method mode (line 52) | mode({light, dark}) {
  method mode (line 96) | mode({light, dark}) {

FILE: desktop-app-legacy/app/components/useIsDarkTheme.js
  function useIsDarkTheme (line 6) | function useIsDarkTheme() {

FILE: desktop-app-legacy/app/constants/DrawerContents.js
  constant DEVICE_MANAGER (line 1) | const DEVICE_MANAGER = 'DEVICE_MANAGER';
  constant SCREENSHOT_MANAGER (line 2) | const SCREENSHOT_MANAGER = 'SCREENSHOT_MANAGER';
  constant USER_PREFERENCES (line 3) | const USER_PREFERENCES = 'USER_PREFERENCES';
  constant EXTENSIONS_MANAGER (line 4) | const EXTENSIONS_MANAGER = 'EXTENSIONS_MANAGER';
  constant NETWORK_CONFIGURATION (line 5) | const NETWORK_CONFIGURATION = 'NETWORK_CONFIGURATION';

FILE: desktop-app-legacy/app/constants/browserSync.js
  constant BROWSER_SYNC_VERSION (line 1) | const BROWSER_SYNC_VERSION = '2.26.7';
  constant BROWSER_SYNC_PORT (line 2) | const BROWSER_SYNC_PORT = '12719';

FILE: desktop-app-legacy/app/constants/devices.js
  function getOS (line 55) | function getOS(device) {
  function getUserAgent (line 69) | function getUserAgent(device) {
  function getAllDevices (line 77) | function getAllDevices() {

FILE: desktop-app-legacy/app/constants/index.js
  constant DEFAULT_ZOOM_LEVEL (line 6) | const DEFAULT_ZOOM_LEVEL = 0.6;
  constant MIN_ZOOM_LEVEL (line 11) | const MIN_ZOOM_LEVEL = 0.2;
  constant MAX_ZOOM_LEVEL (line 16) | const MAX_ZOOM_LEVEL = 2.0;

FILE: desktop-app-legacy/app/constants/license.js
  constant DEACTIVATION_REASON (line 1) | const DEACTIVATION_REASON = {

FILE: desktop-app-legacy/app/constants/permissionsManagement.js
  constant PERMISSION_MANAGEMENT_OPTIONS (line 1) | const PERMISSION_MANAGEMENT_OPTIONS = {

FILE: desktop-app-legacy/app/constants/previewerLayouts.js
  constant HORIZONTAL_LAYOUT (line 1) | const HORIZONTAL_LAYOUT = 'HORIZONTAL';
  constant FLEXIGRID_LAYOUT (line 2) | const FLEXIGRID_LAYOUT = 'FLEXIGRID';
  constant INDIVIDUAL_LAYOUT (line 3) | const INDIVIDUAL_LAYOUT = 'INDIVIDUAL';
  constant DEVTOOLS_MODES (line 5) | const DEVTOOLS_MODES = {
  constant CSS_EDITOR_MODES (line 11) | const CSS_EDITOR_MODES = {

FILE: desktop-app-legacy/app/constants/pubsubEvents.js
  constant SCROLL_DOWN (line 1) | const SCROLL_DOWN = 'SCROLL_DOWN';
  constant SCROLL_UP (line 2) | const SCROLL_UP = 'SCROLL_UP';
  constant NAVIGATION_BACK (line 3) | const NAVIGATION_BACK = 'NAVIGATION_BACK';
  constant NAVIGATION_FORWARD (line 4) | const NAVIGATION_FORWARD = 'NAVIGATION_FORWARD';
  constant NAVIGATION_RELOAD (line 5) | const NAVIGATION_RELOAD = 'NAVIGATION_RELOAD';
  constant RELOAD_CSS (line 6) | const RELOAD_CSS = 'RELOAD_CSS';
  constant ADDRESS_CHANGE (line 7) | const ADDRESS_CHANGE = 'ADDRESS_CHANGE';
  constant DELETE_STORAGE (line 8) | const DELETE_STORAGE = 'DELETE_STORAGE';
  constant SCREENSHOT_ALL_DEVICES (line 9) | const SCREENSHOT_ALL_DEVICES = 'SCREENSHOT_ALL_DEVICES';
  constant FLIP_ORIENTATION_ALL_DEVICES (line 10) | const FLIP_ORIENTATION_ALL_DEVICES = 'FLIP_ORIENTATION_ALL_DEVICES';
  constant TOGGLE_DEVICE_MUTED_STATE (line 11) | const TOGGLE_DEVICE_MUTED_STATE = 'TOGGLE_DEVICE_MUTED_STATE';
  constant TOGGLE_EVENT_MIRRORING_ALL_DEVICES (line 12) | const TOGGLE_EVENT_MIRRORING_ALL_DEVICES =
  constant STOP_LOADING (line 14) | const STOP_LOADING = 'STOP_LOADING';
  constant APPLY_CSS (line 15) | const APPLY_CSS = 'APPLY_CSS';
  constant SET_NETWORK_TROTTLING_PROFILE (line 17) | const SET_NETWORK_TROTTLING_PROFILE = 'SET_NETWORK_TROTTLING_PROFILE';
  constant CLEAR_NETWORK_CACHE (line 18) | const CLEAR_NETWORK_CACHE = 'CLEAR_NETWORK_CACHE';
  constant OPEN_CONSOLE_FOR_DEVICE (line 19) | const OPEN_CONSOLE_FOR_DEVICE = 'OPEN_CONSOLE_FOR_DEVICE';
  constant PROXY_AUTH_ERROR (line 20) | const PROXY_AUTH_ERROR = 'PROXY_AUTH_ERROR';
  constant STATUS_BAR_VISIBILITY_CHANGE (line 23) | const STATUS_BAR_VISIBILITY_CHANGE = 'status-bar-visibility-change';
  constant HIDE_PERMISSION_POPUP_DUE_TO_RELOAD (line 25) | const HIDE_PERMISSION_POPUP_DUE_TO_RELOAD =
  constant PERMISSION_MANAGEMENT_PREFERENCE_CHANGED (line 27) | const PERMISSION_MANAGEMENT_PREFERENCE_CHANGED =
  constant TOGGLE_DEVICE_DESIGN_MODE_STATE (line 30) | const TOGGLE_DEVICE_DESIGN_MODE_STATE =
  constant PAGE_NAVIGATOR_CHANGED (line 33) | const PAGE_NAVIGATOR_CHANGED = 'PAGE_NAVIGATOR_CHANGED';

FILE: desktop-app-legacy/app/constants/searchResultSettings.js
  constant ADD_SEARCH_RESULTS (line 1) | const ADD_SEARCH_RESULTS = 'ADD_SEARCH_RESULTS';

FILE: desktop-app-legacy/app/constants/settingKeys.js
  constant ACTIVE_DEVICES (line 1) | const ACTIVE_DEVICES = 'activeDevices';
  constant CUSTOM_DEVICES (line 2) | const CUSTOM_DEVICES = 'customDevices';
  constant USER_PREFERENCES (line 3) | const USER_PREFERENCES = 'userPreferences';
  constant CAN_PROMPT_MOVE_TO_APPLICATIONS (line 4) | const CAN_PROMPT_MOVE_TO_APPLICATIONS = 'canPromptMoveToApplications';
  constant NETWORK_CONFIGURATION (line 5) | const NETWORK_CONFIGURATION = 'networkConfiguration';
  constant BOOKMARKS (line 6) | const BOOKMARKS = 'bookmarks';
  constant STATUS_BAR_VISIBILITY (line 7) | const STATUS_BAR_VISIBILITY = 'statusBarVisibility';
  constant APP_NOTIFICATION (line 8) | const APP_NOTIFICATION = 'appNotification';
  constant LAYOUT (line 9) | const LAYOUT = 'layout';

FILE: desktop-app-legacy/app/constants/theme.js
  constant LIGHT_THEME (line 1) | const LIGHT_THEME = 'light';
  constant DARK_THEME (line 2) | const DARK_THEME = 'dark';

FILE: desktop-app-legacy/app/constants/values.js
  constant SCREENSHOT_MECHANISM (line 1) | const SCREENSHOT_MECHANISM = {
  constant SSL_ERROR_CODES (line 6) | const SSL_ERROR_CODES = {
  constant DESIGN_MODE_JS_VALUES (line 11) | const DESIGN_MODE_JS_VALUES = {
  constant STARTUP_PAGE (line 16) | const STARTUP_PAGE = {

FILE: desktop-app-legacy/app/containers/AddDeviceContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 15) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/AddressBar/index.js
  function mapStateToProps (line 34) | function mapStateToProps(state) {
  function mapDispatchToProps (line 43) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/BookmarksBarContainer/index.js
  function mapStateToProps (line 28) | function mapStateToProps(state) {
  function mapDispatchToProps (line 34) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/Browser/index.js
  function mapStateToProps (line 69) | function mapStateToProps(state) {
  function mapDispatchToProps (line 75) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/DevToolResizerContainer/index.js
  function mapStateToProps (line 16) | function mapStateToProps(state) {
  function mapDispatchToProps (line 24) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/DeviceDrawerContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 15) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/DeviceManagerContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 15) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/DevicePreviewerContainer/index.js
  function mapStateToProps (line 8) | function mapStateToProps(state) {
  function mapDispatchToProps (line 14) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/DevicesOverviewContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 15) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/DrawerContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 15) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/ExtensionsManagerContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 15) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/HeaderContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 15) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/LeftIconsPaneContainer/index.js
  function mapStateToProps (line 8) | function mapStateToProps(state) {
  function mapDispatchToProps (line 15) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/NavigationControlsContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 19) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/NetworkConfigurationContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 16) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/PageNavigatorContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 16) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/QuickFilterDevicesContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 15) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/Root.js
  function App (line 34) | function App() {
  class Root (line 50) | class Root extends Component {
    method componentDidMount (line 51) | componentDidMount() {
    method componentWillUnmount (line 62) | componentWillUnmount() {
    method render (line 278) | render() {

FILE: desktop-app-legacy/app/containers/ScrollControlsContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 15) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/StatusBarContainer/index.js
  function mapStateToProps (line 26) | function mapStateToProps(state) {
  function mapDispatchToProps (line 33) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/UserPreferencesContainer/index.js
  function mapStateToProps (line 9) | function mapStateToProps(state) {
  function mapDispatchToProps (line 16) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/WebViewContainer/index.js
  function mapStateToProps (line 8) | function mapStateToProps(state) {
  function mapDispatchToProps (line 14) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/containers/ZoomContainer/index.js
  function mapStateToProps (line 8) | function mapStateToProps(state) {
  function mapDispatchToProps (line 14) | function mapDispatchToProps(dispatch) {

FILE: desktop-app-legacy/app/imageWorker.js
  constant UUID (line 10) | const UUID = uuid.v4;
  function stitchHorizontally (line 20) | async function stitchHorizontally(images) {
  function writeToTempFile (line 31) | async function writeToTempFile(image) {
  function stitchVertically (line 44) | async function stitchVertically(images, {dir, file}) {

FILE: desktop-app-legacy/app/main.dev.js
  constant URL (line 66) | const URL = require('url').URL;
  constant HOME_PAGE (line 68) | const HOME_PAGE = 'HOME_PAGE';
  constant LAST_OPENED_ADDRESS (line 69) | const LAST_OPENED_ADDRESS = 'LAST_OPENED_ADDRESS';
  function getUserPreferences (line 332) | function getUserPreferences(): UserPreferenceType {

FILE: desktop-app-legacy/app/menu.js
  class MenuBuilder (line 25) | class MenuBuilder {
    method constructor (line 28) | constructor(mainWindow: BrowserWindow) {
    method aboutClick (line 32) | aboutClick() {
    method click (line 79) | click() {
    method click (line 85) | click() {
    method click (line 93) | click() {
    method click (line 101) | click() {
    method click (line 107) | click() {
    method click (line 162) | click() {
    method getCheckForUpdatesMenuState (line 240) | getCheckForUpdatesMenuState() {
    method buildMenu (line 277) | buildMenu(isUpdate: boolean = false) {
    method setupDevelopmentEnvironment (line 308) | setupDevelopmentEnvironment() {
    method buildDarwinTemplate (line 324) | buildDarwinTemplate() {
    method buildDefaultTemplate (line 505) | buildDefaultTemplate() {
    method registerMenuShortcuts (line 614) | registerMenuShortcuts(

FILE: desktop-app-legacy/app/preload.js
  method click (line 14) | click(menuItem, browserWindow, event) {
  method click (line 22) | click(menuItem, browserWindow, event) {
  method click (line 33) | click(menuItem, browserWindow, event) {
  method click (line 44) | click(menuItem, browserWindow, event) {
  method click (line 55) | click(menuItem, browserWindow, event) {

FILE: desktop-app-legacy/app/reducers/bookmarks.js
  function fetchBookmarks (line 11) | function fetchBookmarks(): BookmarksType {
  function persistBookmarks (line 15) | function persistBookmarks(bookmarks) {
  function browser (line 19) | function browser(

FILE: desktop-app-legacy/app/reducers/browser.js
  constant FILTER_FIELDS (line 72) | const FILTER_FIELDS = {
  function _saveActiveDevices (line 218) | function _saveActiveDevices(devices) {
  function _getActiveDevices (line 226) | function _getActiveDevices() {
  function _getUserPreferences (line 252) | function _getUserPreferences(): UserPreferenceType {
  function _setUserPreferences (line 256) | function _setUserPreferences(userPreferences) {
  function getBounds (line 260) | function getBounds(mode, _size, windowSize) {
  function getDefaultDevToolsWindowSize (line 282) | function getDefaultDevToolsWindowSize(mode, windowSize) {
  function getWindowSize (line 290) | function getWindowSize() {
  function _getUserPreferencesDevToolsMode (line 294) | function _getUserPreferencesDevToolsMode() {
  function _updateFileWatcher (line 298) | function _updateFileWatcher(newURL) {
  function _getHomepage (line 309) | function _getHomepage() {
  function _getNetworkConfiguration (line 315) | function _getNetworkConfiguration(): NetworkConfigurationType {
  function _setNetworkConfiguration (line 319) | function _setNetworkConfiguration(
  function getLayout (line 325) | function getLayout() {
  function setLayout (line 329) | function setLayout(layout) {
  function browser (line 333) | function browser(

FILE: desktop-app-legacy/app/reducers/index.js
  function createRootReducer (line 7) | function createRootReducer() {

FILE: desktop-app-legacy/app/reducers/statusBar.js
  function app (line 7) | function app(

FILE: desktop-app-legacy/app/services/browserSync/index.js
  function initializeBrowserSyncOptions (line 8) | async function initializeBrowserSyncOptions() {
  function getBrowserSyncEmbedScriptURL (line 14) | function getBrowserSyncEmbedScriptURL() {

FILE: desktop-app-legacy/app/services/db/appMetadata.js
  constant OPEN_COUNT (line 3) | const OPEN_COUNT = 'openCount';
  class AppMetadata (line 5) | class AppMetadata {
    method incrementOpenCount (line 6) | incrementOpenCount() {
    method getOpenCount (line 11) | getOpenCount() {

FILE: desktop-app-legacy/app/settings/migration.js
  function migrateDeviceSchema (line 13) | function migrateDeviceSchema() {
  function _ensureDefaultStartupPage (line 29) | function _ensureDefaultStartupPage() {
  function _ensureDefaultNetworkConfig (line 38) | function _ensureDefaultNetworkConfig() {
  function _getDefaultNetworkThrottlingProfiles (line 49) | function _getDefaultNetworkThrottlingProfiles() {
  function _getDefaultNetworkProxyProfile (line 81) | function _getDefaultNetworkProxyProfile() {

FILE: desktop-app-legacy/app/settings/statusBarSettings.js
  class StatusBarSettings (line 4) | class StatusBarSettings {
    method constructor (line 5) | constructor() {

FILE: desktop-app-legacy/app/settings/userPreferenceSettings.js
  class UserPreferenceSettings (line 7) | class UserPreferenceSettings {

FILE: desktop-app-legacy/app/shortcut-manager/main-shortcut-manager.js
  function registerShortcut (line 21) | function registerShortcut(shortcut: ShortcutDefinition): boolean {
  function unregisterShortcut (line 27) | function unregisterShortcut(id: string): boolean {
  function clearAllShortcuts (line 32) | function clearAllShortcuts() {
  function getAllShortcuts (line 36) | function getAllShortcuts(): ShortcutDefinition[] {
  function initMainShortcutManager (line 44) | function initMainShortcutManager() {

FILE: desktop-app-legacy/app/shortcut-manager/renderer-shortcut-manager.js
  function validate (line 23) | function validate(shortcut: ShortcutDefinition, checkUnique = true) {

FILE: desktop-app-legacy/app/shortcut-manager/shared.js
  constant REGISTER_CHANNEL (line 1) | const REGISTER_CHANNEL = 'register-shortcut';
  constant UNREGISTER_CHANNEL (line 2) | const UNREGISTER_CHANNEL = 'unregister-shortcut';
  constant REGISTER_REPLY_CHANNEL (line 3) | const REGISTER_REPLY_CHANNEL = 'register-shortcut-reply';
  constant UNREGISTER_REPLY_CHANNEL (line 4) | const UNREGISTER_REPLY_CHANNEL = 'unregister-shortcut-reply';
  constant GET_ALL_CHANNEL (line 5) | const GET_ALL_CHANNEL = 'get-all-shortcuts';
  constant CLEAR_CHANNEL (line 6) | const CLEAR_CHANNEL = 'clear-shortcuts';
  function validateDefinition (line 18) | function validateDefinition(shortcut: ShortcutDefinition): boolean {

FILE: desktop-app-legacy/app/store/configureStore.prod.js
  function configureStore (line 20) | function configureStore(initialState) {

FILE: desktop-app-legacy/app/utils/browserSync.js
  function initBrowserSync (line 11) | async function initBrowserSync() {
  function watchFiles (line 17) | function watchFiles(filePath) {
  function stopWatchFiles (line 35) | async function stopWatchFiles() {
  function getBrowserSyncHost (line 44) | function getBrowserSyncHost() {
  function getBrowserSyncEmbedScriptURL (line 48) | function getBrowserSyncEmbedScriptURL() {
  function initInstance (line 52) | async function initInstance(): Promise<> {
  function closeBrowserSync (line 73) | function closeBrowserSync() {

FILE: desktop-app-legacy/app/utils/browserUtils.js
  function normalizeZoomLevel (line 9) | function normalizeZoomLevel(zoomLevel: number): number {

FILE: desktop-app-legacy/app/utils/deviceManagerUtils.js
  constant MIN_NUMBER_OF_DEVICES (line 3) | const MIN_NUMBER_OF_DEVICES = 2;
  function getRecommendedMaxNumberOfDevices (line 5) | function getRecommendedMaxNumberOfDevices() {

FILE: desktop-app-legacy/app/utils/generalUtils.js
  function isSslValidationFailed (line 41) | function isSslValidationFailed(errorCode) {

FILE: desktop-app-legacy/app/utils/navigatorUtils.js
  constant HOME_PAGE (line 6) | const HOME_PAGE = 'HOME_PAGE';
  constant LAST_OPENED_ADDRESS (line 7) | const LAST_OPENED_ADDRESS = 'LAST_OPENED_ADDRESS';
  function saveHomepage (line 9) | function saveHomepage(url) {
  function saveLastOpenedAddress (line 13) | function saveLastOpenedAddress(url) {
  function getHomepage (line 17) | function getHomepage() {
  function getLastOpenedAddress (line 21) | function getLastOpenedAddress() {
  function getStartupPage (line 25) | function getStartupPage() {
  function saveStartupPage (line 31) | function saveStartupPage(option: 'BLANK' | 'HOME') {

FILE: desktop-app-legacy/app/utils/permissionUtils.js
  function getPermissionPageTitle (line 13) | function getPermissionPageTitle(url) {
  function getDeviceText (line 25) | function getDeviceText(device) {
  function getPermissionRequestMessage (line 32) | function getPermissionRequestMessage(permission, details) {
  function notifyPermissionToHandleReloadOrNewAddress (line 62) | function notifyPermissionToHandleReloadOrNewAddress() {
  function notifyPermissionPreferenceChanged (line 67) | function notifyPermissionPreferenceChanged(newPreference) {
  function getPermissionSettingPreference (line 71) | function getPermissionSettingPreference() {

FILE: desktop-app-legacy/app/utils/proxyUtils.js
  function proxyRuleToString (line 1) | function proxyRuleToString(scheme, rule, defaultRule) {
  function convertToProxyConfig (line 10) | function convertToProxyConfig(profile) {
  function getEmptyProxySchemeConfig (line 29) | function getEmptyProxySchemeConfig(useDefault = false) {

FILE: desktop-app-legacy/app/utils/stringUtils.js
  function isNullOrWhiteSpaces (line 1) | function isNullOrWhiteSpaces(str: string): boolean {

FILE: desktop-app-legacy/app/utils/urlUtils.js
  function getHostFromURL (line 3) | function getHostFromURL(url: String) {

FILE: desktop-app-legacy/configs/webpack.config.renderer.dev.babel.js
  method before (line 260) | before() {

FILE: desktop-app-legacy/internals/scripts/CheckBuiltsExist.js
  function CheckBuildsExist (line 7) | function CheckBuildsExist() {

FILE: desktop-app-legacy/internals/scripts/CheckNodeEnv.js
  function CheckNodeEnv (line 4) | function CheckNodeEnv(expectedEnv: string) {

FILE: desktop-app-legacy/scripts/generate-checksums.js
  function hashFile (line 16) | function hashFile(file, algorithm = 'sha512', encoding = 'hex', options ...
  constant RELATIVE_FOLDER_PATH (line 38) | const RELATIVE_FOLDER_PATH = '../release';
  constant CHECKSUM_SUFFIX (line 39) | const CHECKSUM_SUFFIX = '.checksum.sha512';
  constant SKIP_SUFFIX_LIST (line 40) | const SKIP_SUFFIX_LIST = [CHECKSUM_SUFFIX, '.yml', '.yaml', '.txt'];

FILE: desktop-app/.erb/configs/webpack.config.renderer.dev.ts
  method setupMiddlewares (line 213) | setupMiddlewares(middlewares) {

FILE: desktop-app/.erb/scripts/check-node-env.js
  function checkNodeEnv (line 3) | function checkNodeEnv(expectedEnv) {

FILE: desktop-app/.erb/scripts/delete-source-maps.js
  function deleteSourceMaps (line 5) | function deleteSourceMaps() {

FILE: desktop-app/assets/assets.d.ts
  type Styles (line 1) | type Styles = Record<string, string>;

FILE: desktop-app/postinstall.ts
  function performReplacements (line 3) | async function performReplacements() {
  function performPostInstall (line 27) | async function performPostInstall() {

FILE: desktop-app/src/common/constants.ts
  constant DOCK_POSITION (line 3) | const DOCK_POSITION = {
  constant PREVIEW_LAYOUTS (line 9) | const PREVIEW_LAYOUTS = {
  type PreviewLayout (line 16) | type PreviewLayout = (typeof PREVIEW_LAYOUTS)[keyof typeof PREVIEW_LAYOU...
  type Notification (line 18) | type Notification = {
  type OpenUrlArgs (line 25) | interface OpenUrlArgs {
  constant IPC_MAIN_CHANNELS (line 29) | const IPC_MAIN_CHANNELS = {
  type Channels (line 46) | type Channels = (typeof IPC_MAIN_CHANNELS)[keyof typeof IPC_MAIN_CHANNELS];
  constant PROTOCOL (line 48) | const PROTOCOL = 'responsively';
  constant PERMISSION_TYPES (line 50) | const PERMISSION_TYPES = {
  type PermissionType (line 61) | type PermissionType = (typeof PERMISSION_TYPES)[keyof typeof PERMISSION_...
  type SitePermission (line 63) | interface SitePermission {

FILE: desktop-app/src/common/deviceList.ts
  type Device (line 1) | interface Device {
  type DeviceMap (line 1596) | type DeviceMap = {[key: string]: Device};

FILE: desktop-app/src/common/webViewUtils.ts
  function updateWebViewHeightAndScale (line 1) | function updateWebViewHeightAndScale(

FILE: desktop-app/src/main/app-meta/index.ts
  type AppMetaResponse (line 6) | interface AppMetaResponse {

FILE: desktop-app/src/main/app-updater.ts
  type AppUpdaterStatus (line 3) | interface AppUpdaterStatus {
  class AppUpdater (line 12) | class AppUpdater {
    method constructor (line 25) | constructor() {
    method getStatus (line 61) | getStatus(): AppUpdaterStatus {

FILE: desktop-app/src/main/browser-sync.ts
  constant BROWSER_SYNC_PORT (line 5) | const BROWSER_SYNC_PORT = 12719;
  constant BROWSER_SYNC_HOST (line 6) | const BROWSER_SYNC_HOST = `localhost:${BROWSER_SYNC_PORT}`;
  constant BROWSER_SYNC_URL (line 7) | const BROWSER_SYNC_URL = `https://${BROWSER_SYNC_HOST}/browser-sync/brow...
  function initInstance (line 15) | async function initInstance(): Promise<BrowserSyncInstance> {
  function watchFiles (line 40) | function watchFiles(filePath: string) {
  function stopWatchFiles (line 61) | async function stopWatchFiles() {

FILE: desktop-app/src/main/devtools/index.ts
  type OpenDevtoolsArgs (line 9) | interface OpenDevtoolsArgs {
  type ResizeDevtoolsArgs (line 15) | interface ResizeDevtoolsArgs {
  type OpenDevtoolsResult (line 19) | interface OpenDevtoolsResult {
  type ToggleInspectorArgs (line 23) | interface ToggleInspectorArgs {
  type ToggleInspectorResult (line 27) | interface ToggleInspectorResult {
  type InspectElementArgs (line 31) | interface InspectElementArgs {

FILE: desktop-app/src/main/http-basic-auth/index.ts
  type AuthRequestArgs (line 4) | type AuthRequestArgs = AuthInfo;
  type AuthResponseArgs (line 6) | interface AuthResponseArgs {
  type Callback (line 12) | type Callback = (username: string, password: string) => void;

FILE: desktop-app/src/main/menu/help.ts
  type AboutDialogArgs (line 7) | interface AboutDialogArgs {
  method click (line 29) | click() {
  method click (line 35) | click() {
  method click (line 41) | click() {
  method click (line 47) | click() {
  method click (line 53) | click() {

FILE: desktop-app/src/main/menu/index.ts
  type DarwinMenuItemConstructorOptions (line 6) | interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOp...
  type ReloadArgs (line 11) | interface ReloadArgs {
  class MenuBuilder (line 15) | class MenuBuilder {
    method constructor (line 20) | constructor(mainWindow: BrowserWindow, appUpdater: AppUpdater) {
    method buildMenu (line 25) | buildMenu(): Menu {
    method setupDevelopmentEnvironment (line 39) | setupDevelopmentEnvironment(): void {
    method buildDarwinTemplate (line 54) | buildDarwinTemplate(): MenuItemConstructorOptions[] {
    method buildDefaultTemplate (line 124) | buildDefaultTemplate(): MenuItemConstructorOptions[] {

FILE: desktop-app/src/main/native-functions/index.ts
  type DisableDefaultWindowOpenHandlerArgs (line 3) | interface DisableDefaultWindowOpenHandlerArgs {
  type DisableDefaultWindowOpenHandlerResult (line 7) | interface DisableDefaultWindowOpenHandlerResult {
  type SetNativeThemeArgs (line 11) | interface SetNativeThemeArgs {
  type SetNativeThemeResult (line 15) | interface SetNativeThemeResult {

FILE: desktop-app/src/main/preload.ts
  method sendMessage (line 5) | sendMessage<T>(channel: Channels, args: T[]) {
  method on (line 8) | on<T>(channel: Channels, func: (...args: T[]) => void) {
  method once (line 14) | once<T>(channel: Channels, func: (...args: T[]) => void) {
  method invoke (line 17) | invoke<T, P>(channel: Channels, ...args: T[]): Promise<P> {
  method removeListener (line 20) | removeListener(channel: Channels, listener: (...args: any[]) => void) {
  method removeAllListeners (line 23) | removeAllListeners(channel: Channels) {
  method get (line 28) | get(val: any) {
  method set (line 31) | set(property: string, val: any) {

FILE: desktop-app/src/main/screenshot/index.ts
  type ScreenshotArgs (line 8) | interface ScreenshotArgs {
  type ScreenshotAllArgs (line 14) | interface ScreenshotAllArgs {
  type ScreenshotResult (line 22) | interface ScreenshotResult {

FILE: desktop-app/src/main/screenshot/webpage.ts
  class WebPage (line 1) | class WebPage {
    method constructor (line 4) | constructor(webview: Electron.WebContents) {
    method getPageHeight (line 8) | async getPageHeight() {
    method getViewportHeight (line 12) | async getViewportHeight() {
    method scrollTo (line 16) | async scrollTo(x: number, y: number) {

FILE: desktop-app/src/main/util.ts
  function resolveHtmlPath (line 8) | function resolveHtmlPath(htmlFileName: string) {
  function isValidCliArgURL (line 20) | function isValidCliArgURL(arg?: string): boolean {
  type EnvironmentInfo (line 58) | interface EnvironmentInfo {

FILE: desktop-app/src/main/web-permissions/PermissionsManager.ts
  type PermissionRequestArg (line 5) | interface PermissionRequestArg {
  type PermissionResponseArg (line 10) | interface PermissionResponseArg {
  constant PERMISSION_STATE (line 15) | const PERMISSION_STATE = {
  type PermissionState (line 22) | type PermissionState = (typeof PERMISSION_STATE)[keyof typeof PERMISSION...
  type PersistedPermission (line 24) | interface PersistedPermission {
  type PermissionRecords (line 32) | type PermissionRecords = Record<string, PermissionState>;
  type PermissionCallback (line 34) | type PermissionCallback = (permissionGranted: boolean) => void;
  class PermissionsManager (line 74) | class PermissionsManager {
    method constructor (line 81) | constructor(mainWindow: BrowserWindow) {
    method getPermissionState (line 110) | getPermissionState(origin: string, type: string): PermissionState {
    method setPermissionState (line 115) | setPermissionState(origin: string, type: string, state: PermissionStat...
    method requestPermission (line 133) | requestPermission(origin: string, type: string, callback: PermissionCa...
    method getSitePermissions (line 173) | getSitePermissions(origin: string) {
    method updateSitePermission (line 200) | updateSitePermission(origin: string, type: string, state: PermissionSt...
    method clearSitePermissions (line 219) | clearSitePermissions(origin: string) {

FILE: desktop-app/src/main/webview-context-menu/common.ts
  type ContextMenuMetadata (line 1) | interface ContextMenuMetadata {
  constant CONTEXT_MENUS (line 6) | const CONTEXT_MENUS: {[key: string]: ContextMenuMetadata} = {

FILE: desktop-app/src/main/webview-storage-manager/index.ts
  type DeleteStorageArgs (line 3) | interface DeleteStorageArgs {
  type DeleteStorageResult (line 8) | interface DeleteStorageResult {

FILE: desktop-app/src/renderer/components/Accordion/AccordionItem.tsx
  type AccordionItemProps (line 3) | type AccordionItemProps = {

FILE: desktop-app/src/renderer/components/Button/index.tsx
  type CustomProps (line 5) | interface CustomProps {

FILE: desktop-app/src/renderer/components/ButtonGroup/index.tsx
  type Props (line 4) | interface Props {

FILE: desktop-app/src/renderer/components/DeviceManager/DeviceDetailsModal.tsx
  type Props (line 9) | interface Props {

FILE: desktop-app/src/renderer/components/DeviceManager/DeviceLabel.tsx
  constant DND_TYPE (line 10) | const DND_TYPE = 'Device';
  type Props (line 12) | interface Props {
  method hover (line 54) | hover(draggedDevice: Device) {

FILE: desktop-app/src/renderer/components/DeviceManager/PreviewSuites/CreateSuiteButton/CreateSuiteModal.tsx
  type Props (line 11) | interface Props {

FILE: desktop-app/src/renderer/components/DeviceManager/PreviewSuites/Suite.tsx
  type Props (line 15) | interface Props {

FILE: desktop-app/src/renderer/components/DropDown/index.tsx
  type Separator (line 7) | interface Separator {
  type Option (line 11) | interface Option {
  type OptionOrSeparator (line 17) | type OptionOrSeparator = Option | Separator;
  type Props (line 19) | interface Props {
  function DropDown (line 25) | function DropDown({label, options, className}: Props) {

FILE: desktop-app/src/renderer/components/FileUploader/FileUploader.tsx
  type FileUploaderProps (line 4) | type FileUploaderProps = {

FILE: desktop-app/src/renderer/components/Input/index.tsx
  type Props (line 4) | interface Props {

FILE: desktop-app/src/renderer/components/KeyboardShortcutsManager/constants.ts
  constant SHORTCUT_CHANNEL (line 1) | const SHORTCUT_CHANNEL = {
  type ShortcutChannel (line 21) | type ShortcutChannel = (typeof SHORTCUT_CHANNEL)[keyof typeof SHORTCUT_C...
  constant SHORTCUT_KEYS (line 23) | const SHORTCUT_KEYS: {[key in ShortcutChannel]: string[]} = {

FILE: desktop-app/src/renderer/components/Modal/index.tsx
  type Props (line 4) | interface Props {

FILE: desktop-app/src/renderer/components/ModalLoader/index.tsx
  type Props (line 3) | interface Props {

FILE: desktop-app/src/renderer/components/Previewer/Device/ColorBlindnessTools/index.tsx
  type InjectedCss (line 17) | interface InjectedCss {
  type Props (line 24) | interface Props {

FILE: desktop-app/src/renderer/components/Previewer/Device/DesignOverlay/index.tsx
  type Props (line 8) | interface Props {

FILE: desktop-app/src/renderer/components/Previewer/Device/DesignOverlayControls/index.tsx
  type Props (line 16) | interface Props {

FILE: desktop-app/src/renderer/components/Previewer/Device/Toolbar.tsx
  type Props (line 14) | interface Props {

FILE: desktop-app/src/renderer/components/Previewer/Device/common.ts
  type ContextMenuMetadata (line 1) | interface ContextMenuMetadata {
  constant CONTEXT_MENUS (line 6) | const CONTEXT_MENUS: {[key: string]: ContextMenuMetadata} = {

FILE: desktop-app/src/renderer/components/Previewer/Device/index.tsx
  type Props (line 60) | interface Props {
  type ErrorState (line 66) | interface ErrorState {

FILE: desktop-app/src/renderer/components/Previewer/DevtoolsResizer/index.tsx
  type SizeValue (line 17) | type SizeValue = number | string;
  type DockConfig (line 19) | interface DockConfig {

FILE: desktop-app/src/renderer/components/Previewer/Guides/index.tsx
  type DefaultGuide (line 7) | type DefaultGuide = {
  type Props (line 13) | interface Props {

FILE: desktop-app/src/renderer/components/Previewer/IndividualLayoutToolBar/index.tsx
  type Props (line 11) | interface Props {

FILE: desktop-app/src/renderer/components/Previewer/index.tsx
  type MasonryProps (line 14) | interface MasonryProps {

FILE: desktop-app/src/renderer/components/Select/index.tsx
  type Props (line 3) | interface Props {

FILE: desktop-app/src/renderer/components/Spinner/index.tsx
  type Props (line 3) | interface Props {

FILE: desktop-app/src/renderer/components/Sponsorship/index.tsx
  constant CONTENT_COPY (line 9) | const CONTENT_COPY = [

FILE: desktop-app/src/renderer/components/Toggle/index.tsx
  type Props (line 1) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/AddressBar/AuthModal.tsx
  type Props (line 9) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/AddressBar/BookmarkButton.tsx
  type Props (line 14) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/AddressBar/SitePermissions/index.tsx
  constant PERMISSION_STATES (line 7) | const PERMISSION_STATES = {
  type SitePermissionsDropdownProps (line 14) | interface SitePermissionsDropdownProps {
  type PermissionToggleProps (line 20) | interface PermissionToggleProps {

FILE: desktop-app/src/renderer/components/ToolBar/AddressBar/SuggestionList.tsx
  type HistoryItem (line 4) | interface HistoryItem {
  type Props (line 10) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/AddressBar/index.tsx
  constant ADDRESS_BAR_EVENTS (line 19) | const ADDRESS_BAR_EVENTS = {

FILE: desktop-app/src/renderer/components/ToolBar/ColorBlindnessControls/index.tsx
  constant COLOR_BLINDNESS_CHANNEL (line 5) | const COLOR_BLINDNESS_CHANNEL = 'color-blindness';

FILE: desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Bookmark/ViewAllBookmarks/BookmarkFlyout.tsx
  type Props (line 7) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Bookmark/ViewAllBookmarks/BookmarkListButton.tsx
  type Props (line 7) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Bookmark/ViewAllBookmarks/index.tsx
  type Props (line 9) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Settings/SettingsContent.tsx
  type Props (line 6) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Settings/SettingsContentHeaders.tsx
  type ISettingsContentHeaders (line 3) | interface ISettingsContentHeaders {

FILE: desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Settings/index.tsx
  type Props (line 6) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Zoom.tsx
  type ZoomButtonProps (line 9) | interface ZoomButtonProps {

FILE: desktop-app/src/renderer/components/ToolBar/Menu/Flyout/index.tsx
  type Props (line 12) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/NavigationControls.tsx
  constant NAVIGATION_EVENTS (line 9) | const NAVIGATION_EVENTS = {
  type NavigationItemProps (line 15) | interface NavigationItemProps {
  constant ITEMS (line 31) | const ITEMS: NavigationItemProps[] = [

FILE: desktop-app/src/renderer/components/ToolBar/Shortcuts/ShortcutsModal/ShortcutButton.tsx
  type Props (line 1) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/Shortcuts/ShortcutsModal/ShortcutName.tsx
  type Props (line 1) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/Shortcuts/ShortcutsModal/index.tsx
  type Props (line 7) | interface Props {

FILE: desktop-app/src/renderer/components/ToolBar/index.tsx
  function handleInspectShortcut (line 40) | function handleInspectShortcut() {

FILE: desktop-app/src/renderer/components/VisionSimulationDropDown/index.tsx
  constant SIMULATIONS (line 36) | const SIMULATIONS = {
  constant RED_GREEN (line 52) | const RED_GREEN = [
  constant BLUE_YELLOW (line 58) | const BLUE_YELLOW = [SIMULATIONS.TRITANOPIA, SIMULATIONS.TRITANOMALY];
  constant FULL (line 59) | const FULL = [SIMULATIONS.ACHROMATOMALY, SIMULATIONS.ACHROMATOPSIA];
  constant VISUAL_IMPAIRMENTS (line 60) | const VISUAL_IMPAIRMENTS = [
  constant SUNLIGHT (line 66) | const SUNLIGHT = [SIMULATIONS.SOLARIZE];
  type Props (line 68) | interface Props {

FILE: desktop-app/src/renderer/components/useLocalStorage/useLocalStorage.tsx
  function useLocalStorage (line 3) | function useLocalStorage<T>(key: string, initialValue?: T) {

FILE: desktop-app/src/renderer/lib/pubsub/index.ts
  type HandlerResult (line 3) | interface HandlerResult {
  type Handler (line 8) | type Handler = ((...args: any) => void) | ((...args: any) => Promise<any>);
  class PubSub (line 10) | class PubSub {
    method constructor (line 13) | constructor() {

FILE: desktop-app/src/renderer/preload.d.ts
  type Window (line 4) | interface Window {

FILE: desktop-app/src/renderer/store/features/bookmarks/index.ts
  type IBookmarks (line 6) | interface IBookmarks {
  type BookmarksState (line 11) | interface BookmarksState {

FILE: desktop-app/src/renderer/store/features/design-overlay/index.ts
  type DesignOverlayPosition (line 4) | type DesignOverlayPosition = 'overlay' | 'side';
  type DesignOverlayState (line 6) | interface DesignOverlayState {
  type ViewResolution (line 14) | type ViewResolution = string;

FILE: desktop-app/src/renderer/store/features/device-manager/index.ts
  constant DEFAULT_DEVICES (line 8) | const DEFAULT_DEVICES: Device[] = activeDeviceIds.map((id) => getDevices...
  type PreviewSuite (line 10) | interface PreviewSuite {
  type PreviewSuites (line 16) | type PreviewSuites = PreviewSuite[];
  type DeviceManagerState (line 18) | interface DeviceManagerState {
  method setActiveSuite (line 54) | setActiveSuite(state, action: PayloadAction<string>) {
  method addSuite (line 57) | addSuite(state, action: PayloadAction<PreviewSuite>) {
  method addSuites (line 64) | addSuites(state, action: PayloadAction<PreviewSuite[]>) {
  method deleteSuite (line 82) | deleteSuite(state, action: PayloadAction<string>) {
  method deleteAllSuites (line 93) | deleteAllSuites(state) {

FILE: desktop-app/src/renderer/store/features/devtools/index.ts
  type DockPosition (line 7) | type DockPosition = (typeof DOCK_POSITION)[keyof typeof DOCK_POSITION];
  type DevtoolsState (line 9) | interface DevtoolsState {

FILE: desktop-app/src/renderer/store/features/renderer/index.ts
  type RendererState (line 6) | interface RendererState {

FILE: desktop-app/src/renderer/store/features/ruler/index.ts
  type Coordinates (line 4) | interface Coordinates {
  type RulersState (line 13) | type RulersState = {
  type ViewResolution (line 18) | type ViewResolution = string;

FILE: desktop-app/src/renderer/store/features/ui/index.ts
  constant APP_VIEWS (line 5) | const APP_VIEWS = {
  type AppView (line 10) | type AppView = (typeof APP_VIEWS)[keyof typeof APP_VIEWS];
  type UIState (line 12) | interface UIState {

FILE: desktop-app/src/renderer/store/index.ts
  type RootState (line 24) | type RootState = ReturnType<typeof store.getState>;
  type AppDispatch (line 26) | type AppDispatch = typeof store.dispatch;
Condensed preview — 492 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,604K chars).
[
  {
    "path": ".all-contributorsrc",
    "chars": 25297,
    "preview": "{\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"contributors\": [\n    {\n      \"login\": \"man"
  },
  {
    "path": ".gitattributes",
    "chars": 36,
    "preview": "/desktop-app-legacy/* export-ignore\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 692,
    "preview": "# These are supported funding model platforms\n\ngithub: responsively-org # Replace with up to 4 GitHub Sponsors-enabled u"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/01-bug-report.md",
    "chars": 789,
    "preview": "---\nname: \"\\U0001F41E Bug report\"\nabout: Report a bug in Responsively\n---\n\n<!-- 🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅\nHi there"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/02-feature-request.md",
    "chars": 428,
    "preview": "---\nname: \"\\U0001F680 Feature request\"\nabout: Suggest a feature for Responsively.\n---\n\n# 🚀 Feature Request\n\n### 📝 Descri"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 678,
    "preview": "# ✨ Pull Request\n\n### 📓 Referenced Issue\n\n<!-- Please link the related issue. Use # before the issue number and use the "
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 512,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/opencollective.yml",
    "chars": 25,
    "preview": "collective: responsively\n"
  },
  {
    "path": ".github/stale.yml",
    "chars": 688,
    "preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n# Number of days of inactivity before a "
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 2790,
    "preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 1317,
    "preview": "name: Publish\n\non:\n  workflow_dispatch:\n\njobs:\n  publish:\n    runs-on: ${{ matrix.os }}\n    defaults:\n      run:\n       "
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 851,
    "preview": "name: Test\n\non: [push, pull_request]\n\njobs:\n  test:\n    runs-on: ${{ matrix.os }}\n    defaults:\n      run:\n        worki"
  },
  {
    "path": ".gitignore",
    "chars": 16,
    "preview": ".DS_Store\n.idea\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2818,
    "preview": "\n## Contributing\n\nContributions are welcome and always appreciated!\n\nTo begin working on an issue, simply leave a commen"
  },
  {
    "path": "LICENSE",
    "chars": 34523,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "MAINTAINERS.md",
    "chars": 1045,
    "preview": "# Project Maintainer\n\n## How to become a maintainer\nThe following are the criteria to get considered becoming a maintain"
  },
  {
    "path": "README.md",
    "chars": 44657,
    "preview": "<div align=\"center\">\n  <img src=\"https://responsively.app/assets/img/logo.png\" alt=\"Responsively Logo\" width=\"150\">\n  <h"
  },
  {
    "path": "SECURITY.md",
    "chars": 512,
    "preview": "# Security Policy\n\n## Supported Versions\n\nBelow are the versions that are currently being supported with security update"
  },
  {
    "path": "browser-extension/.gitignore",
    "chars": 58,
    "preview": "node_modules\nyarn.lock\ndist\nsetCreds.sh\nweb-ext-artifacts\n"
  },
  {
    "path": "browser-extension/.vscode/settings.json",
    "chars": 89,
    "preview": "{\n  \"editor.formatOnSave\": true,\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n}\n"
  },
  {
    "path": "browser-extension/package.json",
    "chars": 1811,
    "preview": "{\n\t\"name\": \"Responsively-Helper\",\n\t\"version\": \"0.0.1\",\n\t\"description\": \"An extension to open current browser page in Res"
  },
  {
    "path": "browser-extension/public/manifest.json",
    "chars": 585,
    "preview": "{\n\t\"name\": \"Responsively Helper\",\n\t\"version\": \"0.0.2\",\n\t\"description\": \"An extension to open current browser page in Res"
  },
  {
    "path": "browser-extension/public/popup.html",
    "chars": 1340,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta\n      name=\"viewport\"\n      content=\"wi"
  },
  {
    "path": "browser-extension/src/background.js",
    "chars": 121,
    "preview": "browser.browserAction.onClicked.addListener((tab) => {\n  browser.tabs.executeScript({\n    file: './openURL.js'\n  });\n});"
  },
  {
    "path": "browser-extension/src/popup.js",
    "chars": 3699,
    "preview": "import openCustomProtocolURI from \"custom-protocol-check\";\nimport React, { useEffect, useState, useCallback } from \"reac"
  },
  {
    "path": "browser-extension/webpack.config.js",
    "chars": 2214,
    "preview": "const webpack = require('webpack');\nconst path = require('path');\nconst SizePlugin = require('size-plugin');\nconst CopyW"
  },
  {
    "path": "desktop-app/. prettierignore",
    "chars": 6,
    "preview": ".erb/*"
  },
  {
    "path": "desktop-app/.editorconfig",
    "chars": 188,
    "preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ni"
  },
  {
    "path": "desktop-app/.erb/configs/.eslintrc",
    "chars": 114,
    "preview": "{\n  \"rules\": {\n    \"no-console\": \"off\",\n    \"global-require\": \"off\",\n    \"import/no-dynamic-require\": \"off\"\n  }\n}\n"
  },
  {
    "path": "desktop-app/.erb/configs/webpack.config.base.ts",
    "chars": 1418,
    "preview": "/**\n * Base webpack config used across other specific configs\n */\n\nimport webpack from 'webpack';\nimport TsconfigPathsPl"
  },
  {
    "path": "desktop-app/.erb/configs/webpack.config.eslint.ts",
    "chars": 135,
    "preview": "/* eslint import/no-unresolved: off, import/no-self-import: off */\n\nmodule.exports = require('./webpack.config.renderer."
  },
  {
    "path": "desktop-app/.erb/configs/webpack.config.main.prod.ts",
    "chars": 2227,
    "preview": "/**\n * Webpack config for production electron main process\n */\n\nimport path from 'path';\nimport webpack from 'webpack';\n"
  },
  {
    "path": "desktop-app/.erb/configs/webpack.config.preload-webview.dev.ts",
    "chars": 1962,
    "preview": "import path from 'path';\nimport webpack from 'webpack';\nimport { merge } from 'webpack-merge';\nimport { BundleAnalyzerPl"
  },
  {
    "path": "desktop-app/.erb/configs/webpack.config.preload.dev.ts",
    "chars": 1946,
    "preview": "import path from 'path';\nimport webpack from 'webpack';\nimport { merge } from 'webpack-merge';\nimport { BundleAnalyzerPl"
  },
  {
    "path": "desktop-app/.erb/configs/webpack.config.renderer.dev.dll.ts",
    "chars": 1720,
    "preview": "/**\n * Builds the DLL for development electron renderer process\n */\n\nimport webpack from 'webpack';\nimport path from 'pa"
  },
  {
    "path": "desktop-app/.erb/configs/webpack.config.renderer.dev.ts",
    "chars": 6560,
    "preview": "import 'webpack-dev-server';\nimport path from 'path';\nimport fs from 'fs';\nimport webpack from 'webpack';\nimport HtmlWeb"
  },
  {
    "path": "desktop-app/.erb/configs/webpack.config.renderer.prod.ts",
    "chars": 4236,
    "preview": "/**\n * Build config for electron renderer process\n */\n\nimport path from 'path';\nimport webpack from 'webpack';\nimport Ht"
  },
  {
    "path": "desktop-app/.erb/configs/webpack.paths.ts",
    "chars": 1006,
    "preview": "const path = require('path');\n\nconst rootPath = path.join(__dirname, '../..');\n\nconst dllPath = path.join(__dirname, '.."
  },
  {
    "path": "desktop-app/.erb/mocks/fileMock.js",
    "chars": 33,
    "preview": "export default 'test-file-stub';\n"
  },
  {
    "path": "desktop-app/.erb/scripts/.eslintrc",
    "chars": 162,
    "preview": "{\n  \"rules\": {\n    \"no-console\": \"off\",\n    \"global-require\": \"off\",\n    \"import/no-dynamic-require\": \"off\",\n    \"import"
  },
  {
    "path": "desktop-app/.erb/scripts/check-build-exists.ts",
    "chars": 703,
    "preview": "// Check if the renderer and main bundles are built\nimport path from 'path';\nimport chalk from 'chalk';\nimport fs from '"
  },
  {
    "path": "desktop-app/.erb/scripts/check-native-dep.js",
    "chars": 2021,
    "preview": "import fs from 'fs';\nimport chalk from 'chalk';\nimport {execSync} from 'child_process';\nimport {dependencies} from '../."
  },
  {
    "path": "desktop-app/.erb/scripts/check-node-env.js",
    "chars": 379,
    "preview": "import chalk from 'chalk';\n\nexport default function checkNodeEnv(expectedEnv) {\n  if (!expectedEnv) {\n    throw new Erro"
  },
  {
    "path": "desktop-app/.erb/scripts/check-port-in-use.js",
    "chars": 412,
    "preview": "import chalk from 'chalk';\nimport detectPort from 'detect-port';\n\nconst port = process.env.PORT || '1212';\n\ndetectPort(p"
  },
  {
    "path": "desktop-app/.erb/scripts/clean.js",
    "chars": 244,
    "preview": "import rimraf from 'rimraf';\nimport webpackPaths from '../configs/webpack.paths';\n\nconst foldersToRemove = [webpackPaths"
  },
  {
    "path": "desktop-app/.erb/scripts/delete-source-maps.js",
    "chars": 289,
    "preview": "import path from 'path';\nimport rimraf from 'rimraf';\nimport webpackPaths from '../configs/webpack.paths';\n\nexport defau"
  },
  {
    "path": "desktop-app/.erb/scripts/electron-rebuild.js",
    "chars": 592,
    "preview": "import {execSync} from 'child_process';\nimport fs from 'fs';\nimport {dependencies} from '../../release/app/package.json'"
  },
  {
    "path": "desktop-app/.erb/scripts/link-modules.ts",
    "chars": 313,
    "preview": "import fs from 'fs';\nimport webpackPaths from '../configs/webpack.paths';\n\nconst {srcNodeModulesPath} = webpackPaths;\nco"
  },
  {
    "path": "desktop-app/.erb/scripts/notarize.js",
    "chars": 866,
    "preview": "const {notarize} = require('@electron/notarize');\n\nexports.default = async function notarizeMacos(context) {\n  const {el"
  },
  {
    "path": "desktop-app/.eslintignore",
    "chars": 486,
    "preview": "# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Coverage directory used by tools like istanbul\ncoverage\n.eslintca"
  },
  {
    "path": "desktop-app/.eslintrc.js",
    "chars": 1744,
    "preview": "module.exports = {\n  env: {\n    browser: true,\n    node: true,\n    es2021: true,\n  },\n  parser: '@typescript-eslint/pars"
  },
  {
    "path": "desktop-app/.gitattributes",
    "chars": 188,
    "preview": "*       text    eol=lf\n*.exe   binary\n*.png   binary\n*.jpg   binary\n*.jpeg  binary\n*.ico   binary\n*.icns  binary\n*.eot  "
  },
  {
    "path": "desktop-app/.gitignore",
    "chars": 370,
    "preview": "# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Coverage directory used by tools like istanbul\ncoverage\n.eslintca"
  },
  {
    "path": "desktop-app/.husky/pre-commit",
    "chars": 58,
    "preview": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx lint-staged\n"
  },
  {
    "path": "desktop-app/.prettierrc",
    "chars": 329,
    "preview": "{\n  \"overrides\": [\n    {\n      \"files\": [\".prettierrc\", \".babelrc\", \".eslintrc\", \".stylelintrc\"],\n      \"options\": {\n   "
  },
  {
    "path": "desktop-app/.vscode/settings.json",
    "chars": 626,
    "preview": "{\n  \"files.associations\": {\n    \".eslintrc\": \"jsonc\",\n    \".prettierrc\": \"jsonc\",\n    \".eslintignore\": \"ignore\"\n  },\n  \n"
  },
  {
    "path": "desktop-app/CHANGELOG.md",
    "chars": 17604,
    "preview": "# 2.1.0\n\n- Migrate to `css-minifier-webpack-plugin`\n\n# 2.0.1\n\n## Fixes\n\n- Fix broken css linking in production build\n\n# "
  },
  {
    "path": "desktop-app/CODE_OF_CONDUCT.md",
    "chars": 3366,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "desktop-app/LICENSE",
    "chars": 1101,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015-present Electron React Boilerplate\n\nPermission is hereby granted, free of char"
  },
  {
    "path": "desktop-app/README.md",
    "chars": 15038,
    "preview": "<img src=\".erb/img/erb-banner.svg\" width=\"100%\" />\n\n<br>\n\n<p>\n  Electron React Boilerplate uses <a href=\"https://electro"
  },
  {
    "path": "desktop-app/assets/assets.d.ts",
    "chars": 587,
    "preview": "type Styles = Record<string, string>;\n\ndeclare module '*.svg' {\n  export const ReactComponent: React.FC<React.SVGProps<S"
  },
  {
    "path": "desktop-app/assets/entitlements.mac.plist",
    "chars": 333,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "desktop-app/declarations.d.ts",
    "chars": 56,
    "preview": "declare module '*.mp3';\ndeclare module 'electron-args';\n"
  },
  {
    "path": "desktop-app/package.json",
    "chars": 8404,
    "preview": "{\n  \"name\": \"Responsively-App\",\n  \"productName\": \"ResponsivelyApp\",\n  \"version\": \"1.18.0\",\n  \"description\": \"A developer"
  },
  {
    "path": "desktop-app/postcss.config.js",
    "chars": 158,
    "preview": "/* eslint global-require: off, import/no-extraneous-dependencies: off */\n\nmodule.exports = {\n  plugins: [require('tailwi"
  },
  {
    "path": "desktop-app/postinstall.ts",
    "chars": 803,
    "preview": "import {replaceInFile} from 'replace-in-file';\n\nasync function performReplacements() {\n  const replaceOptions = {\n    fi"
  },
  {
    "path": "desktop-app/release/app/package.json",
    "chars": 600,
    "preview": "{\n  \"name\": \"ResponsivelyApp\",\n  \"version\": \"1.18.0\",\n  \"description\": \"A developer-friendly browser for developing resp"
  },
  {
    "path": "desktop-app/setupTests.ts",
    "chars": 586,
    "preview": "import '@testing-library/jest-dom/vitest';\n\nwindow.electron = {\n  ipcRenderer: {\n    sendMessage: vi.fn(),\n    on: vi.fn"
  },
  {
    "path": "desktop-app/src/__tests__/App.test.tsx",
    "chars": 228,
    "preview": "// import { render } from '@testing-library/react';\n// import App from '../renderer/AppContent';\n\ndescribe('App', () => "
  },
  {
    "path": "desktop-app/src/common/constants.ts",
    "chars": 1747,
    "preview": "/* eslint-disable  import/prefer-default-export */\n\nexport const DOCK_POSITION = {\n  BOTTOM: 'BOTTOM',\n  RIGHT: 'RIGHT',"
  },
  {
    "path": "desktop-app/src/common/deviceList.ts",
    "chars": 44423,
    "preview": "export interface Device {\n  id: string;\n  height: number;\n  width: number;\n  name: string;\n  userAgent: string;\n  type: "
  },
  {
    "path": "desktop-app/src/common/webViewUtils.ts",
    "chars": 204,
    "preview": "export function updateWebViewHeightAndScale(\n  webView: HTMLElement | Electron.WebviewTag,\n  pageHeight: number\n) {\n  we"
  },
  {
    "path": "desktop-app/src/main/app-meta/index.ts",
    "chars": 959,
    "preview": "import {app, ipcMain, shell} from 'electron';\nimport path from 'path';\nimport {IPC_MAIN_CHANNELS} from '../../common/con"
  },
  {
    "path": "desktop-app/src/main/app-updater.ts",
    "chars": 1887,
    "preview": "import {autoUpdater} from 'electron-updater';\n\nexport interface AppUpdaterStatus {\n  status: string;\n  version?: string;"
  },
  {
    "path": "desktop-app/src/main/browser-sync.ts",
    "chars": 1903,
    "preview": "/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport BrowserSync, {BrowserSyncInstance} from 'browser-sync';\nim"
  },
  {
    "path": "desktop-app/src/main/cli.ts",
    "chars": 633,
    "preview": "import parseArgs from 'electron-args';\n\nlet binaryName = 'ResponsivelyApp';\n\nif (process.platform === 'darwin') {\n  bina"
  },
  {
    "path": "desktop-app/src/main/dev-entry.cjs",
    "chars": 271,
    "preview": "// Dev-mode bootstrap: registers tsx before loading the TypeScript entry point.\n// Node 24 (Electron 40) handles .ts nat"
  },
  {
    "path": "desktop-app/src/main/devtools/index.ts",
    "chars": 5964,
    "preview": "import {BrowserWindow, ipcMain, webContents, WebContentsView} from 'electron';\nimport {DOCK_POSITION} from '../../common"
  },
  {
    "path": "desktop-app/src/main/http-basic-auth/index.ts",
    "chars": 1328,
    "preview": "import {AuthInfo, app, BrowserWindow, ipcMain} from 'electron';\nimport {IPC_MAIN_CHANNELS} from '../../common/constants'"
  },
  {
    "path": "desktop-app/src/main/main.ts",
    "chars": 8385,
    "preview": "/* eslint global-require: off, no-console: off, promise/always-return: off */\n\n/**\n * This module executes inside of ele"
  },
  {
    "path": "desktop-app/src/main/menu/help.ts",
    "chars": 1931,
    "preview": "import {BrowserWindow, MenuItemConstructorOptions, ipcMain, shell} from 'electron';\n\nimport {EnvironmentInfo, getEnviron"
  },
  {
    "path": "desktop-app/src/main/menu/index.ts",
    "chars": 3963,
    "preview": "import {app, Menu, BrowserWindow, MenuItemConstructorOptions} from 'electron';\nimport {subMenuHelp} from './help';\nimpor"
  },
  {
    "path": "desktop-app/src/main/menu/view.ts",
    "chars": 1824,
    "preview": "import {BrowserWindow, MenuItemConstructorOptions} from 'electron';\n\nconst isMac = process.platform === 'darwin';\nconst "
  },
  {
    "path": "desktop-app/src/main/native-functions/index.ts",
    "chars": 1096,
    "preview": "import {clipboard, ipcMain, nativeTheme, webContents} from 'electron';\n\nexport interface DisableDefaultWindowOpenHandler"
  },
  {
    "path": "desktop-app/src/main/preload-webview.ts",
    "chars": 3398,
    "preview": "import {ipcRenderer} from 'electron';\n\nconst documentBodyInit = () => {\n  // Browser Sync\n  const bsScript = window.docu"
  },
  {
    "path": "desktop-app/src/main/preload.ts",
    "chars": 1546,
    "preview": "import {Channels} from 'common/constants';\nimport {contextBridge, ipcRenderer, IpcRendererEvent} from 'electron';\ncontex"
  },
  {
    "path": "desktop-app/src/main/protocol-handler/index.ts",
    "chars": 311,
    "preview": "import {BrowserWindow} from 'electron';\nimport {IPC_MAIN_CHANNELS} from '../../common/constants';\n\n// eslint-disable-nex"
  },
  {
    "path": "desktop-app/src/main/screenshot/index.ts",
    "chars": 2482,
    "preview": "/* eslint-disable promise/always-return */\nimport {Device} from 'common/deviceList';\nimport {ipcMain, shell, webContents"
  },
  {
    "path": "desktop-app/src/main/screenshot/webpage.ts",
    "chars": 480,
    "preview": "class WebPage {\n  webview: Electron.WebContents;\n\n  constructor(webview: Electron.WebContents) {\n    this.webview = webv"
  },
  {
    "path": "desktop-app/src/main/util.ts",
    "chars": 2379,
    "preview": "/* eslint import/prefer-default-export: off */\nimport {URL} from 'url';\nimport path from 'path';\nimport {app} from 'elec"
  },
  {
    "path": "desktop-app/src/main/web-permissions/PermissionsManager.ts",
    "chars": 7686,
    "preview": "import {BrowserWindow, ipcMain, session} from 'electron';\nimport {IPC_MAIN_CHANNELS} from '../../common/constants';\nimpo"
  },
  {
    "path": "desktop-app/src/main/web-permissions/index.ts",
    "chars": 2333,
    "preview": "import {BrowserWindow, session, ipcMain} from 'electron';\nimport PermissionsManager, {PERMISSION_STATE} from './Permissi"
  },
  {
    "path": "desktop-app/src/main/webview-context-menu/common.ts",
    "chars": 269,
    "preview": "interface ContextMenuMetadata {\n  id: string;\n  label: string;\n}\n\nexport const CONTEXT_MENUS: {[key: string]: ContextMen"
  },
  {
    "path": "desktop-app/src/main/webview-context-menu/register.ts",
    "chars": 1077,
    "preview": "import {BrowserWindow, ipcMain, Menu} from 'electron';\nimport {CONTEXT_MENUS} from './common';\n// import { webViewPubSub"
  },
  {
    "path": "desktop-app/src/main/webview-storage-manager/index.ts",
    "chars": 866,
    "preview": "import {ClearStorageDataOptions, ipcMain, webContents} from 'electron';\n\nexport interface DeleteStorageArgs {\n  webConte"
  },
  {
    "path": "desktop-app/src/renderer/App.css",
    "chars": 395,
    "preview": "/*\n * @NOTE: Prepend a `~` to css file paths that are in your node_modules\n *        See https://github.com/webpack-cont"
  },
  {
    "path": "desktop-app/src/renderer/AppContent.tsx",
    "chars": 1454,
    "preview": "import {Provider, useSelector} from 'react-redux';\n\nimport ToolBar from './components/ToolBar';\nimport Previewer from '."
  },
  {
    "path": "desktop-app/src/renderer/components/AboutDialog/index.tsx",
    "chars": 5973,
    "preview": "import {useEffect, useRef, useState} from 'react';\nimport {IPC_MAIN_CHANNELS} from 'common/constants';\nimport {AboutDial"
  },
  {
    "path": "desktop-app/src/renderer/components/Accordion/Accordion.tsx",
    "chars": 167,
    "preview": "export const Accordion = ({children}: {children: JSX.Element}) => {\n  return (\n    <div id=\"accordion-open\" data-accordi"
  },
  {
    "path": "desktop-app/src/renderer/components/Accordion/AccordionItem.tsx",
    "chars": 1620,
    "preview": "import {useState} from 'react';\n\ntype AccordionItemProps = {\n  title: string;\n  children: JSX.Element;\n};\n\nexport const "
  },
  {
    "path": "desktop-app/src/renderer/components/Accordion/index.tsx",
    "chars": 86,
    "preview": "export {Accordion} from './Accordion';\nexport {AccordionItem} from './AccordionItem';\n"
  },
  {
    "path": "desktop-app/src/renderer/components/Button/Button.test.tsx",
    "chars": 2977,
    "preview": "import {act, render, screen} from '@testing-library/react';\nimport Button from './index';\n\nvi.mock('@iconify/react', () "
  },
  {
    "path": "desktop-app/src/renderer/components/Button/index.tsx",
    "chars": 2487,
    "preview": "import React, {useEffect, useRef, useState} from 'react';\nimport cx from 'classnames';\nimport {Icon} from '@iconify/reac"
  },
  {
    "path": "desktop-app/src/renderer/components/ButtonGroup/index.tsx",
    "chars": 1039,
    "preview": "import {ReactElement} from 'react';\nimport cx from 'classnames';\n\ninterface Props {\n  buttons: {\n    content: ReactEleme"
  },
  {
    "path": "desktop-app/src/renderer/components/ConfirmDialog/index.tsx",
    "chars": 1847,
    "preview": "import {useEffect, useState} from 'react';\nimport Button from '../Button';\nimport Modal from '../Modal';\n\nexport const C"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/DeviceDetailsModal.tsx",
    "chars": 7191,
    "preview": "import {Device} from 'common/deviceList';\nimport {v4 as uuidv4} from 'uuid';\nimport {useEffect, useState} from 'react';\n"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/DeviceLabel.tsx",
    "chars": 3471,
    "preview": "import {Icon} from '@iconify/react';\nimport cx from 'classnames';\nimport {useDrag, useDrop} from 'react-dnd';\nimport {us"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/CreateSuiteButton/CreateSuiteModal.tsx",
    "chars": 1663,
    "preview": "import {useEffect, useState} from 'react';\nimport {useDispatch} from 'react-redux';\nimport {v4 as uuidv4} from 'uuid';\n\n"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/CreateSuiteButton/index.tsx",
    "chars": 734,
    "preview": "import {Icon} from '@iconify/react';\nimport {useState} from 'react';\nimport Button from 'renderer/components/Button';\nim"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/ManageSuitesTool/ManageSuitesTool.test.tsx",
    "chars": 4808,
    "preview": "import {render, screen, fireEvent, waitFor} from '@testing-library/react';\nimport {Device} from 'common/deviceList';\nimp"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/ManageSuitesTool/ManageSuitesTool.tsx",
    "chars": 3393,
    "preview": "import {Icon} from '@iconify/react';\nimport Button from 'renderer/components/Button';\nimport {useState} from 'react';\nim"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/ManageSuitesTool/ManageSuitesToolError.test.tsx",
    "chars": 734,
    "preview": "import {render, screen, fireEvent} from '@testing-library/react';\nimport {ManageSuitesToolError} from './ManageSuitesToo"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/ManageSuitesTool/ManageSuitesToolError.tsx",
    "chars": 550,
    "preview": "import Button from 'renderer/components/Button';\n\nexport const ManageSuitesToolError = ({onClose}: {onClose: () => void}"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/ManageSuitesTool/helpers.test.tsx",
    "chars": 3636,
    "preview": "import {Device} from 'common/deviceList';\nimport {fireEvent, render} from '@testing-library/react';\nimport Button from '"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/ManageSuitesTool/helpers.ts",
    "chars": 1105,
    "preview": "import {defaultDevices, Device} from 'common/deviceList';\n\nexport const downloadFile = <T extends Record<string, unknown"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/ManageSuitesTool/test.json",
    "chars": 1020,
    "preview": "{\n    \"customDevices\": [\n        {\n            \"id\": \"123\",\n            \"name\": \"a new test\",\n            \"width\": 400,\n"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/ManageSuitesTool/utils.test.ts",
    "chars": 796,
    "preview": "import {transformFile} from './utils';\n\ndescribe('transformFile', () => {\n  it('should parse JSON content of the file', "
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/ManageSuitesTool/utils.ts",
    "chars": 461,
    "preview": "export const transformFile = (file: File): Promise<{[key: string]: any}> => {\n  return new Promise((resolve, reject) => "
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/Suite.tsx",
    "chars": 2351,
    "preview": "import {Icon} from '@iconify/react';\nimport cx from 'classnames';\nimport {Device, getDevicesMap} from 'common/deviceList"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/PreviewSuites/index.tsx",
    "chars": 1037,
    "preview": "import {Icon} from '@iconify/react';\nimport {useSelector} from 'react-redux';\nimport Button from 'renderer/components/Bu"
  },
  {
    "path": "desktop-app/src/renderer/components/DeviceManager/index.tsx",
    "chars": 7921,
    "preview": "import {useEffect, useState} from 'react';\nimport {Icon} from '@iconify/react';\nimport {useDispatch, useSelector} from '"
  },
  {
    "path": "desktop-app/src/renderer/components/Divider/index.tsx",
    "chars": 98,
    "preview": "export const Divider = () => <div className=\"my-1 w-full border-t border-gray-400 opacity-30\" />;\n"
  },
  {
    "path": "desktop-app/src/renderer/components/DropDown/index.tsx",
    "chars": 3388,
    "preview": "import {Menu, Transition} from '@headlessui/react';\nimport {Float} from '@headlessui-float/react';\nimport {Icon} from '@"
  },
  {
    "path": "desktop-app/src/renderer/components/FileUploader/FileUploader.test.tsx",
    "chars": 2668,
    "preview": "import {render, fireEvent} from '@testing-library/react';\nimport {type Mock} from 'vitest';\nimport {FileUploader, FileUp"
  },
  {
    "path": "desktop-app/src/renderer/components/FileUploader/FileUploader.tsx",
    "chars": 2742,
    "preview": "import {useEffect, useRef, useState} from 'react';\nimport {useFileUpload} from './hooks';\n\nexport type FileUploaderProps"
  },
  {
    "path": "desktop-app/src/renderer/components/FileUploader/hooks/index.ts",
    "chars": 47,
    "preview": "export {useFileUpload} from './useFileUpload';\n"
  },
  {
    "path": "desktop-app/src/renderer/components/FileUploader/hooks/useFileUpload.test.tsx",
    "chars": 1391,
    "preview": "import {act, renderHook} from '@testing-library/react';\nimport {useFileUpload} from './useFileUpload';\n\ndescribe('useFil"
  },
  {
    "path": "desktop-app/src/renderer/components/FileUploader/hooks/useFileUpload.tsx",
    "chars": 484,
    "preview": "import {useState} from 'react';\n\nexport const useFileUpload = () => {\n  const [uploadedFile, setUploadedFile] = useState"
  },
  {
    "path": "desktop-app/src/renderer/components/FileUploader/index.ts",
    "chars": 84,
    "preview": "export {FileUploader} from './FileUploader';\nexport {useFileUpload} from './hooks';\n"
  },
  {
    "path": "desktop-app/src/renderer/components/InfoPopups/index.tsx",
    "chars": 670,
    "preview": "import {useEffect, useState} from 'react';\nimport {isReleaseNotesUnseen, ReleaseNotes} from '../ReleaseNotes';\nimport {S"
  },
  {
    "path": "desktop-app/src/renderer/components/Input/index.tsx",
    "chars": 763,
    "preview": "import {useId} from 'react';\nimport cx from 'classnames';\n\ninterface Props {\n  label: string;\n}\n\nconst Input = ({\n  labe"
  },
  {
    "path": "desktop-app/src/renderer/components/KeyboardShortcutsManager/constants.ts",
    "chars": 1512,
    "preview": "export const SHORTCUT_CHANNEL = {\n  BACK: 'BACK',\n  BOOKMARK: 'BOOKMARK',\n  DELETE_ALL: 'DELETE_ALL',\n  DELETE_CACHE: 'D"
  },
  {
    "path": "desktop-app/src/renderer/components/KeyboardShortcutsManager/index.tsx",
    "chars": 458,
    "preview": "import {SHORTCUT_KEYS, ShortcutChannel} from './constants';\nimport useMousetrapEmitter from './useMousetrapEmitter';\n\nco"
  },
  {
    "path": "desktop-app/src/renderer/components/KeyboardShortcutsManager/useKeyboardShortcut.ts",
    "chars": 521,
    "preview": "import {useEffect} from 'react';\nimport {ShortcutChannel} from './constants';\nimport {keyboardShortcutsPubsub} from './u"
  },
  {
    "path": "desktop-app/src/renderer/components/KeyboardShortcutsManager/useMousetrapEmitter.ts",
    "chars": 869,
    "preview": "import {useEffect} from 'react';\nimport Mousetrap from 'mousetrap';\nimport PubSub from 'renderer/lib/pubsub';\nimport {Sh"
  },
  {
    "path": "desktop-app/src/renderer/components/Modal/index.tsx",
    "chars": 1967,
    "preview": "import {Dialog, Transition} from '@headlessui/react';\nimport {Fragment} from 'react';\n\ninterface Props {\n  isOpen: boole"
  },
  {
    "path": "desktop-app/src/renderer/components/ModalLoader/index.tsx",
    "chars": 402,
    "preview": "import Modal from '../Modal';\n\ninterface Props {\n  isOpen: boolean;\n  onClose: () => void;\n  title: JSX.Element | string"
  },
  {
    "path": "desktop-app/src/renderer/components/Notifications/Notification.tsx",
    "chars": 797,
    "preview": "import {IPC_MAIN_CHANNELS, Notification as NotificationType} from 'common/constants';\nimport Button from '../Button';\n\nc"
  },
  {
    "path": "desktop-app/src/renderer/components/Notifications/NotificationEmptyStatus.tsx",
    "chars": 210,
    "preview": "const NotificationEmptyStatus = () => {\n  return (\n    <div className=\"mb-2\">\n      <p>You are all caught up! No new not"
  },
  {
    "path": "desktop-app/src/renderer/components/Notifications/Notifications.tsx",
    "chars": 1055,
    "preview": "import {useSelector} from 'react-redux';\nimport {selectNotifications} from 'renderer/store/features/renderer';\nimport {v"
  },
  {
    "path": "desktop-app/src/renderer/components/Notifications/NotificationsBubble.tsx",
    "chars": 353,
    "preview": "const NotificationsBubble = () => {\n  return (\n    <span className=\"absolute right-0 top-0 flex h-2 w-2\">\n      <span cl"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Device/ColorBlindnessTools/index.tsx",
    "chars": 10236,
    "preview": "import {Icon} from '@iconify/react';\nimport cx from 'classnames';\nimport {useCallback, useEffect, useState} from 'react'"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Device/DesignOverlay/index.test.tsx",
    "chars": 11057,
    "preview": "import {render, screen, fireEvent} from '@testing-library/react';\nimport {Provider} from 'react-redux';\nimport {configur"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Device/DesignOverlay/index.tsx",
    "chars": 9288,
    "preview": "import {useEffect, useRef, useState, useCallback} from 'react';\nimport {useSelector} from 'react-redux';\nimport type {Ro"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Device/DesignOverlayControls/index.test.tsx",
    "chars": 6086,
    "preview": "import {render, screen, fireEvent, waitFor} from '@testing-library/react';\nimport {Provider} from 'react-redux';\nimport "
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Device/DesignOverlayControls/index.tsx",
    "chars": 6031,
    "preview": "import {Icon} from '@iconify/react';\nimport type {Device} from 'common/deviceList';\nimport {useEffect, useState} from 'r"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Device/Toolbar.tsx",
    "chars": 6825,
    "preview": "import {Icon} from '@iconify/react';\nimport {useState} from 'react';\nimport Button from 'renderer/components/Button';\nim"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Device/assets.ts",
    "chars": 214681,
    "preview": "export const grid = (size: number) =>\n  `body:after{background-image:linear-gradient(to right,rgb(203 213 225) 1px,trans"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Device/common.ts",
    "chars": 269,
    "preview": "interface ContextMenuMetadata {\n  id: string;\n  label: string;\n}\n\nexport const CONTEXT_MENUS: {[key: string]: ContextMen"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Device/index.tsx",
    "chars": 21365,
    "preview": "import cx from 'classnames';\nimport {PREVIEW_LAYOUTS} from 'common/constants';\nimport {Device as IDevice} from 'common/d"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Device/utils.ts",
    "chars": 509,
    "preview": "import {HistoryItem} from 'renderer/components/ToolBar/AddressBar/SuggestionList';\n\n// eslint-disable-next-line import/p"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/DevtoolsResizer/index.tsx",
    "chars": 5259,
    "preview": "import {Icon} from '@iconify/react';\nimport {DOCK_POSITION} from 'common/constants';\nimport {OpenDevtoolsArgs, OpenDevto"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Guides/guide.css",
    "chars": 450,
    "preview": ".box {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 30px;\n  height: 30px;\n  box-sizing: border-box;\n  background:"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/Guides/index.tsx",
    "chars": 5988,
    "preview": "import * as React from 'react';\nimport Guides from '@scena/react-guides';\nimport {LegacyRef, useEffect, useRef, useMemo}"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/IndividualLayoutToolBar/index.tsx",
    "chars": 2365,
    "preview": "import {useEffect, useState} from 'react';\nimport {useDispatch} from 'react-redux';\nimport {Tab, Tabs, TabList} from 're"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/IndividualLayoutToolBar/styles.css",
    "chars": 720,
    "preview": ".custom-scrollbar::-webkit-scrollbar,\n.custom-scrollbar::-webkit-scrollbar:hover,\n.dark .custom-scrollbar::-webkit-scrol"
  },
  {
    "path": "desktop-app/src/renderer/components/Previewer/index.tsx",
    "chars": 3952,
    "preview": "import {useSelector} from 'react-redux';\nimport cx from 'classnames';\nimport {selectActiveSuite} from 'renderer/store/fe"
  },
  {
    "path": "desktop-app/src/renderer/components/ReleaseNotes/index.tsx",
    "chars": 4886,
    "preview": "import {IPC_MAIN_CHANNELS} from 'common/constants';\nimport cx from 'classnames';\nimport {AppMetaResponse} from 'main/app"
  },
  {
    "path": "desktop-app/src/renderer/components/Select/index.tsx",
    "chars": 625,
    "preview": "import {useId} from 'react';\n\ninterface Props {\n  label: string;\n}\n\nconst Select = ({\n  label,\n  ...props\n}: Props &\n  R"
  },
  {
    "path": "desktop-app/src/renderer/components/Spinner/index.tsx",
    "chars": 293,
    "preview": "import {Icon} from '@iconify/react';\n\ninterface Props {\n  spinnerHeight?: number;\n}\n\nconst Spinner = ({spinnerHeight = u"
  },
  {
    "path": "desktop-app/src/renderer/components/Sponsorship/index.tsx",
    "chars": 4028,
    "preview": "import {useEffect, useMemo, useState} from 'react';\n\nimport {IPC_MAIN_CHANNELS} from 'common/constants';\n\nimport Modal f"
  },
  {
    "path": "desktop-app/src/renderer/components/Toggle/index.tsx",
    "chars": 869,
    "preview": "interface Props {\n  isOn: boolean;\n  onChange?: React.ChangeEventHandler<HTMLInputElement>;\n}\n\nconst Toggle = ({isOn, on"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/AddressBar/AuthModal.tsx",
    "chars": 1963,
    "preview": "import {IPC_MAIN_CHANNELS} from 'common/constants';\nimport {AuthInfo} from 'electron';\nimport {AuthResponseArgs} from 'm"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/AddressBar/BookmarkButton.tsx",
    "chars": 2213,
    "preview": "import {Icon} from '@iconify/react';\nimport {useState, useMemo} from 'react';\nimport {useDetectClickOutside} from 'react"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/AddressBar/SitePermissions/index.tsx",
    "chars": 10738,
    "preview": "import {Icon} from '@iconify/react';\nimport {useState, useEffect, useRef} from 'react';\nimport {IPC_MAIN_CHANNELS, SiteP"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/AddressBar/SuggestionList.tsx",
    "chars": 2672,
    "preview": "import {useCallback, useEffect, useMemo, useState} from 'react';\nimport cx from 'classnames';\n\nexport interface HistoryI"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/AddressBar/index.tsx",
    "chars": 11253,
    "preview": "import {Icon} from '@iconify/react';\nimport cx from 'classnames';\nimport {IPC_MAIN_CHANNELS, OpenUrlArgs} from 'common/c"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/ColorBlindnessControls/index.tsx",
    "chars": 593,
    "preview": "import {useEffect, useState} from 'react';\nimport {VisionSimulationDropDown} from 'renderer/components/VisionSimulationD"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/ColorSchemeToggle/index.tsx",
    "chars": 993,
    "preview": "import {Icon} from '@iconify/react';\nimport {SetNativeThemeArgs, SetNativeThemeResult} from 'main/native-functions';\nimp"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/AllowInSecureSSL/index.tsx",
    "chars": 828,
    "preview": "import {useState} from 'react';\nimport Toggle from 'renderer/components/Toggle';\n\nconst AllowInSecureSSL = () => {\n  con"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Bookmark/ViewAllBookmarks/BookmarkFlyout.tsx",
    "chars": 2322,
    "preview": "import {useEffect, useState} from 'react';\nimport {useDispatch} from 'react-redux';\nimport Button from 'renderer/compone"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Bookmark/ViewAllBookmarks/BookmarkListButton.tsx",
    "chars": 1430,
    "preview": "import cx from 'classnames';\nimport Button from 'renderer/components/Button';\nimport {IBookmarks} from 'renderer/store/f"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Bookmark/ViewAllBookmarks/index.tsx",
    "chars": 1931,
    "preview": "import {useDispatch} from 'react-redux';\nimport Button from 'renderer/components/Button';\nimport {IBookmarks} from 'rend"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Bookmark/index.tsx",
    "chars": 1515,
    "preview": "import {Icon} from '@iconify/react';\nimport {useEffect, useState} from 'react';\nimport Button from 'renderer/components/"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/ClearHistory/index.tsx",
    "chars": 590,
    "preview": "import {Icon} from '@iconify/react';\nimport Button from 'renderer/components/Button';\n\nconst ClearHistory = () => {\n  re"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Devtools/index.tsx",
    "chars": 959,
    "preview": "import {DOCK_POSITION} from 'common/constants';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {selectDock"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/PreviewLayout/index.tsx",
    "chars": 2551,
    "preview": "import {Icon} from '@iconify/react';\nimport {PREVIEW_LAYOUTS, PreviewLayout} from 'common/constants';\nimport {useDispatc"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Settings/SettingsContent.test.tsx",
    "chars": 1182,
    "preview": "import * as React from 'react';\n\nimport {render, fireEvent} from '@testing-library/react';\n\nimport {SettingsContent} fro"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Settings/SettingsContent.tsx",
    "chars": 2324,
    "preview": "import {useId, useState} from 'react';\n\nimport Button from 'renderer/components/Button';\nimport {SettingsContentHeaders}"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Settings/SettingsContentHeaders.tsx",
    "chars": 1216,
    "preview": "import {FC, useId} from 'react';\n\ninterface ISettingsContentHeaders {\n  acceptLanguage: string;\n  setAcceptLanguage: (ar"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Settings/index.tsx",
    "chars": 776,
    "preview": "import {useState} from 'react';\nimport Button from 'renderer/components/Button';\nimport Modal from 'renderer/components/"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/UITheme/index.tsx",
    "chars": 965,
    "preview": "import {Icon} from '@iconify/react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport Button from 'renderer/"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Zoom.tsx",
    "chars": 1454,
    "preview": "import {useCallback} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport Button from 'renderer/co"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/Flyout/index.tsx",
    "chars": 1136,
    "preview": "import Notifications from 'renderer/components/Notifications/Notifications';\nimport {Divider} from 'renderer/components/"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Menu/index.tsx",
    "chars": 1731,
    "preview": "import {Icon} from '@iconify/react';\nimport {useDetectClickOutside} from 'react-detect-click-outside';\nimport Button fro"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/NavigationControls.tsx",
    "chars": 1559,
    "preview": "import {Icon} from '@iconify/react';\nimport {webViewPubSub} from 'renderer/lib/pubsub';\nimport Button from '../Button';\n"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/PreviewSuiteSelector/index.tsx",
    "chars": 1378,
    "preview": "import {Icon} from '@iconify/react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {DropDown} from 'rende"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Shortcuts/ShortcutsModal/ShortcutButton.tsx",
    "chars": 883,
    "preview": "interface Props {\n  text: string[];\n}\n\nconst ShortcutButton = ({text}: Props) => {\n  const btnText = text[0].split('+');"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Shortcuts/ShortcutsModal/ShortcutName.tsx",
    "chars": 234,
    "preview": "interface Props {\n  text: string;\n}\n\nconst ShortcutName = ({text}: Props) => {\n  const formattedText = text.replace('_',"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Shortcuts/ShortcutsModal/index.tsx",
    "chars": 1526,
    "preview": "import {SHORTCUT_KEYS} from 'renderer/components/KeyboardShortcutsManager/constants';\nimport Modal from 'renderer/compon"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/Shortcuts/index.tsx",
    "chars": 617,
    "preview": "import {Icon} from '@iconify/react';\nimport {useState} from 'react';\nimport Button from 'renderer/components/Button';\nim"
  },
  {
    "path": "desktop-app/src/renderer/components/ToolBar/index.tsx",
    "chars": 4758,
    "preview": "import {useDispatch, useSelector} from 'react-redux';\nimport {\n  selectIsCapturingScreenshot,\n  selectIsInspecting,\n  se"
  },
  {
    "path": "desktop-app/src/renderer/components/VisionSimulationDropDown/index.tsx",
    "chars": 4594,
    "preview": "import cx from 'classnames';\nimport {Icon} from '@iconify/react';\nimport {DropDown} from '../DropDown';\n\nconst MenuItemL"
  },
  {
    "path": "desktop-app/src/renderer/components/useLocalStorage/useLocalStorage.tsx",
    "chars": 1320,
    "preview": "import {useState, useEffect} from 'react';\n\nfunction useLocalStorage<T>(key: string, initialValue?: T) {\n  const [stored"
  },
  {
    "path": "desktop-app/src/renderer/context/ThemeProvider/index.tsx",
    "chars": 778,
    "preview": "import React, {useEffect} from 'react';\nimport {useSelector} from 'react-redux';\nimport {selectDarkMode} from 'renderer/"
  },
  {
    "path": "desktop-app/src/renderer/index.ejs",
    "chars": 270,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta\n      http-equiv=\"Content-Security-Policy\"\n      "
  },
  {
    "path": "desktop-app/src/renderer/index.tsx",
    "chars": 516,
    "preview": "import {IPC_MAIN_CHANNELS} from 'common/constants';\nimport {createRoot} from 'react-dom/client';\nimport App from './AppC"
  },
  {
    "path": "desktop-app/src/renderer/lib/pubsub/index.test.ts",
    "chars": 1501,
    "preview": "import Bluebird from 'bluebird';\nimport PubSub from '.';\n\ndescribe('PubSub', () => {\n  it('should invoke subscribed call"
  },
  {
    "path": "desktop-app/src/renderer/lib/pubsub/index.ts",
    "chars": 1149,
    "preview": "import Bluebird from 'bluebird';\n\ninterface HandlerResult {\n  result: any;\n  error: any;\n}\n\ntype Handler = ((...args: an"
  },
  {
    "path": "desktop-app/src/renderer/preload.d.ts",
    "chars": 805,
    "preview": "import type {Channels} from 'common/constants';\n\ndeclare global {\n  interface Window {\n    electron: {\n      ipcRenderer"
  }
]

// ... and 292 more files (download for full content)

About this extraction

This page contains the full source code of the responsively-org/responsively-app GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 492 files (1.4 MB), approximately 431.5k tokens, and a symbol index with 670 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!