Merge pull request #11 from eugene-serb/dev

Dev
This commit is contained in:
Eugene Serb 2022-08-31 17:00:51 +03:00 committed by GitHub
commit 534d2a1c82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
131 changed files with 3203 additions and 3098 deletions

View File

@ -1,20 +1,20 @@
# Wavelovers
Wavelovers links: **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://wavelovers.ru/)]**.
This is Wavelovers, a gamepad and gamepad vibration test tool that can also make a vibration massager out of a gamepad. It has 16 free vibration patterns to play with.
This is Wavelovers, a gamepad vibration test tool that can also turn a gamepad into a vibrating massager. It has 16 free vibration patterns to play with, a pattern editor, and a manual mode.
Tech Stack:
***Vue.js***, ***Vuex***, ***Vue Router***, ***Typescript***, ***Javascript***, ***HTML***, ***CSS***, ***SCSS***, ***ESLint***, ***Babel***.
Commands:<br />
1. npm install Project setup.<br />
2. npm run serve Compiles and hot-reloads for development.<br />
3. npm run build Compiles and minifies for production.<br />
4. npm run lint Lints and fixes files.<br />
* npm install Project setup.<br />
* npm run serve Compiles and hot-reloads for development.<br />
* npm run build Compiles and minifies for production.<br />
* npm run lint Lints and fixes files.<br />
Catalogs structure:<br />
***/docs/*** production build. <br />
***/ (root)*** dev files.
***/(root)*** dev files.
If you are interested in this or my other projects, or would like to suggest and share ideas with me, or just talk to me, contact me: *[@eugene_serb](https://t.me/eugene_serb)*

View File

@ -6,7 +6,7 @@
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#4ECBD9" />
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#087E8B" />
<meta name="color-scheme" content="light dark" />
<link rel="canonical" href="https://wavelovers.ru/404.html" />
<link rel="canonical" href="https://wavelovers.ru/404" />
<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" />
@ -24,6 +24,7 @@
padding-right: 0 !important;
padding-left: 0 !important;
}
.my-5 {
margin-top: 0 !important;
margin-bottom: 0 !important;

View File

@ -1,20 +1,20 @@
# Wavelovers
Wavelovers links: **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://wavelovers.ru/)]**.
This is Wavelovers, a gamepad and gamepad vibration test tool that can also make a vibration massager out of a gamepad. It has 16 free vibration patterns to play with.
This is Wavelovers, a gamepad vibration test tool that can also turn a gamepad into a vibrating massager. It has 16 free vibration patterns to play with, a pattern editor, and a manual mode.
Tech Stack:
***Vue.js***, ***Vuex***, ***Vue Router***, ***Typescript***, ***Javascript***, ***HTML***, ***CSS***, ***SCSS***, ***ESLint***, ***Babel***.
Commands:<br />
1. npm install Project setup.<br />
2. npm run serve Compiles and hot-reloads for development.<br />
3. npm run build Compiles and minifies for production.<br />
4. npm run lint Lints and fixes files.<br />
* npm install Project setup.<br />
* npm run serve Compiles and hot-reloads for development.<br />
* npm run build Compiles and minifies for production.<br />
* npm run lint Lints and fixes files.<br />
Catalogs structure:<br />
***/docs/*** production build. <br />
***/ (root)*** dev files.
***/(root)*** dev files.
If you are interested in this or my other projects, or would like to suggest and share ideas with me, or just talk to me, contact me: *[@eugene_serb](https://t.me/eugene_serb)*

View File

@ -0,0 +1 @@
.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}}.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}}

View File

@ -0,0 +1 @@
.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}}.output-gamepad{width:100%;padding:16px;border:2px solid var(--color-border);border-radius:var(--number-border-radius);display:flex;flex-direction:column;justify-content:space-between;gap:16px}.gamepad-group{display:grid;grid-template-columns:repeat(5,1fr)}.gamepad-group>div{display:flex;flex-direction:column;justify-content:space-between;gap:8px}.pressed{background-color:var(--color-link-hover);color:var(--color-background)}

1
docs/css/66.bb6440f7.css Normal file
View File

@ -0,0 +1 @@
.link_hash{word-break:break-all}

View File

@ -0,0 +1 @@
.list>li{margin-bottom:4px}

View File

@ -0,0 +1 @@
.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}}

View File

@ -1 +0,0 @@
.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}}

View File

@ -0,0 +1 @@
.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}}.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}}

View File

@ -1 +0,0 @@
.output-gamepad{width:100%;padding:16px;border:2px solid var(--color-border);border-radius:var(--number-border-radius);display:flex;flex-direction:column;justify-content:space-between;gap:16px}.gamepad-group{display:grid;grid-template-columns:repeat(5,1fr)}.gamepad-group>div{display:flex;flex-direction:column;justify-content:space-between;gap:8px}.pressed{background-color:var(--color-link-hover);color:var(--color-background)}

View File

@ -1 +0,0 @@
.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}}

View File

@ -1 +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}}
.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}

View File

