Merge pull request #7 from eugene-serb/dev

Dev
This commit is contained in:
Eugene Serb 2022-07-22 20:32:11 +03:00 committed by GitHub
commit f9b425483b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
66 changed files with 1807 additions and 933 deletions

1
.gitignore vendored
View File

@ -372,3 +372,4 @@ pnpm-debug.log*
*.njsproj
*.sln
*.sw?

1
CNAME
View File

@ -1 +0,0 @@
wavelovers.ru

View File

@ -1,5 +1,5 @@
# Wavelovers
Wavelovers in ***VueJS***, ***Typescript***, ***Javascript***, ***HTML*** and ***CSS*** **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://wavelovers.ru/)]**.
Wavelovers in ***VueJS***, ***Typescript***, ***Javascript***, ***HTML***, ***CSS*** and ***SCSS*** **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://wavelovers.ru/)]**.
This is Wavelovers, which can make a vibrating massager out of a gamepad. It has 16 free vibration patterns to play with.

View File

@ -29,6 +29,16 @@
margin-bottom: 0 !important;
}
}
.banner-container {
min-height: 100vh;
display: flex;
}
.banner {
margin: auto;
padding: 16px;
}
</style>
<!-- Global site tag (gtag.js) - Google Analytics -->

View File

@ -1,5 +1,5 @@
# Wavelovers
Wavelovers in ***VueJS***, ***Typescript***, ***Javascript***, ***HTML*** and ***CSS*** **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://wavelovers.ru/)]**.
Wavelovers in ***VueJS***, ***Typescript***, ***Javascript***, ***HTML***, ***CSS*** and ***SCSS*** **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://wavelovers.ru/)]**.
This is Wavelovers, which can make a vibrating massager out of a gamepad. It has 16 free vibration patterns to play with.

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Wavelovers About</title>
<title>Wavelovers</title>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
@ -11,8 +11,20 @@
<meta name="color-scheme" content="light dark" />
<meta name="robots" content="all" />
<link rel="canonical" href="https://wavelovers.ru/about.html" />
<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 property="og:locale" content="en_US" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Wavelovers" />
<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:image" content="https://wavelovers.ru/img/og.png" />
<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" />
@ -20,27 +32,16 @@
<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" />
<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, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, реклама" />
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
<link name="canonical" href="https://wavelovers.ru/about.html" />
<meta name="description" content="Wavelovers. Page with information about the project and data on donations." />
<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. Page with information about the project and data on donations." />
<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="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="og:title" content="Wavelovers About" />
<meta name="og:description" content="Wavelovers. Page with information about the project and data on donations." />
<meta name="og:url" content="https://wavelovers.ru/about.html" />
<meta name="twitter:title" content="Wavelovers About" />
<meta name="twitter:description" content="Wavelovers. Page with information about the project and data on donations." />
<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>
@ -78,16 +79,16 @@
<nav class="menu-wrapper">
<ul class="navigation">
<li class="navigation__item">
<a href="https://wavelovers.ru/" target="_self" class="navigation__link">Home</a>
<a href="/" 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>
<a href="/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>
<a href="/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>
<a href="/donate.html" target="_self" class="navigation__link">Donate</a>
</li>
</ul>
</nav>
@ -95,10 +96,10 @@
</header>
<main class="page container">
<h1 class="visually-hidden">Wavelovers Feedback</h1>
<h1 class="visually-hidden">Wavelovers About</h1>
<div>
<div class="content-item">
<h2 class="content-item__header">Feedback</h2>
<h2 class="content-item__header">About</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>
@ -106,31 +107,12 @@
<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>
<h2 class="content-item__header">Advertising</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>
@ -145,9 +127,5 @@
</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>

View File

@ -0,0 +1 @@
.banner-container{display:flex}.banner{margin:auto;padding:16px}

View File

