ajout Dockerfil
@ -0,0 +1,9 @@
|
||||
FROM debian:bullseye-slim
|
||||
RUN apt update -y
|
||||
RUN apt install tree less openssh-server wamerican accountsservice -y
|
||||
RUN useradd -rm -d /home/debian -s /bin/bash -g root -G sudo -u 1000 test
|
||||
RUN service ssh start
|
||||
COPY . /home/debian
|
||||
EXPOSE 22
|
||||
RUN /home/debian/deploy.sh
|
||||
CMD ["/usr/sbin/sshd", "-D"]
|
@ -0,0 +1,3 @@
|
||||
- Niveau 2
|
||||
- Qu'est-ce qu'un système d'exploitation
|
||||
|
@ -0,0 +1,46 @@
|
||||
baseurl = "https://devops.legaragenumerique.fr/"
|
||||
contentdir = "content"
|
||||
layoutdir = "layouts"
|
||||
publishdir = "public"
|
||||
title = "Enter Bash"
|
||||
canonifyurls = true
|
||||
|
||||
DefaultContentLanguage = "fr"
|
||||
theme = "beautifulhugo"
|
||||
metaDataFormat = "yaml"
|
||||
pygmentsUseClasses = true
|
||||
pygmentCodeFences = true
|
||||
#disqusShortname = "XXX"
|
||||
#googleAnalytics = "XXX"
|
||||
|
||||
[Params]
|
||||
subtitle = "Un jeu pour découvrir Bash"
|
||||
logo = "img/SIGNALweb.png"
|
||||
favicon = "img/LOGOweb.png"
|
||||
dateFormat = "2 January 2 2006"
|
||||
commit = false
|
||||
rss = false
|
||||
comments = true
|
||||
# gcse = "012345678901234567890:abcdefghijk" # Get your code from google.com/cse. Make sure to go to "Look and Feel" and change Layout to "Full Width" and Theme to "Classic"
|
||||
|
||||
#[[Params.bigimg]]
|
||||
# src = "img/triangle.jpg"
|
||||
# desc = "Triangle"
|
||||
#[[Params.bigimg]]
|
||||
# src = "img/sphere.jpg"
|
||||
# desc = "Sphere"
|
||||
#[[Params.bigimg]]
|
||||
# src = "img/hexagon.jpg"
|
||||
# desc = "Hexagon"
|
||||
|
||||
[Author]
|
||||
name = "Le Garage Numérique"
|
||||
email = "contact@legaragenumerique.fr"
|
||||
facebook = "garagenumeriqueparis"
|
||||
gitlab = "garagenum"
|
||||
twitter = "garagenumerique"
|
||||
linkedin = "le-garage-num%C3%A9rique"
|
||||
snapchat = "legarage_num"
|
||||
instagram = "legaragenum"
|
||||
|
||||
|
@ -0,0 +1,18 @@
|
||||
Pour découvrir bash ,
|
||||
|
||||
démarrez un terminal et connectez-vous avec la commande suivante:
|
||||
**ssh level1@bash.legaragenumerique.fr**
|
||||
|
||||
```
|
||||
visiteur@mypc:~$ ssh level1@bash.legaragenumerique.fr
|
||||
level1@bash.legaragenumerique.fr's password:
|
||||
```
|
||||
|
||||
Écrivez le mot de passe: **knj-yhn-576**.
|
||||
|
||||
Rien ne s'affiche, c'est normal, c'est pour que la personne qui regarde derrière votre épaule ne connaisse pas le nombre de caractères du mot de passe.
|
||||
|
||||
Appuyez ensuite sur Entrée pour valider le mot de passe.
|
||||
|
||||
|
||||
|
@ -0,0 +1,82 @@
|
||||
removed '/home/level1/.bashrc'
|
||||
removed directory '/home/level1'
|
||||
removed '/home/level2/ihj-pli-444'
|
||||
removed '/home/level2/fichier3'
|
||||
removed directory '/home/level2/dossier2'
|
||||
removed '/home/level2/fichier6'
|
||||
removed '/home/level2/.bashrc'
|
||||
removed directory '/home/level2/dossier3'
|
||||
removed '/home/level2/fichier2'
|
||||
removed directory '/home/level2/dossier1'
|
||||
removed '/home/level2/fichier5'
|
||||
removed '/home/level2/fichier1'
|
||||
removed '/home/level2/fichier4'
|
||||
removed directory '/home/level2'
|
||||
removed '/home/level3/README'
|
||||
removed '/home/level3/.bashrc'
|
||||
removed directory '/home/level3'
|
||||
removed '/home/level4/README'
|
||||
removed '/home/level4/.bashrc'
|
||||
removed directory '/home/level4'
|
||||
removed '/home/level5/README'
|
||||
removed '/home/level5/.bashrc'
|
||||
removed '/home/level5/script.sh'
|
||||
removed directory '/home/level5'
|
||||
removed '/home/level6/README'
|
||||
removed '/home/level6/.bashrc'
|
||||
removed '/home/level6/script.sh'
|
||||
removed directory '/home/level6'
|
||||
removed '/home/level7/README'
|
||||
removed '/home/level7/.bashrc'
|
||||
removed '/home/level7/script.sh'
|
||||
removed directory '/home/level7'
|
||||
removed '/home/level8/README'
|
||||
removed '/home/level8/.bashrc'
|
||||
removed '/home/level8/.clear.sh'
|
||||
removed '/home/level8/debug.sh'
|
||||
removed '/home/level8/script.sh'
|
||||
removed directory '/home/level8'
|
||||
removed '/home/level9/.bashrc'
|
||||
removed directory '/home/level9'
|
||||
removed directory '/home/level10'
|
||||
changed ownership of '/home/level1/.bashrc' from root:root to level1:level1
|
||||
ownership of '/home/level1' retained as level1:level1
|
||||
changed ownership of '/home/level2/ihj-pli-444' from root:root to level2:level2
|
||||
changed ownership of '/home/level2/fichier3' from root:root to level2:level2
|
||||
changed ownership of '/home/level2/dossier2' from root:root to level2:level2
|
||||
changed ownership of '/home/level2/fichier6' from root:root to level2:level2
|
||||
changed ownership of '/home/level2/.bashrc' from root:root to level2:level2
|
||||
changed ownership of '/home/level2/dossier3' from root:root to level2:level2
|
||||
changed ownership of '/home/level2/fichier2' from root:root to level2:level2
|
||||
changed ownership of '/home/level2/dossier1' from root:root to level2:level2
|
||||
changed ownership of '/home/level2/fichier5' from root:root to level2:level2
|
||||
changed ownership of '/home/level2/fichier1' from root:root to level2:level2
|
||||
changed ownership of '/home/level2/fichier4' from root:root to level2:level2
|
||||
ownership of '/home/level2' retained as level2:level2
|
||||
changed ownership of '/home/level3/README' from root:root to level3:level3
|
||||
changed ownership of '/home/level3/.bashrc' from root:root to level3:level3
|
||||
ownership of '/home/level3' retained as level3:level3
|
||||
changed ownership of '/home/level4/README' from root:root to level4:level4
|
||||
changed ownership of '/home/level4/.bashrc' from root:root to level4:level4
|
||||
ownership of '/home/level4' retained as level4:level4
|
||||
changed ownership of '/home/level5/README' from root:root to level5:level5
|
||||
changed ownership of '/home/level5/.bashrc' from root:root to level5:level5
|
||||
changed ownership of '/home/level5/script.sh' from root:root to level5:level5
|
||||
ownership of '/home/level5' retained as level5:level5
|
||||
changed ownership of '/home/level6/README' from root:root to level6:level6
|
||||
changed ownership of '/home/level6/.bashrc' from root:root to level6:level6
|
||||
changed ownership of '/home/level6/script.sh' from root:root to level6:level6
|
||||
ownership of '/home/level6' retained as level6:level6
|
||||
changed ownership of '/home/level7/README' from root:root to level7:level7
|
||||
changed ownership of '/home/level7/.bashrc' from root:root to level7:level7
|
||||
changed ownership of '/home/level7/script.sh' from root:root to level7:level7
|
||||
ownership of '/home/level7' retained as level7:level7
|
||||
changed ownership of '/home/level8/README' from root:root to level8:level8
|
||||
changed ownership of '/home/level8/.bashrc' from root:root to level8:level8
|
||||
changed ownership of '/home/level8/.clear.sh' from root:root to level8:level8
|
||||
changed ownership of '/home/level8/debug.sh' from root:root to level8:level8
|
||||
changed ownership of '/home/level8/script.sh' from root:root to level8:level8
|
||||
ownership of '/home/level8' retained as level8:level8
|
||||
changed ownership of '/home/level9/.bashrc' from root:root to level9:level9
|
||||
ownership of '/home/level9' retained as level9:level9
|
||||
ownership of '/home/level10' retained as level10:level10
|
@ -0,0 +1,29 @@
|
||||
#!/bin/bash
|
||||
cat <<- EOF1 >> /home/level1/.bashrc
|
||||
cat << NestedEOF1
|
||||
|
||||
Bienvenue!
|
||||
|
||||
Vous avez réussi à vous connecter au serveur!
|
||||
|
||||
Pour passer au niveau 2, il faut écrire la commande suivante:
|
||||
|
||||
su - level2
|
||||
|
||||
La commande su permet de changer d'utilisateur (Switch User).
|
||||
N'oubliez pas le "-" (tiret du 6) entre "su" et "level2"
|
||||
|
||||
Appuyez ensuite sur Entrée, et saisissez le mot de passe suivant:
|
||||
|
||||
kbc-209-xdf
|
||||
|
||||
|
||||
puis appuyez sur Entrée à nouveau!
|
||||
|
||||
|
||||
NestedEOF1
|
||||
EOF1
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
|
||||
cat <<- EOF1 >> /home/level2/.bashrc
|
||||
cat << NestedEOF1
|
||||
|
||||
Super!
|
||||
|
||||
|
||||
Bienvenue dans le niveau 2 !
|
||||
|
||||
Vous êtes en train d'utiliser Linux, un SYSTÈME D'EXPLOITATION OPEN-SOURCE.
|
||||
|
||||
Nous allons apprendre quelques commandes de base pour manipuler le système.
|
||||
|
||||
Commencez par écrire la commande "ls" (ne mettez pas les guillemets)
|
||||
|
||||
Appuyez ensuite sur Entrée
|
||||
|
||||
Vous voyez la liste des fichiers du DOSSIER COURANT
|
||||
|
||||
Le nom de l'un des fichiers est le mot de passe pour le niveau 3.
|
||||
|
||||
Tapez su - level3 puis Entrée et saisissez le mot de passe
|
||||
|
||||
|
||||
|
||||
NestedEOF1
|
||||
EOF1
|
||||
|
||||
|
||||
for i in {1..6} ; do
|
||||
touch /home/level2/fichier$i ;
|
||||
cat <<- EOF2 >> /home/level2/fichier$i
|
||||
|
||||
Ceci est le contenu du fichier nommé fichier$i
|
||||
|
||||
EOF2
|
||||
done
|
||||
|
||||
for i in {1..3} ; do
|
||||
mkdir /home/level2/dossier$i ;
|
||||
done
|
||||
|
||||
touch /home/level2/ihj-pli-444
|
@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
cat <<- EOF1 >> /home/level3/.bashrc
|
||||
cat << NestedEOF1
|
||||
|
||||
|
||||
Bravo, vous êtes déjà arrivés au 3eme niveau!
|
||||
|
||||
Nous allons maintenant apprendre à regarder le contenu d'un fichier.
|
||||
|
||||
Avec la commande ls, vous voyer un fichier nommé "README" (Lisez-moi).
|
||||
|
||||
Saisissez la commande suivante pour afficher son contenu:
|
||||
|
||||
cat README
|
||||
|
||||
Écrivez bien README en majuscules
|
||||
|
||||
Connectez-vous maintenant au niveau 4 avec la commande
|
||||
|
||||
su - level4
|
||||
|
||||
NestedEOF1
|
||||
EOF1
|
||||
|
||||
touch /home/level3/README
|
||||
echo "mot de passe : bvi-rsk-820" > /home/level3/README
|
||||
|
@ -0,0 +1,38 @@
|
||||
#!/bin/bash
|
||||
|
||||
cat <<- EOF1 >> /home/level4/.bashrc
|
||||
cat << NestedEOF1
|
||||
|
||||
|
||||
Vous êtes au 4eme niveau.
|
||||
|
||||
Certains fichiers sont trop longs être lus avec cat.
|
||||
|
||||
Nous allons utiliser la commande "less" pour naviguer dans le fichier.
|
||||
|
||||
Une fois dans "less", utilisez les flèches haut et bas pour naviquer,
|
||||
|
||||
et appuyez sur q pour quitter.
|
||||
|
||||
Vous trouverez le mot de passe au milieu du fichier.
|
||||
|
||||
Saisissez la commande suivante:
|
||||
|
||||
less README
|
||||
|
||||
Quand vous aurez trouvé le mot de passe, connectez-vous au niveau 5:
|
||||
|
||||
su - level5
|
||||
|
||||
NestedEOF1
|
||||
EOF1
|
||||
|
||||
touch /home/level4/README
|
||||
|
||||
for i in {1..90} ; do shuf -n4 /usr/share/dict/words |tr '\n' ' ' >> /home/level4/README \
|
||||
&& echo ' ' >> /home/level4/README ; done
|
||||
echo "mot de passe : 830-bus-fux" >> /home/level4/README
|
||||
for i in {1..90} ; do shuf -n4 /usr/share/dict/words |tr '\n' ' ' >> /home/level4/README \
|
||||
&& echo ' ' >> /home/level4/README ; done
|
||||
|
||||
|
@ -0,0 +1,58 @@
|
||||
#!/bin/bash
|
||||
|
||||
cat <<- EOF1 >> /home/level5/.bashrc
|
||||
cat << NestedEOF1
|
||||
|
||||
|
||||
Vous êtes au 5eme niveau.
|
||||
|
||||
C'est presque la dernière fois que vous verrez un message d'accueil.
|
||||
|
||||
Il vous faudra désormais lire le contenu du fichier README.
|
||||
|
||||
Saisissez la commande
|
||||
|
||||
less README
|
||||
|
||||
et suivez les indications.
|
||||
|
||||
Appuyez sur la touche q pour quitter less !
|
||||
|
||||
|
||||
NestedEOF1
|
||||
EOF1
|
||||
|
||||
touch /home/level5/README
|
||||
|
||||
cat << EOF2 > /home/level5/README
|
||||
|
||||
Pour trouver le mot de passe du 5ème niveau,
|
||||
|
||||
vous allez exécuter un script.
|
||||
|
||||
Un script, c'est comme un petit logiciel, qui tient dans un seul fichier.
|
||||
|
||||
Pour exécuter un script, on utilise la commande bash,
|
||||
suivi du nom du fichier.
|
||||
|
||||
Saisissez la commande
|
||||
|
||||
bash script.sh
|
||||
|
||||
et appuyez sur Entrée. Connectez-vous ensuite au niveau 6 avec
|
||||
|
||||
su - level6
|
||||
|
||||
EOF2
|
||||
|
||||
touch /home/level5/script.sh
|
||||
chmod u+x /home/level5/script.sh
|
||||
|
||||
cat << EOF3 > /home/level5/script.sh
|
||||
#!/bin/bash
|
||||
|
||||
echo " le mot de passe est wdo-810-289-bou-104-910-429-fun " |sed 's/[[:digit:]]\+\-//g'
|
||||
|
||||
EOF3
|
||||
|
||||
|
@ -0,0 +1,38 @@
|
||||
echo "echo 'Lisez le README avec la commande less README (q pour quitter) ' " >> /home/level6/.bashrc
|
||||
|
||||
touch /home/level6/README
|
||||
|
||||
cat << EOF2 > /home/level6/README
|
||||
|
||||
Les scripts peuvent aussi être interactifs, et demander à l'utilisateur
|
||||
de confirmer une action ou d'écrire une information.
|
||||
|
||||
Éxecutez le script présent dans le dossier avec la commande:
|
||||
|
||||
bash script.sh
|
||||
|
||||
EOF2
|
||||
|
||||
touch /home/level6/script.sh
|
||||
chmod u+x /home/level6/script.sh
|
||||
|
||||
cat << 'EOF3' > /home/level6/script.sh
|
||||
#!/bin/bash
|
||||
|
||||
cat <<- 'EOF4'
|
||||
Pour obtenir le mot de passe,
|
||||
|
||||
Répondez à la question suivante et validez avec Entrée:
|
||||
|
||||
Quel est le système d'exploitation que nous utilisons actuellement?
|
||||
|
||||
EOF4
|
||||
|
||||
read os_used
|
||||
os_low="$(echo $os_used |tr [:upper:] [:lower:])"
|
||||
[[ "$os_low" = "linux" ]] \
|
||||
&& printf "\nC'est bien ça ! \n\nle mot de passe du niveau 7 est ocj-728-289-eyf-267-108-thc \n\nConnectez-vous avec le commande \n\n su - level7 \n" |sed 's/[[:digit:]]\+\-//g' \
|
||||
|| printf "Non, ce n\'est pas $os_low, relancez le script pour essayer à nouveau\n"
|
||||
|
||||
|
||||
EOF3
|
@ -0,0 +1,32 @@
|
||||
echo "echo 'Lisez le README avec la commande less README' \(q pour quitter\)" >> /home/level7/.bashrc
|
||||
|
||||
touch /home/level7/README
|
||||
|
||||
cat << EOF1 > /home/level7/README
|
||||
|
||||
La différence entre un script et un logiciel classique, c'est qu'un script,
|
||||
ça tient dans un seul fichier, dont on peut lire le contenu.
|
||||
|
||||
Pour lire le contenu du script, c'est pareil que pour lire le contenu du
|
||||
README, mais en remplaçant README dans la commande par le nom du script.
|
||||
|
||||
Pour accéder, au niveau 8, lisez le contenu du script nommé script.sh
|
||||
|
||||
EOF1
|
||||
|
||||
|
||||
|
||||
touch /home/level7/script.sh
|
||||
|
||||
cat << 'EOF2' > /home/level7/script.sh
|
||||
#!/bin/bash
|
||||
|
||||
# Ceci est un script
|
||||
# Les lignes commençant par '#' ne sont pas 'interprétées', c'est-à-dire
|
||||
# que les commandes qu'elles contiennent ne sont pas exécutées.
|
||||
# Cela permet d'écrire des commentaires ou des explications dans le script.
|
||||
|
||||
echo " Le mot de passe du niveau 8 est fuf-612-vhi"
|
||||
|
||||
|
||||
EOF2
|
@ -0,0 +1,104 @@
|
||||
echo "echo 'Devenez Technicien DevOps'" >> /home/level8/.bashrc
|
||||
|
||||
touch /home/level8/README
|
||||
|
||||
cat <<EOF1 > /home/level8/README
|
||||
|
||||
Le Technicien DevOps c'est quelqu'un qui peut utiliser et écrire des scripts
|
||||
|
||||
pour faciliter la maintenance des ordinateurs et des serveurs.
|
||||
|
||||
|
||||
Commencez dès maintenant à "débuguer", c'est à dire à trouver le problème
|
||||
|
||||
dans le code-source du script (le contenu du fichier) !
|
||||
|
||||
|
||||
|
||||
1/ Essayez d'exécuter le script nommé script.sh à l'aide de la commande:
|
||||
|
||||
bash script.sh
|
||||
|
||||
Vous verrez qu'il y a une erreur qui s'affiche, alors que le script devrait
|
||||
nous afficher le mot de passe pour le niveau 9...
|
||||
|
||||
|
||||
|
||||
2/ Lisez alors le contenu du script (son code-source) avec less:
|
||||
|
||||
less script.sh
|
||||
|
||||
|
||||
|
||||
3/ Quand vous aurez trouvé l'erreur, exécutez un autre script, nommé debug.sh:
|
||||
|
||||
bash debug.sh
|
||||
|
||||
|
||||
Avec ça, vous devriez pouvoir passer au niveau 9 !
|
||||
|
||||
|
||||
EOF1
|
||||
|
||||
|
||||
touch /home/level8/script.sh
|
||||
touch /home/level8/.clear.sh
|
||||
cat <<- 'EOF2' > /home/level8/.clear.sh
|
||||
|
||||
|
||||
SECRET2=$(echo `cat /dev/urandom |tr -dc [:alnum:] |fold -w 3 |head -n10` wqp `cat /dev/urandom |tr -dc [:alnum:] |fold -w 3 |head -n10` 230 `cat /dev/urandom |tr -dc [:alnum:] |fold -w 3 |head -n10` ang)
|
||||
cat << 'EOF3' > /home/level8/script.sh
|
||||
Voici un script permettant d\'afficher le mot de passe du niveau 9 &&
|
||||
. .clear.sh && echo $SECRET2 |sed -e "s/ /-/g" |cut -d- -f11,22,33 && bash ./.clear.sh && exit
|
||||
EOF3
|
||||
|
||||
EOF2
|
||||
|
||||
bash /home/level8/.clear.sh
|
||||
|
||||
|
||||
touch /home/level8/debug.sh
|
||||
cat << 'EOF4' > /home/level8/debug.sh
|
||||
|
||||
cat <<- 'EOF5'
|
||||
|
||||
Quel est le caractère à ajouter au début de la 1ère ligne du script
|
||||
|
||||
pour qu'il fonctionne ?
|
||||
|
||||
Répondez et validez avec Entrée:
|
||||
|
||||
EOF5
|
||||
|
||||
|
||||
PASS="
|
||||
|
||||
Féliciations !
|
||||
Vous avez corrigés le script !
|
||||
|
||||
Exécutez le à nouveau avec la commande:
|
||||
|
||||
bash script.sh
|
||||
|
||||
"
|
||||
|
||||
TRY="
|
||||
|
||||
Ce n'est pas ça !
|
||||
|
||||
Lisez à nouveau le fichier pour trouver l'erreur :
|
||||
|
||||
less script.sh
|
||||
|
||||
puis exécutez à nouveau ce script:
|
||||
|
||||
bash debug.sh
|
||||
|
||||
"
|
||||
|
||||
read CHAR
|
||||
|
||||
[[ $CHAR == "#" ]] && sed "1s/^/# /" /home/level8/script.sh > /tmp/script.sh && cat /tmp/script.sh > /home/level8/script.sh && rm -f /tmp/sript.sh && echo "${PASS}" || echo "${TRY}"
|
||||
|
||||
EOF4
|
||||
|
@ -0,0 +1,14 @@
|
||||
cat <<EOF1 >> /home/level9/.bashrc
|
||||
|
||||
cat <<EOF2
|
||||
Vous êtes arrivés au niveau 9 !?
|
||||
|
||||
Très, très fort..
|
||||
|
||||
Vous êtes bon pour devenir un super technicien!
|
||||
|
||||
Inscrivez-vous à la formation du Pass Numérique Pro!
|
||||
|
||||
EOF2
|
||||
|
||||
EOF1
|
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 15 KiB |
@ -0,0 +1,80 @@
|
||||
<!-- This file is the homepage of the website. -->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
This section just sets up some metadata for the website.
|
||||
|
||||
It probably does not need to be changed.
|
||||
-->
|
||||
<meta charset="utf-8">
|
||||
<base href="{{ .Site.BaseURL }}">
|
||||
<title>{{ .Site.Title }}</title>
|
||||
<link rel="canonical" href="{{ .Permalink }}">
|
||||
<link href="{{ .RSSlink }}" rel="alternate" type="application/rss+xml" title="{{ .Site.Title }}" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
|
||||
|
||||
{{ partial "head_includes.html" . }}
|
||||
</head>
|
||||
<body class="theme-base-08" lang="en">
|
||||
|
||||
{{ partial "sidebar.html" . }}
|
||||
|
||||
<!-- See /layouts/indexes/category.html for explanation of this section -->
|
||||
<div class="wrap">
|
||||
<div class="masthead">
|
||||
<div class="container">
|
||||
<h3 class="masthead-title">
|
||||
<a href="/" title="Home">Home</a>
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
This section contains the content of our home page.
|
||||
|
||||
I have broken it into three main sections:
|
||||
(1) about the blog
|
||||
(2) about me
|
||||
(3) Recent posts
|
||||
|
||||
The first two sections are pretty self explanatory.
|
||||
|
||||
In the recent posts section we ask Hugo to use the template found in
|
||||
/layouts/posts/summary.html to show a summary of the 10 most recent
|
||||
posts we have made.
|
||||
-->
|
||||
<div class="container content">
|
||||
<h1>This is a Blog made by Hugo</h1>
|
||||
|
||||
<p class="lead"> Welcome to my blog! </p>
|
||||
|
||||
<p>This is really just a bare-bone website to stand as a template for
|
||||
creating a blog that is statically generated by <a href="https://gohugo.io">Hugo</a>
|
||||
and hosted on GitLab via <a href="https://pages.gitlab.io">GitLab Pages</a>.</p>
|
||||
|
||||
<p>It's using a slightly modified version of the <a href="http://lanyon.getpoole.com">Lanyon</a>
|
||||
Jekyll theme.</p>
|
||||
|
||||
<!-- About me subsection -->
|
||||
<h2>About me</h2>
|
||||
|
||||
<p>Sometimes people have an "About me" section on the homepage of their website.</p>
|
||||
|
||||
|
||||
<!-- Recent Posts section -->
|
||||
<h1 class="post-title">Recent Posts</h1>
|
||||
<section id="main">
|
||||
<ul id="list">
|
||||
{{ range first 10 .Data.Pages }}
|
||||
{{ .Render "summary"}}
|
||||
{{ end }}
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label for="sidebar-checkbox" class="sidebar-toggle"></label>
|
||||
|
||||
{{ partial "footer.html" . }}
|
@ -0,0 +1,56 @@
|
||||
<!--
|
||||
This file is used to render a list of all posts that belong to a specific
|
||||
category.
|
||||
-->
|
||||
|
||||
|
||||
{{ partial "header.html" . }}
|
||||
|
||||
<body class="theme-base-08">
|
||||
{{ partial "sidebar.html" . }}
|
||||
|
||||
<!--
|
||||
Taken from Lanyon example site.
|
||||
|
||||
Putting everything in the wrap div makes the whole page slide over when the
|
||||
navigation button is pressed.
|
||||
|
||||
The masthead is a special Lanyon class that is above the horizontal line at
|
||||
the top of each page. To me it seemed like a place to put the page title.
|
||||
|
||||
We want the title to be Blog Posts and we want it to be a link to the
|
||||
root of the /posts section of the site.
|
||||
|
||||
-->
|
||||
<div class="wrap">
|
||||
<div class="masthead">
|
||||
<div class="container">
|
||||
<h3 class="masthead-title">
|
||||
<a href="/posts" title="Blog">Blog Posts</a>
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Show summary of all posts in a category -->
|
||||
<div class="container content">
|
||||
<h1 class="post-title">Recent Posts</h1>
|
||||
<section id="main">
|
||||
<div>
|
||||
<h5><a href="/categories">Full Category Index</a></h5>
|
||||
<h2>Posts in “{{ .Title }}”</h2>
|
||||
{{ range .Data.Pages }}
|
||||
{{ .Render "summary"}}
|
||||
{{ end }}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label for="sidebar-checkbox" class="sidebar-toggle"></label>
|
||||
|
||||
<!-- Include footer (ends <body> and <html>) -->
|
||||
{{ partial "footer.html" }}
|
||||
|
||||
|
||||
|
@ -0,0 +1,52 @@
|
||||
<!--
|
||||
This file is used to generate the root file of a Hugo index.
|
||||
In our case this is only the index for categories, so it will render the
|
||||
page baseurl/categories
|
||||
-->
|
||||
|
||||
{{ partial "header.html" . }}
|
||||
|
||||
<body class="theme-base-08">
|
||||
{{ partial "sidebar.html" . }}
|
||||
|
||||
<!-- See /layouts/indexes/category.html for explanation of this section -->
|
||||
<div class="wrap">
|
||||
<div class="masthead">
|
||||
<div class="container">
|
||||
<h3 class="masthead-title">
|
||||
<a href="/posts" title="Blog">Blog Posts</a>
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
In this section we instruct Hugo to list all the different items in the
|
||||
index. Because we only have an index for categories, each item will be
|
||||
a category name. The name is a link to a page that displays all posts in
|
||||
that category.
|
||||
|
||||
We also list the number of entries in each category in parenthesis next
|
||||
to the category name.
|
||||
-->
|
||||
<div class="container content">
|
||||
<section id="main">
|
||||
<div>
|
||||
<h1>Archive of Posts, by {{ .Data.Singular }}</h1>
|
||||
<ul class="category">
|
||||
{{ $data := .Data }}
|
||||
{{ range $key,$value := .Data.Index.ByCount }}
|
||||
<li><a href="/{{ $data.Plural }}/{{ $value.Name | urlize }}"> {{ $value.Name }} </a> ({{ $value.Count }} entries) </li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label for="sidebar-checkbox" class="sidebar-toggle"></label>
|
||||
|
||||
<!-- Include footer (ends <body> and <html>) -->
|
||||
{{ partial "footer.html" }}
|
||||
|
||||
|
||||
|
@ -0,0 +1,46 @@
|
||||
<!--
|
||||
This file is used to render a list of all posts on our blog.
|
||||
-->
|
||||
|
||||
{{ partial "header.html" . }}
|
||||
|
||||
<body class="theme-base-08">
|
||||
{{ partial "sidebar.html" . }}
|
||||
|
||||
<!-- See /layouts/indexes/category.html for explanation of this section -->
|
||||
<div class="wrap">
|
||||
<div class="masthead">
|
||||
<div class="container">
|
||||
<h3 class="masthead-title">
|
||||
<a href="/posts" title="Blog">Blog Posts</a>
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
In this section we have Hugo generate a list of all blog posts, ordered
|
||||
by date.
|
||||
|
||||
When showing each post we ask Hugo to use the template in
|
||||
/layouts/posts/li.html to provide a short description of each post.
|
||||
-->
|
||||
<div class="container content">
|
||||
<p>Here are all my blog posts, in descending order by creation date. If you would like to view them by topic, see the <a href="/categories">Categories</a> page.</p>
|
||||
<h1 class="post-title">All Blog Posts (By Date)</h1>
|
||||
<section id="main">
|
||||
<ul id="list">
|
||||
{{ range .Data.Pages }}
|
||||
{{ .Render "li"}}
|
||||
{{ end }}
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label for="sidebar-checkbox" class="sidebar-toggle"></label>
|
||||
|
||||
<!-- Include footer (ends <body> and <html>) -->
|
||||
{{ partial "footer.html" }}
|
||||
|
||||
|
||||
|
@ -0,0 +1,12 @@
|
||||
<!--
|
||||
This file is a template that is included various places to have a list of
|
||||
that particular posts categories generated.
|
||||
-->
|
||||
<div class="container">
|
||||
<ul class="catlist">
|
||||
<li><em>Categories: </em></li>
|
||||
{{ range .Params.categories }}
|
||||
<li><a href="/categories/{{ . | urlize }}">{{ . }}</a> </li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
@ -0,0 +1,27 @@
|
||||
<!--
|
||||
This is the main footer for the website. It is included on every page.
|
||||
|
||||
It is very basic. It has some text and a link back to the home page of the
|
||||
site.
|
||||
|
||||
It includes the google analytics template from /layouts/chrome/ga.html
|
||||
|
||||
It also closes the <body> and <html> tags for each page.
|
||||
-->
|
||||
|
||||
<div class="container content">
|
||||
<footer>
|
||||
<div>
|
||||
<p class="right credit">
|
||||
Fancy footer here. Link to <a href="/">Home Page</a>
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
{{ partial "ga.html" . }}
|
||||
-->
|
||||
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,17 @@
|
||||
<!--
|
||||
This file contains the necessary information for google analytics to track
|
||||
visitors and their behavior on my website.
|
||||
|
||||
This is specific to this website and will need to be changed for any other
|
||||
site
|
||||
-->
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', 'UA-36732392-2', 'sglyon.com');
|
||||
ga('send', 'pageview');
|
||||
|
||||
</script>
|
@ -0,0 +1,13 @@
|
||||
<!--
|
||||
This file simply includes all the css and fonts that should go into the
|
||||
header of each page.
|
||||
|
||||
It is separate from the rest of the header because the actual header for the
|
||||
homepage of the site is different, but we want every page of the site
|
||||
(including the homepage) to have the same assets.
|
||||
-->
|
||||
|
||||
<link rel="stylesheet" href="/css/poole.css">
|
||||
<link rel="stylesheet" href="/css/syntax.css">
|
||||
<link rel="stylesheet" href="/css/lanyon.css">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Serif:400,400italic,700|PT+Sans:400">
|
@ -0,0 +1,16 @@
|
||||
<!--
|
||||
This is the actual header for each page of the site except the homepage.
|
||||
|
||||
It simply shows the title of the page and includes the css/fonts found in
|
||||
/layouts/chrome/header.html
|
||||
-->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<base href="{{ .Site.BaseURL }}">
|
||||
<title> {{ .Title }} </title>
|
||||
<link rel="canonical" href="{{ .Permalink }}">
|
||||
{{ partial "head_includes.html" . }}
|
||||
</head>
|
@ -0,0 +1,29 @@
|
||||
<!--
|
||||
This is a helper file that adds previous and next links to the bottom of each
|
||||
blog post. (below next and previous refer to chronological next and previous)
|
||||
|
||||
It will check to see if there is a previous blog post. If is, it will print
|
||||
an arrow as well as the title of the previous post as a link as
|
||||
left-justified text.
|
||||
|
||||
It will then check for a next blog post. If there is one it prints the title
|
||||
of the next post with a right arrow as right justified text on the same line.
|
||||
|
||||
If there is ever not a next or previous post, it does nothing.
|
||||
-->
|
||||
|
||||
<div class="container">
|
||||
<hr />
|
||||
<hr />
|
||||
{{if .Prev}}
|
||||
<span class="left">
|
||||
<em>« Previous:</em> <a class="next" href="{{.Prev.Permalink}}">{{.Prev.Title}}</a>
|
||||
</span>
|
||||
{{end}}
|
||||
|
||||
{{if .Next}}
|
||||
<span class="right">
|
||||
<em>Next: </em><a class="next" href="{{.Next.Permalink}}"> {{ .Next.Title }}</a> »
|
||||
</span>
|
||||
{{end}}
|
||||
</div>
|
@ -0,0 +1,29 @@
|
||||
<!--
|
||||
This file defines the main sidebar that the user can toggle in and out of
|
||||
view. This is included in every file.
|
||||
|
||||
Most of this was taken directly from the Lanyon example site.
|
||||
|
||||
Here we simply include a link to the homepage, a link to the blog posts,
|
||||
and some copyright information.
|
||||
-->
|
||||
|
||||
<!-- Target for toggling the sidebar `.sidebar-checkbox` is for regular
|
||||
styles, `#sidebar-checkbox` for behavior. -->
|
||||
<input type="checkbox" class="sidebar-checkbox" id="sidebar-checkbox">
|
||||
|
||||
<!-- Toggleable sidebar -->
|
||||
<div class="sidebar" id="sidebar">
|
||||
|
||||
<nav class="sidebar-nav">
|
||||
<a class="sidebar-nav-item" href="/">Home</a>
|
||||
|
||||
<a class="sidebar-nav-item" href="/posts">Blog</a>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-item">
|
||||
<p>
|
||||
© 2014 Spencer Lyon. Powered by <a href="https://gohugo.io">Hugo</a>. Design adapted from <a href="http://lanyon.getpoole.com">Lanyon</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
@ -0,0 +1,26 @@
|
||||
<!--
|
||||
This file defines how a summary of a specifc post should be presented in a
|
||||
list (hence the file name li.html for "list item"). This is used in the
|
||||
template /layouts/indexes/posts.html
|
||||
|
||||
The lines of the displayed list item are as follows:
|
||||
(1) The name of the post
|
||||
(2) The date the post was written as left-justified text and a
|
||||
right-justified horizontal list of categories for that post.
|
||||
(3) The contents of the description field in the metadata of the actual
|
||||
markdown source of the post.
|
||||
-->
|
||||
<li>
|
||||
<span><h2><a href='{{ .Permalink }}'> {{ .Title }}</a> </h2></span>
|
||||
<span class="left">{{ .Date.Format "Mon, Jan 2, 2006" }}</span>
|
||||
<span class="right">
|
||||
<ul class="catlist">
|
||||
{{ range .Params.categories }}
|
||||
<li><a href="/categories/{{ . | urlize }}">{{ . }}</a> </li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</span>
|
||||
|
||||
<br />
|
||||
{{ .Description }}
|
||||
</li>
|
@ -0,0 +1,51 @@
|
||||
<!--
|
||||
This file is responsible for rendering a single blog post.
|
||||
-->
|
||||
|
||||
{{ partial "header.html" . }}
|
||||
|
||||
<body class="theme-base-08">
|
||||
{{ partial "sidebar.html" . }}
|
||||
|
||||
<!-- See /layouts/indexes/category.html for explanation of this section -->
|
||||
<div class="wrap">
|
||||
<div class="masthead">
|
||||
<div class="container">
|
||||
<h3 class="masthead-title">
|
||||
<a href="/posts" title="Blog">Blog Posts</a>
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
This is where the actual post is displayed.
|
||||
|
||||
We first access the title metadata field from the markdown source and
|
||||
display it as a heading.
|
||||
|
||||
We then access the date the post was written (also in the markdown
|
||||
metadata) and display a formated version of it
|
||||
|
||||
Finally we include the actual content of the post.
|
||||
-->
|
||||
<div class="container content">
|
||||
<h1 class="post-title">{{ .Title }}</h1>
|
||||
<section id="main">
|
||||
<h5 id="date"> {{ .Date.Format "Mon Jan 2, 2006" }} </h5>
|
||||
{{ .Content }}
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label for="sidebar-checkbox" class="sidebar-toggle"></label>
|
||||
|
||||
{{ partial "prev_next.html" . }}
|
||||
<br />
|
||||
{{ partial "categories.html" . }}
|
||||
|
||||
|
||||
<!-- Include footer (ends <body class="theme-base-08"> and <html>) -->
|
||||
{{ partial "footer.html" }}
|
||||
|
||||
|
||||
|
@ -0,0 +1,24 @@
|
||||
<!--
|
||||
This file defines how a summary of a specifc post should be presented. This
|
||||
is similar to the file /layouts/posts/li.html, but is meant have a bit longer
|
||||
of a representation than the one in that file.
|
||||
|
||||
This template does the following:
|
||||
(1) Shows the name of the post
|
||||
(2) Shows the date the post was created (from metadata in post markdown
|
||||
source)
|
||||
(3) Displays a Hugo-generated summary of the post
|
||||
(4) Provides a link with text Read More that points to the post
|
||||
-->
|
||||
|
||||
<article class="post">
|
||||
<header>
|
||||
<h2><a href='{{ .Permalink }}'> {{ .Title }}</a> </h2>
|
||||
<div class="meta">{{ .Date.Format "Mon, Jan 2, 2006" }}</div>
|
||||
</header>
|
||||
|
||||
{{ .Summary }}
|
||||
<footer>
|
||||
<a href='{{ .Permalink }}'><nobr>Read more →</nobr></a>
|
||||
</footer>
|
||||
</article>
|
@ -0,0 +1,527 @@
|
||||
/*
|
||||
* ___
|
||||
* /\_ \
|
||||
* \//\ \ __ ___ __ __ ___ ___
|
||||
* \ \ \ /'__`\ /' _ `\/\ \/\ \ / __`\ /' _ `\
|
||||
* \_\ \_/\ \_\.\_/\ \/\ \ \ \_\ \/\ \_\ \/\ \/\ \
|
||||
* /\____\ \__/.\_\ \_\ \_\/`____ \ \____/\ \_\ \_\
|
||||
* \/____/\/__/\/_/\/_/\/_/`/___/> \/___/ \/_/\/_/
|
||||
* /\___/
|
||||
* \/__/
|
||||
*
|
||||
* Designed, built, and released under MIT license by @mdo. Learn more at
|
||||
* https://github.com/poole/lanyon.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Contents
|
||||
*
|
||||
* Global resets
|
||||
* Masthead
|
||||
* Sidebar
|
||||
* Slide effect
|
||||
* Posts and pages
|
||||
* Pagination
|
||||
* Reverse layout
|
||||
* Themes
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Global resets
|
||||
*
|
||||
* Update the foundational and global aspects of the page.
|
||||
*/
|
||||
|
||||
/* Prevent scroll on narrow devices */
|
||||
html,
|
||||
body {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: "PT Serif", Georgia, "Times New Roman", serif;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: "PT Sans", Helvetica, Arial, sans-serif;
|
||||
font-weight: 400;
|
||||
color: #313131;
|
||||
letter-spacing: -.025rem;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Wrapper
|
||||
*
|
||||
* The wrapper is used to position site content when the sidebar is toggled. We
|
||||
* use an outter wrap to position the sidebar without interferring with the
|
||||
* regular page content.
|
||||
*/
|
||||
|
||||
.wrap {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Container
|
||||
*
|
||||
* Center the page content.
|
||||
*/
|
||||
|
||||
.container {
|
||||
max-width: 28rem;
|
||||
}
|
||||
@media (min-width: 38rem) {
|
||||
.container {
|
||||
max-width: 32rem;
|
||||
}
|
||||
}
|
||||
@media (min-width: 56rem) {
|
||||
.container {
|
||||
max-width: 38rem;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Masthead
|
||||
*
|
||||
* Super small header above the content for site name and short description.
|
||||
*/
|
||||
|
||||
.masthead {
|
||||
padding-top: 1rem;
|
||||
padding-bottom: 1rem;
|
||||
margin-bottom: 3rem;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
.masthead-title {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
color: #505050;
|
||||
}
|
||||
.masthead-title a {
|
||||
color: #505050;
|
||||
}
|
||||
.masthead-title small {
|
||||
font-size: 75%;
|
||||
font-weight: 400;
|
||||
color: #c0c0c0;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 48rem) {
|
||||
.masthead-title {
|
||||
text-align: center;
|
||||
}
|
||||
.masthead-title small {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Sidebar
|
||||
*
|
||||
* The sidebar is the drawer, the item we are toggling with our handy hamburger
|
||||
* button in the corner of the page.
|
||||
*
|
||||
* This particular sidebar implementation was inspired by Chris Coyier's
|
||||
* "Offcanvas Menu with CSS Target" article, and the checkbox variation from the
|
||||
* comments by a reader. It modifies both implementations to continue using the
|
||||
* checkbox (no change in URL means no polluted browser history), but this uses
|
||||
* `position` for the menu to avoid some potential content reflow issues.
|
||||
*
|
||||
* Source: http://css-tricks.com/off-canvas-menu-with-css-target/#comment-207504
|
||||
*/
|
||||
|
||||
/* Style and "hide" the sidebar */
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: -14rem;
|
||||
width: 14rem;
|
||||
visibility: hidden;
|
||||
overflow-y: auto;
|
||||
font-family: "PT Sans", Helvetica, Arial, sans-serif;
|
||||
font-size: .875rem; /* 15px */
|
||||
color: rgba(255,255,255,.6);
|
||||
background-color: #202020;
|
||||
-webkit-transition: all .3s ease-in-out;
|
||||
transition: all .3s ease-in-out;
|
||||
}
|
||||
@media (min-width: 30rem) {
|
||||
.sidebar {
|
||||
font-size: .75rem; /* 14px */
|
||||
}
|
||||
}
|
||||
|
||||
/* Sidebar content */
|
||||
.sidebar a {
|
||||
font-weight: normal;
|
||||
color: #fff;
|
||||
}
|
||||
.sidebar-item {
|
||||
padding: 1rem;
|
||||
}
|
||||
.sidebar-item p:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Sidebar nav */
|
||||
.sidebar-nav {
|
||||
border-bottom: 1px solid rgba(255,255,255,.1);
|
||||
}
|
||||
.sidebar-nav-item {
|
||||
display: block;
|
||||
padding: .5rem 1rem;
|
||||
border-top: 1px solid rgba(255,255,255,.1);
|
||||
}
|
||||
.sidebar-nav-item.active,
|
||||
a.sidebar-nav-item:hover,
|
||||
a.sidebar-nav-item:focus {
|
||||
text-decoration: none;
|
||||
background-color: rgba(255,255,255,.1);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
@media (min-width: 48rem) {
|
||||
.sidebar-item {
|
||||
padding: 1.5rem;
|
||||
}
|
||||
.sidebar-nav-item {
|
||||
padding-left: 1.5rem;
|
||||
padding-right: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Hide the sidebar checkbox that we toggle with `.sidebar-toggle` */
|
||||
.sidebar-checkbox {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Style the `label` that we use to target the `.sidebar-checkbox` */
|
||||
.sidebar-toggle {
|
||||
position: absolute;
|
||||
top: 1rem;
|
||||
left: 1rem;
|
||||
display: block;
|
||||
width: 2.2rem;
|
||||
padding: .5rem .65rem;
|
||||
color: #505050;
|
||||
background-color: #fff;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.sidebar-toggle:before {
|
||||
display: block;
|
||||
content: "";
|
||||
width: 100%;
|
||||
padding-bottom: .125rem;
|
||||
border-top: .375rem double;
|
||||
border-bottom: .125rem solid;
|
||||
|
||||
/* Make the border inside the box */
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.sidebar-toggle:active,
|
||||
#sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
color: #fff;
|
||||
background-color: #505050;
|
||||
}
|
||||
|
||||
@media (min-width: 30.1rem) {
|
||||
.sidebar-toggle {
|
||||
position: fixed;
|
||||
width: 2.25rem;
|
||||
}
|
||||
.sidebar-toggle:before {
|
||||
padding-bottom: .15rem;
|
||||
border-top-width: .45rem;
|
||||
border-bottom-width: .15rem;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Slide effect
|
||||
*
|
||||
* Handle the sliding effects of the sidebar and content in one spot, seperate
|
||||
* from the default styles.
|
||||
*
|
||||
* As an a heads up, we don't use `transform: translate3d()` here because when
|
||||
* mixed with `position: fixed;` for the sidebar toggle, it creates a new
|
||||
* containing block. Put simply, the fixed sidebar toggle behaves like
|
||||
* `position: absolute;` when transformed.
|
||||
*
|
||||
* Read more about it at http://meyerweb.com/eric/thoughts/2011/09/12/.
|
||||
*/
|
||||
|
||||
.wrap,
|
||||
.sidebar,
|
||||
.sidebar-toggle {
|
||||
-webkit-backface-visibility: hidden;
|
||||
-ms-backface-visibility: hidden;
|
||||
backface-visibility: hidden;
|
||||
}
|
||||
.wrap,
|
||||
.sidebar-toggle {
|
||||
-webkit-transition: -webkit-transform .3s ease-in-out;
|
||||
transition: transform .3s ease-in-out;
|
||||
}
|
||||
|
||||
#sidebar-checkbox:checked + .sidebar {
|
||||
visibility: visible;
|
||||
}
|
||||
#sidebar-checkbox:checked ~ .sidebar,
|
||||
#sidebar-checkbox:checked ~ .wrap,
|
||||
#sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
-webkit-transform: translateX(14rem);
|
||||
-ms-transform: translateX(14rem);
|
||||
transform: translateX(14rem);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Posts and pages
|
||||
*
|
||||
* Each post is wrapped in `.post` and is used on default and post layouts. Each
|
||||
* page is wrapped in `.page` and is only used on the page layout.
|
||||
*/
|
||||
|
||||
.page,
|
||||
.post {
|
||||
margin-bottom: 4em;
|
||||
}
|
||||
|
||||
/* Blog post or page title */
|
||||
.page-title,
|
||||
.post-title,
|
||||
.post-title a {
|
||||
color: #303030;
|
||||
}
|
||||
.page-title,
|
||||
.post-title {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
/* Meta data line below post title */
|
||||
.post-date {
|
||||
display: block;
|
||||
margin-top: -.5rem;
|
||||
margin-bottom: 1rem;
|
||||
color: #9a9a9a;
|
||||
}
|
||||
|
||||
/* Related posts */
|
||||
.related {
|
||||
padding-top: 2rem;
|
||||
padding-bottom: 2rem;
|
||||
border-top: 1px solid #eee;
|
||||
}
|
||||
.related-posts {
|
||||
padding-left: 0;
|
||||
list-style: none;
|
||||
}
|
||||
.related-posts h3 {
|
||||
margin-top: 0;
|
||||
}
|
||||
.related-posts li small {
|
||||
font-size: 75%;
|
||||
color: #999;
|
||||
}
|
||||
.related-posts li a:hover {
|
||||
color: #268bd2;
|
||||
text-decoration: none;
|
||||
}
|
||||
.related-posts li a:hover small {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Pagination
|
||||
*
|
||||
* Super lightweight (HTML-wise) blog pagination. `span`s are provide for when
|
||||
* there are no more previous or next posts to show.
|
||||
*/
|
||||
|
||||
.pagination {
|
||||
overflow: hidden; /* clearfix */
|
||||
margin-left: -1rem;
|
||||
margin-right: -1rem;
|
||||
font-family: "PT Sans", Helvetica, Arial, sans-serif;
|
||||
color: #ccc;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* Pagination items can be `span`s or `a`s */
|
||||
.pagination-item {
|
||||
display: block;
|
||||
padding: 1rem;
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
.pagination-item:first-child {
|
||||
margin-bottom: -1px;
|
||||
}
|
||||
|
||||
/* Only provide a hover state for linked pagination items */
|
||||
a.pagination-item:hover {
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
@media (min-width: 30rem) {
|
||||
.pagination {
|
||||
margin: 3rem 0;
|
||||
}
|
||||
.pagination-item {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
.pagination-item:first-child {
|
||||
margin-bottom: 0;
|
||||
border-top-left-radius: 4px;
|
||||
border-bottom-left-radius: 4px;
|
||||
}
|
||||
.pagination-item:last-child {
|
||||
margin-left: -1px;
|
||||
border-top-right-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Reverse layout
|
||||
*
|
||||
* Flip the orientation of the page by placing the `.sidebar` and sidebar toggle
|
||||
* on the right side.
|
||||
*/
|
||||
|
||||
.layout-reverse .sidebar {
|
||||
left: auto;
|
||||
right: -14rem;
|
||||
}
|
||||
.layout-reverse .sidebar-toggle {
|
||||
left: auto;
|
||||
right: 1rem;
|
||||
}
|
||||
|
||||
.layout-reverse #sidebar-checkbox:checked ~ .sidebar,
|
||||
.layout-reverse #sidebar-checkbox:checked ~ .wrap,
|
||||
.layout-reverse #sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
-webkit-transform: translateX(-14rem);
|
||||
-ms-transform: translateX(-14rem);
|
||||
transform: translateX(-14rem);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Themes
|
||||
*
|
||||
* Apply custom color schemes by adding the appropriate class to the `body`.
|
||||
* Based on colors from Base16: http://chriskempson.github.io/base16/#default.
|
||||
*/
|
||||
|
||||
/* Red */
|
||||
.theme-base-08 .sidebar,
|
||||
.theme-base-08 .sidebar-toggle:active,
|
||||
.theme-base-08 #sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
background-color: #ac4142;
|
||||
}
|
||||
.theme-base-08 .container a,
|
||||
.theme-base-08 .sidebar-toggle,
|
||||
.theme-base-08 .related-posts li a:hover {
|
||||
color: #ac4142;
|
||||
}
|
||||
|
||||
/* Orange */
|
||||
.theme-base-09 .sidebar,
|
||||
.theme-base-09 .sidebar-toggle:active,
|
||||
.theme-base-09 #sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
background-color: #d28445;
|
||||
}
|
||||
.theme-base-09 .container a,
|
||||
.theme-base-09 .sidebar-toggle,
|
||||
.theme-base-09 .related-posts li a:hover {
|
||||
color: #d28445;
|
||||
}
|
||||
|
||||
/* Yellow */
|
||||
.theme-base-0a .sidebar,
|
||||
.theme-base-0a .sidebar-toggle:active,
|
||||
.theme-base-0a #sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
background-color: #f4bf75;
|
||||
}
|
||||
.theme-base-0a .container a,
|
||||
.theme-base-0a .sidebar-toggle,
|
||||
.theme-base-0a .related-posts li a:hover {
|
||||
color: #f4bf75;
|
||||
}
|
||||
|
||||
/* Green */
|
||||
.theme-base-0b .sidebar,
|
||||
.theme-base-0b .sidebar-toggle:active,
|
||||
.theme-base-0b #sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
background-color: #90a959;
|
||||
}
|
||||
.theme-base-0b .container a,
|
||||
.theme-base-0b .sidebar-toggle,
|
||||
.theme-base-0b .related-posts li a:hover {
|
||||
color: #90a959;
|
||||
}
|
||||
|
||||
/* Cyan */
|
||||
.theme-base-0c .sidebar,
|
||||
.theme-base-0c .sidebar-toggle:active,
|
||||
.theme-base-0c #sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
background-color: #75b5aa;
|
||||
}
|
||||
.theme-base-0c .container a,
|
||||
.theme-base-0c .sidebar-toggle,
|
||||
.theme-base-0c .related-posts li a:hover {
|
||||
color: #75b5aa;
|
||||
}
|
||||
|
||||
/* Blue */
|
||||
.theme-base-0d .sidebar,
|
||||
.theme-base-0d .sidebar-toggle:active,
|
||||
.theme-base-0d #sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
background-color: #6a9fb5;
|
||||
}
|
||||
.theme-base-0d .container a,
|
||||
.theme-base-0d .sidebar-toggle,
|
||||
.theme-base-0d .related-posts li a:hover {
|
||||
color: #6a9fb5;
|
||||
}
|
||||
|
||||
/* Magenta */
|
||||
.theme-base-0e .sidebar,
|
||||
.theme-base-0e .sidebar-toggle:active,
|
||||
.theme-base-0e #sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
background-color: #aa759f;
|
||||
}
|
||||
.theme-base-0e .container a,
|
||||
.theme-base-0e .sidebar-toggle,
|
||||
.theme-base-0e .related-posts li a:hover {
|
||||
color: #aa759f;
|
||||
}
|
||||
|
||||
/* Brown */
|
||||
.theme-base-0f .sidebar,
|
||||
.theme-base-0f .sidebar-toggle:active,
|
||||
.theme-base-0f #sidebar-checkbox:checked ~ .sidebar-toggle {
|
||||
background-color: #8f5536;
|
||||
}
|
||||
.theme-base-0f .container a,
|
||||
.theme-base-0f .sidebar-toggle,
|
||||
.theme-base-0f .related-posts li a:hover {
|
||||
color: #8f5536;
|
||||
}
|
@ -0,0 +1,396 @@
|
||||
/*
|
||||
* ___
|
||||
* /\_ \
|
||||
* _____ ___ ___\//\ \ __
|
||||
* /\ '__`\ / __`\ / __`\\ \ \ /'__`\
|
||||
* \ \ \_\ \/\ \_\ \/\ \_\ \\_\ \_/\ __/
|
||||
* \ \ ,__/\ \____/\ \____//\____\ \____\
|
||||
* \ \ \/ \/___/ \/___/ \/____/\/____/
|
||||
* \ \_\
|
||||
* \/_/
|
||||
*
|
||||
* Designed, built, and released under MIT license by @mdo. Learn more at
|
||||
* https://github.com/poole/poole.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Contents
|
||||
*
|
||||
* Body resets
|
||||
* Custom type
|
||||
* Messages
|
||||
* Container
|
||||
* Masthead
|
||||
* Posts and pages
|
||||
* Reverse layout
|
||||
* Themes
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Body resets
|
||||
*
|
||||
* Update the foundational and global aspects of the page.
|
||||
*/
|
||||
|
||||
* {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
@media (min-width: 38rem) {
|
||||
html {
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
color: #515151;
|
||||
background-color: #fff;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
/* No `:visited` state is required by default (browsers will use `a`) */
|
||||
a {
|
||||
color: #268bd2;
|
||||
text-decoration: none;
|
||||
}
|
||||
/* `:focus` is linked to `:hover` for basic accessibility */
|
||||
a:hover,
|
||||
a:focus {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Headings */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
margin-bottom: .5rem;
|
||||
font-weight: bold;
|
||||
line-height: 1.25;
|
||||
color: #313131;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
h1 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
h2 {
|
||||
margin-top: 1rem;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
h3 {
|
||||
margin-top: 1.5rem;
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
h4, h5, h6 {
|
||||
font-family: "ff-meta-web-pro", "Helvetica Neue", "Helvetica", Arial, sans-serif;
|
||||
margin-top: 1rem;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
/* Body text */
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
strong {
|
||||
color: #303030;
|
||||
}
|
||||
|
||||
/* Lists */
|
||||
ul, ol, dl {
|
||||
margin-top: 0;
|
||||
padding-left: 0;
|
||||
margin-bottom: 1rem;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
dd {
|
||||
margin-bottom: .5rem;
|
||||
}
|
||||
|
||||
/* Misc */
|
||||
hr {
|
||||
position: relative;
|
||||
margin: 1.5rem 0;
|
||||
border: 0;
|
||||
border-top: 1px solid #eee;
|
||||
border-bottom: 1px solid #fff;
|
||||
}
|
||||
|
||||
abbr {
|
||||
font-size: 85%;
|
||||
font-weight: bold;
|
||||
color: #555;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
abbr[title] {
|
||||
cursor: help;
|
||||
border-bottom: 1px dotted #e5e5e5;
|
||||
}
|
||||
|
||||
|
||||
mono, tt, code, pre {
|
||||
font-family: PragmataPro, Menlo, Monaco, "Andale Mono", "Lucida Console", "Courier New", monospace }
|
||||
code {
|
||||
padding: .25em .5em;
|
||||
font-size: 85%;
|
||||
color: #bf616a;
|
||||
background-color: #f9f9f9;
|
||||
border-radius: 3px;
|
||||
}
|
||||
pre {
|
||||
display: block;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
padding: 1rem;
|
||||
font-size: .8rem;
|
||||
line-height: 1.4;
|
||||
white-space: pre;
|
||||
overflow: auto;
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
pre code {
|
||||
padding: 0;
|
||||
font-size: 100%;
|
||||
color: inherit;
|
||||
background-color: transparent;
|
||||
}
|
||||
.highlight {
|
||||
margin-bottom: 1rem;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.highlight pre {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Quotes */
|
||||
blockquote {
|
||||
padding: .5rem 1rem;
|
||||
margin: .8rem 0;
|
||||
color: #7a7a7a;
|
||||
border-left: .25rem solid #e5e5e5;
|
||||
}
|
||||
blockquote p:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
@media (min-width: 30rem) {
|
||||
blockquote {
|
||||
padding-right: 5rem;
|
||||
padding-left: 1.25rem;
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
display: block;
|
||||
margin: 0 0 1rem;
|
||||
border-radius: 5px;
|
||||
height: auto;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
.fpimg {
|
||||
padding-bottom: 2rem;
|
||||
}
|
||||
|
||||
.lbg {
|
||||
display: inline;
|
||||
width: auto;
|
||||
padding-left: 1rem;
|
||||
}
|
||||
|
||||
|
||||
.right {
|
||||
float: right;
|
||||
margin-left: 1rem;
|
||||
}
|
||||
|
||||
.left {
|
||||
float: left;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
|
||||
.center {
|
||||
float: center;
|
||||
}
|
||||
|
||||
/* Tables */
|
||||
table {
|
||||
margin-bottom: 1rem;
|
||||
width: 100%;
|
||||
border-top: 1px solid #e5e5e5;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
td,
|
||||
th {
|
||||
padding: .25rem .5rem;
|
||||
/* border: 1px solid #e5e5e5; */
|
||||
}
|
||||
tbody tr:nth-child(odd) td,
|
||||
tbody tr:nth-child(odd) th {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Custom type
|
||||
*
|
||||
* Extend paragraphs with `.lead` for larger introductory text.
|
||||
*/
|
||||
|
||||
.lead {
|
||||
font-size: 1.25rem;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.front {
|
||||
margin-bottom: 500px;
|
||||
}
|
||||
|
||||
.credit {
|
||||
padding-top: 3rem;
|
||||
font-size: small;
|
||||
}
|
||||
|
||||
|
||||
ul.category {text-transform: capitalize;}
|
||||
ul.category li {margin-bottom: 1rem;}
|
||||
|
||||
ul.catlist { list-style: none; margin: 0; padding: 0; }
|
||||
ul.catlist li { display: inline; }
|
||||
ul.catlist li:after { content: "・"; }
|
||||
ul.catlist li:last-child:after { content: ""; }
|
||||
|
||||
/* This gets Google to fall into place */
|
||||
.social {
|
||||
font-size: 1px;
|
||||
padding-bottom: 2rem;
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
/* From https://gist.github.com/thebigreason/1296097 */
|
||||
/* This gets Facebook to fall into place */
|
||||
.social iframe {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
/* Set an optional width for your button wrappers */
|
||||
.social span {
|
||||
display: inline-block;
|
||||
width: 110px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Messages
|
||||
*
|
||||
* Show alert messages to users. You may add it to single elements like a `<p>`,
|
||||
* or to a parent if there are multiple elements to show.
|
||||
*/
|
||||
|
||||
.message {
|
||||
margin-bottom: 1rem;
|
||||
padding: 1rem;
|
||||
color: #717171;
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Container
|
||||
*
|
||||
* Center the page content.
|
||||
*/
|
||||
|
||||
.container {
|
||||
max-width: 38rem;
|
||||
padding-left: 1rem;
|
||||
padding-right: 1rem;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Masthead
|
||||
*
|
||||
* Super small header above the content for site name and short description.
|
||||
*/
|
||||
|
||||
.masthead {
|
||||
padding-top: 1rem;
|
||||
padding-bottom: 1rem;
|
||||
margin-bottom: 3rem;
|
||||
}
|
||||
.masthead-title {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
color: #505050;
|
||||
}
|
||||
.masthead-title a {
|
||||
color: #505050;
|
||||
}
|
||||
.masthead-title small {
|
||||
font-size: 75%;
|
||||
font-weight: 400;
|
||||
color: #c0c0c0;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Posts and pages
|
||||
*
|
||||
* Each post is wrapped in `.post` and is used on default and post layouts. Each
|
||||
* page is wrapped in `.page` and is only used on the page layout.
|
||||
*/
|
||||
|
||||
.page,
|
||||
.post {
|
||||
margin-bottom: 4em;
|
||||
}
|
||||
|
||||
/* Blog post or page title */
|
||||
.page-title,
|
||||
.post-title,
|
||||
.post-title a {
|
||||
color: #303030;
|
||||
}
|
||||
.page-title,
|
||||
.post-title {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
/* Meta data line below post title */
|
||||
.post-date {
|
||||
display: block;
|
||||
margin-top: -.5rem;
|
||||
margin-bottom: 1rem;
|
||||
color: #9a9a9a;
|
||||
}
|
||||
|
||||
/* Archive list */
|
||||
|
||||
.archive h3 {
|
||||
margin-top:0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
@ -0,0 +1,17 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
|
||||
# Custom for Visual Studio
|
||||
*.cs diff=csharp
|
||||
|
||||
# Standard to msysgit
|
||||
*.doc diff=astextplain
|
||||
*.DOC diff=astextplain
|
||||
*.docx diff=astextplain
|
||||
*.DOCX diff=astextplain
|
||||
*.dot diff=astextplain
|
||||
*.DOT diff=astextplain
|
||||
*.pdf diff=astextplain
|
||||
*.PDF diff=astextplain
|
||||
*.rtf diff=astextplain
|
||||
*.RTF diff=astextplain
|
@ -0,0 +1,50 @@
|
||||
# Themes directory of example site; ignored so that we can clone the repo
|
||||
# inside the themes directory and test the example site with "hugo server".
|
||||
exampleSite/themes/
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
# Vim swap files
|
||||
*.swp
|
||||
|
||||
# =========================
|
||||
# Operating System Files
|
||||
# =========================
|
||||
|
||||
# OSX
|
||||
# =========================
|
||||
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear on external disk
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
@ -0,0 +1,22 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Original work Copyright (c) 2015 Dean Attali
|
||||
Modified work Copyright (c) 2017 Michael Romero
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -0,0 +1,67 @@
|
||||
# Beautiful Hugo - A port of Beautiful Jekyll Theme
|
||||
|
||||
![Beautiful Hugo Theme Screenshot](https://github.com/halogenica/beautifulhugo/blob/master/images/screenshot.png)
|
||||
|
||||
## Installation
|
||||
|
||||
$ mkdir themes
|
||||
$ cd themes
|
||||
$ git clone https://github.com/halogenica/beautifulhugo.git beautifulhugo
|
||||
|
||||
See [the Hugo documentation](http://gohugo.io/themes/installing/) for more information.
|
||||
|
||||
## Extra Features
|
||||
|
||||
### Responsive
|
||||
|
||||
This theme is designed to look great on both large-screen and small-screen (mobile) devices.
|
||||
|
||||
### Syntax highlighting
|
||||
|
||||
This theme has support for both server side and client side highlighting.
|
||||
|
||||
#### Server side syntax highlighting
|
||||
|
||||
Use the `highlight` shortcode (with Pygments),
|
||||
see [the Hugo documentation](http://gohugo.io/extras/highlighting/) for more information.
|
||||
|
||||
To use this feature install Pygments (`pip install Pygments`) and add `pygmentsuseclasses = true` to your `config.toml`.
|
||||
|
||||
#### Client side syntax highlighting
|
||||
|
||||
Use triple backticks ( ``` ) or triple tilde ( ~~~ ) around code blocks.
|
||||
|
||||
Client side highlighting does not require pygments to be installed.
|
||||
|
||||
### Disqus support
|
||||
|
||||
To use this feature, uncomment and fill out the `disqusShortname` parameter in `config.toml`.
|
||||
|
||||
### Google Analytics
|
||||
|
||||
To add Google Analytics, simply sign up to [Google Analytics](http://www.google.com/analytics/) to obtain your Google Tracking ID, and add this tracking ID to the `googleAnalytics` parameter in `config.toml`.
|
||||
|
||||
### Commit SHA on the footer
|
||||
|
||||
If the source of your site is in a Git repo, the SHA corresponding to the commit the site is built from can be shown on the footer. To do so, two environment variables have to be set (`GIT_COMMIT_SHA` and `GIT_COMMIT_SHA_SHORT`) and parameter `commit` has to be defined in the config file:
|
||||
|
||||
```
|
||||
[Params]
|
||||
commit = "https://github.com/<username>/<siterepo>/tree/"
|
||||
```
|
||||
|
||||
This can be achieved by running the next command prior to calling Hugo:
|
||||
|
||||
```
|
||||
GIT_COMMIT_SHA=`git rev-parse --verify HEAD` GIT_COMMIT_SHA_SHORT=`git rev-parse --short HEAD`
|
||||
```
|
||||
|
||||
See at [xor-gate/xor-gate.org](https://github.com/xor-gate/xor-gate.org) an example of how to add it to a continuous integration system.
|
||||
|
||||
## About
|
||||
|
||||
This is a port of the Jekyll theme [Beautiful Jekyll](http://deanattali.com/beautiful-jekyll/) by [Dean Attali](http://deanattali.com/aboutme#contact). It supports most of the features of the original theme.
|
||||
|
||||
## License
|
||||
|
||||
MIT Licensed, see [LICENSE](https://github.com/halogenica/Hugo-BeautifulHugo/blob/master/LICENSE).
|
@ -0,0 +1,4 @@
|
||||
---
|
||||
subtitle: ""
|
||||
tags: []
|
||||
---
|
@ -0,0 +1,121 @@
|
||||
[[social_icons]]
|
||||
id = "email"
|
||||
url = "mailto:%s"
|
||||
title = "Email me"
|
||||
icon = "fas fa-envelope"
|
||||
|
||||
[[social_icons]]
|
||||
id = "facebook"
|
||||
url = "https://www.facebook.com/%s"
|
||||
title = "Facebook"
|
||||
icon = "fab fa-facebook"
|
||||
|
||||
[[social_icons]]
|
||||
id = "googleplus"
|
||||
url = "https://www.plus.google.com/%s"
|
||||
title = "Google+"
|
||||
icon = "fab fa-google-plus"
|
||||
|
||||
[[social_icons]]
|
||||
id = "gitlab"
|
||||
url = "https://gitlab.com/%s"
|
||||
title = "GitLab"
|
||||
icon = "fab fa-gitlab"
|
||||
|
||||
[[social_icons]]
|
||||
id = "github"
|
||||
url = "https://github.com/%s"
|
||||
title = "GitHub"
|
||||
icon = "fab fa-github"
|
||||
|
||||
[[social_icons]]
|
||||
id = "twitter"
|
||||
url = "https://twitter.com/%s"
|
||||
title = "Twitter"
|
||||
icon = "fab fa-twitter"
|
||||
|
||||
[[social_icons]]
|
||||
id = "reddit"
|
||||
url = "https://reddit.com/u/%s"
|
||||
title = "Reddit"
|
||||
icon = "fab fa-reddit-alien"
|
||||
|
||||
[[social_icons]]
|
||||
id = "linkedin"
|
||||
url = "https://linkedin.com/in/%s"
|
||||
title = "LinkedIn"
|
||||
icon = "fab fa-linkedin"
|
||||
|
||||
[[social_icons]]
|
||||
id = "xing"
|
||||
url = "https://www.xing.com/profile/%s"
|
||||
title = "Xing"
|
||||
icon = "fab fa-xing"
|
||||
|
||||
[[social_icons]]
|
||||
id = "stackoverflow"
|
||||
url = "https://stackoverflow.com/%s"
|
||||
title = "StackOverflow"
|
||||
icon = "fab fa-stack-overflow"
|
||||
|
||||
[[social_icons]]
|
||||
id = "snapchat"
|
||||
url = "https://www.snapchat.com/add/%s"
|
||||
title = "Snapchat"
|
||||
icon = "fab fa-snapchat-ghost"
|
||||
|
||||
[[social_icons]]
|
||||
id = "instagram"
|
||||
url = "https://www.instagram.com/%s"
|
||||
title = "Instagram"
|
||||
icon = "fab fa-instagram"
|
||||
|
||||
[[social_icons]]
|
||||
id = "youtube"
|
||||
url = "https://www.youtube.com/%s"
|
||||
title = "Youtube"
|
||||
icon = "fab fa-youtube"
|
||||
|
||||
[[social_icons]]
|
||||
id = "soundcloud"
|
||||
url = "https://soundcloud.com/%s"
|
||||
title = "SoundCloud"
|
||||
icon = "fab fa-soundcloud"
|
||||
|
||||
[[social_icons]]
|
||||
id = "spotify"
|
||||
url = "https://open.spotify.com/user/%s"
|
||||
title = "Spotify"
|
||||
icon = "fab fa-spotify"
|
||||
|
||||
[[social_icons]]
|
||||
id = "bandcamp"
|
||||
url = "https://%s.bandcamp.com/"
|
||||
title = "Bandcamp"
|
||||
icon = "fab fa-bandcamp"
|
||||
|
||||
[[social_icons]]
|
||||
id = "itchio"
|
||||
url = "https://itch.io/profile/%s"
|
||||
title = "itch.io"
|
||||
icon = "fas fa-gamepad"
|
||||
|
||||
[[social_icons]]
|
||||
id = "steam"
|
||||
url = "https://steamcommunity.com/id/%s"
|
||||
title = "Steam"
|
||||
icon = "fab fa-steam"
|
||||
|
||||
[[social_icons]]
|
||||
id = "keybase"
|
||||
url = "https://keybase.io/%s"
|
||||
title = "Keybase"
|
||||
icon = "fab fa-keybase"
|
||||
|
||||
[[social_icons]]
|
||||
id = "Goodreads"
|
||||
url = "https://www.goodreads.com/%s"
|
||||
title = "Goodreads"
|
||||
icon = "fab fa-goodreads"
|
||||
|
||||
|
@ -0,0 +1,40 @@
|
||||
# Content
|
||||
- id: dateFormat
|
||||
translation: "January 2, 2006"
|
||||
- id: postedOnDate
|
||||
translation: "Posted on {{ .Count }}"
|
||||
- id: translationsLabel
|
||||
translation: "Other languages: "
|
||||
- id: translationsSeparator
|
||||
translation: ", "
|
||||
- id: readMore
|
||||
translation: "Read More"
|
||||
- id: olderPosts
|
||||
translation: "Older Posts"
|
||||
- id: newerPosts
|
||||
translation: "Newer Posts"
|
||||
- id: previousPost
|
||||
translation: "Previous Post"
|
||||
- id: nextPost
|
||||
translation: "Next Post"
|
||||
|
||||
# 404 page
|
||||
- id: pageNotFound
|
||||
translation: "Whoops, this page doesn't exist. Move along. (404 error)"
|
||||
|
||||
# Footer
|
||||
- id: poweredBy # Accepts HTML
|
||||
translation: '<a href="http://gohugo.io">Hugo v{{ .Hugo.Version }}</a> powered • Theme by <a href="http://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a> adapted to <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a>'
|
||||
|
||||
# Navigation
|
||||
- id: toggleNavigation
|
||||
translation: "Toggle navigation"
|
||||
- id: languageSwitcherLabel
|
||||
translation: "Language"
|
||||
- id: gcseLabelShort
|
||||
translation: "Search"
|
||||
- id: gcseLabelLong
|
||||
translation: "Search {{ .Site.Title }}"
|
||||
- id: gcseClose
|
||||
translation: "Close"
|
||||
|
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 74 KiB |
@ -0,0 +1,11 @@
|
||||
{{ define "header" }}<!-- No header on 404 pages -->{{ end }}
|
||||
{{ define "main" }}
|
||||
<div role="main" class="container main-content">
|
||||
<div class="text-center">
|
||||
<h1>{{ i18n "pageNotFound" }}</h1>
|
||||
<br/>
|
||||
<img src="{{ .Site.BaseURL }}/img/404-southpark.jpg" />
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ .Lang }}">
|
||||
{{ partial "head.html" . }}
|
||||
<body>
|
||||
{{ partial "nav.html" . }}
|
||||
{{ block "header" . }}{{ partial "header.html" . }}{{ end }}
|
||||
{{ block "main" . }}{{ end }}
|
||||
{{ partial "footer.html" . }}
|
||||
</body>
|
||||
</html>
|
||||
|
@ -0,0 +1,80 @@
|
||||
{{ define "header" }}
|
||||
<header class="header-section ">
|
||||
<div class="intro-header no-img">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
|
||||
<div class="page-heading">
|
||||
<h1>{{ if .Data.Singular }}#{{ end }}{{ .Title }}</h1>
|
||||
<hr class="small">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
{{ end }}
|
||||
{{ define "main" }}
|
||||
<div class="container" role="main">
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
|
||||
{{ with .Content }}
|
||||
<div class="well">
|
||||
{{.}}
|
||||
</div>
|
||||
{{ end }}
|
||||
<div class="posts-list">
|
||||
{{ range .Paginator.Pages }}
|
||||
<article class="post-preview">
|
||||
<a href="{{ .Permalink }}">
|
||||
<h2 class="post-title">{{ .Title }}</h2>
|
||||
|
||||
{{ if .Params.subtitle }}
|
||||
<h3 class="post-subtitle">
|
||||
{{ .Params.subtitle }}
|
||||
</h3>
|
||||
{{ end }}
|
||||
</a>
|
||||
|
||||
<p class="post-meta">
|
||||
{{ default (i18n "dateFormat") .Site.Params.dateformat | .Date.Format | i18n "postedOnDate" }}
|
||||
</p>
|
||||
<div class="post-entry">
|
||||
{{ if .Truncated }}
|
||||
{{ .Summary }}
|
||||
<a href="{{ .Permalink }}" class="post-read-more">[{{ i18n "readMore" }}]</a>
|
||||
{{ else }}
|
||||
{{ .Content }}
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
{{ if .Params.tags }}
|
||||
<span class="post-meta">
|
||||
{{ range .Params.tags }}
|
||||
#<a href="{{ $.Site.LanguagePrefix }}/tags/{{ . | urlize }}">{{ . }}</a>
|
||||
{{ end }}
|
||||
</span>
|
||||
{{ end }}
|
||||
|
||||
</article>
|
||||
{{ end }}
|
||||
</div>
|
||||
{{ if or (.Paginator.HasPrev) (.Paginator.HasNext) }}
|
||||
<ul class="pager main-pager">
|
||||
{{ if .Paginator.HasPrev }}
|
||||
<li class="previous">
|
||||
<a href="{{ .URL }}page/{{ .Paginator.Prev.PageNumber }}">← {{ i18n "newerPosts" }}</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
{{ if .Paginator.HasNext }}
|
||||
<li class="next">
|
||||
<a href="{{ .URL }}page/{{ .Paginator.Next.PageNumber }}">{{ i18n "olderPosts" }} →</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
@ -0,0 +1,33 @@
|
||||
{{ define "main" }}
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
|
||||
<article role="main" class="blog-post">
|
||||
{{ .Content }}
|
||||
</article>
|
||||
|
||||
<ul class="pager blog-pager">
|
||||
{{ if .PrevInSection }}
|
||||
<li class="previous">
|
||||
<a href="{{ .PrevInSection.Permalink }}" data-toggle="tooltip" data-placement="top" title="{{ .PrevInSection.Title }}">← {{ i18n "previousPost" }}</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
{{ if .NextInSection }}
|
||||
<li class="next">
|
||||
<a href="{{ .NextInSection.Permalink }}" data-toggle="tooltip" data-placement="top" title="{{ .NextInSection.Title }}">{{ i18n "nextPost" }} →</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
|
||||
{{ if (.Params.comments) | or (and (or (not (isset .Params "comments")) (eq .Params.comments nil)) (.Site.Params.comments)) }}
|
||||
{{ if .Site.DisqusShortname }}
|
||||
<div class="disqus-comments">
|
||||
{{ template "_internal/disqus.html" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
@ -0,0 +1,14 @@
|
||||
{{ define "main" }}
|
||||
{{ $data := .Data }}
|
||||
<div class="container" role="main">
|
||||
<article class="post-preview">
|
||||
<div class="list-group col-lg-4 col-lg-offset-4 col-md-6 col-md-offset-3">
|
||||
{{ range $key, $value := .Data.Terms.ByCount }}
|
||||
<a href="{{ $.Site.LanguagePrefix }}/{{ $data.Plural }}/{{ $value.Name | urlize }}" class="list-group-item">
|
||||
{{ $value.Name }}<span class="badge">{{ $value.Count }}</span></a>
|
||||
{{ end }}
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
@ -0,0 +1,63 @@
|
||||
{{ define "main" }}
|
||||
<div role="main" class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
|
||||
{{ with .Content }}
|
||||
<div class="well">
|
||||
{{.}}
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
<div class="posts-list">
|
||||
{{ $pag := .Paginate (where .Data.Pages "Type" "post") }}
|
||||
{{ range $pag.Pages }}
|
||||
<article class="post-preview">
|
||||
<a href="{{ .Permalink }}">
|
||||
<h2 class="post-title">{{ .Title }}</h2>
|
||||
{{ if .Params.subtitle }}
|
||||
<h3 class="post-subtitle">
|
||||
{{ .Params.subtitle }}
|
||||
</h3>
|
||||
{{ end }}
|
||||
</a>
|
||||
|
||||
{{ partial "post_meta.html" . }}
|
||||
<div class="post-entry">
|
||||
{{ if .Truncated }}
|
||||
{{ .Summary }}
|
||||
<a href="{{ .Permalink }}" class="post-read-more">[{{ i18n "readMore" }}]</a>
|
||||
{{ else }}
|
||||
{{ .Content }}
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
{{ if .Params.tags }}
|
||||
<span class="post-meta">
|
||||
{{ range .Params.tags }}
|
||||
#<a href="{{ $.Site.LanguagePrefix }}/tags/{{ . | urlize }}">{{ . }}</a>
|
||||
{{ end }}
|
||||
</span>
|
||||
{{ end }}
|
||||
</article>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
{{ if or (.Paginator.HasPrev) (.Paginator.HasNext) }}
|
||||
<ul class="pager main-pager">
|
||||
{{ if .Paginator.HasPrev }}
|
||||
<li class="previous">
|
||||
<a href="{{ .URL }}page/{{ .Paginator.Prev.PageNumber }}">← {{ i18n "newerPosts" }}</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
{{ if .Paginator.HasNext }}
|
||||
<li class="next">
|
||||
<a href="{{ .URL }}page/{{ .Paginator.Next.PageNumber }}">{{ i18n "olderPosts" }} →</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
@ -0,0 +1,7 @@
|
||||
{{ if (.Params.comments) | or (and (or (not (isset .Params "comments")) (eq .Params.comments nil)) (.Site.Params.comments)) }}
|
||||
{{ if .Site.DisqusShortname }}
|
||||
<div class="comments">
|
||||
{{ template "_internal/disqus.html" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
@ -0,0 +1,78 @@
|
||||
<footer>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
|
||||
<ul class="list-inline text-center footer-links">
|
||||
{{ range .Site.Data.beautifulhugo.social.social_icons }}
|
||||
{{- if isset $.Site.Author .id }}
|
||||
<li>
|
||||
<a href="{{ printf .url (index $.Site.Author .id) }}" title="{{ .title }}">
|
||||
<span class="fa-stack fa-lg">
|
||||
<i class="fa fa-circle fa-stack-2x"></i>
|
||||
<i class="{{ .icon }} fa-stack-1x fa-inverse"></i>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
{{- end -}}
|
||||
{{ end }}
|
||||
{{ if .Site.Params.rss }}
|
||||
<li>
|
||||
<a href="{{ "index.xml" | absLangURL }}" title="RSS">
|
||||
<span class="fa-stack fa-lg">
|
||||
<i class="fa fa-circle fa-stack-2x"></i>
|
||||
<i class="fa fa-rss fa-stack-1x fa-inverse"></i>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
<p class="credits copyright text-muted">
|
||||
{{ .Site.Author.name }}
|
||||
•
|
||||
{{ .Site.LastChange.Format "2006" }}
|
||||
|
||||
{{ if .Site.Title }}
|
||||
•
|
||||
<a href="{{ "" | absLangURL }}">{{ .Site.Title }}</a>
|
||||
{{ end }}
|
||||
</p>
|
||||
<!-- Please don't remove this, keep my open source work credited :) -->
|
||||
<p class="credits theme-by text-muted">
|
||||
{{ i18n "poweredBy" . | safeHTML }}
|
||||
{{ with .Site.Params.commit }} • [<a href="{{.}}{{ getenv "GIT_COMMIT_SHA" }}">{{ getenv "GIT_COMMIT_SHA_SHORT" }}</a>]{{ end }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.7.1/katex.min.js" integrity="sha384-/y1Nn9+QQAipbNQWU65krzJralCnuOasHncUFXGkdwntGeSvQicrYkiUBwsgUqc1" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.7.1/contrib/auto-render.min.js" integrity="sha384-dq1/gEHSxPZQ7DdrM82ID4YVol9BYyU7GbWlIwnwyPzotpoc57wDw/guX8EaYGPx" crossorigin="anonymous"></script>
|
||||
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
|
||||
<script src="{{ "js/main.js" | absURL }}"></script>
|
||||
<script src="{{ "js/highlight.min.js" | absURL }}"></script>
|
||||
<script> hljs.initHighlightingOnLoad(); </script>
|
||||
<script> renderMathInElement(document.body); </script>
|
||||
<!-- Load PhotoSwipe js if the load-photoswipe shortcode has been used -->
|
||||
{{ if ($.Scratch.Get "photoswipeloaded") }}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.js" integrity="sha256-UplRCs9v4KXVJvVY+p+RSo5Q4ilAUXh7kpjyIP5odyc=" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe-ui-default.min.js" integrity="sha256-PWHOlUzc96pMc8ThwRIXPn8yH4NOLu42RQ0b9SpnpFk=" crossorigin="anonymous"></script>
|
||||
<script src="/js/load-photoswipe.js"></script>
|
||||
{{ end }}
|
||||
<!-- Google Custom Search Engine -->
|
||||
{{ if .Site.Params.gcse }}
|
||||
<script>
|
||||
(function() {
|
||||
var cx = '{{ .Site.Params.gcse }}';
|
||||
var gcse = document.createElement('script');
|
||||
gcse.type = 'text/javascript';
|
||||
gcse.async = true;
|
||||
gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(gcse, s);
|
||||
})();
|
||||
</script>
|
||||
{{ end }}
|
||||
|
||||
{{- partial "footer_custom.html" . }}
|
@ -0,0 +1,4 @@
|
||||
<!--
|
||||
If you want to include any custom html just before </body>, put it in /layouts/footer_custom.html
|
||||
Do not put anything in this file - it's only here so that hugo won't throw an error if /layouts/footer_custom.html doesn't exist.
|
||||
-->
|
@ -0,0 +1,51 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
|
||||
<!-- Site Title, Description, Author, and Favicon -->
|
||||
{{- with .Title | default .Site.Title }}
|
||||
<title>{{ . }}</title>
|
||||
<meta property="og:title" content="{{ . }}" />
|
||||
<meta name="twitter:title" content="{{ . | truncate 70 }}" />
|
||||
{{- end }}
|
||||
{{- with .Description | default .Params.subtitle | default .Summary }}
|
||||
<meta name="description" content="{{ . }}">
|
||||
<meta property="og:description" content="{{ . }}">
|
||||
<meta name="twitter:description" content="{{ . | truncate 200 }}">
|
||||
{{- end }}
|
||||
<meta name="author" content="{{ .Site.Author.name }}"/>
|
||||
{{- with .Site.Params.favicon }}
|
||||
<link href='{{ . | absURL }}' rel='icon' type='image/x-icon'/>
|
||||
{{- end -}}
|
||||
<!-- Social Media Tags -->
|
||||
{{- with .Params.share_img | default .Params.image | default .Site.Params.logo }}
|
||||
<meta property="og:image" content="{{ . | absURL }}" />
|
||||
<meta name="twitter:image" content="{{ . | absURL }}" />
|
||||
{{- end }}
|
||||
<meta name="twitter:card" content="summary" />
|
||||
{{- with .Site.Author.twitter }}
|
||||
<meta name="twitter:site" content="@{{ . }}" />
|
||||
<meta name="twitter:creator" content="@{{ . }}" />
|
||||
{{- end }}
|
||||
{{- with .Site.Params.fb_app_id }}
|
||||
<meta property="fb:app_id" content="{{ . }}" />
|
||||
{{- end }}
|
||||
<meta property="og:url" content="{{ .URL | absLangURL }}" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="{{ .Site.Title }}" />
|
||||
<!-- Hugo Version number -->
|
||||
{{ .Hugo.Generator -}}
|
||||
<!-- Links and stylesheets -->
|
||||
<link rel="canonical" href="{{ .URL | absLangURL }}" />
|
||||
<link rel="alternate" href="{{ "index.xml" | absLangURL }}" type="application/rss+xml" title="{{ .Site.Title }}">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.7.1/katex.min.css" integrity="sha384-wITovz90syo1dJWVh32uuETPVEtGigN07tkttEqPv+uR2SE/mbQcG7ATL28aI9H0" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="{{ "css/main.css" | absURL }}" />
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" />
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" />
|
||||
<link rel="stylesheet" href="{{ "css/pygment_highlights.css" | absURL }}" />
|
||||
<link rel="stylesheet" href="{{ "css/highlight.min.css" | absURL }}" />
|
||||
{{- partial "head_custom.html" . }}
|
||||
{{ template "_internal/google_analytics_async.html" . }}
|
||||
</head>
|
@ -0,0 +1,4 @@
|
||||
<!--
|
||||
If you want to include any custom html just before </head>, put it in /layouts/head_custom.html
|
||||
Do not put anything in this file - it's only here so that hugo won't throw an error if /layouts/head_custom.html doesn't exist.
|
||||
-->
|
@ -0,0 +1,70 @@
|
||||
{{ if .IsHome }}
|
||||
{{ $.Scratch.Set "title" .Site.Title }}
|
||||
{{ if .Site.Params.subtitle }}{{ $.Scratch.Set "subtitle" .Site.Params.subtitle }}{{ end }}
|
||||
{{ if .Site.Params.bigimg }}{{ $.Scratch.Set "bigimg" .Site.Params.bigimg }}{{ end }}
|
||||
{{ else }}
|
||||
{{ $.Scratch.Set "title" .Title }}
|
||||
{{ if .Params.subtitle }}{{ $.Scratch.Set "subtitle" .Params.subtitle }}{{ end }}
|
||||
{{ if .Params.bigimg }}{{ $.Scratch.Set "bigimg" .Params.bigimg }}{{ end }}
|
||||
{{ end }}
|
||||
{{ $bigimg := $.Scratch.Get "bigimg" }}
|
||||
|
||||
{{ if or $bigimg ($.Scratch.Get "title") }}
|
||||
{{ if $bigimg }}
|
||||
<div id="header-big-imgs" data-num-img={{len $bigimg}} {{range $i, $img := $bigimg}}data-img-src-{{add $i 1}}="{{$img.src | absURL }}" {{ if $img.desc}}data-img-desc-{{add $i 1}}="{{$img.desc}}"{{end}}{{end}}></div>
|
||||
{{ end }}
|
||||
|
||||
<header class="header-section {{ if $bigimg }}has-img{{ end }}">
|
||||
{{ if $bigimg }}
|
||||
<div class="intro-header big-img">
|
||||
{{ $subtitle := $.Scratch.Get "subtitle" }}
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
|
||||
<div class="{{ .Type }}-heading">
|
||||
<h1>{{ with $.Scratch.Get "title" }}{{.}}{{ else }}<br/>{{ end }}</h1>
|
||||
{{ if $subtitle }}
|
||||
{{ if eq .Type "page" }}
|
||||
<hr class="small">
|
||||
<span class="{{ .Type }}-subheading">{{ $subtitle }}</span>
|
||||
{{ else }}
|
||||
<h2 class="{{ .Type }}-subheading">{{ $subtitle }}</h2>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ if eq .Type "post" }}
|
||||
{{ partial "post_meta.html" . }}
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span class="img-desc" style="display: inline;"></span>
|
||||
</div>
|
||||
{{end}}
|
||||
<div class="intro-header no-img">
|
||||
{{ $subtitle := $.Scratch.Get "subtitle" }}
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
|
||||
<div class="{{ .Type }}-heading">
|
||||
<h1>{{ with $.Scratch.Get "title" }}{{.}}{{ else }}<br/>{{ end }}</h1>
|
||||
{{ if $subtitle }}
|
||||
{{ if eq .Type "page" }}
|
||||
<hr class="small">
|
||||
<span class="{{ .Type }}-subheading">{{ $subtitle }}</span>
|
||||
{{ else }}
|
||||
<h2 class="{{ .Type }}-subheading">{{ $subtitle }}</h2>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ if eq .Type "post" }}
|
||||
{{ partial "post_meta.html" . }}
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
{{ else }}
|
||||
<div class="intro-header"></div>
|
||||
{{ end }}
|
@ -0,0 +1,96 @@
|
||||
<nav class="navbar navbar-default navbar-fixed-top navbar-custom">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#main-navbar">
|
||||
<span class="sr-only">{{ i18n "toggleNavigation" }}</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="{{ "" | absLangURL }}">{{ .Site.Title }}</a>
|
||||
</div>
|
||||
|
||||
<div class="collapse navbar-collapse" id="main-navbar">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
{{ range .Site.Menus.main.ByWeight }}
|
||||
{{ if .HasChildren }}
|
||||
<li class="navlinks-container">
|
||||
<a class="navlinks-parent" href="javascript:void(0)">{{ .Name }}</a>
|
||||
<div class="navlinks-children">
|
||||
{{ range .Children }}
|
||||
<a href="{{ .URL | relLangURL }}">{{ .Name }}</a>
|
||||
{{ end }}
|
||||
</div>
|
||||
</li>
|
||||
{{ else }}
|
||||
<li>
|
||||
<a title="{{ .Name }}" href="{{ .URL | relLangURL }}">{{ .Name }}</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ if .Site.IsMultiLingual }}
|
||||
{{ if ge (len .Site.Languages) 3 }}
|
||||
<li class="navlinks-container">
|
||||
<a class="navlinks-parent" href="javascript:void(0)">{{ i18n "languageSwitcherLabel" }}</a>
|
||||
<div class="navlinks-children">
|
||||
{{ range .Site.Languages }}
|
||||
{{ if not (eq .Lang $.Site.Language.Lang) }}
|
||||
<a href="/{{ .Lang }}" lang="{{ .Lang }}">{{ default .Lang .LanguageName }}</a>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</div>
|
||||
</li>
|
||||
{{ else }}
|
||||
<li>
|
||||
{{ range .Site.Languages }}
|
||||
{{ if not (eq .Lang $.Site.Language.Lang) }}
|
||||
<a href="/{{ .Lang }}" lang="{{ .Lang }}">{{ default .Lang .LanguageName }}</a>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ if isset .Site.Params "gcse" }}
|
||||
<li>
|
||||
<a href="#modalSearch" data-toggle="modal" data-target="#modalSearch" style="outline: none;">
|
||||
<span class="hidden-sm hidden-md hidden-lg">{{ i18n "gcseLabelShort" }}</span> <span id="searchGlyph" class="glyphicon glyphicon-search"></span>
|
||||
</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="avatar-container">
|
||||
<div class="avatar-img-border">
|
||||
{{ if isset .Site.Params "logo" }}
|
||||
<a title="{{ .Site.Title }}" href="{{ "" | absLangURL }}">
|
||||
<img class="avatar-img" src="{{ .Site.Params.logo | absURL }}" alt="{{ .Site.Title }}" />
|
||||
</a>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Search Modal -->
|
||||
{{ if isset .Site.Params "gcse" }}
|
||||
<div id="modalSearch" class="modal fade" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
||||
<h4 class="modal-title">{{ i18n "gcseLabelLong" . }}</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<gcse:search></gcse:search>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{ i18n "gcseClose" }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
@ -0,0 +1,11 @@
|
||||
<span class="post-meta">
|
||||
{{ default (i18n "dateFormat") .Site.Params.dateformat | .Date.Format | i18n "postedOnDate" }}
|
||||
{{ if .IsTranslated -}}
|
||||
{{- $sortedTranslations := sort .Translations "Site.Language.Weight" -}}
|
||||
{{- $links := apply $sortedTranslations "partial" "translation_link.html" "." -}}
|
||||
{{- $cleanLinks := apply $links "chomp" "." -}}
|
||||
{{- $linksOutput := delimit $cleanLinks (i18n "translationsSeparator") -}}
|
||||
• {{ i18n "translationsLabel" }}{{ $linksOutput }}
|
||||
{{- end }}
|
||||
</span>
|
||||
|
@ -0,0 +1,2 @@
|
||||
<a href="{{ .Permalink }}" lang="{{ .Lang }}">{{ default .Lang .Site.Language.LanguageName }}</a>
|
||||
|
@ -0,0 +1,29 @@
|
||||
<!--
|
||||
Put this file in /layouts/shortcodes/figure.html
|
||||
NB this overrides Hugo's built-in "figure" shortcode but is backwards compatible
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
-->
|
||||
<!-- count how many times we've called this shortcode; load the css if it's the first time -->
|
||||
{{- if not ($.Page.Scratch.Get "figurecount") }}<link rel="stylesheet" href="/css/hugo-easy-gallery.css" />{{ end }}
|
||||
{{- $.Page.Scratch.Add "figurecount" 1 -}}
|
||||
<!-- use either src or link-thumb for thumbnail image -->
|
||||
{{- $thumb := .Get "src" | default (printf "%s." (.Get "thumb") | replace (.Get "link") ".") }}
|
||||
<div class="box{{ with .Get "caption-position" }} fancy-figure caption-position-{{.}}{{end}}{{ with .Get "caption-effect" }} caption-effect-{{.}}{{end}}" {{ with .Get "width" }}style="max-width:{{.}}"{{end}}>
|
||||
<figure {{ with .Get "class" }}class="{{.}}"{{ end }} itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
|
||||
<div class="img"{{ if .Parent }} style="background-image: url('{{ $thumb }}');"{{ end }}{{ with .Get "size" }} data-size="{{.}}"{{ end }}>
|
||||
<img itemprop="thumbnail" src="{{ $thumb }}" {{ with .Get "alt" | default (.Get "caption") }}alt="{{.}}"{{ end }}/><!-- <img> hidden if in .gallery -->
|
||||
</div>
|
||||
{{- if or (or (.Get "title") (.Get "caption")) (.Get "attr")}}
|
||||
<figcaption>
|
||||
{{- with .Get "title" }}<h4>{{.}}</h4>{{ end }}
|
||||
{{- if or (.Get "caption") (.Get "attr")}}
|
||||
<p>
|
||||
{{- .Get "caption" -}}
|
||||
{{- with .Get "attrlink"}}<a href="{{.}}">{{ .Get "attr" }}</a>{{ else }}{{ .Get "attr"}}{{ end -}}
|
||||
</p>
|
||||
{{- end }}
|
||||
</figcaption>
|
||||
{{- end }}
|
||||
{{ with .Get "link" | default (.Get "src") }}<a href="{{.}}" itemprop="contentUrl"></a>{{ end }}<!-- put <a> last so it is stacked on top -->
|
||||
</figure>
|
||||
</div>
|
@ -0,0 +1,40 @@
|
||||
<!--
|
||||
Put this file in /layouts/shortcodes/gallery.html
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
-->
|
||||
<!-- count how many times we've called this shortcode; load the css if it's the first time -->
|
||||
{{- if not ($.Page.Scratch.Get "figurecount") }}<link rel="stylesheet" href="/css/hugo-easy-gallery.css" />{{ end }}
|
||||
{{- $.Page.Scratch.Add "figurecount" 1 }}
|
||||
<div class="gallery caption-position-{{ with .Get "caption-position" | default "bottom" }}{{.}}{{end}} caption-effect-{{ with .Get "caption-effect" | default "slide" }}{{.}}{{end}} hover-effect-{{ with .Get "hover-effect" | default "zoom" }}{{.}}{{end}} {{ if ne (.Get "hover-transition") "none" }}hover-transition{{end}}" itemscope itemtype="http://schema.org/ImageGallery">
|
||||
{{- with (.Get "dir") -}}
|
||||
<!-- If a directory was specified, generate figures for all of the images in the directory -->
|
||||
{{- $files := readDir (print "/static/" .) }}
|
||||
{{- range $files -}}
|
||||
<!-- skip files that aren't images, or that inlcude the thumb suffix in their name -->
|
||||
{{- $thumbext := $.Get "thumb" | default "-thumb" }}
|
||||
{{- $isthumb := .Name | findRE ($thumbext | printf "%s\\.") }}<!-- is the current file a thumbnail image? -->
|
||||
{{- $isimg := lower .Name | findRE "\\.(gif|jpg|jpeg|tiff|png|bmp)" }}<!-- is the current file an image? -->
|
||||
{{- if and $isimg (not $isthumb) }}
|
||||
{{- $caption := .Name | replaceRE "\\..*" "" | humanize }}<!-- humanized filename without extension -->
|
||||
{{- $linkURL := print ($.Get "dir") "/" .Name | absURL }}<!-- absolute URL to hi-res image -->
|
||||
{{- $thumb := .Name | replaceRE "(\\.)" ($thumbext | printf "%s.") }}<!-- filename of thumbnail image -->
|
||||
{{- $thumbexists := where $files "Name" $thumb }}<!-- does a thumbnail image exist? -->
|
||||
{{- $thumbURL := print ($.Get "dir") "/" $thumb | absURL }}<!-- absolute URL to thumbnail image -->
|
||||
<div class="box">
|
||||
<figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
|
||||
<div class="img" style="background-image: url('{{ if $thumbexists }}{{ $thumbURL }}{{ else }}{{ $linkURL }}{{ end }}');" >
|
||||
<img itemprop="thumbnail" src="{{ if $thumbexists }}{{ $thumbURL }}{{ else }}{{ $linkURL }}{{ end }}" alt="{{ $caption }}" /><!-- <img> hidden if in .gallery -->
|
||||
</div>
|
||||
<figcaption>
|
||||
<p>{{ $caption }}</p>
|
||||
</figcaption>
|
||||
<a href="{{ $linkURL }}" itemprop="contentUrl"></a><!-- put <a> last so it is stacked on top -->
|
||||
</figure>
|
||||
</div>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else -}}
|
||||
<!-- If no directory was specified, include any figure shortcodes called within the gallery -->
|
||||
{{ .Inner }}
|
||||
{{- end }}
|
||||
</div>
|
@ -0,0 +1,75 @@
|
||||
<!--
|
||||
Put this file in /layouts/shortcodes/load-photoswipe.html
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
-->
|
||||
|
||||
<!-- prevent this shortcode from being loaded more than once per page -->
|
||||
{{ if not ($.Page.Scratch.Get "photoswipeloaded") }}
|
||||
{{ $.Page.Scratch.Set "photoswipeloaded" 1 }}
|
||||
|
||||
<!--
|
||||
*** jQuery must be loaded before load-photoswipe.js ***
|
||||
- If your template already loads jQuery in the header then you don't need to load it again here.
|
||||
- If your template already loads jQuery in the footer, then you could load load-photoswipe.js from the footer instead
|
||||
-->
|
||||
<!-- these files are loaded in the theme footer
|
||||
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
|
||||
<script src="/js/load-photoswipe.js"></script>
|
||||
-->
|
||||
|
||||
<!-- Photoswipe css/js libraries -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.css" integrity="sha256-sCl5PUOGMLfFYctzDW3MtRib0ctyUvI9Qsmq2wXOeBY=" crossorigin="anonymous" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/default-skin/default-skin.min.css" integrity="sha256-BFeI1V+Vh1Rk37wswuOYn5lsTcaU96hGaI7OUVCLjPc=" crossorigin="anonymous" />
|
||||
<!-- these files are loaded in the theme footer
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.js" integrity="sha256-UplRCs9v4KXVJvVY+p+RSo5Q4ilAUXh7kpjyIP5odyc=" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe-ui-default.min.js" integrity="sha256-PWHOlUzc96pMc8ThwRIXPn8yH4NOLu42RQ0b9SpnpFk=" crossorigin="anonymous"></script>
|
||||
-->
|
||||
|
||||
<!-- Root element of PhotoSwipe. Must have class pswp. -->
|
||||
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<!-- Background of PhotoSwipe.
|
||||
It's a separate element, as animating opacity is faster than rgba(). -->
|
||||
<div class="pswp__bg"></div>
|
||||
<!-- Slides wrapper with overflow:hidden. -->
|
||||
<div class="pswp__scroll-wrap">
|
||||
<!-- Container that holds slides.
|
||||
PhotoSwipe keeps only 3 of them in DOM to save memory.
|
||||
Don't modify these 3 pswp__item elements, data is added later on. -->
|
||||
<div class="pswp__container">
|
||||
<div class="pswp__item"></div>
|
||||
<div class="pswp__item"></div>
|
||||
<div class="pswp__item"></div>
|
||||
</div>
|
||||
<!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
|
||||
<div class="pswp__ui pswp__ui--hidden">
|
||||
<div class="pswp__top-bar">
|
||||
<!-- Controls are self-explanatory. Order can be changed. -->
|
||||
<div class="pswp__counter"></div>
|
||||
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
|
||||
<button class="pswp__button pswp__button--share" title="Share"></button>
|
||||
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
|
||||
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
|
||||
<!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
|
||||
<!-- element will get class pswp__preloader--active when preloader is running -->
|
||||
<div class="pswp__preloader">
|
||||
<div class="pswp__preloader__icn">
|
||||
<div class="pswp__preloader__cut">
|
||||
<div class="pswp__preloader__donut"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
|
||||
<div class="pswp__share-tooltip"></div>
|
||||
</div>
|
||||
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
|
||||
</button>
|
||||
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
|
||||
</button>
|
||||
<div class="pswp__caption">
|
||||
<div class="pswp__caption__center"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
@ -0,0 +1,71 @@
|
||||
<!--
|
||||
Put this file in /layouts/shortcodes/load-photoswipe.html
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
-->
|
||||
|
||||
<!-- prevent this shortcode from being loaded more than once per page -->
|
||||
{{ if not ($.Page.Scratch.Get "photoswipeloaded") }}
|
||||
{{ $.Page.Scratch.Set "photoswipeloaded" 1 }}
|
||||
|
||||
<!--
|
||||
*** jQuery must be loaded before load-photoswipe.js ***
|
||||
- If your template already loads jQuery in the header then you don't need to load it again here.
|
||||
- If your template already loads jQuery in the footer, then you could load load-photoswipe.js from the footer instead
|
||||
-->
|
||||
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
|
||||
<script src="/js/load-photoswipe.js"></script>
|
||||
|
||||
<!-- Photoswipe css/js libraries -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.css" integrity="sha256-sCl5PUOGMLfFYctzDW3MtRib0ctyUvI9Qsmq2wXOeBY=" crossorigin="anonymous" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/default-skin/default-skin.min.css" integrity="sha256-BFeI1V+Vh1Rk37wswuOYn5lsTcaU96hGaI7OUVCLjPc=" crossorigin="anonymous" />
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.js" integrity="sha256-UplRCs9v4KXVJvVY+p+RSo5Q4ilAUXh7kpjyIP5odyc=" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe-ui-default.min.js" integrity="sha256-PWHOlUzc96pMc8ThwRIXPn8yH4NOLu42RQ0b9SpnpFk=" crossorigin="anonymous"></script>
|
||||
|
||||
<!-- Root element of PhotoSwipe. Must have class pswp. -->
|
||||
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<!-- Background of PhotoSwipe.
|
||||
It's a separate element, as animating opacity is faster than rgba(). -->
|
||||
<div class="pswp__bg"></div>
|
||||
<!-- Slides wrapper with overflow:hidden. -->
|
||||
<div class="pswp__scroll-wrap">
|
||||
<!-- Container that holds slides.
|
||||
PhotoSwipe keeps only 3 of them in DOM to save memory.
|
||||
Don't modify these 3 pswp__item elements, data is added later on. -->
|
||||
<div class="pswp__container">
|
||||
<div class="pswp__item"></div>
|
||||
<div class="pswp__item"></div>
|
||||
<div class="pswp__item"></div>
|
||||
</div>
|
||||
<!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
|
||||
<div class="pswp__ui pswp__ui--hidden">
|
||||
<div class="pswp__top-bar">
|
||||
<!-- Controls are self-explanatory. Order can be changed. -->
|
||||
<div class="pswp__counter"></div>
|
||||
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
|
||||
<button class="pswp__button pswp__button--share" title="Share"></button>
|
||||
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
|
||||
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
|
||||
<!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
|
||||
<!-- element will get class pswp__preloader--active when preloader is running -->
|
||||
<div class="pswp__preloader">
|
||||
<div class="pswp__preloader__icn">
|
||||
<div class="pswp__preloader__cut">
|
||||
<div class="pswp__preloader__donut"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
|
||||
<div class="pswp__share-tooltip"></div>
|
||||
</div>
|
||||
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
|
||||
</button>
|
||||
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
|
||||
</button>
|
||||
<div class="pswp__caption">
|
||||
<div class="pswp__caption__center"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
@ -0,0 +1 @@
|
||||
.hljs{display:block;overflow-x:auto;padding:0.5em;background:#f9f9f9;-webkit-text-size-adjust:none}.hljs,.hljs-subst,.hljs-tag .hljs-title,.nginx .hljs-title{color:black}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rule .hljs-value,.hljs-preprocessor,.hljs-pragma,.hljs-name,.haml .hljs-symbol,.ruby .hljs-symbol,.ruby .hljs-symbol .hljs-string,.hljs-template_tag,.django .hljs-variable,.smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.bash .hljs-variable,.pf .hljs-variable,.apache .hljs-tag,.apache .hljs-cbracket,.tex .hljs-command,.tex .hljs-special,.erlang_repl .hljs-function_or_atom,.asciidoc .hljs-header,.markdown .hljs-header,.coffeescript .hljs-attribute{color:#800}.smartquote,.hljs-comment,.hljs-annotation,.diff .hljs-header,.hljs-chunk,.asciidoc .hljs-blockquote,.markdown .hljs-blockquote{color:#888}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-hexcolor,.smalltalk .hljs-symbol,.smalltalk .hljs-char,.go .hljs-constant,.hljs-change,.lasso .hljs-variable,.makefile .hljs-variable,.asciidoc .hljs-bullet,.markdown .hljs-bullet,.asciidoc .hljs-link_url,.markdown .hljs-link_url{color:#080}.hljs-label,.hljs-javadoc,.ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.haml .hljs-bullet,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.apache .hljs-sqbracket,.nginx .hljs-built_in,.tex .hljs-formula,.erlang_repl .hljs-reserved,.hljs-prompt,.asciidoc .hljs-link_label,.markdown .hljs-link_label,.vhdl .hljs-attribute,.clojure .hljs-attribute,.asciidoc .hljs-attribute,.lasso .hljs-attribute,.coffeescript .hljs-property,.hljs-phony{color:#88f}.hljs-keyword,.hljs-id,.hljs-title,.hljs-built_in,.css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-dartdoc,.hljs-yardoctag,.smalltalk .hljs-class,.hljs-winutils,.bash .hljs-variable,.pf .hljs-variable,.apache .hljs-tag,.hljs-type,.hljs-typename,.tex .hljs-command,.asciidoc .hljs-strong,.markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:bold}.asciidoc .hljs-emphasis,.markdown .hljs-emphasis{font-style:italic}.nginx .hljs-built_in{font-weight:normal}.coffeescript .javascript,.javascript .xml,.lasso .markup,.tex .hljs-formula,.xml .javascript,.xml .vbscript,.xml .css,.xml .hljs-cdata{opacity:0.5}
|
@ -0,0 +1,157 @@
|
||||
/*
|
||||
Put this file in /static/css/hugo-easy-gallery.css
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Grid Layout Styles
|
||||
*/
|
||||
.gallery {
|
||||
overflow: hidden;
|
||||
margin: 10px;
|
||||
max-width: 768px;
|
||||
}
|
||||
.gallery .box {
|
||||
float: left;
|
||||
position: relative;
|
||||
/* Default: 1 tile wide */
|
||||
width: 100%;
|
||||
padding-bottom: 100%;
|
||||
}
|
||||
@media only screen and (min-width : 365px) {
|
||||
/* Tablet view: 2 tiles */
|
||||
.gallery .box {
|
||||
width: 50%;
|
||||
padding-bottom: 50%;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width : 480px) {
|
||||
/* Small desktop / ipad view: 3 tiles */
|
||||
.gallery .box {
|
||||
width: 33.3%;
|
||||
padding-bottom: 33.3%; /* */
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width : 9999px) {
|
||||
/* Medium desktop: 4 tiles */
|
||||
.box {
|
||||
width: 25%;
|
||||
padding-bottom: 25%;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Transition styles
|
||||
*/
|
||||
.gallery.hover-transition figure,
|
||||
.gallery.hover-effect-zoom .img,
|
||||
.gallery:not(.caption-effect-appear) figcaption,
|
||||
.fancy-figure:not(.caption-effect-appear) figcaption {
|
||||
-webkit-transition: all 0.3s ease-in-out;
|
||||
-moz-transition: all 0.3s ease-in-out;
|
||||
-o-transition: all 0.3s ease-in-out;
|
||||
transition: all 0.3s ease-in-out;
|
||||
}
|
||||
/*
|
||||
figure styles
|
||||
*/
|
||||
figure {
|
||||
position:relative; /* purely to allow absolution positioning of figcaption */
|
||||
overflow: hidden;
|
||||
}
|
||||
.gallery figure {
|
||||
position: absolute;
|
||||
left: 5px;
|
||||
right: 5px;
|
||||
top: 5px;
|
||||
bottom: 5px;
|
||||
}
|
||||
.gallery.hover-effect-grow figure:hover {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
.gallery.hover-effect-shrink figure:hover {
|
||||
transform: scale(0.95);
|
||||
}
|
||||
.gallery.hover-effect-slidedown figure:hover {
|
||||
transform: translateY(5px);
|
||||
}
|
||||
.gallery.hover-effect-slideup figure:hover {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
/*
|
||||
img / a styles
|
||||
*/
|
||||
|
||||
.gallery .img {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
background-size: cover;
|
||||
background-position: 50% 50%;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.gallery.hover-effect-zoom figure:hover .img {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
.gallery img {
|
||||
display: none; /* only show the img if not inside a gallery */
|
||||
}
|
||||
figure a {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
/*
|
||||
figcaption styles
|
||||
*/
|
||||
.gallery figcaption,
|
||||
.fancy-figure figcaption {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: #000;
|
||||
color: #FFF;
|
||||
text-align: center;
|
||||
font-size: 75%; /* change this if you want bigger text */
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
opacity: 1;
|
||||
}
|
||||
.gallery.caption-position-none figcaption,
|
||||
.fancy-figure.caption-position-none figcaption {
|
||||
display: none;
|
||||
}
|
||||
.gallery.caption-position-center figcaption,
|
||||
.fancy-figure.caption-position-center figcaption {
|
||||
top: 0;
|
||||
padding: 40% 5px;
|
||||
}
|
||||
.gallery.caption-position-bottom figcaption,
|
||||
.fancy-figure.caption-position-bottom figcaption {
|
||||
padding: 5px;
|
||||
}
|
||||
.gallery.caption-effect-fade figure:not(:hover) figcaption,
|
||||
.gallery.caption-effect-appear figure:not(:hover) figcaption,
|
||||
.fancy-figure.caption-effect-fade figure:not(:hover) figcaption,
|
||||
.fancy-figure.caption-effect-appear figure:not(:hover) figcaption {
|
||||
background: rgba(0, 0, 0, 0);
|
||||
opacity: 0;
|
||||
}
|
||||
.gallery.caption-effect-slide.caption-position-bottom figure:not(:hover) figcaption,
|
||||
.fancy-figure.caption-effect-slide.caption-position-bottom figure:not(:hover) figcaption {
|
||||
margin-bottom: -100%;
|
||||
}
|
||||
.gallery.caption-effect-slide.caption-position-center figure:not(:hover) figcaption,
|
||||
.fancy-figure.caption-effect-slide.caption-position-center figure:not(:hover) figcaption {
|
||||
top: 100%;
|
||||
}
|
||||
figcaption p {
|
||||
margin: auto; /* override style in theme */
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
.main-content {
|
||||
padding-bottom: 50px;
|
||||
}
|
||||
|
||||
footer.footer-min {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
padding: 3px;
|
||||
background-color: #f5f5f5;
|
||||
border-top: 1px solid #eeeeee;
|
||||
text-align: center;
|
||||
}
|
@ -0,0 +1,704 @@
|
||||
@import url("pygment_highlights.css");
|
||||
|
||||
/* --- General --- */
|
||||
|
||||
body {
|
||||
font-family: 'Lora', 'Times New Roman', serif;
|
||||
font-size: 18px;
|
||||
color: #404040;
|
||||
position: relative;
|
||||
background: #FFF;
|
||||
}
|
||||
p {
|
||||
line-height: 1.5;
|
||||
margin: 30px 0;
|
||||
}
|
||||
p a {
|
||||
/* text-decoration: underline */
|
||||
color: #008AFF;
|
||||
}
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
font-weight: 800;
|
||||
}
|
||||
a {
|
||||
color: #008AFF;
|
||||
}
|
||||
a:hover,
|
||||
a:focus {
|
||||
color: #0085a1;
|
||||
}
|
||||
blockquote {
|
||||
color: #808080;
|
||||
font-style: italic;
|
||||
}
|
||||
blockquote p:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
hr.small {
|
||||
max-width: 100px;
|
||||
margin: 15px auto;
|
||||
border-width: 4px;
|
||||
border-color: inherit;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.main-content {
|
||||
padding-top: 80px;
|
||||
}
|
||||
@media only screen and (min-width: 768px) {
|
||||
.main-content {
|
||||
padding-top: 130px;
|
||||
}
|
||||
}
|
||||
|
||||
.main-explain-area {
|
||||
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
padding: 15px inherit;
|
||||
}
|
||||
|
||||
.hideme {
|
||||
display: none;
|
||||
}
|
||||
|
||||
::-moz-selection {
|
||||
color: white;
|
||||
text-shadow: none;
|
||||
background: #0085a1;
|
||||
}
|
||||
::selection {
|
||||
color: white;
|
||||
text-shadow: none;
|
||||
background: #0085a1;
|
||||
}
|
||||
img::selection {
|
||||
color: white;
|
||||
background: transparent;
|
||||
}
|
||||
img::-moz-selection {
|
||||
color: white;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
img {
|
||||
display: block;
|
||||
margin: auto;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.disqus-comments {
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 768px) {
|
||||
.disqus-comments {
|
||||
margin-top: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Navbar --- */
|
||||
|
||||
.navbar-custom {
|
||||
background: #F5F5F5;
|
||||
border-bottom: 1px solid #EAEAEA;
|
||||
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
.navbar-custom .nav li a {
|
||||
text-transform: uppercase;
|
||||
font-size: 12px;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
.navbar-custom .navbar-brand,
|
||||
.navbar-custom .nav li a {
|
||||
font-weight: 800;
|
||||
color: #404040;
|
||||
}
|
||||
|
||||
.navbar-custom .navbar-brand:hover,
|
||||
.navbar-custom .navbar-brand:focus ,
|
||||
.navbar-custom .nav li a:hover,
|
||||
.navbar-custom .nav li a:focus {
|
||||
color: #0085a1;
|
||||
}
|
||||
|
||||
.navbar-custom .navbar-brand-logo {
|
||||
padding-top: 0;
|
||||
-webkit-transition: padding .5s ease-in-out;
|
||||
-moz-transition: padding .5s ease-in-out;
|
||||
transition: padding .5s ease-in-out;
|
||||
}
|
||||
.navbar-custom .navbar-brand-logo img {
|
||||
height: 50px;
|
||||
-webkit-transition: height .5s ease-in-out;
|
||||
-moz-transition: height .5s ease-in-out;
|
||||
transition: height .5s ease-in-out;
|
||||
}
|
||||
.navbar-custom.top-nav-short .navbar-brand-logo {
|
||||
padding-top: 5px;
|
||||
}
|
||||
.navbar-custom.top-nav-short .navbar-brand-logo img {
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 768px) {
|
||||
.navbar-custom {
|
||||
padding: 20px 0;
|
||||
-webkit-transition: background .5s ease-in-out,padding .5s ease-in-out;
|
||||
-moz-transition: background .5s ease-in-out,padding .5s ease-in-out;
|
||||
transition: background .5s ease-in-out,padding .5s ease-in-out;
|
||||
}
|
||||
|
||||
.navbar-custom.top-nav-short {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-custom .avatar-container {
|
||||
opacity: 1;
|
||||
position: absolute;
|
||||
-webkit-transition: opacity 0.5s ease-in-out;
|
||||
-moz-transition: opacity 0.5s ease-in-out;
|
||||
transition: opacity 0.5s ease-in-out;
|
||||
left: 50%;
|
||||
width: 50px;
|
||||
margin-top: -25px;
|
||||
}
|
||||
.navbar-custom .avatar-container .avatar-img-border {
|
||||
width: 100%;
|
||||
border-radius: 50%;
|
||||
margin-left: -50%;
|
||||
display: inline-block;
|
||||
box-shadow: 0 0 8px rgba(0, 0, 0, .8);
|
||||
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .8);
|
||||
-moz-box-shadow: 0 0 8px rgba(0, 0, 0, .8);
|
||||
}
|
||||
.navbar-custom .avatar-container .avatar-img {
|
||||
width: 100%;
|
||||
border-radius: 50%;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.navbar-custom.top-nav-short .avatar-container{
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.navbar-custom.top-nav-expanded .avatar-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 768px) {
|
||||
.navbar-custom .avatar-container {
|
||||
width: 100px;
|
||||
margin-top: -50px;
|
||||
}
|
||||
|
||||
.navbar-custom .avatar-container .avatar-img-border {
|
||||
width: 100%;
|
||||
box-shadow: 1px 1px 2px rgba(0, 0, 0, .8);
|
||||
-webkit-box-shadow: 1px 1px 2px rgba(0, 0, 0, .8);
|
||||
-moz-box-shadow: 1px 1px 2px rgba(0, 0, 0, .8);
|
||||
}
|
||||
|
||||
.navbar-custom .avatar-container .avatar-img {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Multi-level navigation links */
|
||||
.navbar-custom .nav .navlinks-container {
|
||||
position: relative;
|
||||
}
|
||||
.navbar-custom .nav .navlinks-parent:after {
|
||||
content: " \25BC";
|
||||
}
|
||||
.navbar-custom .nav .navlinks-children {
|
||||
width: 100%;
|
||||
display: none;
|
||||
word-break: break-word;
|
||||
}
|
||||
.navbar-custom .nav .navlinks-container .navlinks-children a {
|
||||
display: block;
|
||||
padding: 10px;
|
||||
padding-left: 30px;
|
||||
background: #f5f5f5;
|
||||
text-decoration: none !important;
|
||||
border-width: 0 1px 1px 1px;
|
||||
font-weight: normal;
|
||||
}
|
||||
@media only screen and (max-width: 767px) {
|
||||
.navbar-custom .nav .navlinks-container.show-children {
|
||||
background: #eee;
|
||||
}
|
||||
.navbar-custom .nav .navlinks-container.show-children .navlinks-children {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width: 768px) {
|
||||
.navbar-custom .nav .navlinks-container {
|
||||
text-align: center;
|
||||
}
|
||||
.navbar-custom .nav .navlinks-container:hover {
|
||||
background: #eee;
|
||||
}
|
||||
.navbar-custom .nav .navlinks-container:hover .navlinks-children {
|
||||
display: block;
|
||||
}
|
||||
.navbar-custom .nav .navlinks-children {
|
||||
position: absolute;
|
||||
}
|
||||
.navbar-custom .nav .navlinks-container .navlinks-children a {
|
||||
padding-left: 10px;
|
||||
border: 1px solid #eaeaea;
|
||||
border-width: 0 1px 1px;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Footer --- */
|
||||
|
||||
footer {
|
||||
padding: 30px 0;
|
||||
background: #F5F5F5;
|
||||
border-top: 1px #EAEAEA solid;
|
||||
margin-top: 50px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: #404040;
|
||||
}
|
||||
|
||||
footer .list-inline {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
footer .copyright {
|
||||
font-family: Open Sans;
|
||||
text-align: center;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
footer .theme-by {
|
||||
text-align: center;
|
||||
margin: 10px 0 0;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 768px) {
|
||||
footer {
|
||||
padding: 50px 0;
|
||||
}
|
||||
footer .footer-links {
|
||||
font-size: 18px;
|
||||
}
|
||||
footer .copyright {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Post preview --- */
|
||||
|
||||
.post-preview {
|
||||
padding: 20px 0;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 768px) {
|
||||
.post-preview {
|
||||
padding: 35px 0;
|
||||
}
|
||||
}
|
||||
|
||||
.post-preview:last-child {
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
.post-preview a {
|
||||
text-decoration: none;
|
||||
color: #404040;
|
||||
}
|
||||
|
||||
.post-preview a:focus,
|
||||
.post-preview a:hover {
|
||||
text-decoration: none;
|
||||
color: #0085a1;
|
||||
}
|
||||
|
||||
.post-preview .post-title {
|
||||
font-size: 30px;
|
||||
margin-top: 0;
|
||||
}
|
||||
.post-preview .post-subtitle {
|
||||
margin: 0;
|
||||
font-weight: 300;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.post-preview .post-meta,
|
||||
.post-heading .post-meta {
|
||||
color: #808080;
|
||||
font-size: 18px;
|
||||
font-style: italic;
|
||||
margin: 0 0 10px;
|
||||
}
|
||||
.post-preview .post-meta a,
|
||||
.post-heading .post-meta a {
|
||||
color: #404040;
|
||||
text-decoration: none;
|
||||
}
|
||||
.post-preview .post-entry {
|
||||
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
}
|
||||
.post-entry-container {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
.post-entry {
|
||||
width: 100%;
|
||||
}
|
||||
.post-image {
|
||||
float: right;
|
||||
height: 192px;
|
||||
width: 192px;
|
||||
margin-top: -35px;
|
||||
filter: grayscale(90%);
|
||||
}
|
||||
.post-image:hover {
|
||||
filter: grayscale(0%);
|
||||
}
|
||||
.post-image img {
|
||||
border-radius: 100px;
|
||||
height: 192px;
|
||||
width: 192px;
|
||||
}
|
||||
.post-preview .post-read-more {
|
||||
font-weight: 800;
|
||||
float: right;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 768px) {
|
||||
.post-preview .post-title {
|
||||
font-size: 36px;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Tags --- */
|
||||
|
||||
.blog-tags {
|
||||
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
color: #999;
|
||||
font-size: 15px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.blog-tags a {
|
||||
color: #008AFF;
|
||||
text-decoration: none;
|
||||
padding: 0px 5px;
|
||||
}
|
||||
|
||||
.blog-tags a:hover {
|
||||
border-radius: 2px;
|
||||
color: #008AFF;
|
||||
background-color: #CCC;
|
||||
}
|
||||
|
||||
.post-preview .blog-tags {
|
||||
margin-top: 5px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 768px) {
|
||||
.post-preview .blog-tags {
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
.post-image, .post-image img {
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.post-image {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
margin-top: 0;
|
||||
float: left;
|
||||
}
|
||||
}
|
||||
/* --- Post and page headers --- */
|
||||
|
||||
.intro-header {
|
||||
margin: 80px 0 20px;
|
||||
position: relative;
|
||||
}
|
||||
.intro-header.big-img {
|
||||
background: no-repeat center center;
|
||||
-webkit-background-size: cover;
|
||||
-moz-background-size: cover;
|
||||
background-size: cover;
|
||||
-o-background-size: cover;
|
||||
margin-top: 51px; /* The small navbar is 50px tall + 1px border */
|
||||
margin-bottom: 35px;
|
||||
}
|
||||
.intro-header.big-img .big-img-transition {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
opacity: 0;
|
||||
background: no-repeat center center;
|
||||
-webkit-background-size: cover;
|
||||
-moz-background-size: cover;
|
||||
background-size: cover;
|
||||
-o-background-size: cover;
|
||||
-webkit-transition: opacity 1s linear;
|
||||
-moz-transition: opacity 1s linear;
|
||||
transition: opacity 1s linear;
|
||||
}
|
||||
.intro-header .page-heading {
|
||||
text-align: center;
|
||||
}
|
||||
.intro-header.big-img .page-heading,
|
||||
.intro-header.big-img .post-heading {
|
||||
padding: 100px 0;
|
||||
color: #FFF;
|
||||
text-shadow: 1px 1px 3px #000;
|
||||
}
|
||||
.intro-header .page-heading h1 {
|
||||
margin-top: 0;
|
||||
font-size: 50px;
|
||||
}
|
||||
.intro-header .post-heading h1 {
|
||||
margin-top: 0;
|
||||
font-size: 35px;
|
||||
}
|
||||
.intro-header .page-heading .page-subheading,
|
||||
.intro-header .post-heading .post-subheading {
|
||||
font-size: 27px;
|
||||
line-height: 1.1;
|
||||
display: block;
|
||||
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
font-weight: 300;
|
||||
margin: 10px 0 0;
|
||||
}
|
||||
.intro-header .post-heading .post-subheading {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.intro-header.big-img .page-heading .page-subheading,
|
||||
.intro-header.big-img .post-heading .post-subheading {
|
||||
font-weight: 400;
|
||||
}
|
||||
.intro-header.big-img .page-heading hr {
|
||||
box-shadow: 1px 1px 3px #000;
|
||||
-webkit-box-shadow: 1px 1px 3px #000;
|
||||
-moz-box-shadow: 1px 1px 3px #000;
|
||||
}
|
||||
.intro-header.big-img .post-heading .post-meta {
|
||||
color: #EEE;
|
||||
}
|
||||
.intro-header.big-img .img-desc {
|
||||
background: rgba(30, 30, 30, 0.6);
|
||||
position: absolute;
|
||||
padding: 5px 10px;
|
||||
font-size: 11px;
|
||||
color: #EEE;
|
||||
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
display: none;
|
||||
}
|
||||
@media only screen and (min-width: 768px) {
|
||||
.intro-header {
|
||||
margin-top: 130px;
|
||||
}
|
||||
.intro-header.big-img {
|
||||
margin-top: 91px; /* Full navbar is small navbar + 20px padding on each side when expanded */
|
||||
}
|
||||
.intro-header.big-img .page-heading,
|
||||
.intro-header.big-img .post-heading {
|
||||
padding: 150px 0;
|
||||
}
|
||||
.intro-header .page-heading h1 {
|
||||
font-size: 80px;
|
||||
}
|
||||
.intro-header .post-heading h1 {
|
||||
font-size: 50px;
|
||||
}
|
||||
.intro-header.big-img .img-desc {
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
.header-section.has-img .no-img {
|
||||
margin-top: 0;
|
||||
background: #FCFCFC;
|
||||
margin: 0 0 40px;
|
||||
padding: 20px 0;
|
||||
box-shadow: 0 0 5px #AAA;
|
||||
}
|
||||
/* Many phones are 320 or 360px, so make sure images are a proper aspect ratio in those cases */
|
||||
.header-section.has-img .intro-header.no-img {
|
||||
display: none;
|
||||
}
|
||||
@media only screen and (max-width: 365px) {
|
||||
.header-section.has-img .intro-header.no-img {
|
||||
display: block;
|
||||
}
|
||||
.intro-header.big-img {
|
||||
width: 100%;
|
||||
height: 220px;
|
||||
}
|
||||
.intro-header.big-img .page-heading,
|
||||
.intro-header.big-img .post-heading {
|
||||
display: none;
|
||||
}
|
||||
.header-section.has-img .big-img {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
@media only screen and (max-width: 325px) {
|
||||
.intro-header.big-img {
|
||||
height: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
.caption {
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
padding: 10px;
|
||||
font-style: italic;
|
||||
margin: 0;
|
||||
display: block;
|
||||
border-bottom-right-radius: 5px;
|
||||
border-bottom-left-radius: 5px;
|
||||
}
|
||||
|
||||
/* --- Pager --- */
|
||||
|
||||
.pager li a {
|
||||
font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
text-transform: uppercase;
|
||||
font-size: 14px;
|
||||
font-weight: 800;
|
||||
letter-spacing: 1px;
|
||||
padding: 10px 5px;
|
||||
background: #FFF;
|
||||
border-radius: 0;
|
||||
color: #404040;
|
||||
}
|
||||
@media only screen and (min-width: 768px) {
|
||||
.pager li a {
|
||||
padding: 15px 25px;
|
||||
}
|
||||
}
|
||||
.pager li a:hover,
|
||||
.pager li a:focus {
|
||||
color: #FFF;
|
||||
background: #0085a1;
|
||||
border: 1px solid #0085a1;
|
||||
}
|
||||
|
||||
.pager {
|
||||
margin: 10px 0 0;
|
||||
}
|
||||
|
||||
.pager.blog-pager {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 768px) {
|
||||
.pager.blog-pager {
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Tables --- */
|
||||
|
||||
table {
|
||||
padding: 0;
|
||||
}
|
||||
table tr {
|
||||
border-top: 1px solid #cccccc;
|
||||
background-color: #ffffff;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
table tr:nth-child(2n) {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
table tr th {
|
||||
font-weight: bold;
|
||||
border: 1px solid #cccccc;
|
||||
text-align: left;
|
||||
margin: 0;
|
||||
padding: 6px 13px;
|
||||
}
|
||||
table tr td {
|
||||
border: 1px solid #cccccc;
|
||||
text-align: left;
|
||||
margin: 0;
|
||||
padding: 6px 13px;
|
||||
}
|
||||
table tr th :first-child,
|
||||
table tr td :first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
table tr th :last-child,
|
||||
table tr td :last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* --- Code blocks --- */
|
||||
|
||||
pre {
|
||||
font-size: 16px;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
pre code {
|
||||
white-space: pre;
|
||||
}
|
||||
pre.highlight, .highlight > pre, td.code pre {
|
||||
background: #FAFAFA;
|
||||
background-image: linear-gradient(#F9F9F9 50%, #FDFDFD 50%);
|
||||
background-repeat: repeat;
|
||||
background-size: 3em 3em;
|
||||
background-position: 0px 10px;
|
||||
border-left: 7px solid #444;
|
||||
}
|
||||
code table, code table td, code table th, code table tbody, code table tr,
|
||||
td.gutter pre {
|
||||
padding: 0;
|
||||
border: none;
|
||||
background-color: #fff;
|
||||
}
|
||||
.highlight > pre {
|
||||
padding: 0;
|
||||
}
|
||||
td.code pre {
|
||||
border-width: 0 0 0 2px;
|
||||
border-style: solid;
|
||||
border-color: #444;
|
||||
border-radius: 0;
|
||||
}
|
||||
td.gutter {
|
||||
padding-top: 3px;
|
||||
}
|
||||
|
||||
/* --- Social media sharing section --- */
|
||||
|
||||
#social-share-section {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
/* --- Google Custom Search Engine Popup --- */
|
||||
#modalSearch table tr, #modalSearch table tr td, #modalSearch table tr th {
|
||||
border:none;
|
||||
}
|
||||
.reset-box-sizing, .reset-box-sizing *, .reset-box-sizing *:before, .reset-box-sizing *:after, .gsc-inline-block {
|
||||
-webkit-box-sizing: content-box;
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
}
|
||||
input.gsc-input, .gsc-input-box, .gsc-input-box-hover, .gsc-input-box-focus, .gsc-search-button {
|
||||
box-sizing: content-box;
|
||||
line-height: normal;
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
/* .highlight { background: #ffffff; } */
|
||||
/* .highlight pre { background-color: #fff; font-size: 16px } */
|
||||
.highlight .c { color: #999988; font-style: italic } /* Comment */
|
||||
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
|
||||
.highlight .k { font-weight: bold } /* Keyword */
|
||||
.highlight .o { font-weight: bold } /* Operator */
|
||||
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
||||
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
|
||||
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
|
||||
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
|
||||
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
||||
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
|
||||
.highlight .ge { font-style: italic } /* Generic.Emph */
|
||||
.highlight .gr { color: #aa0000 } /* Generic.Error */
|
||||
.highlight .gh { color: #999999 } /* Generic.Heading */
|
||||
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
||||
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
|
||||
.highlight .go { color: #888888 } /* Generic.Output */
|
||||
.highlight .gp { color: #555555 } /* Generic.Prompt */
|
||||
.highlight .gs { font-weight: bold } /* Generic.Strong */
|
||||
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
|
||||
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
|
||||
.highlight .kc { font-weight: bold } /* Keyword.Constant */
|
||||
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
|
||||
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
|
||||
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
|
||||
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
||||
.highlight .m { color: #009999 } /* Literal.Number */
|
||||
.highlight .s { color: #d14 } /* Literal.String */
|
||||
.highlight .na { color: #008080 } /* Name.Attribute */
|
||||
.highlight .nb { color: #0086B3 } /* Name.Builtin */
|
||||
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
|
||||
.highlight .no { color: #008080 } /* Name.Constant */
|
||||
.highlight .ni { color: #800080 } /* Name.Entity */
|
||||
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
|
||||
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
|
||||
.highlight .nn { color: #555555 } /* Name.Namespace */
|
||||
.highlight .nt { color: #000080 } /* Name.Tag */
|
||||
.highlight .nv { color: #008080 } /* Name.Variable */
|
||||
.highlight .ow { font-weight: bold } /* Operator.Word */
|
||||
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
|
||||
.highlight .mf { color: #009999 } /* Literal.Number.Float */
|
||||
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
|
||||
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
|
||||
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
|
||||
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
|
||||
.highlight .sc { color: #d14 } /* Literal.String.Char */
|
||||
.highlight .sd { color: #d14 } /* Literal.String.Doc */
|
||||
.highlight .s2 { color: #d14 } /* Literal.String.Double */
|
||||
.highlight .se { color: #d14 } /* Literal.String.Escape */
|
||||
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
|
||||
.highlight .si { color: #d14 } /* Literal.String.Interpol */
|
||||
.highlight .sx { color: #d14 } /* Literal.String.Other */
|
||||
.highlight .sr { color: #009926 } /* Literal.String.Regex */
|
||||
.highlight .s1 { color: #d14 } /* Literal.String.Single */
|
||||
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
|
||||
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
|
||||
.highlight .vc { color: #008080 } /* Name.Variable.Class */
|
||||
.highlight .vg { color: #008080 } /* Name.Variable.Global */
|
||||
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
|
||||
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
|
||||
|
||||
/* Make line numbers unselectable: excludes line numbers from copy-paste user ops */
|
||||
.highlight .lineno {color:rgba(0,0,0,0.3);padding: 0 10px;-webkit-user-select: none;-moz-user-select: none; -o-user-select: none;}
|
||||
.lineno::-moz-selection {background-color: transparent;} /* Mozilla specific */
|
||||
.lineno::selection {background-color: transparent;} /* Other major browsers */
|
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 170 KiB |
After Width: | Height: | Size: 262 KiB |
After Width: | Height: | Size: 7.0 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 133 KiB |
@ -0,0 +1,74 @@
|
||||
/*
|
||||
Put this file in /static/js/load-photoswipe.js
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
*/
|
||||
|
||||
/* TODO: Make the share function work */
|
||||
$( document ).ready(function() {
|
||||
/*
|
||||
Initialise Photoswipe
|
||||
*/
|
||||
var items = []; // array of slide objects that will be passed to PhotoSwipe()
|
||||
// for every figure element on the page:
|
||||
$('figure').each( function() {
|
||||
if ($(this).attr('class') == 'no-photoswipe') return true; // ignore any figures where class="no-photoswipe"
|
||||
// get properties from child a/img/figcaption elements,
|
||||
var $figure = $(this),
|
||||
$a = $figure.find('a'),
|
||||
$img = $figure.find('img'),
|
||||
$src = $a.attr('href'),
|
||||
$title = $img.attr('alt'),
|
||||
$msrc = $img.attr('src');
|
||||
// if data-size on <a> tag is set, read it and create an item
|
||||
if ($a.data('size')) {
|
||||
var $size = $a.data('size').split('x');
|
||||
var item = {
|
||||
src : $src,
|
||||
w : $size[0],
|
||||
h : $size[1],
|
||||
title : $title,
|
||||
msrc : $msrc
|
||||
};
|
||||
console.log("Using pre-defined dimensions for " + $src);
|
||||
// if not, set temp default size then load the image to check actual size
|
||||
} else {
|
||||
var item = {
|
||||
src : $src,
|
||||
w : 800, // temp default size
|
||||
h : 600, // temp default size
|
||||
title : $title,
|
||||
msrc : $msrc
|
||||
};
|
||||
console.log("Using default dimensions for " + $src);
|
||||
// load the image to check its dimensions
|
||||
// update the item as soon as w and h are known (check every 30ms)
|
||||
var img = new Image();
|
||||
img.src = $src;
|
||||
var wait = setInterval(function() {
|
||||
var w = img.naturalWidth,
|
||||
h = img.naturalHeight;
|
||||
if (w && h) {
|
||||
clearInterval(wait);
|
||||
item.w = w;
|
||||
item.h = h;
|
||||
console.log("Got actual dimensions for " + img.src);
|
||||
}
|
||||
}, 30);
|
||||
}
|
||||
// Save the index of this image then add it to the array
|
||||
var index = items.length;
|
||||
items.push(item);
|
||||
// Event handler for click on a figure
|
||||
$figure.on('click', function(event) {
|
||||
event.preventDefault(); // prevent the normal behaviour i.e. load the <a> hyperlink
|
||||
// Get the PSWP element and initialise it with the desired options
|
||||
var $pswp = $('.pswp')[0];
|
||||
var options = {
|
||||
index: index,
|
||||
bgOpacity: 0.8,
|
||||
showHideOpacity: true
|
||||
}
|
||||
new PhotoSwipe($pswp, PhotoSwipeUI_Default, items, options).init();
|
||||
});
|
||||
});
|
||||
});
|
@ -0,0 +1,138 @@
|
||||
// Dean Attali / Beautiful Jekyll 2016
|
||||
|
||||
var main = {
|
||||
|
||||
bigImgEl : null,
|
||||
numImgs : null,
|
||||
|
||||
init : function() {
|
||||
// Shorten the navbar after scrolling a little bit down
|
||||
$(window).scroll(function() {
|
||||
if ($(".navbar").offset().top > 50) {
|
||||
$(".navbar").addClass("top-nav-short");
|
||||
} else {
|
||||
$(".navbar").removeClass("top-nav-short");
|
||||
}
|
||||
});
|
||||
|
||||
// On mobile, hide the avatar when expanding the navbar menu
|
||||
$('#main-navbar').on('show.bs.collapse', function () {
|
||||
$(".navbar").addClass("top-nav-expanded");
|
||||
});
|
||||
$('#main-navbar').on('hidden.bs.collapse', function () {
|
||||
$(".navbar").removeClass("top-nav-expanded");
|
||||
});
|
||||
|
||||
// On mobile, when clicking on a multi-level navbar menu, show the child links
|
||||
$('#main-navbar').on("click", ".navlinks-parent", function(e) {
|
||||
var target = e.target;
|
||||
$.each($(".navlinks-parent"), function(key, value) {
|
||||
if (value == target) {
|
||||
$(value).parent().toggleClass("show-children");
|
||||
} else {
|
||||
$(value).parent().removeClass("show-children");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Ensure nested navbar menus are not longer than the menu header
|
||||
var menus = $(".navlinks-container");
|
||||
if (menus.length > 0) {
|
||||
var navbar = $("#main-navbar ul");
|
||||
var fakeMenuHtml = "<li class='fake-menu' style='display:none;'><a></a></li>";
|
||||
navbar.append(fakeMenuHtml);
|
||||
var fakeMenu = $(".fake-menu");
|
||||
|
||||
$.each(menus, function(i) {
|
||||
var parent = $(menus[i]).find(".navlinks-parent");
|
||||
var children = $(menus[i]).find(".navlinks-children a");
|
||||
var words = [];
|
||||
$.each(children, function(idx, el) { words = words.concat($(el).text().trim().split(/\s+/)); });
|
||||
var maxwidth = 0;
|
||||
$.each(words, function(id, word) {
|
||||
fakeMenu.html("<a>" + word + "</a>");
|
||||
var width = fakeMenu.width();
|
||||
if (width > maxwidth) {
|
||||
maxwidth = width;
|
||||
}
|
||||
});
|
||||
$(menus[i]).css('min-width', maxwidth + 'px')
|
||||
});
|
||||
|
||||
fakeMenu.remove();
|
||||
}
|
||||
|
||||
// show the big header image
|
||||
main.initImgs();
|
||||
},
|
||||
|
||||
initImgs : function() {
|
||||
// If the page was large images to randomly select from, choose an image
|
||||
if ($("#header-big-imgs").length > 0) {
|
||||
main.bigImgEl = $("#header-big-imgs");
|
||||
main.numImgs = main.bigImgEl.attr("data-num-img");
|
||||
|
||||
// 2fc73a3a967e97599c9763d05e564189
|
||||
// set an initial image
|
||||
var imgInfo = main.getImgInfo();
|
||||
var src = imgInfo.src;
|
||||
var desc = imgInfo.desc;
|
||||
main.setImg(src, desc);
|
||||
|
||||
// For better UX, prefetch the next image so that it will already be loaded when we want to show it
|
||||
var getNextImg = function() {
|
||||
var imgInfo = main.getImgInfo();
|
||||
var src = imgInfo.src;
|
||||
var desc = imgInfo.desc;
|
||||
|
||||
var prefetchImg = new Image();
|
||||
prefetchImg.src = src;
|
||||
// if I want to do something once the image is ready: `prefetchImg.onload = function(){}`
|
||||
|
||||
setTimeout(function(){
|
||||
var img = $("<div></div>").addClass("big-img-transition").css("background-image", 'url(' + src + ')');
|
||||
$(".intro-header.big-img").prepend(img);
|
||||
setTimeout(function(){ img.css("opacity", "1"); }, 50);
|
||||
|
||||
// after the animation of fading in the new image is done, prefetch the next one
|
||||
//img.one("transitioned webkitTransitionEnd oTransitionEnd MSTransitionEnd", function(){
|
||||
setTimeout(function() {
|
||||
main.setImg(src, desc);
|
||||
img.remove();
|
||||
getNextImg();
|
||||
}, 1000);
|
||||
//});
|
||||
}, 6000);
|
||||
};
|
||||
|
||||
// If there are multiple images, cycle through them
|
||||
if (main.numImgs > 1) {
|
||||
getNextImg();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
getImgInfo : function() {
|
||||
var randNum = Math.floor((Math.random() * main.numImgs) + 1);
|
||||
var src = main.bigImgEl.attr("data-img-src-" + randNum);
|
||||
var desc = main.bigImgEl.attr("data-img-desc-" + randNum);
|
||||
|
||||
return {
|
||||
src : src,
|
||||
desc : desc
|
||||
}
|
||||
},
|
||||
|
||||
setImg : function(src, desc) {
|
||||
$(".intro-header.big-img").css("background-image", 'url(' + src + ')');
|
||||
if (typeof desc !== typeof undefined && desc !== false) {
|
||||
$(".img-desc").text(desc).show();
|
||||
} else {
|
||||
$(".img-desc").hide();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 2fc73a3a967e97599c9763d05e564189
|
||||
|
||||
document.addEventListener('DOMContentLoaded', main.init);
|
@ -0,0 +1,18 @@
|
||||
name = "Beautiful Hugo"
|
||||
license = "MIT"
|
||||
licenselink = "https://github.com/halogenica/Hugo-BeautifulHugo/blob/master/LICENSE"
|
||||
description = "A port of Beautiful Jekyll theme"
|
||||
tags = ["blog", "company", "portfolio", "projects", "minimal", "responsive"]
|
||||
features = ["blog", "themes", "disqus", "minimal", "responsive"]
|
||||
min_version = 0.17
|
||||
|
||||
[author]
|
||||
name = "halogenica"
|
||||
homepage = "http://halogenica.net"
|
||||
|
||||
# If Porting existing theme
|
||||
[original]
|
||||
author = "dattali"
|
||||
homepage = "http://deanattali.com/beautiful-jekyll/"
|
||||
repo = "https://github.com/daattali/beautiful-jekyll"
|
||||
|