feat: Add initial project structure with HTML, CSS, JavaScript libraries, and image assets.

This commit is contained in:
Marco Gallegos
2025-11-21 15:33:06 -06:00
commit 672a6db19c
35 changed files with 53814 additions and 0 deletions

19
README.md Normal file
View File

@@ -0,0 +1,19 @@
# Soul:23 coming soon page
A responsive landing page built with Bootstrap 4 that keeps a countdown and lets visitors request updates via the email form. A live preview is available at https://solu23.cloud.
**Author:** Marco Gallegos
## Subscription form
The notification form is purely client-side; fill it out, but no emails are sent or stored until you connect it to your own backend.
## Changing the countdown target
The timer reads its target date from the `data-date` attribute on the `#countdown-timer` element in `index.html`. Update that attribute to any valid timestamp, for example:
```html
<div id="countdown-timer" data-date="January 17, 2025 03:24:00">
```
If you prefer keeping the attribute dynamic, reassign the `countDownDate` variable inside `js/countdown.js` before the interval starts.

147
css/addons/datatables.css Normal file
View File

@@ -0,0 +1,147 @@
/*
* MDBootstrap integration with Datatables
* Learn more: https://mdbootstrap.com/docs/jquery/tables/datatables/
* About MDBootstrap: https://mdbootstrap.com/
*
* This combined file was created by the DataTables downloader builder:
* https://datatables.net/download
*
* To rebuild or modify this file with the latest versions of the included
* software please visit:
* https://datatables.net/download/#bs4/dt-1.10.18
*
* Included libraries:
* DataTables 1.10.18
*/
table.dataTable thead {
cursor: pointer; }
table.dataTable thead > tr > th:active, table.dataTable thead > tr > td:active {
outline: none; }
div.dataTables_wrapper div.dataTables_length.d-flex.flex-row label {
margin-top: 1.2rem;
margin-right: 1rem; }
div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select span, div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select .select-dropdown {
margin-top: 1rem; }
div.dataTables_wrapper div.dataTables_length label {
text-align: left;
font-weight: normal;
padding-top: .5rem;
padding-bottom: .5rem; }
div.dataTables_wrapper div.dataTables_filter label {
text-align: left;
font-weight: normal;
padding-top: .5rem;
padding-bottom: .5rem; }
div.dataTables_wrapper div.dataTables_length select, div.dataTables_wrapper div.dataTables_length input {
width: auto; }
div.dataTables_wrapper div.dataTables_filter {
text-align: right; }
div.dataTables_wrapper div.dataTables_filter select {
width: auto; }
div.dataTables_wrapper div.dataTables_filter input {
width: auto;
margin-left: .5rem;
display: inline-block; }
div.dataTables_wrapper div.dataTables_info {
font-weight: normal;
padding-top: 1rem;
padding-bottom: 1rem; }
div.dataTables_wrapper div.dataTables_paginate {
font-weight: normal;
padding-top: 1rem;
padding-bottom: 1rem;
text-align: right;
margin: 0; }
div.dataTables_wrapper div.dataTables_paginate ul.pagination {
-webkit-box-pack: end;
-webkit-justify-content: flex-end;
-ms-flex-pack: end;
justify-content: flex-end; }
div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item.active .page-link:focus {
background-color: #4285f4; }
div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item .page-link:focus {
-webkit-box-shadow: none;
box-shadow: none; }
@media (max-width: 767px) {
div.dataTables_wrapper div .dataTables_length, div.dataTables_wrapper div .dataTables_filter, div.dataTables_wrapper div .dataTables_info, div.dataTables_wrapper div .dataTables_paginate ul.pagination {
text-align: center;
-webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center; } }
.bs-select select {
display: inline-block !important; }
table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting {
padding-right: 30px; }
table.dataTable thead > tr > td.sorting_asc, table.dataTable thead > tr > td.sorting_desc, table.dataTable thead > tr > td.sorting {
padding-right: 30px; }
table.dataTable thead > tr > th:active, table.dataTable thead > tr > td:active {
outline: none; }
table.dataTable thead .sorting, table.dataTable thead .sorting_asc, table.dataTable thead .sorting_desc, table.dataTable thead .sorting_asc_disabled, table.dataTable thead .sorting_desc_disabled {
cursor: pointer;
position: relative; }
table.dataTable thead .sorting:before, table.dataTable thead .sorting:after {
position: absolute;
bottom: 0.9em;
display: block;
opacity: 0.3; }
table.dataTable thead .sorting_asc:before, table.dataTable thead .sorting_asc:after {
position: absolute;
bottom: 0.9em;
display: block;
opacity: 0.3; }
table.dataTable thead .sorting_desc:before, table.dataTable thead .sorting_desc:after {
position: absolute;
bottom: 0.9em;
display: block;
opacity: 0.3; }
table.dataTable thead .sorting_asc_disabled:before, table.dataTable thead .sorting_asc_disabled:after {
position: absolute;
bottom: 0.9em;
display: block;
opacity: 0.3; }
table.dataTable thead .sorting_desc_disabled:before, table.dataTable thead .sorting_desc_disabled:after {
position: absolute;
bottom: 0.9em;
display: block;
opacity: 0.3; }
table.dataTable thead .sorting:before, table.dataTable thead .sorting_asc:before, table.dataTable thead .sorting_desc:before, table.dataTable thead .sorting_asc_disabled:before, table.dataTable thead .sorting_desc_disabled:before {
right: 1em;
content: "\f0de";
font-family: 'Font Awesome\ 5 Free';
font-weight: 900;
font-size: 1rem; }
table.dataTable thead .sorting:after, table.dataTable thead .sorting_asc:after, table.dataTable thead .sorting_desc:after, table.dataTable thead .sorting_asc_disabled:after, table.dataTable thead .sorting_desc_disabled:after {
right: 0.5em;
content: "\f0dd";
font-family: 'Font Awesome\ 5 Free';
font-weight: 900;
right: 16px;
font-size: 1rem; }
table.dataTable thead .sorting_asc:before, table.dataTable thead .sorting_desc:after {
opacity: 1; }
table.dataTable thead .sorting_asc_disabled:before, table.dataTable thead .sorting_desc_disabled:after {
opacity: 0; }

1
css/addons/datatables.min.css vendored Normal file
View File

@@ -0,0 +1 @@
div.dataTables_wrapper div.dataTables_filter select,div.dataTables_wrapper div.dataTables_length input,div.dataTables_wrapper div.dataTables_length select{width:auto}table.dataTable thead{cursor:pointer}div.dataTables_wrapper div.dataTables_length.d-flex.flex-row label{margin-top:1.2rem;margin-right:1rem}div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select .select-dropdown,div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select span{margin-top:1rem}div.dataTables_wrapper div.dataTables_filter label,div.dataTables_wrapper div.dataTables_length label{text-align:left;font-weight:400;padding-top:.5rem;padding-bottom:.5rem}div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{font-weight:400;padding-top:1rem;padding-bottom:1rem}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter input{width:auto;margin-left:.5rem;display:inline-block}div.dataTables_wrapper div.dataTables_paginate{text-align:right;margin:0}div.dataTables_wrapper div.dataTables_paginate ul.pagination{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item.active .page-link:focus{background-color:#4285f4}div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item .page-link:focus{-webkit-box-shadow:none;box-shadow:none}@media (max-width:767px){div.dataTables_wrapper div .dataTables_filter,div.dataTables_wrapper div .dataTables_info,div.dataTables_wrapper div .dataTables_length,div.dataTables_wrapper div .dataTables_paginate ul.pagination{text-align:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}}.bs-select select{display:inline-block!important}table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc{padding-right:30px}table.dataTable thead>tr>td:active,table.dataTable thead>tr>th:active{outline:0}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc_disabled:after,table.dataTable thead .sorting_desc_disabled:before{position:absolute;bottom:.9em;display:block;opacity:.3}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;content:"\f0de";font-family:'Font Awesome\ 5 Free';font-weight:900;font-size:1rem}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_desc_disabled:after{content:"\f0dd";font-family:'Font Awesome\ 5 Free';font-weight:900;right:16px;font-size:1rem}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0}

7
css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

38
css/mdb.lite.min.css vendored Normal file

File diff suppressed because one or more lines are too long

44
css/mdb.min.css vendored Executable file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

46
css/style.css Normal file
View File

@@ -0,0 +1,46 @@
/* Required height of parents of the Full Page Intro and Intro itself */
.timer-box {
background: rgba(10, 10, 10, 0.9);
color: #fff;
border-radius: 0.4em;
font-family: "Barlow", sans-serif;
align-content: center;
}
.timer-box-num {
font-size: 30pt;
text-align: center;
}
.timer-box-text {
font-size: 10pt;
text-align: center;
}
.content {
font-family: "Barlow", sans-serif;
}
span.h4 {
font-family: "Barlow", sans-serif;
}
i {
color: black;
}
a > i.social-icon:hover {
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.35);
}
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
-webkit-box-shadow: 0 0 0 30px white inset !important;
}
#notifs-forn-input,
#notifs-form-input:focus {
border: solid 2px #ccc;
}