@ -463,20 +463,6 @@ table, th, td {
/* PAGES */
/* ----- */
/* ------ */
/* BANNER */
/* ------ */
.banner-container {
min-height: 100vh;
display: flex;
}
.banner {
margin: auto;
padding: 16px;
}
/* ----------- */
/* WAVELOVERS */
/* ----------- */

132
docs/donate.html Normal file
View File

@ -0,0 +1,132 @@
<!DOCTYPE html>
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Wavelovers</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="theme-color" media="(prefers-color-scheme: light)" content="#EA9AB2" />
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#E27396" />
<meta name="color-scheme" content="light dark" />
<meta name="robots" content="all" />
<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 property="og:locale" content="en_US" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Wavelovers" />
<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:image" content="https://wavelovers.ru/img/og.png" />
<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" />
<link name="canonical" href="https://wavelovers.ru/donate.html" />
<meta name="description" content="Wavelovers. Donate to the author." />
<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, Donate, Support, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, задонатить, пожертвовать, помочь, поблагодарить" />
<meta name="og:title" content="Wavelovers Donate" />
<meta name="og:description" content="Wavelovers. Donate to the author." />
<meta name="og:url" content="https://wavelovers.ru/donate.html" />
<meta name="twitter:title" content="Wavelovers Donate" />
<meta name="twitter:description" content="Wavelovers. Donate to the author." />
<!-- 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" translate="no">Wavelovers</span>
</div>
<nav class="menu-wrapper">
<ul class="navigation">
<li class="navigation__item">
<a href="/" target="_self" class="navigation__link">Home</a>
</li>
<li class="navigation__item">
<a href="/faq.html" target="_self" class="navigation__link">FAQ</a>
</li>
<li class="navigation__item">
<a href="/about.html" target="_self" class="navigation__link">About</a>
</li>
<li class="navigation__item">
<a href="/donate.html" target="_self" class="navigation__link">Donate</a>
</li>
</ul>
</nav>
</div>
</header>
<main class="page container">
<h1 class="visually-hidden">Wavelovers Donate</h1>
<div>
<div 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" translate="no">Eugene Serb</a>
</div>
</div>
</footer>
</body>
</html>

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Wavelovers FAQ</title>
<title>Wavelovers</title>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
@ -11,8 +11,20 @@
<meta name="color-scheme" content="light dark" />
<meta name="robots" content="all" />
<link rel="canonical" href="https://wavelovers.ru/faq.html" />
<link rel="stylesheet" type="text/css" href="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 property="og:locale" content="en_US" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Wavelovers" />
<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:image" content="https://wavelovers.ru/img/og.png" />
<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" />
@ -20,27 +32,16 @@
<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" />
<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, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, часто задаваеиые вопросы" />
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
<link name="canonical" href="https://wavelovers.ru/faq.html" />
<meta name="description" content="Wavelovers. Frequently asked questions page." />
<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. Frequently asked questions page." />
<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="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="og:title" content="Wavelovers FAQ" />
<meta name="og:description" content="Wavelovers. Frequently asked questions page." />
<meta name="og:url" content="https://wavelovers.ru/faq.html" />
<meta name="twitter:title" content="Wavelovers FAQ" />
<meta name="twitter:description" content="Wavelovers. Frequently asked questions page." />
<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>
@ -78,16 +79,16 @@
<nav class="menu-wrapper">
<ul class="navigation">
<li class="navigation__item">
<a href="https://wavelovers.ru/" target="_self" class="navigation__link">Home</a>
<a href="/" 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>
<a href="/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>
<a href="/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>
<a href="/donate.html" target="_self" class="navigation__link">Donate</a>
</li>
</ul>
</nav>
@ -113,7 +114,7 @@
</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>
<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 />
@ -127,9 +128,12 @@
</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 />
<span class="faq__ask">Gamepad:</span><br />
<span class="faq__reply">X-Input and vibration actuator required.</span><br /><br />
<span class="faq__ask">Browser:</span><br />
<span class="faq__reply">Google Chrome or any other Chromium-based browser is recommended.</span><br /><br />
<span class="faq__ask">Operating System:</span><br />
<span class="faq__reply">Windows 7 or higher recommended.</span><br />
</div>
</div>
</main>
@ -145,9 +149,5 @@
</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>

View File

@ -1,4 +1,4 @@
<!doctype html><html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml"><head><title>Wavelovers</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="theme-color" media="(prefers-color-scheme: light)" content="#EA9AB2"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#E27396"/><meta name="color-scheme" content="light dark"/><meta name="robots" content="all"/><link rel="canonical" href="https://wavelovers.ru/"/><link rel="stylesheet" href="https://wavelovers.ru/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"/><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, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона"/><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"/><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"/><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"/><style>[v-cloak] {
<!doctype html><html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml"><head><title>Wavelovers</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="theme-color" media="(prefers-color-scheme: light)" content="#EA9AB2"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#E27396"/><meta name="color-scheme" content="light dark"/><meta name="robots" content="all"/><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 property="og:locale" content="en_US"/><meta property="og:type" content="website"/><meta property="og:site_name" content="Wavelovers"/><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:image" content="https://wavelovers.ru/img/og.png"/><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" href="/css/styles.css"/><style>[v-cloak] {
display: none;
}</style><script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script><script>window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
@ -15,4 +15,4 @@
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});</script><script defer="defer" src="/js/chunk-vendors.9c4f6371.js"></script><script defer="defer" src="/js/app.17690bc6.js"></script><link href="/css/app.f87473b2.css" rel="stylesheet"></head><body><header class="header"><div class="header-wrapper container"><div class="logo-wrapper"><span class="logo-wrapper__logo" translate="no">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</h1><noscript>You need to enable JavaScript to run this app.</noscript><div id="app" v-cloak></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" translate="no">Eugene Serb</a></div></div></footer><noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt=""/></div></noscript></body></html>
});</script><script defer="defer" src="/js/chunk-vendors.43d24a0a.js"></script><script defer="defer" src="/js/app.ed7ad2c3.js"></script><link href="/css/app.a72a8a93.css" rel="stylesheet"></head><body id="app" v-cloak><noscript>You need to enable JavaScript to run this app.</noscript><noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt=""/></div></noscript></body></html>

2
docs/js/447.cde26208.js Normal file
View File

