Skip to content

Commit 10fed3e

Browse files
feat: Improve visual effects; Switch to VT320 font
1 parent e38fbaf commit 10fed3e

22 files changed

+255
-160
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# Portal 2 Credits
2+
23
Web-based Portal 2 ending credits recreated with HTML, CSS, and Javascript.
34

5+
I built this using a YouTube video of the credits for reference (I did manually type every name in the credits). It's mildly responsive. A couple small aesthetic choices were made that diverge from the original.
6+
47
Live at [https://christopher-hayes.github.io/portal-2-credits/portal-2-ending.html](https://christopher-hayes.github.io/portal-2-credits/portal-2-ending.html)
58

6-
![Screenshot of website](https://imgur.com/aArHFzM.jpg)
9+
![Screenshot of website](public/img/screenshot.png)
10+
11+
Credit to [@Screwtapello@teh.entar.net](https://teh.entar.net/@Screwtapello/113848235903486857) for creating the TTF font used in this project. It's a [conversion of the original font files]((https://gitlab.com/Screwtapello/vt320-font-extractor/-/blob/main/README.md)) from the DEC [VT320](https://en.wikipedia.org/wiki/VT320) terminal. This isn't like a Portal lore thing, I just think the font is cool.

favicon.ico

15 KB
Binary file not shown.

main.css

Lines changed: 142 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,54 @@
1+
/* font-face import */
2+
@font-face {
3+
font-family: 'VT320';
4+
src: url('public/fonts/vt320-firmware-V1.2-normal-1x3.ttf') format('truetype');
5+
font-weight: normal;
6+
font-style: normal;
7+
}
8+
9+
:root {
10+
--text-color: rgba(208, 193, 174, 0.66);
11+
--text-color-darker: rgba(157, 132, 101, 0.7);
12+
--text-shadow: #e88731ed 0 0 30px, rgba(208, 193, 174, 0.5) 0 0 5px;
13+
--border-color: rgba(208, 193, 174, 0.46);
14+
}
15+
116
/* background defaults to transparent b/c mystery box randomly flashes on screen in
2-
random positions, this appears to patch the bug for now */
17+
random positions, this appears to patch the bug for now */
318
* { margin: 0; padding: 0; background-color: rgba( 0, 0, 0, 0 ); }
4-
body {
19+
html, body {
20+
font-family: 'VT320', monospace;
521
}
622
.content {
723
width: 100%;
824
height: 100%;
925
border-top: none !important;
26+
27+
@media (max-width: 800px) {
28+
height: calc(100vh - 100px);
29+
}
1030
}
1131
.background {
1232
/* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#754d1a+0,442e19+100 */
1333
background: rgb(117,77,26); /* Old browsers */
14-
background: -moz-radial-gradient(center, ellipse cover, rgba(117,77,26,1) 0%, rgba(68,46,25,1) 100%); /* FF3.6-15 */
15-
background: -webkit-radial-gradient(center, ellipse cover, rgba(117,77,26,1) 0%,rgba(68,46,25,1) 100%); /* Chrome10-25,Safari5.1-6 */
16-
background: radial-gradient(ellipse at center, rgba(117,77,26,1) 0%,rgba(68,46,25,1) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
34+
background: radial-gradient(
35+
ellipse at center,
36+
color(display-p3 0.459 0.302 0.102) 0%,
37+
color(display-p3 0.267 0.18 0.098) 100%
38+
);
39+
40+
1741
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#754d1a', endColorstr='#442e19',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */
42+
1843
background-size: 100vw 100vh;
1944
background-position: 0px 0px;
2045
background-attachment: fixed;
2146
}
2247
.border {
23-
border: 3px solid rgba(180, 134, 49, 0.3);
48+
border: 3px solid var(--border-color);
2449
}
2550
.border-top {
26-
border-top: 3px solid rgba(180, 134, 49, 0.3);
51+
border-top: 3px solid var(--border-color);
2752
}
2853
.pattern {
2954
position: absolute;
@@ -32,15 +57,16 @@ body {
3257
top: 0;
3358
left: 0;
3459
opacity: 0.03;
35-
background-image: url("img/bkrnd_pattern2.png");
60+
background-image: url("public/img/bkrnd_pattern2.png");
61+
pointer-events: none;
3662
}
3763
.shift {
3864
position: absolute;
3965
width: 100vw;
4066
height: 100vh;
4167
top: 0;
4268
left: 0;
43-
background-image: url( "img/shift2.png" );
69+
background-image: url( "public/img/shift2.png" );
4470
background-repeat: repeat-x;
4571
background-position: 0 50%;
4672
background-size: 10px 600px;
@@ -61,13 +87,28 @@ body {
6187
top: 40px;
6288
width: 146px;
6389
height: 146px;
90+
mix-blend-mode: color-dodge;
6491
}
6592
.logo img {
6693
width: 80%;
6794
height: 80%;
6895
margin: 10%;
6996
opacity: 0.4;
7097
}
98+
/* bars design */
99+
.bars {
100+
position: absolute;
101+
width: 281px;
102+
height: 146px;
103+
top: 40px;
104+
right: 330px;
105+
mix-blend-mode: color-dodge;
106+
107+
/* Hide bars on smaller screens */
108+
@media (max-width: 1180px) {
109+
display: none;
110+
}
111+
}
71112
/* number design */
72113
.nums {
73114
position: absolute;
@@ -76,27 +117,25 @@ body {
76117
top: 40px;
77118
right: 244px;
78119
padding-top: 5px;
79-
color: rgba(162, 130, 72, 0.62);
80-
font-family: 'Roboto Mono', monospace;
81-
font-size: 1.6em;
120+
color: var(--text-color);
121+
text-shadow: var(--text-shadow);
122+
mix-blend-mode: color-dodge;
123+
font-size: 2rem;
82124
line-height: 30px;
83125
text-align: center;
84-
}
85-
/* bars design */
86-
.bars {
87-
position: absolute;
88-
width: 281px;
89-
height: 146px;
90-
top: 40px;
91-
right: 330px;
126+
127+
/* Hide bars on smaller screens */
128+
@media (max-width: 900px) {
129+
display: none;
130+
}
92131
}
93132
.bars1 {
94133
width: 45%;
95134
height: 100%;
96135
opacity: 0.3;
97136
float: left;
98137
margin-left: 3%;
99-
background: url( "img/bars.png" );
138+
background: url( "public/img/bars.png" );
100139
background-size: 50% 150%;
101140
animation: barsAnim;
102141
animation-duration: 2500ms;
@@ -110,7 +149,7 @@ body {
110149
height: 100%;
111150
opacity: 0.3;
112151
margin-left: 5%;
113-
background: url( "img/bars.png" );
152+
background: url( "public/img/bars.png" );
114153
background-size: 50% 150%;
115154
animation: barsAnim;
116155
animation-duration: 2500ms;
@@ -125,32 +164,51 @@ body {
125164
position: absolute;
126165
top: 50px;
127166
height: 3px;
167+
mix-blend-mode: hard-light;
128168
}
129169
.b1 {
130170
left: 53px;
131171
width: calc( 100% - 670px );
172+
173+
/* extend when on smaller than 1180px */
174+
@media (max-width: 1180px) {
175+
width: calc( 100% - 383px );
176+
}
132177
}
133178
.b2 {
134179
right: 318px;
135180
width: 12px;
181+
182+
/* extend when on smaller than 1180px */
183+
@media (max-width: 900px) {
184+
right: 244px;
185+
width: 86px;
186+
}
136187
}
137188
.b3 {
138189
right: 232px;
139190
width: 12px;
140191
}
141192
.b4 {
142-
right: 51px;
143-
width: 29px;
193+
right: 47px;
194+
width: 33px;
144195
}
145196
.lyrics {
146197
padding: 5vw 0 0 5vw;
147198
width: 50%;
148199
height: calc( 100% - 10vw );
149-
font-family: 'Roboto Mono', monospace;
150-
color: rgba(162, 130, 72, 0.62);
151-
font-size: 1.5em;
152-
line-height: 40px;
200+
color: var(--text-color);
201+
text-shadow: var(--text-shadow);
202+
font-size: 2.5rem;
153203
float: left;
204+
205+
/* mobile layout */
206+
@media (max-width: 800px) {
207+
margin-top: 4em;
208+
width: 100%;
209+
height: 50vh;
210+
font-size: 2rem;
211+
}
154212
}
155213
.printChar {
156214
animation: animAppear;
@@ -159,7 +217,7 @@ body {
159217
animation-play-state: paused;
160218
}
161219
@keyframes animAppear {
162-
0% { opacity: 0; }
220+
0% { opacity: 0.4; }
163221
100% { opacity: 1; }
164222
}
165223
.cursor {
@@ -183,60 +241,73 @@ body {
183241
.credits-wrap {
184242
position: absolute;
185243
right: 90px;
186-
bottom: 120px;
244+
bottom: 90px;
187245
width: 40%;
188-
padding-top: 16vh;
246+
height: calc(100% - 280px);
189247
overflow: hidden;
190-
}
191-
.credits {
192-
position: absolute;
193-
display: table-cell;
194-
width: 100%;
195-
bottom: 0;
196-
right: 0;
197-
text-align: right;
198-
vertical-align: bottom;
199-
font-family: 'Roboto Mono', monospace;
200-
font-size: 1.4em;
201-
line-height: 30px;
202-
color: rgb(54, 31, 10);
248+
249+
/* mobile layout */
250+
@media (max-width: 800px) {
251+
right: 70px;
252+
bottom: 60px;
253+
width: 100%;
254+
padding-top: 0;
255+
height: 40vh;
256+
}
257+
258+
.credits {
259+
position: absolute;
260+
display: table-cell;
261+
width: 100%;
262+
bottom: 0;
263+
right: 0;
264+
text-align: right;
265+
vertical-align: bottom;
266+
font-size: 2rem;
267+
color: var(--text-color-darker);
268+
}
203269
}
204270
/* canvas screen scan animation */
205271
#crt {
206-
position: absolute;
207-
top: 0;
208-
left: 0;
272+
position: absolute;
273+
top: 0;
274+
left: 0;
275+
mix-blend-mode: color-dodge;
276+
pointer-events: none;
277+
display: none; /* Temp disabled for perf reasons */
209278
}
210279
/* overlay */
211280
#overlay {
212-
height: calc( 100vh - 100px );
213-
width: calc( 100vw - 100px );
214-
padding: 50px;
215-
overflow: hidden;
216-
box-shadow: inset 0 0 50vh black;
217-
}
218-
.overlay #overlay {
219-
filter: blur(4px);
220-
transition: filter 500ms;
221-
}
222-
.overlay.play #overlay {
223-
filter: blur(0px);
281+
height: calc( 100vh - 100px );
282+
width: calc( 100vw - 100px );
283+
padding: 50px;
284+
overflow: hidden;
285+
box-shadow: inset 0 0 50vh black;
286+
mix-blend-mode: color-dodge;
224287
}
225288
.overlay .overlay-button {
226-
pointer-events: auto;
227-
position: absolute;
228-
width: 100px;
229-
height: 40px;
230-
left: calc(50% - 50px);
231-
top: calc(50% - 20px);
232-
background-color: orange;
233-
border: 2px solid darkorange;
234-
color: white;
235-
pointer-events: none;
289+
pointer-events: auto;
290+
position: absolute;
291+
left: calc(50% - 50px);
292+
top: calc(50% - 20px);
293+
padding: 1rem 2rem;
294+
background-color: orange;
295+
border: 2px solid darkorange;
296+
color: white;
297+
pointer-events: none;
298+
font-weight: bold;
299+
font-family: 'VT320', monospace;
300+
font-size: 1.5rem;
301+
text-align: center;
302+
303+
&:hover {
304+
background-color: darkorange;
305+
}
236306
}
237307
.overlay.ready .overlay-button {
238-
pointer-events: auto;
308+
pointer-events: auto;
309+
cursor: pointer;
239310
}
240311
.overlay.play .overlay-button {
241-
display: none;
312+
display: none;
242313
}

0 commit comments

Comments
 (0)