[mirotalk] - prettier code styling

This commit is contained in:
Miroslav Pejic
2021-07-12 23:33:49 +02:00
parent 14320c1317
commit f996cb7c48
20 changed files with 7697 additions and 8121 deletions
+7
View File
@@ -0,0 +1,7 @@
module.exports = {
semi: true,
trailingComma: "all",
singleQuote: true,
printWidth: 120,
tabWidth: 4
};
+1
View File
@@ -145,6 +145,7 @@ curl -X POST "http://localhost:3000/api/v1/meeting" -H "authorization: mirotalk_
curl -X POST "https://mirotalk.up.railway.app/api/v1/meeting" -H "authorization: mirotalk_default_secret" -H "Content-Type: application/json"
curl -X POST "https://mirotalk.herokuapp.com/api/v1/meeting" -H "authorization: mirotalk_default_secret" -H "Content-Type: application/json"
```
## API Documentation
The API documentation uses [swagger](https://swagger.io/) at http://localhost:3000/api/v1/docs. Or check it out on [railway](https://mirotalk.up.railway.app/api/v1/docs) & [heroku](https://mirotalk.herokuapp.com/api/v1/docs).
+7 -6
View File
@@ -1,4 +1,5 @@
[![restAPI](restAPI.png)](https://mirotalk.up.railway.app/api/v1/docs)
## Create a meeting
Create a meeting with a `HTTP request` containing the `API_KEY` sent to MiroTalks server. The response contains a `meeting` URL that can be `embedded` in your client within an `iframe`.
@@ -20,9 +21,9 @@ Embedding a meeting into a `service` or `app` requires using an `iframe` with th
```html
<iframe
allow="camera; microphone; fullscreen; display-capture; autoplay"
src="https://mirotalk.up.railway.app/join/room_name"
style="height: 100%; width: 100%; border: 0px;"
allow="camera; microphone; fullscreen; display-capture; autoplay"
src="https://mirotalk.up.railway.app/join/room_name"
style="height: 100%; width: 100%; border: 0px;"
></iframe>
```
@@ -32,8 +33,8 @@ Develop your `website` or `application`, and bring `video meetings` in with a si
```html
<iframe
allow="camera; microphone; fullscreen; display-capture; autoplay"
src="https://mirotalk.up.railway.app/newcall"
style="height: 100%; width: 100%; border: 0px;"
allow="camera; microphone; fullscreen; display-capture; autoplay"
src="https://mirotalk.up.railway.app/newcall"
style="height: 100%; width: 100%; border: 0px;"
></iframe>
```
+13 -13
View File
@@ -1,22 +1,22 @@
const fetch = require("node-fetch");
const fetch = require('node-fetch');
const API_KEY = "mirotalk_default_secret";
const API_KEY = 'mirotalk_default_secret';
// const MIROTALK_URL = "http://localhost:3000/api/v1/meeting";
// const MIROTALK_URL = "https://mirotalk.herokuapp.com/api/v1/meeting";
const MIROTALK_URL = "https://mirotalk.up.railway.app/api/v1/meeting";
const MIROTALK_URL = 'https://mirotalk.up.railway.app/api/v1/meeting';
function getResponse() {
return fetch(MIROTALK_URL, {
method: "POST",
headers: {
authorization: API_KEY,
"Content-Type": "application/json",
},
});
return fetch(MIROTALK_URL, {
method: 'POST',
headers: {
authorization: API_KEY,
'Content-Type': 'application/json',
},
});
}
getResponse().then(async (res) => {
console.log("Status code:", res.status);
const data = await res.json();
console.log("meeting:", data.meeting);
console.log('Status code:', res.status);
const data = await res.json();
console.log('meeting:', data.meeting);
});
+35 -35
View File
@@ -1,47 +1,47 @@
swagger: "2.0"
swagger: '2.0'
info:
title: MiroTalk API
description: API description for external applications that integrates with MiroTalk.
version: 1.0.0
title: MiroTalk API
description: API description for external applications that integrates with MiroTalk.
version: 1.0.0
basePath: /api/v1
schemes:
- https
- http
- https
- http
paths:
/meeting:
post:
tags:
- "meeting"
summary: "Create meeting"
description: "Create meeting"
consumes:
- "application/json"
produces:
- "application/json"
security:
- secretApiKey: []
responses:
"200":
description: "Meeting created"
schema:
$ref: "#/definitions/MeetingResponse"
"403":
description: "Unauthorized!"
/meeting:
post:
tags:
- 'meeting'
summary: 'Create meeting'
description: 'Create meeting'
consumes:
- 'application/json'
produces:
- 'application/json'
security:
- secretApiKey: []
responses:
'200':
description: 'Meeting created'
schema:
$ref: '#/definitions/MeetingResponse'
'403':
description: 'Unauthorized!'
securityDefinitions:
secretApiKey:
type: "apiKey"
name: "authorization"
in: "header"
description: "Format like this: authorization: {API_KEY_SECRET}"
secretApiKey:
type: 'apiKey'
name: 'authorization'
in: 'header'
description: 'Format like this: authorization: {API_KEY_SECRET}'
definitions:
MeetingResponse:
type: "object"
properties:
meeting:
type: "string"
MeetingResponse:
type: 'object'
properties:
meeting:
type: 'string'
+13 -13
View File
@@ -1,18 +1,18 @@
version: '3'
services:
mirotalk:
image: mirotalk:latest
build:
context: .
dockerfile: Dockerfile
container_name: mirotalk
hostname: mirotalk
volumes:
- .env:/usr/src/app/.env:ro
restart: unless-stopped
ports:
- "3000:3000"
mirotalk:
image: mirotalk:latest
build:
context: .
dockerfile: Dockerfile
container_name: mirotalk
hostname: mirotalk
volumes:
- .env:/usr/src/app/.env:ro
restart: unless-stopped
ports:
- '3000:3000'
# Uncomment below, remove "ports:" section above and configure labels as
# needed for LetsEncrypt TLS certificates with Traefik.
# See https://doc.traefik.io/traefik/user-guides/docker-compose/basic-example/
@@ -23,4 +23,4 @@ services:
# - "traefik.http.routers.mirotalk.rule=Host(`mirotalk.example.com`)"
# - "traefik.http.routers.mirotalk.entrypoints=websecure"
# - "traefik.http.routers.mirotalk.tls.certresolver=myresolver"
# - "traefik.http.services.mirotalk.loadbalancer.server.port=3000"
# - "traefik.http.services.mirotalk.loadbalancer.server.port=3000"
+28 -27
View File
@@ -1,29 +1,30 @@
{
"name": "mirotalk",
"version": "1.0.0",
"description": "A free WebRTC browser-based video call",
"main": "server.js",
"scripts": {
"start": "node server.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/miroslavpejic85/mirotalk"
},
"author": "Miroslav Pejic",
"license": "AGPL-3.0",
"homepage": "https://github.com/miroslavpejic85/mirotalk",
"dependencies": {
"compression": "^1.7.4",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"ngrok": "^4.0.1",
"socket.io": "^4.1.2",
"swagger-ui-express": "^4.1.6",
"yamljs": "^0.3.0"
},
"devDependencies": {
"node-fetch": "^2.6.1"
}
"name": "mirotalk",
"version": "1.0.0",
"description": "A free WebRTC browser-based video call",
"main": "server.js",
"scripts": {
"start": "node server.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/miroslavpejic85/mirotalk"
},
"author": "Miroslav Pejic",
"license": "AGPL-3.0",
"homepage": "https://github.com/miroslavpejic85/mirotalk",
"dependencies": {
"compression": "^1.7.4",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"ngrok": "^4.0.1",
"socket.io": "^4.1.2",
"swagger-ui-express": "^4.1.6",
"yamljs": "^0.3.0"
},
"devDependencies": {
"node-fetch": "^2.6.1",
"prettier": "2.3.2"
}
}
+483 -526
View File
File diff suppressed because it is too large Load Diff
+335 -377
View File
@@ -1,418 +1,376 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>MiroTalk WebRTC Video call, Chat Room & Screen Sharing.</title>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script
async
src="https://www.googletagmanager.com/gtag/js?id=G-3XM60XK9RQ"
></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-3XM60XK9RQ"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag("config", "G-3XM60XK9RQ");
</script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta
name="viewport"
content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
/>
<meta
name="description"
content="MiroTalk powered by WebRTC, Real-time Simple Secure Fast video calls, chat and screen sharing capabilities in the browser, from your mobile or desktop."
/>
<meta
name="keywords"
content="webrtc, webrtc stun, webrtc turn, video meeting, video chat, multi video chat, peer to peer, p2p, zoom"
/>
<!-- https://ogp.me -->
<meta property="og:type" content="app-webrtc" />
<meta property="og:site_name" content="MiroTalk" />
<meta property="og:title" content="Click the link to join this call." />
<meta
property="og:description"
content="Free WebRTC browser-based video call."
/>
<meta property="og:image" content="/images/mirotalk.png" />
<meta property="og:url" content="https://mirotalk.herokuapp.com/" />
<link
rel="icon"
type="image/png"
sizes="32x32"
href="/images/favicon.png"
/>
<!-- mirotalk css -->
<link rel="stylesheet" href="/css/client.css" />
<!-- whiteboard css -->
<link rel="stylesheet" href="/css/whiteboard.css" />
<!-- https://animate.style 4 swal fadeIn-Out -->
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"
/>
</head>
gtag('config', 'G-3XM60XK9RQ');
</script>
<title>MiroTalk WebRTC Video call, Chat Room & Screen Sharing.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta
name="viewport"
content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
/>
<meta
name="description"
content="MiroTalk powered by WebRTC, Real-time Simple Secure Fast video calls, chat and screen sharing capabilities in the browser, from your mobile or desktop."
/>
<meta
name="keywords"
content="webrtc, webrtc stun, webrtc turn, video meeting, video chat, multi video chat, peer to peer, p2p, zoom"
/>
<!-- https://ogp.me -->
<meta property="og:type" content="app-webrtc" />
<meta property="og:site_name" content="MiroTalk" />
<meta property="og:title" content="Click the link to join this call." />
<meta property="og:description" content="Free WebRTC browser-based video call." />
<meta property="og:image" content="/images/mirotalk.png" />
<meta property="og:url" content="https://mirotalk.herokuapp.com/" />
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon.png" />
<!-- mirotalk css -->
<link rel="stylesheet" href="/css/client.css" />
<!-- whiteboard css -->
<link rel="stylesheet" href="/css/whiteboard.css" />
<!-- https://animate.style 4 swal fadeIn-Out -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" />
</head>
<body onload="initPeer()">
<!-- just 4SEO Optimization -->
<div id="webRTCSeo"><h1>WebRTC</h1></div>
<body onload="initPeer()">
<!-- just 4SEO Optimization -->
<div id="webRTCSeo"><h1>WebRTC</h1></div>
<!-- show this before to join -->
<div id="loadingDiv">
<h1 class="pulsate">Loading...</h1>
<pre>
<!-- show this before to join -->
<div id="loadingDiv">
<h1 class="pulsate">Loading...</h1>
<pre>
Please allow camera & microphone
access to use this app.
</pre>
</div>
</pre>
</div>
<!-- Start left buttons
<!-- Start left buttons
https://fontawesome.com/icons?d=gallery
-->
<div id="leftButtons">
<button id="shareRoomBtn" class="fas fa-users"></button>
<button id="audioBtn" class="fas fa-microphone"></button>
<button id="videoBtn" class="fas fa-video"></button>
<button id="swapCameraBtn" class="fas fa-sync-alt"></button>
<button id="screenShareBtn" class="fas fa-desktop"></button>
<button id="recordStreamBtn" class="fas fa-record-vinyl"></button>
<button id="fullScreenBtn" class="fas fa-expand-alt"></button>
<button id="chatRoomBtn" class="fas fa-comment"></button>
<button id="myHandBtn" class="fas fa-hand-paper"></button>
<button id="whiteboardBtn" class="fas fa-chalkboard-teacher"></button>
<button id="fileShareBtn" class="fas fa-folder-open"></button>
<button id="mySettingsBtn" class="fas fa-cogs"></button>
<button id="aboutBtn" class="fas fa-question"></button>
<button id="leaveRoomBtn" class="fas fa-phone-slash"></button>
</div>
<!-- End left buttons -->
<div id="leftButtons">
<button id="shareRoomBtn" class="fas fa-users"></button>
<button id="audioBtn" class="fas fa-microphone"></button>
<button id="videoBtn" class="fas fa-video"></button>
<button id="swapCameraBtn" class="fas fa-sync-alt"></button>
<button id="screenShareBtn" class="fas fa-desktop"></button>
<button id="recordStreamBtn" class="fas fa-record-vinyl"></button>
<button id="fullScreenBtn" class="fas fa-expand-alt"></button>
<button id="chatRoomBtn" class="fas fa-comment"></button>
<button id="myHandBtn" class="fas fa-hand-paper"></button>
<button id="whiteboardBtn" class="fas fa-chalkboard-teacher"></button>
<button id="fileShareBtn" class="fas fa-folder-open"></button>
<button id="mySettingsBtn" class="fas fa-cogs"></button>
<button id="aboutBtn" class="fas fa-question"></button>
<button id="leaveRoomBtn" class="fas fa-phone-slash"></button>
</div>
<!-- End left buttons -->
<!-- Start chat room
<!-- Start chat room
https://codepen.io/sajadhsm/pen/odaBdd
https://getemoji.com
-->
<section id="msgerDraggable" class="msger-draggable">
<section id="msger" class="msger">
<header id="msgerHeader" class="msger-header">
<div class="msger-header-title">
<i class="fas fa-comment-alt"></i> Chat
</div>
<div class="msger-header-options">
<button id="msgerTheme" class="fas fa-ghost"></button>
<button id="msgerCPBtn" class="fas fa-users"></button>
<button id="msgerClean" class="fas fa-trash"></button>
<button id="msgerSaveBtn" class="fas fa-save"></button>
<button id="msgerClose" class="fas fa-times"></button>
</div>
</header>
<section id="msgerDraggable" class="msger-draggable">
<section id="msger" class="msger">
<header id="msgerHeader" class="msger-header">
<div class="msger-header-title"><i class="fas fa-comment-alt"></i> Chat</div>
<div class="msger-header-options">
<button id="msgerTheme" class="fas fa-ghost"></button>
<button id="msgerCPBtn" class="fas fa-users"></button>
<button id="msgerClean" class="fas fa-trash"></button>
<button id="msgerSaveBtn" class="fas fa-save"></button>
<button id="msgerClose" class="fas fa-times"></button>
</div>
</header>
<!-- public messages example -->
<main id="msgerChat" class="msger-chat">
<div class="msg left-msg">
<div
class="msg-img"
style="
background-image: url('https://eu.ui-avatars.com/api?name=Friends Name&size=24&background=random&rounded=true');
"
></div>
<!-- public messages example -->
<main id="msgerChat" class="msger-chat">
<div class="msg left-msg">
<div
class="msg-img"
style="
background-image: url('https://eu.ui-avatars.com/api?name=Friends Name&size=24&background=random&rounded=true');
"
></div>
<div class="msg-bubble">
<div class="msg-info">
<div class="msg-info-name">Friends Name</div>
<div class="msg-info-time">00:00:00</div>
</div>
<div class="msg-bubble">
<div class="msg-info">
<div class="msg-info-name">Friends Name</div>
<div class="msg-info-time">00:00:00</div>
</div>
<div class="msg-text">Public message example</div>
</div>
</div>
<div class="msg-text">Public message example</div>
</div>
</div>
<div class="msg right-msg">
<div
class="msg-img"
style="
background-image: url('https://eu.ui-avatars.com/api?name=Your Name&size=24&background=random&rounded=true');
"
></div>
<div class="msg right-msg">
<div
class="msg-img"
style="
background-image: url('https://eu.ui-avatars.com/api?name=Your Name&size=24&background=random&rounded=true');
"
></div>
<div class="msg-bubble">
<div class="msg-info">
<div class="msg-info-name">Your Name</div>
<div class="msg-info-time">00:00:00</div>
</div>
<div class="msg-bubble">
<div class="msg-info">
<div class="msg-info-name">Your Name</div>
<div class="msg-info-time">00:00:00</div>
</div>
<div class="msg-text">Public message example</div>
</div>
</div>
<div class="msg-text">Public message example</div>
</div>
</div>
<!-- private message example -->
<div class="msg left-msg">
<div
class="msg-img"
style="
background-image: url('https://eu.ui-avatars.com/api?name=Friends Name&size=24&background=random&rounded=true');
"
></div>
<!-- private message example -->
<div class="msg left-msg">
<div
class="msg-img"
style="
background-image: url('https://eu.ui-avatars.com/api?name=Friends Name&size=24&background=random&rounded=true');
"
></div>
<div class="private-msg-bubble">
<div class="msg-info">
<div class="msg-info-name">Friends Name</div>
<div class="msg-info-time">00:00:00</div>
</div>
<div class="private-msg-bubble">
<div class="msg-info">
<div class="msg-info-name">Friends Name</div>
<div class="msg-info-time">00:00:00</div>
</div>
<div class="msg-text">Private message example</div>
</div>
</div>
<div class="msg-text">Private message example</div>
</div>
</div>
<div class="msg right-msg">
<div
class="msg-img"
style="
background-image: url('https://eu.ui-avatars.com/api?name=Your Name&size=24&background=random&rounded=true');
"
></div>
<div class="msg right-msg">
<div
class="msg-img"
style="
background-image: url('https://eu.ui-avatars.com/api?name=Your Name&size=24&background=random&rounded=true');
"
></div>
<div class="private-msg-bubble">
<div class="msg-info">
<div class="msg-info-name">Your Name</div>
<div class="msg-info-time">00:00:00</div>
</div>
<div class="private-msg-bubble">
<div class="msg-info">
<div class="msg-info-name">Your Name</div>
<div class="msg-info-time">00:00:00</div>
</div>
<div class="msg-text">Private message example</div>
</div>
</div>
</main>
<div class="msg-text">Private message example</div>
</div>
</div>
</main>
<div class="msger-inputarea">
<input
id="msgerInput"
class="msger-input"
type="text"
placeholder="Enter your message..."
/>
<button id="msgerEmojiBtn" class="fas fa-smile"></button>
<button id="msgerSendBtn" class="fas fa-paper-plane"></button>
</div>
</section>
<div class="msger-inputarea">
<input id="msgerInput" class="msger-input" type="text" placeholder="Enter your message..." />
<button id="msgerEmojiBtn" class="fas fa-smile"></button>
<button id="msgerSendBtn" class="fas fa-paper-plane"></button>
</div>
</section>
<!-- Start private msg -->
<section id="msgerCP">
<section id="msgerCPSec" class="msger">
<header id="msgerCPHeader" class="msger-private-header">
<div class="msger-header-title">
<i class="fas fa-comment-alt"></i> Send Private messages
</div>
<div class="msger-header-options">
<button id="msgerCPCloseBtn" class="fas fa-times"></button>
</div>
</header>
<main id="msgerCPChat" class="msger-chat">
<div class="search-container">
<input
id="searchPeerBarName"
type="text"
placeholder="Search peer by name..."
name="search"
onkeyup="searchPeer()"
/>
</div>
<div id="msgerCPList"></div>
</main>
<!-- Start private msg -->
<section id="msgerCP">
<section id="msgerCPSec" class="msger">
<header id="msgerCPHeader" class="msger-private-header">
<div class="msger-header-title"><i class="fas fa-comment-alt"></i> Send Private messages</div>
<div class="msger-header-options">
<button id="msgerCPCloseBtn" class="fas fa-times"></button>
</div>
</header>
<main id="msgerCPChat" class="msger-chat">
<div class="search-container">
<input
id="searchPeerBarName"
type="text"
placeholder="Search peer by name..."
name="search"
onkeyup="searchPeer()"
/>
</div>
<div id="msgerCPList"></div>
</main>
</section>
</section>
<!-- End private msg -->
</section>
</section>
<!-- End private msg -->
</section>
<!-- End chat room -->
<!-- End chat room -->
<!-- Start emoji picker
<!-- Start emoji picker
https://github.com/nolanlawson/emoji-picker-element ]
-->
<section id="msgerEmojiPicker">
<header id="msgerEmojiHeader">
<button id="msgerCloseEmojiBtn" class="fas fa-times"></button>
</header>
<emoji-picker class="dark"></emoji-picker>
<!-- <emoji-picker class="light"></emoji-picker> -->
</section>
<!-- End emoji picker -->
<section id="msgerEmojiPicker">
<header id="msgerEmojiHeader">
<button id="msgerCloseEmojiBtn" class="fas fa-times"></button>
</header>
<emoji-picker class="dark"></emoji-picker>
<!-- <emoji-picker class="light"></emoji-picker> -->
</section>
<!-- End emoji picker -->
<!-- Start my settings -->
<section id="mySettings">
<header id="mySettingsHeader">
<button id="mySettingsCloseBtn" class="fas fa-times"></button>
</header>
<main>
<br />
<div class="tab">
<button id="tabDevicesBtn" class="tablinks">Devices</button>
<button id="tabBandwidthBtn" class="tablinks">Bandwidth</button>
<button id="tabRoomBtn" class="tablinks">Room</button>
<button id="tabThemeBtn" class="tablinks">Theme</button>
<!-- Start my settings -->
<section id="mySettings">
<header id="mySettingsHeader">
<button id="mySettingsCloseBtn" class="fas fa-times"></button>
</header>
<main>
<br />
<div class="tab">
<button id="tabDevicesBtn" class="tablinks">Devices</button>
<button id="tabBandwidthBtn" class="tablinks">Bandwidth</button>
<button id="tabRoomBtn" class="tablinks">Room</button>
<button id="tabThemeBtn" class="tablinks">Theme</button>
</div>
<div id="tabDevices" class="tabcontent">
<br />
<div>
<label for="videoSource">Camera</label><br />
<select id="videoSource"></select>
</div>
<br />
<div>
<label for="audioSource">Microphone</label><br />
<select id="audioSource"></select>
</div>
<br />
<div>
<label for="audioOutput">Speaker</label><br />
<select id="audioOutput"></select>
</div>
</div>
<div id="tabBandwidth" class="tabcontent">
<br />
<label for="videoQuality">Video quality</label>
<br />
<select id="videoQuality">
<option value="default">Default</option>
<option value="qvgaVideo">QVGA</option>
<option value="vgaVideo">VGA</option>
<option value="hdVideo">HD</option>
<option value="fhdVideo">FULL HD</option>
<option value="4kVideo">4K</option>
</select>
<br /><br />
<label for="videoFps">Camera fps</label>
<br />
<select id="videoFps">
<option value="30">30 fps</option>
<option value="25">25 fps</option>
<option value="20">20 fps</option>
<option value="15">15 fps</option>
<option value="10">10 fps</option>
<option value="5">5 fps</option>
</select>
<br /><br />
<label for="screenFps">Screen fps</label>
<br />
<select id="screenFps">
<option value="30">30 fps</option>
<option value="25">25 fps</option>
<option value="20">20 fps</option>
<option value="15">15 fps</option>
<option value="10">10 fps</option>
<option value="5">5 fps</option>
</select>
</div>
<div id="tabRoom" class="tabcontent">
<br />
<div>
<label>My name</label><br />
<input id="myPeerNameSet" type="text" placeholder="Change name..." />&nbsp;&nbsp;
<button id="myPeerNameSetBtn" class="fas fa-user-edit">Change</button>
</div>
<br />
<div>
<label>Participants</label><br />
<button id="muteEveryoneBtn" class="fas fa-microphone">Mute everyone</button>&nbsp;&nbsp;
<button id="hideEveryoneBtn" class="fas fa-video">Hide everyone</button>
<br /><br />
<label>Security</label><br />
<button id="lockUnlockRoomBtn" class="fas fa-lock-open"></button>
</div>
</div>
<div id="tabTheme" class="tabcontent">
<br />
<label for="mirotalkTheme">Select</label>
<br />
<select id="mirotalkTheme">
<option value="neon">🟣 MiroTalk - neon</option>
<option value="dark">⚫️ MiroTalk - dark</option>
<option value="forest">🟢 MiroTalk - forest</option>
<option value="sky">🔵 MiroTalk - sky</option>
<option value="ghost">⚪️ MiroTalk - ghost</option>
</select>
</div>
</main>
</section>
<!-- End my settings -->
<!-- Start whiteboard -->
<div class="whiteboard-cont">
<div class="colors-cont">
<button id="whiteboardCloseBtn" class="fas fa-times"></button>
<button id="whiteboardFsBtn" class="fas fa-expand-alt"></button>
<div>
<input type="color" id="whiteboardColorPicker" onchange="setColor(value)" />
</div>
<br />
<div class="white" onclick="setColor('#ffffff')"></div>
<div class="red" onclick="setColor('#e74c3c')"></div>
<div class="yellow" onclick="setColor('#f1c40f')"></div>
<div class="green" onclick="setColor('#badc58')"></div>
<div class="blue" onclick="setColor('#3498db')"></div>
<div class="orange" onclick="setColor('#e67e22')"></div>
<div class="purple" onclick="setColor('#9b59b6')"></div>
<div class="pink" onclick="setColor('#fd79a8')"></div>
<div class="brown" onclick="setColor('#834c32')"></div>
<div class="grey" onclick="setColor('#afadad')"></div>
<button id="whiteboardEraserBtn" class="fas fa-eraser"></button>
<button id="whiteboardSaveBtn" class="fas fa-save"></button>
<button id="whiteboardCleanBtn" class="fas fa-trash"></button>
</div>
<canvas id="whiteboard"></canvas>
</div>
<!-- End whiteboard -->
<div id="tabDevices" class="tabcontent">
<br />
<div>
<label for="videoSource">Camera</label><br />
<select id="videoSource"></select>
</div>
<br />
<div>
<label for="audioSource">Microphone</label><br />
<select id="audioSource"></select>
</div>
<br />
<div>
<label for="audioOutput">Speaker</label><br />
<select id="audioOutput"></select>
</div>
<!-- Start File Send -->
<div id="sendFileDiv">
<div id="sendFileInfo"></div>
<div id="sendFilePercentage"></div>
<progress id="sendProgress" max="0" value="0"></progress>
<button id="sendAbortBtn" class="fas fa-stop-circle">&nbsp;Abort</button>
</div>
<!-- End File Send -->
<div id="tabBandwidth" class="tabcontent">
<br />
<label for="videoQuality">Video quality</label>
<br />
<select id="videoQuality">
<option value="default">Default</option>
<option value="qvgaVideo">QVGA</option>
<option value="vgaVideo">VGA</option>
<option value="hdVideo">HD</option>
<option value="fhdVideo">FULL HD</option>
<option value="4kVideo">4K</option>
</select>
<br /><br />
<label for="videoFps">Camera fps</label>
<br />
<select id="videoFps">
<option value="30">30 fps</option>
<option value="25">25 fps</option>
<option value="20">20 fps</option>
<option value="15">15 fps</option>
<option value="10">10 fps</option>
<option value="5">5 fps</option>
</select>
<br /><br />
<label for="screenFps">Screen fps</label>
<br />
<select id="screenFps">
<option value="30">30 fps</option>
<option value="25">25 fps</option>
<option value="20">20 fps</option>
<option value="15">15 fps</option>
<option value="10">10 fps</option>
<option value="5">5 fps</option>
</select>
</div>
<!-- Js scripts -->
<script src="https://kit.fontawesome.com/d2f1016e6f.js" crossorigin="anonymous"></script>
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
<script src="https://cdn.rawgit.com/muaz-khan/DetectRTC/master/DetectRTC.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.16"></script>
<script type="module" src="https://unpkg.com/emoji-picker-element@1"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<script src="https://unpkg.com/@popperjs/core@2"></script>
<script src="https://unpkg.com/tippy.js@6"></script>
<script src="/socket.io/socket.io.js"></script>
<script src="/js/client.js"></script>
<!-- end of Js scripts -->
<div id="tabRoom" class="tabcontent">
<br />
<div>
<label>My name</label><br />
<input
id="myPeerNameSet"
type="text"
placeholder="Change name..."
/>&nbsp;&nbsp;
<button id="myPeerNameSetBtn" class="fas fa-user-edit">
Change
</button>
</div>
<br />
<div>
<label>Participants</label><br />
<button id="muteEveryoneBtn" class="fas fa-microphone">
Mute everyone</button
>&nbsp;&nbsp;
<button id="hideEveryoneBtn" class="fas fa-video">
Hide everyone
</button>
<br /><br />
<label>Security</label><br />
<button id="lockUnlockRoomBtn" class="fas fa-lock-open"></button>
</div>
</div>
<div id="tabTheme" class="tabcontent">
<br />
<label for="mirotalkTheme">Select</label>
<br />
<select id="mirotalkTheme">
<option value="neon">🟣 MiroTalk - neon</option>
<option value="dark">⚫️ MiroTalk - dark</option>
<option value="forest">🟢 MiroTalk - forest</option>
<option value="sky">🔵 MiroTalk - sky</option>
<option value="ghost">⚪️ MiroTalk - ghost</option>
</select>
</div>
</main>
</section>
<!-- End my settings -->
<!-- Start whiteboard -->
<div class="whiteboard-cont">
<div class="colors-cont">
<button id="whiteboardCloseBtn" class="fas fa-times"></button>
<button id="whiteboardFsBtn" class="fas fa-expand-alt"></button>
<div>
<input
type="color"
id="whiteboardColorPicker"
onchange="setColor(value)"
/>
</div>
<br />
<div class="white" onclick="setColor('#ffffff')"></div>
<div class="red" onclick="setColor('#e74c3c')"></div>
<div class="yellow" onclick="setColor('#f1c40f')"></div>
<div class="green" onclick="setColor('#badc58')"></div>
<div class="blue" onclick="setColor('#3498db')"></div>
<div class="orange" onclick="setColor('#e67e22')"></div>
<div class="purple" onclick="setColor('#9b59b6')"></div>
<div class="pink" onclick="setColor('#fd79a8')"></div>
<div class="brown" onclick="setColor('#834c32')"></div>
<div class="grey" onclick="setColor('#afadad')"></div>
<button id="whiteboardEraserBtn" class="fas fa-eraser"></button>
<button id="whiteboardSaveBtn" class="fas fa-save"></button>
<button id="whiteboardCleanBtn" class="fas fa-trash"></button>
</div>
<canvas id="whiteboard"></canvas>
</div>
<!-- End whiteboard -->
<!-- Start File Send -->
<div id="sendFileDiv">
<div id="sendFileInfo"></div>
<div id="sendFilePercentage"></div>
<progress id="sendProgress" max="0" value="0"></progress>
<button id="sendAbortBtn" class="fas fa-stop-circle">&nbsp;Abort</button>
</div>
<!-- End File Send -->
<!-- Js scripts -->
<script
src="https://kit.fontawesome.com/d2f1016e6f.js"
crossorigin="anonymous"
></script>
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
<script src="https://cdn.rawgit.com/muaz-khan/DetectRTC/master/DetectRTC.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.16"></script>
<script
type="module"
src="https://unpkg.com/emoji-picker-element@1"
></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<script src="https://unpkg.com/@popperjs/core@2"></script>
<script src="https://unpkg.com/tippy.js@6"></script>
<script src="/socket.io/socket.io.js"></script>
<script src="/js/client.js"></script>
<!-- end of Js scripts -->
<!--
<!--
the <video> and <audio> tags are all added and removed dynamically
in 'onAddStream', 'setupLocalMedia', and 'removePeer'/'disconnect'
--></body>
-->
</body>
</html>
+645 -645
View File
File diff suppressed because it is too large Load Diff
+1610 -1633
View File
File diff suppressed because it is too large Load Diff
+20 -20
View File
@@ -1,27 +1,27 @@
@media (max-width: 640px) {
.section:first-of-type {
min-height: 0;
}
.section:first-of-type {
min-height: 0;
}
section:first-of-type .hero-inner {
padding-top: 1rem;
padding-bottom: 0;
}
section:first-of-type .hero-inner {
padding-top: 1rem;
padding-bottom: 0;
}
section:first-of-type .hero-inner .split-item {
padding: 0;
}
section:first-of-type .hero-inner .split-item {
padding: 0;
}
section:nth-of-type(2) {
margin-top: 2rem;
}
section:nth-of-type(2) {
margin-top: 2rem;
}
section:nth-of-type(2) .section-inner {
padding-top: 1rem;
padding-bottom: 0.5rem;
}
section:nth-of-type(2) .section-inner {
padding-top: 1rem;
padding-bottom: 0.5rem;
}
section:nth-of-type(2) .section-inner .cta-slogan {
margin-bottom: 1rem;
}
section:nth-of-type(2) .section-inner .cta-slogan {
margin-bottom: 1rem;
}
}
+166 -167
View File
@@ -1,234 +1,233 @@
.whiteboard-cont {
z-index: 14;
display: none;
width: var(--wb-width);
height: var(--wb-height);
position: absolute;
/* center */
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/* fade in */
-webkit-animation: fadeIn ease-in 1;
-moz-animation: fadeIn ease-in 1;
animation: fadeIn ease-in 1;
-webkit-animation-fill-mode: forwards;
-moz-animation-fill-mode: forwards;
animation-fill-mode: forwards;
-webkit-animation-duration: 1s;
-moz-animation-duration: 1s;
animation-duration: 1s;
overflow: none;
box-shadow: var(--box-shadow);
border-radius: 5px;
z-index: 14;
display: none;
width: var(--wb-width);
height: var(--wb-height);
position: absolute;
/* center */
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/* fade in */
-webkit-animation: fadeIn ease-in 1;
-moz-animation: fadeIn ease-in 1;
animation: fadeIn ease-in 1;
-webkit-animation-fill-mode: forwards;
-moz-animation-fill-mode: forwards;
animation-fill-mode: forwards;
-webkit-animation-duration: 1s;
-moz-animation-duration: 1s;
animation-duration: 1s;
overflow: none;
box-shadow: var(--box-shadow);
border-radius: 5px;
}
.whiteboard-cont #whiteboard {
z-index: 99;
background-color: var(--wb-bg);
border-radius: 5px;
z-index: 99;
background-color: var(--wb-bg);
border-radius: 5px;
}
.whiteboard-cont .colors-cont {
position: absolute;
display: flex;
left: 0px;
top: 0px;
width: 100%;
background: var(--wb-hbg);
cursor: move;
border-radius: 5px;
position: absolute;
display: flex;
left: 0px;
top: 0px;
width: 100%;
background: var(--wb-hbg);
cursor: move;
border-radius: 5px;
}
.whiteboard-cont .colors-cont .white {
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #ffffff;
margin-top: 10px;
margin-left: 10px;
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #ffffff;
margin-top: 10px;
margin-left: 10px;
}
.whiteboard-cont .colors-cont .white:hover {
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
.whiteboard-cont .colors-cont .red {
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #e74c3c;
margin-top: 10px;
margin-left: 10px;
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #e74c3c;
margin-top: 10px;
margin-left: 10px;
}
.whiteboard-cont .colors-cont .red:hover {
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
.whiteboard-cont .colors-cont .yellow {
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #f1c40f;
margin-top: 10px;
margin-left: 10px;
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #f1c40f;
margin-top: 10px;
margin-left: 10px;
}
.whiteboard-cont .colors-cont .yellow:hover {
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
.whiteboard-cont .colors-cont .green {
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #badc58;
margin-top: 10px;
margin-left: 10px;
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #badc58;
margin-top: 10px;
margin-left: 10px;
}
.whiteboard-cont .colors-cont .green:hover {
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
.whiteboard-cont .colors-cont .orange {
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #e67e22;
margin-top: 10px;
margin-left: 10px;
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #e67e22;
margin-top: 10px;
margin-left: 10px;
}
.whiteboard-cont .colors-cont .orange:hover {
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
.whiteboard-cont .colors-cont .purple {
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #9b59b6;
margin-top: 10px;
margin-left: 10px;
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #9b59b6;
margin-top: 10px;
margin-left: 10px;
}
.whiteboard-cont .colors-cont .purple:hover {
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
.whiteboard-cont .colors-cont .blue {
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #3498db;
margin-top: 10px;
margin-left: 10px;
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #3498db;
margin-top: 10px;
margin-left: 10px;
}
.whiteboard-cont .colors-cont .blue:hover {
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
.whiteboard-cont .colors-cont .pink {
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #fd79a8;
margin-top: 10px;
margin-left: 10px;
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #fd79a8;
margin-top: 10px;
margin-left: 10px;
}
.whiteboard-cont .colors-cont .pink:hover {
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
.whiteboard-cont .colors-cont .brown {
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #834c32;
margin-top: 10px;
margin-left: 10px;
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #834c32;
margin-top: 10px;
margin-left: 10px;
}
.whiteboard-cont .colors-cont .brown:hover {
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
.whiteboard-cont .colors-cont .grey {
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #afadad;
margin-top: 10px;
margin-left: 10px;
height: 30px;
width: 30px;
border-radius: 50px;
background-color: #afadad;
margin-top: 10px;
margin-left: 10px;
}
.whiteboard-cont .colors-cont .grey:hover {
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
cursor: pointer;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
.whiteboard-cont button {
height: 30px;
width: 30px;
font-size: 1.2rem;
margin-top: 10px;
margin-left: 10px;
border: none;
color: white;
background: transparent;
height: 30px;
width: 30px;
font-size: 1.2rem;
margin-top: 10px;
margin-left: 10px;
border: none;
color: white;
background: transparent;
}
.whiteboard-cont button:hover {
color: rgb(0, 180, 50);
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
color: rgb(0, 180, 50);
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
#whiteboardColorPicker {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
padding: 0;
border: none;
width: 30px;
height: 30px;
margin-top: 10px;
margin-left: 10px;
margin-right: 15px;
border-radius: 50px;
border: solid 0.5px #afadad38;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
padding: 0;
border: none;
width: 30px;
height: 30px;
margin-top: 10px;
margin-left: 10px;
margin-right: 15px;
border-radius: 50px;
border: solid 0.5px #afadad38;
}
#whiteboardColorPicker:hover {
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
transform: var(--btns-hover-scale);
transition: all 0.3s ease-in-out;
}
#whiteboardColorPicker::-webkit-color-swatch {
border: none;
border-radius: 50px;
padding: 0;
border: none;
border-radius: 50px;
padding: 0;
}
#whiteboardColorPicker::-webkit-color-swatch-wrapper {
border: none;
border-radius: 50px;
padding: 0;
border: none;
border-radius: 50px;
padding: 0;
}
#whiteboardColorPicker::-moz-color-swatch {
border: none;
border-radius: 50px;
padding: 0;
border: none;
border-radius: 50px;
padding: 0;
}
#whiteboardColorPicker::-moz-color-swatch-wrapper {
border: none;
border-radius: 50px;
padding: 0;
border: none;
border-radius: 50px;
padding: 0;
}
#whiteboardColorPicker::color-swatch {
border: none;
border-radius: 50px;
padding: 0;
border: none;
border-radius: 50px;
padding: 0;
}
#whiteboardColorPicker::color-swatch-wrapper {
border: none;
border-radius: 50px;
padding: 0;
border: none;
border-radius: 50px;
padding: 0;
}
+3007 -3170
View File
File diff suppressed because it is too large Load Diff
+299 -331
View File
@@ -1,340 +1,308 @@
!(function () {
"use strict";
const e = document.getElementsByClassName("accordion-header");
'use strict';
const e = document.getElementsByClassName('accordion-header');
function t(e, t) {
e.classList.add("is-active"), (t.style.maxHeight = t.scrollHeight + "px");
}
function n(e, t) {
e.classList.remove("is-active"), (t.style.maxHeight = null);
}
if (e.length > 0)
for (let i = 0; i < e.length; i++) {
const s = e[i],
a = s.parentNode,
l = s.nextElementSibling;
a.classList.contains("is-active") && t(a, l),
s.addEventListener("click", function () {
a.classList.contains("is-active") ? n(a, l) : t(a, l);
});
function t(e, t) {
e.classList.add('is-active'), (t.style.maxHeight = t.scrollHeight + 'px');
}
})(),
(function () {
"use strict";
let e = {
touchStartX: 0,
touchEndX: 0,
minSwipePixels: 30,
detectionZone: void 0,
swipeCallback: function () {},
init: function (t, n) {
(e.swipeCallback = n),
t.addEventListener(
"touchstart",
function (t) {
e.touchStartX = t.changedTouches[0].screenX;
},
!1
),
t.addEventListener(
"touchend",
function (t) {
(e.touchEndX = t.changedTouches[0].screenX),
e.handleSwipeGesture();
},
!1
);
},
handleSwipeGesture: function () {
let t, n;
e.touchEndX <= e.touchStartX &&
((n = e.touchStartX - e.touchEndX), (t = "left")),
e.touchEndX >= e.touchStartX &&
((n = e.touchEndX - e.touchStartX), (t = "right")),
n > e.minSwipePixels && "undefined" !== t && e.swipe(t, n);
},
swipe: function (t, n) {
let i = {};
(i.direction = t), (i.movedPixels = n), e.swipeCallback(i);
},
};
const t = document.getElementsByClassName("carousel-items");
function n(e, t) {
void 0 === t && (t = "next");
let n = e.getElementsByClassName("carousel-item is-active")[0],
i = "next" === t ? n.nextElementSibling : n.previousElementSibling,
s = n.getAttribute("data-carousel"),
a = e.parentNode.getElementsByClassName("carousel-bullet")[s],
l = "next" === t ? a.nextElementSibling : a.previousElementSibling;
n.classList.remove("is-active"),
a.classList.remove("is-active"),
i
? (i.classList.add("is-active"), l.classList.add("is-active"))
: "next" === t
? (e.firstElementChild.classList.add("is-active"),
e.parentNode
.getElementsByClassName("carousel-bullets")[0]
.firstElementChild.classList.add("is-active"))
: (e.lastElementChild.classList.add("is-active"),
e.parentNode
.getElementsByClassName("carousel-bullets")[0]
.lastElementChild.classList.add("is-active"));
e.classList.remove('is-active'), (t.style.maxHeight = null);
}
function i(e, t) {
let n,
i = 0;
for (let e = 0; e < t.length; e++)
(t[0].parentNode.style.minHeight = i + "px"),
t[e].classList.add("is-loading"),
(n = t[e].offsetHeight),
t[e].classList.remove("is-loading"),
n > i && (i = n);
t[0].parentNode.style.minHeight = i + "px";
}
function s(e) {
e && clearInterval(e);
}
if (t.length > 0)
for (let a = 0; a < t.length; a++) {
let l = t[a],
c = l.getElementsByClassName("carousel-item"),
o = 0,
r = l.getAttribute("data-autorotate");
const d = document.createElement("div");
(d.className = "carousel-bullets"),
l.parentNode.insertBefore(d, l.nextSibling);
for (let e = 0; e < c.length; e++) {
c[e].setAttribute("data-carousel", e),
c[e].classList.contains("is-active") && (o = e);
let t = document.createElement("button");
(t.className = "carousel-bullet"),
t.setAttribute("data-bullet", e),
l.parentNode
.getElementsByClassName("carousel-bullets")[0]
.appendChild(t);
}
c[o].classList.add("is-active");
let u = l.parentNode.getElementsByClassName("carousel-bullet");
u[o].classList.add("is-active"),
i(0, c),
window.addEventListener("resize", function () {
i(0, c);
});
let m = !1;
r &&
(m = setInterval(function () {
n(l, "next");
}, r));
for (let e = 0; e < u.length; e++) {
let t = u[e];
t.addEventListener("click", function (e) {
if ((e.preventDefault(), t.classList.contains("is-active"))) return;
for (let e = 0; e < u.length; e++)
u[e].classList.remove("is-active");
for (let e = 0; e < c.length; e++)
c[e].classList.remove("is-active");
let n = this.getAttribute("data-bullet");
c[n].classList.add("is-active"),
this.classList.add("is-active"),
s(m);
});
}
e.init(l, function (e) {
"left" === e.direction
? n(l, "next")
: "right" === e.direction && n(l, "prev"),
s(m);
});
}
})(),
(function () {
"use strict";
document.documentElement.classList.remove("no-js"),
document.documentElement.classList.add("js"),
window.addEventListener("load", function () {
document.body.classList.add("is-loaded");
});
})(),
(function () {
"use strict";
const e = document.getElementById("header-nav-toggle"),
t = document.getElementById("header-nav");
e &&
(e.addEventListener("click", function () {
document.body.classList.toggle("off-nav-is-active"),
t.classList.toggle("is-active"),
t.style.maxHeight
? (t.style.maxHeight = null)
: (t.style.maxHeight = t.scrollHeight + "px"),
"true" === this.getAttribute("aria-expanded")
? this.setAttribute("aria-expanded", "false")
: this.setAttribute("aria-expanded", "true");
}),
document.addEventListener("click", function (n) {
n.target === t ||
n.target === e ||
t.contains(n.target) ||
(document.body.classList.remove("off-nav-is-active"),
t.classList.remove("is-active"),
(t.style.maxHeight = null),
e.setAttribute("aria-expanded", "false"));
}));
})(),
(function () {
"use strict";
const e = document.getElementsByClassName("modal"),
t = document.getElementsByClassName("modal-trigger");
function n() {
document.body.classList.remove("modal-is-active");
for (let t = 0; t < e.length; t++) e[t].classList.remove("is-active");
}
if (e.length > 0 && t.length > 0)
for (let e = 0; e < t.length; e++) {
let n = t[e],
i = document.getElementById(n.getAttribute("aria-controls"));
i &&
(n.hasAttribute("data-video") &&
(null !== i.querySelector("iframe")
? i
.querySelector("iframe")
.setAttribute("src", n.getAttribute("data-video"))
: null !== i.querySelector("video") &&
i
.querySelector("video")
.setAttribute("src", n.getAttribute("data-video"))),
n.addEventListener("click", function (e) {
let t;
e.preventDefault(),
n.hasAttribute("aria-controls") &&
(t = i) &&
(document.body.classList.add("modal-is-active"),
t.classList.add("is-active"));
}));
}
document.addEventListener("click", function (e) {
(e.target.classList.contains("modal") ||
e.target.classList.contains("modal-close-trigger")) &&
(e.preventDefault(), n());
}),
document.addEventListener("keydown", function (e) {
27 === (e || window.event).keyCode && n();
});
})(),
(function () {
"use strict";
const e = document.getElementById("pricing-toggle");
function t() {
const t = document.getElementsByClassName("pricing-switchable");
if (e.checked)
for (let e = 0; e < t.length; e++)
t[e].innerHTML = t[e].getAttribute("data-pricing-yearly");
else
for (let e = 0; e < t.length; e++)
t[e].innerHTML = t[e].getAttribute("data-pricing-monthly");
}
e && (window.addEventListener("load", t), e.addEventListener("change", t));
})(),
(function () {
"use strict";
const e = document.querySelectorAll("[class*=reveal-]");
let t = window.innerHeight;
function n(e, t) {
let n = 0;
return function () {
let i = new Date().getTime();
if (!(i - n < e)) return (n = i), t.apply(void 0, arguments);
};
}
function i() {
let n;
for (let i = 0; i < e.length; i++) {
let s = e[i],
a = s.getAttribute("data-reveal-delay"),
l = s.getAttribute("data-reveal-offset")
? s.getAttribute("data-reveal-offset")
: "200",
c = s.getAttribute("data-reveal-container")
? s.closest(s.getAttribute("data-reveal-container"))
: s;
(n = l),
c.getBoundingClientRect().top <= t - n &&
!s.classList.contains("is-revealed") &&
(a && 0 !== a
? setTimeout(function () {
s.classList.add("is-revealed");
}, a)
: s.classList.add("is-revealed"));
}
!(function () {
if (
e.length >
document.querySelectorAll("[class*=reveal-].is-revealed").length
)
return;
window.removeEventListener("load", i),
window.removeEventListener("scroll", s),
window.removeEventListener("resize", a);
})();
}
function s() {
n(30, i());
}
function a() {
(t = window.innerHeight), n(30, i());
}
e.length > 0 &&
document.body.classList.contains("has-animations") &&
(window.addEventListener("load", i),
window.addEventListener("scroll", s),
window.addEventListener("resize", a));
})(),
(function () {
"use strict";
const e = document.getElementsByClassName("smooth-scroll"),
t = (e, n, i, s, a) => {
const l = n - e;
let c = l / i;
const o = (function (e) {
return e < 0.5 ? 2 * e * e : (4 - 2 * e) * e - 1;
})((c = Math.min(c, 1)));
window.scroll(0, a + s * o),
l < i &&
window.requestAnimationFrame((n) => {
const l = n || new Date().getTime();
t(e, l, i, s, a);
});
};
if (e.length > 0)
for (let n = 0; n < e.length; n++) {
e[n].addEventListener("click", function (e) {
e.preventDefault();
const n = e.target.closest(".smooth-scroll"),
i = n.href.split("#")[1],
s = document.getElementById(i),
a = n.getAttribute("data-duration") || 1e3;
s &&
window.requestAnimationFrame((e) => {
const n = e || new Date().getTime(),
i = n,
l = window.pageYOffset,
c = s.getBoundingClientRect().top;
t(i, n, a, c, l);
for (let i = 0; i < e.length; i++) {
const s = e[i],
a = s.parentNode,
l = s.nextElementSibling;
a.classList.contains('is-active') && t(a, l),
s.addEventListener('click', function () {
a.classList.contains('is-active') ? n(a, l) : t(a, l);
});
}
})(),
(function () {
'use strict';
let e = {
touchStartX: 0,
touchEndX: 0,
minSwipePixels: 30,
detectionZone: void 0,
swipeCallback: function () {},
init: function (t, n) {
(e.swipeCallback = n),
t.addEventListener(
'touchstart',
function (t) {
e.touchStartX = t.changedTouches[0].screenX;
},
!1,
),
t.addEventListener(
'touchend',
function (t) {
(e.touchEndX = t.changedTouches[0].screenX), e.handleSwipeGesture();
},
!1,
);
},
handleSwipeGesture: function () {
let t, n;
e.touchEndX <= e.touchStartX && ((n = e.touchStartX - e.touchEndX), (t = 'left')),
e.touchEndX >= e.touchStartX && ((n = e.touchEndX - e.touchStartX), (t = 'right')),
n > e.minSwipePixels && 'undefined' !== t && e.swipe(t, n);
},
swipe: function (t, n) {
let i = {};
(i.direction = t), (i.movedPixels = n), e.swipeCallback(i);
},
};
const t = document.getElementsByClassName('carousel-items');
function n(e, t) {
void 0 === t && (t = 'next');
let n = e.getElementsByClassName('carousel-item is-active')[0],
i = 'next' === t ? n.nextElementSibling : n.previousElementSibling,
s = n.getAttribute('data-carousel'),
a = e.parentNode.getElementsByClassName('carousel-bullet')[s],
l = 'next' === t ? a.nextElementSibling : a.previousElementSibling;
n.classList.remove('is-active'),
a.classList.remove('is-active'),
i
? (i.classList.add('is-active'), l.classList.add('is-active'))
: 'next' === t
? (e.firstElementChild.classList.add('is-active'),
e.parentNode
.getElementsByClassName('carousel-bullets')[0]
.firstElementChild.classList.add('is-active'))
: (e.lastElementChild.classList.add('is-active'),
e.parentNode
.getElementsByClassName('carousel-bullets')[0]
.lastElementChild.classList.add('is-active'));
}
function i(e, t) {
let n,
i = 0;
for (let e = 0; e < t.length; e++)
(t[0].parentNode.style.minHeight = i + 'px'),
t[e].classList.add('is-loading'),
(n = t[e].offsetHeight),
t[e].classList.remove('is-loading'),
n > i && (i = n);
t[0].parentNode.style.minHeight = i + 'px';
}
function s(e) {
e && clearInterval(e);
}
if (t.length > 0)
for (let a = 0; a < t.length; a++) {
let l = t[a],
c = l.getElementsByClassName('carousel-item'),
o = 0,
r = l.getAttribute('data-autorotate');
const d = document.createElement('div');
(d.className = 'carousel-bullets'), l.parentNode.insertBefore(d, l.nextSibling);
for (let e = 0; e < c.length; e++) {
c[e].setAttribute('data-carousel', e), c[e].classList.contains('is-active') && (o = e);
let t = document.createElement('button');
(t.className = 'carousel-bullet'),
t.setAttribute('data-bullet', e),
l.parentNode.getElementsByClassName('carousel-bullets')[0].appendChild(t);
}
c[o].classList.add('is-active');
let u = l.parentNode.getElementsByClassName('carousel-bullet');
u[o].classList.add('is-active'),
i(0, c),
window.addEventListener('resize', function () {
i(0, c);
});
let m = !1;
r &&
(m = setInterval(function () {
n(l, 'next');
}, r));
for (let e = 0; e < u.length; e++) {
let t = u[e];
t.addEventListener('click', function (e) {
if ((e.preventDefault(), t.classList.contains('is-active'))) return;
for (let e = 0; e < u.length; e++) u[e].classList.remove('is-active');
for (let e = 0; e < c.length; e++) c[e].classList.remove('is-active');
let n = this.getAttribute('data-bullet');
c[n].classList.add('is-active'), this.classList.add('is-active'), s(m);
});
}
e.init(l, function (e) {
'left' === e.direction ? n(l, 'next') : 'right' === e.direction && n(l, 'prev'), s(m);
});
}
})(),
(function () {
'use strict';
document.documentElement.classList.remove('no-js'),
document.documentElement.classList.add('js'),
window.addEventListener('load', function () {
document.body.classList.add('is-loaded');
});
});
}
})();
})(),
(function () {
'use strict';
const e = document.getElementById('header-nav-toggle'),
t = document.getElementById('header-nav');
e &&
(e.addEventListener('click', function () {
document.body.classList.toggle('off-nav-is-active'),
t.classList.toggle('is-active'),
t.style.maxHeight ? (t.style.maxHeight = null) : (t.style.maxHeight = t.scrollHeight + 'px'),
'true' === this.getAttribute('aria-expanded')
? this.setAttribute('aria-expanded', 'false')
: this.setAttribute('aria-expanded', 'true');
}),
document.addEventListener('click', function (n) {
n.target === t ||
n.target === e ||
t.contains(n.target) ||
(document.body.classList.remove('off-nav-is-active'),
t.classList.remove('is-active'),
(t.style.maxHeight = null),
e.setAttribute('aria-expanded', 'false'));
}));
})(),
(function () {
'use strict';
const e = document.getElementsByClassName('modal'),
t = document.getElementsByClassName('modal-trigger');
function n() {
document.body.classList.remove('modal-is-active');
for (let t = 0; t < e.length; t++) e[t].classList.remove('is-active');
}
if (e.length > 0 && t.length > 0)
for (let e = 0; e < t.length; e++) {
let n = t[e],
i = document.getElementById(n.getAttribute('aria-controls'));
i &&
(n.hasAttribute('data-video') &&
(null !== i.querySelector('iframe')
? i.querySelector('iframe').setAttribute('src', n.getAttribute('data-video'))
: null !== i.querySelector('video') &&
i.querySelector('video').setAttribute('src', n.getAttribute('data-video'))),
n.addEventListener('click', function (e) {
let t;
e.preventDefault(),
n.hasAttribute('aria-controls') &&
(t = i) &&
(document.body.classList.add('modal-is-active'), t.classList.add('is-active'));
}));
}
document.addEventListener('click', function (e) {
(e.target.classList.contains('modal') || e.target.classList.contains('modal-close-trigger')) &&
(e.preventDefault(), n());
}),
document.addEventListener('keydown', function (e) {
27 === (e || window.event).keyCode && n();
});
})(),
(function () {
'use strict';
const e = document.getElementById('pricing-toggle');
function t() {
const t = document.getElementsByClassName('pricing-switchable');
if (e.checked) for (let e = 0; e < t.length; e++) t[e].innerHTML = t[e].getAttribute('data-pricing-yearly');
else for (let e = 0; e < t.length; e++) t[e].innerHTML = t[e].getAttribute('data-pricing-monthly');
}
e && (window.addEventListener('load', t), e.addEventListener('change', t));
})(),
(function () {
'use strict';
const e = document.querySelectorAll('[class*=reveal-]');
let t = window.innerHeight;
function n(e, t) {
let n = 0;
return function () {
let i = new Date().getTime();
if (!(i - n < e)) return (n = i), t.apply(void 0, arguments);
};
}
function i() {
let n;
for (let i = 0; i < e.length; i++) {
let s = e[i],
a = s.getAttribute('data-reveal-delay'),
l = s.getAttribute('data-reveal-offset') ? s.getAttribute('data-reveal-offset') : '200',
c = s.getAttribute('data-reveal-container')
? s.closest(s.getAttribute('data-reveal-container'))
: s;
(n = l),
c.getBoundingClientRect().top <= t - n &&
!s.classList.contains('is-revealed') &&
(a && 0 !== a
? setTimeout(function () {
s.classList.add('is-revealed');
}, a)
: s.classList.add('is-revealed'));
}
!(function () {
if (e.length > document.querySelectorAll('[class*=reveal-].is-revealed').length) return;
window.removeEventListener('load', i),
window.removeEventListener('scroll', s),
window.removeEventListener('resize', a);
})();
}
function s() {
n(30, i());
}
function a() {
(t = window.innerHeight), n(30, i());
}
e.length > 0 &&
document.body.classList.contains('has-animations') &&
(window.addEventListener('load', i),
window.addEventListener('scroll', s),
window.addEventListener('resize', a));
})(),
(function () {
'use strict';
const e = document.getElementsByClassName('smooth-scroll'),
t = (e, n, i, s, a) => {
const l = n - e;
let c = l / i;
const o = (function (e) {
return e < 0.5 ? 2 * e * e : (4 - 2 * e) * e - 1;
})((c = Math.min(c, 1)));
window.scroll(0, a + s * o),
l < i &&
window.requestAnimationFrame((n) => {
const l = n || new Date().getTime();
t(e, l, i, s, a);
});
};
if (e.length > 0)
for (let n = 0; n < e.length; n++) {
e[n].addEventListener('click', function (e) {
e.preventDefault();
const n = e.target.closest('.smooth-scroll'),
i = n.href.split('#')[1],
s = document.getElementById(i),
a = n.getAttribute('data-duration') || 1e3;
s &&
window.requestAnimationFrame((e) => {
const n = e || new Date().getTime(),
i = n,
l = window.pageYOffset,
c = s.getBoundingClientRect().top;
t(i, n, a, c, l);
});
});
}
})();
+126 -126
View File
@@ -1,130 +1,130 @@
let adjectives = [
"small",
"big",
"large",
"smelly",
"new",
"happy",
"shiny",
"old",
"clean",
"nice",
"bad",
"cool",
"hot",
"cold",
"warm",
"hungry",
"slow",
"fast",
"red",
"white",
"black",
"blue",
"green",
"basic",
"strong",
"cute",
"poor",
"nice",
"huge",
"rare",
"lucky",
"weak",
"tall",
"short",
"tiny",
"great",
"long",
"single",
"rich",
"young",
"dirty",
"fresh",
"brown",
"dark",
"crazy",
"sad",
"loud",
"brave",
"calm",
"silly",
"smart",
'small',
'big',
'large',
'smelly',
'new',
'happy',
'shiny',
'old',
'clean',
'nice',
'bad',
'cool',
'hot',
'cold',
'warm',
'hungry',
'slow',
'fast',
'red',
'white',
'black',
'blue',
'green',
'basic',
'strong',
'cute',
'poor',
'nice',
'huge',
'rare',
'lucky',
'weak',
'tall',
'short',
'tiny',
'great',
'long',
'single',
'rich',
'young',
'dirty',
'fresh',
'brown',
'dark',
'crazy',
'sad',
'loud',
'brave',
'calm',
'silly',
'smart',
];
let nouns = [
"dog",
"bat",
"wrench",
"apple",
"pear",
"ghost",
"cat",
"wolf",
"squid",
"goat",
"snail",
"hat",
"sock",
"plum",
"bear",
"snake",
"turtle",
"horse",
"spoon",
"fork",
"spider",
"tree",
"chair",
"table",
"couch",
"towel",
"panda",
"bread",
"grape",
"cake",
"brick",
"rat",
"mouse",
"bird",
"oven",
"phone",
"photo",
"frog",
"bear",
"camel",
"sheep",
"shark",
"tiger",
"zebra",
"duck",
"eagle",
"fish",
"kitten",
"lobster",
"monkey",
"owl",
"puppy",
"pig",
"rabbit",
"fox",
"whale",
"beaver",
"gorilla",
"lizard",
"parrot",
"sloth",
"swan",
'dog',
'bat',
'wrench',
'apple',
'pear',
'ghost',
'cat',
'wolf',
'squid',
'goat',
'snail',
'hat',
'sock',
'plum',
'bear',
'snake',
'turtle',
'horse',
'spoon',
'fork',
'spider',
'tree',
'chair',
'table',
'couch',
'towel',
'panda',
'bread',
'grape',
'cake',
'brick',
'rat',
'mouse',
'bird',
'oven',
'phone',
'photo',
'frog',
'bear',
'camel',
'sheep',
'shark',
'tiger',
'zebra',
'duck',
'eagle',
'fish',
'kitten',
'lobster',
'monkey',
'owl',
'puppy',
'pig',
'rabbit',
'fox',
'whale',
'beaver',
'gorilla',
'lizard',
'parrot',
'sloth',
'swan',
];
function getRandomNumber(length) {
let result = "";
let characters = "0123456789";
let charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
let result = '';
let characters = '0123456789';
let charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
let adjective = adjectives[Math.floor(Math.random() * adjectives.length)];
@@ -132,7 +132,7 @@ let noun = nouns[Math.floor(Math.random() * nouns.length)];
let num = getRandomNumber(5);
noun = noun.charAt(0).toUpperCase() + noun.substring(1);
adjective = adjective.charAt(0).toUpperCase() + adjective.substring(1);
document.getElementById("roomName").value = "";
document.getElementById('roomName').value = '';
// Typing Effect
@@ -143,9 +143,9 @@ let speed = 100;
typeWriter();
function typeWriter() {
if (i < txt.length) {
document.getElementById("roomName").value += txt.charAt(i);
i++;
setTimeout(typeWriter, speed);
}
if (i < txt.length) {
document.getElementById('roomName').value += txt.charAt(i);
i++;
setTimeout(typeWriter, speed);
}
}
+435 -477
View File
@@ -1,482 +1,440 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script
async
src="https://www.googletagmanager.com/gtag/js?id=G-3XM60XK9RQ"
></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-3XM60XK9RQ"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag("config", "G-3XM60XK9RQ");
</script>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>MiroTalk a Free Secure Video Calls, Chat & Screen Sharing.</title>
<link rel="stylesheet" href="css/landing.css" />
<link rel="shortcut icon" href="images/logo.svg" />
<meta
name="description"
content="MiroTalk powered by WebRTC, Real-time Simple Secure Fast video calls, chat and screen sharing capabilities in the browser, from your mobile or desktop."
/>
<meta
name="keywords"
content="webrtc, real-time communications, webrtc stun, webrtc turn, video meeting, video chat, video conference, multi video chat, multi video conference, peer to peer, p2p, zoom"
/>
<!-- https://ogp.me -->
<meta property="og:type" content="app-webrtc" />
<meta property="og:site_name" content="MiroTalk" />
<meta property="og:title" content="Click the link to make a call." />
<meta
property="og:description"
content="MiroTalk calling provides real-time HD quality and latency simply
not available with traditional technology."
/>
<meta property="og:image" content="/images/preview.png" />
<meta property="og:url" content="https://mirotalk.herokuapp.com/" />
</head>
<body class="has-animations">
<div class="body-wrap">
<header class="site-header reveal-from-top">
<div class="container">
<div class="site-header-inner">
<div class="brand">
<h1 class="m-0">
<a href="/"
><img src="images/logo.svg" alt="Neon" width="32" height="32"
/></a>
</h1>
</div>
</div>
gtag('config', 'G-3XM60XK9RQ');
</script>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>MiroTalk a Free Secure Video Calls, Chat & Screen Sharing.</title>
<link rel="stylesheet" href="css/landing.css" />
<link rel="shortcut icon" href="images/logo.svg" />
<meta
name="description"
content="MiroTalk powered by WebRTC, Real-time Simple Secure Fast video calls, chat and screen sharing capabilities in the browser, from your mobile or desktop."
/>
<meta
name="keywords"
content="webrtc, real-time communications, webrtc stun, webrtc turn, video meeting, video chat, video conference, multi video chat, multi video conference, peer to peer, p2p, zoom"
/>
<!-- https://ogp.me -->
<meta property="og:type" content="app-webrtc" />
<meta property="og:site_name" content="MiroTalk" />
<meta property="og:title" content="Click the link to make a call." />
<meta
property="og:description"
content="MiroTalk calling provides real-time HD quality and latency simply not available with traditional technology."
/>
<meta property="og:image" content="/images/preview.png" />
<meta property="og:url" content="https://mirotalk.herokuapp.com/" />
</head>
<body class="has-animations">
<div class="body-wrap">
<header class="site-header reveal-from-top">
<div class="container">
<div class="site-header-inner">
<div class="brand">
<h1 class="m-0">
<a href="/"><img src="images/logo.svg" alt="Neon" width="32" height="32" /></a>
</h1>
</div>
</div>
</div>
</header>
<main class="site-content">
<section class="hero section illustration-section-01">
<div class="container">
<div class="hero-inner section-inner">
<div class="split-wrap invert-mobile">
<div class="split-item">
<div class="hero-content split-item-content center-content-mobile">
<h1 class="mt-0 mb-16 reveal-from-bottom" data-reveal-delay="150">
MiroTalk<br />Free browser based real-time video calls.<br />
Simple, Secure, Fast.
</h1>
<p class="mt-0 mb-32 reveal-from-bottom" data-reveal-delay="300">
Start your next video call with a single click. No download, plug-in or
login required. Just get straight to talking, messaging and sharing your
screen.
</p>
<div class="reveal-from-bottom" data-reveal-delay="450">
<a
class="button button-primary button-wide-mobile pulse"
style="
border: 0;
background: linear-gradient(
100deg,
#376df9 0,
#ff5fa0 75%,
#ffc55a 100%
);
"
href="/newcall"
>Try now</a
>
</div>
</div>
<style>
@media (min-width: 641px) {
.hero .split-wrap .split-item {
min-height: 492px;
}
}
</style>
</div>
</div>
</div>
</div>
</section>
<section class="features-tiles section center-content">
<div class="container">
<div class="features-tiles-inner section-inner has-top-divider">
<div class="section-header">
<div class="container-xs reveal-from-bottom" data-reveal-delay="650">
<h2 class="mt-0 mb-16">
Unlimited number of conference rooms without call time limitation
</h2>
<p class="m-0">
MiroTalk is built radically different. We left behind slow bulky servers, opting
for peer to peer calling. We engineered a platform with maximum video quality
lowest latency that makes your calls crystal clear.
</p>
</div>
</div>
<div class="tiles-wrap">
<div class="tiles-item reveal-from-right">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-02.svg"
alt="Screen Sharing"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Screen Sharing</h4>
<p class="m-0 text-sm">
Share your screen, application window, present your documents, slides
and more.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-left">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-04.svg"
alt="WebCam Streaming"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">WebCam Streaming</h4>
<p class="m-0 text-sm">
Having the webcam on, allows participants to make a deeper connection
with you. Up to 4k resolution.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-right">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-01.svg"
alt="Chat Room"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Chat Room</h4>
<p class="m-0 text-sm">
Chat with others in meeting, either public chat or private, save the
meeting messages. Integrated emoji picker to show your feeling.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-left">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-03.svg"
alt="Meeting Recording"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Meeting Recording</h4>
<p class="m-0 text-sm">
Record your Screen, WebCam and Audio. Save it for use it in future or to
share with others.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-right">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-06.svg"
alt="Interactive Whiteboard"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Interactive Whiteboard</h4>
<p class="m-0 text-sm">
Simple collaborative whiteboard to draw and explain your concepts to the
other participants in the meeting.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-left">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-02.svg"
alt="File Sharing"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">File Sharing</h4>
<p class="m-0 text-sm">
Share any types of files to all participants in the meeting, in total
security, thanks to Datagram Transport Layer Security (DTLS).
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-right">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-05.svg"
alt="Total Privacy"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Total Privacy</h4>
<p class="m-0 text-sm">
Data stays between you and your participants. MiroTalk don't collect or
share personal information. It's built for privacy first.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-left">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-05.svg"
alt="Maximum Security"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Maximum Security</h4>
<p class="m-0 text-sm">
End to end state of the art encryption means your participants are
exactly that. Your calls.
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="team section center-content">
<div class="container">
<div class="team-inner section-inner has-top-divider">
<div class="section-header center-content reveal-from-bottom">
<div class="container-xs">
<h2 class="mt-0 mb-16">Supported Browsers</h2>
</div>
</div>
<div class="tiles-wrap">
<div class="tiles-item reveal-from-bottom">
<div class="tiles-item-inner">
<div class="team-item-header">
<div class="team-item-image mb-24">
<img
src="images/browsers.png"
alt="Supported Browsers"
width="auto"
height="auto"
/>
</div>
</div>
<div class="team-item-content">
<h5 class="team-item-name mt-0 mb-4">
Chrome, Edge, Firefox, Opera, Safari, Brave & more...
</h5>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="team section center-content">
<div class="container">
<div class="team-inner section-inner has-top-divider">
<div class="section-header center-content reveal-from-bottom">
<div class="container-xs">
<h2 class="mt-0 mb-16">Meet the team</h2>
</div>
</div>
<div class="tiles-wrap">
<!-- Author -->
<div class="tiles-item reveal-from-bottom">
<div class="tiles-item-inner">
<div class="team-item-header">
<div class="team-item-image mb-24">
<img
src="images/miroslav-pejic.png"
alt="Team member author"
width="180"
height="180"
/>
</div>
</div>
<div class="team-item-content">
<a
target="_blank"
href="https://www.linkedin.com/in/miroslav-pejic-976a07101/"
>
<h5 class="team-item-name mt-0 mb-4">Miroslav Pejic</h5>
</a>
<div class="team-item-role text-xxs fw-500 tt-u text-color-primary mb-8">
Full Stack Developer
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="section">
<div class="container">
<div class="section-inner has-top-divider">
<div class="container-xs">
<div class="section-header center-content">
<h2 class="m-0">Try an easier, more secure way of calling.</h2>
</div>
<div class="center-content">
<a
class="button button-primary button-wide-mobile pulse"
style="
border: 0;
background: linear-gradient(100deg, #376df9 0, #ff5fa0 75%, #ffc55a 100%);
"
href="/newcall"
>Try now</a
>
</div>
</div>
</div>
</div>
</section>
</main>
<footer class="site-footer center-content-mobile">
<div class="container">
<div class="site-footer-inner">
<div class="footer-top space-between text-xxs">
<div class="brand">
<a href="/"><img src="images/logo.svg" alt="Neon" width="32" height="32" /></a>
</div>
<div class="footer-social">
<div>
<a target="_blank" href="https://github.com/miroslavpejic85/mirotalk">
<svg
width="16"
height="16"
viewBox="0 0 16 16"
xmlns="http://www.w3.org/2000/svg"
>
<title>GitHub</title>
<path
d="M7.95 0C3.578 0 0 3.578 0 7.95c0 3.479 2.286 6.46 5.466 7.553.397.1.497-.199.497-.397v-1.392c-2.187.497-2.683-.994-2.683-.994-.398-.894-.895-1.192-.895-1.192-.696-.497.1-.497.1-.497.795.1 1.192.795 1.192.795.696 1.292 1.888.894 2.286.696.1-.497.298-.895.497-1.093-1.79-.2-3.578-.895-3.578-3.976 0-.894.298-1.59.795-2.087-.1-.198-.397-.993.1-2.086 0 0 .695-.2 2.186.795a6.408 6.408 0 0 1 1.987-.299c.696 0 1.392.1 1.988.299 1.49-.994 2.186-.795 2.186-.795.398 1.093.199 1.888.1 2.086.496.597.795 1.292.795 2.087 0 3.081-1.889 3.677-3.677 3.876.298.398.596.895.596 1.59v2.187c0 .198.1.496.596.397C13.714 14.41 16 11.43 16 7.95 15.9 3.578 12.323 0 7.95 0z"
/>
</svg>
</a>
</div>
</div>
</div>
<div class="footer-bottom space-between text-xxs invert-order-desktop">
<nav class="footer-nav">
<ul class="list-reset">
<li>
<a href="/privacy">Privacy Policy</a>
</li>
<li>
<a target="_blank" href="https://www.linkedin.com/in/miroslav-pejic-976a07101/"
>Made with ❤️ by Miroslav Pejic</a
>
</li>
</ul>
</nav>
<div class="footer-copyright">&copy; 2021 MiroTalk, all rights reserved</div>
</div>
</div>
</div>
</footer>
</div>
</header>
<main class="site-content">
<section class="hero section illustration-section-01">
<div class="container">
<div class="hero-inner section-inner">
<div class="split-wrap invert-mobile">
<div class="split-item">
<div
class="hero-content split-item-content center-content-mobile"
>
<h1
class="mt-0 mb-16 reveal-from-bottom"
data-reveal-delay="150"
>
MiroTalk<br />Free browser based real-time video calls.<br />
Simple, Secure, Fast.
</h1>
<p
class="mt-0 mb-32 reveal-from-bottom"
data-reveal-delay="300"
>
Start your next video call with a single click. No
download, plug-in or login required. Just get straight to
talking, messaging and sharing your screen.
</p>
<div class="reveal-from-bottom" data-reveal-delay="450">
<a
class="button button-primary button-wide-mobile pulse"
style="
border: 0;
background: linear-gradient(
100deg,
#376df9 0,
#ff5fa0 75%,
#ffc55a 100%
);
"
href="/newcall"
>Try now</a
>
</div>
</div>
<style>
@media (min-width: 641px) {
.hero .split-wrap .split-item {
min-height: 492px;
}
}
</style>
</div>
</div>
</div>
</div>
</section>
<section class="features-tiles section center-content">
<div class="container">
<div class="features-tiles-inner section-inner has-top-divider">
<div class="section-header">
<div
class="container-xs reveal-from-bottom"
data-reveal-delay="650"
>
<h2 class="mt-0 mb-16">
Unlimited number of conference rooms without call time
limitation
</h2>
<p class="m-0">
MiroTalk is built radically different. We left behind slow
bulky servers, opting for peer to peer calling. We
engineered a platform with maximum video quality lowest
latency that makes your calls crystal clear.
</p>
</div>
</div>
<div class="tiles-wrap">
<div class="tiles-item reveal-from-right">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-02.svg"
alt="Screen Sharing"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Screen Sharing</h4>
<p class="m-0 text-sm">
Share your screen, application window, present your
documents, slides and more.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-left">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-04.svg"
alt="WebCam Streaming"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">WebCam Streaming</h4>
<p class="m-0 text-sm">
Having the webcam on, allows participants to make a
deeper connection with you. Up to 4k resolution.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-right">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-01.svg"
alt="Chat Room"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Chat Room</h4>
<p class="m-0 text-sm">
Chat with others in meeting, either public chat or
private, save the meeting messages. Integrated emoji
picker to show your feeling.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-left">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-03.svg"
alt="Meeting Recording"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Meeting Recording</h4>
<p class="m-0 text-sm">
Record your Screen, WebCam and Audio. Save it for use it
in future or to share with others.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-right">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-06.svg"
alt="Interactive Whiteboard"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Interactive Whiteboard</h4>
<p class="m-0 text-sm">
Simple collaborative whiteboard to draw and explain your
concepts to the other participants in the meeting.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-left">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-02.svg"
alt="File Sharing"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">File Sharing</h4>
<p class="m-0 text-sm">
Share any types of files to all participants in the
meeting, in total security, thanks to Datagram Transport
Layer Security (DTLS).
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-right">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-05.svg"
alt="Total Privacy"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Total Privacy</h4>
<p class="m-0 text-sm">
Data stays between you and your participants. MiroTalk
don't collect or share personal information. It's built
for privacy first.
</p>
</div>
</div>
</div>
<div class="tiles-item reveal-from-left">
<div class="tiles-item-inner">
<div class="features-tiles-item-header">
<div class="features-tiles-item-image mb-16">
<img
src="images/feature-tile-icon-05.svg"
alt="Maximum Security"
width="72"
height="72"
/>
</div>
</div>
<div class="features-tiles-item-content">
<h4 class="mt-0 mb-8">Maximum Security</h4>
<p class="m-0 text-sm">
End to end state of the art encryption means your
participants are exactly that. Your calls.
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="team section center-content">
<div class="container">
<div class="team-inner section-inner has-top-divider">
<div class="section-header center-content reveal-from-bottom">
<div class="container-xs">
<h2 class="mt-0 mb-16">Supported Browsers</h2>
</div>
</div>
<div class="tiles-wrap">
<div class="tiles-item reveal-from-bottom">
<div class="tiles-item-inner">
<div class="team-item-header">
<div class="team-item-image mb-24">
<img
src="images/browsers.png"
alt="Supported Browsers"
width="auto"
height="auto"
/>
</div>
</div>
<div class="team-item-content">
<h5 class="team-item-name mt-0 mb-4">
Chrome, Edge, Firefox, Opera, Safari, Brave & more...
</h5>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="team section center-content">
<div class="container">
<div class="team-inner section-inner has-top-divider">
<div class="section-header center-content reveal-from-bottom">
<div class="container-xs">
<h2 class="mt-0 mb-16">Meet the team</h2>
</div>
</div>
<div class="tiles-wrap">
<!-- Author -->
<div class="tiles-item reveal-from-bottom">
<div class="tiles-item-inner">
<div class="team-item-header">
<div class="team-item-image mb-24">
<img
src="images/miroslav-pejic.png"
alt="Team member author"
width="180"
height="180"
/>
</div>
</div>
<div class="team-item-content">
<a
target="_blank"
href="https://www.linkedin.com/in/miroslav-pejic-976a07101/"
>
<h5 class="team-item-name mt-0 mb-4">Miroslav Pejic</h5>
</a>
<div
class="team-item-role text-xxs fw-500 tt-u text-color-primary mb-8"
>
Full Stack Developer
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="section">
<div class="container">
<div class="section-inner has-top-divider">
<div class="container-xs">
<div class="section-header center-content">
<h2 class="m-0">
Try an easier, more secure way of calling.
</h2>
</div>
<div class="center-content">
<a
class="button button-primary button-wide-mobile pulse"
style="
border: 0;
background: linear-gradient(
100deg,
#376df9 0,
#ff5fa0 75%,
#ffc55a 100%
);
"
href="/newcall"
>Try now</a
>
</div>
</div>
</div>
</div>
</section>
</main>
<footer class="site-footer center-content-mobile">
<div class="container">
<div class="site-footer-inner">
<div class="footer-top space-between text-xxs">
<div class="brand">
<a href="/"
><img src="images/logo.svg" alt="Neon" width="32" height="32"
/></a>
</div>
<div class="footer-social">
<div>
<a
target="_blank"
href="https://github.com/miroslavpejic85/mirotalk"
>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
xmlns="http://www.w3.org/2000/svg"
>
<title>GitHub</title>
<path
d="M7.95 0C3.578 0 0 3.578 0 7.95c0 3.479 2.286 6.46 5.466 7.553.397.1.497-.199.497-.397v-1.392c-2.187.497-2.683-.994-2.683-.994-.398-.894-.895-1.192-.895-1.192-.696-.497.1-.497.1-.497.795.1 1.192.795 1.192.795.696 1.292 1.888.894 2.286.696.1-.497.298-.895.497-1.093-1.79-.2-3.578-.895-3.578-3.976 0-.894.298-1.59.795-2.087-.1-.198-.397-.993.1-2.086 0 0 .695-.2 2.186.795a6.408 6.408 0 0 1 1.987-.299c.696 0 1.392.1 1.988.299 1.49-.994 2.186-.795 2.186-.795.398 1.093.199 1.888.1 2.086.496.597.795 1.292.795 2.087 0 3.081-1.889 3.677-3.677 3.876.298.398.596.895.596 1.59v2.187c0 .198.1.496.596.397C13.714 14.41 16 11.43 16 7.95 15.9 3.578 12.323 0 7.95 0z"
/>
</svg>
</a>
</div>
</div>
</div>
<div
class="footer-bottom space-between text-xxs invert-order-desktop"
>
<nav class="footer-nav">
<ul class="list-reset">
<li>
<a href="/privacy">Privacy Policy</a>
</li>
<li>
<a
target="_blank"
href="https://www.linkedin.com/in/miroslav-pejic-976a07101/"
>Made with ❤️ by Miroslav Pejic</a
>
</li>
</ul>
</nav>
<div class="footer-copyright">
&copy; 2021 MiroTalk, all rights reserved
</div>
</div>
</div>
</div>
</footer>
</div>
<script src="js/landing.js"></script>
</body>
<script src="js/landing.js"></script>
</body>
</html>
+146 -178
View File
@@ -1,183 +1,151 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script
async
src="https://www.googletagmanager.com/gtag/js?id=G-3XM60XK9RQ"
></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-3XM60XK9RQ"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag("config", "G-3XM60XK9RQ");
</script>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>MiroTalk ~ Create your Room name and start the new call.</title>
<link rel="stylesheet" href="css/landing.css" />
<link rel="stylesheet" href="css/newcall.css" />
<link rel="shortcut icon" href="images/logo.svg" />
<!-- https://ogp.me -->
<meta property="og:type" content="app-webrtc" />
<meta property="og:site_name" content="MiroTalk" />
<meta property="og:title" content="Click the link to make a call." />
<meta
property="og:description"
content="MiroTalk calling provides real-time HD quality and latency simply
not available with traditional technology."
/>
<meta property="og:image" content="/images/preview.png" />
<meta property="og:url" content="https://mirotalk.herokuapp.com/" />
</head>
<body class="has-animations">
<div class="body-wrap">
<header class="site-header reveal-from-top">
<div class="container">
<div class="site-header-inner">
<div class="brand">
<h1 class="m-0">
<a href="/"
><img src="images/logo.svg" alt="Neon" width="32" height="32"
/></a>
</h1>
</div>
</div>
gtag('config', 'G-3XM60XK9RQ');
</script>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>MiroTalk ~ Create your Room name and start the new call.</title>
<link rel="stylesheet" href="css/landing.css" />
<link rel="stylesheet" href="css/newcall.css" />
<link rel="shortcut icon" href="images/logo.svg" />
<!-- https://ogp.me -->
<meta property="og:type" content="app-webrtc" />
<meta property="og:site_name" content="MiroTalk" />
<meta property="og:title" content="Click the link to make a call." />
<meta
property="og:description"
content="MiroTalk calling provides real-time HD quality and latency simply not available with traditional technology."
/>
<meta property="og:image" content="/images/preview.png" />
<meta property="og:url" content="https://mirotalk.herokuapp.com/" />
</head>
<body class="has-animations">
<div class="body-wrap">
<header class="site-header reveal-from-top">
<div class="container">
<div class="site-header-inner">
<div class="brand">
<h1 class="m-0">
<a href="/"><img src="images/logo.svg" alt="Neon" width="32" height="32" /></a>
</h1>
</div>
</div>
</div>
</header>
<main class="site-content">
<section class="hero section illustration-section-01">
<div class="container">
<div class="hero-inner section-inner">
<div class="split-wrap invert-mobile">
<div class="split-item">
<div class="hero-content split-item-content center-content-mobile">
<h1 class="mt-0 mb-16 reveal-from-bottom" data-reveal-delay="150">
Pick name. <br />
Share URL. <br />
Start conference.
</h1>
<p class="mt-0 mb-32 reveal-from-bottom" data-reveal-delay="300">
Each room has its own disposable URL. Just pick a room name and share your
custom URL. It's really that easy.
</p>
</div>
<style>
@media (min-width: 641px) {
.hero .split-wrap .split-item {
min-height: 492px;
}
}
</style>
</div>
</div>
</div>
</div>
</section>
<section class="cta section center-content-mobile reveal-from-bottom">
<div class="container">
<div class="cta-inner section-inner cta-split">
<div class="cta-slogan">
<h3 class="m-0">
Pick a room name.<br />
How about this one?
</h3>
</div>
<div class="cta-action">
<div class="mb-24">
<label class="form-label screen-reader" for="roomName">mirotalk</label>
<div class="form-group-desktop">
<input class="form-input" type="text" id="roomName" value="mirotalk" />
<button
class="button button-primary pulse"
onclick="{window.location.href = '/join/' + document.getElementById('roomName').value}"
>
Join to room
</button>
</div>
</div>
</div>
</div>
</div>
</section>
</main>
<footer class="site-footer center-content-mobile">
<div class="container">
<div class="site-footer-inner">
<div class="footer-top space-between text-xxs">
<div class="brand">
<a href="/"><img src="images/logo.svg" alt="Neon" width="32" height="32" /></a>
</div>
<div class="footer-social">
<div>
<a target="_blank" href="https://github.com/miroslavpejic85/mirotalk">
<svg
width="16"
height="16"
viewBox="0 0 16 16"
xmlns="http://www.w3.org/2000/svg"
>
<title>GitHub</title>
<path
d="M7.95 0C3.578 0 0 3.578 0 7.95c0 3.479 2.286 6.46 5.466 7.553.397.1.497-.199.497-.397v-1.392c-2.187.497-2.683-.994-2.683-.994-.398-.894-.895-1.192-.895-1.192-.696-.497.1-.497.1-.497.795.1 1.192.795 1.192.795.696 1.292 1.888.894 2.286.696.1-.497.298-.895.497-1.093-1.79-.2-3.578-.895-3.578-3.976 0-.894.298-1.59.795-2.087-.1-.198-.397-.993.1-2.086 0 0 .695-.2 2.186.795a6.408 6.408 0 0 1 1.987-.299c.696 0 1.392.1 1.988.299 1.49-.994 2.186-.795 2.186-.795.398 1.093.199 1.888.1 2.086.496.597.795 1.292.795 2.087 0 3.081-1.889 3.677-3.677 3.876.298.398.596.895.596 1.59v2.187c0 .198.1.496.596.397C13.714 14.41 16 11.43 16 7.95 15.9 3.578 12.323 0 7.95 0z"
/>
</svg>
</a>
</div>
</div>
</div>
<div class="footer-bottom space-between text-xxs invert-order-desktop">
<nav class="footer-nav">
<ul class="list-reset">
<li>
<a href="/privacy">Privacy Policy</a>
</li>
<li>
<a target="_blank" href="https://www.linkedin.com/in/miroslav-pejic-976a07101/"
>Made with ❤️ by Miroslav Pejic</a
>
</li>
</ul>
</nav>
<div class="footer-copyright">&copy; 2021 MiroTalk, all rights reserved</div>
</div>
</div>
</div>
</footer>
</div>
</header>
<main class="site-content">
<section class="hero section illustration-section-01">
<div class="container">
<div class="hero-inner section-inner">
<div class="split-wrap invert-mobile">
<div class="split-item">
<div
class="hero-content split-item-content center-content-mobile"
>
<h1
class="mt-0 mb-16 reveal-from-bottom"
data-reveal-delay="150"
>
Pick name. <br />
Share URL. <br />
Start conference.
</h1>
<p
class="mt-0 mb-32 reveal-from-bottom"
data-reveal-delay="300"
>
Each room has its own disposable URL. Just pick a room
name and share your custom URL. It's really that easy.
</p>
</div>
<style>
@media (min-width: 641px) {
.hero .split-wrap .split-item {
min-height: 492px;
}
}
</style>
</div>
</div>
</div>
</div>
</section>
<section class="cta section center-content-mobile reveal-from-bottom">
<div class="container">
<div class="cta-inner section-inner cta-split">
<div class="cta-slogan">
<h3 class="m-0">
Pick a room name.<br />
How about this one?
</h3>
</div>
<div class="cta-action">
<div class="mb-24">
<label class="form-label screen-reader" for="roomName"
>mirotalk</label
>
<div class="form-group-desktop">
<input
class="form-input"
type="text"
id="roomName"
value="mirotalk"
/>
<button
class="button button-primary pulse"
onclick="{window.location.href = '/join/' + document.getElementById('roomName').value}"
>
Join to room
</button>
</div>
</div>
</div>
</div>
</div>
</section>
</main>
<footer class="site-footer center-content-mobile">
<div class="container">
<div class="site-footer-inner">
<div class="footer-top space-between text-xxs">
<div class="brand">
<a href="/"
><img src="images/logo.svg" alt="Neon" width="32" height="32"
/></a>
</div>
<div class="footer-social">
<div>
<a
target="_blank"
href="https://github.com/miroslavpejic85/mirotalk"
>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
xmlns="http://www.w3.org/2000/svg"
>
<title>GitHub</title>
<path
d="M7.95 0C3.578 0 0 3.578 0 7.95c0 3.479 2.286 6.46 5.466 7.553.397.1.497-.199.497-.397v-1.392c-2.187.497-2.683-.994-2.683-.994-.398-.894-.895-1.192-.895-1.192-.696-.497.1-.497.1-.497.795.1 1.192.795 1.192.795.696 1.292 1.888.894 2.286.696.1-.497.298-.895.497-1.093-1.79-.2-3.578-.895-3.578-3.976 0-.894.298-1.59.795-2.087-.1-.198-.397-.993.1-2.086 0 0 .695-.2 2.186.795a6.408 6.408 0 0 1 1.987-.299c.696 0 1.392.1 1.988.299 1.49-.994 2.186-.795 2.186-.795.398 1.093.199 1.888.1 2.086.496.597.795 1.292.795 2.087 0 3.081-1.889 3.677-3.677 3.876.298.398.596.895.596 1.59v2.187c0 .198.1.496.596.397C13.714 14.41 16 11.43 16 7.95 15.9 3.578 12.323 0 7.95 0z"
/>
</svg>
</a>
</div>
</div>
</div>
<div
class="footer-bottom space-between text-xxs invert-order-desktop"
>
<nav class="footer-nav">
<ul class="list-reset">
<li>
<a href="/privacy">Privacy Policy</a>
</li>
<li>
<a
target="_blank"
href="https://www.linkedin.com/in/miroslav-pejic-976a07101/"
>Made with ❤️ by Miroslav Pejic</a
>
</li>
</ul>
</nav>
<div class="footer-copyright">
&copy; 2021 MiroTalk, all rights reserved
</div>
</div>
</div>
</div>
</footer>
</div>
<script src="js/landing.js"></script>
<script src="js/newroom.js"></script>
</body>
<script src="js/landing.js"></script>
<script src="js/newroom.js"></script>
</body>
</html>
+141 -168
View File
@@ -1,177 +1,150 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script
async
src="https://www.googletagmanager.com/gtag/js?id=G-3XM60XK9RQ"
></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-3XM60XK9RQ"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag("config", "G-3XM60XK9RQ");
</script>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>MiroTalk ~ Allow Video and Audio access to join in the Room.</title>
<link rel="stylesheet" href="css/landing.css" />
<link rel="shortcut icon" href="images/logo.svg" />
<!-- https://ogp.me -->
<meta property="og:type" content="app-webrtc" />
<meta property="og:site_name" content="MiroTalk" />
<meta property="og:title" content="Click the link to make a call." />
<meta
property="og:description"
content="MiroTalk calling provides real-time HD quality and latency simply
not available with traditional technology."
/>
<meta property="og:image" content="/images/preview.png" />
<meta property="og:url" content="https://mirotalk.herokuapp.com/" />
</head>
<body class="has-animations">
<div class="body-wrap">
<header class="site-header reveal-from-top">
<div class="container">
<div class="site-header-inner">
<div class="brand">
<h1 class="m-0">
<a href="/"
><img src="images/logo.svg" alt="Neon" width="32" height="32"
/></a>
</h1>
</div>
</div>
</div>
</header>
<main class="site-content">
<section class="hero section illustration-section-01">
<div class="container">
<div class="hero-inner section-inner">
<div class="split-wrap invert-mobile">
<div class="split-item">
<div
class="hero-content split-item-content center-content-mobile"
>
<h1
class="mt-0 mb-16 reveal-from-bottom"
data-reveal-delay="150"
>
Access denied.
</h1>
<p
id="getUserMediaError"
class="mt-0 mb-32 reveal-from-bottom"
data-reveal-delay="300"
></p>
<p
class="mt-0 mb-32 reveal-from-bottom"
data-reveal-delay="300"
>
This app will not work without camera/microphone access.
Please Try again and allow it.
</p>
<script>
let qs = new URLSearchParams(window.location.search);
let roomId = qs.get("roomId");
let getUserMediaError = qs.get("getUserMediaError");
console.log("Allow Camera && Audio", {
roomId: roomId,
getUserMediaError: getUserMediaError,
});
// print getUserMedia error
document.getElementById(
"getUserMediaError"
).innerHTML = getUserMediaError;
</script>
<div class="reveal-from-bottom" data-reveal-delay="450">
<button
class="button button-primary button-wide-mobile pulse"
style="
border: 0;
background: linear-gradient(
100deg,
#376df9 0,
#ff5fa0 75%,
#ffc55a 100%
);
"
onclick="roomId ? window.location.href = '/join/' + roomId : window.location.href = '/newcall';"
>
Try again
</button>
gtag('config', 'G-3XM60XK9RQ');
</script>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>MiroTalk ~ Allow Video and Audio access to join in the Room.</title>
<link rel="stylesheet" href="css/landing.css" />
<link rel="shortcut icon" href="images/logo.svg" />
<!-- https://ogp.me -->
<meta property="og:type" content="app-webrtc" />
<meta property="og:site_name" content="MiroTalk" />
<meta property="og:title" content="Click the link to make a call." />
<meta
property="og:description"
content="MiroTalk calling provides real-time HD quality and latency simply not available with traditional technology."
/>
<meta property="og:image" content="/images/preview.png" />
<meta property="og:url" content="https://mirotalk.herokuapp.com/" />
</head>
<body class="has-animations">
<div class="body-wrap">
<header class="site-header reveal-from-top">
<div class="container">
<div class="site-header-inner">
<div class="brand">
<h1 class="m-0">
<a href="/"><img src="images/logo.svg" alt="Neon" width="32" height="32" /></a>
</h1>
</div>
</div>
</div>
<style>
@media (min-width: 641px) {
.hero .split-wrap .split-item {
min-height: 492px;
}
}
</style>
</div>
</div>
</div>
</div>
</section>
</main>
</header>
<main class="site-content">
<section class="hero section illustration-section-01">
<div class="container">
<div class="hero-inner section-inner">
<div class="split-wrap invert-mobile">
<div class="split-item">
<div class="hero-content split-item-content center-content-mobile">
<h1 class="mt-0 mb-16 reveal-from-bottom" data-reveal-delay="150">
Access denied.
</h1>
<p
id="getUserMediaError"
class="mt-0 mb-32 reveal-from-bottom"
data-reveal-delay="300"
></p>
<p class="mt-0 mb-32 reveal-from-bottom" data-reveal-delay="300">
This app will not work without camera/microphone access. Please Try again
and allow it.
</p>
<script>
let qs = new URLSearchParams(window.location.search);
let roomId = qs.get('roomId');
let getUserMediaError = qs.get('getUserMediaError');
console.log('Allow Camera && Audio', {
roomId: roomId,
getUserMediaError: getUserMediaError,
});
// print getUserMedia error
document.getElementById('getUserMediaError').innerHTML = getUserMediaError;
</script>
<div class="reveal-from-bottom" data-reveal-delay="450">
<button
class="button button-primary button-wide-mobile pulse"
style="
border: 0;
background: linear-gradient(
100deg,
#376df9 0,
#ff5fa0 75%,
#ffc55a 100%
);
"
onclick="roomId ? window.location.href = '/join/' + roomId : window.location.href = '/newcall';"
>
Try again
</button>
</div>
</div>
<style>
@media (min-width: 641px) {
.hero .split-wrap .split-item {
min-height: 492px;
}
}
</style>
</div>
</div>
</div>
</div>
</section>
</main>
<footer class="site-footer center-content-mobile">
<div class="container">
<div class="site-footer-inner">
<div class="footer-top space-between text-xxs">
<div class="brand">
<a href="/"
><img src="images/logo.svg" alt="Neon" width="32" height="32"
/></a>
</div>
<div class="footer-social">
<div>
<a
target="_blank"
href="https://github.com/miroslavpejic85/mirotalk"
>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
xmlns="http://www.w3.org/2000/svg"
>
<title>GitHub</title>
<path
d="M7.95 0C3.578 0 0 3.578 0 7.95c0 3.479 2.286 6.46 5.466 7.553.397.1.497-.199.497-.397v-1.392c-2.187.497-2.683-.994-2.683-.994-.398-.894-.895-1.192-.895-1.192-.696-.497.1-.497.1-.497.795.1 1.192.795 1.192.795.696 1.292 1.888.894 2.286.696.1-.497.298-.895.497-1.093-1.79-.2-3.578-.895-3.578-3.976 0-.894.298-1.59.795-2.087-.1-.198-.397-.993.1-2.086 0 0 .695-.2 2.186.795a6.408 6.408 0 0 1 1.987-.299c.696 0 1.392.1 1.988.299 1.49-.994 2.186-.795 2.186-.795.398 1.093.199 1.888.1 2.086.496.597.795 1.292.795 2.087 0 3.081-1.889 3.677-3.677 3.876.298.398.596.895.596 1.59v2.187c0 .198.1.496.596.397C13.714 14.41 16 11.43 16 7.95 15.9 3.578 12.323 0 7.95 0z"
/>
</svg>
</a>
<footer class="site-footer center-content-mobile">
<div class="container">
<div class="site-footer-inner">
<div class="footer-top space-between text-xxs">
<div class="brand">
<a href="/"><img src="images/logo.svg" alt="Neon" width="32" height="32" /></a>
</div>
<div class="footer-social">
<div>
<a target="_blank" href="https://github.com/miroslavpejic85/mirotalk">
<svg
width="16"
height="16"
viewBox="0 0 16 16"
xmlns="http://www.w3.org/2000/svg"
>
<title>GitHub</title>
<path
d="M7.95 0C3.578 0 0 3.578 0 7.95c0 3.479 2.286 6.46 5.466 7.553.397.1.497-.199.497-.397v-1.392c-2.187.497-2.683-.994-2.683-.994-.398-.894-.895-1.192-.895-1.192-.696-.497.1-.497.1-.497.795.1 1.192.795 1.192.795.696 1.292 1.888.894 2.286.696.1-.497.298-.895.497-1.093-1.79-.2-3.578-.895-3.578-3.976 0-.894.298-1.59.795-2.087-.1-.198-.397-.993.1-2.086 0 0 .695-.2 2.186.795a6.408 6.408 0 0 1 1.987-.299c.696 0 1.392.1 1.988.299 1.49-.994 2.186-.795 2.186-.795.398 1.093.199 1.888.1 2.086.496.597.795 1.292.795 2.087 0 3.081-1.889 3.677-3.677 3.876.298.398.596.895.596 1.59v2.187c0 .198.1.496.596.397C13.714 14.41 16 11.43 16 7.95 15.9 3.578 12.323 0 7.95 0z"
/>
</svg>
</a>
</div>
</div>
</div>
<div class="footer-bottom space-between text-xxs invert-order-desktop">
<nav class="footer-nav">
<ul class="list-reset">
<li>
<a target="_blank" href="https://www.linkedin.com/in/miroslav-pejic-976a07101/"
>Made with ❤️ by Miroslav Pejic</a
>
</li>
</ul>
</nav>
<div class="footer-copyright">&copy; 2021 MiroTalk, all rights reserved</div>
</div>
</div>
</div>
</div>
</div>
<div
class="footer-bottom space-between text-xxs invert-order-desktop"
>
<nav class="footer-nav">
<ul class="list-reset">
<li>
<a
target="_blank"
href="https://www.linkedin.com/in/miroslav-pejic-976a07101/"
>Made with ❤️ by Miroslav Pejic</a
>
</li>
</ul>
</nav>
<div class="footer-copyright">
&copy; 2021 MiroTalk, all rights reserved
</div>
</div>
</div>
</footer>
</div>
</footer>
</div>
<script src="js/landing.js"></script>
</body>
<script src="js/landing.js"></script>
</body>
</html>
+180 -209
View File
@@ -1,218 +1,189 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script
async
src="https://www.googletagmanager.com/gtag/js?id=G-3XM60XK9RQ"
></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-3XM60XK9RQ"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag("config", "G-3XM60XK9RQ");
</script>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>MiroTalk ~ privacy policy.</title>
<link rel="stylesheet" href="css/landing.css" />
<link rel="shortcut icon" href="images/logo.svg" />
<meta
name="description"
content="MiroTalk powered by WebRTC, Real-time secure video calls, chat and screen sharing capabilities in the browser, from your mobile or desktop"
/>
<meta
name="keywords"
content="webrtc, RTCICECandidates, RTCSessionDescription, real-time communications, webrtc stun, webrtc turn, video meeting, video chat, video conference, multi video chat, multi video conference, peer to peer, p2p, zoom"
/>
<!-- https://ogp.me -->
<meta property="og:type" content="app-webrtc" />
<meta property="og:site_name" content="MiroTalk" />
<meta property="og:title" content="Click the link to make a call." />
<meta
property="og:description"
content="MiroTalk calling provides real-time HD quality and latency simply
not available with traditional technology."
/>
<meta property="og:image" content="/images/preview.png" />
<meta property="og:url" content="https://mirotalk.herokuapp.com/" />
</head>
<body class="has-animations">
<div class="body-wrap">
<header class="site-header reveal-from-top">
<div class="container">
<div class="site-header-inner">
<div class="brand">
<h1 class="m-0">
<a href="/"
><img src="images/logo.svg" alt="Neon" width="32" height="32"
/></a>
</h1>
</div>
</div>
</div>
</header>
<main class="site-content">
<section class="hero section illustration-section-01">
<div class="container">
<div class="hero-inner section-inner">
<div class="split-wrap invert-mobile">
<div class="split-item">
<div
class="hero-content split-item-content center-content-mobile"
>
<h1
class="mt-0 mb-16 reveal-from-bottom"
data-reveal-delay="150"
>
Privacy Policy
</h1>
<p
class="mt-0 mb-32 reveal-from-bottom"
data-reveal-delay="300"
>
We limit ourselves to collect the smallest amount of user
data that we need in order to create a seamless experience
when using <strong>MiroTalk</strong>. <br /><br />
This data includes mainly:
<a
href="https://developer.mozilla.org/en-US/docs/Web/API/RTCIceCandidate"
target="_blank"
>RTCICECandidates</a
>
&
<a
href="https://developer.mozilla.org/en-US/docs/Web/API/RTCSessionDescription"
target="_blank"
>RTCSessionDescription</a
>
which is needed to establish the video call using WebRTC.
RTCICECandidates, RTCSessionDescription is not stored in
any persistent database, it's removed from the server as
soon as the user leave the call by closing the browser
window. The media streams are encrypted using Secure
Real-time Transport Protocol (SRTP).
<br /><br />
For Chat messaging and File Sharing, we using WebRTC's
<a
href="https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel"
target="_blank"
>RTCDataChannel</a
>
to transfer data directly from one peer to another. With
RTCDataChannel, all data is secured with
<a
href="https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security"
target="_blank"
>Datagram Transport Layer Security</a
>
(DTLS). DTLS is a derivative of SSL, meaning your data
will be as secure as using any standard SSL-based
connection.
<br /><br />
If you record a meeting, the recording of the meeting is
temporarily stored on <strong>Your browser</strong>
<a
href="https://developer.mozilla.org/en-US/docs/Web/API/Blob"
target="_blank"
>Blob</a
>, then will be downloaded on Your PC/Mobile Device.
<br /><br />
<strong>MiroTalk</strong> is purely peer-to-peer, which
means the user's video, audio, chat and file is not sent
to our server at all. <br /><br />
We use Google Analytics to track aggregated usage
statistics in order to improve our service. The maker of
<strong>MiroTalk</strong> has no intention of using
personally or selling any of the above-mentioned data.
</p>
<div class="reveal-from-bottom" data-reveal-delay="450">
<a
class="button button-primary button-wide-mobile pulse"
style="
border: 0;
background: linear-gradient(
100deg,
#376df9 0,
#ff5fa0 75%,
#ffc55a 100%
);
"
href="/newcall"
>AGREE</a
>
gtag('config', 'G-3XM60XK9RQ');
</script>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>MiroTalk ~ privacy policy.</title>
<link rel="stylesheet" href="css/landing.css" />
<link rel="shortcut icon" href="images/logo.svg" />
<meta
name="description"
content="MiroTalk powered by WebRTC, Real-time secure video calls, chat and screen sharing capabilities in the browser, from your mobile or desktop"
/>
<meta
name="keywords"
content="webrtc, RTCICECandidates, RTCSessionDescription, real-time communications, webrtc stun, webrtc turn, video meeting, video chat, video conference, multi video chat, multi video conference, peer to peer, p2p, zoom"
/>
<!-- https://ogp.me -->
<meta property="og:type" content="app-webrtc" />
<meta property="og:site_name" content="MiroTalk" />
<meta property="og:title" content="Click the link to make a call." />
<meta
property="og:description"
content="MiroTalk calling provides real-time HD quality and latency simply not available with traditional technology."
/>
<meta property="og:image" content="/images/preview.png" />
<meta property="og:url" content="https://mirotalk.herokuapp.com/" />
</head>
<body class="has-animations">
<div class="body-wrap">
<header class="site-header reveal-from-top">
<div class="container">
<div class="site-header-inner">
<div class="brand">
<h1 class="m-0">
<a href="/"><img src="images/logo.svg" alt="Neon" width="32" height="32" /></a>
</h1>
</div>
</div>
</div>
<style>
@media (min-width: 641px) {
.hero .split-wrap .split-item {
min-height: 492px;
}
}
</style>
</div>
</div>
</div>
</div>
</section>
</main>
</header>
<main class="site-content">
<section class="hero section illustration-section-01">
<div class="container">
<div class="hero-inner section-inner">
<div class="split-wrap invert-mobile">
<div class="split-item">
<div class="hero-content split-item-content center-content-mobile">
<h1 class="mt-0 mb-16 reveal-from-bottom" data-reveal-delay="150">
Privacy Policy
</h1>
<p class="mt-0 mb-32 reveal-from-bottom" data-reveal-delay="300">
We limit ourselves to collect the smallest amount of user data that we need
in order to create a seamless experience when using
<strong>MiroTalk</strong>. <br /><br />
This data includes mainly:
<a
href="https://developer.mozilla.org/en-US/docs/Web/API/RTCIceCandidate"
target="_blank"
>RTCICECandidates</a
>
&
<a
href="https://developer.mozilla.org/en-US/docs/Web/API/RTCSessionDescription"
target="_blank"
>RTCSessionDescription</a
>
which is needed to establish the video call using WebRTC. RTCICECandidates,
RTCSessionDescription is not stored in any persistent database, it's removed
from the server as soon as the user leave the call by closing the browser
window. The media streams are encrypted using Secure Real-time Transport
Protocol (SRTP).
<br /><br />
For Chat messaging and File Sharing, we using WebRTC's
<a
href="https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel"
target="_blank"
>RTCDataChannel</a
>
to transfer data directly from one peer to another. With RTCDataChannel, all
data is secured with
<a
href="https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security"
target="_blank"
>Datagram Transport Layer Security</a
>
(DTLS). DTLS is a derivative of SSL, meaning your data will be as secure as
using any standard SSL-based connection.
<br /><br />
If you record a meeting, the recording of the meeting is temporarily stored
on <strong>Your browser</strong>
<a
href="https://developer.mozilla.org/en-US/docs/Web/API/Blob"
target="_blank"
>Blob</a
>, then will be downloaded on Your PC/Mobile Device. <br /><br />
<strong>MiroTalk</strong> is purely peer-to-peer, which means the user's
video, audio, chat and file is not sent to our server at all. <br /><br />
We use Google Analytics to track aggregated usage statistics in order to
improve our service. The maker of
<strong>MiroTalk</strong> has no intention of using personally or selling
any of the above-mentioned data.
</p>
<div class="reveal-from-bottom" data-reveal-delay="450">
<a
class="button button-primary button-wide-mobile pulse"
style="
border: 0;
background: linear-gradient(
100deg,
#376df9 0,
#ff5fa0 75%,
#ffc55a 100%
);
"
href="/newcall"
>AGREE</a
>
</div>
</div>
<style>
@media (min-width: 641px) {
.hero .split-wrap .split-item {
min-height: 492px;
}
}
</style>
</div>
</div>
</div>
</div>
</section>
</main>
<footer class="site-footer center-content-mobile">
<div class="container">
<div class="site-footer-inner">
<div class="footer-top space-between text-xxs">
<div class="brand">
<a href="/"
><img src="images/logo.svg" alt="Neon" width="32" height="32"
/></a>
</div>
<div class="footer-social">
<div>
<a
target="_blank"
href="https://github.com/miroslavpejic85/mirotalk"
>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
xmlns="http://www.w3.org/2000/svg"
>
<title>GitHub</title>
<path
d="M7.95 0C3.578 0 0 3.578 0 7.95c0 3.479 2.286 6.46 5.466 7.553.397.1.497-.199.497-.397v-1.392c-2.187.497-2.683-.994-2.683-.994-.398-.894-.895-1.192-.895-1.192-.696-.497.1-.497.1-.497.795.1 1.192.795 1.192.795.696 1.292 1.888.894 2.286.696.1-.497.298-.895.497-1.093-1.79-.2-3.578-.895-3.578-3.976 0-.894.298-1.59.795-2.087-.1-.198-.397-.993.1-2.086 0 0 .695-.2 2.186.795a6.408 6.408 0 0 1 1.987-.299c.696 0 1.392.1 1.988.299 1.49-.994 2.186-.795 2.186-.795.398 1.093.199 1.888.1 2.086.496.597.795 1.292.795 2.087 0 3.081-1.889 3.677-3.677 3.876.298.398.596.895.596 1.59v2.187c0 .198.1.496.596.397C13.714 14.41 16 11.43 16 7.95 15.9 3.578 12.323 0 7.95 0z"
/>
</svg>
</a>
<footer class="site-footer center-content-mobile">
<div class="container">
<div class="site-footer-inner">
<div class="footer-top space-between text-xxs">
<div class="brand">
<a href="/"><img src="images/logo.svg" alt="Neon" width="32" height="32" /></a>
</div>
<div class="footer-social">
<div>
<a target="_blank" href="https://github.com/miroslavpejic85/mirotalk">
<svg
width="16"
height="16"
viewBox="0 0 16 16"
xmlns="http://www.w3.org/2000/svg"
>
<title>GitHub</title>
<path
d="M7.95 0C3.578 0 0 3.578 0 7.95c0 3.479 2.286 6.46 5.466 7.553.397.1.497-.199.497-.397v-1.392c-2.187.497-2.683-.994-2.683-.994-.398-.894-.895-1.192-.895-1.192-.696-.497.1-.497.1-.497.795.1 1.192.795 1.192.795.696 1.292 1.888.894 2.286.696.1-.497.298-.895.497-1.093-1.79-.2-3.578-.895-3.578-3.976 0-.894.298-1.59.795-2.087-.1-.198-.397-.993.1-2.086 0 0 .695-.2 2.186.795a6.408 6.408 0 0 1 1.987-.299c.696 0 1.392.1 1.988.299 1.49-.994 2.186-.795 2.186-.795.398 1.093.199 1.888.1 2.086.496.597.795 1.292.795 2.087 0 3.081-1.889 3.677-3.677 3.876.298.398.596.895.596 1.59v2.187c0 .198.1.496.596.397C13.714 14.41 16 11.43 16 7.95 15.9 3.578 12.323 0 7.95 0z"
/>
</svg>
</a>
</div>
</div>
</div>
<div class="footer-bottom space-between text-xxs invert-order-desktop">
<nav class="footer-nav">
<ul class="list-reset">
<li>
<a target="_blank" href="https://www.linkedin.com/in/miroslav-pejic-976a07101/"
>Made with ❤️ by Miroslav Pejic</a
>
</li>
</ul>
</nav>
<div class="footer-copyright">&copy; 2021 MiroTalk, all rights reserved</div>
</div>
</div>
</div>
</div>
</div>
<div
class="footer-bottom space-between text-xxs invert-order-desktop"
>
<nav class="footer-nav">
<ul class="list-reset">
<li>
<a
target="_blank"
href="https://www.linkedin.com/in/miroslav-pejic-976a07101/"
>Made with ❤️ by Miroslav Pejic</a
>
</li>
</ul>
</nav>
<div class="footer-copyright">
&copy; 2021 MiroTalk, all rights reserved
</div>
</div>
</div>
</footer>
</div>
</footer>
</div>
<script src="js/landing.js"></script>
</body>
<script src="js/landing.js"></script>
</body>
</html>