@ -0,0 +1,2 @@
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[447],{8447:function(e,n,a){a.r(n),a.d(n,{default:function(){return _}});var t=a(3396);const r={class:"page container"},s=(0,t._)("section",{class:"banner-container"},[(0,t._)("div",{class:"banner"},[(0,t._)("h1",null,"404"),(0,t._)("span",null,"File not found. Please, go to the "),(0,t._)("a",{href:"https://wavelovers.ru/",target:"_self"},"homepage"),(0,t._)("br"),(0,t._)("span",null,"Contact me "),(0,t._)("a",{href:"https://t.me/eugene_serb/",target:"_blank"},"@eugene_serb")])],-1),l=[s];function o(e,n,a,s,o,u){return(0,t.wg)(),(0,t.iD)("main",r,l)}var u=(0,t.aZ)({name:"NotFoundView"}),c=a(89);const i=(0,c.Z)(u,[["render",o]]);var _=i}}]);
//# sourceMappingURL=447.cde26208.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"js/447.cde26208.js","mappings":"8KAEA,MAAMA,EAAa,CAAEC,MAAO,kBACtBC,GAA0BC,EAAAA,EAAAA,GAAoB,UAAW,CAAEF,MAAO,oBAAsB,EAC/EE,EAAAA,EAAAA,GAAoB,MAAO,CAAEF,MAAO,UAAY,EAC9CE,EAAAA,EAAAA,GAAoB,KAAM,KAAM,QAChCA,EAAAA,EAAAA,GAAoB,OAAQ,KAAM,uCAClCA,EAAAA,EAAAA,GAAoB,IAAK,CACpCC,KAAM,yBACNC,OAAQ,SACP,aACUF,EAAAA,EAAAA,GAAoB,OACpBA,EAAAA,EAAAA,GAAoB,OAAQ,KAAM,gBAClCA,EAAAA,EAAAA,GAAoB,IAAK,CACpCC,KAAM,4BACNC,OAAQ,UACP,oBAEH,GACEC,EAAa,CACjBJ,GAGI,SAAUK,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,OAAQf,EAAYM,EAC/D,CCtBG,OAAeU,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,iB,QCGd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASX,KAEpE,O","sources":["webpack://wavelovers/./src/views/NotFoundView.vue?94e2","webpack://wavelovers/./src/views/NotFoundView.vue?6f3f","webpack://wavelovers/./src/views/NotFoundView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"section\", { class: \"banner-container\" }, [\n /*#__PURE__*/_createElementVNode(\"div\", { class: \"banner\" }, [\n /*#__PURE__*/_createElementVNode(\"h1\", null, \"404\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"File not found. Please, go to the \"),\n /*#__PURE__*/_createElementVNode(\"a\", {\n href: \"https://wavelovers.ru/\",\n target: \"_self\"\n }, \"homepage\"),\n /*#__PURE__*/_createElementVNode(\"br\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Contact me \"),\n /*#__PURE__*/_createElementVNode(\"a\", {\n href: \"https://t.me/eugene_serb/\",\n target: \"_blank\"\n }, \"@eugene_serb\")\n ])\n], -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, _hoisted_3))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'NotFoundView',\r\n });\r\n","import { render } from \"./NotFoundView.vue?vue&type=template&id=66f319a4&ts=true\"\nimport script from \"./NotFoundView.vue?vue&type=script&lang=ts\"\nexport * from \"./NotFoundView.vue?vue&type=script&lang=ts\"\n\nimport \"./NotFoundView.vue?vue&type=style&index=0&id=66f319a4&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_createElementVNode","href","target","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","defineComponent","name","__exports__"],"sourceRoot":""}

2
docs/js/548.8603e4a4.js Normal file
View File

@ -0,0 +1,2 @@
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[548],{2548:function(e,a,n){n.r(a),n.d(a,{default:function(){return c}});var t=n(3396);const s={class:"page container"},i=(0,t.uE)('<h1 class="visually-hidden">Wavelovers <20> About</h1><div><div class="content-item"><h2 class="content-item__header">About</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></div><div class="content-item"><h2 class="content-item__header">Advertising</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>',2),r=[i];function o(e,a,n,i,o,u){return(0,t.wg)(),(0,t.iD)("main",s,r)}var u=(0,t.aZ)({name:"AboutView"}),l=n(89);const h=(0,l.Z)(u,[["render",o]]);var c=h}}]);
//# sourceMappingURL=548.8603e4a4.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"js/548.8603e4a4.js","mappings":"8KAEA,MAAMA,EAAa,CAAEC,MAAO,kBACtBC,GAA0BC,EAAAA,EAAAA,IAAmB,4uBAAmwB,GAChzBC,EAAa,CACjBF,GAGI,SAAUG,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,OAAQb,EAAYI,EAC/D,CCPG,OAAeU,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,c,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASX,KAEpE,O","sources":["webpack://wavelovers/./src/views/AboutView.vue?8926","webpack://wavelovers/./src/views/AboutView.vue?f245","webpack://wavelovers/./src/views/AboutView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"<h1 class=\\\"visually-hidden\\\">Wavelovers <20> About</h1><div><div class=\\\"content-item\\\"><h2 class=\\\"content-item__header\\\">About</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></div><div class=\\\"content-item\\\"><h2 class=\\\"content-item__header\\\">Advertising</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>\", 2)\nconst _hoisted_4 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, _hoisted_4))\n}","\n import { defineComponent } from 'vue';\n\n export default defineComponent({\n name: 'AboutView',\n });\n","import { render } from \"./AboutView.vue?vue&type=template&id=e4a163de&ts=true\"\nimport script from \"./AboutView.vue?vue&type=script&lang=ts\"\nexport * from \"./AboutView.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_createStaticVNode","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","defineComponent","name","__exports__"],"sourceRoot":""}

2
docs/js/877.a8dd8d41.js Normal file
View File

@ -0,0 +1,2 @@
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[877],{877:function(a,e,s){s.r(e),s.d(e,{default:function(){return l}});var r=s(3396);const n={class:"page container"},t=(0,r.uE)('<h1 class="visually-hidden">Wavelovers <20> FAQ</h1><div><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&#39;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 class="faq__ask">Gamepad:</span><br><span class="faq__reply">X-Input and vibration actuator required.</span><br><br><span class="faq__ask">Browser:</span><br><span class="faq__reply">Google Chrome or any other Chromium-based browser is recommended.</span><br><br><span class="faq__ask">Operating System:</span><br><span class="faq__reply">Windows 7 or higher recommended.</span><br></div></div>',2),i=[t];function o(a,e,s,t,o,p){return(0,r.wg)(),(0,r.iD)("main",n,i)}var p=(0,r.aZ)({name:"FaqView"}),c=s(89);const h=(0,c.Z)(p,[["render",o]]);var l=h}}]);
//# sourceMappingURL=877.a8dd8d41.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"js/877.a8dd8d41.js","mappings":"6KAEA,MAAMA,EAAa,CAAEC,MAAO,kBACtBC,GAA0BC,EAAAA,EAAAA,IAAmB,i3EAAg7E,GAC79EC,EAAa,CACjBF,GAGI,SAAUG,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,OAAQb,EAAYI,EAC/D,CCPG,OAAeU,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,Y,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASX,KAEpE,O","sources":["webpack://wavelovers/./src/views/FaqView.vue?8fb5","webpack://wavelovers/./src/views/FaqView.vue?a581","webpack://wavelovers/./src/views/FaqView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"<h1 class=\\\"visually-hidden\\\">Wavelovers <20> FAQ</h1><div><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&#39;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 class=\\\"faq__ask\\\">Gamepad:</span><br><span class=\\\"faq__reply\\\">X-Input and vibration actuator required.</span><br><br><span class=\\\"faq__ask\\\">Browser:</span><br><span class=\\\"faq__reply\\\">Google Chrome or any other Chromium-based browser is recommended.</span><br><br><span class=\\\"faq__ask\\\">Operating System:</span><br><span class=\\\"faq__reply\\\">Windows 7 or higher recommended.</span><br></div></div>\", 2)\nconst _hoisted_4 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, _hoisted_4))\n}","\n import { defineComponent } from 'vue';\n\n export default defineComponent({\n name: 'FaqView',\n });\n","import { render } from \"./FaqView.vue?vue&type=template&id=aad19c66&ts=true\"\nimport script from \"./FaqView.vue?vue&type=script&lang=ts\"\nexport * from \"./FaqView.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_createStaticVNode","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","defineComponent","name","__exports__"],"sourceRoot":""}

