Compare commits

...

17 Commits

Author SHA1 Message Date
bcdfe98c92 fix: inline svg icons to follow foreground color
All checks were successful
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-01-02 00:11:51 +01:00
bab803d538 update deno.lock
All checks were successful
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2025-12-03 14:37:52 +01:00
9df992aba3 nix: remove pandoc 2025-12-03 14:37:16 +01:00
df65ad1e10 use PL badges in CV 2025-12-03 14:36:49 +01:00
9f58fc3c32 migrate from markdown to djot
Also uses PL badges and icons added as djot
filters/renderers.
2025-12-03 14:35:24 +01:00
f8f105a766 display only select items in header bar 2025-12-03 14:34:53 +01:00
91aa5cc835 add forge icons 2025-12-03 14:34:27 +01:00
64bbaac403 add style for PL badges 2025-12-03 14:33:51 +01:00
7f94201212 css: cleanup 2025-12-03 14:31:44 +01:00
a085df81b4 use atkinson hyperlegible next font 2025-12-03 14:30:28 +01:00
6fdb515289 improve djot plugin 2025-12-03 14:27:00 +01:00
910038a5e3 add project page for lila and render djot pages 2025-11-14 01:09:43 +01:00
47473a53b5 typo: rename 'resumé' to 'résumé'
All checks were successful
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2025-11-04 20:21:00 +01:00
9a30210864 add résumé readme 2025-11-04 20:19:01 +01:00
474d75f42d resumé: add makefile
All checks were successful
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2025-11-04 19:59:11 +01:00
6fb0bbebbd resumé: use one document per language 2025-11-04 19:58:24 +01:00
4249085236 small CV tweaks 2025-11-04 19:57:21 +01:00
47 changed files with 476 additions and 177 deletions

View File

@@ -2,26 +2,57 @@ import lume from "lume/mod.ts";
import nav from "lume/plugins/nav.ts"; import nav from "lume/plugins/nav.ts";
import codeHighlight from "lume/plugins/code_highlight.ts"; import codeHighlight from "lume/plugins/code_highlight.ts";
import googleFonts from "lume/plugins/google_fonts.ts"; import googleFonts from "lume/plugins/google_fonts.ts";
import { djotRender } from "./_djot.ts"; import djotPlugin from "./_djot.ts";
import djot from "@djot/djot";
const site = lume(); const site = lume();
site.filter("lowercasePL", (lang: string) => {
switch (lang) {
case "C++":
return "cpp";
case "C#":
return "csharp";
case "Python 3":
return "python3";
default:
return lang.toLowerCase();
}
});
site.use(nav()); site.use(nav());
site.use(codeHighlight()); site.use(codeHighlight());
site.use(djotPlugin({
renderOptions: {
overrides: {
symb: (symbol: djot.Symb, renderer: djot.HTMLRenderer) => {
if (symbol.alias.startsWith("si-")) {
const iconName = symbol.alias.substring(3);
const decoder = new TextDecoder("utf-8");
const svg = decoder.decode(
Deno.readFileSync(`./icons/${iconName}.svg`),
);
return svg;
}
return renderer.renderAstNodeDefault(symbol);
},
},
},
}));
site.use(googleFonts({ site.use(googleFonts({
cssFile: "/styles/main.css", cssFile: "/styles/main.css",
placeholder: "/* import fonts */", placeholder: "/* import fonts */",
fonts: { fonts: {
"Atkinson Hyperlegible": "https://fonts.google.com/share?selection.family=Atkinson+Hyperlegible:ital,wght@0,400;0,700;1,400;1,700", "Atkinson Hyperlegible Next":
"https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible+Next:ital,wght@0,200..800;1,200..800",
"JetBrains Mono": "https://fonts.google.com/share?selection.family=JetBrains+Mono:ital,wght@0,100..800;1,100..800", "JetBrains Mono": "https://fonts.google.com/share?selection.family=JetBrains+Mono:ital,wght@0,100..800;1,100..800",
}, },
})); }));
site.copy("/styles"); site.copy("/styles");
site.copy("favicon.svg"); site.copy("favicon.svg");
site.copy("/icons")
site.data("djot", djotRender);
site.filter("djot", djotRender);
export default site; export default site;

114
_djot.ts
View File

