diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..578f00d
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,6 @@
+FROM node:latest
+WORKDIR /app
+COPY . .
+RUN npm install
+EXPOSE 5173
+CMD ["npm", "run", "dev"]
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 63075fc..3cb1dd5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,8 +18,12 @@
"eslint": "^8.28.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-svelte3": "^4.0.0",
+ "mdsvex": "^0.10.6",
+ "postcss": "^8.4.20",
+ "postcss-scss": "^4.0.6",
"prettier": "^2.8.0",
"prettier-plugin-svelte": "^2.8.1",
+ "sass": "^1.57.1",
"svelte": "^3.54.0",
"svelte-check": "^2.9.2",
"tslib": "^2.4.1",
@@ -617,6 +621,12 @@
"integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
"dev": true
},
+ "node_modules/@types/unist": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
+ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==",
+ "dev": true
+ },
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "5.47.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.1.tgz",
@@ -1681,6 +1691,12 @@
"node": ">= 4"
}
},
+ "node_modules/immutable": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.1.tgz",
+ "integrity": "sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==",
+ "dev": true
+ },
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -1902,6 +1918,21 @@
"node": ">=12"
}
},
+ "node_modules/mdsvex": {
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/mdsvex/-/mdsvex-0.10.6.tgz",
+ "integrity": "sha512-aGRDY0r5jx9+OOgFdyB9Xm3EBr9OUmcrTDPWLB7a7g8VPRxzPy4MOBmcVYgz7ErhAJ7bZ/coUoj6aHio3x/2mA==",
+ "dev": true,
+ "dependencies": {
+ "@types/unist": "^2.0.3",
+ "prism-svelte": "^0.4.7",
+ "prismjs": "^1.17.1",
+ "vfile-message": "^2.0.4"
+ },
+ "peerDependencies": {
+ "svelte": "3.x"
+ }
+ },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -2187,6 +2218,28 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/postcss-scss": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz",
+ "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-scss"
+ }
+ ],
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.19"
+ }
+ },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -2221,6 +2274,21 @@
"svelte": "^3.2.0"
}
},
+ "node_modules/prism-svelte": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/prism-svelte/-/prism-svelte-0.4.7.tgz",
+ "integrity": "sha512-yABh19CYbM24V7aS7TuPYRNMqthxwbvx6FF/Rw920YbyBWO3tnyPIqRMgHuSVsLmuHkkBS1Akyof463FVdkeDQ==",
+ "dev": true
+ },
+ "node_modules/prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
@@ -2400,6 +2468,23 @@
"rimraf": "bin.js"
}
},
+ "node_modules/sass": {
+ "version": "1.57.1",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz",
+ "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/semver": {
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -2796,6 +2881,19 @@
"node": ">=12.18"
}
},
+ "node_modules/unist-util-stringify-position": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+ "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+ "dev": true,
+ "dependencies": {
+ "@types/unist": "^2.0.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -2805,6 +2903,20 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/vfile-message": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+ "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/vite": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.0.3.tgz",
diff --git a/package.json b/package.json
index 2fa7e30..e4331c3 100644
--- a/package.json
+++ b/package.json
@@ -21,8 +21,12 @@
"eslint": "^8.28.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-svelte3": "^4.0.0",
+ "mdsvex": "^0.10.6",
+ "postcss": "^8.4.20",
+ "postcss-scss": "^4.0.6",
"prettier": "^2.8.0",
"prettier-plugin-svelte": "^2.8.1",
+ "sass": "^1.57.1",
"svelte": "^3.54.0",
"svelte-check": "^2.9.2",
"tslib": "^2.4.1",
diff --git a/src/lib/components/Card.svelte b/src/lib/components/Card.svelte
index 65ee61b..676bb6a 100644
--- a/src/lib/components/Card.svelte
+++ b/src/lib/components/Card.svelte
@@ -1,14 +1,42 @@
-
-
{title}
-
+
+
+
{data.title}
+ {#if data.description}
+
{data.description}
+ {/if}
+ {#if data.tags}
+
+ {#each data.tags as tag}
+ {tag}
+ {/each}
+
+ {/if}
+
+
diff --git a/src/lib/projects.ts b/src/lib/projects.ts
new file mode 100644
index 0000000..2be792b
--- /dev/null
+++ b/src/lib/projects.ts
@@ -0,0 +1,20 @@
+import type { create_ssr_component } from 'svelte/internal';
+
+export type Mdsvex = {
+ metadata: {
+ title: string;
+ description?: string;
+ date?: string;
+ tags?: string[];
+ };
+ default: ReturnType;
+};
+
+export const projects = new Map(
+ Object.entries(
+ import.meta.glob('../routes/projects/*/*{.md,.svelte,index.md.index.svelte}')
+ ).map(([path, load]) => [
+ path.replace(/(\.md|\.svelte|\/index\.md|\/index\.svelte)$/, '').replace(/^\.\.\/routes/, ''),
+ load
+ ])
+);
diff --git a/src/lib/shs.ts b/src/lib/shs.ts
new file mode 100644
index 0000000..bcaa4a4
--- /dev/null
+++ b/src/lib/shs.ts
@@ -0,0 +1,20 @@
+import type { create_ssr_component } from 'svelte/internal';
+
+export type Mdsvex = {
+ metadata: {
+ title: string;
+ description?: string;
+ date?: string;
+ tags?: string[];
+ };
+ default: ReturnType;
+};
+
+export const shs = new Map(
+ Object.entries(
+ import.meta.glob('../routes/shs/*/*{.md,.svelte,index.md.index.svelte}')
+ ).map(([path, load]) => [
+ path.replace(/(\.md|\.svelte|\/index\.md|\/index\.svelte)$/, '').replace(/^\.\.\/routes/, ''),
+ load
+ ])
+);
diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts
new file mode 100644
index 0000000..189f71e
--- /dev/null
+++ b/src/routes/+layout.ts
@@ -0,0 +1 @@
+export const prerender = true;
diff --git a/src/routes/Header.svelte b/src/routes/Header.svelte
index c1a9e51..c008dc3 100644
--- a/src/routes/Header.svelte
+++ b/src/routes/Header.svelte
@@ -20,9 +20,6 @@
About
-
- Blog
-
Projects
diff --git a/src/routes/contact/+page.svelte b/src/routes/contact/+page.svelte
new file mode 100644
index 0000000..eabf280
--- /dev/null
+++ b/src/routes/contact/+page.svelte
@@ -0,0 +1 @@
+Work in progress
diff --git a/src/routes/projects/+page.server.ts b/src/routes/projects/+page.server.ts
new file mode 100644
index 0000000..399de53
--- /dev/null
+++ b/src/routes/projects/+page.server.ts
@@ -0,0 +1,12 @@
+import { projects } from '$lib/projects';
+import type { PageServerLoad } from './$types';
+
+export const load: PageServerLoad = async () => ({
+ data: await Promise.all(
+ [...projects.entries()].map(async ([path, load]) =>
+ load().then(({ metadata }) => ({ path, ...metadata }))
+ )
+ ).then((data) =>
+ data.sort(({ date: a }, { date: z }) => new Date(z ?? 0).getTime() - new Date(a ?? 0).getTime())
+ )
+});
diff --git a/src/routes/projects/+page.svelte b/src/routes/projects/+page.svelte
index 14638cd..de80630 100644
--- a/src/routes/projects/+page.svelte
+++ b/src/routes/projects/+page.svelte
@@ -1,6 +1,8 @@
-
@@ -11,20 +13,24 @@
Projects
-
This is the page where all projects will live.
+
This is the page where all projects will live
-
- {#each projects as { title }}
-
+
+ {#each data.data as { title, description, path, date, tags }}
+
{/each}
-
diff --git a/src/routes/projects/+page.ts b/src/routes/projects/+page.ts
index 6d62474..99d47bc 100644
--- a/src/routes/projects/+page.ts
+++ b/src/routes/projects/+page.ts
@@ -1 +1,5 @@
-export const projects = [{ title: 'Projet 1' }, { title: 'Projet 2' }];
+import type { PageLoad } from './$types';
+
+export const load: PageLoad = ({ data }) => ({
+ ...data
+});
diff --git a/src/routes/projects/can7/+page.md b/src/routes/projects/can7/+page.md
new file mode 100644
index 0000000..27a3eee
--- /dev/null
+++ b/src/routes/projects/can7/+page.md
@@ -0,0 +1,9 @@
+---
+title: 🎚️ Can7 dashboard
+date: 2022-09-08
+description: A dashboard for can7
+tags:
+ - web
+ - php
+ - laravel
+---
diff --git a/src/routes/projects/net7/+page.md b/src/routes/projects/net7/+page.md
new file mode 100644
index 0000000..8f2292b
--- /dev/null
+++ b/src/routes/projects/net7/+page.md
@@ -0,0 +1,9 @@
+---
+title: 🖥️ net7 homepage
+date: 2022-09-08
+description: net7
+tags:
+ - web
+ - js
+ - tailwind
+---
diff --git a/src/routes/shs/+page.server.ts b/src/routes/shs/+page.server.ts
new file mode 100644
index 0000000..26eb0ca
--- /dev/null
+++ b/src/routes/shs/+page.server.ts
@@ -0,0 +1,12 @@
+import { shs } from '$lib/shs';
+import type { PageServerLoad } from './$types';
+
+export const load: PageServerLoad = async () => ({
+ data: await Promise.all(
+ [...shs.entries()].map(async ([path, load]) =>
+ load().then(({ metadata }) => ({ path, ...metadata }))
+ )
+ ).then((data) =>
+ data.sort(({ date: a }, { date: z }) => new Date(z ?? 0).getTime() - new Date(a ?? 0).getTime())
+ )
+});
diff --git a/src/routes/shs/+page.svelte b/src/routes/shs/+page.svelte
index 1062674..fdc3336 100644
--- a/src/routes/shs/+page.svelte
+++ b/src/routes/shs/+page.svelte
@@ -1,6 +1,8 @@
-
@@ -16,8 +18,8 @@
- {#each works as title}
-
+ {#each data.data as { title, description, path, date, tags }}
+
{/each}
@@ -25,6 +27,6 @@
diff --git a/src/routes/shs/+page.ts b/src/routes/shs/+page.ts
index 231bc20..99d47bc 100644
--- a/src/routes/shs/+page.ts
+++ b/src/routes/shs/+page.ts
@@ -1 +1,5 @@
-export const works = ['Home', 'About', 'Contact'];
+import type { PageLoad } from './$types';
+
+export const load: PageLoad = ({ data }) => ({
+ ...data
+});
diff --git a/src/routes/shs/works/internship.md b/src/routes/shs/internship/+page.md
similarity index 97%
rename from src/routes/shs/works/internship.md
rename to src/routes/shs/internship/+page.md
index 5e75583..a88fa54 100644
--- a/src/routes/shs/works/internship.md
+++ b/src/routes/shs/internship/+page.md
@@ -1,7 +1,7 @@
---
title: 🎚️ Internship report
-date: 2022-11-13T21:57:10.852Z
-summary:
+date: 2022-11-13
+description: My internship report
tags:
- web
- svelte
diff --git a/src/routes/shs/ppp/+page.md b/src/routes/shs/ppp/+page.md
new file mode 100644
index 0000000..cc9ef4d
--- /dev/null
+++ b/src/routes/shs/ppp/+page.md
@@ -0,0 +1,6 @@
+---
+title: 🎚️ Internship report
+date: 2022-11-15
+description:
+tags:
+---
diff --git a/src/routes/styles.css b/src/routes/styles.css
index 89a212c..084a786 100644
--- a/src/routes/styles.css
+++ b/src/routes/styles.css
@@ -4,9 +4,8 @@
--font-body: Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
--font-mono: 'Fira Mono', monospace;
- --color-bg-0: rgb(202, 216, 228);
- --color-bg-1: hsl(209, 36%, 86%);
- --color-bg-2: hsl(224, 44%, 95%);
+ --color-tag: #f7f7f7;
+ --color-bg-tag: #2f5bc2;
--color-nav: #2f5bc2;
--color-bg-nav: #f7f7f7;
--color-text: rgba(0, 0, 0, 0.7);
diff --git a/svelte.config.js b/svelte.config.js
index 87f198f..7a0da78 100644
--- a/svelte.config.js
+++ b/svelte.config.js
@@ -1,11 +1,18 @@
import adapter from '@sveltejs/adapter-auto';
import { vitePreprocess } from '@sveltejs/kit/vite';
+import { mdsvex } from 'mdsvex';
/** @type {import('@sveltejs/kit').Config} */
const config = {
// Consult https://kit.svelte.dev/docs/integrations#preprocessors
// for more information about preprocessors
- preprocess: vitePreprocess(),
+ extensions: ['.svelte', '.md'],
+ preprocess: [
+ vitePreprocess(),
+ mdsvex({
+ extensions: ['.md']
+ })
+ ],
kit: {
adapter: adapter()