mirror of
https://github.com/eugene-serb/wavelovers.git
synced 2023-09-09 23:41:16 +03:00
commit
fa070f4aef
23
404.md
23
404.md
@ -4,8 +4,12 @@
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="color-scheme" content="light dark" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://eugene-serb.github.io/wavelovers/img/favicon.ico" />
|
||||
<link rel="stylesheet" type="text/css" href="https://eugene-serb.github.io/wavelovers/css/styles.css" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<style type="text/css">
|
||||
div.markdown-body > h1, div.footer {
|
||||
@ -24,19 +28,14 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<meta name="google-site-verification" content="qLQbgnmQEfvprDF8WR6oL_b_Qt0R9kKcIEOfHqWlFm8" />
|
||||
<meta name="yandex-verification" content="e6e0bff7caaa7ecd" />
|
||||
<meta name="msvalidate.01" content="6E1771734F083E5366205F06314C3577" />
|
||||
<meta name='wmail-verification' content='46d069b79f9c774ce0bbf55f46aef201' />
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-4NB4LGNNLB"></script>
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() { dataLayer.push(arguments); }
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-4NB4LGNNLB');
|
||||
gtag('config', 'G-59FM5E4MVD');
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<!-- Yandex.Metrika counter -->
|
||||
@ -47,7 +46,7 @@
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(79722217, "init", {
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
@ -60,12 +59,12 @@
|
||||
<section class="banner-container">
|
||||
<div class="banner">
|
||||
<h1>404</h1>
|
||||
<span>File not found. Please, go to the </span><a href="https://eugene-serb.github.io/wavelovers/" target="_self">homepage</a><br />
|
||||
<span>File not found. Please, go to the </span><a href="https://wavelovers.ru/" target="_self">homepage</a><br />
|
||||
<span>Contact info: </span><a href="https://twitter.com/eugene_serb/" target="_blank">@eugene_serb</a>
|
||||
</div>
|
||||
</section>
|
||||
<script src="https://eugene-serb.github.io/js/scripts.js"></script>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/76610724" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Wavelovers
|
||||
Wavelovers in ***Javascript***, ***HTML*** and ***CSS*** **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://eugene-serb.github.io/wavelovers/)]**.
|
||||
Wavelovers in ***Javascript***, ***HTML*** and ***CSS*** **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://wavelovers.ru/)]**.
|
||||
|
||||
This is a Wavelovers that can make a vibration massager from your gamepad.
|
||||
This is Wavelovers, which can make a vibrating massager out of a gamepad. It has 16 free vibration patterns to play with.
|
||||
|
||||
If you are interested in this or my other projects, or would like to suggest and share ideas with me, or just talk to me, contact me: *[@eugene_serb](https://t.me/eugene_serb)*
|
||||
|
||||
|
150
about.html
Normal file
150
about.html
Normal file
@ -0,0 +1,150 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – About</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<meta name="color-scheme" content="light dark" />
|
||||
<meta name="robots" content="all" />
|
||||
|
||||
<link rel="canonical" href="https://wavelovers.ru/about.html" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<meta name="author" content="Eugene Serb" />
|
||||
<meta name="copyright" content="Wavelovers, 2022" />
|
||||
<meta name="publisher-email" content="eugene.serb@gmail.com" />
|
||||
<meta name="publisher-url" content="https://eugene-serb.github.io/" />
|
||||
<meta name="keywords" content="Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, advertise, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, реклама" />
|
||||
<meta name="description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
|
||||
<meta property="og:locale" content="en_US" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="Wavelovers – About" />
|
||||
<meta property="og:site_name" content="Wavelovers" />
|
||||
<meta property="og:description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
<meta property="og:url" content="https://wavelovers.ru/" />
|
||||
<meta property="og:image" content="https://wavelovers.ru/img/og.png" />
|
||||
<meta property="vk:image" content="https://wavelovers.ru/img/og.png" />
|
||||
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:creator" content="@eugene_serb" />
|
||||
<meta name="twitter:title" content="Wavelovers – About" />
|
||||
<meta name="twitter:description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
<meta name="twitter:image" content="https://wavelovers.ru/img/og.png" />
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() { dataLayer.push(arguments); }
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-59FM5E4MVD');
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript">
|
||||
(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});
|
||||
</script>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
</head>
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-wrapper container">
|
||||
<div class="logo-wrapper">
|
||||
<span class="logo-wrapper__logo">Wavelovers</span>
|
||||
</div>
|
||||
<nav class="menu-wrapper">
|
||||
<ul class="navigation">
|
||||
<li class="navigation__item">
|
||||
<a href="https://wavelovers.ru/" target="_self" class="navigation__link">Home</a>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<a href="https://wavelovers.ru/faq.html" target="_self" class="navigation__link">FAQ</a>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<a href="https://wavelovers.ru/about.html" target="_self" class="navigation__link">About</a>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<a href="https://wavelovers.ru/about.html#donate" target="_self" class="navigation__link">Donate</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="page container">
|
||||
<h1 class="visually-hidden">Wavelovers – Feedback</h1>
|
||||
<div class="wavelovers">
|
||||
<div class="content-item">
|
||||
<h2 class="content-item__header">Feedback</h2>
|
||||
<p>Hi! I am the author and developer of Wavelovers app and I want to thank you for using this app. If you have any ideas or wishes, you can write to me.</p>
|
||||
<br />
|
||||
<span>Write me: </span>
|
||||
<a href="mailto:eugene.serb@gmail.com" target="_blank">eugene.serb@gmail.com</a>
|
||||
<br />
|
||||
<span>Visit my homepage: </span>
|
||||
<a href="https://eugene-serb.github.io/" target="_blank">eugene-serb.github.io</a>
|
||||
<br />
|
||||
<span>Follow me on Twitter: </span>
|
||||
<a href="https://twitter.com/eugene_serb" target="_blank">@eugene_serb</a>
|
||||
</div>
|
||||
<div class="content-item">
|
||||
<h2 class="content-item__header">Advertising and collaboration</h2>
|
||||
<span>If you have advertising suggestions, please mail me: </span>
|
||||
<a href="mailto:eugene.serb@gmail.com" target="_blank">eugene.serb@gmail.com</a>
|
||||
</div>
|
||||
<div id="donate" class="content-item">
|
||||
<h2 class="content-item__header">Donate</h2>
|
||||
<span>If you like this app, you can thank me and donate to me.</span><br /><br />
|
||||
<span>Why should you donate to Wavelovers?</span><br /><br />
|
||||
<span>More donation = more money</span><br />
|
||||
<span>More money allows me buy more coffee</span><br />
|
||||
<span>More coffee makes me write more code</span><br />
|
||||
<span>More code means more features</span><br />
|
||||
<span>More features make you more happiness and productive</span><br />
|
||||
<span>More happiness and productive so you earn more money</span><br />
|
||||
<span>More money you earn more donation to me</span><br /><br />
|
||||
<span>Bitcoin: </span>
|
||||
<a href="bitcoin:bc1qspzgj7xrf099s2ej8f5zmm52xu0wkfurpezny5" target="_blank" class="link_hash">bc1qspzgj7xrf099s2ej8f5zmm52xu0wkfurpezny5</a><br />
|
||||
<span>DonationAlert: </span>
|
||||
<a href="https://www.donationalerts.com/r/eugene_serb" target="_blank" class="link_hash">@eugene_serb</a>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="footer-wrapper container">
|
||||
<div class="annotation">
|
||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
||||
</div>
|
||||
<div class="annotation created-by">
|
||||
<span class="annotation__text">Created by</span><a href="https://eugene-serb.github.io/" target="_blank">Eugene Serb.</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="https://eugene-serb.github.io/js/scripts.js"></script>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
234
assets/patterns.json
Normal file
234
assets/patterns.json
Normal file
@ -0,0 +1,234 @@
|
||||
[
|
||||
{
|
||||
"name": "Dotted Weak",
|
||||
"type": "Simple",
|
||||
"icon": "😌",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Dotted Strong",
|
||||
"type": "Simple",
|
||||
"icon": "😉",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Dotted AC",
|
||||
"type": "Simple",
|
||||
"icon": "🤨",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
},
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Dotted Max",
|
||||
"type": "Simple",
|
||||
"icon": "🙃",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Short Dashed Weak",
|
||||
"type": "Simple",
|
||||
"icon": "🙂",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Short Dashed Strong",
|
||||
"type": "Simple",
|
||||
"icon": "😇",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Short Dashed AC",
|
||||
"type": "Simple",
|
||||
"icon": "🤤",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
},
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Short Dashed Max",
|
||||
"type": "Simple",
|
||||
"icon": "😊",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Long Dashed Weak",
|
||||
"type": "Simple",
|
||||
"icon": "😋",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Long Dashed Strong",
|
||||
"type": "Simple",
|
||||
"icon": "😜",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Long Dashed AC",
|
||||
"type": "Simple",
|
||||
"icon": "😝",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
},
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Long Dashed Max",
|
||||
"type": "Simple",
|
||||
"icon": "🤪",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Constant Weak",
|
||||
"type": "Simple",
|
||||
"icon": "😏",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 0,
|
||||
"duration": 1000,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Constant Strong",
|
||||
"type": "Simple",
|
||||
"icon": "🤩",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 0,
|
||||
"duration": 1000,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Constant AC",
|
||||
"type": "Simple",
|
||||
"icon": "😵",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 0,
|
||||
"duration": 1000,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
},
|
||||
{
|
||||
"startDelay": 0,
|
||||
"duration": 1000,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Constant Max",
|
||||
"type": "Simple",
|
||||
"icon": "😍",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 0,
|
||||
"duration": 1000,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 1.0
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
402
css/styles.css
402
css/styles.css
@ -26,21 +26,36 @@
|
||||
--color-e: #B3DEE2;
|
||||
}
|
||||
|
||||
:root {
|
||||
/* Base numbers */
|
||||
--number-border-radius: 8px;
|
||||
--number-border-size: 2px;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
/* Base colors */
|
||||
--color-border: var(--color-a);
|
||||
--color-background: var(--color-white);
|
||||
--color-content-background: var(--color-milk);
|
||||
--color-logo: var(--color-white);
|
||||
--color-header: var(--color-coal);
|
||||
--color-text: var(--color-coal);
|
||||
--color-text-header: var(--color-coal);
|
||||
--color-link: var(--color-b);
|
||||
--color-link-hover: var(--color-a);
|
||||
--color-border: var(--color-a);
|
||||
--color-selection: var(--color-b);
|
||||
--color-table-header-background: transparent;
|
||||
--color-table-header-text: transparent;
|
||||
--color-table-item: transparent;
|
||||
--color-anotation: var(--color-coal);
|
||||
--color-fieldset-border: var(--color-c);
|
||||
--color-table-header-background: var(--color-b);
|
||||
--color-table-header-text: var(--color-white);
|
||||
--color-table-item: var(--color-c);
|
||||
/* Components colors */
|
||||
--color-header-background: var(--color-b);
|
||||
--color-header-borderline: var(--color-a);
|
||||
--color-header-selection: var(--color-a);
|
||||
--color-header-logo: var(--color-white);
|
||||
--color-header-navigation-link: var(--color-white);
|
||||
--color-header-navigation-link-hover: var(--color-white);
|
||||
--color-footer-borderline: var(--color-a);
|
||||
--color-footer-text: var(--color-coal);
|
||||
--color-content-item-background: var(--color-milk);
|
||||
--color-pattern-button: var(--color-c);
|
||||
--color-pattern-text: var(--color-white);
|
||||
}
|
||||
@ -48,19 +63,28 @@
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
/* Base colors */
|
||||
--color-border: var(--color-a);
|
||||
--color-background: var(--color-coal);
|
||||
--color-content-background: var(--color-c);
|
||||
--color-logo: var(--color-white);
|
||||
--color-header: var(--color-coal);
|
||||
--color-text: var(--color-coal);
|
||||
--color-text-header: var(--color-coal);
|
||||
--color-link: var(--color-b);
|
||||
--color-link-hover: var(--color-a);
|
||||
--color-border: var(--color-a);
|
||||
--color-selection: var(--color-b);
|
||||
--color-table-header-background: transparent;
|
||||
--color-table-header-text: transparent;
|
||||
--color-table-item: transparent;
|
||||
--color-anotation: var(--color-milk);
|
||||
--color-fieldset-border: var(--color-c);
|
||||
--color-table-header-background: var(--color-b);
|
||||
--color-table-header-text: var(--color-white);
|
||||
--color-table-item: var(--color-c);
|
||||
/* Components colors */
|
||||
--color-header-background: var(--color-b);
|
||||
--color-header-borderline: var(--color-a);
|
||||
--color-header-selection: var(--color-b);
|
||||
--color-header-logo: var(--color-white);
|
||||
--color-header-navigation-link: var(--color-white);
|
||||
--color-header-navigation-link-hover: var(--color-white);
|
||||
--color-footer-borderline: var(--color-a);
|
||||
--color-footer-text: var(--color-milk);
|
||||
--color-content-item-background: var(--color-c);
|
||||
--color-pattern-button: var(--color-milk);
|
||||
--color-pattern-text: var(--color-black);
|
||||
}
|
||||
@ -85,12 +109,17 @@ body {
|
||||
background: var(--color-selection);
|
||||
}
|
||||
|
||||
:focus {
|
||||
border-bottom: 2px solid var(--color-selection);
|
||||
}
|
||||
|
||||
:focus-visible {
|
||||
outline: 2px solid var(--color-selection);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: var(--color-header);
|
||||
color: var(--color-text-header);
|
||||
font-weight: 500;
|
||||
margin-block-start: 0.382em;
|
||||
margin-block-end: 0.618em;
|
||||
@ -140,9 +169,21 @@ hr {
|
||||
margin-block-end: 0.5em;
|
||||
}
|
||||
|
||||
legend {
|
||||
padding: 2px 4px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
border: 2px solid var(--color-border-alpha);
|
||||
border-radius: 4px;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
button, input, textarea, select {
|
||||
padding: 4px 8px;
|
||||
border: 2px solid var(--color-link);
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-milk);
|
||||
color: var(--color-text);
|
||||
font-size: 16px;
|
||||
@ -168,15 +209,38 @@ option {
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
fieldset {
|
||||
border: 2px solid var(--color-border-alpha);
|
||||
border-radius: 4px;
|
||||
/* ------ */
|
||||
/* TABLES */
|
||||
/* ------ */
|
||||
|
||||
table, th, td {
|
||||
width: 100%;
|
||||
padding: 8px;
|
||||
border-collapse: collapse;
|
||||
table-layout: fixed;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
legend {
|
||||
padding: 2px 4px;
|
||||
text-align: left;
|
||||
.table_pink thead {
|
||||
border-bottom: 4px solid var(--color-table-item);
|
||||
}
|
||||
|
||||
.table_pink thead > tr {
|
||||
background-color: var(--color-table-header-background);
|
||||
color: var(--color-table-header-text);
|
||||
}
|
||||
|
||||
.table_pink thead > tr > th {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.table_pink tbody > tr:nth-child(even) {
|
||||
background-color: var(--color-table-item);
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
.table_pink tfoot {
|
||||
border-top: 4px solid var(--color-table-header-background);
|
||||
}
|
||||
|
||||
/* ------------- */
|
||||
@ -208,33 +272,32 @@ legend {
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
/* ------ */
|
||||
/* BANNER */
|
||||
/* ------ */
|
||||
|
||||
.banner-container {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.banner {
|
||||
margin: auto;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
/* ------------ */
|
||||
/* ITEMS STYLES */
|
||||
/* ------------ */
|
||||
/* ----------------- */
|
||||
/* COMPONENTS STYLES */
|
||||
/* ----------------- */
|
||||
|
||||
/* ------ */
|
||||
/* HEADER */
|
||||
/* ------ */
|
||||
|
||||
.header {
|
||||
border-bottom: 32px solid var(--color-border);
|
||||
background: var(--color-b);
|
||||
border-bottom: 32px solid var(--color-header-borderline);
|
||||
background: var(--color-header-background);
|
||||
}
|
||||
|
||||
.header ::selection {
|
||||
background: var(--color-header-selection);
|
||||
}
|
||||
|
||||
.header :focus {
|
||||
border-bottom: 2px solid var(--color-header-navigation-link-hover);
|
||||
}
|
||||
|
||||
.header :focus-visible {
|
||||
outline: 2px solid var(--color-header-navigation-link-hover);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.header-wrapper {
|
||||
padding-top: 64px;
|
||||
padding-bottom: 16px;
|
||||
@ -247,19 +310,8 @@ legend {
|
||||
.logo-wrapper__logo {
|
||||
font-size: 48px;
|
||||
font-weight: 500;
|
||||
color: var(--color-logo);
|
||||
}
|
||||
|
||||
.logo-wrapper__logo::selection {
|
||||
background-color: var(--color-a);
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.logo-wrapper__logo {
|
||||
font-size: 64px;
|
||||
font-weight: 500;
|
||||
color: var(--color-logo);
|
||||
}
|
||||
color: var(--color-header-logo);
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.menu-wrapper {
|
||||
@ -271,7 +323,10 @@ legend {
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.navigation__item {
|
||||
@ -280,58 +335,40 @@ legend {
|
||||
}
|
||||
|
||||
.navigation__item a {
|
||||
color: var(--color-logo);
|
||||
border-color: transparent;
|
||||
color: var(--color-header-navigation-link);
|
||||
}
|
||||
|
||||
.navigation__item a:hover {
|
||||
color: var(--color-logo);
|
||||
border-color: var(--color-logo);
|
||||
}
|
||||
|
||||
.navigation__item a::selection {
|
||||
background: var(--color-a);
|
||||
border-color: var(--color-header-navigation-link-hover);
|
||||
color: var(--color-header-navigation-link-hover);
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 720px) {
|
||||
.header-wrapper {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 32px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: space-between;
|
||||
gap: 64px;
|
||||
}
|
||||
|
||||
.logo-wrapper {
|
||||
grid-column: 1 / 2;
|
||||
grid-row: 1 / 2;
|
||||
width: 50%;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.menu-wrapper {
|
||||
width: 50%;
|
||||
margin-top: 0px;
|
||||
grid-column: 2 / 3;
|
||||
grid-row: 1 / 2;
|
||||
align-self: flex-end;
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------- */
|
||||
/* MAIN, PAGE FLOW AND CONTENT SECTION */
|
||||
/* ----------------------------------- */
|
||||
|
||||
.page {
|
||||
flex-grow: 1;
|
||||
margin-top: 64px;
|
||||
margin-bottom: 64px;
|
||||
}
|
||||
|
||||
.content {
|
||||
margin-bottom: 16px;
|
||||
padding: 32px;
|
||||
border-radius: 8px;
|
||||
background: var(--color-content-background);
|
||||
}
|
||||
|
||||
.content__header {
|
||||
text-align: center;
|
||||
@media only screen and (min-width: 1024px) {
|
||||
.logo-wrapper__logo {
|
||||
font-size: 64px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ------ */
|
||||
@ -339,56 +376,121 @@ legend {
|
||||
/* ------ */
|
||||
|
||||
.footer {
|
||||
border-top: 4px solid var(--color-a);
|
||||
background: var(--color-background);
|
||||
border-top: 4px solid var(--color-footer-borderline);
|
||||
}
|
||||
|
||||
.footer span {
|
||||
color: var(--color-footer-text);
|
||||
}
|
||||
|
||||
.footer-wrapper {
|
||||
padding-top: 32px;
|
||||
padding-bottom: 32px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
gap: 32px;
|
||||
}
|
||||
|
||||
.annotation__text {
|
||||
color: var(--color-anotation);
|
||||
.created-by {
|
||||
align-self: flex-end;
|
||||
}
|
||||
|
||||
.created-by > span {
|
||||
padding-right: 8px;
|
||||
}
|
||||
|
||||
.created-by {
|
||||
align-self: end;
|
||||
.created-by > a {
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
.created-by > span {
|
||||
padding-right: 8px;
|
||||
}
|
||||
/* ---- */
|
||||
/* PAGE */
|
||||
/* ---- */
|
||||
|
||||
.created-by > a {
|
||||
font-size: 32px;
|
||||
}
|
||||
.page {
|
||||
flex-grow: 1;
|
||||
margin-top: 64px;
|
||||
margin-bottom: 64px;
|
||||
}
|
||||
|
||||
.created-by > a:hover {
|
||||
border: none;
|
||||
}
|
||||
/* ---- */
|
||||
/* POST */
|
||||
/* ---- */
|
||||
|
||||
.post {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.post__header {
|
||||
text-align: center;
|
||||
margin-block-end: 32px;
|
||||
}
|
||||
|
||||
/* ------- */
|
||||
/* CONTENT */
|
||||
/* ------- */
|
||||
|
||||
|
||||
.content {
|
||||
margin-bottom: 64px;
|
||||
}
|
||||
|
||||
.content__header {
|
||||
margin-top: 0;
|
||||
margin-bottom: 32px;
|
||||
padding-left: 16px;
|
||||
border: 2px solid var(--color-content-borderline);
|
||||
border-radius: var(--number-border-radius);
|
||||
color: var(--color-text-header);
|
||||
font-size: 1.8em;
|
||||
}
|
||||
|
||||
.content-item {
|
||||
margin-bottom: 16px;
|
||||
padding: 32px;
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-content-item-background);
|
||||
}
|
||||
|
||||
.content-item__header {
|
||||
margin-bottom: 16px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ----------- */
|
||||
/* WAVE MASTER */
|
||||
/* WAVELOVERS */
|
||||
/* ----------- */
|
||||
|
||||
.wavelovers {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-direction: column-reverse;
|
||||
justify-content: flex-start;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.wavelovers {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
.message {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
font-size: 24px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.message {
|
||||
font-size: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
.pattern-box {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@ -398,37 +500,43 @@ legend {
|
||||
.pattern-list {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
justify-content: space-around;
|
||||
flex-wrap: wrap;
|
||||
gap: 32px;
|
||||
}
|
||||
|
||||
.pattern-item {
|
||||
width: 300px;
|
||||
height: 64px;
|
||||
padding: 16px;
|
||||
border-radius: 8px;
|
||||
width: 100%;
|
||||
height: 48px;
|
||||
padding: 8px;
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-pattern-button);
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
gap: 32px;
|
||||
gap: 16px;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
overflow: hidden;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.pattern-item {
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
.pattern-item__selected {
|
||||
background: var(--color-b);
|
||||
}
|
||||
|
||||
.pattern-item__icon{
|
||||
font-size: 32px;
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.pattern-item__name {
|
||||
font-size: 18px;
|
||||
font-size: 14px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
color: var(--color-pattern-text);
|
||||
@ -469,50 +577,34 @@ legend {
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
.controls-box {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
flex-wrap: wrap;
|
||||
gap: 32px;
|
||||
.link_hash {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.controls-box__item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.controls-box__item > span {
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.gamepad-button-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
.faq__ask {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.gamepad-button {
|
||||
width: 4ch;
|
||||
height: 4ch;
|
||||
border: 1px solid black;
|
||||
border-radius: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background: grey;
|
||||
color: white;
|
||||
text-align: center;
|
||||
}
|
||||
.faq__reply {
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
.gamepad-button > span { color: var(--color-white); }
|
||||
/* ----- */
|
||||
/* PAGES */
|
||||
/* ----- */
|
||||
|
||||
.gamepad-button_a { background: green; }
|
||||
.gamepad-button_b { background: red; }
|
||||
.gamepad-button_x { background: blue; }
|
||||
.gamepad-button_y { background: orange; }
|
||||
/* ------ */
|
||||
/* BANNER */
|
||||
/* ------ */
|
||||
|
||||
.banner-container {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.banner {
|
||||
margin: auto;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
|
150
faq.html
Normal file
150
faq.html
Normal file
@ -0,0 +1,150 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – FAQ</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<meta name="color-scheme" content="light dark" />
|
||||
<meta name="robots" content="all" />
|
||||
|
||||
<link rel="canonical" href="https://wavelovers.ru/faq.html" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<meta name="author" content="Eugene Serb" />
|
||||
<meta name="copyright" content="Wavelovers, 2022" />
|
||||
<meta name="publisher-email" content="eugene.serb@gmail.com" />
|
||||
<meta name="publisher-url" content="https://eugene-serb.github.io/" />
|
||||
<meta name="keywords" content="Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, FAQ, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, часто задаваеиые вопросы" />
|
||||
<meta name="description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
|
||||
<meta property="og:locale" content="en_US" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="Wavelovers – FAQ" />
|
||||
<meta property="og:site_name" content="Wavelovers" />
|
||||
<meta property="og:description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
<meta property="og:url" content="https://wavelovers.ru/" />
|
||||
<meta property="og:image" content="https://wavelovers.ru/img/og.png" />
|
||||
<meta property="vk:image" content="https://wavelovers.ru/img/og.png" />
|
||||
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:creator" content="@eugene_serb" />
|
||||
<meta name="twitter:title" content="Wavelovers – FAQ" />
|
||||
<meta name="twitter:description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
<meta name="twitter:image" content="https://wavelovers.ru/img/og.png" />
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() { dataLayer.push(arguments); }
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-59FM5E4MVD');
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript">
|
||||
(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});
|
||||
</script>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
</head>
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-wrapper container">
|
||||
<div class="logo-wrapper">
|
||||
<span class="logo-wrapper__logo">Wavelovers</span>
|
||||
</div>
|
||||
<nav class="menu-wrapper">
|
||||
<ul class="navigation">
|
||||
<li class="navigation__item">
|
||||
<a href="https://wavelovers.ru/" target="_self" class="navigation__link">Home</a>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<a href="https://wavelovers.ru/faq.html" target="_self" class="navigation__link">FAQ</a>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<a href="https://wavelovers.ru/about.html" target="_self" class="navigation__link">About</a>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<a href="https://wavelovers.ru/about.html#donate" target="_self" class="navigation__link">Donate</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="page container">
|
||||
<h1 class="visually-hidden">Wavelovers – FAQ</h1>
|
||||
<div class="wavelovers">
|
||||
<div class="content-item">
|
||||
<h2 class="content-item__header">FAQ</h2>
|
||||
<span class="faq__ask">What is the purpose of this software?</span><br />
|
||||
<span class="faq__reply">Everyone decides for himself, but can be used as a gamepad vibration tester, or as a hand massager.</span><br /><br />
|
||||
|
||||
<span class="faq__ask">Can I use this software as a hand massager?</span><br />
|
||||
<span class="faq__reply">Yes of course. If you use this as a massager, then before the session I recommend consulting with a doctor.</span><br /><br />
|
||||
|
||||
<span class="faq__ask">I have a gamepad with vibration, what should I do before using it as a hand massager?</span><br />
|
||||
<span class="faq__reply">I recommend checking the device for correct operation, mechanical damage, and be sure to use an antiseptic.</span><br /><br />
|
||||
|
||||
<span class="faq__ask">I'm having problems with the app or connecting my device to the app?</span><br />
|
||||
<span class="faq__reply">Go to Troubleshooting.</span>
|
||||
</div>
|
||||
<div class="content-item">
|
||||
<h2 class="content-item__header">Troubleshooting</h2>
|
||||
<span>If you are having difficulty detecting a gamepad by the browser, you can use the utility</span>
|
||||
<a href="https://eugene-serb.github.io/gamepad-master/" target="_blank">Gamepad Master</a><br /><br />
|
||||
|
||||
<span class="faq__ask">The app does not see my device.</span><br />
|
||||
<span class="faq__reply">Make sure you have a chromium-based browser, then update the app and reconnect your device.</span><br /><br />
|
||||
|
||||
<span class="faq__ask">The application sees the gamepad, but writes that the vibration actuator is missing.</span><br />
|
||||
<span class="faq__reply">This problem is specific to mozilla firefox browser and d-input mode. Check the system requirements before using the software.</span><br /><br />
|
||||
|
||||
<span class="faq__ask">My question is not here.</span><br />
|
||||
<span class="faq__reply">Write me </span><a href="mailto:eugene.serb@gmail.com" target="_blank">eugene.serb@gmail.com</a>
|
||||
</div>
|
||||
<div class="content-item">
|
||||
<h2 class="content-item__header">System Requirements</h2>
|
||||
<span>Gamepad: X-Input and vibration actuator required.</span><br />
|
||||
<span>Browser: Google Chrome or any other Chromium-based browser is recommended.</span><br />
|
||||
<span>OS: Windows 7 or higher recommended.</span><br />
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="footer-wrapper container">
|
||||
<div class="annotation">
|
||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
||||
</div>
|
||||
<div class="annotation created-by">
|
||||
<span class="annotation__text">Created by</span><a href="https://eugene-serb.github.io/" target="_blank">Eugene Serb.</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="https://eugene-serb.github.io/js/scripts.js"></script>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
63
index.html
63
index.html
@ -9,19 +9,19 @@
|
||||
<meta name="color-scheme" content="light dark" />
|
||||
<meta name="robots" content="all" />
|
||||
|
||||
<link rel="canonical" href="https://eugene-serb.github.io/wavelovers/" />
|
||||
<link rel="stylesheet" type="text/css" href="css/styles.css" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://eugene-serb.github.io/wavelovers/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://eugene-serb.github.io/wavelovers/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://eugene-serb.github.io/wavelovers/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://eugene-serb.github.io/wavelovers/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://eugene-serb.github.io/wavelovers/site.webmanifest" />
|
||||
<link rel="canonical" href="https://wavelovers.ru/" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<meta name="author" content="Eugene Serb" />
|
||||
<meta name="copyright" content="Wavelovers, 2022" />
|
||||
<meta name="publisher-email" content="eugene.serb@gmail.com" />
|
||||
<meta name="publisher-url" content="https://eugene-serb.github.io/" />
|
||||
<meta name="keywords" content="Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Massager, Vibrator, Gamepad, Gamepad Vibration, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Relax, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона" />
|
||||
<meta name="keywords" content="Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона" />
|
||||
<meta name="description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
|
||||
<meta property="og:locale" content="en_US" />
|
||||
@ -29,40 +29,35 @@
|
||||
<meta property="og:title" content="Wavelovers" />
|
||||
<meta property="og:site_name" content="Wavelovers" />
|
||||
<meta property="og:description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
<meta property="og:url" content="https://eugene-serb.github.io/wavelovers/" />
|
||||
<meta property="og:image" content="https://eugene-serb.github.io/wavelovers/img/og.png" />
|
||||
<meta property="vk:image" content="https://eugene-serb.github.io/wavelovers/img/og.png" />
|
||||
<meta property="og:url" content="https://wavelovers.ru/" />
|
||||
<meta property="og:image" content="https://wavelovers.ru/img/og.png" />
|
||||
<meta property="vk:image" content="https://wavelovers.ru/img/og.png" />
|
||||
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:creator" content="@eugene_serb" />
|
||||
<meta name="twitter:title" content="Wavelovers" />
|
||||
<meta name="twitter:description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
<meta name="twitter:image" content="https://eugene-serb.github.io/wavelovers/img/og.png" />
|
||||
|
||||
<meta name="google-site-verification" content="qLQbgnmQEfvprDF8WR6oL_b_Qt0R9kKcIEOfHqWlFm8" />
|
||||
<meta name="yandex-verification" content="e6e0bff7caaa7ecd" />
|
||||
<meta name="msvalidate.01" content="6E1771734F083E5366205F06314C3577" />
|
||||
<meta name='wmail-verification' content='46d069b79f9c774ce0bbf55f46aef201' />
|
||||
<meta name="twitter:image" content="https://wavelovers.ru/img/og.png" />
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-4NB4LGNNLB"></script>
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() { dataLayer.push(arguments); }
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-4NB4LGNNLB');
|
||||
gtag('config', 'G-59FM5E4MVD');
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(79722217, "init", {
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
@ -77,19 +72,19 @@
|
||||
<div class="logo-wrapper">
|
||||
<span class="logo-wrapper__logo">Wavelovers</span>
|
||||
</div>
|
||||
<nav class="menu-wrapper hidden">
|
||||
<nav class="menu-wrapper">
|
||||
<ul class="navigation">
|
||||
<li class="navigation__item">
|
||||
<a href="https://eugene-serb.github.io/wavelovers/" target="_self" class="navigation__link">Home</a>
|
||||
<a href="https://wavelovers.ru/" target="_self" class="navigation__link">Home</a>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<a href="https://eugene-serb.github.io/wavelovers/#faq" target="_self" class="navigation__link">FAQ</a>
|
||||
<a href="https://wavelovers.ru/faq.html" target="_self" class="navigation__link">FAQ</a>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<a href="https://eugene-serb.github.io/wavelovers/#buy" target="_self" class="navigation__link">Buy Pro</a>
|
||||
<a href="https://wavelovers.ru/about.html" target="_self" class="navigation__link">About</a>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<a href="https://eugene-serb.github.io/wavelovers/#donate" target="_self" class="navigation__link">Donate</a>
|
||||
<a href="https://wavelovers.ru/about.html#donate" target="_self" class="navigation__link">Donate</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
@ -99,10 +94,14 @@
|
||||
<main class="page container">
|
||||
<h1 class="visually-hidden">Wavelovers</h1>
|
||||
<div class="wavelovers">
|
||||
<div id="pattern-box" class="content pattern-box">
|
||||
<div id="pattern-list" class="pattern-list"></div>
|
||||
<div id="pattern-box" class="content-item pattern-box">
|
||||
<div id="pattern-list" class="pattern-list">
|
||||
<div class="message">
|
||||
<span>Loading...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="device-box" class="content">
|
||||
<div id="device-box" class="content-item">
|
||||
<div class="message">
|
||||
<span id="message"></span>
|
||||
</div>
|
||||
@ -114,7 +113,7 @@
|
||||
<footer class="footer">
|
||||
<div class="footer-wrapper container">
|
||||
<div class="annotation">
|
||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://eugene-serb.github.io/wavelovers/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
||||
</div>
|
||||
<div class="annotation created-by">
|
||||
@ -123,9 +122,9 @@
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="js/scripts.js"></script>
|
||||
<script src="https://wavelovers.ru/js/scripts.js"></script>
|
||||
<script src="https://eugene-serb.github.io/js/scripts.js"></script>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/79722217" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
318
js/scripts.js
318
js/scripts.js
@ -4,193 +4,54 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const __PATTERNS = [
|
||||
/* Dotted, 0.1s, 0.1s */
|
||||
{
|
||||
name: 'Dotted Weak',
|
||||
type: 'Simple',
|
||||
icon: '😌',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 100,
|
||||
duration: 100,
|
||||
weakMagnitude: 1.0,
|
||||
strongMagnitude: 0.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Dotted Strong',
|
||||
type: 'Simple',
|
||||
icon: '😉',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 100,
|
||||
duration: 100,
|
||||
weakMagnitude: 0.0,
|
||||
strongMagnitude: 1.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Dotted Max',
|
||||
type: 'Simple',
|
||||
icon: '🙃',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 0,
|
||||
duration: 100,
|
||||
weakMagnitude: 1.0,
|
||||
strongMagnitude: 1.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
/* Short Dashed, 0.1s, 0.25s */
|
||||
{
|
||||
name: 'Short Dashed Weak',
|
||||
type: 'Simple',
|
||||
icon: '🙂',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 100,
|
||||
duration: 250,
|
||||
weakMagnitude: 1.0,
|
||||
strongMagnitude: 0.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Short Dashed Strong',
|
||||
type: 'Simple',
|
||||
icon: '😇',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 100,
|
||||
duration: 250,
|
||||
weakMagnitude: 0.0,
|
||||
strongMagnitude: 1.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Short Dashed Max',
|
||||
type: 'Simple',
|
||||
icon: '😊',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 0,
|
||||
duration: 250,
|
||||
weakMagnitude: 1.0,
|
||||
strongMagnitude: 1.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
/* Long Dashed, 0.1s, 0.5s */
|
||||
{
|
||||
name: 'Long Dashed Weak',
|
||||
type: 'Simple',
|
||||
icon: '😋',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 100,
|
||||
duration: 500,
|
||||
weakMagnitude: 1.0,
|
||||
strongMagnitude: 0.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Long Dashed Strong',
|
||||
type: 'Simple',
|
||||
icon: '😜',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 100,
|
||||
duration: 500,
|
||||
weakMagnitude: 0.0,
|
||||
strongMagnitude: 1.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Long Dashed Max',
|
||||
type: 'Simple',
|
||||
icon: '🤪',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 0,
|
||||
duration: 500,
|
||||
weakMagnitude: 1.0,
|
||||
strongMagnitude: 1.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
/* Constant, 0s, 1s */
|
||||
{
|
||||
name: 'Constant Weak',
|
||||
type: 'Simple',
|
||||
icon: '😏',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 0,
|
||||
duration: 1000,
|
||||
weakMagnitude: 1.0,
|
||||
strongMagnitude: 0.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Constant Strong',
|
||||
type: 'Simple',
|
||||
icon: '🤩',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 0,
|
||||
duration: 1000,
|
||||
weakMagnitude: 0.0,
|
||||
strongMagnitude: 1.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Constant Max',
|
||||
type: 'Simple',
|
||||
icon: '😍',
|
||||
pattern: [
|
||||
{
|
||||
startDelay: 0,
|
||||
duration: 1000,
|
||||
weakMagnitude: 1.0,
|
||||
strongMagnitude: 1.0,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
class Library {
|
||||
constructor() {
|
||||
if (typeof Library.instance === 'object') {
|
||||
return Library.instance;
|
||||
};
|
||||
this.init();
|
||||
Library.instance = this;
|
||||
return this;
|
||||
};
|
||||
init = () => {
|
||||
this.state = 'load';
|
||||
this.patterns = this.update();
|
||||
};
|
||||
update = async () => {
|
||||
const url = 'https://wavelovers.ru/assets/patterns.json';
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
if (response.ok) {
|
||||
let json = await response.json();
|
||||
this.patterns = json;
|
||||
this.state = 'draw';
|
||||
} else {
|
||||
console.log('Connect to the Internet for download more patterns...');
|
||||
this.state = 'fail';
|
||||
};
|
||||
} catch (error) {
|
||||
console.log('[error]', error);
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class Gamepad {
|
||||
constructor(gamepad, $container, library) {
|
||||
constructor(gamepad, $container) {
|
||||
this.unit = gamepad;
|
||||
this.$container = $container;
|
||||
this.library = library;
|
||||
this.init();
|
||||
};
|
||||
|
||||
init = () => {
|
||||
this.id = Date.now();
|
||||
this.canVibrate = (this.unit.vibrationActuator) ? true : false;
|
||||
this.isSelected = false;
|
||||
this.isVibrating = false;
|
||||
this.isLocked = false;
|
||||
this.cooldown = 0;
|
||||
|
||||
this.library = new Library;
|
||||
|
||||
this.index = 0;
|
||||
this.pattern = [
|
||||
{
|
||||
startDelay: 0,
|
||||
duration: 1000,
|
||||
weakMagnitude: 1.0,
|
||||
strongMagnitude: 1.0,
|
||||
}
|
||||
];
|
||||
this.pattern = this.library.patterns[this.index].pattern;
|
||||
|
||||
this.generateBox();
|
||||
};
|
||||
|
||||
@ -232,7 +93,7 @@ class Gamepad {
|
||||
};
|
||||
vibrate = async () => {
|
||||
this.isVibrating = true;
|
||||
this.pattern = this.library[this.index].pattern;
|
||||
this.pattern = this.library.patterns[this.index].pattern;
|
||||
|
||||
while (this.isVibrating) {
|
||||
for (let i = 0; i < this.pattern.length; i++) {
|
||||
@ -248,49 +109,19 @@ class Gamepad {
|
||||
sleep = (ms) => {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
};
|
||||
previous = () => {
|
||||
if (Date.now() >= this.cooldown) {
|
||||
if (this.index === 0) {
|
||||
this.index = this.library.length - 1;
|
||||
} else {
|
||||
this.index--;
|
||||
};
|
||||
this.pattern = this.library[this.index].pattern;
|
||||
this.cooldown = Date.now() + 500;
|
||||
};
|
||||
};
|
||||
next = () => {
|
||||
if (Date.now() >= this.cooldown) {
|
||||
if (this.index === this.library.length - 1) {
|
||||
this.index = 0;
|
||||
} else {
|
||||
this.index++;
|
||||
};
|
||||
this.pattern = this.library[this.index].pattern;
|
||||
this.cooldown = Date.now() + 500;
|
||||
};
|
||||
};
|
||||
lock = () => {
|
||||
if (Date.now() >= this.cooldown) {
|
||||
this.isLocked = !this.isLocked;
|
||||
this.cooldown = Date.now() + 500;
|
||||
};
|
||||
};
|
||||
|
||||
change = (index) => {
|
||||
this.index = index;
|
||||
this.pattern = this.library[this.index].pattern;
|
||||
this.pattern = this.library.patterns[this.index].pattern;
|
||||
};
|
||||
};
|
||||
|
||||
class VibrationMaster {
|
||||
class Wavelovers {
|
||||
constructor() {
|
||||
this.init();
|
||||
};
|
||||
init = () => {
|
||||
this.#DOMs();
|
||||
this.patterns = __PATTERNS;
|
||||
this.print(this.patterns);
|
||||
this.library = new Library();
|
||||
|
||||
if (!this.checkGamepadSupport()) {
|
||||
console.log(`This browser does not support of gamepads.`);
|
||||
@ -328,33 +159,15 @@ class VibrationMaster {
|
||||
gamepad.draw();
|
||||
});
|
||||
};
|
||||
};
|
||||
eventHandler = () => {
|
||||
if (this.gamepads.length > 0) {
|
||||
this.gamepads.forEach(gamepad => {
|
||||
if (gamepad.canVibrate === true) {
|
||||
if (gamepad.unit.buttons[2].pressed === true &&
|
||||
gamepad.unit.buttons[3].pressed === true) {
|
||||
gamepad.lock();
|
||||
};
|
||||
if (gamepad.isLocked === false) {
|
||||
if (gamepad.unit.buttons[0].pressed === true) {
|
||||
if (gamepad.isVibrating === false) {
|
||||
gamepad.vibrate();
|
||||
};
|
||||
};
|
||||
if (gamepad.unit.buttons[1].pressed === true) {
|
||||
gamepad.reset();
|
||||
};
|
||||
if (gamepad.unit.buttons[4].pressed === true) {
|
||||
gamepad.previous();
|
||||
};
|
||||
if (gamepad.unit.buttons[5].pressed === true) {
|
||||
gamepad.next();
|
||||
};
|
||||
};
|
||||
};
|
||||
});
|
||||
if (this.library.state === 'draw') {
|
||||
this.print(this.library.patterns);
|
||||
this.library.state = 'ready';
|
||||
};
|
||||
if (this.library.state === 'fail') {
|
||||
this.$PATTERN_LIST.innerHTML = `
|
||||
<div class="message">
|
||||
<span>Loading error...</span>
|
||||
</div>`;
|
||||
};
|
||||
};
|
||||
|
||||
@ -384,15 +197,17 @@ class VibrationMaster {
|
||||
change = (index) => {
|
||||
if (this.gamepads.length > 0) {
|
||||
this.gamepads.forEach(gamepad => {
|
||||
this.unselect();
|
||||
if (gamepad.index === index &&
|
||||
gamepad.isVibrating === true) {
|
||||
gamepad.isVibrating = false;
|
||||
gamepad.reset();
|
||||
} else {
|
||||
gamepad.change(index);
|
||||
gamepad.vibrate();
|
||||
this.select(index);
|
||||
if (gamepad.canVibrate === true) {
|
||||
this.unselect(this.library.patterns);
|
||||
if (gamepad.index === index &&
|
||||
gamepad.isVibrating === true) {
|
||||
gamepad.reset();
|
||||
} else {
|
||||
gamepad.reset()
|
||||
gamepad.change(index);
|
||||
gamepad.vibrate();
|
||||
this.select(this.library.patterns, index);
|
||||
};
|
||||
};
|
||||
});
|
||||
} else {
|
||||
@ -401,13 +216,13 @@ class VibrationMaster {
|
||||
};
|
||||
};
|
||||
|
||||
unselect = () => {
|
||||
this.patterns.forEach(pattern => {
|
||||
unselect = (patterns) => {
|
||||
patterns.forEach(pattern => {
|
||||
pattern['container'].classList.remove('pattern-item__selected');
|
||||
});
|
||||
};
|
||||
select = (index) => {
|
||||
this.patterns[index]['container'].classList.add('pattern-item__selected');
|
||||
select = (patterns, index) => {
|
||||
patterns[index]['container'].classList.add('pattern-item__selected');
|
||||
};
|
||||
|
||||
checkGamepadSupport = () => {
|
||||
@ -426,7 +241,7 @@ class VibrationMaster {
|
||||
if (this.gamepads.length > 1) {
|
||||
return;
|
||||
} else {
|
||||
this.gamepads.push(new Gamepad(event.gamepad, this.$DEVICE_LIST, this.patterns));
|
||||
this.gamepads.push(new Gamepad(event.gamepad, this.$DEVICE_LIST));
|
||||
};
|
||||
});
|
||||
window.addEventListener('gamepaddisconnected', (event) => {
|
||||
@ -436,6 +251,7 @@ class VibrationMaster {
|
||||
this.gamepads.splice(index, 1);
|
||||
};
|
||||
});
|
||||
this.unselect();
|
||||
});
|
||||
};
|
||||
};
|
||||
@ -444,5 +260,5 @@ class VibrationMaster {
|
||||
/* INITIALIZATION */
|
||||
/* -------------- */
|
||||
|
||||
const VIBRATION_MASTER = new VibrationMaster();
|
||||
const WAVELOVERS = new Wavelovers();
|
||||
|
||||
|
13
robots.txt
Normal file
13
robots.txt
Normal file
@ -0,0 +1,13 @@
|
||||
#
|
||||
# robots.txt at https://wavelovers.ru/
|
||||
#
|
||||
# Follow me on Twitter: @eugene_serb
|
||||
# Author: https://eugene-serb.github.io/
|
||||
#
|
||||
|
||||
# All Bots
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
Sitemap: https://wavelovers.ru/sitemap.xml
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "",
|
||||
"short_name": "",
|
||||
"name": "Wavelovers",
|
||||
"short_name": "Wavelovers",
|
||||
"icons": [
|
||||
{
|
||||
"src": "https://eugene-serb.github.io/wavelovers/img/android-chrome-192x192.png",
|
||||
@ -13,8 +13,8 @@
|
||||
"type": "image/png"
|
||||
}
|
||||
],
|
||||
"theme_color": "#ffffff",
|
||||
"background_color": "#ffffff",
|
||||
"theme_color": "#EFCFE3",
|
||||
"background_color": "#EFCFE3",
|
||||
"display": "standalone"
|
||||
}
|
||||
|
||||
|
22
sitemap-internal.xml
Normal file
22
sitemap-internal.xml
Normal file
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/</loc>
|
||||
<lastmod>2022-06-24</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/about.html</loc>
|
||||
<lastmod>2022-06-24</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/faq.html</loc>
|
||||
<lastmod>2022-06-24</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
</urlset>
|
||||
|
8
sitemap.xml
Normal file
8
sitemap.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<sitemap>
|
||||
<loc>https://wavelovers.ru/sitemap-internal.xml</loc>
|
||||
<lastmod>2022-06-24</lastmod>
|
||||
</sitemap>
|
||||
</sitemapindex>
|
||||
|
Loading…
Reference in New Issue
Block a user