update new article
This commit is contained in:
@@ -10,6 +10,10 @@ const style = css`
|
|||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@@ -28,9 +32,9 @@ export default defineComponent({
|
|||||||
{blogEntries.result.value?.map(_ => (
|
{blogEntries.result.value?.map(_ => (
|
||||||
<li key={_.slug}>
|
<li key={_.slug}>
|
||||||
<div class="entry">
|
<div class="entry">
|
||||||
<RouterLink to={{ name: 'DjBlogEntry', params: { slug: _.slug }}}>{ _.title }</RouterLink>
|
|
||||||
<span>-</span>
|
|
||||||
<time datetime={ _.createdAt }>{ new Date(_.createdAt).toLocaleDateString() }</time>
|
<time datetime={ _.createdAt }>{ new Date(_.createdAt).toLocaleDateString() }</time>
|
||||||
|
<span>-</span>
|
||||||
|
<RouterLink to={{ name: 'DjBlogEntry', params: { slug: _.slug }}}>{ _.title }</RouterLink>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
)) ?? <li>Blog posts loading...</li>}
|
)) ?? <li>Blog posts loading...</li>}
|
||||||
|
|||||||
@@ -28,27 +28,32 @@ export const routes: RouteRecordRaw[] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
const styles = css`
|
const styles = css`
|
||||||
|
body {
|
||||||
|
height: 100svh;
|
||||||
|
}
|
||||||
|
|
||||||
.dj-blog-root {
|
.dj-blog-root {
|
||||||
width: 100vw;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
height: 100vh;
|
margin: auto;
|
||||||
|
width: 800px;
|
||||||
|
|
||||||
.container {
|
.dot {
|
||||||
width: 800px;
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.spacer {
|
.container {
|
||||||
flex: 1;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
footer {
|
footer {
|
||||||
color: gray;
|
width: 800px;
|
||||||
width: calc(100% - 10px);
|
|
||||||
margin-bottom: 20px;
|
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
padding-left: 10px;
|
margin-left: 10px;
|
||||||
|
margin-bottom: 25px;
|
||||||
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@@ -61,11 +66,12 @@ const styles = css`
|
|||||||
}
|
}
|
||||||
|
|
||||||
nav {
|
nav {
|
||||||
|
width: 100%;
|
||||||
font-size: 40px;
|
font-size: 40px;
|
||||||
margin-bottom: 40px;
|
margin-top: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
a, a:visited {
|
a, a:visited {
|
||||||
color: var(--dj-palette3);
|
color: var(--dj-palette3);
|
||||||
@@ -73,11 +79,16 @@ const styles = css`
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 1024px) {
|
@media only screen and (max-width: 1024px) {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
width: calc(100% - 20px);
|
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dj-title {
|
||||||
|
margin-right: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
footer {
|
footer {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
@@ -98,14 +109,14 @@ export default defineComponent({
|
|||||||
<>
|
<>
|
||||||
<div ref={carrier} class="tooltip-carrier" />
|
<div ref={carrier} class="tooltip-carrier" />
|
||||||
<div class="dj-blog-root">
|
<div class="dj-blog-root">
|
||||||
|
<nav>
|
||||||
|
<DjTooltip tooltip="flog, clog, bog, frog, cog, log, grog, fog, snog...">
|
||||||
|
<RouterLink to={{ name: 'DjBlogMain' }}>
|
||||||
|
dj blog
|
||||||
|
</RouterLink>
|
||||||
|
</DjTooltip>
|
||||||
|
</nav>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<nav>
|
|
||||||
<DjTooltip tooltip="flog, clog, bog, frog, cog, log, grog, fog, snog...">
|
|
||||||
<RouterLink to={{ name: 'DjBlogMain' }}>
|
|
||||||
dj blog
|
|
||||||
</RouterLink>
|
|
||||||
</DjTooltip>
|
|
||||||
</nav>
|
|
||||||
<RouterView>
|
<RouterView>
|
||||||
{{
|
{{
|
||||||
default: ({ Component }: { Component: VNode }) => (Component &&
|
default: ({ Component }: { Component: VNode }) => (Component &&
|
||||||
@@ -120,11 +131,11 @@ export default defineComponent({
|
|||||||
}}
|
}}
|
||||||
</RouterView>
|
</RouterView>
|
||||||
</div>
|
</div>
|
||||||
<div class="spacer" />
|
<hr />
|
||||||
<footer>
|
<footer>
|
||||||
<div class="bottom">
|
<div class="bottom">
|
||||||
<div>
|
<div>
|
||||||
<a href="/">djledda.net</a> {new Date().getFullYear()} - <DjEmail>{() => "Contact"}</DjEmail>
|
<a href="/">djledda.net</a> {new Date().getFullYear()}<span class="dot">·</span><DjEmail>{() => "Contact"}</DjEmail><span class="dot">·</span><a href="/blog/djblog.rss">RSS Feed</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { addCSS, css } from "@/util.ts";
|
|||||||
|
|
||||||
const styles = css`
|
const styles = css`
|
||||||
body {
|
body {
|
||||||
height: 100vh;
|
height: 100svh;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dj-home-root {
|
.dj-home-root {
|
||||||
@@ -65,6 +65,7 @@ body {
|
|||||||
footer {
|
footer {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 1024px) {
|
@media only screen and (max-width: 1024px) {
|
||||||
|
|||||||
132
main.ts
132
main.ts
@@ -12,8 +12,90 @@ import { type DjAPIResult, type DjAPIResultMap } from "@/api.ts";
|
|||||||
|
|
||||||
const utf8Decoder = new TextDecoder("utf-8");
|
const utf8Decoder = new TextDecoder("utf-8");
|
||||||
|
|
||||||
|
const HOST = 'https://djledda.net';
|
||||||
|
|
||||||
const parser = new DOMParser();
|
const parser = new DOMParser();
|
||||||
|
|
||||||
|
async function getBlogEntries() {
|
||||||
|
const paths: string[] = [];
|
||||||
|
const contentDir = './public/blog/content/';
|
||||||
|
for await (const dirEnt of Deno.readDir(contentDir)) {
|
||||||
|
if (dirEnt.isFile && dirEnt.name.endsWith('.html')) {
|
||||||
|
paths.push(`${contentDir}${dirEnt.name}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const result: DjAPIResultMap['/blog-entries'] = [];
|
||||||
|
for (const filePath of paths) {
|
||||||
|
const content = await Deno.readTextFile(filePath);
|
||||||
|
const dom = parser.parseFromString(content, 'text/html');
|
||||||
|
const metadata = {
|
||||||
|
slug: '',
|
||||||
|
tags: [] as string[],
|
||||||
|
guid: '',
|
||||||
|
title: '',
|
||||||
|
createdAt: '',
|
||||||
|
updatedAt: '',
|
||||||
|
};
|
||||||
|
const metaTags = dom.querySelectorAll('meta') as unknown as NodeListOf<HTMLMetaElement>;
|
||||||
|
for (const metaTag of metaTags) {
|
||||||
|
const name = metaTag.attributes.getNamedItem('name')?.value ?? '';
|
||||||
|
const content = metaTag.attributes.getNamedItem('content')?.value ?? '';
|
||||||
|
if (name === 'title') {
|
||||||
|
metadata.title = content;
|
||||||
|
} else if (name === 'tags') {
|
||||||
|
metadata.tags = content ? content.split(",") : [];
|
||||||
|
} else if (name === 'guid') {
|
||||||
|
metadata.guid = content;
|
||||||
|
} else if (name === 'slug') {
|
||||||
|
metadata.slug = content;
|
||||||
|
} else if (name === 'updatedAt') {
|
||||||
|
metadata.createdAt = content;
|
||||||
|
} else if (name === 'createdAt') {
|
||||||
|
metadata.updatedAt = content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.push(metadata);
|
||||||
|
}
|
||||||
|
result.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function rss() {
|
||||||
|
const articles = await getBlogEntries();
|
||||||
|
|
||||||
|
return `<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>djledda's blog</title>
|
||||||
|
<description>djledda's personal blog</description>
|
||||||
|
<link>${ HOST }/blog</link>
|
||||||
|
<managingEditor>dan@djledda.net (Daniel Ledda)</managingEditor>
|
||||||
|
<image>
|
||||||
|
<title>djledda's blog</title>
|
||||||
|
<url>${ HOST }/favicon.png</url>
|
||||||
|
<link>${ HOST }/blog</link>
|
||||||
|
<description>djledda's personal blog</description>
|
||||||
|
</image>
|
||||||
|
<language>en-au</language>
|
||||||
|
<copyright>${ new Date().getFullYear() } djledda.net All rights reserved</copyright>
|
||||||
|
<lastBuildDate>${ new Date(articles.at(-1)!.updatedAt).toUTCString() }</lastBuildDate>
|
||||||
|
<pubDate>${ new Date(articles.at(-1)!.updatedAt).toUTCString() }</pubDate>
|
||||||
|
<ttl>1440</ttl>
|
||||||
|
|
||||||
|
${ articles.map(article => `<item>
|
||||||
|
<title>${ article.title }</title>
|
||||||
|
<link>${ HOST }/blog/${ article.slug }</link>
|
||||||
|
<pubDate>${ new Date(article.createdAt).toUTCString() }</pubDate>
|
||||||
|
<author>dan@djledda.net (Daniel Ledda)</author>
|
||||||
|
<guid>${ article.guid }</guid>
|
||||||
|
</item>
|
||||||
|
`).join('')}
|
||||||
|
|
||||||
|
<atom:link href="${ HOST }/blog/djblog.rss" rel="self" type="application/rss+xml" />
|
||||||
|
</channel>
|
||||||
|
</rss>`;
|
||||||
|
}
|
||||||
|
|
||||||
function appHeaderScript(params: { ssrContext: DjSSRContext, entryPath: string }) {
|
function appHeaderScript(params: { ssrContext: DjSSRContext, entryPath: string }) {
|
||||||
return `
|
return `
|
||||||
<title>${ toValue(params.ssrContext.head.title) }</title>
|
<title>${ toValue(params.ssrContext.head.title) }</title>
|
||||||
@@ -32,7 +114,7 @@ function appHeaderScript(params: { ssrContext: DjSSRContext, entryPath: string }
|
|||||||
<style>
|
<style>
|
||||||
${ Object.values(params.ssrContext.styles).join('\n') }
|
${ Object.values(params.ssrContext.styles).join('\n') }
|
||||||
</style>
|
</style>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
window.appstate = ${JSON.stringify(params.ssrContext.registry)};
|
window.appstate = ${JSON.stringify(params.ssrContext.registry)};
|
||||||
import('${params.entryPath}');
|
import('${params.entryPath}');
|
||||||
</script>`;
|
</script>`;
|
||||||
@@ -53,8 +135,6 @@ for await (const entry of siteEntries("app")) {
|
|||||||
sites.push(entry);
|
sites.push(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(sites);
|
|
||||||
|
|
||||||
async function getAPIResponse(apiReq: Request): Promise<Response> {
|
async function getAPIResponse(apiReq: Request): Promise<Response> {
|
||||||
let jsonResponse: DjAPIResult | { error: string } | null = null;
|
let jsonResponse: DjAPIResult | { error: string } | null = null;
|
||||||
let status = 200;
|
let status = 200;
|
||||||
@@ -102,44 +182,7 @@ async function getAPIResponse(apiReq: Request): Promise<Response> {
|
|||||||
result.sort((a, b) => a.titleDe.localeCompare(b.titleDe));
|
result.sort((a, b) => a.titleDe.localeCompare(b.titleDe));
|
||||||
jsonResponse = result;
|
jsonResponse = result;
|
||||||
} else if (apiPath === "/blog-entries") {
|
} else if (apiPath === "/blog-entries") {
|
||||||
const paths: string[] = [];
|
jsonResponse = await getBlogEntries();
|
||||||
const contentDir = './public/blog/content/';
|
|
||||||
for await (const dirEnt of Deno.readDir(contentDir)) {
|
|
||||||
if (dirEnt.isFile && dirEnt.name.endsWith('.html')) {
|
|
||||||
paths.push(`${contentDir}${dirEnt.name}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const result: DjAPIResultMap['/blog-entries'] = [];
|
|
||||||
for (const filePath of paths) {
|
|
||||||
const content = await Deno.readTextFile(filePath);
|
|
||||||
const dom = parser.parseFromString(content, 'text/html');
|
|
||||||
const metadata = {
|
|
||||||
slug: '',
|
|
||||||
tags: [] as string[],
|
|
||||||
title: '',
|
|
||||||
createdAt: '',
|
|
||||||
updatedAt: '',
|
|
||||||
};
|
|
||||||
const metaTags = dom.querySelectorAll('meta') as unknown as NodeListOf<HTMLMetaElement>;
|
|
||||||
for (const metaTag of metaTags) {
|
|
||||||
const name = metaTag.attributes.getNamedItem('name')?.value ?? '';
|
|
||||||
const content = metaTag.attributes.getNamedItem('content')?.value ?? '';
|
|
||||||
if (name === 'title') {
|
|
||||||
metadata.title = content;
|
|
||||||
} else if (name === 'tags') {
|
|
||||||
metadata.tags = content ? content.split(",") : [];
|
|
||||||
} else if (name === 'slug') {
|
|
||||||
metadata.slug = content;
|
|
||||||
} else if (name === 'updatedAt') {
|
|
||||||
metadata.createdAt = content;
|
|
||||||
} else if (name === 'createdAt') {
|
|
||||||
metadata.updatedAt = content;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.push(metadata);
|
|
||||||
}
|
|
||||||
result.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
|
|
||||||
jsonResponse = result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!jsonResponse) {
|
if (!jsonResponse) {
|
||||||
@@ -195,6 +238,13 @@ Deno.serve({
|
|||||||
response = await getAPIResponse(req);
|
response = await getAPIResponse(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RSS
|
||||||
|
if (response === null) {
|
||||||
|
if (pathname === '/blog/djblog.rss') {
|
||||||
|
response = new Response(await rss(), { status: 200 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Public/static files
|
// Public/static files
|
||||||
if (response === null) {
|
if (response === null) {
|
||||||
let filepath = join(".", "public", pathname);
|
let filepath = join(".", "public", pathname);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<meta name="createdAt" content="2025-12-20T17:54:05.000Z">
|
<meta name="createdAt" content="2025-12-20T17:54:05.000Z">
|
||||||
<meta name="updatedAt" content="2025-12-20T17:54:05.000Z">
|
<meta name="updatedAt" content="2025-12-20T17:54:05.000Z">
|
||||||
<meta name="tags" content="">
|
<meta name="tags" content="">
|
||||||
|
<meta name="guid" content="4655d2b9-0c4b-4dd7-bf95-538d36166000">
|
||||||
|
|
||||||
<article>
|
<article>
|
||||||
<p>
|
<p>
|
||||||
|
|||||||
291
public/blog/content/straightjacket-of-indecision.html
Normal file
291
public/blog/content/straightjacket-of-indecision.html
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
<meta name="title" content="The Straightjacket of Indecision">
|
||||||
|
<meta name="slug" content="straightjacket-of-indecision">
|
||||||
|
<meta name="createdAt" content="2026-01-18T20:00:00.000Z">
|
||||||
|
<meta name="updatedAt" content="2026-01-18T20:00:00.000Z">
|
||||||
|
<meta name="tags" content="">
|
||||||
|
<meta name="guid" content="5d3b68de-35fb-48da-8caf-8f6f1f6398f5">
|
||||||
|
|
||||||
|
<article>
|
||||||
|
<p>
|
||||||
|
Over the last six or seven years living abroad in the faraway place of
|
||||||
|
Munich, Germany, I’ve often wondered when, or even whether, I might return
|
||||||
|
home to Melbourne, Australia. Even though I never spent much time
|
||||||
|
contemplating my distant future, my mother certainly didn’t let me forget
|
||||||
|
that she wished to have me back at home sooner rather than later. I'd
|
||||||
|
listen to her talk in absolutes every return visit, “when you’re back
|
||||||
|
next year…,” and so on. I shrugged it off as just motherly love. I'm
|
||||||
|
in Germany, Mum, and I’m staying here for now!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Despite this, the thought in the back of my mind that this overseas
|
||||||
|
journey would in all likelihood be ephemeral proved to be a constant
|
||||||
|
burden. Wherever I went, whichever decision I made, the immense doubt
|
||||||
|
haunted me. Before the COVID pandemic, I had originally planned
|
||||||
|
to study my Master’s, probably work a couple of years at a local
|
||||||
|
company “in the industry”, and then return home ideally feeling fulfilled and
|
||||||
|
satisfied. Like I had earnt some kind of imaginary certificate of
|
||||||
|
intercultural aptitude. Secretly however, I imagined falling in love
|
||||||
|
with a beautiful German girl and living in the idyllic Bavarian
|
||||||
|
countryside, happily ever after, even if I was unwilling to admit it
|
||||||
|
even to myself.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
But given the retreat of pandemic-related restrictions and regulations was
|
||||||
|
so gradual, as were too the many changes in my life circumstances
|
||||||
|
in-between, it never seemed like quite the right time to draw a line in the
|
||||||
|
sand. It would seem I became the frog in boiling water.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Finally, maybe around late 2023, things seemed to have settled. I chose to
|
||||||
|
move into my own apartment, after my roommate moved in with his
|
||||||
|
girlfriend. It became clear to me that I would soon have to give serious
|
||||||
|
thought as to whether I wanted to return home, or if I wanted to seriously
|
||||||
|
commit to “being German.” The weight I was carrying was growing
|
||||||
|
heavier, and somehow I knew this was slowing me down. I just didn't
|
||||||
|
realise how much exactly.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
In the first few years here, sure—it never made much sense to paint my
|
||||||
|
student dorm room or invest in expensive furniture, even once I began earning a
|
||||||
|
full-time salary—I figured I probably wouldn’t be here much longer,
|
||||||
|
anyway. But as the years went by and the dorm rooms became my own rental
|
||||||
|
apartments, I could feel the desire to invest in long-term commitments grow
|
||||||
|
stronger within me. Actually bringing any of them to fruition, on the other
|
||||||
|
hand, seemed impossible. I could hardly bring myself to buy a
|
||||||
|
dishwasher for the longest time: moving countries could have always been
|
||||||
|
right around the corner, so I had better not waste the money and effort.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Never knowing when I was going to leave, I froze in the face of more
|
||||||
|
important decisions, even ones that might have promised to greatly improve
|
||||||
|
my quality of life, and that seemed frankly banal to outsiders. It plagued
|
||||||
|
the back of my mind when searching for the motivation to meet people or go
|
||||||
|
on dates. What if I eventually want to go home? Will she lose interest in me
|
||||||
|
because I’m a flight risk?
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Whenever I would meet someone in my daily life, they would inevitably
|
||||||
|
ask me whether I would like to stay in Germany forever or if I plan to
|
||||||
|
move home at some stage. Over the years, I learnt to come with
|
||||||
|
pre-prepared answers that suggested I was comfortable with my
|
||||||
|
open-ended life abroad. But I wasn’t. I felt trapped, like I couldn’t
|
||||||
|
go anywhere. Like I couldn’t start any meaningful projects. I wanted to
|
||||||
|
take on so much more and feel resolute in each step. But I felt
|
||||||
|
suffocated by the idea that the rug would soon be pulled out from under
|
||||||
|
my feet.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I did however eventually start voicing the idea that, as long as I
|
||||||
|
don’t meet anybody here that I come to love so much that I simply must
|
||||||
|
stay, it would be better for me to go home. That was the beginning of
|
||||||
|
the end, I suppose, but the thought was so limp in spirit that it
|
||||||
|
hardly made any difference in my life. Instead it was the perfect
|
||||||
|
excuse to remain undecided: at any moment, the love of my life could
|
||||||
|
waltz around the corner. Ironically, this straitjacket of indecision
|
||||||
|
all but prevented me from doing anything about my bachelorhood.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Things did improve; I grew adamant that I would break down old habits
|
||||||
|
that were once born of helplessness. I found it increasingly easier to
|
||||||
|
“just do things,” as the chronically online say, but there was an upper
|
||||||
|
limit to their magnitude. Such things as buying more expensive home
|
||||||
|
furnishings or making slightly more long-term commitments became easier
|
||||||
|
(think “one year” rather than “a couple of months”), but nonetheless I
|
||||||
|
stillfelt tremendously stuck.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
In the summer of 2025, my parents visited and stayed with me for two
|
||||||
|
months, during which we went on many European trips alongside my daily
|
||||||
|
life in Munich. Afterwards, I joined them on the plane ride home and
|
||||||
|
visited Melbourne. This time, it was outside of the usual Christmas
|
||||||
|
holiday period so as to really get a sense of how life back home had
|
||||||
|
changed.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I stayed a month, bringing the total time spent with family and friends
|
||||||
|
to three months, which was a lot of time for me after having lived for
|
||||||
|
so long abroad. Alhoutgh I had visited for a month almost every year,
|
||||||
|
this time around felt a bit different. I felt like I was actually back
|
||||||
|
home, and not just peering through the window. Maybe it was the time of
|
||||||
|
year, maybe because of the high school reunion I attended, or maybe
|
||||||
|
even just due to how much time had passed since COVID. Whatever it was,
|
||||||
|
those three months made their mark. After saying our goodbyes at the
|
||||||
|
airport, I headed to stand in line at the first security checkpoint.
|
||||||
|
After turning the corner, I lost sight of my parents, and my heart
|
||||||
|
sank.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
For the first time in seven years, something felt wrong. I didn’t want
|
||||||
|
to leave any more. I realised that my time in Munich was over. After
|
||||||
|
two years of deliberating over the minutiae of my life and where I
|
||||||
|
lived, the epiphany seemed to come in an instant. It was emotional.
|
||||||
|
There was no logical breakthrough. No intellectual victory. I was just
|
||||||
|
homesick. After six years, no less.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Once I arrived back in Munich, everything about this charming place
|
||||||
|
became grossly annoying overnight. The northern winter annoyed me. The
|
||||||
|
people annoyed me. My job annoyed me. My entire surroundings were so
|
||||||
|
fastidious that I couldn’t wait to get home. Even the German language
|
||||||
|
that has brought me so much joy to learn, to which I effortlessly
|
||||||
|
dedicated so much time and interest; even it became a nuisance. I
|
||||||
|
wanted my native tongue back. I wanted effortless freedom of expression
|
||||||
|
back. I was imprinted with a culture when I was younger and I just
|
||||||
|
wanted it back.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Paradoxically, though, I felt fully liberated all of a sudden. Free to
|
||||||
|
do whatever I wanted. Having made the decision to pack up and leave
|
||||||
|
filled me with such a profound sense of direction that everything else
|
||||||
|
was able to just slide into place, as if a circuit had been completed.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
By forfeiting many potential futures for just one that I could count
|
||||||
|
on, the organisation of the rest of my life was able to spontaneously
|
||||||
|
emerge. I guess I always sensed this would happen, but I seriously
|
||||||
|
underestimated the ramifications. A cataclysmic domino effect resolved
|
||||||
|
a hierarchy of assumptions about who I was, where I was, and what I was
|
||||||
|
doing, running incredibly deep. Before, I was basically floundering.
|
||||||
|
Even though I could feel that I knew what feeling I wanted out of
|
||||||
|
life—and indeed I strove to work towards it&mash;I was
|
||||||
|
nonetheless totally directionless. And it was painful. Not so any more.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The irony of all this is that by making this decision, I suddenly feel
|
||||||
|
like <em>I know what I’m doing here right now</em> and can arrange the
|
||||||
|
coming months accordingly. I feel freer that ever to date people in
|
||||||
|
Germany and with even more intention than I did before. I feel like I
|
||||||
|
have permission to take on any domestic projects I feel like. Isn’t
|
||||||
|
that strange? I sure thought so. In all honesty I expected the opposite
|
||||||
|
outcome. But now there’s a timeline: I can see how it all fits into the
|
||||||
|
grand plan.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
There are more reasons to move home, however, than just family and
|
||||||
|
friends, as important as they are to me. They were simply the more
|
||||||
|
obvious tip of the iceberg, as it were.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Trying to live in two cultures at once results in a kind of purgatory,
|
||||||
|
and I suppose I never quite committed to living in one or the other.
|
||||||
|
But over the last few years, especially upon contemplating the
|
||||||
|
physiological and psychological impact of learnt helplessness, it
|
||||||
|
became clear that there was a deep desire in me to self-actualise, and
|
||||||
|
that it should be given more serious attention. During my preteen and
|
||||||
|
early teen years, I was a prolific user of the Adobe suite, I loved to
|
||||||
|
draw, write stories, and produce music. I loved to make silly games and
|
||||||
|
build worlds with atmosphere. It was here where I was completely in my
|
||||||
|
element, and I sense deep within myself that I need to reprise these
|
||||||
|
pursuits. Alas, it would seem I can hardly find the time (or if I am
|
||||||
|
honest, the energy) to invest in them. I have mostly blamed this on my
|
||||||
|
day job, but it has become increasingly obvious that I’m mostly
|
||||||
|
being stifled simply by <em>living alone in a foreign country</em>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The purpose of a culture is apparently to obviate the need to think
|
||||||
|
about what to do as much as possible so as to free up energy for more
|
||||||
|
niche specialisation. Having to think about how to greet somebody, or
|
||||||
|
what is appropriate to do in public versus in private, or even what
|
||||||
|
amount and what type of conversation is appropriate, and with
|
||||||
|
whom—these are all things that are imparted simply by virtue of
|
||||||
|
growing up in a particular culture. They are acquired in similar
|
||||||
|
fashion to language (and some might say that these two are indeed
|
||||||
|
exactly the same thing). If it weren’t for these effortless
|
||||||
|
assumptions, it might become an exhausting moment-by-moment decision
|
||||||
|
making process, in perpetuity. The broader cultural context can take
|
||||||
|
care of much of this, both in the aforementioned sense of traditions
|
||||||
|
and customs as well as by making use of particular industrial
|
||||||
|
specialisations, such as manufacturing and the provision of services
|
||||||
|
and application of expertise. This way, you can focus on you, so you
|
||||||
|
can “relax into complexity”.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The imprinting of childhood seems especially important. It's possible,
|
||||||
|
and certainly proven in the case of language acquisition, that children
|
||||||
|
growing up with multiple cultural contexts in parallel find the
|
||||||
|
context-switching relatively painless and easy, if not equally as easy
|
||||||
|
as the monoculturally reared child. These additional cultures are like
|
||||||
|
an extra sub-context within a single culture. Being “German” is, for
|
||||||
|
example, another social language, with its own grammar, akin to
|
||||||
|
attending church versus going to a bar. And it, too, has multiple
|
||||||
|
manifestations.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
But I am not a child of Germany. Neither is German my native tongue. I
|
||||||
|
may have long been a C2 speaker, and indeed, I live my life basically
|
||||||
|
incognito unless I explicitly mention my background—no one really
|
||||||
|
notices I’m not from around here. Yet no matter how good my language
|
||||||
|
skills get, this mismatch still presents as an extra layer of
|
||||||
|
abstraction. For the programmers out there: I do not feel like I’m
|
||||||
|
running on “bare metal” like I do back home. The extra latency becomes
|
||||||
|
cumulatively exhausting. I’m running in an interpreter, playing life on
|
||||||
|
hard mode, when the opportunity to compile to machine code and switch
|
||||||
|
to normal mode (or even easy) is right at my fingertips.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I previously described my circumstances as a purgatory, and this is an
|
||||||
|
apt word to exemplify the cultural incongruencies. The word itself is
|
||||||
|
frequently used—but only in English speaking cultures—in a
|
||||||
|
looser sense to refer to a state of suffering that is almost always
|
||||||
|
temporary, before a type of finalising “decision” relieves oneself of
|
||||||
|
it. This is not so in other languages. Whilst the word and idea of a
|
||||||
|
purgatory do exist in German (<em>Fegefeuer</em>), they don’t in this
|
||||||
|
metaphorical sense. Many other types of analogies, turns of phrases,
|
||||||
|
and cultural metaphors used in everyday life don't neatly map to one
|
||||||
|
another (even though some do, thanks to the more remotely shared
|
||||||
|
cultural and linguistic history).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I’ve come to believe that you might have to fully relinquish one
|
||||||
|
cultural context for another in order to remove the extra cognitive
|
||||||
|
burden. That would entail essentially “giving up” Australia once and
|
||||||
|
for all to stay in Germany and focus on more specialised pursuits. Upon
|
||||||
|
reflection, I think I really did do this for a few years, whilst I was
|
||||||
|
still enthralled by the joy of learning a new language to proficiency,
|
||||||
|
but its novelty soon faded.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
When I use my computer, I always have two keyboard layouts active,
|
||||||
|
depending on what I’m doing. One for writing German prose and
|
||||||
|
messaging, and another with my “native” layout for everything else. I
|
||||||
|
originally figured this two-pronged approach would make things easier,
|
||||||
|
but really, it's constant chaos. Forever having one foot in each door
|
||||||
|
is the same kind of chaos.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
As such, it now seems obvious to me that I have to return to a single
|
||||||
|
keyboard layout and go home. If I want to “relax into complexity,” then
|
||||||
|
I must free up as much energy as possible, and in making this decision
|
||||||
|
I can feel another entanglement of helplessness slowly unravel.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
And this time, it’s a big one.
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
52
public/static/assets/leaf-hrule.svg
Normal file
52
public/static/assets/leaf-hrule.svg
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="600"
|
||||||
|
height="200"
|
||||||
|
viewBox="0 0 158.74999 52.916668"
|
||||||
|
version="1.1"
|
||||||
|
id="svg1"
|
||||||
|
xml:space="preserve"
|
||||||
|
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
|
||||||
|
sodipodi:docname="leaf-hrule.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||||
|
id="namedview1"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:zoom="0.7071068"
|
||||||
|
inkscape:cx="137.17871"
|
||||||
|
inkscape:cy="316.78383"
|
||||||
|
inkscape:window-width="1266"
|
||||||
|
inkscape:window-height="1393"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="g5" /><defs
|
||||||
|
id="defs1" /><g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"><g
|
||||||
|
id="g5"
|
||||||
|
style="fill:#000000;stroke:#000000;stroke-opacity:1;stroke-width:1.3;stroke-dasharray:none;fill-opacity:1"><path
|
||||||
|
id="path2-0"
|
||||||
|
style="baseline-shift:baseline;display:inline;overflow:visible;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.929481;stroke-dasharray:none;stroke-opacity:1;enable-background:accumulate;stop-color:#000000"
|
||||||
|
d="M 103.36799,2.0313828 C 97.919154,6.8995967 91.471199,11.753746 84.827928,14.831058 c -4.362977,1.802096 -7.940465,3.040049 -11.394641,4.403503 -3.454176,1.363449 -6.340528,3.057676 -8.267644,6.14033 -5.22085,8.35138 -2.842185,15.068204 -2.842185,18.481449 0,1.724681 -0.525164,2.55968 -1.088384,3.071689 -0.281623,0.256023 -0.581502,0.429253 -0.853178,0.571351 -0.271683,0.142059 -0.508375,0.220652 -0.726356,0.438636 l -0.312575,0.312841 0.34742,0.273911 c 0,0 0.43272,0.34337 0.861888,0.72737 0.325042,0.274708 0.981643,0.921464 1.438104,1.018694 0.121413,-0.33841 0.149273,-0.378664 0.20343,-0.574424 0.08654,-0.303399 0.232353,-0.750599 0.467589,-1.236469 0.470475,-0.971733 1.282748,-2.076821 2.688155,-2.56133 1.994639,-0.687658 5.353958,-1.426431 8.946599,-2.343299 4.779239,-1.219641 10.22039,-3.069062 15.235023,-8.379103 3.958164,-4.191327 5.964278,-9.648825 8.06647,-14.648789 2.546547,-6.056845 4.690947,-13.8886065 5.770337,-18.4960119 z m -1.6799,2.6207028 C 99.213484,8.7236849 95.38472,13.701658 91.668482,16.58763 87.307543,19.974273 83.212921,21.794112 74.737857,30.305127 70.346392,34.715218 65.920596,41.07391 62.74313,46.05384 c 0.225405,-0.579954 0.367657,-1.301376 0.367657,-2.1975 0,-3.821879 -2.329429,-9.983672 2.722028,-18.064078 1.809189,-2.894025 4.502799,-4.488442 7.889987,-5.825454 3.387197,-1.337011 6.985264,-2.582493 11.406427,-4.408627 C 91.756327,12.8209 98.71462,7.200396 101.68809,4.6520856 Z m 0.41378,0.8876305 c -0.71109,2.8413561 -2.647102,8.5402999 -5.229556,14.6825349 -2.098514,4.991206 -4.085673,10.360534 -7.913256,14.413589 -4.882789,5.17043 -10.123643,6.948053 -14.857624,8.156201 -3.576477,0.912731 -6.922349,1.642756 -9.008606,2.362003 -0.373131,0.128561 -0.710252,0.293891 -1.014844,0.485256 3.110097,-4.803562 7.240508,-10.637834 11.291177,-14.705694 8.418826,-8.454539 12.395209,-10.186264 16.846328,-13.642933 3.719463,-2.888477 7.372902,-7.7041657 9.886381,-11.7509569 z"
|
||||||
|
sodipodi:nodetypes="csssssscccscssscsscccscssssccsssscsscs" /><path
|
||||||
|
id="path2-0-3"
|
||||||
|
style="baseline-shift:baseline;display:inline;overflow:visible;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.929481;stroke-dasharray:none;stroke-opacity:1;enable-background:accumulate;stop-color:#000000"
|
||||||
|
d="M 52.941073,2.0313827 C 47.492246,6.8995966 41.044291,11.753746 34.40102,14.831058 c -4.362977,1.802096 -7.940465,3.040049 -11.394641,4.403503 -3.454176,1.363449 -6.340528,3.057676 -8.267644,6.14033 -5.22085,8.35138 -2.842185,15.068204 -2.842185,18.481449 0,1.724681 -0.525164,2.55968 -1.088384,3.071689 -0.281623,0.256023 -0.581502,0.429253 -0.853178,0.571351 -0.271683,0.142059 -0.508375,0.220652 -0.726356,0.438636 l -0.312575,0.312841 0.34742,0.273911 c 0,0 0.43272,0.34337 0.861888,0.72737 0.325042,0.274708 0.981643,0.921464 1.438104,1.018694 0.121413,-0.33841 0.149273,-0.378664 0.20343,-0.574424 0.08654,-0.303399 0.232353,-0.750599 0.467589,-1.236469 0.470475,-0.971733 1.282748,-2.076821 2.688155,-2.56133 1.994639,-0.687658 5.353958,-1.426431 8.946599,-2.343299 4.779239,-1.219641 10.22039,-3.069062 15.235023,-8.379103 3.958164,-4.191327 5.964278,-9.648825 8.06647,-14.648789 2.546551,-6.056845 4.690938,-13.8886066 5.770328,-18.496012 z m -1.6799,2.6207028 C 48.786576,8.7236848 44.957812,13.701658 41.241574,16.58763 36.880635,19.974273 32.786013,21.794112 24.310949,30.305127 19.919484,34.715218 15.493688,41.07391 12.316222,46.05384 c 0.225405,-0.579954 0.367657,-1.301376 0.367657,-2.1975 0,-3.821879 -2.329429,-9.983672 2.722028,-18.064078 1.809189,-2.894025 4.502799,-4.488442 7.889987,-5.825454 3.387197,-1.337011 6.985264,-2.582493 11.406427,-4.408627 C 41.329419,12.8209 48.287712,7.2003959 51.261173,4.6520855 Z m 0.41378,0.8876305 c -0.711087,2.8413561 -2.647093,8.5403 -5.229547,14.682535 -2.098514,4.991206 -4.085673,10.360534 -7.913256,14.413589 -4.882789,5.17043 -10.123643,6.948053 -14.857624,8.156201 -3.576477,0.912731 -6.922349,1.642756 -9.008606,2.362003 -0.373131,0.128561 -0.710252,0.293891 -1.014844,0.485256 3.110097,-4.803562 7.240508,-10.637834 11.291177,-14.705694 8.418826,-8.454539 12.395209,-10.186264 16.846328,-13.642933 3.719463,-2.888477 7.372902,-7.7041657 9.886372,-11.750957 z"
|
||||||
|
sodipodi:nodetypes="csssssscccscssscsscccscssssccsssscsscs" /><path
|
||||||
|
id="path2-0-0"
|
||||||
|
style="baseline-shift:baseline;display:inline;overflow:visible;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.929481;stroke-dasharray:none;stroke-opacity:1;enable-background:accumulate;stop-color:#000000"
|
||||||
|
d="m 153.79494,2.0313831 c -5.44882,4.868213 -11.89678,9.7223629 -18.54005,12.7996749 -4.36298,1.802096 -7.94047,3.040049 -11.39464,4.403503 -3.45418,1.363449 -6.34053,3.057676 -8.26765,6.14033 -5.22084,8.35138 -2.84218,15.068204 -2.84218,18.481449 0,1.724681 -0.52516,2.55968 -1.08838,3.071689 -0.28163,0.256023 -0.58151,0.429253 -0.85318,0.571351 -0.27168,0.142059 -0.50838,0.220652 -0.72636,0.438636 l -0.31257,0.312841 0.34742,0.273911 c 0,0 0.43272,0.34337 0.86189,0.72737 0.32504,0.274708 0.98164,0.921464 1.4381,1.018694 0.12141,-0.33841 0.14927,-0.378664 0.20343,-0.574424 0.0865,-0.303399 0.23235,-0.750599 0.46759,-1.236469 0.47047,-0.971733 1.28275,-2.076821 2.68815,-2.56133 1.99464,-0.687658 5.35396,-1.426431 8.9466,-2.343299 4.77924,-1.219641 10.22039,-3.069062 15.23502,-8.379103 3.95817,-4.191327 5.96428,-9.648825 8.06647,-14.648789 2.54656,-6.056845 4.69094,-13.8886069 5.77033,-18.4960119 z m -1.6799,2.620702 c -2.47459,4.0716 -6.30336,9.0495729 -10.0196,11.9355449 -4.36093,3.386643 -8.45556,5.206482 -16.93062,13.717497 -4.39147,4.410091 -8.81726,10.768783 -11.99473,15.748713 0.22541,-0.579954 0.36766,-1.301376 0.36766,-2.1975 0,-3.821879 -2.32943,-9.983672 2.72203,-18.064078 1.80919,-2.894025 4.5028,-4.488442 7.88998,-5.825454 3.3872,-1.337011 6.98527,-2.582493 11.40643,-4.408627 6.6271,-2.737281 13.58539,-8.3577849 16.55885,-10.9060959 z m 0.41378,0.887631 c -0.71108,2.841356 -2.64709,8.5402999 -5.22954,14.6825349 -2.09852,4.991206 -4.08568,10.360534 -7.91326,14.413589 -4.88279,5.17043 -10.12364,6.948053 -14.85762,8.156201 -3.57648,0.912731 -6.92235,1.642756 -9.00861,2.362003 -0.37313,0.128561 -0.71025,0.293891 -1.01484,0.485256 3.11009,-4.803562 7.2405,-10.637834 11.29117,-14.705694 8.41883,-8.454539 12.39521,-10.186264 16.84633,-13.642933 3.71946,-2.888477 7.3729,-7.7041657 9.88637,-11.7509569 z"
|
||||||
|
sodipodi:nodetypes="csssssscccscssscsscccscssssccsssscsscs" /></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 7.9 KiB |
@@ -26,6 +26,7 @@
|
|||||||
--dj-palette1: #83a6bf;
|
--dj-palette1: #83a6bf;
|
||||||
--dj-palette2: #5e81ac;
|
--dj-palette2: #5e81ac;
|
||||||
--dj-palette3: #8fbcbb;
|
--dj-palette3: #8fbcbb;
|
||||||
|
--dj-prose: #98aab7;
|
||||||
--dj-visited: #8d8bd5;
|
--dj-visited: #8d8bd5;
|
||||||
--dj-bgpalette1: #2e3440;
|
--dj-bgpalette1: #2e3440;
|
||||||
}
|
}
|
||||||
@@ -43,7 +44,44 @@ html, body {
|
|||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, nav, .dj-title, .roboto-slab {
|
hr {
|
||||||
|
border: 0;
|
||||||
|
height: 1px;
|
||||||
|
background-image: linear-gradient(to right, transparent, var(--dj-prose), transparent);
|
||||||
|
margin: 40px 0 40px 0;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
&::before, &::after {
|
||||||
|
content: ' ';
|
||||||
|
position: absolute;
|
||||||
|
display: block;
|
||||||
|
margin: auto;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
background-color: var(--dj-bgpalette1);
|
||||||
|
width: 74px;
|
||||||
|
height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
width: 66px;
|
||||||
|
height: 22px;
|
||||||
|
background-color: var(--dj-prose);
|
||||||
|
background-size: cover;
|
||||||
|
mask-image: url('assets/leaf-hrule.svg');
|
||||||
|
mask-size: cover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: var(--dj-prose);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, nav, .dj-title {
|
||||||
font-family: "Baskervville", serif;
|
font-family: "Baskervville", serif;
|
||||||
font-optical-sizing: auto;
|
font-optical-sizing: auto;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
|
|||||||
Reference in New Issue
Block a user