1
img/logo.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="434.363" height="139.64" viewBox="0 0 434.363 139.64"><path d="M13.665 112.856v-13.5h13.909l.295 6.75.296 6.75 16.75.274 16.75.274V87.356h-10v-14h-23v-13h-15v-47h63v23h-15v-12h-33v23.89l4.75.305c4.74.304 4.75.312 4.42 3.67-.18 1.851-.06 4.439.27 5.75.589 2.347.79 2.385 12.531 2.385H62.57l.297 6.18.298 6.179 6.75-.249 6.75-.248v54.138h-63Zm74-43v-56.5h59v113h-59zm45.214 5c.118-21.175.23-41.088.25-44.25l.036-5.75-16.401-.276-16.402-.275.652 9.18c.358 5.048.651 25.084.651 44.525v35.346h31zm25.786-5.036V13.284l9.75.286 9.75.286.245 49.5.245 49.5h21.51l.26-49.75.259-49.75h54.981v100h28v13h-48v-102h-15v102h-62zm136 23.536v-33h31v-12h11v-24h-30v12h-12v-23h53v60h-41v40.075l9.25-.287 9.25-.288.296-6.75.296-6.75h21.908v27h-53zm64 19.5v-13.5h18v14.058l13.25-.279 13.25-.279.271-19.75.271-19.75h-14.042v-12h14.045l-.272-18.25-.273-18.25-13.25-.279-13.25-.28v12.059h-18v-23h62v48h-10v11.626l4.75-.063 4.75-.063.266 26.75.267 26.75h-62.033Zm-88-24v-9.5h13v19h-13zm88-34.5v-6h18v12h-18z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
img/logo_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