@@ -1,4 +1,25 @@
import djot from "@djot/djot"; import djot from "@djot/djot";
import Site from "lume/core/site.ts";
import { merge } from "lume/core/utils/object.ts";
// Djot does not export these types
type Filter = object;
type HTMLRenderOptions = object;
export interface Options {
/** The list of file extensions this plugin applies to */
extensions?: string[];
filters?: Filter[];
/** Options passed to djot library */
renderOptions?: HTMLRenderOptions;
}
// Default options
export const defaults: Options = {
extensions: [".dj", ".djot"],
};
function extractTitle(ast: djot.Doc): string { function extractTitle(ast: djot.Doc): string {
const firstSection = ast.children.find((c) => c.tag == "section"); const firstSection = ast.children.find((c) => c.tag == "section");
@@ -10,35 +31,80 @@ function extractTitle(ast: djot.Doc): string {
return title ?? "No title"; return title ?? "No title";
} }
export function djotRender(content: string): string { export async function djotLoader(path: string | URL) {
return djot.renderHTML(djot.parse(content));
}
export default async function djotLoader(path: string | URL) {
const content = await Deno.readTextFile(path); const content = await Deno.readTextFile(path);
const ast = djot.parse(content); const ast = djot.parse(content);
djot.applyFilter(ast, () => {
return {
link: (el) => {
if (el.destination) {
el.destination = el.destination.replace(
/(\.dj)(#[^.\s]+)?$/,
(_match: string, _ext: string, section: string) => {
return section ? section : "";
},
);
}
},
};
});
const title = extractTitle(ast); const title = extractTitle(ast);
const html = djot.renderHTML(ast);
return { return {
title, title,
content: html, content,
};
}
const stripMarkupSourceLinks: Filter = () => {
return {
link: (el: djot.Link) => {
if (el.destination) {
el.destination = el.destination.replace(
/(.(?:dj|md))(#[^.\s]+)?$/,
(_match: string, _ext: string, section: string) => {
return section ?? "";
},
);
}
},
};
};
const defaultFilters = [
stripMarkupSourceLinks,
];
export class DjotEngine implements Lume.Engine {
filters: Filter[];
renderOptions?: HTMLRenderOptions;
constructor(filters: Filter[] = [], renderOptions?: HTMLRenderOptions) {
this.filters = [...defaultFilters, ...filters];
this.renderOptions = renderOptions;
}
render(
content: string | djot.Doc,
_data?: Record<string, unknown>,
_filename?: string,
): string {
if (typeof content === "string") {
content = djot.parse(content);
}
this.filters.forEach((filter, _index, _array) => {
djot.applyFilter(content, filter);
});
return djot.renderHTML(
content,
this.renderOptions,
);
}
addHelper() {}
deleteCache() {}
}
export default function (userOptions?: Options) {
const options = merge(defaults, userOptions);
return function (site: Site) {
const engine = new DjotEngine(options.filters, options.renderOptions);
site.loadPages(options.extensions, {
loader: djotLoader,
engine,
});
site.filter("djot", (content) => engine.render(content as string));
}; };
} }

View File

@@ -15,11 +15,11 @@
<nav> <nav>
<a href="/" id="site-root" class="nav-menu-item">rpqt.fr</a> <a href="/" id="site-root" class="nav-menu-item">rpqt.fr</a>
<ul class="nav-menu"> <ul class="nav-menu">
{{ for item of nav.menu().children }} {{ for item of ["now", "projects", "socials"] }}
<li> <li>
<a href="{{ item.data.url }}" class="nav-menu-item" <a href="/{{ item }}" class="nav-menu-item"
{{ url.startsWith(item.data.url) ? 'id="header-nav-current"' : '' }} {{ url.startsWith("/" + item) ? 'id="header-nav-current"' : '' }}
>{{ item.slug }}</a> >{{ item }}</a>
</li> </li>
{{ /for }} {{ /for }}
</ul> </ul>

119
deno.lock generated
View File

@@ -1,5 +1,5 @@
{ {
"version": "4", "version": "5",
"specifiers": { "specifiers": {
"jsr:@davidbonnet/astring@1.8.6": "1.8.6", "jsr:@davidbonnet/astring@1.8.6": "1.8.6",
"jsr:@luca/esbuild-deno-loader@0.11.1": "0.11.1", "jsr:@luca/esbuild-deno-loader@0.11.1": "0.11.1",
@@ -224,7 +224,8 @@
}, },
"npm": { "npm": {
"@djot/djot@0.3.2": { "@djot/djot@0.3.2": {
"integrity": "sha512-joMKR24B8rxueyFiJbpZAqEiypjvOyzTxzkhyr0q5mM/sUBaOD3unna/9IxtOotFugViyYlkIRaiXg3xM//zxg==" "integrity": "sha512-joMKR24B8rxueyFiJbpZAqEiypjvOyzTxzkhyr0q5mM/sUBaOD3unna/9IxtOotFugViyYlkIRaiXg3xM//zxg==",
"bin": true
}, },
"@emnapi/runtime@1.3.1": { "@emnapi/runtime@1.3.1": {
"integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==",
@@ -234,87 +235,124 @@
}, },
"@img/sharp-darwin-arm64@0.33.5": { "@img/sharp-darwin-arm64@0.33.5": {
"integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
"dependencies": [ "optionalDependencies": [
"@img/sharp-libvips-darwin-arm64" "@img/sharp-libvips-darwin-arm64"
] ],
"os": ["darwin"],
"cpu": ["arm64"]
}, },
"@img/sharp-darwin-x64@0.33.5": { "@img/sharp-darwin-x64@0.33.5": {
"integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==",
"dependencies": [ "optionalDependencies": [
"@img/sharp-libvips-darwin-x64" "@img/sharp-libvips-darwin-x64"
] ],
"os": ["darwin"],
"cpu": ["x64"]
}, },
"@img/sharp-libvips-darwin-arm64@1.0.4": { "@img/sharp-libvips-darwin-arm64@1.0.4": {
"integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==" "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==",
"os": ["darwin"],
"cpu": ["arm64"]
}, },
"@img/sharp-libvips-darwin-x64@1.0.4": { "@img/sharp-libvips-darwin-x64@1.0.4": {
"integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==" "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==",
"os": ["darwin"],
"cpu": ["x64"]
}, },
"@img/sharp-libvips-linux-arm64@1.0.4": { "@img/sharp-libvips-linux-arm64@1.0.4": {
"integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==" "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==",
"os": ["linux"],
"cpu": ["arm64"]
}, },
"@img/sharp-libvips-linux-arm@1.0.5": { "@img/sharp-libvips-linux-arm@1.0.5": {
"integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==" "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==",
"os": ["linux"],
"cpu": ["arm"]
}, },
"@img/sharp-libvips-linux-s390x@1.0.4": { "@img/sharp-libvips-linux-s390x@1.0.4": {
"integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==" "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==",
"os": ["linux"],
"cpu": ["s390x"]
}, },
"@img/sharp-libvips-linux-x64@1.0.4": { "@img/sharp-libvips-linux-x64@1.0.4": {
"integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==" "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
"os": ["linux"],
"cpu": ["x64"]
}, },
"@img/sharp-libvips-linuxmusl-arm64@1.0.4": { "@img/sharp-libvips-linuxmusl-arm64@1.0.4": {
"integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==" "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==",
"os": ["linux"],
"cpu": ["arm64"]
}, },
"@img/sharp-libvips-linuxmusl-x64@1.0.4": { "@img/sharp-libvips-linuxmusl-x64@1.0.4": {
"integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==" "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==",
"os": ["linux"],
"cpu": ["x64"]
}, },
"@img/sharp-linux-arm64@0.33.5": { "@img/sharp-linux-arm64@0.33.5": {
"integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==",
"dependencies": [ "optionalDependencies": [
"@img/sharp-libvips-linux-arm64" "@img/sharp-libvips-linux-arm64"
] ],
"os": ["linux"],
"cpu": ["arm64"]
}, },
"@img/sharp-linux-arm@0.33.5": { "@img/sharp-linux-arm@0.33.5": {
"integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
"dependencies": [ "optionalDependencies": [
"@img/sharp-libvips-linux-arm" "@img/sharp-libvips-linux-arm"
] ],
"os": ["linux"],
"cpu": ["arm"]
}, },
"@img/sharp-linux-s390x@0.33.5": { "@img/sharp-linux-s390x@0.33.5": {
"integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==",
"dependencies": [ "optionalDependencies": [
"@img/sharp-libvips-linux-s390x" "@img/sharp-libvips-linux-s390x"
] ],
"os": ["linux"],
"cpu": ["s390x"]
}, },
"@img/sharp-linux-x64@0.33.5": { "@img/sharp-linux-x64@0.33.5": {
"integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
"dependencies": [ "optionalDependencies": [
"@img/sharp-libvips-linux-x64" "@img/sharp-libvips-linux-x64"
] ],
"os": ["linux"],
"cpu": ["x64"]
}, },
"@img/sharp-linuxmusl-arm64@0.33.5": { "@img/sharp-linuxmusl-arm64@0.33.5": {
"integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==",
"dependencies": [ "optionalDependencies": [
"@img/sharp-libvips-linuxmusl-arm64" "@img/sharp-libvips-linuxmusl-arm64"
] ],
"os": ["linux"],
"cpu": ["arm64"]
}, },
"@img/sharp-linuxmusl-x64@0.33.5": { "@img/sharp-linuxmusl-x64@0.33.5": {
"integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==",
"dependencies": [ "optionalDependencies": [
"@img/sharp-libvips-linuxmusl-x64" "@img/sharp-libvips-linuxmusl-x64"
] ],
"os": ["linux"],
"cpu": ["x64"]
}, },
"@img/sharp-wasm32@0.33.5": { "@img/sharp-wasm32@0.33.5": {
"integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==",
"dependencies": [ "dependencies": [
"@emnapi/runtime" "@emnapi/runtime"
] ],
"cpu": ["wasm32"]
}, },
"@img/sharp-win32-ia32@0.33.5": { "@img/sharp-win32-ia32@0.33.5": {
"integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==" "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==",
"os": ["win32"],
"cpu": ["ia32"]
}, },
"@img/sharp-win32-x64@0.33.5": { "@img/sharp-win32-x64@0.33.5": {
"integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==" "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==",
"os": ["win32"],
"cpu": ["x64"]
}, },
"@js-temporal/polyfill@0.4.4": { "@js-temporal/polyfill@0.4.4": {
"integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==", "integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==",
@@ -406,7 +444,8 @@
"mdurl", "mdurl",
"punycode.js", "punycode.js",
"uc.micro" "uc.micro"
] ],
"bin": true
}, },
"mdurl@2.0.0": { "mdurl@2.0.0": {
"integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="
@@ -421,11 +460,17 @@
"integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==" "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="
}, },
"semver@7.7.1": { "semver@7.7.1": {
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==" "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"bin": true
}, },
"sharp@0.33.5": { "sharp@0.33.5": {
"integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
"dependencies": [ "dependencies": [
"color",
"detect-libc",
"semver"
],
"optionalDependencies": [
"@img/sharp-darwin-arm64", "@img/sharp-darwin-arm64",
"@img/sharp-darwin-x64", "@img/sharp-darwin-x64",
"@img/sharp-libvips-darwin-arm64", "@img/sharp-libvips-darwin-arm64",
@@ -444,11 +489,9 @@
"@img/sharp-linuxmusl-x64", "@img/sharp-linuxmusl-x64",
"@img/sharp-wasm32", "@img/sharp-wasm32",
"@img/sharp-win32-ia32", "@img/sharp-win32-ia32",
"@img/sharp-win32-x64", "@img/sharp-win32-x64"
"color", ],
"detect-libc", "scripts": true
"semver"
]
}, },
"simple-swizzle@0.2.2": { "simple-swizzle@0.2.2": {
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
@@ -733,6 +776,7 @@
"https://deno.land/x/lume@v3.0.1/core/searcher.ts": "19530e0149ca925334f98052863a52cdfbbeea9977342b209829999a34e816a6", "https://deno.land/x/lume@v3.0.1/core/searcher.ts": "19530e0149ca925334f98052863a52cdfbbeea9977342b209829999a34e816a6",
"https://deno.land/x/lume@v3.0.1/core/server.ts": "19cdd234f18c601d8386c7aa6d589616ce367fc571a96d4715f220a522e17ae8", "https://deno.land/x/lume@v3.0.1/core/server.ts": "19cdd234f18c601d8386c7aa6d589616ce367fc571a96d4715f220a522e17ae8",
"https://deno.land/x/lume@v3.0.1/core/site.ts": "2fd2103559eeed80574947c5b357b05c0d55d90e6135d82ffd2e5facac4bfef0", "https://deno.land/x/lume@v3.0.1/core/site.ts": "2fd2103559eeed80574947c5b357b05c0d55d90e6135d82ffd2e5facac4bfef0",
"https://deno.land/x/lume@v3.0.1/core/slugifier.ts": "3cb058f841f6eba1862f70f43e21de591af99cc6efacd9bb11dc0dbbab9eb703",
"https://deno.land/x/lume@v3.0.1/core/source.ts": "b766b3d45df0df97fefabbc57f745d1ad7be308df1949291946516c8648289f7", "https://deno.land/x/lume@v3.0.1/core/source.ts": "b766b3d45df0df97fefabbc57f745d1ad7be308df1949291946516c8648289f7",
"https://deno.land/x/lume@v3.0.1/core/utils/cli_options.ts": "ce8731a5e9c23b95217b6967dc4e5c434637a33d16806189acc6a87728b2e649", "https://deno.land/x/lume@v3.0.1/core/utils/cli_options.ts": "ce8731a5e9c23b95217b6967dc4e5c434637a33d16806189acc6a87728b2e649",
"https://deno.land/x/lume@v3.0.1/core/utils/concurrent.ts": "cb0775b3d95f3faa356aa3a3e489dccef8807ed93cc4f84fcf5bc81e87c29504", "https://deno.land/x/lume@v3.0.1/core/utils/concurrent.ts": "cb0775b3d95f3faa356aa3a3e489dccef8807ed93cc4f84fcf5bc81e87c29504",
@@ -769,6 +813,7 @@
"https://deno.land/x/lume@v3.0.1/deps/hex.ts": "828718f24a780ff3ade8d0a8a5b57497cb31c257560ef12af99b6eb1a31e3bbd", "https://deno.land/x/lume@v3.0.1/deps/hex.ts": "828718f24a780ff3ade8d0a8a5b57497cb31c257560ef12af99b6eb1a31e3bbd",
"https://deno.land/x/lume@v3.0.1/deps/highlight.ts": "e8f830a1137ff7e8246ce21518452b8cbf8089db409458c6d9c31040c11d8428", "https://deno.land/x/lume@v3.0.1/deps/highlight.ts": "e8f830a1137ff7e8246ce21518452b8cbf8089db409458c6d9c31040c11d8428",
"https://deno.land/x/lume@v3.0.1/deps/http.ts": "c9c148ce51d3dc64de768972907e02b2870f96bd3423219252a40b8f7bad4383", "https://deno.land/x/lume@v3.0.1/deps/http.ts": "c9c148ce51d3dc64de768972907e02b2870f96bd3423219252a40b8f7bad4383",
"https://deno.land/x/lume@v3.0.1/deps/icons.ts": "73e24df578e30f0b290cf6c7147875facbdb4e21abc56edb2919b4640ab77140",
"https://deno.land/x/lume@v3.0.1/deps/init.ts": "05d45af66ebdfe63e43540618f51ece8f99d98dc49de890f10eeb43abe9ed0f3", "https://deno.land/x/lume@v3.0.1/deps/init.ts": "05d45af66ebdfe63e43540618f51ece8f99d98dc49de890f10eeb43abe9ed0f3",
"https://deno.land/x/lume@v3.0.1/deps/jsonc.ts": "79f0eddc3c9e593310eb8e5918eb1506b1c7d7816e4ecb96894f634ecbe626ff", "https://deno.land/x/lume@v3.0.1/deps/jsonc.ts": "79f0eddc3c9e593310eb8e5918eb1506b1c7d7816e4ecb96894f634ecbe626ff",
"https://deno.land/x/lume@v3.0.1/deps/lightningcss.ts": "19f090ee781028aacd9817f204972b162c065e4c0ea99e24935eb489d2aadfd6", "https://deno.land/x/lume@v3.0.1/deps/lightningcss.ts": "19f090ee781028aacd9817f204972b162c065e4c0ea99e24935eb489d2aadfd6",
@@ -787,12 +832,14 @@
"https://deno.land/x/lume@v3.0.1/mod.ts": "4ed2edf622df6109304095952f8a02844f5abc2992b6c9886af632b058f1a8f4", "https://deno.land/x/lume@v3.0.1/mod.ts": "4ed2edf622df6109304095952f8a02844f5abc2992b6c9886af632b058f1a8f4",
"https://deno.land/x/lume@v3.0.1/plugins/code_highlight.ts": "ac6327e688e9e8fbd7798bdcc5f76b46d27db3e22ea3b74f545dc3296e8a1261", "https://deno.land/x/lume@v3.0.1/plugins/code_highlight.ts": "ac6327e688e9e8fbd7798bdcc5f76b46d27db3e22ea3b74f545dc3296e8a1261",
"https://deno.land/x/lume@v3.0.1/plugins/google_fonts.ts": "7093462756c503499d8d3d14a6abfbf131bacd41f5d7602ecfc2775a8ee2b7b2", "https://deno.land/x/lume@v3.0.1/plugins/google_fonts.ts": "7093462756c503499d8d3d14a6abfbf131bacd41f5d7602ecfc2775a8ee2b7b2",
"https://deno.land/x/lume@v3.0.1/plugins/icons.ts": "de11277acc85e2d882e21a88ab44c454bd9ea3dbf02cfe60efffef0cdd5a8996",
"https://deno.land/x/lume@v3.0.1/plugins/json.ts": "5c49499e56b919ec848d4118ec97dd4fe0a323a6cc4c648dc45ab55297614c12", "https://deno.land/x/lume@v3.0.1/plugins/json.ts": "5c49499e56b919ec848d4118ec97dd4fe0a323a6cc4c648dc45ab55297614c12",
"https://deno.land/x/lume@v3.0.1/plugins/markdown.ts": "7e82d897c1e35bf119dcd18b6aec7a6ba5aa06848897b34ff9cd161ec7c8757e", "https://deno.land/x/lume@v3.0.1/plugins/markdown.ts": "7e82d897c1e35bf119dcd18b6aec7a6ba5aa06848897b34ff9cd161ec7c8757e",
"https://deno.land/x/lume@v3.0.1/plugins/modules.ts": "4e177c0ffe972b9deef10db2bf0ae52b405418af4dbac03db9e7ffbd6a3ec6ae", "https://deno.land/x/lume@v3.0.1/plugins/modules.ts": "4e177c0ffe972b9deef10db2bf0ae52b405418af4dbac03db9e7ffbd6a3ec6ae",
"https://deno.land/x/lume@v3.0.1/plugins/nav.ts": "505b2140d35c992e05b471f34e7b9f38ddd1cd13d588eb9fb3622ce59592ccac", "https://deno.land/x/lume@v3.0.1/plugins/nav.ts": "505b2140d35c992e05b471f34e7b9f38ddd1cd13d588eb9fb3622ce59592ccac",
"https://deno.land/x/lume@v3.0.1/plugins/paginate.ts": "6a1a9a24d0fabed2f722a6a6f29d98559219c69475685034181816e82d367f2e", "https://deno.land/x/lume@v3.0.1/plugins/paginate.ts": "6a1a9a24d0fabed2f722a6a6f29d98559219c69475685034181816e82d367f2e",
"https://deno.land/x/lume@v3.0.1/plugins/search.ts": "5acb5be828bbbd012fb9226cb97ec3e370d43d05aa44d16e7e7d50bab368b442", "https://deno.land/x/lume@v3.0.1/plugins/search.ts": "5acb5be828bbbd012fb9226cb97ec3e370d43d05aa44d16e7e7d50bab368b442",
"https://deno.land/x/lume@v3.0.1/plugins/slugify_urls.ts": "ec2a78b13f094d99c90d1789149d98a60ea39297cbdc1d514fd267d8c8a42b85",
"https://deno.land/x/lume@v3.0.1/plugins/toml.ts": "e5bf35ed4915587acd453f002b00ae9b88c1782cadc25c703d7642a390af43ea", "https://deno.land/x/lume@v3.0.1/plugins/toml.ts": "e5bf35ed4915587acd453f002b00ae9b88c1782cadc25c703d7642a390af43ea",
"https://deno.land/x/lume@v3.0.1/plugins/url.ts": "15f2e80b6fcbf86f8795a3676b8d533bab003ac016ff127e58165a6ac3bffc1a", "https://deno.land/x/lume@v3.0.1/plugins/url.ts": "15f2e80b6fcbf86f8795a3676b8d533bab003ac016ff127e58165a6ac3bffc1a",
"https://deno.land/x/lume@v3.0.1/plugins/vento.ts": "d74100c7168d49b3817559792c9a8fd1d380b3244051d92dfebc7531cb8b7665", "https://deno.land/x/lume@v3.0.1/plugins/vento.ts": "d74100c7168d49b3817559792c9a8fd1d380b3244051d92dfebc7531cb8b7665",

View File

@@ -27,7 +27,6 @@
pkgs.nil # Nix language server pkgs.nil # Nix language server
pkgs.nixfmt-rfc-style pkgs.nixfmt-rfc-style
pkgs.typst pkgs.typst
pkgs.pandoc
pkgs.tinymist pkgs.tinymist
pkgs.vscode-css-languageserver pkgs.vscode-css-languageserver
]; ];

1
icons/codeberg.svg Normal file
View File

@@ -0,0 +1 @@
<svg class="text-icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Codeberg</title><path d="M11.999.747A11.974 11.974 0 0 0 0 12.75c0 2.254.635 4.465 1.833 6.376L11.837 6.19c.072-.092.251-.092.323 0l4.178 5.402h-2.992l.065.239h3.113l.882 1.138h-3.674l.103.374h3.86l.777 1.003h-4.358l.135.483h4.593l.695.894h-5.038l.165.589h5.326l.609.785h-5.717l.182.65h6.038l.562.727h-6.397l.183.65h6.717A12.003 12.003 0 0 0 24 12.75 11.977 11.977 0 0 0 11.999.747zm3.654 19.104.182.65h5.326c.173-.204.353-.433.513-.65zm.385 1.377.18.65h3.563c.233-.198.485-.428.712-.65zm.383 1.377.182.648h1.203c.356-.204.685-.412 1.042-.648zz"/></svg>

After

Width:  |  Height:  |  Size: 650 B

1
icons/gitea.svg Normal file
View File

@@ -0,0 +1 @@
<svg class="text-icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Gitea</title><path d="M4.209 4.603c-.247 0-.525.02-.84.088-.333.07-1.28.283-2.054 1.027C-.403 7.25.035 9.685.089 10.052c.065.446.263 1.687 1.21 2.768 1.749 2.141 5.513 2.092 5.513 2.092s.462 1.103 1.168 2.119c.955 1.263 1.936 2.248 2.89 2.367 2.406 0 7.212-.004 7.212-.004s.458.004 1.08-.394c.535-.324 1.013-.893 1.013-.893s.492-.527 1.18-1.73c.21-.37.385-.729.538-1.068 0 0 2.107-4.471 2.107-8.823-.042-1.318-.367-1.55-.443-1.627-.156-.156-.366-.153-.366-.153s-4.475.252-6.792.306c-.508.011-1.012.023-1.512.027v4.474l-.634-.301c0-1.39-.004-4.17-.004-4.17-1.107.016-3.405-.084-3.405-.084s-5.399-.27-5.987-.324c-.187-.011-.401-.032-.648-.032zm.354 1.832h.111s.271 2.269.6 3.597C5.549 11.147 6.22 13 6.22 13s-.996-.119-1.641-.348c-.99-.324-1.409-.714-1.409-.714s-.73-.511-1.096-1.52C1.444 8.73 2.021 7.7 2.021 7.7s.32-.859 1.47-1.145c.395-.106.863-.12 1.072-.12zm8.33 2.554c.26.003.509.127.509.127l.868.422-.529 1.075a.686.686 0 0 0-.614.359.685.685 0 0 0 .072.756l-.939 1.924a.69.69 0 0 0-.66.527.687.687 0 0 0 .347.763.686.686 0 0 0 .867-.206.688.688 0 0 0-.069-.882l.916-1.874a.667.667 0 0 0 .237-.02.657.657 0 0 0 .271-.137 8.826 8.826 0 0 1 1.016.512.761.761 0 0 1 .286.282c.073.21-.073.569-.073.569-.087.29-.702 1.55-.702 1.55a.692.692 0 0 0-.676.477.681.681 0 1 0 1.157-.252c.073-.141.141-.282.214-.431.19-.397.515-1.16.515-1.16.035-.066.218-.394.103-.814-.095-.435-.48-.638-.48-.638-.467-.301-1.116-.58-1.116-.58s0-.156-.042-.27a.688.688 0 0 0-.148-.241l.516-1.062 2.89 1.401s.48.218.583.619c.073.282-.019.534-.069.657-.24.587-2.1 4.317-2.1 4.317s-.232.554-.748.588a1.065 1.065 0 0 1-.393-.045l-.202-.08-4.31-2.1s-.417-.218-.49-.596c-.083-.31.104-.691.104-.691l2.073-4.272s.183-.37.466-.497a.855.855 0 0 1 .35-.077z"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
icons/github.svg Normal file
View File

@@ -0,0 +1 @@
<svg class="text-icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>

After

Width:  |  Height:  |  Size: 841 B

1
icons/gitlab.svg Normal file
View File

@@ -0,0 +1 @@
<svg class="text-icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitLab</title><path d="m23.6004 9.5927-.0337-.0862L20.3.9814a.851.851 0 0 0-.3362-.405.8748.8748 0 0 0-.9997.0539.8748.8748 0 0 0-.29.4399l-2.2055 6.748H7.5375l-2.2057-6.748a.8573.8573 0 0 0-.29-.4412.8748.8748 0 0 0-.9997-.0537.8585.8585 0 0 0-.3362.4049L.4332 9.5015l-.0325.0862a6.0657 6.0657 0 0 0 2.0119 7.0105l.0113.0087.03.0213 4.976 3.7264 2.462 1.8633 1.4995 1.1321a1.0085 1.0085 0 0 0 1.2197 0l1.4995-1.1321 2.4619-1.8633 5.006-3.7489.0125-.01a6.0682 6.0682 0 0 0 2.0094-7.003z"/></svg>

After

Width:  |  Height:  |  Size: 592 B

63
icons/radicle.svg Normal file
View File

@@ -0,0 +1,63 @@
<svg class="text-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44 44" fill="none">
<g shape-rendering="crispEdges">
<rect x="8" y="0" width="4" height="4" fill="#5555FF"/>
<rect x="32" y="0" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="4" width="4" height="4" fill="#5555FF"/>
<rect x="28" y="4" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="8" width="4" height="4" fill="#5555FF"/>
<rect x="16" y="8" width="4" height="4" fill="#3333DD"/>
<rect x="20" y="8" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="8" width="4" height="4" fill="#3333DD"/>
<rect x="28" y="8" width="4" height="4" fill="#5555FF"/>
<rect x="8" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="16" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="20" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="28" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="32" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="4" y="16" width="4" height="4" fill="#5555FF"/>
<rect x="8" y="16" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="16" width="4" height="4" fill="#F4F4F4"/>
<rect x="16" y="16" width="4" height="4" fill="#F4F4F4"/>
<rect x="20" y="16" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="16" width="4" height="4" fill="#5555FF"/>
<rect x="28" y="16" width="4" height="4" fill="#F4F4F4"/>
<rect x="32" y="16" width="4" height="4" fill="#F4F4F4"/>
<rect x="36" y="16" width="4" height="4" fill="#5555FF"/>
<rect x="4" y="20" width="4" height="4" fill="#5555FF"/>
<rect x="8" y="20" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="20" width="4" height="4" fill="#F4F4F4"/>
<rect x="16" y="20" width="4" height="4" fill="#FF55FF"/>
<rect x="20" y="20" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="20" width="4" height="4" fill="#5555FF"/>
<rect x="28" y="20" width="4" height="4" fill="#F4F4F4"/>
<rect x="32" y="20" width="4" height="4" fill="#FF55FF"/>
<rect x="36" y="20" width="4" height="4" fill="#5555FF"/>
<rect x="0" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="4" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="8" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="12" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="16" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="20" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="24" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="28" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="32" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="36" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="40" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="8" y="28" width="4" height="4" fill="#3333DD"/>
<rect x="16" y="28" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="28" width="4" height="4" fill="#5555FF"/>
<rect x="32" y="28" width="4" height="4" fill="#3333DD"/>
<rect x="8" y="32" width="4" height="4" fill="#3333DD"/>
<rect x="16" y="32" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="32" width="4" height="4" fill="#5555FF"/>
<rect x="32" y="32" width="4" height="4" fill="#3333DD"/>
<rect x="16" y="36" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="36" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="40" width="4" height="4" fill="#5555FF"/>
<rect x="16" y="40" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="40" width="4" height="4" fill="#5555FF"/>
<rect x="28" y="40" width="4" height="4" fill="#5555FF"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

1
icons/sourcehut.svg Normal file
View File

@@ -0,0 +1 @@
<svg class="text-icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>SourceHut</title><path d="M12 0C5.371 0 0 5.371 0 12s5.371 12 12 12 12-5.371 12-12S18.629 0 12 0Zm0 21.677A9.675 9.675 0 0 1 2.323 12 9.675 9.675 0 0 1 12 2.323 9.675 9.675 0 0 1 21.677 12 9.675 9.675 0 0 1 12 21.677Z"/></svg>

After

Width:  |  Height:  |  Size: 323 B

16
index.dj Normal file
View File

@@ -0,0 +1,16 @@
# rpqt's web corner
Hi! I'm Romain, a computer science student at [Ensimag][] engineering school.
I'm interested in many aspects of IT so I try to play a little bit with
everything. I love Rust, Nix, Zig, TS and other cool tech.
## Temporary index
- [What I'm doing now](./now.dj)
- [Projects](./projects)
- [Socials](./socials.dj)
- [Stuff I use](./uses.dj)
- [Résumé/CV (public version)](./résumé/)
[Ensimag]: https://ensimag.grenoble-inp.fr

View File

@@ -1,13 +0,0 @@
---
layout: layouts/main.vto
title: rpqt's web corner
---
# rpqt's web corner
Hi! I'm Romain, a computer science student at [Ensimag] engineering school.
I'm interested in many aspects of IT so I try to play a little bit with
everything. I love Rust, Nix, Zig, TS and other cool tech.
[Ensimag]: https://ensimag.grenoble-inp.fr

5
now.dj Normal file
View File

@@ -0,0 +1,5 @@
# What I'm up to
- I am doing an exchange at [AGH][], in Kraków 🇵🇱, from October 2025 to February 2026.
[AGH]: https://www.agh.edu.pl/en/

5
now.md
View File

@@ -1,5 +0,0 @@
# What I'm up to
- I am doing an exchange at [AGH], in Kraków 🇵🇱, from October 2025 to February 2026.
[AGH]: https://www.agh.edu.pl/en/

View File

@@ -1,12 +0,0 @@
# Projects
## Lila
A simple programming language. It uses [Cranelift] as a compiler backend.
## Myrtle
A note-taking helper similar to [zk].
[Cranelift]: https://cranelift.dev
[zk]: https://zk-org.github.io/zk

17
projects/index.dj Normal file
View File

@@ -0,0 +1,17 @@
# Projects
## [Lila](./lila.dj)
A simple programming language. It uses [Cranelift][] as a compiler backend.
## Myrtle
A note-taking helper similar to [zk][].
## Statice
A static site generator supporting [Djot][].
[Cranelift]: https://cranelift.dev
[Djot]: https://djot.net
[zk]: https://zk-org.github.io/zk

42
projects/lila.dj Normal file
View File

@@ -0,0 +1,42 @@
# Lila
A simple programming language I make in my free time.
I'm trying to make it modular so I can easily try and compare different backends and tooling.
## Status
For now it can JIT-compile basic programs using [Cranelift][].
I'm still not decided on which language features I want to explore.
## Source mirrors
- :si-github: [GitHub](https://github.com/rpqt/lila)
- :si-gitea: [Gitea](https://git.turifer.dev/rpqt/lila)
- :si-sourcehut: [SourceHut](https://git.sr.ht/~rpqt/lila)
## Roadmap
### Parsing
- [x] Pest parser backend
- [ ] (wip) [Tree-sitter][] parser backend
- [ ] (wip) Tree-sitter grammar -- [git][tree-sitter-lila]
- [ ] (wip) Parser based on the tree-sitter grammar
### Static analysis
- [x] Basic type checking
### Codegen
- [x] (wip) Cranelift JIT compiler
- [x] Basic CLI
- [ ] Run the compiler on Wasm
- [ ] Wasm codegen
- [ ] REPL
[Cranelift]: https://cranelift.dev
[Tree-sitter]: https://tree-sitter.github.io/tree-sitter
[tree-sitter-lila]: https://git.sr.ht/~rpqt/tree-sitter-lila

View File

@@ -1,4 +0,0 @@
fr: |
Je suis étudiant en troisième année décole dingénieur en informatique et mathématiques appliquées (M2). Jai un fort intérêt pour les systèmes et leur architecture, la cybersécurité, le réseau, linfrastructure et le développement. Je suis en recherche d'un stage de fin d'études de 5-6 mois qui me permettrait d'appliquer mes connaissances.
en: |
Im a third year student (M2) in computer science and engineering school. Im interested in multiple fields: systems, architecture, cybersecurity, networking, infrastructure and development. I fuel this long-standing passion in my personal time. I am looking for a 5-6 months end-of-studies internship that will allow me apply my knowledge to real problems.

View File

@@ -1,8 +0,0 @@
title:
fr: Compétences
en: Skills
priority: 3
content: |
- *C*, *Rust*, *C++*, *Java*, *Python*, *C\#*, Zig, TS, OCaml, Lua
- Unix, Shell, Git, GDB, Docker, Nix, React, SQL, QEMU, Terraform, CMake, Gitlab CI, Buildbot, QNX, FreeRTOS, CUDA
- RISC-V, ARMv7, AArch64, x86_64

2
résumé/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*.pdf
profile-circle.png

6
résumé/Makefile Normal file
View File

@@ -0,0 +1,6 @@
data := $(wildcard _data/**/*.yml)
all: all.pdf fr.pdf en.pdf
%.pdf: %.typ main.typ $(data)
typst compile $*.typ

5
résumé/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Résumé
To build the PDF versions, simply `make`. Before that, the profile picture
should be in this directory under the path `profile-circle.png`, since it is
not checked out for privacy.

View File

@@ -0,0 +1,4 @@
fr: |
Je suis étudiant en 3#super[ème] année décole dingénieur en informatique et mathématiques appliquées (M2). Jai un fort intérêt pour les systèmes et leur architecture, la cybersécurité, le réseau, linfrastructure et le développement. Je suis en recherche d'un stage de fin d'études de 5-6 mois qui me permettrait d'appliquer mes connaissances à de vrais problèmes.
en: |
Im a 3#super[rd] year student (M2) in computer science and engineering school. Im interested in multiple fields: systems, architecture, cybersecurity, networking, infrastructure and development. I fuel this long-standing passion in my personal time. I am looking for a 5-6 months end-of-studies internship that will allow me apply my knowledge to real problems.

View File

@@ -59,8 +59,8 @@ items:
end: 09/2022 end: 09/2022
description: description:
context: context:
fr: Laboratoire de recherche, dans le cadre du dispositif des stages dexcellence de lUniversité Grenoble Alpes. fr: Laboratoire de recherche, dans le cadre des stages dexcellence de lUniversité Grenoble Alpes.
en: Research laboratory internship for the “stage dexcellence” program at Université Grenoble Alpes en: Research laboratory internship for the “stage dexcellence” program at Université Grenoble Alpes
tasks: tasks:
fr: fr:
- Connecter les outils du VERIMAG avec des environnements dapprentissage par renforcement (OpenAI Gym) - Connecter les outils du VERIMAG avec des environnements dapprentissage par renforcement (OpenAI Gym)

View File

@@ -0,0 +1,9 @@
title:
fr: Compétences
en: Skills
priority: 3
content: |
- *C*, *Rust*, *C++*, *Java*, *Python*, *C\#*, Zig, TS, OCaml, Lua, Shell, SQL
- Linux, FreeBSD, QNX, FreeRTOS, QEMU, Docker, React
- *Git*, *CMake*, *Nix*, *GDB*, Gitlab CI, Buildbot, Terraform, CUDA, OpenCL
- RISC-V, ARMv7, AArch64, x86

View File

@@ -36,7 +36,7 @@
<center> <center>
{{ for el of exp.stack }} {{ for el of exp.stack }}
<span class="pl-badge">{{ el }}</span> <span class="pl-badge pl-{{ el |> lowercasePL }}">{{ el }}</span>
{{ /for }} {{ /for }}
</center> </center>
</div> </div>

3
résumé/all.typ Normal file
View File

@@ -0,0 +1,3 @@
#import "main.typ": mkCV
#let languages = ("fr", "en")
#languages.map(mkCV).join()

2
résumé/en.typ Normal file
View File

@@ -0,0 +1,2 @@
#import "main.typ": mkCV
#mkCV("en")

2
résumé/fr.typ Normal file
View File

@@ -0,0 +1,2 @@
#import "main.typ": mkCV
#mkCV("fr")

View File

@@ -1,6 +1,6 @@
#import "localize.typ": localize #import "localize.typ": localize
#let languages = ("fr", "en") #let mkCV(language) = [
#set page( #set page(
paper: "a4", paper: "a4",
@@ -8,24 +8,19 @@
margin: 10mm, margin: 10mm,
) )
#languages.map(language => [
#set text(lang: language) #set text(lang: language)
#let accent-color = rgb(0x06, 0x92, 0xaa, 255) #let accent-color = rgb(0x06, 0x92, 0xaa, 255)
#let load-section(path) = localize(language, yaml(path)) #let load(path) = localize(language, yaml(path))
#let education = load-section("_data/sections/education.yml") #let education = load("_data/sections/education.yml")
#let experiences = load-section("_data/sections/experiences.yml") #let experiences = load("_data/sections/experiences.yml")
#let hobbies = load-section("_data/sections/hobbies.yml") #let hobbies = load("_data/sections/hobbies.yml")
#let languages = load-section("_data/sections/languages.yml") #let languages = load("_data/sections/languages.yml")
#let skills = load-section("_data/sections/skills.yml") #let skills = load("_data/sections/skills.yml")
#let introduction = load-section("_data/introduction.yml") #let introduction = load("_data/introduction.yml")
#let contact = yaml("_data/contact.yml")
#let data = yaml("data.yml") #let words = load("_data/words.yml")
#let words = localize(language, yaml("_data/words.yml"))
#let tr(key) = key.split(".").fold(words, (d, k) => d.at(k)).at(language)
#let date-range(date) = [ #date.begin --- #date.end ] #let date-range(date) = [ #date.begin --- #date.end ]
@@ -50,7 +45,7 @@
1 Rue Auguste Renoir \ 1 Rue Auguste Renoir \
38400 Saint-Martin-d'Hères \ 38400 Saint-Martin-d'Hères \
(+33) 06 58 92 15 86 \ (+33) 06 58 92 15 86 \
#for email in data.emails [ #for email in contact.emails [
#link("mailto:" + email) \ #link("mailto:" + email) \
] ]
#link("https://rpqt.fr") #link("https://rpqt.fr")
@@ -79,7 +74,7 @@
scope: "parent", scope: "parent",
[ [
#line(length: 100%) #line(length: 100%)
#introduction #eval(introduction, mode: "markup")
#line(length: 100%) #line(length: 100%)
] ]
) )
@@ -130,11 +125,11 @@
#for hobby in hobbies.items [ #for hobby in hobbies.items [
#if hobby.keys().contains("items") [ #if hobby.keys().contains("items") [
*#hobby.name* *#hobby.name*
#hobby.items.map(i => [ - #i]).join() #hobby.items.map(i => [ - #eval(i, mode: "markup")]).join()
] else [ ] else [
*#hobby.name* -- #hobby.at("content") *#hobby.name* -- #eval(hobby.at("content"), mode: "markup")
] ]
] ]
]).join() ]

