Compare commits
9 Commits
d4396a5acc
...
dev
Author | SHA1 | Date | |
---|---|---|---|
bd7588b819 | |||
138ad075ea | |||
c2d70f0988 | |||
e339b21f66 | |||
c40af33d1d | |||
dafbda9509 | |||
8a670bd0bb | |||
bd9c74d6f3 | |||
5d5af62baf |
@ -26,6 +26,6 @@ jobs:
|
||||
username: ${{ secrets.SSH_USERNAME }}
|
||||
key: ${{ secrets.SSH_KEY }}
|
||||
source: "dist/*"
|
||||
target: /var/www/website/dev
|
||||
target: /srv/website/dev
|
||||
overwrite: true
|
||||
strip_components: 1
|
@ -1,24 +1,23 @@
|
||||
import { defineConfig } from "astro/config";
|
||||
|
||||
import mdx from "@astrojs/mdx";
|
||||
import a11yEmoji from "@fec/remark-a11y-emoji";
|
||||
import wasmPack from 'vite-plugin-wasm-pack';
|
||||
import icon from "astro-icon";
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
integrations: [mdx()],
|
||||
prefetch: {
|
||||
prefetchAll: true
|
||||
},
|
||||
integrations: [mdx(), icon()],
|
||||
markdown: {
|
||||
remarkPlugins: [
|
||||
a11yEmoji
|
||||
],
|
||||
remarkPlugins: [a11yEmoji],
|
||||
shikiConfig: {
|
||||
theme: "one-dark-pro"
|
||||
}
|
||||
},
|
||||
// Copy wasm-terminal to the build directory
|
||||
vite: {
|
||||
plugins: [
|
||||
wasmPack([],['@c0ntroller/wasm-terminal'])
|
||||
]
|
||||
plugins: [wasmPack([], ['@c0ntroller/wasm-terminal'])]
|
||||
}
|
||||
});
|
11738
package-lock.json
generated
11738
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
10
package.json
10
package.json
@ -10,16 +10,18 @@
|
||||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"@astrojs/check": "^0.3.1",
|
||||
"@astrojs/mdx": "^1.1.5",
|
||||
"@astrojs/check": "^0.5.6",
|
||||
"@astrojs/mdx": "^2.1.1",
|
||||
"@c0ntroller/wasm-terminal": ">=0.1.0",
|
||||
"astro": "^3.6.0",
|
||||
"astro-icon": "^0.8.1",
|
||||
"astro": "^4.4.9",
|
||||
"astro-icon": "^1.1.0",
|
||||
"sass": "^1.69.5",
|
||||
"typescript": "^5.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@fec/remark-a11y-emoji": "^4.0.2",
|
||||
"@iconify-json/mdi": "^1.1.64",
|
||||
"@iconify-json/simple-icons": "^1.1.93",
|
||||
"astro-themes": "^0.2.4",
|
||||
"remark-code-extra": "^1.0.1",
|
||||
"vite-plugin-wasm-pack": "0.1.11"
|
||||
|
@ -7,7 +7,7 @@ interface Props {
|
||||
slug: string;
|
||||
}
|
||||
|
||||
const { title, description, published, path, slug } = Astro.props;
|
||||
const { title, description, /*published, */path, slug } = Astro.props;
|
||||
---
|
||||
|
||||
<a href={path} class="nostyle">
|
||||
|
@ -1,6 +1,5 @@
|
||||
---
|
||||
import { getCollection, getEntry } from "astro:content";
|
||||
import type { CollectionEntry } from "astro:content";
|
||||
import { getCollection, getEntry, type CollectionEntry } from "astro:content";
|
||||
|
||||
interface Props {
|
||||
collectionName: CollectionEntry<"diaryMainPages">["slug"];
|
||||
|
@ -1,6 +1,5 @@
|
||||
---
|
||||
import { getCollection, getEntry } from "astro:content";
|
||||
import type { CollectionEntry } from "astro:content";
|
||||
import { getCollection, getEntry, type CollectionEntry } from "astro:content";
|
||||
|
||||
interface Props {
|
||||
collectionName: CollectionEntry<"diaryMainPages">["slug"];
|
||||
@ -104,6 +103,7 @@ select {
|
||||
border-radius: 1em;
|
||||
border: 1px solid var(--blog_content-border);
|
||||
background: var(--blog_background-main);
|
||||
color: var(--blog_color);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
---
|
||||
import { Image } from "astro:assets";
|
||||
import { Icon } from "astro-icon";
|
||||
import { Icon } from "astro-icon/components";
|
||||
import ThemeSwitch from "./ThemeSwitch.astro";
|
||||
import logo from "./logo.png";
|
||||
---
|
||||
|
||||
<nav class="navigation">
|
||||
<a href="/" class="nostyle imgContainer">
|
||||
<Image src={logo} alt="Logo" class="logoImg" />
|
||||
<Image src={logo} alt="Logo" class="logoImg" loading="eager" />
|
||||
</a>
|
||||
<div class="navLink">
|
||||
<a href="/" class="nostyle">
|
||||
@ -15,9 +15,9 @@ import logo from "./logo.png";
|
||||
<span class="linkIcon"
|
||||
><Icon
|
||||
name="mdi:home"
|
||||
size="2em"
|
||||
title="Home and Projects"
|
||||
id="mdi_nav_home"
|
||||
class="icon-2em"
|
||||
/></span
|
||||
>
|
||||
</a>
|
||||
@ -28,7 +28,7 @@ import logo from "./logo.png";
|
||||
<span class="linkIcon"
|
||||
><Icon
|
||||
name="mdi:account"
|
||||
size="2em"
|
||||
class="icon-2em"
|
||||
title="About Me"
|
||||
id="mdi_nav_aboutme"
|
||||
/></span
|
||||
@ -40,7 +40,7 @@ import logo from "./logo.png";
|
||||
<a href="/terminal" class="nostyle">
|
||||
<Icon
|
||||
name="mdi:console"
|
||||
size="2em"
|
||||
class="icon-2em"
|
||||
title="Terminal"
|
||||
id="mdi_nav_terminal"
|
||||
/>
|
||||
|
@ -1,11 +1,11 @@
|
||||
---
|
||||
import { Icon } from "astro-icon";
|
||||
import { Icon } from "astro-icon/components";
|
||||
---
|
||||
|
||||
<div class="switch" transition:persist="theme-switch">
|
||||
<Icon name="mdi:language-javascript" title="Theme switching needs JS to be enabled." data-theme-ph />
|
||||
<Icon name="mdi:white-balance-sunny" title="Switch to dark theme" data-theme-sun />
|
||||
<Icon name="mdi:weather-night" title="Switch to light theme" data-theme-moon />
|
||||
<Icon name="mdi:language-javascript" title="Theme switching needs JS to be enabled." data-theme-ph class="icon-15em" />
|
||||
<Icon name="mdi:white-balance-sunny" title="Switch to dark theme" data-theme-sun class="icon-15em" />
|
||||
<Icon name="mdi:weather-night" title="Switch to light theme" data-theme-moon class="icon-15em" />
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
import { Icon } from "astro-icon";
|
||||
import { Icon } from "astro-icon/components";
|
||||
import Skills from "../data/skills.json";
|
||||
|
||||
type Skill = (typeof Skills.cards)[number];
|
||||
@ -40,7 +40,7 @@ const cardStyle = {
|
||||
.map((skill) => (
|
||||
<div class="skillBar">
|
||||
<div class="barName">
|
||||
<Icon name={skill.icon} />
|
||||
<Icon name={skill.icon} class="icon-2em" />
|
||||
</div>
|
||||
<div
|
||||
class="percentBar"
|
||||
@ -61,7 +61,7 @@ const cardStyle = {
|
||||
<>
|
||||
<div class="badge">
|
||||
<span>
|
||||
<Icon name={additional.icon} />
|
||||
<Icon name={additional.icon} class="icon-1em" />
|
||||
</span>
|
||||
<span>{additional.name}</span>
|
||||
</div>
|
||||
@ -202,7 +202,6 @@ const cardStyle = {
|
||||
}
|
||||
|
||||
& > div:first-of-type {
|
||||
height: 2em;
|
||||
grid-row: 1/3;
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
---
|
||||
import { ViewTransitions } from 'astro:transitions';
|
||||
import Themes from "astro-themes";
|
||||
import Icon from "astro-icon";
|
||||
import { Icon } from "astro-icon/components";
|
||||
import Navbar from "../components/LayoutComponents/Navbar.astro";
|
||||
import socials from "../data/socials.json";
|
||||
|
||||
@ -122,7 +122,7 @@ const { title, showAfterMain, mainTransitionName } = Astro.props;
|
||||
<header transition:persist="nav">
|
||||
<Navbar />
|
||||
</header>
|
||||
<main transition:name={ mainTransitionName }>
|
||||
<main transition:name={ mainTransitionName || "main" }>
|
||||
<slot />
|
||||
</main>
|
||||
{showAfterMain ? <div class="after-main">
|
||||
@ -137,8 +137,8 @@ const { title, showAfterMain, mainTransitionName } = Astro.props;
|
||||
<span class="divider">|</span>
|
||||
{socials.flatMap((social, i) => (
|
||||
i !== 0 ?
|
||||
[<span class="divider">|</span>, <a href={social.url} target="_blank" rel="noreferrer" class="socialIcon"><Icon name={social.icon} title={social.name} /></a>] :
|
||||
[<a href={social.url} target="_blank" rel="noreferrer" class="socialIcon"><Icon name={social.icon} title={social.name} /></a>]
|
||||
[<span class="divider">|</span>, <a href={social.url} target="_blank" rel="noreferrer" class="socialIcon"><Icon name={social.icon} title={social.name} class="socialIcon" /></a>] :
|
||||
[<a href={social.url} target="_blank" rel="noreferrer" class="socialIcon"><Icon name={social.icon} title={social.name} class="socialIcon" /></a>]
|
||||
))}
|
||||
<span class="divider">|</span>
|
||||
<a class="nocolor" target="_blank" href="mailto:admin-website@c0ntroller.de" rel="noreferrer">Contact</a>
|
||||
@ -304,4 +304,20 @@ const { title, showAfterMain, mainTransitionName } = Astro.props;
|
||||
h6 {
|
||||
color: var(--blog_color-accent-dark);
|
||||
}
|
||||
|
||||
.icon-1em {
|
||||
height: 1em;
|
||||
width: 1em;
|
||||
}
|
||||
|
||||
.icon-15em {
|
||||
height: 1.5em;
|
||||
width: 1.5em;
|
||||
}
|
||||
|
||||
.icon-2em {
|
||||
height: 2em;
|
||||
width: 2em;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
@ -1,6 +1,6 @@
|
||||
---
|
||||
import Layout from "./Layout.astro";
|
||||
import { Icon } from "astro-icon";
|
||||
import { Icon } from "astro-icon/components";
|
||||
|
||||
interface Props {
|
||||
title: string;
|
||||
@ -24,7 +24,7 @@ const gitUrl = `https://git.c0ntroller.de/c0ntroller/frontpage/src/branch/dev/sr
|
||||
|
||||
{ moreLinks && moreLinks.length !== 0 ?
|
||||
<div class="more">
|
||||
{ moreLinks.map(l => <a href={l.href} referrerpolicy="no-referrer" class="nostyle" style={{ display: "inline-block", width: "2em" }}><Icon name={l.icon} /></a>) }
|
||||
{ moreLinks.map(l => <a href={l.href} referrerpolicy="no-referrer" class="nostyle"><Icon name={l.icon} class="icon-2em" /></a>) }
|
||||
</div>
|
||||
: null}
|
||||
<h1 transition:name={`markdown-title-${slug}`}>{title}</h1>
|
||||
|
@ -29,7 +29,7 @@ if (entry.data.relatedWebsite) {
|
||||
if (entry.data.repository) {
|
||||
moreLinks.push({
|
||||
href: entry.data.repository,
|
||||
icon: "bi:git",
|
||||
icon: "simple-icons:git",
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
---
|
||||
import { Image } from "astro:assets";
|
||||
import { Icon } from "astro-icon";
|
||||
import { Icon } from "astro-icon/components";
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
import SkillCard from "../components/SkillCard.astro";
|
||||
|
||||
@ -15,7 +15,7 @@ const age = new Date().getFullYear() - 1998 - (new Date().getMonth() <= 10 ? 1 :
|
||||
<Layout title="About me">
|
||||
<h1>This is me.</h1>
|
||||
<div class="photo">
|
||||
<Image src={pic} alt="Me" />
|
||||
<Image src={pic} alt="Me" loading="eager" />
|
||||
</div>
|
||||
<div class="personal">
|
||||
<p class="preText">
|
||||
@ -67,16 +67,16 @@ const age = new Date().getFullYear() - 1998 - (new Date().getMonth() <= 10 ? 1 :
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
class="nocolor"
|
||||
style={{ width: "2em" }}
|
||||
aria-label={`Link to my ${social.name} profile`}
|
||||
>
|
||||
<Icon name={social.icon} />
|
||||
<Icon name={social.icon} class="icon-2em" />
|
||||
</a>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
<h2>Achievements</h2>
|
||||
{achievements.map((achievement) => <div class="achievement">
|
||||
<Icon name={achievement.icon} /><span>{achievement.description}</span>
|
||||
<Icon name={achievement.icon} class="icon-2em" /><span>{achievement.description}</span>
|
||||
</div>)}
|
||||
<h2>Skills</h2>
|
||||
{skills.cards.map((card) => <SkillCard card={card} />)}
|
||||
|
@ -7,7 +7,7 @@ const screenVersion = `${date.getFullYear()}${date.getMonth()+1}${date.getDate()
|
||||
const wasmVersion = wasmData.version;
|
||||
---
|
||||
|
||||
<Layout title="Terminal">
|
||||
<Layout title="Terminal" showAfterMain>
|
||||
<div class="screen" data-terminal-screen>
|
||||
<div data-terminal-output>
|
||||
<noscript><pre>You need to enable JavaScript to use this terminal.</pre></noscript>
|
||||
@ -29,12 +29,16 @@ const wasmVersion = wasmData.version;
|
||||
@@@@@
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</pre>
|
||||
</div>
|
||||
<div class="input"><pre class="user">user@cer0</pre><pre>:</pre><pre class="pwd">/</pre><pre class="dollar">$ </pre><input type="text" data-terminal-input autofocus /></div>
|
||||
<div class="input"><pre class="user">user@cer0</pre><pre>:</pre><pre class="pwd">/</pre><pre class="dollar">$ </pre><input type="text" data-terminal-input /></div>
|
||||
</div>
|
||||
|
||||
<template data-terminal-user-cmd>
|
||||
<pre><pre class="user">user@cer0</pre><pre>:</pre><pre class="pwd"></pre><pre class="dollar">$ </pre><pre class="user-cmd"></pre></pre>
|
||||
</template>
|
||||
|
||||
<div slot="after-main" class="more">
|
||||
Read more about the development of this terminal <a href="/blog/wasm-terminal" class="nocolor">here</a>.
|
||||
</div>
|
||||
</Layout>
|
||||
|
||||
<script>
|
||||
@ -46,7 +50,20 @@ const wasmVersion = wasmData.version;
|
||||
const screens = document.querySelectorAll("[data-terminal-screen]") as NodeListOf<HTMLDivElement>;
|
||||
const template = document.querySelector("[data-terminal-user-cmd]") as HTMLTemplateElement;
|
||||
|
||||
screens.forEach((s) => s.addEventListener("click", () => inputs[0]?.focus()))
|
||||
screens.forEach((s) => s.addEventListener("click", () => inputs[0]?.focus()));
|
||||
|
||||
screens.forEach((screen) => {
|
||||
new MutationObserver((changes) => {
|
||||
const totalNewHeight = changes.reduce((prev, change) => {
|
||||
change.addedNodes.forEach(n => prev += (n as HTMLPreElement).clientHeight || 0);
|
||||
return prev;
|
||||
}, 0);
|
||||
|
||||
if (screen.scrollTop + screen.clientHeight >= screen.scrollHeight - totalNewHeight - 40) {
|
||||
screen.scrollTo(0, screen.scrollHeight);
|
||||
}
|
||||
}).observe(screen, { childList: true, subtree: true });
|
||||
});
|
||||
|
||||
const { default: init, Console } = await wasm;
|
||||
|
||||
@ -69,9 +86,11 @@ const wasmVersion = wasmData.version;
|
||||
inputLine.querySelector(".user-cmd")!.textContent = cmd;
|
||||
inputLine.querySelector(".pwd")!.textContent = prevPwd;
|
||||
outputs.forEach((output) => {
|
||||
output.prepend(inputLine);
|
||||
output.append(inputLine);
|
||||
});
|
||||
|
||||
input.value = "";
|
||||
|
||||
if (cmd) {
|
||||
const resp = c.execute(cmd);
|
||||
|
||||
@ -79,20 +98,15 @@ const wasmVersion = wasmData.version;
|
||||
const outputLine = document.createElement("pre");
|
||||
outputLine.textContent = resp
|
||||
outputs.forEach((output) => {
|
||||
output.prepend(outputLine);
|
||||
output.append(outputLine);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
input.value = "";
|
||||
updatePwd();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
screens.forEach((screen) => {
|
||||
new MutationObserver(() => screen.scrollTo(0, screen.scrollHeight)).observe(screen, { childList: true, subtree: true });
|
||||
});
|
||||
})()
|
||||
</script>
|
||||
|
||||
@ -127,7 +141,7 @@ const wasmVersion = wasmData.version;
|
||||
|
||||
[data-terminal-output] {
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
@ -164,6 +178,7 @@ const wasmVersion = wasmData.version;
|
||||
appearance: none !important;
|
||||
outline: none;
|
||||
caret-shape: block;
|
||||
color: #fff;
|
||||
|
||||
&::-moz-focus-outer, &::-moz-focus-inner, &:focus, &:focus *, &:-moz-focusring, &:-moz-focusring * {
|
||||
border: none !important;
|
||||
@ -173,4 +188,12 @@ const wasmVersion = wasmData.version;
|
||||
}
|
||||
}
|
||||
|
||||
.more {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-style: italic;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
</style>
|
Reference in New Issue
Block a user