mirror of
https://github.com/eugene-serb/wavelovers.git
synced 2023-09-09 23:41:16 +03:00
commit
b32114153f
@ -6,7 +6,7 @@
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#4ECBD9" />
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#087E8B" />
|
||||
<meta name="color-scheme" content="light dark" />
|
||||
<link rel="canonical" href="https://wavelovers.ru/404" />
|
||||
<link rel="canonical" href="https://wavelovers.ru/404.html" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
|
@ -15,33 +15,31 @@
|
||||
<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="description" content="Wavelovers. Page with information about the project and data on donations." />
|
||||
<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 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:title" content="Wavelovers – About" />
|
||||
<meta name="twitter:description" content="Wavelovers. Page with information about the project and data on donations." />
|
||||
<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="canonical" href="https://wavelovers.ru/about.html" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<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 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." />
|
||||
<link rel="stylesheet" type="text/css" href="/css/styles.css" />
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
@ -127,5 +125,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
"icon": "😌",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
@ -18,7 +18,7 @@
|
||||
"icon": "😉",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -31,13 +31,13 @@
|
||||
"icon": "🤨",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
},
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -50,7 +50,7 @@
|
||||
"icon": "🙃",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -63,7 +63,7 @@
|
||||
"icon": "🙂",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
@ -76,7 +76,7 @@
|
||||
"icon": "😇",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -89,13 +89,13 @@
|
||||
"icon": "🤤",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
},
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -108,7 +108,7 @@
|
||||
"icon": "😊",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -121,7 +121,7 @@
|
||||
"icon": "😋",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
@ -147,13 +147,13 @@
|
||||
"icon": "😝",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
},
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -166,7 +166,7 @@
|
||||
"icon": "🤪",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 1.0
|
||||
|
@ -1 +0,0 @@
|
||||
.banner-container{display:flex}.banner{margin:auto;padding:16px}
|
@ -1,15 +1,15 @@
|
||||
/* ------------------------------ */
|
||||
/* RESET AND BASE STYLES' TUNE UP */
|
||||
/* Wavelovers styles */
|
||||
/* version: dated 2022.07.25 */
|
||||
/* author: Eugene Serb */
|
||||
/* ------------------------------ */
|
||||
|
||||
@charset 'UTF-8';
|
||||
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap');
|
||||
@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&display=swap');
|
||||
|
||||
*, ::after, ::before {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
/* ------------------------------ */
|
||||
/* RESET AND BASE STYLES' TUNE UP */
|
||||
/* ------------------------------ */
|
||||
|
||||
:root {
|
||||
/* Simple colors */
|
||||
@ -90,6 +90,12 @@
|
||||
}
|
||||
}
|
||||
|
||||
*, ::after, ::before {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: 'Roboto', sans-serif;
|
||||
direction: ltr;
|
||||
@ -137,7 +143,7 @@ small { font-size: smaller; }
|
||||
|
||||
span, p, article, blockquote {
|
||||
color: var(--color-text);
|
||||
font-weight: 400;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
ul {
|
||||
@ -160,6 +166,25 @@ a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
dl dd:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
margin-bottom: 4px;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
font-style: oblique;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 16px;
|
||||
padding-left: 16px;
|
||||
font-size: 16px;
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* ----- */
|
||||
/* FORMS */
|
||||
/* ----- */
|
||||
@ -176,7 +201,7 @@ legend {
|
||||
|
||||
fieldset {
|
||||
border: 2px solid var(--color-border-alpha);
|
||||
border-radius: 4px;
|
||||
border-radius: var(--number-border-radius);
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
@ -471,12 +496,3 @@ table, th, td {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.faq__ask {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.faq__reply {
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
|
@ -15,33 +15,31 @@
|
||||
<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="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 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:title" content="Wavelovers – Donate" />
|
||||
<meta name="twitter:description" content="Wavelovers. Donate to the author." />
|
||||
<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="canonical" href="https://wavelovers.ru/donate.html" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<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." />
|
||||
<link rel="stylesheet" type="text/css" href="/css/styles.css" />
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
@ -102,17 +100,17 @@
|
||||
<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 />
|
||||
<p>
|
||||
More donation = more money <br />
|
||||
More money allows me buy more coffee <br />
|
||||
More coffee makes me write more code <br />
|
||||
More code means more features <br />
|
||||
More features make you more happiness and productive <br />
|
||||
More happiness and productive so you earn more money <br />
|
||||
More money you earn more donation to me <br />
|
||||
</p><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>
|
||||
@ -128,5 +126,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -15,33 +15,31 @@
|
||||
<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="description" content="Wavelovers. Frequently asked questions page." />
|
||||
<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 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:title" content="Wavelovers – FAQ" />
|
||||
<meta name="twitter:description" content="Wavelovers. Frequently asked questions page." />
|
||||
<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="canonical" href="https://wavelovers.ru/faq.html" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<link name="canonical" href="https://wavelovers.ru/faq.html" />
|
||||
<meta name="description" content="Wavelovers. Frequently asked questions page." />
|
||||
<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." />
|
||||
<link rel="stylesheet" type="text/css" href="/css/styles.css" />
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
@ -100,40 +98,40 @@
|
||||
<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>
|
||||
<dl>
|
||||
<dt>What is the purpose of this software?</dt>
|
||||
<dd>Everyone decides for himself, but can be used as a gamepad vibration tester, or as a hand massager.</dd>
|
||||
<dt>Can I use this software as a hand massager?</dt>
|
||||
<dd>Yes of course. If you use this as a massager, then before the session I recommend consulting with a doctor.</dd>
|
||||
<dt>I have a gamepad with vibration, what should I do before using it as a hand massager?</dt>
|
||||
<dd>I recommend checking the device for correct operation, mechanical damage, and be sure to use an antiseptic.</dd>
|
||||
<dt>I'm having problems with the app or connecting my device to the app?</dt>
|
||||
<dd>Go to Troubleshooting.</dd>
|
||||
</dl>
|
||||
</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>
|
||||
<dl>
|
||||
<dt>The app does not see my device.</dt>
|
||||
<dd>Make sure you have a chromium-based browser, then update the app and reconnect your device.</dd>
|
||||
<dt>The application sees the gamepad, but writes that the vibration actuator is missing.</dt>
|
||||
<dd>This problem is specific to mozilla firefox browser and d-input mode. Check the system requirements before using the software.</dd>
|
||||
<dt>My question is not here.</dt>
|
||||
<dd>Write me <a href="mailto:eugene.serb@gmail.com" target="_blank">eugene.serb@gmail.com</a></dd>
|
||||
</dl>
|
||||
</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 />
|
||||
<dl>
|
||||
<dt>Gamepad:</dt>
|
||||
<dd>X-Input and vibration actuator required.</dd>
|
||||
<dt>Browser:</dt>
|
||||
<dd>Google Chrome or any other Chromium-based browser is recommended.</dd>
|
||||
<dt>Operating System:</dt>
|
||||
<dd>Windows 7 or higher recommended.</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
@ -149,5 +147,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -1,6 +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"/><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 || [];
|
||||
<!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 name="description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad."/><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="og:title" content="Wavelovers"/><meta name="og:description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad."/><meta name="og:url" content="https://wavelovers.ru/"/><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:title" content="Wavelovers"/><meta name="twitter:description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad."/><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="canonical" href="https://wavelovers.ru/"/><link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico"/><link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png"/><link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png"/><link rel="manifest" href="https://wavelovers.ru/site.webmanifest"/><link rel="stylesheet" href="/css/styles.css"/><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());
|
||||
|
||||
@ -15,4 +13,6 @@
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});</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>
|
||||
});</script><style>[v-cloak] {
|
||||
display: none;
|
||||
}</style><script defer="defer" src="/js/chunk-vendors.d42e1256.js"></script><script defer="defer" src="/js/app.5a58d0e1.js"></script><link href="/css/app.a72a8a93.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="/" 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</h1><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>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>
|
@ -1,2 +0,0 @@
|
||||
"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
|
@ -1 +0,0 @@
|
||||
{"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":""}
|
@ -1,2 +0,0 @@
|
||||
"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
|
@ -1 +0,0 @@
|
||||
{"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":""}
|
@ -1,2 +0,0 @@
|
||||
"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'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
|
@ -1 +0,0 @@
|
||||
{"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'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":""}
|
@ -1,2 +0,0 @@
|
||||
"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
|
@ -1 +0,0 @@
|
||||
{"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":""}
|
2
docs/js/app.5a58d0e1.js
Normal file
2
docs/js/app.5a58d0e1.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/js/app.5a58d0e1.js.map
Normal file
1
docs/js/app.5a58d0e1.js.map
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
8
docs/js/chunk-vendors.d42e1256.js
Normal file
8
docs/js/chunk-vendors.d42e1256.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/js/chunk-vendors.d42e1256.js.map
Normal file
1
docs/js/chunk-vendors.d42e1256.js.map
Normal file
File diff suppressed because one or more lines are too long
@ -2,25 +2,25 @@
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/</loc>
|
||||
<lastmod>2022-07-22</lastmod>
|
||||
<lastmod>2022-08-06</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/faq.html</loc>
|
||||
<lastmod>2022-07-22</lastmod>
|
||||
<lastmod>2022-08-06</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/about.html</loc>
|
||||
<lastmod>2022-07-22</lastmod>
|
||||
<lastmod>2022-08-06</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/donate.html</loc>
|
||||
<lastmod>2022-07-22</lastmod>
|
||||
<lastmod>2022-08-06</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
|
@ -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-22</lastmod>
|
||||
<lastmod>2022-08-06</lastmod>
|
||||
</sitemap>
|
||||
</sitemapindex>
|
||||
|
||||
|
805
package-lock.json
generated
805
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
17
package.json
17
package.json
@ -1,10 +1,19 @@
|
||||
{
|
||||
"name": "wavelovers",
|
||||
"description": "Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.",
|
||||
"keywords": [ "wavelovers", "gamepad-vibrator", "gamepad-test-tool", "gamepad-vibration-test-tool" ],
|
||||
"version": "1.0.0",
|
||||
"author": "Eugene Serb",
|
||||
"license": "GNU GPL v3",
|
||||
"repository": "https://github.com/eugene-serb/wavelovers",
|
||||
"homepage": "https://wavelovers.ru/",
|
||||
"author": {
|
||||
"name": "Eugene Serb",
|
||||
"email": "eugene.serb@gmail.com",
|
||||
"url": "https://eugene-serb.github.io/"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/eugene-serb/wavelovers/"
|
||||
},
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
@ -14,15 +23,15 @@
|
||||
"dependencies": {
|
||||
"core-js": "^3.8.3",
|
||||
"vue": "^3.2.13",
|
||||
"vue-router": "^4.0.3"
|
||||
"vuex": "^4.0.0"
|
||||
},
|
||||
"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-plugin-vuex": "~5.0.0",
|
||||
"@vue/cli-service": "~5.0.0",
|
||||
"@vue/eslint-config-typescript": "^9.1.0",
|
||||
"eslint": "^7.32.0",
|
||||
|
@ -6,7 +6,7 @@
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#4ECBD9" />
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#087E8B" />
|
||||
<meta name="color-scheme" content="light dark" />
|
||||
<link rel="canonical" href="https://wavelovers.ru/404" />
|
||||
<link rel="canonical" href="https://wavelovers.ru/404.html" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
|
@ -15,33 +15,31 @@
|
||||
<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="description" content="Wavelovers. Page with information about the project and data on donations." />
|
||||
<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 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:title" content="Wavelovers – About" />
|
||||
<meta name="twitter:description" content="Wavelovers. Page with information about the project and data on donations." />
|
||||
<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="canonical" href="https://wavelovers.ru/about.html" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<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 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." />
|
||||
<link rel="stylesheet" type="text/css" href="/css/styles.css" />
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
@ -127,5 +125,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
"icon": "😌",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
@ -18,7 +18,7 @@
|
||||
"icon": "😉",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -31,13 +31,13 @@
|
||||
"icon": "🤨",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
},
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -50,7 +50,7 @@
|
||||
"icon": "🙃",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 100,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -63,7 +63,7 @@
|
||||
"icon": "🙂",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
@ -76,7 +76,7 @@
|
||||
"icon": "😇",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -89,13 +89,13 @@
|
||||
"icon": "🤤",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
},
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -108,7 +108,7 @@
|
||||
"icon": "😊",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 250,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -121,7 +121,7 @@
|
||||
"icon": "😋",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
@ -147,13 +147,13 @@
|
||||
"icon": "😝",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 0.0
|
||||
},
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 0.0,
|
||||
"strongMagnitude": 1.0
|
||||
@ -166,7 +166,7 @@
|
||||
"icon": "🤪",
|
||||
"pattern": [
|
||||
{
|
||||
"startDelay": 100,
|
||||
"startDelay": 200,
|
||||
"duration": 500,
|
||||
"weakMagnitude": 1.0,
|
||||
"strongMagnitude": 1.0
|
||||
|
@ -1,15 +1,15 @@
|
||||
/* ------------------------------ */
|
||||
/* RESET AND BASE STYLES' TUNE UP */
|
||||
/* Wavelovers styles */
|
||||
/* version: dated 2022.07.25 */
|
||||
/* author: Eugene Serb */
|
||||
/* ------------------------------ */
|
||||
|
||||
@charset 'UTF-8';
|
||||
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap');
|
||||
@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&display=swap');
|
||||
|
||||
*, ::after, ::before {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
/* ------------------------------ */
|
||||
/* RESET AND BASE STYLES' TUNE UP */
|
||||
/* ------------------------------ */
|
||||
|
||||
:root {
|
||||
/* Simple colors */
|
||||
@ -90,6 +90,12 @@
|
||||
}
|
||||
}
|
||||
|
||||
*, ::after, ::before {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: 'Roboto', sans-serif;
|
||||
direction: ltr;
|
||||
@ -137,7 +143,7 @@ small { font-size: smaller; }
|
||||
|
||||
span, p, article, blockquote {
|
||||
color: var(--color-text);
|
||||
font-weight: 400;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
ul {
|
||||
@ -160,6 +166,25 @@ a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
dl dd:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
margin-bottom: 4px;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
font-style: oblique;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 16px;
|
||||
padding-left: 16px;
|
||||
font-size: 16px;
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* ----- */
|
||||
/* FORMS */
|
||||
/* ----- */
|
||||
@ -176,7 +201,7 @@ legend {
|
||||
|
||||
fieldset {
|
||||
border: 2px solid var(--color-border-alpha);
|
||||
border-radius: 4px;
|
||||
border-radius: var(--number-border-radius);
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
@ -471,12 +496,3 @@ table, th, td {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.faq__ask {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.faq__reply {
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
|
@ -15,33 +15,31 @@
|
||||
<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="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 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:title" content="Wavelovers – Donate" />
|
||||
<meta name="twitter:description" content="Wavelovers. Donate to the author." />
|
||||
<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="canonical" href="https://wavelovers.ru/donate.html" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<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." />
|
||||
<link rel="stylesheet" type="text/css" href="/css/styles.css" />
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
@ -102,17 +100,17 @@
|
||||
<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 />
|
||||
<p>
|
||||
More donation = more money <br />
|
||||
More money allows me buy more coffee <br />
|
||||
More coffee makes me write more code <br />
|
||||
More code means more features <br />
|
||||
More features make you more happiness and productive <br />
|
||||
More happiness and productive so you earn more money <br />
|
||||
More money you earn more donation to me <br />
|
||||
</p><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>
|
||||
@ -128,5 +126,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -15,33 +15,31 @@
|
||||
<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="description" content="Wavelovers. Frequently asked questions page." />
|
||||
<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 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:title" content="Wavelovers – FAQ" />
|
||||
<meta name="twitter:description" content="Wavelovers. Frequently asked questions page." />
|
||||
<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="canonical" href="https://wavelovers.ru/faq.html" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<link name="canonical" href="https://wavelovers.ru/faq.html" />
|
||||
<meta name="description" content="Wavelovers. Frequently asked questions page." />
|
||||
<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." />
|
||||
<link rel="stylesheet" type="text/css" href="/css/styles.css" />
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
@ -100,40 +98,40 @@
|
||||
<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>
|
||||
<dl>
|
||||
<dt>What is the purpose of this software?</dt>
|
||||
<dd>Everyone decides for himself, but can be used as a gamepad vibration tester, or as a hand massager.</dd>
|
||||
<dt>Can I use this software as a hand massager?</dt>
|
||||
<dd>Yes of course. If you use this as a massager, then before the session I recommend consulting with a doctor.</dd>
|
||||
<dt>I have a gamepad with vibration, what should I do before using it as a hand massager?</dt>
|
||||
<dd>I recommend checking the device for correct operation, mechanical damage, and be sure to use an antiseptic.</dd>
|
||||
<dt>I'm having problems with the app or connecting my device to the app?</dt>
|
||||
<dd>Go to Troubleshooting.</dd>
|
||||
</dl>
|
||||
</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>
|
||||
<dl>
|
||||
<dt>The app does not see my device.</dt>
|
||||
<dd>Make sure you have a chromium-based browser, then update the app and reconnect your device.</dd>
|
||||
<dt>The application sees the gamepad, but writes that the vibration actuator is missing.</dt>
|
||||
<dd>This problem is specific to mozilla firefox browser and d-input mode. Check the system requirements before using the software.</dd>
|
||||
<dt>My question is not here.</dt>
|
||||
<dd>Write me <a href="mailto:eugene.serb@gmail.com" target="_blank">eugene.serb@gmail.com</a></dd>
|
||||
</dl>
|
||||
</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 />
|
||||
<dl>
|
||||
<dt>Gamepad:</dt>
|
||||
<dd>X-Input and vibration actuator required.</dd>
|
||||
<dt>Browser:</dt>
|
||||
<dd>Google Chrome or any other Chromium-based browser is recommended.</dd>
|
||||
<dt>Operating System:</dt>
|
||||
<dd>Windows 7 or higher recommended.</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
@ -149,5 +147,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -15,31 +15,32 @@
|
||||
<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="description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
<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="og:title" content="Wavelovers" />
|
||||
<meta name="og:description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
<meta name="og:url" content="https://wavelovers.ru/" />
|
||||
<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:title" content="Wavelovers" />
|
||||
<meta name="twitter:description" content="Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad." />
|
||||
<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="canonical" href="https://wavelovers.ru/" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/css/styles.css" />
|
||||
|
||||
<style>
|
||||
[v-cloak] {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
<script>
|
||||
@ -66,9 +67,57 @@
|
||||
});
|
||||
</script>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
|
||||
<style>
|
||||
[v-cloak] {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body id="app" v-cloak>
|
||||
<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</h1>
|
||||
<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>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,25 +2,25 @@
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/</loc>
|
||||
<lastmod>2022-07-22</lastmod>
|
||||
<lastmod>2022-08-06</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/faq.html</loc>
|
||||
<lastmod>2022-07-22</lastmod>
|
||||
<lastmod>2022-08-06</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/about.html</loc>
|
||||
<lastmod>2022-07-22</lastmod>
|
||||
<lastmod>2022-08-06</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://wavelovers.ru/donate.html</loc>
|
||||
<lastmod>2022-07-22</lastmod>
|
||||
<lastmod>2022-08-06</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
|
@ -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-22</lastmod>
|
||||
<lastmod>2022-08-06</lastmod>
|
||||
</sitemap>
|
||||
</sitemapindex>
|
||||
|
||||
|
12
src/App.vue
12
src/App.vue
@ -1,22 +1,16 @@
|
||||
<template>
|
||||
<AppHeader />
|
||||
<router-view/>
|
||||
<AppFooter />
|
||||
<WaveloversApp />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import AppHeader from '@/components/AppHeader.vue';
|
||||
import AppFooter from '@/components/AppFooter.vue';
|
||||
import WaveloversApp from '@/components/WaveloversApp.vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'App',
|
||||
components: {
|
||||
AppHeader: AppHeader,
|
||||
AppFooter: AppFooter,
|
||||
WaveloversApp: WaveloversApp,
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss"></style>
|
||||
|
||||
|
@ -1,24 +0,0 @@
|
||||
<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>
|
||||
|
@ -1,36 +0,0 @@
|
||||
<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>
|
||||
|
@ -31,7 +31,7 @@
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
change(index: number): void {
|
||||
change: function (index: number): void {
|
||||
this.$emit('change', index as number);
|
||||
},
|
||||
},
|
||||
|
@ -31,7 +31,7 @@
|
||||
PatternItem: PatternItem,
|
||||
},
|
||||
methods: {
|
||||
change(index: number): void {
|
||||
change: function (index: number): void {
|
||||
this.$emit('change', index as number);
|
||||
},
|
||||
},
|
||||
|
@ -1,4 +1,4 @@
|
||||
<template>
|
||||
<template>
|
||||
<div class="wavelovers">
|
||||
<PatternList v-if="patterns.length > 0"
|
||||
:patterns="patterns"
|
||||
@ -8,7 +8,7 @@
|
||||
<MessageItem v-else>Loading...</MessageItem>
|
||||
<GamepadList v-if="gamepads.length > 0"
|
||||
:gamepads="gamepads" />
|
||||
<MessageItem v-else>Press any gamepad's button or connect new gamepad.</MessageItem>
|
||||
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -17,12 +17,10 @@
|
||||
import PatternList from '@/components/PatternList.vue';
|
||||
import GamepadList from '@/components/GamepadList.vue';
|
||||
import MessageItem from '@/components/MessageItem.vue';
|
||||
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';
|
||||
|
||||
import store from '@/store/index';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'WaveloversApp',
|
||||
components: {
|
||||
@ -30,76 +28,40 @@
|
||||
GamepadList: GamepadList,
|
||||
MessageItem: MessageItem,
|
||||
},
|
||||
data: () => {
|
||||
return {
|
||||
gamepads: [] as Vibrator[],
|
||||
patterns: [] as TPattern[],
|
||||
isActive: false,
|
||||
mode: 0,
|
||||
};
|
||||
computed: {
|
||||
gamepads: function (): Vibrator[] {
|
||||
return store.getters.gamepads as Vibrator[];
|
||||
},
|
||||
patterns: function (): TPattern[] {
|
||||
return store.getters.patterns as TPattern[];
|
||||
},
|
||||
mode: function (): number {
|
||||
return store.getters.mode as number;
|
||||
},
|
||||
isActive: function (): boolean {
|
||||
return store.getters.isActive as boolean;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
loadPatterns: async function () {
|
||||
const url = 'https://wavelovers.ru/assets/patterns.json';
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
if (response.ok) {
|
||||
let json = await response.json();
|
||||
this.patterns = json;
|
||||
} else {
|
||||
console.log('Connect to the Internet for download more patterns...');
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
addEventListeners(): void {
|
||||
window.addEventListener('gamepadconnected', (event: GamepadEvent) => this.addGamepad(event));
|
||||
window.addEventListener('gamepaddisconnected', (event: GamepadEvent) => this.deleteGamepad(event));
|
||||
window.addEventListener('gamepadconnected', (event: GamepadEvent) => store.dispatch('addGamepad', event));
|
||||
window.addEventListener('gamepaddisconnected', (event: GamepadEvent) => store.dispatch('deleteGamepad', event));
|
||||
},
|
||||
addGamepad(event: GamepadEvent) {
|
||||
const ievent: IGamepadEvent = event as unknown as IGamepadEvent;
|
||||
if (this.gamepads.length >= 1) {
|
||||
return;
|
||||
} else {
|
||||
this.gamepads.push(new Vibrator(ievent.gamepad as IGamepad));
|
||||
}
|
||||
},
|
||||
deleteGamepad(event: GamepadEvent): void {
|
||||
this.gamepads.forEach((gamepad, index) => {
|
||||
if (gamepad.unit.id === event.gamepad.id) {
|
||||
this.gamepads.splice(index, 1);
|
||||
}
|
||||
});
|
||||
removeEventListeners(): void {
|
||||
window.removeEventListener('gamepadconnected', (event: GamepadEvent) => store.dispatch('addGamepad', event));
|
||||
window.removeEventListener('gamepaddisconnected', (event: GamepadEvent) => store.dispatch('deleteGamepad', event));
|
||||
},
|
||||
change(index: number): void {
|
||||
if (this.mode === index) {
|
||||
this.isActive = !this.isActive;
|
||||
this.reset();
|
||||
} else {
|
||||
this.isActive = true;
|
||||
this.mode = index;
|
||||
}
|
||||
if (this.isActive === true) {
|
||||
this.reset();
|
||||
this.vibrate();
|
||||
}
|
||||
},
|
||||
vibrate(): void {
|
||||
this.gamepads.forEach(gamepad => {
|
||||
gamepad.vibrate(this.patterns[this.mode].pattern as TPatternUnit[]);
|
||||
});
|
||||
},
|
||||
reset(): void {
|
||||
this.gamepads.forEach(gamepad => {
|
||||
gamepad.reset();
|
||||
});
|
||||
store.dispatch('change', index as number);
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.loadPatterns();
|
||||
store.dispatch('loadPatterns');
|
||||
this.addEventListeners();
|
||||
},
|
||||
unmounted() {
|
||||
this.removeEventListeners();
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { createApp } from 'vue'
|
||||
import App from './App.vue'
|
||||
import router from './router'
|
||||
import { createApp } from 'vue';
|
||||
import App from './App.vue';
|
||||
import store from './store';
|
||||
|
||||
createApp(App).use(router).mount('#app')
|
||||
createApp(App).use(store).mount('#app');
|
||||
|
@ -1,6 +1,6 @@
|
||||
import IVibrationActuator from '@/models/IVibrationActuator';
|
||||
|
||||
export default interface IGamepad {
|
||||
interface IGamepad {
|
||||
id: string;
|
||||
index: number;
|
||||
timestamp: number;
|
||||
@ -8,3 +8,5 @@ export default interface IGamepad {
|
||||
vibrationActuator: IVibrationActuator;
|
||||
}
|
||||
|
||||
export default IGamepad;
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
import IGamepad from '@/models/IGamepad';
|
||||
|
||||
export default interface IGamepadEvent {
|
||||
interface IGamepadEvent {
|
||||
gamepad: IGamepad;
|
||||
}
|
||||
|
||||
export default IGamepadEvent;
|
||||
|
||||
|
@ -1,8 +1,10 @@
|
||||
import TPatternUnit from '@/models/TPatternUnit';
|
||||
|
||||
export default interface IVibrationActuator {
|
||||
interface IVibrationActuator {
|
||||
type: string;
|
||||
reset(): void;
|
||||
playEffect(mode: string, pattern: TPatternUnit): void;
|
||||
}
|
||||
|
||||
export default IVibrationActuator;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import TPatternUnit from '@/models/TPatternUnit';
|
||||
import IGamepad from '@/models/IGamepad';
|
||||
|
||||
export default interface IVibrator {
|
||||
interface IVibrator {
|
||||
readonly id: number;
|
||||
readonly canVibrate: boolean;
|
||||
isVibrating: boolean;
|
||||
@ -13,3 +13,5 @@ export default interface IVibrator {
|
||||
sleep(ms: number): Promise<number>;
|
||||
}
|
||||
|
||||
export default IVibrator;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import TPatternUnit from '@/models/TPatternUnit';
|
||||
|
||||
export type TPattern = {
|
||||
type TPattern = {
|
||||
name: string;
|
||||
type: string;
|
||||
icon: string;
|
||||
|
@ -1,4 +1,4 @@
|
||||
export type TPatternUnit = {
|
||||
type TPatternUnit = {
|
||||
startDelay: number;
|
||||
duration: number;
|
||||
weakMagnitude: number;
|
||||
|
@ -2,7 +2,7 @@ import TPatternUnit from '@/models/TPatternUnit';
|
||||
import IGamepad from '@/models/IGamepad';
|
||||
import IVibrator from '@/models/IVibrator';
|
||||
|
||||
export default class Vibrator implements IVibrator {
|
||||
class Vibrator implements IVibrator {
|
||||
readonly id: number;
|
||||
readonly canVibrate: boolean;
|
||||
isVibrating: boolean;
|
||||
@ -35,7 +35,7 @@ export default class Vibrator implements IVibrator {
|
||||
for (let i = 0; i < this.pattern.length; i++) {
|
||||
if (this.isVibrating === true) {
|
||||
this.unit.vibrationActuator.playEffect('dual-rumble', this.pattern[i]);
|
||||
await this.sleep(this.pattern[i].startDelay + this.pattern[i].duration + 100);
|
||||
await this.sleep(this.pattern[i].startDelay + this.pattern[i].duration);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
@ -48,3 +48,5 @@ export default class Vibrator implements IVibrator {
|
||||
}
|
||||
}
|
||||
|
||||
export default Vibrator;
|
||||
|
||||
|
@ -1,51 +0,0 @@
|
||||
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;
|
||||
|
@ -1,240 +0,0 @@
|
||||
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;
|
||||
|
62
src/store/index.ts
Normal file
62
src/store/index.ts
Normal file
@ -0,0 +1,62 @@
|
||||
import { createStore, Store } from 'vuex';
|
||||
import IRootState from './models/IRootState';
|
||||
import MGamepads from '@/store/modules/MGamepads';
|
||||
import MPatterns from '@/store/modules/MPatterns';
|
||||
|
||||
const store: Store<IRootState> = createStore({
|
||||
state: () => ({
|
||||
mode: 0 as number,
|
||||
isActive: false as boolean,
|
||||
}),
|
||||
getters: {
|
||||
mode: function (state: IRootState): number {
|
||||
return state.mode as number;
|
||||
},
|
||||
isActive: function (state: IRootState): boolean {
|
||||
return state.isActive as boolean;
|
||||
},
|
||||
},
|
||||
mutations: {
|
||||
setMode: function (state: IRootState, mode: number): void {
|
||||
state.mode = mode as number;
|
||||
},
|
||||
setIsActive: function (state: IRootState, isActive: boolean): void {
|
||||
state.isActive = isActive as boolean;
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
setMode: function (
|
||||
context,
|
||||
index: number
|
||||
): void {
|
||||
context.commit('setMode', index as number);
|
||||
},
|
||||
setIsActive: function (
|
||||
context,
|
||||
isActive: boolean
|
||||
): void {
|
||||
context.commit('setIsActive', isActive as boolean);
|
||||
},
|
||||
change: function (context, index: number): void {
|
||||
if (context.getters.mode === index) {
|
||||
context.dispatch('setIsActive', !context.getters.isActive);
|
||||
} else {
|
||||
context.dispatch('setIsActive', true);
|
||||
context.dispatch('setMode', index);
|
||||
}
|
||||
if (context.getters.isActive === true) {
|
||||
context.dispatch('reset');
|
||||
context.dispatch('vibrate');
|
||||
} else {
|
||||
context.dispatch('reset');
|
||||
}
|
||||
},
|
||||
},
|
||||
modules: {
|
||||
MGamepads: MGamepads,
|
||||
MPatterns: MPatterns,
|
||||
},
|
||||
});
|
||||
|
||||
export default store;
|
||||
|
8
src/store/models/IGamepadsState.ts
Normal file
8
src/store/models/IGamepadsState.ts
Normal file
@ -0,0 +1,8 @@
|
||||
import Vibrator from '@/models/Vibrator';
|
||||
|
||||
interface IGamepadsState {
|
||||
gamepads: Vibrator[];
|
||||
}
|
||||
|
||||
export default IGamepadsState;
|
||||
|
8
src/store/models/IPatternState.ts
Normal file
8
src/store/models/IPatternState.ts
Normal file
@ -0,0 +1,8 @@
|
||||
import TPattern from '@/models/TPattern';
|
||||
|
||||
interface IPatternState {
|
||||
patterns: TPattern[];
|
||||
}
|
||||
|
||||
export default IPatternState;
|
||||
|
7
src/store/models/IRootState.ts
Normal file
7
src/store/models/IRootState.ts
Normal file
@ -0,0 +1,7 @@
|
||||
interface IRootState {
|
||||
mode: number;
|
||||
isActive: boolean;
|
||||
}
|
||||
|
||||
export default IRootState;
|
||||
|
66
src/store/modules/MGamepads.ts
Normal file
66
src/store/modules/MGamepads.ts
Normal file
@ -0,0 +1,66 @@
|
||||
import { ActionContext, Module } from 'vuex';
|
||||
import IRootState from '@/store/models/IRootState';
|
||||
import IGamepadsState from '@/store/models/IGamepadsState';
|
||||
import Vibrator from '@/models/Vibrator';
|
||||
import IGamepad from '@/models/IGamepad';
|
||||
import IGamepadEvent from '@/models/IGamepadEvent';
|
||||
import TPatternUnit from '@/models/TPatternUnit';
|
||||
|
||||
const MGamepads: Module<IGamepadsState, IRootState> = {
|
||||
state: () => ({
|
||||
gamepads: [] as Vibrator[],
|
||||
}),
|
||||
getters: {
|
||||
gamepads: function (state: IGamepadsState): Vibrator[] {
|
||||
return state.gamepads as Vibrator[];
|
||||
},
|
||||
},
|
||||
mutations: {
|
||||
addGamepad: function (state: IGamepadsState, gamepad: Vibrator): void {
|
||||
state.gamepads.push(gamepad as Vibrator);
|
||||
},
|
||||
deleteGamepad: function (state: IGamepadsState, index: number): void {
|
||||
state.gamepads.splice(index, 1);
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
addGamepad: function (
|
||||
context: ActionContext<IGamepadsState, IRootState>,
|
||||
event: GamepadEvent
|
||||
): void {
|
||||
const iEvent: IGamepadEvent = event as unknown as IGamepadEvent;
|
||||
if (context.getters.gamepads.length >= 1) {
|
||||
return;
|
||||
} else {
|
||||
context.commit('addGamepad', new Vibrator(iEvent.gamepad as IGamepad));
|
||||
}
|
||||
},
|
||||
deleteGamepad: function (
|
||||
context: ActionContext<IGamepadsState, IRootState>,
|
||||
event: GamepadEvent
|
||||
): void {
|
||||
context.getters.gamepads.forEach((gamepad: Vibrator, index: number) => {
|
||||
if (gamepad.unit.id === event.gamepad.id) {
|
||||
context.commit('deleteGamepad', index as number);
|
||||
}
|
||||
});
|
||||
},
|
||||
vibrate: function (
|
||||
context: ActionContext<IGamepadsState, IRootState>
|
||||
): void {
|
||||
context.getters.gamepads.forEach((gamepad: Vibrator) => {
|
||||
gamepad.vibrate(context.getters.patterns[context.getters.mode].pattern as TPatternUnit[]);
|
||||
});
|
||||
},
|
||||
reset: function (
|
||||
context: ActionContext<IGamepadsState, IRootState>
|
||||
): void {
|
||||
context.getters.gamepads.forEach((gamepad: Vibrator) => {
|
||||
gamepad.reset();
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default MGamepads;
|
||||
|
41
src/store/modules/MPatterns.ts
Normal file
41
src/store/modules/MPatterns.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import { ActionContext, Module } from 'vuex';
|
||||
import IRootState from '@/store/models/IRootState';
|
||||
import IPatternState from '@/store/models/IPatternState';
|
||||
import TPattern from '@/models/TPattern';
|
||||
|
||||
const MPatterns: Module<IPatternState, IRootState> = {
|
||||
state: () => ({
|
||||
patterns: [] as TPattern[],
|
||||
}),
|
||||
getters: {
|
||||
patterns: function (state: IPatternState): TPattern[] {
|
||||
return state.patterns as TPattern[];
|
||||
},
|
||||
},
|
||||
mutations: {
|
||||
setPatterns: function (state: IPatternState, patterns: TPattern[]): void {
|
||||
state.patterns = patterns as TPattern[];
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
loadPatterns: async function (
|
||||
context: ActionContext<IPatternState, IRootState>
|
||||
): Promise<void> {
|
||||
const url = 'https://wavelovers.ru/assets/patterns.json';
|
||||
try {
|
||||
const response: Response = await fetch(url);
|
||||
if (response.ok) {
|
||||
const json: TPattern[] = await response.json();
|
||||
context.commit('setPatterns', json as TPattern[]);
|
||||
} else {
|
||||
console.log('Connect to the Internet for download more patterns...');
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default MPatterns;
|
||||
|
@ -1,31 +0,0 @@
|
||||
<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>
|
||||
|
@ -1,32 +0,0 @@
|
||||
<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>
|
||||
|
@ -1,53 +0,0 @@
|
||||
<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>
|
||||
|
@ -1,19 +0,0 @@
|
||||
<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>
|
||||
|
@ -1,31 +0,0 @@
|
||||
<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>
|
||||
|
Loading…
Reference in New Issue
Block a user