feat: implement initial home page with new frontend assets and Livewire components

This commit is contained in:
Yoga Pangestu 2026-01-05 10:44:28 +07:00
parent 3760eeb00d
commit 492a56504d
47 changed files with 134746 additions and 6 deletions

View 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');
}
}

View 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');
}
}

View 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
View File

@ -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",

View File

@ -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"
}
}
}

View 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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

481
public/js/home/vendors/atropos.js vendored Normal file
View 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

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

5614
public/js/home/vendors/gsap.js vendored Normal file

File diff suppressed because it is too large Load Diff

View 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;
} );

View 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

File diff suppressed because it is too large Load Diff

114
public/js/home/vendors/jquery-cookie.js vendored Normal file
View 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
View 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;
}
}());

View 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);
});
};
}));

View 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]);
}
});
};
});

View 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));
}
});
};
}));

View 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 );

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

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
View 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);

View 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

File diff suppressed because it is too large Load Diff

7
public/js/home/vendors/retina.min.js vendored Normal file
View 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

File diff suppressed because it is too large Load Diff

357
public/js/home/vendors/smooth-scroll.js vendored Normal file
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

View File

@ -1 +1,7 @@
import './bootstrap';
// Import our custom CSS
import '../sass/app.scss'
// Import all of Bootstraps JS
import * as bootstrap from 'bootstrap'

2
resources/sass/app.scss Normal file
View File

@ -0,0 +1,2 @@
// Import all of Bootstraps CSS
@import "bootstrap/scss/bootstrap";

View 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>

View 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>&copy; 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>

View 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>

File diff suppressed because it is too large Load Diff

View File

@ -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');

View File

@ -6,6 +6,7 @@ export default defineConfig({
plugins: [
laravel({
input: [
'resources/sass/app.scss',
'resources/js/app.js',
'resources/css/filament/dashboard/theme.css'
],