Browse Source

up

dev v1.0
Samuel VERMEULEN 2 years ago
commit
f141a7eeb8
  1. 21
      LICENSE
  2. 684
      css/svnet.css
  3. 137
      gulpfile.js
  4. BIN
      img/logo.png
  5. BIN
      img/logo_chatons_v2.png
  6. BIN
      img/masto.png
  7. BIN
      img/nuage.png
  8. BIN
      img/portfolio/01-full.jpg
  9. BIN
      img/portfolio/01-thumbnail.jpg
  10. BIN
      img/portfolio/02-full.jpg
  11. BIN
      img/portfolio/02-thumbnail.jpg
  12. BIN
      img/portfolio/03-full.jpg
  13. BIN
      img/portfolio/03-thumbnail.jpg
  14. BIN
      img/portfolio/04-full.jpg
  15. BIN
      img/portfolio/04-thumbnail.jpg
  16. BIN
      img/portfolio/05-full.jpg
  17. BIN
      img/portfolio/05-thumbnail.jpg
  18. BIN
      img/portfolio/06-full.jpg
  19. BIN
      img/portfolio/06-thumbnail.jpg
  20. BIN
      img/svnet.png
  21. BIN
      img/tube-icon.png
  22. BIN
      img/tube.png
  23. BIN
      img/weblibre.png
  24. 227
      index.html
  25. 42
      js/agency.js
  26. 7
      js/agency.min.js
  27. 75
      js/contact_me.js
  28. 937
      js/jqBootstrapValidation.js
  29. 26
      mail/contact_me.php
  30. 6378
      package-lock.json
  31. 50
      package.json
  32. 19
      scss/agency.scss
  33. 13
      scss/base/_mixins.scss
  34. 71
      scss/base/_page.scss
  35. 17
      scss/base/_variables.scss
  36. 26
      scss/components/_buttons.scss
  37. 73
      scss/components/_navbar.scss
  38. 47
      scss/layout/_contact.scss
  39. 43
      scss/layout/_footer.scss
  40. 50
      scss/layout/_masthead.scss
  41. 140
      scss/layout/_portfolio.scss
  42. 5
      scss/layout/_services.scss
  43. 18
      scss/layout/_team.scss
  44. 178
      scss/layout/_timeline.scss
  45. 3719
      vendor/bootstrap/css/bootstrap-grid.css
  46. 1
      vendor/bootstrap/css/bootstrap-grid.css.map
  47. 7
      vendor/bootstrap/css/bootstrap-grid.min.css
  48. 1
      vendor/bootstrap/css/bootstrap-grid.min.css.map
  49. 331
      vendor/bootstrap/css/bootstrap-reboot.css
  50. 1
      vendor/bootstrap/css/bootstrap-reboot.css.map
  51. 8
      vendor/bootstrap/css/bootstrap-reboot.min.css
  52. 1
      vendor/bootstrap/css/bootstrap-reboot.min.css.map
  53. 10038
      vendor/bootstrap/css/bootstrap.css
  54. 1
      vendor/bootstrap/css/bootstrap.css.map
  55. 7
      vendor/bootstrap/css/bootstrap.min.css
  56. 1
      vendor/bootstrap/css/bootstrap.min.css.map
  57. 7013
      vendor/bootstrap/js/bootstrap.bundle.js
  58. 1
      vendor/bootstrap/js/bootstrap.bundle.js.map
  59. 7
      vendor/bootstrap/js/bootstrap.bundle.min.js
  60. 1
      vendor/bootstrap/js/bootstrap.bundle.min.js.map
  61. 4435
      vendor/bootstrap/js/bootstrap.js
  62. 1
      vendor/bootstrap/js/bootstrap.js.map
  63. 7
      vendor/bootstrap/js/bootstrap.min.js
  64. 1
      vendor/bootstrap/js/bootstrap.min.js.map
  65. 4396
      vendor/fontawesome-free/css/all.css
  66. 5
      vendor/fontawesome-free/css/all.min.css
  67. 14
      vendor/fontawesome-free/css/brands.css
  68. 5
      vendor/fontawesome-free/css/brands.min.css
  69. 4363
      vendor/fontawesome-free/css/fontawesome.css
  70. 5
      vendor/fontawesome-free/css/fontawesome.min.css
  71. 15
      vendor/fontawesome-free/css/regular.css
  72. 5
      vendor/fontawesome-free/css/regular.min.css
  73. 16
      vendor/fontawesome-free/css/solid.css
  74. 5
      vendor/fontawesome-free/css/solid.min.css
  75. 371
      vendor/fontawesome-free/css/svg-with-js.css
  76. 5
      vendor/fontawesome-free/css/svg-with-js.min.css
  77. 2166
      vendor/fontawesome-free/css/v4-shims.css
  78. 5
      vendor/fontawesome-free/css/v4-shims.min.css
  79. BIN
      vendor/fontawesome-free/webfonts/fa-brands-400.eot
  80. 3449
      vendor/fontawesome-free/webfonts/fa-brands-400.svg
  81. BIN
      vendor/fontawesome-free/webfonts/fa-brands-400.ttf
  82. BIN
      vendor/fontawesome-free/webfonts/fa-brands-400.woff
  83. BIN
      vendor/fontawesome-free/webfonts/fa-brands-400.woff2
  84. BIN
      vendor/fontawesome-free/webfonts/fa-regular-400.eot
  85. 803
      vendor/fontawesome-free/webfonts/fa-regular-400.svg
  86. BIN
      vendor/fontawesome-free/webfonts/fa-regular-400.ttf
  87. BIN
      vendor/fontawesome-free/webfonts/fa-regular-400.woff
  88. BIN
      vendor/fontawesome-free/webfonts/fa-regular-400.woff2
  89. BIN
      vendor/fontawesome-free/webfonts/fa-solid-900.eot
  90. 4649
      vendor/fontawesome-free/webfonts/fa-solid-900.svg
  91. BIN
      vendor/fontawesome-free/webfonts/fa-solid-900.ttf
  92. BIN
      vendor/fontawesome-free/webfonts/fa-solid-900.woff
  93. BIN
      vendor/fontawesome-free/webfonts/fa-solid-900.woff2
  94. 59
      vendor/jquery-easing/jquery.easing.compatibility.js
  95. 166
      vendor/jquery-easing/jquery.easing.js
  96. 1
      vendor/jquery-easing/jquery.easing.min.js
  97. 10598
      vendor/jquery/jquery.js
  98. 2
      vendor/jquery/jquery.min.js
  99. 1
      vendor/jquery/jquery.min.map
  100. 8495
      vendor/jquery/jquery.slim.js

