From 17e5883e660af37b5c7447b099008ca1856cc188 Mon Sep 17 00:00:00 2001 From: Szymon Date: Sat, 17 Nov 2018 21:15:55 +0100 Subject: [PATCH] initial login/register frontend project --- admin-zone/login.php | 14 - css/global.css | 31 +- css/login.css | 153 +++++ css/register.css | 393 ++++------- images/logo.png | Bin 0 -> 39392 bytes index.html | 80 +++ js/app.js | 132 ++++ js/particles.js | 1541 ++++++++++++++++++++++++++++++++++++++++++ register/index.php | 36 - 9 files changed, 2066 insertions(+), 314 deletions(-) delete mode 100644 admin-zone/login.php create mode 100644 css/login.css create mode 100644 images/logo.png create mode 100644 index.html create mode 100644 js/app.js create mode 100644 js/particles.js delete mode 100644 register/index.php diff --git a/admin-zone/login.php b/admin-zone/login.php deleted file mode 100644 index 37835c0..0000000 --- a/admin-zone/login.php +++ /dev/null @@ -1,14 +0,0 @@ - - - -
- -

Login:

-

Hasło:

- - -
- - \ No newline at end of file diff --git a/css/global.css b/css/global.css index e2b3afa..f04c518 100644 --- a/css/global.css +++ b/css/global.css @@ -1,11 +1,7 @@ -.body{ - background-color: azure; -} - .navHeader{ - position:absolute; + position: absolute; width: 100%; - height: 200px; + height: 500px; margin-right: 0; margin-left: 0; z-index: -1; @@ -13,7 +9,7 @@ .navHeader img { width: 100%; - height: 200px; + height: 500px; z-index: -1; } @@ -65,7 +61,7 @@ } .footer { - background-color: lightgray; + background-color: #e8ebef; width: 100%; } @@ -92,4 +88,23 @@ .button:hover { background-color: #f4b241; color: white; +} + +.btn { + background-color: #f4c242; + border: 1px solid #f4b241; + border-radius: 6px; + color: gray; + padding: 12px 22px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 14px; + transition-duration: 0.2s; + width: 100%; +} + +.btn:hover { + background-color: #f4b241; + color: white; } \ No newline at end of file diff --git a/css/login.css b/css/login.css new file mode 100644 index 0000000..46f35bc --- /dev/null +++ b/css/login.css @@ -0,0 +1,153 @@ +#particles-js{ + background-color: #b61924; + background-size: cover; + min-width: 547px; +} + +.container { + padding-top: 10%; + min-width: 425px; +} + +.loginHeader{ + width: 100%; + height: 100px; +} + +.elementsOnLoginHeader { + background-color: #f4c741; + text-align: center; + justify-content: center; + vertical-align: middle; + color: black; +} + +.elementsOnLoginHeader h3 { + padding-top: 10%; +} + +.elementsOnLoginHeader .avatar { + position: relative; + top: 0%; + left: -5%; + width: 30%; + float: left; + z-index: 2; +} + +.loginMain{ + width: 100%; + min-height: 225px; +} + +.elementsOnLoginMain { + position: relative; + background-color: #f9fbff; + padding-top: 16px; + padding-bottom: 16px; + padding-right: 30px; + padding-left: 30px; +} + +.elementsOnLoginMain .inputmain input { + width: 100%; + background: transparent; + border: none; + border-radius: 0%; + border-bottom: 1px solid black; + padding: 10px; + margin-bottom: 30px; + margin-top: 25px; + outline: none; +} + +.loginFooter { + width: 100%; +} + +.loginFooter span { + align-content: center; + padding-top: 10px; + color: red; +} + +.elementsOnLoginFooter { + background-color: #e8ebef; + border-top: 2px solid light gray; + padding-bottom: 10px; + padding-right: 30px; + padding-left: 30px; +} + +.button2 { + background-color: #f4c242; + border: 1px solid orangered; + border-radius: 6px; + color: gray; + padding: 12px 32px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 14px; + transition-duration: 0.2s; +} + +.button2:hover { + background-color: #f4b241; + color: white; +} + +.box { + display: block; + position: relative; + padding-left: 25px; + border-radius: 6px; + margin-bottom: auto; + font-size: 15px; + user-select: none; +} + +.box input { + position: absolute; + opacity: 0; + cursor: pointer; +} + +.checkmark { + position: absolute; + top: 0; + left: 0; + height: 18px; + width: 18px; + background-color: #eee; + border: 2px solid lightgray; + border-radius: 5px; +} + +.box:hover input ~ .checkmark { + background-color: white; +} + +.box input:checked ~ .checkmark { + background-color: white; +} + +.checkmark:after { + content: ""; + position: absolute; + display: none; +} + +.box input:checked ~ .checkmark:after { + display: block; +} + +.box .checkmark:after { + left: 5px; + bottom: 0px; + width: 10px; + height: 25px; + border: solid #f4c741; + border-width: 0 5px 4px 0; + transform: rotate(45deg); +} \ No newline at end of file diff --git a/css/register.css b/css/register.css index 383b406..4f7be31 100644 --- a/css/register.css +++ b/css/register.css @@ -1,267 +1,148 @@ -*{ - margin:0; - padding:0; +#particles-js{ + background-color: #b61924; + background-size: cover; + min-width: 547px; } -h1 { - font-size: 2em; - font-family: "Core Sans N W01 35 Light"; - font-weight: normal; - margin: .67em 0; - display: block; +.container { + padding-top: 10%; + min-width: 425px; } -#registered { - margin-top: 50px; -} - -#registered img { - margin-bottom: 0px; - width: 100px; +.registerHeader{ + width: 100%; height: 100px; } -#registered span { - clear: both; +.elementsOnRegisterHeader { + background-color: #f4c741; + text-align: center; + justify-content: center; + vertical-align: middle; + color: black; +} + +.elementsOnRegisterHeader h3 { + padding-top: 10%; +} + +.elementsOnRegisterHeader .avatar { + position: relative; + top: 0%; + left: -5%; + width: 30%; + float: left; + z-index: 2; +} + + +.registerMain{ + width: 100%; + min-height: 225px; +} + +.elementsOnRegisterMain { + position: relative; + background-color: #f9fbff; + padding-top: 16px; + padding-bottom: 16px; + padding-right: 30px; + padding-left: 30px; +} + +.elementsOnRegisterMain .inputmain input { + width: 100%; + background: transparent; + border: none; + border-radius: 0%; + border-bottom: 1px solid black; + padding: 10px; + margin-bottom: 5px; + margin-top: 15px; + outline: none; +} + +.registerFooter { + width: 100%; +} + +.elementsOnRegisterFooter { + background-color: #e8ebef; + border-top: 2px solid light gray; + padding-bottom: 10px; + padding-right: 30px; + padding-left: 30px; +} + +.button2 { + background-color: #f4c242; + border: 1px solid orangered; + border-radius: 6px; + color: gray; + padding: 12px 32px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 14px; + transition-duration: 0.2s; +} + +.button2:hover { + background-color: #f4b241; + color: white; +} + +.box { + display: block; + position: relative; + padding-left: 25px; + border-radius: 6px; + margin-bottom: auto; + font-size: 15px; + user-select: none; +} + +.box input { + position: absolute; + opacity: 0; + cursor: pointer; +} + +.checkmark { + position: absolute; + top: 0; + left: 0; + height: 18px; + width: 18px; + background-color: #eee; + border: 2px solid lightgray; + border-radius: 5px; +} + +.box:hover input ~ .checkmark { + background-color: white; +} + +.box input:checked ~ .checkmark { + background-color: white; +} + +.checkmark:after { + content: ""; + position: absolute; + display: none; +} + +.box input:checked ~ .checkmark:after { display: block; } -img { - margin-bottom: 20px; -} - -.avatar { - margin: 10px 0 20px 0; -} - -.module{ - position:relative; - top:10%; - height:65%; - width:450px; - margin-left:auto; - margin-right:auto; -} - -.user { - color: #66d8fc; - font-weight: bold; -} - -.userlist { - float:left; - padding: 30px; -} - -.userlist span { - color: #0590fc; -} - -.welcome{ - position:relative; - top:30%; - height:65%; - width:900px; - margin-left:auto; - margin-right:auto; - margin-top: 50px; -} - -::-moz-selection { - background: #19547c; -} -::selection { - background: #19547c; -} -input::-moz-selection { - background: #037db6; -} -input::selection { - background: #037db6; -} - -body{ - color: #fff; - background-color:#f0f0f0; - font-family:helvetica; - -} - -.body-content{ - position:relative; - top:20px; - height:700px; - width:800px; - margin-left:auto; - margin-right:auto; - background: transparent; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="email"] -{ - height:30px; - width:100%;; - display: inline-block; - vertical-align: middle; - height: 34px; - padding: 0 10px; - margin-top: 3px; - margin-bottom: 10px; - font-size: 15px; - line-height: 20px; - border: 1px solid rgba(255, 255, 255, 0.3); - background-color: rgba(0, 0, 0, 0.5); - color: rgba(255, 255, 255, 0.7); - -moz-box-sizing: border-box; - box-sizing: border-box; - border-radius: 2px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="email"] { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - appearance: none; - -webkit-transition: background-position 0.2s, background-color 0.2s, border-color 0.2s, box-shadow 0.2s; - transition: background-position 0.2s, background-color 0.2s, border-color 0.2s, box-shadow 0.2s; -} -select:hover, -textarea:hover, -input[type="text"]:hover, -input[type="password"]:hover, -input[type="email"]:hover { - border-color: rgba(255, 255, 255, 0.5); - background-color: rgba(0, 0, 0, 0.5); - color: rgba(255, 255, 255, 0.7); -} -select:focus, -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="email"]:focus { - border: 2px solid; - border-color: #1e5f99; - background-color: rgba(0, 0, 0, 0.5); - color: #ffffff; -} -.btn { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - margin: 3px 0; - padding: 6px 20px; - font-size: 15px; - line-height: 20px; - height: 34px; - background-color: rgba(0, 0, 0, 0.15); - color: #00aeff; - border: 1px solid rgba(255, 255, 255, 0.15); - box-shadow: 0 0 rgba(0, 0, 0, 0); - border-radius: 2px; - -webkit-transition: background-color 0.2s, box-shadow 0.2s, background-color 0.2s, border-color 0.2s, color 0.2s; - transition: background-color 0.2s, box-shadow 0.2s, background-color 0.2s, border-color 0.2s, color 0.2s; -} -.btn.active, -.btn:active { - padding: 7px 19px 5px 21px; -} -.btn.disabled:active, -.btn[disabled]:active, -.btn.disabled.active, -.btn[disabled].active { - padding: 6px 20px !important; -} -.btn:hover, -.btn:focus { - background-color: rgba(0, 0, 0, 0.25); - color: #ffffff; - border-color: rgba(255, 255, 255, 0.3); - box-shadow: 0 0 rgba(0, 0, 0, 0); -} -.btn:active, -.btn.active { - background-color: rgba(0, 0, 0, 0.15); - color: rgba(255, 255, 255, 0.8); - border-color: rgba(255, 255, 255, 0.07); - box-shadow: inset 1.5px 1.5px 3px rgba(0, 0, 0, 0.5); -} -.btn-primary { - background-color: #098cc8; - color: #ffffff; - border: 1px solid transparent; - box-shadow: 0 0 rgba(0, 0, 0, 0); - border-radius: 2px; - -webkit-transition: background-color 0.2s, box-shadow 0.2s, background-color 0.2s, border-color 0.2s, color 0.2s; - transition: background-color 0.2s, box-shadow 0.2s, background-color 0.2s, border-color 0.2s, color 0.2s; - background-image: -webkit-linear-gradient(top, #0f9ada, #0076ad); - background-image: linear-gradient(to bottom, #0f9ada, #0076ad); - border: 0; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.15) inset; -} -.btn-primary:hover, -.btn-primary:focus { - background-color: #21b0f1; - color: #ffffff; - border-color: transparent; - box-shadow: 0 0 rgba(0, 0, 0, 0); -} -.btn-primary:active, -.btn-primary.active { - background-color: #006899; - color: rgba(255, 255, 255, 0.7); - border-color: transparent; - box-shadow: inset 1.5px 1.5px 3px rgba(0, 0, 0, 0.5); -} -.btn-primary:hover, -.btn-primary:focus { - background-image: -webkit-linear-gradient(top, #37c0ff, #0097dd); - background-image: linear-gradient(to bottom, #37c0ff, #0097dd); -} -.btn-primary:active, -.btn-primary.active { - background-image: -webkit-linear-gradient(top, #006ea1, #00608d); - background-image: linear-gradient(to bottom, #000000, #ffffff); - box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.6) inset, 0 0 0 1px rgba(255, 255, 255, 0.07) inset; -} -.btn-block { - display: block; - width: 100%; - padding-left: 0; - padding-right: 0; -} - -.alert { - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 4px 20px 4px 20px; - font-size: 13px; - line-height: 20px; - margin-bottom: 20px; - text-shadow: none; - position: relative; - background-color: #272e3b; - color: rgba(255, 255, 255, 0.7); - border: 1px solid #000; - box-shadow: 0 0 0 1px #363d49 inset, 0 5px 10px rgba(0, 0, 0, 0.75); -} -.alert-error { - color: #f00; - background-color: #360e10; - box-shadow: 0 0 0 1px #551e21 inset, 0 5px 10px rgba(0, 0, 0, 0.75); -} -.alert:empty{ - display: none; -} -.alert-success { - color: #21ec0c; - background-color: #15360e; - box-shadow: 0 0 0 1px #2a551e inset, 0 5px 10px rgba(0, 0, 0, 0.75); +.box .checkmark:after { + left: 5px; + bottom: 0px; + width: 10px; + height: 25px; + border: solid #00a5c6; + border-width: 0 5px 4px 0; + transform: rotate(45deg); } \ No newline at end of file diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7c78613f602e0dac1b80281d0ab9660dba7ae05f GIT binary patch literal 39392 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 &Z$9 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 + + + Projekt blogowy + + + + + + + + + + + + + + + + +
+ +
+ +
+

Centrum Blogów

+ Zacznij swą blogową przygodę +
+ +
+
+
+

Najnowsze wpisy:

+
+

Lorem Ipsum

+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Czytaj więcej

+
+
+

Lorem Ipsum

+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Czytaj więcej

+
+
+

Lorem Ipsum

+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Czytaj więcej

+
+
+

Lorem Ipsum

+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Czytaj więcej

+
+
+

Lorem Ipsum

+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Czytaj więcej

+
+
+

Lorem Ipsum

+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Czytaj więcej

+
+
+ + + + + \ No newline at end of file diff --git a/js/app.js b/js/app.js new file mode 100644 index 0000000..5afba31 --- /dev/null +++ b/js/app.js @@ -0,0 +1,132 @@ +/* ----------------------------------------------- +/* How to use? : Check the GitHub README +/* ----------------------------------------------- */ + +/* To load a config file (particles.json) you need to host this demo (MAMP/WAMP/local)... */ + +particlesJS.load('particles-js', 'particles.json', function() { + console.log('particles.js loaded - callback'); +}); + +/* Otherwise just put the config content (json): */ + +particlesJS('particles-js', + + { + "particles": { + "number": { + "value": 80, + "density": { + "enable": true, + "value_area": 800 + } + }, + "color": { + "value": "#ffffff" + }, + "shape": { + "type": "circle", + "stroke": { + "width": 0, + "color": "#000000" + }, + "polygon": { + "nb_sides": 5 + }, + "image": { + "src": "img/github.svg", + "width": 100, + "height": 100 + } + }, + "opacity": { + "value": 0.5, + "random": false, + "anim": { + "enable": false, + "speed": 1, + "opacity_min": 0.1, + "sync": false + } + }, + "size": { + "value": 5, + "random": true, + "anim": { + "enable": false, + "speed": 40, + "size_min": 0.1, + "sync": false + } + }, + "line_linked": { + "enable": true, + "distance": 150, + "color": "#ffffff", + "opacity": 0.4, + "width": 1 + }, + "move": { + "enable": true, + "speed": 6, + "direction": "none", + "random": false, + "straight": false, + "out_mode": "out", + "attract": { + "enable": false, + "rotateX": 600, + "rotateY": 1200 + } + } + }, + "interactivity": { + "detect_on": "canvas", + "events": { + "onhover": { + "enable": true, + "mode": "repulse" + }, + "onclick": { + "enable": true, + "mode": "push" + }, + "resize": true + }, + "modes": { + "grab": { + "distance": 400, + "line_linked": { + "opacity": 1 + } + }, + "bubble": { + "distance": 400, + "size": 40, + "duration": 2, + "opacity": 8, + "speed": 3 + }, + "repulse": { + "distance": 200 + }, + "push": { + "particles_nb": 4 + }, + "remove": { + "particles_nb": 2 + } + } + }, + "retina_detect": true, + "config_demo": { + "hide_card": false, + "background_color": "#b61924", + "background_image": "", + "background_position": "50% 50%", + "background_repeat": "no-repeat", + "background_size": "cover" + } + } + +); \ No newline at end of file diff --git a/js/particles.js b/js/particles.js new file mode 100644 index 0000000..325d834 --- /dev/null +++ b/js/particles.js @@ -0,0 +1,1541 @@ +/* ----------------------------------------------- +/* Author : Vincent Garreau - vincentgarreau.com +/* MIT license: http://opensource.org/licenses/MIT +/* Demo / Generator : vincentgarreau.com/particles.js +/* GitHub : github.com/VincentGarreau/particles.js +/* How to use? : Check the GitHub README +/* v2.0.0 +/* ----------------------------------------------- */ + +var pJS = function(tag_id, params){ + + var canvas_el = document.querySelector('#'+tag_id+' > .particles-js-canvas-el'); + + /* particles.js variables with default values */ + this.pJS = { + canvas: { + el: canvas_el, + w: canvas_el.offsetWidth, + h: canvas_el.offsetHeight + }, + particles: { + number: { + value: 400, + density: { + enable: true, + value_area: 800 + } + }, + color: { + value: '#fff' + }, + shape: { + type: 'circle', + stroke: { + width: 0, + color: '#ff0000' + }, + polygon: { + nb_sides: 5 + }, + image: { + src: '', + width: 100, + height: 100 + } + }, + opacity: { + value: 1, + random: false, + anim: { + enable: false, + speed: 2, + opacity_min: 0, + sync: false + } + }, + size: { + value: 20, + random: false, + anim: { + enable: false, + speed: 20, + size_min: 0, + sync: false + } + }, + line_linked: { + enable: true, + distance: 100, + color: '#fff', + opacity: 1, + width: 1 + }, + move: { + enable: true, + speed: 2, + direction: 'none', + random: false, + straight: false, + out_mode: 'out', + bounce: false, + attract: { + enable: false, + rotateX: 3000, + rotateY: 3000 + } + }, + array: [] + }, + interactivity: { + detect_on: 'canvas', + events: { + onhover: { + enable: true, + mode: 'grab' + }, + onclick: { + enable: true, + mode: 'push' + }, + resize: true + }, + modes: { + grab:{ + distance: 100, + line_linked:{ + opacity: 1 + } + }, + bubble:{ + distance: 200, + size: 80, + duration: 0.4 + }, + repulse:{ + distance: 200, + duration: 0.4 + }, + push:{ + particles_nb: 4 + }, + remove:{ + particles_nb: 2 + } + }, + mouse:{} + }, + retina_detect: false, + fn: { + interact: {}, + modes: {}, + vendors:{} + }, + tmp: {} + }; + + var pJS = this.pJS; + + /* params settings */ + if(params){ + Object.deepExtend(pJS, params); + } + + pJS.tmp.obj = { + size_value: pJS.particles.size.value, + size_anim_speed: pJS.particles.size.anim.speed, + move_speed: pJS.particles.move.speed, + line_linked_distance: pJS.particles.line_linked.distance, + line_linked_width: pJS.particles.line_linked.width, + mode_grab_distance: pJS.interactivity.modes.grab.distance, + mode_bubble_distance: pJS.interactivity.modes.bubble.distance, + mode_bubble_size: pJS.interactivity.modes.bubble.size, + mode_repulse_distance: pJS.interactivity.modes.repulse.distance + }; + + + pJS.fn.retinaInit = function(){ + + if(pJS.retina_detect && window.devicePixelRatio > 1){ + pJS.canvas.pxratio = window.devicePixelRatio; + pJS.tmp.retina = true; + } + else{ + pJS.canvas.pxratio = 1; + pJS.tmp.retina = false; + } + + pJS.canvas.w = pJS.canvas.el.offsetWidth * pJS.canvas.pxratio; + pJS.canvas.h = pJS.canvas.el.offsetHeight * pJS.canvas.pxratio; + + pJS.particles.size.value = pJS.tmp.obj.size_value * pJS.canvas.pxratio; + pJS.particles.size.anim.speed = pJS.tmp.obj.size_anim_speed * pJS.canvas.pxratio; + pJS.particles.move.speed = pJS.tmp.obj.move_speed * pJS.canvas.pxratio; + pJS.particles.line_linked.distance = pJS.tmp.obj.line_linked_distance * pJS.canvas.pxratio; + pJS.interactivity.modes.grab.distance = pJS.tmp.obj.mode_grab_distance * pJS.canvas.pxratio; + pJS.interactivity.modes.bubble.distance = pJS.tmp.obj.mode_bubble_distance * pJS.canvas.pxratio; + pJS.particles.line_linked.width = pJS.tmp.obj.line_linked_width * pJS.canvas.pxratio; + pJS.interactivity.modes.bubble.size = pJS.tmp.obj.mode_bubble_size * pJS.canvas.pxratio; + pJS.interactivity.modes.repulse.distance = pJS.tmp.obj.mode_repulse_distance * pJS.canvas.pxratio; + + }; + + + + /* ---------- pJS functions - canvas ------------ */ + + pJS.fn.canvasInit = function(){ + pJS.canvas.ctx = pJS.canvas.el.getContext('2d'); + }; + + pJS.fn.canvasSize = function(){ + + pJS.canvas.el.width = pJS.canvas.w; + pJS.canvas.el.height = pJS.canvas.h; + + if(pJS && pJS.interactivity.events.resize){ + + window.addEventListener('resize', function(){ + + pJS.canvas.w = pJS.canvas.el.offsetWidth; + pJS.canvas.h = pJS.canvas.el.offsetHeight; + + /* resize canvas */ + if(pJS.tmp.retina){ + pJS.canvas.w *= pJS.canvas.pxratio; + pJS.canvas.h *= pJS.canvas.pxratio; + } + + pJS.canvas.el.width = pJS.canvas.w; + pJS.canvas.el.height = pJS.canvas.h; + + /* repaint canvas on anim disabled */ + if(!pJS.particles.move.enable){ + pJS.fn.particlesEmpty(); + pJS.fn.particlesCreate(); + pJS.fn.particlesDraw(); + pJS.fn.vendors.densityAutoParticles(); + } + + /* density particles enabled */ + pJS.fn.vendors.densityAutoParticles(); + + }); + + } + + }; + + + pJS.fn.canvasPaint = function(){ + pJS.canvas.ctx.fillRect(0, 0, pJS.canvas.w, pJS.canvas.h); + }; + + pJS.fn.canvasClear = function(){ + pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h); + }; + + + /* --------- pJS functions - particles ----------- */ + + pJS.fn.particle = function(color, opacity, position){ + + /* size */ + this.radius = (pJS.particles.size.random ? Math.random() : 1) * pJS.particles.size.value; + if(pJS.particles.size.anim.enable){ + this.size_status = false; + this.vs = pJS.particles.size.anim.speed / 100; + if(!pJS.particles.size.anim.sync){ + this.vs = this.vs * Math.random(); + } + } + + /* position */ + this.x = position ? position.x : Math.random() * pJS.canvas.w; + this.y = position ? position.y : Math.random() * pJS.canvas.h; + + /* check position - into the canvas */ + if(this.x > pJS.canvas.w - this.radius*2) this.x = this.x - this.radius; + else if(this.x < this.radius*2) this.x = this.x + this.radius; + if(this.y > pJS.canvas.h - this.radius*2) this.y = this.y - this.radius; + else if(this.y < this.radius*2) this.y = this.y + this.radius; + + /* check position - avoid overlap */ + if(pJS.particles.move.bounce){ + pJS.fn.vendors.checkOverlap(this, position); + } + + /* color */ + this.color = {}; + if(typeof(color.value) == 'object'){ + + if(color.value instanceof Array){ + var color_selected = color.value[Math.floor(Math.random() * pJS.particles.color.value.length)]; + this.color.rgb = hexToRgb(color_selected); + }else{ + if(color.value.r != undefined && color.value.g != undefined && color.value.b != undefined){ + this.color.rgb = { + r: color.value.r, + g: color.value.g, + b: color.value.b + } + } + if(color.value.h != undefined && color.value.s != undefined && color.value.l != undefined){ + this.color.hsl = { + h: color.value.h, + s: color.value.s, + l: color.value.l + } + } + } + + } + else if(color.value == 'random'){ + this.color.rgb = { + r: (Math.floor(Math.random() * (255 - 0 + 1)) + 0), + g: (Math.floor(Math.random() * (255 - 0 + 1)) + 0), + b: (Math.floor(Math.random() * (255 - 0 + 1)) + 0) + } + } + else if(typeof(color.value) == 'string'){ + this.color = color; + this.color.rgb = hexToRgb(this.color.value); + } + + /* opacity */ + this.opacity = (pJS.particles.opacity.random ? Math.random() : 1) * pJS.particles.opacity.value; + if(pJS.particles.opacity.anim.enable){ + this.opacity_status = false; + this.vo = pJS.particles.opacity.anim.speed / 100; + if(!pJS.particles.opacity.anim.sync){ + this.vo = this.vo * Math.random(); + } + } + + /* animation - velocity for speed */ + var velbase = {} + switch(pJS.particles.move.direction){ + case 'top': + velbase = { x:0, y:-1 }; + break; + case 'top-right': + velbase = { x:0.5, y:-0.5 }; + break; + case 'right': + velbase = { x:1, y:-0 }; + break; + case 'bottom-right': + velbase = { x:0.5, y:0.5 }; + break; + case 'bottom': + velbase = { x:0, y:1 }; + break; + case 'bottom-left': + velbase = { x:-0.5, y:1 }; + break; + case 'left': + velbase = { x:-1, y:0 }; + break; + case 'top-left': + velbase = { x:-0.5, y:-0.5 }; + break; + default: + velbase = { x:0, y:0 }; + break; + } + + if(pJS.particles.move.straight){ + this.vx = velbase.x; + this.vy = velbase.y; + if(pJS.particles.move.random){ + this.vx = this.vx * (Math.random()); + this.vy = this.vy * (Math.random()); + } + }else{ + this.vx = velbase.x + Math.random()-0.5; + this.vy = velbase.y + Math.random()-0.5; + } + + // var theta = 2.0 * Math.PI * Math.random(); + // this.vx = Math.cos(theta); + // this.vy = Math.sin(theta); + + this.vx_i = this.vx; + this.vy_i = this.vy; + + + + /* if shape is image */ + + var shape_type = pJS.particles.shape.type; + if(typeof(shape_type) == 'object'){ + if(shape_type instanceof Array){ + var shape_selected = shape_type[Math.floor(Math.random() * shape_type.length)]; + this.shape = shape_selected; + } + }else{ + this.shape = shape_type; + } + + if(this.shape == 'image'){ + var sh = pJS.particles.shape; + this.img = { + src: sh.image.src, + ratio: sh.image.width / sh.image.height + } + if(!this.img.ratio) this.img.ratio = 1; + if(pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg != undefined){ + pJS.fn.vendors.createSvgImg(this); + if(pJS.tmp.pushing){ + this.img.loaded = false; + } + } + } + + + + }; + + + pJS.fn.particle.prototype.draw = function() { + + var p = this; + + if(p.radius_bubble != undefined){ + var radius = p.radius_bubble; + }else{ + var radius = p.radius; + } + + if(p.opacity_bubble != undefined){ + var opacity = p.opacity_bubble; + }else{ + var opacity = p.opacity; + } + + if(p.color.rgb){ + var color_value = 'rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+opacity+')'; + }else{ + var color_value = 'hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+opacity+')'; + } + + pJS.canvas.ctx.fillStyle = color_value; + pJS.canvas.ctx.beginPath(); + + switch(p.shape){ + + case 'circle': + pJS.canvas.ctx.arc(p.x, p.y, radius, 0, Math.PI * 2, false); + break; + + case 'edge': + pJS.canvas.ctx.rect(p.x-radius, p.y-radius, radius*2, radius*2); + break; + + case 'triangle': + pJS.fn.vendors.drawShape(pJS.canvas.ctx, p.x-radius, p.y+radius / 1.66, radius*2, 3, 2); + break; + + case 'polygon': + pJS.fn.vendors.drawShape( + pJS.canvas.ctx, + p.x - radius / (pJS.particles.shape.polygon.nb_sides/3.5), // startX + p.y - radius / (2.66/3.5), // startY + radius*2.66 / (pJS.particles.shape.polygon.nb_sides/3), // sideLength + pJS.particles.shape.polygon.nb_sides, // sideCountNumerator + 1 // sideCountDenominator + ); + break; + + case 'star': + pJS.fn.vendors.drawShape( + pJS.canvas.ctx, + p.x - radius*2 / (pJS.particles.shape.polygon.nb_sides/4), // startX + p.y - radius / (2*2.66/3.5), // startY + radius*2*2.66 / (pJS.particles.shape.polygon.nb_sides/3), // sideLength + pJS.particles.shape.polygon.nb_sides, // sideCountNumerator + 2 // sideCountDenominator + ); + break; + + case 'image': + + function draw(){ + pJS.canvas.ctx.drawImage( + img_obj, + p.x-radius, + p.y-radius, + radius*2, + radius*2 / p.img.ratio + ); + } + + if(pJS.tmp.img_type == 'svg'){ + var img_obj = p.img.obj; + }else{ + var img_obj = pJS.tmp.img_obj; + } + + if(img_obj){ + draw(); + } + + break; + + } + + pJS.canvas.ctx.closePath(); + + if(pJS.particles.shape.stroke.width > 0){ + pJS.canvas.ctx.strokeStyle = pJS.particles.shape.stroke.color; + pJS.canvas.ctx.lineWidth = pJS.particles.shape.stroke.width; + pJS.canvas.ctx.stroke(); + } + + pJS.canvas.ctx.fill(); + + }; + + + pJS.fn.particlesCreate = function(){ + for(var i = 0; i < pJS.particles.number.value; i++) { + pJS.particles.array.push(new pJS.fn.particle(pJS.particles.color, pJS.particles.opacity.value)); + } + }; + + pJS.fn.particlesUpdate = function(){ + + for(var i = 0; i < pJS.particles.array.length; i++){ + + /* the particle */ + var p = pJS.particles.array[i]; + + // var d = ( dx = pJS.interactivity.mouse.click_pos_x - p.x ) * dx + ( dy = pJS.interactivity.mouse.click_pos_y - p.y ) * dy; + // var f = -BANG_SIZE / d; + // if ( d < BANG_SIZE ) { + // var t = Math.atan2( dy, dx ); + // p.vx = f * Math.cos(t); + // p.vy = f * Math.sin(t); + // } + + /* move the particle */ + if(pJS.particles.move.enable){ + var ms = pJS.particles.move.speed/2; + p.x += p.vx * ms; + p.y += p.vy * ms; + } + + /* change opacity status */ + if(pJS.particles.opacity.anim.enable) { + if(p.opacity_status == true) { + if(p.opacity >= pJS.particles.opacity.value) p.opacity_status = false; + p.opacity += p.vo; + }else { + if(p.opacity <= pJS.particles.opacity.anim.opacity_min) p.opacity_status = true; + p.opacity -= p.vo; + } + if(p.opacity < 0) p.opacity = 0; + } + + /* change size */ + if(pJS.particles.size.anim.enable){ + if(p.size_status == true){ + if(p.radius >= pJS.particles.size.value) p.size_status = false; + p.radius += p.vs; + }else{ + if(p.radius <= pJS.particles.size.anim.size_min) p.size_status = true; + p.radius -= p.vs; + } + if(p.radius < 0) p.radius = 0; + } + + /* change particle position if it is out of canvas */ + if(pJS.particles.move.out_mode == 'bounce'){ + var new_pos = { + x_left: p.radius, + x_right: pJS.canvas.w, + y_top: p.radius, + y_bottom: pJS.canvas.h + } + }else{ + var new_pos = { + x_left: -p.radius, + x_right: pJS.canvas.w + p.radius, + y_top: -p.radius, + y_bottom: pJS.canvas.h + p.radius + } + } + + if(p.x - p.radius > pJS.canvas.w){ + p.x = new_pos.x_left; + p.y = Math.random() * pJS.canvas.h; + } + else if(p.x + p.radius < 0){ + p.x = new_pos.x_right; + p.y = Math.random() * pJS.canvas.h; + } + if(p.y - p.radius > pJS.canvas.h){ + p.y = new_pos.y_top; + p.x = Math.random() * pJS.canvas.w; + } + else if(p.y + p.radius < 0){ + p.y = new_pos.y_bottom; + p.x = Math.random() * pJS.canvas.w; + } + + /* out of canvas modes */ + switch(pJS.particles.move.out_mode){ + case 'bounce': + if (p.x + p.radius > pJS.canvas.w) p.vx = -p.vx; + else if (p.x - p.radius < 0) p.vx = -p.vx; + if (p.y + p.radius > pJS.canvas.h) p.vy = -p.vy; + else if (p.y - p.radius < 0) p.vy = -p.vy; + break; + } + + /* events */ + if(isInArray('grab', pJS.interactivity.events.onhover.mode)){ + pJS.fn.modes.grabParticle(p); + } + + if(isInArray('bubble', pJS.interactivity.events.onhover.mode) || isInArray('bubble', pJS.interactivity.events.onclick.mode)){ + pJS.fn.modes.bubbleParticle(p); + } + + if(isInArray('repulse', pJS.interactivity.events.onhover.mode) || isInArray('repulse', pJS.interactivity.events.onclick.mode)){ + pJS.fn.modes.repulseParticle(p); + } + + /* interaction auto between particles */ + if(pJS.particles.line_linked.enable || pJS.particles.move.attract.enable){ + for(var j = i + 1; j < pJS.particles.array.length; j++){ + var p2 = pJS.particles.array[j]; + + /* link particles */ + if(pJS.particles.line_linked.enable){ + pJS.fn.interact.linkParticles(p,p2); + } + + /* attract particles */ + if(pJS.particles.move.attract.enable){ + pJS.fn.interact.attractParticles(p,p2); + } + + /* bounce particles */ + if(pJS.particles.move.bounce){ + pJS.fn.interact.bounceParticles(p,p2); + } + + } + } + + + } + + }; + + pJS.fn.particlesDraw = function(){ + + /* clear canvas */ + pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h); + + /* update each particles param */ + pJS.fn.particlesUpdate(); + + /* draw each particle */ + for(var i = 0; i < pJS.particles.array.length; i++){ + var p = pJS.particles.array[i]; + p.draw(); + } + + }; + + pJS.fn.particlesEmpty = function(){ + pJS.particles.array = []; + }; + + pJS.fn.particlesRefresh = function(){ + + /* init all */ + cancelRequestAnimFrame(pJS.fn.checkAnimFrame); + cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + pJS.tmp.source_svg = undefined; + pJS.tmp.img_obj = undefined; + pJS.tmp.count_svg = 0; + pJS.fn.particlesEmpty(); + pJS.fn.canvasClear(); + + /* restart */ + pJS.fn.vendors.start(); + + }; + + + /* ---------- pJS functions - particles interaction ------------ */ + + pJS.fn.interact.linkParticles = function(p1, p2){ + + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy); + + /* draw a line between p1 and p2 if the distance between them is under the config distance */ + if(dist <= pJS.particles.line_linked.distance){ + + var opacity_line = pJS.particles.line_linked.opacity - (dist / (1/pJS.particles.line_linked.opacity)) / pJS.particles.line_linked.distance; + + if(opacity_line > 0){ + + /* style */ + var color_line = pJS.particles.line_linked.color_rgb_line; + pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; + pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width; + //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */ + + /* path */ + pJS.canvas.ctx.beginPath(); + pJS.canvas.ctx.moveTo(p1.x, p1.y); + pJS.canvas.ctx.lineTo(p2.x, p2.y); + pJS.canvas.ctx.stroke(); + pJS.canvas.ctx.closePath(); + + } + + } + + }; + + + pJS.fn.interact.attractParticles = function(p1, p2){ + + /* condensed particles */ + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy); + + if(dist <= pJS.particles.line_linked.distance){ + + var ax = dx/(pJS.particles.move.attract.rotateX*1000), + ay = dy/(pJS.particles.move.attract.rotateY*1000); + + p1.vx -= ax; + p1.vy -= ay; + + p2.vx += ax; + p2.vy += ay; + + } + + + } + + + pJS.fn.interact.bounceParticles = function(p1, p2){ + + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy), + dist_p = p1.radius+p2.radius; + + if(dist <= dist_p){ + p1.vx = -p1.vx; + p1.vy = -p1.vy; + + p2.vx = -p2.vx; + p2.vy = -p2.vy; + } + + } + + + /* ---------- pJS functions - modes events ------------ */ + + pJS.fn.modes.pushParticles = function(nb, pos){ + + pJS.tmp.pushing = true; + + for(var i = 0; i < nb; i++){ + pJS.particles.array.push( + new pJS.fn.particle( + pJS.particles.color, + pJS.particles.opacity.value, + { + 'x': pos ? pos.pos_x : Math.random() * pJS.canvas.w, + 'y': pos ? pos.pos_y : Math.random() * pJS.canvas.h + } + ) + ) + if(i == nb-1){ + if(!pJS.particles.move.enable){ + pJS.fn.particlesDraw(); + } + pJS.tmp.pushing = false; + } + } + + }; + + + pJS.fn.modes.removeParticles = function(nb){ + + pJS.particles.array.splice(0, nb); + if(!pJS.particles.move.enable){ + pJS.fn.particlesDraw(); + } + + }; + + + pJS.fn.modes.bubbleParticle = function(p){ + + /* on hover event */ + if(pJS.interactivity.events.onhover.enable && isInArray('bubble', pJS.interactivity.events.onhover.mode)){ + + var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse), + ratio = 1 - dist_mouse / pJS.interactivity.modes.bubble.distance; + + function init(){ + p.opacity_bubble = p.opacity; + p.radius_bubble = p.radius; + } + + /* mousemove - check ratio */ + if(dist_mouse <= pJS.interactivity.modes.bubble.distance){ + + if(ratio >= 0 && pJS.interactivity.status == 'mousemove'){ + + /* size */ + if(pJS.interactivity.modes.bubble.size != pJS.particles.size.value){ + + if(pJS.interactivity.modes.bubble.size > pJS.particles.size.value){ + var size = p.radius + (pJS.interactivity.modes.bubble.size*ratio); + if(size >= 0){ + p.radius_bubble = size; + } + }else{ + var dif = p.radius - pJS.interactivity.modes.bubble.size, + size = p.radius - (dif*ratio); + if(size > 0){ + p.radius_bubble = size; + }else{ + p.radius_bubble = 0; + } + } + + } + + /* opacity */ + if(pJS.interactivity.modes.bubble.opacity != pJS.particles.opacity.value){ + + if(pJS.interactivity.modes.bubble.opacity > pJS.particles.opacity.value){ + var opacity = pJS.interactivity.modes.bubble.opacity*ratio; + if(opacity > p.opacity && opacity <= pJS.interactivity.modes.bubble.opacity){ + p.opacity_bubble = opacity; + } + }else{ + var opacity = p.opacity - (pJS.particles.opacity.value-pJS.interactivity.modes.bubble.opacity)*ratio; + if(opacity < p.opacity && opacity >= pJS.interactivity.modes.bubble.opacity){ + p.opacity_bubble = opacity; + } + } + + } + + } + + }else{ + init(); + } + + + /* mouseleave */ + if(pJS.interactivity.status == 'mouseleave'){ + init(); + } + + } + + /* on click event */ + else if(pJS.interactivity.events.onclick.enable && isInArray('bubble', pJS.interactivity.events.onclick.mode)){ + + + if(pJS.tmp.bubble_clicking){ + var dx_mouse = p.x - pJS.interactivity.mouse.click_pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.click_pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse), + time_spent = (new Date().getTime() - pJS.interactivity.mouse.click_time)/1000; + + if(time_spent > pJS.interactivity.modes.bubble.duration){ + pJS.tmp.bubble_duration_end = true; + } + + if(time_spent > pJS.interactivity.modes.bubble.duration*2){ + pJS.tmp.bubble_clicking = false; + pJS.tmp.bubble_duration_end = false; + } + } + + + function process(bubble_param, particles_param, p_obj_bubble, p_obj, id){ + + if(bubble_param != particles_param){ + + if(!pJS.tmp.bubble_duration_end){ + if(dist_mouse <= pJS.interactivity.modes.bubble.distance){ + if(p_obj_bubble != undefined) var obj = p_obj_bubble; + else var obj = p_obj; + if(obj != bubble_param){ + var value = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration); + if(id == 'size') p.radius_bubble = value; + if(id == 'opacity') p.opacity_bubble = value; + } + }else{ + if(id == 'size') p.radius_bubble = undefined; + if(id == 'opacity') p.opacity_bubble = undefined; + } + }else{ + if(p_obj_bubble != undefined){ + var value_tmp = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration), + dif = bubble_param - value_tmp; + value = bubble_param + dif; + if(id == 'size') p.radius_bubble = value; + if(id == 'opacity') p.opacity_bubble = value; + } + } + + } + + } + + if(pJS.tmp.bubble_clicking){ + /* size */ + process(pJS.interactivity.modes.bubble.size, pJS.particles.size.value, p.radius_bubble, p.radius, 'size'); + /* opacity */ + process(pJS.interactivity.modes.bubble.opacity, pJS.particles.opacity.value, p.opacity_bubble, p.opacity, 'opacity'); + } + + } + + }; + + + pJS.fn.modes.repulseParticle = function(p){ + + if(pJS.interactivity.events.onhover.enable && isInArray('repulse', pJS.interactivity.events.onhover.mode) && pJS.interactivity.status == 'mousemove') { + + var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse); + + var normVec = {x: dx_mouse/dist_mouse, y: dy_mouse/dist_mouse}, + repulseRadius = pJS.interactivity.modes.repulse.distance, + velocity = 100, + repulseFactor = clamp((1/repulseRadius)*(-1*Math.pow(dist_mouse/repulseRadius,2)+1)*repulseRadius*velocity, 0, 50); + + var pos = { + x: p.x + normVec.x * repulseFactor, + y: p.y + normVec.y * repulseFactor + } + + if(pJS.particles.move.out_mode == 'bounce'){ + if(pos.x - p.radius > 0 && pos.x + p.radius < pJS.canvas.w) p.x = pos.x; + if(pos.y - p.radius > 0 && pos.y + p.radius < pJS.canvas.h) p.y = pos.y; + }else{ + p.x = pos.x; + p.y = pos.y; + } + + } + + + else if(pJS.interactivity.events.onclick.enable && isInArray('repulse', pJS.interactivity.events.onclick.mode)) { + + if(!pJS.tmp.repulse_finish){ + pJS.tmp.repulse_count++; + if(pJS.tmp.repulse_count == pJS.particles.array.length){ + pJS.tmp.repulse_finish = true; + } + } + + if(pJS.tmp.repulse_clicking){ + + var repulseRadius = Math.pow(pJS.interactivity.modes.repulse.distance/6, 3); + + var dx = pJS.interactivity.mouse.click_pos_x - p.x, + dy = pJS.interactivity.mouse.click_pos_y - p.y, + d = dx*dx + dy*dy; + + var force = -repulseRadius / d * 1; + + function process(){ + + var f = Math.atan2(dy,dx); + p.vx = force * Math.cos(f); + p.vy = force * Math.sin(f); + + if(pJS.particles.move.out_mode == 'bounce'){ + var pos = { + x: p.x + p.vx, + y: p.y + p.vy + } + if (pos.x + p.radius > pJS.canvas.w) p.vx = -p.vx; + else if (pos.x - p.radius < 0) p.vx = -p.vx; + if (pos.y + p.radius > pJS.canvas.h) p.vy = -p.vy; + else if (pos.y - p.radius < 0) p.vy = -p.vy; + } + + } + + // default + if(d <= repulseRadius){ + process(); + } + + // bang - slow motion mode + // if(!pJS.tmp.repulse_finish){ + // if(d <= repulseRadius){ + // process(); + // } + // }else{ + // process(); + // } + + + }else{ + + if(pJS.tmp.repulse_clicking == false){ + + p.vx = p.vx_i; + p.vy = p.vy_i; + + } + + } + + } + + } + + + pJS.fn.modes.grabParticle = function(p){ + + if(pJS.interactivity.events.onhover.enable && pJS.interactivity.status == 'mousemove'){ + + var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse); + + /* draw a line between the cursor and the particle if the distance between them is under the config distance */ + if(dist_mouse <= pJS.interactivity.modes.grab.distance){ + + var opacity_line = pJS.interactivity.modes.grab.line_linked.opacity - (dist_mouse / (1/pJS.interactivity.modes.grab.line_linked.opacity)) / pJS.interactivity.modes.grab.distance; + + if(opacity_line > 0){ + + /* style */ + var color_line = pJS.particles.line_linked.color_rgb_line; + pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; + pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width; + //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */ + + /* path */ + pJS.canvas.ctx.beginPath(); + pJS.canvas.ctx.moveTo(p.x, p.y); + pJS.canvas.ctx.lineTo(pJS.interactivity.mouse.pos_x, pJS.interactivity.mouse.pos_y); + pJS.canvas.ctx.stroke(); + pJS.canvas.ctx.closePath(); + + } + + } + + } + + }; + + + + /* ---------- pJS functions - vendors ------------ */ + + pJS.fn.vendors.eventsListeners = function(){ + + /* events target element */ + if(pJS.interactivity.detect_on == 'window'){ + pJS.interactivity.el = window; + }else{ + pJS.interactivity.el = pJS.canvas.el; + } + + + /* detect mouse pos - on hover / click event */ + if(pJS.interactivity.events.onhover.enable || pJS.interactivity.events.onclick.enable){ + + /* el on mousemove */ + pJS.interactivity.el.addEventListener('mousemove', function(e){ + + if(pJS.interactivity.el == window){ + var pos_x = e.clientX, + pos_y = e.clientY; + } + else{ + var pos_x = e.offsetX || e.clientX, + pos_y = e.offsetY || e.clientY; + } + + pJS.interactivity.mouse.pos_x = pos_x; + pJS.interactivity.mouse.pos_y = pos_y; + + if(pJS.tmp.retina){ + pJS.interactivity.mouse.pos_x *= pJS.canvas.pxratio; + pJS.interactivity.mouse.pos_y *= pJS.canvas.pxratio; + } + + pJS.interactivity.status = 'mousemove'; + + }); + + /* el on onmouseleave */ + pJS.interactivity.el.addEventListener('mouseleave', function(e){ + + pJS.interactivity.mouse.pos_x = null; + pJS.interactivity.mouse.pos_y = null; + pJS.interactivity.status = 'mouseleave'; + + }); + + } + + /* on click event */ + if(pJS.interactivity.events.onclick.enable){ + + pJS.interactivity.el.addEventListener('click', function(){ + + pJS.interactivity.mouse.click_pos_x = pJS.interactivity.mouse.pos_x; + pJS.interactivity.mouse.click_pos_y = pJS.interactivity.mouse.pos_y; + pJS.interactivity.mouse.click_time = new Date().getTime(); + + if(pJS.interactivity.events.onclick.enable){ + + switch(pJS.interactivity.events.onclick.mode){ + + case 'push': + if(pJS.particles.move.enable){ + pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse); + }else{ + if(pJS.interactivity.modes.push.particles_nb == 1){ + pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse); + } + else if(pJS.interactivity.modes.push.particles_nb > 1){ + pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb); + } + } + break; + + case 'remove': + pJS.fn.modes.removeParticles(pJS.interactivity.modes.remove.particles_nb); + break; + + case 'bubble': + pJS.tmp.bubble_clicking = true; + break; + + case 'repulse': + pJS.tmp.repulse_clicking = true; + pJS.tmp.repulse_count = 0; + pJS.tmp.repulse_finish = false; + setTimeout(function(){ + pJS.tmp.repulse_clicking = false; + }, pJS.interactivity.modes.repulse.duration*1000) + break; + + } + + } + + }); + + } + + + }; + + pJS.fn.vendors.densityAutoParticles = function(){ + + if(pJS.particles.number.density.enable){ + + /* calc area */ + var area = pJS.canvas.el.width * pJS.canvas.el.height / 1000; + if(pJS.tmp.retina){ + area = area/(pJS.canvas.pxratio*2); + } + + /* calc number of particles based on density area */ + var nb_particles = area * pJS.particles.number.value / pJS.particles.number.density.value_area; + + /* add or remove X particles */ + var missing_particles = pJS.particles.array.length - nb_particles; + if(missing_particles < 0) pJS.fn.modes.pushParticles(Math.abs(missing_particles)); + else pJS.fn.modes.removeParticles(missing_particles); + + } + + }; + + + pJS.fn.vendors.checkOverlap = function(p1, position){ + for(var i = 0; i < pJS.particles.array.length; i++){ + var p2 = pJS.particles.array[i]; + + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy); + + if(dist <= p1.radius + p2.radius){ + p1.x = position ? position.x : Math.random() * pJS.canvas.w; + p1.y = position ? position.y : Math.random() * pJS.canvas.h; + pJS.fn.vendors.checkOverlap(p1); + } + } + }; + + + pJS.fn.vendors.createSvgImg = function(p){ + + /* set color to svg element */ + var svgXml = pJS.tmp.source_svg, + rgbHex = /#([0-9A-F]{3,6})/gi, + coloredSvgXml = svgXml.replace(rgbHex, function (m, r, g, b) { + if(p.color.rgb){ + var color_value = 'rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+p.opacity+')'; + }else{ + var color_value = 'hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+p.opacity+')'; + } + return color_value; + }); + + /* prepare to create img with colored svg */ + var svg = new Blob([coloredSvgXml], {type: 'image/svg+xml;charset=utf-8'}), + DOMURL = window.URL || window.webkitURL || window, + url = DOMURL.createObjectURL(svg); + + /* create particle img obj */ + var img = new Image(); + img.addEventListener('load', function(){ + p.img.obj = img; + p.img.loaded = true; + DOMURL.revokeObjectURL(url); + pJS.tmp.count_svg++; + }); + img.src = url; + + }; + + + pJS.fn.vendors.destroypJS = function(){ + cancelAnimationFrame(pJS.fn.drawAnimFrame); + canvas_el.remove(); + pJSDom = null; + }; + + + pJS.fn.vendors.drawShape = function(c, startX, startY, sideLength, sideCountNumerator, sideCountDenominator){ + + // By Programming Thomas - https://programmingthomas.wordpress.com/2013/04/03/n-sided-shapes/ + var sideCount = sideCountNumerator * sideCountDenominator; + var decimalSides = sideCountNumerator / sideCountDenominator; + var interiorAngleDegrees = (180 * (decimalSides - 2)) / decimalSides; + var interiorAngle = Math.PI - Math.PI * interiorAngleDegrees / 180; // convert to radians + c.save(); + c.beginPath(); + c.translate(startX, startY); + c.moveTo(0,0); + for (var i = 0; i < sideCount; i++) { + c.lineTo(sideLength,0); + c.translate(sideLength,0); + c.rotate(interiorAngle); + } + //c.stroke(); + c.fill(); + c.restore(); + + }; + + pJS.fn.vendors.exportImg = function(){ + window.open(pJS.canvas.el.toDataURL('image/png'), '_blank'); + }; + + + pJS.fn.vendors.loadImg = function(type){ + + pJS.tmp.img_error = undefined; + + if(pJS.particles.shape.image.src != ''){ + + if(type == 'svg'){ + + var xhr = new XMLHttpRequest(); + xhr.open('GET', pJS.particles.shape.image.src); + xhr.onreadystatechange = function (data) { + if(xhr.readyState == 4){ + if(xhr.status == 200){ + pJS.tmp.source_svg = data.currentTarget.response; + pJS.fn.vendors.checkBeforeDraw(); + }else{ + console.log('Error pJS - Image not found'); + pJS.tmp.img_error = true; + } + } + } + xhr.send(); + + }else{ + + var img = new Image(); + img.addEventListener('load', function(){ + pJS.tmp.img_obj = img; + pJS.fn.vendors.checkBeforeDraw(); + }); + img.src = pJS.particles.shape.image.src; + + } + + }else{ + console.log('Error pJS - No image.src'); + pJS.tmp.img_error = true; + } + + }; + + + pJS.fn.vendors.draw = function(){ + + if(pJS.particles.shape.type == 'image'){ + + if(pJS.tmp.img_type == 'svg'){ + + if(pJS.tmp.count_svg >= pJS.particles.number.value){ + pJS.fn.particlesDraw(); + if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + }else{ + //console.log('still loading...'); + if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + } + + }else{ + + if(pJS.tmp.img_obj != undefined){ + pJS.fn.particlesDraw(); + if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + }else{ + if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + } + + } + + }else{ + pJS.fn.particlesDraw(); + if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + } + + }; + + + pJS.fn.vendors.checkBeforeDraw = function(){ + + // if shape is image + if(pJS.particles.shape.type == 'image'){ + + if(pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg == undefined){ + pJS.tmp.checkAnimFrame = requestAnimFrame(check); + }else{ + //console.log('images loaded! cancel check'); + cancelRequestAnimFrame(pJS.tmp.checkAnimFrame); + if(!pJS.tmp.img_error){ + pJS.fn.vendors.init(); + pJS.fn.vendors.draw(); + } + + } + + }else{ + pJS.fn.vendors.init(); + pJS.fn.vendors.draw(); + } + + }; + + + pJS.fn.vendors.init = function(){ + + /* init canvas + particles */ + pJS.fn.retinaInit(); + pJS.fn.canvasInit(); + pJS.fn.canvasSize(); + pJS.fn.canvasPaint(); + pJS.fn.particlesCreate(); + pJS.fn.vendors.densityAutoParticles(); + + /* particles.line_linked - convert hex colors to rgb */ + pJS.particles.line_linked.color_rgb_line = hexToRgb(pJS.particles.line_linked.color); + + }; + + + pJS.fn.vendors.start = function(){ + + if(isInArray('image', pJS.particles.shape.type)){ + pJS.tmp.img_type = pJS.particles.shape.image.src.substr(pJS.particles.shape.image.src.length - 3); + pJS.fn.vendors.loadImg(pJS.tmp.img_type); + }else{ + pJS.fn.vendors.checkBeforeDraw(); + } + + }; + + + + + /* ---------- pJS - start ------------ */ + + + pJS.fn.vendors.eventsListeners(); + + pJS.fn.vendors.start(); + + + +}; + +/* ---------- global functions - vendors ------------ */ + +Object.deepExtend = function(destination, source) { + for (var property in source) { + if (source[property] && source[property].constructor && + source[property].constructor === Object) { + destination[property] = destination[property] || {}; + arguments.callee(destination[property], source[property]); + } else { + destination[property] = source[property]; + } + } + return destination; +}; + +window.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback){ + window.setTimeout(callback, 1000 / 60); + }; +})(); + +window.cancelRequestAnimFrame = ( function() { + return window.cancelAnimationFrame || + window.webkitCancelRequestAnimationFrame || + window.mozCancelRequestAnimationFrame || + window.oCancelRequestAnimationFrame || + window.msCancelRequestAnimationFrame || + clearTimeout +} )(); + +function hexToRgb(hex){ + // By Tim Down - http://stackoverflow.com/a/5624139/3493650 + // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") + var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + hex = hex.replace(shorthandRegex, function(m, r, g, b) { + return r + r + g + g + b + b; + }); + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; +}; + +function clamp(number, min, max) { + return Math.min(Math.max(number, min), max); +}; + +function isInArray(value, array) { + return array.indexOf(value) > -1; +} + + +/* ---------- particles.js functions - start ------------ */ + +window.pJSDom = []; + +window.particlesJS = function(tag_id, params){ + + //console.log(params); + + /* no string id? so it's object params, and set the id with default id */ + if(typeof(tag_id) != 'string'){ + params = tag_id; + tag_id = 'particles-js'; + } + + /* no id? set the id to default id */ + if(!tag_id){ + tag_id = 'particles-js'; + } + + /* pJS elements */ + var pJS_tag = document.getElementById(tag_id), + pJS_canvas_class = 'particles-js-canvas-el', + exist_canvas = pJS_tag.getElementsByClassName(pJS_canvas_class); + + /* remove canvas if exists into the pJS target tag */ + if(exist_canvas.length){ + while(exist_canvas.length > 0){ + pJS_tag.removeChild(exist_canvas[0]); + } + } + + /* create canvas element */ + var canvas_el = document.createElement('canvas'); + canvas_el.className = pJS_canvas_class; + + /* set size canvas */ + canvas_el.style.width = "100%"; + canvas_el.style.height = "100%"; + + /* append canvas */ + var canvas = document.getElementById(tag_id).appendChild(canvas_el); + + /* launch particle.js */ + if(canvas != null){ + pJSDom.push(new pJS(tag_id, params)); + } + +}; + +window.particlesJS.load = function(tag_id, path_config_json, callback){ + + /* load json config */ + var xhr = new XMLHttpRequest(); + xhr.open('GET', path_config_json); + xhr.onreadystatechange = function (data) { + if(xhr.readyState == 4){ + if(xhr.status == 200){ + var params = JSON.parse(data.currentTarget.response); + window.particlesJS(tag_id, params); + if(callback) callback(); + }else{ + console.log('Error pJS - XMLHttpRequest status: '+xhr.status); + console.log('Error pJS - File config not found'); + } + } + }; + xhr.send(); + +}; \ No newline at end of file diff --git a/register/index.php b/register/index.php deleted file mode 100644 index e51a65f..0000000 --- a/register/index.php +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
-
-

Rejestracja nowego użytkownika

-
-
- - - - -
- -
-
-
- - \ No newline at end of file