2
docs/js/93.22832789.js Normal file
View File

@ -0,0 +1,2 @@
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[93],{93:function(e,a,n){n.r(a),n.d(a,{default:function(){return m}});var s=n(3396);const o={class:"page container"},r=(0,s.uE)('<h1 class="visually-hidden">Wavelovers <20> Donate</h1><div><div 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>',2),t=[r];function p(e,a,n,r,p,i){return(0,s.wg)(),(0,s.iD)("main",o,t)}var i=(0,s.aZ)({name:"DonateView"}),u=n(89);const c=(0,u.Z)(i,[["render",p]]);var m=c}}]);
//# sourceMappingURL=93.22832789.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"js/93.22832789.js","mappings":"2KAEA,MAAMA,EAAa,CAAEC,MAAO,kBACtBC,GAA0BC,EAAAA,EAAAA,IAAmB,y8BAA49B,GACzgCC,EAAa,CACjBF,GAGI,SAAUG,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,OAAQb,EAAYI,EAC/D,CCPG,OAAeU,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,e,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASX,KAEpE,O","sources":["webpack://wavelovers/./src/views/DonateView.vue?562c","webpack://wavelovers/./src/views/DonateView.vue?82fb","webpack://wavelovers/./src/views/DonateView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"<h1 class=\\\"visually-hidden\\\">Wavelovers <20> Donate</h1><div><div 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>\", 2)\nconst _hoisted_4 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, _hoisted_4))\n}","\n import { defineComponent } from 'vue';\n\n export default defineComponent({\n name: 'DonateView',\n });\n","import { render } from \"./DonateView.vue?vue&type=template&id=5d4cd0d6&ts=true\"\nimport script from \"./DonateView.vue?vue&type=script&lang=ts\"\nexport * from \"./DonateView.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_createStaticVNode","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","defineComponent","name","__exports__"],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
docs/js/app.ed7ad2c3.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2,19 +2,25 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://wavelovers.ru/</loc>
<lastmod>2022-07-17</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/about.html</loc>
<lastmod>2022-07-17</lastmod>
<lastmod>2022-07-22</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/faq.html</loc>
<lastmod>2022-07-17</lastmod>
<lastmod>2022-07-22</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/about.html</loc>
<lastmod>2022-07-22</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/donate.html</loc>
<lastmod>2022-07-22</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>

View File

@ -2,7 +2,7 @@
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://wavelovers.ru/sitemap-internal.xml</loc>
<lastmod>2022-07-17</lastmod>
<lastmod>2022-07-22</lastmod>
</sitemap>
</sitemapindex>

1267
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,10 @@
{
"name": "wavelovers",
"version": "0.1.0",
"description": "Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.",
"version": "1.0.0",
"author": "Eugene Serb",
"license": "GNU GPL v3",
"repository": "https://github.com/eugene-serb/wavelovers",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
@ -9,18 +13,22 @@
},
"dependencies": {
"core-js": "^3.8.3",
"vue": "^3.2.13"
"vue": "^3.2.13",
"vue-router": "^4.0.3"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.4.0",
"@typescript-eslint/parser": "^5.4.0",
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-plugin-router": "~5.0.0",
"@vue/cli-plugin-typescript": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"@vue/eslint-config-typescript": "^9.1.0",
"eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3",
"sass": "^1.32.7",
"sass-loader": "^12.0.0",
"typescript": "~4.5.5"
}
}

View File

@ -29,6 +29,16 @@
margin-bottom: 0 !important;
}
}
.banner-container {
min-height: 100vh;
display: flex;
}
.banner {
margin: auto;
padding: 16px;
}
</style>
<!-- Global site tag (gtag.js) - Google Analytics -->

View File

