mirror of
https://github.com/Noratrieb/website.git
synced 2026-01-14 08:55:01 +01:00
STUFF
This commit is contained in:
parent
5f1f9bd6a6
commit
2da77e8af5
13 changed files with 314 additions and 33 deletions
2
.github/workflows/pages.yml
vendored
2
.github/workflows/pages.yml
vendored
|
|
@ -25,7 +25,7 @@ jobs:
|
|||
uses: dtolnay/rust-toolchain@stable
|
||||
|
||||
- name: Build website
|
||||
run: cargo run
|
||||
run: cargo run build
|
||||
|
||||
- name: Deploy
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
|
|
|
|||
3
.prettierrc.json
Normal file
3
.prettierrc.json
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"printWidth": 100
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
[slides]
|
||||
talks = [
|
||||
"2024-01-17-how-to-contribute-to-the-rust-project"
|
||||
{ name = "How to contribute to the Rust project", location = "Rust Zürisee", date = "2024-01-17" },
|
||||
]
|
||||
|
|
|
|||
|
|
@ -16,8 +16,8 @@ pub fn build(config: &SlidesConfig, slides: &Path, dist: &Path) -> Result<()> {
|
|||
utils::cp_r(&slides.join("plugin"), &dist.join("plugin")).wrap_err("copying reveal.js dist")?;
|
||||
|
||||
for talk in &config.talks {
|
||||
let path = slides.join(talk);
|
||||
let dist = dist.join(talk);
|
||||
let path = slides.join(talk.dirname());
|
||||
let dist = dist.join(talk.dirname());
|
||||
|
||||
utils::cp_r(&path, &dist).wrap_err("copying slide data")?;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,12 +5,12 @@ use std::{fs, path::Path};
|
|||
use askama::Template;
|
||||
use color_eyre::{eyre::WrapErr, Result};
|
||||
|
||||
use crate::{utils, SlidesConfig};
|
||||
use crate::{utils, SlidesConfig, Talk};
|
||||
|
||||
#[derive(askama::Template)]
|
||||
#[template(path = "slides.html")]
|
||||
struct Slides {
|
||||
talks: Vec<String>,
|
||||
talks: Vec<Talk>,
|
||||
}
|
||||
|
||||
pub fn build(config: &SlidesConfig, statics: &Path, dist: &Path) -> Result<()> {
|
||||
|
|
|
|||
20
src/main.rs
20
src/main.rs
|
|
@ -29,7 +29,24 @@ struct Config {
|
|||
|
||||
#[derive(Deserialize)]
|
||||
struct SlidesConfig {
|
||||
talks: Vec<String>,
|
||||
talks: Vec<Talk>,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Clone)]
|
||||
struct Talk {
|
||||
name: String,
|
||||
date: String,
|
||||
location: String,
|
||||
}
|
||||
|
||||
impl Talk {
|
||||
fn dirname(&self) -> String {
|
||||
format!(
|
||||
"{}-{}",
|
||||
self.date,
|
||||
self.name.replace(" ", "-").to_lowercase()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
|
|
@ -64,6 +81,7 @@ fn main() -> Result<()> {
|
|||
}
|
||||
|
||||
fn watch(root: &'static Path) -> Result<()> {
|
||||
build(root).wrap_err("initial build")?;
|
||||
let (send, recv) = std::sync::mpsc::sync_channel(1);
|
||||
let mut watcher = notify::recommended_watcher(move |res| match res {
|
||||
Ok(_) => {
|
||||
|
|
|
|||
84
static/root/back-alley.html
Normal file
84
static/root/back-alley.html
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>nilstrieb.dev</title>
|
||||
<link rel="stylesheet" href="static/theme.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="main-content">
|
||||
<div class="main-content-inner">
|
||||
<h1>secret back alley</h1>
|
||||
<a href="/">getting out</a>
|
||||
<div>
|
||||
<p>
|
||||
hey! psst! you might have found the secret back alley. granted, it was not very secret.
|
||||
but that's the thing with back alleys, they're not really secret, yet people usually
|
||||
don't go there.
|
||||
</p>
|
||||
<p>
|
||||
so while you're here, i have some things for you. secret websites i host. you may use
|
||||
them, but don't abuse them. i really mean it! or else i will be forced to move them out
|
||||
of the secret back alley into my secret bunker, where you won't have access to them at
|
||||
all. and you don't want that, do you?
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h2>uptime</h2>
|
||||
<p>
|
||||
uptime is my
|
||||
<a href="https://github.com/Nilstrieb/uptime"
|
||||
>personal hand-written status page website</a
|
||||
>. how do you know that it's handwritten? its performance is absolutely horrible, that's
|
||||
why!
|
||||
</p>
|
||||
<a href="https://uptime.nilstrieb.dev" class="call-to-action">
|
||||
<span>uptime.nilstrieb.dev</span>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<h2>OLAT</h2>
|
||||
<p>
|
||||
you've ever wanted to use a
|
||||
<a href="https://www.openolat.com/">professional learning platform</a> that's used by
|
||||
real schools for things that may not be very appropriate on the school instance? i
|
||||
kinda, uh... do, so that's why this exists.
|
||||
</p>
|
||||
<a href="https://olat.nilstrieb.dev" class="call-to-action">
|
||||
<span>olat.nilstrieb.dev</span>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<h2>HugoChat</h2>
|
||||
<p>
|
||||
the <a href="https://github.com/C0RR1T/HugoChat">brilliant chat platform</a> for all
|
||||
your needs.
|
||||
</p>
|
||||
<a href="https://hugo-chat.nilstrieb.dev" class="call-to-action">
|
||||
<span>hugo-chat.nilstrieb.dev</span>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<h2>CORS</h2>
|
||||
<p>
|
||||
running <a href="https://github.com/nilstrieb-lehre/davinci-cors">CORS</a>, for your
|
||||
creative organized relaxed school life.
|
||||
</p>
|
||||
<a href="https://cors-school.nilstrieb.dev/" class="call-to-action">
|
||||
<span>cors-school.nilstrieb.dev</span>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<h2>cargo-bisect-rustc-service</h2>
|
||||
<p>
|
||||
<a href="https://github.com/Nilstrieb/cargo-bisect-rustc-service">webscale bisection</a> at your fingertips
|
||||
</p>
|
||||
<a href="https://bisect-rustc.nilstrieb.dev/" class="call-to-action">
|
||||
<span>bisect-rustc.nilstrieb.dev</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,18 +1,118 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>nilstrieb.dev</title>
|
||||
<link rel="stylesheet" href="static/theme.css" />
|
||||
<style>
|
||||
.secret {
|
||||
color: #5b4561;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.social-logo {
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.ferrisuwu {
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
right: -100px;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.ferrisuwu-animate {
|
||||
animation-iteration-count: 1;
|
||||
animation-name: ferrisuwu-enter;
|
||||
animation-duration: 3s;
|
||||
}
|
||||
|
||||
@keyframes ferrisuwu-enter {
|
||||
from {
|
||||
right: -100px;
|
||||
}
|
||||
50% {
|
||||
right: 50px;
|
||||
}
|
||||
to {
|
||||
right: -100px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>hi!</h1>
|
||||
<p>This is my website. It is work in progress.</p>
|
||||
<div class="main-content">
|
||||
<div class="main-content-inner">
|
||||
<h1>Nilstrieb's website</h1>
|
||||
<div>
|
||||
<p>
|
||||
this is my website. you'll find lots of interesting and not very interesting stuff here,
|
||||
depending on where you look.
|
||||
</p>
|
||||
<p>
|
||||
there may be many
|
||||
<span onclick="onSecretClick()" class="secret" role="button">secrets</span>
|
||||
depending on where you look....
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h2>socials</h2>
|
||||
<p>
|
||||
these two are not everything, but you may find more there, like a choose your own
|
||||
adventure story: choose your own nils
|
||||
</p>
|
||||
<a href="https://github.com/Nilstrieb"
|
||||
><img class="social-logo" alt="GitHub" src="static/github.svg"
|
||||
/></a>
|
||||
<a href="https://hachyderm.io/@nilstrieb"
|
||||
><img class="social-logo" alt="Mastodon" src="static/mastodon.png"
|
||||
/></a>
|
||||
</div>
|
||||
<div>
|
||||
<h2>my blog</h2>
|
||||
<p>I have a blog, it might be interesting, maybe.</p>
|
||||
<a href="/blog">blog</a>
|
||||
<p>i have a blog, it might be interesting, maybe.</p>
|
||||
<a href="/blog" class="call-to-action">
|
||||
<span>blog</span>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<h2>slides</h2>
|
||||
<p>i have given one talk, here are its slides, isnt this amazing</p>
|
||||
<a href="/slides/index.html">slides from talks</a>
|
||||
<a href="/slides/index.html" class="call-to-action">
|
||||
<span>slides from talks</span>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<h2>random projects</h2>
|
||||
<p>
|
||||
in addition to all the other stuff mentioned above, i also have some random projects
|
||||
hosted on my server. they are pretty bad and i won't promote them this openly, but you
|
||||
will be able to find them if you *really* want to.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<img id="ferrisuwu" class="ferrisuwu" src="static/ferrisuwu.webp" />
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let clickCount = 0;
|
||||
let ferrisuwuAnimating = false;
|
||||
function onSecretClick() {
|
||||
clickCount++;
|
||||
if (clickCount > 3 && !ferrisuwuAnimating) {
|
||||
const ferrisuwu = document.getElementById("ferrisuwu");
|
||||
ferrisuwu.classList.add("ferrisuwu-animate");
|
||||
ferrisuwuAnimating = true;
|
||||
setTimeout(() => {
|
||||
ferrisuwu.classList.remove("ferrisuwu-animate");
|
||||
ferrisuwuAnimating = false;
|
||||
}, 3000);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
BIN
static/root/static/ferrisuwu.webp
Normal file
BIN
static/root/static/ferrisuwu.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.2 KiB |
3
static/root/static/github.svg
Normal file
3
static/root/static/github.svg
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
<svg height="32" viewBox="0 0 16 16" version="1.1" width="32" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"></path>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 700 B |
BIN
static/root/static/mastodon.png
Normal file
BIN
static/root/static/mastodon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
65
static/root/static/theme.css
Normal file
65
static/root/static/theme.css
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
body {
|
||||
font-family: Verdana, sans-serif;
|
||||
background-color: #e6dae9;
|
||||
color: #1b191c;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.main-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
@media (min-width: 700px) {
|
||||
.main-content-inner {
|
||||
width: 70vw;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.main-content-inner {
|
||||
width: 50vw;
|
||||
}
|
||||
}
|
||||
|
||||
.call-to-action {
|
||||
width: 400px;
|
||||
height: 50px;
|
||||
background-color: #8c499d;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.call-to-action:hover {
|
||||
background-color: #ac78b8;
|
||||
}
|
||||
|
||||
.call-to-action * {
|
||||
color: white;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
body {
|
||||
background-color: #e6dae9;
|
||||
color: #1b191c;
|
||||
}
|
||||
|
||||
.secret {
|
||||
color: #5b4561;
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
background-color: #1b191c;
|
||||
color: #e6dae9;
|
||||
}
|
||||
|
||||
.secret {
|
||||
color: #a081a9;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,17 +1,25 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="stylesheet" href="/static/theme.css" />
|
||||
<title>Slides</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Slides</h1>
|
||||
<p>Talks I have given with slides available:</p>
|
||||
<div>
|
||||
<div class="main-content">
|
||||
<div class="main-content-inner">
|
||||
<h1>slides</h1>
|
||||
<p>slides from talks that i have given</p>
|
||||
|
||||
{% for talk in talks %}
|
||||
<a href="{{ talk }}">{{ talk }}</a>
|
||||
<div>
|
||||
<h2>{{ talk.date }} - {{ talk.name }}</h2>
|
||||
<p>{{ talk.location }}</p>
|
||||
<a href="{{ talk.dirname() }}">{{ talk.dirname() }}</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Add table
Add a link
Reference in a new issue