added footer & updated animation

This commit is contained in:
Juthatip McDevitt 2024-04-16 21:47:16 -05:00
parent b27971cf18
commit a30de8207d
10 changed files with 310 additions and 27 deletions

View file

@ -11,9 +11,11 @@
"framer-motion": "^11.0.27",
"gsap": "^3.12.5",
"react": "^18.2.0",
"react-countup": "^6.5.3",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
"react-router-dom": "^6.22.3",
"react-scroll-trigger": "^0.6.14",
"react-slick": "^0.30.2",
"slick-carousel": "^1.8.1"
},
@ -941,6 +943,18 @@
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
"integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.15",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
@ -1252,11 +1266,21 @@
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true
},
"node_modules/@types/node": {
"version": "20.12.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
"integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/@types/prop-types": {
"version": "15.7.12",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
"integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
"dev": true
"integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q=="
},
"node_modules/@types/react": {
"version": "18.2.75",
@ -1277,6 +1301,11 @@
"@types/react": "*"
}
},
"node_modules/@types/scheduler": {
"version": "0.16.8",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
"integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A=="
},
"node_modules/@ungap/structured-clone": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@ -1654,6 +1683,14 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"optional": true,
"peer": true
},
"node_modules/call-bind": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
@ -1766,6 +1803,11 @@
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
"integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
},
"node_modules/clean-react-props": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/clean-react-props/-/clean-react-props-0.4.0.tgz",
"integrity": "sha512-8KKm9sC/cUax4SBWwSY5a3W44aJKOUQg39Bo3fRErp3/mF8D1kMN9xc1lvQGmvkK/AmpH2Xh/UYVZOJMcxoy9w=="
},
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@ -1802,6 +1844,11 @@
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true
},
"node_modules/countup.js": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.8.0.tgz",
"integrity": "sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ=="
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@ -1831,8 +1878,7 @@
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"dev": true
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"node_modules/data-view-buffer": {
"version": "1.0.1",
@ -3579,6 +3625,11 @@
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
},
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@ -3711,7 +3762,6 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
@ -4177,7 +4227,6 @@
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"dev": true,
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
@ -4224,6 +4273,17 @@
"node": ">=0.10.0"
}
},
"node_modules/react-countup": {
"version": "6.5.3",
"resolved": "https://registry.npmjs.org/react-countup/-/react-countup-6.5.3.tgz",
"integrity": "sha512-udnqVQitxC7QWADSPDOxVWULkLvKUWrDapn5i53HE4DPRVgs+Y5rr4bo25qEl8jSh+0l2cToJgGMx+clxPM3+w==",
"dependencies": {
"countup.js": "^2.8.0"
},
"peerDependencies": {
"react": ">= 16.3.0"
}
},
"node_modules/react-dom": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
@ -4247,8 +4307,7 @@
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/react-refresh": {
"version": "0.14.0",
@ -4289,6 +4348,44 @@
"react-dom": ">=16.8"
}
},
"node_modules/react-scroll-trigger": {
"version": "0.6.14",
"resolved": "https://registry.npmjs.org/react-scroll-trigger/-/react-scroll-trigger-0.6.14.tgz",
"integrity": "sha512-Z7l9CMJTU4uPArv/3XaJzCtSej+JeLpbev1X7JxAmZwGf16ya5mxqjeeQ/5O4thvOVK0ZWhgyQf52tH1hg1O7Q==",
"dependencies": {
"@types/react": "^16.14.23",
"@types/react-dom": "^16.9.14",
"clean-react-props": "^0.4.0",
"lodash.throttle": "^4.1.1",
"prop-types": "^15.8.1"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ryanhefner"
},
"peerDependencies": {
"react": ">=15",
"react-dom": ">=15"
}
},
"node_modules/react-scroll-trigger/node_modules/@types/react": {
"version": "16.14.60",
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.60.tgz",
"integrity": "sha512-wIFmnczGsTcgwCBeIYOuy2mdXEiKZ5znU/jNOnMZPQyCcIxauMGWlX0TNG4lZ7NxRKj7YUIZRneJQSSdB2jKgg==",
"dependencies": {
"@types/prop-types": "*",
"@types/scheduler": "^0.16",
"csstype": "^3.0.2"
}
},
"node_modules/react-scroll-trigger/node_modules/@types/react-dom": {
"version": "16.9.24",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.24.tgz",
"integrity": "sha512-Gcmq2JTDheyWn/1eteqyzzWKSqDjYU6KYsIvH7thb7CR5OYInAWOX+7WnKf6PaU/cbdOc4szJItcDEJO7UGmfA==",
"dependencies": {
"@types/react": "^16"
}
},
"node_modules/react-slick": {
"version": "0.30.2",
"resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.2.tgz",
@ -4630,6 +4727,29 @@
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/source-map-support/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"optional": true,
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/string-convert": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
@ -4958,6 +5078,34 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/terser": {
"version": "5.30.3",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz",
"integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"optional": true,
"peer": true
},
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@ -5129,6 +5277,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/undici-types": {
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
"dev": true,
"optional": true,
"peer": true
},
"node_modules/update-browserslist-db": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",

