mirror of
https://github.com/responsively-org/responsively-app
synced 2024-11-10 23:04:20 +00:00
Merge conflicts resolved
This commit is contained in:
commit
2d44817064
21 changed files with 1478 additions and 39 deletions
|
@ -68,6 +68,33 @@
|
|||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 7,
|
||||
|
|
19
README.md
19
README.md
|
@ -1,15 +1,17 @@
|
|||
# Responsively App ![Twitter Follow](https://img.shields.io/twitter/follow/ResponsivelyApp?style=social) [![xscode](https://img.shields.io/badge/Available%20on-xs%3Acode-blue?style=?style=plastic&logo=appveyor&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRF////////VXz1bAAAAAJ0Uk5T/wDltzBKAAAAlUlEQVR42uzXSwqAMAwE0Mn9L+3Ggtgkk35QwcnSJo9S+yGwM9DCooCbgn4YrJ4CIPUcQF7/XSBbx2TEz4sAZ2q1RAECBAiYBlCtvwN+KiYAlG7UDGj59MViT9hOwEqAhYCtAsUZvL6I6W8c2wcbd+LIWSCHSTeSAAECngN4xxIDSK9f4B9t377Wd7H5Nt7/Xz8eAgwAvesLRjYYPuUAAAAASUVORK5CYII=)](https://xscode.com/manojvivek/responsively-app)
|
||||
# Responsively App [![Twitter Follow](https://img.shields.io/twitter/follow/ResponsivelyApp?style=social)](https://twitter.com/ResponsivelyApp)
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||
[![All Contributors](https://img.shields.io/badge/all_contributors-7-orange.svg?style=flat-square)](#contributors-)
|
||||
[![All Contributors](https://img.shields.io/badge/all_contributors-10-orange.svg?style=flat-square)](#contributors-)
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||
[![Gitter chat](https://img.shields.io/gitter/room/badges/shields.svg)](https://gitter.im/responsively-app) [![xscode](https://img.shields.io/badge/Available%20on-xs%3Acode-blue?style=?style=plastic&logo=appveyor&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRF////////VXz1bAAAAAJ0Uk5T/wDltzBKAAAAlUlEQVR42uzXSwqAMAwE0Mn9L+3Ggtgkk35QwcnSJo9S+yGwM9DCooCbgn4YrJ4CIPUcQF7/XSBbx2TEz4sAZ2q1RAECBAiYBlCtvwN+KiYAlG7UDGj59MViT9hOwEqAhYCtAsUZvL6I6W8c2wcbd+LIWSCHSTeSAAECngN4xxIDSK9f4B9t377Wd7H5Nt7/Xz8eAgwAvesLRjYYPuUAAAAASUVORK5CYII=)](https://xscode.com/manojvivek/responsively-app)
|
||||
|
||||
[![PH](https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=200375&theme=light&period=daily)](https://www.producthunt.com/posts/responsively?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-responsively)
|
||||
|
||||
Website: https://github.com/manojVivek/responsively-app
|
||||
Website: https://responsively.app
|
||||
|
||||
|
||||
A modified browser built using [Electron](https://www.electronjs.org/) that helps in responsive web development.
|
||||
|
||||
![Quick Demo](https://manojvivek.github.io/responsively-app/assets/img/responsively-app.gif)
|
||||
![Quick Demo](https://responsively.app/assets/img/responsively-app.gif)
|
||||
|
||||
## Features
|
||||
1. Mirrored User-interactions across all devices.
|
||||
|
@ -19,7 +21,7 @@ A modified browser built using [Electron](https://www.electronjs.org/) that help
|
|||
5. One-click screenshot all your devices.
|
||||
6. Hot reloading supported for developers.
|
||||
|
||||
Please visit the website to know more about the application - https://manojvivek.github.io/responsively-app
|
||||
Please visit the website to know more about the application - https://responsively.app
|
||||
|
||||
|
||||
## Download
|
||||
|
@ -30,7 +32,7 @@ Alternatively, MacOS users can use brew to install it:
|
|||
brew cask install responsively
|
||||
```
|
||||
|
||||
Follow on Twitter for future updates - ![Twitter Follow](https://img.shields.io/twitter/follow/ResponsivelyApp?style=social)
|
||||
Follow on Twitter for future updates - [![Twitter Follow](https://img.shields.io/twitter/follow/ResponsivelyApp?style=social)](https://twitter.com/ResponsivelyApp)
|
||||
|
||||
## Issues
|
||||
If you face any problems while using the application, please open an issue here - https://github.com/manojVivek/responsively-app/issues
|
||||
|
@ -70,6 +72,11 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||
<td align="center"><a href="https://jjavierdguezas.github.io"><img src="https://avatars2.githubusercontent.com/u/13673443?v=4" width="100px;" alt=""/><br /><sub><b>José Javier Rodríguez Zas</b></sub></a><br /><a href="https://github.com/manojVivek/responsively-app/commits?author=jjavierdguezas" title="Code">💻</a> <a href="https://github.com/manojVivek/responsively-app/commits?author=jjavierdguezas" title="Tests">⚠️</a></td>
|
||||
<td align="center"><a href="https://github.com/romanakash"><img src="https://avatars1.githubusercontent.com/u/40427975?v=4" width="100px;" alt=""/><br /><sub><b>Roman Akash</b></sub></a><br /><a href="https://github.com/manojVivek/responsively-app/commits?author=romanakash" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/RomainFrancony"><img src="https://avatars3.githubusercontent.com/u/22396965?v=4" width="100px;" alt=""/><br /><sub><b>Romain Francony</b></sub></a><br /><a href="https://github.com/manojVivek/responsively-app/commits?author=RomainFrancony" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/AARYAN-MAHENDRA"><img src="https://avatars1.githubusercontent.com/u/64866670?v=4" width="100px;" alt=""/><br /><sub><b>AARYAN-MAHENDRA</b></sub></a><br /><a href="https://github.com/manojVivek/responsively-app/commits?author=AARYAN-MAHENDRA" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Nothing-Works"><img src="https://avatars3.githubusercontent.com/u/18606648?v=4" width="100px;" alt=""/><br /><sub><b>Andy</b></sub></a><br /><a href="https://github.com/manojVivek/responsively-app/commits?author=Nothing-Works" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-enable -->
|
||||
|
|
|
@ -2,10 +2,6 @@
|
|||
display: flex;
|
||||
position: relative;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.addressInput {
|
||||
font-size: 16px;
|
||||
height: 20px;
|
||||
width: 100%;
|
||||
padding: 14px 10px;
|
||||
|
@ -17,7 +13,19 @@
|
|||
transition: border 500ms ease-out;
|
||||
}
|
||||
|
||||
.addressInput:focus {
|
||||
.addressInput {
|
||||
height: 20px;
|
||||
background: unset;
|
||||
font-size: 16px;
|
||||
color: inherit;
|
||||
border: none;
|
||||
width: 92%;
|
||||
margin: 0;
|
||||
outline: none;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.addressBarContainer:focus-within {
|
||||
color: white;
|
||||
border: solid 1px #7587ec;
|
||||
}
|
||||
|
|
33
desktop-app/app/components/PrefersColorSchemeSwitch/index.js
Normal file
33
desktop-app/app/components/PrefersColorSchemeSwitch/index.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
import React, {useState, useEffect} from 'react';
|
||||
import {ipcRenderer} from 'electron';
|
||||
import Tooltip from '@material-ui/core/Tooltip';
|
||||
import {iconsColor} from '../../constants/colors';
|
||||
import LightColorScheme from '../icons/LightColorScheme';
|
||||
import DarkColorScheme from '../icons/DarkColorScheme';
|
||||
|
||||
export default function PrefersColorSchemeSwitch() {
|
||||
const [colorScheme, setColorScheme] = useState(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
|
||||
|
||||
const handleSwitch = () => {
|
||||
setColorScheme(colorScheme === 'dark' ? 'light' : 'dark');
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
ipcRenderer.send('prefers-color-scheme-select', colorScheme);
|
||||
});
|
||||
|
||||
|
||||
const iconProps = {
|
||||
color: iconsColor,
|
||||
height: 25,
|
||||
width: 25,
|
||||
};
|
||||
|
||||
return (
|
||||
<Tooltip title="Switch color scheme">
|
||||
<div onClick={handleSwitch}>
|
||||
{colorScheme === 'dark' ? <DarkColorScheme {...iconProps}/> : <LightColorScheme {...iconProps}/>}
|
||||
</div>
|
||||
</Tooltip>
|
||||
);
|
||||
}
|
|
@ -12,6 +12,7 @@ import styles from './styles.module.css';
|
|||
import commonStyles from '../common.styles.css';
|
||||
import {iconsColor} from '../../constants/colors';
|
||||
import ZoomContainer from '../../containers/ZoomContainer';
|
||||
import PrefersColorSchemeSwitch from '../PrefersColorSchemeSwitch';
|
||||
import Tooltip from '@material-ui/core/Tooltip';
|
||||
|
||||
const ScrollControls = ({
|
||||
|
@ -30,6 +31,9 @@ const ScrollControls = ({
|
|||
return (
|
||||
<div className={styles.scrollControls}>
|
||||
<Grid container spacing={1} alignItems="center">
|
||||
<Grid item className={cx(commonStyles.icons, commonStyles.enabled)}>
|
||||
<PrefersColorSchemeSwitch />
|
||||
</Grid>
|
||||
<Grid item className={cx(commonStyles.icons, commonStyles.enabled)}>
|
||||
<Tooltip title="Scroll Down">
|
||||
<div onClick={triggerScrollDown}>
|
||||
|
|
|
@ -143,8 +143,8 @@ class WebView extends Component {
|
|||
}
|
||||
);
|
||||
|
||||
const urlChangeHandler = ({url}) => {
|
||||
if (url === this.props.browser.address) {
|
||||
const urlChangeHandler = ({url, isMainFrame = true}) => {
|
||||
if (!isMainFrame || url === this.props.browser.address) {
|
||||
return;
|
||||
}
|
||||
this.props.onAddressChange(url);
|
||||
|
@ -358,7 +358,7 @@ class WebView extends Component {
|
|||
|
||||
initEventTriggers = webview => {
|
||||
this.getWebContentForId(webview.getWebContentsId()).executeJavaScript(`
|
||||
responsivelyApp.deviceId = ${this.props.device.id};
|
||||
responsivelyApp.deviceId = '${this.props.device.id}';
|
||||
document.body.addEventListener('mouseleave', () => {
|
||||
window.responsivelyApp.mouseOn = false;
|
||||
if (responsivelyApp.domInspectorEnabled) {
|
||||
|
@ -385,13 +385,13 @@ class WebView extends Component {
|
|||
});
|
||||
|
||||
document.addEventListener(
|
||||
'click',
|
||||
'click',
|
||||
(e) => {
|
||||
if (e.target === window.responsivelyApp.lastClickElement || e.responsivelyAppProcessed) {
|
||||
window.responsivelyApp.lastClickElement = null;
|
||||
e.responsivelyAppProcessed = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (window.responsivelyApp.domInspectorEnabled) {
|
||||
e.preventDefault();
|
||||
window.responsivelyApp.domInspector.disable();
|
||||
|
@ -408,7 +408,7 @@ class WebView extends Component {
|
|||
}
|
||||
e.responsivelyAppProcessed = true;
|
||||
window.responsivelyApp.sendMessageToHost(
|
||||
'${MESSAGE_TYPES.click}',
|
||||
'${MESSAGE_TYPES.click}',
|
||||
{
|
||||
cssPath: window.responsivelyApp.cssPath(e.target),
|
||||
}
|
||||
|
|
17
desktop-app/app/components/icons/DarkColorScheme.js
Normal file
17
desktop-app/app/components/icons/DarkColorScheme.js
Normal file
|
@ -0,0 +1,17 @@
|
|||
import React, {Fragment} from 'react';
|
||||
|
||||
export default ({width, height, color, padding, margin}) => (
|
||||
<Fragment>
|
||||
<svg
|
||||
height={height}
|
||||
width={width}
|
||||
stroke={color}
|
||||
style={{padding, margin}}
|
||||
fill="transparent"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path d="M12.7125 4.125C13.3282 5.2901 13.563 6.61893 13.3839 7.92447C13.2049 9.23002 12.621 10.4466 11.7143 11.4029C10.8077 12.3592 9.62401 13.0071 8.32986 13.2555C7.03571 13.5039 5.69626 13.3402 4.5 12.7875C4.7175 14.1791 5.32054 15.4818 6.24075 16.5481C7.16096 17.6144 8.36153 18.4015 9.70631 18.8203C11.0511 19.239 12.4863 19.2725 13.8492 18.9171C15.212 18.5617 16.4481 17.8315 17.4171 16.8094C18.3861 15.7873 19.0494 14.5141 19.3317 13.1342C19.6139 11.7543 19.5039 10.3229 19.0142 9.00239C18.5244 7.68183 17.6744 6.52493 16.5606 5.66285C15.4468 4.80078 14.1137 4.26803 12.7125 4.125Z" />
|
||||
</svg>
|
||||
</Fragment>
|
||||
);
|
18
desktop-app/app/components/icons/LightColorScheme.js
Normal file
18
desktop-app/app/components/icons/LightColorScheme.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
import React, {Fragment} from 'react';
|
||||
|
||||
export default ({width, height, color, padding, margin}) => (
|
||||
<Fragment>
|
||||
<svg
|
||||
height={height}
|
||||
width={width}
|
||||
stroke={color}
|
||||
style={{padding, margin}}
|
||||
fill="transparent"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path d="M17.5 12C17.5 15.0376 15.0376 17.5 12 17.5C8.96243 17.5 6.5 15.0376 6.5 12C6.5 8.96243 8.96243 6.5 12 6.5C15.0376 6.5 17.5 8.96243 17.5 12Z"/>
|
||||
<path d="M4 4L6 6M20 12H23H20ZM1 12H4H1ZM12 20V23V20ZM12 1V4V1ZM18 6L20 4L18 6ZM4 20L6 18L4 20ZM18 18L20 20L18 18Z"/>
|
||||
</svg>
|
||||
</Fragment>
|
||||
);
|
|
@ -11,6 +11,25 @@ import {grey} from '@material-ui/core/colors';
|
|||
import {themeColor} from '../constants/colors';
|
||||
import ErrorBoundary from '../components/ErrorBoundary';
|
||||
|
||||
import {
|
||||
registerShortcut,
|
||||
clearAllShortcuts,
|
||||
unregisterShortcut,
|
||||
} from '../shortcut-manager/renderer-shortcut-manager';
|
||||
import {
|
||||
onZoomChange,
|
||||
triggerScrollUp,
|
||||
triggerScrollDown,
|
||||
screenshotAllDevices,
|
||||
flipOrientationAllDevices,
|
||||
enableInpector,
|
||||
goToHomepage,
|
||||
triggerNavigationBack,
|
||||
triggerNavigationForward,
|
||||
deleteCookies,
|
||||
deleteStorage,
|
||||
} from '../actions/browser';
|
||||
|
||||
type Props = {
|
||||
store: Store,
|
||||
history: {},
|
||||
|
@ -53,6 +72,143 @@ const getApp = history => {
|
|||
};
|
||||
|
||||
export default class Root extends Component<Props> {
|
||||
componentDidMount() {
|
||||
this.registerAllShortcuts();
|
||||
}
|
||||
|
||||
registerAllShortcuts = () => {
|
||||
const {store} = this.props;
|
||||
|
||||
registerShortcut(
|
||||
{id: 'ZoomIn', title: 'Zoom In', accelerators: ['mod+=', 'mod+shift+=']},
|
||||
() => {
|
||||
store.dispatch(onZoomChange(store.getState().browser.zoomLevel + 0.1));
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{id: 'ZoomOut', title: 'Zoom Out', accelerators: ['mod+-']},
|
||||
() => {
|
||||
store.dispatch(onZoomChange(store.getState().browser.zoomLevel - 0.1));
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{id: 'ZoomReset', title: 'Zoom Reset', accelerators: ['mod+0']},
|
||||
() => {
|
||||
store.dispatch(onZoomChange(0.6));
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{id: 'EditUrl', title: 'Edit URL', accelerators: ['mod+l']},
|
||||
() => {
|
||||
document.getElementById('adress').select();
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{id: 'ScroolUp', title: 'Scroll Up', accelerators: ['mod+pageup']},
|
||||
() => {
|
||||
store.dispatch(triggerScrollUp());
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{id: 'ScroolDown', title: 'Scroll Down', accelerators: ['mod+pagedown']},
|
||||
() => {
|
||||
store.dispatch(triggerScrollDown());
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{id: 'Screenshot', title: 'Take Screenshot', accelerators: ['mod+prtsc']},
|
||||
() => {
|
||||
store.dispatch(screenshotAllDevices());
|
||||
},
|
||||
true,
|
||||
'keyup'
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{id: 'TiltDevices', title: 'Tilt Devices', accelerators: ['mod+tab']},
|
||||
() => {
|
||||
store.dispatch(flipOrientationAllDevices());
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{
|
||||
id: 'ToggleInspector',
|
||||
title: 'Toggle Inspector',
|
||||
accelerators: ['mod+i'],
|
||||
},
|
||||
() => {
|
||||
store.dispatch(enableInpector());
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{id: 'OpenHome', title: 'Go to Homepage', accelerators: ['alt+home']},
|
||||
() => {
|
||||
store.dispatch(goToHomepage());
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{id: 'BackAPage', title: 'Back a Page', accelerators: ['alt+left']},
|
||||
() => {
|
||||
store.dispatch(triggerNavigationBack());
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{
|
||||
id: 'ForwardAPage',
|
||||
title: 'Forward a Page',
|
||||
accelerators: ['alt+right'],
|
||||
},
|
||||
() => {
|
||||
store.dispatch(triggerNavigationForward());
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{id: 'DeleteStorage', title: 'Delete Storage', accelerators: ['mod+del']},
|
||||
() => {
|
||||
store.dispatch(deleteStorage());
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
registerShortcut(
|
||||
{
|
||||
id: 'DeleteCookies',
|
||||
title: 'Delete Cookies',
|
||||
accelerators: ['mod+shift+del'],
|
||||
},
|
||||
() => {
|
||||
store.dispatch(deleteCookies());
|
||||
},
|
||||
true
|
||||
);
|
||||
};
|
||||
|
||||
componentWillUnmount() {
|
||||
clearAllShortcuts();
|
||||
}
|
||||
|
||||
render() {
|
||||
const {store, history} = this.props;
|
||||
return (
|
||||
|
|
|
@ -18,6 +18,7 @@ import electron, {
|
|||
globalShortcut,
|
||||
ipcMain,
|
||||
webContents,
|
||||
nativeTheme,
|
||||
} from 'electron';
|
||||
import {autoUpdater} from 'electron-updater';
|
||||
import settings from 'electron-settings';
|
||||
|
@ -33,6 +34,7 @@ import devtron from 'devtron';
|
|||
import fs from 'fs';
|
||||
import {migrateDeviceSchema} from './settings/migration';
|
||||
import {DEVTOOLS_MODES} from './constants/previewerLayouts';
|
||||
import {initMainShortcutManager} from './shortcut-manager/main-shortcut-manager';
|
||||
|
||||
const path = require('path');
|
||||
|
||||
|
@ -98,6 +100,9 @@ const openUrl = url => {
|
|||
*/
|
||||
|
||||
app.on('will-finish-launching', () => {
|
||||
if (process.platform === 'win32') {
|
||||
urlToOpen = process.argv.filter(i => /^responsively/.test(i))[0];
|
||||
}
|
||||
if (['win32', 'darwin'].includes(process.platform)) {
|
||||
if (process.argv.length >= 2) {
|
||||
app.setAsDefaultProtocolClient(protocol, process.execPath, [
|
||||
|
@ -198,6 +203,8 @@ const createWindow = async () => {
|
|||
}
|
||||
});
|
||||
|
||||
initMainShortcutManager();
|
||||
|
||||
mainWindow.on('resize', function() {
|
||||
const [width, height] = mainWindow.getSize();
|
||||
mainWindow.webContents.send('window-resize', {height, width});
|
||||
|
@ -207,8 +214,9 @@ const createWindow = async () => {
|
|||
if (urlToOpen) {
|
||||
openUrl(urlToOpen);
|
||||
urlToOpen = null;
|
||||
} else {
|
||||
mainWindow.show();
|
||||
}
|
||||
mainWindow.show();
|
||||
});
|
||||
|
||||
ipcMain.on('http-auth-promt-response', (event, ...args) => {
|
||||
|
@ -223,6 +231,10 @@ const createWindow = async () => {
|
|||
httpAuthCallbacks[url] = null;
|
||||
});
|
||||
|
||||
ipcMain.on('prefers-color-scheme-select', (event, scheme) => {
|
||||
nativeTheme.themeSource = scheme || 'system';
|
||||
});
|
||||
|
||||
ipcMain.on('open-devtools', (event, ...args) => {
|
||||
const {webViewId, bounds, mode} = args[0];
|
||||
if (!webViewId) {
|
||||
|
|
|
@ -10,6 +10,10 @@ import {
|
|||
} from 'electron';
|
||||
import * as os from 'os';
|
||||
import {pkg} from './utils/generalUtils';
|
||||
import {
|
||||
getAllShortcuts,
|
||||
registerShortcut,
|
||||
} from './shortcut-manager/main-shortcut-manager';
|
||||
|
||||
const path = require('path');
|
||||
|
||||
|
@ -26,7 +30,7 @@ export default class MenuBuilder {
|
|||
{
|
||||
label: 'Website',
|
||||
click() {
|
||||
shell.openExternal('https://manojvivek.github.io/responsively-app/');
|
||||
shell.openExternal('https://responsively.app/');
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -68,6 +72,7 @@ export default class MenuBuilder {
|
|||
webPreferences: {
|
||||
devTools: false,
|
||||
nodeIntegration: true,
|
||||
additionalArguments: [JSON.stringify(getAllShortcuts())],
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -83,7 +88,7 @@ export default class MenuBuilder {
|
|||
});
|
||||
|
||||
win.on('blur', () => {
|
||||
win.hide();
|
||||
win.close();
|
||||
});
|
||||
|
||||
win.on('closed', () => {
|
||||
|
@ -93,6 +98,7 @@ export default class MenuBuilder {
|
|||
},
|
||||
{
|
||||
label: 'About',
|
||||
accelerator: 'F1',
|
||||
click() {
|
||||
const iconPath = path.join(__dirname, '../resources/icons/64x64.png');
|
||||
const title = 'Responsively';
|
||||
|
@ -143,7 +149,7 @@ export default class MenuBuilder {
|
|||
submenu: [
|
||||
{
|
||||
label: 'Open HTML file',
|
||||
accelerator: 'Command+O',
|
||||
accelerator: 'CommandOrControl+O',
|
||||
click: () => {
|
||||
const selected = dialog.showOpenDialogSync({
|
||||
filters: [{name: 'HTML', extensions: ['htm', 'html']}],
|
||||
|
@ -174,6 +180,7 @@ export default class MenuBuilder {
|
|||
? this.buildDarwinTemplate()
|
||||
: this.buildDefaultTemplate();
|
||||
|
||||
this.registerMenuShortcuts(template);
|
||||
const menu = Menu.buildFromTemplate(template);
|
||||
Menu.setApplicationMenu(menu);
|
||||
|
||||
|
@ -200,12 +207,12 @@ export default class MenuBuilder {
|
|||
const subMenuAbout = {
|
||||
label: 'Responsively',
|
||||
submenu: [
|
||||
{
|
||||
label: 'About ResponsivelyApp',
|
||||
selector: 'orderFrontStandardAboutPanel:',
|
||||
},
|
||||
// {
|
||||
// label: 'About ResponsivelyApp',
|
||||
// selector: 'orderFrontStandardAboutPanel:',
|
||||
// },
|
||||
{type: 'separator'},
|
||||
{label: 'Services', submenu: []},
|
||||
// {label: 'Services', submenu: []},
|
||||
{type: 'separator'},
|
||||
{
|
||||
label: 'Hide ResponsivelyApp',
|
||||
|
@ -281,7 +288,7 @@ export default class MenuBuilder {
|
|||
},
|
||||
{
|
||||
label: 'Toggle Developer Tools',
|
||||
accelerator: 'Alt+Command+I',
|
||||
accelerator: 'Command+Shift+I',
|
||||
click: () => {
|
||||
this.mainWindow.toggleDevTools();
|
||||
},
|
||||
|
@ -433,4 +440,32 @@ export default class MenuBuilder {
|
|||
|
||||
return templateDefault;
|
||||
}
|
||||
|
||||
registerMenuShortcuts(
|
||||
template: Array<MenuItemConstructorOptions | MenuItem>,
|
||||
id: string = 'Menu'
|
||||
) {
|
||||
if ((template || []).length === 0) return;
|
||||
|
||||
for (let i = 0; i < template.length; i++) {
|
||||
const item = template[i];
|
||||
if (item == null) continue;
|
||||
|
||||
const label = (item.label || `submenu${i}`).split('&').join('');
|
||||
const levelId = `${id}_${label}`;
|
||||
|
||||
if (item.accelerator != null)
|
||||
registerShortcut({
|
||||
id: levelId,
|
||||
title: label,
|
||||
accelerators: [item.accelerator],
|
||||
});
|
||||
|
||||
if (item.submenu == null) continue;
|
||||
|
||||
if (Array.isArray(item.submenu))
|
||||
this.registerMenuShortcuts(item.submenu, levelId);
|
||||
else this.registerMenuShortcuts([item.submenu], levelId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
59
desktop-app/app/shortcut-manager/main-shortcut-manager.js
Normal file
59
desktop-app/app/shortcut-manager/main-shortcut-manager.js
Normal file
|
@ -0,0 +1,59 @@
|
|||
import { ipcMain } from 'electron';
|
||||
import {
|
||||
REGISTER_CHANNEL,
|
||||
UNREGISTER_CHANNEL,
|
||||
REGISTER_REPLY_CHANNEL,
|
||||
UNREGISTER_REPLY_CHANNEL,
|
||||
GET_ALL_CHANNEL,
|
||||
CLEAR_CHANNEL,
|
||||
ShortcutDefinition,
|
||||
validateDefinition
|
||||
} from './shared';
|
||||
|
||||
let shortcuts: Map<string, ShortcutDefinition>;
|
||||
|
||||
function validate(shortcut: ShortcutDefinition, checkUnique = true) {
|
||||
return validateDefinition(shortcut) && !(checkUnique && shortcuts.has(shortcut.id));
|
||||
}
|
||||
|
||||
export function registerShortcut(shortcut: ShortcutDefinition): boolean {
|
||||
if (!validate(shortcut)) return false;
|
||||
shortcuts.set(shortcut.id, shortcut);
|
||||
return true;
|
||||
}
|
||||
|
||||
export function unregisterShortcut(id: string): boolean {
|
||||
if (id == null || !shortcuts.has(id)) return false;
|
||||
return shortcuts.delete(id);
|
||||
}
|
||||
|
||||
export function clearAllShortcuts() {
|
||||
shortcuts.clear();
|
||||
}
|
||||
|
||||
export function getAllShortcuts(): ShortcutDefinition[] {
|
||||
return [...shortcuts.values()];
|
||||
}
|
||||
|
||||
export function initMainShortcutManager() {
|
||||
shortcuts = new Map();
|
||||
|
||||
ipcMain.on(REGISTER_CHANNEL, (event, definition: ShortcutDefinition) => {
|
||||
const ok = registerShortcut(definition);
|
||||
const id = definition == null ? null : definition.id;
|
||||
event.reply(REGISTER_REPLY_CHANNEL, { ok, id });
|
||||
});
|
||||
|
||||
ipcMain.on(UNREGISTER_CHANNEL, (event, id: string) => {
|
||||
const ok = unregisterShortcut(id);
|
||||
event.reply(UNREGISTER_REPLY_CHANNEL, { ok, id });
|
||||
});
|
||||
|
||||
ipcMain.removeHandler(GET_ALL_CHANNEL);
|
||||
|
||||
ipcMain.handle(GET_ALL_CHANNEL, () => {
|
||||
return getAllShortcuts();
|
||||
});
|
||||
|
||||
ipcMain.on(CLEAR_CHANNEL, clearAllShortcuts);
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
import {ipcRenderer} from 'electron';
|
||||
import {
|
||||
REGISTER_CHANNEL,
|
||||
UNREGISTER_CHANNEL,
|
||||
REGISTER_REPLY_CHANNEL,
|
||||
UNREGISTER_REPLY_CHANNEL,
|
||||
GET_ALL_CHANNEL,
|
||||
CLEAR_CHANNEL,
|
||||
ShortcutDefinition,
|
||||
validateDefinition,
|
||||
CommunicationResponse
|
||||
} from './shared';
|
||||
|
||||
import Mousetrap from 'mousetrap';
|
||||
import 'mousetrap/plugins/global-bind/mousetrap-global-bind';
|
||||
|
||||
Mousetrap.addKeycodes({
|
||||
44: 'prtsc'
|
||||
});
|
||||
|
||||
const reg: Map<string, string[]> = new Map();
|
||||
|
||||
function validate(shortcut: ShortcutDefinition, checkUnique = true) {
|
||||
return validateDefinition(shortcut) && !(checkUnique && reg.has(shortcut.id));
|
||||
}
|
||||
|
||||
export function registerShortcut(definition: ShortcutDefinition, callback: (e) => any, global:boolean = false, action?: 'keypres'|'keydown'|'keyup'): boolean {
|
||||
if (!validate(definition) || callback == null) return false;
|
||||
reg.set(definition.id, definition.accelerators);
|
||||
ipcRenderer.send(REGISTER_CHANNEL, definition);
|
||||
if (global)
|
||||
Mousetrap.bindGlobal(definition.accelerators, callback, action);
|
||||
else
|
||||
Mousetrap.bind(definition.accelerators, callback, action);
|
||||
return true;
|
||||
}
|
||||
|
||||
export function unregisterShortcut(id: string): boolean {
|
||||
if (id == null || !reg.has(id)) return false;
|
||||
const accelerators = reg.get(id);
|
||||
reg.delete(id);
|
||||
ipcRenderer.send(UNREGISTER_CHANNEL, id);
|
||||
Mousetrap.unbind(accelerators);
|
||||
}
|
||||
|
||||
export function getAllShortcuts() {
|
||||
return ipcRenderer.invoke(GET_ALL_CHANNEL);
|
||||
}
|
||||
|
||||
export function clearAllShortcuts() {
|
||||
ipcRenderer.send(CLEAR_CHANNEL);
|
||||
reg.clear();
|
||||
Mousetrap.reset();
|
||||
}
|
23
desktop-app/app/shortcut-manager/shared.js
Normal file
23
desktop-app/app/shortcut-manager/shared.js
Normal file
|
@ -0,0 +1,23 @@
|
|||
export const REGISTER_CHANNEL = 'register-shortcut';
|
||||
export const UNREGISTER_CHANNEL = 'unregister-shortcut';
|
||||
export const REGISTER_REPLY_CHANNEL = 'register-shortcut-reply';
|
||||
export const UNREGISTER_REPLY_CHANNEL = 'unregister-shortcut-reply';
|
||||
export const GET_ALL_CHANNEL = 'get-all-shortcuts';
|
||||
export const CLEAR_CHANNEL = 'clear-shortcuts';
|
||||
export type ShortcutDefinition = {
|
||||
id: string,
|
||||
title: string,
|
||||
accelerators: string[]
|
||||
};
|
||||
export type CommunicationResponse = {
|
||||
ok: boolean,
|
||||
id: string
|
||||
};
|
||||
|
||||
export function validateDefinition(shortcut: ShortcutDefinition): boolean {
|
||||
return shortcut != null &&
|
||||
shortcut.id != null &&
|
||||
shortcut.title != null &&
|
||||
(shortcut.accelerators || []).length !== 0 &&
|
||||
shortcut.accelerators.every(x => x != null);
|
||||
}
|
|
@ -12,6 +12,7 @@
|
|||
}
|
||||
ul {
|
||||
margin: 20px 50px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
li {
|
||||
display: flex;
|
||||
|
@ -40,6 +41,8 @@
|
|||
font-size: large;
|
||||
background-color: black;
|
||||
border-radius: 5px;
|
||||
font-family: "Consolas", "Courier New", monospace;
|
||||
white-space: pre;
|
||||
}
|
||||
.btn-wrapper {
|
||||
display: flex;
|
||||
|
@ -66,14 +69,54 @@
|
|||
<button id="close-btn">Close</button>
|
||||
</div>
|
||||
<script>
|
||||
const shortcuts = [
|
||||
['Open HTML File', ['Cmd/Ctrl', 'O']],
|
||||
['Reload', ['Cmd/Ctrl', 'R']],
|
||||
['Reload Ignoring Cache', ['Cmd/Ctrl', 'Shift', 'R']],
|
||||
['Reload CSS Files In-place', ['Alt', 'R']],
|
||||
];
|
||||
function firstToUpperCase(s) {
|
||||
return s[0].toUpperCase() + s.slice(1);
|
||||
}
|
||||
function getNumPadName(n) {
|
||||
const lo = n.toLowerCase();
|
||||
if (lo === 'dec') return 'Numpad .';
|
||||
if (lo === 'add') return 'Numpad +';
|
||||
if (lo === 'sub') return 'Numpad -';
|
||||
if (lo === 'mult') return 'Numpad *';
|
||||
if (lo === 'div') return 'Numpad /';
|
||||
return 'Numpad ' + firstToUpperCase(n);
|
||||
}
|
||||
function getKeyName(k) {
|
||||
const lo = k.toLowerCase();
|
||||
if (lo === 'mod')
|
||||
return 'Cmd/Ctrl';
|
||||
if (lo === 'commandorcontrol' || lo === 'cmdorctrl')
|
||||
return 'Cmd/Ctrl';
|
||||
if (lo === 'command')
|
||||
return 'Cmd';
|
||||
if (lo === 'control')
|
||||
return 'Ctrl';
|
||||
if (lo === 'plus')
|
||||
return '+';
|
||||
if (lo === 'return')
|
||||
return 'Enter';
|
||||
if (lo === 'escape')
|
||||
return 'Esc';
|
||||
if (lo === 'prtsc')
|
||||
return 'PrtSc';
|
||||
if (lo.startsWith('num'))
|
||||
return getNumPadName(k.slice(3));
|
||||
return firstToUpperCase(k);
|
||||
}
|
||||
function mapAccelerator(acc) {
|
||||
return acc.split('+').map(getKeyName);
|
||||
}
|
||||
|
||||
const shortcutNodes = shortcuts.map(([label, keys]) => {
|
||||
let registeredShortcuts = [];
|
||||
try {
|
||||
registeredShortcuts = JSON.parse(window.process.argv.slice(-1)).reduce((arr, def) => {
|
||||
arr.push([def.title, mapAccelerator(def.accelerators[0])]);
|
||||
def.accelerators.slice(1).forEach(acc => arr.push(['', mapAccelerator(acc)]))
|
||||
return arr;
|
||||
}, []);
|
||||
} catch { }
|
||||
|
||||
const shortcutNodes = registeredShortcuts.map(([label, keys]) => {
|
||||
const liElem = document.createElement('li');
|
||||
|
||||
const labelElem = document.createElement('div');
|
||||
|
@ -108,7 +151,7 @@
|
|||
if (document.readyState === 'complete') {
|
||||
document.getElementById('close-btn').addEventListener('click', () => {
|
||||
const window = BrowserWindow.getFocusedWindow();
|
||||
window.hide();
|
||||
window.close();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "Responsively-App",
|
||||
"productName": "ResponsivelyApp",
|
||||
"version": "0.1.6",
|
||||
"version": "0.2.0",
|
||||
"description": "A developer-friendly browser for developing responsive web apps",
|
||||
"scripts": {
|
||||
"build": "concurrently \"yarn build-main\" \"yarn build-renderer\"",
|
||||
|
@ -279,6 +279,7 @@
|
|||
"history": "^4.7.2",
|
||||
"jimp": "^0.12.1",
|
||||
"merge-img": "^2.1.3",
|
||||
"mousetrap": "^1.6.5",
|
||||
"promise-worker": "^2.0.1",
|
||||
"pubsub.js": "^1.5.2",
|
||||
"re-resizable": "^6.4.0",
|
||||
|
|
|
@ -10579,6 +10579,11 @@ moo@^0.5.0:
|
|||
resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4"
|
||||
integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==
|
||||
|
||||
mousetrap@^1.6.5:
|
||||
version "1.6.5"
|
||||
resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.5.tgz#8a766d8c272b08393d5f56074e0b5ec183485bf9"
|
||||
integrity sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==
|
||||
|
||||
move-concurrently@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
|
||||
|
|
|
@ -25,4 +25,12 @@ html {
|
|||
.container {
|
||||
max-width: 1140px;
|
||||
}
|
||||
}
|
||||
|
||||
#privacyPolicy p {
|
||||
text-align: justify !important;
|
||||
}
|
||||
|
||||
#privacyPolicy ol, #privacyPolicy li {
|
||||
text-align: left !important;
|
||||
}
|
|
@ -16,12 +16,19 @@
|
|||
gtag("config", "UA-150751006-2");
|
||||
</script>
|
||||
<meta charset="utf-8" />
|
||||
<title>Responsively App</title>
|
||||
<title>Responsively App | A Web developer's browser</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta
|
||||
name="description"
|
||||
content="A modified dev-friendly browser that aids easy responsively web application development."
|
||||
content="A dev-tool that aids faster and precise responsive web development."
|
||||
/>
|
||||
<meta property="og:title" content="A Web developer's browser - Responsively App" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="https://responsively.app" />
|
||||
<meta property="og:description" content="A dev-tool that aids faster and precise responsive web development." />
|
||||
<meta property="og:image" content="https://responsively.app/assets/img/screenshot.png" />
|
||||
<meta name="twitter:card" content="summary"></meta>
|
||||
<meta name="twitter:site" content="@ResponsivelyApp"></meta>
|
||||
<link
|
||||
href="assets/css/loaders/loader-typing.css"
|
||||
rel="stylesheet"
|
||||
|
@ -138,7 +145,7 @@
|
|||
<div class="navbar-container bg-primary-3">
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary-3" data-sticky="top">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="/responsively-app">
|
||||
<a class="navbar-brand" href="/">
|
||||
<img src="assets/img/responsively-logo.png" alt="Responsively" width="60px" />
|
||||
Responsively
|
||||
</a>
|
||||
|
@ -545,6 +552,28 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-content-center mb-2">
|
||||
<div class="col-auto">
|
||||
<ul class="nav">
|
||||
<li class="nav-item">
|
||||
<a href="https://twitter.com/ResponsivelyApp" class="nav-link" target="_blank">
|
||||
<img class="icon undefined" src="assets/img/icons/social/twitter.svg" alt="twitter social icon" data-inject-svg />
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="https://github.com/manojVivek/responsively-app" class="nav-link" target="_blank">
|
||||
<img class="icon undefined" src="assets/img/icons/social/github.svg" alt="github social icon" data-inject-svg />
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-content-center">
|
||||
<div class="col col-md-auto text-center">
|
||||
<small class="text-muted">©2020 Responsively App, All rights reserved and subject to the <a href="/privacy-policy.html">Privacy Policy</a> and <a href="/terms-and-conditions.html">Terms and Conditions</a>.
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- Required vendor scripts (Do not remove) -->
|
||||
|
|
408
website/pages/privacy-policy.html
Normal file
408
website/pages/privacy-policy.html
Normal file
|
@ -0,0 +1,408 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script
|
||||
async
|
||||
src="https://www.googletagmanager.com/gtag/js?id=UA-150751006-2"
|
||||
></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() {
|
||||
dataLayer.push(arguments);
|
||||
}
|
||||
gtag("js", new Date());
|
||||
|
||||
gtag("config", "UA-150751006-2");
|
||||
</script>
|
||||
<meta charset="utf-8" />
|
||||
<title>Responsively App | privacy Policy</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta
|
||||
name="description"
|
||||
content="A dev-tool that aids faster and precise responsive web development."
|
||||
/>
|
||||
<meta property="og:title" content="A Web developer's browser - Responsively App" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="https://responsively.app" />
|
||||
<meta property="og:description" content="A dev-tool that aids faster and precise responsive web development." />
|
||||
<meta property="og:image" content="https://responsively.app/assets/img/screenshot.png" />
|
||||
<meta name="twitter:card" content="summary"></meta>
|
||||
<meta name="twitter:site" content="@ResponsivelyApp"></meta>
|
||||
<link
|
||||
href="assets/css/loaders/loader-typing.css"
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
media="all"
|
||||
/>
|
||||
<link
|
||||
href="assets/css/theme-desktop-app.css"
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
media="all"
|
||||
/>
|
||||
<link
|
||||
href="assets/css/custom.css"
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
media="all"
|
||||
/>
|
||||
<link
|
||||
rel="preload"
|
||||
as="font"
|
||||
href="assets/fonts/Inter-UI-upright.var.woff2"
|
||||
type="font/woff2"
|
||||
crossorigin="anonymous"
|
||||
/>
|
||||
<link
|
||||
rel="preload"
|
||||
as="font"
|
||||
href="assets/fonts/Inter-UI.var.woff2"
|
||||
type="font/woff2"
|
||||
crossorigin="anonymous"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="57x57"
|
||||
href="/assets/img/favicons/apple-icon-57x57.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="60x60"
|
||||
href="/assets/img/favicons/apple-icon-60x60.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="72x72"
|
||||
href="/assets/img/favicons/apple-icon-72x72.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="76x76"
|
||||
href="/assets/img/favicons/apple-icon-76x76.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="114x114"
|
||||
href="/assets/img/favicons/apple-icon-114x114.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="120x120"
|
||||
href="/assets/img/favicons/apple-icon-120x120.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="144x144"
|
||||
href="/assets/img/favicons/apple-icon-144x144.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="152x152"
|
||||
href="/assets/img/favicons/apple-icon-152x152.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="180x180"
|
||||
href="/assets/img/favicons/apple-icon-180x180.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="192x192"
|
||||
href="/assets/img/favicons/android-icon-192x192.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="/assets/img/favicons/favicon-32x32.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="96x96"
|
||||
href="/assets/img/favicons/favicon-96x96.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="16x16"
|
||||
href="/assets/img/favicons/favicon-16x16.png"
|
||||
/>
|
||||
<link rel="manifest" href="/assets/img/favicons/manifest.json" />
|
||||
<meta name="msapplication-TileColor" content="#ffffff" />
|
||||
<meta
|
||||
name="msapplication-TileImage"
|
||||
content="/assets/img/favicons/ms-icon-144x144.png"
|
||||
/>
|
||||
<meta name="theme-color" content="#ffffff" />
|
||||
</head>
|
||||
|
||||
<body class="loaded">
|
||||
<div class="loader"><div class="loading-animation"></div></div>
|
||||
|
||||
<div class="navbar-container bg-primary-3">
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary-3" data-sticky="top">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="/">
|
||||
<img src="assets/img/responsively-logo.png" alt="Responsively" width="60px" />
|
||||
Responsively
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse"
|
||||
aria-expanded="false" aria-label="Toggle navigation">
|
||||
<img class="icon navbar-toggler-open" src="assets/img/icons/interface/menu.svg" alt="menu interface icon"
|
||||
data-inject-svg />
|
||||
<img class="icon navbar-toggler-close" src="assets/img/icons/interface/cross.svg" alt="cross interface icon"
|
||||
data-inject-svg />
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse justify-content-end p-3 p-md-0">
|
||||
<div class="py-2 py-lg-0">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a href="#Benefits" class="nav-link" aria-expanded="false" aria-haspopup="true">Benefits</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#Features" class="nav-link" aria-expanded="false" aria-haspopup="true">Features</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="https://github.com/manojVivek/responsively-app" target="_blank" class="nav-link"
|
||||
aria-expanded="false" aria-haspopup="true">Open source</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<a href="https://github.com/manojVivek/responsively-app/releases" target="_blank"
|
||||
class="btn btn-primary ml-lg-3">Download now</a>
|
||||
<a class="ml-lg-3 d-none d-lg-block"
|
||||
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="Responsively - Develop responsive web-apps 5x faster | Product Hunt Embed" style="width: 250px; height: 50px;"
|
||||
width="250px" height="50px" /></a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<section
|
||||
class="text-center header-desktop-app"
|
||||
id="privacyPolicy"
|
||||
>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center mb-5">
|
||||
<div class="col-xl-9 col-lg-8 col-md-9">
|
||||
<h1 class="display-4">Privacy Policy</h1>
|
||||
|
||||
<p>It is Responsively App's policy to respect your privacy regarding any information we may collect while operating our website. This Privacy Policy applies to <a href="https://responsively.app" style="color: unset;">https://responsively.app</a>, the desktop app and the browser extensions (hereinafter, "us", "we", or "https://responsively.app"). We respect your privacy and are committed to protecting personally identifiable information you may provide us through the Website. We have adopted this privacy policy ("Privacy Policy") to explain what information may be collected on our Website, how we use this information, and under what circumstances we may disclose the information to third parties. This Privacy Policy applies only to information we collect through the Website and does not apply to our collection of information from other sources.</p>
|
||||
<p>This Privacy Policy, together with the Terms and conditions posted on our Website, set forth the general rules and policies governing your use of our Website. Depending on your activities when visiting our Website, you may be required to agree to additional terms and conditions.</p>
|
||||
|
||||
<h2>Website Visitors</h2>
|
||||
<p>Like most website operators, Responsively App collects non-personally-identifying information of the sort that web browsers and servers typically make available, such as the browser type, language preference, referring site, and the date and time of each visitor request. Responsively App's purpose in collecting non-personally identifying information is to better understand how Responsively App's visitors use its website. From time to time, Responsively App may release non-personally-identifying information in the aggregate, e.g., by publishing a report on trends in the usage of its website.</p>
|
||||
<p>Responsively App also collects potentially personally-identifying information like Internet Protocol (IP) addresses for logged in users and for users leaving comments on https://responsively.app blog posts. Responsively App only discloses logged in user and commenter IP addresses under the same circumstances that it uses and discloses personally-identifying information as described below.</p>
|
||||
|
||||
<h2>Gathering of Personally-Identifying Information</h2>
|
||||
<p>Certain visitors to Responsively App's websites choose to interact with Responsively App in ways that require Responsively App to gather personally-identifying information. The amount and type of information that Responsively App gathers depends on the nature of the interaction. For example, we ask visitors who sign up for a blog at https://responsively.app to provide a username and email address.</p>
|
||||
|
||||
<h2>Security</h2>
|
||||
<p>The security of your Personal Information is important to us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Information, we cannot guarantee its absolute security.</p>
|
||||
|
||||
<h2>Advertisements</h2>
|
||||
<p>Ads appearing on our website may be delivered to users by advertising partners, who may set cookies. These cookies allow the ad server to recognize your computer each time they send you an online advertisement to compile information about you or others who use your computer. This information allows ad networks to, among other things, deliver targeted advertisements that they believe will be of most interest to you. This Privacy Policy covers the use of cookies by Responsively App and does not cover the use of cookies by any advertisers.</p>
|
||||
|
||||
|
||||
<h2>Links To External Sites</h2>
|
||||
<p>Our Service may contain links to external sites that are not operated by us. If you click on a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy and terms and conditions of every site you visit.</p>
|
||||
<p>We have no control over, and assume no responsibility for the content, privacy policies or practices of any third party sites, products or services.</p>
|
||||
|
||||
|
||||
|
||||
<h2>Aggregated Statistics</h2>
|
||||
<p>Responsively App may collect statistics about the behavior of visitors to its website. Responsively App may display this information publicly or provide it to others. However, Responsively App does not disclose your personally-identifying information.</p>
|
||||
|
||||
|
||||
<h2>Cookies</h2>
|
||||
<p>To enrich and perfect your online experience, Responsively App uses "Cookies", similar technologies and services provided by others to display personalized content, appropriate advertising and store your preferences on your computer.</p>
|
||||
<p>A cookie is a string of information that a website stores on a visitor's computer, and that the visitor's browser provides to the website each time the visitor returns. Responsively App uses cookies to help Responsively App identify and track visitors, their usage of https://responsively.app, and their website access preferences. Responsively App visitors who do not wish to have cookies placed on their computers should set their browsers to refuse cookies before using Responsively App's websites, with the drawback that certain features of Responsively App's websites may not function properly without the aid of cookies.</p>
|
||||
<p>By continuing to navigate our website without changing your cookie settings, you hereby acknowledge and agree to Responsively App's use of cookies.</p>
|
||||
|
||||
|
||||
|
||||
<h2>Privacy Policy Changes</h2>
|
||||
<p>Although most changes are likely to be minor, Responsively App may change its Privacy Policy from time to time, and in Responsively App's sole discretion. Responsively App encourages visitors to frequently check this page for any changes to its Privacy Policy. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.</p>
|
||||
|
||||
|
||||
|
||||
<h2></h2>
|
||||
<p></p>
|
||||
|
||||
<h2>Contact Information</h2>
|
||||
<p>If you have any questions about this Privacy Policy, please contact us by raising an issue at https://github.com/manojVivek/responsively-app/issues.</p>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<footer id="Contact-Us" class="pb-1 bg-primary-3 text-light">
|
||||
<div class="container">
|
||||
<div class="row mb-5">
|
||||
<div class="col">
|
||||
<div
|
||||
class="card card-body border-0 o-hidden mb-0 bg-primary text-light"
|
||||
>
|
||||
<div
|
||||
class="position-relative d-flex flex-column flex-md-row justify-content-between align-items-center"
|
||||
>
|
||||
<div class="h3 text-center mb-md-0">
|
||||
Start building beautiful websites
|
||||
</div>
|
||||
<a
|
||||
href="https://github.com/manojVivek/responsively-app/releases"
|
||||
target="_blank"
|
||||
class="btn btn-lg btn-white"
|
||||
>
|
||||
Download Now
|
||||
</a>
|
||||
<div
|
||||
class="d-block d-sm-block d-md-block d-lg-none flex-column flex-sm-row justify-content-center ml-sm-4 mt-4 mt-sm-0"
|
||||
>
|
||||
<a class="ml-lg-3" 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="Responsively - Develop responsive web-apps 5x faster! | Product Hunt Embed" style="width: 250px; height: 50px;" width="250px" height="50px" /></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="decoration layer-0">
|
||||
<img
|
||||
class="bg-primary-2"
|
||||
src="assets/img/decorations/deco-blob-1.svg"
|
||||
alt="deco-blob-1 decoration"
|
||||
data-inject-svg
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-content-center mb-2">
|
||||
<div class="col-auto">
|
||||
<ul class="nav">
|
||||
<li class="nav-item">
|
||||
<a href="https://twitter.com/ResponsivelyApp" class="nav-link" target="_blank">
|
||||
<img class="icon undefined" src="assets/img/icons/social/twitter.svg" alt="twitter social icon" data-inject-svg />
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="https://github.com/manojVivek/responsively-app" class="nav-link" target="_blank">
|
||||
<img class="icon undefined" src="assets/img/icons/social/github.svg" alt="github social icon" data-inject-svg />
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-content-center">
|
||||
<div class="col col-md-auto text-center">
|
||||
<small class="text-muted">©2020 Responsively App, All rights reserved and subject to the <a href="/privacy-policy.html">Privacy Policy</a> and <a href="/terms-and-conditions.html">Terms and Conditions</a>.
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- Required vendor scripts (Do not remove) -->
|
||||
<script type="text/javascript" src="assets/js/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="assets/js/popper.min.js"></script>
|
||||
<script type="text/javascript" src="assets/js/bootstrap.js"></script>
|
||||
|
||||
<!--
|
||||
Optional Vendor Scripts (Remove the plugin script here and comment initializer script out of index.js if site does not use that feature)
|
||||
-->
|
||||
|
||||
<!--
|
||||
AOS (Animate On Scroll - animates elements into view while scrolling down)
|
||||
-->
|
||||
<script type="text/javascript" src="assets/js/aos.js"></script>
|
||||
<!-- Clipboard (copies content from browser into OS clipboard) -->
|
||||
<script type="text/javascript" src="assets/js/clipboard.js"></script>
|
||||
<!-- Fancybox (handles image and video lightbox and galleries) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/jquery.fancybox.min.js"
|
||||
></script>
|
||||
<!-- Flatpickr (calendar/date/time picker UI) -->
|
||||
<script type="text/javascript" src="assets/js/flatpickr.min.js"></script>
|
||||
<!-- Flickity (handles touch enabled carousels and sliders) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/flickity.pkgd.min.js"
|
||||
></script>
|
||||
<!-- Ion rangeSlider (flexible and pretty range slider elements) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/ion.rangeSlider.min.js"
|
||||
></script>
|
||||
<!-- Isotope (masonry layouts and filtering) -->
|
||||
<script type="text/javascript" src="assets/js/isotope.pkgd.min.js"></script>
|
||||
<!-- jarallax (parallax effect and video backgrounds) -->
|
||||
<script type="text/javascript" src="assets/js/jarallax.min.js"></script>
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/jarallax-video.min.js"
|
||||
></script>
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/jarallax-element.min.js"
|
||||
></script>
|
||||
<!-- jQuery Countdown (displays countdown text to a specified date) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/jquery.countdown.min.js"
|
||||
></script>
|
||||
<!-- jQuery smartWizard facilitates steppable wizard content -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/jquery.smartWizard.min.js"
|
||||
></script>
|
||||
<!-- Plyr (unified player for Video, Audio, Vimeo and Youtube) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/plyr.polyfilled.min.js"
|
||||
></script>
|
||||
<!-- Prism (displays formatted code boxes) -->
|
||||
<script type="text/javascript" src="assets/js/prism.js"></script>
|
||||
<!--
|
||||
ScrollMonitor (manages events for elements scrolling in and out of view)
|
||||
-->
|
||||
<script type="text/javascript" src="assets/js/scrollMonitor.js"></script>
|
||||
<!-- Smooth scroll (animation to links in-page) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/smooth-scroll.polyfills.min.js"
|
||||
></script>
|
||||
<!--
|
||||
SVGInjector (replaces img tags with SVG code to allow easy inclusion of SVGs with the benefit of inheriting colors and styles)
|
||||
-->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/svg-injector.umd.production.js"
|
||||
></script>
|
||||
<!-- TwitterFetcher (displays a feed of tweets from a specified account) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/twitterFetcher_min.js"
|
||||
></script>
|
||||
<!-- Typed text (animated typing effect) -->
|
||||
<script type="text/javascript" src="assets/js/typed.min.js"></script>
|
||||
<!-- Required theme scripts (Do not remove) -->
|
||||
<script type="text/javascript" src="assets/js/theme.js"></script>
|
||||
<!-- Removes page load animation when window is finished loading -->
|
||||
<script type="text/javascript">
|
||||
window.addEventListener("load", function() {
|
||||
document.querySelector("body").classList.add("loaded");
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
var flkty = new Flickity(".controls-light", {
|
||||
autoPlay: true,
|
||||
imagesLoaded: true,
|
||||
wrapAround: true
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
492
website/pages/terms-and-conditions.html
Normal file
492
website/pages/terms-and-conditions.html
Normal file
|
@ -0,0 +1,492 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script
|
||||
async
|
||||
src="https://www.googletagmanager.com/gtag/js?id=UA-150751006-2"
|
||||
></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() {
|
||||
dataLayer.push(arguments);
|
||||
}
|
||||
gtag("js", new Date());
|
||||
|
||||
gtag("config", "UA-150751006-2");
|
||||
</script>
|
||||
<meta charset="utf-8" />
|
||||
<title>Responsively App | privacy Policy</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta
|
||||
name="description"
|
||||
content="A dev-tool that aids faster and precise responsive web development."
|
||||
/>
|
||||
<meta property="og:title" content="A Web developer's browser - Responsively App" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="https://responsively.app" />
|
||||
<meta property="og:description" content="A dev-tool that aids faster and precise responsive web development." />
|
||||
<meta property="og:image" content="https://responsively.app/assets/img/screenshot.png" />
|
||||
<meta name="twitter:card" content="summary"></meta>
|
||||
<meta name="twitter:site" content="@ResponsivelyApp"></meta>
|
||||
<link
|
||||
href="assets/css/loaders/loader-typing.css"
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
media="all"
|
||||
/>
|
||||
<link
|
||||
href="assets/css/theme-desktop-app.css"
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
media="all"
|
||||
/>
|
||||
<link
|
||||
href="assets/css/custom.css"
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
media="all"
|
||||
/>
|
||||
<link
|
||||
rel="preload"
|
||||
as="font"
|
||||
href="assets/fonts/Inter-UI-upright.var.woff2"
|
||||
type="font/woff2"
|
||||
crossorigin="anonymous"
|
||||
/>
|
||||
<link
|
||||
rel="preload"
|
||||
as="font"
|
||||
href="assets/fonts/Inter-UI.var.woff2"
|
||||
type="font/woff2"
|
||||
crossorigin="anonymous"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="57x57"
|
||||
href="/assets/img/favicons/apple-icon-57x57.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="60x60"
|
||||
href="/assets/img/favicons/apple-icon-60x60.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="72x72"
|
||||
href="/assets/img/favicons/apple-icon-72x72.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="76x76"
|
||||
href="/assets/img/favicons/apple-icon-76x76.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="114x114"
|
||||
href="/assets/img/favicons/apple-icon-114x114.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="120x120"
|
||||
href="/assets/img/favicons/apple-icon-120x120.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="144x144"
|
||||
href="/assets/img/favicons/apple-icon-144x144.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="152x152"
|
||||
href="/assets/img/favicons/apple-icon-152x152.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="180x180"
|
||||
href="/assets/img/favicons/apple-icon-180x180.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="192x192"
|
||||
href="/assets/img/favicons/android-icon-192x192.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="/assets/img/favicons/favicon-32x32.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="96x96"
|
||||
href="/assets/img/favicons/favicon-96x96.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="16x16"
|
||||
href="/assets/img/favicons/favicon-16x16.png"
|
||||
/>
|
||||
<link rel="manifest" href="/assets/img/favicons/manifest.json" />
|
||||
<meta name="msapplication-TileColor" content="#ffffff" />
|
||||
<meta
|
||||
name="msapplication-TileImage"
|
||||
content="/assets/img/favicons/ms-icon-144x144.png"
|
||||
/>
|
||||
<meta name="theme-color" content="#ffffff" />
|
||||
</head>
|
||||
|
||||
<body class="loaded">
|
||||
<div class="loader"><div class="loading-animation"></div></div>
|
||||
|
||||
<div class="navbar-container bg-primary-3">
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary-3" data-sticky="top">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="/">
|
||||
<img src="assets/img/responsively-logo.png" alt="Responsively" width="60px" />
|
||||
Responsively
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse"
|
||||
aria-expanded="false" aria-label="Toggle navigation">
|
||||
<img class="icon navbar-toggler-open" src="assets/img/icons/interface/menu.svg" alt="menu interface icon"
|
||||
data-inject-svg />
|
||||
<img class="icon navbar-toggler-close" src="assets/img/icons/interface/cross.svg" alt="cross interface icon"
|
||||
data-inject-svg />
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse justify-content-end p-3 p-md-0">
|
||||
<div class="py-2 py-lg-0">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a href="#Benefits" class="nav-link" aria-expanded="false" aria-haspopup="true">Benefits</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#Features" class="nav-link" aria-expanded="false" aria-haspopup="true">Features</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="https://github.com/manojVivek/responsively-app" target="_blank" class="nav-link"
|
||||
aria-expanded="false" aria-haspopup="true">Open source</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<a href="https://github.com/manojVivek/responsively-app/releases" target="_blank"
|
||||
class="btn btn-primary ml-lg-3">Download now</a>
|
||||
<a class="ml-lg-3 d-none d-lg-block"
|
||||
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="Responsively - Develop responsive web-apps 5x faster | Product Hunt Embed" style="width: 250px; height: 50px;"
|
||||
width="250px" height="50px" /></a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<section
|
||||
class="text-center header-desktop-app"
|
||||
id="privacyPolicy"
|
||||
>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center mb-5">
|
||||
<div class="col-xl-9 col-lg-8 col-md-9">
|
||||
<h1 class="display-4">Terms and Conditions</h1>
|
||||
<p>These terms and conditions outline the rules and regulations for the use of Responsively App's Website, the desktop app and the browser extensions.</p> <br />
|
||||
<p>By accessing this website we assume you accept these terms and conditions in full. Do not continue to use Responsively App's website.
|
||||
if you do not accept all of the terms and conditions stated on this page.</p>
|
||||
<p>The following terminology applies to these Terms and Conditions, Privacy Statement and Disclaimer Notice
|
||||
and any or all Agreements: "Client", "You" and "Your" refers to you, the person accessing this website
|
||||
and accepting the Company's terms and conditions. "The Company", "Ourselves", "We", "Our" and "Us", refers
|
||||
to our Company. "Party", "Parties", or "Us", refers to both the Client and ourselves, or either the Client
|
||||
or ourselves. All terms refer to the offer, acceptance and consideration of payment necessary to undertake
|
||||
the process of our assistance to the Client in the most appropriate manner, whether by formal meetings
|
||||
of a fixed duration, or any other means, for the express purpose of meeting the Client's needs in respect
|
||||
of provision of the Company's stated services/products, in accordance with and subject to, prevailing law
|
||||
of . Any use of the above terminology or other words in the singular, plural,
|
||||
capitalisation and/or he/she or they, are taken as interchangeable and therefore as referring to same.</p><h2>Cookies</h2>
|
||||
<p>We employ the use of cookies. By using Responsively App's website you consent to the use of cookies
|
||||
in accordance with Responsively App's privacy policy.</p><p>Most of the modern day interactive web sites
|
||||
use cookies to enable us to retrieve user details for each visit. Cookies are used in some areas of our site
|
||||
to enable the functionality of this area and ease of use for those people visiting. Some of our
|
||||
affiliate / advertising partners may also use cookies.</p><h2>License</h2>
|
||||
<p>Unless otherwise stated, Responsively App and/or it's licensors own the intellectual property rights for
|
||||
all material on Responsively App. All intellectual property rights are reserved. You may view and/or print
|
||||
pages from https://responsively.app for your own personal use subject to restrictions set in these terms and conditions.</p>
|
||||
<p>You must not:</p>
|
||||
<ol>
|
||||
<li>Republish material from https://responsively.app</li>
|
||||
<li>Sell, rent or sub-license material from https://responsively.app</li>
|
||||
<li>Reproduce, duplicate or copy material from https://responsively.app</li>
|
||||
</ol>
|
||||
<p>Redistribute content from Responsively App (unless content is specifically made for redistribution).</p>
|
||||
<h2>Hyperlinking to our Content</h2>
|
||||
<ol>
|
||||
<li>The following organizations may link to our Web site without prior written approval:
|
||||
<ol>
|
||||
<li>Government agencies;</li>
|
||||
<li>Search engines;</li>
|
||||
<li>News organizations;</li>
|
||||
<li>Online directory distributors when they list us in the directory may link to our Web site in the same
|
||||
manner as they hyperlink to the Web sites of other listed businesses; and</li>
|
||||
<li>Systemwide Accredited Businesses except soliciting non-profit organizations, charity shopping malls,
|
||||
and charity fundraising groups which may not hyperlink to our Web site.</li>
|
||||
</ol>
|
||||
</li>
|
||||
</ol>
|
||||
<ol start="2">
|
||||
<li>These organizations may link to our home page, to publications or to other Web site information so long
|
||||
as the link: (a) is not in any way misleading; (b) does not falsely imply sponsorship, endorsement or
|
||||
approval of the linking party and its products or services; and (c) fits within the context of the linking
|
||||
party's site.
|
||||
</li>
|
||||
<li>We may consider and approve in our sole discretion other link requests from the following types of organizations:
|
||||
<ol>
|
||||
<li>commonly-known consumer and/or business information sources such as Chambers of Commerce, American
|
||||
Automobile Association, AARP and Consumers Union;</li>
|
||||
<li>dot.com community sites;</li>
|
||||
<li>associations or other groups representing charities, including charity giving sites,</li>
|
||||
<li>online directory distributors;</li>
|
||||
<li>internet portals;</li>
|
||||
<li>accounting, law and consulting firms whose primary clients are businesses; and</li>
|
||||
<li>educational institutions and trade associations.</li>
|
||||
</ol>
|
||||
</li>
|
||||
</ol>
|
||||
<p>We will approve link requests from these organizations if we determine that: (a) the link would not reflect
|
||||
unfavorably on us or our accredited businesses (for example, trade associations or other organizations
|
||||
representing inherently suspect types of business, such as work-at-home opportunities, shall not be allowed
|
||||
to link); (b)the organization does not have an unsatisfactory record with us; (c) the benefit to us from
|
||||
the visibility associated with the hyperlink outweighs the absence of Responsively App; and (d) where the
|
||||
link is in the context of general resource information or is otherwise consistent with editorial content
|
||||
in a newsletter or similar product furthering the mission of the organization.</p>
|
||||
|
||||
<p>These organizations may link to our home page, to publications or to other Web site information so long as
|
||||
the link: (a) is not in any way misleading; (b) does not falsely imply sponsorship, endorsement or approval
|
||||
of the linking party and it products or services; and (c) fits within the context of the linking party's
|
||||
site.</p>
|
||||
|
||||
<p>If you are among the organizations listed in paragraph 2 above and are interested in linking to our website,
|
||||
you must notify us by raising an issue at https://github.com/manojVivek/responsively-app/issues.
|
||||
Please include your name, your organization name, contact information (such as a phone number and/or e-mail
|
||||
address) as well as the URL of your site, a list of any URLs from which you intend to link to our Web site,
|
||||
and a list of the URL(s) on our site to which you would like to link. Allow 2-3 weeks for a response.</p>
|
||||
|
||||
<p>Approved organizations may hyperlink to our Web site as follows:</p>
|
||||
|
||||
<ol>
|
||||
<li>By use of our corporate name; or</li>
|
||||
<li>By use of the uniform resource locator (Web address) being linked to; or</li>
|
||||
<li>By use of any other description of our Web site or material being linked to that makes sense within the
|
||||
context and format of content on the linking party's site.</li>
|
||||
</ol>
|
||||
<p>No use of Responsively App's logo or other artwork will be allowed for linking absent a trademark license
|
||||
agreement.</p>
|
||||
<h2>Iframes</h2>
|
||||
<p>Without prior approval and express written permission, you may not create frames around our Web pages or
|
||||
use other techniques that alter in any way the visual presentation or appearance of our Web site.</p>
|
||||
<h2>Reservation of Rights</h2>
|
||||
<p>We reserve the right at any time and in its sole discretion to request that you remove all links or any particular
|
||||
link to our Web site. You agree to immediately remove all links to our Web site upon such request. We also
|
||||
reserve the right to amend these terms and conditions and its linking policy at any time. By continuing
|
||||
to link to our Web site, you agree to be bound to and abide by these linking terms and conditions.</p>
|
||||
<h2>Removal of links from our website</h2>
|
||||
<p>If you find any link on our Web site or any linked web site objectionable for any reason, you may contact
|
||||
us about this. We will consider requests to remove links but will have no obligation to do so or to respond
|
||||
directly to you.</p>
|
||||
<p>Whilst we endeavour to ensure that the information on this website is correct, we do not warrant its completeness
|
||||
or accuracy; nor do we commit to ensuring that the website remains available or that the material on the
|
||||
website is kept up to date.</p>
|
||||
<h2>Content Liability</h2>
|
||||
<p>We shall have no responsibility or liability for any content appearing on your Web site. You agree to indemnify
|
||||
and defend us against all claims arising out of or based upon your Website. No link(s) may appear on any
|
||||
page on your Web site or within any context containing content or materials that may be interpreted as
|
||||
libelous, obscene or criminal, or which infringes, otherwise violates, or advocates the infringement or
|
||||
other violation of, any third party rights.</p>
|
||||
<h2>Disclaimer</h2>
|
||||
<p>To the maximum extent permitted by applicable law, we exclude all representations, warranties and conditions relating to our website and the use of this website (including, without limitation, any warranties implied by law in respect of satisfactory quality, fitness for purpose and/or the use of reasonable care and skill). Nothing in this disclaimer will:</p>
|
||||
<ol>
|
||||
<li>limit or exclude our or your liability for death or personal injury resulting from negligence;</li>
|
||||
<li>limit or exclude our or your liability for fraud or fraudulent misrepresentation;</li>
|
||||
<li>limit any of our or your liabilities in any way that is not permitted under applicable law; or</li>
|
||||
<li>exclude any of our or your liabilities that may not be excluded under applicable law.</li>
|
||||
</ol>
|
||||
<p>The limitations and exclusions of liability set out in this Section and elsewhere in this disclaimer: (a)
|
||||
are subject to the preceding paragraph; and (b) govern all liabilities arising under the disclaimer or
|
||||
in relation to the subject matter of this disclaimer, including liabilities arising in contract, in tort
|
||||
(including negligence) and for breach of statutory duty.</p>
|
||||
<p>To the extent that the website and the information and services on the website are provided free of charge,
|
||||
we will not be liable for any loss or damage of any nature.</p>
|
||||
<h2></h2>
|
||||
<p></p>
|
||||
<h2>Contact Information</h2>
|
||||
<p>If you have any questions about this Privacy Policy, please contact us by raising an issue at https://github.com/manojVivek/responsively-app/issues.</p>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<footer id="Contact-Us" class="pb-1 bg-primary-3 text-light">
|
||||
<div class="container">
|
||||
<div class="row mb-5">
|
||||
<div class="col">
|
||||
<div
|
||||
class="card card-body border-0 o-hidden mb-0 bg-primary text-light"
|
||||
>
|
||||
<div
|
||||
class="position-relative d-flex flex-column flex-md-row justify-content-between align-items-center"
|
||||
>
|
||||
<div class="h3 text-center mb-md-0">
|
||||
Start building beautiful websites
|
||||
</div>
|
||||
<a
|
||||
href="https://github.com/manojVivek/responsively-app/releases"
|
||||
target="_blank"
|
||||
class="btn btn-lg btn-white"
|
||||
>
|
||||
Download Now
|
||||
</a>
|
||||
<div
|
||||
class="d-block d-sm-block d-md-block d-lg-none flex-column flex-sm-row justify-content-center ml-sm-4 mt-4 mt-sm-0"
|
||||
>
|
||||
<a class="ml-lg-3" 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="Responsively - Develop responsive web-apps 5x faster! | Product Hunt Embed" style="width: 250px; height: 50px;" width="250px" height="50px" /></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="decoration layer-0">
|
||||
<img
|
||||
class="bg-primary-2"
|
||||
src="assets/img/decorations/deco-blob-1.svg"
|
||||
alt="deco-blob-1 decoration"
|
||||
data-inject-svg
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-content-center mb-2">
|
||||
<div class="col-auto">
|
||||
<ul class="nav">
|
||||
<li class="nav-item">
|
||||
<a href="https://twitter.com/ResponsivelyApp" class="nav-link" target="_blank">
|
||||
<img class="icon undefined" src="assets/img/icons/social/twitter.svg" alt="twitter social icon" data-inject-svg />
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="https://github.com/manojVivek/responsively-app" class="nav-link" target="_blank">
|
||||
<img class="icon undefined" src="assets/img/icons/social/github.svg" alt="github social icon" data-inject-svg />
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-content-center">
|
||||
<div class="col col-md-auto text-center">
|
||||
<small class="text-muted">©2020 Responsively App, All rights reserved and subject to the <a href="/privacy-policy.html">Privacy Policy</a> and <a href="/terms-and-conditions.html">Terms and Conditions</a>.
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- Required vendor scripts (Do not remove) -->
|
||||
<script type="text/javascript" src="assets/js/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="assets/js/popper.min.js"></script>
|
||||
<script type="text/javascript" src="assets/js/bootstrap.js"></script>
|
||||
|
||||
<!--
|
||||
Optional Vendor Scripts (Remove the plugin script here and comment initializer script out of index.js if site does not use that feature)
|
||||
-->
|
||||
|
||||
<!--
|
||||
AOS (Animate On Scroll - animates elements into view while scrolling down)
|
||||
-->
|
||||
<script type="text/javascript" src="assets/js/aos.js"></script>
|
||||
<!-- Clipboard (copies content from browser into OS clipboard) -->
|
||||
<script type="text/javascript" src="assets/js/clipboard.js"></script>
|
||||
<!-- Fancybox (handles image and video lightbox and galleries) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/jquery.fancybox.min.js"
|
||||
></script>
|
||||
<!-- Flatpickr (calendar/date/time picker UI) -->
|
||||
<script type="text/javascript" src="assets/js/flatpickr.min.js"></script>
|
||||
<!-- Flickity (handles touch enabled carousels and sliders) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/flickity.pkgd.min.js"
|
||||
></script>
|
||||
<!-- Ion rangeSlider (flexible and pretty range slider elements) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/ion.rangeSlider.min.js"
|
||||
></script>
|
||||
<!-- Isotope (masonry layouts and filtering) -->
|
||||
<script type="text/javascript" src="assets/js/isotope.pkgd.min.js"></script>
|
||||
<!-- jarallax (parallax effect and video backgrounds) -->
|
||||
<script type="text/javascript" src="assets/js/jarallax.min.js"></script>
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/jarallax-video.min.js"
|
||||
></script>
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/jarallax-element.min.js"
|
||||
></script>
|
||||
<!-- jQuery Countdown (displays countdown text to a specified date) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/jquery.countdown.min.js"
|
||||
></script>
|
||||
<!-- jQuery smartWizard facilitates steppable wizard content -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/jquery.smartWizard.min.js"
|
||||
></script>
|
||||
<!-- Plyr (unified player for Video, Audio, Vimeo and Youtube) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/plyr.polyfilled.min.js"
|
||||
></script>
|
||||
<!-- Prism (displays formatted code boxes) -->
|
||||
<script type="text/javascript" src="assets/js/prism.js"></script>
|
||||
<!--
|
||||
ScrollMonitor (manages events for elements scrolling in and out of view)
|
||||
-->
|
||||
<script type="text/javascript" src="assets/js/scrollMonitor.js"></script>
|
||||
<!-- Smooth scroll (animation to links in-page) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/smooth-scroll.polyfills.min.js"
|
||||
></script>
|
||||
<!--
|
||||
SVGInjector (replaces img tags with SVG code to allow easy inclusion of SVGs with the benefit of inheriting colors and styles)
|
||||
-->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/svg-injector.umd.production.js"
|
||||
></script>
|
||||
<!-- TwitterFetcher (displays a feed of tweets from a specified account) -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="assets/js/twitterFetcher_min.js"
|
||||
></script>
|
||||
<!-- Typed text (animated typing effect) -->
|
||||
<script type="text/javascript" src="assets/js/typed.min.js"></script>
|
||||
<!-- Required theme scripts (Do not remove) -->
|
||||
<script type="text/javascript" src="assets/js/theme.js"></script>
|
||||
<!-- Removes page load animation when window is finished loading -->
|
||||
<script type="text/javascript">
|
||||
window.addEventListener("load", function() {
|
||||
document.querySelector("body").classList.add("loaded");
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
var flkty = new Flickity(".controls-light", {
|
||||
autoPlay: true,
|
||||
imagesLoaded: true,
|
||||
wrapAround: true
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in a new issue