├── README.md
├── ppmori.ttf
├── ppmori-regular.woff2
├── script.js
├── style.css
└── index.html
/README.md:
--------------------------------------------------------------------------------
1 | Note: Use this source code when you get some issues or doubts.
2 |
--------------------------------------------------------------------------------
/ppmori.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saarthack/duo-studio/HEAD/ppmori.ttf
--------------------------------------------------------------------------------
/ppmori-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saarthack/duo-studio/HEAD/ppmori-regular.woff2
--------------------------------------------------------------------------------
/script.js:
--------------------------------------------------------------------------------
1 | function init() {
2 | gsap.registerPlugin(ScrollTrigger);
3 |
4 | const locoScroll = new LocomotiveScroll({
5 | el: document.querySelector(".main"),
6 | smooth: true
7 | });
8 | locoScroll.on("scroll", ScrollTrigger.update);
9 |
10 | ScrollTrigger.scrollerProxy(".main", {
11 | scrollTop(value) {
12 | return arguments.length ? locoScroll.scrollTo(value, 0, 0) : locoScroll.scroll.instance.scroll.y;
13 | }, // we don't have to define a scrollLeft because we're only scrolling vertically.
14 | getBoundingClientRect() {
15 | return { top: 0, left: 0, width: window.innerWidth, height: window.innerHeight };
16 | },
17 | pinType: document.querySelector(".main").style.transform ? "transform" : "fixed"
18 | });
19 |
20 |
21 | ScrollTrigger.addEventListener("refresh", () => locoScroll.update());
22 |
23 | ScrollTrigger.refresh();
24 |
25 | }
26 |
27 | init()
28 |
29 | var crsr = document.querySelector(".cursor")
30 | var main = document.querySelector(".main")
31 | document.addEventListener("mousemove",function(dets){
32 | crsr.style.left = dets.x + 20+"px"
33 | crsr.style.top = dets.y + 20+"px"
34 | })
35 |
36 | gsap.from(".page1 h1,.page1 h2", {
37 | y: 10,
38 | rotate: 10,
39 | opacity: 0,
40 | delay: 0.3,
41 | duration: 0.7
42 | })
43 | var tl = gsap.timeline({
44 | scrollTrigger: {
45 | trigger: ".page1 h1",
46 | scroller: ".main",
47 | // markers:true,
48 | start: "top 27%",
49 | end: "top 0",
50 | scrub: 3
51 | }
52 | })
53 | tl.to(".page1 h1", {
54 | x: -100,
55 | }, "anim")
56 | tl.to(".page1 h2", {
57 | x: 100
58 | }, "anim")
59 | tl.to(".page1 video", {
60 | width: "90%"
61 | }, "anim")
62 |
63 | var tl2 = gsap.timeline({
64 | scrollTrigger: {
65 | trigger: ".page1 h1",
66 | scroller: ".main",
67 | // markers:true,
68 | start: "top -115%",
69 | end: "top -120%",
70 | scrub: 3
71 | }
72 | })
73 | tl2.to(".main", {
74 | backgroundColor: "#fff",
75 | })
76 |
77 | var tl3 = gsap.timeline({
78 | scrollTrigger: {
79 | trigger: ".page1 h1",
80 | scroller: ".main",
81 | // markers:true,
82 | start: "top -280%",
83 | end: "top -300%",
84 | scrub: 3
85 | }
86 | })
87 |
88 | tl3.to(".main",{
89 | backgroundColor:"#0F0D0D"
90 | })
91 |
92 |
93 | var boxes = document.querySelectorAll(".box")
94 | boxes.forEach(function(elem){
95 | elem.addEventListener("mouseenter",function(){
96 | var att = elem.getAttribute("data-image")
97 | crsr.style.width = "470px"
98 | crsr.style.height = "370px"
99 | crsr.style.borderRadius = "0"
100 | crsr.style.backgroundImage = `url(${att})`
101 | })
102 | elem.addEventListener("mouseleave",function(){
103 | elem.style.backgroundColor = "transparent"
104 | crsr.style.width = "20px"
105 | crsr.style.height = "20px"
106 | crsr.style.borderRadius = "50%"
107 | crsr.style.backgroundImage = `none`
108 | })
109 | })
110 |
111 | var h4 = document.querySelectorAll("#nav h4")
112 | var purple = document.querySelector("#purple")
113 | h4.forEach(function(elem){
114 | elem.addEventListener("mouseenter",function(){
115 | purple.style.display = "block"
116 | purple.style.opacity = "1"
117 | })
118 | elem.addEventListener("mouseleave",function(){
119 | purple.style.display = "none"
120 | purple.style.opacity = "0"
121 | })
122 | })
--------------------------------------------------------------------------------
/style.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: PP mori;
3 | src: url(./ppmori.ttf);
4 | }
5 |
6 | * {
7 | margin: 0;
8 | padding: 0;
9 | box-sizing: border-box;
10 | font-family: PP mori;
11 | color: #fff;
12 | }
13 |
14 | html, body {
15 | height: 100%;
16 | width: 100%;
17 | }
18 | #purple{
19 | height: 100vh;
20 | width: 100vw;
21 | top: 0;
22 | position: fixed;
23 | z-index: 100;
24 | background-color: #EDBFFF;
25 | opacity: 0;
26 | display: none;
27 | transition: opacity ease 1s;
28 |
29 | }
30 | .cursor{
31 | height: 20px;
32 | width: 20px;
33 | border-radius: 50%;
34 | position: fixed;
35 | background-color: #EDBFFF;
36 | z-index: 8;
37 | transition: background-image ease 0.5s;
38 | background-position: center;
39 | background-size:cover ;
40 | mix-blend-mode: difference;
41 | }
42 | .main{
43 | background-color: #0F0D0D;
44 | cursor: none;
45 | }
46 |
47 | .page1{
48 | min-height: 100vh;
49 | width: 100%;
50 | position: relative;
51 | z-index: 9;
52 | padding-top: 12vw;
53 | }
54 |
55 |
56 | #nav{
57 | height: 55px;
58 | width: 100%;
59 | /* background-color: red; */
60 | display: flex;
61 | align-items: center;
62 | justify-content: space-between;
63 | padding: 0 30px;
64 | position: fixed;
65 | mix-blend-mode: difference;
66 | z-index:102;
67 | }
68 | #nav img{
69 | height: 27px;
70 | }
71 | #nav-part2{
72 | display: flex;
73 | align-items: center;
74 | justify-content: center;
75 | gap: 20px;
76 | }
77 |
78 | #nav #circle{
79 | height: 18px;
80 | width: 18px;
81 | border-radius: 50%;
82 | background-color: #fff;
83 | }
84 | #nav h4{
85 | font-size: 16px;
86 | font-weight: 500;
87 | text-transform: uppercase;
88 | }
89 | #nav h4:nth-child(1){
90 | border-bottom: 1.5px solid #fff;
91 | }
92 |
93 | .page1 h1{
94 | font-size: 8vw;
95 | font-weight: 300;
96 | font-family: PP mori;
97 |
98 | margin-left: 6vw;
99 | transform-origin: left;
100 | }
101 | .page1 h2{
102 | font-size: 8vw;
103 | font-weight: 300;
104 | transform-origin: left;
105 |
106 | margin-left: 26vw;
107 | }
108 |
109 | .page1 video{
110 | width: 60%;
111 | margin-top: 10vw;
112 | position: relative;
113 | left: 50%;
114 | transform: translate(-50%,0);
115 | }
116 |
117 | .page2{
118 | min-height: 80vh;
119 | width: 100%;
120 | padding: 100px 5vw;
121 | border-bottom: 2px solid #6c6c6c;
122 | position: relative;
123 | z-index: 9;
124 | }
125 |
126 | .page2 h1{
127 | font-size:7vw;
128 | font-weight: 500;
129 | color: #111;
130 |
131 | }
132 | .page2-container{
133 | height: 60vh;
134 | width: 100%;
135 | /* background-color: red; */
136 | display: flex;
137 | align-items: center;
138 | justify-content: space-between;
139 | /* padding: 0 5vw; */
140 | }
141 | .page2-left{
142 | /* background-color: blue; */
143 | width: 40%;
144 | }
145 | .page2-right{
146 | /* background-color: blue; */
147 | width: 24%;
148 | }
149 | .page2-left h2{
150 | font-size: 4vw;
151 | font-weight: 300;
152 | color: #111;
153 | line-height: 4vw;
154 | }
155 | .page2-right p{
156 | font-size: 28px;
157 | color: #111;
158 | }
159 | .page2-right button{
160 | width: 100%;
161 | border-radius: 50px;
162 | border: none;
163 | padding: 4px 0;
164 | background-color: #EDBFFF;
165 | color: #111;
166 | margin-top: 20px;
167 | }
168 |
169 | .page3{
170 | min-height: 100vh;
171 | width: 100%;
172 | padding-top: 100px;
173 | position: relative;
174 | z-index: 9;
175 | }
176 |
177 | .page3 h1{
178 | font-size: 6.8vw;
179 | font-weight: 300;
180 | color: #111;
181 | margin-left: 100px;
182 | }
183 | .page3-part1{
184 | display: flex;
185 | align-items: flex-start;
186 | justify-content: space-between;
187 |
188 | }
189 | .page3-part1 img{
190 | height: 400px;
191 | margin-top: 160px;
192 | }
193 | .page3-part1 video{
194 | height: 400px;
195 | margin-top: 40px;
196 | }
197 | .page4{
198 | min-height: 100vh;
199 | width: 100%;
200 | z-index: 9;
201 | position: relative;
202 | padding: 170px 100px;
203 | }
204 | .elem{
205 | /* background-color: salmon; */
206 | margin-bottom: 10px;
207 | display: flex;
208 | align-items: center;
209 | justify-content: center;
210 | position: relative;
211 | }
212 | .elem img{
213 | position: absolute;
214 | opacity: 0;
215 | transition: all ease-out 0.5s;
216 | transform: translateY(10%) rotate(2deg);
217 | }
218 | .elem img:nth-child(1){
219 | left: 2%;
220 | }
221 | .elem img:nth-child(3){
222 | right: 5%;
223 | }
224 | .text-div{
225 | height: 16vh;
226 | position: relative;
227 | z-index: 9;
228 | overflow: hidden;
229 | }
230 | .elem h1{
231 | font-size: 7.5vw;
232 | font-weight: 600;
233 | transition: all ease-out 0.5s;
234 | }
235 |
236 | .elem:hover h1{
237 | transform: translateY(-100%);
238 | color: #EDBFFF;
239 | }
240 | .elem:hover img{
241 | opacity: 1;
242 | transform: translateY(0%) rotate(0deg);
243 |
244 | }
245 |
246 |
247 | .page5{
248 | min-height: 100vh;
249 | width: 100%;
250 | position: relative;
251 | z-index: 9;
252 | padding: 140px 100px;
253 | }
254 | .page5 h2{
255 | font-size: 4vw;
256 | text-transform: uppercase;
257 | font-weight: 400;
258 | margin-bottom: 50px;
259 | }
260 | .box{
261 | /* background-color: red; */
262 | display: flex;
263 | align-items: center;
264 | justify-content: space-between;
265 | height: 100px;
266 | padding: 0 20px;
267 | border-top: 2px solid #dadada;
268 | }
269 |
270 | .box:nth-last-child(1){
271 | border-bottom: 2px solid #dadada;
272 |
273 | }
274 |
275 |
276 | footer{
277 | height: 90vh;
278 | width: 100%;
279 | background-color: #EDBFFF;
280 | }
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Duo Studio — A Creative Digital Agency in Washington DC
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
18 |
19 |
Home
20 | Work
21 | Studio
22 | Contact
23 |
24 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
Digitally crafted
35 | brand experiences
36 |
37 |
38 |
39 |
We are Duo Studio,
40 |
41 |
42 |
A CREATIVE
43 | COLLECTIVE
44 | MADE TO UNLOCK
45 | YOUR BRAND’S
46 | POTENTIAL
47 |
48 |
49 |
We weave together bold strategy and creative execution to produce thought-provoking digital
50 | experiences. We take a highly personalized approach to delivering branding, web design, and
51 | content marketing solutions. Born in the DC area - now serving clients worldwide.
52 |
About us
53 |
54 |
55 |
56 |
57 |
58 |
Selected Works
59 |
60 |
62 |
64 |
65 |
66 |
67 |
68 |
70 |
71 |
Strategy
72 | Strategy
73 |
74 |
76 |
77 |
78 |
80 |
81 |
Strategy
82 | Strategy
83 |
84 |
86 |
87 |
88 |
90 |
91 |
Strategy
92 | Strategy
93 |
94 |
96 |
97 |
98 |
99 |
100 |
Mentions Clients
101 |
103 |
Verizon
104 | 2021
105 |
106 |
108 |
Verizon
109 | 2021
110 |
111 |
113 |
Verizon
114 | 2021
115 |
116 |
118 |
Verizon
119 | 2021
120 |
121 |
123 |
Verizon
124 | 2021
125 |
126 |
127 |
130 |
131 |
132 |
133 |
136 |
139 |
140 |
141 |
142 |
--------------------------------------------------------------------------------