Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
a19c6fb921
|
|||
|
e5579a0e77
|
|||
|
5e7fe99969
|
|||
|
2305b246c1
|
|||
|
497ad86122
|
|||
|
d1d191e413
|
|||
|
b546a2a529
|
|||
|
8b794bfa8e
|
|||
|
d14bcf3c8f
|
|||
|
b652c45375
|
|||
|
ae2e8100fd
|
1
.gitignore
vendored
@@ -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
@@ -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
|
||||||
@@ -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,22 +169,68 @@ 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%;
|
||||||
|
|
||||||
.container {
|
// }}} base //
|
||||||
background-color: #393939;
|
|
||||||
max-width: 62em;
|
.container {// {{{
|
||||||
|
// max-width: $max-page-width;
|
||||||
|
// 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;
|
||||||
margin-bottom: 0;
|
margin-bottom: 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,53 +489,109 @@ 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 {
|
h1 {// {{{
|
||||||
color: $base-orange;
|
color: $base-orange;
|
||||||
}
|
margin-top: 1rem;
|
||||||
|
|
||||||
.date {
|
@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;
|
float: right;
|
||||||
color: $base03;
|
color: $base03;
|
||||||
|
|
||||||
|
@media (max-width: $phone-width) {
|
||||||
|
padding-top: 0em;
|
||||||
|
}
|
||||||
|
}// }}}
|
||||||
|
|
||||||
|
#projects {// {{{
|
||||||
|
h1 {
|
||||||
|
margin-bottom: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.project {
|
.project {// {{{
|
||||||
@include vert-padding-rem(.2);
|
@include vert-padding-rem(.2);
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
@@ -481,7 +609,15 @@ footer {// {{{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn {
|
.down-triangle {
|
||||||
|
// fill: blue;
|
||||||
|
height: 1.2em;
|
||||||
|
position: relative;
|
||||||
|
top: -3px;
|
||||||
|
left: -3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {// {{{
|
||||||
display: inline;
|
display: inline;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
@@ -491,13 +627,77 @@ footer {// {{{
|
|||||||
outline: none !important;
|
outline: none !important;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
}
|
}// }}}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
|
||||||
// [id^="details-"] {
|
// [id^="details-"] {
|
||||||
// margin-top: .5em;
|
// 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 {// {{{
|
#server {// {{{
|
||||||
@@ -550,18 +750,180 @@ footer {// {{{
|
|||||||
}
|
}
|
||||||
}// }}}
|
}// }}}
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
// hero {{{ //
|
// hero {{{ //
|
||||||
|
|
||||||
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 {
|
||||||
@@ -572,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 {// {{{
|
||||||
@@ -708,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;
|
||||||
}
|
}
|
||||||
@@ -722,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 */
|
||||||
|
|
||||||
|
|||||||
20
config.yaml
@@ -16,7 +16,7 @@ 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
|
||||||
@@ -26,11 +26,23 @@ menu:
|
|||||||
- name: config
|
- name: config
|
||||||
url: /config
|
url: /config
|
||||||
weight: 10
|
weight: 10
|
||||||
|
- name: card
|
||||||
|
url: /card
|
||||||
|
weight: 15
|
||||||
|
# - name: letter
|
||||||
|
# url: /letter
|
||||||
|
# weight: 17
|
||||||
# - name: credits
|
# - name: credits
|
||||||
# url: /credits
|
# url: /credits
|
||||||
# weight: 20
|
# weight: 20
|
||||||
|
|
||||||
blackfriday:
|
# blackfriday:
|
||||||
plainIDAnchors: true
|
# plainIDAnchors: true
|
||||||
hrefTargetBlank: true
|
# hrefTargetBlank: true
|
||||||
|
|
||||||
|
disableKinds: ["RSS"]
|
||||||
|
|
||||||
|
markup:
|
||||||
|
goldmark:
|
||||||
|
renderer:
|
||||||
|
unsafe: true
|
||||||
|
|||||||
5
content/card/_index.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
title: "Digital Card"
|
||||||
|
date: 2019-02-11T07:50:51-05:00
|
||||||
|
draft: false
|
||||||
|
---
|
||||||
@@ -6,7 +6,7 @@ layout: single
|
|||||||
---
|
---
|
||||||
<!--- Intro {{{ -->
|
<!--- Intro {{{ -->
|
||||||
|
|
||||||

|

|
||||||
*Screenshot from my dual-monitor setup.*
|
*Screenshot from my dual-monitor setup.*
|
||||||
|
|
||||||
This [repository][lc-repo] contains the dotfiles to increase my workflow
|
This [repository][lc-repo] contains the dotfiles to increase my workflow
|
||||||
@@ -34,8 +34,9 @@ efficiency. They are also for my Linux [rice][ricing_explanation].
|
|||||||
<!--- 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 -->
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Credits"
|
|
||||||
date: 2019-02-11T03:10:25-05:00
|
|
||||||
draft: true
|
|
||||||
---
|
|
||||||
1
content/letter
Submodule
@@ -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
|
|
||||||
from 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 be 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 -->
|
||||||
|
|||||||
@@ -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 }}} -->
|
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -5,10 +5,12 @@ draft: false
|
|||||||
layout: single
|
layout: single
|
||||||
js: ["server-table"]
|
js: ["server-table"]
|
||||||
---
|
---
|
||||||
Here is a list of apps that I am running a my [DigitalOcean
|
Here is a list of apps that I am running on my [DigitalOcean
|
||||||
droplet][do-droplet] along with their statuses, which are updated
|
droplet][do-droplet]. Their [statuses] are updated every hour using a
|
||||||
every hour using [this Node.js script][update-script].
|
[Node.js script][update-script] and a [systemd service]/[timer].
|
||||||
|
|
||||||
[do-droplet]: https://www.digitalocean.com/products/droplets/
|
[do-droplet]: https://www.digitalocean.com/products/droplets/
|
||||||
[update-script]:
|
[statuses]: https://kevin-mok.com/server-apps.json
|
||||||
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
|
||||||
|
[update-script]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-status.js
|
||||||
|
|||||||
69
layouts/card/section.html
Normal 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"> </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" . }}
|
||||||
22
layouts/letter/section.html
Normal 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>
|
||||||
13
layouts/letter/single.html
Normal 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>
|
||||||
@@ -7,15 +7,39 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<!-- <span class="copyright">© {{ .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">© {{ .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">
|
||||||
© {{ 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>
|
© {{ now.Year }} {{ .Site.Title }} ·
|
||||||
|
<!-- <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>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>.
|
||||||
|
|||||||
@@ -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">
|
||||||
|
<div id="phone-number" class="col text-left">
|
||||||
|
<a href="tel:647-685-2500" target="_blank">
|
||||||
<img src="{{ "img/resume/smartphone.svg" | relURL }}"
|
<img src="{{ "img/resume/smartphone.svg" | relURL }}"
|
||||||
alt="smartphone-icon">:
|
alt="smartphone-icon">
|
||||||
<a href="tel:647-685-2500" target="_blank">647-685-2500</a>
|
<span class="url-info">
|
||||||
|
647-685-2500
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div id="email">
|
<div id="linkedin" class="col text-right">
|
||||||
<img src="{{ "img/resume/envelope.svg" | relURL }}" alt="envelope-icon">:
|
<a href="https://www.linkedin.com/in/Kev-Mok" target="_blank">
|
||||||
<a href="mailto:me@kevin-mok.com">me@kevin-mok.com</a>
|
<span class="url-info">
|
||||||
|
Kev-Mok
|
||||||
|
</span>
|
||||||
|
<img src="{{ "img/social/linkedin.svg" | relURL }}" alt="linkedin-icon">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mx-auto">
|
||||||
|
<div id="email" class="col col-left">
|
||||||
|
<a href="mailto:me@kevin-mok.com" target="_blank">
|
||||||
|
<img src="{{ "img/resume/envelope.svg" | relURL }}" alt="envelope-icon">
|
||||||
|
<span class="url-info">
|
||||||
|
me@kevin-mok.com
|
||||||
|
</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 id="website">
|
|
||||||
<img src="{{ "img/resume/link.svg" | relURL }}" alt="link-icon">:
|
|
||||||
<a href="https://kevin-mok.com/">kevin-mok.com</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<div id="print-icon">
|
<div id="print-icon">
|
||||||
<a href="{{ "kevin-mok-resume.pdf" | relURL }}" target="_blank">
|
<a href="{{ "pdf/kevin-mok-resume.pdf" | relURL }}" target="_blank">
|
||||||
<img src="{{ "img/resume/printer.svg" | relURL }}" alt="printer-icon">
|
<img src="{{ "img/resume/printer.svg" | relURL }}" alt="printer-icon">
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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 }}
|
||||||
|
|||||||
@@ -1,4 +1 @@
|
|||||||
User-agent: *
|
User-agent: *
|
||||||
|
|
||||||
Allow: /$
|
|
||||||
Disallow: /
|
|
||||||
|
|||||||
13
layouts/shortcodes/resume/education.html
Normal 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>
|
||||||
8
layouts/shortcodes/resume/letter-print.html
Normal 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>
|
||||||
4
layouts/shortcodes/resume/no-spacing.html
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{{ $_hugo_config := `{ "version": 1 }` }}
|
||||||
|
<div class="no-line-spacing">
|
||||||
|
{{ .Inner }}
|
||||||
|
</div>
|
||||||
@@ -1,16 +1,23 @@
|
|||||||
<div class="project">
|
<div class="project">
|
||||||
|
<div class="row project-header">
|
||||||
|
<div class="col-8 text-left">
|
||||||
<a class="project-link" href="{{ .Get "url" }}" target="_blank">
|
<a class="project-link" href="{{ .Get "url" }}" target="_blank">
|
||||||
<img src="{{ "img/resume/link.svg" | relURL }}" alt="link-icon">
|
<img src="{{ "img/resume/link.svg" | relURL }}" alt="link-icon">
|
||||||
</a>
|
</a>
|
||||||
<button class="btn" type="button" data-toggle="collapse"
|
<button class="btn" type="button" data-toggle="collapse"
|
||||||
data-target="#{{ .Get "name" | lower | urlize }}-details"
|
data-target="#{{ .Get "name" | lower | urlize }}-details"
|
||||||
aria-expanded="false" aria-controls="{{ .Get "name" | lower | urlize }}-details">
|
aria-expanded="false" aria-controls="{{ .Get "name" | lower | urlize }}-details">
|
||||||
<h2 class="project-title">{{ .Get "name" }} ⏷</h2>
|
<h2 class="project-title">
|
||||||
|
{{ .Get "name" }}
|
||||||
|
<img class="down-triangle" src="{{ "img/resume/down-triangle.png" | relURL }}" alt="link-icon">
|
||||||
|
</h2>
|
||||||
</button>
|
</button>
|
||||||
<div class="date">{{ .Get "date" }}</div>
|
</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
@@ -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>
|
||||||
BIN
static/img/resume/down-triangle.png
Normal file
|
After Width: | Height: | Size: 580 B |
BIN
static/img/resume/signature-white.png
Normal file
|
After Width: | Height: | Size: 465 KiB |
BIN
static/img/resume/signature.png
Normal file
|
After Width: | Height: | Size: 467 KiB |
56
static/img/social/email.svg
Normal 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
@@ -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 |
59
static/img/social/github.svg
Normal 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 |
44
static/img/social/linkedin.svg
Normal 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 |
1
static/img/social/mastodon.svg
Normal 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
@@ -1,78 +0,0 @@
|
|||||||
{
|
|
||||||
"sites": [
|
|
||||||
{
|
|
||||||
"shortUrl": "kevin-mok.com",
|
|
||||||
"url": "https://kevin-mok.com",
|
|
||||||
"siteTitle": " Kevin Mok ",
|
|
||||||
"description": "Personal site (this site).",
|
|
||||||
"repo": "Kevin-Mok/my-site",
|
|
||||||
"repoUrl": "https://git.kevin-mok.com/Kevin-Mok/my-site",
|
|
||||||
"status": "up"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"shortUrl": "git.kevin-mok.com",
|
|
||||||
"url": "https://git.kevin-mok.com",
|
|
||||||
"siteTitle": "Kevin Mok's Gitea",
|
|
||||||
"description": "Lightweight Git server.",
|
|
||||||
"repo": "go-gitea/gitea",
|
|
||||||
"repoUrl": "https://github.com/go-gitea/gitea",
|
|
||||||
"status": "up"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"shortUrl": "cal.khkm.tk",
|
|
||||||
"url": "https://cal.khkm.tk",
|
|
||||||
"siteTitle": "Baïkal server",
|
|
||||||
"description": "CalDAV/CardDAV server.",
|
|
||||||
"repo": "sabre-io/Baikal",
|
|
||||||
"repoUrl": "https://github.com/sabre-io/Baikal",
|
|
||||||
"status": "up"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"shortUrl": "matrix.ataraxy.tk",
|
|
||||||
"url": "https://matrix.ataraxy.tk/.well-known/matrix/server",
|
|
||||||
"siteTitle": "",
|
|
||||||
"description": "Matrix chat server. Only accessible through Riot client.",
|
|
||||||
"repo": "matrix-org/synapse",
|
|
||||||
"repoUrl": "https://github.com/matrix-org/synapse",
|
|
||||||
"status": "up"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"shortUrl": "mnpd.gq",
|
|
||||||
"url": "https://mnpd.gq/test",
|
|
||||||
"siteTitle": "test",
|
|
||||||
"description": "Minimalistic live web notepad.",
|
|
||||||
"repo": "pereorga/minimalist-web-notepad",
|
|
||||||
"repoUrl": "https://github.com/pereorga/minimalist-web-notepad",
|
|
||||||
"status": "up"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"shortUrl": "pste.gq",
|
|
||||||
"url": "https://pste.gq",
|
|
||||||
"siteTitle": "hastebin",
|
|
||||||
"description": "Pastebin.",
|
|
||||||
"repo": "seejohnrun/haste-server",
|
|
||||||
"repoUrl": "https://github.com/seejohnrun/haste-server",
|
|
||||||
"status": "up"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"shortUrl": "smol.gq",
|
|
||||||
"url": "https://smol.gq",
|
|
||||||
"siteTitle": "Kevin's URL Shortener",
|
|
||||||
"description": "URL shortener.",
|
|
||||||
"repo": "132ikl/liteshort",
|
|
||||||
"repoUrl": "https://github.com/132ikl/liteshort",
|
|
||||||
"status": "up"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"shortUrl": "taskd.khkm.tk",
|
|
||||||
"url": "taskd.khkm.tk:53589",
|
|
||||||
"siteTitle": "",
|
|
||||||
"description": "Taskwarrior (task manager) server. No web interface.",
|
|
||||||
"repo": "GothenburgBitFactory/taskserver",
|
|
||||||
"repoUrl": "https://github.com/GothenburgBitFactory/taskserver",
|
|
||||||
"status": "up"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"updateTime": 1569204723194,
|
|
||||||
"upSince": "2019-09-22 19:30:10"
|
|
||||||
}
|
|
||||||
@@ -38,6 +38,9 @@ const generateTable = (table, data) => {
|
|||||||
aElem.textContent = elem['shortUrl']
|
aElem.textContent = elem['shortUrl']
|
||||||
cell.appendChild(aElem)
|
cell.appendChild(aElem)
|
||||||
break
|
break
|
||||||
|
case 'description':
|
||||||
|
cell.innerHTML = elem[key]
|
||||||
|
break
|
||||||
case 'repo':
|
case 'repo':
|
||||||
aElem.href = elem['repoUrl']
|
aElem.href = elem['repoUrl']
|
||||||
aElem.textContent = elem[key]
|
aElem.textContent = elem[key]
|
||||||
@@ -50,17 +53,42 @@ const generateTable = (table, data) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const getDurationSince = date => {
|
const getDurationSince = (date, verbose) => {
|
||||||
const milli = Math.abs(Date.now() - date)
|
const milli = Math.abs(Date.now() - date)
|
||||||
let mins = Math.floor(milli/1000/60)
|
let mins = Math.floor(milli/1000/60)
|
||||||
const days = Math.floor(mins/60/24)
|
const days = Math.floor(mins/60/24)
|
||||||
mins %= 60*24
|
mins %= 60*24
|
||||||
const hours = Math.floor(mins/60)
|
const hours = Math.floor(mins/60)
|
||||||
mins %= 60
|
mins %= 60
|
||||||
let durationString = (days > 0) ? `${days}d ` : ''
|
|
||||||
durationString += (hours > 0) ? `${hours} hours, ` : ''
|
let dayString = ''
|
||||||
durationString += (mins > 0) ? `${mins} minutes` : '0m'
|
let hourString = ''
|
||||||
return durationString
|
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")
|
fetch("/server-apps.json")
|
||||||
@@ -70,7 +98,7 @@ fetch("/server-apps.json")
|
|||||||
generateTable(table, json['sites']);
|
generateTable(table, json['sites']);
|
||||||
generateTableHead(table);
|
generateTableHead(table);
|
||||||
document.querySelector('#last-updated-time').textContent =
|
document.querySelector('#last-updated-time').textContent =
|
||||||
getDurationSince(new Date(json['updateTime'])) + ' ago.'
|
getDurationSince(new Date(json['updateTime']), false) + ' ago.'
|
||||||
document.querySelector('#server-uptime-time').textContent =
|
document.querySelector('#server-uptime-time').textContent =
|
||||||
getDurationSince(new Date(json['upSince'])) + '.'
|
getDurationSince(new Date(json['upSince']), true) + '.'
|
||||||
});
|
});
|
||||||
|
|||||||