diff --git a/docs/css/styles.css b/docs/css/styles.css index f0d01cd..98ed54c 100644 --- a/docs/css/styles.css +++ b/docs/css/styles.css @@ -1,3 +1,9 @@ +/* ------------------------------ */ +/* Wavelovers styles */ +/* version: dated 2022.07.23 */ +/* author: Eugene Serb */ +/* ------------------------------ */ + /* ------------------------------ */ /* RESET AND BASE STYLES' TUNE UP */ /* ------------------------------ */ @@ -176,7 +182,7 @@ legend { fieldset { border: 2px solid var(--color-border-alpha); - border-radius: 4px; + border-radius: var(--number-border-radius); padding: 8px; } diff --git a/docs/index.html b/docs/index.html index 0ca3afc..1e9778d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -15,4 +15,4 @@ trackLinks: true, accurateTrackBounce: true, webvisor: true - }); \ No newline at end of file + }); \ No newline at end of file diff --git a/docs/js/548.8603e4a4.js b/docs/js/548.b0cff884.js similarity index 96% rename from docs/js/548.8603e4a4.js rename to docs/js/548.b0cff884.js index cfdbbf3..0a88fcb 100644 --- a/docs/js/548.8603e4a4.js +++ b/docs/js/548.b0cff884.js @@ -1,2 +1,2 @@ "use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[548],{2548:function(e,a,n){n.r(a),n.d(a,{default:function(){return c}});var t=n(3396);const s={class:"page container"},i=(0,t.uE)('

Wavelovers � About

About

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.


Write me: eugene.serb@gmail.com
Visit my homepage: eugene-serb.github.io

Advertising

If you have advertising suggestions, please mail me: eugene.serb@gmail.com
',2),r=[i];function o(e,a,n,i,o,u){return(0,t.wg)(),(0,t.iD)("main",s,r)}var u=(0,t.aZ)({name:"AboutView"}),l=n(89);const h=(0,l.Z)(u,[["render",o]]);var c=h}}]); -//# sourceMappingURL=548.8603e4a4.js.map \ No newline at end of file +//# sourceMappingURL=548.b0cff884.js.map \ No newline at end of file diff --git a/docs/js/548.8603e4a4.js.map b/docs/js/548.b0cff884.js.map similarity index 66% rename from docs/js/548.8603e4a4.js.map rename to docs/js/548.b0cff884.js.map index 9827620..3c09555 100644 --- a/docs/js/548.8603e4a4.js.map +++ b/docs/js/548.b0cff884.js.map @@ -1 +1 @@ -{"version":3,"file":"js/548.8603e4a4.js","mappings":"8KAEA,MAAMA,EAAa,CAAEC,MAAO,kBACtBC,GAA0BC,EAAAA,EAAAA,IAAmB,4uBAAmwB,GAChzBC,EAAa,CACjBF,GAGI,SAAUG,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,OAAQb,EAAYI,EAC/D,CCPG,OAAeU,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,c,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASX,KAEpE,O","sources":["webpack://wavelovers/./src/views/AboutView.vue?8926","webpack://wavelovers/./src/views/AboutView.vue?f245","webpack://wavelovers/./src/views/AboutView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"

Wavelovers � About

About

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.


Write me: eugene.serb@gmail.com
Visit my homepage: eugene-serb.github.io

Advertising