View file

@ -13,9 +13,11 @@
"framer-motion": "^11.0.27",
"gsap": "^3.12.5",
"react": "^18.2.0",
"react-countup": "^6.5.3",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
"react-router-dom": "^6.22.3",
"react-scroll-trigger": "^0.6.14",
"react-slick": "^0.30.2",
"slick-carousel": "^1.8.1"
},

View file

@ -1,5 +1,6 @@
import About from "./components/About"
import Contact from "./components/Contact"
import Footer from "./components/Footer"
import Header from "./components/Header"
import Home from "./components/Home"
import Philosophy from "./components/Philosophy"
@ -20,6 +21,7 @@ function App() {
<Philosophy/>
<Strategy/>
<Contact/>
<Footer/>
</div>
)
}

View file

@ -1,18 +1,22 @@
import { useState } from "react";
import { PiArrowElbowRightDown} from "react-icons/pi";
import ScrollTrigger from "react-scroll-trigger"
const About = () => {
const [counterOn, setCounterOn] = useState(false);
return (
<div className="px-14 mt-[5vw]">
<div className="flex-col text-3xl">
<p>Full service digital agency.</p>
<div className="flex justify-between">
<p>Two engagement models.</p>
<p>Paris / San Diego</p>
<ScrollTrigger onEnter={() => setCounterOn(true)} onExit={() => setCounterOn(false)}>
<div className="flex-col text-3xl">
<p>Full service digital agency.</p>
<div className="flex justify-between">
<p>Two engagement models.</p>
<p>Paris / San Diego</p>
</div>
{counterOn && <div className="line mt-2 relative"></div>}
</div>
<div className="border-[#555555] border-t-2 mt-2"></div>
</div>
</ScrollTrigger>
<div className="flex flex-col justify-between">
<div>
<p className="mt-5 text-[4vw] leading-[4.3vw] tracking-tight justify-center indent-40" >We are a digital brand accelerator. Our mission is to tarnsform founders visions into remarkable brands. Choose traditional compensation or and equity

View file

@ -0,0 +1,56 @@
import { FaXTwitter } from "react-icons/fa6";
import { GoArrowUpRight } from "react-icons/go";
const Footer = () => {
return (
<>
<div className='w-full h-[60vh] bg-[#0E0E0E] text-white px-14 flex flex-col justify-between'>
<div className="flex justify-between mt-[8vh]">
<div>
<p className=' text-3xl'>Relax. We&apos;ve got you.</p>
<button className="mt-[1.5vw] px-6 py-4 border text-xl rounded-lg hover:bg-[#FAF8F3] hover:text-black hover:transition-transform duration-500">Take a seat</button>
</div>
<div className="flex gap-[5vw] text-xl">
<div className="flex flex-col ">
<a href="">Home</a>
<a href="">Work</a>
<a href="">About</a>
<a href="">Services & Models</a>
<a href="">Contact</a>
</div>
<div className="flex flex-col">
<a href="" className="flex"><FaXTwitter/><GoArrowUpRight className="text-md"/></a>
<a href="" className="flex">Instagram <GoArrowUpRight className="text-md"/></a>
<a href="" className="flex">LinkedIn <GoArrowUpRight className="text-md"/></a>
</div>
</div>
</div>
<div className="flex justify-between ">
<div className="text-xl">
<p>San DiegoCalifornia</p>
<p>ParisFrance </p>
</div>
<div className="flex gap-[5vw] text-xl">
<div className="flex flex-col">biz@rejouice.com</div>
<div className="flex flex-col">©2023 legal</div>
</div>
</div>
</div>
<div className="preloader w-full bg-[#0E0E0E] text-[#FAF8F3] flex justify-center items-center text-center">
<h1 className="texts-container leading-none tracking-tighter font-semibold">
<span className="text-[24vw]">r</span>
<span className="text-[24vw]">e</span>
<span className="text-[18vw]">J</span>
<span className="text-[18vw]">O</span>
<span className="text-[18vw]">U</span>
<span className="text-[18vw]">I</span>
<span className="text-[18vw]">C</span>
<span className="text-[24vw]">e</span>
</h1>
</div>
</>
)
}
export default Footer

View file

@ -1,4 +1,4 @@
import { useState } from 'react';
import { useEffect, useState } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import Navbar from './Navbar';
@ -23,9 +23,31 @@ const Header = () => {
transition: {duration: 0.35}
}
}
//Scrollable Navbar
const [prevScrollpos, setPrevScrollpos] = useState(window.pageYOffset);
const [top, setTop] = useState(0);
useEffect(() => {
const handleScroll = () => {
const currentScrollPos = window.pageYOffset;
if (prevScrollpos > currentScrollPos) {
setTop(0); // Show navbar
} else {
setTop(-100); // Hide navbar
}
setPrevScrollpos(currentScrollPos);
};
window.addEventListener('scroll', handleScroll);
return () => {
window.removeEventListener('scroll', handleScroll);
};
}, [prevScrollpos]);
const navbarStyle = {
top: `${top}px`
};
return (
<div className={`w-[100%] fixed z-40 ${(changeColor === true) ? 'bg-[#FF5F38] ' : 'bg-transparent delay-[0.9s] transition duration-[1] ease-in'}`}>
<div className={`w-[100%] fixed z-40 ${(changeColor === true) ? 'bg-[#FF5F38] ' : 'bg-transparent delay-[0.9s] transition duration-[1] ease-in'}`} style={navbarStyle}>
<div className="flex items-center justify-between z-40 ">
<div className="relative flex items-center h-[100%] px-14 pt-14">
<motion.p variants={opacity} animate={!isActive ? "open" : "closed"} className="text-2xl text-white">The venture agency.</motion.p>

View file

@ -1,11 +1,20 @@
import { useState } from "react"
import CountUp from "react-countup"
import ScrollTrigger from "react-scroll-trigger"
const Philosophy = () => {
const [counterOn, setCounterOn] = useState(false);
return (
<div className="w-full">
<div className="flex-col text-3xl px-14">
<p>We operate on a simple philosophy:</p>
<p>Quality over quantity.</p>
<div className="border-[#555555] border-t-2 mt-2"></div>
</div>
<ScrollTrigger onEnter={() => setCounterOn(true)} onExit={() => setCounterOn(false)}>
<div className="flex-col text-3xl px-14">
<p>We operate on a simple philosophy:</p>
<p>Quality over quantity.</p>
{counterOn && <div className="line mt-2 relative"></div>}
</div>
</ScrollTrigger>
<div className="flex flex-col justify-between px-14">
<div>
<p className="mt-5 text-[4vw] leading-[4.3vw] tracking-tight justify-center indent-40" >We collaborate with five clients each year. This allows for intense focus on the trabsformation and
@ -22,7 +31,11 @@ const Philosophy = () => {
<circle cx="50" cy="1" r="1" fill="#fff"></circle>
</svg>
<div className="absolute text-center text-white">
<p className="text-7xl">3 seats</p>
<ScrollTrigger onEnter={() => setCounterOn(true)} onExit={() => setCounterOn(false)}>
<p className="text-7xl" >
{counterOn && <CountUp start={0} end={3} duration={3} delay={0}/>}
seats</p>
</ScrollTrigger>
<p className="text-3xl">available for 2024</p>
</div>
{/*gradient option*/}

View file

@ -1,11 +1,19 @@
import { useState } from "react"
import ScrollTrigger from "react-scroll-trigger"
const Strategy = () => {
const [counterOn, setCounterOn] = useState(false);
return (
<div className="w-full px-14 mb-[12vw] mt-[5vw]">
<ScrollTrigger onEnter={() => setCounterOn(true)} onExit={() => setCounterOn(false)}>
<div className="flex-col text-3xl">
<p>Strategy & emotion.</p>
<p>You need both.</p>
<div className="border-[#555555] border-t-2 mt-2"></div>
{counterOn && <div className="line mt-2 relative"></div>}
</div>
</ScrollTrigger>
<div className="flex flex-col justify-between">
<div>
<p className="mt-5 text-[4vw] leading-[4.3vw] tracking-tight justify-center indent-40" >Data matters, yet its the emotion that drives buying decisions. We dont

View file

@ -1,5 +1,5 @@
import { useEffect } from "react"
import {preLoaderAnim} from "../preloader/PreloadAnimatiom"
import { preLoaderAnim } from "../preloader/PreloadAnimatiom"
const PreLoader = () => {

View file

@ -6,7 +6,9 @@
src: local("NB-International-Pro-Bold"), url("./assets/NB-International-Pro-Bold.ttf") format("opentype");
font-weight: normal;
}
html{
scrollbar-width: none;
}
body{
background-color: #FAF8F3;
color: #0E0E0E;
@ -84,6 +86,24 @@ body{
.text:hover{
color: #FF5F38;
}
/*==========*/
.line::before{
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 0;
border-bottom: solid 2px #555555;
animation: border_animation 3s linear forwards;
}
@keyframes border_animation{
0%{
width: 0%;
}
100%{
width: 100%;
}
}
/*===== gradient =====*/
/*.gradient-bg{
position: relative;