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()