If you have advertising suggestions, please mail me: eugene.serb@gmail.com
\", 2)\nconst _hoisted_4 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, _hoisted_4))\n}","\n import { defineComponent } from 'vue';\n\n export default defineComponent({\n name: 'AboutView',\n });\n","import { render } from \"./AboutView.vue?vue&type=template&id=e4a163de&ts=true\"\nimport script from \"./AboutView.vue?vue&type=script&lang=ts\"\nexport * from \"./AboutView.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_createStaticVNode","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","defineComponent","name","__exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/548.b0cff884.js","mappings":"8KAEA,MAAMA,EAAa,CAAEC,MAAO,kBACtBC,GAA0BC,EAAAA,EAAAA,IAAmB,4uBAAmwB,GAChzBC,EAAa,CACjBF,GAGI,SAAUG,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,OAAQb,EAAYI,EAC/D,CCPG,OAAeU,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,c,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASX,KAEpE,O","sources":["webpack://wavelovers/./src/views/AboutView.vue?8926","webpack://wavelovers/./src/views/AboutView.vue?f245","webpack://wavelovers/./src/views/AboutView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"

Wavelovers � About

About

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.


Write me: eugene.serb@gmail.com
Visit my homepage: eugene-serb.github.io

Advertising

If you have advertising suggestions, please mail me: eugene.serb@gmail.com
\", 2)\nconst _hoisted_4 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, _hoisted_4))\n}","\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=e4a163de&ts=true\"\nimport script from \"./AboutView.vue?vue&type=script&lang=ts\"\nexport * from \"./AboutView.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_createStaticVNode","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","defineComponent","name","__exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/js/877.a8dd8d41.js b/docs/js/877.d6ed6a75.js similarity index 98% rename from docs/js/877.a8dd8d41.js rename to docs/js/877.d6ed6a75.js index f5cc929..1b55a57 100644 --- a/docs/js/877.a8dd8d41.js +++ b/docs/js/877.d6ed6a75.js @@ -1,2 +1,2 @@ "use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[877],{877:function(a,e,s){s.r(e),s.d(e,{default:function(){return l}});var r=s(3396);const n={class:"page container"},t=(0,r.uE)('

Wavelovers � FAQ

FAQ

What is the purpose of this software?
Everyone decides for himself, but can be used as a gamepad vibration tester, or as a hand massager.

Can I use this software as a hand massager?
Yes of course. If you use this as a massager, then before the session I recommend consulting with a doctor.

I have a gamepad with vibration, what should I do before using it as a hand massager?
I recommend checking the device for correct operation, mechanical damage, and be sure to use an antiseptic.

I'm having problems with the app or connecting my device to the app?
Go to Troubleshooting.

Troubleshooting

If you are having difficulty detecting a gamepad by the browser, you can use the utility Gamepad Master

The app does not see my device.
Make sure you have a chromium-based browser, then update the app and reconnect your device.

The application sees the gamepad, but writes that the vibration actuator is missing.
This problem is specific to mozilla firefox browser and d-input mode. Check the system requirements before using the software.

My question is not here.
Write me eugene.serb@gmail.com

System Requirements

Gamepad:
X-Input and vibration actuator required.

Browser:
Google Chrome or any other Chromium-based browser is recommended.

Operating System:
Windows 7 or higher recommended.
',2),i=[t];function o(a,e,s,t,o,p){return(0,r.wg)(),(0,r.iD)("main",n,i)}var p=(0,r.aZ)({name:"FaqView"}),c=s(89);const h=(0,c.Z)(p,[["render",o]]);var l=h}}]); -//# sourceMappingURL=877.a8dd8d41.js.map \ No newline at end of file +//# sourceMappingURL=877.d6ed6a75.js.map \ No newline at end of file diff --git a/docs/js/877.a8dd8d41.js.map b/docs/js/877.d6ed6a75.js.map similarity index 80% rename from docs/js/877.a8dd8d41.js.map rename to docs/js/877.d6ed6a75.js.map index a0181b2..9d22a69 100644 --- a/docs/js/877.a8dd8d41.js.map +++ b/docs/js/877.d6ed6a75.js.map @@ -1 +1 @@ -{"version":3,"file":"js/877.a8dd8d41.js","mappings":"6KAEA,MAAMA,EAAa,CAAEC,MAAO,kBACtBC,GAA0BC,EAAAA,EAAAA,IAAmB,i3EAAg7E,GAC79EC,EAAa,CACjBF,GAGI,SAAUG,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,OAAQb,EAAYI,EAC/D,CCPG,OAAeU,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,Y,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASX,KAEpE,O","sources":["webpack://wavelovers/./src/views/FaqView.vue?8fb5","webpack://wavelovers/./src/views/FaqView.vue?a581","webpack://wavelovers/./src/views/FaqView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"

Wavelovers � FAQ

FAQ

What is the purpose of this software?
Everyone decides for himself, but can be used as a gamepad vibration tester, or as a hand massager.

Can I use this software as a hand massager?
Yes of course. If you use this as a massager, then before the session I recommend consulting with a doctor.

I have a gamepad with vibration, what should I do before using it as a hand massager?
I recommend checking the device for correct operation, mechanical damage, and be sure to use an antiseptic.

I'm having problems with the app or connecting my device to the app?
Go to Troubleshooting.

Troubleshooting

If you are having difficulty detecting a gamepad by the browser, you can use the utility Gamepad Master

The app does not see my device.
Make sure you have a chromium-based browser, then update the app and reconnect your device.

The application sees the gamepad, but writes that the vibration actuator is missing.
This problem is specific to mozilla firefox browser and d-input mode. Check the system requirements before using the software.

My question is not here.
Write me eugene.serb@gmail.com

System Requirements

Gamepad:
X-Input and vibration actuator required.

Browser:
Google Chrome or any other Chromium-based browser is recommended.

Operating System:
Windows 7 or higher recommended.
\", 2)\nconst _hoisted_4 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, _hoisted_4))\n}","\n import { defineComponent } from 'vue';\n\n export default defineComponent({\n name: 'FaqView',\n });\n","import { render } from \"./FaqView.vue?vue&type=template&id=aad19c66&ts=true\"\nimport script from \"./FaqView.vue?vue&type=script&lang=ts\"\nexport * from \"./FaqView.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_createStaticVNode","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","defineComponent","name","__exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/877.d6ed6a75.js","mappings":"6KAEA,MAAMA,EAAa,CAAEC,MAAO,kBACtBC,GAA0BC,EAAAA,EAAAA,IAAmB,i3EAAg7E,GAC79EC,EAAa,CACjBF,GAGI,SAAUG,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,OAAQb,EAAYI,EAC/D,CCPG,OAAeU,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,Y,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASX,KAEpE,O","sources":["webpack://wavelovers/./src/views/FaqView.vue?8fb5","webpack://wavelovers/./src/views/FaqView.vue?a581","webpack://wavelovers/./src/views/FaqView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"

Wavelovers � FAQ

FAQ

What is the purpose of this software?
Everyone decides for himself, but can be used as a gamepad vibration tester, or as a hand massager.

Can I use this software as a hand massager?
Yes of course. If you use this as a massager, then before the session I recommend consulting with a doctor.

I have a gamepad with vibration, what should I do before using it as a hand massager?
I recommend checking the device for correct operation, mechanical damage, and be sure to use an antiseptic.

I'm having problems with the app or connecting my device to the app?
Go to Troubleshooting.

Troubleshooting

If you are having difficulty detecting a gamepad by the browser, you can use the utility Gamepad Master

The app does not see my device.
Make sure you have a chromium-based browser, then update the app and reconnect your device.

The application sees the gamepad, but writes that the vibration actuator is missing.
This problem is specific to mozilla firefox browser and d-input mode. Check the system requirements before using the software.

My question is not here.
Write me eugene.serb@gmail.com

System Requirements

Gamepad:
X-Input and vibration actuator required.

Browser:
Google Chrome or any other Chromium-based browser is recommended.

Operating System:
Windows 7 or higher recommended.
\", 2)\nconst _hoisted_4 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, _hoisted_4))\n}","\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=aad19c66&ts=true\"\nimport script from \"./FaqView.vue?vue&type=script&lang=ts\"\nexport * from \"./FaqView.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_createStaticVNode","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","defineComponent","name","__exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/js/93.22832789.js b/docs/js/93.3a3c9684.js similarity index 97% rename from docs/js/93.22832789.js rename to docs/js/93.3a3c9684.js index 82468b5..e04bcbd 100644 --- a/docs/js/93.22832789.js +++ b/docs/js/93.3a3c9684.js @@ -1,2 +1,2 @@ "use strict";(self["webpackChunkwavelovers"]=self["webpackChunkwavelovers"]||[]).push([[93],{93:function(e,a,n){n.r(a),n.d(a,{default:function(){return m}});var s=n(3396);const o={class:"page container"},r=(0,s.uE)('

Wavelovers � Donate

Donate

If you like this app, you can thank me and donate to me.

Why should you donate to Wavelovers?

More donation = more money
More money allows me buy more coffee
More coffee makes me write more code
More code means more features
More features make you more happiness and productive
More happiness and productive so you earn more money
More money you earn more donation to me

Bitcoin: bc1qspzgj7xrf099s2ej8f5zmm52xu0wkfurpezny5
DonationAlert: @eugene_serb
',2),t=[r];function p(e,a,n,r,p,i){return(0,s.wg)(),(0,s.iD)("main",o,t)}var i=(0,s.aZ)({name:"DonateView"}),u=n(89);const c=(0,u.Z)(i,[["render",p]]);var m=c}}]); -//# sourceMappingURL=93.22832789.js.map \ No newline at end of file +//# sourceMappingURL=93.3a3c9684.js.map \ No newline at end of file diff --git a/docs/js/93.22832789.js.map b/docs/js/93.3a3c9684.js.map similarity index 68% rename from docs/js/93.22832789.js.map rename to docs/js/93.3a3c9684.js.map index 8437916..25865d0 100644 --- a/docs/js/93.22832789.js.map +++ b/docs/js/93.3a3c9684.js.map @@ -1 +1 @@ -{"version":3,"file":"js/93.22832789.js","mappings":"2KAEA,MAAMA,EAAa,CAAEC,MAAO,kBACtBC,GAA0BC,EAAAA,EAAAA,IAAmB,y8BAA49B,GACzgCC,EAAa,CACjBF,GAGI,SAAUG,EAAOC,EAAUC,EAAYC,EAAYC,EAAYC,EAAWC,GAC9E,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,OAAQb,EAAYI,EAC/D,CCPG,OAAeU,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,e,QCCd,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASX,KAEpE,O","sources":["webpack://wavelovers/./src/views/DonateView.vue?562c","webpack://wavelovers/./src/views/DonateView.vue?82fb","webpack://wavelovers/./src/views/DonateView.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"

Wavelovers � Donate

Donate

If you like this app, you can thank me and donate to me.

Why should you donate to Wavelovers?

More donation = more money
More money allows me buy more coffee
More coffee makes me write more code
More code means more features
More features make you more happiness and productive
More happiness and productive so you earn more money
More money you earn more donation to me

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

Wavelovers � Donate

Donate

If you like this app, you can thank me and donate to me.

Why should you donate to Wavelovers?

More donation = more money
More money allows me buy more coffee
More coffee makes me write more code
More code means more features
More features make you more happiness and productive
More happiness and productive so you earn more money
More money you earn more donation to me

Bitcoin: bc1qspzgj7xrf099s2ej8f5zmm52xu0wkfurpezny5
DonationAlert: @eugene_serb
\", 2)\nconst _hoisted_4 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, _hoisted_4))\n}","\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=5d4cd0d6&ts=true\"\nimport script from \"./DonateView.vue?vue&type=script&lang=ts\"\nexport * from \"./DonateView.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_createStaticVNode","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","defineComponent","name","__exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/js/app.ed7ad2c3.js b/docs/js/app.66bfd240.js similarity index 99% rename from docs/js/app.ed7ad2c3.js rename to docs/js/app.66bfd240.js index c249398..54b1d0c 100644 --- a/docs/js/app.ed7ad2c3.js +++ b/docs/js/app.66bfd240.js @@ -1,2 +1,2 @@ -(function(){"use strict";var e={970:function(e,t,a){var n=a(9242),r=a(3396);function o(e,t,a,n,o,i){const s=(0,r.up)("AppHeader"),c=(0,r.up)("router-view"),l=(0,r.up)("AppFooter");return(0,r.wg)(),(0,r.iD)(r.HY,null,[(0,r.Wm)(s),(0,r.Wm)(c),(0,r.Wm)(l)],64)}const i={class:"header"},s={class:"header-wrapper container"},c=(0,r._)("div",{class:"logo-wrapper"},[(0,r._)("span",{class:"logo-wrapper__logo",translate:"no"},"Wavelovers")],-1),l={class:"menu-wrapper"},d={class:"navigation"},u={class:"navigation__item"},v=(0,r.Uk)("Home"),m={class:"navigation__item"},p=(0,r.Uk)("FAQ"),h={class:"navigation__item"},g=(0,r.Uk)("About"),f={class:"navigation__item"},b=(0,r.Uk)("Donate");function w(e,t,a,n,o,w){const y=(0,r.up)("router-link");return(0,r.wg)(),(0,r.iD)("header",i,[(0,r._)("div",s,[c,(0,r._)("nav",l,[(0,r._)("ul",d,[(0,r._)("li",u,[(0,r.Wm)(y,{to:"/",class:"navigation__link"},{default:(0,r.w5)((()=>[v])),_:1})]),(0,r._)("li",m,[(0,r.Wm)(y,{to:"/faq",class:"navigation__link"},{default:(0,r.w5)((()=>[p])),_:1})]),(0,r._)("li",h,[(0,r.Wm)(y,{to:"/about",class:"navigation__link"},{default:(0,r.w5)((()=>[g])),_:1})]),(0,r._)("li",f,[(0,r.Wm)(y,{to:"/donate",class:"navigation__link"},{default:(0,r.w5)((()=>[b])),_:1})])])])])])}var y=(0,r.aZ)({name:"AppHeader"}),W=a(89);const _=(0,W.Z)(y,[["render",w]]);var k=_;const A={class:"footer"},V=(0,r.uE)('',1),T=[V];function P(e,t,a,n,o,i){return(0,r.wg)(),(0,r.iD)("footer",A,T)}var G=(0,r.aZ)({name:"AppFooter"});const C=(0,W.Z)(G,[["render",P]]);var E=C,j=(0,r.aZ)({name:"App",components:{AppHeader:k,AppFooter:E}});const Z=(0,W.Z)(j,[["render",o]]);var x=Z,D=a(2483);const M={class:"page container"},L=(0,r._)("h1",{class:"visually-hidden"},"Wavelovers",-1);function O(e,t,a,n,o,i){const s=(0,r.up)("WaveloversApp");return(0,r.wg)(),(0,r.iD)("main",M,[L,(0,r.Wm)(s)])}const S={class:"wavelovers"},F=(0,r.Uk)("Loading..."),q=(0,r.Uk)("Press any gamepad's button or connect new gamepad.");function I(e,t,a,n,o,i){const s=(0,r.up)("PatternList"),c=(0,r.up)("MessageItem"),l=(0,r.up)("GamepadList");return(0,r.wg)(),(0,r.iD)("div",S,[e.patterns.length>0?((0,r.wg)(),(0,r.j4)(s,{key:0,patterns:e.patterns,mode:e.mode,isActive:e.isActive,onChange:e.change},null,8,["patterns","mode","isActive","onChange"])):((0,r.wg)(),(0,r.j4)(c,{key:1},{default:(0,r.w5)((()=>[F])),_:1})),e.gamepads.length>0?((0,r.wg)(),(0,r.j4)(l,{key:2,gamepads:e.gamepads},null,8,["gamepads"])):((0,r.wg)(),(0,r.j4)(c,{key:3},{default:(0,r.w5)((()=>[q])),_:1}))])}const N={class:"pattern-list"};function U(e,t,a,n,o,i){const s=(0,r.up)("PatternItem");return(0,r.wg)(),(0,r.iD)("div",N,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.patterns,((t,a)=>((0,r.wg)(),(0,r.j4)(s,{key:t.name,pattern:t,index:a,mode:e.mode,isActive:e.isActive,onChange:e.change},null,8,["pattern","index","mode","isActive","onChange"])))),128))])}var H=a(7139);const z=["textContent"],B=["textContent"];function Q(e,t,a,n,o,i){return(0,r.wg)(),(0,r.iD)("div",{onClick:t[0]||(t[0]=t=>e.change(e.index)),class:(0,H.C_)(["pattern-item",e.index===e.mode&&!0===e.isActive?"pattern-item_selected":""])},[(0,r._)("span",{class:"pattern-item__icon",textContent:(0,H.zw)(e.pattern.icon)},null,8,z),(0,r._)("span",{class:"pattern-item__name",textContent:(0,H.zw)(e.pattern.name)},null,8,B)],2)}var R=(0,r.aZ)({name:"PatternItem",props:{pattern:{type:Object},index:{type:Number},mode:{type:Number},isActive:{type:Boolean}},methods:{change(e){this.$emit("change",e)}}});const K=(0,W.Z)(R,[["render",Q]]);var Y=K,$=(0,r.aZ)({name:"PatternList",props:{patterns:{type:Array},mode:{type:Number},isActive:{type:Boolean}},components:{PatternItem:Y},methods:{change(e){this.$emit("change",e)}}});const J=(0,W.Z)($,[["render",U]]);var X=J;const ee={class:"device-list"};function te(e,t,a,n,o,i){const s=(0,r.up)("GamepadItem");return(0,r.wg)(),(0,r.iD)("div",ee,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.gamepads,(e=>((0,r.wg)(),(0,r.j4)(s,{key:e.id,textContent:(0,H.zw)(e.unit.id)},null,8,["textContent"])))),128))])}const ae={class:"list-item"};function ne(e,t,a,n,o,i){return(0,r.wg)(),(0,r.iD)("div",ae)}var re=(0,r.aZ)({name:"GamepadItem"});const oe=(0,W.Z)(re,[["render",ne]]);var ie=oe,se=(0,r.aZ)({name:"GamepadList",props:{gamepads:{type:Array}},components:{GamepadItem:ie}});const ce=(0,W.Z)(se,[["render",te]]);var le=ce;const de={class:"message"};function ue(e,t,a,n,o,i){return(0,r.wg)(),(0,r.iD)("div",de,[(0,r._)("span",null,[(0,r.WI)(e.$slots,"default")])])}var ve=(0,r.aZ)({name:"MessageItem"});const me=(0,W.Z)(ve,[["render",ue]]);var pe=me,he=a(2482);class ge{constructor(e){(0,he.Z)(this,"id",void 0),(0,he.Z)(this,"canVibrate",void 0),(0,he.Z)(this,"isVibrating",void 0),(0,he.Z)(this,"unit",void 0),(0,he.Z)(this,"pattern",void 0),this.unit=e,this.id=Date.now(),this.canVibrate=!!this.unit.vibrationActuator,this.isVibrating=!1,this.pattern=[]}update(){const e=navigator.getGamepads();this.unit=e[this.unit.index]}reset(){this.isVibrating=!1,this.unit.vibrationActuator.reset()}async vibrate(e){this.isVibrating=!0,this.pattern=e;while(!0===this.isVibrating)for(let e=0;esetTimeout(t,e)))}}var fe=(0,r.aZ)({name:"WaveloversApp",components:{PatternList:X,GamepadList:le,MessageItem:pe},data:()=>({gamepads:[],patterns:[],isActive:!1,mode:0}),methods:{loadPatterns:async function(){const e="https://wavelovers.ru/assets/patterns.json";try{const t=await fetch(e);if(t.ok){let e=await t.json();this.patterns=e}else console.log("Connect to the Internet for download more patterns...")}catch(t){console.log(t)}},addEventListeners(){window.addEventListener("gamepadconnected",(e=>this.addGamepad(e))),window.addEventListener("gamepaddisconnected",(e=>this.deleteGamepad(e)))},addGamepad(e){const t=e;this.gamepads.length>=1||this.gamepads.push(new ge(t.gamepad))},deleteGamepad(e){this.gamepads.forEach(((t,a)=>{t.unit.id===e.gamepad.id&&this.gamepads.splice(a,1)}))},change(e){this.mode===e?(this.isActive=!this.isActive,this.reset()):(this.isActive=!0,this.mode=e),!0===this.isActive&&(this.reset(),this.vibrate())},vibrate(){this.gamepads.forEach((e=>{e.vibrate(this.patterns[this.mode].pattern)}))},reset(){this.gamepads.forEach((e=>{e.reset()}))}},mounted(){this.loadPatterns(),this.addEventListeners()}});const be=(0,W.Z)(fe,[["render",I]]);var we=be,ye=(0,r.aZ)({name:"HomeView",components:{WaveloversApp:we}});const We=(0,W.Z)(ye,[["render",O]]);var _e=We;function ke(e,t){e.map((e=>{const a=document.createElement(t);return Object.keys(e).forEach((t=>{a.setAttribute(t,e[t])})),a.setAttribute("data-vue-router-controlled",""),a})).forEach((e=>document.head.appendChild(e)))}function Ae(e,t,a){const n=e.matched.slice().reverse().find((e=>e.meta&&e.meta.title)),r=e.matched.slice().reverse().find((e=>e.meta&&e.meta.metaTags&&e.meta.linkTags));if(n&&(document.title=n.meta.title),Array.from(document.querySelectorAll("[data-vue-router-controlled]")).map((e=>{e.parentNode&&e.parentNode.removeChild(e)})),!r)return a();const o=r.meta.linkTags,i=r.meta.metaTags;return ke(o,"link"),ke(i,"meta"),a()}const Ve={update:Ae};var Te=Ve;const Pe=[{path:"/",name:"home",component:_e,meta:{title:"Wavelovers",metaTags:[{name:"description",content:"Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad."},{name:"keywords",content:"Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона"},{name:"og:title",content:"Wavelovers"},{name:"og:description",content:"Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad."},{name:"og:url",content:"https://wavelovers.ru/"},{name:"twitter:title",content:"Wavelovers"},{name:"twitter:description",content:"Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad."}],linkTags:[{name:"canonical",href:"https://wavelovers.ru/"}]}},{path:"/about",name:"about",component:()=>a.e(548).then(a.bind(a,2548)),meta:{title:"Wavelovers – About",metaTags:[{name:"description",content:"Wavelovers. Page with information about the project and data on donations."},{name:"keywords",content:"Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, advertise, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, реклама"},{name:"og:title",content:"Wavelovers – About"},{name:"og:description",content:"Wavelovers. Page with information about the project and data on donations."},{name:"og:url",content:"https://wavelovers.ru/about"},{name:"twitter:title",content:"Wavelovers – About"},{name:"twitter:description",content:"Wavelovers. Page with information about the project and data on donations."}],linkTags:[{name:"canonical",href:"https://wavelovers.ru/about"}]}},{path:"/faq",name:"faq",component:()=>a.e(877).then(a.bind(a,877)),meta:{title:"Wavelovers – FAQ",metaTags:[{name:"description",content:"Wavelovers. Frequently asked questions page."},{name:"keywords",content:"Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, FAQ, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, часто задаваемые вопросы"},{name:"og:title",content:"Wavelovers – FAQ"},{name:"og:description",content:"Wavelovers. Frequently asked questions page."},{name:"og:url",content:"https://wavelovers.ru/faq"},{name:"twitter:title",content:"Wavelovers – FAQ"},{name:"twitter:description",content:"Wavelovers. Frequently asked questions page."}],linkTags:[{name:"canonical",href:"https://wavelovers.ru/faq"}]}},{path:"/donate",name:"donate",component:()=>a.e(93).then(a.bind(a,93)),meta:{title:"Wavelovers – Donate",metaTags:[{name:"description",content:"Wavelovers. Donate to the author."},{name:"keywords",content:"Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, Donate, Support, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, задонатить, пожертвовать, помочь, поблагодарить"},{name:"og:title",content:"Wavelovers – Donate"},{name:"og:description",content:"Wavelovers. Donate to the author."},{name:"og:url",content:"https://wavelovers.ru/donate"},{name:"twitter:title",content:"Wavelovers – Donate"},{name:"twitter:description",content:"Wavelovers. Donate to the author."}],linkTags:[{name:"canonical",href:"https://wavelovers.ru/donate"}]}},{path:"/404",name:"404",component:()=>a.e(447).then(a.bind(a,8447)),meta:{title:"Wavelovers – 404 Page not found",metaTags:[{name:"description",content:"Wavelovers. Page not found."},{name:"keywords",content:"Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, 404, page not found, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, 404, страница не найдена"},{name:"og:title",content:"Wavelovers – 404 Page not found"},{name:"og:description",content:"Wavelovers. Page not found."},{name:"og:url",content:"https://wavelovers.ru/404"},{name:"twitter:title",content:"Wavelovers – 404 Page not found"},{name:"twitter:description",content:"Wavelovers. Page not found."}],linkTags:[{name:"canonical",href:"https://wavelovers.ru/404"}]}},{path:"/:catchAll(.*)",redirect:"/404"}],Ge=(0,D.p7)({history:(0,D.PO)("/"),routes:Pe});Ge.beforeEach(Te.update);var Ce=Ge;(0,n.ri)(x).use(Ce).mount("#app")}},t={};function a(n){var r=t[n];if(void 0!==r)return r.exports;var o=t[n]={exports:{}};return e[n](o,o.exports,a),o.exports}a.m=e,function(){var e=[];a.O=function(t,n,r,o){if(!n){var i=1/0;for(d=0;d=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[c])}))?n.splice(c--,1):(s=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,r,o]}}(),function(){a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,{a:t}),t}}(),function(){a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}}(),function(){a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))}}(),function(){a.u=function(e){return"js/"+e+"."+{93:"22832789",447:"cde26208",548:"8603e4a4",877:"a8dd8d41"}[e]+".js"}}(),function(){a.miniCssF=function(e){return"css/"+e+".c8608f84.css"}}(),function(){a.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="wavelovers:";a.l=function(n,r,o,i){if(e[n])e[n].push(r);else{var s,c;if(void 0!==o)for(var l=document.getElementsByTagName("script"),d=0;d[v])),_:1})]),(0,r._)("li",m,[(0,r.Wm)(y,{to:"/faq",class:"navigation__link"},{default:(0,r.w5)((()=>[p])),_:1})]),(0,r._)("li",h,[(0,r.Wm)(y,{to:"/about",class:"navigation__link"},{default:(0,r.w5)((()=>[g])),_:1})]),(0,r._)("li",f,[(0,r.Wm)(y,{to:"/donate",class:"navigation__link"},{default:(0,r.w5)((()=>[b])),_:1})])])])])])}var y=(0,r.aZ)({name:"AppHeader"}),W=a(89);const _=(0,W.Z)(y,[["render",w]]);var k=_;const A={class:"footer"},V=(0,r.uE)('',1),T=[V];function P(e,t,a,n,o,i){return(0,r.wg)(),(0,r.iD)("footer",A,T)}var G=(0,r.aZ)({name:"AppFooter"});const C=(0,W.Z)(G,[["render",P]]);var E=C,j=(0,r.aZ)({name:"App",components:{AppHeader:k,AppFooter:E}});const Z=(0,W.Z)(j,[["render",o]]);var x=Z,D=a(2483);const M={class:"page container"},L=(0,r._)("h1",{class:"visually-hidden"},"Wavelovers",-1);function O(e,t,a,n,o,i){const s=(0,r.up)("WaveloversApp");return(0,r.wg)(),(0,r.iD)("main",M,[L,(0,r.Wm)(s)])}const S={class:"wavelovers"},F=(0,r.Uk)("Loading..."),q=(0,r.Uk)("Press any gamepad's button or connect new gamepad.");function I(e,t,a,n,o,i){const s=(0,r.up)("PatternList"),c=(0,r.up)("MessageItem"),l=(0,r.up)("GamepadList");return(0,r.wg)(),(0,r.iD)("div",S,[e.patterns.length>0?((0,r.wg)(),(0,r.j4)(s,{key:0,patterns:e.patterns,mode:e.mode,isActive:e.isActive,onChange:e.change},null,8,["patterns","mode","isActive","onChange"])):((0,r.wg)(),(0,r.j4)(c,{key:1},{default:(0,r.w5)((()=>[F])),_:1})),e.gamepads.length>0?((0,r.wg)(),(0,r.j4)(l,{key:2,gamepads:e.gamepads},null,8,["gamepads"])):((0,r.wg)(),(0,r.j4)(c,{key:3},{default:(0,r.w5)((()=>[q])),_:1}))])}const N={class:"pattern-list"};function U(e,t,a,n,o,i){const s=(0,r.up)("PatternItem");return(0,r.wg)(),(0,r.iD)("div",N,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.patterns,((t,a)=>((0,r.wg)(),(0,r.j4)(s,{key:t.name,pattern:t,index:a,mode:e.mode,isActive:e.isActive,onChange:e.change},null,8,["pattern","index","mode","isActive","onChange"])))),128))])}var H=a(7139);const z=["textContent"],B=["textContent"];function Q(e,t,a,n,o,i){return(0,r.wg)(),(0,r.iD)("div",{onClick:t[0]||(t[0]=t=>e.change(e.index)),class:(0,H.C_)(["pattern-item",e.index===e.mode&&!0===e.isActive?"pattern-item_selected":""])},[(0,r._)("span",{class:"pattern-item__icon",textContent:(0,H.zw)(e.pattern.icon)},null,8,z),(0,r._)("span",{class:"pattern-item__name",textContent:(0,H.zw)(e.pattern.name)},null,8,B)],2)}var R=(0,r.aZ)({name:"PatternItem",props:{pattern:{type:Object},index:{type:Number},mode:{type:Number},isActive:{type:Boolean}},methods:{change(e){this.$emit("change",e)}}});const K=(0,W.Z)(R,[["render",Q]]);var Y=K,$=(0,r.aZ)({name:"PatternList",props:{patterns:{type:Array},mode:{type:Number},isActive:{type:Boolean}},components:{PatternItem:Y},methods:{change(e){this.$emit("change",e)}}});const J=(0,W.Z)($,[["render",U]]);var X=J;const ee={class:"device-list"};function te(e,t,a,n,o,i){const s=(0,r.up)("GamepadItem");return(0,r.wg)(),(0,r.iD)("div",ee,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.gamepads,(e=>((0,r.wg)(),(0,r.j4)(s,{key:e.id,textContent:(0,H.zw)(e.unit.id)},null,8,["textContent"])))),128))])}const ae={class:"list-item"};function ne(e,t,a,n,o,i){return(0,r.wg)(),(0,r.iD)("div",ae)}var re=(0,r.aZ)({name:"GamepadItem"});const oe=(0,W.Z)(re,[["render",ne]]);var ie=oe,se=(0,r.aZ)({name:"GamepadList",props:{gamepads:{type:Array}},components:{GamepadItem:ie}});const ce=(0,W.Z)(se,[["render",te]]);var le=ce;const de={class:"message"};function ue(e,t,a,n,o,i){return(0,r.wg)(),(0,r.iD)("div",de,[(0,r._)("span",null,[(0,r.WI)(e.$slots,"default")])])}var ve=(0,r.aZ)({name:"MessageItem"});const me=(0,W.Z)(ve,[["render",ue]]);var pe=me,he=a(2482);class ge{constructor(e){(0,he.Z)(this,"id",void 0),(0,he.Z)(this,"canVibrate",void 0),(0,he.Z)(this,"isVibrating",void 0),(0,he.Z)(this,"unit",void 0),(0,he.Z)(this,"pattern",void 0),this.unit=e,this.id=Date.now(),this.canVibrate=!!this.unit.vibrationActuator,this.isVibrating=!1,this.pattern=[]}update(){const e=navigator.getGamepads();this.unit=e[this.unit.index]}reset(){this.isVibrating=!1,this.unit.vibrationActuator.reset()}async vibrate(e){this.isVibrating=!0,this.pattern=e;while(!0===this.isVibrating)for(let e=0;esetTimeout(t,e)))}}var fe=(0,r.aZ)({name:"WaveloversApp",components:{PatternList:X,GamepadList:le,MessageItem:pe},data:()=>({gamepads:[],patterns:[],isActive:!1,mode:0}),methods:{loadPatterns:async function(){const e="https://wavelovers.ru/assets/patterns.json";try{const t=await fetch(e);if(t.ok){let e=await t.json();this.patterns=e}else console.log("Connect to the Internet for download more patterns...")}catch(t){console.log(t)}},addEventListeners(){window.addEventListener("gamepadconnected",(e=>this.addGamepad(e))),window.addEventListener("gamepaddisconnected",(e=>this.deleteGamepad(e)))},addGamepad(e){const t=e;this.gamepads.length>=1||this.gamepads.push(new ge(t.gamepad))},deleteGamepad(e){this.gamepads.forEach(((t,a)=>{t.unit.id===e.gamepad.id&&this.gamepads.splice(a,1)}))},change(e){this.mode===e?(this.isActive=!this.isActive,this.reset()):(this.isActive=!0,this.mode=e),!0===this.isActive&&(this.reset(),this.vibrate())},vibrate(){this.gamepads.forEach((e=>{e.vibrate(this.patterns[this.mode].pattern)}))},reset(){this.gamepads.forEach((e=>{e.reset()}))}},mounted(){this.loadPatterns(),this.addEventListeners()}});const be=(0,W.Z)(fe,[["render",I]]);var we=be,ye=(0,r.aZ)({name:"HomeView",components:{WaveloversApp:we}});const We=(0,W.Z)(ye,[["render",O]]);var _e=We;function ke(e,t){e.map((e=>{const a=document.createElement(t);return Object.keys(e).forEach((t=>{a.setAttribute(t,e[t])})),a.setAttribute("data-vue-router-controlled",""),a})).forEach((e=>document.head.appendChild(e)))}function Ae(e,t,a){const n=e.matched.slice().reverse().find((e=>e.meta&&e.meta.title)),r=e.matched.slice().reverse().find((e=>e.meta&&e.meta.metaTags&&e.meta.linkTags));if(n&&(document.title=n.meta.title),Array.from(document.querySelectorAll("[data-vue-router-controlled]")).map((e=>{e.parentNode&&e.parentNode.removeChild(e)})),!r)return a();const o=r.meta.linkTags,i=r.meta.metaTags;return ke(o,"link"),ke(i,"meta"),a()}const Ve={update:Ae};var Te=Ve;const Pe=[{path:"/",name:"home",component:_e,meta:{title:"Wavelovers",metaTags:[{name:"description",content:"Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad."},{name:"keywords",content:"Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона"},{name:"og:title",content:"Wavelovers"},{name:"og:description",content:"Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad."},{name:"og:url",content:"https://wavelovers.ru/"},{name:"twitter:title",content:"Wavelovers"},{name:"twitter:description",content:"Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad."}],linkTags:[{name:"canonical",href:"https://wavelovers.ru/"}]}},{path:"/about",name:"about",component:()=>a.e(548).then(a.bind(a,2548)),meta:{title:"Wavelovers – About",metaTags:[{name:"description",content:"Wavelovers. Page with information about the project and data on donations."},{name:"keywords",content:"Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, advertise, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, реклама"},{name:"og:title",content:"Wavelovers – About"},{name:"og:description",content:"Wavelovers. Page with information about the project and data on donations."},{name:"og:url",content:"https://wavelovers.ru/about"},{name:"twitter:title",content:"Wavelovers – About"},{name:"twitter:description",content:"Wavelovers. Page with information about the project and data on donations."}],linkTags:[{name:"canonical",href:"https://wavelovers.ru/about"}]}},{path:"/faq",name:"faq",component:()=>a.e(877).then(a.bind(a,877)),meta:{title:"Wavelovers – FAQ",metaTags:[{name:"description",content:"Wavelovers. Frequently asked questions page."},{name:"keywords",content:"Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, FAQ, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, часто задаваемые вопросы"},{name:"og:title",content:"Wavelovers – FAQ"},{name:"og:description",content:"Wavelovers. Frequently asked questions page."},{name:"og:url",content:"https://wavelovers.ru/faq"},{name:"twitter:title",content:"Wavelovers – FAQ"},{name:"twitter:description",content:"Wavelovers. Frequently asked questions page."}],linkTags:[{name:"canonical",href:"https://wavelovers.ru/faq"}]}},{path:"/donate",name:"donate",component:()=>a.e(93).then(a.bind(a,93)),meta:{title:"Wavelovers – Donate",metaTags:[{name:"description",content:"Wavelovers. Donate to the author."},{name:"keywords",content:"Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, Donate, Support, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, задонатить, пожертвовать, помочь, поблагодарить"},{name:"og:title",content:"Wavelovers – Donate"},{name:"og:description",content:"Wavelovers. Donate to the author."},{name:"og:url",content:"https://wavelovers.ru/donate"},{name:"twitter:title",content:"Wavelovers – Donate"},{name:"twitter:description",content:"Wavelovers. Donate to the author."}],linkTags:[{name:"canonical",href:"https://wavelovers.ru/donate"}]}},{path:"/404",name:"404",component:()=>a.e(447).then(a.bind(a,8447)),meta:{title:"Wavelovers – 404 Page not found",metaTags:[{name:"description",content:"Wavelovers. Page not found."},{name:"keywords",content:"Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, 404, page not found, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, 404, страница не найдена"},{name:"og:title",content:"Wavelovers – 404 Page not found"},{name:"og:description",content:"Wavelovers. Page not found."},{name:"og:url",content:"https://wavelovers.ru/404"},{name:"twitter:title",content:"Wavelovers – 404 Page not found"},{name:"twitter:description",content:"Wavelovers. Page not found."}],linkTags:[{name:"canonical",href:"https://wavelovers.ru/404"}]}},{path:"/:catchAll(.*)",redirect:"/404"}],Ge=(0,D.p7)({history:(0,D.PO)("/"),routes:Pe});Ge.beforeEach(Te.update);var Ce=Ge;(0,n.ri)(x).use(Ce).mount("#app")}},t={};function a(n){var r=t[n];if(void 0!==r)return r.exports;var o=t[n]={exports:{}};return e[n](o,o.exports,a),o.exports}a.m=e,function(){var e=[];a.O=function(t,n,r,o){if(!n){var i=1/0;for(d=0;d=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[c])}))?n.splice(c--,1):(s=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,r,o]}}(),function(){a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,{a:t}),t}}(),function(){a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}}(),function(){a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))}}(),function(){a.u=function(e){return"js/"+e+"."+{93:"3a3c9684",447:"cde26208",548:"b0cff884",877:"d6ed6a75"}[e]+".js"}}(),function(){a.miniCssF=function(e){return"css/"+e+".c8608f84.css"}}(),function(){a.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="wavelovers:";a.l=function(n,r,o,i){if(e[n])e[n].push(r);else{var s,c;if(void 0!==o)for(var l=document.getElementsByTagName("script"),d=0;d [\n _hoisted_7\n ]),\n _: 1\n })\n ]),\n _createElementVNode(\"li\", _hoisted_8, [\n _createVNode(_component_router_link, {\n to: \"/faq\",\n class: \"navigation__link\"\n }, {\n default: _withCtx(() => [\n _hoisted_9\n ]),\n _: 1\n })\n ]),\n _createElementVNode(\"li\", _hoisted_10, [\n _createVNode(_component_router_link, {\n to: \"/about\",\n class: \"navigation__link\"\n }, {\n default: _withCtx(() => [\n _hoisted_11\n ]),\n _: 1\n })\n ]),\n _createElementVNode(\"li\", _hoisted_12, [\n _createVNode(_component_router_link, {\n to: \"/donate\",\n class: \"navigation__link\"\n }, {\n default: _withCtx(() => [\n _hoisted_13\n ]),\n _: 1\n })\n ])\n ])\n ])\n ])\n ]))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'AppHeader',\r\n });\r\n","import { render } from \"./AppHeader.vue?vue&type=template&id=3c5da208&ts=true\"\nimport script from \"./AppHeader.vue?vue&type=script&lang=ts\"\nexport * from \"./AppHeader.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__","import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"footer\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"
© 2022 Wavelovers. Content licensed under GNU General Public License v3.0
This site is open source. Improve this page.
Created byEugene Serb
\", 1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"footer\", _hoisted_1, _hoisted_3))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'AppFooter',\r\n });\r\n","import { render } from \"./AppFooter.vue?vue&type=template&id=3fc24ad0&ts=true\"\nimport script from \"./AppFooter.vue?vue&type=script&lang=ts\"\nexport * from \"./AppFooter.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__","\r\n import { defineComponent } from 'vue';\r\n import AppHeader from '@/components/AppHeader.vue';\r\n import AppFooter from '@/components/AppFooter.vue';\r\n\r\n export default defineComponent({\r\n name: 'App',\r\n components: {\r\n AppHeader: AppHeader,\r\n AppFooter: AppFooter,\r\n },\r\n });\r\n","import { render } from \"./App.vue?vue&type=template&id=1384e0bd&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.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__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"h1\", { class: \"visually-hidden\" }, \"Wavelovers\", -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_WaveloversApp = _resolveComponent(\"WaveloversApp\")!\n\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, [\n _hoisted_2,\n _createVNode(_component_WaveloversApp)\n ]))\n}","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"wavelovers\" }\nconst _hoisted_2 = /*#__PURE__*/_createTextVNode(\"Loading...\")\nconst _hoisted_3 = /*#__PURE__*/_createTextVNode(\"Press any gamepad's button or connect new gamepad.\")\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_PatternList = _resolveComponent(\"PatternList\")!\n const _component_MessageItem = _resolveComponent(\"MessageItem\")!\n const _component_GamepadList = _resolveComponent(\"GamepadList\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_ctx.patterns.length > 0)\n ? (_openBlock(), _createBlock(_component_PatternList, {\n key: 0,\n patterns: _ctx.patterns,\n mode: _ctx.mode,\n isActive: _ctx.isActive,\n onChange: _ctx.change\n }, null, 8, [\"patterns\", \"mode\", \"isActive\", \"onChange\"]))\n : (_openBlock(), _createBlock(_component_MessageItem, { key: 1 }, {\n default: _withCtx(() => [\n _hoisted_2\n ]),\n _: 1\n })),\n (_ctx.gamepads.length > 0)\n ? (_openBlock(), _createBlock(_component_GamepadList, {\n key: 2,\n gamepads: _ctx.gamepads\n }, null, 8, [\"gamepads\"]))\n : (_openBlock(), _createBlock(_component_MessageItem, { key: 3 }, {\n default: _withCtx(() => [\n _hoisted_3\n ]),\n _: 1\n }))\n ]))\n}","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"pattern-list\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_PatternItem = _resolveComponent(\"PatternItem\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.patterns, (pattern, index) => {\n return (_openBlock(), _createBlock(_component_PatternItem, {\n key: pattern.name,\n pattern: pattern,\n index: index,\n mode: _ctx.mode,\n isActive: _ctx.isActive,\n onChange: _ctx.change\n }, null, 8, [\"pattern\", \"index\", \"mode\", \"isActive\", \"onChange\"]))\n }), 128))\n ]))\n}","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"textContent\"]\nconst _hoisted_2 = [\"textContent\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n onClick: _cache[0] || (_cache[0] = ($event: any) => (_ctx.change(_ctx.index))),\n class: _normalizeClass(['pattern-item',\r\n _ctx.index === _ctx.mode && _ctx.isActive === true ?\r\n 'pattern-item_selected' : '',\r\n ])\n }, [\n _createElementVNode(\"span\", {\n class: \"pattern-item__icon\",\n textContent: _toDisplayString(_ctx.pattern.icon)\n }, null, 8, _hoisted_1),\n _createElementVNode(\"span\", {\n class: \"pattern-item__name\",\n textContent: _toDisplayString(_ctx.pattern.name)\n }, null, 8, _hoisted_2)\n ], 2))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'PatternItem',\r\n props: {\r\n pattern: {\r\n type: Object,\r\n },\r\n index: {\r\n type: Number,\r\n },\r\n mode: {\r\n type: Number,\r\n },\r\n isActive: {\r\n type: Boolean,\r\n },\r\n },\r\n methods: {\r\n change(index: number): void {\r\n this.$emit('change', index as number);\r\n },\r\n },\r\n });\r\n","import { render } from \"./PatternItem.vue?vue&type=template&id=e1c2f044&ts=true\"\nimport script from \"./PatternItem.vue?vue&type=script&lang=ts\"\nexport * from \"./PatternItem.vue?vue&type=script&lang=ts\"\n\nimport \"./PatternItem.vue?vue&type=style&index=0&id=e1c2f044&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n import { defineComponent } from 'vue';\r\n import PatternItem from '@/components/PatternItem.vue';\r\n\r\n export default defineComponent({\r\n name: 'PatternList',\r\n props: {\r\n patterns: {\r\n type: Array,\r\n },\r\n mode: {\r\n type: Number,\r\n },\r\n isActive: {\r\n type: Boolean,\r\n },\r\n },\r\n components: {\r\n PatternItem: PatternItem,\r\n },\r\n methods: {\r\n change(index: number): void {\r\n this.$emit('change', index as number);\r\n },\r\n },\r\n });\r\n","import { render } from \"./PatternList.vue?vue&type=template&id=77356b3f&ts=true\"\nimport script from \"./PatternList.vue?vue&type=script&lang=ts\"\nexport * from \"./PatternList.vue?vue&type=script&lang=ts\"\n\nimport \"./PatternList.vue?vue&type=style&index=0&id=77356b3f&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, toDisplayString as _toDisplayString, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"device-list\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_GamepadItem = _resolveComponent(\"GamepadItem\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.gamepads, (gamepad) => {\n return (_openBlock(), _createBlock(_component_GamepadItem, {\n key: gamepad.id,\n textContent: _toDisplayString(gamepad.unit.id)\n }, null, 8, [\"textContent\"]))\n }), 128))\n ]))\n}","import { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"list-item\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'GamepadItem',\r\n });\r\n","import { render } from \"./GamepadItem.vue?vue&type=template&id=e6e6c988&ts=true\"\nimport script from \"./GamepadItem.vue?vue&type=script&lang=ts\"\nexport * from \"./GamepadItem.vue?vue&type=script&lang=ts\"\n\nimport \"./GamepadItem.vue?vue&type=style&index=0&id=e6e6c988&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n import { defineComponent } from 'vue';\r\n import GamepadItem from '@/components/GamepadItem.vue';\r\n\r\n export default defineComponent({\r\n name: 'GamepadList',\r\n props: {\r\n gamepads: {\r\n type: Array,\r\n },\r\n },\r\n components: {\r\n GamepadItem: GamepadItem,\r\n },\r\n });\r\n ","import { render } from \"./GamepadList.vue?vue&type=template&id=1d58b1c0&ts=true\"\nimport script from \"./GamepadList.vue?vue&type=script&lang=ts\"\nexport * from \"./GamepadList.vue?vue&type=script&lang=ts\"\n\nimport \"./GamepadList.vue?vue&type=style&index=0&id=1d58b1c0&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderSlot as _renderSlot, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"message\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"span\", null, [\n _renderSlot(_ctx.$slots, \"default\")\n ])\n ]))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'MessageItem',\r\n });\r\n","import { render } from \"./MessageItem.vue?vue&type=template&id=32e2819b&ts=true\"\nimport script from \"./MessageItem.vue?vue&type=script&lang=ts\"\nexport * from \"./MessageItem.vue?vue&type=script&lang=ts\"\n\nimport \"./MessageItem.vue?vue&type=style&index=0&id=32e2819b&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import TPatternUnit from '@/models/TPatternUnit';\r\nimport IGamepad from '@/models/IGamepad';\r\nimport IVibrator from '@/models/IVibrator';\r\n\r\nexport default class Vibrator implements IVibrator {\r\n readonly id: number;\r\n readonly canVibrate: boolean;\r\n isVibrating: boolean;\r\n unit: IGamepad;\r\n pattern: TPatternUnit[];\r\n\r\n constructor(unit: IGamepad) {\r\n this.unit = unit;\r\n this.id = Date.now();\r\n this.canVibrate = (this.unit.vibrationActuator) ? true : false;\r\n this.isVibrating = false;\r\n this.pattern = [];\r\n }\r\n\r\n update(): void {\r\n const gamepads = navigator.getGamepads();\r\n this.unit = gamepads[this.unit.index];\r\n }\r\n\r\n reset(): void {\r\n this.isVibrating = false;\r\n this.unit.vibrationActuator.reset();\r\n }\r\n\r\n async vibrate(pattern: TPatternUnit[]) {\r\n this.isVibrating = true;\r\n this.pattern = pattern;\r\n\r\n while (this.isVibrating === true) {\r\n for (let i = 0; i < this.pattern.length; i++) {\r\n if (this.isVibrating === true) {\r\n this.unit.vibrationActuator.playEffect('dual-rumble', this.pattern[i]);\r\n await this.sleep(this.pattern[i].startDelay + this.pattern[i].duration + 100);\r\n } else {\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n sleep(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n}\r\n\r\n","\r\n import { defineComponent } from 'vue';\r\n import PatternList from '@/components/PatternList.vue';\r\n import GamepadList from '@/components/GamepadList.vue';\r\n import MessageItem from '@/components/MessageItem.vue';\r\n import IGamepadEvent from '@/models/IGamepadEvent';\r\n import IGamepad from '@/models/IGamepad';\r\n import TPattern from '@/models/TPattern';\r\n import TPatternUnit from '@/models/TPatternUnit';\r\n import Vibrator from '@/models/Vibrator';\r\n \r\n export default defineComponent({\r\n name: 'WaveloversApp',\r\n components: {\r\n PatternList: PatternList,\r\n GamepadList: GamepadList,\r\n MessageItem: MessageItem,\r\n },\r\n data: () => {\r\n return {\r\n gamepads: [] as Vibrator[],\r\n patterns: [] as TPattern[],\r\n isActive: false,\r\n mode: 0,\r\n };\r\n },\r\n methods: {\r\n loadPatterns: async function () {\r\n const url = 'https://wavelovers.ru/assets/patterns.json';\r\n try {\r\n const response = await fetch(url);\r\n if (response.ok) {\r\n let json = await response.json();\r\n this.patterns = json;\r\n } else {\r\n console.log('Connect to the Internet for download more patterns...');\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n addEventListeners(): void {\r\n window.addEventListener('gamepadconnected', (event: GamepadEvent) => this.addGamepad(event));\r\n window.addEventListener('gamepaddisconnected', (event: GamepadEvent) => this.deleteGamepad(event));\r\n },\r\n addGamepad(event: GamepadEvent) {\r\n const ievent: IGamepadEvent = event as unknown as IGamepadEvent;\r\n if (this.gamepads.length >= 1) {\r\n return;\r\n } else {\r\n this.gamepads.push(new Vibrator(ievent.gamepad as IGamepad));\r\n }\r\n },\r\n deleteGamepad(event: GamepadEvent): void {\r\n this.gamepads.forEach((gamepad, index) => {\r\n if (gamepad.unit.id === event.gamepad.id) {\r\n this.gamepads.splice(index, 1);\r\n }\r\n });\r\n },\r\n change(index: number): void {\r\n if (this.mode === index) {\r\n this.isActive = !this.isActive;\r\n this.reset();\r\n } else {\r\n this.isActive = true;\r\n this.mode = index;\r\n }\r\n if (this.isActive === true) {\r\n this.reset();\r\n this.vibrate();\r\n }\r\n },\r\n vibrate(): void {\r\n this.gamepads.forEach(gamepad => {\r\n gamepad.vibrate(this.patterns[this.mode].pattern as TPatternUnit[]);\r\n });\r\n },\r\n reset(): void {\r\n this.gamepads.forEach(gamepad => {\r\n gamepad.reset();\r\n });\r\n },\r\n },\r\n mounted() {\r\n this.loadPatterns();\r\n this.addEventListeners();\r\n },\r\n });\r\n","import { render } from \"./WaveloversApp.vue?vue&type=template&id=dbfec6e8&ts=true\"\nimport script from \"./WaveloversApp.vue?vue&type=script&lang=ts\"\nexport * from \"./WaveloversApp.vue?vue&type=script&lang=ts\"\n\nimport \"./WaveloversApp.vue?vue&type=style&index=0&id=dbfec6e8&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n import { defineComponent } from 'vue';\r\n import WaveloversApp from '@/components/WaveloversApp.vue';\r\n\r\n export default defineComponent({\r\n name: 'HomeView',\r\n components: {\r\n WaveloversApp: WaveloversApp\r\n },\r\n });\r\n","import { render } from \"./HomeView.vue?vue&type=template&id=a999a070&ts=true\"\nimport script from \"./HomeView.vue?vue&type=script&lang=ts\"\nexport * from \"./HomeView.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__","import { NavigationGuardNext, RouteLocationNormalized, RouteRecordNormalized } from \"vue-router\";\r\n\r\nfunction appendTags(tagsArray: object[], type: string) {\r\n tagsArray.map((meta: object) => {\r\n const tag = document.createElement(type);\r\n (Object.keys(meta) as Array)\r\n .forEach((key) => {\r\n tag.setAttribute(key, meta[key] as string);\r\n });\r\n tag.setAttribute('data-vue-router-controlled', '');\r\n return tag;\r\n }).forEach(tag => document.head.appendChild(tag));\r\n}\r\n\r\nfunction updateMetatag(to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) {\r\n\r\n const nearestWithTitle: RouteRecordNormalized =\r\n to.matched.slice().reverse()\r\n .find(r => r.meta && r.meta.title) as RouteRecordNormalized;\r\n\r\n const nearestWithMeta: RouteRecordNormalized =\r\n to.matched.slice().reverse()\r\n .find(r => r.meta && r.meta.metaTags && r.meta.linkTags) as RouteRecordNormalized;\r\n\r\n if (nearestWithTitle) {\r\n document.title = nearestWithTitle.meta.title as string;\r\n }\r\n\r\n Array.from(document.querySelectorAll('[data-vue-router-controlled]'))\r\n .map(el => {\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el);\r\n }\r\n });\r\n\r\n if (!nearestWithMeta) return next();\r\n\r\n const linkTags: object[] = nearestWithMeta.meta.linkTags as object[];\r\n const metaTags: object[] = nearestWithMeta.meta.metaTags as object[];\r\n appendTags(linkTags, 'link');\r\n appendTags(metaTags, 'meta');\r\n\r\n return next();\r\n}\r\n\r\nconst VueRouterMetaTags = {\r\n update: updateMetatag\r\n};\r\n\r\nexport default VueRouterMetaTags;\r\n\r\n","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';\r\nimport HomeView from '../views/HomeView.vue';\r\nimport VueRouterMetaTagsTest from '@/modules/VueRouterMetaTags';\r\n\r\nconst routes: Array = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: HomeView,\r\n meta: {\r\n title: 'Wavelovers',\r\n metaTags: [\r\n {\r\n name: 'description',\r\n content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',\r\n },\r\n {\r\n name: 'keywords',\r\n content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона',\r\n },\r\n {\r\n name: 'og:title',\r\n content: 'Wavelovers',\r\n },\r\n {\r\n name: 'og:description',\r\n content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',\r\n },\r\n {\r\n name: 'og:url',\r\n content: 'https://wavelovers.ru/',\r\n },\r\n {\r\n name: 'twitter:title',\r\n content: 'Wavelovers',\r\n },\r\n {\r\n name: 'twitter:description',\r\n content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',\r\n },\r\n ],\r\n linkTags: [\r\n {\r\n name: 'canonical',\r\n href: 'https://wavelovers.ru/',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n path: '/about',\r\n name: 'about',\r\n component: () => import('@/views/AboutView.vue'),\r\n meta: {\r\n title: 'Wavelovers – About',\r\n metaTags: [\r\n {\r\n name: 'description',\r\n content: 'Wavelovers. Page with information about the project and data on donations.',\r\n },\r\n {\r\n name: 'keywords',\r\n content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, advertise, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, реклама',\r\n },\r\n {\r\n name: 'og:title',\r\n content: 'Wavelovers – About',\r\n },\r\n {\r\n name: 'og:description',\r\n content: 'Wavelovers. Page with information about the project and data on donations.',\r\n },\r\n {\r\n name: 'og:url',\r\n content: 'https://wavelovers.ru/about',\r\n },\r\n {\r\n name: 'twitter:title',\r\n content: 'Wavelovers – About',\r\n },\r\n {\r\n name: 'twitter:description',\r\n content: 'Wavelovers. Page with information about the project and data on donations.',\r\n },\r\n ],\r\n linkTags: [\r\n {\r\n name: 'canonical',\r\n href: 'https://wavelovers.ru/about',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n path: '/faq',\r\n name: 'faq',\r\n component: () => import('@/views/FaqView.vue'),\r\n meta: {\r\n title: 'Wavelovers – FAQ',\r\n metaTags: [\r\n {\r\n name: 'description',\r\n content: 'Wavelovers. Frequently asked questions page.',\r\n },\r\n {\r\n name: 'keywords',\r\n content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, FAQ, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, часто задаваемые вопросы',\r\n },\r\n {\r\n name: 'og:title',\r\n content: 'Wavelovers – FAQ',\r\n },\r\n {\r\n name: 'og:description',\r\n content: 'Wavelovers. Frequently asked questions page.',\r\n },\r\n {\r\n name: 'og:url',\r\n content: 'https://wavelovers.ru/faq',\r\n },\r\n {\r\n name: 'twitter:title',\r\n content: 'Wavelovers – FAQ',\r\n },\r\n {\r\n name: 'twitter:description',\r\n content: 'Wavelovers. Frequently asked questions page.',\r\n },\r\n ],\r\n linkTags: [\r\n {\r\n name: 'canonical',\r\n href: 'https://wavelovers.ru/faq',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n path: '/donate',\r\n name: 'donate',\r\n component: () => import('@/views/DonateView.vue'),\r\n meta: {\r\n title: 'Wavelovers – Donate',\r\n metaTags: [\r\n {\r\n name: 'description',\r\n content: 'Wavelovers. Donate to the author.',\r\n },\r\n {\r\n name: 'keywords',\r\n content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, Donate, Support, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, задонатить, пожертвовать, помочь, поблагодарить',\r\n },\r\n {\r\n name: 'og:title',\r\n content: 'Wavelovers – Donate',\r\n },\r\n {\r\n name: 'og:description',\r\n content: 'Wavelovers. Donate to the author.',\r\n },\r\n {\r\n name: 'og:url',\r\n content: 'https://wavelovers.ru/donate',\r\n },\r\n {\r\n name: 'twitter:title',\r\n content: 'Wavelovers – Donate',\r\n },\r\n {\r\n name: 'twitter:description',\r\n content: 'Wavelovers. Donate to the author.',\r\n },\r\n ],\r\n linkTags: [\r\n {\r\n name: 'canonical',\r\n href: 'https://wavelovers.ru/donate',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n path: '/404',\r\n name: '404',\r\n component: () => import('@/views/NotFoundView.vue'),\r\n meta: {\r\n title: 'Wavelovers – 404 Page not found',\r\n metaTags: [\r\n {\r\n name: 'description',\r\n content: 'Wavelovers. Page not found.',\r\n },\r\n {\r\n name: 'keywords',\r\n content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, 404, page not found, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, 404, страница не найдена',\r\n },\r\n {\r\n name: 'og:title',\r\n content: 'Wavelovers – 404 Page not found',\r\n },\r\n {\r\n name: 'og:description',\r\n content: 'Wavelovers. Page not found.',\r\n },\r\n {\r\n name: 'og:url',\r\n content: 'https://wavelovers.ru/404',\r\n },\r\n {\r\n name: 'twitter:title',\r\n content: 'Wavelovers – 404 Page not found',\r\n },\r\n {\r\n name: 'twitter:description',\r\n content: 'Wavelovers. Page not found.',\r\n },\r\n ],\r\n linkTags: [\r\n {\r\n name: 'canonical',\r\n href: 'https://wavelovers.ru/404',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n path: '/:catchAll(.*)',\r\n redirect: '/404',\r\n },\r\n];\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n});\r\n\r\nrouter.beforeEach(VueRouterMetaTagsTest.update);\r\n\r\nexport default router;\r\n\r\n","import { createApp } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\n\r\ncreateApp(App).use(router).mount('#app')\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"93\":\"3a3c9684\",\"447\":\"cde26208\",\"548\":\"b0cff884\",\"877\":\"d6ed6a75\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + \"c8608f84\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"wavelovers:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","var createStylesheet = function(chunkId, fullhref, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t143: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"447\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkwavelovers\"] = self[\"webpackChunkwavelovers\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(970); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["render","_ctx","_cache","$props","$setup","$data","$options","_component_AppHeader","_resolveComponent","_component_router_view","_component_AppFooter","_openBlock","_createElementBlock","_Fragment","_createVNode","_hoisted_1","class","_hoisted_2","_hoisted_3","_createElementVNode","translate","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_createTextVNode","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_component_router_link","to","default","_withCtx","_","defineComponent","name","__exports__","_createStaticVNode","components","AppHeader","AppFooter","_component_WaveloversApp","_component_PatternList","_component_MessageItem","_component_GamepadList","patterns","length","_createBlock","key","mode","isActive","onChange","change","gamepads","_component_PatternItem","_renderList","pattern","index","onClick","$event","_normalizeClass","textContent","_toDisplayString","icon","props","type","Object","Number","Boolean","methods","this","$emit","Array","PatternItem","_component_GamepadItem","gamepad","id","unit","GamepadItem","_renderSlot","$slots","Vibrator","constructor","Date","now","canVibrate","vibrationActuator","isVibrating","update","navigator","getGamepads","reset","i","playEffect","sleep","startDelay","duration","ms","Promise","resolve","setTimeout","PatternList","GamepadList","MessageItem","data","loadPatterns","async","url","response","fetch","ok","json","console","log","error","addEventListeners","window","addEventListener","event","addGamepad","deleteGamepad","ievent","push","forEach","splice","vibrate","mounted","WaveloversApp","appendTags","tagsArray","map","meta","tag","document","createElement","keys","setAttribute","head","appendChild","updateMetatag","from","next","nearestWithTitle","matched","slice","reverse","find","r","title","nearestWithMeta","metaTags","linkTags","querySelectorAll","el","parentNode","removeChild","VueRouterMetaTags","routes","path","component","HomeView","content","href","redirect","router","createRouter","history","createWebHistory","process","beforeEach","VueRouterMetaTagsTest","createApp","App","use","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","f","e","chunkId","all","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","call","inProgress","dataWebpackPrefix","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","timeout","nc","src","onScriptComplete","prev","onerror","onload","clearTimeout","doneFns","bind","target","Symbol","toStringTag","value","p","createStylesheet","fullhref","reject","linkTag","rel","onLinkComplete","errorType","realHref","err","Error","code","request","findStylesheet","existingLinkTags","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","then","installedChunks","installedChunkData","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/js/app.ed7ad2c3.js.map b/docs/js/app.ed7ad2c3.js.map deleted file mode 100644 index ae52f33..0000000 --- a/docs/js/app.ed7ad2c3.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/app.ed7ad2c3.js","mappings":"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","sources":["webpack://wavelovers/./src/App.vue?dbf5","webpack://wavelovers/./src/components/AppHeader.vue?774d","webpack://wavelovers/./src/components/AppHeader.vue?caad","webpack://wavelovers/./src/components/AppHeader.vue","webpack://wavelovers/./src/components/AppFooter.vue?fb67","webpack://wavelovers/./src/components/AppFooter.vue?20a0","webpack://wavelovers/./src/components/AppFooter.vue","webpack://wavelovers/./src/App.vue?847a","webpack://wavelovers/./src/App.vue","webpack://wavelovers/./src/views/HomeView.vue?08ab","webpack://wavelovers/./src/components/WaveloversApp.vue?675b","webpack://wavelovers/./src/components/PatternList.vue?0478","webpack://wavelovers/./src/components/PatternItem.vue?0493","webpack://wavelovers/./src/components/PatternItem.vue?80c2","webpack://wavelovers/./src/components/PatternItem.vue","webpack://wavelovers/./src/components/PatternList.vue?eb4b","webpack://wavelovers/./src/components/PatternList.vue","webpack://wavelovers/./src/components/GamepadList.vue?05aa","webpack://wavelovers/./src/components/GamepadItem.vue?d49b","webpack://wavelovers/./src/components/GamepadItem.vue?ef0b","webpack://wavelovers/./src/components/GamepadItem.vue","webpack://wavelovers/./src/components/GamepadList.vue?8510","webpack://wavelovers/./src/components/GamepadList.vue","webpack://wavelovers/./src/components/MessageItem.vue?5b71","webpack://wavelovers/./src/components/MessageItem.vue?b787","webpack://wavelovers/./src/components/MessageItem.vue","webpack://wavelovers/./src/models/Vibrator.ts","webpack://wavelovers/./src/components/WaveloversApp.vue?23c2","webpack://wavelovers/./src/components/WaveloversApp.vue","webpack://wavelovers/./src/views/HomeView.vue?4752","webpack://wavelovers/./src/views/HomeView.vue","webpack://wavelovers/./src/modules/VueRouterMetaTags.ts","webpack://wavelovers/./src/router/index.ts","webpack://wavelovers/./src/main.ts","webpack://wavelovers/webpack/bootstrap","webpack://wavelovers/webpack/runtime/chunk loaded","webpack://wavelovers/webpack/runtime/compat get default export","webpack://wavelovers/webpack/runtime/define property getters","webpack://wavelovers/webpack/runtime/ensure chunk","webpack://wavelovers/webpack/runtime/get javascript chunk filename","webpack://wavelovers/webpack/runtime/get mini-css chunk filename","webpack://wavelovers/webpack/runtime/global","webpack://wavelovers/webpack/runtime/hasOwnProperty shorthand","webpack://wavelovers/webpack/runtime/load script","webpack://wavelovers/webpack/runtime/make namespace object","webpack://wavelovers/webpack/runtime/publicPath","webpack://wavelovers/webpack/runtime/css loading","webpack://wavelovers/webpack/runtime/jsonp chunk loading","webpack://wavelovers/webpack/startup"],"sourcesContent":["import { resolveComponent as _resolveComponent, createVNode as _createVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_AppHeader = _resolveComponent(\"AppHeader\")!\n const _component_router_view = _resolveComponent(\"router-view\")!\n const _component_AppFooter = _resolveComponent(\"AppFooter\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createVNode(_component_AppHeader),\n _createVNode(_component_router_view),\n _createVNode(_component_AppFooter)\n ], 64))\n}","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"header\" }\nconst _hoisted_2 = { class: \"header-wrapper container\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"logo-wrapper\" }, [\n /*#__PURE__*/_createElementVNode(\"span\", {\n class: \"logo-wrapper__logo\",\n translate: \"no\"\n }, \"Wavelovers\")\n], -1)\nconst _hoisted_4 = { class: \"menu-wrapper\" }\nconst _hoisted_5 = { class: \"navigation\" }\nconst _hoisted_6 = { class: \"navigation__item\" }\nconst _hoisted_7 = /*#__PURE__*/_createTextVNode(\"Home\")\nconst _hoisted_8 = { class: \"navigation__item\" }\nconst _hoisted_9 = /*#__PURE__*/_createTextVNode(\"FAQ\")\nconst _hoisted_10 = { class: \"navigation__item\" }\nconst _hoisted_11 = /*#__PURE__*/_createTextVNode(\"About\")\nconst _hoisted_12 = { class: \"navigation__item\" }\nconst _hoisted_13 = /*#__PURE__*/_createTextVNode(\"Donate\")\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(\"header\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _hoisted_3,\n _createElementVNode(\"nav\", _hoisted_4, [\n _createElementVNode(\"ul\", _hoisted_5, [\n _createElementVNode(\"li\", _hoisted_6, [\n _createVNode(_component_router_link, {\n to: \"/\",\n class: \"navigation__link\"\n }, {\n default: _withCtx(() => [\n _hoisted_7\n ]),\n _: 1\n })\n ]),\n _createElementVNode(\"li\", _hoisted_8, [\n _createVNode(_component_router_link, {\n to: \"/faq\",\n class: \"navigation__link\"\n }, {\n default: _withCtx(() => [\n _hoisted_9\n ]),\n _: 1\n })\n ]),\n _createElementVNode(\"li\", _hoisted_10, [\n _createVNode(_component_router_link, {\n to: \"/about\",\n class: \"navigation__link\"\n }, {\n default: _withCtx(() => [\n _hoisted_11\n ]),\n _: 1\n })\n ]),\n _createElementVNode(\"li\", _hoisted_12, [\n _createVNode(_component_router_link, {\n to: \"/donate\",\n class: \"navigation__link\"\n }, {\n default: _withCtx(() => [\n _hoisted_13\n ]),\n _: 1\n })\n ])\n ])\n ])\n ])\n ]))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'AppHeader',\r\n });\r\n","import { render } from \"./AppHeader.vue?vue&type=template&id=3c5da208&ts=true\"\nimport script from \"./AppHeader.vue?vue&type=script&lang=ts\"\nexport * from \"./AppHeader.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__","import { createElementVNode as _createElementVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"footer\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"
© 2022 Wavelovers. Content licensed under GNU General Public License v3.0
This site is open source. Improve this page.
Created byEugene Serb
\", 1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"footer\", _hoisted_1, _hoisted_3))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'AppFooter',\r\n });\r\n","import { render } from \"./AppFooter.vue?vue&type=template&id=3fc24ad0&ts=true\"\nimport script from \"./AppFooter.vue?vue&type=script&lang=ts\"\nexport * from \"./AppFooter.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__","\n import { defineComponent } from 'vue';\n import AppHeader from '@/components/AppHeader.vue';\n import AppFooter from '@/components/AppFooter.vue';\n\n export default defineComponent({\n name: 'App',\n components: {\n AppHeader: AppHeader,\n AppFooter: AppFooter,\n },\n });\n","import { render } from \"./App.vue?vue&type=template&id=1384e0bd&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.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__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"page container\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"h1\", { class: \"visually-hidden\" }, \"Wavelovers\", -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_WaveloversApp = _resolveComponent(\"WaveloversApp\")!\n\n return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, [\n _hoisted_2,\n _createVNode(_component_WaveloversApp)\n ]))\n}","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"wavelovers\" }\nconst _hoisted_2 = /*#__PURE__*/_createTextVNode(\"Loading...\")\nconst _hoisted_3 = /*#__PURE__*/_createTextVNode(\"Press any gamepad's button or connect new gamepad.\")\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_PatternList = _resolveComponent(\"PatternList\")!\n const _component_MessageItem = _resolveComponent(\"MessageItem\")!\n const _component_GamepadList = _resolveComponent(\"GamepadList\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_ctx.patterns.length > 0)\n ? (_openBlock(), _createBlock(_component_PatternList, {\n key: 0,\n patterns: _ctx.patterns,\n mode: _ctx.mode,\n isActive: _ctx.isActive,\n onChange: _ctx.change\n }, null, 8, [\"patterns\", \"mode\", \"isActive\", \"onChange\"]))\n : (_openBlock(), _createBlock(_component_MessageItem, { key: 1 }, {\n default: _withCtx(() => [\n _hoisted_2\n ]),\n _: 1\n })),\n (_ctx.gamepads.length > 0)\n ? (_openBlock(), _createBlock(_component_GamepadList, {\n key: 2,\n gamepads: _ctx.gamepads\n }, null, 8, [\"gamepads\"]))\n : (_openBlock(), _createBlock(_component_MessageItem, { key: 3 }, {\n default: _withCtx(() => [\n _hoisted_3\n ]),\n _: 1\n }))\n ]))\n}","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"pattern-list\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_PatternItem = _resolveComponent(\"PatternItem\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.patterns, (pattern, index) => {\n return (_openBlock(), _createBlock(_component_PatternItem, {\n key: pattern.name,\n pattern: pattern,\n index: index,\n mode: _ctx.mode,\n isActive: _ctx.isActive,\n onChange: _ctx.change\n }, null, 8, [\"pattern\", \"index\", \"mode\", \"isActive\", \"onChange\"]))\n }), 128))\n ]))\n}","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"textContent\"]\nconst _hoisted_2 = [\"textContent\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n onClick: _cache[0] || (_cache[0] = ($event: any) => (_ctx.change(_ctx.index))),\n class: _normalizeClass(['pattern-item',\r\n _ctx.index === _ctx.mode && _ctx.isActive === true ?\r\n 'pattern-item_selected' : '',\r\n ])\n }, [\n _createElementVNode(\"span\", {\n class: \"pattern-item__icon\",\n textContent: _toDisplayString(_ctx.pattern.icon)\n }, null, 8, _hoisted_1),\n _createElementVNode(\"span\", {\n class: \"pattern-item__name\",\n textContent: _toDisplayString(_ctx.pattern.name)\n }, null, 8, _hoisted_2)\n ], 2))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'PatternItem',\r\n props: {\r\n pattern: {\r\n type: Object,\r\n },\r\n index: {\r\n type: Number,\r\n },\r\n mode: {\r\n type: Number,\r\n },\r\n isActive: {\r\n type: Boolean,\r\n },\r\n },\r\n methods: {\r\n change(index: number): void {\r\n this.$emit('change', index as number);\r\n },\r\n },\r\n });\r\n","import { render } from \"./PatternItem.vue?vue&type=template&id=e1c2f044&ts=true\"\nimport script from \"./PatternItem.vue?vue&type=script&lang=ts\"\nexport * from \"./PatternItem.vue?vue&type=script&lang=ts\"\n\nimport \"./PatternItem.vue?vue&type=style&index=0&id=e1c2f044&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n import { defineComponent } from 'vue';\r\n import PatternItem from '@/components/PatternItem.vue';\r\n\r\n export default defineComponent({\r\n name: 'PatternList',\r\n props: {\r\n patterns: {\r\n type: Array,\r\n },\r\n mode: {\r\n type: Number,\r\n },\r\n isActive: {\r\n type: Boolean,\r\n },\r\n },\r\n components: {\r\n PatternItem: PatternItem,\r\n },\r\n methods: {\r\n change(index: number): void {\r\n this.$emit('change', index as number);\r\n },\r\n },\r\n });\r\n","import { render } from \"./PatternList.vue?vue&type=template&id=77356b3f&ts=true\"\nimport script from \"./PatternList.vue?vue&type=script&lang=ts\"\nexport * from \"./PatternList.vue?vue&type=script&lang=ts\"\n\nimport \"./PatternList.vue?vue&type=style&index=0&id=77356b3f&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, toDisplayString as _toDisplayString, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"device-list\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_GamepadItem = _resolveComponent(\"GamepadItem\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.gamepads, (gamepad) => {\n return (_openBlock(), _createBlock(_component_GamepadItem, {\n key: gamepad.id,\n textContent: _toDisplayString(gamepad.unit.id)\n }, null, 8, [\"textContent\"]))\n }), 128))\n ]))\n}","import { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"list-item\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'GamepadItem',\r\n });\r\n","import { render } from \"./GamepadItem.vue?vue&type=template&id=e6e6c988&ts=true\"\nimport script from \"./GamepadItem.vue?vue&type=script&lang=ts\"\nexport * from \"./GamepadItem.vue?vue&type=script&lang=ts\"\n\nimport \"./GamepadItem.vue?vue&type=style&index=0&id=e6e6c988&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n import { defineComponent } from 'vue';\r\n import GamepadItem from '@/components/GamepadItem.vue';\r\n\r\n export default defineComponent({\r\n name: 'GamepadList',\r\n props: {\r\n gamepads: {\r\n type: Array,\r\n },\r\n },\r\n components: {\r\n GamepadItem: GamepadItem,\r\n },\r\n });\r\n ","import { render } from \"./GamepadList.vue?vue&type=template&id=1d58b1c0&ts=true\"\nimport script from \"./GamepadList.vue?vue&type=script&lang=ts\"\nexport * from \"./GamepadList.vue?vue&type=script&lang=ts\"\n\nimport \"./GamepadList.vue?vue&type=style&index=0&id=1d58b1c0&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { renderSlot as _renderSlot, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"message\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"span\", null, [\n _renderSlot(_ctx.$slots, \"default\")\n ])\n ]))\n}","\r\n import { defineComponent } from 'vue';\r\n\r\n export default defineComponent({\r\n name: 'MessageItem',\r\n });\r\n","import { render } from \"./MessageItem.vue?vue&type=template&id=32e2819b&ts=true\"\nimport script from \"./MessageItem.vue?vue&type=script&lang=ts\"\nexport * from \"./MessageItem.vue?vue&type=script&lang=ts\"\n\nimport \"./MessageItem.vue?vue&type=style&index=0&id=32e2819b&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import TPatternUnit from '@/models/TPatternUnit';\r\nimport IGamepad from '@/models/IGamepad';\r\nimport IVibrator from '@/models/IVibrator';\r\n\r\nexport default class Vibrator implements IVibrator {\r\n readonly id: number;\r\n readonly canVibrate: boolean;\r\n isVibrating: boolean;\r\n unit: IGamepad;\r\n pattern: TPatternUnit[];\r\n\r\n constructor(unit: IGamepad) {\r\n this.unit = unit;\r\n this.id = Date.now();\r\n this.canVibrate = (this.unit.vibrationActuator) ? true : false;\r\n this.isVibrating = false;\r\n this.pattern = [];\r\n }\r\n\r\n update(): void {\r\n const gamepads = navigator.getGamepads();\r\n this.unit = gamepads[this.unit.index];\r\n }\r\n\r\n reset(): void {\r\n this.isVibrating = false;\r\n this.unit.vibrationActuator.reset();\r\n }\r\n\r\n async vibrate(pattern: TPatternUnit[]) {\r\n this.isVibrating = true;\r\n this.pattern = pattern;\r\n\r\n while (this.isVibrating === true) {\r\n for (let i = 0; i < this.pattern.length; i++) {\r\n if (this.isVibrating === true) {\r\n this.unit.vibrationActuator.playEffect('dual-rumble', this.pattern[i]);\r\n await this.sleep(this.pattern[i].startDelay + this.pattern[i].duration + 100);\r\n } else {\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n sleep(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n}\r\n\r\n","\r\n import { defineComponent } from 'vue';\r\n import PatternList from '@/components/PatternList.vue';\r\n import GamepadList from '@/components/GamepadList.vue';\r\n import MessageItem from '@/components/MessageItem.vue';\r\n import IGamepadEvent from '@/models/IGamepadEvent';\r\n import IGamepad from '@/models/IGamepad';\r\n import TPattern from '@/models/TPattern';\r\n import TPatternUnit from '@/models/TPatternUnit';\r\n import Vibrator from '@/models/Vibrator';\r\n \r\n export default defineComponent({\r\n name: 'WaveloversApp',\r\n components: {\r\n PatternList: PatternList,\r\n GamepadList: GamepadList,\r\n MessageItem: MessageItem,\r\n },\r\n data: () => {\r\n return {\r\n gamepads: [] as Vibrator[],\r\n patterns: [] as TPattern[],\r\n isActive: false,\r\n mode: 0,\r\n };\r\n },\r\n methods: {\r\n loadPatterns: async function () {\r\n const url = 'https://wavelovers.ru/assets/patterns.json';\r\n try {\r\n const response = await fetch(url);\r\n if (response.ok) {\r\n let json = await response.json();\r\n this.patterns = json;\r\n } else {\r\n console.log('Connect to the Internet for download more patterns...');\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n addEventListeners(): void {\r\n window.addEventListener('gamepadconnected', (event: GamepadEvent) => this.addGamepad(event));\r\n window.addEventListener('gamepaddisconnected', (event: GamepadEvent) => this.deleteGamepad(event));\r\n },\r\n addGamepad(event: GamepadEvent) {\r\n const ievent: IGamepadEvent = event as unknown as IGamepadEvent;\r\n if (this.gamepads.length >= 1) {\r\n return;\r\n } else {\r\n this.gamepads.push(new Vibrator(ievent.gamepad as IGamepad));\r\n }\r\n },\r\n deleteGamepad(event: GamepadEvent): void {\r\n this.gamepads.forEach((gamepad, index) => {\r\n if (gamepad.unit.id === event.gamepad.id) {\r\n this.gamepads.splice(index, 1);\r\n }\r\n });\r\n },\r\n change(index: number): void {\r\n if (this.mode === index) {\r\n this.isActive = !this.isActive;\r\n this.reset();\r\n } else {\r\n this.isActive = true;\r\n this.mode = index;\r\n }\r\n if (this.isActive === true) {\r\n this.reset();\r\n this.vibrate();\r\n }\r\n },\r\n vibrate(): void {\r\n this.gamepads.forEach(gamepad => {\r\n gamepad.vibrate(this.patterns[this.mode].pattern as TPatternUnit[]);\r\n });\r\n },\r\n reset(): void {\r\n this.gamepads.forEach(gamepad => {\r\n gamepad.reset();\r\n });\r\n },\r\n },\r\n mounted() {\r\n this.loadPatterns();\r\n this.addEventListeners();\r\n },\r\n });\r\n","import { render } from \"./WaveloversApp.vue?vue&type=template&id=dbfec6e8&ts=true\"\nimport script from \"./WaveloversApp.vue?vue&type=script&lang=ts\"\nexport * from \"./WaveloversApp.vue?vue&type=script&lang=ts\"\n\nimport \"./WaveloversApp.vue?vue&type=style&index=0&id=dbfec6e8&lang=scss\"\n\nimport exportComponent from \"E:\\\\Sources\\\\Repos\\\\wavelovers\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n import { defineComponent } from 'vue';\n import WaveloversApp from '@/components/WaveloversApp.vue';\n\n export default defineComponent({\n name: 'HomeView',\n components: {\n WaveloversApp: WaveloversApp\n },\n });\n","import { render } from \"./HomeView.vue?vue&type=template&id=a999a070&ts=true\"\nimport script from \"./HomeView.vue?vue&type=script&lang=ts\"\nexport * from \"./HomeView.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__","import { NavigationGuardNext, RouteLocationNormalized, RouteRecordNormalized } from \"vue-router\";\r\n\r\nfunction appendTags(tagsArray: object[], type: string) {\r\n tagsArray.map((meta: object) => {\r\n const tag = document.createElement(type);\r\n (Object.keys(meta) as Array)\r\n .forEach((key) => {\r\n tag.setAttribute(key, meta[key] as string);\r\n });\r\n tag.setAttribute('data-vue-router-controlled', '');\r\n return tag;\r\n }).forEach(tag => document.head.appendChild(tag));\r\n}\r\n\r\nfunction updateMetatag(to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) {\r\n\r\n const nearestWithTitle: RouteRecordNormalized =\r\n to.matched.slice().reverse()\r\n .find(r => r.meta && r.meta.title) as RouteRecordNormalized;\r\n\r\n const nearestWithMeta: RouteRecordNormalized =\r\n to.matched.slice().reverse()\r\n .find(r => r.meta && r.meta.metaTags && r.meta.linkTags) as RouteRecordNormalized;\r\n\r\n if (nearestWithTitle) {\r\n document.title = nearestWithTitle.meta.title as string;\r\n }\r\n\r\n Array.from(document.querySelectorAll('[data-vue-router-controlled]'))\r\n .map(el => {\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el);\r\n }\r\n });\r\n\r\n if (!nearestWithMeta) return next();\r\n\r\n const linkTags: object[] = nearestWithMeta.meta.linkTags as object[];\r\n const metaTags: object[] = nearestWithMeta.meta.metaTags as object[];\r\n appendTags(linkTags, 'link');\r\n appendTags(metaTags, 'meta');\r\n\r\n return next();\r\n}\r\n\r\nconst VueRouterMetaTags = {\r\n update: updateMetatag\r\n};\r\n\r\nexport default VueRouterMetaTags;\r\n\r\n","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';\r\nimport HomeView from '../views/HomeView.vue';\r\nimport VueRouterMetaTagsTest from '@/modules/VueRouterMetaTags';\r\n\r\nconst routes: Array = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: HomeView,\r\n meta: {\r\n title: 'Wavelovers',\r\n metaTags: [\r\n {\r\n name: 'description',\r\n content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',\r\n },\r\n {\r\n name: 'keywords',\r\n content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона',\r\n },\r\n {\r\n name: 'og:title',\r\n content: 'Wavelovers',\r\n },\r\n {\r\n name: 'og:description',\r\n content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',\r\n },\r\n {\r\n name: 'og:url',\r\n content: 'https://wavelovers.ru/',\r\n },\r\n {\r\n name: 'twitter:title',\r\n content: 'Wavelovers',\r\n },\r\n {\r\n name: 'twitter:description',\r\n content: 'Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.',\r\n },\r\n ],\r\n linkTags: [\r\n {\r\n name: 'canonical',\r\n href: 'https://wavelovers.ru/',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n path: '/about',\r\n name: 'about',\r\n component: () => import('@/views/AboutView.vue'),\r\n meta: {\r\n title: 'Wavelovers – About',\r\n metaTags: [\r\n {\r\n name: 'description',\r\n content: 'Wavelovers. Page with information about the project and data on donations.',\r\n },\r\n {\r\n name: 'keywords',\r\n content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, advertise, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, реклама',\r\n },\r\n {\r\n name: 'og:title',\r\n content: 'Wavelovers – About',\r\n },\r\n {\r\n name: 'og:description',\r\n content: 'Wavelovers. Page with information about the project and data on donations.',\r\n },\r\n {\r\n name: 'og:url',\r\n content: 'https://wavelovers.ru/about',\r\n },\r\n {\r\n name: 'twitter:title',\r\n content: 'Wavelovers – About',\r\n },\r\n {\r\n name: 'twitter:description',\r\n content: 'Wavelovers. Page with information about the project and data on donations.',\r\n },\r\n ],\r\n linkTags: [\r\n {\r\n name: 'canonical',\r\n href: 'https://wavelovers.ru/about',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n path: '/faq',\r\n name: 'faq',\r\n component: () => import('@/views/FaqView.vue'),\r\n meta: {\r\n title: 'Wavelovers – FAQ',\r\n metaTags: [\r\n {\r\n name: 'description',\r\n content: 'Wavelovers. Frequently asked questions page.',\r\n },\r\n {\r\n name: 'keywords',\r\n content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, FAQ, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, часто задаваемые вопросы',\r\n },\r\n {\r\n name: 'og:title',\r\n content: 'Wavelovers – FAQ',\r\n },\r\n {\r\n name: 'og:description',\r\n content: 'Wavelovers. Frequently asked questions page.',\r\n },\r\n {\r\n name: 'og:url',\r\n content: 'https://wavelovers.ru/faq',\r\n },\r\n {\r\n name: 'twitter:title',\r\n content: 'Wavelovers – FAQ',\r\n },\r\n {\r\n name: 'twitter:description',\r\n content: 'Wavelovers. Frequently asked questions page.',\r\n },\r\n ],\r\n linkTags: [\r\n {\r\n name: 'canonical',\r\n href: 'https://wavelovers.ru/faq',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n path: '/donate',\r\n name: 'donate',\r\n component: () => import('@/views/DonateView.vue'),\r\n meta: {\r\n title: 'Wavelovers – Donate',\r\n metaTags: [\r\n {\r\n name: 'description',\r\n content: 'Wavelovers. Donate to the author.',\r\n },\r\n {\r\n name: 'keywords',\r\n content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, Relax, Donate, Support, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, задонатить, пожертвовать, помочь, поблагодарить',\r\n },\r\n {\r\n name: 'og:title',\r\n content: 'Wavelovers – Donate',\r\n },\r\n {\r\n name: 'og:description',\r\n content: 'Wavelovers. Donate to the author.',\r\n },\r\n {\r\n name: 'og:url',\r\n content: 'https://wavelovers.ru/donate',\r\n },\r\n {\r\n name: 'twitter:title',\r\n content: 'Wavelovers – Donate',\r\n },\r\n {\r\n name: 'twitter:description',\r\n content: 'Wavelovers. Donate to the author.',\r\n },\r\n ],\r\n linkTags: [\r\n {\r\n name: 'canonical',\r\n href: 'https://wavelovers.ru/donate',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n path: '/404',\r\n name: '404',\r\n component: () => import('@/views/NotFoundView.vue'),\r\n meta: {\r\n title: 'Wavelovers – 404 Page not found',\r\n metaTags: [\r\n {\r\n name: 'description',\r\n content: 'Wavelovers. Page not found.',\r\n },\r\n {\r\n name: 'keywords',\r\n content: 'Wavelovers, Wave Lovers, Wavemaster, Wave Master, Vibration Master, Vibration, Gamepad, Gamepad Vibration, Vibrate Gamepad, Phone Vibration, Gamepad Tester, Phone Vibration Tester, Vibration Tester, Massager, Vibrator, Satisfyer, Womanizer, 404, page not found, геймпад, джойстик, вибратор, вибромассажер, вибро, вибромассажёр из геймпада, тестер вибрации геймпада, тестер вибрации телефона, 404, страница не найдена',\r\n },\r\n {\r\n name: 'og:title',\r\n content: 'Wavelovers – 404 Page not found',\r\n },\r\n {\r\n name: 'og:description',\r\n content: 'Wavelovers. Page not found.',\r\n },\r\n {\r\n name: 'og:url',\r\n content: 'https://wavelovers.ru/404',\r\n },\r\n {\r\n name: 'twitter:title',\r\n content: 'Wavelovers – 404 Page not found',\r\n },\r\n {\r\n name: 'twitter:description',\r\n content: 'Wavelovers. Page not found.',\r\n },\r\n ],\r\n linkTags: [\r\n {\r\n name: 'canonical',\r\n href: 'https://wavelovers.ru/404',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n path: '/:catchAll(.*)',\r\n redirect: '/404',\r\n },\r\n];\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n});\r\n\r\nrouter.beforeEach(VueRouterMetaTagsTest.update);\r\n\r\nexport default router;\r\n\r\n","import { createApp } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\n\r\ncreateApp(App).use(router).mount('#app')\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"93\":\"22832789\",\"447\":\"cde26208\",\"548\":\"8603e4a4\",\"877\":\"a8dd8d41\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + \"c8608f84\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"wavelovers:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","var createStylesheet = function(chunkId, fullhref, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t143: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"447\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkwavelovers\"] = self[\"webpackChunkwavelovers\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(970); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["render","_ctx","_cache","$props","$setup","$data","$options","_component_AppHeader","_resolveComponent","_component_router_view","_component_AppFooter","_openBlock","_createElementBlock","_Fragment","_createVNode","_hoisted_1","class","_hoisted_2","_hoisted_3","_createElementVNode","translate","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_createTextVNode","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_component_router_link","to","default","_withCtx","_","defineComponent","name","__exports__","_createStaticVNode","components","AppHeader","AppFooter","_component_WaveloversApp","_component_PatternList","_component_MessageItem","_component_GamepadList","patterns","length","_createBlock","key","mode","isActive","onChange","change","gamepads","_component_PatternItem","_renderList","pattern","index","onClick","$event","_normalizeClass","textContent","_toDisplayString","icon","props","type","Object","Number","Boolean","methods","this","$emit","Array","PatternItem","_component_GamepadItem","gamepad","id","unit","GamepadItem","_renderSlot","$slots","Vibrator","constructor","Date","now","canVibrate","vibrationActuator","isVibrating","update","navigator","getGamepads","reset","i","playEffect","sleep","startDelay","duration","ms","Promise","resolve","setTimeout","PatternList","GamepadList","MessageItem","data","loadPatterns","async","url","response","fetch","ok","json","console","log","error","addEventListeners","window","addEventListener","event","addGamepad","deleteGamepad","ievent","push","forEach","splice","vibrate","mounted","WaveloversApp","appendTags","tagsArray","map","meta","tag","document","createElement","keys","setAttribute","head","appendChild","updateMetatag","from","next","nearestWithTitle","matched","slice","reverse","find","r","title","nearestWithMeta","metaTags","linkTags","querySelectorAll","el","parentNode","removeChild","VueRouterMetaTags","routes","path","component","HomeView","content","href","redirect","router","createRouter","history","createWebHistory","process","beforeEach","VueRouterMetaTagsTest","createApp","App","use","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","f","e","chunkId","all","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","call","inProgress","dataWebpackPrefix","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","timeout","nc","src","onScriptComplete","prev","onerror","onload","clearTimeout","doneFns","bind","target","Symbol","toStringTag","value","p","createStylesheet","fullhref","reject","linkTag","rel","onLinkComplete","errorType","realHref","err","Error","code","request","findStylesheet","existingLinkTags","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","then","installedChunks","installedChunkData","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/sitemap-internal.xml b/docs/sitemap-internal.xml index d16c63d..d3c36ec 100644 --- a/docs/sitemap-internal.xml +++ b/docs/sitemap-internal.xml @@ -2,25 +2,25 @@ https://wavelovers.ru/ - 2022-07-22 + 2022-07-23 weekly 1.0 https://wavelovers.ru/faq.html - 2022-07-22 + 2022-07-23 weekly 1.0 https://wavelovers.ru/about.html - 2022-07-22 + 2022-07-23 weekly 1.0 https://wavelovers.ru/donate.html - 2022-07-22 + 2022-07-23 weekly 1.0 diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 54de9aa..c866d40 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -2,7 +2,7 @@ https://wavelovers.ru/sitemap-internal.xml - 2022-07-22 + 2022-07-23 diff --git a/package-lock.json b/package-lock.json index 91a2ad7..9dc7d2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4029,9 +4029,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001368", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001368.tgz", - "integrity": "sha512-wgfRYa9DenEomLG/SdWgQxpIyvdtH3NW8Vq+tB6AwR9e56iOIcu1im5F/wNdDf04XlKHXqIx4N8Jo0PemeBenQ==", + "version": "1.0.30001369", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001369.tgz", + "integrity": "sha512-OY1SBHaodJc4wflDIKnlkdqWzJZd1Ls/2zbVJHBSv3AT7vgOJ58yAhd2CN4d57l2kPJrgMb7P9+N1Mhy4tNSQA==", "dev": true, "funding": [ { @@ -5176,9 +5176,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.198", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.198.tgz", - "integrity": "sha512-jwqQPdKGeAslcq8L+1SZZgL6uDiIDmTe9Gq4brsdWAH27y7MJ2g9Ue6MyST3ogmSM49EAQP7bype1V5hsuNrmQ==", + "version": "1.4.199", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.199.tgz", + "integrity": "sha512-WIGME0Cs7oob3mxsJwHbeWkH0tYkIE/sjkJ8ML2BYmuRcjhRl/q5kVDXG7W9LOOKwzPU5M0LBlXRq9rlSgnNlg==", "dev": true }, "node_modules/emoji-regex": { @@ -9698,9 +9698,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", - "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -14944,9 +14944,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001368", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001368.tgz", - "integrity": "sha512-wgfRYa9DenEomLG/SdWgQxpIyvdtH3NW8Vq+tB6AwR9e56iOIcu1im5F/wNdDf04XlKHXqIx4N8Jo0PemeBenQ==", + "version": "1.0.30001369", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001369.tgz", + "integrity": "sha512-OY1SBHaodJc4wflDIKnlkdqWzJZd1Ls/2zbVJHBSv3AT7vgOJ58yAhd2CN4d57l2kPJrgMb7P9+N1Mhy4tNSQA==", "dev": true }, "case-sensitive-paths-webpack-plugin": { @@ -15773,9 +15773,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.198", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.198.tgz", - "integrity": "sha512-jwqQPdKGeAslcq8L+1SZZgL6uDiIDmTe9Gq4brsdWAH27y7MJ2g9Ue6MyST3ogmSM49EAQP7bype1V5hsuNrmQ==", + "version": "1.4.199", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.199.tgz", + "integrity": "sha512-WIGME0Cs7oob3mxsJwHbeWkH0tYkIE/sjkJ8ML2BYmuRcjhRl/q5kVDXG7W9LOOKwzPU5M0LBlXRq9rlSgnNlg==", "dev": true }, "emoji-regex": { @@ -19092,9 +19092,9 @@ "dev": true }, "sass": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", - "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 1a0f640..d6deb19 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,15 @@ { "name": "wavelovers", "description": "Wavelovers. Use your device vibration correctly. Make a massager out of a gamepad.", + "keywords": [ "wavelovers", "gamepad-vibrator", "gamepad-test-tool", "gamepad-vibration-test-tool" ], "version": "1.0.0", - "author": "Eugene Serb", "license": "GNU GPL v3", - "repository": "https://github.com/eugene-serb/wavelovers", + "author": "Eugene Serb ", + "homepage": "https://wavelovers.ru/", + "repository": { + "type": "git", + "url": "https://github.com/eugene-serb/wavelovers" + }, "private": true, "scripts": { "serve": "vue-cli-service serve", diff --git a/public/css/styles.css b/public/css/styles.css index f0d01cd..98ed54c 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -1,3 +1,9 @@ +/* ------------------------------ */ +/* Wavelovers styles */ +/* version: dated 2022.07.23 */ +/* author: Eugene Serb */ +/* ------------------------------ */ + /* ------------------------------ */ /* RESET AND BASE STYLES' TUNE UP */ /* ------------------------------ */ @@ -176,7 +182,7 @@ legend { fieldset { border: 2px solid var(--color-border-alpha); - border-radius: 4px; + border-radius: var(--number-border-radius); padding: 8px; } diff --git a/public/sitemap-internal.xml b/public/sitemap-internal.xml index d16c63d..d3c36ec 100644 --- a/public/sitemap-internal.xml +++ b/public/sitemap-internal.xml @@ -2,25 +2,25 @@ https://wavelovers.ru/ - 2022-07-22 + 2022-07-23 weekly 1.0 https://wavelovers.ru/faq.html - 2022-07-22 + 2022-07-23 weekly 1.0 https://wavelovers.ru/about.html - 2022-07-22 + 2022-07-23 weekly 1.0 https://wavelovers.ru/donate.html - 2022-07-22 + 2022-07-23 weekly 1.0 diff --git a/public/sitemap.xml b/public/sitemap.xml index 54de9aa..c866d40 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -2,7 +2,7 @@ https://wavelovers.ru/sitemap-internal.xml - 2022-07-22 + 2022-07-23