Merge branch 'hugo' into main
This commit is contained in:
commit
5cbd4175f9
36 changed files with 1550 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
public/
|
||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[submodule "themes/paper"]
|
||||
path = themes/paper
|
||||
url = ssh://git@github.com:erynofwales/hugo-paper.git
|
||||
6
archetypes/default/index.md
Normal file
6
archetypes/default/index.md
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
title: "{{ replace .Name "-" " " | title }}"
|
||||
date: {{ .Date }}
|
||||
draft: true
|
||||
---
|
||||
|
||||
0
archetypes/other.md
Normal file
0
archetypes/other.md
Normal file
683
assets/app.css
Normal file
683
assets/app.css
Normal file
|
|
@ -0,0 +1,683 @@
|
|||
/*
|
||||
* Paper
|
||||
* A simple, clean, flexible Hugo theme
|
||||
* https://github.com/nanxiaobei/hugo-paper
|
||||
* Designed by 南小北 (https://lee.so/)
|
||||
* Updated in 2021.8.24
|
||||
*/
|
||||
|
||||
/* Theme
|
||||
-------------------------------------------------- */
|
||||
:root {
|
||||
--gap: 3.5rem;
|
||||
--y-gap: 8rem;
|
||||
--wide: 140rem;
|
||||
--narrow: 80rem;
|
||||
--side: calc((var(--wide) - var(--narrow)) / 2);
|
||||
--header: 8rem;
|
||||
--footer: calc(8rem + var(--safe-bottom));
|
||||
--link-color: #3486ff;
|
||||
|
||||
--light: 255, 255, 255;
|
||||
--dark: 22, 22, 22;
|
||||
--hljs-bg: #111;
|
||||
|
||||
--safe-bottom: 0;
|
||||
}
|
||||
|
||||
@supports (bottom: constant(safe-area-inset-bottom)) {
|
||||
:root {
|
||||
--safe-bottom: constant(safe-area-inset-bottom);
|
||||
}
|
||||
}
|
||||
|
||||
@supports (bottom: env(safe-area-inset-bottom)) {
|
||||
:root {
|
||||
--safe-bottom: env(safe-area-inset-bottom);
|
||||
}
|
||||
}
|
||||
|
||||
.dark {
|
||||
--light: 22, 22, 22;
|
||||
--dark: 255, 255, 255;
|
||||
--hljs-bg: #282828;
|
||||
--link-color: #56a8ff;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
html {
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
font-size: 8px;
|
||||
}
|
||||
|
||||
body {
|
||||
--white: rgba(var(--light), 1);
|
||||
--black: rgba(var(--dark), 1);
|
||||
|
||||
--pro: rgba(var(--dark), 1);
|
||||
--lit: rgba(var(--dark), 0.64);
|
||||
--air: rgba(var(--dark), 0.48);
|
||||
--fog: rgba(var(--dark), 0.12);
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-right: var(--gap);
|
||||
padding-left: var(--gap);
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,
|
||||
'Open Sans', 'Helvetica Neue', sans-serif;
|
||||
font-size: 2rem;
|
||||
line-height: 1.8;
|
||||
color: var(--pro);
|
||||
word-break: break-word;
|
||||
background: var(--white);
|
||||
transition: background 0.4s ease-out;
|
||||
}
|
||||
|
||||
body > * {
|
||||
flex-shrink: 0;
|
||||
width: 100%;
|
||||
margin-inline: auto;
|
||||
}
|
||||
|
||||
.not-ready,
|
||||
.not-ready * {
|
||||
transition: none !important;
|
||||
}
|
||||
|
||||
@media (max-width: 1199px) {
|
||||
html {
|
||||
font-size: 7px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Reset
|
||||
-------------------------------------------------- */
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
margin: 0;
|
||||
font-size: inherit;
|
||||
font-weight: 700;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
strong,
|
||||
b {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
ul,
|
||||
ol {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
button,
|
||||
input,
|
||||
textarea {
|
||||
padding: 0;
|
||||
font: inherit;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
outline: 0;
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
button,
|
||||
input[type='button'],
|
||||
input[type='submit'] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
input,
|
||||
textarea {
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
input:-webkit-autofill,
|
||||
textarea:-webkit-autofill {
|
||||
box-shadow: 0 0 0 6rem var(--white) inset;
|
||||
}
|
||||
|
||||
img {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
/* Header
|
||||
-------------------------------------------------- */
|
||||
.header {
|
||||
margin-top: 2rem;
|
||||
display: flex;
|
||||
max-width: var(--wide);
|
||||
height: var(--header);
|
||||
align-items: baseline;
|
||||
}
|
||||
|
||||
.header a {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.logo {
|
||||
display: flex;
|
||||
min-width: var(--side);
|
||||
padding-right: var(--gap);
|
||||
}
|
||||
|
||||
.site-name {
|
||||
padding-bottom: 0.3rem;
|
||||
overflow: auto;
|
||||
font-size: 3.4rem;
|
||||
font-weight: 700;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.btn-dark {
|
||||
width: 3rem;
|
||||
margin-left: 2rem;
|
||||
cursor: pointer;
|
||||
background: url(./theme.png) left / auto 3rem no-repeat;
|
||||
transition: background-position 0.4s steps(5);
|
||||
}
|
||||
|
||||
.dark .btn-dark {
|
||||
background-position: right;
|
||||
}
|
||||
|
||||
.menu {
|
||||
display: flex;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.menu a + a {
|
||||
margin-left: var(--gap);
|
||||
}
|
||||
|
||||
.menu a.active {
|
||||
opacity: 0.44;
|
||||
}
|
||||
|
||||
.social {
|
||||
display: flex;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.social a {
|
||||
width: 3rem;
|
||||
margin-left: 3rem;
|
||||
background: var(--url) center center no-repeat;
|
||||
}
|
||||
|
||||
.social a span {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.dark .social a {
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
@media (max-width: 1199px) {
|
||||
.logo {
|
||||
min-width: auto;
|
||||
}
|
||||
|
||||
[data-menu='true'] {
|
||||
--header: 16rem;
|
||||
}
|
||||
|
||||
[data-menu='true'] .header {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
[data-menu='true'] .header > * {
|
||||
height: calc(var(--header) / 2);
|
||||
}
|
||||
|
||||
[data-menu='true'] .menu {
|
||||
position: absolute;
|
||||
inset: auto 0 0;
|
||||
border-bottom: 1px solid var(--fog);
|
||||
}
|
||||
}
|
||||
|
||||
/* Main
|
||||
-------------------------------------------------- */
|
||||
.main {
|
||||
max-width: var(--narrow);
|
||||
min-height: calc(100% - var(--header) - var(--footer));
|
||||
padding-top: var(--y-gap);
|
||||
padding-bottom: var(--y-gap);
|
||||
}
|
||||
|
||||
.main-title {
|
||||
margin-bottom: calc(var(--y-gap) + 1rem);
|
||||
font-size: 3rem;
|
||||
font-weight: 400;
|
||||
color: var(--lit);
|
||||
}
|
||||
|
||||
.main-nav {
|
||||
display: flex;
|
||||
margin-top: 5rem;
|
||||
}
|
||||
|
||||
.main-nav a {
|
||||
font-size: 1.8rem;
|
||||
line-height: 5.5rem;
|
||||
color: var(--white);
|
||||
background: var(--black);
|
||||
border-radius: 0.5rem;
|
||||
padding-inline: 3rem;
|
||||
}
|
||||
|
||||
.main-nav .next {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
/* Post entry
|
||||
-------------------------------------------------- */
|
||||
.post-entry {
|
||||
position: relative;
|
||||
padding-block: 2rem;
|
||||
transition: transform 0.1s;
|
||||
}
|
||||
|
||||
.post-entry:first-of-type {
|
||||
margin-top: -2rem;
|
||||
}
|
||||
|
||||
.post-entry:active {
|
||||
transform: scale(0.99);
|
||||
}
|
||||
|
||||
.post-entry h2 {
|
||||
margin-bottom: 0.2rem;
|
||||
font-size: 3rem;
|
||||
}
|
||||
|
||||
.post-entry time {
|
||||
flex-shrink: 0;
|
||||
font-size: 1.7rem;
|
||||
color: var(--air);
|
||||
}
|
||||
|
||||
.post-entry a {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
}
|
||||
|
||||
/* Post single
|
||||
-------------------------------------------------- */
|
||||
.post-title {
|
||||
margin-bottom: calc(var(--y-gap) + 1rem);
|
||||
}
|
||||
|
||||
.post-title p {
|
||||
display: flex;
|
||||
margin-bottom: 1.5rem;
|
||||
font-size: 1.6rem;
|
||||
color: var(--air);
|
||||
transform: translateY(0.4rem);
|
||||
}
|
||||
|
||||
.post-title p span::before {
|
||||
content: '·';
|
||||
margin-inline: 0.8rem;
|
||||
}
|
||||
|
||||
.post-title h1 {
|
||||
font-size: 5rem;
|
||||
transform: translateX(-0.3rem);
|
||||
}
|
||||
|
||||
.post-tags {
|
||||
margin-top: 7rem;
|
||||
}
|
||||
|
||||
.post-tags a {
|
||||
display: inline-block;
|
||||
font-weight: 500;
|
||||
line-height: 5rem;
|
||||
color: var(--lit);
|
||||
background: rgba(var(--dark), 0.05);
|
||||
border-radius: 0.5rem;
|
||||
padding-inline: 2rem;
|
||||
}
|
||||
|
||||
.post-tags a + a {
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
|
||||
.post-nav {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-top: var(--y-gap);
|
||||
background: rgba(var(--dark), 0.05);
|
||||
border-radius: 0.5rem;
|
||||
}
|
||||
|
||||
.post-nav a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 50%;
|
||||
padding: var(--gap);
|
||||
font-size: 2.4rem;
|
||||
font-weight: 700;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.post-nav a span + span {
|
||||
margin-left: 1rem;
|
||||
}
|
||||
|
||||
.post-nav .prev {
|
||||
padding-right: 1rem;
|
||||
}
|
||||
|
||||
.post-nav .next {
|
||||
justify-content: flex-end;
|
||||
padding-left: 1rem;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.post-comments {
|
||||
margin-top: var(--y-gap);
|
||||
}
|
||||
|
||||
@media (max-width: 1199px) {
|
||||
.post-title {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.post-title aside {
|
||||
flex-direction: row;
|
||||
width: auto;
|
||||
padding-right: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
margin-left: 0;
|
||||
transform: none;
|
||||
}
|
||||
|
||||
.post-title aside span::before {
|
||||
content: '·';
|
||||
margin-inline: 0.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Post content
|
||||
-------------------------------------------------- */
|
||||
.post-content {
|
||||
font-size: 2.2rem;
|
||||
}
|
||||
|
||||
.post-content h1,
|
||||
.post-content h2,
|
||||
.post-content h3,
|
||||
.post-content h4,
|
||||
.post-content h5,
|
||||
.post-content h6 {
|
||||
margin-block: 2rem;
|
||||
}
|
||||
|
||||
.post-content h1 {
|
||||
margin-top: var(--y-gap);
|
||||
font-size: 4.5rem;
|
||||
}
|
||||
|
||||
.post-content h2 {
|
||||
margin-top: 6rem;
|
||||
font-size: 3.5rem;
|
||||
}
|
||||
|
||||
.post-content h3 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
.post-content h4 {
|
||||
font-size: 2.2rem;
|
||||
}
|
||||
|
||||
.post-content h5 {
|
||||
font-size: 1.8rem;
|
||||
}
|
||||
|
||||
.post-content h6 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.post-content img {
|
||||
margin-inline: auto;
|
||||
}
|
||||
|
||||
.post-content a {
|
||||
padding-bottom: 0.2rem;
|
||||
}
|
||||
|
||||
.post-content a:hover {
|
||||
border-bottom: 2px solid var(--link-color);
|
||||
}
|
||||
|
||||
.post-content a code {
|
||||
margin-inline: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.post-content del {
|
||||
text-decoration: none;
|
||||
background: linear-gradient(to right, var(--pro) 100%, transparent 0) 0 50% / 1px 1px repeat-x;
|
||||
}
|
||||
|
||||
.post-content p,
|
||||
.post-content ul,
|
||||
.post-content ol,
|
||||
.post-content dl,
|
||||
.post-content details {
|
||||
margin-bottom: 3rem;
|
||||
}
|
||||
|
||||
.post-content ul,
|
||||
.post-content ol {
|
||||
padding-left: 2.5rem;
|
||||
}
|
||||
|
||||
.post-content li {
|
||||
margin-top: 0.6rem;
|
||||
}
|
||||
|
||||
.post-content li p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.post-content dl {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.post-content dt {
|
||||
width: 25%;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.post-content dd {
|
||||
width: 75%;
|
||||
padding-left: 1.3rem;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.post-content dt ~ dt,
|
||||
.post-content dd ~ dd {
|
||||
margin-top: 1.3rem;
|
||||
}
|
||||
|
||||
.post-content table {
|
||||
margin-bottom: 4rem;
|
||||
}
|
||||
|
||||
.post-content table th,
|
||||
.post-content table:not(.highlighttable) td {
|
||||
min-width: 10rem;
|
||||
padding: 1.5rem 1rem;
|
||||
line-height: 1.5;
|
||||
border-bottom: 1px solid var(--fog);
|
||||
}
|
||||
|
||||
.post-content table th {
|
||||
font-size: 1.6rem;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.post-content table:not(.highlighttable) td code:only-of-type {
|
||||
margin-inline: 0;
|
||||
}
|
||||
|
||||
.post-content .highlight,
|
||||
.post-content pre {
|
||||
margin: 0 calc(var(--gap) * -1) 4rem;
|
||||
overflow-x: auto;
|
||||
background: var(--hljs-bg) !important;
|
||||
border-radius: 0.5rem;
|
||||
}
|
||||
|
||||
.post-content ul pre {
|
||||
margin-left: calc(var(--gap) * -2);
|
||||
}
|
||||
|
||||
.post-content .highlight pre {
|
||||
margin-inline: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* table */
|
||||
.post-content .highlighttable {
|
||||
table-layout: fixed;
|
||||
}
|
||||
|
||||
.post-content .highlighttable td:first-of-type {
|
||||
width: 5rem;
|
||||
}
|
||||
|
||||
.post-content .highlighttable td .linenodiv {
|
||||
padding-right: 0 !important;
|
||||
}
|
||||
|
||||
.post-content .highlighttable td .linenodiv pre,
|
||||
.post-content .highlighttable td .highlight {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.post-content .highlighttable td .highlight pre code::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* inline */
|
||||
.post-content .highlight span {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.post-content code {
|
||||
padding: 0.5rem 1rem;
|
||||
margin-inline: 0.5rem;
|
||||
font-family: Menlo, Monaco, 'Courier New', Courier, monospace;
|
||||
font-size: 0.8em;
|
||||
line-height: 1.5;
|
||||
background: rgba(var(--dark), 0.06);
|
||||
border-radius: 0.3rem;
|
||||
}
|
||||
|
||||
.post-content pre code {
|
||||
display: block;
|
||||
padding: var(--gap);
|
||||
margin-inline: 0;
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
background: transparent;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.post-content blockquote {
|
||||
padding: 0 0 0 calc(var(--gap) - 0.4rem);
|
||||
margin: 0 0 0 calc(var(--gap) * -1);
|
||||
border-left: 0.4rem solid var(--pro);
|
||||
}
|
||||
|
||||
.post-content hr {
|
||||
height: 1px;
|
||||
background: var(--fog);
|
||||
border: 0;
|
||||
margin-block: 12rem;
|
||||
}
|
||||
|
||||
.post-content iframe {
|
||||
width: 100%;
|
||||
background: var(--black);
|
||||
}
|
||||
|
||||
/* Footer
|
||||
-------------------------------------------------- */
|
||||
.footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
max-width: var(--narrow);
|
||||
height: var(--footer);
|
||||
padding-bottom: var(--safe-bottom);
|
||||
margin-top: auto;
|
||||
font-size: 1.6rem;
|
||||
color: var(--lit);
|
||||
border-top: 1px solid var(--fog);
|
||||
}
|
||||
|
||||
.footer p + p::before {
|
||||
content: '·';
|
||||
margin-inline: 0.6rem;
|
||||
}
|
||||
|
||||
.footer a:hover {
|
||||
color: var(--pro);
|
||||
border-bottom: 1px solid var(--pro);
|
||||
}
|
||||
|
||||
/* 404
|
||||
-------------------------------------------------- */
|
||||
.title-404 {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
padding-bottom: 8rem;
|
||||
font-size: 16rem;
|
||||
}
|
||||
41
assets/home.css
Normal file
41
assets/home.css
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
/* home.css */
|
||||
|
||||
.main h1,
|
||||
.main h2,
|
||||
.main h3 {
|
||||
margin-top: 5rem;
|
||||
margin-bottom: 0.7rem;
|
||||
}
|
||||
|
||||
.main h1:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.main a {
|
||||
color: var(--link-color);
|
||||
}
|
||||
|
||||
.main a:hover {
|
||||
border-bottom: 2px solid var(--link-color);
|
||||
}
|
||||
|
||||
.main h1 {
|
||||
font-size: 5rem;
|
||||
}
|
||||
|
||||
.main h2 {
|
||||
font-size: 3rem;
|
||||
}
|
||||
|
||||
#homepage-content {
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
.main p:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.main p,
|
||||
.main ul {
|
||||
margin-top: 1.5rem;
|
||||
}
|
||||
38
assets/style.css
Normal file
38
assets/style.css
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
/* Place custom css here. */
|
||||
|
||||
figure {
|
||||
padding: 6px;
|
||||
border: 1px solid var(--fog);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
img {
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.draft {
|
||||
text-transform: uppercase;
|
||||
font-size: 80%;
|
||||
color: white;
|
||||
font-weight: 800;
|
||||
/*border: 2px solid #aaa;*/
|
||||
border-radius: 4px;
|
||||
padding: 0.2rem 0.8rem;
|
||||
margin-left: 0.5rem;
|
||||
background-color: #aaa;
|
||||
}
|
||||
|
||||
.flex-date {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
}
|
||||
|
||||
.flex-date .date {
|
||||
margin-left: auto;
|
||||
font-size: 80%;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.post-content a {
|
||||
color: var(--link-color);
|
||||
}
|
||||
37
config.toml
Normal file
37
config.toml
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
baseURL = 'https://erynwells.me/'
|
||||
languageCode = 'en-us'
|
||||
title = 'Erynwells.me'
|
||||
theme = 'paper'
|
||||
defaultContentLanguage = 'en'
|
||||
|
||||
[author]
|
||||
name = 'Eryn Wells'
|
||||
|
||||
[languages]
|
||||
[languages.en]
|
||||
weight = 1
|
||||
[languages.es]
|
||||
weight = 2
|
||||
|
||||
[menu]
|
||||
[[menu.main]]
|
||||
identifier = 'posts'
|
||||
name = 'Posts'
|
||||
url = '/posts/'
|
||||
[[menu.main]]
|
||||
identifier = 'resume'
|
||||
name = 'Résumé'
|
||||
url = '/resume/'
|
||||
|
||||
[params]
|
||||
twitter = 'erynofwales'
|
||||
github = 'erynofwales'
|
||||
instagram = 'erynofwales'
|
||||
|
||||
[permalinks]
|
||||
posts = 'posts/:year/:month/:title/'
|
||||
|
||||
[taxonomies]
|
||||
category = 'categories'
|
||||
series = 'series'
|
||||
tag = 'tags'
|
||||
50
content/_index.es.md
Normal file
50
content/_index.es.md
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
# Hola! 👋🏻
|
||||
|
||||
Soy Eryn. Mis pronombres son [ella/ella][p]. Esta es me página personal. Bienvenide.
|
||||
|
||||
## Personal
|
||||
|
||||
Soy una mujer trans y queer. Vivo en San Francisco con mis [dos gatos][cats]. Nací en Seattle, WA, y crecía en Phoenix, AZ. Asistí [Oberlin College][ob] donde obtuve un títolo en informática. {{< tess >}} es mi novia.
|
||||
|
||||
Mi lengua nativa es inglés, y también hablo español pero siempre necesito practicar más.
|
||||
|
||||
## Pasatiemos
|
||||
|
||||
Tengo un gran apetito por probar y aprender pasatiemos nuevas, especialmente las
|
||||
que combinan varias de mis intereses o que me alejan de la computadora.
|
||||
|
||||
He sido música para el gran parte de mi vida. Empezé tocar el piano cuando tuve
|
||||
siete años, toqué la trompeta en colegio, y he tocado algunos otros instrumentos
|
||||
por el camino. Todavía toco el piano, pero mi obsesión musical hoy en día es mi
|
||||
sintetizador modular. De vez en cuando, grabo música y espero compartirla aquí,
|
||||
en este sitio. Por el momento, puedes escuchar mi música en [Bandcamp][bc] o
|
||||
[SoundCloud][sc].
|
||||
|
||||
Otros pasatiempos de los años recients incluyen: cerámica, caligrafía, tejido,
|
||||
horneado pan, ciclismo, fotografía, y astronomía. ¿Uno no puede tener demasiados
|
||||
pasatiemos, de verdad?
|
||||
|
||||
## Trabajo
|
||||
|
||||
He trabajado como ingeniera de software desde 2011 por varias companías basadas
|
||||
en San Francisco y Silicon Valley. Hace seis años que he trabajado en Apple,
|
||||
primero en el equipo iOS Accessibility, y ahora en el equipo Authentication
|
||||
Experience.
|
||||
|
||||
Echa un vistazo a mi [resumen][r] para más detalles.
|
||||
|
||||
## Decirme Hola
|
||||
|
||||
Puedes encontrarme en muchos rincones del Internet. Estoy más activa en
|
||||
[Twitter][t] y [Instagram][i]. Publico música en [SoundCloud][sc] y
|
||||
[Bandcamp][bc]. Y para los proyectos de software, estoy en [GitHub][gh].
|
||||
|
||||
[p]: http://pronoun.is/she
|
||||
[cats]: {{< ref "/cats" >}}
|
||||
[ob]: https://www.oberlin.edu
|
||||
[r]: {{< ref "/resume" >}}
|
||||
[t]: https://twitter.com/erynofwales
|
||||
[i]: https://www.instagram.com/erynofwales/
|
||||
[sc]: https://soundcloud.com/purlsnbeeps
|
||||
[bc]: https://erynwells.bandcamp.com/releases
|
||||
[gh]: https://github.com/erynofwales
|
||||
57
content/_index.md
Normal file
57
content/_index.md
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
# Hi! 👋🏻
|
||||
|
||||
I'm Eryn. My pronouns are [she/her][p]. This is my personal page. Welcome!
|
||||
|
||||
## Personal
|
||||
|
||||
I'm a queer trans woman. I live in San Francisco with my [two cats][cats]. I was
|
||||
born in Seattle, WA and grew up in Phoenix, AZ. I attended [Oberlin College][ob]
|
||||
where I got a degree in Computer Science. {{< tess >}} is my girlfriend.
|
||||
|
||||
I speak English natively, and Spanish too, though I always need more practice.
|
||||
|
||||
## Hobbies
|
||||
|
||||
I have a big appetite for learning new skills, especially things that combine
|
||||
multiple of my interests or get me away from my computer.
|
||||
|
||||
I've been a musician for most of my life. I started on the piano at age seven,
|
||||
played trumpet in high school, and have picked up a smattering of other
|
||||
instruments along the way. I still play piano occasionally, but my current
|
||||
musical obsession is my modular synthesizer. I occasionally record things, and
|
||||
I'm hoping to share them here on this site, but for now, they're on
|
||||
[SoundCloud][sc] and [Bandcamp][bc].
|
||||
|
||||
I do try to spend my non-work time away from the computer, but every so often I
|
||||
get inspired to hack on something. Those projects usually end up on
|
||||
[GitHub][gh].
|
||||
|
||||
Other things I've picked up over the years include: ceramics, calligraphy,
|
||||
knitting, bread baking, bicycling, photography, and astronomy. You can never
|
||||
have too many hobbies, right?
|
||||
|
||||
## Professional
|
||||
|
||||
I've worked as a software engineer since 2011 for a variety of companies around
|
||||
the San Francisco Bay Area. I've been at Apple since early 2016, first on the
|
||||
iOS Accessibility team, and now on the Authentication Experience team.
|
||||
|
||||
Check out my [résumé][r] for more details.
|
||||
|
||||
## Say Hello
|
||||
|
||||
You can find me in lots of other corners of the Internet. I'm most active on
|
||||
[Twitter][t] and [Instagram][i]. I post music on [SoundCloud][sc] and
|
||||
[Bandcamp][bc]. I'm on [GitHub][gh] for coding projects. You can also send me an
|
||||
[email][eml].
|
||||
|
||||
[p]: http://pronoun.is/she
|
||||
[cats]: {{< ref "/cats" >}}
|
||||
[ob]: https://www.oberlin.edu
|
||||
[r]: {{< ref "/resume" >}}
|
||||
[t]: https://twitter.com/erynofwales
|
||||
[i]: https://www.instagram.com/erynofwales/
|
||||
[sc]: https://soundcloud.com/purlsnbeeps
|
||||
[bc]: https://erynwells.bandcamp.com/releases
|
||||
[gh]: https://github.com/erynofwales
|
||||
[eml]: mailto:Eryn%20Wells<eryn@erynwells.me>
|
||||
BIN
content/cats/images/ash_closeup.jpg
Normal file
BIN
content/cats/images/ash_closeup.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 341 KiB |
BIN
content/cats/images/rowan_chair.jpg
Normal file
BIN
content/cats/images/rowan_chair.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 297 KiB |
18
content/cats/index.es.md
Normal file
18
content/cats/index.es.md
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
title: "Cats"
|
||||
date: 2021-10-01T23:14:56-07:00
|
||||
draft: false
|
||||
type: simple
|
||||
---
|
||||
|
||||
Here's the thing: cats are really, really good. Like just the very best.
|
||||
|
||||
I have two of them: Ash, a brown tabby, and Rowan, a black. They are
|
||||
littermates, and they've been with me since 2016.
|
||||
|
||||
I adopted them from [Whis-purr](https://www.whis-purr.org), a great shelter and
|
||||
rescue agency for cats based in San Carlos, CA.
|
||||
|
||||
{{< figure src="images/ash_closeup.jpg" >}}
|
||||
|
||||
{{< figure src="images/rowan_chair.jpg" >}}
|
||||
18
content/cats/index.md
Normal file
18
content/cats/index.md
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
title: "Cats"
|
||||
date: 2021-10-01T23:14:56-07:00
|
||||
draft: false
|
||||
type: simple
|
||||
---
|
||||
|
||||
Here's the thing: cats are really, really good. Like just the very best.
|
||||
|
||||
I have two of them: Ash, a brown tabby, and Rowan, a black. They are
|
||||
littermates, and they've been with me since 2016.
|
||||
|
||||
I adopted them from [Whis-purr](https://www.whis-purr.org), a great shelter and
|
||||
rescue agency for cats based in San Carlos, CA.
|
||||
|
||||
{{< figure src="images/ash_closeup.jpg" >}}
|
||||
|
||||
{{< figure src="images/rowan_chair.jpg" >}}
|
||||
91
content/posts/2020/10/boot-raspberry-pi-over-tftp.md
Normal file
91
content/posts/2020/10/boot-raspberry-pi-over-tftp.md
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
---
|
||||
title: "Booting a Raspberry Pi Over TFTP"
|
||||
date: 2020-10-13T08:31:52-07:00
|
||||
draft: true
|
||||
series: ["Raspberry Pi OS Development"]
|
||||
tags: ["Tech"]
|
||||
---
|
||||
|
||||
In order to do this, I modified the [EEPROM bootloader][eeprom] bootloader
|
||||
according to the instructions in the Raspberry Pi documentation. That page is
|
||||
also on [GitHub][eeprom-gh] which might be a more stable location. On Raspbian
|
||||
on the RPi:
|
||||
|
||||
```bash
|
||||
fw=/lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-09-03.bin
|
||||
rpi-eeprom-config $fw > ~/bootconf.txt
|
||||
vi ~/bootconf.txt
|
||||
rpi-eeprom-config --out ~/pieeprom-new.bin --config ~/bootconf.txt $fw
|
||||
sudo rpi-eeprom-update -d -f ~/pieeprom-new.bin
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
My updated bootconf.txt is:
|
||||
|
||||
```conf
|
||||
[all]
|
||||
BOOT_UART=1
|
||||
WAKE_ON_GPIO=0
|
||||
POWER_OFF_ON_HALT=0
|
||||
DHCP_TIMEOUT=45000
|
||||
DHCP_REQ_TIMEOUT=4000
|
||||
TFTP_FILE_TIMEOUT=30000
|
||||
ENABLE_SELF_UPDATE=1
|
||||
DISABLE_HDMI=0
|
||||
BOOT_ORDER=0xf412
|
||||
```
|
||||
|
||||
I enabled UART debugging, and set the boot order to be: network `0x2`, SD card
|
||||
`0x1`, USB mass storage `0x4`, and finally reboot `0xf`. These steps need to be
|
||||
repeated if the bootloader is updated via apt.
|
||||
|
||||
I [enabled the TFTP server][mac-tftp] on my Mac:
|
||||
|
||||
```bash
|
||||
sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist
|
||||
sudo launchctl enable System/com.apple.tftpd
|
||||
sudo launchctl start com.apple.tftpd
|
||||
```
|
||||
|
||||
I’m not sure if the `enable` command is actually necessary. This doesn't
|
||||
actually start the `tftpd` daemon. Instead, macOS starts the daemon on demand
|
||||
when it notices an incoming tftp request on the network. Don't be alarmed!
|
||||
|
||||
The tftp server looks for files to serve out of **/private/tftpboot**, and those
|
||||
things need to be world `rwx`, i.e. `777`. By default (this is configurable) the
|
||||
RPi queries for a directory named by its serial number.
|
||||
|
||||
```bash
|
||||
mkdir /private/tftpboot/$raspberry_pi_serial
|
||||
chmod 777 /private/tftpboot
|
||||
chmod -R 777 /private/tftpboot/*
|
||||
```
|
||||
|
||||
RPi looks for files of various names in that directory, one in particular by the
|
||||
name of **start.elf**.
|
||||
|
||||
Next, I had to update my Ubiquiti router's DHCP server configuration (on the
|
||||
command line) to pass a `tftp-server` parameter in the DHCP payload. This step
|
||||
may be optional because you can also set `TFTP_IP` in the **bootconf.txt** above
|
||||
to specify the IP directly. On my router:
|
||||
|
||||
```bash
|
||||
configure
|
||||
set service dhcp-server shared-network-name LAN subnet $lan_cidr_subnet tftp-server-name $ip_of_mac
|
||||
commit
|
||||
save
|
||||
exit
|
||||
```
|
||||
|
||||
I also gave my Mac a static IP, and renewed the DHCP lease so it took the new IP
|
||||
to make the whole process a little more smooth. Now, it appears the RPi will
|
||||
attempt a TFTP boot, and I see queries in the logs on my Mac.
|
||||
|
||||
## Further Reading
|
||||
|
||||
* [Hackaday's Raspberry Pi Boot Sequence Guide](https://hackaday.io/page/6372-raspberry-pi-4-boot-sequence)
|
||||
* [Linuxhit Guide to Booting a Raspberry Pi with PXE](https://linuxhit.com/raspberry-pi-pxe-boot-netbooting-a-pi-4-without-an-sd-card/)
|
||||
|
||||
[eeprom]: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md
|
||||
[eeprom-gh]: https://github.com/raspberrypi/documentation/blob/master/hardware/raspberrypi/bcm2711_bootloader_config.md
|
||||
[mac-tftp]: https://www.unixfu.ch/start-a-tftp-server-on-your-mac/
|
||||
BIN
content/posts/2021/09/nihonmachi/images/buchanan.jpg
Normal file
BIN
content/posts/2021/09/nihonmachi/images/buchanan.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.8 MiB |
BIN
content/posts/2021/09/nihonmachi/images/ramen.jpg
Normal file
BIN
content/posts/2021/09/nihonmachi/images/ramen.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.2 MiB |
44
content/posts/2021/09/nihonmachi/index.md
Normal file
44
content/posts/2021/09/nihonmachi/index.md
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
---
|
||||
title: "日本町"
|
||||
slug: "nihonmachi"
|
||||
date: 2021-09-27T08:08:59-07:00
|
||||
draft: false
|
||||
resources:
|
||||
- src: images/buchanan.jpg
|
||||
title: Buchanan Street Pedestrian Alley
|
||||
- src: images/ramen.jpg
|
||||
title: A bowl of ramen from Marufuku
|
||||
tags: ["Travel"]
|
||||
---
|
||||
|
||||
{{< figure src="images/buchanan.jpg" >}}
|
||||
|
||||
This past weekend, {{< tess >}} and I took a short, one-night staycation in San
|
||||
Francisco's Japantown. With all the flurry of things happening in our lives, it
|
||||
was so great to get away from home for a short time and relax.
|
||||
|
||||
We stayed at the [Hotel Kabuki][hk], a historic hotel in Japantown, and booked
|
||||
time at the [Kabuki Springs][ks] bath on Sunday afternoon. We sat in the warm
|
||||
bath, dunked in the freezing cold pool, sat in the sauna and steam room, and
|
||||
lounged on the beds around the pools. The lights were low, the music was chill,
|
||||
and it was so good to disconnect. This was my first experience in a communal
|
||||
bath, and I left feeling like I wanted to go every weekend. (Tess and I are now
|
||||
considering memberships.)
|
||||
|
||||
One of the wonderful things about a clothing-optional communal bath is the wide
|
||||
variety of bodies you see. It was a great reminder of how diverse we are, and
|
||||
how broad the definition of "woman's body" can be. I can't say for sure if Tess
|
||||
and I were the only trans women there, but I think both of us came to feeling
|
||||
like just one of the women there to enjoy the baths -- not out of place or
|
||||
strange at all. It was a really great feeling.
|
||||
|
||||
We spent the rest of our time in 日本町 wandering the shops in Japan Center,
|
||||
walking around the neighborhood, eating, and relaxing. For only being just over
|
||||
24 hours away from home, I was impressed how much it felt like a real vacation.
|
||||
|
||||
Tess also [wrote](https://tess.oconnor.cx/2021/09/japantown) about our trip.
|
||||
|
||||
{{< figure src="images/ramen.jpg" >}}
|
||||
|
||||
[hk]: https://www.jdvhotels.com/hotels/california/san-francisco/hotel-kabuki
|
||||
[ks]: https://kabukisprings.com
|
||||
64
content/resume.es.md
Normal file
64
content/resume.es.md
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
---
|
||||
title: "Résumé"
|
||||
date: 2021-09-29T20:40:09-07:00
|
||||
draft: true
|
||||
type: resume
|
||||
---
|
||||
|
||||
## Experience
|
||||
|
||||
{{< resume_section company="Apple" team="Authentication Experience" from=2019 >}}
|
||||
|
||||
- Presented a video at WWDC 2021 called [Secure login with iCloud Keychain
|
||||
verification codes][wwdc21-totp-video], describing security codes, how they
|
||||
improve password-based authentication, and how to use the new verification code
|
||||
feature of the Password Manager on iOS and macOS
|
||||
- Designed and built one-time verification codes for the Password Manager on iOS
|
||||
and macOS
|
||||
|
||||
{{< resume_section company="Apple" team="iOS Accessibility" from=2016 to=2019 >}}
|
||||
|
||||
- Engineering point of contact for accessibility of SpringBoard and Messages on
|
||||
iOS, and the Braille Screen Input feature of VoiceOver
|
||||
- Implemented new guidance features in iOS 13's Camera to assist VoiceOver users
|
||||
with taking better, more artistic photos
|
||||
- Participated in developer outreach at WWDC and onsite events to promote the
|
||||
value of making software accessible and answer developer questions
|
||||
|
||||
{{< resume_section company="Lumos Labs" team="Lumosity iOS" from=2014 to=2016 >}}
|
||||
|
||||
- Migrated from a proprietary navigation implementation in C++ to UIKit
|
||||
components and established patterns for further development
|
||||
- Authored process document describing our code review and QA approval process
|
||||
for patches
|
||||
- Implemented 1v1 competition feature, which had a greater than 50% engagement
|
||||
rate
|
||||
|
||||
{{< resume_section company="VMware" team="Fusion" from=2012 to=2014 >}}
|
||||
|
||||
- Restructured keyboard input handling to improve code architecture and
|
||||
accommodate multiple clients of our OS X UI library
|
||||
- Redesigned outdated first-run and trial experiences to improve initial
|
||||
impressions, and make it easier to try Fusion
|
||||
- Exposed Cocoa configuration UI for a USB device arbitration library written in
|
||||
C (through our platform-independent C++ library, and OS X-specific Objective-C
|
||||
library)
|
||||
|
||||
{{< resume_section company="VMware" team="View Desktop Infrastructure" from=2011 to=2012 >}}
|
||||
|
||||
- Engineered an extensive rewrite of VDT to incorporate a new deployment backend
|
||||
relying on VMware vCloud Director, and to allow greater flexibility in how
|
||||
deployments are created
|
||||
- Implemented stabilization fixes in the View Deployment Tool (VDT), which is
|
||||
responsible for deploying instances of the View product during automated
|
||||
testing
|
||||
- Completed and stabilized system tests designed to exercise several of View’s
|
||||
provisioning features
|
||||
|
||||
## Education
|
||||
|
||||
{{< resume_flex 2010 >}}
|
||||
Oberlin College, BA in Computer Science with Honors
|
||||
{{< /resume_flex >}}
|
||||
|
||||
[wwdc21-totp-video]: https://developer.apple.com/videos/play/wwdc2021/10105/
|
||||
64
content/resume.md
Normal file
64
content/resume.md
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
---
|
||||
title: "Résumé"
|
||||
date: 2021-09-29T20:40:09-07:00
|
||||
draft: true
|
||||
type: resume
|
||||
---
|
||||
|
||||
## Experience
|
||||
|
||||
{{< resume_section company="Apple" team="Authentication Experience" from=2019 >}}
|
||||
|
||||
- Presented a video at WWDC 2021 called [Secure login with iCloud Keychain
|
||||
verification codes][wwdc21-totp-video], describing security codes, how they
|
||||
improve password-based authentication, and how to use the new verification code
|
||||
feature of the Password Manager on iOS and macOS
|
||||
- Designed and built one-time verification codes for the Password Manager on iOS
|
||||
and macOS
|
||||
|
||||
{{< resume_section company="Apple" team="iOS Accessibility" from=2016 to=2019 >}}
|
||||
|
||||
- Engineering point of contact for accessibility of SpringBoard and Messages on
|
||||
iOS, and the Braille Screen Input feature of VoiceOver
|
||||
- Implemented new guidance features in iOS 13's Camera to assist VoiceOver users
|
||||
with taking better, more artistic photos
|
||||
- Participated in developer outreach at WWDC and onsite events to promote the
|
||||
value of making software accessible and answer developer questions
|
||||
|
||||
{{< resume_section company="Lumos Labs" team="Lumosity iOS" from=2014 to=2016 >}}
|
||||
|
||||
- Migrated from a proprietary navigation implementation in C++ to UIKit
|
||||
components and established patterns for further development
|
||||
- Authored process document describing our code review and QA approval process
|
||||
for patches
|
||||
- Implemented 1v1 competition feature, which had a greater than 50% engagement
|
||||
rate
|
||||
|
||||
{{< resume_section company="VMware" team="Fusion" from=2012 to=2014 >}}
|
||||
|
||||
- Restructured keyboard input handling to improve code architecture and
|
||||
accommodate multiple clients of our OS X UI library
|
||||
- Redesigned outdated first-run and trial experiences to improve initial
|
||||
impressions, and make it easier to try Fusion
|
||||
- Exposed Cocoa configuration UI for a USB device arbitration library written in
|
||||
C (through our platform-independent C++ library, and OS X-specific Objective-C
|
||||
library)
|
||||
|
||||
{{< resume_section company="VMware" team="View Desktop Infrastructure" from=2011 to=2012 >}}
|
||||
|
||||
- Engineered an extensive rewrite of VDT to incorporate a new deployment backend
|
||||
relying on VMware vCloud Director, and to allow greater flexibility in how
|
||||
deployments are created
|
||||
- Implemented stabilization fixes in the View Deployment Tool (VDT), which is
|
||||
responsible for deploying instances of the View product during automated
|
||||
testing
|
||||
- Completed and stabilized system tests designed to exercise several of View’s
|
||||
provisioning features
|
||||
|
||||
## Education
|
||||
|
||||
{{< resume_flex 2010 >}}
|
||||
Oberlin College, BA in Computer Science with Honors
|
||||
{{< /resume_flex >}}
|
||||
|
||||
[wwdc21-totp-video]: https://developer.apple.com/videos/play/wwdc2021/10105/
|
||||
8
erynwells-me.code-workspace
Normal file
8
erynwells-me.code-workspace
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "."
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
}
|
||||
26
layouts/_default/baseof.html
Normal file
26
layouts/_default/baseof.html
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ site.LanguageCode }}">
|
||||
{{ partial "head.html" . }}
|
||||
|
||||
<body class="not-ready" data-menu="{{ isset site.Menus `main` }}">
|
||||
{{ partial "header.html" . }}
|
||||
|
||||
<main class="main">{{ block "main" . }}{{ end }}</main>
|
||||
|
||||
{{ partial "footer.html" . }}
|
||||
</body>
|
||||
<script>
|
||||
let bodyClx = document.body.classList;
|
||||
let sysDark = window.matchMedia('(prefers-color-scheme: dark)');
|
||||
let darkVal = localStorage.getItem('dark');
|
||||
|
||||
let setDark = (isDark) => {
|
||||
bodyClx[isDark ? 'add' : 'remove']('dark');
|
||||
localStorage.setItem('dark', isDark ? 'yes' : 'no');
|
||||
};
|
||||
|
||||
setDark(darkVal ? darkVal === 'yes' : sysDark.matches);
|
||||
requestAnimationFrame(() => bodyClx.remove('not-ready'));
|
||||
sysDark.addEventListener('change', (event) => setDark(event.matches));
|
||||
</script>
|
||||
</html>
|
||||
11
layouts/_default/index.html
Normal file
11
layouts/_default/index.html
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{{ define "main" }}
|
||||
|
||||
{{ if .Title }}
|
||||
<h1 class="main-title">{{ .Title }}</h1>
|
||||
{{ end }}
|
||||
|
||||
<section id="homepage-content">
|
||||
{{ .Content }}
|
||||
</section>
|
||||
|
||||
{{ end }}
|
||||
34
layouts/_default/list.html
Normal file
34
layouts/_default/list.html
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
{{ define "main" }}
|
||||
|
||||
<!-- Main Title -->
|
||||
{{ if .Title }}
|
||||
<h1 class="main-title">{{ .Title }}</h1>
|
||||
{{ end }}
|
||||
|
||||
<!-- $pages -->
|
||||
{{ $pages := union .RegularPages .Sections }}
|
||||
<!---->{{ if .IsHome }} {{ $pages = where site.RegularPages "Type" "in" site.Params.mainSections }}
|
||||
{{ end }}
|
||||
|
||||
<!-- Articles -->
|
||||
{{ $paginator := .Paginate $pages }} {{ range $index, $page := $paginator.Pages }}
|
||||
<article class="post-entry">
|
||||
<h2>{{ .Title }}</h2>
|
||||
<time>{{ .Date | time.Format ":date_medium" }}</time>
|
||||
<a href="{{ .Permalink }}"></a>
|
||||
</article>
|
||||
{{ end }}
|
||||
|
||||
<!-- Main Nav -->
|
||||
{{ if gt $paginator.TotalPages 1 }}
|
||||
<nav class="main-nav">
|
||||
{{ if $paginator.HasPrev }}
|
||||
<a class="prev" href="{{ $paginator.Prev.URL }}">← {{ i18n "prev_page" }}</a>
|
||||
{{ end }}<!---->
|
||||
{{ if $paginator.HasNext }}
|
||||
<a class="next" href="{{ $paginator.Next.URL }}">{{ i18n "next_page" }} →</a>
|
||||
{{ end }}
|
||||
</nav>
|
||||
{{ end }}<!---->
|
||||
|
||||
{{ end }}
|
||||
49
layouts/_default/single.html
Normal file
49
layouts/_default/single.html
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
{{ define "main" }}
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-title">
|
||||
<p>
|
||||
<time>{{ .Date | time.Format ":date_medium" }}</time>
|
||||
{{ if or .Params.Author site.Author.name }}
|
||||
<span>{{ .Params.Author | default site.Author.name }}</span>
|
||||
{{ end }}
|
||||
</p>
|
||||
<h1>{{ .Title }}</h1>
|
||||
</header>
|
||||
<section class="post-content">{{ .Content }}</section>
|
||||
|
||||
<!-- Post Tags -->
|
||||
{{ if .Params.tags }}
|
||||
<footer class="post-tags">
|
||||
{{ range .Params.tags }} {{ $href := print (absURL "tags/") (urlize .) }}
|
||||
<a href="{{ $href }}">{{ . }}</a>
|
||||
{{ end }}
|
||||
</footer>
|
||||
{{ end }}
|
||||
|
||||
<!-- Post Nav -->
|
||||
{{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}<!---->
|
||||
{{ if and (gt (len $pages) 1) (in $pages . ) }}
|
||||
<nav class="post-nav">
|
||||
{{ with $pages.Next . }}
|
||||
<a class="prev" href="{{ .Permalink }}"><span>←</span><span>{{ .Name }}</span></a>
|
||||
{{ end }} {{ with $pages.Prev . }}
|
||||
<a class="next" href="{{ .Permalink }}"><span>{{ .Name }}</span><span>→</span></a>
|
||||
{{ end }}
|
||||
</nav>
|
||||
{{ end }}
|
||||
|
||||
<!-- Disqus -->
|
||||
{{ if and site.DisqusShortname (not (eq .Params.comments false)) }}
|
||||
<div id="disqus_thread" class="post-comments"></div>
|
||||
<script>
|
||||
var disqusShortname = '{{ site.DisqusShortname }}';
|
||||
var script = document.createElement('script');
|
||||
script.src = 'https://' + disqusShortname + '.disqus.com/embed.js';
|
||||
script.setAttribute('data-timestamp', +new Date());
|
||||
document.head.appendChild(script);
|
||||
</script>
|
||||
{{ end }}
|
||||
</article>
|
||||
|
||||
{{ end }}
|
||||
6
layouts/partials/footer.html
Normal file
6
layouts/partials/footer.html
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<footer class="footer">
|
||||
<p>© <time datetime="{{ now.Year }}">{{ now.Year }}</time> <a href="{{ `` | absURL }}">Eryn Wells</a></p>
|
||||
<p>Trans rights.</p>
|
||||
<p>Black lives matter.</p>
|
||||
<p>Get the vaccine.</p>
|
||||
</footer>
|
||||
76
layouts/partials/head.html
Normal file
76
layouts/partials/head.html
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
|
||||
|
||||
<!-- Title -->
|
||||
<title>{{ if not .IsHome }}{{ .Title }} - {{ end }}{{ site.Title }}</title>
|
||||
|
||||
<!-- Meta -->
|
||||
{{ if eq .Kind "page" }}
|
||||
<meta name="description" content="{{ .Summary }}" />
|
||||
<meta name="author" content="{{ .Params.Author | default site.Author.name }}" />
|
||||
{{ else }}
|
||||
<meta name="description" content="{{ site.Params.description }}" />
|
||||
<meta name="author" content="{{ site.Author.name }}" />
|
||||
{{ end }}
|
||||
|
||||
<!-- Styles & Scripts -->
|
||||
{{ $app_css := resources.Get "app.css" }}
|
||||
{{ $custom_css := resources.Get "style.css" }}
|
||||
{{ $css := slice $app_css $custom_css | resources.Concat "app.css" | minify }}
|
||||
<link rel="preload stylesheet" as="style" href="{{ $css.Permalink }}" />
|
||||
|
||||
{{ if .IsHome }}
|
||||
{{ $home_css := resources.Get "home.css" }}
|
||||
<link rel="preload stylesheet" as="style" href="{{ $home_css.Permalink }}" />
|
||||
{{ end }}
|
||||
|
||||
{{ if and .IsPage (not site.Params.disableHLJS) }}
|
||||
<link rel="preload stylesheet" as="style" href="{{ `an-old-hope.min.css` | absURL }}" />
|
||||
<script
|
||||
defer
|
||||
src="{{ `highlight.min.js` | absURL }}"
|
||||
onload="hljs.initHighlightingOnLoad();"
|
||||
></script>
|
||||
{{ end }}
|
||||
|
||||
<!-- Preload -->
|
||||
<link rel="preload" as="image" href="{{ `theme.png` | absURL }}" />
|
||||
|
||||
{{ range $.Scratch.Get "social-list" }}
|
||||
<link rel="preload" as="image" href="{{ printf `%s.svg` . | absURL }}" />
|
||||
{{ end }}
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="icon" href="{{ `favicon.ico` | absURL }}" />
|
||||
<link rel="apple-touch-icon" href="{{ `apple-touch-icon.png` | absURL }}" />
|
||||
|
||||
<!-- Generator -->
|
||||
{{ hugo.Generator }}
|
||||
|
||||
<!-- RSS -->
|
||||
{{ range .AlternativeOutputFormats }}
|
||||
<link
|
||||
rel="{{ .Rel }}"
|
||||
type="{{ .MediaType.Type }}"
|
||||
href="{{ .Permalink }}"
|
||||
title="{{ site.Title }}"
|
||||
/>
|
||||
{{ end }}
|
||||
|
||||
<!-- Misc -->
|
||||
{{ if or hugo.IsProduction (eq site.Params.env "production") }}
|
||||
<!---->
|
||||
{{ template "_internal/google_analytics_async.html" . }}
|
||||
<!---->
|
||||
{{ template "_internal/google_news.html" . }}
|
||||
<!---->
|
||||
{{ template "_internal/opengraph.html" . }}
|
||||
<!---->
|
||||
{{ template "_internal/schema.html" . }}
|
||||
<!---->
|
||||
{{ template "_internal/twitter_cards.html" . }}
|
||||
<!---->
|
||||
{{ end }}
|
||||
</head>
|
||||
26
layouts/partials/header.html
Normal file
26
layouts/partials/header.html
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<header class="header">
|
||||
<h1 class="logo">
|
||||
<a class="site-name" href="{{ `` | absURL }}">{{ site.Title }}</a>
|
||||
</h1>
|
||||
|
||||
{{ $url := .RelPermalink }}<!---->
|
||||
{{ with site.Menus.main }}
|
||||
<nav class="menu">
|
||||
{{ range . }}
|
||||
<a class="{{ if eq .URL $url }}active{{ end }}" href="{{ .URL }}">{{ .Name }}</a>
|
||||
{{ end }}
|
||||
</nav>
|
||||
{{ end }}<!---->
|
||||
|
||||
<nav class="social">
|
||||
<a style="--url: url(./twitter.svg)"
|
||||
href="https://twitter.com/erynofwales"
|
||||
target="_blank"><span>tw</span></a>
|
||||
<a style="--url: url(./github.svg)"
|
||||
href="https://github.com/erynofwales"
|
||||
target="_blank"><span>gh</span></a>
|
||||
<a style="--url: url(./instagram.svg)"
|
||||
href="https://instagram.com/erynofwales"
|
||||
target="_blank"><span>ig</span></a>
|
||||
</nav>
|
||||
</header>
|
||||
25
layouts/resume/single.html
Normal file
25
layouts/resume/single.html
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
{{ define "main" }}
|
||||
|
||||
<article id="resume" class="post-single">
|
||||
<header class="post-title">
|
||||
<h1>{{ .Title }}</h1>
|
||||
</header>
|
||||
|
||||
<section class="post-content">
|
||||
{{ .Content }}
|
||||
</section>
|
||||
|
||||
<!-- Post Nav -->
|
||||
{{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}<!---->
|
||||
{{ if and (gt (len $pages) 1) (in $pages . ) }}
|
||||
<nav class="post-nav">
|
||||
{{ with $pages.Next . }}
|
||||
<a class="prev" href="{{ .Permalink }}"><span>←</span><span>{{ .Name }}</span></a>
|
||||
{{ end }} {{ with $pages.Prev . }}
|
||||
<a class="next" href="{{ .Permalink }}"><span>{{ .Name }}</span><span>→</span></a>
|
||||
{{ end }}
|
||||
</nav>
|
||||
{{ end }}
|
||||
</article>
|
||||
|
||||
{{ end }}
|
||||
1
layouts/shortcodes/anagram.html
Normal file
1
layouts/shortcodes/anagram.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
<span class="anagram" data-replacement="{{ with .Get 1 }}{{ . }}{{ end }}">{{ with .Get 0 }}{{ . }}{{ end }}</span>
|
||||
27
layouts/shortcodes/recent_posts.html
Normal file
27
layouts/shortcodes/recent_posts.html
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<ul>
|
||||
{{ $pages := union .Site.RegularPages .Site.Sections }}
|
||||
{{ if .Page.IsHome }}
|
||||
{{ $pages = where site.RegularPages "Type" "in" site.Params.mainSections }}
|
||||
{{ end }}
|
||||
{{ $paginator := .Page.Paginate $pages }}
|
||||
{{ range $index, $page := $paginator.Pages }}
|
||||
<li>
|
||||
<a href="{{ .Permalink }}">{{ .Title }}</a> —
|
||||
<time datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date | time.Format ":date_medium" }}</time>
|
||||
{{ if $page.Draft }}
|
||||
<span class="draft">draft</span>
|
||||
{{ end }}
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
|
||||
{{ if gt $paginator.TotalPages 1 }}
|
||||
<nav class="main-nav">
|
||||
{{ if $paginator.HasPrev }}
|
||||
<a class="prev" href="{{ $paginator.Prev.URL }}">← {{ i18n "prev_page" }}</a>
|
||||
{{ end }}
|
||||
{{ if $paginator.HasNext }}
|
||||
<a class="next" href="{{ $paginator.Next.URL }}">{{ i18n "next_page" }} →</a>
|
||||
{{ end }}
|
||||
</nav>
|
||||
{{ end }}
|
||||
18
layouts/shortcodes/resume_flex.html
Normal file
18
layouts/shortcodes/resume_flex.html
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<header class="flex-date">
|
||||
{{ .Inner }}
|
||||
<span class="date">
|
||||
{{ if .IsNamedParams }}
|
||||
{{ with .Get "from" }}
|
||||
<time datetime="{{ . }} ">{{ . }}</time>
|
||||
{{ end }}
|
||||
to
|
||||
{{ with .Get "to" }}
|
||||
<time datetime="{{ . }}">{{ . }}</time>
|
||||
{{ else }}
|
||||
present
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
{{ .Get 0 }}
|
||||
{{ end }}
|
||||
</span>
|
||||
</header>
|
||||
14
layouts/shortcodes/resume_section.html
Normal file
14
layouts/shortcodes/resume_section.html
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<header class="flex-date">
|
||||
<h3>{{ .Get "company" }}: {{ .Get "team" }}</h3>
|
||||
<span class="date">
|
||||
{{ with .Get "from" }}
|
||||
<time datetime="{{ . }} ">{{ . }}</time>
|
||||
{{ end }}
|
||||
to
|
||||
{{ with .Get "to" }}
|
||||
<time datetime="{{ . }}">{{ . }}</time>
|
||||
{{ else }}
|
||||
present
|
||||
{{ end }}
|
||||
</span>
|
||||
</header>
|
||||
1
layouts/shortcodes/tess.html
Normal file
1
layouts/shortcodes/tess.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
<a href="https://tess.oconnor.cx">Tess</a>
|
||||
12
layouts/simple/single.html
Normal file
12
layouts/simple/single.html
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
{{ define "main" }}
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-title">
|
||||
<h1>{{ .Title }}</h1>
|
||||
</header>
|
||||
<section class="post-content">
|
||||
{{ .Content }}
|
||||
</section>
|
||||
</article>
|
||||
|
||||
{{ end }}
|
||||
1
themes/paper
Submodule
1
themes/paper
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 664ae32a44568c7432fcb73104938b753022c0fe
|
||||
Loading…
Add table
Add a link
Reference in a new issue