22
img/logo_2.svg Normal file
View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg1"
width="500"
height="143.34241"
viewBox="0 0 500 143.34241"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
id="g1"
transform="translate(0,-175.95109)">
<path
style="fill:#000000"
d="m 46.483663,293.03617 v -13.5 h 6.95431 6.95431 l 0.29569,6.75 0.29569,6.75 16.75,0.27418 16.750004,0.27418 v -13.02418 -13.02418 h -5.000004 -5 v -7 -7 h -11.5 -11.5 v -6.5 -6.5 h -7.5 -7.5 v -23.5 -23.5 h 31.5 31.500007 v 11.5 11.5 h -7.5 -7.500003 v -6 -6 h -16.500004 -16.5 v 11.94521 11.94521 l 4.75,0.30479 c 4.740618,0.30419 4.749349,0.31144 4.420569,3.67024 -0.181187,1.851 -0.06011,4.4385 0.269052,5.75 0.588828,2.34608 0.790996,2.38455 12.531714,2.38455 h 11.933229 l 0.29772,6.17936 0.29772,6.17936 6.750003,-0.24828 6.75,-0.24827 v 27.06891 27.06892 h -31.500007 -31.5 z m 74.000007,-43 v -56.5 h 29.5 29.5 v 56.5 56.5 h -29.5 -29.5 z m 45.21429,5 c 0.11785,-21.175 0.23035,-41.0875 0.25,-44.25 l 0.0357,-5.75 -16.40155,-0.2755 -16.40156,-0.2755 0.65156,9.17913 c 0.35836,5.04851 0.65156,25.08499 0.65156,44.52549 v 35.34638 h 15.5 15.5 z m 25.78571,-5.03621 v -56.53621 l 9.75,0.28621 9.75,0.28621 0.24489,49.5 0.24489,49.5 h 10.75511 10.75511 l 0.25934,-49.75 0.25933,-49.75 h 27.49067 27.49066 v 50 50 h 14 14 v 6.5 6.5 h -24 -24 v -51 -51 h -7.5 -7.5 v 51 51 h -31 -31 z m 136,23.53621 v -33 h 15.5 15.5 v -6 -6 h 5.5 5.5 v -12 -12 h -15 -15 v 6 6 h -6 -6 v -11.5 -11.5 h 26.5 26.5 v 30 30 h -20.5 -20.5 v 20.03753 20.03752 l 9.25,-0.28752 9.25,-0.28753 0.29569,-6.75 0.29569,-6.75 h 10.95431 10.95431 v 13.5 13.5 h -26.5 -26.5 z m 64,19.5 v -13.5 h 9 9 v 7.02903 7.02902 l 13.25,-0.27902 13.25,-0.27903 0.27114,-19.75 0.27114,-19.75 h -7.02114 -7.02114 v -6 -6 h 7.02256 7.02256 l -0.27256,-18.25 -0.27256,-18.25 -13.25,-0.27903 -13.25,-0.27902 v 6.02902 6.02903 h -9 -9 v -11.5 -11.5 h 31 31 v 24 24 h -5 -5 v 5.81284 5.81284 l 4.75,-0.0628 4.75,-0.0628 0.26633,26.75 0.26634,26.75 H 422.5 391.48367 Z m -88,-24 v -9.5 h 6.5 6.5 v 9.5 9.5 h -6.5 -6.5 z m 88,-34.5 v -6 h 9 9 v 6 6 h -9 -9 z"
id="path1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
img/logo_new.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

140
index.html Normal file
View File

@@ -0,0 +1,140 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Soul:23 | Hello there</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/mdb.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Barlow" rel="stylesheet">
</head>
<body>
<br>
<br>
<br>
<div class="container mt-5">
<div class="row">
<div class="col-12">
<center>
<img src="img/logo_2.svg" class="mr-3" style="max-width: 250px; height: auto; display: block;">
</center>
</div>
</div>
</div>
<div class="container mt-5">
<div class="row justify-content-center" id="countdown-timer" data-date="November 11, 2027 11:11:11">
<div class="col-md-2 col-lg-1 col-4 mb-2 mb-md-0 timer-box pt-4 pb-4 mr-2">
<div class="row">
<div class="col-12">
<div class="timer-box-num" name="days">666</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="timer-box-text">Días</div>
</div>
</div>
</div>
<div class="col-md-2 col-lg-1 col-4 mb-2 mb-md-0 timer-box pt-4 pb-4 mr-2">
<div class="row">
<div class="col-12">
<div class="timer-box-num" name="hours">66</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="timer-box-text">Horas</div>
</div>
</div>
</div>
<div class="col-md-2 col-lg-1 col-4 timer-box pt-4 pb-4 mr-2">
<div class="row">
<div class="col-12">
<div class="timer-box-num" name="minutes">66</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="timer-box-text">Minutos</div>
</div>
</div>
</div>
<div class="col-md-2 col-lg-1 col-4 timer-box pt-4 pb-4 mr-2">
<div class="row">
<div class="col-12">
<div class="timer-box-num" name="seconds">66</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="timer-box-text">Segundos</div>
</div>
</div>
</div>
</div>
</div>
<br>
<div class="container mt-5">
<div class="row">
<div class="col-12 content">
<center>
<h4>Próximamente. Suscríbete para recibir notificaciones de actualizaciones futuras.</h4>
</center>
</div>
</div>
<div class="row mt-3 text-center">
<div class="col-12">
<form class="form-inline" style="display: inline" id="notifs-form">
<input type="email" class="form-control" id="notifs-form-input" aria-describedby="emailHelp"
placeholder="Enter email">
<button type="button" class="btn btn-dark mt-2 mt-md-0" id="notifs-form-btn">¡Te avisamos!</button>
<label class="notified-label"></label>
</form>
</div>
</div>
</div>
<br>
<br>
<br>
<br>
<!--
<footer class="text-center page-footer">
<div class="pb-4 pt-4">
<a href="#" target="_blank">
<i class="fab fa-facebook-f mr-3 social-icon"></i>
</a>
<a href="#" target="_blank">
<i class="fab fa-twitter mr-3 social-icon"></i>
</a>
<a href="#" target="_blank">
<i class="fab fa-instagram mr-3 social-icon"></i>
</a>
<a href="#" target="_blank">
<i class="fab fa-snapchat mr-3 social-icon"></i>
</a>
</div>
</footer>
-->
<script type="text/javascript" src="js/popper.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script src="js/require.js" type="text/javascript"></script>
<script src="js/countdown.js" type="text/javascript"></script>
</body>
</html>

15500
js/addons/datatables.js Normal file

File diff suppressed because it is too large Load Diff

3
js/addons/datatables.min.js vendored Normal file

File diff suppressed because one or more lines are too long

3944
js/bootstrap.js vendored Executable file

File diff suppressed because it is too large Load Diff

7
js/bootstrap.min.js vendored Executable file

File diff suppressed because one or more lines are too long

33
js/countdown.js Normal file
View File

@@ -0,0 +1,33 @@
var dateData = document.getElementById('countdown-timer').getAttribute('data-date');
var countDownDate = new Date(dateData).getTime();
// Update the count down every 1 second
var x = setInterval(function () {
// Get todays date and time
var now = new Date().getTime();
// Find the distance between now an the count down date
var distance = countDownDate - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
if (distance > 0) {
$("div[name='seconds']").html(seconds);
$("div[name='minutes']").html(minutes);
$("div[name='hours']").html(hours);
$("div[name='days']").html(days);
}
else {
$("div[name='seconds']").html("-");
$("div[name='minutes']").html("-");
$("div[name='hours']").html("-");
$("div[name='days']").html("-");
}
}, 1000);

View File