21
LICENSE

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2013-2019 Blackrock Digital LLC
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

684
css/svnet.css

@ -0,0 +1,684 @@
/*!
* Start Bootstrap - Agency v5.2.2 (https://startbootstrap.com/template-overviews/agency)
* Copyright 2013-2019 Start Bootstrap
* Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-agency/blob/master/LICENSE)
*/
body {
overflow-x: hidden;
font-family: 'Roboto Slab', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
p {
line-height: 1.75;
}
a {
color: #fed136;
}
a:hover {
color: #fec503;
}
.text-primary {
color: #fed136 !important;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: 700;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
.page-section {
padding: 100px 0;
}
.page-section h2.section-heading {
font-size: 40px;
margin-top: 0;
margin-bottom: 15px;
}
.page-section h3.section-subheading {
font-size: 16px;
font-weight: 400;
font-style: italic;
margin-bottom: 75px;
text-transform: none;
font-family: 'Droid Serif', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
@media (min-width: 768px) {
section {
padding: 150px 0;
}
}
::-moz-selection {
background: #fed136;
text-shadow: none;
}
::selection {
background: #fed136;
text-shadow: none;
}
img::-moz-selection {
background: transparent;
}
img::selection {
background: transparent;
}
img::-moz-selection {
background: transparent;
}
.btn {
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
font-weight: 700;
}
.btn-xl {
font-size: 18px;
padding: 20px 40px;
}
.btn-primary {
background-color: #fed136;
border-color: #fed136;
}
.btn-primary:active, .btn-primary:focus, .btn-primary:hover {
background-color: #fec810 !important;
border-color: #fec810 !important;
color: white;
}
.btn-primary:active, .btn-primary:focus {
box-shadow: 0 0 0 0.2rem rgba(254, 209, 55, 0.5) !important;
}
#mainNav {
background-color: #212529;
}
#mainNav .navbar-toggler {
font-size: 12px;
right: 0;
padding: 13px;
text-transform: uppercase;
color: white;
border: 0;
background-color: #fed136;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
#mainNav .navbar-brand {
color: #fed136;
font-family: 'Kaushan Script', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
#mainNav .navbar-brand.active, #mainNav .navbar-brand:active, #mainNav .navbar-brand:focus, #mainNav .navbar-brand:hover {
color: #fec503;
}
#mainNav .navbar-nav .nav-item .nav-link {
font-size: 90%;
font-weight: 400;
padding: 0.75em 0;
letter-spacing: 1px;
color: white;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
#mainNav .navbar-nav .nav-item .nav-link.active, #mainNav .navbar-nav .nav-item .nav-link:hover {
color: #fed136;
}
@media (min-width: 992px) {
#mainNav {
padding-top: 25px;
padding-bottom: 25px;
transition: padding-top 0.3s, padding-bottom 0.3s;
border: none;
background-color: transparent;
}
#mainNav .navbar-brand {
font-size: 1.75em;
transition: all 0.3s;
}
#mainNav .navbar-nav .nav-item .nav-link {
padding: 1.1em 1em !important;
}
#mainNav.navbar-shrink {
padding-top: 0;
padding-bottom: 0;
background-color: #212529;
}
#mainNav.navbar-shrink .navbar-brand {
font-size: 1.25em;
padding: 12px 0;
}
}
header.masthead {
text-align: center;
color: #000000;
background-color: #A4A4A4;
background-image: url("../img/logo.png");
background-repeat: no-repeat;
background-attachment: scroll;
background-position: center 50px;
background-size: 500px;
}
header.masthead .intro-text {
padding-top: 150px;
padding-bottom: 100px;
}
header.masthead .intro-text .intro-lead-in {
font-size: 22px;
font-style: italic;
line-height: 22px;
margin-bottom: 25px;
font-family: 'Droid Serif', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
header.masthead .intro-text .intro-heading {
font-size: 50px;
font-weight: 700;
line-height: 50px;
margin-bottom: 25px;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
@media (min-width: 768px) {
header.masthead .intro-text {
padding-top: 300px;
padding-bottom: 200px;
}
header.masthead .intro-text .intro-lead-in {
font-size: 40px;
font-style: italic;
line-height: 40px;
margin-bottom: 25px;
font-family: 'Droid Serif', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
header.masthead .intro-text .intro-heading {
font-size: 75px;
font-weight: 700;
line-height: 75px;
margin-bottom: 50px;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
}
.service-heading {
margin: 15px 0;
text-transform: none;
}
#portfolio .portfolio-item {
right: 0;
margin: 0 0 15px;
}
#portfolio .portfolio-item .portfolio-link {
position: relative;
display: block;
max-width: 400px;
margin: 0 auto;
cursor: pointer;
}
#portfolio .portfolio-item .portfolio-link .portfolio-hover {
position: absolute;
width: 100%;
height: 100%;
transition: all ease 0.5s;
opacity: 0;
background: rgba(254, 209, 54, 0.9);
}
#portfolio .portfolio-item .portfolio-link .portfolio-hover:hover {
opacity: 1;
}
#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content {
font-size: 20px;
position: absolute;
top: 50%;
width: 100%;
height: 20px;
margin-top: -12px;
text-align: center;
color: white;
}
#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content i {
margin-top: -12px;
}
#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content h3,
#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content h4 {
margin: 0;
}
#portfolio .portfolio-item .portfolio-caption {
max-width: 400px;
margin: 0 auto;
padding: 25px;
text-align: center;
background-color: #fff;
}
#portfolio .portfolio-item .portfolio-caption h4 {
margin: 0;
text-transform: none;
}
#portfolio .portfolio-item .portfolio-caption p {
font-size: 16px;
font-style: italic;
margin: 0;
font-family: 'Droid Serif', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
#portfolio * {
z-index: 2;
}
@media (min-width: 767px) {
#portfolio .portfolio-item {
margin: 0 0 30px;
}
}
.portfolio-modal .modal-dialog {
margin: 1rem;
max-width: 100vw;
}
.portfolio-modal .modal-content {
padding: 100px 0;
text-align: center;
}
.portfolio-modal .modal-content h2 {
font-size: 3em;
margin-bottom: 15px;
}
.portfolio-modal .modal-content p {
margin-bottom: 30px;
}
.portfolio-modal .modal-content p.item-intro {
font-size: 16px;
font-style: italic;
margin: 20px 0 30px;
font-family: 'Droid Serif', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
.portfolio-modal .modal-content ul.list-inline {
margin-top: 0;
margin-bottom: 30px;
}
.portfolio-modal .modal-content img {
margin-bottom: 30px;
}
.portfolio-modal .modal-content button {
cursor: pointer;
}
.portfolio-modal .close-modal {
position: absolute;
top: 25px;
right: 25px;
width: 75px;
height: 75px;
cursor: pointer;
background-color: transparent;
}
.portfolio-modal .close-modal:hover {
opacity: 0.3;
}
.portfolio-modal .close-modal .lr {
/* Safari and Chrome */
z-index: 1051;
width: 1px;
height: 75px;
margin-left: 35px;
/* IE 9 */
transform: rotate(45deg);
background-color: #212529;
}
.portfolio-modal .close-modal .lr .rl {
/* Safari and Chrome */
z-index: 1052;
width: 1px;
height: 75px;
/* IE 9 */
transform: rotate(90deg);
background-color: #212529;
}
.timeline {
position: relative;
padding: 0;
list-style: none;
}
.timeline:before {
position: absolute;
top: 0;
bottom: 0;
left: 40px;
width: 2px;
margin-left: -1.5px;
content: '';
background-color: #e9ecef;
}
.timeline > li {
position: relative;
min-height: 50px;
margin-bottom: 50px;
}
.timeline > li:after, .timeline > li:before {
display: table;
content: ' ';
}
.timeline > li:after {
clear: both;
}
.timeline > li .timeline-panel {
position: relative;
float: right;
width: 100%;
padding: 0 20px 0 100px;
text-align: left;
}
.timeline > li .timeline-panel:before {
right: auto;
left: -15px;
border-right-width: 15px;
border-left-width: 0;
}
.timeline > li .timeline-panel:after {
right: auto;
left: -14px;
border-right-width: 14px;
border-left-width: 0;
}
.timeline > li .timeline-image {
position: absolute;
z-index: 100;
left: 0;
width: 80px;
height: 80px;
margin-left: 0;
text-align: center;
color: white;
border: 7px solid #e9ecef;
border-radius: 100%;
background-color: #fed136;
}
.timeline > li .timeline-image h4 {
font-size: 10px;
line-height: 14px;
margin-top: 12px;
}
.timeline > li.timeline-inverted > .timeline-panel {
float: right;
padding: 0 20px 0 100px;
text-align: left;
}
.timeline > li.timeline-inverted > .timeline-panel:before {
right: auto;
left: -15px;
border-right-width: 15px;
border-left-width: 0;
}
.timeline > li.timeline-inverted > .timeline-panel:after {
right: auto;
left: -14px;
border-right-width: 14px;
border-left-width: 0;
}
.timeline > li:last-child {
margin-bottom: 0;
}
.timeline .timeline-heading h4 {
margin-top: 0;
color: inherit;
}
.timeline .timeline-heading h4.subheading {
text-transform: none;
}
.timeline .timeline-body > ul,
.timeline .timeline-body > p {
margin-bottom: 0;
}
@media (min-width: 768px) {
.timeline:before {
left: 50%;
}
.timeline > li {
min-height: 100px;
margin-bottom: 100px;
}
.timeline > li .timeline-panel {
float: left;
width: 41%;
padding: 0 20px 20px 30px;
text-align: right;
}
.timeline > li .timeline-image {
left: 50%;
width: 100px;
height: 100px;
margin-left: -50px;
}
.timeline > li .timeline-image h4 {
font-size: 13px;
line-height: 18px;
margin-top: 16px;
}
.timeline > li.timeline-inverted > .timeline-panel {
float: right;
padding: 0 30px 20px 20px;
text-align: left;
}
}
@media (min-width: 992px) {
.timeline > li {
min-height: 150px;
}
.timeline > li .timeline-panel {
padding: 0 20px 20px;
}
.timeline > li .timeline-image {
width: 150px;
height: 150px;
margin-left: -75px;
}
.timeline > li .timeline-image h4 {
font-size: 18px;
line-height: 26px;
margin-top: 30px;
}
.timeline > li.timeline-inverted > .timeline-panel {
padding: 0 20px 20px;
}
}
@media (min-width: 1200px) {
.timeline > li {
min-height: 170px;
}
.timeline > li .timeline-panel {
padding: 0 20px 20px 100px;
}
.timeline > li .timeline-image {
width: 170px;
height: 170px;
margin-left: -85px;
}
.timeline > li .timeline-image h4 {
margin-top: 40px;
}
.timeline > li.timeline-inverted > .timeline-panel {
padding: 0 100px 20px 20px;
}
}
.team-member {
margin-bottom: 50px;
text-align: center;
}
.team-member img {
width: 225px;
height: 225px;
border: 7px solid rgba(0, 0, 0, 0.1);
}
.team-member h4 {
margin-top: 25px;
margin-bottom: 0;
text-transform: none;
}
.team-member p {
margin-top: 0;
}
section#contact {
background-color: #212529;
background-image: url("../img/map-image.png");
background-repeat: no-repeat;
background-position: center;
}
section#contact .section-heading {
color: #fff;
}
section#contact .form-group {
margin-bottom: 25px;
}
section#contact .form-group input,
section#contact .form-group textarea {
padding: 20px;
}
section#contact .form-group input.form-control {
height: auto;
}
section#contact .form-group textarea.form-control {
height: 248px;
}
section#contact .form-control:focus {
border-color: #fed136;
box-shadow: none;
}
section#contact ::-webkit-input-placeholder {
font-weight: 700;
color: #ced4da;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
section#contact :-moz-placeholder {
font-weight: 700;
color: #ced4da;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
section#contact ::-moz-placeholder {
font-weight: 700;
color: #ced4da;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
section#contact :-ms-input-placeholder {
font-weight: 700;
color: #ced4da;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
.footer {
padding: 25px 0;
text-align: center;
}
.footer span.copyright {
font-size: 90%;
line-height: 40px;
text-transform: none;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
.footer ul.quicklinks {
font-size: 90%;
line-height: 40px;
margin-bottom: 0;
text-transform: none;
font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
ul.social-buttons {
margin-bottom: 0;
}
ul.social-buttons li a {
font-size: 20px;
line-height: 50px;
display: block;
width: 50px;
height: 50px;
transition: all 0.3s;
color: white;
border-radius: 100%;
outline: none;
background-color: #212529;
}
ul.social-buttons li a:active, ul.social-buttons li a:focus, ul.social-buttons li a:hover {
background-color: #fed136;
}

137
gulpfile.js

@ -0,0 +1,137 @@
"use strict";
// Load plugins
const autoprefixer = require("gulp-autoprefixer");
const browsersync = require("browser-sync").create();
const cleanCSS = require("gulp-clean-css");
const del = require("del");
const gulp = require("gulp");
const header = require("gulp-header");
const merge = require("merge-stream");
const plumber = require("gulp-plumber");
const rename = require("gulp-rename");
const sass = require("gulp-sass");
const uglify = require("gulp-uglify");
// Load package.json for banner
const pkg = require('./package.json');
// Set the banner content
const banner = ['/*!\n',
' * Start Bootstrap - <%= pkg.title %> v<%= pkg.version %> (<%= pkg.homepage %>)\n',
' * Copyright 2013-' + (new Date()).getFullYear(), ' <%= pkg.author %>\n',
' * Licensed under <%= pkg.license %> (https://github.com/BlackrockDigital/<%= pkg.name %>/blob/master/LICENSE)\n',
' */\n',
'\n'
].join('');
// BrowserSync
function browserSync(done) {
browsersync.init({
server: {
baseDir: "./"
},
port: 3000
});
done();
}
// BrowserSync reload
function browserSyncReload(done) {
browsersync.reload();
done();
}
// Clean vendor
function clean() {
return del(["./vendor/"]);
}
// Bring third party dependencies from node_modules into vendor directory
function modules() {
// Bootstrap
var bootstrap = gulp.src('./node_modules/bootstrap/dist/**/*')
.pipe(gulp.dest('./vendor/bootstrap'));
// Font Awesome CSS
var fontAwesomeCSS = gulp.src('./node_modules/@fortawesome/fontawesome-free/css/**/*')
.pipe(gulp.dest('./vendor/fontawesome-free/css'));
// Font Awesome Webfonts
var fontAwesomeWebfonts = gulp.src('./node_modules/@fortawesome/fontawesome-free/webfonts/**/*')
.pipe(gulp.dest('./vendor/fontawesome-free/webfonts'));
// jQuery Easing
var jqueryEasing = gulp.src('./node_modules/jquery.easing/*.js')
.pipe(gulp.dest('./vendor/jquery-easing'));
// jQuery
var jquery = gulp.src([
'./node_modules/jquery/dist/*',
'!./node_modules/jquery/dist/core.js'
])
.pipe(gulp.dest('./vendor/jquery'));
return merge(bootstrap, fontAwesomeCSS, fontAwesomeWebfonts, jquery, jqueryEasing);
}
// CSS task
function css() {
return gulp
.src("./scss/**/*.scss")
.pipe(plumber())
.pipe(sass({
outputStyle: "expanded",
includePaths: "./node_modules",
}))
.on("error", sass.logError)
.pipe(autoprefixer({
cascade: false
}))
.pipe(header(banner, {
pkg: pkg
}))
.pipe(gulp.dest("./css"))
.pipe(rename({
suffix: ".min"
}))
.pipe(cleanCSS())
.pipe(gulp.dest("./css"))
.pipe(browsersync.stream());
}
// JS task
function js() {
return gulp
.src([
'./js/*.js',
'!./js/*.min.js',
'!./js/contact_me.js',
'!./js/jqBootstrapValidation.js'
])
.pipe(uglify())
.pipe(header(banner, {
pkg: pkg
}))
.pipe(rename({
suffix: '.min'
}))
.pipe(gulp.dest('./js'))
.pipe(browsersync.stream());
}
// Watch files
function watchFiles() {
gulp.watch("./scss/**/*", css);
gulp.watch(["./js/**/*", "!./js/**/*.min.js"], js);
gulp.watch("./**/*.html", browserSyncReload);
}
// Define complex tasks
const vendor = gulp.series(clean, modules);
const build = gulp.series(vendor, gulp.parallel(css, js));
const watch = gulp.series(build, gulp.parallel(watchFiles, browserSync));
// Export tasks
exports.css = css;
exports.js = js;
exports.clean = clean;
exports.vendor = vendor;
exports.build = build;
exports.watch = watch;
exports.default = build;

BIN
img/logo.png

After

Width: 1459  |  Height: 545  |  Size: 153 KiB

BIN
img/logo_chatons_v2.png

After

Width: 993  |  Height: 706  |  Size: 50 KiB

BIN
img/masto.png

After

Width: 1200  |  Height: 630  |  Size: 58 KiB

BIN
img/nuage.png

After

Width: 214  |  Height: 210  |  Size: 16 KiB

BIN
img/portfolio/01-full.jpg

After

Width: 700  |  Height: 933  |  Size: 52 KiB

BIN
img/portfolio/01-thumbnail.jpg

After

Width: 400  |  Height: 300  |  Size: 16 KiB

BIN
img/portfolio/02-full.jpg

After

Width: 700  |  Height: 467  |  Size: 31 KiB

BIN
img/portfolio/02-thumbnail.jpg

After

Width: 400  |  Height: 300  |  Size: 16 KiB

BIN
img/portfolio/03-full.jpg

After

Width: 700  |  Height: 933  |  Size: 52 KiB

BIN
img/portfolio/03-thumbnail.jpg

After

Width: 400  |  Height: 300  |  Size: 16 KiB

BIN
img/portfolio/04-full.jpg

After

Width: 700  |  Height: 563  |  Size: 40 KiB

BIN
img/portfolio/04-thumbnail.jpg

After

Width: 400  |  Height: 300  |  Size: 16 KiB

BIN
img/portfolio/05-full.jpg

After

Width: 700  |  Height: 875  |  Size: 102 KiB

BIN
img/portfolio/05-thumbnail.jpg

After

Width: 400  |  Height: 300  |  Size: 24 KiB

BIN
img/portfolio/06-full.jpg

After

Width: 700  |  Height: 904  |  Size: 36 KiB

BIN
img/portfolio/06-thumbnail.jpg

After

Width: 400  |  Height: 300  |  Size: 13 KiB

BIN
img/svnet.png

After

Width: 991  |  Height: 447  |  Size: 87 KiB

BIN
img/tube-icon.png

After

Width: 50  |  Height: 24  |  Size: 1.1 KiB

BIN
img/tube.png

After

Width: 507  |  Height: 447  |  Size: 34 KiB

BIN
img/weblibre.png

After

Width: 763  |  Height: 392  |  Size: 123 KiB

227
index.html

@ -0,0 +1,227 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>SVNET Libre</title>
<!-- Bootstrap core CSS -->
<link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom fonts for this template -->
<link href="vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<!-- <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700" rel="stylesheet" type="text/css">
<link href='https://fonts.googleapis.com/css?family=Kaushan+Script' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700' rel='stylesheet' type='text/css'>
-->
<!-- Custom styles for this template -->
<link href="css/svnet.css" rel="stylesheet">
</head>
<body id="page-top">
<!-- Navigation -->
<nav class="navbar navbar-expand-lg navbar-dark fixed-top" id="mainNav">
<div class="container">
<a class="navbar-brand js-scroll-trigger" href="#page-top">SVNET Libre</a>
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
Menu
<i class="fas fa-bars"></i>
</button>
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav text-uppercase ml-auto">
<li class="nav-item">
<a class="nav-link js-scroll-trigger" href="#services">Services</a>
</li>
<li class="nav-item">
<a class="nav-link js-scroll-trigger" href="#about">A propos</a>
</li>
<li class="nav-item">
<a class="nav-link js-scroll-trigger" href="#contact">Contact</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- Header -->
<header class="masthead">
<div class="container">
<div class="intro-text">
<div class="intro-lead-in">Membre du<br /><a href="https://www.chatons.org" target="_blank">Collectif des Hébergeurs Alternatifs,Transparents, Ouverts, Neutres et Solidaires</a></div>
<!-- <div class="intro-heading text-uppercase">La Liberté<br />la Neutralité du Web</div> -->
<a class="btn btn-primary btn-xl text-uppercase js-scroll-trigger" href="#services">Découvrir</a>
</div>
</div>
</header>
<!-- Services -->
<section class="page-section" id="services">
<div class="container">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading text-uppercase">Services</h2>
<h3 class="section-subheading text-muted"></h3>
</div>
</div>
<div class="row text-center">
<div class="col-md-4">
<img src="img/tube.png" height="150" />
<h4 class="service-heading">TUBE</h4>
<p class="text-muted">Alternative à Youtube ou Dailymotion, TUBE est basé sur PeerTube qui est une plateforme de streaming vidéo fédérée (ActivityPub) qui utilise P2P (WebTorrent) directement depuis le navigateur web.</p>
</div>
<div class="col-md-4">
<img src="img/masto.png" height="150" />
<h4 class="service-heading">MASTO</h4>
<p class="text-muted">Alternative à Twitter, basé sur Mastodon, le réseau social fédéré qui vous redonne le contrôle jusqu'à 500 caractères.</p>
</div>
<div class="col-md-4">
<img src="img/nuage.png" height="150" />
<h4 class="service-heading">NUAGE</h4>
<p class="text-muted">Une Alternative Libre à Dropbox ou Google Drive, NUAGE est basé sur Seafile, un service de stockage à partir duquel les données peuvent être synchronisés sur un ordinateur ou sur un smartphone par le biais d'une application.</p>
</div>
</div>
<div class="row text-center">
<div class="col-md-4">
<a class="btn btn-primary btn-xl text-uppercase js-scroll-trigger" href="https://tube.svnet.fr" target="_blank">Accéder</a>
</div>
<div class="col-md-4">
<a class="btn btn-primary btn-xl text-uppercase js-scroll-trigger" href="https://masto.svnet.fr" target="_blank">Accéder</a>
</div>
<div class="col-md-4">
<a class="btn btn-primary btn-xl text-uppercase js-scroll-trigger" href="https://nuage.svnet.fr" target="_blank">Accéder</a>
</div>
</div>
</div>
</section>
<!-- About -->
<section class="bg-light page-section" id="about">
<div class="container">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading text-uppercase">A Propos</h2>
<h3 class="section-subheading text-muted">SVNET Libre Membre du <a href="https://www.chatons.org" target="_blank">Collectif des Hébergeurs Alternatifs,Transparents, Ouverts, Neutres et Solidaires</a></h3>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="timeline-body">
<p align="center" class="text-muted">Samuel Vermeulen interNET Libre est un ensemble de Solutions en ligne Libres <b>auto-hébergées</b> émanent de ma micro-entreprise SAMUEL.VERMEULEN.PRO Informatique située dans les Vosges dont l’activité est principalement le dépannage informatique à domicile et proposant diverses Solutions Internet. Les outils, OS… que j'utilise pour mon activité sont donc aussi basés sur des Logiciels Libres. <br /><br />Par avance Merci pour vos dons de gratitude afin de pouvoir m’aider à garantir la pérennité de cette liberté du Web.<p>
<div align="center"><script src="https://liberapay.com/svnet/widgets/button.js"></script>
<noscript><a href="https://liberapay.com/svnet/donate"><img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg"></a></noscript></div>
</div>
</div>
</div>
</div>
</section>
<!-- Contact
<section class="page-section" id="contact">
<div class="container">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading text-uppercase">Contact</h2>
<h3 class="section-subheading text-muted">Demande d'infos ?</h3>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<form id="contactForm" name="sentMessage" novalidate="novalidate">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<input class="form-control" id="name" type="text" placeholder="Your Name *" required="required" data-validation-required-message="Please enter your name.">
<p class="help-block text-danger"></p>
</div>
<div class="form-group">
<input class="form-control" id="email" type="email" placeholder="Your Email *" required="required" data-validation-required-message="Please enter your email address.">
<p class="help-block text-danger"></p>
</div>
<div class="form-group">
<input class="form-control" id="phone" type="tel" placeholder="Your Phone *" required="required" data-validation-required-message="Please enter your phone number.">
<p class="help-block text-danger"></p>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<textarea class="form-control" id="message" placeholder="Your Message *" required="required" data-validation-required-message="Please enter a message."></textarea>
<p class="help-block text-danger"></p>
</div>
</div>
<div class="clearfix"></div>
<div class="col-lg-12 text-center">
<div id="success"></div>
<button id="sendMessageButton" class="btn btn-primary btn-xl text-uppercase" type="submit">Envoyer</button>
</div>
</div>
</form>
</div>
</div>
</div>
</section> -->
<!-- Footer -->
<footer class="footer">
<div class="container">
<div class="row align-items-center">
<div class="col-md-4">
<span class="copyright">SAMUEL.VERMEULEN.PRO Informatique</span>
</div>
<!--
<div class="col-md-4">
<ul class="list-inline social-buttons">
<li class="list-inline-item">
<a href="#">
<i class="fab fa-twitter"></i>
</a>
</li>
<li class="list-inline-item">
<a href="#">
<i class="fab fa-facebook-f"></i>
</a>
</li>
<li class="list-inline-item">
<a href="#">
<i class="fab fa-linkedin-in"></i>
</a>
</li>
</ul>
</div>
-->
<div class="col-md-4">
<ul class="list-inline quicklinks">
<li class="list-inline-item">
<a href="#">CGU</a>
</li>
</ul>
</div>
</div>
</div>
</footer>
<!-- Bootstrap core JavaScript -->
<script src="vendor/jquery/jquery.min.js"></script>
<script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Plugin JavaScript -->
<script src="vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Contact form JavaScript -->
<script src="js/jqBootstrapValidation.js"></script>
<script src="js/contact_me.js"></script>
<!-- Custom scripts for this template -->
<script src="js/agency.min.js"></script>
</body>
</html>

42
js/agency.js

@ -0,0 +1,42 @@
(function($) {
"use strict"; // Start of use strict
// Smooth scrolling using jQuery easing
$('a.js-scroll-trigger[href*="#"]:not([href="#"])').click(function() {
if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) {
var target = $(this.hash);
target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
if (target.length) {
$('html, body').animate({
scrollTop: (target.offset().top - 54)
}, 1000, "easeInOutExpo");
return false;
}
}
});
// Closes responsive menu when a scroll trigger link is clicked
$('.js-scroll-trigger').click(function() {
$('.navbar-collapse').collapse('hide');
});
// Activate scrollspy to add active class to navbar items on scroll
$('body').scrollspy({
target: '#mainNav',
offset: 56
});
// Collapse Navbar
var navbarCollapse = function() {
if ($("#mainNav").offset().top > 100) {
$("#mainNav").addClass("navbar-shrink");
} else {
$("#mainNav").removeClass("navbar-shrink");
}
};
// Collapse now if page is not at top
navbarCollapse();
// Collapse the navbar when page is scrolled
$(window).scroll(navbarCollapse);
})(jQuery); // End of use strict

7
js/agency.min.js

@ -0,0 +1,7 @@
/*!
* Start Bootstrap - Agency v5.2.2 (https://startbootstrap.com/template-overviews/agency)
* Copyright 2013-2019 Start Bootstrap
* Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-agency/blob/master/LICENSE)
*/
!function(e){"use strict";e('a.js-scroll-trigger[href*="#"]:not([href="#"])').click(function(){if(location.pathname.replace(/^\//,"")==this.pathname.replace(/^\//,"")&&location.hostname==this.hostname){var a=e(this.hash);if((a=a.length?a:e("[name="+this.hash.slice(1)+"]")).length)return e("html, body").animate({scrollTop:a.offset().top-54},1e3,"easeInOutExpo"),!1}}),e(".js-scroll-trigger").click(function(){e(".navbar-collapse").collapse("hide")}),e("body").scrollspy({target:"#mainNav",offset:56});function a(){100<e("#mainNav").offset().top?e("#mainNav").addClass("navbar-shrink"):e("#mainNav").removeClass("navbar-shrink")}a(),e(window).scroll(a)}(jQuery);

75
js/contact_me.js

@ -0,0 +1,75 @@
$(function() {
$("#contactForm input,#contactForm textarea").jqBootstrapValidation({
preventSubmit: true,
submitError: function($form, event, errors) {
// additional error messages or events
},
submitSuccess: function($form, event) {
event.preventDefault(); // prevent default submit behaviour
// get values from FORM
var name = $("input#name").val();
var email = $("input#email").val();
var phone = $("input#phone").val();
var message = $("textarea#message").val();
var firstName = name; // For Success/Failure Message
// Check for white space in name for Success/Fail message
if (firstName.indexOf(' ') >= 0) {
firstName = name.split(' ').slice(0, -1).join(' ');
}
$this = $("#sendMessageButton");
$this.prop("disabled", true); // Disable submit button until AJAX call is complete to prevent duplicate messages
$.ajax({
url: "././mail/contact_me.php",
type: "POST",
data: {
name: name,
phone: phone,
email: email,
message: message
},
cache: false,
success: function() {
// Success message
$('#success').html("<div class='alert alert-success'>");
$('#success > .alert-success').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
.append("</button>");
$('#success > .alert-success')
.append("<strong>Your message has been sent. </strong>");
$('#success > .alert-success')
.append('</div>');
//clear all fields
$('#contactForm').trigger("reset");
},
error: function() {
// Fail message
$('#success').html("<div class='alert alert-danger'>");
$('#success > .alert-danger').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
.append("</button>");
$('#success > .alert-danger').append($("<strong>").text("Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!"));
$('#success > .alert-danger').append('</div>');
//clear all fields
$('#contactForm').trigger("reset");
},
complete: function() {
setTimeout(function() {
$this.prop("disabled", false); // Re-enable submit button when AJAX call is complete
}, 1000);
}
});
},
filter: function() {
return $(this).is(":visible");
},
});
$("a[data-toggle=\"tab\"]").click(function(e) {
e.preventDefault();
$(this).tab("show");
});
});
/*When clicking on Full hide fail/success boxes */
$('#name').focus(function() {
$('#success').html('');
});

937
js/jqBootstrapValidation.js

<
@ -0,0 +1,937 @@
/* jqBootstrapValidation
* A plugin for automating validation on Twitter Bootstrap formatted forms.
*
* v1.3.6
*
* License: MIT <http://opensource.org/licenses/mit-license.php> - see LICENSE file
*
* http://ReactiveRaven.github.com/jqBootstrapValidation/
*/
(function($) {
var createdElements = [];
var defaults = {
options: {
prependExistingHelpBlock: false,
sniffHtml: true, // sniff for 'required', 'maxlength', etc
preventSubmit: true, // stop the form submit event from firing if validation fails
submitError: false, // function called if there is an error when trying to submit
submitSuccess: false, // function called just before a successful submit event is sent to the server
semanticallyStrict: false, // set to true to tidy up generated HTML output
autoAdd: {
helpBlocks: true
},
filter: function() {
// return $(this).is(":visible"); // only validate elements you can see
return true; // validate everything
}
},
methods: {
init: function(options) {
var settings = $.extend(true, {}, defaults);
settings.options = $.extend(true, settings.options, options);
var $siblingElements = this;
var uniqueForms = $.unique(
$siblingElements.map(function() {
return $(this).parents("form")[0];
}).toArray()
);
$(uniqueForms).bind("submit", function(e) {
var $form = $(this);
var warningsFound = 0;
var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter);
$inputs.trigger("submit.validation").trigger("validationLostFocus.validation");
$inputs.each(function(i, el) {
var $this = $(el),
$controlGroup = $this.parents(".form-group").first();
if (
$controlGroup.hasClass("warning")
) {
$controlGroup.removeClass("warning").addClass("error");
warningsFound++;
}
});
$inputs.trigger("validationLostFocus.validation");
if (warningsFound) {
if (settings.options.preventSubmit) {
e.preventDefault();
}
$form.addClass("error");
if ($.isFunction(settings.options.submitError)) {
settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true));
}
} else {
$form.removeClass("error");
if ($.isFunction(settings.options.submitSuccess)) {
settings.options.submitSuccess($form, e);
}
}
});
return this.each(function() {
// Get references to everything we're interested in
var $this = $(this),
$controlGroup = $this.parents(".form-group").first(),
$helpBlock = $controlGroup.find(".help-block").first(),
$form = $this.parents("form").first(),
validatorNames = [];
// create message container if not exists
if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) {
$helpBlock = $('<div class="help-block" />');
$controlGroup.find('.controls').append($helpBlock);
createdElements.push($helpBlock[0]);
}
// =============================================================
// SNIFF HTML FOR VALIDATORS
// =============================================================
// *snort sniff snuffle*
if (settings.options.sniffHtml) {
var message = "";
// ---------------------------------------------------------
// PATTERN
// ---------------------------------------------------------
if ($this.attr("pattern") !== undefined) {
message = "Not in the expected format<!-- data-validation-pattern-message to override -->";
if ($this.data("validationPatternMessage")) {
message = $this.data("validationPatternMessage");
}
$this.data("validationPatternMessage", message);
$this.data("validationPatternRegex", $this.attr("pattern"));
}
// ---------------------------------------------------------
// MAX
// ---------------------------------------------------------
if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) {
var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax"));
message = "Too high: Maximum of '" + max + "'<!-- data-validation-max-message to override -->";
if ($this.data("validationMaxMessage")) {
message = $this.data("validationMaxMessage");
}
$this.data("validationMaxMessage", message);
$this.data("validationMaxMax", max);
}
// ---------------------------------------------------------
// MIN
// ---------------------------------------------------------
if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) {
var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin"));
message = "Too low: Minimum of '" + min + "'<!-- data-validation-min-message to override -->";
if ($this.data("validationMinMessage")) {
message = $this.data("validationMinMessage");
}
$this.data("validationMinMessage", message);
$this.data("validationMinMin", min);
}
// ---------------------------------------------------------
// MAXLENGTH
// ---------------------------------------------------------
if ($this.attr("maxlength") !== undefined) {
message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters<!-- data-validation-maxlength-message to override -->";
if ($this.data("validationMaxlengthMessage")) {
message = $this.data("validationMaxlengthMessage");
}
$this.data("validationMaxlengthMessage", message);
$this.data("validationMaxlengthMaxlength", $this.attr("maxlength"));
}
// ---------------------------------------------------------
// MINLENGTH
// ---------------------------------------------------------
if ($this.attr("minlength") !== undefined) {
message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters<!-- data-validation-minlength-message to override -->";
if ($this.data("validationMinlengthMessage")) {
message = $this.data("validationMinlengthMessage");
}
$this.data("validationMinlengthMessage", message);
$this.data("validationMinlengthMinlength", $this.attr("minlength"));
}
// ---------------------------------------------------------
// REQUIRED
// ---------------------------------------------------------
if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) {
message = settings.builtInValidators.required.message;
if ($this.data("validationRequiredMessage")) {
message = $this.data("validationRequiredMessage");
}
$this.data("validationRequiredMessage", message);
}
// ---------------------------------------------------------
// NUMBER
// ---------------------------------------------------------
if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") {
message = settings.builtInValidators.number.message;
if ($this.data("validationNumberMessage")) {
message = $this.data("validationNumberMessage");
}
$this.data("validationNumberMessage", message);
}
// ---------------------------------------------------------
// EMAIL
// ---------------------------------------------------------
if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") {
message = "Not a valid email address<!-- data-validator-validemail-message to override -->";
if ($this.data("validationValidemailMessage")) {
message = $this.data("validationValidemailMessage");
} else if ($this.data("validationEmailMessage")) {
message = $this.data("validationEmailMessage");
}
$this.data("validationValidemailMessage", message);
}
// ---------------------------------------------------------
// MINCHECKED
// ---------------------------------------------------------
if ($this.attr("minchecked") !== undefined) {
message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required<!-- data-validation-minchecked-message to override -->";
if ($this.data("validationMincheckedMessage")) {
message = $this.data("validationMincheckedMessage");
}
$this.data("validationMincheckedMessage", message);
$this.data("validationMincheckedMinchecked", $this.attr("minchecked"));
}
// ---------------------------------------------------------
// MAXCHECKED
// ---------------------------------------------------------
if ($this.attr("maxchecked") !== undefined) {
message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required<!-- data-validation-maxchecked-message to override -->";
if ($this.data("validationMaxcheckedMessage")) {
message = $this.data("validationMaxcheckedMessage");
}
$this.data("validationMaxcheckedMessage", message);
$this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked"));
}
}
// =============================================================
// COLLECT VALIDATOR NAMES
// =============================================================
// Get named validators
if ($this.data("validation") !== undefined) {
validatorNames = $this.data("validation").split(",");
}
// Get extra ones defined on the element's data attributes
$.each($this.data(), function(i, el) {
var parts = i.replace(/([A-Z])/g, ",$1").split(",");
if (parts[0] === "validation" && parts[1]) {
validatorNames.push(parts[1]);
}
});
// =============================================================