@ -1,5 +1,5 @@
# Wavelovers
Wavelovers in ***VueJS***, ***Typescript***, ***Javascript***, ***HTML*** and ***CSS*** **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://wavelovers.ru/)]**.
Wavelovers in ***VueJS***, ***Typescript***, ***Javascript***, ***HTML***, ***CSS*** and ***SCSS*** **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://wavelovers.ru/)]**.
This is Wavelovers, which can make a vibrating massager out of a gamepad. It has 16 free vibration patterns to play with.

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Wavelovers About</title>
<title>Wavelovers</title>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
@ -11,8 +11,20 @@
<meta name="color-scheme" content="light dark" />
<meta name="robots" content="all" />
<link rel="canonical" href="https://wavelovers.ru/about.html" />
<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 property="og:locale" content="en_US" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Wavelovers" />
<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:image" content="https://wavelovers.ru/img/og.png" />
<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" />
@ -20,27 +32,16 @@
<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" />
<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, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, реклама" />
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
<link name="canonical" href="https://wavelovers.ru/about.html" />
<meta name="description" content="Wavelovers. Page with information about the project and data on donations." />
<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. Page with information about the project and data on donations." />
<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="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="og:title" content="Wavelovers About" />
<meta name="og:description" content="Wavelovers. Page with information about the project and data on donations." />
<meta name="og:url" content="https://wavelovers.ru/about.html" />
<meta name="twitter:title" content="Wavelovers About" />
<meta name="twitter:description" content="Wavelovers. Page with information about the project and data on donations." />
<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>
@ -78,16 +79,16 @@
<nav class="menu-wrapper">
<ul class="navigation">
<li class="navigation__item">
<a href="https://wavelovers.ru/" target="_self" class="navigation__link">Home</a>
<a href="/" 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>
<a href="/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>
<a href="/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>
<a href="/donate.html" target="_self" class="navigation__link">Donate</a>
</li>
</ul>
</nav>
@ -95,10 +96,10 @@
</header>
<main class="page container">
<h1 class="visually-hidden">Wavelovers Feedback</h1>
<h1 class="visually-hidden">Wavelovers About</h1>
<div>
<div class="content-item">
<h2 class="content-item__header">Feedback</h2>
<h2 class="content-item__header">About</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>
@ -106,31 +107,12 @@
<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>
<h2 class="content-item__header">Advertising</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>
@ -145,9 +127,5 @@
</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>

View File

@ -463,20 +463,6 @@ table, th, td {
/* PAGES */
/* ----- */
/* ------ */
/* BANNER */
/* ------ */
.banner-container {
min-height: 100vh;
display: flex;
}
.banner {
margin: auto;
padding: 16px;
}
/* ----------- */
/* WAVELOVERS */
/* ----------- */

132
public/donate.html Normal file
View File

@ -0,0 +1,132 @@
<!DOCTYPE html>
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Wavelovers</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="theme-color" media="(prefers-color-scheme: light)" content="#EA9AB2" />
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#E27396" />
<meta name="color-scheme" content="light dark" />
<meta name="robots" content="all" />
<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 property="og:locale" content="en_US" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Wavelovers" />
<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:image" content="https://wavelovers.ru/img/og.png" />
<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" />
<link name="canonical" href="https://wavelovers.ru/donate.html" />
<meta name="description" content="Wavelovers. Donate to the author." />
<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, Donate, Support, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, задонатить, пожертвовать, помочь, поблагодарить" />
<meta name="og:title" content="Wavelovers Donate" />
<meta name="og:description" content="Wavelovers. Donate to the author." />
<meta name="og:url" content="https://wavelovers.ru/donate.html" />
<meta name="twitter:title" content="Wavelovers Donate" />
<meta name="twitter:description" content="Wavelovers. Donate to the author." />
<!-- 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" translate="no">Wavelovers</span>
</div>
<nav class="menu-wrapper">
<ul class="navigation">
<li class="navigation__item">
<a href="/" target="_self" class="navigation__link">Home</a>
</li>
<li class="navigation__item">
<a href="/faq.html" target="_self" class="navigation__link">FAQ</a>
</li>
<li class="navigation__item">
<a href="/about.html" target="_self" class="navigation__link">About</a>
</li>
<li class="navigation__item">
<a href="/donate.html" target="_self" class="navigation__link">Donate</a>
</li>
</ul>
</nav>
</div>
</header>
<main class="page container">
<h1 class="visually-hidden">Wavelovers Donate</h1>
<div>
<div 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" translate="no">Eugene Serb</a>
</div>
</div>
</footer>
</body>
</html>

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Wavelovers FAQ</title>
<title>Wavelovers</title>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
@ -11,8 +11,20 @@
<meta name="color-scheme" content="light dark" />
<meta name="robots" content="all" />
<link rel="canonical" href="https://wavelovers.ru/faq.html" />
<link rel="stylesheet" type="text/css" href="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 property="og:locale" content="en_US" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Wavelovers" />
<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:image" content="https://wavelovers.ru/img/og.png" />
<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" />
@ -20,27 +32,16 @@
<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" />
<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, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, часто задаваеиые вопросы" />
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
<link name="canonical" href="https://wavelovers.ru/faq.html" />
<meta name="description" content="Wavelovers. Frequently asked questions page." />
<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. Frequently asked questions page." />
<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="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="og:title" content="Wavelovers FAQ" />
<meta name="og:description" content="Wavelovers. Frequently asked questions page." />
<meta name="og:url" content="https://wavelovers.ru/faq.html" />
<meta name="twitter:title" content="Wavelovers FAQ" />
<meta name="twitter:description" content="Wavelovers. Frequently asked questions page." />
<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>
@ -78,16 +79,16 @@
<nav class="menu-wrapper">
<ul class="navigation">
<li class="navigation__item">
<a href="https://wavelovers.ru/" target="_self" class="navigation__link">Home</a>
<a href="/" 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>
<a href="/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>
<a href="/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>
<a href="/donate.html" target="_self" class="navigation__link">Donate</a>
</li>
</ul>
</nav>
@ -113,7 +114,7 @@
</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>
<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 />
@ -127,9 +128,12 @@
</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 />
<span class="faq__ask">Gamepad:</span><br />
<span class="faq__reply">X-Input and vibration actuator required.</span><br /><br />
<span class="faq__ask">Browser:</span><br />
<span class="faq__reply">Google Chrome or any other Chromium-based browser is recommended.</span><br /><br />
<span class="faq__ask">Operating System:</span><br />
<span class="faq__reply">Windows 7 or higher recommended.</span><br />
</div>
</div>
</main>
@ -145,9 +149,5 @@
</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>

View File

@ -11,8 +11,20 @@
<meta name="color-scheme" content="light dark" />
<meta name="robots" content="all" />
<link rel="canonical" href="https://wavelovers.ru/" />
<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 property="og:locale" content="en_US" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Wavelovers" />
<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:image" content="https://wavelovers.ru/img/og.png" />
<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" />
@ -20,27 +32,7 @@
<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" />
<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, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона" />
<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" />
<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" />
<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" />
<link rel="stylesheet" type="text/css" href="/css/styles.css" />
<style>
[v-cloak] {
@ -75,49 +67,8 @@
</script>
<!-- /Yandex.Metrika counter -->
</head>
<body>
<header class="header">
<div class="header-wrapper container">
<div class="logo-wrapper">
<span class="logo-wrapper__logo" translate="no">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</h1>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="app" v-cloak></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" translate="no">Eugene Serb</a>
</div>
</div>
</footer>
<body id="app" v-cloak>
<noscript>You need to enable JavaScript to run this app.</noscript>
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
</body>
</html>

View File

@ -2,19 +2,25 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://wavelovers.ru/</loc>
<lastmod>2022-07-17</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/about.html</loc>
<lastmod>2022-07-17</lastmod>
<lastmod>2022-07-22</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/faq.html</loc>
<lastmod>2022-07-17</lastmod>
<lastmod>2022-07-22</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/about.html</loc>
<lastmod>2022-07-22</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/donate.html</loc>
<lastmod>2022-07-22</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>

View File

@ -2,7 +2,7 @@
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://wavelovers.ru/sitemap-internal.xml</loc>
<lastmod>2022-07-17</lastmod>
<lastmod>2022-07-22</lastmod>
</sitemap>
</sitemapindex>

View File

@ -1,18 +1,22 @@
<template>
<Wavelovers />
<AppHeader />
<router-view/>
<AppFooter />
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import WaveloversApp from '@/components/WaveloversApp.vue';
import AppHeader from '@/components/AppHeader.vue';
import AppFooter from '@/components/AppFooter.vue';
export default defineComponent({
name: 'App',
components: {
Wavelovers: WaveloversApp,
},
name: 'App',
components: {
AppHeader: AppHeader,
AppFooter: AppFooter,
},
});
</script>
<style></style>
<style lang="scss"></style>

View File

@ -0,0 +1,24 @@
<template>
<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" translate="no">Eugene Serb</a>
</div>
</div>
</footer>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
name: 'AppFooter',
});
</script>
<style lang="scss"></style>