@@ -0,0 +1,54 @@
// Initialize Firebase
function validateEmail(email) {
var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(String(email).toLowerCase());
}
var config = {
apiKey: "<YOUR FIREBASE API KEY>",
authDomain: "<FIREBASE AUTH DOMAIN>",
databaseURL: "<DB URL>",
projectId: "<PROJECT ID>",
storageBucket: "<STRORAGE BUKCET>",
messagingSenderId: "<MESSAGE SENDER ID>"
};
firebase.initializeApp(config);
var db = firebase.firestore();
db.settings({
timestampsInSnapshots: true
});
$(document).ready(function () {
$('#notifs-form-btn').click(function (e) {
var is_present = false;
email = $('#notifs-form-input').val();
if (validateEmail(email)) {
db.collection('Emails').get().then(function (qs) {
qs.forEach(function (element) {
if (element.data()['ID'] == email) {
is_present = true;
}
});
if (is_present == false) {
db.collection("Emails").add({
'ID': email,
})
.then(function (docRef) {
console.log("Document written with ID: ", docRef.id);
$("#notifs-form-btn").text("Notified!");
})
.catch(function (error) {
console.error("Error adding document: ", error);
});
}
});
}
else {
alert('Invalid Email');
}
});
});

2
js/jquery-3.3.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

15730
js/mdb.js Normal file

File diff suppressed because one or more lines are too long

1
js/mdb.min.js vendored Normal file

File diff suppressed because one or more lines are too long

14456
js/modules/chart.js Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,22 @@
'use strict';
(function ($) {
$('.input-default-wrapper').on('change', '.input-default-js', function (e) {
var $this = $(e.target),
$label = $this.next('label'),
$files = $this[0].files;
var fileName = '';
if ($files && $files.length > 1) {
fileName = ($this.attr('data-multiple-target') || '').replace('{target}', $files.length);
} else if (e.target.value) {
fileName = e.target.value.split('\\').pop();
}
if (fileName) {
$label.find('.span-choose-file').html(fileName);
} else {
$label.html($label.html());
}
});
})(jQuery);

26
js/modules/enhanced-modals.js Executable file
View File

@@ -0,0 +1,26 @@
/*
Enhanced Bootstrap Modals
https://mdbootstrap.com
office@mdbootstrap.com
*/
$('body').on('shown.bs.modal', '.modal', function() {
if($('.modal-backdrop').length) {
} else {
$modal_dialog = $(this).children('.modal-dialog')
if($modal_dialog.hasClass('modal-side')) {
$(this).addClass('modal-scrolling');
$('body').addClass('scrollable');
}
if($modal_dialog.hasClass('modal-frame')) {
$(this).addClass('modal-content-clickable');
$('body').addClass('scrollable');
}
}
});
$('body').on('hidden.bs.modal', '.modal', function() {
$('body').removeClass('scrollable');
});

208
js/modules/forms-free.js Executable file
View File

@@ -0,0 +1,208 @@
'use strict';
(function ($) {
var inputSelector = ['text', 'password', 'email', 'url', 'tel', 'number', 'search', 'search-md'].map(function (selector) {
return 'input[type=' + selector + ']';
}).join(', ') + ', textarea';
var textAreaSelector = '.materialize-textarea';
var updateTextFields = function updateTextFields($input) {
var $labelAndIcon = $input.siblings('label, i');
var hasValue = $input.val().length;
var hasPlaceholder = $input.attr('placeholder');
var addOrRemove = (hasValue || hasPlaceholder ? 'add' : 'remove') + 'Class';
$labelAndIcon[addOrRemove]('active');
};
var validateField = function validateField($input) {
if ($input.hasClass('validate')) {
var value = $input.val();
var noValue = !value.length;
var isValid = !$input[0].validity.badInput;
if (noValue && isValid) {
$input.removeClass('valid').removeClass('invalid');
} else {
var valid = $input.is(':valid');
var length = Number($input.attr('length')) || 0;
if (valid && (!length || length > value.length)) {
$input.removeClass('invalid').addClass('valid');
} else {
$input.removeClass('valid').addClass('invalid');
}
}
}
};
var textAreaAutoResize = function textAreaAutoResize() {
var $textarea = $(undefined);
if ($textarea.val().length) {
var $hiddenDiv = $('.hiddendiv');
var fontFamily = $textarea.css('font-family');
var fontSize = $textarea.css('font-size');
if (fontSize) {
$hiddenDiv.css('font-size', fontSize);
}
if (fontFamily) {
$hiddenDiv.css('font-family', fontFamily);
}
if ($textarea.attr('wrap') === 'off') {
$hiddenDiv.css('overflow-wrap', 'normal').css('white-space', 'pre');
}
$hiddenDiv.text($textarea.val() + '\n');
var content = $hiddenDiv.html().replace(/\n/g, '<br>');
$hiddenDiv.html(content);
// When textarea is hidden, width goes crazy.
// Approximate with half of window size
$hiddenDiv.css('width', $textarea.is(':visible') ? $textarea.width() : $(window).width() / 2);
$textarea.css('height', $hiddenDiv.height());
}
};
$(inputSelector).each(function (index, input) {
var $this = $(input);
var $labelAndIcon = $this.siblings('label, i');
updateTextFields($this);
var isValid = input.validity.badInput;
if (isValid) {
$labelAndIcon.addClass('active');
}
});
$(document).on('focus', inputSelector, function (e) {
$(e.target).siblings('label, i').addClass('active');
});
$(document).on('blur', inputSelector, function (e) {
var $this = $(e.target);
var noValue = !$this.val();
var invalid = !e.target.validity.badInput;
var noPlaceholder = $this.attr('placeholder') === undefined;
if (noValue && invalid && noPlaceholder) {
$this.siblings('label, i').removeClass('active');
}
validateField($this);
});
$(document).on('change', inputSelector, function (e) {
var $this = $(e.target);
updateTextFields($this);
validateField($this);
});
$('input[autofocus]').siblings('label, i').addClass('active');
$(document).on('reset', function (e) {
var $formReset = $(e.target);
if ($formReset.is('form')) {
var $formInputs = $formReset.find(inputSelector);
$formInputs.removeClass('valid').removeClass('invalid').each(function (index, input) {
var $this = $(input);
var noDefaultValue = !$this.val();
var noPlaceholder = !$this.attr('placeholder');
if (noDefaultValue && noPlaceholder) {
$this.siblings('label, i').removeClass('active');
}
});
$formReset.find('select.initialized').each(function (index, select) {
var $select = $(select);
var $visibleInput = $select.siblings('input.select-dropdown');
var defaultValue = $select.children('[selected]').val();
$select.val(defaultValue);
$visibleInput.val(defaultValue);
});
}
});
function init() {
var $text = $('.md-textarea-auto');
if ($text.length) {
var observe = void 0;
if (window.attachEvent) {
observe = function observe(element, event, handler) {
element.attachEvent('on' + event, handler);
};
} else {
observe = function observe(element, event, handler) {
element.addEventListener(event, handler, false);
};
}
$text.each(function () {
var self = this;
function resize() {
self.style.height = 'auto';
self.style.height = self.scrollHeight + 'px';
}
function delayedResize() {
window.setTimeout(resize, 0);
}
observe(self, 'change', resize);
observe(self, 'cut', delayedResize);
observe(self, 'paste', delayedResize);
observe(self, 'drop', delayedResize);
observe(self, 'keydown', delayedResize);
resize();
});
}
}
init();
var $body = $('body');
if (!$('.hiddendiv').first().length) {
var $hiddenDiv = $('<div class="hiddendiv common"></div>');
$body.append($hiddenDiv);
}
$(textAreaSelector).each(textAreaAutoResize);
$body.on('keyup keydown', textAreaSelector, textAreaAutoResize);
})(jQuery);