15
socials.dj Normal file
View File

@@ -0,0 +1,15 @@
## Forges
### :si-gitea: [My Gitea instance](https://git.turifer.dev/rpqt)
### :si-radicle: [Radicle node](https://app.radicle.xyz/nodes/radicle.rpqt.fr)
### :si-sourcehut: [SourceHut](https://git.sr.ht/~rpqt)
### :si-github: [GitHub](https://github.com/rpqt)
### :si-codeberg: [Codeberg](https://codeberg.org/rpqt)
### :si-gitlab: [GitLab](https://gitlab.com/rpqt)
### :si-gitlab: [GRICAD GitLab instance](https://gricad-gitlab.univ-grenoble-alpes.fr/paquetr)

View File

@@ -1,9 +0,0 @@
## Forges
- [My Gitea instance](https://git.turifer.dev/rpqt)
- [Radicle node](https://app.radicle.xyz/nodes/radicle.rpqt.fr)
- [SourceHut](https://git.sr.ht/~rpqt)
- [GitHub](https://github.com/rpqt)
- [Codeberg](https://codeberg.org/rpqt)
- [GitLab](https://gitlab.com/rpqt)
- [GRICAD GitLab instance](https://gricad-gitlab.univ-grenoble-alpes.fr/paquetr)

View File

@@ -5,7 +5,7 @@
--color-foreground-dimmed: color-mix(in srgb, var(--color-foreground), transparent 40%); --color-foreground-dimmed: color-mix(in srgb, var(--color-foreground), transparent 40%);
/* --color-accent: #0692aa; */ /* --color-accent: #0692aa; */
--max-width: 900px; --max-width: 900px;
--font-base-size: 20px; --font-base-size: 1.25rem;
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
@@ -19,8 +19,7 @@
} }
body { body {
/* font-family: "JetBrains Mono"; */ font-family: "Atkinson Hyperlegible Next";
font-family: "Atkinson Hyperlegible";
display: grid; display: grid;
grid-template-rows: auto 1fr auto; grid-template-rows: auto 1fr auto;
min-height: 100svh; min-height: 100svh;
@@ -59,8 +58,6 @@ header>nav {
text-decoration: underline; text-decoration: underline;
} }
#site-root {}
#header-nav-current { #header-nav-current {
font-weight: bold; font-weight: bold;
} }
@@ -76,17 +73,6 @@ h3 {
margin: 0.5em 0; margin: 0.5em 0;
} }
/*
h1::before { content: "#"; }
h2::before { content: "##"; }
h3::before { content: "###"; }
h1::before, h2::before, h3::before {
font-variant-ligatures: none;
margin-right: 0.3em;
}
*/
footer { footer {
width: 100%; width: 100%;
text-align: center; text-align: center;
@@ -109,9 +95,39 @@ footer {
} }
.pl-badge { .pl-badge {
border: 1px solid; --color: var(--color-foreground);
border-radius: 8px; border-radius: 8px;
padding: 0.5em; padding: 0em 0.5em;
margin: 0.25em; margin: 0em;
display: inline-block; display: inline-block;
font-size: 0.9em;
background: color-mix(in srgb, var(--color), transparent 60%);
color: var(--color);
}
.pl-python3 {
--color: goldenrod;
background: color-mix(in srgb, gold, transparent 60%);
}
.pl-cpp {
--color: blue;
}
.pl-csharp {
--color: purple;
}
.pl-rust {
--color: orangered;
}
/* An icon to be displayed within text, at the same size as the text */
.text-icon {
height: 1em;
width: 1em;
display: inline;
fill: var(--color-foreground);
position: relative;
top: .125em;
} }

View File

@@ -6,22 +6,22 @@ There are [lots of pages](https://uses.tech) like this one showing developer set
### OS ### OS
I've used different Linux systems on my machines, mostly [Arch Linux] on my laptop. I've used different Linux systems on my machines, mostly [Arch Linux][] on my laptop.
I recently joined the [_NixOS cult_ ❄️][NixOS], maybe you should too 👀. I recently joined the [_NixOS cult_ ❄️][NixOS], maybe you should too 👀.
My handphone runs on [GrapheneOS]. My handphone runs on [GrapheneOS][].
### Apps ### Apps
- **Editor**: helix - *Editor*: helix
- **Terminal**: alacritty, ghostty - *Terminal*: alacritty, ghostty
- **Font**: JetBrains Mono - *Font*: JetBrains Mono
- **Shell**: zsh - *Shell*: zsh
- **Prompt**: starship - *Prompt*: starship
- **History**: atuin - *Shell history*: atuin
- **Other utils**: zoxide, direnv, rg - *Other utils*: zoxide, direnv, rg
- **Web browser**: Firefox, Vanadium - *Web browser*: Firefox, Vanadium
- **VPN**: Tailscale, Zerotier - *VPN*: Tailscale, Zerotier
- **DNS**: Self-hosted [Unbound] - *DNS*: Self-hosted [Unbound][]
## Hardware ## Hardware
@@ -33,7 +33,7 @@ My handphone is a Pixel 7a.
### Keyboard ### Keyboard
I built a split mechanical keyboard, the (Ferris) [Sweep] LP, which I only use at home. I built a split mechanical keyboard, the (Ferris) [Sweep][] LP, which I only use at home.
### Audio ### Audio