Initial Upload
248
assets/img/avataaars.svg
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 264 280" style="enable-background:new 0 0 264 280;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#E6E6E6;}
|
||||||
|
.st1{filter:url(#Adobe_OpacityMaskFilter);}
|
||||||
|
.st2{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
|
||||||
|
.st3{mask:url(#mask-2_1_);}
|
||||||
|
.st4{fill-rule:evenodd;clip-rule:evenodd;fill:#2C3E50;}
|
||||||
|
.st5{filter:url(#Adobe_OpacityMaskFilter_1_);}
|
||||||
|
.st6{mask:url(#mask-4_1_);}
|
||||||
|
.st7{fill-rule:evenodd;clip-rule:evenodd;fill:#D0C6AC;}
|
||||||
|
.st8{filter:url(#Adobe_OpacityMaskFilter_2_);}
|
||||||
|
.st9{mask:url(#mask-6_1_);}
|
||||||
|
.st10{fill-rule:evenodd;clip-rule:evenodd;fill:#EDB98A;}
|
||||||
|
.st11{filter:url(#Adobe_OpacityMaskFilter_3_);}
|
||||||
|
.st12{mask:url(#mask-6_2_);fill-rule:evenodd;clip-rule:evenodd;fill-opacity:0.1;}
|
||||||
|
.st13{filter:url(#Adobe_OpacityMaskFilter_4_);}
|
||||||
|
.st14{mask:url(#react-mask-952_1_);}
|
||||||
|
.st15{filter:url(#Adobe_OpacityMaskFilter_5_);}
|
||||||
|
.st16{opacity:0.6;mask:url(#react-mask-952_2_);}
|
||||||
|
.st17{fill-rule:evenodd;clip-rule:evenodd;fill-opacity:0.16;}
|
||||||
|
.st18{fill-rule:evenodd;clip-rule:evenodd;fill-opacity:0.7;}
|
||||||
|
.st19{filter:url(#Adobe_OpacityMaskFilter_6_);}
|
||||||
|
.st20{mask:url(#react-mask-934_1_);fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
|
||||||
|
.st21{filter:url(#Adobe_OpacityMaskFilter_7_);}
|
||||||
|
.st22{mask:url(#react-mask-934_2_);}
|
||||||
|
.st23{fill-rule:evenodd;clip-rule:evenodd;fill:#FF4F6D;}
|
||||||
|
.st24{fill-rule:evenodd;clip-rule:evenodd;fill-opacity:0.6;}
|
||||||
|
.st25{filter:url(#Adobe_OpacityMaskFilter_8_);}
|
||||||
|
.st26{mask:url(#react-mask-925_1_);}
|
||||||
|
.st27{fill-rule:evenodd;clip-rule:evenodd;fill:#28354B;}
|
||||||
|
.st28{filter:url(#Adobe_OpacityMaskFilter_9_);}
|
||||||
|
.st29{mask:url(#react-mask-924_1_);}
|
||||||
|
.st30{fill-rule:evenodd;clip-rule:evenodd;fill:#4A312C;}
|
||||||
|
</style>
|
||||||
|
<desc>Created with getavataaars.com</desc>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-825.000000, -1100.000000)">
|
||||||
|
<g transform="translate(825.000000, 1100.000000)">
|
||||||
|
<g id="Circle" transform="translate(12.000000, 40.000000)">
|
||||||
|
<g id="Circle-Background">
|
||||||
|
<circle class="st0" cx="120" cy="120" r="120"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="Adobe_OpacityMaskFilter" filterUnits="userSpaceOnUse" x="0" y="0" width="240" height="240">
|
||||||
|
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<mask maskUnits="userSpaceOnUse" x="0" y="0" width="240" height="240" id="mask-2_1_">
|
||||||
|
<g class="st1">
|
||||||
|
<circle id="path-1_1_" class="st2" cx="120" cy="120" r="120"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<g class="st3">
|
||||||
|
<rect class="st4" width="240" height="240"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Mask">
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="Adobe_OpacityMaskFilter_1_" filterUnits="userSpaceOnUse" x="-1" y="0" width="265" height="280">
|
||||||
|
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<mask maskUnits="userSpaceOnUse" x="-1" y="0" width="265" height="280" id="mask-4_1_">
|
||||||
|
<g class="st5">
|
||||||
|
<path id="path-3_1_" class="st2" d="M12,160c0,66.3,53.7,120,120,120s120-53.7,120-120h12V0H0v160H12z"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<g id="Avataaar" class="st6">
|
||||||
|
<g id="Body" transform="translate(32.000000, 36.000000)">
|
||||||
|
<g>
|
||||||
|
<path class="st7" d="M124,144.6V163h4l0,0c39.8,0,72,32.2,72,72v9H0v-9c0-39.8,32.2-72,72-72l0,0h4v-18.4
|
||||||
|
c-17.2-8.2-29.6-24.9-31.7-44.7C38.5,99.1,34,94.1,34,88V74c0-5.9,4.3-10.9,10-11.8V56l0,0c0-30.9,25.1-56,56-56l0,0l0,0
|
||||||
|
c30.9,0,56,25.1,56,56v6.2c5.7,1,10,5.9,10,11.8v14c0,6.1-4.5,11.1-10.3,11.9C153.6,119.7,141.2,136.4,124,144.6z"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="Adobe_OpacityMaskFilter_2_" filterUnits="userSpaceOnUse" x="-32" y="0" width="264" height="244">
|
||||||
|
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<mask maskUnits="userSpaceOnUse" x="-32" y="0" width="264" height="244" id="mask-6_1_">
|
||||||
|
<g class="st8">
|
||||||
|
<path id="path-5_1_" class="st2" d="M124,144.6V163h4l0,0c39.8,0,72,32.2,72,72v9H0v-9c0-39.8,32.2-72,72-72l0,0h4v-18.4
|
||||||
|
c-17.2-8.2-29.6-24.9-31.7-44.7C38.5,99.1,34,94.1,34,88V74c0-5.9,4.3-10.9,10-11.8V56l0,0c0-30.9,25.1-56,56-56l0,0l0,0
|
||||||
|
c30.9,0,56,25.1,56,56v6.2c5.7,1,10,5.9,10,11.8v14c0,6.1-4.5,11.1-10.3,11.9C153.6,119.7,141.2,136.4,124,144.6z"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<g class="st9">
|
||||||
|
<g id="Color" transform="translate(-32.000000, 0.000000)">
|
||||||
|
<rect class="st10" width="264" height="244"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="Adobe_OpacityMaskFilter_3_" filterUnits="userSpaceOnUse" x="44" y="79" width="112" height="79">
|
||||||
|
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<mask maskUnits="userSpaceOnUse" x="44" y="79" width="112" height="79" id="mask-6_2_">
|
||||||
|
<g class="st11">
|
||||||
|
<path id="path-5_2_" class="st2" d="M124,144.6V163h4l0,0c39.8,0,72,32.2,72,72v9H0v-9c0-39.8,32.2-72,72-72l0,0h4v-18.4
|
||||||
|
c-17.2-8.2-29.6-24.9-31.7-44.7C38.5,99.1,34,94.1,34,88V74c0-5.9,4.3-10.9,10-11.8V56l0,0c0-30.9,25.1-56,56-56l0,0l0,0
|
||||||
|
c30.9,0,56,25.1,56,56v6.2c5.7,1,10,5.9,10,11.8v14c0,6.1-4.5,11.1-10.3,11.9C153.6,119.7,141.2,136.4,124,144.6z"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<path id="Neck-Shadow" class="st12" d="M156,79v23c0,30.9-25.1,56-56,56s-56-25.1-56-56V79v15c0,30.9,25.1,56,56,56
|
||||||
|
s56-25.1,56-56V79z"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(0.000000, 170.000000)">
|
||||||
|
<g id="Clothes">
|
||||||
|
<path class="st0" d="M166,29.3c37,3,66,34,66,71.8v8.9H32v-8.9C32,63,61.6,31.8,99,29.2c0,0.4,0,0.7,0,1.1
|
||||||
|
c0,11.9,15,21.5,33.5,21.5S166,42.2,166,30.3C166,30,166,29.6,166,29.3z"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="Adobe_OpacityMaskFilter_4_" filterUnits="userSpaceOnUse" x="0" y="0" width="264" height="110">
|
||||||
|
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<mask maskUnits="userSpaceOnUse" x="0" y="0" width="264" height="110" id="react-mask-952_1_">
|
||||||
|
<g class="st13">
|
||||||
|
<path id="react-path-951_1_" class="st2" d="M166,29.3c37,3,66,34,66,71.8v8.9H32v-8.9C32,63,61.6,31.8,99,29.2
|
||||||
|
c0,0.4,0,0.7,0,1.1c0,11.9,15,21.5,33.5,21.5S166,42.2,166,30.3C166,30,166,29.6,166,29.3z"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<g class="st14">
|
||||||
|
<rect class="st2" width="264" height="110"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="Adobe_OpacityMaskFilter_5_" filterUnits="userSpaceOnUse" x="92.9" y="4.9" width="79.3" height="53.8">
|
||||||
|
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<mask maskUnits="userSpaceOnUse" x="92.9" y="4.9" width="79.3" height="53.8" id="react-mask-952_2_">
|
||||||
|
<g class="st15">
|
||||||
|
<path id="react-path-951_2_" class="st2" d="M166,29.3c37,3,66,34,66,71.8v8.9H32v-8.9C32,63,61.6,31.8,99,29.2
|
||||||
|
c0,0.4,0,0.7,0,1.1c0,11.9,15,21.5,33.5,21.5S166,42.2,166,30.3C166,30,166,29.6,166,29.3z"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<g id="Shadowy" class="st16">
|
||||||
|
<g transform="translate(92.000000, 4.000000)">
|
||||||
|
<ellipse class="st17" cx="40.5" cy="27.8" rx="39.6" ry="26.9"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Face" transform="translate(76.000000, 82.000000)">
|
||||||
|
<g transform="translate(2.000000, 52.000000)">
|
||||||
|
<g id="Mouth">
|
||||||
|
<path class="st18" d="M35.1,15.1C36.2,24.6,44.2,32,54,32c9.8,0,17.9-7.4,18.9-17c0.1-0.8-0.8-2-1.8-2c-14.9,0-26.3,0-34,0
|
||||||
|
C36,13,35,14.2,35.1,15.1z"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="Adobe_OpacityMaskFilter_6_" filterUnits="userSpaceOnUse" x="39" y="2" width="31" height="16">
|
||||||
|
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<mask maskUnits="userSpaceOnUse" x="39" y="2" width="31" height="16" id="react-mask-934_1_">
|
||||||
|
<g class="st19">
|
||||||
|
<path id="react-path-933_1_" class="st2" d="M35.1,15.1C36.2,24.6,44.2,32,54,32c9.8,0,17.9-7.4,18.9-17
|
||||||
|
c0.1-0.8-0.8-2-1.8-2c-14.9,0-26.3,0-34,0C36,13,35,14.2,35.1,15.1z"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<path id="Teeth" class="st20" d="M44,2h21c2.8,0,5,2.2,5,5v6c0,2.8-2.2,5-5,5H44c-2.8,0-5-2.2-5-5V7C39,4.2,41.2,2,44,2z"/>
|
||||||
|
<defs>
|
||||||
|
<filter id="Adobe_OpacityMaskFilter_7_" filterUnits="userSpaceOnUse" x="38" y="24" width="32" height="22">
|
||||||
|
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<mask maskUnits="userSpaceOnUse" x="38" y="24" width="32" height="22" id="react-mask-934_2_">
|
||||||
|
<g class="st21">
|
||||||
|
<path id="react-path-933_2_" class="st2" d="M35.1,15.1C36.2,24.6,44.2,32,54,32c9.8,0,17.9-7.4,18.9-17
|
||||||
|
c0.1-0.8-0.8-2-1.8-2c-14.9,0-26.3,0-34,0C36,13,35,14.2,35.1,15.1z"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<g id="Tongue" class="st22">
|
||||||
|
<g transform="translate(38.000000, 24.000000)">
|
||||||
|
<circle class="st23" cx="11" cy="11" r="11"/>
|
||||||
|
<circle class="st23" cx="21" cy="11" r="11"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(28.000000, 40.000000)">
|
||||||
|
<path id="Nose" class="st17" d="M16,8c0,4.4,5.4,8,12,8l0,0c6.6,0,12-3.6,12-8"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(0.000000, 8.000000)">
|
||||||
|
<path id="Squint" class="st24" d="M16.2,22.4C18,18.6,22.2,16,27,16c4.8,0,9,2.6,10.8,6.4c0.6,1.1-0.2,2-1,1.4
|
||||||
|
c-2.5-2.1-5.9-3.4-9.8-3.4c-3.7,0-7.1,1.2-9.6,3.2C16.5,24.3,15.6,23.6,16.2,22.4z"/>
|
||||||
|
<path class="st24" d="M74.2,22.4C76,18.6,80.2,16,85,16c4.8,0,9,2.6,10.8,6.4c0.6,1.1-0.2,2-1,1.4c-2.5-2.1-5.9-3.4-9.8-3.4
|
||||||
|
c-3.7,0-7.1,1.2-9.6,3.2C74.5,24.3,73.6,23.6,74.2,22.4z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path id="Eyebrow" class="st24" d="M26.5,6.1c-5.8,0.3-15.2,4.5-15,10.3c0,0.2,0.3,0.3,0.4,0.1c2.8-3,22.3-5.9,29.2-4.4
|
||||||
|
c0.6,0.1,1.1-0.5,0.7-0.9C38.5,7.5,31.7,5.9,26.5,6.1"/>
|
||||||
|
<path class="st24" d="M86.5,6.1c5.8,0.3,15.2,4.5,15,10.3c0,0.2-0.3,0.3-0.4,0.1c-2.8-3-22.3-5.9-29.2-4.4
|
||||||
|
c-0.6,0.1-1.1-0.5-0.7-0.9C74.5,7.5,81.3,5.9,86.5,6.1"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Top">
|
||||||
|
<defs>
|
||||||
|
<filter id="Adobe_OpacityMaskFilter_8_" filterUnits="userSpaceOnUse" x="-1" y="0" width="264" height="280">
|
||||||
|
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<mask maskUnits="userSpaceOnUse" x="-1" y="0" width="264" height="280" id="react-mask-925_1_">
|
||||||
|
<g class="st25">
|
||||||
|
<rect id="react-path-927_1_" class="st2" width="264" height="280"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<g class="st26">
|
||||||
|
<g transform="translate(-1.000000, 0.000000)">
|
||||||
|
<g id="Short-Hair">
|
||||||
|
<path class="st27" d="M183.7,38.9c5.4-5,6.7-15,3.6-21.5c-3.8-8-11.4-9-18.7-5.5c-6.9,3.3-13.1,4.4-20.6,2.8
|
||||||
|
c-7.3-1.5-14.1-4.3-21.6-4.7C114,9.3,102,13.9,93.6,23.1c-1.6,1.8-2.9,3.8-4.1,5.8c-1,1.6-2.1,3.4-2.5,5.3
|
||||||
|
c-0.2,0.9,0.2,3.1-0.3,3.8c-0.5,0.8-2.3,1.5-3.1,2.1c-1.6,1.2-2.9,2.5-4.2,4c-2.7,3.2-4.1,6.6-5.4,10.6
|
||||||
|
c-4.1,13.2-4.5,29,0.9,42c0.7,1.7,2.9,5.4,4.2,1.6c0.3-0.7-0.3-3.2-0.3-3.9c0-2.7,1.5-20.7,8-30.8c2.1-3.3,12-15.6,14-15.7
|
||||||
|
c1.1,1.7,11.9,12.5,39.9,11.2c12.7-0.6,22.4-6.3,24.7-8.7c1,5.5,13,13.8,14.8,17.2c5.3,9.8,6.4,30.3,8.4,30.3
|
||||||
|
s3.5-5.2,3.9-6.2c3.1-7.4,3.6-16.6,3.3-24.6C195.5,57,191.3,45.9,183.7,38.9z"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="Adobe_OpacityMaskFilter_9_" filterUnits="userSpaceOnUse" x="0" y="0" width="264" height="280">
|
||||||
|
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<mask maskUnits="userSpaceOnUse" x="0" y="0" width="264" height="280" id="react-mask-924_1_">
|
||||||
|
<g class="st28">
|
||||||
|
<path id="react-path-926_1_" class="st2" d="M183.7,38.9c5.4-5,6.7-15,3.6-21.5c-3.8-8-11.4-9-18.7-5.5
|
||||||
|
c-6.9,3.3-13.1,4.4-20.6,2.8c-7.3-1.5-14.1-4.3-21.6-4.7C114,9.3,102,13.9,93.6,23.1c-1.6,1.8-2.9,3.8-4.1,5.8
|
||||||
|
c-1,1.6-2.1,3.4-2.5,5.3c-0.2,0.9,0.2,3.1-0.3,3.8c-0.5,0.8-2.3,1.5-3.1,2.1c-1.6,1.2-2.9,2.5-4.2,4
|
||||||
|
c-2.7,3.2-4.1,6.6-5.4,10.6c-4.1,13.2-4.5,29,0.9,42c0.7,1.7,2.9,5.4,4.2,1.6c0.3-0.7-0.3-3.2-0.3-3.9
|
||||||
|
c0-2.7,1.5-20.7,8-30.8c2.1-3.3,12-15.6,14-15.7c1.1,1.7,11.9,12.5,39.9,11.2c12.7-0.6,22.4-6.3,24.7-8.7
|
||||||
|
c1,5.5,13,13.8,14.8,17.2c5.3,9.8,6.4,30.3,8.4,30.3s3.5-5.2,3.9-6.2c3.1-7.4,3.6-16.6,3.3-24.6
|
||||||
|
C195.5,57,191.3,45.9,183.7,38.9z"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<g class="st29">
|
||||||
|
<g transform="translate(0.000000, 0.000000) ">
|
||||||
|
<rect class="st30" width="264" height="280"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 12 KiB |
BIN
assets/img/favicon.ico
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
assets/img/placeholder.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
assets/img/portfolio/cabin.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
assets/img/portfolio/cake.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
assets/img/portfolio/circus.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
assets/img/portfolio/game.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
assets/img/portfolio/safe.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
assets/img/portfolio/submarine.png
Normal file
After Width: | Height: | Size: 24 KiB |
88
assets/mail/contact_me.js
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
$(function () {
|
||||||
|
$(
|
||||||
|
"#contactForm input,#contactForm textarea,#contactForm button"
|
||||||
|
).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: "/assets/mail/contact_me.php",
|
||||||
|
type: "POST",
|
||||||
|
cache: false,
|
||||||
|
data: {
|
||||||
|
name: name,
|
||||||
|
phone: phone,
|
||||||
|
email: email,
|
||||||
|
message: message,
|
||||||
|
},
|
||||||
|
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'>×"
|
||||||
|
)
|
||||||
|
.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'>×"
|
||||||
|
)
|
||||||
|
.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("");
|
||||||
|
});
|
22
assets/mail/contact_me.php
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
// Check for empty fields
|
||||||
|
if(empty($_POST['name']) || empty($_POST['email']) || empty($_POST['phone']) || empty($_POST['message']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
|
||||||
|
http_response_code(500);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = strip_tags(htmlspecialchars($_POST['name']));
|
||||||
|
$email = strip_tags(htmlspecialchars($_POST['email']));
|
||||||
|
$phone = strip_tags(htmlspecialchars($_POST['phone']));
|
||||||
|
$message = strip_tags(htmlspecialchars($_POST['message']));
|
||||||
|
|
||||||
|
// Create the email and send the message
|
||||||
|
$to = "04ljetoxic@gmail.com"; // Add your email address in between the "" replacing yourname@yourdomain.com - This is where the form will send a message to.
|
||||||
|
$subject = "Website Contact Form: $name";
|
||||||
|
$body = "You have received a new message from your website contact form.\n\n"."Here are the details:\n\nName: $name\n\nEmail: $email\n\nPhone: $phone\n\nMessage:\n$message";
|
||||||
|
$header = "From: noreply@yourdomain.com\n"; // This is the email address the generated message will be from. We recommend using something like noreply@yourdomain.com.
|
||||||
|
$header .= "Reply-To: $email";
|
||||||
|
|
||||||
|
if(!mail($to, $subject, $body, $header))
|
||||||
|
http_response_code(500);
|
||||||
|
?>
|
912
assets/mail/jqBootstrapValidation.js
Normal file
@ -0,0 +1,912 @@
|
|||||||
|
/* 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(".control-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(".control-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]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// =============================================================
|
||||||
|
// NORMALISE VALIDATOR NAMES
|
||||||
|
// =============================================================
|
||||||
|
|
||||||
|
var validatorNamesToInspect = validatorNames;
|
||||||
|
var newValidatorNamesToInspect = [];
|
||||||
|
|
||||||
|
do // repeatedly expand 'shortcut' validators into their real validators
|
||||||
|
{
|
||||||
|
// Uppercase only the first letter of each name
|
||||||
|
$.each(validatorNames, function (i, el) {
|
||||||
|
validatorNames[i] = formatValidatorName(el);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Remove duplicate validator names
|
||||||
|
validatorNames = $.unique(validatorNames);
|
||||||
|
|
||||||
|
// Pull out the new validator names from each shortcut
|
||||||
|
newValidatorNamesToInspect = [];
|
||||||
|
$.each(validatorNamesToInspect, function(i, el) {
|
||||||
|
if ($this.data("validation" + el + "Shortcut") !== undefined) {
|
||||||
|
// Are these custom validators?
|
||||||
|
// Pull them out!
|
||||||
|
$.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) {
|
||||||
|
newValidatorNamesToInspect.push(el2);
|
||||||
|
});
|
||||||
|
} else if (settings.builtInValidators[el.toLowerCase()]) {
|
||||||
|
// Is this a recognised built-in?
|
||||||
|
// Pull it out!
|
||||||
|
var validator = settings.builtInValidators[el.toLowerCase()];
|
||||||
|
if (validator.type.toLowerCase() === "shortcut") {
|
||||||
|
$.each(validator.shortcut.split(","), function (i, el) {
|
||||||
|
el = formatValidatorName(el);
|
||||||
|
newValidatorNamesToInspect.push(el);
|
||||||
|
validatorNames.push(el);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
validatorNamesToInspect = newValidatorNamesToInspect;
|
||||||
|
|
||||||
|
} while (validatorNamesToInspect.length > 0)
|
||||||
|
|
||||||
|
// =============================================================
|
||||||
|
// SET UP VALIDATOR ARRAYS
|
||||||
|
// =============================================================
|
||||||
|
|
||||||
|
var validators = {};
|
||||||
|
|
||||||
|
$.each(validatorNames, function (i, el) {
|
||||||
|
// Set up the 'override' message
|
||||||
|
var message = $this.data("validation" + el + "Message");
|
||||||
|
var hasOverrideMessage = (message !== undefined);
|
||||||
|
var foundValidator = false;
|
||||||
|
message =
|
||||||
|
(
|
||||||
|
message
|
||||||
|
? message
|
||||||
|
: "'" + el + "' validation failed <!-- Add attribute 'data-validation-" + el.toLowerCase() + "-message' to input to change this message -->"
|
||||||
|
)
|
||||||
|
;
|
||||||
|
|
||||||
|
$.each(
|
||||||
|
settings.validatorTypes,
|
||||||
|
function (validatorType, validatorTemplate) {
|
||||||
|
if (validators[validatorType] === undefined) {
|
||||||
|
validators[validatorType] = [];
|
||||||
|
}
|
||||||
|
if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) {
|
||||||
|
validators[validatorType].push(
|
||||||
|
$.extend(
|
||||||
|
true,
|
||||||
|
{
|
||||||
|
name: formatValidatorName(validatorTemplate.name),
|
||||||
|
message: message
|
||||||
|
},
|
||||||
|
validatorTemplate.init($this, el)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
foundValidator = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) {
|
||||||
|
|
||||||
|
var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]);
|
||||||
|
if (hasOverrideMessage) {
|
||||||
|
validator.message = message;
|
||||||
|
}
|
||||||
|
var validatorType = validator.type.toLowerCase();
|
||||||
|
|
||||||
|
if (validatorType === "shortcut") {
|
||||||
|
foundValidator = true;
|
||||||
|
} else {
|
||||||
|
$.each(
|
||||||
|
settings.validatorTypes,
|
||||||
|
function (validatorTemplateType, validatorTemplate) {
|
||||||
|
if (validators[validatorTemplateType] === undefined) {
|
||||||
|
validators[validatorTemplateType] = [];
|
||||||
|
}
|
||||||
|
if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) {
|
||||||
|
$this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]);
|
||||||
|
validators[validatorType].push(
|
||||||
|
$.extend(
|
||||||
|
validator,
|
||||||
|
validatorTemplate.init($this, el)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
foundValidator = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! foundValidator) {
|
||||||
|
$.error("Cannot find validation info for '" + el + "'");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// =============================================================
|
||||||
|
// STORE FALLBACK VALUES
|
||||||
|
// =============================================================
|
||||||
|
|
||||||
|
$helpBlock.data(
|
||||||
|
"original-contents",
|
||||||
|
(
|
||||||
|
$helpBlock.data("original-contents")
|
||||||
|
? $helpBlock.data("original-contents")
|
||||||
|
: $helpBlock.html()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$helpBlock.data(
|
||||||
|
"original-role",
|
||||||
|
(
|
||||||
|
$helpBlock.data("original-role")
|
||||||
|
? $helpBlock.data("original-role")
|
||||||
|
: $helpBlock.attr("role")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$controlGroup.data(
|
||||||
|
"original-classes",
|
||||||
|
(
|
||||||
|
$controlGroup.data("original-clases")
|
||||||
|
? $controlGroup.data("original-classes")
|
||||||
|
: $controlGroup.attr("class")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$this.data(
|
||||||
|
"original-aria-invalid",
|
||||||
|
(
|
||||||
|
$this.data("original-aria-invalid")
|
||||||
|
? $this.data("original-aria-invalid")
|
||||||
|
: $this.attr("aria-invalid")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// =============================================================
|
||||||
|
// VALIDATION
|
||||||
|
// =============================================================
|
||||||
|
|
||||||
|
$this.bind(
|
||||||
|
"validation.validation",
|
||||||
|
function (event, params) {
|
||||||
|
|
||||||
|
var value = getValue($this);
|
||||||
|
|
||||||
|
// Get a list of the errors to apply
|
||||||
|
var errorsFound = [];
|
||||||
|
|
||||||
|
$.each(validators, function (validatorType, validatorTypeArray) {
|
||||||
|
if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) {
|
||||||
|
$.each(validatorTypeArray, function (i, validator) {
|
||||||
|
if (settings.validatorTypes[validatorType].validate($this, value, validator)) {
|
||||||
|
errorsFound.push(validator.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return errorsFound;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
$this.bind(
|
||||||
|
"getValidators.validation",
|
||||||
|
function () {
|
||||||
|
return validators;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// =============================================================
|
||||||
|
// WATCH FOR CHANGES
|
||||||
|
// =============================================================
|
||||||
|
$this.bind(
|
||||||
|
"submit.validation",
|
||||||
|
function () {
|
||||||
|
return $this.triggerHandler("change.validation", {submitting: true});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
$this.bind(
|
||||||
|
[
|
||||||
|
"keyup",
|
||||||
|
"focus",
|
||||||
|
"blur",
|
||||||
|
"click",
|
||||||
|
"keydown",
|
||||||
|
"keypress",
|
||||||
|
"change"
|
||||||
|
].join(".validation ") + ".validation",
|
||||||
|
function (e, params) {
|
||||||
|
|
||||||
|
var value = getValue($this);
|
||||||
|
|
||||||
|
var errorsFound = [];
|
||||||
|
|
||||||
|
$controlGroup.find("input,textarea,select").each(function (i, el) {
|
||||||
|
var oldCount = errorsFound.length;
|
||||||
|
$.each($(el).triggerHandler("validation.validation", params), function (j, message) {
|
||||||
|
errorsFound.push(message);
|
||||||
|
});
|
||||||
|
if (errorsFound.length > oldCount) {
|
||||||
|
$(el).attr("aria-invalid", "true");
|
||||||
|
} else {
|
||||||
|
var original = $this.data("original-aria-invalid");
|
||||||
|
$(el).attr("aria-invalid", (original !== undefined ? original : false));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation");
|
||||||
|
|
||||||
|
errorsFound = $.unique(errorsFound.sort());
|
||||||
|
|
||||||
|
// Were there any errors?
|
||||||
|
if (errorsFound.length) {
|
||||||
|
// Better flag it up as a warning.
|
||||||
|
$controlGroup.removeClass("success error").addClass("warning");
|
||||||
|
|
||||||
|
// How many errors did we find?
|
||||||
|
if (settings.options.semanticallyStrict && errorsFound.length === 1) {
|
||||||
|
// Only one? Being strict? Just output it.
|
||||||
|
$helpBlock.html(errorsFound[0] +
|
||||||
|
( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));
|
||||||
|
} else {
|
||||||
|
// Multiple? Being sloppy? Glue them together into an UL.
|
||||||
|
$helpBlock.html("<ul role=\"alert\"><li>" + errorsFound.join("</li><li>") + "</li></ul>" +
|
||||||
|
( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$controlGroup.removeClass("warning error success");
|
||||||
|
if (value.length > 0) {
|
||||||
|
$controlGroup.addClass("success");
|
||||||
|
}
|
||||||
|
$helpBlock.html($helpBlock.data("original-contents"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.type === "blur") {
|
||||||
|
$controlGroup.removeClass("success");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
$this.bind("validationLostFocus.validation", function () {
|
||||||
|
$controlGroup.removeClass("success");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
destroy : function( ) {
|
||||||
|
|
||||||
|
return this.each(
|
||||||
|
function() {
|
||||||
|
|
||||||
|
var
|
||||||
|
$this = $(this),
|
||||||
|
$controlGroup = $this.parents(".control-group").first(),
|
||||||
|
$helpBlock = $controlGroup.find(".help-block").first();
|
||||||
|
|
||||||
|
// remove our events
|
||||||
|
$this.unbind('.validation'); // events are namespaced.
|
||||||
|
// reset help text
|
||||||
|
$helpBlock.html($helpBlock.data("original-contents"));
|
||||||
|
// reset classes
|
||||||
|
$controlGroup.attr("class", $controlGroup.data("original-classes"));
|
||||||
|
// reset aria
|
||||||
|
$this.attr("aria-invalid", $this.data("original-aria-invalid"));
|
||||||
|
// reset role
|
||||||
|
$helpBlock.attr("role", $this.data("original-role"));
|
||||||
|
// remove all elements we created
|
||||||
|
if (createdElements.indexOf($helpBlock[0]) > -1) {
|
||||||
|
$helpBlock.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
},
|
||||||
|
collectErrors : function(includeEmpty) {
|
||||||
|
|
||||||
|
var errorMessages = {};
|
||||||
|
this.each(function (i, el) {
|
||||||
|
var $el = $(el);
|
||||||
|
var name = $el.attr("name");
|
||||||
|
var errors = $el.triggerHandler("validation.validation", {includeEmpty: true});
|
||||||
|
errorMessages[name] = $.extend(true, errors, errorMessages[name]);
|
||||||
|
});
|
||||||
|
|
||||||
|
$.each(errorMessages, function (i, el) {
|
||||||
|
if (el.length === 0) {
|
||||||
|
delete errorMessages[i];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return errorMessages;
|
||||||
|
|
||||||
|
},
|
||||||
|
hasErrors: function() {
|
||||||
|
|
||||||
|
var errorMessages = [];
|
||||||
|
|
||||||
|
this.each(function (i, el) {
|
||||||
|
errorMessages = errorMessages.concat(
|
||||||
|
$(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : []
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
return (errorMessages.length > 0);
|
||||||
|
},
|
||||||
|
override : function (newDefaults) {
|
||||||
|
defaults = $.extend(true, defaults, newDefaults);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
validatorTypes: {
|
||||||
|
callback: {
|
||||||
|
name: "callback",
|
||||||
|
init: function ($this, name) {
|
||||||
|
return {
|
||||||
|
validatorName: name,
|
||||||
|
callback: $this.data("validation" + name + "Callback"),
|
||||||
|
lastValue: $this.val(),
|
||||||
|
lastValid: true,
|
||||||
|
lastFinished: true
|
||||||
|
};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
if (validator.lastValue === value && validator.lastFinished) {
|
||||||
|
return !validator.lastValid;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (validator.lastFinished === true)
|
||||||
|
{
|
||||||
|
validator.lastValue = value;
|
||||||
|
validator.lastValid = true;
|
||||||
|
validator.lastFinished = false;
|
||||||
|
|
||||||
|
var rrjqbvValidator = validator;
|
||||||
|
var rrjqbvThis = $this;
|
||||||
|
executeFunctionByName(
|
||||||
|
validator.callback,
|
||||||
|
window,
|
||||||
|
$this,
|
||||||
|
value,
|
||||||
|
function (data) {
|
||||||
|
if (rrjqbvValidator.lastValue === data.value) {
|
||||||
|
rrjqbvValidator.lastValid = data.valid;
|
||||||
|
if (data.message) {
|
||||||
|
rrjqbvValidator.message = data.message;
|
||||||
|
}
|
||||||
|
rrjqbvValidator.lastFinished = true;
|
||||||
|
rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message);
|
||||||
|
// Timeout is set to avoid problems with the events being considered 'already fired'
|
||||||
|
setTimeout(function () {
|
||||||
|
rrjqbvThis.trigger("change.validation");
|
||||||
|
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ajax: {
|
||||||
|
name: "ajax",
|
||||||
|
init: function ($this, name) {
|
||||||
|
return {
|
||||||
|
validatorName: name,
|
||||||
|
url: $this.data("validation" + name + "Ajax"),
|
||||||
|
lastValue: $this.val(),
|
||||||
|
lastValid: true,
|
||||||
|
lastFinished: true
|
||||||
|
};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
if (""+validator.lastValue === ""+value && validator.lastFinished === true) {
|
||||||
|
return validator.lastValid === false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (validator.lastFinished === true)
|
||||||
|
{
|
||||||
|
validator.lastValue = value;
|
||||||
|
validator.lastValid = true;
|
||||||
|
validator.lastFinished = false;
|
||||||
|
$.ajax({
|
||||||
|
url: validator.url,
|
||||||
|
data: "value=" + value + "&field=" + $this.attr("name"),
|
||||||
|
dataType: "json",
|
||||||
|
success: function (data) {
|
||||||
|
if (""+validator.lastValue === ""+data.value) {
|
||||||
|
validator.lastValid = !!(data.valid);
|
||||||
|
if (data.message) {
|
||||||
|
validator.message = data.message;
|
||||||
|
}
|
||||||
|
validator.lastFinished = true;
|
||||||
|
$this.data("validation" + validator.validatorName + "Message", validator.message);
|
||||||
|
// Timeout is set to avoid problems with the events being considered 'already fired'
|
||||||
|
setTimeout(function () {
|
||||||
|
$this.trigger("change.validation");
|
||||||
|
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
|
||||||
|
}
|
||||||
|
},
|
||||||
|
failure: function () {
|
||||||
|
validator.lastValid = true;
|
||||||
|
validator.message = "ajax call failed";
|
||||||
|
validator.lastFinished = true;
|
||||||
|
$this.data("validation" + validator.validatorName + "Message", validator.message);
|
||||||
|
// Timeout is set to avoid problems with the events being considered 'already fired'
|
||||||
|
setTimeout(function () {
|
||||||
|
$this.trigger("change.validation");
|
||||||
|
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
regex: {
|
||||||
|
name: "regex",
|
||||||
|
init: function ($this, name) {
|
||||||
|
return {regex: regexFromString($this.data("validation" + name + "Regex"))};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
return (!validator.regex.test(value) && ! validator.negative)
|
||||||
|
|| (validator.regex.test(value) && validator.negative);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
name: "required",
|
||||||
|
init: function ($this, name) {
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
return !!(value.length === 0 && ! validator.negative)
|
||||||
|
|| !!(value.length > 0 && validator.negative);
|
||||||
|
},
|
||||||
|
blockSubmit: true
|
||||||
|
},
|
||||||
|
match: {
|
||||||
|
name: "match",
|
||||||
|
init: function ($this, name) {
|
||||||
|
var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first();
|
||||||
|
element.bind("validation.validation", function () {
|
||||||
|
$this.trigger("change.validation", {submitting: true});
|
||||||
|
});
|
||||||
|
return {"element": element};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
return (value !== validator.element.val() && ! validator.negative)
|
||||||
|
|| (value === validator.element.val() && validator.negative);
|
||||||
|
},
|
||||||
|
blockSubmit: true
|
||||||
|
},
|
||||||
|
max: {
|
||||||
|
name: "max",
|
||||||
|
init: function ($this, name) {
|
||||||
|
return {max: $this.data("validation" + name + "Max")};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative)
|
||||||
|
|| (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
min: {
|
||||||
|
name: "min",
|
||||||
|
init: function ($this, name) {
|
||||||
|
return {min: $this.data("validation" + name + "Min")};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative)
|
||||||
|
|| (parseFloat(value) >= parseFloat(validator.min) && validator.negative);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
maxlength: {
|
||||||
|
name: "maxlength",
|
||||||
|
init: function ($this, name) {
|
||||||
|
return {maxlength: $this.data("validation" + name + "Maxlength")};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
return ((value.length > validator.maxlength) && ! validator.negative)
|
||||||
|
|| ((value.length <= validator.maxlength) && validator.negative);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
minlength: {
|
||||||
|
name: "minlength",
|
||||||
|
init: function ($this, name) {
|
||||||
|
return {minlength: $this.data("validation" + name + "Minlength")};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
return ((value.length < validator.minlength) && ! validator.negative)
|
||||||
|
|| ((value.length >= validator.minlength) && validator.negative);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
maxchecked: {
|
||||||
|
name: "maxchecked",
|
||||||
|
init: function ($this, name) {
|
||||||
|
var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
|
||||||
|
elements.bind("click.validation", function () {
|
||||||
|
$this.trigger("change.validation", {includeEmpty: true});
|
||||||
|
});
|
||||||
|
return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative)
|
||||||
|
|| (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative);
|
||||||
|
},
|
||||||
|
blockSubmit: true
|
||||||
|
},
|
||||||
|
minchecked: {
|
||||||
|
name: "minchecked",
|
||||||
|
init: function ($this, name) {
|
||||||
|
var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
|
||||||
|
elements.bind("click.validation", function () {
|
||||||
|
$this.trigger("change.validation", {includeEmpty: true});
|
||||||
|
});
|
||||||
|
return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements};
|
||||||
|
},
|
||||||
|
validate: function ($this, value, validator) {
|
||||||
|
return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative)
|
||||||
|
|| (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative);
|
||||||
|
},
|
||||||
|
blockSubmit: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
builtInValidators: {
|
||||||
|
email: {
|
||||||
|
name: "Email",
|
||||||
|
type: "shortcut",
|
||||||
|
shortcut: "validemail"
|
||||||
|
},
|
||||||
|
validemail: {
|
||||||
|
name: "Validemail",
|
||||||
|
type: "regex",
|
||||||
|
regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}",
|
||||||
|
message: "Not a valid email address<!-- data-validator-validemail-message to override -->"
|
||||||
|
},
|
||||||
|
passwordagain: {
|
||||||
|
name: "Passwordagain",
|
||||||
|
type: "match",
|
||||||
|
match: "password",
|
||||||
|
message: "Does not match the given password<!-- data-validator-paswordagain-message to override -->"
|
||||||
|
},
|
||||||
|
positive: {
|
||||||
|
name: "Positive",
|
||||||
|
type: "shortcut",
|
||||||
|
shortcut: "number,positivenumber"
|
||||||
|
},
|
||||||
|
negative: {
|
||||||
|
name: "Negative",
|
||||||
|
type: "shortcut",
|
||||||
|
shortcut: "number,negativenumber"
|
||||||
|
},
|
||||||
|
number: {
|
||||||
|
name: "Number",
|
||||||
|
type: "regex",
|
||||||
|
regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?",
|
||||||
|
message: "Must be a number<!-- data-validator-number-message to override -->"
|
||||||
|
},
|
||||||
|
integer: {
|
||||||
|
name: "Integer",
|
||||||
|
type: "regex",
|
||||||
|
regex: "[+-]?\\\d+",
|
||||||
|
message: "No decimal places allowed<!-- data-validator-integer-message to override -->"
|
||||||
|
},
|
||||||
|
positivenumber: {
|
||||||
|
name: "Positivenumber",
|
||||||
|
type: "min",
|
||||||
|
min: 0,
|
||||||
|
message: "Must be a positive number<!-- data-validator-positivenumber-message to override -->"
|
||||||
|
},
|
||||||
|
negativenumber: {
|
||||||
|
name: "Negativenumber",
|
||||||
|
type: "max",
|
||||||
|
max: 0,
|
||||||
|
message: "Must be a negative number<!-- data-validator-negativenumber-message to override -->"
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
name: "Required",
|
||||||
|
type: "required",
|
||||||
|
message: "This is required<!-- data-validator-required-message to override -->"
|
||||||
|
},
|
||||||
|
checkone: {
|
||||||
|
name: "Checkone",
|
||||||
|
type: "minchecked",
|
||||||
|
minchecked: 1,
|
||||||
|
message: "Check at least one option<!-- data-validation-checkone-message to override -->"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var formatValidatorName = function (name) {
|
||||||
|
return name
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(
|
||||||
|
/(^|\s)([a-z])/g ,
|
||||||
|
function(m,p1,p2) {
|
||||||
|
return p1+p2.toUpperCase();
|
||||||
|
}
|
||||||
|
)
|
||||||
|
;
|
||||||
|
};
|
||||||
|
|
||||||
|
var getValue = function ($this) {
|
||||||
|
// Extract the value we're talking about
|
||||||
|
var value = $this.val();
|
||||||
|
var type = $this.attr("type");
|
||||||
|
if (type === "checkbox") {
|
||||||
|
value = ($this.is(":checked") ? value : "");
|
||||||
|
}
|
||||||
|
if (type === "radio") {
|
||||||
|
value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : "");
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
function regexFromString(inputstring) {
|
||||||
|
return new RegExp("^" + inputstring + "$");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thanks to Jason Bunting via StackOverflow.com
|
||||||
|
*
|
||||||
|
* http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910
|
||||||
|
* Short link: http://tinyurl.com/executeFunctionByName
|
||||||
|
**/
|
||||||
|
function executeFunctionByName(functionName, context /*, args*/) {
|
||||||
|
var args = Array.prototype.slice.call(arguments).splice(2);
|
||||||
|
var namespaces = functionName.split(".");
|
||||||
|
var func = namespaces.pop();
|
||||||
|
for(var i = 0; i < namespaces.length; i++) {
|
||||||
|
context = context[namespaces[i]];
|
||||||
|
}
|
||||||
|
return context[func].apply(this, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.jqBootstrapValidation = function( method ) {
|
||||||
|
|
||||||
|
if ( defaults.methods[method] ) {
|
||||||
|
return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
|
||||||
|
} else if ( typeof method === 'object' || ! method ) {
|
||||||
|
return defaults.methods.init.apply( this, arguments );
|
||||||
|
} else {
|
||||||
|
$.error( 'Method ' + method + ' does not exist on jQuery.jqBootstrapValidation' );
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqBootstrapValidation = function (options) {
|
||||||
|
$(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
})( jQuery );
|
4
css/scroll-behaviour.css
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
html{
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
}
|
10240
css/styles.css
Normal file
580
index.php
Normal file
@ -0,0 +1,580 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<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>Snexo - Kent Clearance Solution</title>
|
||||||
|
<!-- Favicon-->
|
||||||
|
<link rel="icon" type="image/x-icon" href="assets/img/favicon.ico" />
|
||||||
|
<!-- Font Awesome icons (free version)-->
|
||||||
|
<script src="https://use.fontawesome.com/releases/v5.15.1/js/all.js" crossorigin="anonymous"></script>
|
||||||
|
<!-- Google fonts-->
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,700" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic" rel="stylesheet" type="text/css" />
|
||||||
|
<!-- Core theme CSS (includes Bootstrap)-->
|
||||||
|
<link href="css/styles.css" rel="stylesheet" />
|
||||||
|
<!--<link href="css/scroll-behaviour.css" rel="stylesheet" /> -->
|
||||||
|
</head>
|
||||||
|
<body id="page-top">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Navigation-->
|
||||||
|
<nav class="navbar navbar-expand-lg bg-secondary text-uppercase fixed-top" id="mainNav">
|
||||||
|
<div class="container">
|
||||||
|
<a class="navbar-brand js-scroll-trigger" href="#page-top">Snexo</a>
|
||||||
|
<button class="navbar-toggler navbar-toggler-right text-uppercase font-weight-bold bg-primary text-white rounded" 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 ml-auto">
|
||||||
|
<li class="nav-item mx-0 mx-lg-1"><a class="nav-link py-3 px-0 px-lg-3 rounded js-scroll-trigger" href="#about">About</a></li>
|
||||||
|
<li class="nav-item mx-0 mx-lg-1"><a class="nav-link py-3 px-0 px-lg-3 rounded js-scroll-trigger" href="#portfolio">Portfolio</a></li>
|
||||||
|
<li class="nav-item mx-0 mx-lg-1"><a class="nav-link py-3 px-0 px-lg-3 rounded js-scroll-trigger" href="#contact">Contact</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Masthead-->
|
||||||
|
<header class="masthead bg-primary text-white text-center">
|
||||||
|
<div class="container d-flex align-items-center flex-column">
|
||||||
|
<!-- Masthead Avatar Image-->
|
||||||
|
<img class="masthead-avatar mb-5" src="assets/img/placeholder.png" alt="" />
|
||||||
|
<!-- Masthead Heading-->
|
||||||
|
<h1 class="masthead-heading text-uppercase mb-0">Snexo</h1>
|
||||||
|
<!-- Icon Divider-->
|
||||||
|
<div class="divider-custom divider-light">
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
<div class="divider-custom-icon"><i class="fas fa-angle-down"></i></div>
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
</div>
|
||||||
|
<!-- Masthead Subheading-->
|
||||||
|
<p class="masthead-subheading font-weight-light mb-0">We Buy Your Unwanted Items</p>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- About Section-->
|
||||||
|
<section class="page-section mb-0" id="about">
|
||||||
|
<div class="container">
|
||||||
|
<!-- About Section Heading-->
|
||||||
|
<h2 class="page-section-heading text-center text-uppercase">About</h2>
|
||||||
|
<!-- Icon Divider-->
|
||||||
|
<div class="divider-custom">
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
<div class="divider-custom-icon"><i class="fas fa-angle-down"></i></div>
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
</div>
|
||||||
|
<!-- About Section Content-->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-4 ml-auto"><p class="lead">Snexo is a Kent based Clearance Solution specialising in contents evaluation and removal. Once arranged, we will come to you and discuss a fair price in exchange for your unwanted possesions</p></div>
|
||||||
|
<div class="col-lg-4 mr-auto"><p class="lead">Why waste your time calling in removal men, watching the money fly right out of your pocket when you could stand back and let us do all the work? It's a no brainer!</p></div>
|
||||||
|
</div>
|
||||||
|
<!-- About Section Button-->
|
||||||
|
<div class="text-center mt-4">
|
||||||
|
<a class="btn btn-xl btn-outline-dark js-scroll-trigger" href="#contact">
|
||||||
|
|
||||||
|
Contact Us Today
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Portfolio Section-->
|
||||||
|
<section class="page-section bg-primary text-white portfolio" id="portfolio">
|
||||||
|
<div class="container">
|
||||||
|
<!-- Portfolio Section Heading-->
|
||||||
|
<h2 class="page-section-heading text-center text-uppercase text-white mb-0">Portfolio</h2>
|
||||||
|
<!-- Icon Divider-->
|
||||||
|
<div class="divider-custom divider-light">
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
<div class="divider-custom-icon"><i class="fas fa-angle-down"></i></div>
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Grid Items-->
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<!-- Portfolio Item 1-->
|
||||||
|
<div class="col-md-6 col-lg-4 mb-5">
|
||||||
|
<div class="portfolio-item mx-auto" data-toggle="modal" data-target="#portfolioModal1">
|
||||||
|
<div class="portfolio-item-caption d-flex align-items-center justify-content-center h-100 w-100">
|
||||||
|
<div class="portfolio-item-caption-content text-center text-white"><i class="fas fa-plus fa-3x"></i></div>
|
||||||
|
</div>
|
||||||
|
<img class="img-fluid" src="assets/img/placeholder.png" alt="" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Item 2-->
|
||||||
|
<div class="col-md-6 col-lg-4 mb-5">
|
||||||
|
<div class="portfolio-item mx-auto" data-toggle="modal" data-target="#portfolioModal2">
|
||||||
|
<div class="portfolio-item-caption d-flex align-items-center justify-content-center h-100 w-100">
|
||||||
|
<div class="portfolio-item-caption-content text-center text-white"><i class="fas fa-plus fa-3x"></i></div>
|
||||||
|
</div>
|
||||||
|
<img class="img-fluid" src="assets/img/placeholder.png" alt="" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Item 3-->
|
||||||
|
<div class="col-md-6 col-lg-4 mb-5">
|
||||||
|
<div class="portfolio-item mx-auto" data-toggle="modal" data-target="#portfolioModal3">
|
||||||
|
<div class="portfolio-item-caption d-flex align-items-center justify-content-center h-100 w-100">
|
||||||
|
<div class="portfolio-item-caption-content text-center text-white"><i class="fas fa-plus fa-3x"></i></div>
|
||||||
|
</div>
|
||||||
|
<img class="img-fluid" src="assets/img/placeholder.png" alt="" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Item 4-->
|
||||||
|
<div class="col-md-6 col-lg-4 mb-5 mb-lg-0">
|
||||||
|
<div class="portfolio-item mx-auto" data-toggle="modal" data-target="#portfolioModal4">
|
||||||
|
<div class="portfolio-item-caption d-flex align-items-center justify-content-center h-100 w-100">
|
||||||
|
<div class="portfolio-item-caption-content text-center text-white"><i class="fas fa-plus fa-3x"></i></div>
|
||||||
|
</div>
|
||||||
|
<img class="img-fluid" src="assets/img/placeholder.png" alt="" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Item 5-->
|
||||||
|
<div class="col-md-6 col-lg-4 mb-5 mb-md-0">
|
||||||
|
<div class="portfolio-item mx-auto" data-toggle="modal" data-target="#portfolioModal5">
|
||||||
|
<div class="portfolio-item-caption d-flex align-items-center justify-content-center h-100 w-100">
|
||||||
|
<div class="portfolio-item-caption-content text-center text-white"><i class="fas fa-plus fa-3x"></i></div>
|
||||||
|
</div>
|
||||||
|
<img class="img-fluid" src="assets/img/placeholder.png" alt="" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Item 6-->
|
||||||
|
<div class="col-md-6 col-lg-4">
|
||||||
|
<div class="portfolio-item mx-auto" data-toggle="modal" data-target="#portfolioModal6">
|
||||||
|
<div class="portfolio-item-caption d-flex align-items-center justify-content-center h-100 w-100">
|
||||||
|
<div class="portfolio-item-caption-content text-center text-white"><i class="fas fa-plus fa-3x"></i></div>
|
||||||
|
</div>
|
||||||
|
<img class="img-fluid" src="assets/img/placeholder.png" alt="" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Contact Section-->
|
||||||
|
<section class="page-section" id="contact">
|
||||||
|
<div class="container">
|
||||||
|
<!-- Contact Section Heading-->
|
||||||
|
<h2 class="page-section-heading text-center text-uppercase text-secondary mb-0">Contact Me</h2>
|
||||||
|
<!-- Icon Divider-->
|
||||||
|
<div class="divider-custom">
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
<div class="divider-custom-icon"><i class="fas fa-angle-down"></i></div>
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
</div>
|
||||||
|
<!-- Contact Section Form-->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-8 mx-auto">
|
||||||
|
<!-- To configure the contact form email address, go to mail/contact_me.php and update the email address in the PHP file on line 19.-->
|
||||||
|
<form id="contactForm" name="sentMessage" novalidate="novalidate">
|
||||||
|
<div class="control-group">
|
||||||
|
<div class="form-group floating-label-form-group controls mb-0 pb-2">
|
||||||
|
<label>Name</label>
|
||||||
|
<input class="form-control" id="name" type="text" placeholder="Name" required="required" data-validation-required-message="Please enter your name." />
|
||||||
|
<p class="help-block text-danger"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="control-group">
|
||||||
|
<div class="form-group floating-label-form-group controls mb-0 pb-2">
|
||||||
|
<label>Email Address</label>
|
||||||
|
<input class="form-control" id="email" type="email" placeholder="Email Address" required="required" data-validation-required-message="Please enter your email address." />
|
||||||
|
<p class="help-block text-danger"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="control-group">
|
||||||
|
<div class="form-group floating-label-form-group controls mb-0 pb-2">
|
||||||
|
<label>Phone Number</label>
|
||||||
|
<input class="form-control" id="phone" type="tel" placeholder="Phone Number" required="required" data-validation-required-message="Please enter your phone number." />
|
||||||
|
<p class="help-block text-danger"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="control-group">
|
||||||
|
<div class="form-group floating-label-form-group controls mb-0 pb-2">
|
||||||
|
<label>Message</label>
|
||||||
|
<textarea class="form-control" id="message" rows="5" placeholder="Message" required="required" data-validation-required-message="Please enter a message."></textarea>
|
||||||
|
<p class="help-block text-danger"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div id="success"></div>
|
||||||
|
<div class="form-group"><button class="btn btn-primary btn-xl" id="sendMessageButton" type="submit">Send</button></div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Footer-->
|
||||||
|
<footer class="footer text-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<!-- Footer Location-->
|
||||||
|
<div class="col-lg-4 mb-5 mb-lg-0">
|
||||||
|
<h4 class="text-uppercase mb-4">Location</h4>
|
||||||
|
<p class="lead mb-0">
|
||||||
|
Chris Martin
|
||||||
|
<br />
|
||||||
|
Ashford, Kent
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<!-- Footer Social Icons-->
|
||||||
|
<div class="col-lg-4 mb-5 mb-lg-0">
|
||||||
|
<h4 class="text-uppercase mb-4">Around the Web</h4>
|
||||||
|
<a class="btn btn-outline-light btn-social mx-1" href="#!"><i class="fab fa-fw fa-facebook-f"></i></a>
|
||||||
|
<a class="btn btn-outline-light btn-social mx-1" href="#!"><i class="fab fa-fw fa-twitter"></i></a>
|
||||||
|
<a class="btn btn-outline-light btn-social mx-1" href="#!"><i class="fab fa-fw fa-linkedin-in"></i></a>
|
||||||
|
<a class="btn btn-outline-light btn-social mx-1" href="#!"><i class="fab fa-fw fa-instagram"></i></a>
|
||||||
|
</div>
|
||||||
|
<!-- Footer About Text-->
|
||||||
|
<div class="col-lg-4">
|
||||||
|
<h4 class="text-uppercase mb-4">Thanks for Visiting</h4>
|
||||||
|
<p class="lead mb-0">
|
||||||
|
Be sure to get in touch for your free evaluation!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
<!-- Copyright Section-->
|
||||||
|
<div class="copyright py-4 text-center text-white">
|
||||||
|
<div class="container"><small>Copyright © Snexo <?php echo date("Y"); ?></small></div>
|
||||||
|
</div>
|
||||||
|
<!-- Scroll to Top Button (Only visible on small and extra-small screen sizes)-->
|
||||||
|
<div class="scroll-to-top d-lg-none position-fixed">
|
||||||
|
<a class="js-scroll-trigger d-block text-center text-white rounded" href="#page-top"><i class="fa fa-chevron-up"></i></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Portfolio Modals-->
|
||||||
|
<!-- Portfolio Modal 1-->
|
||||||
|
<div class="portfolio-modal modal fade" id="portfolioModal1" tabindex="-1" role="dialog" aria-labelledby="portfolioModal1Label" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-xl" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true"><i class="fas fa-times"></i></span>
|
||||||
|
</button>
|
||||||
|
<div class="modal-body text-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-8">
|
||||||
|
<!-- Portfolio Modal - Title-->
|
||||||
|
<h2 class="portfolio-modal-title text-secondary text-uppercase mb-0" id="portfolioModal1Label">1</h2>
|
||||||
|
<!-- Icon Divider-->
|
||||||
|
<div class="divider-custom">
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
<div class="divider-custom-icon"><i class="fas fa-angle-down"></i></div>
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal - Image-->
|
||||||
|
<img class="img-fluid rounded mb-5" src="assets/img/placeholder.png" alt="" />
|
||||||
|
<!-- Portfolio Modal - Text-->
|
||||||
|
<p class="mb-5">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia neque assumenda ipsam nihil, molestias magnam, recusandae quos quis inventore quisquam velit asperiores, vitae? Reprehenderit soluta, eos quod consequuntur itaque. Nam.</p>
|
||||||
|
<button class="btn btn-primary" data-dismiss="modal">
|
||||||
|
<i class="fas fa-times fa-fw"></i>
|
||||||
|
Close Window
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal 2-->
|
||||||
|
<div class="portfolio-modal modal fade" id="portfolioModal2" tabindex="-1" role="dialog" aria-labelledby="portfolioModal2Label" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-xl" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true"><i class="fas fa-times"></i></span>
|
||||||
|
</button>
|
||||||
|
<div class="modal-body text-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-8">
|
||||||
|
<!-- Portfolio Modal - Title-->
|
||||||
|
<h2 class="portfolio-modal-title text-secondary text-uppercase mb-0" id="portfolioModal2Label">2</h2>
|
||||||
|
<!-- Icon Divider-->
|
||||||
|
<div class="divider-custom">
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
<div class="divider-custom-icon"><i class="fas fa-angle-down"></i></div>
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal - Image-->
|
||||||
|
<img class="img-fluid rounded mb-5" src="assets/img/placeholder.png" alt="" />
|
||||||
|
<!-- Portfolio Modal - Text-->
|
||||||
|
<p class="mb-5">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia neque assumenda ipsam nihil, molestias magnam, recusandae quos quis inventore quisquam velit asperiores, vitae? Reprehenderit soluta, eos quod consequuntur itaque. Nam.</p>
|
||||||
|
<button class="btn btn-primary" data-dismiss="modal">
|
||||||
|
<i class="fas fa-times fa-fw"></i>
|
||||||
|
Close Window
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal 3-->
|
||||||
|
<div class="portfolio-modal modal fade" id="portfolioModal3" tabindex="-1" role="dialog" aria-labelledby="portfolioModal3Label" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-xl" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true"><i class="fas fa-times"></i></span>
|
||||||
|
</button>
|
||||||
|
<div class="modal-body text-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-8">
|
||||||
|
<!-- Portfolio Modal - Title-->
|
||||||
|
<h2 class="portfolio-modal-title text-secondary text-uppercase mb-0" id="portfolioModal3Label">3</h2>
|
||||||
|
<!-- Icon Divider-->
|
||||||
|
<div class="divider-custom">
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
<div class="divider-custom-icon"><i class="fas fa-angle-down"></i></div>
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal - Image-->
|
||||||
|
<img class="img-fluid rounded mb-5" src="assets/img/placeholder.png" alt="" />
|
||||||
|
<!-- Portfolio Modal - Text-->
|
||||||
|
<p class="mb-5">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia neque assumenda ipsam nihil, molestias magnam, recusandae quos quis inventore quisquam velit asperiores, vitae? Reprehenderit soluta, eos quod consequuntur itaque. Nam.</p>
|
||||||
|
<button class="btn btn-primary" data-dismiss="modal">
|
||||||
|
<i class="fas fa-times fa-fw"></i>
|
||||||
|
Close Window
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal 4-->
|
||||||
|
<div class="portfolio-modal modal fade" id="portfolioModal4" tabindex="-1" role="dialog" aria-labelledby="portfolioModal4Label" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-xl" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true"><i class="fas fa-times"></i></span>
|
||||||
|
</button>
|
||||||
|
<div class="modal-body text-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-8">
|
||||||
|
<!-- Portfolio Modal - Title-->
|
||||||
|
<h2 class="portfolio-modal-title text-secondary text-uppercase mb-0" id="portfolioModal4Label">4</h2>
|
||||||
|
<!-- Icon Divider-->
|
||||||
|
<div class="divider-custom">
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
<div class="divider-custom-icon"><i class="fas fa-angle-down"></i></div>
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal - Image-->
|
||||||
|
<img class="img-fluid rounded mb-5" src="assets/img/placeholder.png" alt="" />
|
||||||
|
<!-- Portfolio Modal - Text-->
|
||||||
|
<p class="mb-5">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia neque assumenda ipsam nihil, molestias magnam, recusandae quos quis inventore quisquam velit asperiores, vitae? Reprehenderit soluta, eos quod consequuntur itaque. Nam.</p>
|
||||||
|
<button class="btn btn-primary" data-dismiss="modal">
|
||||||
|
<i class="fas fa-times fa-fw"></i>
|
||||||
|
Close Window
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal 5-->
|
||||||
|
<div class="portfolio-modal modal fade" id="portfolioModal5" tabindex="-1" role="dialog" aria-labelledby="portfolioModal5Label" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-xl" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true"><i class="fas fa-times"></i></span>
|
||||||
|
</button>
|
||||||
|
<div class="modal-body text-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-8">
|
||||||
|
<!-- Portfolio Modal - Title-->
|
||||||
|
<h2 class="portfolio-modal-title text-secondary text-uppercase mb-0" id="portfolioModal5Label">5</h2>
|
||||||
|
<!-- Icon Divider-->
|
||||||
|
<div class="divider-custom">
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
<div class="divider-custom-icon"><i class="fas fa-angle-down"></i></div>
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal - Image-->
|
||||||
|
<img class="img-fluid rounded mb-5" src="assets/img/placeholder.png" alt="" />
|
||||||
|
<!-- Portfolio Modal - Text-->
|
||||||
|
<p class="mb-5">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia neque assumenda ipsam nihil, molestias magnam, recusandae quos quis inventore quisquam velit asperiores, vitae? Reprehenderit soluta, eos quod consequuntur itaque. Nam.</p>
|
||||||
|
<button class="btn btn-primary" data-dismiss="modal">
|
||||||
|
<i class="fas fa-times fa-fw"></i>
|
||||||
|
Close Window
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal 6-->
|
||||||
|
<div class="portfolio-modal modal fade" id="portfolioModal6" tabindex="-1" role="dialog" aria-labelledby="portfolioModal6Label" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-xl" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true"><i class="fas fa-times"></i></span>
|
||||||
|
</button>
|
||||||
|
<div class="modal-body text-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-8">
|
||||||
|
<!-- Portfolio Modal - Title-->
|
||||||
|
<h2 class="portfolio-modal-title text-secondary text-uppercase mb-0" id="portfolioModal6Label">6</h2>
|
||||||
|
<!-- Icon Divider-->
|
||||||
|
<div class="divider-custom">
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
<div class="divider-custom-icon"><i class="fas fa-angle-down"></i></div>
|
||||||
|
<div class="divider-custom-line"></div>
|
||||||
|
</div>
|
||||||
|
<!-- Portfolio Modal - Image-->
|
||||||
|
<img class="img-fluid rounded mb-5" src="assets/img/placeholder.png" alt="" />
|
||||||
|
<!-- Portfolio Modal - Text-->
|
||||||
|
<p class="mb-5">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia neque assumenda ipsam nihil, molestias magnam, recusandae quos quis inventore quisquam velit asperiores, vitae? Reprehenderit soluta, eos quod consequuntur itaque. Nam.</p>
|
||||||
|
<button class="btn btn-primary" data-dismiss="modal">
|
||||||
|
<i class="fas fa-times fa-fw"></i>
|
||||||
|
Close Window
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Bootstrap core JS-->
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<!-- Third party plugin JS-->
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js"></script>
|
||||||
|
<!-- Contact form JS-->
|
||||||
|
<script src="assets/mail/jqBootstrapValidation.js"></script>
|
||||||
|
<script src="assets/mail/contact_me.js"></script>
|
||||||
|
<!-- Core theme JS-->
|
||||||
|
<script src="js/scripts.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
69
js/scripts.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*!
|
||||||
|
* Start Bootstrap - Freelancer v6.0.5 (https://startbootstrap.com/theme/freelancer)
|
||||||
|
* Copyright 2013-2020 Start Bootstrap
|
||||||
|
* Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-freelancer/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
(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 - 71)
|
||||||
|
}, 1000, "easeInOutExpo");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Scroll to top button appear
|
||||||
|
$(document).scroll(function() {
|
||||||
|
var scrollDistance = $(this).scrollTop();
|
||||||
|
if (scrollDistance > 100) {
|
||||||
|
$('.scroll-to-top').fadeIn();
|
||||||
|
} else {
|
||||||
|
$('.scroll-to-top').fadeOut();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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: 80
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
// Floating label headings for the contact form
|
||||||
|
$(function() {
|
||||||
|
$("body").on("input propertychange", ".floating-label-form-group", function(e) {
|
||||||
|
$(this).toggleClass("floating-label-form-group-with-value", !!$(e.target).val());
|
||||||
|
}).on("focus", ".floating-label-form-group", function() {
|
||||||
|
$(this).addClass("floating-label-form-group-with-focus");
|
||||||
|
}).on("blur", ".floating-label-form-group", function() {
|
||||||
|
$(this).removeClass("floating-label-form-group-with-focus");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
})(jQuery); // End of use strict
|
||||||
|
|