From 2cacba81b8f6c0bcb0999d11d424f400b46d19c3 Mon Sep 17 00:00:00 2001 From: cirroskais Date: Sun, 21 Apr 2024 08:07:35 -0400 Subject: [PATCH] BLOOOOOG 3 --- bun.lockb | Bin 102427 -> 105580 bytes package.json | 4 +- src/app.css | 2 +- src/lib/blog.json | 18 +- src/lib/components/Footer.svelte | 2 +- src/routes/+page.svelte | 12 +- src/routes/blog/+page.svelte | 8 +- src/routes/blog/[slug]/+page.js | 5 + src/routes/blog/[slug]/+page.svelte | 46 +++ static/blog/hardware.md | 1 + static/blog/hello-world.md | 1 + static/blog/test-post.md | 281 ++++++++++++++++++ static/{ => img}/background.jpg | Bin .../img/{blogtest3.gif => blog/hardware.gif} | Bin .../{blogtest2.gif => blog/hello-world.gif} | Bin .../img/{blogtest1.gif => blog/test-post.gif} | Bin static/{ => img}/buttons/cirro.png | Bin static/{ => img}/buttons/firefox.gif | Bin static/{ => img}/buttons/lol.gif | Bin static/{ => img}/buttons/rovin.png | Bin static/{ => img}/buttons/split.png | Bin static/{ => img}/buttons/twopaws.png | Bin .../{ => img}/icons/coolify-transparent.png | Bin tailwind.config.js | 2 +- 24 files changed, 364 insertions(+), 18 deletions(-) create mode 100644 src/routes/blog/[slug]/+page.js create mode 100644 src/routes/blog/[slug]/+page.svelte create mode 100644 static/blog/hardware.md create mode 100644 static/blog/hello-world.md create mode 100644 static/blog/test-post.md rename static/{ => img}/background.jpg (100%) rename static/img/{blogtest3.gif => blog/hardware.gif} (100%) rename static/img/{blogtest2.gif => blog/hello-world.gif} (100%) rename static/img/{blogtest1.gif => blog/test-post.gif} (100%) rename static/{ => img}/buttons/cirro.png (100%) rename static/{ => img}/buttons/firefox.gif (100%) rename static/{ => img}/buttons/lol.gif (100%) rename static/{ => img}/buttons/rovin.png (100%) rename static/{ => img}/buttons/split.png (100%) rename static/{ => img}/buttons/twopaws.png (100%) rename static/{ => img}/icons/coolify-transparent.png (100%) diff --git a/bun.lockb b/bun.lockb index 2c8ca85d14f8962e42d0aed3f63d0c31fab2514f..1e44f840be426a2f24c14edd0dc47ec2b56bbb59 100755 GIT binary patch delta 20204 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 Q<}X#vgooT_GQIWx0NL~OxBvhE delta 18210 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 diff --git a/package.json b/package.json index 9c20233..8683305 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "@sveltejs/adapter-auto": "^3.0.0", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@tailwindcss/typography": "^0.5.12", "autoprefixer": "^10.4.19", "postcss": "^8.4.38", "prettier": "^3.1.1", @@ -29,6 +30,7 @@ }, "type": "module", "dependencies": { - "@sveltejs/enhanced-img": "^0.2.0" + "@sveltejs/enhanced-img": "^0.2.0", + "svelte-markdown": "^0.4.1" } } diff --git a/src/app.css b/src/app.css index 10d594c..e30be15 100644 --- a/src/app.css +++ b/src/app.css @@ -15,7 +15,7 @@ body { } .hero { - background-image: url(/background.jpg); + background-image: url(/img/background.jpg); background-repeat: no-repeat; background-attachment: fixed; background-position: center; diff --git a/src/lib/blog.json b/src/lib/blog.json index 646d30e..bcb79b8 100644 --- a/src/lib/blog.json +++ b/src/lib/blog.json @@ -1,5 +1,17 @@ [ - { "id": 1, "slug": "hello-world", "title": "Hello, World!", "image": "/img/blogtest1.gif" }, - { "id": 2, "slug": "hardware", "title": "Hardware", "image": "/img/blogtest2.gif" }, - { "id": 3, "slug": "test-post", "title": "Test Post", "image": "/img/blogtest3.gif" } + { + "slug": "hello-world", + "title": "Hello, World!", + "image": "/img/blog/hello-world.gif" + }, + { + "slug": "hardware", + "title": "Hardware", + "image": "/img/blog/hardware.gif" + }, + { + "slug": "test-post", + "title": "Test Post", + "image": "/img/blog/test-post.gif" + } ] diff --git a/src/lib/components/Footer.svelte b/src/lib/components/Footer.svelte index eda692f..1506d72 100644 --- a/src/lib/components/Footer.svelte +++ b/src/lib/components/Footer.svelte @@ -69,7 +69,7 @@ class="flex space-x-0.5 text-[#8c52ff] underline underline-offset-[3px]" >
- +

Coolify

diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index bc3cf65..ca04994 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -102,13 +102,13 @@
- - - - + + + - - + +
diff --git a/src/routes/blog/+page.svelte b/src/routes/blog/+page.svelte index dff933b..cbeafed 100644 --- a/src/routes/blog/+page.svelte +++ b/src/routes/blog/+page.svelte @@ -21,10 +21,8 @@ while (page.length < 16) { page.push({ - id: -1, - title: '', - image: '', - slug: '' + // @ts-ignore + filler: true }); } @@ -45,7 +43,7 @@
{#key posts} {#each posts as post, i} - {#if post.id === -1} + {#if post.filler} {:else} diff --git a/src/routes/blog/[slug]/+page.js b/src/routes/blog/[slug]/+page.js new file mode 100644 index 0000000..4ea6a99 --- /dev/null +++ b/src/routes/blog/[slug]/+page.js @@ -0,0 +1,5 @@ +export function load({ params }) { + return { + slug: params.slug + }; +} diff --git a/src/routes/blog/[slug]/+page.svelte b/src/routes/blog/[slug]/+page.svelte new file mode 100644 index 0000000..75ade24 --- /dev/null +++ b/src/routes/blog/[slug]/+page.svelte @@ -0,0 +1,46 @@ + + +
+
+
+
+

+ {thisPost?.title} +

+
+
+
+ + + + {#key markdown} +
+ +
+ {/key} +
diff --git a/static/blog/hardware.md b/static/blog/hardware.md new file mode 100644 index 0000000..213ee11 --- /dev/null +++ b/static/blog/hardware.md @@ -0,0 +1 @@ +There doesn't appear to be anything here yet... diff --git a/static/blog/hello-world.md b/static/blog/hello-world.md new file mode 100644 index 0000000..213ee11 --- /dev/null +++ b/static/blog/hello-world.md @@ -0,0 +1 @@ +There doesn't appear to be anything here yet... diff --git a/static/blog/test-post.md b/static/blog/test-post.md new file mode 100644 index 0000000..7dae036 --- /dev/null +++ b/static/blog/test-post.md @@ -0,0 +1,281 @@ +## Overview + +### Philosophy + +Markdown is intended to be as easy-to-read and easy-to-write as is feasible. + +Readability, however, is emphasized above all else. A Markdown-formatted +document should be publishable as-is, as plain text, without looking +like it's been marked up with tags or formatting instructions. While +Markdown's syntax has been influenced by several existing text-to-HTML +filters -- including [Setext](http://docutils.sourceforge.net/mirror/setext.html), [atx](http://www.aaronsw.com/2002/atx/), [Textile](http://textism.com/tools/textile/), [reStructuredText](http://docutils.sourceforge.net/rst.html), +[Grutatext](http://www.triptico.com/software/grutatxt.html), and [EtText](http://ettext.taint.org/doc/) -- the single biggest source of +inspiration for Markdown's syntax is the format of plain text email. + +## Block Elements + +### Paragraphs and Line Breaks + +A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing but spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs. + +The implication of the "one or more consecutive lines of text" rule is +that Markdown supports "hard-wrapped" text paragraphs. This differs +significantly from most other text-to-HTML formatters (including Movable +Type's "Convert Line Breaks" option) which translate every line break +character in a paragraph into a `
` tag. + +When you _do_ want to insert a `
` break tag using Markdown, you +end a line with two or more spaces, then type return. + +### Headers + +Markdown supports two styles of headers, [Setext] [1] and [atx] [2]. + +Optionally, you may "close" atx-style headers. This is purely +cosmetic -- you can use this if you think it looks better. The +closing hashes don't even need to match the number of hashes +used to open the header. (The number of opening hashes +determines the header level.) + +### Blockquotes + +Markdown uses email-style `>` characters for blockquoting. If you're +familiar with quoting passages of text in an email message, then you +know how to create a blockquote in Markdown. It looks best if you hard +wrap the text and put a `>` before every line: + +> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, +> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. +> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. +> +> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse +> id sem consectetuer libero luctus adipiscing. + +Markdown allows you to be lazy and only put the `>` before the first +line of a hard-wrapped paragraph: + +> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, +> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. +> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. + +> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse +> id sem consectetuer libero luctus adipiscing. + +Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by +adding additional levels of `>`: + +> This is the first level of quoting. +> +> > This is nested blockquote. +> +> Back to the first level. + +Blockquotes can contain other Markdown elements, including headers, lists, +and code blocks: + +> ## This is a header. +> +> 1. This is the first list item. +> 2. This is the second list item. +> +> Here's some example code: +> +> return shell_exec("echo $input | $markdown_script"); + +Any decent text editor should make email-style quoting easy. For +example, with BBEdit, you can make a selection and choose Increase +Quote Level from the Text menu. + +### Lists + +Markdown supports ordered (numbered) and unordered (bulleted) lists. + +Unordered lists use asterisks, pluses, and hyphens -- interchangably +-- as list markers: + +- Red +- Green +- Blue + +is equivalent to: + +- Red +- Green +- Blue + +and: + +- Red +- Green +- Blue + +Ordered lists use numbers followed by periods: + +1. Bird +2. McHale +3. Parish + +It's important to note that the actual numbers you use to mark the +list have no effect on the HTML output Markdown produces. The HTML +Markdown produces from the above list is: + +If you instead wrote the list in Markdown like this: + +1. Bird +1. McHale +1. Parish + +or even: + +3. Bird +1. McHale +1. Parish + +you'd get the exact same HTML output. The point is, if you want to, +you can use ordinal numbers in your ordered Markdown lists, so that +the numbers in your source match the numbers in your published HTML. +But if you want to be lazy, you don't have to. + +To make lists look nice, you can wrap items with hanging indents: + +- Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. +- Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. + +But if you want to be lazy, you don't have to: + +- Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. +- Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. + +List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be indented by either 4 spaces +or one tab: + +1. This is a list item with two paragraphs. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. Aliquam hendrerit + mi posuere lectus. + + Vestibulum enim wisi, viverra nec, fringilla in, laoreet + vitae, risus. Donec sit amet nisl. Aliquam semper ipsum + sit amet velit. + +2. Suspendisse id sem consectetuer libero luctus adipiscing. + +It looks nice if you indent every line of the subsequent +paragraphs, but here again, Markdown will allow you to be +lazy: + +- This is a list item with two paragraphs. + + This is the second paragraph in the list item. You're + + only required to indent the first line. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. + +- Another item in the same list. + +To put a blockquote within a list item, the blockquote's `>` +delimiters need to be indented: + +- A list item with a blockquote: + + > This is a blockquote + > inside a list item. + +To put a code block within a list item, the code block needs +to be indented _twice_ -- 8 spaces or two tabs: + +- A list item with a code block: + + + +### Code Blocks + +Pre-formatted code blocks are used for writing about programming or +markup source code. Rather than forming normal paragraphs, the lines +of a code block are interpreted literally. Markdown wraps a code block +in both `
` and `` tags.
+
+To produce a code block in Markdown, simply indent every line of the
+block by at least 4 spaces or 1 tab.
+
+This is a normal paragraph:
+
+    This is a code block.
+
+Here is an example of AppleScript:
+
+    tell application "Foo"
+        beep
+    end tell
+
+A code block continues until it reaches a line that is not indented
+(or the end of the article).
+
+Within a code block, ampersands (`&`) and angle brackets (`<` and `>`)
+are automatically converted into HTML entities. This makes it very
+easy to include example HTML source code using Markdown -- just paste
+it and indent it, and Markdown will handle the hassle of encoding the
+ampersands and angle brackets. For example, this:
+
+    
+
+Regular Markdown syntax is not processed within code blocks. E.g.,
+asterisks are just literal asterisks within a code block. This means
+it's also easy to use Markdown to write about Markdown's own syntax.
+
+```
+tell application "Foo"
+    beep
+end tell
+```
+
+## Span Elements
+
+### Links
+
+Markdown supports two style of links: _inline_ and _reference_.
+
+In both styles, the link text is delimited by [square brackets].
+
+To create an inline link, use a set of regular parentheses immediately
+after the link text's closing square bracket. Inside the parentheses,
+put the URL where you want the link to point, along with an _optional_
+title for the link, surrounded in quotes. For example:
+
+This is [an example](http://example.com/) inline link.
+
+[This link](http://example.net/) has no title attribute.
+
+### Emphasis
+
+Markdown treats asterisks (`*`) and underscores (`_`) as indicators of
+emphasis. Text wrapped with one `*` or `_` will be wrapped with an
+HTML `` tag; double `*`'s or `_`'s will be wrapped with an HTML
+`` tag. E.g., this input:
+
+_single asterisks_
+
+_single underscores_
+
+**double asterisks**
+
+**double underscores**
+
+### Code
+
+To indicate a span of code, wrap it with backtick quotes (`` ` ``).
+Unlike a pre-formatted code block, a code span indicates code within a
+normal paragraph. For example:
+
+Use the `printf()` function.
diff --git a/static/background.jpg b/static/img/background.jpg
similarity index 100%
rename from static/background.jpg
rename to static/img/background.jpg
diff --git a/static/img/blogtest3.gif b/static/img/blog/hardware.gif
similarity index 100%
rename from static/img/blogtest3.gif
rename to static/img/blog/hardware.gif
diff --git a/static/img/blogtest2.gif b/static/img/blog/hello-world.gif
similarity index 100%
rename from static/img/blogtest2.gif
rename to static/img/blog/hello-world.gif
diff --git a/static/img/blogtest1.gif b/static/img/blog/test-post.gif
similarity index 100%
rename from static/img/blogtest1.gif
rename to static/img/blog/test-post.gif
diff --git a/static/buttons/cirro.png b/static/img/buttons/cirro.png
similarity index 100%
rename from static/buttons/cirro.png
rename to static/img/buttons/cirro.png
diff --git a/static/buttons/firefox.gif b/static/img/buttons/firefox.gif
similarity index 100%
rename from static/buttons/firefox.gif
rename to static/img/buttons/firefox.gif
diff --git a/static/buttons/lol.gif b/static/img/buttons/lol.gif
similarity index 100%
rename from static/buttons/lol.gif
rename to static/img/buttons/lol.gif
diff --git a/static/buttons/rovin.png b/static/img/buttons/rovin.png
similarity index 100%
rename from static/buttons/rovin.png
rename to static/img/buttons/rovin.png
diff --git a/static/buttons/split.png b/static/img/buttons/split.png
similarity index 100%
rename from static/buttons/split.png
rename to static/img/buttons/split.png
diff --git a/static/buttons/twopaws.png b/static/img/buttons/twopaws.png
similarity index 100%
rename from static/buttons/twopaws.png
rename to static/img/buttons/twopaws.png
diff --git a/static/icons/coolify-transparent.png b/static/img/icons/coolify-transparent.png
similarity index 100%
rename from static/icons/coolify-transparent.png
rename to static/img/icons/coolify-transparent.png
diff --git a/tailwind.config.js b/tailwind.config.js
index 087d32b..e3350a2 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -20,5 +20,5 @@ export default {
 			}
 		}
 	},
-	plugins: []
+	plugins: [require('@tailwindcss/typography')]
 };