205
js/modules/jquery.easing.js Executable file
View File

@@ -0,0 +1,205 @@
/*
* jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
*
* Uses the built in easing capabilities added In jQuery 1.1
* to offer multiple easing options
*
* TERMS OF USE - jQuery Easing
*
* Open source under the BSD License.
*
* Copyright © 2008 George McGinley Smith
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* Neither the name of the author nor the names of contributors may be used to endorse
* or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
// t: current time, b: begInnIng value, c: change In value, d: duration
jQuery.easing['jswing'] = jQuery.easing['swing'];
jQuery.extend( jQuery.easing,
{
def: 'easeOutQuad',
swing: function (x, t, b, c, d) {
//alert(jQuery.easing.default);
return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
},
easeInQuad: function (x, t, b, c, d) {
return c*(t/=d)*t + b;
},
easeOutQuad: function (x, t, b, c, d) {
return -c *(t/=d)*(t-2) + b;
},
easeInOutQuad: function (x, t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t + b;
return -c/2 * ((--t)*(t-2) - 1) + b;
},
easeInCubic: function (x, t, b, c, d) {
return c*(t/=d)*t*t + b;
},
easeOutCubic: function (x, t, b, c, d) {
return c*((t=t/d-1)*t*t + 1) + b;
},
easeInOutCubic: function (x, t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t*t + b;
return c/2*((t-=2)*t*t + 2) + b;
},
easeInQuart: function (x, t, b, c, d) {
return c*(t/=d)*t*t*t + b;
},
easeOutQuart: function (x, t, b, c, d) {
return -c * ((t=t/d-1)*t*t*t - 1) + b;
},
easeInOutQuart: function (x, t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
return -c/2 * ((t-=2)*t*t*t - 2) + b;
},
easeInQuint: function (x, t, b, c, d) {
return c*(t/=d)*t*t*t*t + b;
},
easeOutQuint: function (x, t, b, c, d) {
return c*((t=t/d-1)*t*t*t*t + 1) + b;
},
easeInOutQuint: function (x, t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
return c/2*((t-=2)*t*t*t*t + 2) + b;
},
easeInSine: function (x, t, b, c, d) {
return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
},
easeOutSine: function (x, t, b, c, d) {
return c * Math.sin(t/d * (Math.PI/2)) + b;
},
easeInOutSine: function (x, t, b, c, d) {
return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
},
easeInExpo: function (x, t, b, c, d) {
return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
},
easeOutExpo: function (x, t, b, c, d) {
return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
},
easeInOutExpo: function (x, t, b, c, d) {
if (t==0) return b;
if (t==d) return b+c;
if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
},
easeInCirc: function (x, t, b, c, d) {
return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
},
easeOutCirc: function (x, t, b, c, d) {
return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
},
easeInOutCirc: function (x, t, b, c, d) {
if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
},
easeInElastic: function (x, t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
},
easeOutElastic: function (x, t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
},
easeInOutElastic: function (x, t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
},
easeInBack: function (x, t, b, c, d, s) {
if (s == undefined) s = 1.70158;
return c*(t/=d)*t*((s+1)*t - s) + b;
},
easeOutBack: function (x, t, b, c, d, s) {
if (s == undefined) s = 1.70158;
return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
},
easeInOutBack: function (x, t, b, c, d, s) {
if (s == undefined) s = 1.70158;
if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
},
easeInBounce: function (x, t, b, c, d) {
return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
},
easeOutBounce: function (x, t, b, c, d) {
if ((t/=d) < (1/2.75)) {
return c*(7.5625*t*t) + b;
} else if (t < (2/2.75)) {
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
} else if (t < (2.5/2.75)) {
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
} else {
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
}
},
easeInOutBounce: function (x, t, b, c, d) {
if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
}
});
/*
*
* TERMS OF USE - EASING EQUATIONS
*
* Open source under the BSD License.
*
* Copyright © 2001 Robert Penner
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* Neither the name of the author nor the names of contributors may be used to endorse
* or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/

21
js/modules/scrolling-navbar.js Executable file
View File

@@ -0,0 +1,21 @@
'use strict';
(function ($) {
var SCROLLING_NAVBAR_OFFSET_TOP = 50;
$(window).on('scroll', function () {
var $navbar = $('.navbar');
if ($navbar.length) {
if ($navbar.offset().top > SCROLLING_NAVBAR_OFFSET_TOP) {
$('.scrolling-navbar').addClass('top-nav-collapse');
} else {
$('.scrolling-navbar').removeClass('top-nav-collapse');
}
}
});
})(jQuery);

5
js/modules/velocity.js Normal file

File diff suppressed because one or more lines are too long

5
js/modules/velocity.min.js vendored Executable file

File diff suppressed because one or more lines are too long

603
js/modules/waves.js Executable file
View File

@@ -0,0 +1,603 @@
/*!
* Waves v0.7.6
* http://fian.my.id/Waves
*
* Copyright 2014-2018 Alfiana E. Sibuea and other contributors
* Released under the MIT license
* https://github.com/fians/Waves/blob/master/LICENSE
*/
;(function(window, factory) {
'use strict';
// AMD. Register as an anonymous module. Wrap in function so we have access
// to root via `this`.
if (typeof define === 'function' && define.amd) {
define([], function() {
window.Waves = factory.call(window);
return window.Waves;
});
}
// Node. Does not work with strict CommonJS, but only CommonJS-like
// environments that support module.exports, like Node.
else if (typeof exports === 'object') {
module.exports = factory.call(window);
}
// Browser globals.
else {
window.Waves = factory.call(window);
}
})(typeof global === 'object' ? global : this, function() {
'use strict';
var Waves = Waves || {};
var $$ = document.querySelectorAll.bind(document);
var toString = Object.prototype.toString;
var isTouchAvailable = 'ontouchstart' in window;
// Find exact position of element
function isWindow(obj) {
return obj !== null && obj === obj.window;
}
function getWindow(elem) {
return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;
}
function isObject(value) {
var type = typeof value;
return type === 'function' || type === 'object' && !!value;
}
function isDOMNode(obj) {
return isObject(obj) && obj.nodeType > 0;
}
function getWavesElements(nodes) {
var stringRepr = toString.call(nodes);
if (stringRepr === '[object String]') {
return $$(nodes);
} else if (isObject(nodes) && /^\[object (Array|HTMLCollection|NodeList|Object)\]$/.test(stringRepr) && nodes.hasOwnProperty('length')) {
return nodes;
} else if (isDOMNode(nodes)) {
return [nodes];
}
return [];
}
function offset(elem) {
var docElem, win,
box = { top: 0, left: 0 },
doc = elem && elem.ownerDocument;
docElem = doc.documentElement;
if (typeof elem.getBoundingClientRect !== typeof undefined) {
box = elem.getBoundingClientRect();
}
win = getWindow(doc);
return {
top: box.top + win.pageYOffset - docElem.clientTop,
left: box.left + win.pageXOffset - docElem.clientLeft
};
}
function convertStyle(styleObj) {
var style = '';
for (var prop in styleObj) {
if (styleObj.hasOwnProperty(prop)) {
style += (prop + ':' + styleObj[prop] + ';');
}
}
return style;
}
var Effect = {
// Effect duration
duration: 750,
// Effect delay (check for scroll before showing effect)
delay: 200,
show: function(e, element, velocity) {
// Disable right click
if (e.button === 2) {
return false;
}
element = element || this;
// Create ripple
var ripple = document.createElement('div');
ripple.className = 'waves-ripple waves-rippling';
element.appendChild(ripple);
// Get click coordinate and element width
var pos = offset(element);
var relativeY = 0;
var relativeX = 0;
// Support for touch devices
if('touches' in e && e.touches.length) {
relativeY = (e.touches[0].pageY - pos.top);
relativeX = (e.touches[0].pageX - pos.left);
}
//Normal case
else {
relativeY = (e.pageY - pos.top);
relativeX = (e.pageX - pos.left);
}
// Support for synthetic events
relativeX = relativeX >= 0 ? relativeX : 0;
relativeY = relativeY >= 0 ? relativeY : 0;
var scale = 'scale(' + ((element.clientWidth / 100) * 3) + ')';
var translate = 'translate(0,0)';
if (velocity) {
translate = 'translate(' + (velocity.x) + 'px, ' + (velocity.y) + 'px)';
}
// Attach data to element
ripple.setAttribute('data-hold', Date.now());
ripple.setAttribute('data-x', relativeX);
ripple.setAttribute('data-y', relativeY);
ripple.setAttribute('data-scale', scale);
ripple.setAttribute('data-translate', translate);
// Set ripple position
var rippleStyle = {
top: relativeY + 'px',
left: relativeX + 'px'
};
ripple.classList.add('waves-notransition');
ripple.setAttribute('style', convertStyle(rippleStyle));
ripple.classList.remove('waves-notransition');
// Scale the ripple
rippleStyle['-webkit-transform'] = scale + ' ' + translate;
rippleStyle['-moz-transform'] = scale + ' ' + translate;
rippleStyle['-ms-transform'] = scale + ' ' + translate;
rippleStyle['-o-transform'] = scale + ' ' + translate;
rippleStyle.transform = scale + ' ' + translate;
rippleStyle.opacity = '1';
var duration = e.type === 'mousemove' ? 2500 : Effect.duration;
rippleStyle['-webkit-transition-duration'] = duration + 'ms';
rippleStyle['-moz-transition-duration'] = duration + 'ms';
rippleStyle['-o-transition-duration'] = duration + 'ms';
rippleStyle['transition-duration'] = duration + 'ms';
ripple.setAttribute('style', convertStyle(rippleStyle));
},
hide: function(e, element) {
element = element || this;
var ripples = element.getElementsByClassName('waves-rippling');
for (var i = 0, len = ripples.length; i < len; i++) {
removeRipple(e, element, ripples[i]);
}
if (isTouchAvailable) {
element.removeEventListener('touchend', Effect.hide);
element.removeEventListener('touchcancel', Effect.hide);
}
element.removeEventListener('mouseup', Effect.hide);
element.removeEventListener('mouseleave', Effect.hide);
}
};
/**
* Collection of wrapper for HTML element that only have single tag
* like <input> and <img>
*/
var TagWrapper = {
// Wrap <input> tag so it can perform the effect
input: function(element) {
var parent = element.parentNode;
// If input already have parent just pass through
if (parent.tagName.toLowerCase() === 'span' && parent.classList.contains('waves-effect')) {
return;
}
// Put element class and style to the specified parent
var wrapper = document.createElement('span');
wrapper.className = 'waves-input-wrapper';
// element.className = 'waves-button-input';
// Put element as child
parent.replaceChild(wrapper, element);
wrapper.appendChild(element);
},
// Wrap <img> tag so it can perform the effect
img: function(element) {
var parent = element.parentNode;
// If input already have parent just pass through
if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) {
return;
}
// Put element as child
var wrapper = document.createElement('i');
parent.replaceChild(wrapper, element);
wrapper.appendChild(element);
}
};
/**
* Hide the effect and remove the ripple. Must be
* a separate function to pass the JSLint...
*/
function removeRipple(e, el, ripple) {
// Check if the ripple still exist
if (!ripple) {
return;
}
ripple.classList.remove('waves-rippling');
var relativeX = ripple.getAttribute('data-x');
var relativeY = ripple.getAttribute('data-y');
var scale = ripple.getAttribute('data-scale');
var translate = ripple.getAttribute('data-translate');
// Get delay beetween mousedown and mouse leave
var diff = Date.now() - Number(ripple.getAttribute('data-hold'));
var delay = 350 - diff;
if (delay < 0) {
delay = 0;
}
if (e.type === 'mousemove') {
delay = 150;
}
// Fade out ripple after delay
var duration = e.type === 'mousemove' ? 2500 : Effect.duration;
setTimeout(function() {
var style = {
top: relativeY + 'px',
left: relativeX + 'px',
opacity: '0',
// Duration
'-webkit-transition-duration': duration + 'ms',
'-moz-transition-duration': duration + 'ms',
'-o-transition-duration': duration + 'ms',
'transition-duration': duration + 'ms',
'-webkit-transform': scale + ' ' + translate,
'-moz-transform': scale + ' ' + translate,
'-ms-transform': scale + ' ' + translate,
'-o-transform': scale + ' ' + translate,
'transform': scale + ' ' + translate
};
ripple.setAttribute('style', convertStyle(style));
setTimeout(function() {
try {
el.removeChild(ripple);
} catch (e) {
return false;
}
}, duration);
}, delay);
}
/**
* Disable mousedown event for 500ms during and after touch
*/
var TouchHandler = {
/* uses an integer rather than bool so there's no issues with
* needing to clear timeouts if another touch event occurred
* within the 500ms. Cannot mouseup between touchstart and
* touchend, nor in the 500ms after touchend. */
touches: 0,
allowEvent: function(e) {
var allow = true;
if (/^(mousedown|mousemove)$/.test(e.type) && TouchHandler.touches) {
allow = false;
}
return allow;
},
registerEvent: function(e) {
var eType = e.type;
if (eType === 'touchstart') {
TouchHandler.touches += 1; // push
} else if (/^(touchend|touchcancel)$/.test(eType)) {
setTimeout(function() {
if (TouchHandler.touches) {
TouchHandler.touches -= 1; // pop after 500ms
}
}, 500);
}
}
};
/**
* Delegated click handler for .waves-effect element.
* returns null when .waves-effect element not in "click tree"
*/
function getWavesEffectElement(e) {
if (TouchHandler.allowEvent(e) === false) {
return null;
}
var element = null;
var target = e.target || e.srcElement;
while (target.parentElement) {
if ( (!(target instanceof SVGElement)) && target.classList.contains('waves-effect')) {
element = target;
break;
}
target = target.parentElement;
}
return element;
}
/**
* Bubble the click and show effect if .waves-effect elem was found
*/
function showEffect(e) {
// Disable effect if element has "disabled" property on it
// In some cases, the event is not triggered by the current element
// if (e.target.getAttribute('disabled') !== null) {
// return;
// }
var element = getWavesEffectElement(e);
if (element !== null) {
// Make it sure the element has either disabled property, disabled attribute or 'disabled' class
if (element.disabled || element.getAttribute('disabled') || element.classList.contains('disabled')) {
return;
}
TouchHandler.registerEvent(e);
if (e.type === 'touchstart' && Effect.delay) {
var hidden = false;
var timer = setTimeout(function () {
timer = null;
Effect.show(e, element);
}, Effect.delay);
var hideEffect = function(hideEvent) {
// if touch hasn't moved, and effect not yet started: start effect now
if (timer) {
clearTimeout(timer);
timer = null;
Effect.show(e, element);
}
if (!hidden) {
hidden = true;
Effect.hide(hideEvent, element);
}
removeListeners();
};
var touchMove = function(moveEvent) {
if (timer) {
clearTimeout(timer);
timer = null;
}
hideEffect(moveEvent);
removeListeners();
};
element.addEventListener('touchmove', touchMove, false);
element.addEventListener('touchend', hideEffect, false);
element.addEventListener('touchcancel', hideEffect, false);
var removeListeners = function() {
element.removeEventListener('touchmove', touchMove);
element.removeEventListener('touchend', hideEffect);
element.removeEventListener('touchcancel', hideEffect);
};
} else {
Effect.show(e, element);
if (isTouchAvailable) {
element.addEventListener('touchend', Effect.hide, false);
element.addEventListener('touchcancel', Effect.hide, false);
}
element.addEventListener('mouseup', Effect.hide, false);
element.addEventListener('mouseleave', Effect.hide, false);
}
}
}
Waves.init = function(options) {
var body = document.body;
options = options || {};
if ('duration' in options) {
Effect.duration = options.duration;
}
if ('delay' in options) {
Effect.delay = options.delay;
}
if (isTouchAvailable) {
body.addEventListener('touchstart', showEffect, false);
body.addEventListener('touchcancel', TouchHandler.registerEvent, false);
body.addEventListener('touchend', TouchHandler.registerEvent, false);
}
body.addEventListener('mousedown', showEffect, false);
};
/**
* Attach Waves to dynamically loaded inputs, or add .waves-effect and other
* waves classes to a set of elements. Set drag to true if the ripple mouseover
* or skimming effect should be applied to the elements.
*/
Waves.attach = function(elements, classes) {
elements = getWavesElements(elements);
if (toString.call(classes) === '[object Array]') {
classes = classes.join(' ');
}
classes = classes ? ' ' + classes : '';
var element, tagName;
for (var i = 0, len = elements.length; i < len; i++) {
element = elements[i];
tagName = element.tagName.toLowerCase();
if (['input', 'img'].indexOf(tagName) !== -1) {
TagWrapper[tagName](element);
element = element.parentElement;
}
if (element.className.indexOf('waves-effect') === -1) {
element.className += ' waves-effect' + classes;
}
}
};
/**
* Cause a ripple to appear in an element via code.
*/
Waves.ripple = function(elements, options) {
elements = getWavesElements(elements);
var elementsLen = elements.length;
options = options || {};
options.wait = options.wait || 0;
options.position = options.position || null; // default = centre of element
if (elementsLen) {
var element, pos, off, centre = {}, i = 0;
var mousedown = {
type: 'mousedown',
button: 1
};
var hideRipple = function(mouseup, element) {
return function() {
Effect.hide(mouseup, element);
};
};
for (; i < elementsLen; i++) {
element = elements[i];
pos = options.position || {
x: element.clientWidth / 2,
y: element.clientHeight / 2
};
off = offset(element);
centre.x = off.left + pos.x;
centre.y = off.top + pos.y;
mousedown.pageX = centre.x;
mousedown.pageY = centre.y;
Effect.show(mousedown, element);
if (options.wait >= 0 && options.wait !== null) {
var mouseup = {
type: 'mouseup',
button: 1
};
setTimeout(hideRipple(mouseup, element), options.wait);
}
}
}
};
/**
* Remove all ripples from an element.
*/
Waves.calm = function(elements) {
elements = getWavesElements(elements);
var mouseup = {
type: 'mouseup',
button: 1
};
for (var i = 0, len = elements.length; i < len; i++) {
Effect.hide(mouseup, elements[i]);
}
};
/**
* Deprecated API fallback
*/
Waves.displayEffect = function(options) {
console.error('Waves.displayEffect() has been deprecated and will be removed in future version. Please use Waves.init() to initialize Waves effect');
Waves.init(options);
};
return Waves;
});
//Initialization
Waves.attach('.btn:not(.btn-flat), .btn-floating', ['waves-light']);
Waves.attach('.btn-flat', ['waves-effect']);
Waves.attach('.chip', ['waves-effect']);
Waves.attach('.view a .mask', ['waves-light']);
Waves.attach('.waves-light', ['waves-light']);
Waves.attach('.navbar-nav a:not(.navbar-brand), .nav-icons li a, .nav-tabs .nav-item:not(.dropdown)', ['waves-light']);
Waves.attach('.pager li a', ['waves-light']);
Waves.attach('.pagination .page-item .page-link', ['waves-effect']);
Waves.init();

