Compare commits

...

14 Commits

Author SHA1 Message Date
a19c6fb921 Revert print team ranking letter 2020-05-14 21:34:57 -04:00
e5579a0e77 Print team ranking letter 2020-05-13 20:15:39 -04:00
5e7fe99969 Footer: social icons opaque on hover 2019-10-25 04:03:32 -04:00
2305b246c1 Sample cover letter, letter submodule
Custom sitemap layout to hide letters.
2019-10-07 22:48:32 -04:00
497ad86122 Card: fix stacking on Safari, reduce vert. font 2019-10-07 02:19:51 -04:00
d1d191e413 Card: initial commit 2019-10-06 06:22:59 -04:00
b546a2a529 Resume: minor fixes 2019-10-05 21:11:22 -04:00
8b794bfa8e Resume: add skills, improve project descriptions 2019-10-05 05:51:18 -04:00
d14bcf3c8f Reduce font size across site
- change footer background to line above

Resume:
- add LinkedIn
- fix Unicode expand icon not showing on mobile
2019-10-05 05:50:17 -04:00
b652c45375 Social icons in footer, update resume overview 2019-10-03 04:59:06 -04:00
ae2e8100fd Server: fix duration string, add verbose option 2019-09-23 01:33:47 -04:00
14283b1a33 Server: add information, last updated and uptime 2019-09-22 23:54:33 -04:00
7ec40caf8e Server: (static) apps table
Organized image files.
2019-09-21 23:47:11 -04:00
5f5fd0d0a6 Config: setup base page 2019-09-21 17:40:18 -04:00
55 changed files with 1511 additions and 405 deletions

1
.gitignore vendored
View File

@@ -4,3 +4,4 @@ resources/_gen/
themes/base16* themes/base16*
commit-msg.txt commit-msg.txt
static/server-apps.json

7
.gitmodules vendored Normal file
View File

@@ -0,0 +1,7 @@
[submodule "content/letter"]
path = content/letter
url = ssh://git@git.kevin-mok.com:399/Kevin-Mok/cover-letters.git
branch = master
[submodule "static/pdf"]
path = static/pdf
url = ssh://git@git.kevin-mok.com:399/Kevin-Mok/resume-pdf.git

View File

