mirror of
https://github.com/eugene-serb/wavelovers.git
synced 2023-09-09 23:41:16 +03:00
commit
534d2a1c82
32
.eslintrc.js
32
.eslintrc.js
@ -1,19 +1,19 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
env: {
|
||||
node: true,
|
||||
},
|
||||
'extends': [
|
||||
'plugin:vue/vue3-essential',
|
||||
'eslint:recommended',
|
||||
'@vue/typescript/recommended',
|
||||
],
|
||||
parserOptions: {
|
||||
ecmaVersion: 2020,
|
||||
},
|
||||
rules: {
|
||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
},
|
||||
root: true,
|
||||
env: {
|
||||
node: true,
|
||||
},
|
||||
'extends': [
|
||||
'plugin:vue/vue3-essential',
|
||||
'eslint:recommended',
|
||||
'@vue/typescript/recommended',
|
||||
],
|
||||
parserOptions: {
|
||||
ecmaVersion: 2020,
|
||||
},
|
||||
rules: {
|
||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
},
|
||||
};
|
||||
|
||||
|
14
README.md
14
README.md
@ -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.
|
||||
***/docs/*** – production build. <br />
|
||||
***/(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)*
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
'@vue/cli-plugin-babel/preset',
|
||||
],
|
||||
presets: [
|
||||
'@vue/cli-plugin-babel/preset',
|
||||
],
|
||||
};
|
||||
|
||||
|
137
docs/404.md
137
docs/404.md
@ -1,82 +1,83 @@
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<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="#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="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
<meta 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="#4ECBD9" />
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#087E8B" />
|
||||
<meta name="color-scheme" content="light dark" />
|
||||
<link rel="canonical" href="https://wavelovers.ru/404" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<style type="text/css">
|
||||
div.markdown-body > h1, div.footer {
|
||||
display: none;
|
||||
}
|
||||
<style type="text/css">
|
||||
div.markdown-body > h1, div.footer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 360px) {
|
||||
.px-3 {
|
||||
padding-right: 0 !important;
|
||||
padding-left: 0 !important;
|
||||
}
|
||||
.my-5 {
|
||||
margin-top: 0 !important;
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width: 360px) {
|
||||
.px-3 {
|
||||
padding-right: 0 !important;
|
||||
padding-left: 0 !important;
|
||||
}
|
||||
|
||||
.banner-container {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
}
|
||||
.my-5 {
|
||||
margin-top: 0 !important;
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.banner {
|
||||
margin: auto;
|
||||
padding: 16px;
|
||||
}
|
||||
</style>
|
||||
.banner-container {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() { dataLayer.push(arguments); }
|
||||
gtag('js', new Date());
|
||||
.banner {
|
||||
margin: auto;
|
||||
padding: 16px;
|
||||
}
|
||||
</style>
|
||||
|
||||
gtag('config', 'G-59FM5E4MVD');
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript">
|
||||
(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() { dataLayer.push(arguments); }
|
||||
gtag('js', new Date());
|
||||
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});
|
||||
</script>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
gtag('config', 'G-59FM5E4MVD');
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript">
|
||||
(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});
|
||||
</script>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
</head>
|
||||
<body>
|
||||
<section class="banner-container">
|
||||
<div class="banner">
|
||||
<h1>404</h1>
|
||||
<span>File not found. Please, go to the </span><a href="https://wavelovers.ru/" target="_self">homepage</a><br />
|
||||
<span>Contact me </span><a href="https://t.me/eugene_serb/" target="_blank">@eugene_serb</a>
|
||||
</div>
|
||||
</section>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
<section class="banner-container">
|
||||
<div class="banner">
|
||||
<h1>404</h1>
|
||||
<span>File not found. Please, go to the </span><a href="https://wavelovers.ru/" target="_self">homepage</a><br />
|
||||
<span>Contact me </span><a href="https://t.me/eugene_serb/" target="_blank">@eugene_serb</a>
|
||||
</div>
|
||||
</section>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -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.
|
||||
***/docs/*** – production build. <br />
|
||||
***/(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)*
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?about" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?about" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
1
docs/css/219.c3fb6094.css
Normal file
1
docs/css/219.c3fb6094.css
Normal 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}}
|
1
docs/css/582.266e2dcc.css
Normal file
1
docs/css/582.266e2dcc.css
Normal 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
1
docs/css/66.bb6440f7.css
Normal file
@ -0,0 +1 @@
|
||||
.link_hash{word-break:break-all}
|
1
docs/css/672.278b2bb3.css
Normal file
1
docs/css/672.278b2bb3.css
Normal file
@ -0,0 +1 @@
|
||||
.list>li{margin-bottom:4px}
|
1
docs/css/709.ef4a4981.css
Normal file
1
docs/css/709.ef4a4981.css
Normal 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}}
|
@ -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}}
|
1
docs/css/807.d84ba812.css
Normal file
1
docs/css/807.d84ba812.css
Normal 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}}
|
@ -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)}
|
@ -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}}
|
@ -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}
|
@ -1,6 +1,6 @@
|
||||
/* ------------------------------ */
|
||||
/* Wavelovers styles */
|
||||
/* version: dated 2022.08.12 */
|
||||
/* version: dated 2022.08.29 */
|
||||
/* author: Eugene Serb */
|
||||
/* ------------------------------ */
|
||||
|
||||
@ -12,124 +12,124 @@
|
||||
/* ------------------------------ */
|
||||
|
||||
:root {
|
||||
/* Simple colors */
|
||||
--color-white: #FFFFFF;
|
||||
--color-black: #000000;
|
||||
--color-milk: #F5F5F5;
|
||||
--color-coal: #3C3C3C;
|
||||
/* ---------------------- */
|
||||
/* Palette of five colors */
|
||||
--color-a: #E27396;
|
||||
--color-b: #EA9AB2;
|
||||
--color-c: #EFCFE3;
|
||||
--color-d: #EAF2D7;
|
||||
--color-e: #B3DEE2;
|
||||
/* Simple colors */
|
||||
--color-white: #FFFFFF;
|
||||
--color-black: #000000;
|
||||
--color-milk: #F5F5F5;
|
||||
--color-coal: #3C3C3C;
|
||||
/* ---------------------- */
|
||||
/* Palette of five colors */
|
||||
--color-a: #E27396;
|
||||
--color-b: #EA9AB2;
|
||||
--color-c: #EFCFE3;
|
||||
--color-d: #EAF2D7;
|
||||
--color-e: #B3DEE2;
|
||||
}
|
||||
|
||||
:root {
|
||||
/* Base numbers */
|
||||
--number-border-radius: 8px;
|
||||
--number-border-size: 2px;
|
||||
/* Base numbers */
|
||||
--number-border-radius: 8px;
|
||||
--number-border-size: 2px;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
/* Base colors */
|
||||
--color-border: var(--color-a);
|
||||
--color-background: var(--color-white);
|
||||
--color-text: var(--color-coal);
|
||||
--color-text-header: var(--color-coal);
|
||||
--color-link: var(--color-b);
|
||||
--color-link-hover: var(--color-a);
|
||||
--color-selection: var(--color-b);
|
||||
--color-fieldset-border: var(--color-c);
|
||||
--color-table-header-background: var(--color-b);
|
||||
--color-table-header-text: var(--color-white);
|
||||
--color-table-item: var(--color-c);
|
||||
/* Components colors */
|
||||
--color-header-background: var(--color-b);
|
||||
--color-header-borderline: var(--color-a);
|
||||
--color-header-selection: var(--color-a);
|
||||
--color-header-logo: var(--color-white);
|
||||
--color-header-navigation-link: var(--color-white);
|
||||
--color-header-navigation-link-hover: var(--color-white);
|
||||
--color-footer-borderline: var(--color-a);
|
||||
--color-footer-text: var(--color-coal);
|
||||
--color-content-item-background: var(--color-milk);
|
||||
--color-pattern-button: var(--color-c);
|
||||
--color-pattern-text: var(--color-white);
|
||||
}
|
||||
:root {
|
||||
/* Base colors */
|
||||
--color-border: var(--color-a);
|
||||
--color-background: var(--color-white);
|
||||
--color-text: var(--color-coal);
|
||||
--color-text-header: var(--color-coal);
|
||||
--color-link: var(--color-b);
|
||||
--color-link-hover: var(--color-a);
|
||||
--color-selection: var(--color-b);
|
||||
--color-fieldset-border: var(--color-c);
|
||||
--color-table-header-background: var(--color-b);
|
||||
--color-table-header-text: var(--color-white);
|
||||
--color-table-item: var(--color-c);
|
||||
/* Components colors */
|
||||
--color-header-background: var(--color-b);
|
||||
--color-header-borderline: var(--color-a);
|
||||
--color-header-selection: var(--color-a);
|
||||
--color-header-logo: var(--color-white);
|
||||
--color-header-navigation-link: var(--color-white);
|
||||
--color-header-navigation-link-hover: var(--color-white);
|
||||
--color-footer-borderline: var(--color-a);
|
||||
--color-footer-text: var(--color-coal);
|
||||
--color-content-item-background: var(--color-milk);
|
||||
--color-pattern-button: var(--color-c);
|
||||
--color-pattern-text: var(--color-white);
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
/* Base colors */
|
||||
--color-border: var(--color-a);
|
||||
--color-background: var(--color-coal);
|
||||
--color-text: var(--color-coal);
|
||||
--color-text-header: var(--color-coal);
|
||||
--color-link: var(--color-b);
|
||||
--color-link-hover: var(--color-a);
|
||||
--color-selection: var(--color-b);
|
||||
--color-fieldset-border: var(--color-c);
|
||||
--color-table-header-background: var(--color-b);
|
||||
--color-table-header-text: var(--color-white);
|
||||
--color-table-item: var(--color-c);
|
||||
/* Components colors */
|
||||
--color-header-background: var(--color-a);
|
||||
--color-header-borderline: var(--color-b);
|
||||
--color-header-selection: var(--color-b);
|
||||
--color-header-logo: var(--color-white);
|
||||
--color-header-navigation-link: var(--color-white);
|
||||
--color-header-navigation-link-hover: var(--color-white);
|
||||
--color-footer-borderline: var(--color-a);
|
||||
--color-footer-text: var(--color-milk);
|
||||
--color-content-item-background: var(--color-c);
|
||||
--color-pattern-button: var(--color-milk);
|
||||
--color-pattern-text: var(--color-black);
|
||||
}
|
||||
:root {
|
||||
/* Base colors */
|
||||
--color-border: var(--color-a);
|
||||
--color-background: var(--color-coal);
|
||||
--color-text: var(--color-coal);
|
||||
--color-text-header: var(--color-coal);
|
||||
--color-link: var(--color-b);
|
||||
--color-link-hover: var(--color-a);
|
||||
--color-selection: var(--color-b);
|
||||
--color-fieldset-border: var(--color-c);
|
||||
--color-table-header-background: var(--color-b);
|
||||
--color-table-header-text: var(--color-white);
|
||||
--color-table-item: var(--color-c);
|
||||
/* Components colors */
|
||||
--color-header-background: var(--color-a);
|
||||
--color-header-borderline: var(--color-b);
|
||||
--color-header-selection: var(--color-b);
|
||||
--color-header-logo: var(--color-white);
|
||||
--color-header-navigation-link: var(--color-white);
|
||||
--color-header-navigation-link-hover: var(--color-white);
|
||||
--color-footer-borderline: var(--color-a);
|
||||
--color-footer-text: var(--color-milk);
|
||||
--color-content-item-background: var(--color-c);
|
||||
--color-pattern-button: var(--color-milk);
|
||||
--color-pattern-text: var(--color-black);
|
||||
}
|
||||
}
|
||||
|
||||
*, ::after, ::before {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: 'Roboto', sans-serif;
|
||||
direction: ltr;
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
direction: ltr;
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
min-height: 100vh;
|
||||
background: var(--color-background);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
min-height: 100vh;
|
||||
background: var(--color-background);
|
||||
}
|
||||
|
||||
::selection {
|
||||
background: var(--color-selection);
|
||||
background: var(--color-selection);
|
||||
}
|
||||
|
||||
:focus {
|
||||
border-bottom: 2px solid var(--color-selection);
|
||||
border-bottom: 2px solid var(--color-selection);
|
||||
}
|
||||
|
||||
:focus-visible {
|
||||
outline: 2px solid var(--color-selection);
|
||||
border-color: transparent;
|
||||
outline: 2px solid var(--color-selection);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: var(--color-text-header);
|
||||
font-weight: 500;
|
||||
margin-block-start: 0.382em;
|
||||
margin-block-end: 0.618em;
|
||||
line-height: 1.382em;
|
||||
color: var(--color-text-header);
|
||||
font-weight: 500;
|
||||
margin-block-start: 0.382em;
|
||||
margin-block-end: 0.618em;
|
||||
line-height: 1.382em;
|
||||
}
|
||||
|
||||
h1 { font-size: 2em; }
|
||||
@ -142,47 +142,50 @@ big { font-size: larger; }
|
||||
small { font-size: smaller; }
|
||||
|
||||
span, p, article, blockquote {
|
||||
color: var(--color-text);
|
||||
font-weight: 300;
|
||||
color: var(--color-text);
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
ol, ul {
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding: 16px;
|
||||
list-style-type: circle;
|
||||
list-style-type: circle;
|
||||
}
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
border-bottom: 2px solid transparent;
|
||||
font-weight: 500;
|
||||
color: var(--color-link);
|
||||
text-decoration: none;
|
||||
background-color: transparent;
|
||||
border-bottom: 2px solid transparent;
|
||||
font-weight: 500;
|
||||
color: var(--color-link);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
border-bottom: 2px solid var(--color-link-hover);
|
||||
color: var(--color-link-hover);
|
||||
transition: all 0.5s ease;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
border-bottom: 2px solid var(--color-link-hover);
|
||||
color: var(--color-link-hover);
|
||||
transition: all 0.5s ease;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
dl dd:last-child {
|
||||
margin-bottom: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
margin-bottom: 4px;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
font-style: oblique;
|
||||
margin-bottom: 4px;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
font-style: oblique;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 16px;
|
||||
padding-left: 16px;
|
||||
font-size: 16px;
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
margin-bottom: 16px;
|
||||
padding-left: 16px;
|
||||
font-size: 16px;
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* ----- */
|
||||
@ -190,189 +193,190 @@ dd {
|
||||
/* ----- */
|
||||
|
||||
hr {
|
||||
margin-block-start: 0.5em;
|
||||
margin-block-end: 0.5em;
|
||||
margin-block-start: 0.5em;
|
||||
margin-block-end: 0.5em;
|
||||
}
|
||||
|
||||
legend {
|
||||
padding: 2px 4px;
|
||||
text-align: left;
|
||||
padding: 2px 4px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
border: 2px solid var(--color-border-alpha);
|
||||
border-radius: var(--number-border-radius);
|
||||
padding: 8px;
|
||||
border: 2px solid var(--color-border-alpha);
|
||||
border-radius: var(--number-border-radius);
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
button, textarea, select, input {
|
||||
padding: 4px 8px;
|
||||
border: 2px solid var(--color-link);
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-milk);
|
||||
color: var(--color-text);
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
white-space: nowrap;
|
||||
padding: 4px 8px;
|
||||
border: 2px solid var(--color-link);
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-milk);
|
||||
color: var(--color-text);
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
button:hover, input:hover,
|
||||
textarea:hover, select:hover {
|
||||
border: 2px solid var(--color-link-hover);
|
||||
transition: all 0.5s ease;
|
||||
}
|
||||
|
||||
button:hover, input:hover,
|
||||
textarea:hover, select:hover {
|
||||
border: 2px solid var(--color-link-hover);
|
||||
transition: all 0.5s ease;
|
||||
}
|
||||
|
||||
option {
|
||||
background: var(--color-background);
|
||||
color: var(--color-text);
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
background: var(--color-background);
|
||||
color: var(--color-text);
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
}
|
||||
|
||||
option:hover {
|
||||
background-color: var(--color-selection);
|
||||
color: var(--color-white);
|
||||
}
|
||||
option:hover {
|
||||
background-color: var(--color-selection);
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
input[type=range] {
|
||||
width: 100%;
|
||||
margin: 8px 0;
|
||||
padding: 4px 0;
|
||||
border: 0px solid var(--color-link);
|
||||
-webkit-appearance: none;
|
||||
width: 100%;
|
||||
margin: 8px 0;
|
||||
padding: 4px 0;
|
||||
border: 0px solid var(--color-link);
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
input[type=range]:hover {
|
||||
margin: 8px 0;
|
||||
padding: 4px 0;
|
||||
border: 0px solid var(--color-link-hover);
|
||||
}
|
||||
input[type=range]:hover {
|
||||
margin: 8px 0;
|
||||
padding: 4px 0;
|
||||
border: 0px solid var(--color-link-hover);
|
||||
}
|
||||
|
||||
input[type=range]:focus {
|
||||
outline: none;
|
||||
}
|
||||
input[type=range]:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
input[type=range]::-webkit-slider-runnable-track {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
cursor: pointer;
|
||||
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
|
||||
background: var(--color-b);
|
||||
border-radius: 8px;
|
||||
border: 0px solid #000101;
|
||||
}
|
||||
input[type=range]::-webkit-slider-runnable-track {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
border: 0px solid #000101;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
|
||||
background: var(--color-b);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
input[type=range]::-webkit-slider-thumb {
|
||||
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
|
||||
border: 0px solid #000000;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
border-radius: 8px;
|
||||
background: var(--color-a);
|
||||
cursor: pointer;
|
||||
-webkit-appearance: none;
|
||||
margin-top: -4px;
|
||||
}
|
||||
input[type=range]::-webkit-slider-thumb {
|
||||
-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;
|
||||
}
|
||||
|
||||
input[type=range]:focus::-webkit-slider-runnable-track {
|
||||
background: var(--color-b);
|
||||
}
|
||||
input[type=range]:focus::-webkit-slider-runnable-track {
|
||||
background: var(--color-b);
|
||||
}
|
||||
|
||||
input[type=range]::-moz-range-track {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
cursor: pointer;
|
||||
animate: 0.2s;
|
||||
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
|
||||
background: var(--color-b);
|
||||
border-radius: 8px;
|
||||
border: 0px solid #000101;
|
||||
}
|
||||
input[type=range]::-moz-range-track {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
border: 0px solid #000101;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
|
||||
background: var(--color-b);
|
||||
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;
|
||||
border-radius: 8px;
|
||||
background: var(--color-a);
|
||||
cursor: pointer;
|
||||
}
|
||||
input[type=range]::-moz-range-thumb {
|
||||
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;
|
||||
}
|
||||
|
||||
input[type=range]::-ms-track {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
cursor: pointer;
|
||||
animate: 0.2s;
|
||||
background: transparent;
|
||||
border-color: transparent;
|
||||
border-width: 8px 0;
|
||||
color: transparent;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
input[type=range]::-ms-fill-lower {
|
||||
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;
|
||||
}
|
||||
input[type=range]::-ms-fill-upper {
|
||||
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;
|
||||
border-radius: 8px;
|
||||
background: var(--color-a);
|
||||
cursor: pointer;
|
||||
}
|
||||
input[type=range]::-ms-thumb {
|
||||
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;
|
||||
}
|
||||
|
||||
input[type=range]:focus::-ms-fill-lower {
|
||||
background: var(--color-b);
|
||||
}
|
||||
input[type=range]:focus::-ms-fill-lower {
|
||||
background: var(--color-b);
|
||||
}
|
||||
|
||||
input[type=range]:focus::-ms-fill-upper {
|
||||
background: var(--color-b);
|
||||
}
|
||||
input[type=range]:focus::-ms-fill-upper {
|
||||
background: var(--color-b);
|
||||
}
|
||||
|
||||
/* ------ */
|
||||
/* TABLES */
|
||||
/* ------ */
|
||||
|
||||
table, th, td {
|
||||
width: 100%;
|
||||
padding: 8px;
|
||||
border-collapse: collapse;
|
||||
table-layout: fixed;
|
||||
font-weight: 400;
|
||||
width: 100%;
|
||||
padding: 8px;
|
||||
border-collapse: collapse;
|
||||
table-layout: fixed;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.table_pink thead {
|
||||
border-bottom: 4px solid var(--color-table-item);
|
||||
border-bottom: 4px solid var(--color-table-item);
|
||||
}
|
||||
|
||||
.table_pink thead > tr {
|
||||
background-color: var(--color-table-header-background);
|
||||
color: var(--color-table-header-text);
|
||||
.table_pink thead > tr {
|
||||
background-color: var(--color-table-header-background);
|
||||
color: var(--color-table-header-text);
|
||||
}
|
||||
|
||||
.table_pink thead > tr > th {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.table_pink thead > tr > th {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.table_pink tbody > tr:nth-child(even) {
|
||||
background-color: var(--color-table-item);
|
||||
color: var(--color-white);
|
||||
background-color: var(--color-table-item);
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
.table_pink tfoot {
|
||||
border-top: 4px solid var(--color-table-header-background);
|
||||
border-top: 4px solid var(--color-table-header-background);
|
||||
}
|
||||
|
||||
/* ------------- */
|
||||
@ -380,28 +384,28 @@ table, th, td {
|
||||
/* ------------- */
|
||||
|
||||
.hidden {
|
||||
display: none !important;
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.visually-hidden {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
clip-path: inset(100%);
|
||||
clip: rect(0 0 0 0);
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
clip-path: inset(100%);
|
||||
clip: rect(0 0 0 0);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100%;
|
||||
max-width: 1080px;
|
||||
margin: 0 auto;
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
width: 100%;
|
||||
max-width: 1080px;
|
||||
margin: 0 auto;
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
/* ----------------- */
|
||||
@ -413,10 +417,10 @@ table, th, td {
|
||||
/* --- */
|
||||
|
||||
.app {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
/* ---- */
|
||||
@ -424,16 +428,16 @@ table, th, td {
|
||||
/* ---- */
|
||||
|
||||
.page {
|
||||
flex-grow: 1;
|
||||
margin-top: 32px;
|
||||
margin-bottom: 32px;
|
||||
flex-grow: 1;
|
||||
margin-top: 32px;
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.page {
|
||||
margin-top: 64px;
|
||||
margin-bottom: 64px;
|
||||
}
|
||||
.page {
|
||||
margin-top: 64px;
|
||||
margin-bottom: 64px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ---- */
|
||||
@ -441,12 +445,12 @@ table, th, td {
|
||||
/* ---- */
|
||||
|
||||
.post {
|
||||
margin: 0 auto;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.post__header {
|
||||
text-align: center;
|
||||
margin-block-end: 32px;
|
||||
text-align: center;
|
||||
margin-block-end: 32px;
|
||||
}
|
||||
|
||||
/* ------- */
|
||||
@ -455,42 +459,33 @@ table, th, td {
|
||||
|
||||
|
||||
.content {
|
||||
margin-bottom: 64px;
|
||||
margin-bottom: 64px;
|
||||
}
|
||||
|
||||
.content__header {
|
||||
margin-top: 0;
|
||||
margin-bottom: 32px;
|
||||
padding-left: 16px;
|
||||
border: 2px solid var(--color-content-borderline);
|
||||
border-radius: var(--number-border-radius);
|
||||
color: var(--color-text-header);
|
||||
font-size: 1.8em;
|
||||
margin-top: 0;
|
||||
margin-bottom: 32px;
|
||||
padding-left: 16px;
|
||||
border: 2px solid var(--color-content-borderline);
|
||||
border-radius: var(--number-border-radius);
|
||||
color: var(--color-text-header);
|
||||
font-size: 1.8em;
|
||||
}
|
||||
|
||||
.content-item {
|
||||
margin-bottom: 16px;
|
||||
padding: 16px;
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-content-item-background);
|
||||
margin-bottom: 16px;
|
||||
padding: 16px;
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-content-item-background);
|
||||
}
|
||||
|
||||
.content-item__header {
|
||||
margin-bottom: 16px;
|
||||
text-align: center;
|
||||
}
|
||||
.content-item__header {
|
||||
margin-bottom: 16px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.content-item {
|
||||
padding: 32px;
|
||||
}
|
||||
.content-item {
|
||||
padding: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ----- */
|
||||
/* PAGES */
|
||||
/* ----- */
|
||||
|
||||
.link_hash {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?custom" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?custom" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?diagnostic" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?diagnostic" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?donate" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?donate" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?faq" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?faq" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -1,18 +1,18 @@
|
||||
<!doctype html><html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml"><head><title>Wavelovers</title><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" media="(prefers-color-scheme: light)" content="#EA9AB2"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#E27396"/><meta name="color-scheme" content="light dark"/><meta name="robots" content="all"/><meta name="author" content="Eugene Serb"/><meta name="copyright" content="Wavelovers, 2022"/><meta name="publisher-email" content="eugene.serb@gmail.com"/><meta name="publisher-url" content="https://eugene-serb.github.io/"/><meta property="og:locale" content="en_US"/><meta property="og:type" content="website"/><meta property="og:site_name" content="Wavelovers"/><meta property="og:image" content="https://wavelovers.ru/img/og.png"/><meta property="vk:image" content="https://wavelovers.ru/img/og.png"/><meta name="twitter:card" content="summary"/><meta name="twitter:creator" content="@eugene_serb"/><meta name="twitter:image" content="https://wavelovers.ru/img/og.png"/><link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico"/><link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png"/><link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png"/><link rel="manifest" href="https://wavelovers.ru/site.webmanifest"/><link rel="stylesheet" href="/css/styles.css"/><script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script><script>window.dataLayer = window.dataLayer || [];
|
||||
function gtag() { dataLayer.push(arguments); }
|
||||
gtag('js', new Date());
|
||||
<!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());
|
||||
|
||||
gtag('config', 'G-59FM5E4MVD');</script><script>(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
gtag('config', 'G-59FM5E4MVD');</script><script>(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});</script><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>
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});</script><style>[v-cloak] {
|
||||
display: none;
|
||||
}</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
2
docs/js/219.2a2a502d.js
Normal 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
|
1
docs/js/219.2a2a502d.js.map
Normal file
1
docs/js/219.2a2a502d.js.map
Normal file
File diff suppressed because one or more lines are too long
@ -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
|
@ -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":""}
|
@ -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
|
@ -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":""}
|
@ -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'm having problems with the app or connecting my device to the app?</dt><dd>Go to Troubleshooting.</dd></dl></div><div class="content-item"><h2 class="content-item__header">Troubleshooting</h2><span>If you are having difficulty detecting a gamepad by the browser, you can use the utility </span><a href="https://wavelovers.ru/diagnostic" target="_blank">Wavelovers Diagnostic</a><br><br><dl><dt>The app does not see my device.</dt><dd>Make sure you have a chromium-based browser, then update the app and reconnect your device.</dd><dt>The application sees the gamepad, but writes that the vibration actuator is missing.</dt><dd>This problem is specific to mozilla firefox browser and d-input mode. Check the system requirements before using the software.</dd><dt>My question is not here.</dt><dd>Write me <a href="mailto:eugene.serb@gmail.com" target="_blank">eugene.serb@gmail.com</a></dd></dl></div><div class="content-item"><h2 class="content-item__header">System Requirements</h2><dl><dt>Gamepad:</dt><dd>X-Input and vibration actuator required.</dd><dt>Browser:</dt><dd>Google Chrome or any other Chromium-based browser is recommended.</dd><dt>Operating System:</dt><dd>Windows 7 or higher recommended.</dd></dl></div></div>',2);function o(e,t,d,a,o,r){return s}var r=(0,a.aZ)({name:"FaqView"}),i=d(89);const n=(0,i.Z)(r,[["render",o]]);var h=n}}]);
|
||||
//# sourceMappingURL=479.b4912f46.js.map
|
@ -1 +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'm having problems with the app or connecting my device to the app?</dt><dd>Go to Troubleshooting.</dd></dl></div><div class=\\\"content-item\\\"><h2 class=\\\"content-item__header\\\">Troubleshooting</h2><span>If you are having difficulty detecting a gamepad by the browser, you can use the utility </span><a href=\\\"https://wavelovers.ru/diagnostic\\\" target=\\\"_blank\\\">Wavelovers Diagnostic</a><br><br><dl><dt>The app does not see my device.</dt><dd>Make sure you have a chromium-based browser, then update the app and reconnect your device.</dd><dt>The application sees the gamepad, but writes that the vibration actuator is missing.</dt><dd>This problem is specific to mozilla firefox browser and d-input mode. Check the system requirements before using the software.</dd><dt>My question is not here.</dt><dd>Write me <a href=\\\"mailto:eugene.serb@gmail.com\\\" target=\\\"_blank\\\">eugene.serb@gmail.com</a></dd></dl></div><div class=\\\"content-item\\\"><h2 class=\\\"content-item__header\\\">System Requirements</h2><dl><dt>Gamepad:</dt><dd>X-Input and vibration actuator required.</dd><dt>Browser:</dt><dd>Google Chrome or any other Chromium-based browser is recommended.</dd><dt>Operating System:</dt><dd>Windows 7 or higher recommended.</dd></dl></div></div>\", 2)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return _hoisted_1\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'FaqView',\r\n });\r\n","import { render } from \"./FaqView.vue?vue&type=template&id=66f9e665&ts=true\"\nimport script from \"./FaqView.vue?vue&type=script&lang=ts\"\nexport * from \"./FaqView.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","_createStaticVNode","render","_ctx","_cache","$props","$setup","$data","$options","defineComponent","name","__exports__"],"sourceRoot":""}
|
@ -1,2 +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
|
@ -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
2
docs/js/582.a8f6467f.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/js/582.a8f6467f.js.map
Normal file
1
docs/js/582.a8f6467f.js.map
Normal file
File diff suppressed because one or more lines are too long
2
docs/js/645.b32a0b62.js
Normal file
2
docs/js/645.b32a0b62.js
Normal 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'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
|
1
docs/js/645.b32a0b62.js.map
Normal file
1
docs/js/645.b32a0b62.js.map
Normal 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'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
2
docs/js/66.54b2ec35.js
Normal 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
|
1
docs/js/66.54b2ec35.js.map
Normal file
1
docs/js/66.54b2ec35.js.map
Normal 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
2
docs/js/672.270ec4e0.js
Normal 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'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><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
|
1
docs/js/672.270ec4e0.js.map
Normal file
1
docs/js/672.270ec4e0.js.map
Normal 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'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><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
2
docs/js/709.b171ad0f.js
Normal 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
|
1
docs/js/709.b171ad0f.js.map
Normal file
1
docs/js/709.b171ad0f.js.map
Normal file
File diff suppressed because one or more lines are too long
@ -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
2
docs/js/807.d54b1ac1.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/js/807.d54b1ac1.js.map
Normal file
1
docs/js/807.d54b1ac1.js.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,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
2
docs/js/app.d0c8a9ec.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/js/app.d0c8a9ec.js.map
Normal file
1
docs/js/app.d0c8a9ec.js.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
14
docs/js/chunk-vendors.e296822d.js
Normal file
14
docs/js/chunk-vendors.e296822d.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/js/chunk-vendors.e296822d.js.map
Normal file
1
docs/js/chunk-vendors.e296822d.js.map
Normal file
File diff suppressed because one or more lines are too long
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?manual" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?manual" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -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>
|
||||
|
@ -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
932
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -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",
|
||||
|
137
public/404.md
137
public/404.md
@ -1,82 +1,83 @@
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<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="#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="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
<meta 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="#4ECBD9" />
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#087E8B" />
|
||||
<meta name="color-scheme" content="light dark" />
|
||||
<link rel="canonical" href="https://wavelovers.ru/404" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
<link rel="stylesheet" type="text/css" href="https://wavelovers.ru/css/styles.css" />
|
||||
|
||||
<style type="text/css">
|
||||
div.markdown-body > h1, div.footer {
|
||||
display: none;
|
||||
}
|
||||
<style type="text/css">
|
||||
div.markdown-body > h1, div.footer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 360px) {
|
||||
.px-3 {
|
||||
padding-right: 0 !important;
|
||||
padding-left: 0 !important;
|
||||
}
|
||||
.my-5 {
|
||||
margin-top: 0 !important;
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width: 360px) {
|
||||
.px-3 {
|
||||
padding-right: 0 !important;
|
||||
padding-left: 0 !important;
|
||||
}
|
||||
|
||||
.banner-container {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
}
|
||||
.my-5 {
|
||||
margin-top: 0 !important;
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.banner {
|
||||
margin: auto;
|
||||
padding: 16px;
|
||||
}
|
||||
</style>
|
||||
.banner-container {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() { dataLayer.push(arguments); }
|
||||
gtag('js', new Date());
|
||||
.banner {
|
||||
margin: auto;
|
||||
padding: 16px;
|
||||
}
|
||||
</style>
|
||||
|
||||
gtag('config', 'G-59FM5E4MVD');
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript">
|
||||
(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() { dataLayer.push(arguments); }
|
||||
gtag('js', new Date());
|
||||
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});
|
||||
</script>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
gtag('config', 'G-59FM5E4MVD');
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript">
|
||||
(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});
|
||||
</script>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
</head>
|
||||
<body>
|
||||
<section class="banner-container">
|
||||
<div class="banner">
|
||||
<h1>404</h1>
|
||||
<span>File not found. Please, go to the </span><a href="https://wavelovers.ru/" target="_self">homepage</a><br />
|
||||
<span>Contact me </span><a href="https://t.me/eugene_serb/" target="_blank">@eugene_serb</a>
|
||||
</div>
|
||||
</section>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
<section class="banner-container">
|
||||
<div class="banner">
|
||||
<h1>404</h1>
|
||||
<span>File not found. Please, go to the </span><a href="https://wavelovers.ru/" target="_self">homepage</a><br />
|
||||
<span>Contact me </span><a href="https://t.me/eugene_serb/" target="_blank">@eugene_serb</a>
|
||||
</div>
|
||||
</section>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/89252711" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -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.
|
||||
***/docs/*** – production build. <br />
|
||||
***/(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)*
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?about" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?about" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* ------------------------------ */
|
||||
/* Wavelovers styles */
|
||||
/* version: dated 2022.08.12 */
|
||||
/* version: dated 2022.08.29 */
|
||||
/* author: Eugene Serb */
|
||||
/* ------------------------------ */
|
||||
|
||||
@ -12,124 +12,124 @@
|
||||
/* ------------------------------ */
|
||||
|
||||
:root {
|
||||
/* Simple colors */
|
||||
--color-white: #FFFFFF;
|
||||
--color-black: #000000;
|
||||
--color-milk: #F5F5F5;
|
||||
--color-coal: #3C3C3C;
|
||||
/* ---------------------- */
|
||||
/* Palette of five colors */
|
||||
--color-a: #E27396;
|
||||
--color-b: #EA9AB2;
|
||||
--color-c: #EFCFE3;
|
||||
--color-d: #EAF2D7;
|
||||
--color-e: #B3DEE2;
|
||||
/* Simple colors */
|
||||
--color-white: #FFFFFF;
|
||||
--color-black: #000000;
|
||||
--color-milk: #F5F5F5;
|
||||
--color-coal: #3C3C3C;
|
||||
/* ---------------------- */
|
||||
/* Palette of five colors */
|
||||
--color-a: #E27396;
|
||||
--color-b: #EA9AB2;
|
||||
--color-c: #EFCFE3;
|
||||
--color-d: #EAF2D7;
|
||||
--color-e: #B3DEE2;
|
||||
}
|
||||
|
||||
:root {
|
||||
/* Base numbers */
|
||||
--number-border-radius: 8px;
|
||||
--number-border-size: 2px;
|
||||
/* Base numbers */
|
||||
--number-border-radius: 8px;
|
||||
--number-border-size: 2px;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
/* Base colors */
|
||||
--color-border: var(--color-a);
|
||||
--color-background: var(--color-white);
|
||||
--color-text: var(--color-coal);
|
||||
--color-text-header: var(--color-coal);
|
||||
--color-link: var(--color-b);
|
||||
--color-link-hover: var(--color-a);
|
||||
--color-selection: var(--color-b);
|
||||
--color-fieldset-border: var(--color-c);
|
||||
--color-table-header-background: var(--color-b);
|
||||
--color-table-header-text: var(--color-white);
|
||||
--color-table-item: var(--color-c);
|
||||
/* Components colors */
|
||||
--color-header-background: var(--color-b);
|
||||
--color-header-borderline: var(--color-a);
|
||||
--color-header-selection: var(--color-a);
|
||||
--color-header-logo: var(--color-white);
|
||||
--color-header-navigation-link: var(--color-white);
|
||||
--color-header-navigation-link-hover: var(--color-white);
|
||||
--color-footer-borderline: var(--color-a);
|
||||
--color-footer-text: var(--color-coal);
|
||||
--color-content-item-background: var(--color-milk);
|
||||
--color-pattern-button: var(--color-c);
|
||||
--color-pattern-text: var(--color-white);
|
||||
}
|
||||
:root {
|
||||
/* Base colors */
|
||||
--color-border: var(--color-a);
|
||||
--color-background: var(--color-white);
|
||||
--color-text: var(--color-coal);
|
||||
--color-text-header: var(--color-coal);
|
||||
--color-link: var(--color-b);
|
||||
--color-link-hover: var(--color-a);
|
||||
--color-selection: var(--color-b);
|
||||
--color-fieldset-border: var(--color-c);
|
||||
--color-table-header-background: var(--color-b);
|
||||
--color-table-header-text: var(--color-white);
|
||||
--color-table-item: var(--color-c);
|
||||
/* Components colors */
|
||||
--color-header-background: var(--color-b);
|
||||
--color-header-borderline: var(--color-a);
|
||||
--color-header-selection: var(--color-a);
|
||||
--color-header-logo: var(--color-white);
|
||||
--color-header-navigation-link: var(--color-white);
|
||||
--color-header-navigation-link-hover: var(--color-white);
|
||||
--color-footer-borderline: var(--color-a);
|
||||
--color-footer-text: var(--color-coal);
|
||||
--color-content-item-background: var(--color-milk);
|
||||
--color-pattern-button: var(--color-c);
|
||||
--color-pattern-text: var(--color-white);
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
/* Base colors */
|
||||
--color-border: var(--color-a);
|
||||
--color-background: var(--color-coal);
|
||||
--color-text: var(--color-coal);
|
||||
--color-text-header: var(--color-coal);
|
||||
--color-link: var(--color-b);
|
||||
--color-link-hover: var(--color-a);
|
||||
--color-selection: var(--color-b);
|
||||
--color-fieldset-border: var(--color-c);
|
||||
--color-table-header-background: var(--color-b);
|
||||
--color-table-header-text: var(--color-white);
|
||||
--color-table-item: var(--color-c);
|
||||
/* Components colors */
|
||||
--color-header-background: var(--color-a);
|
||||
--color-header-borderline: var(--color-b);
|
||||
--color-header-selection: var(--color-b);
|
||||
--color-header-logo: var(--color-white);
|
||||
--color-header-navigation-link: var(--color-white);
|
||||
--color-header-navigation-link-hover: var(--color-white);
|
||||
--color-footer-borderline: var(--color-a);
|
||||
--color-footer-text: var(--color-milk);
|
||||
--color-content-item-background: var(--color-c);
|
||||
--color-pattern-button: var(--color-milk);
|
||||
--color-pattern-text: var(--color-black);
|
||||
}
|
||||
:root {
|
||||
/* Base colors */
|
||||
--color-border: var(--color-a);
|
||||
--color-background: var(--color-coal);
|
||||
--color-text: var(--color-coal);
|
||||
--color-text-header: var(--color-coal);
|
||||
--color-link: var(--color-b);
|
||||
--color-link-hover: var(--color-a);
|
||||
--color-selection: var(--color-b);
|
||||
--color-fieldset-border: var(--color-c);
|
||||
--color-table-header-background: var(--color-b);
|
||||
--color-table-header-text: var(--color-white);
|
||||
--color-table-item: var(--color-c);
|
||||
/* Components colors */
|
||||
--color-header-background: var(--color-a);
|
||||
--color-header-borderline: var(--color-b);
|
||||
--color-header-selection: var(--color-b);
|
||||
--color-header-logo: var(--color-white);
|
||||
--color-header-navigation-link: var(--color-white);
|
||||
--color-header-navigation-link-hover: var(--color-white);
|
||||
--color-footer-borderline: var(--color-a);
|
||||
--color-footer-text: var(--color-milk);
|
||||
--color-content-item-background: var(--color-c);
|
||||
--color-pattern-button: var(--color-milk);
|
||||
--color-pattern-text: var(--color-black);
|
||||
}
|
||||
}
|
||||
|
||||
*, ::after, ::before {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: 'Roboto', sans-serif;
|
||||
direction: ltr;
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
direction: ltr;
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
min-height: 100vh;
|
||||
background: var(--color-background);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
min-height: 100vh;
|
||||
background: var(--color-background);
|
||||
}
|
||||
|
||||
::selection {
|
||||
background: var(--color-selection);
|
||||
background: var(--color-selection);
|
||||
}
|
||||
|
||||
:focus {
|
||||
border-bottom: 2px solid var(--color-selection);
|
||||
border-bottom: 2px solid var(--color-selection);
|
||||
}
|
||||
|
||||
:focus-visible {
|
||||
outline: 2px solid var(--color-selection);
|
||||
border-color: transparent;
|
||||
outline: 2px solid var(--color-selection);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: var(--color-text-header);
|
||||
font-weight: 500;
|
||||
margin-block-start: 0.382em;
|
||||
margin-block-end: 0.618em;
|
||||
line-height: 1.382em;
|
||||
color: var(--color-text-header);
|
||||
font-weight: 500;
|
||||
margin-block-start: 0.382em;
|
||||
margin-block-end: 0.618em;
|
||||
line-height: 1.382em;
|
||||
}
|
||||
|
||||
h1 { font-size: 2em; }
|
||||
@ -142,47 +142,50 @@ big { font-size: larger; }
|
||||
small { font-size: smaller; }
|
||||
|
||||
span, p, article, blockquote {
|
||||
color: var(--color-text);
|
||||
font-weight: 300;
|
||||
color: var(--color-text);
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
ol, ul {
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding: 16px;
|
||||
list-style-type: circle;
|
||||
list-style-type: circle;
|
||||
}
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
border-bottom: 2px solid transparent;
|
||||
font-weight: 500;
|
||||
color: var(--color-link);
|
||||
text-decoration: none;
|
||||
background-color: transparent;
|
||||
border-bottom: 2px solid transparent;
|
||||
font-weight: 500;
|
||||
color: var(--color-link);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
border-bottom: 2px solid var(--color-link-hover);
|
||||
color: var(--color-link-hover);
|
||||
transition: all 0.5s ease;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
border-bottom: 2px solid var(--color-link-hover);
|
||||
color: var(--color-link-hover);
|
||||
transition: all 0.5s ease;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
dl dd:last-child {
|
||||
margin-bottom: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
margin-bottom: 4px;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
font-style: oblique;
|
||||
margin-bottom: 4px;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
font-style: oblique;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 16px;
|
||||
padding-left: 16px;
|
||||
font-size: 16px;
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
margin-bottom: 16px;
|
||||
padding-left: 16px;
|
||||
font-size: 16px;
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* ----- */
|
||||
@ -190,189 +193,190 @@ dd {
|
||||
/* ----- */
|
||||
|
||||
hr {
|
||||
margin-block-start: 0.5em;
|
||||
margin-block-end: 0.5em;
|
||||
margin-block-start: 0.5em;
|
||||
margin-block-end: 0.5em;
|
||||
}
|
||||
|
||||
legend {
|
||||
padding: 2px 4px;
|
||||
text-align: left;
|
||||
padding: 2px 4px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
border: 2px solid var(--color-border-alpha);
|
||||
border-radius: var(--number-border-radius);
|
||||
padding: 8px;
|
||||
border: 2px solid var(--color-border-alpha);
|
||||
border-radius: var(--number-border-radius);
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
button, textarea, select, input {
|
||||
padding: 4px 8px;
|
||||
border: 2px solid var(--color-link);
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-milk);
|
||||
color: var(--color-text);
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
white-space: nowrap;
|
||||
padding: 4px 8px;
|
||||
border: 2px solid var(--color-link);
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-milk);
|
||||
color: var(--color-text);
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
button:hover, input:hover,
|
||||
textarea:hover, select:hover {
|
||||
border: 2px solid var(--color-link-hover);
|
||||
transition: all 0.5s ease;
|
||||
}
|
||||
|
||||
button:hover, input:hover,
|
||||
textarea:hover, select:hover {
|
||||
border: 2px solid var(--color-link-hover);
|
||||
transition: all 0.5s ease;
|
||||
}
|
||||
|
||||
option {
|
||||
background: var(--color-background);
|
||||
color: var(--color-text);
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
background: var(--color-background);
|
||||
color: var(--color-text);
|
||||
font-size: 16px;
|
||||
line-height: 1.382em;
|
||||
}
|
||||
|
||||
option:hover {
|
||||
background-color: var(--color-selection);
|
||||
color: var(--color-white);
|
||||
}
|
||||
option:hover {
|
||||
background-color: var(--color-selection);
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
input[type=range] {
|
||||
width: 100%;
|
||||
margin: 8px 0;
|
||||
padding: 4px 0;
|
||||
border: 0px solid var(--color-link);
|
||||
-webkit-appearance: none;
|
||||
width: 100%;
|
||||
margin: 8px 0;
|
||||
padding: 4px 0;
|
||||
border: 0px solid var(--color-link);
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
input[type=range]:hover {
|
||||
margin: 8px 0;
|
||||
padding: 4px 0;
|
||||
border: 0px solid var(--color-link-hover);
|
||||
}
|
||||
input[type=range]:hover {
|
||||
margin: 8px 0;
|
||||
padding: 4px 0;
|
||||
border: 0px solid var(--color-link-hover);
|
||||
}
|
||||
|
||||
input[type=range]:focus {
|
||||
outline: none;
|
||||
}
|
||||
input[type=range]:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
input[type=range]::-webkit-slider-runnable-track {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
cursor: pointer;
|
||||
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
|
||||
background: var(--color-b);
|
||||
border-radius: 8px;
|
||||
border: 0px solid #000101;
|
||||
}
|
||||
input[type=range]::-webkit-slider-runnable-track {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
border: 0px solid #000101;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
|
||||
background: var(--color-b);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
input[type=range]::-webkit-slider-thumb {
|
||||
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
|
||||
border: 0px solid #000000;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
border-radius: 8px;
|
||||
background: var(--color-a);
|
||||
cursor: pointer;
|
||||
-webkit-appearance: none;
|
||||
margin-top: -4px;
|
||||
}
|
||||
input[type=range]::-webkit-slider-thumb {
|
||||
-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;
|
||||
}
|
||||
|
||||
input[type=range]:focus::-webkit-slider-runnable-track {
|
||||
background: var(--color-b);
|
||||
}
|
||||
input[type=range]:focus::-webkit-slider-runnable-track {
|
||||
background: var(--color-b);
|
||||
}
|
||||
|
||||
input[type=range]::-moz-range-track {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
cursor: pointer;
|
||||
animate: 0.2s;
|
||||
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
|
||||
background: var(--color-b);
|
||||
border-radius: 8px;
|
||||
border: 0px solid #000101;
|
||||
}
|
||||
input[type=range]::-moz-range-track {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
border: 0px solid #000101;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
|
||||
background: var(--color-b);
|
||||
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;
|
||||
border-radius: 8px;
|
||||
background: var(--color-a);
|
||||
cursor: pointer;
|
||||
}
|
||||
input[type=range]::-moz-range-thumb {
|
||||
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;
|
||||
}
|
||||
|
||||
input[type=range]::-ms-track {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
cursor: pointer;
|
||||
animate: 0.2s;
|
||||
background: transparent;
|
||||
border-color: transparent;
|
||||
border-width: 8px 0;
|
||||
color: transparent;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
input[type=range]::-ms-fill-lower {
|
||||
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;
|
||||
}
|
||||
input[type=range]::-ms-fill-upper {
|
||||
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;
|
||||
border-radius: 8px;
|
||||
background: var(--color-a);
|
||||
cursor: pointer;
|
||||
}
|
||||
input[type=range]::-ms-thumb {
|
||||
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;
|
||||
}
|
||||
|
||||
input[type=range]:focus::-ms-fill-lower {
|
||||
background: var(--color-b);
|
||||
}
|
||||
input[type=range]:focus::-ms-fill-lower {
|
||||
background: var(--color-b);
|
||||
}
|
||||
|
||||
input[type=range]:focus::-ms-fill-upper {
|
||||
background: var(--color-b);
|
||||
}
|
||||
input[type=range]:focus::-ms-fill-upper {
|
||||
background: var(--color-b);
|
||||
}
|
||||
|
||||
/* ------ */
|
||||
/* TABLES */
|
||||
/* ------ */
|
||||
|
||||
table, th, td {
|
||||
width: 100%;
|
||||
padding: 8px;
|
||||
border-collapse: collapse;
|
||||
table-layout: fixed;
|
||||
font-weight: 400;
|
||||
width: 100%;
|
||||
padding: 8px;
|
||||
border-collapse: collapse;
|
||||
table-layout: fixed;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.table_pink thead {
|
||||
border-bottom: 4px solid var(--color-table-item);
|
||||
border-bottom: 4px solid var(--color-table-item);
|
||||
}
|
||||
|
||||
.table_pink thead > tr {
|
||||
background-color: var(--color-table-header-background);
|
||||
color: var(--color-table-header-text);
|
||||
.table_pink thead > tr {
|
||||
background-color: var(--color-table-header-background);
|
||||
color: var(--color-table-header-text);
|
||||
}
|
||||
|
||||
.table_pink thead > tr > th {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.table_pink thead > tr > th {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.table_pink tbody > tr:nth-child(even) {
|
||||
background-color: var(--color-table-item);
|
||||
color: var(--color-white);
|
||||
background-color: var(--color-table-item);
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
.table_pink tfoot {
|
||||
border-top: 4px solid var(--color-table-header-background);
|
||||
border-top: 4px solid var(--color-table-header-background);
|
||||
}
|
||||
|
||||
/* ------------- */
|
||||
@ -380,28 +384,28 @@ table, th, td {
|
||||
/* ------------- */
|
||||
|
||||
.hidden {
|
||||
display: none !important;
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.visually-hidden {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
clip-path: inset(100%);
|
||||
clip: rect(0 0 0 0);
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
clip-path: inset(100%);
|
||||
clip: rect(0 0 0 0);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100%;
|
||||
max-width: 1080px;
|
||||
margin: 0 auto;
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
width: 100%;
|
||||
max-width: 1080px;
|
||||
margin: 0 auto;
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
/* ----------------- */
|
||||
@ -413,10 +417,10 @@ table, th, td {
|
||||
/* --- */
|
||||
|
||||
.app {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
/* ---- */
|
||||
@ -424,16 +428,16 @@ table, th, td {
|
||||
/* ---- */
|
||||
|
||||
.page {
|
||||
flex-grow: 1;
|
||||
margin-top: 32px;
|
||||
margin-bottom: 32px;
|
||||
flex-grow: 1;
|
||||
margin-top: 32px;
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.page {
|
||||
margin-top: 64px;
|
||||
margin-bottom: 64px;
|
||||
}
|
||||
.page {
|
||||
margin-top: 64px;
|
||||
margin-bottom: 64px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ---- */
|
||||
@ -441,12 +445,12 @@ table, th, td {
|
||||
/* ---- */
|
||||
|
||||
.post {
|
||||
margin: 0 auto;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.post__header {
|
||||
text-align: center;
|
||||
margin-block-end: 32px;
|
||||
text-align: center;
|
||||
margin-block-end: 32px;
|
||||
}
|
||||
|
||||
/* ------- */
|
||||
@ -455,42 +459,33 @@ table, th, td {
|
||||
|
||||
|
||||
.content {
|
||||
margin-bottom: 64px;
|
||||
margin-bottom: 64px;
|
||||
}
|
||||
|
||||
.content__header {
|
||||
margin-top: 0;
|
||||
margin-bottom: 32px;
|
||||
padding-left: 16px;
|
||||
border: 2px solid var(--color-content-borderline);
|
||||
border-radius: var(--number-border-radius);
|
||||
color: var(--color-text-header);
|
||||
font-size: 1.8em;
|
||||
margin-top: 0;
|
||||
margin-bottom: 32px;
|
||||
padding-left: 16px;
|
||||
border: 2px solid var(--color-content-borderline);
|
||||
border-radius: var(--number-border-radius);
|
||||
color: var(--color-text-header);
|
||||
font-size: 1.8em;
|
||||
}
|
||||
|
||||
.content-item {
|
||||
margin-bottom: 16px;
|
||||
padding: 16px;
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-content-item-background);
|
||||
margin-bottom: 16px;
|
||||
padding: 16px;
|
||||
border-radius: var(--number-border-radius);
|
||||
background: var(--color-content-item-background);
|
||||
}
|
||||
|
||||
.content-item__header {
|
||||
margin-bottom: 16px;
|
||||
text-align: center;
|
||||
}
|
||||
.content-item__header {
|
||||
margin-bottom: 16px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.content-item {
|
||||
padding: 32px;
|
||||
}
|
||||
.content-item {
|
||||
padding: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ----- */
|
||||
/* PAGES */
|
||||
/* ----- */
|
||||
|
||||
.link_hash {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?custom" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?custom" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?diagnostic" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?diagnostic" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?donate" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?donate" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?faq" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?faq" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -1,74 +1,74 @@
|
||||
<!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" />
|
||||
<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="theme-color" media="(prefers-color-scheme: light)" content="#EA9AB2" />
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#E27396" />
|
||||
<meta name="color-scheme" content="light dark" />
|
||||
<meta name="robots" content="all" />
|
||||
|
||||
<meta name="author" content="Eugene Serb" />
|
||||
<meta name="copyright" content="Wavelovers, 2022" />
|
||||
<meta name="publisher-email" content="eugene.serb@gmail.com" />
|
||||
<meta name="publisher-url" content="https://eugene-serb.github.io/" />
|
||||
<meta name="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 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" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:creator" content="@eugene_serb" />
|
||||
<meta name="twitter:image" content="https://wavelovers.ru/img/og.png" />
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://wavelovers.ru/img/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://wavelovers.ru/img/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://wavelovers.ru/img/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://wavelovers.ru/img/favicon-16x16.png" />
|
||||
<link rel="manifest" href="https://wavelovers.ru/site.webmanifest" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/styles.css" />
|
||||
<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 -->
|
||||
<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());
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-59FM5E4MVD"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() { dataLayer.push(arguments); }
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-59FM5E4MVD');
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript">
|
||||
(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
gtag('config', 'G-59FM5E4MVD');
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript">
|
||||
(function (m, e, t, r, i, k, a) {
|
||||
m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) };
|
||||
m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
|
||||
})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});
|
||||
</script>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
<style>
|
||||
[v-cloak] {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
ym(89252711, "init", {
|
||||
clickmap: true,
|
||||
trackLinks: true,
|
||||
accurateTrackBounce: true,
|
||||
webvisor: true
|
||||
});
|
||||
</script>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
<style>
|
||||
[v-cloak] {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
</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>
|
||||
<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>
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?manual" />
|
||||
<title>Wavelovers – Redirect</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=https://wavelovers.ru/?manual" />
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
||||
|
74
src/App.vue
74
src/App.vue
@ -1,41 +1,47 @@
|
||||
<template>
|
||||
<HeaderItem />
|
||||
<main class="page container">
|
||||
<div class="wavelovers">
|
||||
<router-view />
|
||||
</div>
|
||||
</main>
|
||||
<FooterItem />
|
||||
<HeaderItem />
|
||||
<main class="page container">
|
||||
<div class="wavelovers">
|
||||
<router-view />
|
||||
</div>
|
||||
</main>
|
||||
<FooterItem />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import store from '@/store/index';
|
||||
import HeaderItem from '@/components/HeaderItem.vue';
|
||||
import FooterItem from '@/components/FooterItem.vue';
|
||||
import { defineComponent } from 'vue';
|
||||
import store from '@/store/index';
|
||||
import HeaderItem from '@/components/HeaderItem.vue';
|
||||
import FooterItem from '@/components/FooterItem.vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'App',
|
||||
components: {
|
||||
HeaderItem: HeaderItem,
|
||||
FooterItem: FooterItem,
|
||||
},
|
||||
methods: {
|
||||
addEventListeners(): void {
|
||||
window.addEventListener('gamepadconnected', (event: GamepadEvent) => store.dispatch('addGamepad', event));
|
||||
window.addEventListener('gamepaddisconnected', (event: GamepadEvent) => store.dispatch('deleteGamepad', event));
|
||||
},
|
||||
removeEventListeners(): void {
|
||||
window.removeEventListener('gamepadconnected', (event: GamepadEvent) => store.dispatch('addGamepad', event));
|
||||
window.removeEventListener('gamepaddisconnected', (event: GamepadEvent) => store.dispatch('deleteGamepad', event));
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.addEventListeners();
|
||||
},
|
||||
unmounted() {
|
||||
this.removeEventListeners();
|
||||
},
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'App',
|
||||
components: {
|
||||
HeaderItem: HeaderItem,
|
||||
FooterItem: FooterItem,
|
||||
},
|
||||
methods: {
|
||||
addGamepad: function (event: GamepadEvent): void {
|
||||
store.dispatch('addGamepad', 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() {
|
||||
this.addEventListeners();
|
||||
},
|
||||
unmounted() {
|
||||
this.removeEventListeners();
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
|
@ -1,125 +1,125 @@
|
||||
<template>
|
||||
<NavigationList />
|
||||
<div class="content-item app-custom">
|
||||
<fieldset class="custom-form">
|
||||
<label class="custom-form__input">
|
||||
<span>Start Delay (ms)</span>
|
||||
<input v-model="startDelay"
|
||||
type="number" placeholder="Start Delay"
|
||||
min="0" max="1000" step="25" required />
|
||||
</label>
|
||||
<label class="custom-form__input">
|
||||
<span>Duration (ms)</span>
|
||||
<input v-model="duration"
|
||||
type="number" placeholder="Duration"
|
||||
min="0" max="1000" step="25" required />
|
||||
</label>
|
||||
<label class="custom-form__input">
|
||||
<span>Weak Magnitude</span>
|
||||
<input v-model="weakMagnitude"
|
||||
type="range" required
|
||||
min="0.0" max="1.0" step="0.01" />
|
||||
</label>
|
||||
<label class="custom-form__input">
|
||||
<span>Strong Magnitude</span>
|
||||
<input v-model="strongMagnitude"
|
||||
type="range" required
|
||||
min="0.0" max="1.0" step="0.01" />
|
||||
</label>
|
||||
<div class="custom-form__buttons">
|
||||
<button @click="start" class="custom-form__button">Start</button>
|
||||
<button @click="stop" class="custom-form__button">Stop</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<GamepadList v-if="gamepads.length > 0"
|
||||
:gamepads="gamepads" />
|
||||
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||
<NavigationList />
|
||||
<div class="content-item app-custom">
|
||||
<fieldset class="custom-form">
|
||||
<label class="custom-form__input">
|
||||
<span>Start Delay (ms)</span>
|
||||
<input v-model="startDelay"
|
||||
type="number" placeholder="Start Delay"
|
||||
min="0" max="1000" step="25" required />
|
||||
</label>
|
||||
<label class="custom-form__input">
|
||||
<span>Duration (ms)</span>
|
||||
<input v-model="duration"
|
||||
type="number" placeholder="Duration"
|
||||
min="0" max="1000" step="25" required />
|
||||
</label>
|
||||
<label class="custom-form__input">
|
||||
<span>Weak Magnitude</span>
|
||||
<input v-model="weakMagnitude"
|
||||
type="range" required
|
||||
min="0.0" max="1.0" step="0.01" />
|
||||
</label>
|
||||
<label class="custom-form__input">
|
||||
<span>Strong Magnitude</span>
|
||||
<input v-model="strongMagnitude"
|
||||
type="range" required
|
||||
min="0.0" max="1.0" step="0.01" />
|
||||
</label>
|
||||
<div class="custom-form__buttons">
|
||||
<button @click="start" class="custom-form__button">Start</button>
|
||||
<button @click="stop" class="custom-form__button">Stop</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<GamepadList v-if="gamepads.length > 0"
|
||||
:gamepads="gamepads" />
|
||||
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import store from '@/store/index';
|
||||
import NavigationList from '@/components/NavigationList.vue';
|
||||
import GamepadList from '@/components/GamepadList.vue';
|
||||
import MessageItem from '@/components/MessageItem.vue';
|
||||
import Vibrator from '@/models/Vibrator';
|
||||
import TPatternUnit from '@/models/TPatternUnit';
|
||||
import PatternUnit from '@/models/PatternUnit';
|
||||
import { defineComponent } from 'vue';
|
||||
import store from '@/store/index';
|
||||
import NavigationList from '@/components/NavigationList.vue';
|
||||
import GamepadList from '@/components/GamepadList.vue';
|
||||
import MessageItem from '@/components/MessageItem.vue';
|
||||
import Vibrator from '@/models/Vibrator';
|
||||
import TPatternUnit from '@/models/TPatternUnit';
|
||||
import PatternUnit from '@/models/PatternUnit';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'AppCustom',
|
||||
components: {
|
||||
NavigationList: NavigationList,
|
||||
GamepadList: GamepadList,
|
||||
MessageItem: MessageItem,
|
||||
},
|
||||
data: () => {
|
||||
return {
|
||||
startDelay: 250 as number,
|
||||
duration: 250 as number,
|
||||
weakMagnitude: 1 as number,
|
||||
strongMagnitude: 1 as number,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
gamepads: function (): Vibrator[] {
|
||||
return store.getters.gamepads as Vibrator[];
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
start: function (): void {
|
||||
const patterns: TPatternUnit[] = [new PatternUnit(
|
||||
this.startDelay,
|
||||
this.duration,
|
||||
this.weakMagnitude,
|
||||
this.strongMagnitude,
|
||||
)];
|
||||
store.dispatch('startCustom', patterns);
|
||||
},
|
||||
stop: function (): void {
|
||||
store.dispatch('reset');
|
||||
},
|
||||
},
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'AppCustom',
|
||||
components: {
|
||||
NavigationList: NavigationList,
|
||||
GamepadList: GamepadList,
|
||||
MessageItem: MessageItem,
|
||||
},
|
||||
data: () => {
|
||||
return {
|
||||
startDelay: 250 as number,
|
||||
duration: 250 as number,
|
||||
weakMagnitude: 1 as number,
|
||||
strongMagnitude: 1 as number,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
gamepads: function (): Vibrator[] {
|
||||
return store.getters.gamepads as Vibrator[];
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
start: function (): void {
|
||||
const patterns: TPatternUnit[] = [new PatternUnit(
|
||||
this.startDelay,
|
||||
this.duration,
|
||||
this.weakMagnitude,
|
||||
this.strongMagnitude,
|
||||
)];
|
||||
store.dispatch('startCustom', patterns);
|
||||
},
|
||||
stop: function (): void {
|
||||
store.dispatch('reset');
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.custom-form {
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.custom-form__input {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.custom-form__buttons {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
gap: 32px;
|
||||
}
|
||||
|
||||
.custom-form__button {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.custom-form {
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 32px;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -1,60 +1,33 @@
|
||||
<template>
|
||||
<NavigationList />
|
||||
<div v-if="gamepads.length > 0" class="content-item">
|
||||
<DiagnosticItem v-for="gamepad in gamepads"
|
||||
:key="gamepad.id"
|
||||
:gamepad="gamepad"
|
||||
:timestamp="timestamp" />
|
||||
</div>
|
||||
<GamepadList v-if="gamepads.length > 0"
|
||||
:gamepads="gamepads" />
|
||||
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||
<NavigationList />
|
||||
<div v-if="gamepads.length > 0" class="content-item">
|
||||
<DiagnosticItem v-for="gamepad in gamepads"
|
||||
:key="gamepad.id"
|
||||
:gamepad="gamepad"
|
||||
:timestamp="timestamp" />
|
||||
</div>
|
||||
<GamepadList v-if="gamepads.length > 0"
|
||||
:gamepads="gamepads" />
|
||||
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import store from '@/store/index';
|
||||
import NavigationList from '@/components/NavigationList.vue';
|
||||
import GamepadList from '@/components/GamepadList.vue';
|
||||
import MessageItem from '@/components/MessageItem.vue';
|
||||
import DiagnosticItem from '@/components/DiagnosticItem.vue';
|
||||
import Vibrator from '@/models/Vibrator';
|
||||
import { defineComponent } from 'vue';
|
||||
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 ComputedGamepads from '@/mixins/ComputedGamepads.vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'AppDiagnostic',
|
||||
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);
|
||||
},
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'AppDiagnostic',
|
||||
mixins: [ComputedGamepads],
|
||||
components: {
|
||||
DiagnosticItem: DiagnosticItem,
|
||||
NavigationList: NavigationList,
|
||||
GamepadList: GamepadList,
|
||||
MessageItem: MessageItem,
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
|
@ -1,198 +1,182 @@
|
||||
<template>
|
||||
<NavigationList />
|
||||
<div class="content-item app-manual">
|
||||
<label class="manual-form__input">
|
||||
<span>Weak Magnitude</span>
|
||||
<input v-model="weakMagnitude"
|
||||
type="range" required disabled
|
||||
min="0.0" max="1.0" step="0.01" />
|
||||
</label>
|
||||
<label class="manual-form__input">
|
||||
<span>Strong Magnitude</span>
|
||||
<input v-model="strongMagnitude"
|
||||
type="range" required disabled
|
||||
min="0.0" max="1.0" step="0.01" />
|
||||
</label>
|
||||
<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>
|
||||
<NavigationList />
|
||||
<div class="content-item app-manual">
|
||||
<label class="manual-form__input">
|
||||
<span>Weak Magnitude</span>
|
||||
<input v-model="weakMagnitude"
|
||||
type="range" required disabled
|
||||
min="0.0" max="1.0" step="0.01" />
|
||||
</label>
|
||||
<label class="manual-form__input">
|
||||
<span>Strong Magnitude</span>
|
||||
<input v-model="strongMagnitude"
|
||||
type="range" required disabled
|
||||
min="0.0" max="1.0" step="0.01" />
|
||||
</label>
|
||||
<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>
|
||||
<GamepadList v-if="gamepads.length > 0"
|
||||
:gamepads="gamepads" />
|
||||
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||
</div>
|
||||
<GamepadList v-if="gamepads.length > 0"
|
||||
:gamepads="gamepads" />
|
||||
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import store from '@/store/index';
|
||||
import NavigationList from '@/components/NavigationList.vue';
|
||||
import GamepadList from '@/components/GamepadList.vue';
|
||||
import MessageItem from '@/components/MessageItem.vue';
|
||||
import Vibrator from '@/models/Vibrator';
|
||||
import TPatternUnit from '@/models/TPatternUnit';
|
||||
import PatternUnit from '@/models/PatternUnit';
|
||||
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 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',
|
||||
components: {
|
||||
NavigationList: NavigationList,
|
||||
GamepadList: GamepadList,
|
||||
MessageItem: MessageItem,
|
||||
},
|
||||
data: () => {
|
||||
return {
|
||||
timestamp: 0 as number,
|
||||
interval: 0 as number,
|
||||
mode: 0 as number,
|
||||
lock: false as boolean,
|
||||
startDelay: 0 as number,
|
||||
duration: 260 as number,
|
||||
weakMagnitude: 0 as number,
|
||||
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(
|
||||
this.startDelay,
|
||||
this.duration,
|
||||
this.weakMagnitude,
|
||||
this.strongMagnitude,
|
||||
);
|
||||
store.dispatch('vibrate', pattern);
|
||||
},
|
||||
stop: function (): void {
|
||||
store.dispatch('setIsActive', false);
|
||||
store.dispatch('setMode', 0);
|
||||
store.dispatch('reset');
|
||||
},
|
||||
eventLoop: function (): void {
|
||||
this.updateComputed();
|
||||
this.updateMode();
|
||||
this.updatePattern();
|
||||
this.handle();
|
||||
},
|
||||
updateComputed: function (): void {
|
||||
this.timestamp = Date.now();
|
||||
},
|
||||
updateMode: function (): void {
|
||||
if (this.gamepads.length > 0) {
|
||||
if (this.gamepads[0].unit.buttons[1].pressed === true) {
|
||||
this.lock = !this.lock;
|
||||
}
|
||||
if (this.lock === false) {
|
||||
if (this.gamepads[0].unit.buttons[0].pressed === true) {
|
||||
this.mode = 0;
|
||||
}
|
||||
if (this.gamepads[0].unit.buttons[2].pressed === true) {
|
||||
this.mode = 1;
|
||||
}
|
||||
if (this.gamepads[0].unit.buttons[3].pressed === true) {
|
||||
this.mode = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
updatePattern: function (): void {
|
||||
if (this.gamepads.length > 0) {
|
||||
if (this.lock === false) {
|
||||
if (this.mode === 0) {
|
||||
this.weakMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||
this.strongMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||
}
|
||||
if (this.mode === 1) {
|
||||
this.weakMagnitude = 0;
|
||||
this.strongMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||
}
|
||||
if (this.mode === 2) {
|
||||
this.weakMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||
this.strongMagnitude = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
handle: function (): void {
|
||||
if (this.gamepads.length > 0) {
|
||||
this.gamepads.forEach((gamepad) => {
|
||||
if (gamepad.unit.buttons[7].value > 0 || this.lock === true) {
|
||||
this.start();
|
||||
} else {
|
||||
this.stop();
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.interval = setInterval(this.eventLoop, 250);
|
||||
},
|
||||
unmounted() {
|
||||
clearInterval(this.interval);
|
||||
},
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'AppCustom',
|
||||
mixins: [ComputedGamepads],
|
||||
components: {
|
||||
NavigationList: NavigationList,
|
||||
GamepadList: GamepadList,
|
||||
MessageItem: MessageItem,
|
||||
},
|
||||
data: () => {
|
||||
return {
|
||||
mode: 0 as number,
|
||||
lock: false as boolean,
|
||||
startDelay: 0 as number,
|
||||
duration: 260 as number,
|
||||
weakMagnitude: 0 as number,
|
||||
strongMagnitude: 0 as number,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
start: function (): void {
|
||||
const pattern: TPatternUnit = new PatternUnit(
|
||||
this.startDelay,
|
||||
this.duration,
|
||||
this.weakMagnitude,
|
||||
this.strongMagnitude,
|
||||
);
|
||||
store.dispatch('vibrate', pattern);
|
||||
},
|
||||
stop: function (): void {
|
||||
store.dispatch('setIsActive', false);
|
||||
store.dispatch('setMode', 0);
|
||||
store.dispatch('reset');
|
||||
},
|
||||
eventLoop: function (): void {
|
||||
this.updateComputed();
|
||||
this.updateMode();
|
||||
this.updatePattern();
|
||||
this.handle();
|
||||
},
|
||||
updateMode: function (): void {
|
||||
if (this.gamepads.length > 0) {
|
||||
if (this.gamepads[0].unit.buttons[1].pressed === true) {
|
||||
this.lock = !this.lock;
|
||||
}
|
||||
if (this.lock === false) {
|
||||
if (this.gamepads[0].unit.buttons[0].pressed === true) {
|
||||
this.mode = 0;
|
||||
}
|
||||
if (this.gamepads[0].unit.buttons[2].pressed === true) {
|
||||
this.mode = 1;
|
||||
}
|
||||
if (this.gamepads[0].unit.buttons[3].pressed === true) {
|
||||
this.mode = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
updatePattern: function (): void {
|
||||
if (this.gamepads.length > 0) {
|
||||
if (this.lock === false) {
|
||||
if (this.mode === 0) {
|
||||
this.weakMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||
this.strongMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||
}
|
||||
if (this.mode === 1) {
|
||||
this.weakMagnitude = 0;
|
||||
this.strongMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||
}
|
||||
if (this.mode === 2) {
|
||||
this.weakMagnitude = this.gamepads[0].unit.buttons[7].value;
|
||||
this.strongMagnitude = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
handle: function (): void {
|
||||
if (this.gamepads.length > 0) {
|
||||
this.gamepads.forEach((gamepad: Vibrator) => {
|
||||
if (gamepad.unit.buttons[7].value > 0 || this.lock === true) {
|
||||
this.start();
|
||||
} else {
|
||||
this.stop();
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.interval = setInterval(this.eventLoop, 250);
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.app-manual {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
gap: 32px;
|
||||
}
|
||||
.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;
|
||||
align-items: center;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-self: stretch;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -1,58 +1,58 @@
|
||||
<template>
|
||||
<NavigationList />
|
||||
<div class="app-patterns">
|
||||
<PatternList v-if="patterns.length > 0"
|
||||
:patterns="patterns"
|
||||
:mode="mode"
|
||||
:isActive="isActive"
|
||||
@change="change" />
|
||||
<MessageItem v-else>Loading...</MessageItem>
|
||||
</div>
|
||||
<GamepadList v-if="gamepads.length > 0"
|
||||
:gamepads="gamepads" />
|
||||
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||
<NavigationList />
|
||||
<div class="app-patterns">
|
||||
<PatternList v-if="patterns.length > 0"
|
||||
:patterns="patterns"
|
||||
:mode="mode"
|
||||
:isActive="isActive"
|
||||
@change="change" />
|
||||
<MessageItem v-else>Loading...</MessageItem>
|
||||
</div>
|
||||
<GamepadList v-if="gamepads.length > 0"
|
||||
:gamepads="gamepads" />
|
||||
<MessageItem v-else>Press any gamepad button or connect a new gamepad to vibrate.</MessageItem>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import store from '@/store/index';
|
||||
import NavigationList from '@/components/NavigationList.vue';
|
||||
import GamepadList from '@/components/GamepadList.vue';
|
||||
import MessageItem from '@/components/MessageItem.vue';
|
||||
import PatternList from '@/components/PatternList.vue';
|
||||
import Vibrator from '@/models/Vibrator';
|
||||
import TPattern from '@/models/TPattern';
|
||||
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 PatternList from '@/components/PatternList.vue';
|
||||
import Vibrator from '@/models/Vibrator';
|
||||
import TPattern from '@/models/TPattern';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'AppPatterns',
|
||||
components: {
|
||||
PatternList: PatternList,
|
||||
NavigationList: NavigationList,
|
||||
GamepadList: GamepadList,
|
||||
MessageItem: MessageItem,
|
||||
},
|
||||
computed: {
|
||||
gamepads: function (): Vibrator[] {
|
||||
return store.getters.gamepads as Vibrator[];
|
||||
},
|
||||
patterns: function (): TPattern[] {
|
||||
return store.getters.patterns as TPattern[];
|
||||
},
|
||||
mode: function (): number {
|
||||
return store.getters.mode as number;
|
||||
},
|
||||
isActive: function (): boolean {
|
||||
return store.getters.isActive as boolean;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
change(index: number): void {
|
||||
store.dispatch('change', index as number);
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
store.dispatch('loadPatterns');
|
||||
},
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'AppPatterns',
|
||||
components: {
|
||||
PatternList: PatternList,
|
||||
NavigationList: NavigationList,
|
||||
GamepadList: GamepadList,
|
||||
MessageItem: MessageItem,
|
||||
},
|
||||
computed: {
|
||||
gamepads: function (): Vibrator[] {
|
||||
return store.getters.gamepads as Vibrator[];
|
||||
},
|
||||
patterns: function (): TPattern[] {
|
||||
return store.getters.patterns as TPattern[];
|
||||
},
|
||||
mode: function (): number {
|
||||
return store.getters.mode as number;
|
||||
},
|
||||
isActive: function (): boolean {
|
||||
return store.getters.isActive as boolean;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
change(index: number): void {
|
||||
store.dispatch('change', index as number);
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
store.dispatch('loadPatterns');
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
|
@ -1,101 +1,85 @@
|
||||
<template>
|
||||
<div class="output-gamepad">
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</div>
|
||||
<div>
|
||||
<span>Left Stick X: {{ gamepad.unit.axes[0] ? gamepad.unit.axes[0].toFixed(2) : 'missing' }}</span>
|
||||
<span>Left Stick Y: {{ gamepad.unit.axes[1] ? gamepad.unit.axes[1].toFixed(2) : 'missing' }}</span>
|
||||
<span>Right Stick X: {{ gamepad.unit.axes[2] ? gamepad.unit.axes[2].toFixed(2) : 'missing' }}</span>
|
||||
<span>Right Stick Y: {{ gamepad.unit.axes[3] ? gamepad.unit.axes[3].toFixed(2) : 'missing' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<span>Vibration Actuator: {{ gamepad.unit.vibrationActuator ? 'Available' : 'missing' }}</span>
|
||||
<div class="output-gamepad">
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</div>
|
||||
<div>
|
||||
<span>Left Stick X: {{ gamepad.unit.axes[0] ? gamepad.unit.axes[0].toFixed(2) : 'missing' }}</span>
|
||||
<span>Left Stick Y: {{ gamepad.unit.axes[1] ? gamepad.unit.axes[1].toFixed(2) : 'missing' }}</span>
|
||||
<span>Right Stick X: {{ gamepad.unit.axes[2] ? gamepad.unit.axes[2].toFixed(2) : 'missing' }}</span>
|
||||
<span>Right Stick Y: {{ gamepad.unit.axes[3] ? gamepad.unit.axes[3].toFixed(2) : 'missing' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<span>Vibration Actuator: {{ gamepad.unit.vibrationActuator ? 'Available' : 'missing' }}</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { defineComponent } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'DiagnosticItem',
|
||||
props: {
|
||||
gamepad: {
|
||||
type: Object,
|
||||
},
|
||||
timestamp: {
|
||||
type: Number,
|
||||
},
|
||||
},
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'DiagnosticItem',
|
||||
props: {
|
||||
gamepad: {
|
||||
type: Object,
|
||||
},
|
||||
timestamp: {
|
||||
type: Number,
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.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;
|
||||
}
|
||||
.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 {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(5, 1fr);
|
||||
}
|
||||
|
||||
.gamepad-group > div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
gap: 8px;
|
||||
}
|
||||
.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);
|
||||
}
|
||||
.pressed {
|
||||
background-color: var(--color-link-hover);
|
||||
color: var(--color-background);
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -1,54 +1,54 @@
|
||||
<template>
|
||||
<footer class="footer">
|
||||
<div class="footer-wrapper container">
|
||||
<div class="annotation">
|
||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
||||
</div>
|
||||
<div class="annotation created-by">
|
||||
<span class="annotation__text">Created by</span><a href="https://eugene-serb.github.io/" target="_blank" translate="no">Eugene Serb</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<footer class="footer">
|
||||
<div class="footer-wrapper container">
|
||||
<div class="annotation">
|
||||
<span class="annotation__text">© 2022 Wavelovers. Content licensed under </span><a href="https://wavelovers.ru/LICENSE.md" target="_blank">GNU General Public License v3.0</a><br>
|
||||
<span class="annotation__text">This site is open source. </span><a href="https://github.com/eugene-serb/wavelovers/" target="_blank">Improve this page.</a>
|
||||
</div>
|
||||
<div class="annotation created-by">
|
||||
<span class="annotation__text">Created by</span><a href="https://eugene-serb.github.io/" target="_blank" translate="no">Eugene Serb</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { defineComponent } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'FooterItem',
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'FooterItem',
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.footer {
|
||||
border-top: 4px solid var(--color-footer-borderline);
|
||||
}
|
||||
.footer {
|
||||
border-top: 4px solid var(--color-footer-borderline);
|
||||
}
|
||||
|
||||
.footer span {
|
||||
color: var(--color-footer-text);
|
||||
}
|
||||
.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;
|
||||
}
|
||||
.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 {
|
||||
align-self: flex-end;
|
||||
}
|
||||
|
||||
.created-by > span {
|
||||
padding-right: 8px;
|
||||
}
|
||||
.created-by > span {
|
||||
padding-right: 8px;
|
||||
}
|
||||
|
||||
.created-by > a {
|
||||
font-size: 32px;
|
||||
}
|
||||
.created-by > a {
|
||||
font-size: 32px;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -1,34 +1,34 @@
|
||||
<template>
|
||||
<div class="list-item"></div>
|
||||
<div class="list-item"></div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { defineComponent } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'GamepadItem',
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'GamepadItem',
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.list-item {
|
||||
max-width: 100%;
|
||||
padding: 16px;
|
||||
border: 4px solid var(--color-b);
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.list-item {
|
||||
max-width: 100%;
|
||||
padding: 16px;
|
||||
border: 4px solid var(--color-b);
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.list-item__info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
.list-item__info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.list-item_selected .list-item__info span {
|
||||
color: var(--color-white);
|
||||
}
|
||||
.list-item_selected .list-item__info span {
|
||||
color: var(--color-white);
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -1,34 +1,34 @@
|
||||
<template>
|
||||
<div class="content-item device-list">
|
||||
<GamepadItem v-for="gamepad in gamepads"
|
||||
:key="gamepad.id"
|
||||
v-text="gamepad.unit.id" />
|
||||
</div>
|
||||
<div class="content-item device-list">
|
||||
<GamepadItem v-for="gamepad in gamepads"
|
||||
:key="gamepad.id"
|
||||
v-text="gamepad.unit.id" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import GamepadItem from '@/components/GamepadItem.vue';
|
||||
import { defineComponent } from 'vue';
|
||||
import GamepadItem from '@/components/GamepadItem.vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'GamepadList',
|
||||
props: {
|
||||
gamepads: {
|
||||
type: Array,
|
||||
},
|
||||
},
|
||||
components: {
|
||||
GamepadItem: GamepadItem,
|
||||
},
|
||||
});
|
||||
</script>
|
||||
export default defineComponent({
|
||||
name: 'GamepadList',
|
||||
props: {
|
||||
gamepads: {
|
||||
type: Array,
|
||||
},
|
||||
},
|
||||
components: {
|
||||
GamepadItem: GamepadItem,
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.device-list {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
gap: 16px;
|
||||
}
|
||||
.device-list {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
gap: 16px;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -1,144 +1,144 @@
|
||||
<template>
|
||||
<header class="header">
|
||||
<div class="header-wrapper container">
|
||||
<div class="logo-wrapper">
|
||||
<span class="logo-wrapper__logo" translate="no">Wavelovers</span>
|
||||
</div>
|
||||
<nav class="menu-wrapper">
|
||||
<ul class="navigation">
|
||||
<li class="navigation__item">
|
||||
<router-link to="/" class="navigation-item">Home</router-link>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<router-link to="/faq" class="navigation-item">FAQ</router-link>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<router-link to="/about" class="navigation-item">About</router-link>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<router-link to="/donate" class="navigation-item">Donate</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
<header class="header">
|
||||
<div class="header-wrapper container">
|
||||
<div class="logo-wrapper">
|
||||
<span class="logo-wrapper__logo" translate="no">Wavelovers</span>
|
||||
</div>
|
||||
<nav class="menu-wrapper">
|
||||
<ul class="navigation">
|
||||
<li class="navigation__item">
|
||||
<router-link to="/">Home</router-link>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<router-link to="/faq">FAQ</router-link>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<router-link to="/about">About</router-link>
|
||||
</li>
|
||||
<li class="navigation__item">
|
||||
<router-link to="/donate">Donate</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { defineComponent } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'HeaderItem',
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'HeaderItem',
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.header {
|
||||
border-bottom: 8px solid var(--color-header-borderline);
|
||||
background: var(--color-header-background);
|
||||
}
|
||||
|
||||
.header ::selection {
|
||||
background: var(--color-header-selection);
|
||||
}
|
||||
|
||||
.header :focus {
|
||||
border-bottom: 2px solid var(--color-header-navigation-link-hover);
|
||||
}
|
||||
|
||||
.header :focus-visible {
|
||||
outline: 2px solid var(--color-header-navigation-link-hover);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.header-wrapper {
|
||||
padding-top: 32px;
|
||||
padding-bottom: 16px;
|
||||
}
|
||||
|
||||
.logo-wrapper {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.logo-wrapper__logo {
|
||||
font-size: 48px;
|
||||
font-weight: 500;
|
||||
color: var(--color-header-logo);
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.menu-wrapper {
|
||||
margin-top: 16px;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.navigation {
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.navigation__item {
|
||||
font-size: 16px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.navigation__item a {
|
||||
border-color: transparent;
|
||||
color: var(--color-header-navigation-link);
|
||||
}
|
||||
|
||||
.navigation__item a:hover {
|
||||
border-color: var(--color-header-navigation-link-hover);
|
||||
color: var(--color-header-navigation-link-hover);
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.header {
|
||||
border-bottom: 8px solid var(--color-header-borderline);
|
||||
background: var(--color-header-background);
|
||||
}
|
||||
|
||||
.header ::selection {
|
||||
background: var(--color-header-selection);
|
||||
}
|
||||
|
||||
.header :focus {
|
||||
border-bottom: 2px solid var(--color-header-navigation-link-hover);
|
||||
}
|
||||
|
||||
.header :focus-visible {
|
||||
outline: 2px solid var(--color-header-navigation-link-hover);
|
||||
border-color: transparent;
|
||||
border-bottom: 32px solid var(--color-header-borderline);
|
||||
background: var(--color-header-background);
|
||||
}
|
||||
|
||||
.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;
|
||||
padding-top: 64px;
|
||||
padding-bottom: 16px;
|
||||
}
|
||||
|
||||
.menu-wrapper {
|
||||
margin-top: 16px;
|
||||
align-self: center;
|
||||
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;
|
||||
}
|
||||
|
||||
.navigation {
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
gap: 8px;
|
||||
.logo-wrapper {
|
||||
width: 50%;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.navigation__item {
|
||||
font-size: 16px;
|
||||
text-transform: uppercase;
|
||||
.menu-wrapper {
|
||||
width: 50%;
|
||||
margin-top: 0px;
|
||||
align-self: flex-end;
|
||||
}
|
||||
}
|
||||
|
||||
.navigation__item a {
|
||||
border-color: transparent;
|
||||
color: var(--color-header-navigation-link);
|
||||
}
|
||||
|
||||
.navigation__item a:hover {
|
||||
border-color: var(--color-header-navigation-link-hover);
|
||||
color: var(--color-header-navigation-link-hover);
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.header {
|
||||
border-bottom: 32px solid var(--color-header-borderline);
|
||||
background: var(--color-header-background);
|
||||
}
|
||||
|
||||
.header-wrapper {
|
||||
padding-top: 64px;
|
||||
padding-bottom: 16px;
|
||||
}
|
||||
|
||||
.menu-wrapper {
|
||||
margin-top: 32px;
|
||||
align-self: center;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 720px) {
|
||||
.header-wrapper {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: space-between;
|
||||
gap: 64px;
|
||||
}
|
||||
|
||||
.logo-wrapper {
|
||||
width: 50%;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.menu-wrapper {
|
||||
width: 50%;
|
||||
margin-top: 0px;
|
||||
align-self: flex-end;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 1024px) {
|
||||
.logo-wrapper__logo {
|
||||
font-size: 64px;
|
||||
}
|
||||
@media only screen and (min-width: 1024px) {
|
||||
.logo-wrapper__logo {
|
||||
font-size: 64px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -1,33 +1,33 @@
|
||||
<template>
|
||||
<div class="content-item message">
|
||||
<span>
|
||||
<slot></slot>
|
||||
</span>
|
||||
</div>
|
||||
<div class="content-item message">
|
||||
<span>
|
||||
<slot></slot>
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { defineComponent } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'MessageItem',
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'MessageItem',
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.message {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
font-size: 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;
|
||||
}
|
||||
@media only screen and (min-width: 540px) {
|
||||
.message {
|
||||
font-size: 24px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -1,34 +1,34 @@
|
||||
<template>
|
||||
<div class="content-item navigation-list">
|
||||
<router-link to="/" class="navigation-list__item">Patterns</router-link>
|
||||
<router-link to="/custom" class="navigation-list__item">Custom</router-link>
|
||||
<router-link to="/manual" class="navigation-list__item">Manual</router-link>
|
||||
<router-link to="/diagnostic" class="navigation-list__item">Diagnostic</router-link>
|
||||
</div>
|
||||
<div class="content-item navigation-list">
|
||||
<router-link to="/" class="navigation-list__item">Patterns</router-link>
|
||||
<router-link to="/custom" class="navigation-list__item">Custom</router-link>
|
||||
<router-link to="/manual" class="navigation-list__item">Manual</router-link>
|
||||
<router-link to="/diagnostic" class="navigation-list__item">Diagnostic</router-link>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { defineComponent } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'NavigationList',
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'NavigationList',
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.navigation-list {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
gap: 16px;
|
||||
}
|
||||
.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 0.5s ease;
|
||||
text-decoration: none;
|
||||
}
|
||||
.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 0.5s ease;
|
||||
text-decoration: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -1,101 +1,101 @@
|
||||
<template>
|
||||
<div @click="change(index)"
|
||||
:class="['pattern-item',
|
||||
<div @click="change(index)"
|
||||
:class="['pattern-item',
|
||||
index === mode && isActive === true ?
|
||||
'pattern-item_selected' : '',
|
||||
]">
|
||||
<span class="pattern-item__icon"
|
||||
v-text="pattern.icon"></span>
|
||||
<div class="pattern-item__info-container">
|
||||
<span class="pattern-item__name"
|
||||
v-text="pattern.name"></span>
|
||||
<span class="pattern-item__type"
|
||||
v-text="pattern.type"></span>
|
||||
</div>
|
||||
<span class="pattern-item__icon"
|
||||
v-text="pattern.icon"></span>
|
||||
<div class="pattern-item__info-container">
|
||||
<span class="pattern-item__name"
|
||||
v-text="pattern.name"></span>
|
||||
<span class="pattern-item__type"
|
||||
v-text="pattern.type"></span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { defineComponent } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'PatternItem',
|
||||
props: {
|
||||
pattern: {
|
||||
type: Object,
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
},
|
||||
mode: {
|
||||
type: Number,
|
||||
},
|
||||
isActive: {
|
||||
type: Boolean,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
change: function (index: number): void {
|
||||
this.$emit('change', index as number);
|
||||
},
|
||||
},
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'PatternItem',
|
||||
props: {
|
||||
pattern: {
|
||||
type: Object,
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
},
|
||||
mode: {
|
||||
type: Number,
|
||||
},
|
||||
isActive: {
|
||||
type: Boolean,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
change: function (index: number): void {
|
||||
this.$emit('change', index as number);
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.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: 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;
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 540px) {
|
||||
.pattern-item {
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
.pattern-item ::selection {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.pattern-item ::selection {
|
||||
background-color: transparent;
|
||||
}
|
||||
.pattern-item_selected {
|
||||
background: var(--color-b);
|
||||
}
|
||||
|
||||
.pattern-item_selected {
|
||||
background: var(--color-b);
|
||||
}
|
||||
.pattern-item__icon {
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.pattern-item__icon {
|
||||
font-size: 24px;
|
||||
}
|
||||
.pattern-item__info-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.pattern-item__info-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
text-align: left;
|
||||
}
|
||||
.pattern-item__name {
|
||||
font-size: 16px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
color: var(--color-pattern-text);
|
||||
}
|
||||
|
||||
.pattern-item__name {
|
||||
font-size: 16px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
color: var(--color-pattern-text);
|
||||
}
|
||||
|
||||
.pattern-item__type {
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
color: var(--color-pattern-text);
|
||||
}
|
||||
.pattern-item__type {
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
color: var(--color-pattern-text);
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -1,57 +1,57 @@
|
||||
<template>
|
||||
<div class="content-item pattern-list">
|
||||
<PatternItem v-for="(pattern, index) in patterns"
|
||||
:key="pattern.name"
|
||||
:pattern="pattern"
|
||||
:index="index"
|
||||
:mode="mode"
|
||||
:isActive="isActive"
|
||||
@change="change" />
|
||||
</div>
|
||||
<div class="content-item pattern-list">
|
||||
<PatternItem v-for="(pattern, index) in patterns"
|
||||
:key="pattern.name"
|
||||
:pattern="pattern"
|
||||
:index="index"
|
||||
:mode="mode"
|
||||
:isActive="isActive"
|
||||
@change="change" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import PatternItem from '@/components/PatternItem.vue';
|
||||
import { defineComponent } from 'vue';
|
||||
import PatternItem from '@/components/PatternItem.vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'PatternList',
|
||||
props: {
|
||||
patterns: {
|
||||
type: Array,
|
||||
},
|
||||
mode: {
|
||||
type: Number,
|
||||
},
|
||||
isActive: {
|
||||
type: Boolean,
|
||||
},
|
||||
},
|
||||
components: {
|
||||
PatternItem: PatternItem,
|
||||
},
|
||||
methods: {
|
||||
change: function (index: number): void {
|
||||
this.$emit('change', index as number);
|
||||
},
|
||||
},
|
||||
});
|
||||
export default defineComponent({
|
||||
name: 'PatternList',
|
||||
props: {
|
||||
patterns: {
|
||||
type: Array,
|
||||
},
|
||||
mode: {
|
||||
type: Number,
|
||||
},
|
||||
isActive: {
|
||||
type: Boolean,
|
||||
},
|
||||
},
|
||||
components: {
|
||||
PatternItem: PatternItem,
|
||||
},
|
||||
methods: {
|
||||
change: function (index: number): void {
|
||||
this.$emit('change', index as number);
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.pattern-list {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
flex-wrap: wrap;
|
||||
gap: 16px;
|
||||
}
|
||||
.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;
|
||||
}
|
||||
@media only screen and (min-width: 540px) {
|
||||
.pattern-list {
|
||||
display: flex;
|
||||
gap: 32px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
@ -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');
|
||||
|
||||
|
36
src/mixins/ComputedGamepads.vue
Normal file
36
src/mixins/ComputedGamepads.vue
Normal 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>
|
@ -2,14 +2,14 @@ import IVibrationActuator from '@/models/IVibrationActuator';
|
||||
import IGamepadButton from '@/models/IGamepadButton';
|
||||
|
||||
interface IGamepad {
|
||||
readonly id: string;
|
||||
readonly index: number;
|
||||
readonly timestamp: number;
|
||||
readonly connected: boolean;
|
||||
readonly mapping: string;
|
||||
readonly axes: number[];
|
||||
readonly buttons: IGamepadButton[];
|
||||
readonly vibrationActuator: IVibrationActuator;
|
||||
readonly id: string;
|
||||
readonly index: number;
|
||||
readonly timestamp: number;
|
||||
readonly connected: boolean;
|
||||
readonly mapping: string;
|
||||
readonly axes: number[];
|
||||
readonly buttons: IGamepadButton[];
|
||||
readonly vibrationActuator: IVibrationActuator;
|
||||
}
|
||||
|
||||
export default IGamepad;
|
||||
|
@ -1,7 +1,7 @@
|
||||
interface IGamepadButton {
|
||||
readonly pressed: boolean;
|
||||
readonly touched: boolean;
|
||||
readonly value: number;
|
||||
readonly pressed: boolean;
|
||||
readonly touched: boolean;
|
||||
readonly value: number;
|
||||
}
|
||||
|
||||
export default IGamepadButton;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import IGamepad from '@/models/IGamepad';
|
||||
|
||||
interface IGamepadEvent {
|
||||
readonly gamepad: IGamepad;
|
||||
readonly gamepad: IGamepad;
|
||||
}
|
||||
|
||||
export default IGamepadEvent;
|
||||
|
@ -1,8 +1,8 @@
|
||||
interface IPatternUnit {
|
||||
startDelay: number;
|
||||
duration: number;
|
||||
weakMagnitude: number;
|
||||
strongMagnitude: number;
|
||||
startDelay: number;
|
||||
duration: number;
|
||||
weakMagnitude: number;
|
||||
strongMagnitude: number;
|
||||
}
|
||||
|
||||
export default IPatternUnit;
|
||||
|
@ -1,9 +1,9 @@
|
||||
import TPatternUnit from '@/models/TPatternUnit';
|
||||
|
||||
interface IVibrationActuator {
|
||||
readonly type: string;
|
||||
reset(): void;
|
||||
playEffect(mode: string, pattern: TPatternUnit): void;
|
||||
readonly type: string;
|
||||
reset(): void;
|
||||
playEffect(mode: string, pattern: TPatternUnit): void;
|
||||
}
|
||||
|
||||
export default IVibrationActuator;
|
||||
|
@ -2,16 +2,16 @@ import TPatternUnit from '@/models/TPatternUnit';
|
||||
import IGamepad from '@/models/IGamepad';
|
||||
|
||||
interface IVibrator {
|
||||
unit: IGamepad;
|
||||
readonly id: number;
|
||||
readonly canVibrate: boolean;
|
||||
isVibrating: boolean;
|
||||
interval: number;
|
||||
update(): void;
|
||||
loop(pattern: TPatternUnit[]): void;
|
||||
vibrate(pattern: TPatternUnit): void;
|
||||
reset(): void;
|
||||
sleep(ms: number): Promise<number>;
|
||||
unit: IGamepad;
|
||||
readonly id: number;
|
||||
readonly canVibrate: boolean;
|
||||
isVibrating: boolean;
|
||||
interval: number;
|
||||
update(): void;
|
||||
loop(pattern: TPatternUnit[]): Promise<void>;
|
||||
vibrate(pattern: TPatternUnit): void;
|
||||
reset(): void;
|
||||
sleep(ms: number): Promise<number>;
|
||||
}
|
||||
|
||||
export default IVibrator;
|
||||
|
@ -2,20 +2,20 @@ import IPatternUnit from "@/models/IPatternUnit";
|
||||
|
||||
class PatternUnit implements IPatternUnit {
|
||||
|
||||
startDelay: number;
|
||||
duration: number;
|
||||
weakMagnitude: number;
|
||||
strongMagnitude: number;
|
||||
startDelay: number;
|
||||
duration: number;
|
||||
weakMagnitude: number;
|
||||
strongMagnitude: number;
|
||||
|
||||
constructor(
|
||||
startDelay: number, duration: number,
|
||||
weakMagnitude: number, strongMagnitude: number
|
||||
) {
|
||||
this.startDelay = startDelay;
|
||||
this.duration = duration;
|
||||
this.weakMagnitude = weakMagnitude;
|
||||
this.strongMagnitude = strongMagnitude;
|
||||
}
|
||||
constructor(
|
||||
startDelay: number, duration: number,
|
||||
weakMagnitude: number, strongMagnitude: number
|
||||
) {
|
||||
this.startDelay = startDelay;
|
||||
this.duration = duration;
|
||||
this.weakMagnitude = weakMagnitude;
|
||||
this.strongMagnitude = strongMagnitude;
|
||||
}
|
||||
}
|
||||
|
||||
export default PatternUnit;
|
||||
|
@ -1,10 +1,10 @@
|
||||
import TPatternUnit from '@/models/TPatternUnit';
|
||||
|
||||
type TPattern = {
|
||||
name: string;
|
||||
type: string;
|
||||
icon: string;
|
||||
pattern: TPatternUnit[];
|
||||
name: string;
|
||||
type: string;
|
||||
icon: string;
|
||||
pattern: TPatternUnit[];
|
||||
}
|
||||
|
||||
export default TPattern;
|
||||
|
@ -1,8 +1,8 @@
|
||||
type TPatternUnit = {
|
||||
startDelay: number;
|
||||
duration: number;
|
||||
weakMagnitude: number;
|
||||
strongMagnitude: number;
|
||||
startDelay: number;
|
||||
duration: number;
|
||||
weakMagnitude: number;
|
||||
strongMagnitude: number;
|
||||
}
|
||||
|
||||
export default TPatternUnit;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user