180
js/modules/wow.js Executable file
View File

@@ -0,0 +1,180 @@
'use strict';
var WOW;
(function($) {
WOW = function WOW() {
return {
init: function init() {
var animationName = [];
var once = 1;
function mdbWow() {
var windowHeight = window.innerHeight;
var scroll = window.scrollY;
$('.wow').each(function() {
if ($(this).css('visibility') == 'visible') {
return;
}
if (windowHeight + scroll - 100 > getOffset(this) && scroll < getOffset(this) || windowHeight + scroll - 100 > getOffset(this) + $(this).height() && scroll < getOffset(this) + $(this).height() || windowHeight + scroll == $(document).height() && getOffset(this) + 100 > $(document).height()) {
var index = $(this).index('.wow');
var delay = $(this).attr('data-wow-delay');
if (delay) {
delay = $(this).attr('data-wow-delay').slice(0, -1
);
var self = this;
var timeout = parseFloat(delay) * 1000;
$(self).addClass('animated');
$(self).css({ 'visibility': 'visible' });
$(self).css({ 'animation-delay': delay });
$(self).css({ 'animation-name': animationName[index] });
var removeTime = $(this).css('animation-duration').slice(0, -1) * 1000;
if ($(this).attr('data-wow-delay')) {
removeTime += $(this).attr('data-wow-delay').slice(0, -1) * 1000;
}
var self = this;
setTimeout(function() {
$(self).removeClass('animated');
}, removeTime);
} else {
$(this).addClass('animated');
$(this).css({ 'visibility': 'visible' });
$(this).css({ 'animation-name': animationName[index] });
var removeTime = $(this).css('animation-duration').slice(0, -1) * 1000;
var self = this;
setTimeout(function() {
$(self).removeClass('animated');
}, removeTime);
}
}
});
}
function appear() {
$('.wow').each(function() {
var index = $(this).index('.wow');
var delay = $(this).attr('data-wow-delay');
if (delay) {
delay = $(this).attr('data-wow-delay').slice(0, -1);
var timeout = parseFloat(delay) * 1000;
$(this).addClass('animated');
$(this).css({ 'visibility': 'visible' });
$(this).css({ 'animation-delay': delay + 's' });
$(this).css({ 'animation-name': animationName[index] });
} else {
$(this).addClass('animated');
$(this).css({ 'visibility': 'visible' });
$(this).css({ 'animation-name': animationName[index] });
}
});
}
function hide() {
var windowHeight = window.innerHeight;
var scroll = window.scrollY;
$('.wow.animated').each(function() {
if (windowHeight + scroll - 100 > getOffset(this) && scroll > getOffset(this) + 100 || windowHeight + scroll - 100 < getOffset(this) && scroll < getOffset(this) + 100 || getOffset(this) + $(this).height > $(document).height() - 100) {
$(this).removeClass('animated');
$(this).css({ 'animation-name': 'none' });
$(this).css({ 'visibility': 'hidden' });
} else {
var removeTime = $(this).css('animation-duration').slice(0, -1) * 1000;
if ($(this).attr('data-wow-delay')) {
removeTime += $(this).attr('data-wow-delay').slice(0, -1) * 1000;
}
var self = this;
setTimeout(function() {
$(self).removeClass('animated');
}, removeTime);
}
});
mdbWow();
once--;
}
function getOffset(elem) {
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var clientTop = docEl.clientTop || body.clientTop || 0;
var top = box.top + scrollTop - clientTop;
return Math.round(top);
}
$('.wow').each(function() {
$(this).css({ 'visibility': 'hidden' });
animationName[$(this).index('.wow')] = $(this).css('animation-name');
$(this).css({ 'animation-name': 'none' });
});
$(window).scroll(function() {
if (once) {
hide();
} else {
mdbWow();
}
});
appear();
}
};
};
})(jQuery);

5
js/popper.min.js vendored Executable file

File diff suppressed because one or more lines are too long

5
js/require.js Normal file

File diff suppressed because one or more lines are too long