View File

@ -0,0 +1,36 @@
<template>
<header class="header">
<div class="header-wrapper container">
<div class="logo-wrapper">
<span class="logo-wrapper__logo" translate="no">Wavelovers</span>
</div>
<nav class="menu-wrapper">
<ul class="navigation">
<li class="navigation__item">
<router-link to="/" class="navigation__link">Home</router-link>
</li>
<li class="navigation__item">
<router-link to="/faq" class="navigation__link">FAQ</router-link>
</li>
<li class="navigation__item">
<router-link to="/about" class="navigation__link">About</router-link>
</li>
<li class="navigation__item">
<router-link to="/donate" class="navigation__link">Donate</router-link>
</li>
</ul>
</nav>
</div>
</header>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
name: 'AppHeader',
});
</script>
<style lang="scss"></style>

View File

@ -10,7 +10,7 @@
});
</script>
<style>
<style lang="scss">
.list-item {
max-width: 100%;
padding: 16px;

View File

@ -23,7 +23,7 @@
});
</script>
<style>
<style lang="scss">
.device-list {
margin-bottom: 16px;
padding: 32px;

View File

@ -14,7 +14,7 @@
});
</script>
<style>
<style lang="scss">
.message {
width: 100%;
margin-bottom: 16px;

View File

@ -38,7 +38,7 @@
});
</script>
<style>
<style lang="scss">
.pattern-item {
width: 100%;
height: 48px;

View File

@ -38,8 +38,8 @@
});
</script>
<style>
.pattern-list {
<style lang="scss">
.pattern-list {
margin-bottom: 16px;
padding: 32px;
border-radius: var(--number-border-radius);

View File

@ -1 +0,0 @@
declare module 'Vibrator';

View File

@ -17,12 +17,12 @@
import PatternList from '@/components/PatternList.vue';
import GamepadList from '@/components/GamepadList.vue';
import MessageItem from '@/components/MessageItem.vue';
import { Vibrator, IGamepad, TPattern, TPatternUnit } from '@/components/Vibrator';
interface Event {
gamepad: IGamepad | any;
}
import IGamepadEvent from '@/models/IGamepadEvent';
import IGamepad from '@/models/IGamepad';
import TPattern from '@/models/TPattern';
import TPatternUnit from '@/models/TPatternUnit';
import Vibrator from '@/models/Vibrator';
export default defineComponent({
name: 'WaveloversApp',
components: {
@ -50,21 +50,22 @@
console.log('Connect to the Internet for download more patterns...');
}
} catch (error) {
console.log('[error]', error);
console.log(error);
}
},
addEventListeners(): void {
window.addEventListener('gamepadconnected', (event: Event) => this.addGamepad(event));
window.addEventListener('gamepaddisconnected', (event: Event) => this.deleteGamepad(event));
window.addEventListener('gamepadconnected', (event: GamepadEvent) => this.addGamepad(event));
window.addEventListener('gamepaddisconnected', (event: GamepadEvent) => this.deleteGamepad(event));
},
addGamepad(event: Event) {
addGamepad(event: GamepadEvent) {
const ievent: IGamepadEvent = event as unknown as IGamepadEvent;
if (this.gamepads.length >= 1) {
return;
} else {
this.gamepads.push(new Vibrator(event.gamepad));
this.gamepads.push(new Vibrator(ievent.gamepad as IGamepad));
}
},
deleteGamepad(event: Event): void {
deleteGamepad(event: GamepadEvent): void {
this.gamepads.forEach((gamepad, index) => {
if (gamepad.unit.id === event.gamepad.id) {
this.gamepads.splice(index, 1);
@ -102,7 +103,7 @@
});
</script>
<style>
<style lang="scss">
.wavelovers {
display: flex;
flex-direction: column-reverse;

View File

@ -1,4 +1,5 @@
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
createApp(App).mount('#app')
createApp(App).use(router).mount('#app')

10
src/models/IGamepad.ts Normal file
View File

@ -0,0 +1,10 @@
import IVibrationActuator from '@/models/IVibrationActuator';
export default interface IGamepad {
id: string;
index: number;
timestamp: number;
connected: boolean;
vibrationActuator: IVibrationActuator;
}

View File

@ -0,0 +1,6 @@
import IGamepad from '@/models/IGamepad';
export default interface IGamepadEvent {
gamepad: IGamepad;
}

View File

@ -0,0 +1,8 @@
import TPatternUnit from '@/models/TPatternUnit';
export default interface IVibrationActuator {
type: string;
reset(): void;
playEffect(mode: string, pattern: TPatternUnit): void;
}

15
src/models/IVibrator.ts Normal file
View File

@ -0,0 +1,15 @@
import TPatternUnit from '@/models/TPatternUnit';
import IGamepad from '@/models/IGamepad';
export default interface IVibrator {
readonly id: number;
readonly canVibrate: boolean;
isVibrating: boolean;
unit: IGamepad;
pattern: TPatternUnit[];
update(): void;
reset(): void;
vibrate(pattern: TPatternUnit[]): void;
sleep(ms: number): Promise<number>;
}

11
src/models/TPattern.ts Normal file
View File

@ -0,0 +1,11 @@
import TPatternUnit from '@/models/TPatternUnit';
export type TPattern = {
name: string;
type: string;
icon: string;
pattern: TPatternUnit[];
}
export default TPattern;

View File

@ -0,0 +1,9 @@
export type TPatternUnit = {
startDelay: number;
duration: number;
weakMagnitude: number;
strongMagnitude: number;
}
export default TPatternUnit;

View File

@ -1,41 +1,8 @@
export type TPattern = {
pattern: TPatternUnit[];
}
import TPatternUnit from '@/models/TPatternUnit';
import IGamepad from '@/models/IGamepad';
import IVibrator from '@/models/IVibrator';
export type TPatternUnit = {
startDelay: number,
duration: number,
weakMagnitude: number,
strongMagnitude: number,
}
export interface IVibrationActuator {
type: string;
reset(): void;
playEffect(mode: string, pattern: TPatternUnit): void;
}
export interface IGamepad {
id: string;
index: number;
timestamp: number;
connected: boolean;
vibrationActuator: IVibrationActuator;
}
export interface IVibrator {
readonly id: number,
readonly canVibrate: boolean;
isVibrating: boolean;
unit: IGamepad;
pattern: TPatternUnit[];
update(): void;
reset(): void;
vibrate(pattern: TPatternUnit[]): void;
sleep(ms: number): Promise<number>;
}
export class Vibrator implements IVibrator {
export default class Vibrator implements IVibrator {
readonly id: number;
readonly canVibrate: boolean;
isVibrating: boolean;
@ -52,7 +19,7 @@ export class Vibrator implements IVibrator {
update(): void {
const gamepads = navigator.getGamepads();
this.unit = <IGamepad><any>gamepads[this.unit.index];
this.unit = <IGamepad><unknown>gamepads[this.unit.index];
}
reset(): void {
@ -79,4 +46,5 @@ export class Vibrator implements IVibrator {
sleep(ms: number): Promise<number> {
return new Promise(resolve => setTimeout(resolve, ms));
}
}
}

View File

@ -0,0 +1,51 @@
import { NavigationGuardNext, RouteLocationNormalized, RouteRecordNormalized } from "vue-router";
function appendTags(tagsArray: object[], type: string) {
tagsArray.map((meta: object) => {
const tag = document.createElement(type);
(Object.keys(meta) as Array<keyof typeof meta>)
.forEach((key) => {
tag.setAttribute(key, meta[key] as string);
});
tag.setAttribute('data-vue-router-controlled', '');
return tag;
}).forEach(tag => document.head.appendChild(tag));
}
function updateMetatag(to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) {
const nearestWithTitle: RouteRecordNormalized =
to.matched.slice().reverse()
.find(r => r.meta && r.meta.title) as RouteRecordNormalized;
const nearestWithMeta: RouteRecordNormalized =
to.matched.slice().reverse()
.find(r => r.meta && r.meta.metaTags && r.meta.linkTags) as RouteRecordNormalized;
if (nearestWithTitle) {
document.title = nearestWithTitle.meta.title as string;
}
Array.from(document.querySelectorAll('[data-vue-router-controlled]'))
.map(el => {
if (el.parentNode) {
el.parentNode.removeChild(el);
}
});
if (!nearestWithMeta) return next();
const linkTags: object[] = nearestWithMeta.meta.linkTags as object[];
const metaTags: object[] = nearestWithMeta.meta.metaTags as object[];
appendTags(linkTags, 'link');
appendTags(metaTags, 'meta');
return next();
}
const VueRouterMetaTags = {
update: updateMetatag
};
export default VueRouterMetaTags;

240
src/router/index.ts Normal file
View File

@ -0,0 +1,240 @@
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import HomeView from '../views/HomeView.vue';
import VueRouterMetaTagsTest from '@/modules/VueRouterMetaTags';
const routes: Array<RouteRecordRaw> = [
{
path: '/',
name: 'home',
component: HomeView,
meta: {
title: 'Wavelovers',
metaTags: [
{
name: 'description',
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
},
{
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, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона',
},
{
name: 'og:title',
content: 'Wavelovers',
},
{
name: 'og:description',
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
},
{
name: 'og:url',
content: 'https://wavelovers.ru/',
},
{
name: 'twitter:title',
content: 'Wavelovers',
},
{
name: 'twitter:description',
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
},
],
linkTags: [
{
name: 'canonical',
href: 'https://wavelovers.ru/',
},
],
},
},
{
path: '/about',
name: 'about',
component: () => import('@/views/AboutView.vue'),
meta: {
title: 'Wavelovers About',
metaTags: [
{
name: 'description',
content: 'Wavelovers. Page with information about the project and data on donations.',
},
{
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, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, реклама',
},
{
name: 'og:title',
content: 'Wavelovers About',
},
{
name: 'og:description',
content: 'Wavelovers. Page with information about the project and data on donations.',
},
{
name: 'og:url',
content: 'https://wavelovers.ru/about',
},
{
name: 'twitter:title',
content: 'Wavelovers About',
},
{
name: 'twitter:description',
content: 'Wavelovers. Page with information about the project and data on donations.',
},
],
linkTags: [
{
name: 'canonical',
href: 'https://wavelovers.ru/about',
},
],
},
},
{
path: '/faq',
name: 'faq',
component: () => import('@/views/FaqView.vue'),
meta: {
title: 'Wavelovers FAQ',
metaTags: [
{
name: 'description',
content: 'Wavelovers. Frequently asked questions page.',
},
{
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, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, часто задаваемые вопросы',
},
{
name: 'og:title',
content: 'Wavelovers FAQ',
},
{
name: 'og:description',
content: 'Wavelovers. Frequently asked questions page.',
},
{
name: 'og:url',
content: 'https://wavelovers.ru/faq',
},
{
name: 'twitter:title',
content: 'Wavelovers FAQ',
},
{
name: 'twitter:description',
content: 'Wavelovers. Frequently asked questions page.',
},
],
linkTags: [
{
name: 'canonical',
href: 'https://wavelovers.ru/faq',
},
],
},
},
{
path: '/donate',
name: 'donate',
component: () => import('@/views/DonateView.vue'),
meta: {
title: 'Wavelovers Donate',
metaTags: [
{
name: 'description',
content: 'Wavelovers. Donate to the author.',
},
{
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, Donate, Support, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, задонатить, пожертвовать, помочь, поблагодарить',
},
{
name: 'og:title',
content: 'Wavelovers Donate',
},
{
name: 'og:description',
content: 'Wavelovers. Donate to the author.',
},
{
name: 'og:url',
content: 'https://wavelovers.ru/donate',
},
{
name: 'twitter:title',
content: 'Wavelovers Donate',
},
{
name: 'twitter:description',
content: 'Wavelovers. Donate to the author.',
},
],
linkTags: [
{
name: 'canonical',
href: 'https://wavelovers.ru/donate',
},
],
},
},
{
path: '/404',
name: '404',
component: () => import('@/views/NotFoundView.vue'),
meta: {
title: 'Wavelovers 404 Page not found',
metaTags: [
{
name: 'description',
content: 'Wavelovers. Page not found.',
},
{
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, 404, page not found, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, 404, страница не найдена',
},
{
name: 'og:title',
content: 'Wavelovers 404 Page not found',
},
{
name: 'og:description',
content: 'Wavelovers. Page not found.',
},
{
name: 'og:url',
content: 'https://wavelovers.ru/404',
},
{
name: 'twitter:title',
content: 'Wavelovers 404 Page not found',
},
{
name: 'twitter:description',
content: 'Wavelovers. Page not found.',
},
],
linkTags: [
{
name: 'canonical',
href: 'https://wavelovers.ru/404',
},
],
},
},
{
path: '/:catchAll(.*)',
redirect: '/404',
},
];
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
});
router.beforeEach(VueRouterMetaTagsTest.update);
export default router;

31
src/views/AboutView.vue Normal file
View File

@ -0,0 +1,31 @@
<template>
<main class="page container">
<h1 class="visually-hidden">Wavelovers About</h1>
<div>
<div class="content-item">
<h2 class="content-item__header">About</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>
</div>
<div class="content-item">
<h2 class="content-item__header">Advertising</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>
</main>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
name: 'AboutView',
});
</script>

32
src/views/DonateView.vue Normal file
View File

@ -0,0 +1,32 @@
<template>
<main class="page container">
<h1 class="visually-hidden">Wavelovers Donate</h1>
<div>
<div 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>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
name: 'DonateView',
});
</script>

53
src/views/FaqView.vue Normal file
View File

@ -0,0 +1,53 @@
<template>
<main class="page container">
<h1 class="visually-hidden">Wavelovers FAQ</h1>
<div>
<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 class="faq__ask">Gamepad:</span><br />
<span class="faq__reply">X-Input and vibration actuator required.</span><br /><br />
<span class="faq__ask">Browser:</span><br />
<span class="faq__reply">Google Chrome or any other Chromium-based browser is recommended.</span><br /><br />
<span class="faq__ask">Operating System:</span><br />
<span class="faq__reply">Windows 7 or higher recommended.</span><br />
</div>
</div>
</main>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
name: 'FaqView',
});
</script>

19
src/views/HomeView.vue Normal file
View File

@ -0,0 +1,19 @@
<template>
<main class="page container">
<h1 class="visually-hidden">Wavelovers</h1>
<WaveloversApp />
</main>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import WaveloversApp from '@/components/WaveloversApp.vue';
export default defineComponent({
name: 'HomeView',
components: {
WaveloversApp: WaveloversApp
},
});
</script>

View File

@ -0,0 +1,31 @@
<template>
<main class="page container">
<section class="banner-container">
<div class="banner">
<h1>404</h1>
<span>File not found. Please, go to the </span><a href="https://wavelovers.ru/" target="_self">homepage</a><br />
<span>Contact me </span><a href="https://t.me/eugene_serb/" target="_blank">@eugene_serb</a>
</div>
</section>
</main>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
name: 'NotFoundView',
});
</script>
<style lang="scss">
.banner-container {
display: flex;
}
.banner {
margin: auto;
padding: 16px;
}
</style>