feat: implement initial home page with new frontend assets and Livewire components
This commit is contained in:
parent
3760eeb00d
commit
492a56504d
15
app/Livewire/Home/Index.php
Normal file
15
app/Livewire/Home/Index.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Home;
|
||||
|
||||
use Livewire\Attributes\Title;
|
||||
use Livewire\Component;
|
||||
|
||||
#[Title('Beranda')]
|
||||
class Index extends Component
|
||||
{
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.home.index');
|
||||
}
|
||||
}
|
||||
26
app/View/Components/Partials/Footer.php
Normal file
26
app/View/Components/Partials/Footer.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\View\Components\Partials;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\View\Component;
|
||||
|
||||
class Footer extends Component
|
||||
{
|
||||
/**
|
||||
* Create a new component instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the view / contents that represent the component.
|
||||
*/
|
||||
public function render(): View|Closure|string
|
||||
{
|
||||
return view('components.partials.footer');
|
||||
}
|
||||
}
|
||||
26
app/View/Components/Partials/Header.php
Normal file
26
app/View/Components/Partials/Header.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\View\Components\Partials;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\View\Component;
|
||||
|
||||
class Header extends Component
|
||||
{
|
||||
/**
|
||||
* Create a new component instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the view / contents that represent the component.
|
||||
*/
|
||||
public function render(): View|Closure|string
|
||||
{
|
||||
return view('components.partials.header');
|
||||
}
|
||||
}
|
||||
531
package-lock.json
generated
531
package-lock.json
generated
@ -5,13 +5,16 @@
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"@lottiefiles/dotlottie-react": "^0.17.10"
|
||||
"@lottiefiles/dotlottie-react": "^0.17.10",
|
||||
"@popperjs/core": "^2.11.8",
|
||||
"bootstrap": "^5.3.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/vite": "^4.1.18",
|
||||
"axios": "^1.11.0",
|
||||
"concurrently": "^9.0.1",
|
||||
"laravel-vite-plugin": "^2.0.0",
|
||||
"sass": "^1.97.1",
|
||||
"tailwindcss": "^4.1.18",
|
||||
"vite": "^7.0.7"
|
||||
}
|
||||
@ -526,6 +529,340 @@
|
||||
"integrity": "sha512-YC4pmScrV0R3rd11gU5xHrjeNczlCic69zlnMH/buDIzYxIbpR88oPUhGtKgu5ln7EJchoLpeRJbA3uLCzSeTA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@parcel/watcher": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
|
||||
"integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"detect-libc": "^1.0.3",
|
||||
"is-glob": "^4.0.3",
|
||||
"micromatch": "^4.0.5",
|
||||
"node-addon-api": "^7.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@parcel/watcher-android-arm64": "2.5.1",
|
||||
"@parcel/watcher-darwin-arm64": "2.5.1",
|
||||
"@parcel/watcher-darwin-x64": "2.5.1",
|
||||
"@parcel/watcher-freebsd-x64": "2.5.1",
|
||||
"@parcel/watcher-linux-arm-glibc": "2.5.1",
|
||||
"@parcel/watcher-linux-arm-musl": "2.5.1",
|
||||
"@parcel/watcher-linux-arm64-glibc": "2.5.1",
|
||||
"@parcel/watcher-linux-arm64-musl": "2.5.1",
|
||||
"@parcel/watcher-linux-x64-glibc": "2.5.1",
|
||||
"@parcel/watcher-linux-x64-musl": "2.5.1",
|
||||
"@parcel/watcher-win32-arm64": "2.5.1",
|
||||
"@parcel/watcher-win32-ia32": "2.5.1",
|
||||
"@parcel/watcher-win32-x64": "2.5.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-android-arm64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
|
||||
"integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-darwin-arm64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
|
||||
"integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-darwin-x64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
|
||||
"integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-freebsd-x64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
|
||||
"integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm-glibc": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
|
||||
"integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm-musl": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
|
||||
"integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm64-glibc": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
|
||||
"integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm64-musl": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
|
||||
"integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-x64-glibc": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
|
||||
"integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-x64-musl": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
|
||||
"integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-win32-arm64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
|
||||
"integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-win32-ia32": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
|
||||
"integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-win32-x64": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
|
||||
"integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher/node_modules/detect-libc": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
|
||||
"integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"bin": {
|
||||
"detect-libc": "bin/detect-libc.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/@popperjs/core": {
|
||||
"version": "2.11.8",
|
||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
|
||||
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/popperjs"
|
||||
}
|
||||
},
|
||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||
"version": "4.54.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz",
|
||||
@ -1158,6 +1495,39 @@
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/bootstrap": {
|
||||
"version": "5.3.8",
|
||||
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz",
|
||||
"integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/twbs"
|
||||
},
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/bootstrap"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@popperjs/core": "^2.11.8"
|
||||
}
|
||||
},
|
||||
"node_modules/braces": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"fill-range": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/call-bind-apply-helpers": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
|
||||
@ -1202,6 +1572,22 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/chokidar": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
|
||||
"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"readdirp": "^4.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 14.16.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/cliui": {
|
||||
"version": "8.0.1",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
|
||||
@ -1450,6 +1836,20 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/fill-range": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/follow-redirects": {
|
||||
"version": "1.15.11",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
|
||||
@ -1634,6 +2034,24 @@
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/immutable": {
|
||||
"version": "5.1.4",
|
||||
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz",
|
||||
"integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/is-extglob": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
||||
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/is-fullwidth-code-point": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
||||
@ -1644,6 +2062,31 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/is-glob": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
|
||||
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"is-extglob": "^2.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/is-number": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/jiti": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
|
||||
@ -1955,6 +2398,35 @@
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/micromatch": {
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
||||
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"braces": "^3.0.3",
|
||||
"picomatch": "^2.3.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.6"
|
||||
}
|
||||
},
|
||||
"node_modules/micromatch/node_modules/picomatch": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
|
||||
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=8.6"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
@ -1997,6 +2469,14 @@
|
||||
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/node-addon-api": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
|
||||
"integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
|
||||
@ -2063,6 +2543,20 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/readdirp": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
|
||||
"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 14.18.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "individual",
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/require-directory": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
||||
@ -2125,6 +2619,27 @@
|
||||
"tslib": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sass": {
|
||||
"version": "1.97.1",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.97.1.tgz",
|
||||
"integrity": "sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"chokidar": "^4.0.0",
|
||||
"immutable": "^5.0.2",
|
||||
"source-map-js": ">=0.6.2 <2.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"sass": "sass.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@parcel/watcher": "^2.4.1"
|
||||
}
|
||||
},
|
||||
"node_modules/shell-quote": {
|
||||
"version": "1.8.3",
|
||||
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
|
||||
@ -2230,6 +2745,20 @@
|
||||
"url": "https://github.com/sponsors/SuperchupuDev"
|
||||
}
|
||||
},
|
||||
"node_modules/to-regex-range": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"is-number": "^7.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tree-kill": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
|
||||
|
||||
@ -11,10 +11,13 @@
|
||||
"axios": "^1.11.0",
|
||||
"concurrently": "^9.0.1",
|
||||
"laravel-vite-plugin": "^2.0.0",
|
||||
"sass": "^1.97.1",
|
||||
"tailwindcss": "^4.1.18",
|
||||
"vite": "^7.0.7"
|
||||
},
|
||||
"dependencies": {
|
||||
"@lottiefiles/dotlottie-react": "^0.17.10"
|
||||
"@lottiefiles/dotlottie-react": "^0.17.10",
|
||||
"@popperjs/core": "^2.11.8",
|
||||
"bootstrap": "^5.3.8"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
201
public/css/home/it-business.css
Normal file
201
public/css/home/it-business.css
Normal file
@ -0,0 +1,201 @@
|
||||
/* font */
|
||||
@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@200;300;400;500;600;700;800&display=swap');
|
||||
/* variable */
|
||||
:root {
|
||||
--base-color: #074eb9;
|
||||
--dark-gray:#252840;
|
||||
--black:#05060a;
|
||||
--medium-gray:#7d8087;
|
||||
--very-light-gray: #f0f2f8;
|
||||
--primary-font: 'Plus Jakarta Sans', sans-serif;
|
||||
}
|
||||
/* reset */
|
||||
body{
|
||||
line-height: 29px;
|
||||
}
|
||||
/* header */
|
||||
header .navbar-brand img {
|
||||
max-height: 32px;
|
||||
}
|
||||
.navbar .navbar-nav .nav-link {
|
||||
font-size: 17px;
|
||||
}
|
||||
header .btn.btn-rounded.btn-large {
|
||||
padding:10px 26px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.sticky .header-transparent .header-button .btn {
|
||||
color: var(--dark-gray);
|
||||
border-color: var(--extra-medium-gray);
|
||||
}
|
||||
.sticky .header-transparent .header-button .btn:hover {
|
||||
border-color: var(--dark-gray);
|
||||
color: var(--white);
|
||||
background: var(--dark-gray);
|
||||
}
|
||||
header.sticky.sticky-active [data-header-hover="light"] .widget-text i {
|
||||
color: var(--white);
|
||||
}
|
||||
/* accordion style 02 */
|
||||
.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu {
|
||||
background-color: var(--dark-gray);
|
||||
}
|
||||
.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu li a {
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
color: var(--white);
|
||||
}
|
||||
.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu li:hover a,
|
||||
.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu li.active a{
|
||||
opacity: .5;
|
||||
}
|
||||
/* btn */
|
||||
[class*=btn-transparent], [class*=" btn-transparent"] {
|
||||
font-weight: 500;
|
||||
}
|
||||
.btn {
|
||||
text-transform: none;
|
||||
font-family: var(--primary-font);
|
||||
}
|
||||
.btn.btn-switch-text.btn-extra-large > span {
|
||||
padding: 19px 40px;
|
||||
}
|
||||
.btn-gradient-purple-pink {
|
||||
background-image: linear-gradient(to right, #0b58cb, #e94037, #0b58cb);
|
||||
background-size: 200% auto;
|
||||
color: var(--white);
|
||||
}
|
||||
/* bg gradient color */
|
||||
.bg-gradient-dark-gray-transparent {
|
||||
background: -webkit-linear-gradient(right, rgba(24, 25, 28, .5), rgba(255, 255, 255, 0.0));
|
||||
background: linear-gradient(to right, rgba(24, 25, 28, .5), rgba(255, 255, 255, 0.0));
|
||||
}
|
||||
.bg-gradient-very-light-gray-transparent {
|
||||
background: -webkit-linear-gradient(right, rgba(240, 244, 253, 1.0), rgba(255, 255, 255, 0.0));
|
||||
background: linear-gradient(to right, rgba(240, 244, 253, 1.0), rgba(255, 255, 255, 0.0));
|
||||
}
|
||||
.bg-gradient-flamingo-red-transparent {
|
||||
background: -webkit-linear-gradient(right, rgba(243, 69, 59, 1.0), rgba(255, 255, 255, 0.0));
|
||||
background: linear-gradient(to right, rgba(243, 69, 59, 1.0) 10%, rgba(255, 255, 255, 0.0) 95%);
|
||||
}
|
||||
.bg-gradient-base-color-transparent {
|
||||
background: -webkit-linear-gradient(right, rgba(15, 89, 201, 1.0), rgba(255, 255, 255, 0.0));
|
||||
background: linear-gradient(to right, rgba(15, 89, 201, 1.0) 10%, rgba(255, 255, 255, 0.0) 95%);
|
||||
}
|
||||
.bg-gradient-light-gray-transparent {
|
||||
background: -webkit-linear-gradient(right, rgba(222, 230, 244, 1.0), rgba(255, 255, 255, 0.0));
|
||||
background: linear-gradient(to right, rgba(222, 230, 244, 1.0), rgba(255, 255, 255, 0.0));
|
||||
}
|
||||
.bg-midnight-blue {
|
||||
background-color: #1e2033;
|
||||
}
|
||||
/* text */
|
||||
.text-flamingo {
|
||||
color: #e55b53;
|
||||
}
|
||||
.text-gradient-orange-sky-blue {
|
||||
background-image: linear-gradient(to right, #5e70f3, #6170f1, #8074dc, #b87bb6, #ec8192);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
/* portfolio filter */
|
||||
.portfolio-filter li {
|
||||
padding: 0 18px;
|
||||
line-height: 24px;
|
||||
}
|
||||
/* blog */
|
||||
.categories-btn {
|
||||
font-size: 11px;
|
||||
}
|
||||
/* page title */
|
||||
.page-title-extra-large h1 {
|
||||
font-size: 4rem;
|
||||
line-height: 4rem;
|
||||
}
|
||||
.page-title-extra-large h2 {
|
||||
font-size: 17px;
|
||||
line-height: 28px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.process-step-style-05 .progress-step-separator {
|
||||
bottom: -10px;
|
||||
height: 100%;
|
||||
z-index: -1;
|
||||
}
|
||||
/* height */
|
||||
.h-72px {
|
||||
height: 72px !important;
|
||||
}
|
||||
#map {
|
||||
height: 650px;
|
||||
border-radius: 6px 0 0 6px;
|
||||
}
|
||||
/* margin top */
|
||||
.mt-minus-50px {
|
||||
margin-top: -50px;
|
||||
}
|
||||
/* line-height */
|
||||
.lh-200 {
|
||||
line-height: 12.5rem;
|
||||
}
|
||||
/* bottom */
|
||||
.bottom-auto {
|
||||
bottom: auto;
|
||||
}
|
||||
/* footer */
|
||||
footer .footer-logo img {
|
||||
max-height: 35px;
|
||||
}
|
||||
footer ul li {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.footer-light a:hover, .footer-navbar li a:hover {
|
||||
color: var(--dark-gray);
|
||||
}
|
||||
@media (max-width: 1299px) {
|
||||
.navbar .navbar-nav .nav-link {
|
||||
font-size: 16px;
|
||||
}
|
||||
header .btn.btn-rounded.btn-large {
|
||||
padding: 10px 15px;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 1199px) {
|
||||
.navbar .navbar-nav .nav-link {
|
||||
font-size: 15px;
|
||||
}
|
||||
header .btn.btn-rounded.btn-large {
|
||||
padding: 10px 10px;
|
||||
font-size: 11px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 991px) {
|
||||
.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu {
|
||||
width: calc(100% + 30px) !important;
|
||||
margin-left: -15px;
|
||||
padding: 10px 45px;
|
||||
margin-bottom: 0;
|
||||
margin-right: -15px;
|
||||
}
|
||||
.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu li:last-child a {
|
||||
padding-bottom: 17px;
|
||||
}
|
||||
[data-mobile-nav-style=full-screen-menu] .navbar-full-screen-menu-inner .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu li a i {
|
||||
font-size: 19px;
|
||||
}
|
||||
header .btn.btn-rounded.btn-large {
|
||||
color: var(--dark-gray);
|
||||
border-color: var(--extra-medium-gray);
|
||||
padding: 10px 15px;
|
||||
font-size: 13px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.portfolio-filter li {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
21629
public/css/home/responsive.css
Normal file
21629
public/css/home/responsive.css
Normal file
File diff suppressed because it is too large
Load Diff
19223
public/css/home/style.css
Normal file
19223
public/css/home/style.css
Normal file
File diff suppressed because it is too large
Load Diff
15652
public/css/home/vendors.css
Normal file
15652
public/css/home/vendors.css
Normal file
File diff suppressed because it is too large
Load Diff
8
public/js/home/jquery.js
vendored
Normal file
8
public/js/home/jquery.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3722
public/js/home/main.js
Normal file
3722
public/js/home/main.js
Normal file
File diff suppressed because one or more lines are too long
36213
public/js/home/vendors.js
Normal file
36213
public/js/home/vendors.js
Normal file
File diff suppressed because one or more lines are too long
8
public/js/home/vendors/anime.min.js
vendored
Normal file
8
public/js/home/vendors/anime.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
481
public/js/home/vendors/atropos.js
vendored
Normal file
481
public/js/home/vendors/atropos.js
vendored
Normal file
@ -0,0 +1,481 @@
|
||||
/*!
|
||||
Atropos
|
||||
Version: 2.0.2
|
||||
Plugin URL: https://atroposjs.com
|
||||
License: Copyright 2021-2024 | Released under the MIT License
|
||||
!*/
|
||||
|
||||
var Atropos = (function () {
|
||||
'use strict';
|
||||
|
||||
function _extends() {
|
||||
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
var source = arguments[i];
|
||||
for (var key in source) {
|
||||
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
||||
target[key] = source[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
return target;
|
||||
};
|
||||
return _extends.apply(this, arguments);
|
||||
}
|
||||
|
||||
/* eslint-disable no-restricted-globals */
|
||||
var $ = function $(el, sel) {
|
||||
return el.querySelector(sel);
|
||||
};
|
||||
var $$ = function $$(el, sel) {
|
||||
return el.querySelectorAll(sel);
|
||||
};
|
||||
var removeUndefinedProps = function removeUndefinedProps(obj) {
|
||||
if (obj === void 0) {
|
||||
obj = {};
|
||||
}
|
||||
var result = {};
|
||||
Object.keys(obj).forEach(function (key) {
|
||||
if (typeof obj[key] !== 'undefined') result[key] = obj[key];
|
||||
});
|
||||
return result;
|
||||
};
|
||||
var defaults = {
|
||||
alwaysActive: false,
|
||||
activeOffset: 50,
|
||||
shadowOffset: 50,
|
||||
shadowScale: 1,
|
||||
duration: 300,
|
||||
rotate: true,
|
||||
rotateTouch: true,
|
||||
rotateXMax: 15,
|
||||
rotateYMax: 15,
|
||||
rotateXInvert: false,
|
||||
rotateYInvert: false,
|
||||
stretchX: 0,
|
||||
stretchY: 0,
|
||||
stretchZ: 0,
|
||||
commonOrigin: true,
|
||||
shadow: true,
|
||||
highlight: true
|
||||
};
|
||||
function Atropos(originalParams) {
|
||||
if (originalParams === void 0) {
|
||||
originalParams = {};
|
||||
}
|
||||
var _originalParams = originalParams,
|
||||
el = _originalParams.el,
|
||||
eventsEl = _originalParams.eventsEl;
|
||||
var _originalParams2 = originalParams,
|
||||
isComponent = _originalParams2.isComponent;
|
||||
var childrenRootEl;
|
||||
var self = {
|
||||
__atropos__: true,
|
||||
params: _extends({}, defaults, {
|
||||
onEnter: null,
|
||||
onLeave: null,
|
||||
onRotate: null
|
||||
}, removeUndefinedProps(originalParams || {})),
|
||||
destroyed: false,
|
||||
isActive: false
|
||||
};
|
||||
var params = self.params;
|
||||
var rotateEl;
|
||||
var scaleEl;
|
||||
var innerEl;
|
||||
var elBoundingClientRect;
|
||||
var eventsElBoundingClientRect;
|
||||
var shadowEl;
|
||||
var highlightEl;
|
||||
var isScrolling;
|
||||
var clientXStart;
|
||||
var clientYStart;
|
||||
var queue = [];
|
||||
var queueFrameId;
|
||||
var purgeQueue = function purgeQueue() {
|
||||
queueFrameId = requestAnimationFrame(function () {
|
||||
queue.forEach(function (data) {
|
||||
if (typeof data === 'function') {
|
||||
data();
|
||||
} else {
|
||||
var element = data.element,
|
||||
prop = data.prop,
|
||||
value = data.value;
|
||||
element.style[prop] = value;
|
||||
}
|
||||
});
|
||||
queue.splice(0, queue.length);
|
||||
purgeQueue();
|
||||
});
|
||||
};
|
||||
purgeQueue();
|
||||
var $setDuration = function $setDuration(element, value) {
|
||||
queue.push({
|
||||
element: element,
|
||||
prop: 'transitionDuration',
|
||||
value: value
|
||||
});
|
||||
};
|
||||
var $setEasing = function $setEasing(element, value) {
|
||||
queue.push({
|
||||
element: element,
|
||||
prop: 'transitionTimingFunction',
|
||||
value: value
|
||||
});
|
||||
};
|
||||
var $setTransform = function $setTransform(element, value) {
|
||||
queue.push({
|
||||
element: element,
|
||||
prop: 'transform',
|
||||
value: value
|
||||
});
|
||||
};
|
||||
var $setOpacity = function $setOpacity(element, value) {
|
||||
queue.push({
|
||||
element: element,
|
||||
prop: 'opacity',
|
||||
value: value
|
||||
});
|
||||
};
|
||||
var $setOrigin = function $setOrigin(element, value) {
|
||||
queue.push({
|
||||
element: element,
|
||||
prop: 'transformOrigin',
|
||||
value: value
|
||||
});
|
||||
};
|
||||
var $on = function $on(element, event, handler, props) {
|
||||
return element.addEventListener(event, handler, props);
|
||||
};
|
||||
var $off = function $off(element, event, handler, props) {
|
||||
return element.removeEventListener(event, handler, props);
|
||||
};
|
||||
var createShadow = function createShadow() {
|
||||
var created;
|
||||
shadowEl = $(el, '.atropos-shadow');
|
||||
if (!shadowEl) {
|
||||
shadowEl = document.createElement('span');
|
||||
shadowEl.classList.add('atropos-shadow');
|
||||
created = true;
|
||||
}
|
||||
$setTransform(shadowEl, "translate3d(0,0,-" + params.shadowOffset + "px) scale(" + params.shadowScale + ")");
|
||||
if (created) {
|
||||
rotateEl.appendChild(shadowEl);
|
||||
}
|
||||
};
|
||||
var createHighlight = function createHighlight() {
|
||||
var created;
|
||||
highlightEl = $(el, '.atropos-highlight');
|
||||
if (!highlightEl) {
|
||||
highlightEl = document.createElement('span');
|
||||
highlightEl.classList.add('atropos-highlight');
|
||||
created = true;
|
||||
}
|
||||
$setTransform(highlightEl, "translate3d(0,0,0)");
|
||||
if (created) {
|
||||
innerEl.appendChild(highlightEl);
|
||||
}
|
||||
};
|
||||
var setChildrenOffset = function setChildrenOffset(_ref) {
|
||||
var _ref$rotateXPercentag = _ref.rotateXPercentage,
|
||||
rotateXPercentage = _ref$rotateXPercentag === void 0 ? 0 : _ref$rotateXPercentag,
|
||||
_ref$rotateYPercentag = _ref.rotateYPercentage,
|
||||
rotateYPercentage = _ref$rotateYPercentag === void 0 ? 0 : _ref$rotateYPercentag,
|
||||
duration = _ref.duration,
|
||||
opacityOnly = _ref.opacityOnly,
|
||||
easeOut = _ref.easeOut;
|
||||
var getOpacity = function getOpacity(element) {
|
||||
if (element.dataset.atroposOpacity && typeof element.dataset.atroposOpacity === 'string') {
|
||||
return element.dataset.atroposOpacity.split(';').map(function (v) {
|
||||
return parseFloat(v);
|
||||
});
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
$$(childrenRootEl, '[data-atropos-offset], [data-atropos-opacity]').forEach(function (childEl) {
|
||||
$setDuration(childEl, duration);
|
||||
$setEasing(childEl, easeOut ? 'ease-out' : '');
|
||||
var elementOpacity = getOpacity(childEl);
|
||||
if (rotateXPercentage === 0 && rotateYPercentage === 0) {
|
||||
if (!opacityOnly) $setTransform(childEl, "translate3d(0, 0, 0)");
|
||||
if (elementOpacity) $setOpacity(childEl, elementOpacity[0]);
|
||||
} else {
|
||||
var childElOffset = parseFloat(childEl.dataset.atroposOffset) / 100;
|
||||
if (!Number.isNaN(childElOffset) && !opacityOnly) {
|
||||
$setTransform(childEl, "translate3d(" + -rotateYPercentage * -childElOffset + "%, " + rotateXPercentage * -childElOffset + "%, 0)");
|
||||
}
|
||||
if (elementOpacity) {
|
||||
var min = elementOpacity[0],
|
||||
max = elementOpacity[1];
|
||||
var rotatePercentage = Math.max(Math.abs(rotateXPercentage), Math.abs(rotateYPercentage));
|
||||
$setOpacity(childEl, min + (max - min) * rotatePercentage / 100);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
var setElements = function setElements(clientX, clientY) {
|
||||
var isMultiple = el !== eventsEl;
|
||||
if (!elBoundingClientRect) {
|
||||
elBoundingClientRect = el.getBoundingClientRect();
|
||||
}
|
||||
if (isMultiple && !eventsElBoundingClientRect) {
|
||||
eventsElBoundingClientRect = eventsEl.getBoundingClientRect();
|
||||
}
|
||||
if (typeof clientX === 'undefined' && typeof clientY === 'undefined') {
|
||||
var rect = isMultiple ? eventsElBoundingClientRect : elBoundingClientRect;
|
||||
clientX = rect.left + rect.width / 2;
|
||||
clientY = rect.top + rect.height / 2;
|
||||
}
|
||||
var rotateX = 0;
|
||||
var rotateY = 0;
|
||||
var _elBoundingClientRect = elBoundingClientRect,
|
||||
top = _elBoundingClientRect.top,
|
||||
left = _elBoundingClientRect.left,
|
||||
width = _elBoundingClientRect.width,
|
||||
height = _elBoundingClientRect.height;
|
||||
var transformOrigin;
|
||||
if (!isMultiple) {
|
||||
var centerX = width / 2;
|
||||
var centerY = height / 2;
|
||||
var coordX = clientX - left;
|
||||
var coordY = clientY - top;
|
||||
rotateY = params.rotateYMax * (coordX - centerX) / (width / 2) * -1;
|
||||
rotateX = params.rotateXMax * (coordY - centerY) / (height / 2);
|
||||
} else {
|
||||
var _eventsElBoundingClie = eventsElBoundingClientRect,
|
||||
parentTop = _eventsElBoundingClie.top,
|
||||
parentLeft = _eventsElBoundingClie.left,
|
||||
parentWidth = _eventsElBoundingClie.width,
|
||||
parentHeight = _eventsElBoundingClie.height;
|
||||
var offsetLeft = left - parentLeft;
|
||||
var offsetTop = top - parentTop;
|
||||
var _centerX = width / 2 + offsetLeft;
|
||||
var _centerY = height / 2 + offsetTop;
|
||||
var _coordX = clientX - parentLeft;
|
||||
var _coordY = clientY - parentTop;
|
||||
rotateY = params.rotateYMax * (_coordX - _centerX) / (parentWidth - width / 2) * -1;
|
||||
rotateX = params.rotateXMax * (_coordY - _centerY) / (parentHeight - height / 2);
|
||||
transformOrigin = clientX - left + "px " + (clientY - top) + "px";
|
||||
}
|
||||
rotateX = Math.min(Math.max(-rotateX, -params.rotateXMax), params.rotateXMax);
|
||||
if (params.rotateXInvert) rotateX = -rotateX;
|
||||
rotateY = Math.min(Math.max(-rotateY, -params.rotateYMax), params.rotateYMax);
|
||||
if (params.rotateYInvert) rotateY = -rotateY;
|
||||
var rotateXPercentage = rotateX / params.rotateXMax * 100;
|
||||
var rotateYPercentage = rotateY / params.rotateYMax * 100;
|
||||
var stretchX = (isMultiple ? rotateYPercentage / 100 * params.stretchX : 0) * (params.rotateYInvert ? -1 : 1);
|
||||
var stretchY = (isMultiple ? rotateXPercentage / 100 * params.stretchY : 0) * (params.rotateXInvert ? -1 : 1);
|
||||
var stretchZ = isMultiple ? Math.max(Math.abs(rotateXPercentage), Math.abs(rotateYPercentage)) / 100 * params.stretchZ : 0;
|
||||
$setTransform(rotateEl, "translate3d(" + stretchX + "%, " + -stretchY + "%, " + -stretchZ + "px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)");
|
||||
if (transformOrigin && params.commonOrigin) {
|
||||
$setOrigin(rotateEl, transformOrigin);
|
||||
}
|
||||
if (highlightEl) {
|
||||
$setDuration(highlightEl, params.duration + "ms");
|
||||
$setEasing(highlightEl, 'ease-out');
|
||||
$setTransform(highlightEl, "translate3d(" + -rotateYPercentage * 0.25 + "%, " + rotateXPercentage * 0.25 + "%, 0)");
|
||||
$setOpacity(highlightEl, Math.max(Math.abs(rotateXPercentage), Math.abs(rotateYPercentage)) / 100);
|
||||
}
|
||||
setChildrenOffset({
|
||||
rotateXPercentage: rotateXPercentage,
|
||||
rotateYPercentage: rotateYPercentage,
|
||||
duration: params.duration + "ms",
|
||||
easeOut: true
|
||||
});
|
||||
if (typeof params.onRotate === 'function') params.onRotate(rotateX, rotateY);
|
||||
};
|
||||
var activate = function activate() {
|
||||
queue.push(function () {
|
||||
return el.classList.add('atropos-active');
|
||||
});
|
||||
$setDuration(rotateEl, params.duration + "ms");
|
||||
$setEasing(rotateEl, 'ease-out');
|
||||
$setTransform(scaleEl, "translate3d(0,0, " + params.activeOffset + "px)");
|
||||
$setDuration(scaleEl, params.duration + "ms");
|
||||
$setEasing(scaleEl, 'ease-out');
|
||||
if (shadowEl) {
|
||||
$setDuration(shadowEl, params.duration + "ms");
|
||||
$setEasing(shadowEl, 'ease-out');
|
||||
}
|
||||
self.isActive = true;
|
||||
};
|
||||
var onPointerEnter = function onPointerEnter(e) {
|
||||
isScrolling = undefined;
|
||||
if (e.type === 'pointerdown' && e.pointerType === 'mouse') return;
|
||||
if (e.type === 'pointerenter' && e.pointerType !== 'mouse') return;
|
||||
if (e.type === 'pointerdown') {
|
||||
e.preventDefault();
|
||||
}
|
||||
clientXStart = e.clientX;
|
||||
clientYStart = e.clientY;
|
||||
if (params.alwaysActive) {
|
||||
elBoundingClientRect = undefined;
|
||||
eventsElBoundingClientRect = undefined;
|
||||
return;
|
||||
}
|
||||
activate();
|
||||
if (typeof params.onEnter === 'function') params.onEnter();
|
||||
};
|
||||
var onTouchMove = function onTouchMove(e) {
|
||||
if (isScrolling === false && e.cancelable) {
|
||||
e.preventDefault();
|
||||
}
|
||||
};
|
||||
var onPointerMove = function onPointerMove(e) {
|
||||
if (!params.rotate || !self.isActive) return;
|
||||
if (e.pointerType !== 'mouse') {
|
||||
if (!params.rotateTouch) return;
|
||||
e.preventDefault();
|
||||
}
|
||||
var clientX = e.clientX,
|
||||
clientY = e.clientY;
|
||||
var diffX = clientX - clientXStart;
|
||||
var diffY = clientY - clientYStart;
|
||||
if (typeof params.rotateTouch === 'string' && (diffX !== 0 || diffY !== 0) && typeof isScrolling === 'undefined') {
|
||||
if (diffX * diffX + diffY * diffY >= 25) {
|
||||
var touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
|
||||
isScrolling = params.rotateTouch === 'scroll-y' ? touchAngle > 45 : 90 - touchAngle > 45;
|
||||
}
|
||||
if (isScrolling === false) {
|
||||
el.classList.add('atropos-rotate-touch');
|
||||
if (e.cancelable) {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (e.pointerType !== 'mouse' && isScrolling) {
|
||||
return;
|
||||
}
|
||||
setElements(clientX, clientY);
|
||||
};
|
||||
var onPointerLeave = function onPointerLeave(e) {
|
||||
elBoundingClientRect = undefined;
|
||||
eventsElBoundingClientRect = undefined;
|
||||
if (!self.isActive) return;
|
||||
if (e && e.type === 'pointerup' && e.pointerType === 'mouse') return;
|
||||
if (e && e.type === 'pointerleave' && e.pointerType !== 'mouse') return;
|
||||
if (typeof params.rotateTouch === 'string' && isScrolling) {
|
||||
el.classList.remove('atropos-rotate-touch');
|
||||
}
|
||||
if (params.alwaysActive) {
|
||||
setElements();
|
||||
if (typeof params.onRotate === 'function') params.onRotate(0, 0);
|
||||
if (typeof params.onLeave === 'function') params.onLeave();
|
||||
return;
|
||||
}
|
||||
queue.push(function () {
|
||||
return el.classList.remove('atropos-active');
|
||||
});
|
||||
$setDuration(scaleEl, params.duration + "ms");
|
||||
$setEasing(scaleEl, '');
|
||||
$setTransform(scaleEl, "translate3d(0,0, " + 0 + "px)");
|
||||
if (shadowEl) {
|
||||
$setDuration(shadowEl, params.duration + "ms");
|
||||
$setEasing(shadowEl, '');
|
||||
}
|
||||
if (highlightEl) {
|
||||
$setDuration(highlightEl, params.duration + "ms");
|
||||
$setEasing(highlightEl, '');
|
||||
$setTransform(highlightEl, "translate3d(0, 0, 0)");
|
||||
$setOpacity(highlightEl, 0);
|
||||
}
|
||||
$setDuration(rotateEl, params.duration + "ms");
|
||||
$setEasing(rotateEl, '');
|
||||
$setTransform(rotateEl, "translate3d(0,0,0) rotateX(0deg) rotateY(0deg)");
|
||||
setChildrenOffset({
|
||||
duration: params.duration + "ms"
|
||||
});
|
||||
self.isActive = false;
|
||||
if (typeof params.onRotate === 'function') params.onRotate(0, 0);
|
||||
if (typeof params.onLeave === 'function') params.onLeave();
|
||||
};
|
||||
var onDocumentClick = function onDocumentClick(e) {
|
||||
var clickTarget = e.target;
|
||||
if (!eventsEl.contains(clickTarget) && clickTarget !== eventsEl && self.isActive) {
|
||||
onPointerLeave();
|
||||
}
|
||||
};
|
||||
var initDOM = function initDOM() {
|
||||
if (typeof el === 'string') {
|
||||
el = $(document, el);
|
||||
}
|
||||
if (!el) return;
|
||||
|
||||
// eslint-disable-next-line
|
||||
if (el.__atropos__) return;
|
||||
if (typeof eventsEl !== 'undefined') {
|
||||
if (typeof eventsEl === 'string') {
|
||||
eventsEl = $(document, eventsEl);
|
||||
}
|
||||
} else {
|
||||
eventsEl = el;
|
||||
}
|
||||
childrenRootEl = isComponent ? el.parentNode.host : el;
|
||||
Object.assign(self, {
|
||||
el: el
|
||||
});
|
||||
rotateEl = $(el, '.atropos-rotate');
|
||||
scaleEl = $(el, '.atropos-scale');
|
||||
innerEl = $(el, '.atropos-inner');
|
||||
|
||||
// eslint-disable-next-line
|
||||
el.__atropos__ = self;
|
||||
};
|
||||
var init = function init() {
|
||||
initDOM();
|
||||
if (!el || !eventsEl) return;
|
||||
if (params.shadow) {
|
||||
createShadow();
|
||||
}
|
||||
if (params.highlight) {
|
||||
createHighlight();
|
||||
}
|
||||
if (params.rotateTouch) {
|
||||
if (typeof params.rotateTouch === 'string') {
|
||||
el.classList.add("atropos-rotate-touch-" + params.rotateTouch);
|
||||
} else {
|
||||
el.classList.add('atropos-rotate-touch');
|
||||
}
|
||||
}
|
||||
if ($(childrenRootEl, '[data-atropos-opacity]')) {
|
||||
setChildrenOffset({
|
||||
opacityOnly: true
|
||||
});
|
||||
}
|
||||
$on(document, 'click', onDocumentClick);
|
||||
$on(eventsEl, 'pointerdown', onPointerEnter);
|
||||
$on(eventsEl, 'pointerenter', onPointerEnter);
|
||||
$on(eventsEl, 'pointermove', onPointerMove);
|
||||
$on(eventsEl, 'touchmove', onTouchMove);
|
||||
$on(eventsEl, 'pointerleave', onPointerLeave);
|
||||
$on(eventsEl, 'pointerup', onPointerLeave);
|
||||
$on(eventsEl, 'lostpointercapture', onPointerLeave);
|
||||
if (params.alwaysActive) {
|
||||
activate();
|
||||
setElements();
|
||||
}
|
||||
};
|
||||
var destroy = function destroy() {
|
||||
self.destroyed = true;
|
||||
cancelAnimationFrame(queueFrameId);
|
||||
$off(document, 'click', onDocumentClick);
|
||||
$off(eventsEl, 'pointerdown', onPointerEnter);
|
||||
$off(eventsEl, 'pointerenter', onPointerEnter);
|
||||
$off(eventsEl, 'pointermove', onPointerMove);
|
||||
$off(eventsEl, 'touchmove', onTouchMove);
|
||||
$off(eventsEl, 'pointerleave', onPointerLeave);
|
||||
$off(eventsEl, 'pointerup', onPointerLeave);
|
||||
$off(eventsEl, 'lostpointercapture', onPointerLeave);
|
||||
// eslint-disable-next-line
|
||||
delete el.__atropos__;
|
||||
};
|
||||
self.destroy = destroy;
|
||||
init();
|
||||
|
||||
// eslint-disable-next-line
|
||||
return self;
|
||||
}
|
||||
|
||||
return Atropos;
|
||||
|
||||
})();
|
||||
6315
public/js/home/vendors/bootstrap.bundle.js
vendored
Normal file
6315
public/js/home/vendors/bootstrap.bundle.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
public/js/home/vendors/bootstrap.bundle.js.map
vendored
Normal file
1
public/js/home/vendors/bootstrap.bundle.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
5614
public/js/home/vendors/gsap.js
vendored
Normal file
5614
public/js/home/vendors/gsap.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
442
public/js/home/vendors/imagesloaded.pkgd.js
vendored
Normal file
442
public/js/home/vendors/imagesloaded.pkgd.js
vendored
Normal file
@ -0,0 +1,442 @@
|
||||
/*!
|
||||
Images Loaded Packaged
|
||||
Version: v5.0.0
|
||||
Plugin URL: https://imagesloaded.desandro.com/
|
||||
License: Copyright 2021-2024 | Released under the MIT License
|
||||
!*/
|
||||
|
||||
/**
|
||||
* EvEmitter v2.1.1
|
||||
* Lil' event emitter
|
||||
* MIT License
|
||||
*/
|
||||
|
||||
( function( global, factory ) {
|
||||
// universal module definition
|
||||
if ( typeof module == 'object' && module.exports ) {
|
||||
// CommonJS - Browserify, Webpack
|
||||
module.exports = factory();
|
||||
} else {
|
||||
// Browser globals
|
||||
global.EvEmitter = factory();
|
||||
}
|
||||
|
||||
}( typeof window != 'undefined' ? window : this, function() {
|
||||
|
||||
function EvEmitter() {}
|
||||
|
||||
let proto = EvEmitter.prototype;
|
||||
|
||||
proto.on = function( eventName, listener ) {
|
||||
if ( !eventName || !listener ) return this;
|
||||
|
||||
// set events hash
|
||||
let events = this._events = this._events || {};
|
||||
// set listeners array
|
||||
let listeners = events[ eventName ] = events[ eventName ] || [];
|
||||
// only add once
|
||||
if ( !listeners.includes( listener ) ) {
|
||||
listeners.push( listener );
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
proto.once = function( eventName, listener ) {
|
||||
if ( !eventName || !listener ) return this;
|
||||
|
||||
// add event
|
||||
this.on( eventName, listener );
|
||||
// set once flag
|
||||
// set onceEvents hash
|
||||
let onceEvents = this._onceEvents = this._onceEvents || {};
|
||||
// set onceListeners object
|
||||
let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
|
||||
// set flag
|
||||
onceListeners[ listener ] = true;
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
proto.off = function( eventName, listener ) {
|
||||
let listeners = this._events && this._events[ eventName ];
|
||||
if ( !listeners || !listeners.length ) return this;
|
||||
|
||||
let index = listeners.indexOf( listener );
|
||||
if ( index != -1 ) {
|
||||
listeners.splice( index, 1 );
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
proto.emitEvent = function( eventName, args ) {
|
||||
let listeners = this._events && this._events[ eventName ];
|
||||
if ( !listeners || !listeners.length ) return this;
|
||||
|
||||
// copy over to avoid interference if .off() in listener
|
||||
listeners = listeners.slice( 0 );
|
||||
args = args || [];
|
||||
// once stuff
|
||||
let onceListeners = this._onceEvents && this._onceEvents[ eventName ];
|
||||
|
||||
for ( let listener of listeners ) {
|
||||
let isOnce = onceListeners && onceListeners[ listener ];
|
||||
if ( isOnce ) {
|
||||
// remove listener
|
||||
// remove before trigger to prevent recursion
|
||||
this.off( eventName, listener );
|
||||
// unset once flag
|
||||
delete onceListeners[ listener ];
|
||||
}
|
||||
// trigger listener
|
||||
listener.apply( this, args );
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
proto.allOff = function() {
|
||||
delete this._events;
|
||||
delete this._onceEvents;
|
||||
return this;
|
||||
};
|
||||
|
||||
return EvEmitter;
|
||||
|
||||
} ) );
|
||||
/*!
|
||||
* imagesLoaded v5.0.0
|
||||
* JavaScript is all like "You images are done yet or what?"
|
||||
* MIT License
|
||||
*/
|
||||
|
||||
( function( window, factory ) {
|
||||
// universal module definition
|
||||
if ( typeof module == 'object' && module.exports ) {
|
||||
// CommonJS
|
||||
module.exports = factory( window, require('ev-emitter') );
|
||||
} else {
|
||||
// browser global
|
||||
window.imagesLoaded = factory( window, window.EvEmitter );
|
||||
}
|
||||
|
||||
} )( typeof window !== 'undefined' ? window : this,
|
||||
function factory( window, EvEmitter ) {
|
||||
|
||||
let $ = window.jQuery;
|
||||
let console = window.console;
|
||||
|
||||
// -------------------------- helpers -------------------------- //
|
||||
|
||||
// turn element or nodeList into an array
|
||||
function makeArray( obj ) {
|
||||
// use object if already an array
|
||||
if ( Array.isArray( obj ) ) return obj;
|
||||
|
||||
let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
|
||||
// convert nodeList to array
|
||||
if ( isArrayLike ) return [ ...obj ];
|
||||
|
||||
// array of single index
|
||||
return [ obj ];
|
||||
}
|
||||
|
||||
// -------------------------- imagesLoaded -------------------------- //
|
||||
|
||||
/**
|
||||
* @param {[Array, Element, NodeList, String]} elem
|
||||
* @param {[Object, Function]} options - if function, use as callback
|
||||
* @param {Function} onAlways - callback function
|
||||
* @returns {ImagesLoaded}
|
||||
*/
|
||||
function ImagesLoaded( elem, options, onAlways ) {
|
||||
// coerce ImagesLoaded() without new, to be new ImagesLoaded()
|
||||
if ( !( this instanceof ImagesLoaded ) ) {
|
||||
return new ImagesLoaded( elem, options, onAlways );
|
||||
}
|
||||
// use elem as selector string
|
||||
let queryElem = elem;
|
||||
if ( typeof elem == 'string' ) {
|
||||
queryElem = document.querySelectorAll( elem );
|
||||
}
|
||||
// bail if bad element
|
||||
if ( !queryElem ) {
|
||||
console.error(`Bad element for imagesLoaded ${queryElem || elem}`);
|
||||
return;
|
||||
}
|
||||
|
||||
this.elements = makeArray( queryElem );
|
||||
this.options = {};
|
||||
// shift arguments if no options set
|
||||
if ( typeof options == 'function' ) {
|
||||
onAlways = options;
|
||||
} else {
|
||||
Object.assign( this.options, options );
|
||||
}
|
||||
|
||||
if ( onAlways ) this.on( 'always', onAlways );
|
||||
|
||||
this.getImages();
|
||||
// add jQuery Deferred object
|
||||
if ( $ ) this.jqDeferred = new $.Deferred();
|
||||
|
||||
// HACK check async to allow time to bind listeners
|
||||
setTimeout( this.check.bind( this ) );
|
||||
}
|
||||
|
||||
ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
|
||||
|
||||
ImagesLoaded.prototype.getImages = function() {
|
||||
this.images = [];
|
||||
|
||||
// filter & find items if we have an item selector
|
||||
this.elements.forEach( this.addElementImages, this );
|
||||
};
|
||||
|
||||
const elementNodeTypes = [ 1, 9, 11 ];
|
||||
|
||||
/**
|
||||
* @param {Node} elem
|
||||
*/
|
||||
ImagesLoaded.prototype.addElementImages = function( elem ) {
|
||||
// filter siblings
|
||||
if ( elem.nodeName === 'IMG' ) {
|
||||
this.addImage( elem );
|
||||
}
|
||||
// get background image on element
|
||||
if ( this.options.background === true ) {
|
||||
this.addElementBackgroundImages( elem );
|
||||
}
|
||||
|
||||
// find children
|
||||
// no non-element nodes, #143
|
||||
let { nodeType } = elem;
|
||||
if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;
|
||||
|
||||
let childImgs = elem.querySelectorAll('img');
|
||||
// concat childElems to filterFound array
|
||||
for ( let img of childImgs ) {
|
||||
this.addImage( img );
|
||||
}
|
||||
|
||||
// get child background images
|
||||
if ( typeof this.options.background == 'string' ) {
|
||||
let children = elem.querySelectorAll( this.options.background );
|
||||
for ( let child of children ) {
|
||||
this.addElementBackgroundImages( child );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const reURL = /url\((['"])?(.*?)\1\)/gi;
|
||||
|
||||
ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
|
||||
let style = getComputedStyle( elem );
|
||||
// Firefox returns null if in a hidden iframe https://bugzil.la/548397
|
||||
if ( !style ) return;
|
||||
|
||||
// get url inside url("...")
|
||||
let matches = reURL.exec( style.backgroundImage );
|
||||
while ( matches !== null ) {
|
||||
let url = matches && matches[2];
|
||||
if ( url ) {
|
||||
this.addBackground( url, elem );
|
||||
}
|
||||
matches = reURL.exec( style.backgroundImage );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Image} img
|
||||
*/
|
||||
ImagesLoaded.prototype.addImage = function( img ) {
|
||||
let loadingImage = new LoadingImage( img );
|
||||
this.images.push( loadingImage );
|
||||
};
|
||||
|
||||
ImagesLoaded.prototype.addBackground = function( url, elem ) {
|
||||
let background = new Background( url, elem );
|
||||
this.images.push( background );
|
||||
};
|
||||
|
||||
ImagesLoaded.prototype.check = function() {
|
||||
this.progressedCount = 0;
|
||||
this.hasAnyBroken = false;
|
||||
// complete if no images
|
||||
if ( !this.images.length ) {
|
||||
this.complete();
|
||||
return;
|
||||
}
|
||||
|
||||
/* eslint-disable-next-line func-style */
|
||||
let onProgress = ( image, elem, message ) => {
|
||||
// HACK - Chrome triggers event before object properties have changed. #83
|
||||
setTimeout( () => {
|
||||
this.progress( image, elem, message );
|
||||
} );
|
||||
};
|
||||
|
||||
this.images.forEach( function( loadingImage ) {
|
||||
loadingImage.once( 'progress', onProgress );
|
||||
loadingImage.check();
|
||||
} );
|
||||
};
|
||||
|
||||
ImagesLoaded.prototype.progress = function( image, elem, message ) {
|
||||
this.progressedCount++;
|
||||
this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
|
||||
// progress event
|
||||
this.emitEvent( 'progress', [ this, image, elem ] );
|
||||
if ( this.jqDeferred && this.jqDeferred.notify ) {
|
||||
this.jqDeferred.notify( this, image );
|
||||
}
|
||||
// check if completed
|
||||
if ( this.progressedCount === this.images.length ) {
|
||||
this.complete();
|
||||
}
|
||||
|
||||
if ( this.options.debug && console ) {
|
||||
console.log( `progress: ${message}`, image, elem );
|
||||
}
|
||||
};
|
||||
|
||||
ImagesLoaded.prototype.complete = function() {
|
||||
let eventName = this.hasAnyBroken ? 'fail' : 'done';
|
||||
this.isComplete = true;
|
||||
this.emitEvent( eventName, [ this ] );
|
||||
this.emitEvent( 'always', [ this ] );
|
||||
if ( this.jqDeferred ) {
|
||||
let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
|
||||
this.jqDeferred[ jqMethod ]( this );
|
||||
}
|
||||
};
|
||||
|
||||
// -------------------------- -------------------------- //
|
||||
|
||||
function LoadingImage( img ) {
|
||||
this.img = img;
|
||||
}
|
||||
|
||||
LoadingImage.prototype = Object.create( EvEmitter.prototype );
|
||||
|
||||
LoadingImage.prototype.check = function() {
|
||||
// If complete is true and browser supports natural sizes,
|
||||
// try to check for image status manually.
|
||||
let isComplete = this.getIsImageComplete();
|
||||
if ( isComplete ) {
|
||||
// report based on naturalWidth
|
||||
this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
|
||||
return;
|
||||
}
|
||||
|
||||
// If none of the checks above matched, simulate loading on detached element.
|
||||
this.proxyImage = new Image();
|
||||
// add crossOrigin attribute. #204
|
||||
if ( this.img.crossOrigin ) {
|
||||
this.proxyImage.crossOrigin = this.img.crossOrigin;
|
||||
}
|
||||
this.proxyImage.addEventListener( 'load', this );
|
||||
this.proxyImage.addEventListener( 'error', this );
|
||||
// bind to image as well for Firefox. #191
|
||||
this.img.addEventListener( 'load', this );
|
||||
this.img.addEventListener( 'error', this );
|
||||
this.proxyImage.src = this.img.currentSrc || this.img.src;
|
||||
};
|
||||
|
||||
LoadingImage.prototype.getIsImageComplete = function() {
|
||||
// check for non-zero, non-undefined naturalWidth
|
||||
// fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
|
||||
return this.img.complete && this.img.naturalWidth;
|
||||
};
|
||||
|
||||
LoadingImage.prototype.confirm = function( isLoaded, message ) {
|
||||
this.isLoaded = isLoaded;
|
||||
let { parentNode } = this.img;
|
||||
// emit progress with parent <picture> or self <img>
|
||||
let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;
|
||||
this.emitEvent( 'progress', [ this, elem, message ] );
|
||||
};
|
||||
|
||||
// ----- events ----- //
|
||||
|
||||
// trigger specified handler for event type
|
||||
LoadingImage.prototype.handleEvent = function( event ) {
|
||||
let method = 'on' + event.type;
|
||||
if ( this[ method ] ) {
|
||||
this[ method ]( event );
|
||||
}
|
||||
};
|
||||
|
||||
LoadingImage.prototype.onload = function() {
|
||||
this.confirm( true, 'onload' );
|
||||
this.unbindEvents();
|
||||
};
|
||||
|
||||
LoadingImage.prototype.onerror = function() {
|
||||
this.confirm( false, 'onerror' );
|
||||
this.unbindEvents();
|
||||
};
|
||||
|
||||
LoadingImage.prototype.unbindEvents = function() {
|
||||
this.proxyImage.removeEventListener( 'load', this );
|
||||
this.proxyImage.removeEventListener( 'error', this );
|
||||
this.img.removeEventListener( 'load', this );
|
||||
this.img.removeEventListener( 'error', this );
|
||||
};
|
||||
|
||||
// -------------------------- Background -------------------------- //
|
||||
|
||||
function Background( url, element ) {
|
||||
this.url = url;
|
||||
this.element = element;
|
||||
this.img = new Image();
|
||||
}
|
||||
|
||||
// inherit LoadingImage prototype
|
||||
Background.prototype = Object.create( LoadingImage.prototype );
|
||||
|
||||
Background.prototype.check = function() {
|
||||
this.img.addEventListener( 'load', this );
|
||||
this.img.addEventListener( 'error', this );
|
||||
this.img.src = this.url;
|
||||
// check if image is already complete
|
||||
let isComplete = this.getIsImageComplete();
|
||||
if ( isComplete ) {
|
||||
this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
|
||||
this.unbindEvents();
|
||||
}
|
||||
};
|
||||
|
||||
Background.prototype.unbindEvents = function() {
|
||||
this.img.removeEventListener( 'load', this );
|
||||
this.img.removeEventListener( 'error', this );
|
||||
};
|
||||
|
||||
Background.prototype.confirm = function( isLoaded, message ) {
|
||||
this.isLoaded = isLoaded;
|
||||
this.emitEvent( 'progress', [ this, this.element, message ] );
|
||||
};
|
||||
|
||||
// -------------------------- jQuery -------------------------- //
|
||||
|
||||
ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
|
||||
jQuery = jQuery || window.jQuery;
|
||||
if ( !jQuery ) return;
|
||||
|
||||
// set local variable
|
||||
$ = jQuery;
|
||||
// $().imagesLoaded()
|
||||
$.fn.imagesLoaded = function( options, onAlways ) {
|
||||
let instance = new ImagesLoaded( this, options, onAlways );
|
||||
return instance.jqDeferred.promise( $( this ) );
|
||||
};
|
||||
};
|
||||
// try making plugin
|
||||
ImagesLoaded.makeJQueryPlugin();
|
||||
|
||||
// -------------------------- -------------------------- //
|
||||
|
||||
return ImagesLoaded;
|
||||
|
||||
} );
|
||||
400
public/js/home/vendors/interactive-portfolio.js
vendored
Normal file
400
public/js/home/vendors/interactive-portfolio.js
vendored
Normal file
@ -0,0 +1,400 @@
|
||||
/*!
|
||||
Carto - Interactive portfolio
|
||||
Created by ThemeZaa
|
||||
!*/
|
||||
|
||||
$(function() {
|
||||
"use strict";
|
||||
const container = document.getElementById("stickyImgContainer");
|
||||
|
||||
if (typeof (container) != 'undefined' && container != null) {
|
||||
|
||||
const sliders = document.querySelector(".slides").querySelectorAll(".slide")
|
||||
const slidesData = Array.from(sliders).map(item => {
|
||||
return {
|
||||
image: "",
|
||||
title: "title1",
|
||||
meta: ""
|
||||
}
|
||||
})
|
||||
const createEleWithClass = (tag, className) => {
|
||||
const ele = document.createElement(tag);
|
||||
ele.className = className;
|
||||
return ele;
|
||||
};
|
||||
|
||||
class Slides {
|
||||
constructor(data) {
|
||||
this.data = document.querySelectorAll(".slide");
|
||||
this.container = document.querySelector(".slides");
|
||||
this.currentIdx = 0;
|
||||
this.slides = document.querySelectorAll(".slide");
|
||||
}
|
||||
mount(container) {
|
||||
container.appendChild(this.container);
|
||||
let activeIndex = 0;
|
||||
for (let i = 0; i < this.slides.length; i++) {
|
||||
if (activeIndex === i) {
|
||||
this.slides[i].classList.remove("next");
|
||||
this.slides[i].classList.remove("prev");
|
||||
this.slides[i].classList.add("show-meta");
|
||||
document.querySelector(".bg-overlay").style.backgroundImage = `url("${this.slides[i].dataset.bg}")`
|
||||
} else {
|
||||
if (activeIndex > i) {
|
||||
this.slides[i].classList.remove("next");
|
||||
this.slides[i].classList.add("prev");
|
||||
} else {
|
||||
this.slides[i].classList.add("next");
|
||||
this.slides[i].classList.remove("prev");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
onActiveIndexChange(activeIndex) {
|
||||
this.currentIdx = activeIndex;
|
||||
for (let i = 0; i < this.slides.length; i++) {
|
||||
if (activeIndex === i) {
|
||||
this.slides[i].classList.remove("next");
|
||||
this.slides[i].classList.remove("prev");
|
||||
document.querySelector(".bg-overlay").style.backgroundImage = `url("${this.slides[i].dataset.bg}")`
|
||||
} else {
|
||||
if (activeIndex > i) {
|
||||
this.slides[i].classList.remove("next");
|
||||
this.slides[i].classList.add("prev");
|
||||
} else {
|
||||
this.slides[i].classList.add("next");
|
||||
this.slides[i].classList.remove("prev");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
onMove(indexFloat) {
|
||||
this.container.style.transform = `translateY(${(indexFloat * 100) /
|
||||
this.slides.length}%)`;
|
||||
}
|
||||
appear() {
|
||||
this.container.classList.add("scrolling");
|
||||
container.classList.add("scrolling");
|
||||
this.slides[this.currentIdx].classList.remove("show-meta");
|
||||
}
|
||||
disperse(activeIndex) {
|
||||
this.currentIdx = activeIndex;
|
||||
this.slides[this.currentIdx].classList.add("show-meta");
|
||||
this.container.classList.remove("scrolling");
|
||||
container.classList.remove("scrolling");
|
||||
for (let index = 0; index < this.data.length; index++) {
|
||||
if (index > activeIndex) {
|
||||
this.slides[index].classList.add("next");
|
||||
this.slides[index].classList.remove("prev");
|
||||
} else if (index < activeIndex) {
|
||||
this.slides[index].classList.remove("next");
|
||||
this.slides[index].classList.add("prev");
|
||||
} else {
|
||||
this.slides[index].classList.remove("next");
|
||||
this.slides[index].classList.remove("prev");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Grab {
|
||||
constructor({
|
||||
indexSize,
|
||||
onIndexChange,
|
||||
onGrabStart,
|
||||
onGrabMove,
|
||||
onGrabEnd
|
||||
}) {
|
||||
this.onGrabEnd = onGrabEnd;
|
||||
this.onGrabStart = onGrabStart;
|
||||
this.onGrabMove = onGrabMove;
|
||||
|
||||
this.scroll = {
|
||||
start: 0,
|
||||
current: 0,
|
||||
initial: 0
|
||||
};
|
||||
|
||||
this.listen("mousedown", this.onMouseDown.bind(this));
|
||||
this.listen("mousemove", this.onMouseMove.bind(this));
|
||||
this.listen("mouseup", this.onMouseUp.bind(this));
|
||||
|
||||
this.listen("touchstart", this.onMouseDown.bind(this), true);
|
||||
this.listen("touchmove", this.onMouseMove.bind(this), true);
|
||||
this.listen(["touchend", "touchcancel"], this.onMouseUp.bind(this), true);
|
||||
}
|
||||
listen(events, grabListener, isTouch) {
|
||||
const _this = this;
|
||||
let mouseListener = function (ev) {
|
||||
if (ev.type === "mouseout" && ev.relatedTarget != null) return;
|
||||
grabListener({
|
||||
y: ev.clientY
|
||||
});
|
||||
};
|
||||
|
||||
let touchListener = function (ev) {
|
||||
grabListener({
|
||||
y: ev.targetTouches[0] ? ev.targetTouches[0].clientY : null
|
||||
});
|
||||
};
|
||||
let listener = mouseListener;
|
||||
if (isTouch) {
|
||||
listener = touchListener;
|
||||
}
|
||||
if (Array.isArray(events)) {
|
||||
for (let i = 0; i < events.length; i++) {
|
||||
window.addEventListener(events[i], listener, false);
|
||||
}
|
||||
} else {
|
||||
window.addEventListener(events, function (event) {
|
||||
if (event.target.closest(".stickyImageContainer") === container) {
|
||||
listener(event);
|
||||
} else {
|
||||
_this.onMouseUp()
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
}
|
||||
|
||||
onMouseDown(position) {
|
||||
this.scroll.inital = this.scroll.current;
|
||||
|
||||
this.scroll.start = position.y;
|
||||
this.scroll.current = position.y;
|
||||
this.scroll.delta = this.scroll.current - this.scroll.start;
|
||||
|
||||
this.onGrabStart({
|
||||
delta: this.scroll.delta,
|
||||
direction: Math.abs(this.scroll.delta),
|
||||
current: this.scroll.current,
|
||||
start: this.scroll.start
|
||||
});
|
||||
}
|
||||
onMouseMove(position) {
|
||||
if (this.scroll.start) {
|
||||
this.scroll.current = position.y;
|
||||
this.scroll.delta = this.scroll.current - this.scroll.start;
|
||||
|
||||
this.onGrabMove({
|
||||
delta: this.scroll.delta,
|
||||
direction: Math.abs(this.scroll.delta),
|
||||
current: this.scroll.current,
|
||||
start: this.scroll.start
|
||||
});
|
||||
}
|
||||
}
|
||||
onMouseUp() {
|
||||
if (this.scroll.start) {
|
||||
this.onGrabEnd({
|
||||
delta: this.scroll.delta,
|
||||
direction: Math.abs(this.scroll.delta),
|
||||
current: this.scroll.current,
|
||||
start: this.scroll.start
|
||||
});
|
||||
|
||||
this.scroll.start = null;
|
||||
this.scroll.current = null;
|
||||
this.scroll.delta = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const reach = function ({ from, to, restDelta = 0.01 }) {
|
||||
|
||||
let current = Object.assign({}, from);
|
||||
let keys = Object.keys(from);
|
||||
|
||||
let raf = {
|
||||
current: null
|
||||
};
|
||||
|
||||
let _update = function (update, complete) {
|
||||
if (keys.length === 0) {
|
||||
cancelAnimationFrame(raf.current);
|
||||
raf.current = null;
|
||||
|
||||
complete(current);
|
||||
return;
|
||||
}
|
||||
|
||||
let cacheKeys = keys.slice();
|
||||
for (var i = keys.length, val, key; i >= 0; i--) {
|
||||
key = keys[i];
|
||||
val = current[key] + (to[key] - current[key]) * 0.1;
|
||||
if (Math.abs(to[key] - val) < restDelta) {
|
||||
current[key] = to[key];
|
||||
// Remove key
|
||||
keys.splice(i, 1);
|
||||
// Move i down by pne
|
||||
i--;
|
||||
} else {
|
||||
current[key] = val;
|
||||
}
|
||||
}
|
||||
|
||||
update(current);
|
||||
raf.current = requestAnimationFrame(_update);
|
||||
};
|
||||
return {
|
||||
start: function ({
|
||||
update,
|
||||
complete
|
||||
}) {
|
||||
_update = _update.bind(null, update, complete);
|
||||
raf.current = requestAnimationFrame(_update);
|
||||
return {
|
||||
stop: function () {
|
||||
cancelAnimationFrame(raf.current);
|
||||
raf.current = null;
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
function Showcase(data, options = {}) {
|
||||
|
||||
this.data = data;
|
||||
this.progress = 0;
|
||||
this.direction = 1;
|
||||
this.waveIntensity = 0;
|
||||
this.options = options;
|
||||
|
||||
this.index = {
|
||||
target: 0,
|
||||
current: 0,
|
||||
initial: 0,
|
||||
scrollSize: window.innerHeight / 6,
|
||||
active: 0
|
||||
};
|
||||
|
||||
this.follower = {
|
||||
x: 0,
|
||||
y: 0
|
||||
};
|
||||
|
||||
this.followerSpring = null;
|
||||
|
||||
this.slidesSpring = null;
|
||||
|
||||
this.grab = new Grab({
|
||||
onGrabStart: this.onGrabStart.bind(this),
|
||||
onGrabMove: this.onGrabMove.bind(this),
|
||||
onGrabEnd: this.onGrabEnd.bind(this)
|
||||
});
|
||||
}
|
||||
|
||||
function clamp(num, min, max) {
|
||||
return Math.max(min, Math.min(num, max));
|
||||
}
|
||||
|
||||
Showcase.prototype.onGrabMove = function (scroll) {
|
||||
this.index.target = clamp(
|
||||
this.index.initial + scroll.delta / this.index.scrollSize,
|
||||
-this.data.length + 0.51,
|
||||
0.49
|
||||
);
|
||||
|
||||
const index = clamp(Math.round(-this.index.target), 0, this.data.length - 1);
|
||||
|
||||
if (this.index.active !== index) {
|
||||
this.index.active = index;
|
||||
if (this.options.onActiveIndexChange) {
|
||||
this.options.onActiveIndexChange(this.index.active);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.slidesPop) {
|
||||
this.slidesPop.stop();
|
||||
}
|
||||
this.slidesPop = reach({
|
||||
from: {
|
||||
index: this.index.current
|
||||
},
|
||||
to: {
|
||||
index: this.index.target
|
||||
},
|
||||
restDelta: 0.001
|
||||
}).start({
|
||||
update: val => {
|
||||
if (this.options.onIndexChange) {
|
||||
this.options.onIndexChange(val.index);
|
||||
}
|
||||
this.index.current = val.index;
|
||||
},
|
||||
complete: val => {
|
||||
if (this.options.onIndexChange) {
|
||||
this.options.onIndexChange(val.index);
|
||||
}
|
||||
this.index.current = val.index;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
Showcase.prototype.onGrabStart = function () {
|
||||
if (this.options.onZoomOutStart) {
|
||||
this.options.onZoomOutStart({
|
||||
activeIndex: this.index.active
|
||||
});
|
||||
}
|
||||
this.index.initial = this.index.current;
|
||||
};
|
||||
|
||||
Showcase.prototype.snapCurrentToActiveIndex = function () {
|
||||
if (this.slidesPop) {
|
||||
this.slidesPop.stop();
|
||||
}
|
||||
this.slidesPop = reach({
|
||||
from: {
|
||||
index: this.index.current
|
||||
},
|
||||
to: {
|
||||
index: Math.round(this.index.target)
|
||||
},
|
||||
restDelta: 0.001
|
||||
}).start({
|
||||
complete: () => { },
|
||||
update: val => {
|
||||
// this.slides.onMove(val);
|
||||
if (this.options.onIndexChange) {
|
||||
this.options.onIndexChange(val.index);
|
||||
}
|
||||
this.index.current = val.index;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
Showcase.prototype.onGrabEnd = function () {
|
||||
if (this.options.onFullscreenStart) {
|
||||
this.options.onFullscreenStart({
|
||||
activeIndex: this.index.active
|
||||
});
|
||||
this.snapCurrentToActiveIndex();
|
||||
}
|
||||
};
|
||||
|
||||
Showcase.prototype.onResize = function () {
|
||||
};
|
||||
|
||||
const slides = new Slides();
|
||||
const showcase = new Showcase(slidesData, {
|
||||
onActiveIndexChange: activeIndex => {
|
||||
slides.onActiveIndexChange(activeIndex);
|
||||
},
|
||||
onIndexChange: index => {
|
||||
slides.onMove(index);
|
||||
},
|
||||
onZoomOutStart: ({ activeIndex }) => {
|
||||
slides.appear();
|
||||
},
|
||||
onZoomOutFinish: ({ activeIndex }) => { },
|
||||
onFullscreenStart: ({ activeIndex }) => {
|
||||
slides.disperse(activeIndex);
|
||||
},
|
||||
onFullscreenFinish: ({ activeIndex }) => { }
|
||||
});
|
||||
|
||||
slides.mount(container);
|
||||
}
|
||||
});
|
||||
|
||||
3559
public/js/home/vendors/isotope.pkgd.js
vendored
Normal file
3559
public/js/home/vendors/isotope.pkgd.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
114
public/js/home/vendors/jquery-cookie.js
vendored
Normal file
114
public/js/home/vendors/jquery-cookie.js
vendored
Normal file
@ -0,0 +1,114 @@
|
||||
/*!
|
||||
jQuery Cookie Plugin
|
||||
Version: v1.4.1
|
||||
Plugin URL: https://github.com/carhartl/jquery-cookie
|
||||
License: Copyright 2006, 2014 Klaus Hartl | Released under the MIT license
|
||||
!*/
|
||||
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD (Register as an anonymous module)
|
||||
define(['jquery'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
// Node/CommonJS
|
||||
module.exports = factory(require('jquery'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
|
||||
var pluses = /\+/g;
|
||||
|
||||
function encode(s) {
|
||||
return config.raw ? s : encodeURIComponent(s);
|
||||
}
|
||||
|
||||
function decode(s) {
|
||||
return config.raw ? s : decodeURIComponent(s);
|
||||
}
|
||||
|
||||
function stringifyCookieValue(value) {
|
||||
return encode(config.json ? JSON.stringify(value) : String(value));
|
||||
}
|
||||
|
||||
function parseCookieValue(s) {
|
||||
if (s.indexOf('"') === 0) {
|
||||
// This is a quoted cookie as according to RFC2068, unescape...
|
||||
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
||||
}
|
||||
|
||||
try {
|
||||
// Replace server-side written pluses with spaces.
|
||||
// If we can't decode the cookie, ignore it, it's unusable.
|
||||
// If we can't parse the cookie, ignore it, it's unusable.
|
||||
s = decodeURIComponent(s.replace(pluses, ' '));
|
||||
return config.json ? JSON.parse(s) : s;
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
function read(s, converter) {
|
||||
var value = config.raw ? s : parseCookieValue(s);
|
||||
return $.isFunction(converter) ? converter(value) : value;
|
||||
}
|
||||
|
||||
var config = $.cookie = function (key, value, options) {
|
||||
|
||||
// Write
|
||||
|
||||
if (arguments.length > 1 && !$.isFunction(value)) {
|
||||
options = $.extend({}, config.defaults, options);
|
||||
|
||||
if (typeof options.expires === 'number') {
|
||||
var days = options.expires, t = options.expires = new Date();
|
||||
t.setMilliseconds(t.getMilliseconds() + days * 864e+5);
|
||||
}
|
||||
|
||||
return (document.cookie = [
|
||||
encode(key), '=', stringifyCookieValue(value),
|
||||
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
|
||||
options.path ? '; path=' + options.path : '',
|
||||
options.domain ? '; domain=' + options.domain : '',
|
||||
options.secure ? '; secure' : ''
|
||||
].join(''));
|
||||
}
|
||||
|
||||
// Read
|
||||
|
||||
var result = key ? undefined : {},
|
||||
// To prevent the for loop in the first place assign an empty array
|
||||
// in case there are no cookies at all. Also prevents odd result when
|
||||
// calling $.cookie().
|
||||
cookies = document.cookie ? document.cookie.split('; ') : [],
|
||||
i = 0,
|
||||
l = cookies.length;
|
||||
|
||||
for (; i < l; i++) {
|
||||
var parts = cookies[i].split('='),
|
||||
name = decode(parts.shift()),
|
||||
cookie = parts.join('=');
|
||||
|
||||
if (key === name) {
|
||||
// If second argument (value) is a function it's a converter...
|
||||
result = read(cookie, value);
|
||||
break;
|
||||
}
|
||||
|
||||
// Prevent storing a cookie that we couldn't decode.
|
||||
if (!key && (cookie = read(cookie)) !== undefined) {
|
||||
result[name] = cookie;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
config.defaults = {};
|
||||
|
||||
$.removeCookie = function (key, options) {
|
||||
// Must not alter options, thus extending a fresh object...
|
||||
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
|
||||
return !$.cookie(key);
|
||||
};
|
||||
|
||||
}));
|
||||
119
public/js/home/vendors/jquery.appear.js
vendored
Normal file
119
public/js/home/vendors/jquery.appear.js
vendored
Normal file
@ -0,0 +1,119 @@
|
||||
/*!
|
||||
jQuery appear plugin
|
||||
Version: 0.4
|
||||
Plugin URL: https://github.com/morr/jquery.appear/
|
||||
License: Copyright (c) 2012 Andrey Sidorov | Released under the MIT license
|
||||
!*/
|
||||
(function($) {
|
||||
var selectors = [];
|
||||
|
||||
var check_binded = false;
|
||||
var check_lock = false;
|
||||
var defaults = {
|
||||
interval: 250,
|
||||
force_process: false
|
||||
};
|
||||
var $window = $(window);
|
||||
|
||||
var $prior_appeared = [];
|
||||
|
||||
function appeared(selector) {
|
||||
return $(selector).filter(function() {
|
||||
return $(this).is(':appeared');
|
||||
});
|
||||
}
|
||||
|
||||
function process() {
|
||||
check_lock = false;
|
||||
for (var index = 0, selectorsLength = selectors.length; index < selectorsLength; index++) {
|
||||
var $appeared = appeared(selectors[index]);
|
||||
|
||||
$appeared.trigger('appear', [$appeared]);
|
||||
|
||||
if ($prior_appeared[index]) {
|
||||
var $disappeared = $prior_appeared[index].not($appeared);
|
||||
$disappeared.trigger('disappear', [$disappeared]);
|
||||
}
|
||||
$prior_appeared[index] = $appeared;
|
||||
}
|
||||
}
|
||||
|
||||
function add_selector(selector) {
|
||||
selectors.push(selector);
|
||||
$prior_appeared.push();
|
||||
}
|
||||
|
||||
// ":appeared" custom filter
|
||||
$.expr.pseudos.appeared = $.expr.createPseudo(function(arg) {
|
||||
return function(element) {
|
||||
var $element = $(element);
|
||||
if (!$element.is(':visible')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var window_left = $window.scrollLeft();
|
||||
var window_top = $window.scrollTop();
|
||||
var offset = $element.offset();
|
||||
var left = offset.left;
|
||||
var top = offset.top;
|
||||
|
||||
if (top + $element.height() >= window_top &&
|
||||
top - ($element.data('appear-top-offset') || 0) <= window_top + $window.height() &&
|
||||
left + $element.width() >= window_left &&
|
||||
left - ($element.data('appear-left-offset') || 0) <= window_left + $window.width()) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
$.fn.extend({
|
||||
// watching for element's appearance in browser viewport
|
||||
appear: function(selector, options) {
|
||||
$.appear(this, options);
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
$.extend({
|
||||
appear: function(selector, options) {
|
||||
var opts = $.extend({}, defaults, options || {});
|
||||
|
||||
if (!check_binded) {
|
||||
var on_check = function() {
|
||||
if (check_lock) {
|
||||
return;
|
||||
}
|
||||
check_lock = true;
|
||||
|
||||
setTimeout(process, opts.interval);
|
||||
};
|
||||
|
||||
$(window).scroll(on_check).resize(on_check);
|
||||
check_binded = true;
|
||||
}
|
||||
|
||||
if (opts.force_process) {
|
||||
setTimeout(process, opts.interval);
|
||||
}
|
||||
|
||||
add_selector(selector);
|
||||
},
|
||||
// force elements's appearance check
|
||||
force_appear: function() {
|
||||
if (check_binded) {
|
||||
process();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
})(function() {
|
||||
if (typeof module !== 'undefined') {
|
||||
// Node
|
||||
return require('jquery');
|
||||
} else {
|
||||
return jQuery;
|
||||
}
|
||||
}());
|
||||
136
public/js/home/vendors/jquery.count-to.js
vendored
Normal file
136
public/js/home/vendors/jquery.count-to.js
vendored
Normal file
@ -0,0 +1,136 @@
|
||||
/*!
|
||||
jQuery countTo Plugin
|
||||
Version: v1.2.0
|
||||
Plugin URL: https://github.com/mhuggins/jquery-countTo
|
||||
License: Copyright (c) Matt Huggins | Released under the MIT license
|
||||
!*/
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD
|
||||
define(['jquery'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
// CommonJS
|
||||
factory(require('jquery'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
var CountTo = function (element, options) {
|
||||
this.$element = $(element);
|
||||
this.options = $.extend({}, CountTo.DEFAULTS, this.dataOptions(), options);
|
||||
this.init();
|
||||
};
|
||||
|
||||
CountTo.DEFAULTS = {
|
||||
from: 0, // the number the element should start at
|
||||
to: 0, // the number the element should end at
|
||||
speed: 1000, // how long it should take to count between the target numbers
|
||||
refreshInterval: 100, // how often the element should be updated
|
||||
decimals: 0, // the number of decimal places to show
|
||||
formatter: formatter, // handler for formatting the value before rendering
|
||||
onUpdate: null, // callback method for every time the element is updated
|
||||
onComplete: null // callback method for when the element finishes updating
|
||||
};
|
||||
|
||||
CountTo.prototype.init = function () {
|
||||
this.value = this.options.from;
|
||||
this.loops = Math.ceil(this.options.speed / this.options.refreshInterval);
|
||||
this.loopCount = 0;
|
||||
this.increment = (this.options.to - this.options.from) / this.loops;
|
||||
};
|
||||
|
||||
CountTo.prototype.dataOptions = function () {
|
||||
var options = {
|
||||
from: this.$element.data('from'),
|
||||
to: this.$element.data('to'),
|
||||
speed: this.$element.data('speed'),
|
||||
refreshInterval: this.$element.data('refresh-interval'),
|
||||
decimals: this.$element.data('decimals')
|
||||
};
|
||||
|
||||
var keys = Object.keys(options);
|
||||
|
||||
for (var i in keys) {
|
||||
var key = keys[i];
|
||||
|
||||
if (typeof(options[key]) === 'undefined') {
|
||||
delete options[key];
|
||||
}
|
||||
}
|
||||
|
||||
return options;
|
||||
};
|
||||
|
||||
CountTo.prototype.update = function () {
|
||||
this.value += this.increment;
|
||||
this.loopCount++;
|
||||
|
||||
this.render();
|
||||
|
||||
if (typeof(this.options.onUpdate) == 'function') {
|
||||
this.options.onUpdate.call(this.$element, this.value);
|
||||
}
|
||||
|
||||
if (this.loopCount >= this.loops) {
|
||||
clearInterval(this.interval);
|
||||
this.value = this.options.to;
|
||||
|
||||
if (typeof(this.options.onComplete) == 'function') {
|
||||
this.options.onComplete.call(this.$element, this.value);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CountTo.prototype.render = function () {
|
||||
var formattedValue = this.options.formatter.call(this.$element, this.value, this.options);
|
||||
this.$element.text(formattedValue);
|
||||
};
|
||||
|
||||
CountTo.prototype.restart = function () {
|
||||
this.stop();
|
||||
this.init();
|
||||
this.start();
|
||||
};
|
||||
|
||||
CountTo.prototype.start = function () {
|
||||
this.stop();
|
||||
this.render();
|
||||
this.interval = setInterval(this.update.bind(this), this.options.refreshInterval);
|
||||
};
|
||||
|
||||
CountTo.prototype.stop = function () {
|
||||
if (this.interval) {
|
||||
clearInterval(this.interval);
|
||||
}
|
||||
};
|
||||
|
||||
CountTo.prototype.toggle = function () {
|
||||
if (this.interval) {
|
||||
this.stop();
|
||||
} else {
|
||||
this.start();
|
||||
}
|
||||
};
|
||||
|
||||
function formatter(value, options) {
|
||||
return value.toFixed(options.decimals);
|
||||
}
|
||||
|
||||
$.fn.countTo = function (option) {
|
||||
return this.each(function () {
|
||||
var $this = $(this);
|
||||
var data = $this.data('countTo');
|
||||
var init = !data || typeof(option) === 'object';
|
||||
var options = typeof(option) === 'object' ? option : {};
|
||||
var method = typeof(option) === 'string' ? option : 'start';
|
||||
|
||||
if (init) {
|
||||
if (data) data.stop();
|
||||
$this.data('countTo', data = new CountTo(this, options));
|
||||
}
|
||||
|
||||
data[method].call(data);
|
||||
});
|
||||
};
|
||||
}));
|
||||
232
public/js/home/vendors/jquery.countdown.js
vendored
Normal file
232
public/js/home/vendors/jquery.countdown.js
vendored
Normal file
@ -0,0 +1,232 @@
|
||||
/*!
|
||||
The Final Countdown
|
||||
Version: 2.2.0
|
||||
Plugin URL: http://hilios.github.io/jQuery.countdown/
|
||||
License: Copyright (c) 2016 Edson Hilios
|
||||
!*/
|
||||
|
||||
(function(factory) {
|
||||
"use strict";
|
||||
if (typeof define === "function" && define.amd) {
|
||||
define([ "jquery" ], factory);
|
||||
} else {
|
||||
factory(jQuery);
|
||||
}
|
||||
})(function($) {
|
||||
"use strict";
|
||||
var instances = [], matchers = [], defaultOptions = {
|
||||
precision: 100,
|
||||
elapse: false,
|
||||
defer: false
|
||||
};
|
||||
matchers.push(/^[0-9]*$/.source);
|
||||
matchers.push(/([0-9]{1,2}\/){2}[0-9]{4}( [0-9]{1,2}(:[0-9]{2}){2})?/.source);
|
||||
matchers.push(/[0-9]{4}([\/\-][0-9]{1,2}){2}( [0-9]{1,2}(:[0-9]{2}){2})?/.source);
|
||||
matchers = new RegExp(matchers.join("|"));
|
||||
function parseDateString(dateString) {
|
||||
if (dateString instanceof Date) {
|
||||
return dateString;
|
||||
}
|
||||
if (String(dateString).match(matchers)) {
|
||||
if (String(dateString).match(/^[0-9]*$/)) {
|
||||
dateString = Number(dateString);
|
||||
}
|
||||
if (String(dateString).match(/\-/)) {
|
||||
dateString = String(dateString).replace(/\-/g, "/");
|
||||
}
|
||||
return new Date(dateString);
|
||||
} else {
|
||||
throw new Error("Couldn't cast `" + dateString + "` to a date object.");
|
||||
}
|
||||
}
|
||||
var DIRECTIVE_KEY_MAP = {
|
||||
Y: "years",
|
||||
m: "months",
|
||||
n: "daysToMonth",
|
||||
d: "daysToWeek",
|
||||
w: "weeks",
|
||||
W: "weeksToMonth",
|
||||
H: "hours",
|
||||
M: "minutes",
|
||||
S: "seconds",
|
||||
D: "totalDays",
|
||||
I: "totalHours",
|
||||
N: "totalMinutes",
|
||||
T: "totalSeconds"
|
||||
};
|
||||
function escapedRegExp(str) {
|
||||
var sanitize = str.toString().replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
|
||||
return new RegExp(sanitize);
|
||||
}
|
||||
function strftime(offsetObject) {
|
||||
return function(format) {
|
||||
var directives = format.match(/%(-|!)?[A-Z]{1}(:[^;]+;)?/gi);
|
||||
if (directives) {
|
||||
for (var i = 0, len = directives.length; i < len; ++i) {
|
||||
var directive = directives[i].match(/%(-|!)?([a-zA-Z]{1})(:[^;]+;)?/), regexp = escapedRegExp(directive[0]), modifier = directive[1] || "", plural = directive[3] || "", value = null;
|
||||
directive = directive[2];
|
||||
if (DIRECTIVE_KEY_MAP.hasOwnProperty(directive)) {
|
||||
value = DIRECTIVE_KEY_MAP[directive];
|
||||
value = Number(offsetObject[value]);
|
||||
}
|
||||
if (value !== null) {
|
||||
if (modifier === "!") {
|
||||
value = pluralize(plural, value);
|
||||
}
|
||||
if (modifier === "") {
|
||||
if (value < 10) {
|
||||
value = "0" + value.toString();
|
||||
}
|
||||
}
|
||||
format = format.replace(regexp, value.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
format = format.replace(/%%/, "%");
|
||||
return format;
|
||||
};
|
||||
}
|
||||
function pluralize(format, count) {
|
||||
var plural = "s", singular = "";
|
||||
if (format) {
|
||||
format = format.replace(/(:|;|\s)/gi, "").split(/\,/);
|
||||
if (format.length === 1) {
|
||||
plural = format[0];
|
||||
} else {
|
||||
singular = format[0];
|
||||
plural = format[1];
|
||||
}
|
||||
}
|
||||
if (Math.abs(count) > 1) {
|
||||
return plural;
|
||||
} else {
|
||||
return singular;
|
||||
}
|
||||
}
|
||||
var Countdown = function(el, finalDate, options) {
|
||||
this.el = el;
|
||||
this.$el = $(el);
|
||||
this.interval = null;
|
||||
this.offset = {};
|
||||
this.options = $.extend({}, defaultOptions);
|
||||
this.instanceNumber = instances.length;
|
||||
instances.push(this);
|
||||
this.$el.data("countdown-instance", this.instanceNumber);
|
||||
if (options) {
|
||||
if (typeof options === "function") {
|
||||
this.$el.on("update.countdown", options);
|
||||
this.$el.on("stoped.countdown", options);
|
||||
this.$el.on("finish.countdown", options);
|
||||
} else {
|
||||
this.options = $.extend({}, defaultOptions, options);
|
||||
}
|
||||
}
|
||||
this.setFinalDate(finalDate);
|
||||
if (this.options.defer === false) {
|
||||
this.start();
|
||||
}
|
||||
};
|
||||
$.extend(Countdown.prototype, {
|
||||
start: function() {
|
||||
if (this.interval !== null) {
|
||||
clearInterval(this.interval);
|
||||
}
|
||||
var self = this;
|
||||
this.update();
|
||||
this.interval = setInterval(function() {
|
||||
self.update.call(self);
|
||||
}, this.options.precision);
|
||||
},
|
||||
stop: function() {
|
||||
clearInterval(this.interval);
|
||||
this.interval = null;
|
||||
this.dispatchEvent("stoped");
|
||||
},
|
||||
toggle: function() {
|
||||
if (this.interval) {
|
||||
this.stop();
|
||||
} else {
|
||||
this.start();
|
||||
}
|
||||
},
|
||||
pause: function() {
|
||||
this.stop();
|
||||
},
|
||||
resume: function() {
|
||||
this.start();
|
||||
},
|
||||
remove: function() {
|
||||
this.stop.call(this);
|
||||
instances[this.instanceNumber] = null;
|
||||
delete this.$el.data().countdownInstance;
|
||||
},
|
||||
setFinalDate: function(value) {
|
||||
this.finalDate = parseDateString(value);
|
||||
},
|
||||
update: function() {
|
||||
if (this.$el.closest("html").length === 0) {
|
||||
this.remove();
|
||||
return;
|
||||
}
|
||||
var hasEventsAttached = $._data(this.el, "events") !== undefined, now = new Date(), newTotalSecsLeft;
|
||||
newTotalSecsLeft = this.finalDate.getTime() - now.getTime();
|
||||
newTotalSecsLeft = Math.ceil(newTotalSecsLeft / 1e3);
|
||||
newTotalSecsLeft = !this.options.elapse && newTotalSecsLeft < 0 ? 0 : Math.abs(newTotalSecsLeft);
|
||||
if (this.totalSecsLeft === newTotalSecsLeft || !hasEventsAttached) {
|
||||
return;
|
||||
} else {
|
||||
this.totalSecsLeft = newTotalSecsLeft;
|
||||
}
|
||||
this.elapsed = now >= this.finalDate;
|
||||
this.offset = {
|
||||
seconds: this.totalSecsLeft % 60,
|
||||
minutes: Math.floor(this.totalSecsLeft / 60) % 60,
|
||||
hours: Math.floor(this.totalSecsLeft / 60 / 60) % 24,
|
||||
days: Math.floor(this.totalSecsLeft / 60 / 60 / 24) % 7,
|
||||
daysToWeek: Math.floor(this.totalSecsLeft / 60 / 60 / 24) % 7,
|
||||
daysToMonth: Math.floor(this.totalSecsLeft / 60 / 60 / 24 % 30.4368),
|
||||
weeks: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 7),
|
||||
weeksToMonth: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 7) % 4,
|
||||
months: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 30.4368),
|
||||
years: Math.abs(this.finalDate.getFullYear() - now.getFullYear()),
|
||||
totalDays: Math.floor(this.totalSecsLeft / 60 / 60 / 24),
|
||||
totalHours: Math.floor(this.totalSecsLeft / 60 / 60),
|
||||
totalMinutes: Math.floor(this.totalSecsLeft / 60),
|
||||
totalSeconds: this.totalSecsLeft
|
||||
};
|
||||
if (!this.options.elapse && this.totalSecsLeft === 0) {
|
||||
this.stop();
|
||||
this.dispatchEvent("finish");
|
||||
} else {
|
||||
this.dispatchEvent("update");
|
||||
}
|
||||
},
|
||||
dispatchEvent: function(eventName) {
|
||||
var event = $.Event(eventName + ".countdown");
|
||||
event.finalDate = this.finalDate;
|
||||
event.elapsed = this.elapsed;
|
||||
event.offset = $.extend({}, this.offset);
|
||||
event.strftime = strftime(this.offset);
|
||||
this.$el.trigger(event);
|
||||
}
|
||||
});
|
||||
$.fn.countdown = function() {
|
||||
var argumentsArray = Array.prototype.slice.call(arguments, 0);
|
||||
return this.each(function() {
|
||||
var instanceNumber = $(this).data("countdown-instance");
|
||||
if (instanceNumber !== undefined) {
|
||||
var instance = instances[instanceNumber], method = argumentsArray[0];
|
||||
if (Countdown.prototype.hasOwnProperty(method)) {
|
||||
instance[method].apply(instance, argumentsArray.slice(1));
|
||||
} else if (String(method).match(/^[$A-Z_][0-9A-Z_$]*$/i) === null) {
|
||||
instance.setFinalDate.call(instance, method);
|
||||
instance.start();
|
||||
} else {
|
||||
$.error("Method %s does not exist on jQuery.countdown".replace(/\%s/gi, method));
|
||||
}
|
||||
} else {
|
||||
new Countdown(this, argumentsArray[0], argumentsArray[1]);
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
361
public/js/home/vendors/jquery.easypiechart.js
vendored
Normal file
361
public/js/home/vendors/jquery.easypiechart.js
vendored
Normal file
@ -0,0 +1,361 @@
|
||||
/*!
|
||||
Easy pie chart
|
||||
Version: 2.1.7
|
||||
Plugin URL: https://github.com/rendro/easy-pie-chart
|
||||
License: Copyright | Robert Fleischmann
|
||||
!*/
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module unless amdModuleId is set
|
||||
define(["jquery"], function (a0) {
|
||||
return (factory(a0));
|
||||
});
|
||||
} else if (typeof exports === 'object') {
|
||||
// Node. Does not work with strict CommonJS, but
|
||||
// only CommonJS-like environments that support module.exports,
|
||||
// like Node.
|
||||
module.exports = factory(require("jquery"));
|
||||
} else {
|
||||
factory(jQuery);
|
||||
}
|
||||
}(this, function ($) {
|
||||
|
||||
/**
|
||||
* Renderer to render the chart on a canvas object
|
||||
* @param {DOMElement} el DOM element to host the canvas (root of the plugin)
|
||||
* @param {object} options options object of the plugin
|
||||
*/
|
||||
var CanvasRenderer = function(el, options) {
|
||||
var cachedBackground;
|
||||
var canvas = document.createElement('canvas');
|
||||
|
||||
el.appendChild(canvas);
|
||||
|
||||
if (typeof(G_vmlCanvasManager) === 'object') {
|
||||
G_vmlCanvasManager.initElement(canvas);
|
||||
}
|
||||
|
||||
var ctx = canvas.getContext('2d');
|
||||
|
||||
canvas.width = canvas.height = options.size;
|
||||
|
||||
// canvas on retina devices
|
||||
var scaleBy = 1;
|
||||
if (window.devicePixelRatio > 1) {
|
||||
scaleBy = window.devicePixelRatio;
|
||||
canvas.style.width = canvas.style.height = [options.size, 'px'].join('');
|
||||
canvas.width = canvas.height = options.size * scaleBy;
|
||||
ctx.scale(scaleBy, scaleBy);
|
||||
}
|
||||
|
||||
// move 0,0 coordinates to the center
|
||||
ctx.translate(options.size / 2, options.size / 2);
|
||||
|
||||
// rotate canvas -90deg
|
||||
ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI);
|
||||
|
||||
var radius = (options.size - options.lineWidth) / 2;
|
||||
if (options.scaleColor && options.scaleLength) {
|
||||
radius -= options.scaleLength + 2; // 2 is the distance between scale and bar
|
||||
}
|
||||
|
||||
// IE polyfill for Date
|
||||
Date.now = Date.now || function() {
|
||||
return +(new Date());
|
||||
};
|
||||
|
||||
/**
|
||||
* Draw a circle around the center of the canvas
|
||||
* @param {strong} color Valid CSS color string
|
||||
* @param {number} lineWidth Width of the line in px
|
||||
* @param {number} percent Percentage to draw (float between -1 and 1)
|
||||
*/
|
||||
var drawCircle = function(color, lineWidth, percent) {
|
||||
percent = Math.min(Math.max(-1, percent || 0), 1);
|
||||
var isNegative = percent <= 0 ? true : false;
|
||||
|
||||
ctx.beginPath();
|
||||
ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative);
|
||||
|
||||
ctx.strokeStyle = color;
|
||||
ctx.lineWidth = lineWidth;
|
||||
|
||||
ctx.stroke();
|
||||
};
|
||||
|
||||
/**
|
||||
* Draw the scale of the chart
|
||||
*/
|
||||
var drawScale = function() {
|
||||
var offset;
|
||||
var length;
|
||||
|
||||
ctx.lineWidth = 1;
|
||||
ctx.fillStyle = options.scaleColor;
|
||||
|
||||
ctx.save();
|
||||
for (var i = 24; i > 0; --i) {
|
||||
if (i % 6 === 0) {
|
||||
length = options.scaleLength;
|
||||
offset = 0;
|
||||
} else {
|
||||
length = options.scaleLength * 0.6;
|
||||
offset = options.scaleLength - length;
|
||||
}
|
||||
ctx.fillRect(-options.size/2 + offset, 0, length, 1);
|
||||
ctx.rotate(Math.PI / 12);
|
||||
}
|
||||
ctx.restore();
|
||||
};
|
||||
|
||||
/**
|
||||
* Request animation frame wrapper with polyfill
|
||||
* @return {function} Request animation frame method or timeout fallback
|
||||
*/
|
||||
var reqAnimationFrame = (function() {
|
||||
return window.requestAnimationFrame ||
|
||||
window.webkitRequestAnimationFrame ||
|
||||
window.mozRequestAnimationFrame ||
|
||||
function(callback) {
|
||||
window.setTimeout(callback, 1000 / 60);
|
||||
};
|
||||
}());
|
||||
|
||||
/**
|
||||
* Draw the background of the plugin including the scale and the track
|
||||
*/
|
||||
var drawBackground = function() {
|
||||
if(options.scaleColor) drawScale();
|
||||
if(options.trackColor) drawCircle(options.trackColor, options.trackWidth || options.lineWidth, 1);
|
||||
};
|
||||
|
||||
/**
|
||||
* Canvas accessor
|
||||
*/
|
||||
this.getCanvas = function() {
|
||||
return canvas;
|
||||
};
|
||||
|
||||
/**
|
||||
* Canvas 2D context 'ctx' accessor
|
||||
*/
|
||||
this.getCtx = function() {
|
||||
return ctx;
|
||||
};
|
||||
|
||||
/**
|
||||
* Clear the complete canvas
|
||||
*/
|
||||
this.clear = function() {
|
||||
ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size);
|
||||
};
|
||||
|
||||
/**
|
||||
* Draw the complete chart
|
||||
* @param {number} percent Percent shown by the chart between -100 and 100
|
||||
*/
|
||||
this.draw = function(percent) {
|
||||
// do we need to render a background
|
||||
if (!!options.scaleColor || !!options.trackColor) {
|
||||
// getImageData and putImageData are supported
|
||||
if (ctx.getImageData && ctx.putImageData) {
|
||||
if (!cachedBackground) {
|
||||
drawBackground();
|
||||
cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy);
|
||||
} else {
|
||||
ctx.putImageData(cachedBackground, 0, 0);
|
||||
}
|
||||
} else {
|
||||
this.clear();
|
||||
drawBackground();
|
||||
}
|
||||
} else {
|
||||
this.clear();
|
||||
}
|
||||
|
||||
ctx.lineCap = options.lineCap;
|
||||
|
||||
// if barcolor is a function execute it and pass the percent as a value
|
||||
var color;
|
||||
if (typeof(options.barColor) === 'function') {
|
||||
color = options.barColor(percent);
|
||||
} else {
|
||||
color = options.barColor;
|
||||
}
|
||||
|
||||
// draw bar
|
||||
drawCircle(color, options.lineWidth, percent / 100);
|
||||
}.bind(this);
|
||||
|
||||
/**
|
||||
* Animate from some percent to some other percentage
|
||||
* @param {number} from Starting percentage
|
||||
* @param {number} to Final percentage
|
||||
*/
|
||||
this.animate = function(from, to) {
|
||||
var startTime = Date.now();
|
||||
options.onStart(from, to);
|
||||
var animation = function() {
|
||||
var process = Math.min(Date.now() - startTime, options.animate.duration);
|
||||
var currentValue = options.easing(this, process, from, to - from, options.animate.duration);
|
||||
this.draw(currentValue);
|
||||
options.onStep(from, to, currentValue);
|
||||
if (process >= options.animate.duration) {
|
||||
options.onStop(from, to);
|
||||
} else {
|
||||
reqAnimationFrame(animation);
|
||||
}
|
||||
}.bind(this);
|
||||
|
||||
reqAnimationFrame(animation);
|
||||
}.bind(this);
|
||||
};
|
||||
|
||||
var EasyPieChart = function(el, opts) {
|
||||
var defaultOptions = {
|
||||
barColor: '#ef1e25',
|
||||
trackColor: '#f9f9f9',
|
||||
scaleColor: '#dfe0e0',
|
||||
scaleLength: 5,
|
||||
lineCap: 'round',
|
||||
lineWidth: 3,
|
||||
trackWidth: undefined,
|
||||
size: 110,
|
||||
rotate: 0,
|
||||
animate: {
|
||||
duration: 1000,
|
||||
enabled: true
|
||||
},
|
||||
easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/
|
||||
t = t / (d/2);
|
||||
if (t < 1) {
|
||||
return c / 2 * t * t + b;
|
||||
}
|
||||
return -c/2 * ((--t)*(t-2) - 1) + b;
|
||||
},
|
||||
onStart: function(from, to) {
|
||||
return;
|
||||
},
|
||||
onStep: function(from, to, currentValue) {
|
||||
return;
|
||||
},
|
||||
onStop: function(from, to) {
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
// detect present renderer
|
||||
if (typeof(CanvasRenderer) !== 'undefined') {
|
||||
defaultOptions.renderer = CanvasRenderer;
|
||||
} else if (typeof(SVGRenderer) !== 'undefined') {
|
||||
defaultOptions.renderer = SVGRenderer;
|
||||
} else {
|
||||
throw new Error('Please load either the SVG- or the CanvasRenderer');
|
||||
}
|
||||
|
||||
var options = {};
|
||||
var currentValue = 0;
|
||||
|
||||
/**
|
||||
* Initialize the plugin by creating the options object and initialize rendering
|
||||
*/
|
||||
var init = function() {
|
||||
this.el = el;
|
||||
this.options = options;
|
||||
|
||||
// merge user options into default options
|
||||
for (var i in defaultOptions) {
|
||||
if (defaultOptions.hasOwnProperty(i)) {
|
||||
options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i];
|
||||
if (typeof(options[i]) === 'function') {
|
||||
options[i] = options[i].bind(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check for jQuery easing
|
||||
if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) {
|
||||
options.easing = jQuery.easing[options.easing];
|
||||
} else {
|
||||
options.easing = defaultOptions.easing;
|
||||
}
|
||||
|
||||
// process earlier animate option to avoid bc breaks
|
||||
if (typeof(options.animate) === 'number') {
|
||||
options.animate = {
|
||||
duration: options.animate,
|
||||
enabled: true
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof(options.animate) === 'boolean' && !options.animate) {
|
||||
options.animate = {
|
||||
duration: 1000,
|
||||
enabled: options.animate
|
||||
};
|
||||
}
|
||||
|
||||
// create renderer
|
||||
this.renderer = new options.renderer(el, options);
|
||||
|
||||
// initial draw
|
||||
this.renderer.draw(currentValue);
|
||||
|
||||
// initial update
|
||||
if (el.dataset && el.dataset.percent) {
|
||||
this.update(parseFloat(el.dataset.percent));
|
||||
} else if (el.getAttribute && el.getAttribute('data-percent')) {
|
||||
this.update(parseFloat(el.getAttribute('data-percent')));
|
||||
}
|
||||
}.bind(this);
|
||||
|
||||
/**
|
||||
* Update the value of the chart
|
||||
* @param {number} newValue Number between 0 and 100
|
||||
* @return {object} Instance of the plugin for method chaining
|
||||
*/
|
||||
this.update = function(newValue) {
|
||||
newValue = parseFloat(newValue);
|
||||
if (options.animate.enabled) {
|
||||
this.renderer.animate(currentValue, newValue);
|
||||
} else {
|
||||
this.renderer.draw(newValue);
|
||||
}
|
||||
currentValue = newValue;
|
||||
return this;
|
||||
}.bind(this);
|
||||
|
||||
/**
|
||||
* Disable animation
|
||||
* @return {object} Instance of the plugin for method chaining
|
||||
*/
|
||||
this.disableAnimation = function() {
|
||||
options.animate.enabled = false;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Enable animation
|
||||
* @return {object} Instance of the plugin for method chaining
|
||||
*/
|
||||
this.enableAnimation = function() {
|
||||
options.animate.enabled = true;
|
||||
return this;
|
||||
};
|
||||
|
||||
init();
|
||||
};
|
||||
|
||||
$.fn.easyPieChart = function(options) {
|
||||
return this.each(function() {
|
||||
var instanceOptions;
|
||||
|
||||
if (!$.data(this, 'easyPieChart')) {
|
||||
instanceOptions = $.extend({}, options, $(this).data());
|
||||
$.data(this, 'easyPieChart', new EasyPieChart(this, instanceOptions));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
}));
|
||||
84
public/js/home/vendors/jquery.fitvids.js
vendored
Normal file
84
public/js/home/vendors/jquery.fitvids.js
vendored
Normal file
@ -0,0 +1,84 @@
|
||||
/*
|
||||
FitVids
|
||||
Version: 1.1
|
||||
Plugin URI: http://fitvidsjs.com/
|
||||
License: Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com | Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ | Released under the WTFPL license - http://sam.zoy.org/wtfpl/
|
||||
*/
|
||||
|
||||
(function( $ ){
|
||||
|
||||
'use strict';
|
||||
|
||||
$.fn.fitVids = function( options ) {
|
||||
var settings = {
|
||||
customSelector: null,
|
||||
ignore: null
|
||||
};
|
||||
|
||||
if(!document.getElementById('fit-vids-style')) {
|
||||
// appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js
|
||||
var head = document.head || document.getElementsByTagName('head')[0];
|
||||
var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}';
|
||||
var div = document.createElement("div");
|
||||
div.innerHTML = '<p>x</p><style id="fit-vids-style">' + css + '</style>';
|
||||
head.appendChild(div.childNodes[1]);
|
||||
}
|
||||
|
||||
if ( options ) {
|
||||
$.extend( settings, options );
|
||||
}
|
||||
|
||||
return this.each(function(){
|
||||
var selectors = [
|
||||
'iframe[src*="player.vimeo.com"]',
|
||||
'iframe[src*="youtube.com"]',
|
||||
'iframe[src*="youtube-nocookie.com"]',
|
||||
'iframe[src*="kickstarter.com"][src*="video.html"]',
|
||||
'object',
|
||||
'embed'
|
||||
];
|
||||
|
||||
if (settings.customSelector) {
|
||||
selectors.push(settings.customSelector);
|
||||
}
|
||||
|
||||
var ignoreList = '.fitvidsignore';
|
||||
|
||||
if(settings.ignore) {
|
||||
ignoreList = ignoreList + ', ' + settings.ignore;
|
||||
}
|
||||
|
||||
var $allVideos = $(this).find(selectors.join(','));
|
||||
$allVideos = $allVideos.not('object object'); // SwfObj conflict patch
|
||||
$allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video.
|
||||
|
||||
$allVideos.each(function(){
|
||||
var $this = $(this);
|
||||
if($this.parents(ignoreList).length > 0) {
|
||||
return; // Disable FitVids on this video.
|
||||
}
|
||||
if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }
|
||||
if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width'))))
|
||||
{
|
||||
$this.attr('height', 9);
|
||||
$this.attr('width', 16);
|
||||
}
|
||||
var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),
|
||||
width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),
|
||||
aspectRatio = height / width;
|
||||
if(!$this.attr('name')){
|
||||
var videoName = 'fitvid' + $.fn.fitVids._count;
|
||||
$this.attr('name', videoName);
|
||||
$.fn.fitVids._count++;
|
||||
}
|
||||
$this.wrap('<div class="fluid-width-video-wrapper"></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%');
|
||||
$this.removeAttr('height').removeAttr('width');
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Internal counter for unique video names.
|
||||
$.fn.fitVids._count = 0;
|
||||
|
||||
// Works with either jQuery or Zepto
|
||||
})( window.jQuery || window.Zepto );
|
||||
1864
public/js/home/vendors/jquery.magnific-popup.js
vendored
Normal file
1864
public/js/home/vendors/jquery.magnific-popup.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
16
public/js/home/vendors/jquery.mcustomscrollbar.concat.min.js
vendored
Normal file
16
public/js/home/vendors/jquery.mcustomscrollbar.concat.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1246
public/js/home/vendors/justified-gallery.js
vendored
Normal file
1246
public/js/home/vendors/justified-gallery.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1100
public/js/home/vendors/mapstyles.js
vendored
Normal file
1100
public/js/home/vendors/mapstyles.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
6
public/js/home/vendors/parallax.js
vendored
Normal file
6
public/js/home/vendors/parallax.js
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
/*!
|
||||
Crafto - Parallax
|
||||
Created by ThemeZaa
|
||||
!*/
|
||||
|
||||
!function(n){var t=n(window),o=t.height();t.resize(function(){o=t.height()}),n.fn.parallax=function(i,e,l){var r,u=n(this);function c(){var l=t.scrollTop();u.each(function(){var t=n(this),c=t.offset().top;c+r(t)<l||c>l+o||(n(window).width()>1050?u.css("backgroundPosition",i+" "+(c-l)*e+"px"):u.css("backgroundPosition",""))})}u.each(function(n){u.offset().top}),(arguments.length<1||null===i)&&(i="50%"),(arguments.length<2||null===e)&&(e=.5),(arguments.length<3||null===l)&&(l=!0),(arguments.length<4||null===pos)&&(pos=0),r=l?function(n){return n.outerHeight(!0)}:function(n){return n.height()},t.bind("scroll",c).resize(c),c()},n.fn.parallaxImg=function(i,e){var l,r=n(this);function u(){var e=t.scrollTop();r.each(function(){var t=n(this),u=t.offset().top;u+l(t)<e||u>e+o||(n(window).width()>1050?r.css("bottom",i/10*-(u-e)+"px"):r.css("bottom",""))})}(arguments.length<1||null===i)&&(i=1),(arguments.length<2||null===e)&&(e=!0),l=e?function(n){return n.outerHeight(!0)}:function(n){return n.height()},t.bind("scroll",u).resize(u),u()}}(jQuery);
|
||||
77
public/js/home/vendors/parallaxLiquid.js
vendored
Normal file
77
public/js/home/vendors/parallaxLiquid.js
vendored
Normal file
@ -0,0 +1,77 @@
|
||||
/*!
|
||||
Crafto - Parallax Liquid Image
|
||||
Created by ThemeZaa
|
||||
!*/
|
||||
! function(n) {
|
||||
var t = n(window),
|
||||
o = t.height();
|
||||
t.resize(function() {
|
||||
o = t.height()
|
||||
}), n.fn.parallaxLiquidImg = function(i, scale, scaleFraction, reverse, e) {
|
||||
var l, r = n(this);
|
||||
var canScale = scale ? 1 : 0;
|
||||
var scale = scale ? scale : 1.2;
|
||||
var scaleFraction = scaleFraction ? scaleFraction : 0.001;
|
||||
var lastScrollPos = 0;
|
||||
var scrollDir = '';
|
||||
function u() {
|
||||
var e = t.scrollTop();
|
||||
|
||||
r.each(function() {
|
||||
var t = n(this),
|
||||
u = t.offset().top,
|
||||
tHeight = t.outerHeight(),
|
||||
uOffesetBottom = u + tHeight;
|
||||
|
||||
if(e > lastScrollPos) {
|
||||
scrollDir = 'forward';
|
||||
} else{
|
||||
scrollDir = 'reverse';
|
||||
}
|
||||
|
||||
lastScrollPos = e;
|
||||
if (u < n(window).height()+e && uOffesetBottom > e) {
|
||||
if (scrollDir == 'forward') {
|
||||
scale = scale + scaleFraction;
|
||||
} else {
|
||||
scale = scale - scaleFraction;
|
||||
}
|
||||
}
|
||||
|
||||
if (reverse) {
|
||||
if (t.attr('data-parallax-scale')) {
|
||||
u + l(t) < e || u > e + o || (
|
||||
n(window).width() > 1050
|
||||
? (anime({targets: r[0], translateY: i / 6 * (u - e) + "px", scale: canScale ? scale : 1}))
|
||||
: r.css("transform", "translateY(0px)")
|
||||
)
|
||||
} else {
|
||||
u + l(t) < e || u > e + o || (
|
||||
n(window).width() > 1050
|
||||
? (anime({targets: r[0], translateY: i / 20 * -(u - e) + "px", scale: canScale ? scale : 1}))
|
||||
: r.css("transform", "translateY(0px)")
|
||||
)
|
||||
}
|
||||
} else {
|
||||
if (t.attr('data-parallax-scale')) {
|
||||
u + l(t) < e || u > e + o || (
|
||||
n(window).width() > 1050
|
||||
? (anime({targets: r[0], translateY: i / 6 * -(u - e) + "px", scale: canScale ? scale : 1}))
|
||||
: r.css("transform", "translateY(0px)")
|
||||
)
|
||||
} else {
|
||||
u + l(t) < e || u > e + o || (
|
||||
n(window).width() > 1050
|
||||
? (anime({targets: r[0], translateY: i / 20 * (u - e) + "px", scale: canScale ? scale : 1}))
|
||||
: r.css("transform", "translateY(0px)")
|
||||
)
|
||||
}
|
||||
}
|
||||
})
|
||||
}(arguments.length < 1 || null === i) && (i = 1), (arguments.length < 2 || null === e) && (e = !0), l = e ? function(n) {
|
||||
return n.outerHeight(!0)
|
||||
} : function(n) {
|
||||
return n.height()
|
||||
}, t.bind("scroll", u).resize(u), u()
|
||||
}
|
||||
}(jQuery);
|
||||
1539
public/js/home/vendors/particles.js
vendored
Normal file
1539
public/js/home/vendors/particles.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
7
public/js/home/vendors/retina.min.js
vendored
Normal file
7
public/js/home/vendors/retina.min.js
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
/*!
|
||||
Retina
|
||||
Version: 1.3.0
|
||||
Plugin URL: http://imulus.github.io/retinajs/
|
||||
License: Copyright 2014 Imulus, LLC | Released under the MIT license
|
||||
!*/
|
||||
!function(){function a(){}function b(a){return f.retinaImageSuffix+a}function c(a,c){if(this.path=a||"","undefined"!=typeof c&&null!==c)this.at_2x_path=c,this.perform_check=!1;else{if(void 0!==document.createElement){var d=document.createElement("a");d.href=this.path,d.pathname=d.pathname.replace(g,b),this.at_2x_path=d.href}else{var e=this.path.split("?");e[0]=e[0].replace(g,b),this.at_2x_path=e.join("?")}this.perform_check=!0}}function d(a){this.el=a,this.path=new c(this.el.getAttribute("src"),this.el.getAttribute("data-at2x"));var b=this;this.path.check_2x_variant(function(a){a&&b.swap()})}var e="undefined"==typeof exports?window:exports,f={retinaImageSuffix:"@2x",check_mime_type:!0,force_original_dimensions:!0};e.Retina=a,a.configure=function(a){null===a&&(a={});for(var b in a)a.hasOwnProperty(b)&&(f[b]=a[b])},a.init=function(a){null===a&&(a=e);var b=a.onload||function(){};a.onload=function(){var a,c,e=document.getElementsByTagName("img"),f=[];for(a=0;a<e.length;a+=1)c=e[a],c.getAttributeNode("data-no-retina")||f.push(new d(c));b()}},a.isRetina=function(){var a="(-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3/2), (min-resolution: 1.5dppx)";return e.devicePixelRatio>1?!0:e.matchMedia&&e.matchMedia(a).matches?!0:!1};var g=/\.\w+$/;e.RetinaImagePath=c,c.confirmed_paths=[],c.prototype.is_external=function(){return!(!this.path.match(/^https?\:/i)||this.path.match("//"+document.domain))},c.prototype.check_2x_variant=function(a){var b,d=this;return this.is_external()?a(!1):this.perform_check||"undefined"==typeof this.at_2x_path||null===this.at_2x_path?this.at_2x_path in c.confirmed_paths?a(!0):(b=new XMLHttpRequest,b.open("HEAD",this.at_2x_path),b.onreadystatechange=function(){if(4!==b.readyState)return a(!1);if(b.status>=200&&b.status<=399){if(f.check_mime_type){var e=b.getResponseHeader("Content-Type");if(null===e||!e.match(/^image/i))return a(!1)}return c.confirmed_paths.push(d.at_2x_path),a(!0)}return a(!1)},b.send(),void 0):a(!0)},e.RetinaImage=d,d.prototype.swap=function(a){function b(){c.el.complete?(f.force_original_dimensions&&(c.el.setAttribute("width",c.el.offsetWidth),c.el.setAttribute("height",c.el.offsetHeight)),c.el.setAttribute("src",a)):setTimeout(b,5)}"undefined"==typeof a&&(a=this.path.at_2x_path);var c=this;b()},a.isRetina()&&a.init(e)}();
|
||||
1779
public/js/home/vendors/skrollr.js
vendored
Normal file
1779
public/js/home/vendors/skrollr.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
357
public/js/home/vendors/smooth-scroll.js
vendored
Normal file
357
public/js/home/vendors/smooth-scroll.js
vendored
Normal file
@ -0,0 +1,357 @@
|
||||
/*!
|
||||
jQuery Smooth Scroll
|
||||
Version: 2.2.0
|
||||
Plugin URL: https://github.com/kswedberg/jquery-smooth-scroll
|
||||
License: Copyright (c) 2017 Karl Swedberg | Licensed under MIT
|
||||
!*/
|
||||
|
||||
(function(factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
// CommonJS
|
||||
factory(require('jquery'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function($) {
|
||||
|
||||
var version = '2.2.0';
|
||||
var optionOverrides = {};
|
||||
var defaults = {
|
||||
exclude: [],
|
||||
excludeWithin: [],
|
||||
offset: 0,
|
||||
|
||||
// one of 'top' or 'left'
|
||||
direction: 'top',
|
||||
|
||||
// if set, bind click events through delegation
|
||||
// supported since jQuery 1.4.2
|
||||
delegateSelector: null,
|
||||
|
||||
// jQuery set of elements you wish to scroll (for $.smoothScroll).
|
||||
// if null (default), $('html, body').firstScrollable() is used.
|
||||
scrollElement: null,
|
||||
|
||||
// only use if you want to override default behavior
|
||||
scrollTarget: null,
|
||||
|
||||
// automatically focus the target element after scrolling to it
|
||||
autoFocus: false,
|
||||
|
||||
// fn(opts) function to be called before scrolling occurs.
|
||||
// `this` is the element(s) being scrolled
|
||||
beforeScroll: function() {},
|
||||
|
||||
// fn(opts) function to be called after scrolling occurs.
|
||||
// `this` is the triggering element
|
||||
afterScroll: function() {},
|
||||
|
||||
// easing name. jQuery comes with "swing" and "linear." For others, you'll need an easing plugin
|
||||
// from jQuery UI or elsewhere
|
||||
easing: 'swing',
|
||||
|
||||
// speed can be a number or 'auto'
|
||||
// if 'auto', the speed will be calculated based on the formula:
|
||||
// (current scroll position - target scroll position) / autoCoeffic
|
||||
speed: 400,
|
||||
|
||||
// coefficient for "auto" speed
|
||||
autoCoefficient: 2,
|
||||
|
||||
// $.fn.smoothScroll only: whether to prevent the default click action
|
||||
preventDefault: true
|
||||
};
|
||||
|
||||
var getScrollable = function(opts) {
|
||||
var scrollable = [];
|
||||
var scrolled = false;
|
||||
var dir = opts.dir && opts.dir === 'left' ? 'scrollLeft' : 'scrollTop';
|
||||
|
||||
this.each(function() {
|
||||
var el = $(this);
|
||||
|
||||
if (this === document || this === window) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (document.scrollingElement && (this === document.documentElement || this === document.body)) {
|
||||
scrollable.push(document.scrollingElement);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (el[dir]() > 0) {
|
||||
scrollable.push(this);
|
||||
} else {
|
||||
// if scroll(Top|Left) === 0, nudge the element 1px and see if it moves
|
||||
el[dir](1);
|
||||
scrolled = el[dir]() > 0;
|
||||
|
||||
if (scrolled) {
|
||||
scrollable.push(this);
|
||||
}
|
||||
// then put it back, of course
|
||||
el[dir](0);
|
||||
}
|
||||
});
|
||||
|
||||
if (!scrollable.length) {
|
||||
this.each(function() {
|
||||
// If no scrollable elements and <html> has scroll-behavior:smooth because
|
||||
// "When this property is specified on the root element, it applies to the viewport instead."
|
||||
// and "The scroll-behavior property of the … body element is *not* propagated to the viewport."
|
||||
// → https://drafts.csswg.org/cssom-view/#propdef-scroll-behavior
|
||||
if (this === document.documentElement && $(this).css('scrollBehavior') === 'smooth') {
|
||||
scrollable = [this];
|
||||
}
|
||||
|
||||
// If still no scrollable elements, fall back to <body>,
|
||||
// if it's in the jQuery collection
|
||||
// (doing this because Safari sets scrollTop async,
|
||||
// so can't set it to 1 and immediately get the value.)
|
||||
if (!scrollable.length && this.nodeName === 'BODY') {
|
||||
scrollable = [this];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Use the first scrollable element if we're calling firstScrollable()
|
||||
if (opts.el === 'first' && scrollable.length > 1) {
|
||||
scrollable = [scrollable[0]];
|
||||
}
|
||||
|
||||
return scrollable;
|
||||
};
|
||||
|
||||
var rRelative = /^([\-\+]=)(\d+)/;
|
||||
|
||||
$.fn.extend({
|
||||
scrollable: function(dir) {
|
||||
var scrl = getScrollable.call(this, {dir: dir});
|
||||
|
||||
return this.pushStack(scrl);
|
||||
},
|
||||
firstScrollable: function(dir) {
|
||||
var scrl = getScrollable.call(this, {el: 'first', dir: dir});
|
||||
|
||||
return this.pushStack(scrl);
|
||||
},
|
||||
|
||||
smoothScroll: function(options, extra) {
|
||||
options = options || {};
|
||||
|
||||
if (options === 'options') {
|
||||
if (!extra) {
|
||||
return this.first().data('ssOpts');
|
||||
}
|
||||
|
||||
return this.each(function() {
|
||||
var $this = $(this);
|
||||
var opts = $.extend($this.data('ssOpts') || {}, extra);
|
||||
|
||||
$(this).data('ssOpts', opts);
|
||||
});
|
||||
}
|
||||
|
||||
var opts = $.extend({}, $.fn.smoothScroll.defaults, options);
|
||||
|
||||
var clickHandler = function(event) {
|
||||
var escapeSelector = function(str) {
|
||||
return str.replace(/(:|\.|\/)/g, '\\$1');
|
||||
};
|
||||
|
||||
var link = this;
|
||||
var $link = $(this);
|
||||
var thisOpts = $.extend({}, opts, $link.data('ssOpts') || {});
|
||||
var exclude = opts.exclude;
|
||||
var excludeWithin = thisOpts.excludeWithin;
|
||||
var elCounter = 0;
|
||||
var ewlCounter = 0;
|
||||
var include = true;
|
||||
var clickOpts = {};
|
||||
var locationPath = $.smoothScroll.filterPath(location.pathname);
|
||||
var linkPath = $.smoothScroll.filterPath(link.pathname);
|
||||
var hostMatch = location.hostname === link.hostname || !link.hostname;
|
||||
var pathMatch = thisOpts.scrollTarget || (linkPath === locationPath);
|
||||
var thisHash = escapeSelector(link.hash);
|
||||
|
||||
if (thisHash && !$(thisHash).length) {
|
||||
include = false;
|
||||
}
|
||||
|
||||
if (!thisOpts.scrollTarget && (!hostMatch || !pathMatch || !thisHash)) {
|
||||
include = false;
|
||||
} else {
|
||||
while (include && elCounter < exclude.length) {
|
||||
if ($link.is(escapeSelector(exclude[elCounter++]))) {
|
||||
include = false;
|
||||
}
|
||||
}
|
||||
|
||||
while (include && ewlCounter < excludeWithin.length) {
|
||||
if ($link.closest(excludeWithin[ewlCounter++]).length) {
|
||||
include = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (include) {
|
||||
if (thisOpts.preventDefault) {
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
$.extend(clickOpts, thisOpts, {
|
||||
scrollTarget: thisOpts.scrollTarget || thisHash,
|
||||
link: link
|
||||
});
|
||||
|
||||
$.smoothScroll(clickOpts);
|
||||
}
|
||||
};
|
||||
|
||||
if (options.delegateSelector !== null) {
|
||||
this
|
||||
.off('click.smoothscroll', options.delegateSelector)
|
||||
.on('click.smoothscroll', options.delegateSelector, clickHandler);
|
||||
} else {
|
||||
this
|
||||
.off('click.smoothscroll')
|
||||
.on('click.smoothscroll', clickHandler);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
var getExplicitOffset = function(val) {
|
||||
var explicit = {relative: ''};
|
||||
var parts = typeof val === 'string' && rRelative.exec(val);
|
||||
|
||||
if (typeof val === 'number') {
|
||||
explicit.px = val;
|
||||
} else if (parts) {
|
||||
explicit.relative = parts[1];
|
||||
explicit.px = parseFloat(parts[2]) || 0;
|
||||
}
|
||||
|
||||
return explicit;
|
||||
};
|
||||
|
||||
var onAfterScroll = function(opts) {
|
||||
var $tgt = $(opts.scrollTarget);
|
||||
|
||||
if (opts.autoFocus && $tgt.length) {
|
||||
$tgt[0].focus();
|
||||
|
||||
if (!$tgt.is(document.activeElement)) {
|
||||
$tgt.prop({tabIndex: -1});
|
||||
$tgt[0].focus();
|
||||
}
|
||||
}
|
||||
|
||||
opts.afterScroll.call(opts.link, opts);
|
||||
};
|
||||
|
||||
$.smoothScroll = function(options, px) {
|
||||
if (options === 'options' && typeof px === 'object') {
|
||||
return $.extend(optionOverrides, px);
|
||||
}
|
||||
var opts, $scroller, speed, delta;
|
||||
var explicitOffset = getExplicitOffset(options);
|
||||
var scrollTargetOffset = {};
|
||||
var scrollerOffset = 0;
|
||||
var offPos = 'offset';
|
||||
var scrollDir = 'scrollTop';
|
||||
var aniProps = {};
|
||||
var aniOpts = {};
|
||||
|
||||
if (explicitOffset.px) {
|
||||
opts = $.extend({link: null}, $.fn.smoothScroll.defaults, optionOverrides);
|
||||
} else {
|
||||
opts = $.extend({link: null}, $.fn.smoothScroll.defaults, options || {}, optionOverrides);
|
||||
|
||||
if (opts.scrollElement) {
|
||||
offPos = 'position';
|
||||
|
||||
if (opts.scrollElement.css('position') === 'static') {
|
||||
opts.scrollElement.css('position', 'relative');
|
||||
}
|
||||
}
|
||||
|
||||
if (px) {
|
||||
explicitOffset = getExplicitOffset(px);
|
||||
}
|
||||
}
|
||||
|
||||
scrollDir = opts.direction === 'left' ? 'scrollLeft' : scrollDir;
|
||||
|
||||
if (opts.scrollElement) {
|
||||
$scroller = opts.scrollElement;
|
||||
|
||||
if (!explicitOffset.px && !(/^(?:HTML|BODY)$/).test($scroller[0].nodeName)) {
|
||||
scrollerOffset = $scroller[scrollDir]();
|
||||
}
|
||||
} else {
|
||||
$scroller = $('html, body').firstScrollable(opts.direction);
|
||||
}
|
||||
|
||||
// beforeScroll callback function must fire before calculating offset
|
||||
opts.beforeScroll.call($scroller, opts);
|
||||
|
||||
scrollTargetOffset = explicitOffset.px ? explicitOffset : {
|
||||
relative: '',
|
||||
px: ($(opts.scrollTarget)[offPos]() && $(opts.scrollTarget)[offPos]()[opts.direction]) || 0
|
||||
};
|
||||
|
||||
aniProps[scrollDir] = scrollTargetOffset.relative + (scrollTargetOffset.px + scrollerOffset + opts.offset);
|
||||
|
||||
speed = opts.speed;
|
||||
|
||||
// automatically calculate the speed of the scroll based on distance / coefficient
|
||||
if (speed === 'auto') {
|
||||
|
||||
// $scroller[scrollDir]() is position before scroll, aniProps[scrollDir] is position after
|
||||
// When delta is greater, speed will be greater.
|
||||
delta = Math.abs(aniProps[scrollDir] - $scroller[scrollDir]());
|
||||
|
||||
// Divide the delta by the coefficient
|
||||
speed = delta / opts.autoCoefficient;
|
||||
}
|
||||
|
||||
aniOpts = {
|
||||
duration: speed,
|
||||
easing: opts.easing,
|
||||
complete: function() {
|
||||
onAfterScroll(opts);
|
||||
}
|
||||
};
|
||||
|
||||
if (opts.step) {
|
||||
aniOpts.step = opts.step;
|
||||
}
|
||||
|
||||
if ($scroller.length) {
|
||||
$scroller.stop().animate(aniProps, aniOpts);
|
||||
} else {
|
||||
onAfterScroll(opts);
|
||||
}
|
||||
};
|
||||
|
||||
$.smoothScroll.version = version;
|
||||
$.smoothScroll.filterPath = function(string) {
|
||||
string = string || '';
|
||||
|
||||
return string
|
||||
.replace(/^\//, '')
|
||||
.replace(/(?:index|default).[a-zA-Z]{3,4}$/, '')
|
||||
.replace(/\/$/, '');
|
||||
};
|
||||
|
||||
// default options
|
||||
$.fn.smoothScroll.defaults = defaults;
|
||||
|
||||
}));
|
||||
548
public/js/home/vendors/splitting.js
vendored
Normal file
548
public/js/home/vendors/splitting.js
vendored
Normal file
@ -0,0 +1,548 @@
|
||||
/*!
|
||||
Splitting
|
||||
Version: 1.0.5
|
||||
Plugin URL: https://splitting.js.org/
|
||||
License: Copyright © 2018-present Stephen Shaw | Licensed under the MIT license
|
||||
!*/
|
||||
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||
typeof define === 'function' && define.amd ? define(factory) :
|
||||
(global.Splitting = factory());
|
||||
}(this, (function () { 'use strict';
|
||||
|
||||
var root = document;
|
||||
var createText = root.createTextNode.bind(root);
|
||||
|
||||
/**
|
||||
* # setProperty
|
||||
* Apply a CSS var
|
||||
* @param {HTMLElement} el
|
||||
* @param {string} varName
|
||||
* @param {string|number} value
|
||||
*/
|
||||
function setProperty(el, varName, value) {
|
||||
el.style.setProperty(varName, value);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {!HTMLElement} el
|
||||
* @param {!HTMLElement} child
|
||||
*/
|
||||
function appendChild(el, child) {
|
||||
return el.appendChild(child);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {!HTMLElement} parent
|
||||
* @param {string} key
|
||||
* @param {string} text
|
||||
* @param {boolean} whitespace
|
||||
*/
|
||||
function createElement(parent, key, text, whitespace) {
|
||||
var el = root.createElement('span');
|
||||
key && (el.className = key);
|
||||
if (text) {
|
||||
!whitespace && el.setAttribute("data-" + key, text);
|
||||
el.textContent = text;
|
||||
}
|
||||
return (parent && appendChild(parent, el)) || el;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {!HTMLElement} el
|
||||
* @param {string} key
|
||||
*/
|
||||
function getData(el, key) {
|
||||
return el.getAttribute("data-" + key)
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {import('../types').Target} e
|
||||
* @param {!HTMLElement} parent
|
||||
* @returns {!Array<!HTMLElement>}
|
||||
*/
|
||||
function $(e, parent) {
|
||||
return !e || e.length == 0
|
||||
? // null or empty string returns empty array
|
||||
[]
|
||||
: e.nodeName
|
||||
? // a single element is wrapped in an array
|
||||
[e]
|
||||
: // selector and NodeList are converted to Element[]
|
||||
[].slice.call(e[0].nodeName ? e : (parent || root).querySelectorAll(e));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates and fills an array with the value provided
|
||||
* @param {number} len
|
||||
* @param {() => T} valueProvider
|
||||
* @return {T}
|
||||
* @template T
|
||||
*/
|
||||
function Array2D(len) {
|
||||
var a = [];
|
||||
for (; len--; ) {
|
||||
a[len] = [];
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
/**
|
||||
* A for loop wrapper used to reduce js minified size.
|
||||
* @param {!Array<T>} items
|
||||
* @param {function(T):void} consumer
|
||||
* @template T
|
||||
*/
|
||||
function each(items, consumer) {
|
||||
items && items.some(consumer);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {T} obj
|
||||
* @return {function(string):*}
|
||||
* @template T
|
||||
*/
|
||||
function selectFrom(obj) {
|
||||
return function (key) {
|
||||
return obj[key];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* # Splitting.index
|
||||
* Index split elements and add them to a Splitting instance.
|
||||
*
|
||||
* @param {HTMLElement} element
|
||||
* @param {string} key
|
||||
* @param {!Array<!HTMLElement> | !Array<!Array<!HTMLElement>>} items
|
||||
*/
|
||||
function index(element, key, items) {
|
||||
var prefix = '--' + key;
|
||||
var cssVar = prefix + "-index";
|
||||
|
||||
each(items, function (items, i) {
|
||||
if (Array.isArray(items)) {
|
||||
each(items, function(item) {
|
||||
setProperty(item, cssVar, i);
|
||||
});
|
||||
} else {
|
||||
setProperty(items, cssVar, i);
|
||||
}
|
||||
});
|
||||
|
||||
setProperty(element, prefix + "-total", items.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* @type {Record<string, import('./types').ISplittingPlugin>}
|
||||
*/
|
||||
var plugins = {};
|
||||
|
||||
/**
|
||||
* @param {string} by
|
||||
* @param {string} parent
|
||||
* @param {!Array<string>} deps
|
||||
* @return {!Array<string>}
|
||||
*/
|
||||
function resolvePlugins(by, parent, deps) {
|
||||
// skip if already visited this dependency
|
||||
var index = deps.indexOf(by);
|
||||
if (index == -1) {
|
||||
// if new to dependency array, add to the beginning
|
||||
deps.unshift(by);
|
||||
|
||||
// recursively call this function for all dependencies
|
||||
var plugin = plugins[by];
|
||||
if (!plugin) {
|
||||
throw new Error("plugin not loaded: " + by);
|
||||
}
|
||||
each(plugin.depends, function(p) {
|
||||
resolvePlugins(p, by, deps);
|
||||
});
|
||||
} else {
|
||||
// if this dependency was added already move to the left of
|
||||
// the parent dependency so it gets loaded in order
|
||||
var indexOfParent = deps.indexOf(parent);
|
||||
deps.splice(index, 1);
|
||||
deps.splice(indexOfParent, 0, by);
|
||||
}
|
||||
return deps;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal utility for creating plugins... essentially to reduce
|
||||
* the size of the library
|
||||
* @param {string} by
|
||||
* @param {string} key
|
||||
* @param {string[]} depends
|
||||
* @param {Function} split
|
||||
* @returns {import('./types').ISplittingPlugin}
|
||||
*/
|
||||
function createPlugin(by, depends, key, split) {
|
||||
return {
|
||||
by: by,
|
||||
depends: depends,
|
||||
key: key,
|
||||
split: split
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} by
|
||||
* @returns {import('./types').ISplittingPlugin[]}
|
||||
*/
|
||||
function resolve(by) {
|
||||
return resolvePlugins(by, 0, []).map(selectFrom(plugins));
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new plugin to splitting
|
||||
* @param {import('./types').ISplittingPlugin} opts
|
||||
*/
|
||||
function add(opts) {
|
||||
plugins[opts.by] = opts;
|
||||
}
|
||||
|
||||
/**
|
||||
* # Splitting.split
|
||||
* Split an element's textContent into individual elements
|
||||
* @param {!HTMLElement} el Element to split
|
||||
* @param {string} key
|
||||
* @param {string} splitOn
|
||||
* @param {boolean} includePrevious
|
||||
* @param {boolean} preserveWhitespace
|
||||
* @return {!Array<!HTMLElement>}
|
||||
*/
|
||||
function splitText(el, key, splitOn, includePrevious, preserveWhitespace) {
|
||||
// Combine any strange text nodes or empty whitespace.
|
||||
el.normalize();
|
||||
|
||||
// Use fragment to prevent unnecessary DOM thrashing.
|
||||
var elements = [];
|
||||
var F = document.createDocumentFragment();
|
||||
|
||||
if (includePrevious) {
|
||||
elements.push(el.previousSibling);
|
||||
}
|
||||
|
||||
var allElements = [];
|
||||
$(el.childNodes).some(function(next) {
|
||||
if (next.tagName && !next.hasChildNodes()) {
|
||||
// keep elements without child nodes (no text and no children)
|
||||
allElements.push(next);
|
||||
return;
|
||||
}
|
||||
// Recursively run through child nodes
|
||||
if (next.childNodes && next.childNodes.length) {
|
||||
allElements.push(next);
|
||||
elements.push.apply(elements, splitText(next, key, splitOn, includePrevious, preserveWhitespace));
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the text to split, trimming out the whitespace
|
||||
/** @type {string} */
|
||||
var wholeText = next.wholeText || '';
|
||||
var contents = wholeText.trim();
|
||||
|
||||
// If there's no text left after trimming whitespace, continue the loop
|
||||
if (contents.length) {
|
||||
// insert leading space if there was one
|
||||
if (wholeText[0] === ' ') {
|
||||
allElements.push(createText(' '));
|
||||
}
|
||||
// Concatenate the split text children back into the full array
|
||||
each(contents.split(splitOn), function(splitText, i) {
|
||||
if (i && preserveWhitespace) {
|
||||
allElements.push(createElement(F, "whitespace", " ", preserveWhitespace));
|
||||
}
|
||||
var splitEl = createElement(F, key, splitText);
|
||||
elements.push(splitEl);
|
||||
allElements.push(splitEl);
|
||||
});
|
||||
// insert trailing space if there was one
|
||||
if (wholeText[wholeText.length - 1] === ' ') {
|
||||
allElements.push(createText(' '));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
each(allElements, function(el) {
|
||||
appendChild(F, el);
|
||||
});
|
||||
|
||||
// Clear out the existing element
|
||||
el.innerHTML = "";
|
||||
appendChild(el, F);
|
||||
return elements;
|
||||
}
|
||||
|
||||
/** an empty value */
|
||||
var _ = 0;
|
||||
|
||||
function copy(dest, src) {
|
||||
for (var k in src) {
|
||||
dest[k] = src[k];
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
|
||||
var WORDS = 'words';
|
||||
|
||||
var wordPlugin = createPlugin(
|
||||
/* by= */ WORDS,
|
||||
/* depends= */ _,
|
||||
/* key= */ 'word',
|
||||
/* split= */ function(el) {
|
||||
return splitText(el, 'word', /\s+/, 0, 1)
|
||||
}
|
||||
);
|
||||
|
||||
var CHARS = "chars";
|
||||
|
||||
var charPlugin = createPlugin(
|
||||
/* by= */ CHARS,
|
||||
/* depends= */ [WORDS],
|
||||
/* key= */ "char",
|
||||
/* split= */ function(el, options, ctx) {
|
||||
var results = [];
|
||||
|
||||
each(ctx[WORDS], function(word, i) {
|
||||
results.push.apply(results, splitText(word, "char", "", options.whitespace && i));
|
||||
});
|
||||
|
||||
return results;
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* # Splitting
|
||||
*
|
||||
* @param {import('./types').ISplittingOptions} opts
|
||||
* @return {!Array<*>}
|
||||
*/
|
||||
function Splitting (opts) {
|
||||
opts = opts || {};
|
||||
var key = opts.key;
|
||||
|
||||
return $(opts.target || '[data-splitting]').map(function(el) {
|
||||
var ctx = el['🍌'];
|
||||
if (!opts.force && ctx) {
|
||||
return ctx;
|
||||
}
|
||||
|
||||
ctx = el['🍌'] = { el: el };
|
||||
var by = opts.by || getData(el, 'splitting');
|
||||
if (!by || by == 'true') {
|
||||
by = CHARS;
|
||||
}
|
||||
var items = resolve(by);
|
||||
var opts2 = copy({}, opts);
|
||||
each(items, function(plugin) {
|
||||
if (plugin.split) {
|
||||
var pluginBy = plugin.by;
|
||||
var key2 = (key ? '-' + key : '') + plugin.key;
|
||||
var results = plugin.split(el, opts2, ctx);
|
||||
key2 && index(el, key2, results);
|
||||
ctx[pluginBy] = results;
|
||||
el.classList.add(pluginBy);
|
||||
}
|
||||
});
|
||||
|
||||
el.classList.add('splitting');
|
||||
return ctx;
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* # Splitting.html
|
||||
*
|
||||
* @param {import('./types').ISplittingOptions} opts
|
||||
*/
|
||||
function html(opts) {
|
||||
opts = opts || {};
|
||||
var parent = opts.target = createElement();
|
||||
parent.innerHTML = opts.content;
|
||||
Splitting(opts);
|
||||
return parent.outerHTML
|
||||
}
|
||||
|
||||
Splitting.html = html;
|
||||
Splitting.add = add;
|
||||
|
||||
/**
|
||||
* Detects the grid by measuring which elements align to a side of it.
|
||||
* @param {!HTMLElement} el
|
||||
* @param {import('../core/types').ISplittingOptions} options
|
||||
* @param {*} side
|
||||
*/
|
||||
function detectGrid(el, options, side) {
|
||||
var items = $(options.matching || el.children, el);
|
||||
var c = {};
|
||||
|
||||
each(items, function(w) {
|
||||
var val = Math.round(w[side]);
|
||||
(c[val] || (c[val] = [])).push(w);
|
||||
});
|
||||
|
||||
return Object.keys(c).map(Number).sort(byNumber).map(selectFrom(c));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorting function for numbers.
|
||||
* @param {number} a
|
||||
* @param {number} b
|
||||
* @return {number}
|
||||
*/
|
||||
function byNumber(a, b) {
|
||||
return a - b;
|
||||
}
|
||||
|
||||
var linePlugin = createPlugin(
|
||||
/* by= */ 'lines',
|
||||
/* depends= */ [WORDS],
|
||||
/* key= */ 'line',
|
||||
/* split= */ function(el, options, ctx) {
|
||||
return detectGrid(el, { matching: ctx[WORDS] }, 'offsetTop')
|
||||
}
|
||||
);
|
||||
|
||||
var itemPlugin = createPlugin(
|
||||
/* by= */ 'items',
|
||||
/* depends= */ _,
|
||||
/* key= */ 'item',
|
||||
/* split= */ function(el, options) {
|
||||
return $(options.matching || el.children, el)
|
||||
}
|
||||
);
|
||||
|
||||
var rowPlugin = createPlugin(
|
||||
/* by= */ 'rows',
|
||||
/* depends= */ _,
|
||||
/* key= */ 'row',
|
||||
/* split= */ function(el, options) {
|
||||
return detectGrid(el, options, "offsetTop");
|
||||
}
|
||||
);
|
||||
|
||||
var columnPlugin = createPlugin(
|
||||
/* by= */ 'cols',
|
||||
/* depends= */ _,
|
||||
/* key= */ "col",
|
||||
/* split= */ function(el, options) {
|
||||
return detectGrid(el, options, "offsetLeft");
|
||||
}
|
||||
);
|
||||
|
||||
var gridPlugin = createPlugin(
|
||||
/* by= */ 'grid',
|
||||
/* depends= */ ['rows', 'cols']
|
||||
);
|
||||
|
||||
var LAYOUT = "layout";
|
||||
|
||||
var layoutPlugin = createPlugin(
|
||||
/* by= */ LAYOUT,
|
||||
/* depends= */ _,
|
||||
/* key= */ _,
|
||||
/* split= */ function(el, opts) {
|
||||
// detect and set options
|
||||
var rows = opts.rows = +(opts.rows || getData(el, 'rows') || 1);
|
||||
var columns = opts.columns = +(opts.columns || getData(el, 'columns') || 1);
|
||||
|
||||
// Seek out the first <img> if the value is true
|
||||
opts.image = opts.image || getData(el, 'image') || el.currentSrc || el.src;
|
||||
if (opts.image) {
|
||||
var img = $("img", el)[0];
|
||||
opts.image = img && (img.currentSrc || img.src);
|
||||
}
|
||||
|
||||
// add optional image to background
|
||||
if (opts.image) {
|
||||
setProperty(el, "background-image", "url(" + opts.image + ")");
|
||||
}
|
||||
|
||||
var totalCells = rows * columns;
|
||||
var elements = [];
|
||||
|
||||
var container = createElement(_, "cell-grid");
|
||||
while (totalCells--) {
|
||||
// Create a span
|
||||
var cell = createElement(container, "cell");
|
||||
createElement(cell, "cell-inner");
|
||||
elements.push(cell);
|
||||
}
|
||||
|
||||
// Append elements back into the parent
|
||||
appendChild(el, container);
|
||||
|
||||
return elements;
|
||||
}
|
||||
);
|
||||
|
||||
var cellRowPlugin = createPlugin(
|
||||
/* by= */ "cellRows",
|
||||
/* depends= */ [LAYOUT],
|
||||
/* key= */ "row",
|
||||
/* split= */ function(el, opts, ctx) {
|
||||
var rowCount = opts.rows;
|
||||
var result = Array2D(rowCount);
|
||||
|
||||
each(ctx[LAYOUT], function(cell, i, src) {
|
||||
result[Math.floor(i / (src.length / rowCount))].push(cell);
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
);
|
||||
|
||||
var cellColumnPlugin = createPlugin(
|
||||
/* by= */ "cellColumns",
|
||||
/* depends= */ [LAYOUT],
|
||||
/* key= */ "col",
|
||||
/* split= */ function(el, opts, ctx) {
|
||||
var columnCount = opts.columns;
|
||||
var result = Array2D(columnCount);
|
||||
|
||||
each(ctx[LAYOUT], function(cell, i) {
|
||||
result[i % columnCount].push(cell);
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
);
|
||||
|
||||
var cellPlugin = createPlugin(
|
||||
/* by= */ "cells",
|
||||
/* depends= */ ['cellRows', 'cellColumns'],
|
||||
/* key= */ "cell",
|
||||
/* split= */ function(el, opt, ctx) {
|
||||
// re-index the layout as the cells
|
||||
return ctx[LAYOUT];
|
||||
}
|
||||
);
|
||||
|
||||
// install plugins
|
||||
// word/char plugins
|
||||
add(wordPlugin);
|
||||
add(charPlugin);
|
||||
add(linePlugin);
|
||||
// grid plugins
|
||||
add(itemPlugin);
|
||||
add(rowPlugin);
|
||||
add(columnPlugin);
|
||||
add(gridPlugin);
|
||||
// cell-layout plugins
|
||||
add(layoutPlugin);
|
||||
add(cellRowPlugin);
|
||||
add(cellColumnPlugin);
|
||||
add(cellPlugin);
|
||||
|
||||
return Splitting;
|
||||
|
||||
})));
|
||||
266
public/js/home/vendors/sticky-kit.js
vendored
Normal file
266
public/js/home/vendors/sticky-kit.js
vendored
Normal file
@ -0,0 +1,266 @@
|
||||
/*!
|
||||
Sticky-kit
|
||||
Version: 1.1.3
|
||||
Plugin URL: https://github.com/leafo/sticky-kit
|
||||
License: Leaf Corcoran 2015 | Licensed under MIT
|
||||
!*/
|
||||
|
||||
(function() {
|
||||
var $, win;
|
||||
|
||||
$ = window.jQuery;
|
||||
|
||||
win = $(window);
|
||||
|
||||
$.fn.stick_in_parent = function(opts) {
|
||||
var doc, elm, enable_bottoming, fn, i, inner_scrolling, len, manual_spacer, offset_top, outer_width, parent_selector, recalc_every, sticky_class;
|
||||
if (opts == null) {
|
||||
opts = {};
|
||||
}
|
||||
sticky_class = opts.sticky_class, inner_scrolling = opts.inner_scrolling, recalc_every = opts.recalc_every, parent_selector = opts.parent, offset_top = opts.offset_top, manual_spacer = opts.spacer, enable_bottoming = opts.bottoming;
|
||||
if (offset_top == null) {
|
||||
offset_top = 0;
|
||||
}
|
||||
if (parent_selector == null) {
|
||||
parent_selector = void 0;
|
||||
}
|
||||
if (inner_scrolling == null) {
|
||||
inner_scrolling = true;
|
||||
}
|
||||
if (sticky_class == null) {
|
||||
sticky_class = "is_stuck";
|
||||
}
|
||||
doc = $(document);
|
||||
if (enable_bottoming == null) {
|
||||
enable_bottoming = true;
|
||||
}
|
||||
outer_width = function(el) {
|
||||
var _el, computed, w;
|
||||
if (window.getComputedStyle) {
|
||||
_el = el[0];
|
||||
computed = window.getComputedStyle(el[0]);
|
||||
w = parseFloat(computed.getPropertyValue("width")) + parseFloat(computed.getPropertyValue("margin-left")) + parseFloat(computed.getPropertyValue("margin-right"));
|
||||
if (computed.getPropertyValue("box-sizing") !== "border-box") {
|
||||
w += parseFloat(computed.getPropertyValue("border-left-width")) + parseFloat(computed.getPropertyValue("border-right-width")) + parseFloat(computed.getPropertyValue("padding-left")) + parseFloat(computed.getPropertyValue("padding-right"));
|
||||
}
|
||||
return w;
|
||||
} else {
|
||||
return el.outerWidth(true);
|
||||
}
|
||||
};
|
||||
fn = function(elm, padding_bottom, parent_top, parent_height, top, height, el_float, detached) {
|
||||
var bottomed, detach, fixed, last_pos, last_scroll_height, offset, parent, recalc, recalc_and_tick, recalc_counter, spacer, tick;
|
||||
if (elm.data("sticky_kit")) {
|
||||
return;
|
||||
}
|
||||
elm.data("sticky_kit", true);
|
||||
last_scroll_height = doc.height();
|
||||
parent = elm.parent();
|
||||
if (parent_selector != null) {
|
||||
parent = parent.closest(parent_selector);
|
||||
}
|
||||
if (!parent.length) {
|
||||
throw "failed to find stick parent";
|
||||
}
|
||||
fixed = false;
|
||||
bottomed = false;
|
||||
spacer = manual_spacer != null ? manual_spacer && elm.closest(manual_spacer) : $("<div />");
|
||||
if (spacer) {
|
||||
spacer.css('position', elm.css('position'));
|
||||
}
|
||||
recalc = function() {
|
||||
var border_top, padding_top, restore;
|
||||
if (detached) {
|
||||
return;
|
||||
}
|
||||
last_scroll_height = doc.height();
|
||||
border_top = parseInt(parent.css("border-top-width"), 10);
|
||||
padding_top = parseInt(parent.css("padding-top"), 10);
|
||||
padding_bottom = parseInt(parent.css("padding-bottom"), 10);
|
||||
parent_top = parent.offset().top + border_top + padding_top;
|
||||
parent_height = parent.height();
|
||||
if (fixed) {
|
||||
fixed = false;
|
||||
bottomed = false;
|
||||
if (manual_spacer == null) {
|
||||
elm.insertAfter(spacer);
|
||||
spacer.detach();
|
||||
}
|
||||
elm.css({
|
||||
position: "",
|
||||
top: "",
|
||||
width: "",
|
||||
bottom: ""
|
||||
}).removeClass(sticky_class);
|
||||
restore = true;
|
||||
}
|
||||
top = elm.offset().top - (parseInt(elm.css("margin-top"), 10) || 0) - offset_top;
|
||||
height = elm.outerHeight(true);
|
||||
el_float = elm.css("float");
|
||||
if (spacer) {
|
||||
spacer.css({
|
||||
width: outer_width(elm),
|
||||
height: height,
|
||||
display: elm.css("display"),
|
||||
"vertical-align": elm.css("vertical-align"),
|
||||
"float": el_float
|
||||
});
|
||||
}
|
||||
if (restore) {
|
||||
return tick();
|
||||
}
|
||||
};
|
||||
recalc();
|
||||
if (height === parent_height) {
|
||||
return;
|
||||
}
|
||||
last_pos = void 0;
|
||||
offset = offset_top;
|
||||
recalc_counter = recalc_every;
|
||||
tick = function() {
|
||||
var css, delta, recalced, scroll, will_bottom, win_height;
|
||||
if (detached) {
|
||||
return;
|
||||
}
|
||||
recalced = false;
|
||||
if (recalc_counter != null) {
|
||||
recalc_counter -= 1;
|
||||
if (recalc_counter <= 0) {
|
||||
recalc_counter = recalc_every;
|
||||
recalc();
|
||||
recalced = true;
|
||||
}
|
||||
}
|
||||
if (!recalced && doc.height() !== last_scroll_height) {
|
||||
recalc();
|
||||
recalced = true;
|
||||
}
|
||||
scroll = win.scrollTop();
|
||||
if (last_pos != null) {
|
||||
delta = scroll - last_pos;
|
||||
}
|
||||
last_pos = scroll;
|
||||
if (fixed) {
|
||||
if (enable_bottoming) {
|
||||
will_bottom = scroll + height + offset > parent_height + parent_top;
|
||||
if (bottomed && !will_bottom) {
|
||||
bottomed = false;
|
||||
elm.css({
|
||||
position: "fixed",
|
||||
bottom: "",
|
||||
top: offset
|
||||
}).trigger("sticky_kit:unbottom");
|
||||
}
|
||||
}
|
||||
if (scroll < top) {
|
||||
fixed = false;
|
||||
offset = offset_top;
|
||||
if (manual_spacer == null) {
|
||||
if (el_float === "left" || el_float === "right") {
|
||||
elm.insertAfter(spacer);
|
||||
}
|
||||
spacer.detach();
|
||||
}
|
||||
css = {
|
||||
position: "",
|
||||
width: "",
|
||||
top: ""
|
||||
};
|
||||
elm.css(css).removeClass(sticky_class).trigger("sticky_kit:unstick");
|
||||
}
|
||||
if (inner_scrolling) {
|
||||
win_height = win.height();
|
||||
if (height + offset_top > win_height) {
|
||||
if (!bottomed) {
|
||||
offset -= delta;
|
||||
offset = Math.max(win_height - height, offset);
|
||||
offset = Math.min(offset_top, offset);
|
||||
if (fixed) {
|
||||
elm.css({
|
||||
top: offset + "px"
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (scroll > top) {
|
||||
fixed = true;
|
||||
css = {
|
||||
position: "fixed",
|
||||
top: offset
|
||||
};
|
||||
css.width = elm.css("box-sizing") === "border-box" ? elm.outerWidth() + "px" : elm.width() + "px";
|
||||
elm.css(css).addClass(sticky_class);
|
||||
if (manual_spacer == null) {
|
||||
elm.after(spacer);
|
||||
if (el_float === "left" || el_float === "right") {
|
||||
spacer.append(elm);
|
||||
}
|
||||
}
|
||||
elm.trigger("sticky_kit:stick");
|
||||
}
|
||||
}
|
||||
if (fixed && enable_bottoming) {
|
||||
if (will_bottom == null) {
|
||||
will_bottom = scroll + height + offset > parent_height + parent_top;
|
||||
}
|
||||
if (!bottomed && will_bottom) {
|
||||
bottomed = true;
|
||||
if (parent.css("position") === "static") {
|
||||
parent.css({
|
||||
position: "relative"
|
||||
});
|
||||
}
|
||||
return elm.css({
|
||||
position: "absolute",
|
||||
bottom: padding_bottom,
|
||||
top: "auto"
|
||||
}).trigger("sticky_kit:bottom");
|
||||
}
|
||||
}
|
||||
};
|
||||
recalc_and_tick = function() {
|
||||
recalc();
|
||||
return tick();
|
||||
};
|
||||
detach = function() {
|
||||
detached = true;
|
||||
win.off("touchmove", tick);
|
||||
win.off("scroll", tick);
|
||||
win.off("resize", recalc_and_tick);
|
||||
$(document.body).off("sticky_kit:recalc", recalc_and_tick);
|
||||
elm.off("sticky_kit:detach", detach);
|
||||
elm.removeData("sticky_kit");
|
||||
elm.css({
|
||||
position: "",
|
||||
bottom: "",
|
||||
top: "",
|
||||
width: ""
|
||||
});
|
||||
parent.position("position", "");
|
||||
if (fixed) {
|
||||
if (manual_spacer == null) {
|
||||
if (el_float === "left" || el_float === "right") {
|
||||
elm.insertAfter(spacer);
|
||||
}
|
||||
spacer.remove();
|
||||
}
|
||||
return elm.removeClass(sticky_class);
|
||||
}
|
||||
};
|
||||
win.on("touchmove", tick);
|
||||
win.on("scroll", tick);
|
||||
win.on("resize", recalc_and_tick);
|
||||
$(document.body).on("sticky_kit:recalc", recalc_and_tick);
|
||||
elm.on("sticky_kit:detach", detach);
|
||||
return setTimeout(tick, 0);
|
||||
};
|
||||
for (i = 0, len = this.length; i < len; i++) {
|
||||
elm = this[i];
|
||||
fn($(elm));
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
}).call(this);
|
||||
9533
public/js/home/vendors/swiper-bundle.js
vendored
Normal file
9533
public/js/home/vendors/swiper-bundle.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@ -1 +1,7 @@
|
||||
import './bootstrap';
|
||||
|
||||
// Import our custom CSS
|
||||
import '../sass/app.scss'
|
||||
|
||||
// Import all of Bootstrap’s JS
|
||||
import * as bootstrap from 'bootstrap'
|
||||
2
resources/sass/app.scss
Normal file
2
resources/sass/app.scss
Normal file
@ -0,0 +1,2 @@
|
||||
// Import all of Bootstrap’s CSS
|
||||
@import "bootstrap/scss/bootstrap";
|
||||
37
resources/views/components/layouts/app.blade.php
Normal file
37
resources/views/components/layouts/app.blade.php
Normal file
@ -0,0 +1,37 @@
|
||||
<!doctype html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
||||
|
||||
<head>
|
||||
<title>{{ $title }} | Simedkom</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="author" content="Diskominfo Purwakarta">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
||||
<meta name="description" content="Sistem Media Komunikasi">
|
||||
<!-- favicon icon -->
|
||||
<link rel="shortcut icon" href="images/favicon.png">
|
||||
<link rel="apple-touch-icon" href="images/apple-touch-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">
|
||||
<!-- google fonts preconnect -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<!-- style sheets and font icons -->
|
||||
<link rel="stylesheet" href="{{ asset('css/home/vendors.css') }}" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
|
||||
<link rel="stylesheet" href="{{ asset('css/home/style.css') }}" />
|
||||
<link rel="stylesheet" href="{{ asset('css/home/responsive.css') }}" />
|
||||
<link rel="stylesheet" href="{{ asset('css/home/it-business.css') }}" />
|
||||
|
||||
@vite(['resources/sass/app.scss', 'resources/js/app.js'])
|
||||
</head>
|
||||
|
||||
<body data-mobile-nav-style="full-screen-menu" data-mobile-nav-bg-color="#252840">
|
||||
{{ $slot }}
|
||||
|
||||
<script type="text/javascript" src="{{ asset('js/home/jquery.js') }}"></script>
|
||||
<script type="text/javascript" src="{{ asset('js/home/vendors.js') }}"></script>
|
||||
<script type="text/javascript" src="{{ asset('js/home/main.js') }}"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
110
resources/views/components/partials/footer.blade.php
Normal file
110
resources/views/components/partials/footer.blade.php
Normal file
@ -0,0 +1,110 @@
|
||||
<footer class="p-0 footer-light position-relative">
|
||||
<div class="container position-relative">
|
||||
<div class="row justify-content-center pt-5 sm-pt-40px">
|
||||
<!-- start footer column -->
|
||||
<div
|
||||
class="col-6 col-xl-3 col-lg-12 col-sm-6 last-paragraph-no-margin text-xl-start text-lg-center order-sm-1 lg-mb-50px sm-mb-30px">
|
||||
<a href="demo-it-business.html" class="footer-logo mb-15px d-inline-block">
|
||||
<img src="images/demo-it-business-logo-black.png"
|
||||
data-at2x="images/demo-it-business-logo-black@2x.png" alt="">
|
||||
</a>
|
||||
<p class="lh-28 w-90 xl-w-100 mx-lg-auto mx-xl-0">Gearing your company through an innovative
|
||||
strategy.</p>
|
||||
<div class="elements-social social-icon-style-02 mt-15px">
|
||||
<ul class="medium-icon dark">
|
||||
<li class="my-0"><a class="facebook" href="https://www.facebook.com/" target="_blank"><i
|
||||
class="fa-brands fa-facebook-f"></i></a></li>
|
||||
<li class="my-0"><a class="dribbble" href="http://www.dribbble.com" target="_blank"><i
|
||||
class="fa-brands fa-dribbble"></i></a></li>
|
||||
<li class="my-0"><a class="twitter" href="http://www.twitter.com" target="_blank"><i
|
||||
class="fa-brands fa-twitter"></i></a></li>
|
||||
<li class="my-0"><a class="instagram" href="http://www.instagram.com" target="_blank"><i
|
||||
class="fa-brands fa-instagram"></i></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end footer column -->
|
||||
<!-- start footer column -->
|
||||
<div class="col-6 col-xl-2 col-lg-3 col-sm-4 xs-mb-30px order-sm-3 order-lg-2">
|
||||
<span class="fw-600 d-block text-dark-gray mb-5px">Company</span>
|
||||
<ul>
|
||||
<li><a href="demo-it-business-about.html">Who we are</a></li>
|
||||
<li><a href="demo-it-business-services.html">Our services</a>
|
||||
<div
|
||||
class="bg-dark-gray fw-600 text-white lh-22 text-uppercase border-radius-30px ps-10px pe-10px fs-10 ms-10px d-inline-block align-middle">
|
||||
Hot</div>
|
||||
</li>
|
||||
<li><a href="demo-it-business-case-studies.html">Our clients</a></li>
|
||||
<li><a href="demo-it-business-contact.html">Contact us</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- end footer column -->
|
||||
<!-- start footer column -->
|
||||
<div class="col-6 col-xl-2 col-lg-3 col-md-5 col-sm-4 xs-mb-30px order-sm-4 order-lg-3">
|
||||
<span class="fw-600 d-block text-dark-gray mb-5px">Services</span>
|
||||
<ul>
|
||||
<li><a href="#">Planning</a></li>
|
||||
<li><a href="#">Research</a></li>
|
||||
<li><a href="#">Consulting</a></li>
|
||||
<li><a href="#">Analysis</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- end footer column -->
|
||||
<!-- start footer column -->
|
||||
<div class="col-6 col-xl-2 col-lg-3 col-md-3 col-sm-4 xs-mb-30px order-sm-5 order-lg-4">
|
||||
<span class="fw-600 d-block text-dark-gray mb-5px">Need help?</span>
|
||||
<span>Call us directly?</span>
|
||||
<span class="d-block mb-10px"><a class="text-dark-gray fw-600" href="tel:1235678901">(123)
|
||||
567 8901</a></span>
|
||||
<span>Need support?</span>
|
||||
<a href="mailto:help@domain.com" class="text-dark-gray fw-600">help@domain.com</a>
|
||||
</div>
|
||||
<!-- end footer column -->
|
||||
<!-- start footer column -->
|
||||
<div class="col-xl-3 col-lg-3 col-sm-6 md-mb-50px sm-mb-30px xs-mb-0 order-sm-2 order-lg-5">
|
||||
<span class="fw-600 d-block text-dark-gray mb-5px">Subscribe newsletter</span>
|
||||
<p class="lh-28 w-95 mb-10px xs-mb-10px">Subscribe our newsletter to get the latest news and
|
||||
updates!</p>
|
||||
<div class="d-inline-block w-100 newsletter-style-04 position-relative">
|
||||
<form action="email-templates/subscribe-newsletter.php" method="post"
|
||||
class="position-relative w-100">
|
||||
<input
|
||||
class="fs-15 bg-white w-100 border-0 border-bottom border-1 border-color-dark-gray form-control required"
|
||||
type="email" name="email" placeholder="Enter your email address" />
|
||||
<input type="hidden" name="redirect" value="">
|
||||
<button class="btn submit" aria-label="submit"><i
|
||||
class="icon feather icon-feather-mail icon-small"></i></button>
|
||||
<div
|
||||
class="form-results border-radius-0px p-15px fs-16 lh-24 w-100 text-center position-absolute d-none">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end footer column -->
|
||||
</div>
|
||||
<div class="row justify-content-center align-items-center pt-7">
|
||||
<!-- start divider -->
|
||||
<div class="col-12">
|
||||
<div class="divider-style-03 divider-style-03-01 border-color-extra-medium-gray"></div>
|
||||
</div>
|
||||
<!-- end divider -->
|
||||
<!-- start copyright -->
|
||||
<div
|
||||
class="col-lg-5 pt-20px pb-20px md-pt-0 order-2 order-lg-1 text-center text-lg-start last-paragraph-no-margin fs-14">
|
||||
<p>© 2024 Crafto is Proudly Powered by <a href="https://www.themezaa.com/" target="_blank"
|
||||
class="text-dark-gray fw-600 text-decoration-line-bottom">ThemeZaa</a>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end copyright -->
|
||||
<!-- start footer menu -->
|
||||
<div class="col-lg-7 pt-20px pb-20px md-pt-25px md-pb-5px order-1 order-lg-2 text-center text-lg-end fs-14">
|
||||
<ul class="footer-navbar sm-lh-normal">
|
||||
<li><a href="#" class="nav-link">Privacy policy</a></li>
|
||||
<li><a href="#" class="nav-link">Terms and conditions</a></li>
|
||||
<li><a href="#" class="nav-link">Copyright</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- end footer menu -->
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
67
resources/views/components/partials/header.blade.php
Normal file
67
resources/views/components/partials/header.blade.php
Normal file
@ -0,0 +1,67 @@
|
||||
<header>
|
||||
<!-- start navigation -->
|
||||
<nav class="navbar navbar-expand-lg header-transparent bg-transparent header-reverse glass-effect"
|
||||
data-header-hover="light">
|
||||
<div class="container-fluid">
|
||||
<div class="col-auto col-xxl-3 col-lg-2 me-lg-0 me-auto">
|
||||
<a class="navbar-brand" href="demo-it-business.html">
|
||||
<img src="images/demo-it-business-logo-white.png"
|
||||
data-at2x="images/demo-it-business-logo-white@2x.png" alt="" class="default-logo">
|
||||
<img src="images/demo-it-business-logo-black.png"
|
||||
data-at2x="images/demo-it-business-logo-black@2x.png" alt="" class="alt-logo">
|
||||
<img src="images/demo-it-business-logo-black.png"
|
||||
data-at2x="images/demo-it-business-logo-black@2x.png" alt="" class="mobile-logo">
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-auto col-xxl-6 col-lg-8 menu-order position-static">
|
||||
<button class="navbar-toggler float-start" type="button" data-bs-toggle="collapse"
|
||||
data-bs-target="#navbarNav" aria-controls="navbarNav" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-line"></span>
|
||||
<span class="navbar-toggler-line"></span>
|
||||
<span class="navbar-toggler-line"></span>
|
||||
<span class="navbar-toggler-line"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse justify-content-center" id="navbarNav">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item"><a href="demo-it-business.html" class="nav-link">Home</a></li>
|
||||
<li class="nav-item"><a href="demo-it-business-about.html" class="nav-link">About</a>
|
||||
</li>
|
||||
<li class="nav-item dropdown dropdown-with-icon-style02">
|
||||
<a href="demo-it-business-services.html" class="nav-link">Services</a>
|
||||
<i class="fa-solid fa-angle-down dropdown-toggle" id="navbarDropdownMenuLink" role="button"
|
||||
data-bs-toggle="dropdown" aria-expanded="false"></i>
|
||||
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
|
||||
<li><a href="demo-it-business-services-details.html"><i class="bi bi-briefcase"></i>Data
|
||||
analytics</a></li>
|
||||
<li><a href="demo-it-business-services-details.html"><i
|
||||
class="bi bi-clipboard-data"></i>Finance consulting</a></li>
|
||||
<li><a href="demo-it-business-services-details.html"><i
|
||||
class="bi bi-peace"></i>Technology innovation</a></li>
|
||||
<li><a href="demo-it-business-services-details.html"><i
|
||||
class="bi bi-bar-chart-line"></i>Digital commerce</a></li>
|
||||
<li><a href="demo-it-business-services-details.html"><i
|
||||
class="bi bi-send-check"></i>Artificial intelligence</a></li>
|
||||
<li><a href="demo-it-business-services-details.html"><i class="bi bi-globe2"></i>Cloud
|
||||
computing</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item"><a href="demo-it-business-case-studies.html" class="nav-link">Case
|
||||
studies</a></li>
|
||||
<li class="nav-item"><a href="demo-it-business-blog.html" class="nav-link">Blog</a>
|
||||
</li>
|
||||
<li class="nav-item"><a href="demo-it-business-contact.html" class="nav-link">Contact</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto col-xxl-3 col-lg-2 text-end d-none d-sm-flex">
|
||||
<div class="header-icon">
|
||||
<div class="header-button"><a href="demo-it-business-contact.html"
|
||||
class="btn btn-large btn-transparent-white-light btn-rounded text-transform-none border-1">Start
|
||||
a project<i class="fa-solid fa-arrow-right"></i></a></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<!-- end navigation -->
|
||||
</header>
|
||||
1067
resources/views/livewire/home/index.blade.php
Normal file
1067
resources/views/livewire/home/index.blade.php
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,6 @@
|
||||
<?php
|
||||
|
||||
use App\Livewire\Home\Index;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::get('/', function () {
|
||||
return redirect('/dashboard');
|
||||
});
|
||||
Route::get('/', Index::class)->name('home');
|
||||
|
||||
@ -6,6 +6,7 @@ export default defineConfig({
|
||||
plugins: [
|
||||
laravel({
|
||||
input: [
|
||||
'resources/sass/app.scss',
|
||||
'resources/js/app.js',
|
||||
'resources/css/filament/dashboard/theme.css'
|
||||
],
|
||||
|
||||
Loading…
Reference in New Issue
Block a user