@ -1,6 +1,6 @@
/* ------------------------------ */
/* Wavelovers styles */
/* version: dated 2022.08.12 */
/* version: dated 2022.08.29 */
/* author: Eugene Serb */
/* ------------------------------ */
@ -146,8 +146,11 @@ span, p, article, blockquote {
font-weight: 300;
}
ul {
ol, ul {
padding: 16px;
}
ul {
list-style-type: circle;
}
@ -215,6 +218,7 @@ button, textarea, select, input {
line-height: 1.382em;
white-space: nowrap;
}
button:hover, input:hover,
textarea:hover, select:hover {
border: 2px solid var(--color-link-hover);
@ -254,23 +258,23 @@ input[type=range] {
input[type=range]::-webkit-slider-runnable-track {
width: 100%;
height: 8px;
cursor: pointer;
border: 0px solid #000101;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-b);
border-radius: 8px;
border: 0px solid #000101;
cursor: pointer;
}
input[type=range]::-webkit-slider-thumb {
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
border: 0px solid #000000;
height: 16px;
-webkit-appearance: none;
width: 16px;
height: 16px;
margin-top: -4px;
border: 0px solid #000000;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-a);
cursor: pointer;
-webkit-appearance: none;
margin-top: -4px;
}
input[type=range]:focus::-webkit-slider-runnable-track {
@ -280,20 +284,20 @@ input[type=range] {
input[type=range]::-moz-range-track {
width: 100%;
height: 8px;
cursor: pointer;
animate: 0.2s;
border: 0px solid #000101;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-b);
border-radius: 8px;
border: 0px solid #000101;
cursor: pointer;
animate: 0.2s;
}
input[type=range]::-moz-range-thumb {
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
border: 0px solid #000000;
height: 16px;
width: 16px;
height: 16px;
border: 0px solid #000000;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-a);
cursor: pointer;
}
@ -301,34 +305,34 @@ input[type=range] {
input[type=range]::-ms-track {
width: 100%;
height: 8px;
border-width: 8px 0;
border-color: transparent;
background: transparent;
color: transparent;
cursor: pointer;
animate: 0.2s;
background: transparent;
border-color: transparent;
border-width: 8px 0;
color: transparent;
}
input[type=range]::-ms-fill-lower {
background: var(--color-b);
border: 0px solid #000101;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-b);
}
input[type=range]::-ms-fill-upper {
background: var(--color-b);
border: 0px solid #000101;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-b);
}
input[type=range]::-ms-thumb {
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
border: 0px solid #000000;
height: 16px;
width: 16px;
height: 16px;
border: 0px solid #000000;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-a);
cursor: pointer;
}
@ -475,22 +479,13 @@ table, th, td {
background: var(--color-content-item-background);
}
.content-item__header {
.content-item__header {
margin-bottom: 16px;
text-align: center;
}
}
@media only screen and (min-width: 540px) {
.content-item {
padding: 32px;
}
}
/* ----- */
/* PAGES */
/* ----- */
.link_hash {
word-break: break-all;
}

View File

@ -1,4 +1,4 @@
<!doctype html><html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml"><head><title>Wavelovers</title><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" media="(prefers-color-scheme: light)" content="#EA9AB2"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#E27396"/><meta name="color-scheme" content="light dark"/><meta name="robots" content="all"/><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 || [];
<!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="/img/favicon.ico"/><link rel="apple-touch-icon" sizes="180x180" href="/img/apple-touch-icon.png"/><link rel="icon" type="image/png" sizes="32x32" href="/img/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/img/favicon-16x16.png"/><link rel="manifest" href="/site.webmanifest"/><link rel="stylesheet" href="/css/styles.css"/><script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script><script>window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
@ -15,4 +15,4 @@
webvisor: true
});</script><style>[v-cloak] {
display: none;
}</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>
}</style><script defer="defer" src="/js/chunk-vendors.e296822d.js"></script><script defer="defer" src="/js/app.d0c8a9ec.js"></script><link href="/css/app.61999447.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/219.2a2a502d.js Normal file
View File

@ -0,0 +1,2 @@
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[219],{3913:function(t,n,a){var e=a(2482);class s{constructor(t,n,a,s){(0,e.Z)(this,"startDelay",void 0),(0,e.Z)(this,"duration",void 0),(0,e.Z)(this,"weakMagnitude",void 0),(0,e.Z)(this,"strongMagnitude",void 0),this.startDelay=t,this.duration=n,this.weakMagnitude=a,this.strongMagnitude=s}}n["Z"]=s},3375:function(t,n,a){a.d(n,{Z:function(){return _}});var e=a(3396),s=a(7139);const i={class:"content-item device-list"};function o(t,n,a,o,u,r){const l=(0,e.up)("GamepadItem");return(0,e.wg)(),(0,e.iD)("div",i,[((0,e.wg)(!0),(0,e.iD)(e.HY,null,(0,e.Ko)(t.gamepads,(t=>((0,e.wg)(),(0,e.j4)(l,{key:t.id,textContent:(0,s.zw)(t.unit.id)},null,8,["textContent"])))),128))])}const u={class:"list-item"};function r(t,n,a,s,i,o){return(0,e.wg)(),(0,e.iD)("div",u)}var l=(0,e.aZ)({name:"GamepadItem"}),m=a(89);const d=(0,m.Z)(l,[["render",r]]);var c=d,p=(0,e.aZ)({name:"GamepadList",props:{gamepads:{type:Array}},components:{GamepadItem:c}});const g=(0,m.Z)(p,[["render",o]]);var _=g},9808:function(t,n,a){a.d(n,{Z:function(){return l}});var e=a(3396);const s={class:"content-item message"};function i(t,n,a,i,o,u){return(0,e.wg)(),(0,e.iD)("div",s,[(0,e._)("span",null,[(0,e.WI)(t.$slots,"default")])])}var o=(0,e.aZ)({name:"MessageItem"}),u=a(89);const r=(0,u.Z)(o,[["render",i]]);var l=r},4246:function(t,n,a){a.d(n,{Z:function(){return p}});var e=a(3396);const s={class:"content-item navigation-list"},i=(0,e.Uk)("Patterns"),o=(0,e.Uk)("Custom"),u=(0,e.Uk)("Manual"),r=(0,e.Uk)("Diagnostic");function l(t,n,a,l,m,d){const c=(0,e.up)("router-link");return(0,e.wg)(),(0,e.iD)("div",s,[(0,e.Wm)(c,{to:"/",class:"navigation-list__item"},{default:(0,e.w5)((()=>[i])),_:1}),(0,e.Wm)(c,{to:"/custom",class:"navigation-list__item"},{default:(0,e.w5)((()=>[o])),_:1}),(0,e.Wm)(c,{to:"/manual",class:"navigation-list__item"},{default:(0,e.w5)((()=>[u])),_:1}),(0,e.Wm)(c,{to:"/diagnostic",class:"navigation-list__item"},{default:(0,e.w5)((()=>[r])),_:1})])}var m=(0,e.aZ)({name:"NavigationList"}),d=a(89);const c=(0,d.Z)(m,[["render",l]]);var p=c},219:function(t,n,a){a.r(n),a.d(n,{default:function(){return G}});var e=a(3396);const s=(0,e._)("h1",{class:"visually-hidden"},"Wavelovers <20> Custom",-1);function i(t,n,a,i,o,u){const r=(0,e.up)("AppCustom");return(0,e.wg)(),(0,e.iD)(e.HY,null,[s,(0,e.Wm)(r)],64)}var o=a(9242);const u={class:"content-item app-custom"},r={class:"custom-form"},l={class:"custom-form__input"},m=(0,e._)("span",null,"Start Delay (ms)",-1),d={class:"custom-form__input"},c=(0,e._)("span",null,"Duration (ms)",-1),p={class:"custom-form__input"},g=(0,e._)("span",null,"Weak Magnitude",-1),_={class:"custom-form__input"},v=(0,e._)("span",null,"Strong Magnitude",-1),f={class:"custom-form__buttons"},w=(0,e.Uk)("Press any gamepad button or connect a new gamepad to vibrate.");function Z(t,n,a,s,i,Z){const h=(0,e.up)("NavigationList"),y=(0,e.up)("GamepadList"),k=(0,e.up)("MessageItem");return(0,e.wg)(),(0,e.iD)(e.HY,null,[(0,e.Wm)(h),(0,e._)("div",u,[(0,e._)("fieldset",r,[(0,e._)("label",l,[m,(0,e.wy)((0,e._)("input",{"onUpdate:modelValue":n[0]||(n[0]=n=>t.startDelay=n),type:"number",placeholder:"Start Delay",min:"0",max:"1000",step:"25",required:""},null,512),[[o.nr,t.startDelay]])]),(0,e._)("label",d,[c,(0,e.wy)((0,e._)("input",{"onUpdate:modelValue":n[1]||(n[1]=n=>t.duration=n),type:"number",placeholder:"Duration",min:"0",max:"1000",step:"25",required:""},null,512),[[o.nr,t.duration]])]),(0,e._)("label",p,[g,(0,e.wy)((0,e._)("input",{"onUpdate:modelValue":n[2]||(n[2]=n=>t.weakMagnitude=n),type:"range",required:"",min:"0.0",max:"1.0",step:"0.01"},null,512),[[o.nr,t.weakMagnitude]])]),(0,e._)("label",_,[v,(0,e.wy)((0,e._)("input",{"onUpdate:modelValue":n[3]||(n[3]=n=>t.strongMagnitude=n),type:"range",required:"",min:"0.0",max:"1.0",step:"0.01"},null,512),[[o.nr,t.strongMagnitude]])]),(0,e._)("div",f,[(0,e._)("button",{onClick:n[4]||(n[4]=(...n)=>t.start&&t.start(...n)),class:"custom-form__button"},"Start"),(0,e._)("button",{onClick:n[5]||(n[5]=(...n)=>t.stop&&t.stop(...n)),class:"custom-form__button"},"Stop")])])]),t.gamepads.length>0?((0,e.wg)(),(0,e.j4)(y,{key:0,gamepads:t.gamepads},null,8,["gamepads"])):((0,e.wg)(),(0,e.j4)(k,{key:1},{default:(0,e.w5)((()=>[w])),_:1}))],64)}var h=a(1746),y=a(4246),k=a(3375),D=a(9808),M=a(3913),b=(0,e.aZ)({name:"AppCustom",components:{NavigationList:y.Z,GamepadList:k.Z,MessageItem:D.Z},data:()=>({startDelay:250,duration:250,weakMagnitude:1,strongMagnitude:1}),computed:{gamepads:function(){return h.Z.getters.gamepads}},methods:{start:function(){const t=[new M.Z(this.startDelay,this.duration,this.weakMagnitude,this.strongMagnitude)];h.Z.dispatch("startCustom",t)},stop:function(){h.Z.dispatch("reset")}}}),C=a(89);const U=(0,C.Z)(b,[["render",Z]]);var W=U,I=(0,e.aZ)({name:"CustomView",components:{AppCustom:W}});const x=(0,C.Z)(I,[["render",i]]);var G=x}}]);
//# sourceMappingURL=219.2a2a502d.js.map

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
"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

View File

@ -1 +0,0 @@
{"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":""}

View File

@ -1,2 +0,0 @@
"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

View File

@ -1 +0,0 @@
{"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":""}

View File

@ -1,2 +0,0 @@
"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&#39;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

View File

@ -1 +0,0 @@
{"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&#39;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":""}

View File

@ -1,2 +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
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[531],{4066: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=531.6af13e76.js.map

View File

@ -1 +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":""}
{"version":3,"file":"js/531.6af13e76.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,CCjBC,OAAeC,EAAAA,EAAAA,IAAgB,CAC7BC,KAAM,iB,QCCV,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASlB,KAEpE,O","sources":["webpack://wavelovers/./src/views/NotFoundView.vue?ba0c","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=35b706e8&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/582.a8f6467f.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
docs/js/645.b32a0b62.js Normal file
View File

@ -0,0 +1,2 @@
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[645],{645:function(e,t,a){a.r(t),a.d(t,{default:function(){return c}});var d=a(3396);const s=(0,d.uE)('<h1 class="visually-hidden">Wavelovers <20> FAQ</h1><div><article 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&#39;m having problems with the app or connecting my device to the app?</dt><dd>Go to Troubleshooting.</dd></dl></article><article 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></article><article 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></article></div>',2);function r(e,t,a,d,r,o){return s}var o=(0,d.aZ)({name:"FaqView"}),i=a(89);const n=(0,i.Z)(o,[["render",r]]);var c=n}}]);
//# sourceMappingURL=645.b32a0b62.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"js/645.b32a0b62.js","mappings":"6KAEA,MAAMA,GAA0BC,EAAAA,EAAAA,IAAmB,k4DAAy5D,GAEt8D,SAAUC,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAOR,CACR,CCHC,OAAeS,EAAAA,EAAAA,IAAgB,CAC7BC,KAAM,Y,QCCV,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAST,KAEpE,O","sources":["webpack://wavelovers/./src/views/FaqView.vue?c024","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><article 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&#39;m having problems with the app or connecting my device to the app?</dt><dd>Go to Troubleshooting.</dd></dl></article><article 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></article><article 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></article></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=0e2de9db&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":""}

2
docs/js/66.54b2ec35.js Normal file
View File

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

View File

@ -0,0 +1 @@
{"version":3,"file":"js/66.54b2ec35.js","mappings":"6KAEA,MAAMA,GAA0BC,EAAAA,EAAAA,IAAmB,swBAAmxB,GAEh0B,SAAUC,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAOR,CACR,CCHC,OAAeS,EAAAA,EAAAA,IAAgB,CAC7BC,KAAM,e,QCGV,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAST,KAEpE,O","sources":["webpack://wavelovers/./src/views/DonateView.vue?c864","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><article 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></article></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=4a1e50be&ts=true\"\nimport script from \"./DonateView.vue?vue&type=script&lang=ts\"\nexport * from \"./DonateView.vue?vue&type=script&lang=ts\"\n\nimport \"./DonateView.vue?vue&type=style&index=0&id=4a1e50be&lang=css\"\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/672.270ec4e0.js Normal file
View File

@ -0,0 +1,2 @@
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[672],{2672:function(e,a,i){i.r(a),i.d(a,{default:function(){return h}});var t=i(3396);const n=(0,t.uE)('<h1 class="visually-hidden">Wavelovers <20> About</h1><div><article class="content-item"><h2 class="content-item__header">Wavelovers</h2><p> Wavelovers is an assistant in relaxation, elimination of muscle pain and other relaxing, wellness procedures, or simply a tester of the performance of the gamepad, its buttons and vibration. </p><br><p> Wavelovers is free to use worldwide, in every corner of the planet, all you need is a gamepad with vibration. </p></article><article class="content-item"><h2 class="content-item__header">About the effects of use</h2><span>A dozen reasons to make friends with the Wavelovers vibration stimulator:</span><ol class="list"><li>Reduces the risk of stroke.</li><li>Headaches and migraines are reduced.</li><li>Pain syndromes accompanying osteochondrosis and muscle pain are reduced.</li><li>Noise in the ears and numbness of the fingers pass.</li><li>Memory and vision improve, emotional state normalizes.</li><li>The work of muscles and blood vessels is normalized, blood circulation improves.</li><li>Meteorological dependence decreases.</li><li>Improves overall well-being and sleep, increases efficiency.</li><li>The ability to jump to the height of one&#39;s own height.</li><li>After training, the ability to fly and breathe underwater for up to an hour.</li><li>Gradual transformation into a superman. Walking through walls, cat vision, regeneration.</li><li>The ability to see the future and travel through time and to other galaxies.</li></ol><span>P.S. The list is based on reviews, has not been verified by experts, and may not reflect reality. Don&#39;t take it for granted.</span></article><article class="content-item"><h2 class="content-item__header">Author</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></article><article 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></article></div>',2);function s(e,a,i,t,s,o){return n}var o=(0,t.aZ)({name:"AboutView"}),r=i(89);const l=(0,r.Z)(o,[["render",s]]);var h=l}}]);
//# sourceMappingURL=672.270ec4e0.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"js/672.270ec4e0.js","mappings":"8KAEA,MAAMA,GAA0BC,EAAAA,EAAAA,IAAmB,2yEAA40E,GAEz3E,SAAUC,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAOR,CACR,CCHC,OAAeS,EAAAA,EAAAA,IAAgB,CAC7BC,KAAM,c,QCGV,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAST,KAEpE,O","sources":["webpack://wavelovers/./src/views/AboutView.vue?173c","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><article class=\\\"content-item\\\"><h2 class=\\\"content-item__header\\\">Wavelovers</h2><p> Wavelovers is an assistant in relaxation, elimination of muscle pain and other relaxing, wellness procedures, or simply a tester of the performance of the gamepad, its buttons and vibration. </p><br><p> Wavelovers is free to use worldwide, in every corner of the planet, all you need is a gamepad with vibration. </p></article><article class=\\\"content-item\\\"><h2 class=\\\"content-item__header\\\">About the effects of use</h2><span>A dozen reasons to make friends with the Wavelovers vibration stimulator:</span><ol class=\\\"list\\\"><li>Reduces the risk of stroke.</li><li>Headaches and migraines are reduced.</li><li>Pain syndromes accompanying osteochondrosis and muscle pain are reduced.</li><li>Noise in the ears and numbness of the fingers pass.</li><li>Memory and vision improve, emotional state normalizes.</li><li>The work of muscles and blood vessels is normalized, blood circulation improves.</li><li>Meteorological dependence decreases.</li><li>Improves overall well-being and sleep, increases efficiency.</li><li>The ability to jump to the height of one&#39;s own height.</li><li>After training, the ability to fly and breathe underwater for up to an hour.</li><li>Gradual transformation into a superman. Walking through walls, cat vision, regeneration.</li><li>The ability to see the future and travel through time and to other galaxies.</li></ol><span>P.S. The list is based on reviews, has not been verified by experts, and may not reflect reality. Don&#39;t take it for granted.</span></article><article class=\\\"content-item\\\"><h2 class=\\\"content-item__header\\\">Author</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></article><article 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></article></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=7a21eaae&ts=true\"\nimport script from \"./AboutView.vue?vue&type=script&lang=ts\"\nexport * from \"./AboutView.vue?vue&type=script&lang=ts\"\n\nimport \"./AboutView.vue?vue&type=style&index=0&id=7a21eaae&lang=css\"\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/709.b171ad0f.js Normal file
View File

@ -0,0 +1,2 @@
"use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[709],{3375:function(t,e,n){n.d(e,{Z:function(){return v}});var a=n(3396),s=n(7139);const i={class:"content-item device-list"};function r(t,e,n,r,o,c){const m=(0,a.up)("GamepadItem");return(0,a.wg)(),(0,a.iD)("div",i,[((0,a.wg)(!0),(0,a.iD)(a.HY,null,(0,a.Ko)(t.gamepads,(t=>((0,a.wg)(),(0,a.j4)(m,{key:t.id,textContent:(0,s.zw)(t.unit.id)},null,8,["textContent"])))),128))])}const o={class:"list-item"};function c(t,e,n,s,i,r){return(0,a.wg)(),(0,a.iD)("div",o)}var m=(0,a.aZ)({name:"GamepadItem"}),p=n(89);const u=(0,p.Z)(m,[["render",c]]);var d=u,l=(0,a.aZ)({name:"GamepadList",props:{gamepads:{type:Array}},components:{GamepadItem:d}});const g=(0,p.Z)(l,[["render",r]]);var v=g},9808:function(t,e,n){n.d(e,{Z:function(){return m}});var a=n(3396);const s={class:"content-item message"};function i(t,e,n,i,r,o){return(0,a.wg)(),(0,a.iD)("div",s,[(0,a._)("span",null,[(0,a.WI)(t.$slots,"default")])])}var r=(0,a.aZ)({name:"MessageItem"}),o=n(89);const c=(0,o.Z)(r,[["render",i]]);var m=c},4246:function(t,e,n){n.d(e,{Z:function(){return l}});var a=n(3396);const s={class:"content-item navigation-list"},i=(0,a.Uk)("Patterns"),r=(0,a.Uk)("Custom"),o=(0,a.Uk)("Manual"),c=(0,a.Uk)("Diagnostic");function m(t,e,n,m,p,u){const d=(0,a.up)("router-link");return(0,a.wg)(),(0,a.iD)("div",s,[(0,a.Wm)(d,{to:"/",class:"navigation-list__item"},{default:(0,a.w5)((()=>[i])),_:1}),(0,a.Wm)(d,{to:"/custom",class:"navigation-list__item"},{default:(0,a.w5)((()=>[r])),_:1}),(0,a.Wm)(d,{to:"/manual",class:"navigation-list__item"},{default:(0,a.w5)((()=>[o])),_:1}),(0,a.Wm)(d,{to:"/diagnostic",class:"navigation-list__item"},{default:(0,a.w5)((()=>[c])),_:1})])}var p=(0,a.aZ)({name:"NavigationList"}),u=n(89);const d=(0,u.Z)(p,[["render",m]]);var l=d},9709:function(t,e,n){n.r(e),n.d(e,{default:function(){return N}});var a=n(3396);const s=(0,a._)("h1",{class:"visually-hidden"},"Wavelovers",-1);function i(t,e,n,i,r,o){const c=(0,a.up)("AppPatterns");return(0,a.wg)(),(0,a.iD)(a.HY,null,[s,(0,a.Wm)(c)],64)}const r={class:"app-patterns"},o=(0,a.Uk)("Loading..."),c=(0,a.Uk)("Press any gamepad button or connect a new gamepad to vibrate.");function m(t,e,n,s,i,m){const p=(0,a.up)("NavigationList"),u=(0,a.up)("PatternList"),d=(0,a.up)("MessageItem"),l=(0,a.up)("GamepadList");return(0,a.wg)(),(0,a.iD)(a.HY,null,[(0,a.Wm)(p),(0,a._)("div",r,[t.patterns.length>0?((0,a.wg)(),(0,a.j4)(u,{key:0,patterns:t.patterns,mode:t.mode,isActive:t.isActive,onChange:t.change},null,8,["patterns","mode","isActive","onChange"])):((0,a.wg)(),(0,a.j4)(d,{key:1},{default:(0,a.w5)((()=>[o])),_:1}))]),t.gamepads.length>0?((0,a.wg)(),(0,a.j4)(l,{key:0,gamepads:t.gamepads},null,8,["gamepads"])):((0,a.wg)(),(0,a.j4)(d,{key:1},{default:(0,a.w5)((()=>[c])),_:1}))],64)}var p=n(1746),u=n(4246),d=n(3375),l=n(9808);const g={class:"content-item pattern-list"};function v(t,e,n,s,i,r){const o=(0,a.up)("PatternItem");return(0,a.wg)(),(0,a.iD)("div",g,[((0,a.wg)(!0),(0,a.iD)(a.HY,null,(0,a.Ko)(t.patterns,((e,n)=>((0,a.wg)(),(0,a.j4)(o,{key:e.name,pattern:e,index:n,mode:t.mode,isActive:t.isActive,onChange:t.change},null,8,["pattern","index","mode","isActive","onChange"])))),128))])}var f=n(7139);const w=["textContent"],_={class:"pattern-item__info-container"},Z=["textContent"],h=["textContent"];function y(t,e,n,s,i,r){return(0,a.wg)(),(0,a.iD)("div",{onClick:e[0]||(e[0]=e=>t.change(t.index)),class:(0,f.C_)(["pattern-item",t.index===t.mode&&!0===t.isActive?"pattern-item_selected":""])},[(0,a._)("span",{class:"pattern-item__icon",textContent:(0,f.zw)(t.pattern.icon)},null,8,w),(0,a._)("div",_,[(0,a._)("span",{class:"pattern-item__name",textContent:(0,f.zw)(t.pattern.name)},null,8,Z),(0,a._)("span",{class:"pattern-item__type",textContent:(0,f.zw)(t.pattern.type)},null,8,h)])],2)}var k=(0,a.aZ)({name:"PatternItem",props:{pattern:{type:Object},index:{type:Number},mode:{type:Number},isActive:{type:Boolean}},methods:{change:function(t){this.$emit("change",t)}}}),C=n(89);const A=(0,C.Z)(k,[["render",y]]);var x=A,P=(0,a.aZ)({name:"PatternList",props:{patterns:{type:Array},mode:{type:Number},isActive:{type:Boolean}},components:{PatternItem:x},methods:{change:function(t){this.$emit("change",t)}}});const D=(0,C.Z)(P,[["render",v]]);var I=D,L=(0,a.aZ)({name:"AppPatterns",components:{PatternList:I,NavigationList:u.Z,GamepadList:d.Z,MessageItem:l.Z},computed:{gamepads:function(){return p.Z.getters.gamepads},patterns:function(){return p.Z.getters.patterns},mode:function(){return p.Z.getters.mode},isActive:function(){return p.Z.getters.isActive}},methods:{change(t){p.Z.dispatch("change",t)}},mounted(){p.Z.dispatch("loadPatterns")}});const b=(0,C.Z)(L,[["render",m]]);var W=b,j=(0,a.aZ)({name:"PatternsView",components:{AppPatterns:W}});const G=(0,C.Z)(j,[["render",i]]);var N=G}}]);
//# sourceMappingURL=709.b171ad0f.js.map

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
"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

File diff suppressed because one or more lines are too long

2
docs/js/807.d54b1ac1.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
"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

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.d0c8a9ec.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2,43 +2,43 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://wavelovers.ru/</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/custom</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/manual</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/diagnostic</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/faq</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/about</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/donate</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>

View File

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

932
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
"name": "wavelovers",
"description": "Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.",
"keywords": [ "wavelovers", "gamepad-vibrator", "gamepad-test-tool", "gamepad-vibration-test-tool" ],
"version": "1.0.0",
"version": "1.0.15",
"license": "GNU GPL v3",
"homepage": "https://wavelovers.ru/",
"author": {
@ -14,6 +14,9 @@
"type": "git",
"url": "https://github.com/eugene-serb/wavelovers/"
},
"bugs": {
"url": "https://github.com/eugene-serb/wavelovers/issues/"
},
"private": true,
"scripts": {
"serve": "vue-cli-service serve",

View File

@ -6,7 +6,7 @@
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#4ECBD9" />
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#087E8B" />
<meta name="color-scheme" content="light dark" />
<link rel="canonical" href="https://wavelovers.ru/404.html" />
<link rel="canonical" href="https://wavelovers.ru/404" />
<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" />
@ -24,6 +24,7 @@
padding-right: 0 !important;
padding-left: 0 !important;
}
.my-5 {
margin-top: 0 !important;
margin-bottom: 0 !important;

View File

@ -1,20 +1,20 @@
# Wavelovers
Wavelovers links: **[[rep](https://github.com/eugene-serb/wavelovers/), [site](https://wavelovers.ru/)]**.
This is Wavelovers, a gamepad and gamepad vibration test tool that can also make a vibration massager out of a gamepad. It has 16 free vibration patterns to play with.
This is Wavelovers, a gamepad vibration test tool that can also turn a gamepad into a vibrating massager. It has 16 free vibration patterns to play with, a pattern editor, and a manual mode.
Tech Stack:
***Vue.js***, ***Vuex***, ***Vue Router***, ***Typescript***, ***Javascript***, ***HTML***, ***CSS***, ***SCSS***, ***ESLint***, ***Babel***.
Commands:<br />
1. npm install Project setup.<br />
2. npm run serve Compiles and hot-reloads for development.<br />
3. npm run build Compiles and minifies for production.<br />
4. npm run lint Lints and fixes files.<br />
* npm install Project setup.<br />
* npm run serve Compiles and hot-reloads for development.<br />
* npm run build Compiles and minifies for production.<br />
* npm run lint Lints and fixes files.<br />
Catalogs structure:<br />
***/docs/*** production build. <br />
***/ (root)*** dev files.
***/(root)*** dev files.
If you are interested in this or my other projects, or would like to suggest and share ideas with me, or just talk to me, contact me: *[@eugene_serb](https://t.me/eugene_serb)*

View File

@ -1,6 +1,6 @@
/* ------------------------------ */
/* Wavelovers styles */
/* version: dated 2022.08.12 */
/* version: dated 2022.08.29 */
/* author: Eugene Serb */
/* ------------------------------ */
@ -146,8 +146,11 @@ span, p, article, blockquote {
font-weight: 300;
}
ul {
ol, ul {
padding: 16px;
}
ul {
list-style-type: circle;
}
@ -215,6 +218,7 @@ button, textarea, select, input {
line-height: 1.382em;
white-space: nowrap;
}
button:hover, input:hover,
textarea:hover, select:hover {
border: 2px solid var(--color-link-hover);
@ -254,23 +258,23 @@ input[type=range] {
input[type=range]::-webkit-slider-runnable-track {
width: 100%;
height: 8px;
cursor: pointer;
border: 0px solid #000101;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-b);
border-radius: 8px;
border: 0px solid #000101;
cursor: pointer;
}
input[type=range]::-webkit-slider-thumb {
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
border: 0px solid #000000;
height: 16px;
-webkit-appearance: none;
width: 16px;
height: 16px;
margin-top: -4px;
border: 0px solid #000000;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-a);
cursor: pointer;
-webkit-appearance: none;
margin-top: -4px;
}
input[type=range]:focus::-webkit-slider-runnable-track {
@ -280,20 +284,20 @@ input[type=range] {
input[type=range]::-moz-range-track {
width: 100%;
height: 8px;
cursor: pointer;
animate: 0.2s;
border: 0px solid #000101;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-b);
border-radius: 8px;
border: 0px solid #000101;
cursor: pointer;
animate: 0.2s;
}
input[type=range]::-moz-range-thumb {
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
border: 0px solid #000000;
height: 16px;
width: 16px;
height: 16px;
border: 0px solid #000000;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-a);
cursor: pointer;
}
@ -301,34 +305,34 @@ input[type=range] {
input[type=range]::-ms-track {
width: 100%;
height: 8px;
border-width: 8px 0;
border-color: transparent;
background: transparent;
color: transparent;
cursor: pointer;
animate: 0.2s;
background: transparent;
border-color: transparent;
border-width: 8px 0;
color: transparent;
}
input[type=range]::-ms-fill-lower {
background: var(--color-b);
border: 0px solid #000101;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-b);
}
input[type=range]::-ms-fill-upper {
background: var(--color-b);
border: 0px solid #000101;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-b);
}
input[type=range]::-ms-thumb {
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
border: 0px solid #000000;
height: 16px;
width: 16px;
height: 16px;
border: 0px solid #000000;
border-radius: 8px;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
background: var(--color-a);
cursor: pointer;
}
@ -475,22 +479,13 @@ table, th, td {
background: var(--color-content-item-background);
}
.content-item__header {
.content-item__header {
margin-bottom: 16px;
text-align: center;
}
}
@media only screen and (min-width: 540px) {
.content-item {
padding: 32px;
}
}
/* ----- */
/* PAGES */
/* ----- */
.link_hash {
word-break: break-all;
}

View File

@ -26,11 +26,11 @@
<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="shortcut icon" type="image/x-icon" href="/img/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/img/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicon-16x16.png" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="stylesheet" type="text/css" href="/css/styles.css" />
<!-- Global site tag (gtag.js) - Google Analytics -->

View File

@ -2,43 +2,43 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://wavelovers.ru/</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/custom</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/manual</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/diagnostic</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/faq</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/about</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://wavelovers.ru/donate</loc>
<lastmod>2022-08-12</lastmod>
<lastmod>2022-08-31</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>

View File

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

View File

@ -21,13 +21,19 @@
FooterItem: FooterItem,
},
methods: {
addEventListeners(): void {
window.addEventListener('gamepadconnected', (event: GamepadEvent) => store.dispatch('addGamepad', event));
window.addEventListener('gamepaddisconnected', (event: GamepadEvent) => store.dispatch('deleteGamepad', event));
addGamepad: function (event: GamepadEvent): void {
store.dispatch('addGamepad', event);
},
removeEventListeners(): void {
window.removeEventListener('gamepadconnected', (event: GamepadEvent) => store.dispatch('addGamepad', event));
window.removeEventListener('gamepaddisconnected', (event: GamepadEvent) => store.dispatch('deleteGamepad', event));
deleteGamepad: function (event: GamepadEvent): void {
store.dispatch('deleteGamepad', event);
},
addEventListeners: function (): void {
window.addEventListener('gamepadconnected', this.addGamepad);
window.addEventListener('gamepaddisconnected', this.deleteGamepad);
},
removeEventListeners: function (): void {
window.removeEventListener('gamepadconnected', this.addGamepad);
window.removeEventListener('gamepaddisconnected', this.deleteGamepad);
},
},
mounted() {

View File

@ -13,48 +13,21 @@
<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 DiagnosticItem from '@/components/DiagnosticItem.vue';
import Vibrator from '@/models/Vibrator';
import ComputedGamepads from '@/mixins/ComputedGamepads.vue';
export default defineComponent({
name: 'AppDiagnostic',
mixins: [ComputedGamepads],
components: {
DiagnosticItem: DiagnosticItem,
NavigationList: NavigationList,
GamepadList: GamepadList,
MessageItem: MessageItem,
},
data: () => {
return {
timestamp: 0 as number,
interval: 0 as number,
};
},
computed: {
gamepads: function (): Vibrator[] {
const timestamp: number = this.timestamp;
const result: Vibrator[] = store.getters.gamepads as Vibrator[];
result.forEach((item) => {
item.interval = timestamp;
});
return result;
},
},
methods: {
updateComputed: function (): void {
this.timestamp = Date.now();
},
},
mounted() {
this.interval = setInterval(this.updateComputed, 1);
},
unmounted() {
clearInterval(this.interval);
},
});
</script>

View File

@ -47,12 +47,14 @@
import NavigationList from '@/components/NavigationList.vue';
import GamepadList from '@/components/GamepadList.vue';
import MessageItem from '@/components/MessageItem.vue';
import ComputedGamepads from '@/mixins/ComputedGamepads.vue';
import Vibrator from '@/models/Vibrator';
import TPatternUnit from '@/models/TPatternUnit';
import PatternUnit from '@/models/PatternUnit';
export default defineComponent({
name: 'AppCustom',
mixins: [ComputedGamepads],
components: {
NavigationList: NavigationList,
GamepadList: GamepadList,
@ -60,8 +62,6 @@
},
data: () => {
return {
timestamp: 0 as number,
interval: 0 as number,
mode: 0 as number,
lock: false as boolean,
startDelay: 0 as number,
@ -70,16 +70,6 @@
strongMagnitude: 0 as number,
};
},
computed: {
gamepads: function (): Vibrator[] {
const timestamp: number = this.timestamp;
const result: Vibrator[] = store.getters.gamepads as Vibrator[];
result.forEach((item) => {
item.interval = timestamp;
})
return result;
},
},
methods: {
start: function (): void {
const pattern: TPatternUnit = new PatternUnit(
@ -101,9 +91,6 @@
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) {
@ -142,7 +129,7 @@
},
handle: function (): void {
if (this.gamepads.length > 0) {
this.gamepads.forEach((gamepad) => {
this.gamepads.forEach((gamepad: Vibrator) => {
if (gamepad.unit.buttons[7].value > 0 || this.lock === true) {
this.start();
} else {
@ -155,9 +142,6 @@
mounted() {
this.interval = setInterval(this.eventLoop, 250);
},
unmounted() {
clearInterval(this.interval);
},
});
</script>

View File

@ -3,44 +3,28 @@
<h3>#{{ gamepad.unit.index + 1 }}. {{ gamepad.unit.id }}</h3>
<div class="gamepad-group">
<div>
<span :class="[ gamepad.unit.buttons[0].value === 1 ? 'pressed' : '' ]"
>A: {{ gamepad.unit.buttons[0].value.toFixed(2) }}</span>
<span :class="[gamepad.unit.buttons[1].value === 1 ? 'pressed' : '' ]"
>B: {{ gamepad.unit.buttons[1].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[2].value === 1 ? 'pressed' : '' ]"
>X: {{ gamepad.unit.buttons[2].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[3].value === 1 ? 'pressed' : '' ]"
>Y: {{ gamepad.unit.buttons[3].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[0].value === 1 ? 'pressed' : '' ]">A: {{ gamepad.unit.buttons[0].value.toFixed(2) }}</span>
<span :class="[gamepad.unit.buttons[1].value === 1 ? 'pressed' : '' ]">B: {{ gamepad.unit.buttons[1].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[2].value === 1 ? 'pressed' : '' ]">X: {{ gamepad.unit.buttons[2].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[3].value === 1 ? 'pressed' : '' ]">Y: {{ gamepad.unit.buttons[3].value.toFixed(2) }}</span>
</div>
<div>
<span :class="[ gamepad.unit.buttons[4].value === 1 ? 'pressed' : '' ]"
>LB: {{ gamepad.unit.buttons[4].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[5].value === 1 ? 'pressed' : '' ]"
>RB: {{ gamepad.unit.buttons[5].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[6].value === 1 ? 'pressed' : '' ]"
>LT: {{ gamepad.unit.buttons[6].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[7].value === 1 ? 'pressed' : '' ]"
>RT: {{ gamepad.unit.buttons[7].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[4].value === 1 ? 'pressed' : '' ]">LB: {{ gamepad.unit.buttons[4].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[5].value === 1 ? 'pressed' : '' ]">RB: {{ gamepad.unit.buttons[5].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[6].value === 1 ? 'pressed' : '' ]">LT: {{ gamepad.unit.buttons[6].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[7].value === 1 ? 'pressed' : '' ]">RT: {{ gamepad.unit.buttons[7].value.toFixed(2) }}</span>
</div>
<div>
<span :class="[ gamepad.unit.buttons[8].value === 1 ? 'pressed' : '' ]"
>Back: {{ gamepad.unit.buttons[8].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[9].value === 1 ? 'pressed' : '' ]"
>Start: {{ gamepad.unit.buttons[9].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[10].value === 1 ? 'pressed' : '' ]"
>Left Stick: {{gamepad.unit.buttons[10].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[11].value === 1 ? 'pressed' : '' ]"
>Right Stick: {{ gamepad.unit.buttons[11].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[8].value === 1 ? 'pressed' : '' ]">Back: {{ gamepad.unit.buttons[8].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[9].value === 1 ? 'pressed' : '' ]">Start: {{ gamepad.unit.buttons[9].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[10].value === 1 ? 'pressed' : '' ]">Left Stick: {{gamepad.unit.buttons[10].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[11].value === 1 ? 'pressed' : '' ]">Right Stick: {{ gamepad.unit.buttons[11].value.toFixed(2) }}</span>
</div>
<div>
<span :class="[ gamepad.unit.buttons[12].value === 1 ? 'pressed' : '' ]"
>Forward: {{ gamepad.unit.buttons[12].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[13].value === 1 ? 'pressed' : '' ]"
>Backward: {{ gamepad.unit.buttons[13].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[14].value === 1 ? 'pressed' : '' ]"
>Left: {{ gamepad.unit.buttons[14].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[15].value === 1 ? 'pressed' : '' ]"
>Right: {{ gamepad.unit.buttons[15].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[12].value === 1 ? 'pressed' : '' ]">Forward: {{ gamepad.unit.buttons[12].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[13].value === 1 ? 'pressed' : '' ]">Backward: {{ gamepad.unit.buttons[13].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[14].value === 1 ? 'pressed' : '' ]">Left: {{ gamepad.unit.buttons[14].value.toFixed(2) }}</span>
<span :class="[ gamepad.unit.buttons[15].value === 1 ? 'pressed' : '' ]">Right: {{ gamepad.unit.buttons[15].value.toFixed(2) }}</span>
</div>
<div>
<span>Left Stick X: {{ gamepad.unit.axes[0] ? gamepad.unit.axes[0].toFixed(2) : 'missing' }}</span>

View File

@ -21,7 +21,7 @@
GamepadItem: GamepadItem,
},
});
</script>
</script>
<style lang="scss">
.device-list {

View File

@ -7,16 +7,16 @@
<nav class="menu-wrapper">
<ul class="navigation">
<li class="navigation__item">
<router-link to="/" class="navigation-item">Home</router-link>
<router-link to="/">Home</router-link>
</li>
<li class="navigation__item">
<router-link to="/faq" class="navigation-item">FAQ</router-link>
<router-link to="/faq">FAQ</router-link>
</li>
<li class="navigation__item">
<router-link to="/about" class="navigation-item">About</router-link>
<router-link to="/about">About</router-link>
</li>
<li class="navigation__item">
<router-link to="/donate" class="navigation-item">Donate</router-link>
<router-link to="/donate">Donate</router-link>
</li>
</ul>
</nav>

View File

@ -3,5 +3,8 @@ import App from '@/App.vue';
import router from '@/router';
import store from '@/store';
createApp(App).use(store).use(router).mount('#app');
createApp(App)
.use(store)
.use(router)
.mount('#app');

View File

@ -0,0 +1,36 @@
<script lang="ts">
import { defineComponent } from 'vue';
import store from '@/store/index';
import Vibrator from '@/models/Vibrator';
export default defineComponent({
name: 'ComputedGamepads',
data: () => {
return {
timestamp: 0 as number,
interval: 0 as number,
};
},
computed: {
gamepads: function (): Vibrator[] {
const timestamp: number = this.timestamp;
const result: Vibrator[] = store.getters.gamepads as Vibrator[];
result.forEach((item) => {
item.interval = timestamp;
});
return result;
},
},
methods: {
updateComputed: function (): void {
this.timestamp = Date.now();
},
},
mounted() {
this.interval = setInterval(this.updateComputed, 1);
},
unmounted() {
clearInterval(this.interval);
},
});
</script>

View File

@ -8,7 +8,7 @@ interface IVibrator {
isVibrating: boolean;
interval: number;
update(): void;
loop(pattern: TPatternUnit[]): void;
loop(pattern: TPatternUnit[]): Promise<void>;
vibrate(pattern: TPatternUnit): void;
reset(): void;
sleep(ms: number): Promise<number>;

View File

@ -24,7 +24,7 @@ class Vibrator implements IVibrator {
this.unit = gamepads[this.unit.index] as unknown as IGamepad;
}
async loop(pattern: TPatternUnit[]) {
async loop(pattern: TPatternUnit[]): Promise<void> {
this.isVibrating = true;
const offsetTime = 10;
while (this.isVibrating === true) {

View File

@ -0,0 +1,21 @@
const meta = {
title: 'Wavelovers Page not found',
metaTags: [
{
name: 'og:title',
content: 'Wavelovers Page not found',
},
{
name: 'og:url',
content: 'https://wavelovers.ru/404',
},
],
linkTags: [
{
rel: 'canonical',
href: 'https://wavelovers.ru/404',
},
],
};
export default meta;

View File

@ -0,0 +1,41 @@
const 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',
},
],
};
export default meta;

View File

@ -0,0 +1,41 @@
const 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',
},
],
};
export default meta;

View File

@ -0,0 +1,41 @@
const 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',
},
],
};
export default meta;

View File

@ -0,0 +1,41 @@
const 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',
},
],
};
export default meta;

View File

@ -0,0 +1,41 @@
const 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',
},
],
};
export default meta;

View File

@ -0,0 +1,41 @@
const 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',
},
],
};
export default meta;

View File

@ -0,0 +1,41 @@
const 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/',
},
],
};
export default meta;

View File

@ -0,0 +1,30 @@
import IQueryRoute from '@/router/models/IQueryRoute';
const queries: Array<IQueryRoute> = [
{
query: '/?custom',
path: '/custom',
},
{
query: '/?manual',
path: '/manual',
},
{
query: '/?diagnostic',
path: '/diagnostic',
},
{
query: '/?faq',
path: '/faq',
},
{
query: '/?about',
path: '/about',
},
{
query: '/?donate',
path: '/donate',
}
];
export default queries;

View File

@ -0,0 +1,66 @@
import { RouteRecordRaw } from 'vue-router';
import metaPatterns from '@/router/assets/metas/Patterns';
import metaCustom from '@/router/assets/metas/Custom';
import metaManual from '@/router/assets/metas/Manual';
import metaDiagnostic from '@/router/assets/metas/Diagnostic';
import metaFaq from '@/router/assets/metas/Faq';
import metaAbout from '@/router/assets/metas/About';
import metaDonate from '@/router/assets/metas/Donate';
import meta404 from '@/router/assets/metas/404';
const routes: Array<RouteRecordRaw> = [
{
path: '/',
name: 'patterns-view',
component: () => import('@/views/PatternsView.vue'),
meta: metaPatterns,
},
{
path: '/custom',
name: 'custom-view',
component: () => import('@/views/CustomView.vue'),
meta: metaCustom,
},
{
path: '/manual',
name: 'manual-view',
component: () => import('@/views/ManualView.vue'),
meta: metaManual,
},
{
path: '/diagnostic',
name: 'diagnostic-view',
component: () => import('@/views/DiagnosticView.vue'),
meta: metaDiagnostic,
},
{
path: '/faq',
name: 'faq-view',
component: () => import('@/views/FaqView.vue'),
meta: metaFaq,
},
{
path: '/about',
name: 'about-view',
component: () => import('@/views/AboutView.vue'),
meta: metaAbout,
},
{
path: '/donate',
name: 'donate-view',
component: () => import('@/views/DonateView.vue'),
meta: metaDonate,
},
{
path: '/404',
name: '404',
component: () => import('@/views/NotFoundView.vue'),
meta: meta404,
},
{
path: '/:catchAll(.*)*',
redirect: '/404',
},
];
export default routes;

View File

@ -1,354 +1,25 @@
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import PatternsView from '@/views/PatternsView.vue';
import {
createRouter, createWebHistory,
NavigationGuardNext, RouteLocationNormalized
} from 'vue-router';
import QueryRouter from '@/router/modules/QueryRouter';
import MetaTagUpdater from '@/router/modules/MetaTagUpdater';
const routes: Array<RouteRecordRaw> = [
{
path: '/',
name: 'patterns-view',
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',
name: 'manual-view',
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',
name: 'diagnostic-view',
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',
name: '404',
component: () => import('@/views/NotFoundView.vue'),
meta: {
title: 'Wavelovers Page not found',
metaTags: [
{
name: 'og:title',
content: 'Wavelovers Page not found',
},
{
name: 'og:url',
content: 'https://wavelovers.ru/404',
},
],
linkTags: [
{
rel: 'canonical',
href: 'https://wavelovers.ru/404',
},
],
},
},
{
path: '/:catchAll(.*)*',
redirect: '/404',
},
];
import routes from '@/router/assets/routes';
import queries from '@/router/assets/queries';
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes,
});
router.beforeEach(QueryRouter.update);
router.beforeEach(MetaTagUpdater.update);
router.beforeEach((
to: RouteLocationNormalized,
from: RouteLocationNormalized,
next: NavigationGuardNext
) => {
QueryRouter.update(to, from, next, router, queries);
MetaTagUpdater.update(to, from, next)
});
export default router;

View File

@ -0,0 +1,6 @@
interface IQueryRoute {
query: string;
path: string;
}
export default IQueryRoute;

View File

@ -1,4 +1,6 @@
import { NavigationGuardNext, RouteLocationNormalized, RouteRecordNormalized } from "vue-router";
import {
NavigationGuardNext, RouteLocationNormalized, RouteRecordNormalized
} from "vue-router";
function appendTags(tagsArray: object[], type: string) {
tagsArray.map((meta: object) => {

View File

@ -1,31 +1,20 @@
import router from '@/router';
import { NavigationGuardNext, RouteLocationNormalized } from "vue-router";
import {
Router, NavigationGuardNext, RouteLocationNormalized
} from "vue-router";
import IQueryRoute from '@/router/models/IQueryRoute';
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;
next: NavigationGuardNext,
router: Router,
routes: Array<IQueryRoute>
): void {
routes.forEach((route) => {
if (route.query === to.fullPath) {
router.push(route.path);
}
});
return next();
}

View File

@ -1,8 +1,40 @@
<template>
<h1 class="visually-hidden">Wavelovers About</h1>
<div>
<div class="content-item">
<h2 class="content-item__header">About</h2>
<article class="content-item">
<h2 class="content-item__header">Wavelovers</h2>
<p>
Wavelovers is an assistant in relaxation, elimination of muscle pain and
other relaxing, wellness procedures, or simply a tester of the performance
of the gamepad, its buttons and vibration.
</p>
<br />
<p>
Wavelovers is free to use worldwide, in every corner of the planet,
all you need is a gamepad with vibration.
</p>
</article>
<article class="content-item">
<h2 class="content-item__header">About the effects of use</h2>
<span>A dozen reasons to make friends with the Wavelovers vibration stimulator:</span>
<ol class="list">
<li>Reduces the risk of stroke.</li>
<li>Headaches and migraines are reduced.</li>
<li>Pain syndromes accompanying osteochondrosis and muscle pain are reduced.</li>
<li>Noise in the ears and numbness of the fingers pass.</li>
<li>Memory and vision improve, emotional state normalizes.</li>
<li>The work of muscles and blood vessels is normalized, blood circulation improves.</li>
<li>Meteorological dependence decreases.</li>
<li>Improves overall well-being and sleep, increases efficiency.</li>
<li>The ability to jump to the height of one's own height.</li>
<li>After training, the ability to fly and breathe underwater for up to an hour.</li>
<li>Gradual transformation into a superman. Walking through walls, cat vision, regeneration.</li>
<li>The ability to see the future and travel through time and to other galaxies.</li>
</ol>
<span>P.S. The list is based on reviews, has not been verified by experts, and may not reflect reality. Don't take it for granted.</span>
</article>
<article class="content-item">
<h2 class="content-item__header">Author</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>
@ -10,12 +42,12 @@
<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">
</article>
<article 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>
</article>
</div>
</template>
@ -27,3 +59,9 @@
});
</script>
<style>
.list > li {
margin-bottom: 4px;
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<h1 class="visually-hidden">Wavelovers Donate</h1>
<div>
<div class="content-item">
<article 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 />
@ -16,7 +16,7 @@
</p><br />
<span>Bitcoin: </span>
<a href="bitcoin:bc1qspzgj7xrf099s2ej8f5zmm52xu0wkfurpezny5" target="_blank" class="link_hash">bc1qspzgj7xrf099s2ej8f5zmm52xu0wkfurpezny5</a><br />
</div>
</article>
</div>
</template>
@ -28,3 +28,9 @@
});
</script>
<style>
.link_hash {
word-break: break-all;
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<h1 class="visually-hidden">Wavelovers FAQ</h1>
<div>
<div class="content-item">
<article class="content-item">
<h2 class="content-item__header">FAQ</h2>
<dl>
<dt>What is the purpose of this software?</dt>
@ -13,8 +13,8 @@
<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">
</article>
<article 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 />
@ -26,8 +26,8 @@
<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">
</article>
<article class="content-item">
<h2 class="content-item__header">System Requirements</h2>
<dl>
<dt>Gamepad:</dt>
@ -37,7 +37,7 @@
<dt>Operating System:</dt>
<dd>Windows 7 or higher recommended.</dd>
</dl>
</div>
</article>
</div>
</template>