mirror of
https://github.com/eugene-serb/wavelovers.git
synced 2023-09-09 23:41:16 +03:00
commit
61a2054fca
125
docs/about.html
125
docs/about.html
@ -1,132 +1,11 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Wavelovers</title>
|
<title>Wavelovers – Redirect</title>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?about" />
|
||||||
<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. 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="/css/styles.css" />
|
|
||||||
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
|
||||||
<script>
|
|
||||||
window.dataLayer = window.dataLayer || [];
|
|
||||||
function gtag() { dataLayer.push(arguments); }
|
|
||||||
gtag('js', new Date());
|
|
||||||
|
|
||||||
gtag('config', 'G-59FM5E4MVD');
|
|
||||||
</script>
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<!-- Yandex.Metrika counter -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
(function (m, e, t, r, i, k, a) {
|
|
||||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
|
||||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
|
||||||
})
|
|
||||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
|
||||||
|
|
||||||
ym(89252711, "init", {
|
|
||||||
clickmap: true,
|
|
||||||
trackLinks: true,
|
|
||||||
accurateTrackBounce: true,
|
|
||||||
webvisor: true
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<!-- /Yandex.Metrika counter -->
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<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 – 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>
|
|
||||||
|
|
||||||
<footer class="footer">
|
|
||||||
<div class="footer-wrapper container">
|
|
||||||
<div class="annotation">
|
|
||||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
|
||||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
|
||||||
</div>
|
|
||||||
<div class="annotation created-by">
|
|
||||||
<span class="annotation__text">Created by</span><a href="https://eugene-serb.github.io/" target="_blank" translate="no">Eugene Serb</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
.manual-form{display:flex;flex-direction:column-reverse;justify-content:space-between;gap:16px}.manual-form__input{display:grid;grid-template-columns:1fr;align-items:center}.manual-form__buttons{display:flex;flex-direction:row;justify-content:space-between;gap:32px}.manual-form__button{width:100%}@media only screen and (min-width:540px){.manual-form{display:flex;flex-direction:column;gap:32px}.manual-form__input{display:grid;grid-template-columns:1fr 1fr}}
|
|
1
docs/css/741.06b3a622.css
Normal file
1
docs/css/741.06b3a622.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
.app-manual{display:flex;flex-direction:column;justify-content:space-between;gap:32px}.manual-form__input{display:grid;grid-template-columns:1fr;align-items:center}.manual-controls{display:flex;flex-direction:column;justify-content:space-between;align-self:center}@media only screen and (min-width:540px){.manual-form__input{display:grid;grid-template-columns:1fr 1fr}.manual-controls{display:flex;flex-direction:row;align-self:stretch}}
|
1
docs/css/991.19a8cda3.css
Normal file
1
docs/css/991.19a8cda3.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
.custom-form{display:flex;flex-direction:column-reverse;justify-content:space-between;gap:16px}.custom-form__input{display:grid;grid-template-columns:1fr;align-items:center}.custom-form__buttons{display:flex;flex-direction:row;justify-content:space-between;gap:32px}.custom-form__button{width:100%}@media only screen and (min-width:540px){.custom-form{display:flex;flex-direction:column;gap:32px}.custom-form__input{display:grid;grid-template-columns:1fr 1fr}}
|
@ -1 +0,0 @@
|
|||||||
.navigation-list{display:flex;flex-direction:row;justify-content:flex-start;gap:16px}.navigation-item.router-link-active,.navigation-item.router-link-exact-active{border-bottom:2px solid var(--color-link-hover);color:var(--color-link-hover);transition:all .5s ease;text-decoration:none}.list-item{max-width:100%;padding:16px;border:4px solid var(--color-b);border-radius:4px;justify-content:space-between}.list-item,.list-item__info{display:flex;flex-direction:column}.list-item__info{gap:16px}.list-item_selected .list-item__info span{color:var(--color-white)}.device-list{display:flex;flex-direction:row;justify-content:space-around;gap:16px}.message{width:100%;display:flex;flex-direction:column;justify-content:center;text-align:center;font-size:16px}@media only screen and (min-width:540px){.message{font-size:24px}}.pattern-item{width:100%;height:50px;padding:8px;border-radius:var(--number-border-radius);background:var(--color-pattern-button);display:flex;flex-direction:row;justify-content:flex-start;gap:8px;align-items:center;text-align:center;overflow:hidden;cursor:pointer}@media only screen and (min-width:540px){.pattern-item{width:200px}}.pattern-item ::-moz-selection{background-color:transparent}.pattern-item ::selection{background-color:transparent}.pattern-item_selected{background:var(--color-b)}.pattern-item__icon{font-size:24px}.pattern-item__info-container{display:flex;flex-direction:column;justify-content:space-between;text-align:left}.pattern-item__name{font-size:16px}.pattern-item__name,.pattern-item__type{white-space:nowrap;overflow:hidden;color:var(--color-pattern-text)}.pattern-item__type{font-size:12px}.pattern-list{display:flex;flex-direction:row;justify-content:space-around;flex-wrap:wrap;gap:16px}@media only screen and (min-width:540px){.pattern-list{display:flex;gap:32px}}
|
|
1
docs/css/app.e06e3290.css
Normal file
1
docs/css/app.e06e3290.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
.header{border-bottom:8px solid var(--color-header-borderline);background:var(--color-header-background)}.header ::-moz-selection{background:var(--color-header-selection)}.header ::selection{background:var(--color-header-selection)}.header :focus{border-bottom:2px solid var(--color-header-navigation-link-hover)}.header :focus-visible{outline:2px solid var(--color-header-navigation-link-hover);border-color:transparent}.header-wrapper{padding-top:32px;padding-bottom:16px}.logo-wrapper{text-align:center}.logo-wrapper__logo{font-size:48px;font-weight:500;color:var(--color-header-logo);cursor:default}.menu-wrapper{margin-top:16px;align-self:center}.navigation{padding:0;list-style-type:none;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;gap:8px}.navigation__item{font-size:16px;text-transform:uppercase}.navigation__item a{border-color:transparent;color:var(--color-header-navigation-link)}.navigation__item a:hover{border-color:var(--color-header-navigation-link-hover);color:var(--color-header-navigation-link-hover)}@media only screen and (min-width:540px){.header{border-bottom:32px solid var(--color-header-borderline);background:var(--color-header-background)}.header-wrapper{padding-top:64px;padding-bottom:16px}.menu-wrapper{margin-top:32px;align-self:center}}@media only screen and (min-width:720px){.header-wrapper{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;gap:64px}.logo-wrapper{width:50%;text-align:left}.menu-wrapper{width:50%;margin-top:0;align-self:flex-end}}@media only screen and (min-width:1024px){.logo-wrapper__logo{font-size:64px}}.footer{border-top:4px solid var(--color-footer-borderline)}.footer span{color:var(--color-footer-text)}.footer-wrapper{padding-top:32px;padding-bottom:32px;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;gap:32px}.created-by{align-self:flex-end}.created-by>span{padding-right:8px}.created-by>a{font-size:32px}.navigation-list{display:flex;flex-direction:row;justify-content:flex-start;gap:16px}.navigation-list__item.router-link-active,.navigation-list__item.router-link-exact-active{border-bottom:2px solid var(--color-link-hover);color:var(--color-link-hover);transition:all .5s ease;text-decoration:none}.list-item{max-width:100%;padding:16px;border:4px solid var(--color-b);border-radius:4px;justify-content:space-between}.list-item,.list-item__info{display:flex;flex-direction:column}.list-item__info{gap:16px}.list-item_selected .list-item__info span{color:var(--color-white)}.device-list{display:flex;flex-direction:row;justify-content:space-around;gap:16px}.message{width:100%;display:flex;flex-direction:column;justify-content:center;text-align:center;font-size:16px}@media only screen and (min-width:540px){.message{font-size:24px}}.pattern-item{width:100%;height:50px;padding:8px;border-radius:var(--number-border-radius);background:var(--color-pattern-button);display:flex;flex-direction:row;justify-content:flex-start;gap:8px;align-items:center;text-align:center;overflow:hidden;cursor:pointer}@media only screen and (min-width:540px){.pattern-item{width:200px}}.pattern-item ::-moz-selection{background-color:transparent}.pattern-item ::selection{background-color:transparent}.pattern-item_selected{background:var(--color-b)}.pattern-item__icon{font-size:24px}.pattern-item__info-container{display:flex;flex-direction:column;justify-content:space-between;text-align:left}.pattern-item__name{font-size:16px}.pattern-item__name,.pattern-item__type{white-space:nowrap;overflow:hidden;color:var(--color-pattern-text)}.pattern-item__type{font-size:12px}.pattern-list{display:flex;flex-direction:row;justify-content:space-around;flex-wrap:wrap;gap:16px}@media only screen and (min-width:540px){.pattern-list{display:flex;gap:32px}}
|
@ -1,6 +1,6 @@
|
|||||||
/* ------------------------------ */
|
/* ------------------------------ */
|
||||||
/* Wavelovers styles */
|
/* Wavelovers styles */
|
||||||
/* version: dated 2022.08.08 */
|
/* version: dated 2022.08.12 */
|
||||||
/* author: Eugene Serb */
|
/* author: Eugene Serb */
|
||||||
/* ------------------------------ */
|
/* ------------------------------ */
|
||||||
|
|
||||||
@ -408,152 +408,17 @@ table, th, td {
|
|||||||
/* COMPONENTS STYLES */
|
/* COMPONENTS STYLES */
|
||||||
/* ----------------- */
|
/* ----------------- */
|
||||||
|
|
||||||
/* ------ */
|
/* --- */
|
||||||
/* HEADER */
|
/* APP */
|
||||||
/* ------ */
|
/* --- */
|
||||||
|
|
||||||
.header {
|
.app {
|
||||||
border-bottom: 8px solid var(--color-header-borderline);
|
min-height: 100vh;
|
||||||
background: var(--color-header-background);
|
|
||||||
}
|
|
||||||
|
|
||||||
.header ::selection {
|
|
||||||
background: var(--color-header-selection);
|
|
||||||
}
|
|
||||||
|
|
||||||
.header :focus {
|
|
||||||
border-bottom: 2px solid var(--color-header-navigation-link-hover);
|
|
||||||
}
|
|
||||||
|
|
||||||
.header :focus-visible {
|
|
||||||
outline: 2px solid var(--color-header-navigation-link-hover);
|
|
||||||
border-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-wrapper {
|
|
||||||
padding-top: 32px;
|
|
||||||
padding-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo-wrapper {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo-wrapper__logo {
|
|
||||||
font-size: 48px;
|
|
||||||
font-weight: 500;
|
|
||||||
color: var(--color-header-logo);
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-wrapper {
|
|
||||||
margin-top: 16px;
|
|
||||||
align-self: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigation {
|
|
||||||
padding: 0;
|
|
||||||
list-style-type: none;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: column;
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
gap: 8px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.navigation__item {
|
|
||||||
font-size: 16px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigation__item a {
|
|
||||||
border-color: transparent;
|
|
||||||
color: var(--color-header-navigation-link);
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigation__item a:hover {
|
|
||||||
border-color: var(--color-header-navigation-link-hover);
|
|
||||||
color: var(--color-header-navigation-link-hover);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media only screen and (min-width: 540px) {
|
|
||||||
.header {
|
|
||||||
border-bottom: 32px solid var(--color-header-borderline);
|
|
||||||
background: var(--color-header-background);
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-wrapper {
|
|
||||||
padding-top: 64px;
|
|
||||||
padding-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-wrapper {
|
|
||||||
margin-top: 32px;
|
|
||||||
align-self: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media only screen and (min-width: 720px) {
|
|
||||||
.header-wrapper {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
flex-wrap: nowrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
gap: 64px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo-wrapper {
|
|
||||||
width: 50%;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-wrapper {
|
|
||||||
width: 50%;
|
|
||||||
margin-top: 0px;
|
|
||||||
align-self: flex-end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media only screen and (min-width: 1024px) {
|
|
||||||
.logo-wrapper__logo {
|
|
||||||
font-size: 64px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------ */
|
|
||||||
/* FOOTER */
|
|
||||||
/* ------ */
|
|
||||||
|
|
||||||
.footer {
|
|
||||||
border-top: 4px solid var(--color-footer-borderline);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer span {
|
|
||||||
color: var(--color-footer-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-wrapper {
|
|
||||||
padding-top: 32px;
|
|
||||||
padding-bottom: 32px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
gap: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.created-by {
|
|
||||||
align-self: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.created-by > span {
|
|
||||||
padding-right: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.created-by > a {
|
|
||||||
font-size: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- */
|
/* ---- */
|
||||||
/* PAGE */
|
/* PAGE */
|
||||||
/* ---- */
|
/* ---- */
|
||||||
@ -625,10 +490,6 @@ table, th, td {
|
|||||||
/* PAGES */
|
/* PAGES */
|
||||||
/* ----- */
|
/* ----- */
|
||||||
|
|
||||||
/* ----------- */
|
|
||||||
/* WAVELOVERS */
|
|
||||||
/* ----------- */
|
|
||||||
|
|
||||||
.link_hash {
|
.link_hash {
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
11
docs/custom.html
Normal file
11
docs/custom.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Wavelovers – Redirect</title>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?custom" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
126
docs/donate.html
126
docs/donate.html
@ -1,133 +1,11 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Wavelovers</title>
|
<title>Wavelovers – Redirect</title>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?donate" />
|
||||||
<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. 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="/css/styles.css" />
|
|
||||||
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
|
||||||
<script>
|
|
||||||
window.dataLayer = window.dataLayer || [];
|
|
||||||
function gtag() { dataLayer.push(arguments); }
|
|
||||||
gtag('js', new Date());
|
|
||||||
|
|
||||||
gtag('config', 'G-59FM5E4MVD');
|
|
||||||
</script>
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<!-- Yandex.Metrika counter -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
(function (m, e, t, r, i, k, a) {
|
|
||||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
|
||||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
|
||||||
})
|
|
||||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
|
||||||
|
|
||||||
ym(89252711, "init", {
|
|
||||||
clickmap: true,
|
|
||||||
trackLinks: true,
|
|
||||||
accurateTrackBounce: true,
|
|
||||||
webvisor: true
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<!-- /Yandex.Metrika counter -->
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header class="header">
|
|
||||||
<div class="header-wrapper container">
|
|
||||||
<div class="logo-wrapper">
|
|
||||||
<span class="logo-wrapper__logo" translate="no">Wavelovers</span>
|
|
||||||
</div>
|
|
||||||
<nav class="menu-wrapper">
|
|
||||||
<ul class="navigation">
|
|
||||||
<li class="navigation__item">
|
|
||||||
<a href="/" target="_self" class="navigation__link">Home</a>
|
|
||||||
</li>
|
|
||||||
<li class="navigation__item">
|
|
||||||
<a href="/faq.html" target="_self" class="navigation__link">FAQ</a>
|
|
||||||
</li>
|
|
||||||
<li class="navigation__item">
|
|
||||||
<a href="/about.html" target="_self" class="navigation__link">About</a>
|
|
||||||
</li>
|
|
||||||
<li class="navigation__item">
|
|
||||||
<a href="/donate.html" target="_self" class="navigation__link">Donate</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main class="page container">
|
|
||||||
<h1 class="visually-hidden">Wavelovers – Donate</h1>
|
|
||||||
<div>
|
|
||||||
<div class="content-item">
|
|
||||||
<h2 class="content-item__header">Donate</h2>
|
|
||||||
<span>If you like this app, you can thank me and donate to me.</span><br /><br />
|
|
||||||
<span>Why should you donate to Wavelovers?</span><br /><br />
|
|
||||||
<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 />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<footer class="footer">
|
|
||||||
<div class="footer-wrapper container">
|
|
||||||
<div class="annotation">
|
|
||||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
|
||||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
|
||||||
</div>
|
|
||||||
<div class="annotation created-by">
|
|
||||||
<span class="annotation__text">Created by</span><a href="https://eugene-serb.github.io/" target="_blank" translate="no">Eugene Serb</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
147
docs/faq.html
147
docs/faq.html
@ -1,154 +1,11 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Wavelovers</title>
|
<title>Wavelovers – Redirect</title>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?faq" />
|
||||||
<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. 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="/css/styles.css" />
|
|
||||||
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
|
||||||
<script>
|
|
||||||
window.dataLayer = window.dataLayer || [];
|
|
||||||
function gtag() { dataLayer.push(arguments); }
|
|
||||||
gtag('js', new Date());
|
|
||||||
|
|
||||||
gtag('config', 'G-59FM5E4MVD');
|
|
||||||
</script>
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<!-- Yandex.Metrika counter -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
(function (m, e, t, r, i, k, a) {
|
|
||||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
|
||||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
|
||||||
})
|
|
||||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
|
||||||
|
|
||||||
ym(89252711, "init", {
|
|
||||||
clickmap: true,
|
|
||||||
trackLinks: true,
|
|
||||||
accurateTrackBounce: true,
|
|
||||||
webvisor: true
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<!-- /Yandex.Metrika counter -->
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<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 – FAQ</h1>
|
|
||||||
<div>
|
|
||||||
<div class="content-item">
|
|
||||||
<h2 class="content-item__header">FAQ</h2>
|
|
||||||
<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://wavelovers.ru/?diagnostic" target="_blank">Wavelovers Diagnostic</a><br /><br />
|
|
||||||
<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>
|
|
||||||
<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>
|
|
||||||
|
|
||||||
<footer class="footer">
|
|
||||||
<div class="footer-wrapper container">
|
|
||||||
<div class="annotation">
|
|
||||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
|
||||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
|
||||||
</div>
|
|
||||||
<div class="annotation created-by">
|
|
||||||
<span class="annotation__text">Created by</span><a href="https://eugene-serb.github.io/" target="_blank" translate="no">Eugene Serb</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<!doctype html><html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml"><head><title>Wavelovers</title><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" media="(prefers-color-scheme: light)" content="#EA9AB2"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#E27396"/><meta name="color-scheme" content="light dark"/><meta name="robots" content="all"/><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 || [];
|
<!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"/><script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script><script>window.dataLayer = window.dataLayer || [];
|
||||||
function gtag() { dataLayer.push(arguments); }
|
function gtag() { dataLayer.push(arguments); }
|
||||||
gtag('js', new Date());
|
gtag('js', new Date());
|
||||||
|
|
||||||
@ -15,4 +15,4 @@
|
|||||||
webvisor: true
|
webvisor: true
|
||||||
});</script><style>[v-cloak] {
|
});</script><style>[v-cloak] {
|
||||||
display: none;
|
display: none;
|
||||||
}</style><script defer="defer" src="/js/chunk-vendors.248cd14b.js"></script><script defer="defer" src="/js/app.26b99067.js"></script><link href="/css/app.b1ea1061.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>
|
}</style><script defer="defer" src="/js/chunk-vendors.8748c580.js"></script><script defer="defer" src="/js/app.6006a533.js"></script><link href="/css/app.e06e3290.css" rel="stylesheet"></head><body><div id="app" class="app" v-cloak></div><noscript>You need to enable JavaScript to run this app.</noscript><noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt=""/></div></noscript></body></html>
|
2
docs/js/284.e47dcb1b.js
Normal file
2
docs/js/284.e47dcb1b.js
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[284],{6284:function(e,n,t){t.r(n),t.d(n,{default:function(){return i}});var u=t(3396);const l=(0,u._)("h1",{class:"visually-hidden"},"Wavelovers – 404",-1),a={class:"content-item"},s=(0,u._)("h2",null,"404. Page not Found.",-1);function r(e,n,t,r,o,c){const v=(0,u.up)("center");return(0,u.wg)(),(0,u.iD)(u.HY,null,[l,(0,u._)("div",a,[(0,u.Wm)(v,null,{default:(0,u.w5)((()=>[s])),_:1})])],64)}var o=(0,u.aZ)({name:"NotFoundView"}),c=t(89);const v=(0,c.Z)(o,[["render",r]]);var i=v}}]);
|
||||||
|
//# sourceMappingURL=284.e47dcb1b.js.map
|
1
docs/js/284.e47dcb1b.js.map
Normal file
1
docs/js/284.e47dcb1b.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"js/284.e47dcb1b.js","mappings":"8KAEA,MAAMA,GAA0BC,EAAAA,EAAAA,GAAoB,KAAM,CAAEC,MAAO,mBAAqB,oBAAqB,GACvGC,EAAa,CAAED,MAAO,gBACtBE,GAA0BH,EAAAA,EAAAA,GAAoB,KAAM,KAAM,wBAAyB,GAEnF,SAAUI,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,MAAMC,GAAoBC,EAAAA,EAAAA,IAAkB,UAE5C,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoBC,EAAAA,GAAW,KAAM,CACzDhB,GACAC,EAAAA,EAAAA,GAAoB,MAAOE,EAAY,EACrCc,EAAAA,EAAAA,IAAaL,EAAmB,KAAM,CACpCM,SAASC,EAAAA,EAAAA,KAAS,IAAM,CACtBf,KAEFgB,EAAG,OAGN,GACJ,CCjBG,OAAeC,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,iB,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASlB,KAEpE,O","sources":["webpack://wavelovers/./src/views/NotFoundView.vue?f875","webpack://wavelovers/./src/views/NotFoundView.vue?6f3f","webpack://wavelovers/./src/views/NotFoundView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createElementVNode(\"h1\", { class: \"visually-hidden\" }, \"Wavelovers – 404\", -1)\nconst _hoisted_2 = { class: \"content-item\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"h2\", null, \"404. Page not Found.\", -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_center = _resolveComponent(\"center\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _hoisted_1,\n _createElementVNode(\"div\", _hoisted_2, [\n _createVNode(_component_center, null, {\n default: _withCtx(() => [\n _hoisted_3\n ]),\n _: 1\n })\n ])\n ], 64))\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=1e848f28&ts=true\"\nimport script from \"./NotFoundView.vue?vue&type=script&lang=ts\"\nexport * from \"./NotFoundView.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","_createElementVNode","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_center","_resolveComponent","_openBlock","_createElementBlock","_Fragment","_createVNode","default","_withCtx","_","defineComponent","name","__exports__"],"sourceRoot":""}
|
2
docs/js/34.7ff8bfa5.js
Normal file
2
docs/js/34.7ff8bfa5.js
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[34],{2034:function(e,a,t){t.r(a),t.d(a,{default:function(){return h}});var n=t(3396);const s=(0,n.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);function i(e,a,t,n,i,r){return s}var r=(0,n.aZ)({name:"AboutView"}),o=t(89);const u=(0,o.Z)(r,[["render",i]]);var h=u}}]);
|
||||||
|
//# sourceMappingURL=34.7ff8bfa5.js.map
|
1
docs/js/34.7ff8bfa5.js.map
Normal file
1
docs/js/34.7ff8bfa5.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"js/34.7ff8bfa5.js","mappings":"6KAEA,MAAMA,GAA0BC,EAAAA,EAAAA,IAAmB,4uBAAmwB,GAEhzB,SAAUC,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAOR,CACR,CCHG,OAAeS,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,c,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAST,KAEpE,O","sources":["webpack://wavelovers/./src/views/AboutView.vue?10d6","webpack://wavelovers/./src/views/AboutView.vue?f245","webpack://wavelovers/./src/views/AboutView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode } from \"vue\"\n\nconst _hoisted_1 = /*#__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)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return _hoisted_1\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'AboutView',\r\n });\r\n","import { render } from \"./AboutView.vue?vue&type=template&id=f16c0d46&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","_createStaticVNode","render","_ctx","_cache","$props","$setup","$data","$options","defineComponent","name","__exports__"],"sourceRoot":""}
|
2
docs/js/442.d79586f7.js
Normal file
2
docs/js/442.d79586f7.js
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[442],{8442:function(e,o,r){r.r(o),r.d(o,{default:function(){return m}});var n=r(3396);const a=(0,n.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><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></div></div>',2);function s(e,o,r,n,s,t){return a}var t=(0,n.aZ)({name:"DonateView"}),u=r(89);const i=(0,u.Z)(t,[["render",s]]);var m=i}}]);
|
||||||
|
//# sourceMappingURL=442.d79586f7.js.map
|
1
docs/js/442.d79586f7.js.map
Normal file
1
docs/js/442.d79586f7.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"js/442.d79586f7.js","mappings":"8KAEA,MAAMA,GAA0BC,EAAAA,EAAAA,IAAmB,8vBAA2wB,GAExzB,SAAUC,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAOR,CACR,CCHG,OAAeS,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,e,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAST,KAEpE,O","sources":["webpack://wavelovers/./src/views/DonateView.vue?cadb","webpack://wavelovers/./src/views/DonateView.vue?82fb","webpack://wavelovers/./src/views/DonateView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode } from \"vue\"\n\nconst _hoisted_1 = /*#__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><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></div></div>\", 2)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return _hoisted_1\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'DonateView',\r\n });\r\n","import { render } from \"./DonateView.vue?vue&type=template&id=631a61cc&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","_createStaticVNode","render","_ctx","_cache","$props","$setup","$data","$options","defineComponent","name","__exports__"],"sourceRoot":""}
|
@ -1,2 +0,0 @@
|
|||||||
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[46],{9046:function(a,t,n){n.r(t),n.d(t,{default:function(){return S}});var e=n(3396);function u(a,t,n,u,r,l){const s=(0,e.up)("AppManual");return(0,e.wg)(),(0,e.j4)(s)}var r=n(9242);const l={class:"content-item app-manual"},s={class:"manual-form"},o={class:"manual-form__input"},i=(0,e._)("span",null,"Start Delay (ms)",-1),p={class:"manual-form__input"},d=(0,e._)("span",null,"Duration (ms)",-1),m={class:"manual-form__input"},c=(0,e._)("span",null,"Weak Magnitude",-1),_={class:"manual-form__input"},g=(0,e._)("span",null,"Strong Magnitude",-1),f={class:"manual-form__buttons"};function M(a,t,n,u,M,w){return(0,e.wg)(),(0,e.iD)("div",l,[(0,e._)("fieldset",s,[(0,e._)("label",o,[i,(0,e.wy)((0,e._)("input",{"onUpdate:modelValue":t[0]||(t[0]=t=>a.startDelay=t),type:"number",placeholder:"Start Delay",min:"0",max:"1000",step:"25",required:""},null,512),[[r.nr,a.startDelay]])]),(0,e._)("label",p,[d,(0,e.wy)((0,e._)("input",{"onUpdate:modelValue":t[1]||(t[1]=t=>a.duration=t),type:"number",placeholder:"Duration",min:"0",max:"1000",step:"25",required:""},null,512),[[r.nr,a.duration]])]),(0,e._)("label",m,[c,(0,e.wy)((0,e._)("input",{"onUpdate:modelValue":t[2]||(t[2]=t=>a.weakMagnitude=t),type:"range",placeholder:"Weak Magnitude",min:"0.0",max:"1.0",step:"0.01",required:""},null,512),[[r.nr,a.weakMagnitude]])]),(0,e._)("label",_,[g,(0,e.wy)((0,e._)("input",{"onUpdate:modelValue":t[3]||(t[3]=t=>a.strongMagnitude=t),type:"range",placeholder:"Strong Magnitude",min:"0.0",max:"1.0",step:"0.01",required:""},null,512),[[r.nr,a.strongMagnitude]])]),(0,e._)("div",f,[(0,e._)("button",{onClick:t[4]||(t[4]=(...t)=>a.start&&a.start(...t)),class:"manual-form__button"},"Start"),(0,e._)("button",{onClick:t[5]||(t[5]=(...t)=>a.stop&&a.stop(...t)),class:"manual-form__button"},"Stop")])])])}var w=n(1746),h=(0,e.aZ)({name:"AppManual",data:()=>({startDelay:250,duration:250,weakMagnitude:1,strongMagnitude:1}),methods:{createPatternUnit:function(){const a=[{startDelay:this.startDelay,duration:this.duration,weakMagnitude:this.weakMagnitude,strongMagnitude:this.strongMagnitude}];return a},start:function(){w.Z.dispatch("startCustom",this.createPatternUnit())},stop:function(){w.Z.dispatch("reset")}}}),y=n(89);const b=(0,y.Z)(h,[["render",M]]);var k=b,v=(0,e.aZ)({name:"ManualView",components:{AppManual:k}});const D=(0,y.Z)(v,[["render",u]]);var S=D}}]);
|
|
||||||
//# sourceMappingURL=46.c7a9f83c.js.map
|
|
File diff suppressed because one or more lines are too long
2
docs/js/479.b4912f46.js
Normal file
2
docs/js/479.b4912f46.js
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[479],{1479:function(e,t,d){d.r(t),d.d(t,{default:function(){return h}});var a=d(3396);const s=(0,a.uE)('<h1 class="visually-hidden">Wavelovers <20> FAQ</h1><div><div class="content-item"><h2 class="content-item__header">FAQ</h2><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://wavelovers.ru/diagnostic" target="_blank">Wavelovers Diagnostic</a><br><br><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><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>',2);function o(e,t,d,a,o,r){return s}var r=(0,a.aZ)({name:"FaqView"}),i=d(89);const n=(0,i.Z)(r,[["render",o]]);var h=n}}]);
|
||||||
|
//# sourceMappingURL=479.b4912f46.js.map
|
1
docs/js/479.b4912f46.js.map
Normal file
1
docs/js/479.b4912f46.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"js/479.b4912f46.js","mappings":"8KAEA,MAAMA,GAA0BC,EAAAA,EAAAA,IAAmB,02DAAi4D,GAE96D,SAAUC,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAOR,CACR,CCHG,OAAeS,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,Y,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAST,KAEpE,O","sources":["webpack://wavelovers/./src/views/FaqView.vue?1215","webpack://wavelovers/./src/views/FaqView.vue?a581","webpack://wavelovers/./src/views/FaqView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createStaticVNode(\"<h1 class=\\\"visually-hidden\\\">Wavelovers <20> FAQ</h1><div><div class=\\\"content-item\\\"><h2 class=\\\"content-item__header\\\">FAQ</h2><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://wavelovers.ru/diagnostic\\\" target=\\\"_blank\\\">Wavelovers Diagnostic</a><br><br><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><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>\", 2)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return _hoisted_1\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'FaqView',\r\n });\r\n","import { render } from \"./FaqView.vue?vue&type=template&id=66f9e665&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","_createStaticVNode","render","_ctx","_cache","$props","$setup","$data","$options","defineComponent","name","__exports__"],"sourceRoot":""}
|
@ -1,2 +0,0 @@
|
|||||||
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[554],{4554:function(a,t,e){e.r(t),e.d(t,{default:function(){return F}});var s=e(3396);function n(a,t,e,n,u,i){const p=(0,s.up)("AppDiagnostic");return(0,s.wg)(),(0,s.j4)(p)}const u={key:0,class:"content-item"};function i(a,t,e,n,i,p){const d=(0,s.up)("DiagnosticItem");return a.gamepads.length>0?((0,s.wg)(),(0,s.iD)("div",u,[((0,s.wg)(!0),(0,s.iD)(s.HY,null,(0,s.Ko)(a.gamepads,(t=>((0,s.wg)(),(0,s.j4)(d,{key:t.id,gamepad:t,timestamp:a.timestamp},null,8,["gamepad","timestamp"])))),128))])):(0,s.kq)("",!0)}var p=e(1746),d=e(7139);const o={class:"output-gamepad"},l={class:"gamepad-group"};function m(a,t,e,n,u,i){return(0,s.wg)(),(0,s.iD)("div",o,[(0,s._)("h3",null,"#"+(0,d.zw)(a.gamepad.unit.index+1)+". "+(0,d.zw)(a.gamepad.unit.id),1),(0,s._)("div",l,[(0,s._)("div",null,[(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[0].value?"pressed":""])},"A: "+(0,d.zw)(a.gamepad.unit.buttons[0].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[1].value?"pressed":""])},"B: "+(0,d.zw)(a.gamepad.unit.buttons[1].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[2].value?"pressed":""])},"X: "+(0,d.zw)(a.gamepad.unit.buttons[2].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[3].value?"pressed":""])},"Y: "+(0,d.zw)(a.gamepad.unit.buttons[3].value.toFixed(2)),3)]),(0,s._)("div",null,[(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[4].value?"pressed":""])},"LB: "+(0,d.zw)(a.gamepad.unit.buttons[4].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[5].value?"pressed":""])},"RB: "+(0,d.zw)(a.gamepad.unit.buttons[5].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[6].value?"pressed":""])},"LT: "+(0,d.zw)(a.gamepad.unit.buttons[6].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[7].value?"pressed":""])},"RT: "+(0,d.zw)(a.gamepad.unit.buttons[7].value.toFixed(2)),3)]),(0,s._)("div",null,[(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[8].value?"pressed":""])},"Back: "+(0,d.zw)(a.gamepad.unit.buttons[8].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[9].value?"pressed":""])},"Start: "+(0,d.zw)(a.gamepad.unit.buttons[9].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[10].value?"pressed":""])},"Left Stick: "+(0,d.zw)(a.gamepad.unit.buttons[10].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[11].value?"pressed":""])},"Right Stick: "+(0,d.zw)(a.gamepad.unit.buttons[11].value.toFixed(2)),3)]),(0,s._)("div",null,[(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[12].value?"pressed":""])},"Forward: "+(0,d.zw)(a.gamepad.unit.buttons[12].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[13].value?"pressed":""])},"Backward: "+(0,d.zw)(a.gamepad.unit.buttons[13].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[14].value?"pressed":""])},"Left: "+(0,d.zw)(a.gamepad.unit.buttons[14].value.toFixed(2)),3),(0,s._)("span",{class:(0,d.C_)([1===a.gamepad.unit.buttons[15].value?"pressed":""])},"Right: "+(0,d.zw)(a.gamepad.unit.buttons[15].value.toFixed(2)),3)]),(0,s._)("div",null,[(0,s._)("span",null,"Left Stick X: "+(0,d.zw)(a.gamepad.unit.axes[0]?a.gamepad.unit.axes[0].toFixed(2):"missing"),1),(0,s._)("span",null,"Left Stick Y: "+(0,d.zw)(a.gamepad.unit.axes[1]?a.gamepad.unit.axes[1].toFixed(2):"missing"),1),(0,s._)("span",null,"Right Stick X: "+(0,d.zw)(a.gamepad.unit.axes[2]?a.gamepad.unit.axes[2].toFixed(2):"missing"),1),(0,s._)("span",null,"Right Stick Y: "+(0,d.zw)(a.gamepad.unit.axes[3]?a.gamepad.unit.axes[3].toFixed(2):"missing"),1)])]),(0,s._)("span",null,"Vibration Actuator: "+(0,d.zw)(a.gamepad.unit.vibrationActuator?"Available":"missing"),1)])}var g=(0,s.aZ)({name:"DiagnosticItem",props:{gamepad:{type:Object},timestamp:{type:Number}}}),r=e(89);const c=(0,r.Z)(g,[["render",m]]);var v=c,_=(0,s.aZ)({name:"AppDiagnostic",components:{DiagnosticItem:v},data:()=>({timestamp:0,interval:0}),computed:{gamepads:function(){const a=this.timestamp,t=p.Z.getters.gamepads;return t.forEach((t=>{t.interval=a})),t}},methods:{updateTimestamp:function(){this.timestamp=Date.now()}},mounted(){this.interval=setInterval(this.updateTimestamp,1)},unmounted(){clearInterval(this.interval)}});const b=(0,r.Z)(_,[["render",i]]);var w=b,x=(0,s.aZ)({name:"DiagnosticView",components:{AppDiagnostic:w}});const z=(0,r.Z)(x,[["render",n]]);var F=z}}]);
|
|
||||||
//# sourceMappingURL=554.0d3dfa8b.js.map
|
|
File diff suppressed because one or more lines are too long
@ -1,2 +0,0 @@
|
|||||||
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[567],{7567:function(n,e,t){t.r(e),t.d(e,{default:function(){return i}});var u=t(3396);const r={class:"content-item"},a=(0,u._)("h2",null,"404. Page not Found...",-1);function o(n,e,t,o,c,s){const l=(0,u.up)("center");return(0,u.wg)(),(0,u.iD)("div",r,[(0,u.Wm)(l,null,{default:(0,u.w5)((()=>[a])),_:1})])}var c=(0,u.aZ)({name:"NotFoundView"}),s=t(89);const l=(0,s.Z)(c,[["render",o]]);var i=l}}]);
|
|
||||||
//# sourceMappingURL=567.1165d9e5.js.map
|
|
@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"js/567.1165d9e5.js","mappings":"8KAEA,MAAMA,EAAa,CAAEC,MAAO,gBACtBC,GAA0BC,EAAAA,EAAAA,GAAoB,KAAM,KAAM,0BAA2B,GAErF,SAAUC,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,MAAMC,GAAoBC,EAAAA,EAAAA,IAAkB,UAE5C,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,MAAOd,EAAY,EAC3De,EAAAA,EAAAA,IAAaJ,EAAmB,KAAM,CACpCK,SAASC,EAAAA,EAAAA,KAAS,IAAM,CACtBf,KAEFgB,EAAG,KAGR,CCbG,OAAeC,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,iB,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASjB,KAEpE,O","sources":["webpack://wavelovers/./src/views/NotFoundView.vue?e76c","webpack://wavelovers/./src/views/NotFoundView.vue?6f3f","webpack://wavelovers/./src/views/NotFoundView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"content-item\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"h2\", null, \"404. Page not Found...\", -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_center = _resolveComponent(\"center\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_center, null, {\n default: _withCtx(() => [\n _hoisted_2\n ]),\n _: 1\n })\n ]))\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=e1bb3c6a&ts=true\"\nimport script from \"./NotFoundView.vue?vue&type=script&lang=ts\"\nexport * from \"./NotFoundView.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","_createElementVNode","render","_ctx","_cache","$props","$setup","$data","$options","_component_center","_resolveComponent","_openBlock","_createElementBlock","_createVNode","default","_withCtx","_","defineComponent","name","__exports__"],"sourceRoot":""}
|
|
2
docs/js/741.bb44ffd2.js
Normal file
2
docs/js/741.bb44ffd2.js
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[741],{3913:function(t,a,e){var s=e(2482);class n{constructor(t,a,e,n){(0,s.Z)(this,"startDelay",void 0),(0,s.Z)(this,"duration",void 0),(0,s.Z)(this,"weakMagnitude",void 0),(0,s.Z)(this,"strongMagnitude",void 0),this.startDelay=t,this.duration=a,this.weakMagnitude=e,this.strongMagnitude=n}}a["Z"]=n},741:function(t,a,e){e.r(a),e.d(a,{default:function(){return D}});var s=e(3396);const n=(0,s._)("h1",{class:"visually-hidden"},"Wavelovers <20> Manual",-1);function i(t,a,e,i,d,u){const o=(0,s.up)("AppManual");return(0,s.wg)(),(0,s.iD)(s.HY,null,[n,(0,s.Wm)(o)],64)}var d=e(9242);const u={class:"content-item app-manual"},o={class:"manual-form__input"},p=(0,s._)("span",null,"Weak Magnitude",-1),r={class:"manual-form__input"},l=(0,s._)("span",null,"Strong Magnitude",-1),h=(0,s.uE)('<div class="manual-controls"><div><kbd>RT</kbd><span> – Vibrate</span></div><div><kbd>A</kbd><span> – Combined Mode</span></div><div><kbd>X</kbd><span> – Strong Mode</span></div><div><kbd>Y</kbd><span> – Light Mode</span></div><div><kbd>B</kbd><span> – Lock Intensity</span></div></div>',1),g=(0,s.Uk)("Press any gamepad button or connect a new gamepad to vibrate.");function m(t,a,e,n,i,m){const c=(0,s.up)("NavigationList"),v=(0,s.up)("GamepadList"),k=(0,s.up)("MessageItem");return(0,s.wg)(),(0,s.iD)(s.HY,null,[(0,s.Wm)(c),(0,s._)("div",u,[(0,s._)("label",o,[p,(0,s.wy)((0,s._)("input",{"onUpdate:modelValue":a[0]||(a[0]=a=>t.weakMagnitude=a),type:"range",required:"",disabled:"",min:"0.0",max:"1.0",step:"0.01"},null,512),[[d.nr,t.weakMagnitude]])]),(0,s._)("label",r,[l,(0,s.wy)((0,s._)("input",{"onUpdate:modelValue":a[1]||(a[1]=a=>t.strongMagnitude=a),type:"range",required:"",disabled:"",min:"0.0",max:"1.0",step:"0.01"},null,512),[[d.nr,t.strongMagnitude]])]),h]),t.gamepads.length>0?((0,s.wg)(),(0,s.j4)(v,{key:0,gamepads:t.gamepads},null,8,["gamepads"])):((0,s.wg)(),(0,s.j4)(k,{key:1},{default:(0,s.w5)((()=>[g])),_:1}))],64)}var c=e(1746),v=e(4509),k=e(1850),M=e(2347),b=e(3913),w=(0,s.aZ)({name:"AppCustom",components:{NavigationList:v.Z,GamepadList:k.Z,MessageItem:M.Z},data:()=>({timestamp:0,interval:0,mode:0,lock:!1,startDelay:0,duration:260,weakMagnitude:0,strongMagnitude:0}),computed:{gamepads:function(){const t=this.timestamp,a=c.Z.getters.gamepads;return a.forEach((a=>{a.interval=t})),a}},methods:{start:function(){const t=new b.Z(this.startDelay,this.duration,this.weakMagnitude,this.strongMagnitude);c.Z.dispatch("vibrate",t)},stop:function(){c.Z.dispatch("setIsActive",!1),c.Z.dispatch("setMode",0),c.Z.dispatch("reset")},eventLoop:function(){this.updateComputed(),this.updateMode(),this.updatePattern(),this.handle()},updateComputed:function(){this.timestamp=Date.now()},updateMode:function(){this.gamepads.length>0&&(!0===this.gamepads[0].unit.buttons[1].pressed&&(this.lock=!this.lock),!1===this.lock&&(!0===this.gamepads[0].unit.buttons[0].pressed&&(this.mode=0),!0===this.gamepads[0].unit.buttons[2].pressed&&(this.mode=1),!0===this.gamepads[0].unit.buttons[3].pressed&&(this.mode=2)))},updatePattern:function(){this.gamepads.length>0&&!1===this.lock&&(0===this.mode&&(this.weakMagnitude=this.gamepads[0].unit.buttons[7].value,this.strongMagnitude=this.gamepads[0].unit.buttons[7].value),1===this.mode&&(this.weakMagnitude=0,this.strongMagnitude=this.gamepads[0].unit.buttons[7].value),2===this.mode&&(this.weakMagnitude=this.gamepads[0].unit.buttons[7].value,this.strongMagnitude=0))},handle:function(){this.gamepads.length>0&&this.gamepads.forEach((t=>{t.unit.buttons[7].value>0||!0===this.lock?this.start():this.stop()}))}},mounted(){this.interval=setInterval(this.eventLoop,250)},unmounted(){clearInterval(this.interval)}}),f=e(89);const Z=(0,f.Z)(w,[["render",m]]);var y=Z,_=(0,s.aZ)({name:"ManualView",components:{AppManual:y}});const L=(0,f.Z)(_,[["render",i]]);var D=L}}]);
|
||||||
|
//# sourceMappingURL=741.bb44ffd2.js.map
|
1
docs/js/741.bb44ffd2.js.map
Normal file
1
docs/js/741.bb44ffd2.js.map
Normal file
File diff suppressed because one or more lines are too long
2
docs/js/835.17b1ecd3.js
Normal file
2
docs/js/835.17b1ecd3.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/js/835.17b1ecd3.js.map
Normal file
1
docs/js/835.17b1ecd3.js.map
Normal file
File diff suppressed because one or more lines are too long
2
docs/js/991.04357823.js
Normal file
2
docs/js/991.04357823.js
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[991],{3913:function(t,a,e){var n=e(2482);class s{constructor(t,a,e,s){(0,n.Z)(this,"startDelay",void 0),(0,n.Z)(this,"duration",void 0),(0,n.Z)(this,"weakMagnitude",void 0),(0,n.Z)(this,"strongMagnitude",void 0),this.startDelay=t,this.duration=a,this.weakMagnitude=e,this.strongMagnitude=s}}a["Z"]=s},4991:function(t,a,e){e.r(a),e.d(a,{default:function(){return x}});var n=e(3396);const s=(0,n._)("h1",{class:"visually-hidden"},"Wavelovers <20> Custom",-1);function u(t,a,e,u,o,i){const r=(0,n.up)("AppCustom");return(0,n.wg)(),(0,n.iD)(n.HY,null,[s,(0,n.Wm)(r)],64)}var o=e(9242);const i={class:"content-item app-custom"},r={class:"custom-form"},l={class:"custom-form__input"},d=(0,n._)("span",null,"Start Delay (ms)",-1),m={class:"custom-form__input"},p=(0,n._)("span",null,"Duration (ms)",-1),c={class:"custom-form__input"},g=(0,n._)("span",null,"Weak Magnitude",-1),_={class:"custom-form__input"},h=(0,n._)("span",null,"Strong Magnitude",-1),v={class:"custom-form__buttons"},w=(0,n.Uk)("Press any gamepad button or connect a new gamepad to vibrate.");function f(t,a,e,s,u,f){const y=(0,n.up)("NavigationList"),k=(0,n.up)("GamepadList"),M=(0,n.up)("MessageItem");return(0,n.wg)(),(0,n.iD)(n.HY,null,[(0,n.Wm)(y),(0,n._)("div",i,[(0,n._)("fieldset",r,[(0,n._)("label",l,[d,(0,n.wy)((0,n._)("input",{"onUpdate:modelValue":a[0]||(a[0]=a=>t.startDelay=a),type:"number",placeholder:"Start Delay",min:"0",max:"1000",step:"25",required:""},null,512),[[o.nr,t.startDelay]])]),(0,n._)("label",m,[p,(0,n.wy)((0,n._)("input",{"onUpdate:modelValue":a[1]||(a[1]=a=>t.duration=a),type:"number",placeholder:"Duration",min:"0",max:"1000",step:"25",required:""},null,512),[[o.nr,t.duration]])]),(0,n._)("label",c,[g,(0,n.wy)((0,n._)("input",{"onUpdate:modelValue":a[2]||(a[2]=a=>t.weakMagnitude=a),type:"range",required:"",min:"0.0",max:"1.0",step:"0.01"},null,512),[[o.nr,t.weakMagnitude]])]),(0,n._)("label",_,[h,(0,n.wy)((0,n._)("input",{"onUpdate:modelValue":a[3]||(a[3]=a=>t.strongMagnitude=a),type:"range",required:"",min:"0.0",max:"1.0",step:"0.01"},null,512),[[o.nr,t.strongMagnitude]])]),(0,n._)("div",v,[(0,n._)("button",{onClick:a[4]||(a[4]=(...a)=>t.start&&t.start(...a)),class:"custom-form__button"},"Start"),(0,n._)("button",{onClick:a[5]||(a[5]=(...a)=>t.stop&&t.stop(...a)),class:"custom-form__button"},"Stop")])])]),t.gamepads.length>0?((0,n.wg)(),(0,n.j4)(k,{key:0,gamepads:t.gamepads},null,8,["gamepads"])):((0,n.wg)(),(0,n.j4)(M,{key:1},{default:(0,n.w5)((()=>[w])),_:1}))],64)}var y=e(1746),k=e(4509),M=e(1850),Z=e(2347),b=e(3913),D=(0,n.aZ)({name:"AppCustom",components:{NavigationList:k.Z,GamepadList:M.Z,MessageItem:Z.Z},data:()=>({startDelay:250,duration:250,weakMagnitude:1,strongMagnitude:1}),computed:{gamepads:function(){return y.Z.getters.gamepads}},methods:{start:function(){const t=[new b.Z(this.startDelay,this.duration,this.weakMagnitude,this.strongMagnitude)];y.Z.dispatch("startCustom",t)},stop:function(){y.Z.dispatch("reset")}}}),C=e(89);const S=(0,C.Z)(D,[["render",f]]);var U=S,V=(0,n.aZ)({name:"CustomView",components:{AppCustom:U}});const q=(0,C.Z)(V,[["render",u]]);var x=q}}]);
|
||||||
|
//# sourceMappingURL=991.04357823.js.map
|
1
docs/js/991.04357823.js.map
Normal file
1
docs/js/991.04357823.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
2
docs/js/app.6006a533.js
Normal file
2
docs/js/app.6006a533.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/js/app.6006a533.js.map
Normal file
1
docs/js/app.6006a533.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
1
docs/js/chunk-vendors.8748c580.js.map
Normal file
1
docs/js/chunk-vendors.8748c580.js.map
Normal file
File diff suppressed because one or more lines are too long
@ -2,25 +2,43 @@
|
|||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
<url>
|
<url>
|
||||||
<loc>https://wavelovers.ru/</loc>
|
<loc>https://wavelovers.ru/</loc>
|
||||||
<lastmod>2022-08-09</lastmod>
|
<lastmod>2022-08-12</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://wavelovers.ru/faq.html</loc>
|
<loc>https://wavelovers.ru/custom</loc>
|
||||||
<lastmod>2022-08-09</lastmod>
|
<lastmod>2022-08-12</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://wavelovers.ru/about.html</loc>
|
<loc>https://wavelovers.ru/manual</loc>
|
||||||
<lastmod>2022-08-09</lastmod>
|
<lastmod>2022-08-12</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://wavelovers.ru/donate.html</loc>
|
<loc>https://wavelovers.ru/diagnostic</loc>
|
||||||
<lastmod>2022-08-09</lastmod>
|
<lastmod>2022-08-12</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>1.0</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://wavelovers.ru/faq</loc>
|
||||||
|
<lastmod>2022-08-12</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>1.0</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://wavelovers.ru/about</loc>
|
||||||
|
<lastmod>2022-08-12</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>1.0</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://wavelovers.ru/donate</loc>
|
||||||
|
<lastmod>2022-08-12</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
<sitemap>
|
<sitemap>
|
||||||
<loc>https://wavelovers.ru/sitemap-internal.xml</loc>
|
<loc>https://wavelovers.ru/sitemap-internal.xml</loc>
|
||||||
<lastmod>2022-08-09</lastmod>
|
<lastmod>2022-08-12</lastmod>
|
||||||
</sitemap>
|
</sitemap>
|
||||||
</sitemapindex>
|
</sitemapindex>
|
||||||
|
|
||||||
|
104
package-lock.json
generated
104
package-lock.json
generated
@ -1909,9 +1909,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/trace-mapping": {
|
"node_modules/@jridgewell/trace-mapping": {
|
||||||
"version": "0.3.14",
|
"version": "0.3.15",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
|
||||||
"integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
|
"integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/resolve-uri": "^3.0.3",
|
"@jridgewell/resolve-uri": "^3.0.3",
|
||||||
@ -2219,9 +2219,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "18.6.5",
|
"version": "18.7.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz",
|
||||||
"integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==",
|
"integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/normalize-package-data": {
|
"node_modules/@types/normalize-package-data": {
|
||||||
@ -4039,9 +4039,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001374",
|
"version": "1.0.30001375",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz",
|
||||||
"integrity": "sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==",
|
"integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -4322,9 +4322,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/colord": {
|
"node_modules/colord": {
|
||||||
"version": "2.9.2",
|
"version": "2.9.3",
|
||||||
"resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
|
||||||
"integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==",
|
"integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/colorette": {
|
"node_modules/colorette": {
|
||||||
@ -5186,9 +5186,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.4.212",
|
"version": "1.4.217",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.212.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.217.tgz",
|
||||||
"integrity": "sha512-LjQUg1SpLj2GfyaPDVBUHdhmlDU1vDB4f0mJWSGkISoXQrn5/lH3ECPCuo2Bkvf6Y30wO+b69te+rZK/llZmjg==",
|
"integrity": "sha512-iX8GbAMij7cOtJPZo02CClpaPMWjvN5meqXiJXkBgwvraNWTNH0Z7F9tkznI34JRPtWASoPM/xWamq3oNb49GA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/emoji-regex": {
|
"node_modules/emoji-regex": {
|
||||||
@ -9708,9 +9708,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/sass": {
|
"node_modules/sass": {
|
||||||
"version": "1.54.3",
|
"version": "1.54.4",
|
||||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.54.3.tgz",
|
"resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz",
|
||||||
"integrity": "sha512-fLodey5Qd41Pxp/Tk7Al97sViYwF/TazRc5t6E65O7JOk4XF8pzwIW7CvCxYVOfJFFI/1x5+elDyBIixrp+zrw==",
|
"integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chokidar": ">=3.0.0 <4.0.0",
|
"chokidar": ">=3.0.0 <4.0.0",
|
||||||
@ -10478,16 +10478,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser-webpack-plugin": {
|
"node_modules/terser-webpack-plugin": {
|
||||||
"version": "5.3.3",
|
"version": "5.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.4.tgz",
|
||||||
"integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==",
|
"integrity": "sha512-SmnkUhBxLDcBfTIeaq+ZqJXLVEyXxSaNcCeSezECdKjfkMrTTnPvapBILylYwyEvHFZAn2cJ8dtiXel5XnfOfQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/trace-mapping": "^0.3.7",
|
"@jridgewell/trace-mapping": "^0.3.14",
|
||||||
"jest-worker": "^27.4.5",
|
"jest-worker": "^27.4.5",
|
||||||
"schema-utils": "^3.1.1",
|
"schema-utils": "^3.1.1",
|
||||||
"serialize-javascript": "^6.0.0",
|
"serialize-javascript": "^6.0.0",
|
||||||
"terser": "^5.7.2"
|
"terser": "^5.14.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10.13.0"
|
"node": ">= 10.13.0"
|
||||||
@ -11490,9 +11490,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/webpack-dev-server": {
|
"node_modules/webpack-dev-server": {
|
||||||
"version": "4.9.3",
|
"version": "4.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz",
|
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.10.0.tgz",
|
||||||
"integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==",
|
"integrity": "sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/bonjour": "^3.5.9",
|
"@types/bonjour": "^3.5.9",
|
||||||
@ -13319,9 +13319,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@jridgewell/trace-mapping": {
|
"@jridgewell/trace-mapping": {
|
||||||
"version": "0.3.14",
|
"version": "0.3.15",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
|
||||||
"integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
|
"integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@jridgewell/resolve-uri": "^3.0.3",
|
"@jridgewell/resolve-uri": "^3.0.3",
|
||||||
@ -13592,9 +13592,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "18.6.5",
|
"version": "18.7.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz",
|
||||||
"integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==",
|
"integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/normalize-package-data": {
|
"@types/normalize-package-data": {
|
||||||
@ -14973,9 +14973,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"caniuse-lite": {
|
"caniuse-lite": {
|
||||||
"version": "1.0.30001374",
|
"version": "1.0.30001375",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz",
|
||||||
"integrity": "sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==",
|
"integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"case-sensitive-paths-webpack-plugin": {
|
"case-sensitive-paths-webpack-plugin": {
|
||||||
@ -15178,9 +15178,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"colord": {
|
"colord": {
|
||||||
"version": "2.9.2",
|
"version": "2.9.3",
|
||||||
"resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
|
||||||
"integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==",
|
"integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"colorette": {
|
"colorette": {
|
||||||
@ -15802,9 +15802,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"electron-to-chromium": {
|
"electron-to-chromium": {
|
||||||
"version": "1.4.212",
|
"version": "1.4.217",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.212.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.217.tgz",
|
||||||
"integrity": "sha512-LjQUg1SpLj2GfyaPDVBUHdhmlDU1vDB4f0mJWSGkISoXQrn5/lH3ECPCuo2Bkvf6Y30wO+b69te+rZK/llZmjg==",
|
"integrity": "sha512-iX8GbAMij7cOtJPZo02CClpaPMWjvN5meqXiJXkBgwvraNWTNH0Z7F9tkznI34JRPtWASoPM/xWamq3oNb49GA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"emoji-regex": {
|
"emoji-regex": {
|
||||||
@ -19121,9 +19121,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"sass": {
|
"sass": {
|
||||||
"version": "1.54.3",
|
"version": "1.54.4",
|
||||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.54.3.tgz",
|
"resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz",
|
||||||
"integrity": "sha512-fLodey5Qd41Pxp/Tk7Al97sViYwF/TazRc5t6E65O7JOk4XF8pzwIW7CvCxYVOfJFFI/1x5+elDyBIixrp+zrw==",
|
"integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"chokidar": ">=3.0.0 <4.0.0",
|
"chokidar": ">=3.0.0 <4.0.0",
|
||||||
@ -19721,16 +19721,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"terser-webpack-plugin": {
|
"terser-webpack-plugin": {
|
||||||
"version": "5.3.3",
|
"version": "5.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.4.tgz",
|
||||||
"integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==",
|
"integrity": "sha512-SmnkUhBxLDcBfTIeaq+ZqJXLVEyXxSaNcCeSezECdKjfkMrTTnPvapBILylYwyEvHFZAn2cJ8dtiXel5XnfOfQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@jridgewell/trace-mapping": "^0.3.7",
|
"@jridgewell/trace-mapping": "^0.3.14",
|
||||||
"jest-worker": "^27.4.5",
|
"jest-worker": "^27.4.5",
|
||||||
"schema-utils": "^3.1.1",
|
"schema-utils": "^3.1.1",
|
||||||
"serialize-javascript": "^6.0.0",
|
"serialize-javascript": "^6.0.0",
|
||||||
"terser": "^5.7.2"
|
"terser": "^5.14.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"schema-utils": {
|
"schema-utils": {
|
||||||
@ -20481,9 +20481,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"webpack-dev-server": {
|
"webpack-dev-server": {
|
||||||
"version": "4.9.3",
|
"version": "4.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz",
|
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.10.0.tgz",
|
||||||
"integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==",
|
"integrity": "sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/bonjour": "^3.5.9",
|
"@types/bonjour": "^3.5.9",
|
||||||
|
@ -1,132 +1,11 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Wavelovers</title>
|
<title>Wavelovers – Redirect</title>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?about" />
|
||||||
<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. 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="/css/styles.css" />
|
|
||||||
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
|
||||||
<script>
|
|
||||||
window.dataLayer = window.dataLayer || [];
|
|
||||||
function gtag() { dataLayer.push(arguments); }
|
|
||||||
gtag('js', new Date());
|
|
||||||
|
|
||||||
gtag('config', 'G-59FM5E4MVD');
|
|
||||||
</script>
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<!-- Yandex.Metrika counter -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
(function (m, e, t, r, i, k, a) {
|
|
||||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
|
||||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
|
||||||
})
|
|
||||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
|
||||||
|
|
||||||
ym(89252711, "init", {
|
|
||||||
clickmap: true,
|
|
||||||
trackLinks: true,
|
|
||||||
accurateTrackBounce: true,
|
|
||||||
webvisor: true
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<!-- /Yandex.Metrika counter -->
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<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 – 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>
|
|
||||||
|
|
||||||
<footer class="footer">
|
|
||||||
<div class="footer-wrapper container">
|
|
||||||
<div class="annotation">
|
|
||||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
|
||||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
|
||||||
</div>
|
|
||||||
<div class="annotation created-by">
|
|
||||||
<span class="annotation__text">Created by</span><a href="https://eugene-serb.github.io/" target="_blank" translate="no">Eugene Serb</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* ------------------------------ */
|
/* ------------------------------ */
|
||||||
/* Wavelovers styles */
|
/* Wavelovers styles */
|
||||||
/* version: dated 2022.08.08 */
|
/* version: dated 2022.08.12 */
|
||||||
/* author: Eugene Serb */
|
/* author: Eugene Serb */
|
||||||
/* ------------------------------ */
|
/* ------------------------------ */
|
||||||
|
|
||||||
@ -408,152 +408,17 @@ table, th, td {
|
|||||||
/* COMPONENTS STYLES */
|
/* COMPONENTS STYLES */
|
||||||
/* ----------------- */
|
/* ----------------- */
|
||||||
|
|
||||||
/* ------ */
|
/* --- */
|
||||||
/* HEADER */
|
/* APP */
|
||||||
/* ------ */
|
/* --- */
|
||||||
|
|
||||||
.header {
|
.app {
|
||||||
border-bottom: 8px solid var(--color-header-borderline);
|
min-height: 100vh;
|
||||||
background: var(--color-header-background);
|
|
||||||
}
|
|
||||||
|
|
||||||
.header ::selection {
|
|
||||||
background: var(--color-header-selection);
|
|
||||||
}
|
|
||||||
|
|
||||||
.header :focus {
|
|
||||||
border-bottom: 2px solid var(--color-header-navigation-link-hover);
|
|
||||||
}
|
|
||||||
|
|
||||||
.header :focus-visible {
|
|
||||||
outline: 2px solid var(--color-header-navigation-link-hover);
|
|
||||||
border-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-wrapper {
|
|
||||||
padding-top: 32px;
|
|
||||||
padding-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo-wrapper {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo-wrapper__logo {
|
|
||||||
font-size: 48px;
|
|
||||||
font-weight: 500;
|
|
||||||
color: var(--color-header-logo);
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-wrapper {
|
|
||||||
margin-top: 16px;
|
|
||||||
align-self: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigation {
|
|
||||||
padding: 0;
|
|
||||||
list-style-type: none;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: column;
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
gap: 8px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.navigation__item {
|
|
||||||
font-size: 16px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigation__item a {
|
|
||||||
border-color: transparent;
|
|
||||||
color: var(--color-header-navigation-link);
|
|
||||||
}
|
|
||||||
|
|
||||||
.navigation__item a:hover {
|
|
||||||
border-color: var(--color-header-navigation-link-hover);
|
|
||||||
color: var(--color-header-navigation-link-hover);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media only screen and (min-width: 540px) {
|
|
||||||
.header {
|
|
||||||
border-bottom: 32px solid var(--color-header-borderline);
|
|
||||||
background: var(--color-header-background);
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-wrapper {
|
|
||||||
padding-top: 64px;
|
|
||||||
padding-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-wrapper {
|
|
||||||
margin-top: 32px;
|
|
||||||
align-self: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media only screen and (min-width: 720px) {
|
|
||||||
.header-wrapper {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
flex-wrap: nowrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
gap: 64px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo-wrapper {
|
|
||||||
width: 50%;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-wrapper {
|
|
||||||
width: 50%;
|
|
||||||
margin-top: 0px;
|
|
||||||
align-self: flex-end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media only screen and (min-width: 1024px) {
|
|
||||||
.logo-wrapper__logo {
|
|
||||||
font-size: 64px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------ */
|
|
||||||
/* FOOTER */
|
|
||||||
/* ------ */
|
|
||||||
|
|
||||||
.footer {
|
|
||||||
border-top: 4px solid var(--color-footer-borderline);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer span {
|
|
||||||
color: var(--color-footer-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-wrapper {
|
|
||||||
padding-top: 32px;
|
|
||||||
padding-bottom: 32px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
gap: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.created-by {
|
|
||||||
align-self: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.created-by > span {
|
|
||||||
padding-right: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.created-by > a {
|
|
||||||
font-size: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- */
|
/* ---- */
|
||||||
/* PAGE */
|
/* PAGE */
|
||||||
/* ---- */
|
/* ---- */
|
||||||
@ -625,10 +490,6 @@ table, th, td {
|
|||||||
/* PAGES */
|
/* PAGES */
|
||||||
/* ----- */
|
/* ----- */
|
||||||
|
|
||||||
/* ----------- */
|
|
||||||
/* WAVELOVERS */
|
|
||||||
/* ----------- */
|
|
||||||
|
|
||||||
.link_hash {
|
.link_hash {
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
11
public/custom.html
Normal file
11
public/custom.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Wavelovers – Redirect</title>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?custom" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -1,133 +1,11 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Wavelovers</title>
|
<title>Wavelovers – Redirect</title>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?donate" />
|
||||||
<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. 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="/css/styles.css" />
|
|
||||||
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
|
||||||
<script>
|
|
||||||
window.dataLayer = window.dataLayer || [];
|
|
||||||
function gtag() { dataLayer.push(arguments); }
|
|
||||||
gtag('js', new Date());
|
|
||||||
|
|
||||||
gtag('config', 'G-59FM5E4MVD');
|
|
||||||
</script>
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<!-- Yandex.Metrika counter -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
(function (m, e, t, r, i, k, a) {
|
|
||||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
|
||||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
|
||||||
})
|
|
||||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
|
||||||
|
|
||||||
ym(89252711, "init", {
|
|
||||||
clickmap: true,
|
|
||||||
trackLinks: true,
|
|
||||||
accurateTrackBounce: true,
|
|
||||||
webvisor: true
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<!-- /Yandex.Metrika counter -->
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header class="header">
|
|
||||||
<div class="header-wrapper container">
|
|
||||||
<div class="logo-wrapper">
|
|
||||||
<span class="logo-wrapper__logo" translate="no">Wavelovers</span>
|
|
||||||
</div>
|
|
||||||
<nav class="menu-wrapper">
|
|
||||||
<ul class="navigation">
|
|
||||||
<li class="navigation__item">
|
|
||||||
<a href="/" target="_self" class="navigation__link">Home</a>
|
|
||||||
</li>
|
|
||||||
<li class="navigation__item">
|
|
||||||
<a href="/faq.html" target="_self" class="navigation__link">FAQ</a>
|
|
||||||
</li>
|
|
||||||
<li class="navigation__item">
|
|
||||||
<a href="/about.html" target="_self" class="navigation__link">About</a>
|
|
||||||
</li>
|
|
||||||
<li class="navigation__item">
|
|
||||||
<a href="/donate.html" target="_self" class="navigation__link">Donate</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main class="page container">
|
|
||||||
<h1 class="visually-hidden">Wavelovers – Donate</h1>
|
|
||||||
<div>
|
|
||||||
<div class="content-item">
|
|
||||||
<h2 class="content-item__header">Donate</h2>
|
|
||||||
<span>If you like this app, you can thank me and donate to me.</span><br /><br />
|
|
||||||
<span>Why should you donate to Wavelovers?</span><br /><br />
|
|
||||||
<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 />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<footer class="footer">
|
|
||||||
<div class="footer-wrapper container">
|
|
||||||
<div class="annotation">
|
|
||||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
|
||||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
|
||||||
</div>
|
|
||||||
<div class="annotation created-by">
|
|
||||||
<span class="annotation__text">Created by</span><a href="https://eugene-serb.github.io/" target="_blank" translate="no">Eugene Serb</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
147
public/faq.html
147
public/faq.html
@ -1,154 +1,11 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Wavelovers</title>
|
<title>Wavelovers – Redirect</title>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?faq" />
|
||||||
<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. 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="/css/styles.css" />
|
|
||||||
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
|
||||||
<script>
|
|
||||||
window.dataLayer = window.dataLayer || [];
|
|
||||||
function gtag() { dataLayer.push(arguments); }
|
|
||||||
gtag('js', new Date());
|
|
||||||
|
|
||||||
gtag('config', 'G-59FM5E4MVD');
|
|
||||||
</script>
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<!-- Yandex.Metrika counter -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
(function (m, e, t, r, i, k, a) {
|
|
||||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
|
||||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
|
||||||
})
|
|
||||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
|
||||||
|
|
||||||
ym(89252711, "init", {
|
|
||||||
clickmap: true,
|
|
||||||
trackLinks: true,
|
|
||||||
accurateTrackBounce: true,
|
|
||||||
webvisor: true
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<!-- /Yandex.Metrika counter -->
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<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 – FAQ</h1>
|
|
||||||
<div>
|
|
||||||
<div class="content-item">
|
|
||||||
<h2 class="content-item__header">FAQ</h2>
|
|
||||||
<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://wavelovers.ru/?diagnostic" target="_blank">Wavelovers Diagnostic</a><br /><br />
|
|
||||||
<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>
|
|
||||||
<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>
|
|
||||||
|
|
||||||
<footer class="footer">
|
|
||||||
<div class="footer-wrapper container">
|
|
||||||
<div class="annotation">
|
|
||||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
|
||||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
|
||||||
</div>
|
|
||||||
<div class="annotation created-by">
|
|
||||||
<span class="annotation__text">Created by</span><a href="https://eugene-serb.github.io/" target="_blank" translate="no">Eugene Serb</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
@ -15,25 +15,17 @@
|
|||||||
<meta name="copyright" content="Wavelovers, 2022" />
|
<meta name="copyright" content="Wavelovers, 2022" />
|
||||||
<meta name="publisher-email" content="eugene.serb@gmail.com" />
|
<meta name="publisher-email" content="eugene.serb@gmail.com" />
|
||||||
<meta name="publisher-url" content="https://eugene-serb.github.io/" />
|
<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:locale" content="en_US" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:site_name" content="Wavelovers" />
|
<meta property="og:site_name" content="Wavelovers" />
|
||||||
<meta property="og:image" content="https://wavelovers.ru/img/og.png" />
|
<meta property="og:image" content="https://wavelovers.ru/img/og.png" />
|
||||||
<meta property="vk: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:card" content="summary" />
|
||||||
<meta name="twitter:creator" content="@eugene_serb" />
|
<meta name="twitter:creator" content="@eugene_serb" />
|
||||||
<meta name="twitter:image" content="https://wavelovers.ru/img/og.png" />
|
<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="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="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="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||||
@ -67,7 +59,6 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<!-- /Yandex.Metrika counter -->
|
<!-- /Yandex.Metrika counter -->
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
[v-cloak] {
|
[v-cloak] {
|
||||||
display: none;
|
display: none;
|
||||||
@ -75,47 +66,7 @@
|
|||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header class="header">
|
<div id="app" class="app" v-cloak></div>
|
||||||
<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>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>
|
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||||
</body>
|
</body>
|
||||||
|
@ -2,25 +2,43 @@
|
|||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
<url>
|
<url>
|
||||||
<loc>https://wavelovers.ru/</loc>
|
<loc>https://wavelovers.ru/</loc>
|
||||||
<lastmod>2022-08-09</lastmod>
|
<lastmod>2022-08-12</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://wavelovers.ru/faq.html</loc>
|
<loc>https://wavelovers.ru/custom</loc>
|
||||||
<lastmod>2022-08-09</lastmod>
|
<lastmod>2022-08-12</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://wavelovers.ru/about.html</loc>
|
<loc>https://wavelovers.ru/manual</loc>
|
||||||
<lastmod>2022-08-09</lastmod>
|
<lastmod>2022-08-12</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://wavelovers.ru/donate.html</loc>
|
<loc>https://wavelovers.ru/diagnostic</loc>
|
||||||
<lastmod>2022-08-09</lastmod>
|
<lastmod>2022-08-12</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>1.0</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://wavelovers.ru/faq</loc>
|
||||||
|
<lastmod>2022-08-12</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>1.0</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://wavelovers.ru/about</loc>
|
||||||
|
<lastmod>2022-08-12</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>1.0</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://wavelovers.ru/donate</loc>
|
||||||
|
<lastmod>2022-08-12</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
<sitemap>
|
<sitemap>
|
||||||
<loc>https://wavelovers.ru/sitemap-internal.xml</loc>
|
<loc>https://wavelovers.ru/sitemap-internal.xml</loc>
|
||||||
<lastmod>2022-08-09</lastmod>
|
<lastmod>2022-08-12</lastmod>
|
||||||
</sitemap>
|
</sitemap>
|
||||||
</sitemapindex>
|
</sitemapindex>
|
||||||
|
|
||||||
|
24
src/App.vue
24
src/App.vue
@ -1,32 +1,24 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<HeaderItem />
|
||||||
|
<main class="page container">
|
||||||
<div class="wavelovers">
|
<div class="wavelovers">
|
||||||
<NavigationList />
|
|
||||||
<router-view />
|
<router-view />
|
||||||
<GamepadList v-if="gamepads.length > 0"
|
|
||||||
:gamepads="gamepads" />
|
|
||||||
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
|
||||||
</div>
|
</div>
|
||||||
|
</main>
|
||||||
|
<FooterItem />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import store from '@/store/index';
|
import store from '@/store/index';
|
||||||
import NavigationList from '@/components/NavigationList.vue';
|
import HeaderItem from '@/components/HeaderItem.vue';
|
||||||
import GamepadList from '@/components/GamepadList.vue';
|
import FooterItem from '@/components/FooterItem.vue';
|
||||||
import MessageItem from '@/components/MessageItem.vue';
|
|
||||||
import Vibrator from '@/models/Vibrator';
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'App',
|
name: 'App',
|
||||||
components: {
|
components: {
|
||||||
NavigationList: NavigationList,
|
HeaderItem: HeaderItem,
|
||||||
GamepadList: GamepadList,
|
FooterItem: FooterItem,
|
||||||
MessageItem: MessageItem,
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
gamepads: function (): Vibrator[] {
|
|
||||||
return store.getters.gamepads as Vibrator[];
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
addEventListeners(): void {
|
addEventListeners(): void {
|
||||||
|
125
src/components/AppCustom.vue
Normal file
125
src/components/AppCustom.vue
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
<template>
|
||||||
|
<NavigationList />
|
||||||
|
<div class="content-item app-custom">
|
||||||
|
<fieldset class="custom-form">
|
||||||
|
<label class="custom-form__input">
|
||||||
|
<span>Start Delay (ms)</span>
|
||||||
|
<input v-model="startDelay"
|
||||||
|
type="number" placeholder="Start Delay"
|
||||||
|
min="0" max="1000" step="25" required />
|
||||||
|
</label>
|
||||||
|
<label class="custom-form__input">
|
||||||
|
<span>Duration (ms)</span>
|
||||||
|
<input v-model="duration"
|
||||||
|
type="number" placeholder="Duration"
|
||||||
|
min="0" max="1000" step="25" required />
|
||||||
|
</label>
|
||||||
|
<label class="custom-form__input">
|
||||||
|
<span>Weak Magnitude</span>
|
||||||
|
<input v-model="weakMagnitude"
|
||||||
|
type="range" required
|
||||||
|
min="0.0" max="1.0" step="0.01" />
|
||||||
|
</label>
|
||||||
|
<label class="custom-form__input">
|
||||||
|
<span>Strong Magnitude</span>
|
||||||
|
<input v-model="strongMagnitude"
|
||||||
|
type="range" required
|
||||||
|
min="0.0" max="1.0" step="0.01" />
|
||||||
|
</label>
|
||||||
|
<div class="custom-form__buttons">
|
||||||
|
<button @click="start" class="custom-form__button">Start</button>
|
||||||
|
<button @click="stop" class="custom-form__button">Stop</button>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
<GamepadList v-if="gamepads.length > 0"
|
||||||
|
:gamepads="gamepads" />
|
||||||
|
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import store from '@/store/index';
|
||||||
|
import NavigationList from '@/components/NavigationList.vue';
|
||||||
|
import GamepadList from '@/components/GamepadList.vue';
|
||||||
|
import MessageItem from '@/components/MessageItem.vue';
|
||||||
|
import Vibrator from '@/models/Vibrator';
|
||||||
|
import TPatternUnit from '@/models/TPatternUnit';
|
||||||
|
import PatternUnit from '@/models/PatternUnit';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'AppCustom',
|
||||||
|
components: {
|
||||||
|
NavigationList: NavigationList,
|
||||||
|
GamepadList: GamepadList,
|
||||||
|
MessageItem: MessageItem,
|
||||||
|
},
|
||||||
|
data: () => {
|
||||||
|
return {
|
||||||
|
startDelay: 250 as number,
|
||||||
|
duration: 250 as number,
|
||||||
|
weakMagnitude: 1 as number,
|
||||||
|
strongMagnitude: 1 as number,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
gamepads: function (): Vibrator[] {
|
||||||
|
return store.getters.gamepads as Vibrator[];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
start: function (): void {
|
||||||
|
const patterns: TPatternUnit[] = [new PatternUnit(
|
||||||
|
this.startDelay,
|
||||||
|
this.duration,
|
||||||
|
this.weakMagnitude,
|
||||||
|
this.strongMagnitude,
|
||||||
|
)];
|
||||||
|
store.dispatch('startCustom', patterns);
|
||||||
|
},
|
||||||
|
stop: function (): void {
|
||||||
|
store.dispatch('reset');
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.custom-form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column-reverse;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-form__input {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-form__buttons {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-form__button {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width: 540px) {
|
||||||
|
.custom-form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-form__input {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -1,22 +1,32 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<NavigationList />
|
||||||
<div v-if="gamepads.length > 0" class="content-item">
|
<div v-if="gamepads.length > 0" class="content-item">
|
||||||
<DiagnosticItem v-for="gamepad in gamepads"
|
<DiagnosticItem v-for="gamepad in gamepads"
|
||||||
:key="gamepad.id"
|
:key="gamepad.id"
|
||||||
:gamepad="gamepad"
|
:gamepad="gamepad"
|
||||||
:timestamp="timestamp" />
|
:timestamp="timestamp" />
|
||||||
</div>
|
</div>
|
||||||
|
<GamepadList v-if="gamepads.length > 0"
|
||||||
|
:gamepads="gamepads" />
|
||||||
|
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import store from '@/store/index';
|
import store from '@/store/index';
|
||||||
import Vibrator from '@/models/Vibrator';
|
import NavigationList from '@/components/NavigationList.vue';
|
||||||
|
import GamepadList from '@/components/GamepadList.vue';
|
||||||
|
import MessageItem from '@/components/MessageItem.vue';
|
||||||
import DiagnosticItem from '@/components/DiagnosticItem.vue';
|
import DiagnosticItem from '@/components/DiagnosticItem.vue';
|
||||||
|
import Vibrator from '@/models/Vibrator';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'AppDiagnostic',
|
name: 'AppDiagnostic',
|
||||||
components: {
|
components: {
|
||||||
DiagnosticItem: DiagnosticItem,
|
DiagnosticItem: DiagnosticItem,
|
||||||
|
NavigationList: NavigationList,
|
||||||
|
GamepadList: GamepadList,
|
||||||
|
MessageItem: MessageItem,
|
||||||
},
|
},
|
||||||
data: () => {
|
data: () => {
|
||||||
return {
|
return {
|
||||||
@ -30,17 +40,17 @@
|
|||||||
const result: Vibrator[] = store.getters.gamepads as Vibrator[];
|
const result: Vibrator[] = store.getters.gamepads as Vibrator[];
|
||||||
result.forEach((item) => {
|
result.forEach((item) => {
|
||||||
item.interval = timestamp;
|
item.interval = timestamp;
|
||||||
})
|
});
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
updateTimestamp: function (): void {
|
updateComputed: function (): void {
|
||||||
this.timestamp = Date.now();
|
this.timestamp = Date.now();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.interval = setInterval(this.updateTimestamp, 1);
|
this.interval = setInterval(this.updateComputed, 1);
|
||||||
},
|
},
|
||||||
unmounted() {
|
unmounted() {
|
||||||
clearInterval(this.interval);
|
clearInterval(this.interval);
|
||||||
|
@ -1,79 +1,172 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<NavigationList />
|
||||||
<div class="content-item app-manual">
|
<div class="content-item app-manual">
|
||||||
<fieldset class="manual-form">
|
|
||||||
<label class="manual-form__input">
|
|
||||||
<span>Start Delay (ms)</span>
|
|
||||||
<input v-model="startDelay"
|
|
||||||
type="number" placeholder="Start Delay"
|
|
||||||
min="0" max="1000" step="25" required />
|
|
||||||
</label>
|
|
||||||
<label class="manual-form__input">
|
|
||||||
<span>Duration (ms)</span>
|
|
||||||
<input v-model="duration"
|
|
||||||
type="number" placeholder="Duration"
|
|
||||||
min="0" max="1000" step="25" required />
|
|
||||||
</label>
|
|
||||||
<label class="manual-form__input">
|
<label class="manual-form__input">
|
||||||
<span>Weak Magnitude</span>
|
<span>Weak Magnitude</span>
|
||||||
<input v-model="weakMagnitude"
|
<input v-model="weakMagnitude"
|
||||||
type="range" placeholder="Weak Magnitude"
|
type="range" required disabled
|
||||||
min="0.0" max="1.0" step="0.01" required />
|
min="0.0" max="1.0" step="0.01" />
|
||||||
</label>
|
</label>
|
||||||
<label class="manual-form__input">
|
<label class="manual-form__input">
|
||||||
<span>Strong Magnitude</span>
|
<span>Strong Magnitude</span>
|
||||||
<input v-model="strongMagnitude"
|
<input v-model="strongMagnitude"
|
||||||
type="range" placeholder="Strong Magnitude"
|
type="range" required disabled
|
||||||
min="0.0" max="1.0" step="0.01" required />
|
min="0.0" max="1.0" step="0.01" />
|
||||||
</label>
|
</label>
|
||||||
<div class="manual-form__buttons">
|
<div class="manual-controls">
|
||||||
<button @click="start" class="manual-form__button">Start</button>
|
<div>
|
||||||
<button @click="stop" class="manual-form__button">Stop</button>
|
<kbd>RT</kbd>
|
||||||
|
<span> – Vibrate</span>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
<div>
|
||||||
|
<kbd>A</kbd>
|
||||||
|
<span> – Combined Mode</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<kbd>X</kbd>
|
||||||
|
<span> – Strong Mode</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<kbd>Y</kbd>
|
||||||
|
<span> – Light Mode</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<kbd>B</kbd>
|
||||||
|
<span> – Lock Intensity</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<GamepadList v-if="gamepads.length > 0"
|
||||||
|
:gamepads="gamepads" />
|
||||||
|
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import store from '@/store/index';
|
import store from '@/store/index';
|
||||||
|
import NavigationList from '@/components/NavigationList.vue';
|
||||||
|
import GamepadList from '@/components/GamepadList.vue';
|
||||||
|
import MessageItem from '@/components/MessageItem.vue';
|
||||||
|
import Vibrator from '@/models/Vibrator';
|
||||||
import TPatternUnit from '@/models/TPatternUnit';
|
import TPatternUnit from '@/models/TPatternUnit';
|
||||||
|
import PatternUnit from '@/models/PatternUnit';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'AppManual',
|
name: 'AppCustom',
|
||||||
|
components: {
|
||||||
|
NavigationList: NavigationList,
|
||||||
|
GamepadList: GamepadList,
|
||||||
|
MessageItem: MessageItem,
|
||||||
|
},
|
||||||
data: () => {
|
data: () => {
|
||||||
return {
|
return {
|
||||||
startDelay: 250 as number,
|
timestamp: 0 as number,
|
||||||
duration: 250 as number,
|
interval: 0 as number,
|
||||||
weakMagnitude: 1 as number,
|
mode: 0 as number,
|
||||||
strongMagnitude: 1 as number,
|
lock: false as boolean,
|
||||||
|
startDelay: 0 as number,
|
||||||
|
duration: 260 as number,
|
||||||
|
weakMagnitude: 0 as number,
|
||||||
|
strongMagnitude: 0 as number,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
computed: {
|
||||||
createPatternUnit: function (): TPatternUnit[] {
|
gamepads: function (): Vibrator[] {
|
||||||
const patternUnit: TPatternUnit[] = [{
|
const timestamp: number = this.timestamp;
|
||||||
startDelay: this.startDelay,
|
const result: Vibrator[] = store.getters.gamepads as Vibrator[];
|
||||||
duration: this.duration,
|
result.forEach((item) => {
|
||||||
weakMagnitude: this.weakMagnitude,
|
item.interval = timestamp;
|
||||||
strongMagnitude: this.strongMagnitude,
|
})
|
||||||
}];
|
return result;
|
||||||
return patternUnit as TPatternUnit[];
|
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
start: function (): void {
|
start: function (): void {
|
||||||
store.dispatch('startCustom', this.createPatternUnit());
|
const pattern: TPatternUnit = new PatternUnit(
|
||||||
|
this.startDelay,
|
||||||
|
this.duration,
|
||||||
|
this.weakMagnitude,
|
||||||
|
this.strongMagnitude,
|
||||||
|
);
|
||||||
|
store.dispatch('vibrate', pattern);
|
||||||
},
|
},
|
||||||
stop: function (): void {
|
stop: function (): void {
|
||||||
|
store.dispatch('setIsActive', false);
|
||||||
|
store.dispatch('setMode', 0);
|
||||||
store.dispatch('reset');
|
store.dispatch('reset');
|
||||||
},
|
},
|
||||||
|
eventLoop: function (): void {
|
||||||
|
this.updateComputed();
|
||||||
|
this.updateMode();
|
||||||
|
this.updatePattern();
|
||||||
|
this.handle();
|
||||||
|
},
|
||||||
|
updateComputed: function (): void {
|
||||||
|
this.timestamp = Date.now();
|
||||||
|
},
|
||||||
|
updateMode: function (): void {
|
||||||
|
if (this.gamepads.length > 0) {
|
||||||
|
if (this.gamepads[0].unit.buttons[1].pressed === true) {
|
||||||
|
this.lock = !this.lock;
|
||||||
|
}
|
||||||
|
if (this.lock === false) {
|
||||||
|
if (this.gamepads[0].unit.buttons[0].pressed === true) {
|
||||||
|
this.mode = 0;
|
||||||
|
}
|
||||||
|
if (this.gamepads[0].unit.buttons[2].pressed === true) {
|
||||||
|
this.mode = 1;
|
||||||
|
}
|
||||||
|
if (this.gamepads[0].unit.buttons[3].pressed === true) {
|
||||||
|
this.mode = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
updatePattern: function (): void {
|
||||||
|
if (this.gamepads.length > 0) {
|
||||||
|
if (this.lock === false) {
|
||||||
|
if (this.mode === 0) {
|
||||||
|
this.weakMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||||
|
this.strongMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||||
|
}
|
||||||
|
if (this.mode === 1) {
|
||||||
|
this.weakMagnitude = 0;
|
||||||
|
this.strongMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||||
|
}
|
||||||
|
if (this.mode === 2) {
|
||||||
|
this.weakMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||||
|
this.strongMagnitude = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handle: function (): void {
|
||||||
|
if (this.gamepads.length > 0) {
|
||||||
|
this.gamepads.forEach((gamepad) => {
|
||||||
|
if (gamepad.unit.buttons[7].value > 0 || this.lock === true) {
|
||||||
|
this.start();
|
||||||
|
} else {
|
||||||
|
this.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.interval = setInterval(this.eventLoop, 250);
|
||||||
|
},
|
||||||
|
unmounted() {
|
||||||
|
clearInterval(this.interval);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.manual-form {
|
.app-manual {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column-reverse;
|
flex-direction: column;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
gap: 16px;
|
gap: 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.manual-form__input {
|
.manual-form__input {
|
||||||
@ -82,28 +175,24 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.manual-form__buttons {
|
.manual-controls {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: column;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
gap: 32px;
|
align-self: center;
|
||||||
}
|
|
||||||
|
|
||||||
.manual-form__button {
|
|
||||||
width: 100%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (min-width: 540px) {
|
@media only screen and (min-width: 540px) {
|
||||||
.manual-form {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.manual-form__input {
|
.manual-form__input {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.manual-controls {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-self: stretch;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<NavigationList />
|
||||||
<div class="app-patterns">
|
<div class="app-patterns">
|
||||||
<PatternList v-if="patterns.length > 0"
|
<PatternList v-if="patterns.length > 0"
|
||||||
:patterns="patterns"
|
:patterns="patterns"
|
||||||
@ -7,22 +8,33 @@
|
|||||||
@change="change" />
|
@change="change" />
|
||||||
<MessageItem v-else>Loading...</MessageItem>
|
<MessageItem v-else>Loading...</MessageItem>
|
||||||
</div>
|
</div>
|
||||||
|
<GamepadList v-if="gamepads.length > 0"
|
||||||
|
:gamepads="gamepads" />
|
||||||
|
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import store from '@/store/index';
|
import store from '@/store/index';
|
||||||
import PatternList from '@/components/PatternList.vue';
|
import NavigationList from '@/components/NavigationList.vue';
|
||||||
|
import GamepadList from '@/components/GamepadList.vue';
|
||||||
import MessageItem from '@/components/MessageItem.vue';
|
import MessageItem from '@/components/MessageItem.vue';
|
||||||
|
import PatternList from '@/components/PatternList.vue';
|
||||||
|
import Vibrator from '@/models/Vibrator';
|
||||||
import TPattern from '@/models/TPattern';
|
import TPattern from '@/models/TPattern';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'AppPatterns',
|
name: 'AppPatterns',
|
||||||
components: {
|
components: {
|
||||||
PatternList: PatternList,
|
PatternList: PatternList,
|
||||||
|
NavigationList: NavigationList,
|
||||||
|
GamepadList: GamepadList,
|
||||||
MessageItem: MessageItem,
|
MessageItem: MessageItem,
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
gamepads: function (): Vibrator[] {
|
||||||
|
return store.getters.gamepads as Vibrator[];
|
||||||
|
},
|
||||||
patterns: function (): TPattern[] {
|
patterns: function (): TPattern[] {
|
||||||
return store.getters.patterns as TPattern[];
|
return store.getters.patterns as TPattern[];
|
||||||
},
|
},
|
||||||
|
54
src/components/FooterItem.vue
Normal file
54
src/components/FooterItem.vue
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<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: 'FooterItem',
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.footer {
|
||||||
|
border-top: 4px solid var(--color-footer-borderline);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer span {
|
||||||
|
color: var(--color-footer-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-wrapper {
|
||||||
|
padding-top: 32px;
|
||||||
|
padding-bottom: 32px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.created-by {
|
||||||
|
align-self: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.created-by > span {
|
||||||
|
padding-right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.created-by > a {
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
144
src/components/HeaderItem.vue
Normal file
144
src/components/HeaderItem.vue
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<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-item">Home</router-link>
|
||||||
|
</li>
|
||||||
|
<li class="navigation__item">
|
||||||
|
<router-link to="/faq" class="navigation-item">FAQ</router-link>
|
||||||
|
</li>
|
||||||
|
<li class="navigation__item">
|
||||||
|
<router-link to="/about" class="navigation-item">About</router-link>
|
||||||
|
</li>
|
||||||
|
<li class="navigation__item">
|
||||||
|
<router-link to="/donate" class="navigation-item">Donate</router-link>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'HeaderItem',
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.header {
|
||||||
|
border-bottom: 8px solid var(--color-header-borderline);
|
||||||
|
background: var(--color-header-background);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header ::selection {
|
||||||
|
background: var(--color-header-selection);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header :focus {
|
||||||
|
border-bottom: 2px solid var(--color-header-navigation-link-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header :focus-visible {
|
||||||
|
outline: 2px solid var(--color-header-navigation-link-hover);
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-wrapper {
|
||||||
|
padding-top: 32px;
|
||||||
|
padding-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo-wrapper {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo-wrapper__logo {
|
||||||
|
font-size: 48px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--color-header-logo);
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-wrapper {
|
||||||
|
margin-top: 16px;
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navigation {
|
||||||
|
padding: 0;
|
||||||
|
list-style-type: none;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navigation__item {
|
||||||
|
font-size: 16px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navigation__item a {
|
||||||
|
border-color: transparent;
|
||||||
|
color: var(--color-header-navigation-link);
|
||||||
|
}
|
||||||
|
|
||||||
|
.navigation__item a:hover {
|
||||||
|
border-color: var(--color-header-navigation-link-hover);
|
||||||
|
color: var(--color-header-navigation-link-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width: 540px) {
|
||||||
|
.header {
|
||||||
|
border-bottom: 32px solid var(--color-header-borderline);
|
||||||
|
background: var(--color-header-background);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-wrapper {
|
||||||
|
padding-top: 64px;
|
||||||
|
padding-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-wrapper {
|
||||||
|
margin-top: 32px;
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width: 720px) {
|
||||||
|
.header-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 64px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo-wrapper {
|
||||||
|
width: 50%;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-wrapper {
|
||||||
|
width: 50%;
|
||||||
|
margin-top: 0px;
|
||||||
|
align-self: flex-end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (min-width: 1024px) {
|
||||||
|
.logo-wrapper__logo {
|
||||||
|
font-size: 64px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -1,8 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="content-item navigation-list">
|
<div class="content-item navigation-list">
|
||||||
<router-link to="/manual" class="navigation-item">Manual</router-link>
|
<router-link to="/" class="navigation-list__item">Patterns</router-link>
|
||||||
<router-link to="/" class="navigation-item">Patterns</router-link>
|
<router-link to="/custom" class="navigation-list__item">Custom</router-link>
|
||||||
<router-link to="/diagnostic" class="navigation-item">Diagnostic</router-link>
|
<router-link to="/manual" class="navigation-list__item">Manual</router-link>
|
||||||
|
<router-link to="/diagnostic" class="navigation-list__item">Diagnostic</router-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -22,8 +23,8 @@
|
|||||||
gap: 16px;
|
gap: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navigation-item.router-link-active,
|
.navigation-list__item.router-link-active,
|
||||||
.navigation-item.router-link-exact-active {
|
.navigation-list__item.router-link-exact-active {
|
||||||
border-bottom: 2px solid var(--color-link-hover);
|
border-bottom: 2px solid var(--color-link-hover);
|
||||||
color: var(--color-link-hover);
|
color: var(--color-link-hover);
|
||||||
transition: all 0.5s ease;
|
transition: all 0.5s ease;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { createApp } from 'vue';
|
import { createApp } from 'vue';
|
||||||
import App from './App.vue';
|
import App from '@/App.vue';
|
||||||
import router from './router';
|
import router from '@/router';
|
||||||
import store from './store';
|
import store from '@/store';
|
||||||
|
|
||||||
createApp(App).use(store).use(router).mount('#app');
|
createApp(App).use(store).use(router).mount('#app');
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ interface IGamepad {
|
|||||||
readonly mapping: string;
|
readonly mapping: string;
|
||||||
readonly axes: number[];
|
readonly axes: number[];
|
||||||
readonly buttons: IGamepadButton[];
|
readonly buttons: IGamepadButton[];
|
||||||
vibrationActuator: IVibrationActuator;
|
readonly vibrationActuator: IVibrationActuator;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default IGamepad;
|
export default IGamepad;
|
||||||
|
9
src/models/IPatternUnit.ts
Normal file
9
src/models/IPatternUnit.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
interface IPatternUnit {
|
||||||
|
startDelay: number;
|
||||||
|
duration: number;
|
||||||
|
weakMagnitude: number;
|
||||||
|
strongMagnitude: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default IPatternUnit;
|
||||||
|
|
@ -2,14 +2,15 @@ import TPatternUnit from '@/models/TPatternUnit';
|
|||||||
import IGamepad from '@/models/IGamepad';
|
import IGamepad from '@/models/IGamepad';
|
||||||
|
|
||||||
interface IVibrator {
|
interface IVibrator {
|
||||||
|
unit: IGamepad;
|
||||||
readonly id: number;
|
readonly id: number;
|
||||||
readonly canVibrate: boolean;
|
readonly canVibrate: boolean;
|
||||||
isVibrating: boolean;
|
isVibrating: boolean;
|
||||||
unit: IGamepad;
|
|
||||||
interval: number;
|
interval: number;
|
||||||
update(): void;
|
update(): void;
|
||||||
|
loop(pattern: TPatternUnit[]): void;
|
||||||
|
vibrate(pattern: TPatternUnit): void;
|
||||||
reset(): void;
|
reset(): void;
|
||||||
vibrate(pattern: TPatternUnit[]): void;
|
|
||||||
sleep(ms: number): Promise<number>;
|
sleep(ms: number): Promise<number>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
22
src/models/PatternUnit.ts
Normal file
22
src/models/PatternUnit.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import IPatternUnit from "@/models/IPatternUnit";
|
||||||
|
|
||||||
|
class PatternUnit implements IPatternUnit {
|
||||||
|
|
||||||
|
startDelay: number;
|
||||||
|
duration: number;
|
||||||
|
weakMagnitude: number;
|
||||||
|
strongMagnitude: number;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
startDelay: number, duration: number,
|
||||||
|
weakMagnitude: number, strongMagnitude: number
|
||||||
|
) {
|
||||||
|
this.startDelay = startDelay;
|
||||||
|
this.duration = duration;
|
||||||
|
this.weakMagnitude = weakMagnitude;
|
||||||
|
this.strongMagnitude = strongMagnitude;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PatternUnit;
|
||||||
|
|
@ -3,10 +3,11 @@ import IGamepad from '@/models/IGamepad';
|
|||||||
import IVibrator from '@/models/IVibrator';
|
import IVibrator from '@/models/IVibrator';
|
||||||
|
|
||||||
class Vibrator implements IVibrator {
|
class Vibrator implements IVibrator {
|
||||||
|
|
||||||
|
unit: IGamepad;
|
||||||
readonly id: number;
|
readonly id: number;
|
||||||
readonly canVibrate: boolean;
|
readonly canVibrate: boolean;
|
||||||
isVibrating: boolean;
|
isVibrating: boolean;
|
||||||
unit: IGamepad;
|
|
||||||
interval: number;
|
interval: number;
|
||||||
|
|
||||||
constructor(unit: IGamepad) {
|
constructor(unit: IGamepad) {
|
||||||
@ -23,18 +24,13 @@ class Vibrator implements IVibrator {
|
|||||||
this.unit = gamepads[this.unit.index] as unknown as IGamepad;
|
this.unit = gamepads[this.unit.index] as unknown as IGamepad;
|
||||||
}
|
}
|
||||||
|
|
||||||
reset(): void {
|
async loop(pattern: TPatternUnit[]) {
|
||||||
this.isVibrating = false;
|
|
||||||
this.unit.vibrationActuator.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
async vibrate(pattern: TPatternUnit[]) {
|
|
||||||
this.isVibrating = true;
|
this.isVibrating = true;
|
||||||
const offsetTime = 10;
|
const offsetTime = 10;
|
||||||
while (this.isVibrating === true) {
|
while (this.isVibrating === true) {
|
||||||
for (let i = 0; i < pattern.length; i++) {
|
for (let i = 0; i < pattern.length; i++) {
|
||||||
if (this.isVibrating === true) {
|
if (this.isVibrating === true) {
|
||||||
this.unit.vibrationActuator.playEffect('dual-rumble', pattern[i]);
|
this.vibrate(pattern[i]);
|
||||||
await this.sleep(pattern[i].startDelay + pattern[i].duration - offsetTime);
|
await this.sleep(pattern[i].startDelay + pattern[i].duration - offsetTime);
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
@ -43,6 +39,15 @@ class Vibrator implements IVibrator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vibrate(pattern: TPatternUnit): void {
|
||||||
|
this.unit.vibrationActuator.playEffect('dual-rumble', pattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
reset(): void {
|
||||||
|
this.isVibrating = false;
|
||||||
|
this.unit.vibrationActuator.reset();
|
||||||
|
}
|
||||||
|
|
||||||
sleep(ms: number): Promise<number> {
|
sleep(ms: number): Promise<number> {
|
||||||
return new Promise(resolve => setTimeout(resolve, ms));
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
}
|
}
|
||||||
|
@ -1,29 +1,343 @@
|
|||||||
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
|
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
|
||||||
import PatternsView from '@/views/PatternsView.vue';
|
import PatternsView from '@/views/PatternsView.vue';
|
||||||
|
import QueryRouter from '@/router/modules/QueryRouter';
|
||||||
|
import MetaTagUpdater from '@/router/modules/MetaTagUpdater';
|
||||||
|
|
||||||
const routes: Array<RouteRecordRaw> = [
|
const routes: Array<RouteRecordRaw> = [
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
name: 'patterns-view',
|
name: 'patterns-view',
|
||||||
component: PatternsView,
|
component: PatternsView,
|
||||||
|
meta: {
|
||||||
|
title: 'Wavelovers',
|
||||||
|
metaTags: [
|
||||||
|
{
|
||||||
|
name: 'keywords',
|
||||||
|
content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Gamepad Massager, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
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: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: 'https://wavelovers.ru/',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/custom',
|
||||||
|
name: 'custom-view',
|
||||||
|
component: () => import('@/views/CustomView.vue'),
|
||||||
|
meta: {
|
||||||
|
title: 'Wavelovers – Custom',
|
||||||
|
metaTags: [
|
||||||
|
{
|
||||||
|
name: 'keywords',
|
||||||
|
content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Gamepad Massager, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'og:title',
|
||||||
|
content: 'Wavelovers – Custom',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'og:description',
|
||||||
|
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'og:url',
|
||||||
|
content: 'https://wavelovers.ru/custom',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'twitter:title',
|
||||||
|
content: 'Wavelovers – Custom',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'twitter:description',
|
||||||
|
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
linkTags: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: 'https://wavelovers.ru/custom',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/manual',
|
path: '/manual',
|
||||||
name: 'manual-view',
|
name: 'manual-view',
|
||||||
component: () => import('@/views/ManualView.vue'),
|
component: () => import('@/views/ManualView.vue'),
|
||||||
|
meta: {
|
||||||
|
title: 'Wavelovers – Manual',
|
||||||
|
metaTags: [
|
||||||
|
{
|
||||||
|
name: 'keywords',
|
||||||
|
content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Gamepad Massager, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'og:title',
|
||||||
|
content: 'Wavelovers – Manual',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'og:description',
|
||||||
|
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'og:url',
|
||||||
|
content: 'https://wavelovers.ru/manual',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'twitter:title',
|
||||||
|
content: 'Wavelovers – Manual',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'twitter:description',
|
||||||
|
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
linkTags: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: 'https://wavelovers.ru/manual',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/diagnostic',
|
path: '/diagnostic',
|
||||||
name: 'diagnostic-view',
|
name: 'diagnostic-view',
|
||||||
component: () => import('@/views/DiagnosticView.vue'),
|
component: () => import('@/views/DiagnosticView.vue'),
|
||||||
|
meta: {
|
||||||
|
title: 'Wavelovers – Diagnostic',
|
||||||
|
metaTags: [
|
||||||
|
{
|
||||||
|
name: 'keywords',
|
||||||
|
content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Gamepad Massager, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'og:title',
|
||||||
|
content: 'Wavelovers – Diagnostic',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'og:description',
|
||||||
|
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'og:url',
|
||||||
|
content: 'https://wavelovers.ru/diagnostic',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'twitter:title',
|
||||||
|
content: 'Wavelovers – Diagnostic',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'twitter:description',
|
||||||
|
content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
linkTags: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: 'https://wavelovers.ru/diagnostic',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/faq',
|
||||||
|
name: 'faq-view',
|
||||||
|
component: () => import('@/views/FaqView.vue'),
|
||||||
|
meta: {
|
||||||
|
title: 'Wavelovers – FAQ',
|
||||||
|
metaTags: [
|
||||||
|
{
|
||||||
|
name: 'keywords',
|
||||||
|
content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Gamepad Massager, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, FAQ, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, часто задаваемые вопросы',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
content: 'Wavelovers. Frequently asked questions page.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
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: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: 'https://wavelovers.ru/faq',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/about',
|
||||||
|
name: 'about-view',
|
||||||
|
component: () => import('@/views/AboutView.vue'),
|
||||||
|
meta: {
|
||||||
|
title: 'Wavelovers – About',
|
||||||
|
metaTags: [
|
||||||
|
{
|
||||||
|
name: 'keywords',
|
||||||
|
content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Gamepad Massager, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, advertise, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, реклама',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
content: 'Wavelovers. Page with information about the project and data on donations.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
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: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: 'https://wavelovers.ru/about',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/donate',
|
||||||
|
name: 'donate-view',
|
||||||
|
component: () => import('@/views/DonateView.vue'),
|
||||||
|
meta: {
|
||||||
|
title: 'Wavelovers – Donate',
|
||||||
|
metaTags: [
|
||||||
|
{
|
||||||
|
name: 'keywords',
|
||||||
|
content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Gamepad Massager, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, Donate, Support, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, задонатить, пожертвовать, помочь, поблагодарить',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
content: 'Wavelovers. Donate to the author.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
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: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: 'https://wavelovers.ru/donate',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/404',
|
path: '/404',
|
||||||
name: '404',
|
name: '404',
|
||||||
component: () => import('@/views/NotFoundView.vue'),
|
component: () => import('@/views/NotFoundView.vue'),
|
||||||
|
meta: {
|
||||||
|
title: 'Wavelovers – Page not found',
|
||||||
|
metaTags: [
|
||||||
|
{
|
||||||
|
name: 'og:title',
|
||||||
|
content: 'Wavelovers – Page not found',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/:catchAll(.*)',
|
name: 'og:url',
|
||||||
|
content: 'https://wavelovers.ru/404',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
linkTags: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: 'https://wavelovers.ru/404',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/:catchAll(.*)*',
|
||||||
redirect: '/404',
|
redirect: '/404',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
@ -33,5 +347,8 @@ const router = createRouter({
|
|||||||
routes,
|
routes,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
router.beforeEach(QueryRouter.update);
|
||||||
|
router.beforeEach(MetaTagUpdater.update);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
||||||
|
48
src/router/modules/MetaTagUpdater.ts
Normal file
48
src/router/modules/MetaTagUpdater.ts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
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 MetaTagUpdater = {
|
||||||
|
update: updateMetatag,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default MetaTagUpdater;
|
||||||
|
|
37
src/router/modules/QueryRouter.ts
Normal file
37
src/router/modules/QueryRouter.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import router from '@/router';
|
||||||
|
import { NavigationGuardNext, RouteLocationNormalized } from "vue-router";
|
||||||
|
|
||||||
|
function updateRoute(
|
||||||
|
to: RouteLocationNormalized,
|
||||||
|
from: RouteLocationNormalized,
|
||||||
|
next: NavigationGuardNext
|
||||||
|
) {
|
||||||
|
switch (to.fullPath) {
|
||||||
|
case '/?custom':
|
||||||
|
router.push('/custom');
|
||||||
|
break;
|
||||||
|
case '/?manual':
|
||||||
|
router.push('/manual');
|
||||||
|
break;
|
||||||
|
case '/?diagnostic':
|
||||||
|
router.push('/diagnostic');
|
||||||
|
break;
|
||||||
|
case '/?faq':
|
||||||
|
router.push('/faq');
|
||||||
|
break;
|
||||||
|
case '/?about':
|
||||||
|
router.push('/about');
|
||||||
|
break;
|
||||||
|
case '/?donate':
|
||||||
|
router.push('/donate');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
const QueryRouter = {
|
||||||
|
update: updateRoute,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default QueryRouter;
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
import { createStore, Store } from 'vuex';
|
import { createStore, Store } from 'vuex';
|
||||||
import IRootState from './models/IRootState';
|
import IRootState from '@/store/models/IRootState';
|
||||||
import MGamepads from '@/store/modules/MGamepads';
|
import MGamepads from '@/store/modules/MGamepads';
|
||||||
import MPatterns from '@/store/modules/MPatterns';
|
import MPatterns from '@/store/modules/MPatterns';
|
||||||
import TPatternUnit from '../models/TPatternUnit';
|
import TPatternUnit from '@/models/TPatternUnit';
|
||||||
|
|
||||||
const store: Store<IRootState> = createStore({
|
const store: Store<IRootState> = createStore({
|
||||||
state: () => ({
|
state: () => ({
|
||||||
@ -41,10 +41,7 @@ const store: Store<IRootState> = createStore({
|
|||||||
}
|
}
|
||||||
if (context.getters.isActive === true) {
|
if (context.getters.isActive === true) {
|
||||||
context.dispatch('reset');
|
context.dispatch('reset');
|
||||||
context.dispatch(
|
context.dispatch('loop', context.getters.patterns[context.getters.mode].pattern);
|
||||||
'vibrate',
|
|
||||||
context.getters.patterns[context.getters.mode].pattern
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
context.dispatch('reset');
|
context.dispatch('reset');
|
||||||
}
|
}
|
||||||
@ -53,7 +50,7 @@ const store: Store<IRootState> = createStore({
|
|||||||
context.dispatch('setIsActive', false);
|
context.dispatch('setIsActive', false);
|
||||||
context.dispatch('setMode', 0);
|
context.dispatch('setMode', 0);
|
||||||
context.dispatch('reset');
|
context.dispatch('reset');
|
||||||
context.dispatch('vibrate', pattern);
|
context.dispatch('loop', pattern);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
modules: {
|
modules: {
|
||||||
|
@ -45,9 +45,17 @@ const MGamepads: Module<IGamepadsState, IRootState> = {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
vibrate: function (
|
loop: function (
|
||||||
context: ActionContext<IGamepadsState, IRootState>,
|
context: ActionContext<IGamepadsState, IRootState>,
|
||||||
pattern: TPatternUnit[]
|
pattern: TPatternUnit[]
|
||||||
|
): void {
|
||||||
|
context.getters.gamepads.forEach((gamepad: Vibrator) => {
|
||||||
|
gamepad.loop(pattern);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
vibrate: function (
|
||||||
|
context: ActionContext<IGamepadsState, IRootState>,
|
||||||
|
pattern: TPatternUnit
|
||||||
): void {
|
): void {
|
||||||
context.getters.gamepads.forEach((gamepad: Vibrator) => {
|
context.getters.gamepads.forEach((gamepad: Vibrator) => {
|
||||||
gamepad.vibrate(pattern);
|
gamepad.vibrate(pattern);
|
||||||
|
@ -28,9 +28,11 @@ const MPatterns: Module<IPatternState, IRootState> = {
|
|||||||
const json: TPattern[] = await response.json();
|
const json: TPattern[] = await response.json();
|
||||||
context.commit('setPatterns', json as TPattern[]);
|
context.commit('setPatterns', json as TPattern[]);
|
||||||
} else {
|
} else {
|
||||||
|
// eslint-disable-next-line
|
||||||
console.log('Connect to the Internet for download more patterns...');
|
console.log('Connect to the Internet for download more patterns...');
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// eslint-disable-next-line
|
||||||
console.log(error);
|
console.log(error);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
29
src/views/AboutView.vue
Normal file
29
src/views/AboutView.vue
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<template>
|
||||||
|
<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>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'AboutView',
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
17
src/views/CustomView.vue
Normal file
17
src/views/CustomView.vue
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<template>
|
||||||
|
<h1 class="visually-hidden">Wavelovers – Custom</h1>
|
||||||
|
<AppCustom />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import AppCustom from '@/components/AppCustom.vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'CustomView',
|
||||||
|
components: {
|
||||||
|
AppCustom: AppCustom,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
@ -1,4 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<h1 class="visually-hidden">Wavelovers – Diagnostic</h1>
|
||||||
<AppDiagnostic />
|
<AppDiagnostic />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
30
src/views/DonateView.vue
Normal file
30
src/views/DonateView.vue
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<template>
|
||||||
|
<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 />
|
||||||
|
<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 />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'DonateView',
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
51
src/views/FaqView.vue
Normal file
51
src/views/FaqView.vue
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<template>
|
||||||
|
<h1 class="visually-hidden">Wavelovers – FAQ</h1>
|
||||||
|
<div>
|
||||||
|
<div class="content-item">
|
||||||
|
<h2 class="content-item__header">FAQ</h2>
|
||||||
|
<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://wavelovers.ru/diagnostic" target="_blank">Wavelovers Diagnostic</a><br /><br />
|
||||||
|
<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>
|
||||||
|
<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>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'FaqView',
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
@ -1,4 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<h1 class="visually-hidden">Wavelovers – Manual</h1>
|
||||||
<AppManual />
|
<AppManual />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<h1 class="visually-hidden">Wavelovers – 404</h1>
|
||||||
<div class="content-item">
|
<div class="content-item">
|
||||||
<center>
|
<center>
|
||||||
<h2>404. Page not Found...</h2>
|
<h2>404. Page not Found.</h2>
|
||||||
</center>
|
</center>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<h1 class="visually-hidden">Wavelovers</h1>
|
||||||
<AppPatterns />
|
<AppPatterns />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user