get poetry stuff workin
This commit is contained in:
parent
3d22344e7f
commit
251620863c
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"svelte.svelte-vscode",
|
||||||
|
"editorconfig.editorconfig",
|
||||||
|
"dbaeumer.vscode-eslint"
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"editor.formatOnSave": true
|
||||||
|
}
|
|
@ -20,6 +20,7 @@
|
||||||
"@sveltejs/adapter-auto": "^3.0.0",
|
"@sveltejs/adapter-auto": "^3.0.0",
|
||||||
"@sveltejs/kit": "^2.0.0",
|
"@sveltejs/kit": "^2.0.0",
|
||||||
"@sveltejs/vite-plugin-svelte": "^3.0.0",
|
"@sveltejs/vite-plugin-svelte": "^3.0.0",
|
||||||
|
"@tailwindcss/typography": "^0.5.13",
|
||||||
"@theatre/core": "^0.7.1",
|
"@theatre/core": "^0.7.1",
|
||||||
"@theatre/studio": "^0.7.1",
|
"@theatre/studio": "^0.7.1",
|
||||||
"@threlte/theatre": "^2.1.7",
|
"@threlte/theatre": "^2.1.7",
|
||||||
|
@ -28,6 +29,7 @@
|
||||||
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
||||||
"@typescript-eslint/parser": "^7.0.0",
|
"@typescript-eslint/parser": "^7.0.0",
|
||||||
"autoprefixer": "^10.4.19",
|
"autoprefixer": "^10.4.19",
|
||||||
|
"daisyui": "^4.11.1",
|
||||||
"eslint": "^8.56.0",
|
"eslint": "^8.56.0",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-svelte": "^2.35.1",
|
"eslint-plugin-svelte": "^2.35.1",
|
||||||
|
@ -1811,6 +1813,34 @@
|
||||||
"vite": "^5.0.0"
|
"vite": "^5.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@tailwindcss/typography": {
|
||||||
|
"version": "0.5.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.13.tgz",
|
||||||
|
"integrity": "sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"lodash.castarray": "^4.4.0",
|
||||||
|
"lodash.isplainobject": "^4.0.6",
|
||||||
|
"lodash.merge": "^4.6.2",
|
||||||
|
"postcss-selector-parser": "6.0.10"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"tailwindcss": ">=3.0.0 || insiders"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
|
||||||
|
"version": "6.0.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
|
||||||
|
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"cssesc": "^3.0.0",
|
||||||
|
"util-deprecate": "^1.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@theatre/core": {
|
"node_modules/@theatre/core": {
|
||||||
"version": "0.7.1",
|
"version": "0.7.1",
|
||||||
"resolved": "https://registry.npmjs.org/@theatre/core/-/core-0.7.1.tgz",
|
"resolved": "https://registry.npmjs.org/@theatre/core/-/core-0.7.1.tgz",
|
||||||
|
@ -2966,6 +2996,16 @@
|
||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/css-selector-tokenizer": {
|
||||||
|
"version": "0.8.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz",
|
||||||
|
"integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"cssesc": "^3.0.0",
|
||||||
|
"fastparse": "^1.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/css-tree": {
|
"node_modules/css-tree": {
|
||||||
"version": "2.3.1",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
|
||||||
|
@ -3019,6 +3059,34 @@
|
||||||
"resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz",
|
"resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz",
|
||||||
"integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A=="
|
"integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A=="
|
||||||
},
|
},
|
||||||
|
"node_modules/culori": {
|
||||||
|
"version": "3.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz",
|
||||||
|
"integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/daisyui": {
|
||||||
|
"version": "4.11.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.11.1.tgz",
|
||||||
|
"integrity": "sha512-obT9CUbQdW6eoHwSeT5VwaRrWlwrM4OT5qlfdJ0oQlSIEYhwnEl2+L2fwu5PioLbitwuMdYC2X8I1cyy8Pf6LQ==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"css-selector-tokenizer": "^0.8",
|
||||||
|
"culori": "^3",
|
||||||
|
"picocolors": "^1",
|
||||||
|
"postcss-js": "^4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=16.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/daisyui"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/data-view-buffer": {
|
"node_modules/data-view-buffer": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
|
||||||
|
@ -3846,6 +3914,12 @@
|
||||||
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
|
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/fastparse": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
|
||||||
|
"integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/fastq": {
|
"node_modules/fastq": {
|
||||||
"version": "1.17.1",
|
"version": "1.17.1",
|
||||||
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
|
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
|
||||||
|
@ -4970,6 +5044,18 @@
|
||||||
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
|
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/lodash.castarray": {
|
||||||
|
"version": "4.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
|
||||||
|
"integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"node_modules/lodash.isplainobject": {
|
||||||
|
"version": "4.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
||||||
|
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/lodash.merge": {
|
"node_modules/lodash.merge": {
|
||||||
"version": "4.6.2",
|
"version": "4.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
"@sveltejs/adapter-auto": "^3.0.0",
|
"@sveltejs/adapter-auto": "^3.0.0",
|
||||||
"@sveltejs/kit": "^2.0.0",
|
"@sveltejs/kit": "^2.0.0",
|
||||||
"@sveltejs/vite-plugin-svelte": "^3.0.0",
|
"@sveltejs/vite-plugin-svelte": "^3.0.0",
|
||||||
|
"@tailwindcss/typography": "^0.5.13",
|
||||||
"@theatre/core": "^0.7.1",
|
"@theatre/core": "^0.7.1",
|
||||||
"@theatre/studio": "^0.7.1",
|
"@theatre/studio": "^0.7.1",
|
||||||
"@threlte/theatre": "^2.1.7",
|
"@threlte/theatre": "^2.1.7",
|
||||||
|
@ -25,6 +26,7 @@
|
||||||
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
||||||
"@typescript-eslint/parser": "^7.0.0",
|
"@typescript-eslint/parser": "^7.0.0",
|
||||||
"autoprefixer": "^10.4.19",
|
"autoprefixer": "^10.4.19",
|
||||||
|
"daisyui": "^4.11.1",
|
||||||
"eslint": "^8.56.0",
|
"eslint": "^8.56.0",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-svelte": "^2.35.1",
|
"eslint-plugin-svelte": "^2.35.1",
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
%sveltekit.head%
|
%sveltekit.head%
|
||||||
</head>
|
</head>
|
||||||
<body data-sveltekit-preload-data="hover">
|
<body data-sveltekit-preload-data="hover" data-theme="forest">
|
||||||
<div style="display: contents">%sveltekit.body%</div>
|
<div style="display: contents">%sveltekit.body%</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
<script context="module">
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
import Headline from './poetry/h1.svelte';
|
||||||
|
import p from './poetry/p.svelte';
|
||||||
|
export { Headline as h1, p };
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export let title;
|
||||||
|
export let date;
|
||||||
|
export let categories;
|
||||||
|
export let tags;
|
||||||
|
export let year;
|
||||||
|
export let layout;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<slot />
|
||||||
|
</main>
|
|
@ -41,7 +41,7 @@ export const fetchMarkdownPosts = async (
|
||||||
section: SectionKey,
|
section: SectionKey,
|
||||||
limit: number,
|
limit: number,
|
||||||
offset: number
|
offset: number
|
||||||
): Promise<Post[]> => {
|
): Promise<{posts: Post[], total: number}> => {
|
||||||
let posts: Record<string, () => Promise<unknown>>;
|
let posts: Record<string, () => Promise<unknown>>;
|
||||||
switch (section) {
|
switch (section) {
|
||||||
case 'poetry':
|
case 'poetry':
|
||||||
|
@ -74,7 +74,9 @@ export const fetchMarkdownPosts = async (
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
const paginatedPosts = allPosts.slice(offset, offset + limit);
|
const sortedPosts = allPosts.sort((a, b) => new Date(a.meta.date).getTime() - new Date(b.meta.date).getTime() );
|
||||||
|
|
||||||
return paginatedPosts;
|
const paginatedPosts = sortedPosts.slice(offset, offset + limit);
|
||||||
|
|
||||||
|
return {posts: paginatedPosts, total: allPosts.length};
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
<h1 class="poetry-headline">
|
||||||
|
<slot></slot>
|
||||||
|
</h1>
|
|
@ -0,0 +1,3 @@
|
||||||
|
<p class="whitespace-pre">
|
||||||
|
<slot></slot>
|
||||||
|
</p>
|
|
@ -7,29 +7,29 @@ tags:
|
||||||
title: Autumn Synesthesia
|
title: Autumn Synesthesia
|
||||||
|
|
||||||
---
|
---
|
||||||
The trees branch out their reds and yellows.
|
The trees branch out their reds and yellows.
|
||||||
Their last battle cry before the frost.
|
Their last battle cry before the frost.
|
||||||
The further north, the more pronounced
|
The further north, the more pronounced
|
||||||
As they recall the life they lost.
|
As they recall the life they lost.
|
||||||
Shouting in color upon deaf ears,
|
Shouting in color upon deaf ears,
|
||||||
Such beauty produced at a deadly cost.
|
Such beauty produced at a deadly cost.
|
||||||
|
|
||||||
The reds rage on
|
The reds rage on
|
||||||
With blistering hate.
|
With blistering hate.
|
||||||
"Is there no escape
|
"Is there no escape
|
||||||
From our inevitable fate?"
|
From our inevitable fate?"
|
||||||
|
|
||||||
The orange reminisce
|
The orange reminisce
|
||||||
On the seasons before.
|
On the seasons before.
|
||||||
"Winter is knocking,
|
"Winter is knocking,
|
||||||
But Spring is next door."
|
But Spring is next door."
|
||||||
|
|
||||||
The yellows enjoy
|
The yellows enjoy
|
||||||
The weather while it lasts.
|
The weather while it lasts.
|
||||||
"Best to live in the present
|
"Best to live in the present
|
||||||
Than the future or past."
|
Than the future or past."
|
||||||
|
|
||||||
The browns mutter softly
|
The browns mutter softly
|
||||||
The last lesson to learn.
|
The last lesson to learn.
|
||||||
"From dust I arose,
|
"From dust I arose,
|
||||||
So to dust I return."
|
So to dust I return."
|
||||||
|
|
|
@ -10,22 +10,22 @@ tags:
|
||||||
title: Breakfast Blue Pt. 2
|
title: Breakfast Blue Pt. 2
|
||||||
|
|
||||||
---
|
---
|
||||||
Oh, my good friend, I didn't mean to leave.
|
Oh, my good friend, I didn't mean to leave.
|
||||||
It wasn't your fault, so no longer grieve!
|
It wasn't your fault, so no longer grieve!
|
||||||
If I could, I would run back to your side.
|
If I could, I would run back to your side.
|
||||||
But, alas, a lack of legs slows my stride.
|
But, alas, a lack of legs slows my stride.
|
||||||
|
|
||||||
It's been over a year since I've last seen
|
It's been over a year since I've last seen
|
||||||
Your serious face and Chartwell's cuisine.
|
Your serious face and Chartwell's cuisine.
|
||||||
Often I think this is for the better
|
Often I think this is for the better
|
||||||
\'Til I shed tears as I read your letter.
|
\'Til I shed tears as I read your letter.
|
||||||
|
|
||||||
Fake tears, that is, for I also lack eyes.
|
Fake tears, that is, for I also lack eyes.
|
||||||
In fact, let me unveil my disguise:
|
In fact, let me unveil my disguise:
|
||||||
I'm an object lacking animation,
|
I'm an object lacking animation,
|
||||||
Given life through personification.
|
Given life through personification.
|
||||||
|
|
||||||
What words can I say to help you move on
|
What words can I say to help you move on
|
||||||
And accept the fact that I am now gone?
|
And accept the fact that I am now gone?
|
||||||
Know that I too will miss your sweet lovin'
|
Know that I too will miss your sweet lovin'
|
||||||
For I'll always be your chocolate muffin.
|
For I'll always be your chocolate muffin.
|
||||||
|
|
|
@ -1,29 +1,29 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2013-01-10 00:00:00 +0000
|
date: 2013-01-10 00:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Humor
|
- Humor
|
||||||
- Muffins
|
- Muffins
|
||||||
title: Breakfast Blues
|
title: Breakfast Blues
|
||||||
|
|
||||||
---
|
---
|
||||||
Lost my reason to wake in the morning
|
|
||||||
Ever since you left me without warning.
|
Lost my reason to wake in the morning
|
||||||
We've always seemed to have gotten along
|
Ever since you left me without warning.
|
||||||
|
We've always seemed to have gotten along
|
||||||
Now I'm wondering if I did you wrong.
|
Now I'm wondering if I did you wrong.
|
||||||
|
|
||||||
Lost my reason to give you thanks and praise.
|
Lost my reason to give you thanks and praise.
|
||||||
Each day that passes passes in a daze.
|
Each day that passes passes in a daze.
|
||||||
The life I live is a life of decay.
|
The life I live is a life of decay.
|
||||||
My happiness happens to never stay.
|
My happiness happens to never stay.
|
||||||
|
|
||||||
I would have treated you so much better,
|
I would have treated you so much better,
|
||||||
Or perhaps branded a scarlet letter
|
Or perhaps branded a scarlet letter
|
||||||
Across my chest and openly confess
|
Across my chest and openly confess
|
||||||
That I'm impressed by a snack I love best.
|
That I'm impressed by a snack I love best.
|
||||||
|
|
||||||
Oh chocolate muffin, why'd you have to leave?
|
Oh chocolate muffin, why'd you have to leave?
|
||||||
I've learned not to wear my heart on my sleeve.
|
I've learned not to wear my heart on my sleeve.
|
||||||
Instead my love will always be suppressed
|
Instead my love will always be suppressed
|
||||||
As I keep it locked in a chocolate chest.
|
As I keep it locked in a chocolate chest.
|
||||||
|
|
|
@ -6,6 +6,7 @@ tags:
|
||||||
- Christian
|
- Christian
|
||||||
title: Djinn
|
title: Djinn
|
||||||
year: 2019
|
year: 2019
|
||||||
|
layout: poetry
|
||||||
---
|
---
|
||||||
|
|
||||||
"Jesus dropped by."
|
"Jesus dropped by."
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2018-04-28 12:00:00 +0000
|
date: 2018-04-28 12:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Wisdom
|
- Wisdom
|
||||||
- Lessons
|
- Lessons
|
||||||
title: I've Seen
|
title: I've Seen
|
||||||
year: 2018
|
year: 2018
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
I've seen tears fall
|
I've seen tears fall
|
||||||
From the face of a giant,
|
From the face of a giant,
|
||||||
A hint of desperation
|
A hint of desperation
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2019-02-02 12:00:00 +0000
|
date: 2019-02-02 12:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Love
|
- Love
|
||||||
- Lovers
|
- Lovers
|
||||||
- Relationships
|
- Relationships
|
||||||
- Introspective
|
- Introspective
|
||||||
title: Infrared Homing
|
title: Infrared Homing
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -40,4 +40,3 @@ A candle
|
||||||
Can't replace it,
|
Can't replace it,
|
||||||
But any fire
|
But any fire
|
||||||
Is better than none.
|
Is better than none.
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2020-10-01 20:00:00 +0000
|
date: 2020-10-01 20:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Neuroscience
|
- Neuroscience
|
||||||
- Wisdom
|
- Wisdom
|
||||||
title: Judge Judy
|
title: Judge Judy
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
With each passing moment,
|
With each passing moment,
|
||||||
|
@ -28,4 +27,3 @@ The neurons are dismissed
|
||||||
Then return to jury duty
|
Then return to jury duty
|
||||||
For another microcosm case
|
For another microcosm case
|
||||||
In their show of Judge Judy.
|
In their show of Judge Judy.
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2018-06-25 20:00:00 +0000
|
date: 2018-06-25 20:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Chess
|
- Chess
|
||||||
- Lessons
|
- Lessons
|
||||||
title: King's Pin
|
title: King's Pin
|
||||||
year: 2018
|
year: 2018
|
||||||
---
|
---
|
||||||
|
@ -24,4 +24,3 @@ Synonymous to beginner.
|
||||||
|
|
||||||
A satisfying poach
|
A satisfying poach
|
||||||
Awarded to the winner.
|
Awarded to the winner.
|
||||||
|
|
||||||
|
|
|
@ -1,36 +1,36 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2014-10-27 00:00:00 +0000
|
date: 2014-10-27 00:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Humor
|
- Humor
|
||||||
title: Klepto Couches
|
title: Klepto Couches
|
||||||
|
|
||||||
---
|
---
|
||||||
My home houses countless couches.
|
|
||||||
Klepto-couches with pickpocket pouches
|
My home houses countless couches.
|
||||||
That swiftly swipe your cellular phone
|
Klepto-couches with pickpocket pouches
|
||||||
|
That swiftly swipe your cellular phone
|
||||||
Between the cushions of their comfy unknown.
|
Between the cushions of their comfy unknown.
|
||||||
|
|
||||||
Then your change jingles and jangles
|
Then your change jingles and jangles
|
||||||
Until they're untangled
|
Until they're untangled
|
||||||
From your Wrangler jeans pocket
|
From your Wrangler jeans pocket
|
||||||
As you wonder where your socks went.
|
As you wonder where your socks went.
|
||||||
|
|
||||||
But your socks and shoes
|
But your socks and shoes
|
||||||
Were swept under your feet
|
Were swept under your feet
|
||||||
Right under your nose.
|
Right under your nose.
|
||||||
|
|
||||||
So discreet are these deceitful seats
|
So discreet are these deceitful seats
|
||||||
As they watch you search
|
As they watch you search
|
||||||
For the keys they stole.
|
For the keys they stole.
|
||||||
|
|
||||||
At last your quest
|
At last your quest
|
||||||
Leads you straight to the crook.
|
Leads you straight to the crook.
|
||||||
"I should have guessed
|
"I should have guessed
|
||||||
The klepto-couches had took!"
|
The klepto-couches had took!"
|
||||||
|
|
||||||
But still your lesson
|
But still your lesson
|
||||||
Has yet to be learned.
|
Has yet to be learned.
|
||||||
These klepto-couches
|
These klepto-couches
|
||||||
Deserve to be burned.
|
Deserve to be burned.
|
||||||
|
|
|
@ -1,33 +1,33 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2012-02-25 00:00:00 +0000
|
date: 2012-02-25 00:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Grounds
|
- Grounds
|
||||||
- Covenant
|
- Covenant
|
||||||
title: Leafblower
|
title: Leafblower
|
||||||
|
|
||||||
---
|
---
|
||||||
You're the girl sitting on the park bench.
|
|
||||||
I'm the guy with a leaf blower.
|
You're the girl sitting on the park bench.
|
||||||
I've gotta do my job,
|
I'm the guy with a leaf blower.
|
||||||
|
I've gotta do my job,
|
||||||
So would you kindly please move over?
|
So would you kindly please move over?
|
||||||
|
|
||||||
I'm walking right towards you,
|
I'm walking right towards you,
|
||||||
So don't say you didn't notice me.
|
So don't say you didn't notice me.
|
||||||
I'd like to get off work soon,
|
I'd like to get off work soon,
|
||||||
So I'll give you until the count of three.
|
So I'll give you until the count of three.
|
||||||
|
|
||||||
One
|
One
|
||||||
Two
|
Two
|
||||||
...
|
...
|
||||||
|
|
||||||
Alright, so you've called my bluff.
|
Alright, so you've called my bluff.
|
||||||
I'm not really going to do anything.
|
I'm not really going to do anything.
|
||||||
I just wanted to look real tough,
|
I just wanted to look real tough,
|
||||||
But this little bee ain't got no sting.
|
But this little bee ain't got no sting.
|
||||||
|
|
||||||
I'll just tell my boss that I missed a spot,
|
I'll just tell my boss that I missed a spot,
|
||||||
And I'll explain my sad situation.
|
And I'll explain my sad situation.
|
||||||
Then we'll both laugh at the thought
|
Then we'll both laugh at the thought
|
||||||
Of me writing poetry about my frustration.
|
Of me writing poetry about my frustration.
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2019-10-26 12:00:00 +0000
|
date: 2019-10-26 12:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Wisdom
|
- Wisdom
|
||||||
title: Of Molecules And Men
|
title: Of Molecules And Men
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -49,4 +49,3 @@ To cease to be
|
||||||
Is to become
|
Is to become
|
||||||
Every friend
|
Every friend
|
||||||
And alleged foe.
|
And alleged foe.
|
||||||
|
|
||||||
|
|
|
@ -1,35 +1,35 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2012-03-01 00:00:00 +0000
|
date: 2012-03-01 00:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Grounds
|
- Grounds
|
||||||
- Covenant
|
- Covenant
|
||||||
title: Monday Morning Shift
|
title: Monday Morning Shift
|
||||||
|
|
||||||
---
|
---
|
||||||
These plants look beautiful, but not at this location.
|
|
||||||
They must be eradicated according to administration.
|
These plants look beautiful, but not at this location.
|
||||||
I brought out my tools; Some gloves and a spade,
|
They must be eradicated according to administration.
|
||||||
Then sat down, Indian style, to begin the raid.
|
I brought out my tools; Some gloves and a spade,
|
||||||
The roots, like little fingers, held on to dear life
|
Then sat down, Indian style, to begin the raid.
|
||||||
|
The roots, like little fingers, held on to dear life
|
||||||
As I cut through their homes with an oddly-shaped knife.
|
As I cut through their homes with an oddly-shaped knife.
|
||||||
|
|
||||||
To justify these cruel killings
|
To justify these cruel killings
|
||||||
I thought of what they've done:
|
I thought of what they've done:
|
||||||
Suffocated the superior plants
|
Suffocated the superior plants
|
||||||
And blocked out the lovely sun.
|
And blocked out the lovely sun.
|
||||||
|
|
||||||
But what makes one plant superior and the other inferior?
|
But what makes one plant superior and the other inferior?
|
||||||
Just the fact that the other has a beautiful exterior?
|
Just the fact that the other has a beautiful exterior?
|
||||||
They are simply trying their best to make a living.
|
They are simply trying their best to make a living.
|
||||||
We must see past our differences and be more forgiving.
|
We must see past our differences and be more forgiving.
|
||||||
|
|
||||||
But these thoughts lead down to a dangerous road;
|
But these thoughts lead down to a dangerous road;
|
||||||
Let's not personify each seed we've sowed.
|
Let's not personify each seed we've sowed.
|
||||||
|
|
||||||
The sun now rises and heats the ground.
|
The sun now rises and heats the ground.
|
||||||
The ice embedded within melts all around,
|
The ice embedded within melts all around,
|
||||||
And now a nice wet spot on my pants is found
|
And now a nice wet spot on my pants is found
|
||||||
Which leaves me thinking of thoughts more profound:
|
Which leaves me thinking of thoughts more profound:
|
||||||
"I really hope no one's looking at me right now."
|
"I really hope no one's looking at me right now."
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2016-05-10 00:00:00 +0000
|
date: 2016-05-10 00:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Work
|
- Work
|
||||||
- Worry
|
- Worry
|
||||||
- Self-conscious
|
- Self-conscious
|
||||||
title: Morning Commute
|
title: Morning Commute
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
A few minutes into my morning commute
|
A few minutes into my morning commute
|
||||||
|
@ -24,4 +23,3 @@ So I ditched the car and snuck into work,
|
||||||
Though I knew my hopes and dreams would be seen
|
Though I knew my hopes and dreams would be seen
|
||||||
Swirled amidst my self-doubt and worries
|
Swirled amidst my self-doubt and worries
|
||||||
Like creamer mixed in bitter cups of caffeine.
|
Like creamer mixed in bitter cups of caffeine.
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2015-07-15 00:00:00 +0000
|
date: 2015-07-15 00:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Relationships
|
- Relationships
|
||||||
- Love
|
- Love
|
||||||
- Drinking
|
- Drinking
|
||||||
- Humor
|
- Humor
|
||||||
title: Perfect Situation
|
title: Perfect Situation
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
When I'm hammered,
|
When I'm hammered,
|
||||||
|
@ -32,5 +31,3 @@ And I speculate the odds
|
||||||
Given a perfect situation
|
Given a perfect situation
|
||||||
In a parallel universe
|
In a parallel universe
|
||||||
If I'd rise to the occasion.
|
If I'd rise to the occasion.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2016-12-20 00:00:00 +0000
|
date: 2016-12-20 00:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Introspective
|
- Introspective
|
||||||
- Silence
|
- Silence
|
||||||
title: Silent Silas
|
title: Silent Silas
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
The windows to my soul
|
The windows to my soul
|
||||||
|
@ -24,4 +23,3 @@ But if it's any consolation,
|
||||||
I am striving to get better
|
I am striving to get better
|
||||||
At voicing my own thoughts
|
At voicing my own thoughts
|
||||||
Without resorting to writing letters.
|
Without resorting to writing letters.
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,15 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2014-07-20 00:00:00 +0000
|
date: 2014-07-20 00:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Love
|
- Love
|
||||||
- Relationships
|
- Relationships
|
||||||
- Realtalk
|
- Realtalk
|
||||||
title: Thought Experiment
|
title: Thought Experiment
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Love is a free fall
|
Love is a free fall
|
||||||
And I'm afraid of the ground.
|
And I'm afraid of the ground.
|
||||||
If I jump and no one's there,
|
If I jump and no one's there,
|
||||||
Will my body make a sound?
|
Will my body make a sound?
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2017-10-10 00:00:00 +0000
|
date: 2017-10-10 00:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Wisdom
|
- Wisdom
|
||||||
- Speech
|
- Speech
|
||||||
- Verbal Abuse
|
- Verbal Abuse
|
||||||
title: Unintentional Internalization
|
title: Unintentional Internalization
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Our skin's as thick
|
Our skin's as thick
|
||||||
|
@ -29,4 +28,3 @@ For each one we've endured,
|
||||||
We've dealt so many more
|
We've dealt so many more
|
||||||
For the most innocuous remark
|
For the most innocuous remark
|
||||||
Still can pierce like a sword.
|
Still can pierce like a sword.
|
||||||
|
|
||||||
|
|
|
@ -1,33 +1,33 @@
|
||||||
---
|
---
|
||||||
categories:
|
categories:
|
||||||
- Poetry
|
- Poetry
|
||||||
date: 2013-05-10 00:00:00 +0000
|
date: 2013-05-10 00:00:00 +0000
|
||||||
tags:
|
tags:
|
||||||
- Realtalk
|
- Realtalk
|
||||||
title: Who Am I?
|
title: Who Am I?
|
||||||
|
|
||||||
---
|
---
|
||||||
Am I the clothes on my back
|
|
||||||
And the hair on my head?
|
Am I the clothes on my back
|
||||||
Am I the people I'm with
|
And the hair on my head?
|
||||||
|
Am I the people I'm with
|
||||||
And the words I've said?
|
And the words I've said?
|
||||||
|
|
||||||
Am I the field I study
|
Am I the field I study
|
||||||
And the school I attend?
|
And the school I attend?
|
||||||
Am I the programs I write
|
Am I the programs I write
|
||||||
And the poems I've penned?
|
And the poems I've penned?
|
||||||
|
|
||||||
Am I the music I enjoy
|
Am I the music I enjoy
|
||||||
And the guitar I play?
|
And the guitar I play?
|
||||||
Am I the grade on my test
|
Am I the grade on my test
|
||||||
And my ten page essay?
|
And my ten page essay?
|
||||||
|
|
||||||
Am I the habits I've formed
|
Am I the habits I've formed
|
||||||
And the phrases I repeat?
|
And the phrases I repeat?
|
||||||
Am I the fake smile given
|
Am I the fake smile given
|
||||||
To every person I meet?
|
To every person I meet?
|
||||||
|
|
||||||
Am I the religion I follow
|
Am I the religion I follow
|
||||||
And the politician I elect?
|
And the politician I elect?
|
||||||
Am I every action I carry out
|
Am I every action I carry out
|
||||||
And every thought I reflect?
|
And every thought I reflect?
|
||||||
|
|
|
@ -1,7 +1,52 @@
|
||||||
<script lang="ts">
|
<script>
|
||||||
import App from '$lib/components/scenes/app/App.svelte';
|
import '../../app.css';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<App>
|
<div class="flex flex-col h-screen">
|
||||||
<slot />
|
<div class="navbar bg-base-300 sticky top-0 z-50">
|
||||||
</App>
|
<div class="navbar-start">
|
||||||
|
<div class="dropdown">
|
||||||
|
<div tabindex="-1" class="btn btn-ghost lg:hidden">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="h-5 w-5"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke="currentColor"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
d="M4 6h16M4 12h8m-8 6h16"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<ul
|
||||||
|
tabindex="-1"
|
||||||
|
class="menu menu-sm dropdown-content mt-3 z-10 p-2 shadow bg-base-300 rounded-box w-52"
|
||||||
|
>
|
||||||
|
<li><a href="/thoughts">Thoughts</a></li>
|
||||||
|
<li><a href="/poetry">Poetry</a></li>
|
||||||
|
<li><a href="/projects">Projects</a></li>
|
||||||
|
<li><a href="/experiments">Experiments</a></li>
|
||||||
|
<li><a href="/services">Services</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<a class="btn btn-outline btn-primary text-xl" href="/">silentsilas</a>
|
||||||
|
</div>
|
||||||
|
<div class="navbar-end hidden lg:flex">
|
||||||
|
<ul class="menu menu-horizontal px-1">
|
||||||
|
<li><a href="/thoughts">Thoughts</a></li>
|
||||||
|
<li><a href="/poetry">Poetry</a></li>
|
||||||
|
<li><a href="/projects">Projects</a></li>
|
||||||
|
<li><a href="/experiments">Experiments</a></li>
|
||||||
|
<li><a href="/services">Services</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col items-center flex-1 overflow-auto">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
|
@ -1,23 +1,106 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import MenuItem from '$lib/components/scenes/app/MenuItem.svelte';
|
import { onMount } from 'svelte';
|
||||||
|
import { fade } from 'svelte/transition';
|
||||||
|
|
||||||
|
type Greeting = {
|
||||||
|
greeting: string;
|
||||||
|
language: string;
|
||||||
|
romanisation?: string;
|
||||||
|
};
|
||||||
|
const GREETINGS: Greeting[] = [
|
||||||
|
{ greeting: '你好', language: 'Mandarin', romanisation: 'Nǐ hǎo' },
|
||||||
|
{ greeting: 'नमस्ते', language: 'Hindi', romanisation: 'Namaste' },
|
||||||
|
{ greeting: 'Hola', language: 'Spanish' },
|
||||||
|
{ greeting: 'হ্যালো', language: 'Bengali', romanisation: 'Hyālō' },
|
||||||
|
{ greeting: 'ہیلو', language: 'Urdu', romanisation: 'Hello' },
|
||||||
|
{ greeting: 'Oi', language: 'Portuguese' },
|
||||||
|
{ greeting: 'Здравствуйте', language: 'Russian', romanisation: 'Zdravstvuyte' },
|
||||||
|
{ greeting: 'こんにちは', language: 'Japanese', romanisation: "Kon'nichiwa" },
|
||||||
|
{ greeting: 'Merhaba', language: 'Turkish' },
|
||||||
|
{ greeting: '안녕하세요', language: 'Korean', romanisation: 'Annyeonghaseyo' },
|
||||||
|
{ greeting: 'Hallo', language: 'German' },
|
||||||
|
{ greeting: 'สวัสดี', language: 'Thai', romanisation: 'S̄wạs̄dī' },
|
||||||
|
{ greeting: 'مرحبا', language: 'Arabic', romanisation: 'Marhaba' },
|
||||||
|
{ greeting: 'היי', language: 'Hebrew', romanisation: 'Hi' },
|
||||||
|
{ greeting: 'Helo', language: 'Welsh' },
|
||||||
|
{ greeting: 'Pozdrav', language: 'Croatian' },
|
||||||
|
{ greeting: 'Hej', language: 'Swedish' },
|
||||||
|
{ greeting: 'Hyālō', language: 'Bengali' },
|
||||||
|
{ greeting: 'Salut', language: 'French' },
|
||||||
|
{ greeting: 'Ciao', language: 'Italian' }
|
||||||
|
];
|
||||||
|
|
||||||
|
let greetings = [...GREETINGS];
|
||||||
|
|
||||||
|
let currentGreeting: Greeting = { greeting: 'Hello', language: 'English' };
|
||||||
|
let visible = false;
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
visible = true;
|
||||||
|
const interval = setInterval(getRandomGreeting, 3000);
|
||||||
|
return () => clearInterval(interval);
|
||||||
|
});
|
||||||
|
|
||||||
|
async function getRandomGreeting() {
|
||||||
|
visible = false;
|
||||||
|
await new Promise((r) => setTimeout(r, 1000));
|
||||||
|
|
||||||
|
if (greetings.length === 0) {
|
||||||
|
greetings = [...GREETINGS];
|
||||||
|
}
|
||||||
|
|
||||||
|
const greetingIndex = Math.floor(Math.random() * greetings.length);
|
||||||
|
const greeting = greetings[greetingIndex];
|
||||||
|
greetings = greetings.filter((_, index) => index !== greetingIndex);
|
||||||
|
currentGreeting = greeting;
|
||||||
|
visible = true;
|
||||||
|
|
||||||
|
return greeting;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<MenuItem position={[-2.5, 7.5, 0]} htmlContent="Poetry" href="/poetry" />
|
<div class="container mx-auto flex flex-col justify-center items-center flex-1">
|
||||||
|
<div class="justify-center items-center text-center m-10">
|
||||||
<MenuItem
|
{#if visible && currentGreeting}
|
||||||
position={[2.5, 2.5, -2.5]}
|
<div
|
||||||
htmlContent="Projects"
|
transition:fade={{ duration: 1200 }}
|
||||||
clickHandler={() => console.log('clicked!')}
|
>
|
||||||
/>
|
<span class="font-bold">{currentGreeting.greeting}</span>
|
||||||
|
{#if currentGreeting.romanisation}
|
||||||
<MenuItem
|
<span class="text-gray-500">( {currentGreeting.romanisation} )</span>
|
||||||
position={[-2.5, -2.5, -2.5]}
|
{/if}
|
||||||
htmlContent="Thoughts"
|
</div>
|
||||||
clickHandler={() => console.log('clicked!')}
|
<p class="mt-2 text-gray-700" transition:fade={{ delay: 400, duration: 400 }}>
|
||||||
/>
|
That's {currentGreeting.language} for hello!
|
||||||
|
</p>
|
||||||
<MenuItem
|
{/if}
|
||||||
position={[2.5, -7.5, 2.5]}
|
</div>
|
||||||
htmlContent="About"
|
<div class="text-center prose px-4">
|
||||||
clickHandler={() => console.log('clicked!')}
|
<p>
|
||||||
/>
|
The name's Silas. I write code for a living, and sometimes for fun. I use <a
|
||||||
|
href="https://elixir-lang.org/"
|
||||||
|
target="_blank">Elixir</a
|
||||||
|
>
|
||||||
|
at my day job, and recently have been messing around with
|
||||||
|
<a href="https://elixir-lang.org/" target="_blank">Rust</a>,
|
||||||
|
<a href="https://kit.svelte.dev/" target="_blank">Svelte</a>, and
|
||||||
|
<a href="https://threejs.org/" target="_blank">three.js</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Here you can browse my shower <a href="/thoughts" class="link">thoughts</a> and bad
|
||||||
|
<a href="/poetry" class="link">poetry</a>. Opinions are personally mine and not endorsed by my
|
||||||
|
employer.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
I tend to start a lot of <a href="/projects" class="link">projects</a>, but I'm trying to
|
||||||
|
finish more. I also like to toy with weird web technologies and will host the
|
||||||
|
<a href="/experiments" class="link">experiments</a> here.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
I self-host a lot of <a href="/services" class="link">services</a> I find useful. None of them
|
||||||
|
run any analytics or log your activity, but the software/servers may be outdated, so use at your
|
||||||
|
own risk.
|
||||||
|
</p>
|
||||||
|
<p>Shalom.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
export const load = async ({ fetch, url }) => {
|
||||||
|
const limit = 8;
|
||||||
|
|
||||||
|
const page = Number(url.searchParams.get('page')) || 1;
|
||||||
|
|
||||||
|
const response = await fetch(`/api/poetry?limit=${limit}&page=${page}`);
|
||||||
|
const { posts, total } = await response.json();
|
||||||
|
|
||||||
|
return {
|
||||||
|
posts,
|
||||||
|
total,
|
||||||
|
page,
|
||||||
|
limit
|
||||||
|
};
|
||||||
|
};
|
|
@ -1,39 +1,70 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import MenuItem from '$lib/components/scenes/app/MenuItem.svelte';
|
import { goto } from '$app/navigation';
|
||||||
import type { PageData } from './$types';
|
import { page } from '$app/stores';
|
||||||
|
import type { PageData } from '../poetry/$types';
|
||||||
export let data: PageData;
|
export let data: PageData;
|
||||||
|
|
||||||
const xMin = -2.5,
|
const formatDate = (date: string) => {
|
||||||
xMax = 2.5;
|
return new Date(date).toLocaleDateString(undefined, {
|
||||||
const yMin = -7.5,
|
year: 'numeric',
|
||||||
yMax = 7.5;
|
month: 'long',
|
||||||
const zMin = -2.5,
|
day: 'numeric'
|
||||||
zMax = 2.5;
|
});
|
||||||
|
|
||||||
// Calculate positions
|
|
||||||
const calculatePositions = (numPosts: number): Array<[number, number, number]> => {
|
|
||||||
const positions: Array<[number, number, number]> = [];
|
|
||||||
const numRows = Math.ceil(Math.sqrt(numPosts));
|
|
||||||
const numCols = Math.ceil(numPosts / numRows);
|
|
||||||
|
|
||||||
for (let i = 0; i < numPosts; i++) {
|
|
||||||
const row = Math.floor(i / numCols);
|
|
||||||
const col = i % numCols;
|
|
||||||
|
|
||||||
const x = xMin + (xMax - xMin) * (col / (numCols - 1));
|
|
||||||
const y = yMin + (yMax - yMin) * (row / (numRows - 1));
|
|
||||||
const z = zMin;
|
|
||||||
|
|
||||||
positions.push([x, y, z]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return positions;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Generate positions based on the number of posts
|
let { posts, total } = data;
|
||||||
const positions = calculatePositions(data.posts.length);
|
const limit = 8;
|
||||||
|
|
||||||
|
let currentPage = Number($page.url.searchParams.get('page')) || 1;
|
||||||
|
let totalPages = Math.ceil(total / limit);
|
||||||
|
$: $page.url.searchParams.get('page'),
|
||||||
|
(currentPage = Number($page.url.searchParams.get('page')) || 1);
|
||||||
|
|
||||||
|
async function fetchData(page: number) {
|
||||||
|
const response = await fetch(`/api/poetry?limit=${limit}&page=${page}`);
|
||||||
|
const newData = await response.json();
|
||||||
|
currentPage = page;
|
||||||
|
posts = newData.posts;
|
||||||
|
total = newData.total;
|
||||||
|
totalPages = Math.ceil(total / limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
function navigate(page: number) {
|
||||||
|
fetchData(page);
|
||||||
|
goto(`/poetry/?page=${page}`, { replaceState: true });
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#each data.posts as post, i}
|
<div class="container mx-auto flex flex-col items-center py-10">
|
||||||
<MenuItem position={positions[i]} htmlContent={post.meta.title} href={post.path} />
|
<div class="prose">
|
||||||
{/each}
|
<h1 class="py-6">Poetry</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
{#each posts as post}
|
||||||
|
<li class="py-4">
|
||||||
|
<h3 class="pb-1">
|
||||||
|
<a class="link" href={post.path}>
|
||||||
|
{post.meta.title}
|
||||||
|
</a>
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm">{formatDate(post.meta.date)}</p>
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{#if total > 1}
|
||||||
|
<nav class="join justify-end">
|
||||||
|
<button
|
||||||
|
class="join-item btn-primary btn btn-outline"
|
||||||
|
on:click={() => navigate(currentPage - 1)}
|
||||||
|
disabled={currentPage === 1}>Prev</button
|
||||||
|
>
|
||||||
|
<button class="join-item btn btn-outline">{currentPage} of {totalPages}</button>
|
||||||
|
<button
|
||||||
|
class="join-item btn btn-primary btn-outline"
|
||||||
|
on:click={() => navigate(currentPage + 1)}
|
||||||
|
disabled={currentPage === totalPages}>Next</button
|
||||||
|
>
|
||||||
|
</nav>
|
||||||
|
{/if}
|
||||||
|
|
|
@ -1,19 +1,16 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import MenuItem from '$lib/components/scenes/app/MenuItem.svelte';
|
|
||||||
import type { PageData } from './$types';
|
import type { PageData } from './$types';
|
||||||
import DomPortal from '$lib/utils/DomPortal.svelte';
|
|
||||||
export let data: PageData;
|
export let data: PageData;
|
||||||
|
|
||||||
const { title, date: _date, Content, categories: _ } = data;
|
const { title, date: _date, Content, categories: _ } = data;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<MenuItem position={[-2.5, 10, 0]} htmlContent="Back" href="/poetry" />
|
<div class="container mx-auto flex flex-col items-center py-10">
|
||||||
|
<div class="prose">
|
||||||
<DomPortal target="#overlay">
|
<h1 class="py-6">{title}</h1>
|
||||||
<div class="py-4">
|
|
||||||
<h1 class="text-xl font-medium text-black pb-2">{title}</h1>
|
|
||||||
<div>
|
|
||||||
<Content />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</DomPortal>
|
<div class="prose">
|
||||||
|
<Content />
|
||||||
|
</div>
|
||||||
|
<a href="/poetry" class="link mt-10">Back to Poetry</a>
|
||||||
|
</div>
|
||||||
|
|
|
@ -13,6 +13,7 @@ export async function load({ params }) {
|
||||||
Content,
|
Content,
|
||||||
title,
|
title,
|
||||||
date: validDate,
|
date: validDate,
|
||||||
categories
|
categories,
|
||||||
|
post
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,38 +1 @@
|
||||||
<script lang="ts">
|
<slot />
|
||||||
import CanvasContainer from '$lib/components/scenes/app/CanvasContainer.svelte';
|
|
||||||
import '../app.css';
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<CanvasContainer>
|
|
||||||
<slot />
|
|
||||||
</CanvasContainer>
|
|
||||||
|
|
||||||
<div class="overlay container" id="overlay"></div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
:global(body) {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.canvas {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: rgb(0, 36, 6);
|
|
||||||
background: linear-gradient(180deg, rgba(0, 36, 6, 1) 0%, rgba(0, 0, 0, 1) 100%);
|
|
||||||
position: absolute;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.overlay {
|
|
||||||
position: absolute;
|
|
||||||
left: 50%;
|
|
||||||
top: 50%;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
background: rgba(16, 56, 30, 0.9);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
export const prerender = true
|
export const prerender = true
|
||||||
export const ssr = false
|
export const ssr = true
|
||||||
|
|
|
@ -2,13 +2,14 @@ import { fetchMarkdownPosts } from '$lib/utils';
|
||||||
import { json } from '@sveltejs/kit';
|
import { json } from '@sveltejs/kit';
|
||||||
|
|
||||||
export const GET = async ({ url }) => {
|
export const GET = async ({ url }) => {
|
||||||
const limit = Number(url.searchParams.get('limit')) || 6;
|
const page = Number(url.searchParams.get('page')) || 1;
|
||||||
const offset = Number(url.searchParams.get('offset')) || 0;
|
const limit = Number(url.searchParams.get('limit')) || 8;
|
||||||
const allPosts = await fetchMarkdownPosts('poetry', limit, offset);
|
const offset = (page - 1) * limit;
|
||||||
|
const {posts: allPosts, total: total} = await fetchMarkdownPosts('poetry', limit, offset);
|
||||||
|
|
||||||
const sortedPosts = allPosts.sort((a, b) => {
|
const sortedPosts = allPosts.sort((a, b) => {
|
||||||
return new Date(b.meta.date).getTime() - new Date(a.meta.date).getTime();
|
return new Date(b.meta.date).getTime() - new Date(a.meta.date).getTime();
|
||||||
});
|
});
|
||||||
|
|
||||||
return json(sortedPosts);
|
return json({posts: sortedPosts, total: total, page: page});
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import App from '$lib/components/scenes/app/App.svelte';
|
||||||
|
import CanvasContainer from '$lib/components/scenes/app/CanvasContainer.svelte';
|
||||||
|
import '../../app.css'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<CanvasContainer>
|
||||||
|
<App>
|
||||||
|
<slot />
|
||||||
|
</App>
|
||||||
|
|
||||||
|
</CanvasContainer>
|
||||||
|
|
||||||
|
<div class="overlay container" id="overlay"></div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
:global(body) {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.canvas {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgb(0, 36, 6);
|
||||||
|
background: linear-gradient(180deg, rgba(0, 36, 6, 1) 0%, rgba(0, 0, 0, 1) 100%);
|
||||||
|
position: absolute;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
background: rgba(16, 56, 30, 0.9);
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,2 @@
|
||||||
|
export const prerender = true
|
||||||
|
export const ssr = false
|
|
@ -0,0 +1,37 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import MenuItem from '$lib/components/scenes/app/MenuItem.svelte';
|
||||||
|
import type { PageData } from './$types';
|
||||||
|
export let data: PageData;
|
||||||
|
|
||||||
|
const xMin = -2.5,
|
||||||
|
xMax = 2.5;
|
||||||
|
const yMin = -7.5,
|
||||||
|
yMax = 7.5;
|
||||||
|
const zMin = -2.5,
|
||||||
|
zMax = 2.5;
|
||||||
|
|
||||||
|
const calculatePositions = (numPosts: number): Array<[number, number, number]> => {
|
||||||
|
const positions: Array<[number, number, number]> = [];
|
||||||
|
const numRows = Math.ceil(Math.sqrt(numPosts));
|
||||||
|
const numCols = Math.ceil(numPosts / numRows);
|
||||||
|
|
||||||
|
for (let i = 0; i < numPosts; i++) {
|
||||||
|
const row = Math.floor(i / numCols);
|
||||||
|
const col = i % numCols;
|
||||||
|
|
||||||
|
const x = xMin + (xMax - xMin) * (col / (numCols - 1));
|
||||||
|
const y = yMin + (yMax - yMin) * (row / (numRows - 1));
|
||||||
|
const z = zMin;
|
||||||
|
|
||||||
|
positions.push([x, y, z]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return positions;
|
||||||
|
};
|
||||||
|
|
||||||
|
const positions = calculatePositions(data.posts.length);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#each data.posts as post, i}
|
||||||
|
<MenuItem position={positions[i]} htmlContent={post.meta.title} href={post.path} />
|
||||||
|
{/each}
|
|
@ -6,7 +6,10 @@ import { mdsvex } from 'mdsvex';
|
||||||
const config = {
|
const config = {
|
||||||
// Consult https://kit.svelte.dev/docs/integrations#preprocessors
|
// Consult https://kit.svelte.dev/docs/integrations#preprocessors
|
||||||
// for more information about preprocessors
|
// for more information about preprocessors
|
||||||
preprocess: [vitePreprocess(), mdsvex({ extensions: ['.md'] })],
|
preprocess: [vitePreprocess(), mdsvex({ extensions: ['.md'], layout: {
|
||||||
|
poetry: './src/lib/utils/PoetryLayout.svelte'
|
||||||
|
}})],
|
||||||
|
|
||||||
|
|
||||||
kit: {
|
kit: {
|
||||||
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
|
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
|
||||||
|
|
|
@ -4,6 +4,10 @@ export default {
|
||||||
theme: {
|
theme: {
|
||||||
extend: {},
|
extend: {},
|
||||||
},
|
},
|
||||||
plugins: [],
|
plugins: [require("@tailwindcss/typography"), require('daisyui')],
|
||||||
|
daisyui: {
|
||||||
|
themes: ["light", "forest"],
|
||||||
|
darkMode: "forest"
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue