Just another blog, made with SvelteKit.
Just for my personal use or for anyone who wants to use it.
MIT License
src/articles
as markdown filesindex.md
[...article]
), tags ([t]
) and categories ([c]
).src/lib/layouts
.mdsvex.config.js
.+layout.ts
: reads all ìndex.md
files inside the src/articles
folder and creates an array of all articles meta data.$page.data.ArtilcesMetaData
: stores this array, so it can be used in any component.+layout.svelte
: is the main layout file and contains the header, footer and the main content.+page.svelte
: is the starting point for all pages and contains a welcome text and the grid of cards.lib/Components/GridOfCards/Grid.svelte
creates a nested array from the articles meta data, based on the folder structure and displays the cards (ArticleCard.svelte
) as a grid.sort
prop, which can be used to sort the cards by date, category, tags or tag.[...article]/+page.ts
: Uses the slug
from the url to find the article in the ArticlesMetaData
and imports the article content.ArticlesMetaData
(all), ArticleMeta
(current) and ArticleComponent
(content).+page.svelte
: uses the ArticleComponent
to render the article content and sends the ArticleMeta
to <Meta />
to create the meta tags.c/[category]
and t/[tag]
are almost identically. They use the category
or tag
from the url to filter the ArticlesMetaData
and send the filtered array to <Grid />
to display the cards.src/lib/layouts/default.svelte
is the default layout and will be used for all pages, which don't have a layout defined in the frontmatter.Required Frontmatter
published
layout
title
tags
category
description
excerpt
created
edited
imagePath
imageAlt
imageDescription
Generated Frontmatter
articlePath
articleSlug
articleUrl
imageUrl
siteName
siteUrl
author
authorTwitter
export type ArticleMetaData = {
published: boolean; // only published articles will be rendered
layout?: string; // default, Code, Planet, ...
title: string; // must be unique for each article
author?: string; // from blog.config.js
authorTwitter?: string; // from blog.config.js
tags: string; // comma separated
description: string; // short description for meta tags and hover
excerpt: string; // for GridOfCards
created: any; // dd.mm.yyyy
edited?: any; // dd.mm.yyyy
imagePath: string; // relative path to the image without dot: /Jupiter.jpg
imageUrl?: string; // for meta tags
imageAlt: string; // for meta tags
imageDescription: string; // for meta tags and hover
articlePath?: string; // generated: /src/articles/Code/
articleSlug?: string; // generated from title
articleUrl?: string; // generated: for meta tags
siteName?: string; // from blog.config.js
siteUrl?: string; // from blog.config.js
// category: string; // not used yet
};
export type GridSort = 'Recent' | 'Category' | 'Tag' | 'Tags';
export type ArticleMetaSorted = {
sorted: GridSort;
articles: ArticleMetaData[];
};
// https://github.com/JonasKruckenberg/imagetools/issues/5#issuecomment-1522596146
const images = import.meta.glob('../example/path/*.png', {
query: { width: '100,200,300' },
eager: true,
});
return {
image: images[`../example/path/${myVar}.png`]?.default || null,
};