@@ -2,9 +2,14 @@
// base colors {{{ // // base colors {{{ //
$base00: #2d2d2d;
$base01: #393939;
$base02: #515151;
$base03: #747369; $base03: #747369;
$base04: #a09f93; $base04: #a09f93;
$base05: #d3d0c8; $base05: #d3d0c8;
$base06: #e8e6df;
$base07: #f2f0ec;
$base-red: #f2777a; $base-red: #f2777a;
$base-orange: #f99157; $base-orange: #f99157;
$base-yellow: #ffcc66; $base-yellow: #ffcc66;
@@ -14,13 +19,6 @@ $base-blue: #6699cc;
$base-violet: #cc99cc; $base-violet: #cc99cc;
$base-dark-orange: #d27b53; $base-dark-orange: #d27b53;
/* .base00 { color: #2d2d2d; }
.base01 { color: #393939; }
.base02 { color: #515151; }
.base03 { color: #747369; }
.base04 { color: #a09f93; }
.base06 { color: #e8e6df; }
.base07 { color: #f2f0ec; } */
.base08 { color: $base-red; } .base08 { color: $base-red; }
.base09 { color: $base-orange; } .base09 { color: $base-orange; }
.base0a { color: $base-yellow; } .base0a { color: $base-yellow; }
@@ -34,25 +32,37 @@ $base-dark-orange: #d27b53;
// mixins {{{ // // mixins {{{ //
$max-page-width: 52em; // $max-page-width: 52em;
$max-page-width: 45em;
$phone-width: 800px; $phone-width: 800px;
$vert-phone-width: 500px;
@mixin side-padding-rem($n) { @mixin side-padding-rem($n) {// {{{
padding-left: $n * 1rem; padding-left: $n * 1rem;
padding-right: $n * 1rem; padding-right: $n * 1rem;
} }// }}}
@mixin vert-padding-rem($n) { @mixin side-margin-em($n) {// {{{
margin-left: $n * 1em;
margin-right: $n * 1em;
}// }}}
@mixin vert-padding-rem($n) {// {{{
padding-top: $n * 1rem; padding-top: $n * 1rem;
padding-bottom: $n * 1rem; padding-bottom: $n * 1rem;
} }// }}}
@mixin auto-center() { @mixin vert-margin-rem($n) {// {{{
margin-top: $n * 1rem;
margin-bottom: $n * 1rem;
}// }}}
@mixin auto-center() {// {{{
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }// }}}
@mixin article-body() { @mixin article-body() {// {{{
/* background-color: #e6e6fa; */ /* background-color: #e6e6fa; */
background-color: #cbbeb5; background-color: #cbbeb5;
color: #2d2d2d; color: #2d2d2d;
@@ -64,9 +74,9 @@ $phone-width: 800px;
@media (max-width: $max-page-width) { @media (max-width: $max-page-width) {
@include side-padding-rem(2); @include side-padding-rem(2);
} }
} }// }}}
@mixin a-color($color) { @mixin a-color($color) {// {{{
a { a {
color: $color; color: $color;
&:visited { &:visited {
@@ -76,7 +86,16 @@ $phone-width: 800px;
color: $color; color: $color;
} }
} }
} }// }}}
@mixin a-no-underline() {// {{{
a {
text-decoration: none;
&:hover {
text-decoration: none;
}
}
}// }}}
// }}} mixins // // }}} mixins //
@@ -92,8 +111,10 @@ body {
background-color: $background-color; background-color: $background-color;
color: $color; color: $color;
line-height: 1.5; line-height: 1.5;
font-size: 100%; // font-size: 100%;
/* font-family: 'Source Code Pro', monospace; */ font-size: 15px;
// font-size: 25px;
// font-family: 'Hack Nerd Font Mono', monospace;
font-family: 'Hack', monospace; font-family: 'Hack', monospace;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -108,10 +129,6 @@ body {
margin-right: auto; margin-right: auto;
flex: 1; flex: 1;
.copyright {
@include a-color(#747369);
}
@media (max-width: $max-page-width) { @media (max-width: $max-page-width) {
width: 100%; width: 100%;
} }
@@ -152,21 +169,67 @@ header {
} }
footer { footer {
// base {{{ //
@include a-color(#747369);
// background-color: #393939;
// max-width: $max-page-width;
margin-top: 2rem; margin-top: 2rem;
margin-bottom: 1rem; $vertical-margin: .2em;
text-align: center; text-align: center;
font-size: 0.9em; font-size: 0.8em;
color: #747369; color: #747369;
// bottom: 0; // bottom: 0;
// position: absolute; // position: absolute;
// width: 100%; // width: 100%;
// }}} base //
.container { .container {// {{{
background-color: #393939; // max-width: $max-page-width;
max-width: 62em; // min-width: $max-page-width;
@include auto-center(); @include auto-center();
@include vert-padding-rem(.1); // @include vert-padding-rem(.1);
} @include side-padding-rem(0);
#footer-row {
// background-color: #393939;
}
#footer-content {
$side-padding: 2.5em;
@include vert-padding-rem(.35);
border-style: solid;
border-width: 1px 0 0 0;
border-color: rgba(81, 81, 81, .75);
#copyright {
// padding-left: .85em;
padding-left: $side-padding;
position: relative;
top: 2px;
@include a-color(#747369);
}
#social-icons {
position: relative;
padding-right: $side-padding;
// padding-right: .9em;
@include a-no-underline();
img {
height: 1.5em;
@include vert-margin-rem(.2);
padding-left: .5em;
opacity: .6;
&:hover {
opacity: 1;
}
}
}
}
}// }}}
@media (max-width: $max-page-width) { @media (max-width: $max-page-width) {
margin-top: 0; margin-top: 0;
@@ -194,8 +257,20 @@ p {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
h1 { font-size: 2rem } h1 {
h2 { font-size: 1.5rem } font-size: 2rem;
@media (max-width: $phone-width) {
font-size: 1.75rem;
}
}
h2 {
font-size: 1.5rem;
@media (max-width: $phone-width) {
font-size: 1.4rem;
}
}
h3 { font-size: 1.25rem } h3 { font-size: 1.25rem }
h4 { font-size: 1rem } h4 { font-size: 1rem }
h5 { font-size: .875rem } h5 { font-size: .875rem }
@@ -222,10 +297,6 @@ header {// {{{
} }
}// }}} }// }}}
footer {// {{{
@include a-color(#747369);
}// }}}
.page-not-found {// {{{ .page-not-found {// {{{
h1 { h1 {
text-align: center; text-align: center;
@@ -252,11 +323,12 @@ footer {// {{{
#homepage {// {{{ #homepage {// {{{
#about { #about {
font-size: 1.25rem; font-size: 1.1rem;
h2 { h2 {
margin-top: 1.25rem; margin-top: 1.25rem;
font-size: 2rem; // font-size: 2rem;
font-size: 1.9rem;
color: $base-yellow; color: $base-yellow;
text-align: center; text-align: center;
@@ -417,87 +489,427 @@ footer {// {{{
float: right; float: right;
img { img {
height: 1.75em; height: 2em !important;
position: relative; position: absolute;
top: 1em; top: 1em;
} }
}// }}} }// }}}
#contact-info {// {{{ #contact-info {// {{{
@include vert-padding-rem(0.5); @include side-margin-em(0);
display: flex; @include side-padding-rem(0);
align-content: center; // @include vert-padding-rem(0.5);
@include a-color($base-sky-blue);
width: 100%;
// @media (min-width: 1200px) {
// .container{
// min-width: $max-page-width;
// }
// }
div { font-size: .9em;
flex-grow: 1;
.row {
// flex-grow: 1;
color: $base05; color: $base05;
img { img {
height: 1em; height: 1em;
// @media (max-width: $phone-width) {
// height: 1.5em;
// }
}
div[class^="col"] {
@include side-padding-rem(0);
// text-align: center;
}
}
.url-info {
margin-left: 5px;
// position: relative;
// left: -8px;
@media (max-width: $phone-width) {
// display: none;
// font-size: 10px;
font-size: .8em;
} }
} }
#email {
text-align: center;
}
#website {
text-align: right;
}
}// }}} }// }}}
#resume {// {{{ #resume {// {{{
a { a {// {{{
text-decoration: none; text-decoration: none;
&:hover { &:hover {
text-decoration: underline; text-decoration: underline;
} }
}// }}}
h1 {// {{{
color: $base-orange;
margin-top: 1rem;
@media (max-width: $phone-width) {
margin-top: .75rem;
}
}// }}}
h2 {// {{{
color: $base-orange;
margin-top: .5rem;
@media (max-width: $phone-width) {
font-size: 1.2em;
margin-top: .75rem;
}
}// }}}
h4 {// {{{
color: $base-yellow;
margin-top: .5rem;
@media (max-width: $phone-width) {
font-size: 1.2em;
margin-top: .75rem;
}
}// }}}
.date {// {{{
padding-top: .8em;
float: right;
color: $base03;
@media (max-width: $phone-width) {
padding-top: 0em;
}
}// }}}
#projects {// {{{
h1 {
margin-bottom: 3px;
}
.project {// {{{
@include vert-padding-rem(.2);
h2 {
color: $base-sky-blue;
display: inline;
}
img {
height: 1.2em;
}
.project-link {
&:hover {
text-decoration: none;
}
}
.down-triangle {
// fill: blue;
height: 1.2em;
position: relative;
top: -3px;
left: -3px;
}
.btn {// {{{
display: inline;
background-color: transparent;
margin-bottom: 5px;
padding-left: 7px;
&:focus, &:active {
outline: none !important;
box-shadow: none;
}
}// }}}
// }}}
// [id^="details-"] {
// margin-top: .5em;
// }
}
}// }}}
.institution {
color: $base-yellow;
font-weight: bold;
font-size: 1.1em;
margin-bottom: 5px;
}
.title {
font-style: italic;
}
#education {// {{{
.date {
padding-top: 0;
}
}// }}}
@media (max-width: $phone-width) {
font-size: 14px;
// font-size: 1em;
}
&.letter {
margin-top: 2em;
// font-size: 21px;
img {
height: 4.5em;
}
h2 {
color: $base-red;
// font-size: 30px;
// margin-top: 0em;
// margin-top: .5em;
// margin-top: 1.25em;
// margin-bottom: 1em;
}
p {
margin-bottom: 1.5em;
// margin-bottom: 1em;
}
ul {
// margin-bottom: 1.5em;
margin-bottom: 2em;
}
.no-line-spacing {
line-height: .5em;
margin-bottom: 2.15em;
p {
margin-bottom: 1em;
}
strong {
line-height: 1.25em;
}
}
}
}// }}}
#server {// {{{
.body {
@include vert-padding-rem(.5);
} }
h1 { h1 {
margin-bottom: .25em;
}
// table {
// margin-top: 1.75em;
// }
th, td {
@include vert-padding-rem(.4);
@include side-padding-rem(.5);
border: 1px solid rgba(160, 159, 147, .5);
}
th {
color: $base-orange; color: $base-orange;
text-align: center;
font-size: 1.3em;
} }
.date { td {
float: right; font-size: .9em;
color: $base03;
} }
.project { .description {
@include vert-padding-rem(.2); font-size: .85em;
}
h2 { .status {
color: $base-sky-blue; text-align: center;
display: inline;
}
img { img {
height: 1.2em; height: 2em;
} }
.project-link {
&:hover {
text-decoration: none;
}
}
.btn {
display: inline;
background-color: transparent;
margin-bottom: 5px;
padding-left: 7px;
&:focus, &:active {
outline: none !important;
box-shadow: none;
}
}
// [id^="details-"] {
// margin-top: .5em;
// }
} }
#time-info {
padding-top: 1em;
font-size: .75em;
font-style: italic;
color: $base03;
}
}// }}}
#card {// {{{
@include vert-margin-rem(2);
align-items: center;
justify-content: center;
font-family: 'Oxygen Mono', monospace;
.container {// {{{
padding-left: 0;
padding-right: 0;
.row {
padding-top: 6rem;
padding-bottom: 8rem;
@media (max-width: $phone-width) {
padding-top: 5rem;
padding-bottom: 6rem;
}
}
}// }}}
// $card-bg: #e8e6df;
$card-bg: $base07;
#presentational-container {// {{{
margin-top: 3em;
margin-bottom: 1em;
max-width: $max-page-width;
box-shadow: 2px 2px 10px 5px black;
// card bg
// background-color: #fff;
// background-color: #e5e5e5;
background-color: $card-bg;
}// }}}
#email-full {// {{{
font-size: 50px;
@media (max-width: $phone-width) {
font-size: 40px;
}
@media (max-width: $vert-phone-width) {
font-size: 33px;
}
@include vert-margin-rem(2);
height: 7em;
img {
height: .5em;
position: absolute;
left: -.8em;
bottom: -.15em;
}
p { // {{{
position: relative;
// color: grey;
color: #151515;
// color: #133337;
div {
display: inline;
}
.social {// {{{
// display: none;
display: inline;
white-space: nowrap;
position: absolute;
// left: 5.5rem;
left: 0rem;
.safari {
display: none;
}
@supports (-webkit-backdrop-filter: blur(1px)) {
left: .65rem;
.safari {
display: inline;
}
}
.link-text {
position: relative;
width: 100%;
}
$border-thickness: 8px;
@media (max-width: $vert-phone-width) {
$border-thickness: 5px;
}
.link {
position: absolute;
border-color: black;
border-style: solid;
border-width: 0 $border-thickness $border-thickness $border-thickness;
height: .45em;
width: 100%;
left: 0;
img {
position: absolute;
left: -1em;
}
&.link-top {
border-width: $border-thickness $border-thickness 0 $border-thickness;
img {
position: absolute;
top: -.2em;
}
}
&:hover {
opacity: .6;
}
}
$line-spacing: .65em;
#mastodon {
top: -$line-spacing * 1.1;
border-color: #3088d4;
}
.linkedin {
bottom: -$line-spacing * 1.1;
border-color: #0077b7;
&.linkedin-middle {
border-style: dotted;
border-width: 0 0 3.5px 0;
}
}
#github {
bottom: -$line-spacing * 2.7;
}
#site {
bottom: -$line-spacing * 4.25;
border-color: #ff7058;
}
#email {
top: -$line-spacing * 2.65;
border-color: #d1d0bf;
}
}// }}}
.spacing {
opacity: 0;
}
}// }}}
}// }}}
}// }}}
#letter-home {// {{{
#letter-instr {
text-align: center;
margin-top: 1.5em;
// margin-top: 25vh;
font-size: 1.4em;
}
}// }}} }// }}}
// TODO: converted up to here // TODO: converted up to here
@@ -506,12 +918,12 @@ footer {// {{{
h1.site-title {// {{{ h1.site-title {// {{{
text-align: center; text-align: center;
/* font-size: 3.5em; */ font-size: 4.2em;
font-size: 4.8em;
// color: #66cccc; // color: #66cccc;
color: $base05; color: $base05;
margin-top: 1rem; // margin-top: 1rem;
margin-bottom: 0.5rem; // margin-bottom: 0.75rem;
@include vert-margin-rem(.75);
@include a-color($base-sky-blue); @include a-color($base-sky-blue);
a { a {
@@ -522,16 +934,23 @@ h1.site-title {// {{{
font-size: 3em; font-size: 3em;
} }
@media (max-width: $phone-width) { // @media (max-width: $phone-width) {
// font-size: 3em; // font-size: 3.5em;
// font-size: 2.5em; // @include vert-margin-rem(.3);
font-size: 2em; // // font-size: 2.5em;
} // // font-size: 2em;
// .surrounding {
// display: none;
// }
// }
}// }}} }// }}}
.hero-logo img { .hero-logo img {
margin-top: 0.5rem; margin-top: 0.5rem;
width: 100%; width: 100%;
// display: none;
// width: $max-page-width;
} }
.nav-bar {// {{{ .nav-bar {// {{{
@@ -611,42 +1030,42 @@ h1.site-title {// {{{
// article.single {{{ // // article.single {{{ //
article.single { article.single {
.meta { .meta {
font-size: 0.9em; font-size: 0.9em;
text-align: right; text-align: right;
margin-top: .5rem; margin-top: .5rem;
margin-bottom: .5rem; margin-bottom: .5rem;
.key { .key {
color: #747369; color: #747369;
} }
.val { .val {
color: #cc99cc;
a {
color: #cc99cc; color: #cc99cc;
a {
color: #cc99cc;
}
} }
}
}
.body {
padding-top: 1rem;
padding-bottom: 3rem;
}
@media (max-width: $max-page-width) {
.meta {
padding-left: 2rem;
padding-right: 2rem;
} }
.body { .body {
padding-top: 1rem; padding-top: .5rem;
padding-bottom: 3rem; padding-bottom: 1rem;
} }
@media (max-width: $max-page-width) {
.meta {
padding-left: 2rem;
padding-right: 2rem;
}
.body {
padding-top: .5rem;
padding-bottom: 1rem;
}
} }
} }
@@ -658,6 +1077,7 @@ article.single h1.headline {
@media (max-width: $max-page-width) { @media (max-width: $max-page-width) {
article.single h1.headline { article.single h1.headline {
font-size: 2em;
padding-left: 2rem; padding-left: 2rem;
padding-right: 2rem; padding-right: 2rem;
} }
@@ -672,7 +1092,8 @@ article.single section.body h4 { color: #f2777a; }
article.single section.body h5 { color: #515151; } article.single section.body h5 { color: #515151; }
article.single section.body h6 { color: #747369; } article.single section.body h6 { color: #747369; }
article.single section.body a,a:visited { color: #a06700; } // article.single section.body a,a:visited { color: #a06700; }
article.single section.body a,a:visited { color: $base-sky-blue; }
/* Article Elements */ /* Article Elements */

View File

@@ -16,13 +16,33 @@ menu:
main: main:
- name: resume - name: resume
url: /resume url: /resume
weight: 5 weight: 1
# - name: posts/ # - name: posts/
# url: /posts # url: /posts
# weight: 6 # weight: 6
- name: server
url: /server
weight: 7
- name: config
url: /config
weight: 10
- name: card
url: /card
weight: 15
# - name: letter
# url: /letter
# weight: 17
# - name: credits # - name: credits
# url: /credits # url: /credits
# weight: 10 # weight: 20
# - name: config
# url: /config # blackfriday:
# plainIDAnchors: true
# hrefTargetBlank: true
disableKinds: ["RSS"]
markup:
goldmark:
renderer:
unsafe: true

5
content/card/_index.md Normal file
View File

@@ -0,0 +1,5 @@
---
title: "Digital Card"
date: 2019-02-11T07:50:51-05:00
draft: false
---

View File

@@ -1,27 +1,29 @@
--- ---
title: "Config" title: "Linux Config"
date: 2019-02-07T05:05:11-05:00 date: 2019-04-26
draft: true draft: false
layout: single
--- ---
<!--- Intro {{{ --> <!--- Intro {{{ -->
# Kevin's Linux Setup
![desktop-screenshot](https://i.imgur.com/Fpsr8Fc.png) ![desktop-screenshot](https://img.khkm.tk/uploads/big/b2bd45e8f436d389ecb787b5c61c951a.png)
*Screenshot from my dual-monitor setup.* *Screenshot from my dual-monitor setup.*
This repository contains the dotfiles to increase my workflow efficiency. They This [repository][lc-repo] contains the dotfiles to increase my workflow
are also for my Linux efficiency. They are also for my Linux [rice][ricing_explanation].
[rice](https://www.reddit.com/r/unixporn/comments/3iy3wd/stupid_question_what_is_ricing/cukxwog/).
[lc-repo]: https://git.kevin-mok.com/Kevin-Mok/linux-config
[ricing_explanation]: https://www.reddit.com/r/unixporn/comments/3iy3wd/stupid_question_what_is_ricing/cukxwog/
<!--- }}} Intro --> <!--- }}} Intro -->
<!--- Main Programs {{{ --> <!--- Main Programs {{{ -->
## Main Programs ## Main Programs
* **OS**: [Arch Linux](https://www.archlinux.org/) ([packages](txt/nzxt-pkgs.txt)) * **OS**: [Arch Linux](https://www.archlinux.org/) ([packages](txt/nzxt-pkgs.txt))
``` ```
> systemd-analyze $ systemd-analyze
Startup finished in 2.341s (kernel) + 1.085s (userspace) = 3.426s Startup finished in 2.341s (kernel) + 1.085s (userspace) = 3.426s
graphical.target reached after 1.085s in userspace graphical.target reached after 1.085s in userspace
``` ```
* **Terminal**: [rxvt-unicode-pixbuf](https://www.wikiwand.com/en/Rxvt) * **Terminal**: [rxvt-unicode-pixbuf](https://www.wikiwand.com/en/Rxvt)
* **Shell**: [Zsh](http://zsh.sourceforge.net/) + [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) * **Shell**: [Zsh](http://zsh.sourceforge.net/) + [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)
* **Window Manager**: [i3-gaps](https://github.com/Airblader/i3) * **Window Manager**: [i3-gaps](https://github.com/Airblader/i3)
@@ -32,8 +34,9 @@ graphical.target reached after 1.085s in userspace
<!--- Setup {{{ --> <!--- Setup {{{ -->
## Setup ## Setup
I use I use [chezmoi] to manage varying configs for different machines with
[Stow](http://brandon.invergo.net/news/2012-05-26-using-gnu-stow-to-manage-your-dotfiles.html) a single branch.
to symbolically link the configs/dotfiles.
[chezmoi]: https://github.com/twpayne/chezmoi
<!--- }}} Setup --> <!--- }}} Setup -->

View File

@@ -1,5 +0,0 @@
---
title: "Credits"
date: 2019-02-11T03:10:25-05:00
draft: true
---

1
content/letter Submodule

Submodule content/letter added at 42716f4487

View File

@@ -1,14 +0,0 @@
---
title: "Server Apps"
date: 2019-09-03T12:31:45-04:00
draft: true
---
- Baikal
- Gitea
- Synapse
- Taskserver
- haste-server
- liteshort
- personal site
- spv
- twem

View File

@@ -3,12 +3,22 @@ title: "Resume"
date: 2019-02-11T07:50:51-05:00 date: 2019-02-11T07:50:51-05:00
draft: false draft: false
--- ---
{{% resume/section overview %}}<!--- {{{ --> {{% resume/section skills %}}<!--- {{{ -->
I am a 3<sup>rd</sup> year CS student and enthusiast of all things Linux #### Languages
and FOSS. I am looking for an internship to fully dedicate myself to that - **Bash**, **C**, **CSS**, C++, **Fish** (shell), Godot, **HTML5**,
will test my abilities, provide the opportunity to gain valuable knowledge **Python**, Java, **Javascript** (ES6), **Sass**
and experience and jumpstart my career with a solid foundation.
#### Frameworks
- **Bootstrap**, **Django**, **Node.js**, **PostgreSQL**
#### Services
- **DigitalOcean**, **Linux**, Heroku, **REST/Web API's**
#### Tools
- **Arch Linux**, Android Studio, **Debian**, **Command Line**,
**Git**, IntelliJ IDEA, **Pycharm**, **NGINX**, npm/yarn, **SFTP**,
**SSH**, **Vim**
{{% /resume/section %}}<!--- }}} --> {{% /resume/section %}}<!--- }}} -->
@@ -16,15 +26,19 @@ and experience and jumpstart my career with a solid foundation.
<!--- Spotify Graphs {{{ --> <!--- Spotify Graphs {{{ -->
{{% resume/project name="Spotify Visualizer" {{% resume/project name="Spotify Graphs"
url="https://github.com/Kevin-Mok/spotify-lib-vis" date="July 2018" show="true" %}} url="https://github.com/Kevin-Mok/spotify-lib-vis" date="June 2018 — July 2018"
show="true" %}}
- Web app that scans your Spotify library using their API to produce - Implemented base functionality of scanning tracks and listening
[**d3** graphs][d3 graph examples] to visualize the artists, genres and history from user's library using Spotify API and organized data
features of tracks in your library. into **PostgreSQL** database with **Django** backend.
- Can also keep track of your listening history. Currently runs as a `cron` - Created and tested various relational database schemas to maximize
job on my local machine to keep track of my own. efficiency for use cases.
- Uses __Django__ and __PostgreSQL__ for back-end. - Produced bubble chart and (stacked) bar chart using
[**d3**][d3 graph examples] to visualize the artists,
genres and features of
tracks in library.
[d3 graph examples]: https://github.com/d3/d3/wiki/Gallery [d3 graph examples]: https://github.com/d3/d3/wiki/Gallery
@@ -32,6 +46,27 @@ url="https://github.com/Kevin-Mok/spotify-lib-vis" date="July 2018" show="true"
<!--- Spotify Graphs }}} --> <!--- Spotify Graphs }}} -->
<!--- Grocery Finder {{{ -->
{{% resume/project name="Grocery Finder"
url="https://github.com/Kevin-Mok/grocery-finder" date="Feb. 2019 — Apr. 2019"
show="true" %}}
- Proof of concept for web app that finds the ideal supermarket based on your cart.
- Designed responsive front-end layout using **Bootstrap**.
- Implemented REST API functionality on backend using **Node.js** and
**MongoDB**.
- Setup deployment on [**Heroku**][Grocery Finder Heroku].
- Led team of 4 as project leader to prioritize and delegate tasks while
also implementing a majority of the core features.
- Performed code review for team members' pull requests.
[Grocery Finder Heroku]: http://www.grocery-finder.ml
{{% /resume/project %}}
<!--- Grocery Finder }}} -->
<!--- ParsaFood {{{ --> <!--- ParsaFood {{{ -->
{{% resume/project name="ParsaFood" {{% resume/project name="ParsaFood"
@@ -40,70 +75,70 @@ show="true" %}}
- **Android** app that reads ingredient labels and detects any dietary - **Android** app that reads ingredient labels and detects any dietary
restrictions/allergies. restrictions/allergies.
- Designed user interface and linked various functionality together.
- Made during a 24-hour [food-themed hackathon][Platterz Hackathon event] - Made during a 24-hour [food-themed hackathon][Platterz Hackathon event]
in a group with two other members. Came in 2<sup>nd</sup> place and won in a group with two other members. Came in 2<sup>nd</sup> place and won
an [Oculus Rift][Oculus Rift Amazon]. an [Oculus Rift][Oculus Rift Amazon].
- Came up with the idea based on [personal experience][Parsafood motivation].
[Parsafood repo]: https://github.com/Kevin-Mok/ParsaFood [Parsafood repo]: https://github.com/Kevin-Mok/ParsaFood
[Parsafood motivation]: https://github.com/Kevin-Mok/ParsaFood#motivation [Platterz Hackathon event]:
[Platterz Hackathon event]: https://www.eventbrite.com/e/platterz-hackathon-tickets-42682237722 https://www.eventbrite.com/e/platterz-hackathon-tickets-42682237722
[Oculus Rift Amazon]: https://www.amazon.ca/Oculus-Rift-Windows-VR-Headset/dp/B00VF0IXEY/ref=sr_1_1_sspa?ie=UTF8&qid=1520422949&sr=8-1-spons&keywords=oculus+rift&psc=1 [Oculus Rift Amazon]: https://www.amazon.ca/Oculus-Rift-Windows-VR-Headset/dp/B00VF0IXEY/ref=sr_1_1_sspa?ie=UTF8&qid=1520422949&sr=8-1-spons&keywords=oculus+rift&psc=1
{{% /resume/project %}} {{% /resume/project %}}
<!--- ParsaFood }}} --> <!--- ParsaFood }}} -->
<!--- Grocery Finder {{{ -->
{{% resume/project name="Grocery Finder"
url="https://github.com/Kevin-Mok/grocery-finder" date="April 2019"
show="true" %}}
- Proof of concept for a web app that finds the best supermarket for
your needs based on the total price of your cart items and distance
form you.
- Responsive front-end using **Bootstrap**. Uses **Node.js** and
**MongoDB** for back-end.
- Currently deployed on [**Heroku**][Grocery Finder Heroku].
- Took on role as project leader to prioritize and delegate tasks
while
also implementing a majority of the core features.
[Grocery Finder Heroku]: http://www.grocery-finder.ml
{{% /resume/project %}}
<!--- Grocery Finder }}} -->
<!--- TrapBot {{{ --> <!--- TrapBot {{{ -->
{{% resume/project name="TrapBot" {{% resume/project name="TrapBot"
url="https://github.com/Kevin-Mok/TrapBot" date="March 2018" %}} url="https://github.com/Kevin-Mok/TrapBot" date="March 2018" %}}
- reddit bot that looks for comments with song names and responds with - Use reddit API wrapper in **Python** to scan music subreddits for user
their respective SoundCloud links. comments containing common track listing formats.
- Received positive feedback from users who saw the bot's posts. - Match detected track name and artists to track on SoundCloud using another
- Uses __Python__ API wrappers for SoundCloud and reddit. Python API wrapper.
- Respond to original poster's comment with formatted list of tracks found.
- Received positive comment from users who replied to the bot's posts.
{{% /resume/project %}} {{% /resume/project %}}
<!--- Grocery Finder }}} --> <!--- Grocery Finder }}} -->
<!--- DigitalOcean {{{ -->
{{% resume/project name="Personal Server"
url="https://kevin-mok.com/server/" date="Aug. 2019 — present" %}}
- Deployed various web apps with backends such as Node, PHP and Python using
**NGINX** on a **Debian** server.
- Monitor system resources and perform system maintenance using tmux.
- Wrote [**Node.js** script][server script] and [**systemd** service][systemd service]/[timer]
to check and display the uptime of my pages every hour.
[server script]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-status.js
[systemd service]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.service
[timer]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.timer
{{% /resume/project %}}
<!--- DigitalOcean Droplet }}} -->
<!--- Super ADA Bros. {{{ --> <!--- Super ADA Bros. {{{ -->
{{% resume/project name="Super ADA Bros" {{% resume/project name="Super ADA Bros"
url="https://github.com/Kevin-Mok/SuperADABros" date="May 2019" %}} url="https://github.com/Kevin-Mok/SuperADABros" date="May 2019" %}}
- Clone of Super Mario Bros 1-1, but Mario is mobility-impaired and - Designed clone of Super Mario Bros 1-1, but Mario is mobility-impaired and
uses ramps to get through the level. uses ramps to get through the level.
- Able to played using only head movement by getting input from a - Uses **OpenCV** to track player's head movement which is then translated to
face-tracking script (**OpenCV**). in-game movement. [Video Demo]
- Implemented in [**Godot**][Godot site], an open-source game engine. - Implemented in [**Godot**][Godot site], an open-source game engine.
- Made during a 24-hour [accessibility-themed hackathon][PC Hacks event]. - Made during a 24-hour [accessibility-themed hackathon][PC Hacks event].
[PC Hacks event]: https://pchacks19.devpost.com/ [PC Hacks event]: https://pchacks19.devpost.com/
[Godot site]: https://godotengine.org [Godot site]: https://godotengine.org
[Video Demo]: https://youtu.be/vRdENLGrBqM
{{% /resume/project %}} {{% /resume/project %}}
@@ -112,8 +147,22 @@ url="https://github.com/Kevin-Mok/SuperADABros" date="May 2019" %}}
{{% /resume/section %}}<!--- }}} --> {{% /resume/section %}}<!--- }}} -->
{{% resume/section education %}}<!--- {{{ --> {{% resume/section "Work Experience" %}}<!--- {{{ -->
- **University of Toronto**: Computer Science Specialist <div class="date">2017-2021</div> {{% resume/education name="Philpott Children's Tennis"
title="Head Instructor" date="2013 — 2015" %}}
- Ran 8-week summer camp for inner-city youth with assistant coach.
- Prepared daily lesson plans for 4 different age groups of children
with varying skill levels and needs.
- Supervised and ensured the safety and enjoyment of up to 20 children at once.
{{% /resume/section %}}<!--- }}} --> {{% /resume/section %}}<!--- }}} -->
{{% resume/section education %}}<!--- {{{ -->
{{% resume/education name="University of Toronto"
title="Computer Science Specialist" date="2017 — 2021" %}}
{{% /resume/section %}}<!--- }}} -->
<!-- vim: fdm=marker -->

View File

@@ -1,20 +0,0 @@
<!--- Super ADA Bros. {{{ -->
{{% resume/project name="Super ADA Bros"
url="https://github.com/Kevin-Mok/SuperADABros" date="May 2019" %}}
- Clone of Super Mario Bros 1-1, but Mario is mobility-impaired and
uses ramps to get through the level.
- Able to played using only head movement by getting input from a
face-tracking script (**OpenCV**).
- Implemented in [**Godot**][Godot site], an open-source game engine.
- Made during a 24-hour [accessibility-themed hackathon][PC Hacks event].
[PC Hacks event]: https://pchacks19.devpost.com/
[Godot site]: https://godotengine.org
{{% /resume/project %}}
<!--- Grocery Finder }}} -->

View File

@@ -1,4 +1,12 @@
// vim: ft=markdown
- bg colors - bg colors
# Resume
- site title max width - site title max width
- switch project shortcode - switch project shortcode
- rm details top margin - rm details top margin
# Letter
- letter font size
- h2

16
content/server/_index.md Normal file
View File

@@ -0,0 +1,16 @@
---
title: "Server Apps"
date: 2019-09-22
draft: false
layout: single
js: ["server-table"]
---
Here is a list of apps that I am running on my [DigitalOcean
droplet][do-droplet]. Their [statuses] are updated every hour using a
[Node.js script][update-script] and a [systemd service]/[timer].
[do-droplet]: https://www.digitalocean.com/products/droplets/
[statuses]: https://kevin-mok.com/server-apps.json
[systemd service]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.service
[timer]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.timer
[update-script]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-status.js

View File

@@ -1,12 +1,5 @@
# Large # Large
- resume - resume
- expand some projects by default
- repo link (GitHub icon) beside each section
- make links open in new tab
- picture/video links?
- printable white version
- upload PDF
- JS to change CSS?
- make old proj's displayable - make old proj's displayable
- spv - spv
- screenshots - screenshots
@@ -27,21 +20,20 @@
- cd/ls diff. pages - cd/ls diff. pages
# Medium # Medium
- socials in footer - contact page
- icons - icons
- Gitea
- GitHub - GitHub
- email
- copy button
- [Copying Text to Clipboard in HTML & JavaScript](https://www.youtube.com/watch?v=NHg6jQajaMs)
- [Native Browser Copy To Clipboard](https://css-tricks.com/native-browser-copy-clipboard/)
- Fosstodon - Fosstodon
- email
- tooltip pop-up with email and clipboard button/link
- [Pure CSS Tooltips](https://www.youtube.com/watch?v=hAeQ8CqrGDY)
- use position element
- [Copying Text to Clipboard in HTML & JavaScript](https://www.youtube.com/watch?v=NHg6jQajaMs)
- [Native Browser Copy To Clipboard](https://css-tricks.com/native-browser-copy-clipboard/)
- pages - pages
- fav. apps - fav. apps
- linux config - linux config
- neofetch on all devices
- credits - credits
- contact?
- site stats - site stats
- size - size
- load time - load time

69
layouts/card/section.html Normal file
View File

@@ -0,0 +1,69 @@
{{ partial "base/header.html" . }}
{{ partial "base/site-title.html" . }}
{{ partial "base/nav-bar.html" . }}
{{ partial "base/base16-logo.html" . }}
<main role="main" id="card">
<div id="presentational-container" class="container">
<div class="row text-center h-100 my-auto">
<div id="email-full" class="h-100 mx-auto">
<p class="text-center">
<nobr>
me@kevin-mok.com
<span class="social"><span class="spacing">
me</span><span class="link-text">@kevi<span
class="safari">n</span>
<a href="https://fosstodon.org/@Kevin"
target="_blank" id="mastodon" class="link link-top">
<img src="https://kevin-mok.com/img/social/mastodon.svg" alt=""/>
</a></span>
</span>
<span class="social"><span class="spacing">
me@</span><span class="link-text">ke<span
class="safari">v</span>
<a href="https://www.linkedin.com/in/Kev-Mok" target="_blank"
target="_blank" class="link linkedin linkedin-left">
<img src="https://kevin-mok.com/img/social/linkedin.svg" alt=""/>
</a></span>
</span>
<span class="social"><span class="spacing">
me@kevin</span><span class="link-text">-mo<span
class="safari">k</span>
<a href="https://www.linkedin.com/in/Kev-Mok" target="_blank" class="link linkedin linkedin-left"></a></span>
</span>
<span class="social"><span class="spacing">
me@kev</span><span class="link-text">i<span
class="safari">n</span>
<a href="https://www.linkedin.com/in/Kev-Mok" target="_blank"
class="link linkedin linkedin-middle"></a></span>
</span>
<span class="social"><span class="spacing">
me@</span><span class="link-text">kevin-mo<span
class="safari">k</span>
<a href="https://github.com/Kevin-Mok" target="_blank" id="github" class="link">
<img src="https://kevin-mok.com/img/social/github.svg" alt=""/>
</a></span>
</span>
<span class="social"><span class="spacing">
me@</span><span class="link-text">kevin-mok.co<span
class="safari">m</span>
<a href="https://kevin-mok.com/" target="_blank" id="site" class="link">
<img src="https://kevin-mok.com/img/resume/link.svg" alt=""/>
</a></span>
</span>
<span class="social"><span class="link-text">me@kevin-mok.co<span class="safari">&nbsp;</span>
<a href="mailto:me@kevin-mok.com" target="_blank" id="email" class="link link-top">
<img src="https://kevin-mok.com/img/resume/envelope.svg" alt=""/>
</a></span>
</span>
</nobr>
</p>
</div>
</div>
</div>
</main>
{{ partial "base/footer.html" . }}

View File

@@ -0,0 +1,22 @@
{{ partial "base/header.html" . }}
{{ partial "base/site-title.html" . }}
{{ partial "base/nav-bar.html" . }}
{{ partial "base/base16-logo.html" . }}
<main role="main" id="letter-home">
<!-- <h1 class="list-title">{{ .Title }}</h1> -->
<h4 id="letter-instr">Please enter the full URL that I provided
for your personalized cover letter. :)</h4>
<div id="resume" class="letter">
{{ .Content }}
</div>
</main>
{{ partial "base/footer.html" . }}
</div>
</body>
</html>

View File

@@ -0,0 +1,13 @@
{{ partial "base/header.html" . }}
{{ partial "base/site-title.html" . }}
{{ partial "resume/contact-info.html" . }}
<div id="resume" class="letter">
{{ .Content }}
</div>
</div>
</body>
</html>

View File

@@ -1,17 +1,45 @@
</div> </div>
{{- range .Params.js }}
<script src="/{{ . }}.js"></script>
{{- end }}
<footer> <footer>
<div class="container"> <div class="container">
<!-- <span class="copyright">&copy; {{ .Site.LastChange.Year }} {{ .Site.Title }} - <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></span> --> <!-- <span class="copyright">&copy; {{ .Site.LastChange.Year }} {{ .Site.Title }} - <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></span> -->
<span class="copyright"> <div id="footer-row" class="row justify-content-center">
&copy; {{ now.Year }} {{ .Site.Title }} · <a rel="license" <span id="footer-content" class="name">
href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> · <span id="copyright" class="col-xs-6">
<a href="{{ "credits" | relURL }}">Credits</a> &copy; {{ now.Year }} {{ .Site.Title }} ·
</span> <!-- <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> · -->
<!-- <a href="{{ "credits" | relURL }}">Credits</a> · -->
</span>
<span id="social-icons" class="col-xs-4">
<a href="https://github.com/Kevin-Mok" target="_blank">
<img src="{{ "img/social/github.svg" | relURL }}"
alt="github-logo">
</a>
<a href="https://www.linkedin.com/in/Kev-Mok" target="_blank">
<img src="{{ "img/social/linkedin.svg" | relURL }}" alt="linkedin-logo">
</a>
<a href="https://git.kevin-mok.com/" target="_blank">
<img src="{{ "img/social/gitea.svg" | relURL }}" alt="gitea-logo">
</a>
<a href="mailto:me@kevin-mok.com" target="_blank">
<img src="{{ "img/social/email.svg" | relURL }}"
alt="envelope">
</a>
<a href="https://fosstodon.org/@Kevin" target="_blank">
<img src="{{ "img/social/mastodon.svg" | relURL }}"
alt="mastodon-logo">
</a>
</span>
<span class="col-xs-2">
</span>
</span>
</div>
</div> </div>
</footer> </footer>
</body> </body>
</html> </html>

View File

@@ -12,7 +12,7 @@
{{ .Hugo.Generator }} {{ .Hugo.Generator }}
<meta name="google-site-verification" content="3aZhrY5bFgQY0HY2DNNUhbkuIfVEcwkrQHnbJd8jCCQ" /> <meta name="google-site-verification" content="3aZhrY5bFgQY0HY2DNNUhbkuIfVEcwkrQHnbJd8jCCQ" />
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<script src="http://livejs.com/live.js" charset="utf-8"></script> <script src="https://cdn.khkm.tk/live.js" charset="utf-8"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>

View File

@@ -1,7 +1,7 @@
<h1 class="site-title"> <h1 class="site-title">
[<a href="{{ .Site.BaseURL }}"><span class="base08">K</span><span <span class="surrounding">[</span><a href="{{ .Site.BaseURL }}"><span class="base08">K</span><span
class="base0f">e</span><span class="base09">v</span><span class="base0f">e</span><span class="base09">v</span><span
class="base0a">i</span><span class="base0b">n </span><span class="base0a">i</span><span class="base0b">n </span><span
class="base0c">M</span><span class="base0d">o</span><span class="base0c">M</span><span class="base0d">o</span><span
class="base0e">k</span></a>] # _ class="base0e">k</span></a><span class="surrounding">] # _</span>
</h1> </h1>

View File

@@ -1,7 +1,7 @@
<div id="about"> <div id="about">
<h2>Welcome to my site!</h2> <h2>Welcome to my site!</h2>
<p> <p>
I'm Kevin Mok - a 2<sup>nd</sup> year Computer Science I'm Kevin Mok - a Computer Science
student at the University of Toronto, and I'm greatly interested in all things Linux and student at the University of Toronto, and I'm greatly interested in all things Linux and
<a href="https://www.gnu.org/philosophy/floss-and-foss.en.html" <a href="https://www.gnu.org/philosophy/floss-and-foss.en.html"
target="_blank">FOSS/FLOSS</a>. target="_blank">FOSS/FLOSS</a>.

View File

@@ -1,24 +1,24 @@
<div class="me-equation"> <div class="me-equation">
<div class="equation-part"> <div class="equation-part">
<a href="https://www.gnu.org/" target="_blank"> <a href="https://www.gnu.org/" target="_blank">
<img src="{{ "img/gnu.svg" | relURL }}" id="gnu" alt="gnu-logo"> <img src="{{ "img/home/gnu.svg" | relURL }}" id="gnu" alt="gnu-logo">
</a> </a>
<p>+</p> <p>+</p>
</div> </div>
<div class="equation-part"> <div class="equation-part">
<a href="https://www.wikiwand.com/en/Arch_Linux" target="_blank"> <a href="https://www.wikiwand.com/en/Arch_Linux" target="_blank">
<img src="{{ "img/arch.svg" | relURL }}" alt="linux-logo"> <img src="{{ "img/home/arch.svg" | relURL }}" alt="linux-logo">
<!-- <img src="{{ "img/larbs.png" | relURL }}" alt="linux-logo"> --> <!-- <img src="{{ "img/home/larbs.png" | relURL }}" alt="linux-logo"> -->
</a> </a>
<p>+</p> <p>+</p>
</div> </div>
<div class="equation-part" id="uoft-part"> <div class="equation-part" id="uoft-part">
<a href="https://www.utoronto.ca/" target="_blank"> <a href="https://www.utoronto.ca/" target="_blank">
<img src="{{ "img/uoft-logo.svg" | relURL }}" alt="uoft-logo"> <img src="{{ "img/home/uoft-logo.svg" | relURL }}" alt="uoft-logo">
</a> </a>
<p>=</p> <p>=</p>
</div> </div>
<div class="equation-part"> <div class="equation-part">
<img src="{{ "img/hexatar.png" | relURL }}" id="hexatar" alt="my-avatar"> <img src="{{ "img/home/hexatar.png" | relURL }}" id="hexatar" alt="my-avatar">
</div> </div>
</div> </div>

View File

@@ -1,15 +1,39 @@
<div id="contact-info"> <div id="contact-info" class="container">
<div id="phone-number"> <div class="row row-top justify-content-center mx-auto">
<img src="{{ "img/smartphone.svg" | relURL }}" <div id="phone-number" class="col text-left">
alt="smartphone-icon">: <a href="tel:647-685-2500" target="_blank">
<a href="tel:647-685-2500" target="_blank">647-685-2500</a> <img src="{{ "img/resume/smartphone.svg" | relURL }}"
alt="smartphone-icon">
<span class="url-info">
647-685-2500
</span>
</a>
</div>
<div id="linkedin" class="col text-right">
<a href="https://www.linkedin.com/in/Kev-Mok" target="_blank">
<span class="url-info">
Kev-Mok
</span>
<img src="{{ "img/social/linkedin.svg" | relURL }}" alt="linkedin-icon">
</a>
</div>
</div> </div>
<div id="email"> <div class="row mx-auto">
<img src="{{ "img/envelope.svg" | relURL }}" alt="envelope-icon">: <div id="email" class="col col-left">
<a href="mailto:me@kevin-mok.com">me@kevin-mok.com</a> <a href="mailto:me@kevin-mok.com" target="_blank">
</div> <img src="{{ "img/resume/envelope.svg" | relURL }}" alt="envelope-icon">
<div id="website"> <span class="url-info">
<img src="{{ "img/link.svg" | relURL }}" alt="link-icon">: me@kevin-mok.com
<a href="https://kevin-mok.com/">kevin-mok.com</a> </span>
</a>
</div>
<div id="website" class="col text-right">
<a href="https://kevin-mok.com/" target="_blank">
<span class="url-info">
kevin-mok.com
</span>
<img src="{{ "img/resume/link.svg" | relURL }}" alt="link-icon">
</a>
</div>
</div> </div>
</div> </div>

View File

@@ -1,5 +1,5 @@
<div id="print-icon"> <div id="print-icon">
<a href="{{ "resume.pdf" | relURL }}" target="_blank"> <a href="{{ "pdf/kevin-mok-resume.pdf" | relURL }}" target="_blank">
<img src="{{ "img/printer.svg" | relURL }}" alt="printer-icon"> <img src="{{ "img/resume/printer.svg" | relURL }}" alt="printer-icon">
</a> </a>
</div> </div>

View File

@@ -6,8 +6,6 @@
{{ partial "resume/contact-info.html" . }} {{ partial "resume/contact-info.html" . }}
{{ partial "base/base16-logo.html" . }}
<div id="resume"> <div id="resume">
{{ .Content }} {{ .Content }}

View File

@@ -1,4 +1 @@
User-agent: * User-agent: *
Allow: /$
Disallow: /

View File

@@ -0,0 +1,20 @@
{{ partial "base/header.html" . }}
{{ partial "base/site-title.html" . }}
{{ partial "base/nav-bar.html" . }}
{{ partial "base/base16-logo.html" . }}
<main role="main" id="server">
{{ partial "base/article.html" . }}
<table>
</table>
<div id="time-info">
<!-- <p id="last-updated">Last updated: <span id="last-updated-time"></span></p> -->
<!-- <p id="server-uptime">Server Uptime: <span id="server-uptime-time"></span></p> -->
Last updated: <span id="last-updated-time"></span> Server Uptime: <span id="server-uptime-time">
</div>
</main>
{{ partial "base/footer.html" . }}

View File

@@ -0,0 +1,13 @@
<div class="education">
<div class="row">
<div class="col-8 text-left">
<p class="institution">
{{ .Get "name" }}
</p>
</div>
<div class="col text-right date">{{ .Get "date" }}</div>
</div>
<span class="title">
{{ .Get "title" }}
</span>
</div>

View File

@@ -0,0 +1,8 @@
<div id="print-icon">
{{ $type := .Get "type" }}
{{ $code := .Get "code" }}
{{ $pdfName := print "pdf/kevin-mok-" $type "-" $code ".pdf" }}
<a href="{{ $pdfName | relURL }}" target="_blank">
<img src="{{ "img/resume/printer.svg" | relURL }}" alt="printer-icon">
</a>
</div>

View File

@@ -0,0 +1,4 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<div class="no-line-spacing">
{{ .Inner }}
</div>

View File

@@ -1,16 +1,23 @@
<div class="project"> <div class="project">
<a class="project-link" href="{{ .Get "url" }}" target="_blank"> <div class="row project-header">
<img src="{{ "img/link.svg" | relURL }}" alt="link-icon"> <div class="col-8 text-left">
</a> <a class="project-link" href="{{ .Get "url" }}" target="_blank">
<button class="btn" type="button" data-toggle="collapse" <img src="{{ "img/resume/link.svg" | relURL }}" alt="link-icon">
data-target="#{{ .Get "name" | lower | urlize }}-details" </a>
aria-expanded="false" aria-controls="{{ .Get "name" | lower | urlize }}-details"> <button class="btn" type="button" data-toggle="collapse"
<h2 class="project-title">{{ .Get "name" }} ⏷</h2> data-target="#{{ .Get "name" | lower | urlize }}-details"
</button> aria-expanded="false" aria-controls="{{ .Get "name" | lower | urlize }}-details">
<div class="date">{{ .Get "date" }}</div> <h2 class="project-title">
{{ .Get "name" }}
<img class="down-triangle" src="{{ "img/resume/down-triangle.png" | relURL }}" alt="link-icon">
</h2>
</button>
</div>
<div class="col-4 text-right date">{{ .Get "date" }}</div>
</div>
<div class="collapse{{ with .Get "show" }} show{{ end }}" id="{{ .Get "name" | lower | urlize }}-details"> <div class="collapse{{ with .Get "show" }} show{{ end }}" id="{{ .Get "name" | lower | urlize }}-details">
<div> <div>
{{ .Inner }} {{ .Inner }}
</div> </div>
</div> </div>
</div> </div>

21
layouts/sitemap.xml Normal file
View File

@@ -0,0 +1,21 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
{{ range .Data.Pages }}{{ if ne .Params.sitemap_exclude true }}
<url>
<loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
<lastmod>{{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ end }}{{ with .Sitemap.ChangeFreq }}
<changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Sitemap.Priority 0.0 }}
<priority>{{ .Sitemap.Priority }}</priority>{{ end }}{{ if .IsTranslated }}{{ range .Translations }}
<xhtml:link
rel="alternate"
hreflang="{{ .Lang }}"
href="{{ .Permalink }}"
/>{{ end }}
<xhtml:link
rel="alternate"
hreflang="{{ .Lang }}"
href="{{ .Permalink }}"
/>{{ end }}
</url>
{{ end }}{{ end }}
</urlset>

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 132 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 216 KiB

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

View File

@@ -1,116 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512.002 512.002" style="enable-background:new 0 0 512.002 512.002;" xml:space="preserve">
<g>
<path style="fill:#FFFFFF;" d="M259.345,110.181c-0.076-0.789-0.112-1.578-0.112-2.369c0-11.578,7.584-20.997,16.903-20.997
c9.537,0,17.007,9.223,17.007,20.997c0,2.666-0.401,5.236-1.148,7.61c2.795-4.442,4.412-10.032,4.412-15.892
c0-14.079-9-25.535-20.06-25.535c-11.063,0-20.06,11.455-20.06,25.535c0,3.461,0.542,6.849,1.615,10.099
C258.369,109.807,258.851,109.992,259.345,110.181z"/>
<path style="fill:#FFFFFF;" d="M209.407,87.924c0.604-0.092,1.157-0.134,1.707-0.134c7.418,0,14.069,7.281,15.812,17.311
c0.175,1.1,0.285,2.196,0.334,3.277c0.482-0.245,0.972-0.475,1.471-0.688c0.245-1.739,0.364-3.369,0.364-5.006
c0-12.986-6.879-23.957-15.019-23.957c-6.933,0-12.775,7.636-14.44,17.95C201.532,91.973,204.993,88.657,209.407,87.924z"/>
<path style="fill:#FFFFFF;" d="M349.093,349.859c1.865-7.908,5.575-28.1,2.063-52.525c-4.438-30.87-47.875-126.994-55.35-137.727
c-4.36,0.609-15.946,7.304-25.342,12.733c-10.896,6.295-22.166,12.807-29.829,15.019c-1.6,0.453-3.273,0.677-4.997,0.677
c-11.199,0-23.32-9.468-31.135-16.926c-1.365,14.472-9.078,32.835-17.423,42.273c-5.271,6.045-9.982,19.854-14.538,33.21
c-4.22,12.367-8.583,25.157-13.925,33.592c-10.809,16.842-17.009,49.555-9.144,68.159c3.806,9.018,17.62,19.668,29.807,29.062
c14.905,11.491,27.776,21.413,29.196,31.419c1.657,11.831-4.635,18.388-10.927,21.497l15.961,18.263
c2.466,0.374,8.405,1.091,17.712,1.091c10.886,0,22.97-0.952,35.907-2.834c31.763-4.705,53.886-30.88,58.261-36.438
c0.023-7.363,0.248-40.123,2.396-50.366c0.834-3.945,4.037-10.547,16.136-10.547C345.803,349.488,347.594,349.653,349.093,349.859z
"/>
</g>
<g>
<path style="fill:#E69629;" d="M210.488,147.081c0.623,2.422,6.136,8.617,14.71,14.242c1.217,0.781,2.359,1.558,3.431,2.286
c4.756,3.232,6.871,4.559,10.29,4.098c5.034-0.66,23.579-11.904,31.499-16.706l1.971-1.194c2.949-1.796,5.306-3.023,7.2-4.009
c3.75-1.951,4.089-2.266,4.249-2.978c-0.425-1.103-3.926-4.056-10.641-6.364c-2.134-0.764-5.162-1.974-8.67-3.374
c-7.589-3.03-17.984-7.176-22.197-7.922c-0.18-0.034-0.349-0.045-0.539-0.045c-3.586,0-10.831,4.499-18.031,11.194
C220.211,139.513,213.283,144.92,210.488,147.081z"/>
<path style="fill:#E69629;" d="M147.149,395.532c-3.119-5.222-5.815-9.735-7.27-11.984c-5.738-8.931-15.696-18.907-20.442-18.907
c-0.416,0-0.635,0.097-0.777,0.181c-2.533,1.442-4.662,5.837-6.723,10.084c-2.847,5.875-6.075,12.535-12.036,16.146
c-4.41,2.676-11.152,4.138-17.668,5.555c-4.637,1.007-15.493,3.362-16.003,5.562c-0.703,2.968-0.049,6.033,0.781,9.913
c0.977,4.578,2.196,10.274,1.158,17.267c-0.732,4.386-2.063,8.575-3.354,12.627c-1.793,5.637-3.826,12.03-2.073,13.995
c2.162,1.909,15.207,4.019,24.731,5.562c11.972,1.937,24.351,3.942,31.932,7.118l2.009,0.846
c13.579,5.706,38.854,16.329,51.622,16.329c1.162,0,2.152-0.094,2.951-0.274c2.202-1.482,11.531-8.184,13.284-16.424
c2.394-10.619-7.338-23.005-13.349-29.444C169.25,432.519,156.477,411.14,147.149,395.532z"/>
<path style="fill:#E69629;" d="M435.761,420.974l-1.556-0.819c-10.688-5.65-16.307-20.984-15.563-32.542
c0.139-2.129-0.126-3.78-0.557-5.045c-1.974,3.247-4.793,7.348-8.143,10.697c-5.691,5.692-19.584,11.833-32.105,11.833
c-4.67,0-8.927-0.823-12.652-2.448c-12.498-5.451-14.202-21.081-14.234-28.917c-0.185,0.052-0.354,0.112-0.505,0.183
c-0.764,2.701-0.024,11.806,0.475,17.935c0.267,3.279,0.542,6.669,0.705,9.78c0.708,13.708-3.658,36.958-7.447,54.049
c-3.597,16.732,3.097,28.464,11.224,30.997c0.73,0.232,1.551,0.346,2.453,0.346c7.487,0,19.886-7.749,30.848-19.285
c7.788-8.189,25.122-17.04,40.416-24.85c8.622-4.402,17.537-8.956,20.071-11.271c0.564-0.525,0.648-0.819,0.65-0.821
C449.681,428.282,439.568,422.972,435.761,420.974z"/>
</g>
<path d="M461.071,411.093c-15.014-6.147-21.437-14.308-20.816-26.485c0.64-14.212-7.423-24.62-11.252-28.733
c2.313-8.837,9.073-39.406,0.007-65.959c-9.743-28.42-39.49-71.825-70.183-114.492c-12.565-17.522-13.159-36.57-13.846-58.625
c-0.658-21.036-1.4-44.88-13.131-71.387C319.095,16.55,293.501,0,261.628,0c-18.961,0-38.424,5.926-53.401,16.257
c-30.67,21.167-26.616,67.316-23.933,97.851c0.368,4.182,0.713,8.132,0.915,11.504c1.786,29.908,0.161,45.672-1.964,50.463
c-1.375,3.131-8.143,12.041-15.306,21.476c-7.408,9.758-15.807,20.816-22.691,31.121c-8.214,12.401-14.845,31.355-21.257,49.684
c-4.692,13.411-9.124,26.08-13.438,33.655c-8.177,14.564-6.142,28.145-4.444,34.422c-3.096,2.15-7.568,6.386-11.343,14.366
c-4.563,9.736-13.821,14.967-33.072,18.669c-8.847,1.81-14.947,5.53-18.137,11.056c-4.642,8.043-2.113,18.148,0.193,25.056
c3.408,10.151,1.284,16.577-2.577,28.246c-0.89,2.691-1.899,5.741-2.921,9.102c-1.61,5.308-1.029,10.131,1.722,14.341
c7.27,11.113,28.486,15.033,50.326,17.613c13.04,1.548,27.312,6.763,41.116,11.808c13.525,4.942,27.511,10.054,40.223,11.605
c1.932,0.243,3.846,0.364,5.691,0.364c19.194,0,27.866-12.735,30.616-17.967c6.894-1.407,30.673-5.912,55.181-6.518
c24.469-0.697,48.143,4.135,54.85,5.635c2.108,4.036,7.667,13.253,16.527,18.004c4.87,2.662,11.647,4.188,18.588,4.188
c0.002,0,0,0,0.002,0c7.413,0,21.516-1.753,32.678-13.497c11.133-11.796,38.949-26.859,59.261-37.856
c4.533-2.454,8.773-4.751,12.491-6.822c11.41-6.325,17.636-15.362,17.081-24.794C474.141,421.194,468.955,414.322,461.071,411.093z
M276.345,73.995c11.061,0,20.06,11.455,20.06,25.535c0,5.859-1.617,11.449-4.412,15.892c0.745-2.374,1.148-4.944,1.148-7.61
c0-11.774-7.47-20.997-17.007-20.997c-9.32,0-16.903,9.419-16.903,20.997c0,0.791,0.039,1.58,0.112,2.369
c-0.494-0.188-0.975-0.374-1.445-0.552c-1.073-3.25-1.615-6.638-1.615-10.099C256.284,85.451,265.282,73.995,276.345,73.995z
M242.329,125.164c4.214,0.744,14.606,4.892,22.197,7.922c3.508,1.4,6.539,2.61,8.67,3.374c6.715,2.308,10.217,5.261,10.641,6.364
c-0.159,0.713-0.499,1.027-4.249,2.978c-1.894,0.985-4.25,2.211-7.2,4.009l-1.971,1.194c-7.92,4.803-26.465,16.048-31.499,16.706
c-3.42,0.46-5.535-0.868-10.29-4.098c-1.073-0.73-2.214-1.506-3.431-2.286c-8.573-5.627-14.088-11.82-14.71-14.242
c2.795-2.16,9.723-7.568,13.27-10.771c7.2-6.695,14.445-11.194,18.031-11.194C241.978,125.117,242.15,125.13,242.329,125.164z
M214.073,78.724c8.142,0,15.019,10.97,15.019,23.957c0,1.638-0.118,3.267-0.364,5.006c-0.499,0.213-0.989,0.445-1.471,0.688
c-0.049-1.083-0.161-2.177-0.334-3.277c-1.742-10.03-8.394-17.311-15.812-17.311c-0.549,0-1.101,0.042-1.707,0.134
c-4.413,0.735-7.875,4.049-9.772,8.751C201.299,86.359,207.142,78.724,214.073,78.724z M189.271,469.128
c-1.753,8.241-11.083,14.942-13.284,16.424c-0.799,0.18-1.788,0.274-2.951,0.274c-12.768,0-38.043-10.623-51.622-16.329
l-2.009-0.846c-7.583-3.178-19.961-5.18-31.932-7.118c-9.525-1.543-22.568-3.653-24.731-5.562c-1.753-1.966,0.28-8.358,2.073-13.995
c1.291-4.052,2.624-8.241,3.354-12.627c1.036-6.993-0.181-12.691-1.158-17.267c-0.829-3.881-1.484-6.945-0.781-9.913
c0.51-2.199,11.366-4.554,16.003-5.562c6.518-1.417,13.26-2.879,17.668-5.555c5.961-3.611,9.189-10.27,12.036-16.146
c2.061-4.247,4.19-8.642,6.723-10.084c0.143-0.086,0.361-0.181,0.777-0.181c4.746,0,14.704,9.975,20.442,18.907
c1.455,2.249,4.151,6.76,7.27,11.984c9.329,15.609,22.102,36.987,28.773,44.151C181.933,446.123,191.664,458.508,189.271,469.128z
M327.787,360.037c-2.145,10.243-2.372,43.003-2.396,50.366c-4.375,5.558-26.498,31.732-58.261,36.438
c-12.938,1.88-25.019,2.834-35.907,2.834c-9.307,0-15.246-0.719-17.712-1.091l-15.961-18.263
c6.292-3.109,12.584-9.666,10.927-21.497c-1.42-10.005-14.291-19.928-29.196-31.419c-12.187-9.394-26.001-20.042-29.807-29.062
c-7.865-18.602-1.665-51.315,9.144-68.159c5.342-8.434,9.705-21.225,13.925-33.592c4.556-13.356,9.268-27.166,14.538-33.21
c8.345-9.438,16.057-27.801,17.423-42.273c7.814,7.458,19.936,16.926,31.135,16.926c1.724,0,3.398-0.225,4.997-0.677
c7.662-2.213,18.931-8.724,29.829-15.019c9.396-5.429,20.982-12.124,25.342-12.733c7.475,10.734,50.912,106.858,55.35,137.727
c3.512,24.425-0.198,44.616-2.063,52.525c-1.501-0.206-3.29-0.371-5.17-0.371C331.824,349.488,328.621,356.092,327.787,360.037z
M449.194,431.621c-2.533,2.315-11.449,6.869-20.071,11.271c-15.295,7.808-32.631,16.661-40.416,24.85
c-10.962,11.536-23.361,19.285-30.848,19.285c-0.901,0-1.722-0.114-2.453-0.346c-8.128-2.533-14.821-14.266-11.224-30.997
c3.789-17.093,8.153-40.341,7.447-54.049c-0.163-3.112-0.438-6.502-0.705-9.78c-0.499-6.127-1.239-15.233-0.475-17.935
c0.151-0.071,0.319-0.131,0.505-0.183c0.032,7.836,1.734,23.467,14.234,28.917c3.725,1.625,7.982,2.448,12.652,2.448
c12.521,0,26.414-6.141,32.105-11.833c3.351-3.349,6.169-7.45,8.143-10.697c0.431,1.264,0.697,2.916,0.557,5.044
c-0.744,11.558,4.873,26.891,15.563,32.542l1.556,0.819c3.807,1.996,13.92,7.307,14.083,9.824
C449.842,430.801,449.758,431.097,449.194,431.621z"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 B

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 507.2 507.2" style="enable-background:new 0 0 507.2 507.2;" xml:space="preserve">
<circle style="fill:#32BA7C;" cx="253.6" cy="253.6" r="253.6"/>
<path style="fill:#0AA06E;" d="M188.8,368l130.4,130.4c108-28.8,188-127.2,188-244.8c0-2.4,0-4.8,0-7.2L404.8,152L188.8,368z"/>
<g>
<path style="fill:#FFFFFF;" d="M260,310.4c11.2,11.2,11.2,30.4,0,41.6l-23.2,23.2c-11.2,11.2-30.4,11.2-41.6,0L93.6,272.8
c-11.2-11.2-11.2-30.4,0-41.6l23.2-23.2c11.2-11.2,30.4-11.2,41.6,0L260,310.4z"/>
<path style="fill:#FFFFFF;" d="M348.8,133.6c11.2-11.2,30.4-11.2,41.6,0l23.2,23.2c11.2,11.2,11.2,30.4,0,41.6l-176,175.2
c-11.2,11.2-30.4,11.2-41.6,0l-23.2-23.2c-11.2-11.2-11.2-30.4,0-41.6L348.8,133.6z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

46
static/img/server/x.svg Normal file
View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<circle style="fill:#E21B1B;" cx="256" cy="256" r="256"/>
<path style="fill:#C40606;" d="M510.28,285.304L367.912,142.936L150.248,368.608l140.928,140.928
C406.352,493.696,497.056,401.288,510.28,285.304z"/>
<g>
<path style="fill:#FFFFFF;" d="M354.376,371.536c-5.12,0-10.232-1.952-14.144-5.856L146.408,171.848
c-7.816-7.816-7.816-20.472,0-28.28s20.472-7.816,28.28,0L368.52,337.4c7.816,7.816,7.816,20.472,0,28.28
C364.608,369.584,359.496,371.536,354.376,371.536z"/>
<path style="fill:#FFFFFF;" d="M160.544,371.536c-5.12,0-10.232-1.952-14.144-5.856c-7.816-7.816-7.816-20.472,0-28.28
l193.832-193.832c7.816-7.816,20.472-7.816,28.28,0s7.816,20.472,0,28.28L174.688,365.68
C170.784,369.584,165.664,371.536,160.544,371.536z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 504.124 504.124" style="enable-background:new 0 0 504.124 504.124;" xml:space="preserve">
<path style="fill:#D07C40;" d="M0,200.862L252.062,51.2l252.062,149.662v220.554H0V200.862z"/>
<path style="fill:#EFEFEF;" d="M55.138,11.815h393.846c8.665,0,15.754,7.089,15.754,15.754v275.692
c0,8.665-7.089,15.754-15.754,15.754H55.138c-8.665,0-15.754-7.089-15.754-15.754V27.569C39.385,18.905,46.474,11.815,55.138,11.815
z"/>
<path style="fill:#26A6D1;" d="M415.902,43.323l25.206-31.508h7.877c8.665,0,15.754,7.089,15.754,15.754v15.754H415.902z
M211.102,43.323l25.206-31.508h55.138L266.24,43.323H211.102z M39.385,43.323V27.569c0-8.665,7.089-15.754,15.754-15.754h39.385
L69.317,43.323H39.385z"/>
<path style="fill:#EFC75E;" d="M504.123,468.677c0,12.997-10.634,23.631-23.631,23.631H23.631C10.634,492.309,0,481.674,0,468.677
V200.862l252.062,110.277l252.062-110.277v267.815H504.123z"/>
<path style="fill:#E8C15B;" d="M504.123,468.677c0,12.997-10.634,23.631-23.631,23.631H23.631C10.634,492.309,0,481.674,0,468.677
v-47.262l504.123-220.554V468.677z"/>
<path style="fill:#D6D9DB;" d="M160.295,151.631l3.151,16.542l-25.206-39.385l-35.446,55.138c-0.394,5.12,22.449,9.058,50.806,9.058
s51.2-3.938,51.2-9.058l-31.114-46.08C173.686,137.846,160.295,151.631,160.295,151.631z M163.446,129.969
c5.514,0,9.846-4.332,9.846-9.846s-4.332-9.846-9.846-9.846s-9.846,4.332-9.846,9.846S157.932,129.969,163.446,129.969z
M244.185,126.031h157.538c4.332,0,7.877-3.545,7.877-7.877s-3.545-7.877-7.877-7.877H244.185c-4.332,0-7.877,3.545-7.877,7.877
S239.852,126.031,244.185,126.031z M401.723,141.785H244.185c-4.332,0-7.877,3.545-7.877,7.877s3.545,7.877,7.877,7.877h157.538
c4.332,0,7.877-3.545,7.877-7.877C409.6,145.329,406.055,141.785,401.723,141.785z M362.338,173.292H244.185
c-4.332,0-7.877,3.545-7.877,7.877s3.545,7.877,7.877,7.877h118.154c4.332,0,7.877-3.545,7.877-7.877
C370.215,176.837,366.671,173.292,362.338,173.292z"/>
<path style="fill:#E2574C;" d="M313.502,43.323l25.206-31.508h55.138L368.64,43.323H313.502z M108.702,43.323l25.206-31.508h55.138
L163.84,43.323H108.702z"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

160
static/img/social/gitea.svg Normal file
View File

@@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 135.46667 135.46667"
version="1.1"
id="svg8"
sodipodi:docname="logo.svg"
inkscape:version="0.92.1 r15371"
inkscape:export-filename=""
inkscape:export-xdpi="48.000004"
inkscape:export-ydpi="48.000004">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="0.70710678"
inkscape:cx="418.13805"
inkscape:cy="177.57445"
inkscape:document-units="mm"
inkscape:current-layer="layer2"
showgrid="false"
units="px"
width="256px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1137"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:pagecheckerboard="false"
inkscape:measure-start="283.373,243.952"
inkscape:measure-end="290.267,236.527">
<sodipodi:guide
position="0,0"
orientation="0,512"
id="guide3699"
inkscape:locked="false" />
<sodipodi:guide
position="135.46667,0"
orientation="-512,0"
id="guide3701"
inkscape:locked="false" />
<sodipodi:guide
position="135.46667,135.46667"
orientation="0,-512"
id="guide3703"
inkscape:locked="false" />
<sodipodi:guide
position="0,135.46667"
orientation="512,0"
id="guide3705"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-161.53334)"
style="display:inline">
<path
style="fill:#609926;fill-opacity:1;stroke:#428f29;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 27.709937,195.15095 c -9.546573,-0.0272 -22.3392732,6.79805 -21.6317552,23.90397 1.105534,26.72889 25.4565952,29.20839 35.1916502,29.42301 1.068023,5.01357 12.521798,22.30563 21.001818,23.21667 h 37.15277 c 22.27763,-1.66785 38.9607,-75.75671 26.59321,-76.03825 -46.781583,2.47691 -49.995146,2.13838 -88.599758,0 -2.495053,-0.0266 -5.972321,-0.49474 -9.707935,-0.5054 z m 2.491319,9.45886 c 1.351378,13.69267 3.555849,21.70359 8.018216,33.94345 -11.382872,-1.50473 -21.069822,-5.22443 -22.851515,-19.10984 -0.950962,-7.4112 2.390428,-15.16769 14.833299,-14.83361 z"
id="path3722"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscccccsccsc" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2"
style="display:inline">
<rect
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.24757317;stroke-opacity:1"
id="rect4599"
width="34.762054"
height="34.762054"
x="87.508659"
y="18.291576"
transform="rotate(25.914715)"
ry="5.4825778" />
<path
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26644793px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 79.804947,57.359056 3.241146,1.609954 V 35.255731 h -3.262698 z"
id="path4525"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Layer 3"
style="display:inline">
<g
style="display:inline"
id="g4539">
<circle
transform="rotate(-19.796137)"
r="3.4745038"
cy="90.077766"
cx="49.064713"
id="path4606"
style="fill:#609926;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1" />
<circle
transform="rotate(-19.796137)"
r="3.4745038"
cy="102.1049"
cx="36.810425"
id="path4606-3"
style="fill:#609926;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1" />
<circle
transform="rotate(-19.796137)"
r="3.4745038"
cy="111.43928"
cx="46.484283"
id="path4606-1"
style="fill:#609926;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1" />
<rect
transform="rotate(26.024158)"
y="18.061695"
x="97.333458"
height="27.261492"
width="2.6726954"
id="rect4629-8"
style="fill:#609926;fill-opacity:1;stroke:none;stroke-width:0.27444693;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path4514"
d="m 76.558096,68.116343 c 12.97589,6.395378 13.012989,4.101862 4.890858,20.907244"
style="fill:none;stroke:#609926;stroke-width:2.68000007;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="438.549px" height="438.549px" viewBox="0 0 438.549 438.549" style="enable-background:new 0 0 438.549 438.549;"
xml:space="preserve">
<g>
<path d="M409.132,114.573c-19.608-33.596-46.205-60.194-79.798-79.8C295.736,15.166,259.057,5.365,219.271,5.365
c-39.781,0-76.472,9.804-110.063,29.408c-33.596,19.605-60.192,46.204-79.8,79.8C9.803,148.168,0,184.854,0,224.63
c0,47.78,13.94,90.745,41.827,128.906c27.884,38.164,63.906,64.572,108.063,79.227c5.14,0.954,8.945,0.283,11.419-1.996
c2.475-2.282,3.711-5.14,3.711-8.562c0-0.571-0.049-5.708-0.144-15.417c-0.098-9.709-0.144-18.179-0.144-25.406l-6.567,1.136
c-4.187,0.767-9.469,1.092-15.846,1c-6.374-0.089-12.991-0.757-19.842-1.999c-6.854-1.231-13.229-4.086-19.13-8.559
c-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559
c-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-0.951-2.568-2.098-3.711-3.429c-1.142-1.331-1.997-2.663-2.568-3.997
c-0.572-1.335-0.098-2.43,1.427-3.289c1.525-0.859,4.281-1.276,8.28-1.276l5.708,0.853c3.807,0.763,8.516,3.042,14.133,6.851
c5.614,3.806,10.229,8.754,13.846,14.842c4.38,7.806,9.657,13.754,15.846,17.847c6.184,4.093,12.419,6.136,18.699,6.136
c6.28,0,11.704-0.476,16.274-1.423c4.565-0.952,8.848-2.383,12.847-4.285c1.713-12.758,6.377-22.559,13.988-29.41
c-10.848-1.14-20.601-2.857-29.264-5.14c-8.658-2.286-17.605-5.996-26.835-11.14c-9.235-5.137-16.896-11.516-22.985-19.126
c-6.09-7.614-11.088-17.61-14.987-29.979c-3.901-12.374-5.852-26.648-5.852-42.826c0-23.035,7.52-42.637,22.557-58.817
c-7.044-17.318-6.379-36.732,1.997-58.24c5.52-1.715,13.706-0.428,24.554,3.853c10.85,4.283,18.794,7.952,23.84,10.994
c5.046,3.041,9.089,5.618,12.135,7.708c17.705-4.947,35.976-7.421,54.818-7.421s37.117,2.474,54.823,7.421l10.849-6.849
c7.419-4.57,16.18-8.758,26.262-12.565c10.088-3.805,17.802-4.853,23.134-3.138c8.562,21.509,9.325,40.922,2.279,58.24
c15.036,16.18,22.559,35.787,22.559,58.817c0,16.178-1.958,30.497-5.853,42.966c-3.9,12.471-8.941,22.457-15.125,29.979
c-6.191,7.521-13.901,13.85-23.131,18.986c-9.232,5.14-18.182,8.85-26.84,11.136c-8.662,2.286-18.415,4.004-29.263,5.146
c9.894,8.562,14.842,22.077,14.842,40.539v60.237c0,3.422,1.19,6.279,3.572,8.562c2.379,2.279,6.136,2.95,11.276,1.995
c44.163-14.653,80.185-41.062,108.068-79.226c27.88-38.161,41.825-81.126,41.825-128.906
C438.536,184.851,428.728,148.168,409.132,114.573z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 382 382" style="enable-background:new 0 0 382 382;" xml:space="preserve">
<path style="fill:#0077B7;" d="M347.445,0H34.555C15.471,0,0,15.471,0,34.555v312.889C0,366.529,15.471,382,34.555,382h312.889
C366.529,382,382,366.529,382,347.444V34.555C382,15.471,366.529,0,347.445,0z M118.207,329.844c0,5.554-4.502,10.056-10.056,10.056
H65.345c-5.554,0-10.056-4.502-10.056-10.056V150.403c0-5.554,4.502-10.056,10.056-10.056h42.806
c5.554,0,10.056,4.502,10.056,10.056V329.844z M86.748,123.432c-22.459,0-40.666-18.207-40.666-40.666S64.289,42.1,86.748,42.1
s40.666,18.207,40.666,40.666S109.208,123.432,86.748,123.432z M341.91,330.654c0,5.106-4.14,9.246-9.246,9.246H286.73
c-5.106,0-9.246-4.14-9.246-9.246v-84.168c0-12.556,3.683-55.021-32.813-55.021c-28.309,0-34.051,29.066-35.204,42.11v97.079
c0,5.106-4.139,9.246-9.246,9.246h-44.426c-5.106,0-9.246-4.14-9.246-9.246V149.593c0-5.106,4.14-9.246,9.246-9.246h44.426
c5.106,0,9.246,4.14,9.246,9.246v15.655c10.497-15.753,26.097-27.912,59.312-27.912c73.552,0,73.131,68.716,73.131,106.472
L341.91,330.654L341.91,330.654z"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="61.076954mm" height="65.47831mm" viewBox="0 0 216.4144 232.00976"><path d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915" fill="#3088d4"/><path d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

1
static/pdf Submodule

Submodule static/pdf added at 803aa46cb9

Binary file not shown.

104
static/server-table.js Normal file
View File

@@ -0,0 +1,104 @@
const log = console.log
const headerKeys = {
"status": "Status",
"url": "URL",
"description": "Description",
"repo": "Repository"
}
const keyOrder = ["status", "url", "description", "repo"]
const generateTableHead = table => {
let thead = table.createTHead();
let row = thead.insertRow();
keyOrder.forEach(key => {
let th = document.createElement("th");
th.textContent = headerKeys[key];
row.appendChild(th);
})
}
const generateTable = (table, data) => {
data.forEach(elem => {
let row = table.insertRow();
keyOrder.forEach(key => {
const cell = row.insertCell();
cell.className = key;
const aElem = document.createElement('a')
aElem.target = '_blank'
switch (key) {
case 'status':
// cell.textContent = ((elem[key] == 'up') ? '🗸' : '✗')
const statusIcon = document.createElement('img')
statusIcon.src = '/img/server/' + ((elem[key] == 'up') ? 'check' : 'x') + '.svg'
cell.appendChild(statusIcon)
break
case 'url':
aElem.href = elem[key]
aElem.textContent = elem['shortUrl']
cell.appendChild(aElem)
break
case 'description':
cell.innerHTML = elem[key]
break
case 'repo':
aElem.href = elem['repoUrl']
aElem.textContent = elem[key]
cell.appendChild(aElem)
break
default:
cell.textContent = elem[key]
}
})
})
}
const getDurationSince = (date, verbose) => {
const milli = Math.abs(Date.now() - date)
let mins = Math.floor(milli/1000/60)
const days = Math.floor(mins/60/24)
mins %= 60*24
const hours = Math.floor(mins/60)
mins %= 60
let dayString = ''
let hourString = ''
let minString = ''
if (days > 0) {
dayString += days
if (!verbose) {
dayString += 'd '
} else {
dayString += (days == 1) ? ' day' : ' days'
dayString += ', '
}
}
if (hours > 0) {
hourString += hours
if (!verbose) {
hourString += 'h '
} else {
hourString += (hours == 1) ? ' hour' : ' hours'
hourString += ', '
}
}
minString += (mins > 0) ? mins: '0'
if (!verbose) {
minString += 'm'
} else {
minString += (mins == 1) ? ' minute' : ' minutes'
}
return dayString + hourString + minString
}
fetch("/server-apps.json")
.then(response => response.json())
.then(json => {
let table = document.querySelector("table");
generateTable(table, json['sites']);
generateTableHead(table);
document.querySelector('#last-updated-time').textContent =
getDurationSince(new Date(json['updateTime']), false) + ' ago.'
document.querySelector('#server-uptime-time').textContent =
getDurationSince(new Date(json['upSince']), true) + '.'
});