this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

🚧 New /resume !

+690 -183
+18 -2
collections.yaml
··· 25 25 title: { en: music, fr: musique } 26 26 includes: "#music" 27 27 description: 28 - en: I've been experimenting with sounds, their textures and their musicality since I was 7 years old. 29 - fr: J'expérimente les sons, leurs textures et leur musicalité depuis que j'ai 7 ans. 28 + en: | 29 + I've been experimenting with sounds, their textures and their musicality since I was 7 years old. 30 + 31 + I'm on streaming platforms! 32 + 33 + - [Spotify](https://gwen.works/to/spotify) 34 + - [Deezer](https://gwen.works/to/deezer) 35 + - [Apple Music](https://gwen.works/to/applemusic) 36 + - [YouTube](https://gwen.works/to/youtube) 37 + fr: | 38 + J'expérimente les sons, leurs textures et leur musicalité depuis que j'ai 7 ans. 39 + 40 + Je suis sur les plateformes de streaming ! 41 + 42 + - [Spotify](https://gwen.works/to/spotify) 43 + - [Deezer](https://gwen.works/to/deezer) 44 + - [Apple Music](https://gwen.works/to/applemusic) 45 + - [YouTube](https://gwen.works/to/youtube) 30 46 singular: release 31 47 plural: releases 32 48
+1 -1
education.yaml
··· 4 4 name: Lycée D'Alzon 5 5 location: Nîmes 6 6 diploma: 7 - results: 16.26/20 7 + results: mention “very good” 16.26/20 8 8 name: Scientific Baccalaureate 9 9 10 10 - time: 2020
+1 -1
src/content.config.ts
··· 149 149 education: yamlDataCollection( 150 150 "education.yaml", 151 151 z.object({ 152 - time: z.coerce.string(), 152 + time: z.number().min(2003).max(new Date().getFullYear()).int(), 153 153 title: z.string(), 154 154 school: z.object({ 155 155 name: z.string(),
+63
src/layouts/Bare.astro
··· 1 + --- 2 + interface Props { 3 + /** 4 + * Attributes to add to the `<html>` tag. 5 + */ 6 + htmlAttributes?: Record<string, any>; 7 + /** 8 + * Styles on the `<body>` tag. 9 + */ 10 + bodyStyles?: Record<string, any>; 11 + } 12 + --- 13 + 14 + <!doctype html> 15 + <html> 16 + <head> 17 + <meta charset="UTF-8" /> 18 + <meta name="viewport" content="width=device-width" /> 19 + <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 20 + <meta name="generator" content={Astro.generator} /> 21 + <link rel="preconnect" href="https://fonts.googleapis.com" /> 22 + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 23 + <link 24 + href="https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&family=Victor+Mono:ital,wght@0,100..700;1,100..700&display=swap" 25 + rel="stylesheet" 26 + /> 27 + <script 28 + defer 29 + data-domain="beta.gwen.works" 30 + src="https://stats.gwen.works/js/script.js"></script> 31 + <slot name="head" /> 32 + </head> 33 + <body 34 + style={Object.entries(Astro.props.bodyStyles || {}) 35 + .map(([k, v]) => `${k}: ${v}`) 36 + .join("; ")} 37 + > 38 + <slot /> 39 + </body> 40 + </html> 41 + 42 + <style> 43 + html, 44 + body { 45 + padding: 0; 46 + margin: 0; 47 + width: 100%; 48 + min-height: 100%; 49 + font-family: "Manrope", sans-serif; 50 + color: var(--primary, black); 51 + background: var(--secondary, white); 52 + line-height: 1; 53 + } 54 + body { 55 + --pad: 0; 56 + padding: var(--pad); 57 + width: calc(100% - 2 * var(--pad)); 58 + height: calc(100% - 2 * var(--pad)); 59 + display: flex; 60 + flex-direction: column; 61 + gap: 2rem; 62 + } 63 + </style>
-167
src/layouts/Layout.astro
··· 1 - --- 2 - import { getCollection } from "astro:content"; 3 - import { setCssColors } from "../colors"; 4 - import Navigation from "../components/Navigation.astro"; 5 - 6 - interface Props { 7 - colors?: { primary: string; secondary: string; tertiary: string }; 8 - clientSideRedirect?: string; 9 - } 10 - --- 11 - 12 - <!doctype html> 13 - <html 14 - lang={Astro.locals.locale || Astro.locals.lang} 15 - style={setCssColors(Astro.props.colors)} 16 - > 17 - <head> 18 - <meta charset="UTF-8" /> 19 - <meta name="viewport" content="width=device-width" /> 20 - <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 21 - <meta name="generator" content={Astro.generator} /> 22 - <link rel="preconnect" href="https://fonts.googleapis.com" /> 23 - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 24 - <link 25 - href="https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&family=Victor+Mono:ital,wght@0,100..700;1,100..700&display=swap" 26 - rel="stylesheet" 27 - /> 28 - { 29 - Astro.props.clientSideRedirect ? ( 30 - <> 31 - <title>Redirecting to {Astro.props.clientSideRedirect}</title> 32 - <meta 33 - http-equiv="refresh" 34 - content={`0; url=${Astro.props.clientSideRedirect}`} 35 - /> 36 - <link rel="canonical" href={Astro.props.clientSideRedirect} /> 37 - </> 38 - ) : ( 39 - <title>gwen.works</title> 40 - ) 41 - } 42 - </head> 43 - <body> 44 - <Navigation /> 45 - <slot /> 46 - <footer> 47 - <p> 48 - made with <a href="/ortfo">ortfo/db</a> &amp; <a 49 - href="https://astro.build">astro</a 50 - > 51 - </p> 52 - 53 - <p>&lt;3 Gwenn {new Date().getFullYear()}</p> 54 - 55 - <p>generative ai cannot make art</p> 56 - 57 - <ul> 58 - { 59 - (await getCollection("sites")).map( 60 - ({ data: { name, url, purpose } }) => ( 61 - <> 62 - <li> 63 - <a href={url}>{`/to/${name}`.padEnd(15)}</a> 64 - <span class="purpose">{purpose}</span> 65 - </li> 66 - </> 67 - ), 68 - ) 69 - } 70 - </ul> 71 - 72 - <pre 73 - class="locals" 74 - set:html={JSON.stringify(Astro.locals, null, 2).replace( 75 - Astro.locals.buildCommit ?? "", 76 - `<a href=https://github.com/gwennlbh/portfolio/commit/${Astro.locals.buildCommit}>${Astro.locals.buildCommit?.slice(0, 8)}</a>`, 77 - )} 78 - /> 79 - </footer> 80 - </body> 81 - </html> 82 - 83 - <style> 84 - html, 85 - body { 86 - padding: 0; 87 - margin: 0; 88 - width: 100%; 89 - min-height: 100%; 90 - font-family: "Manrope", sans-serif; 91 - color: var(--primary, black); 92 - background: var(--secondary, white); 93 - line-height: 1; 94 - } 95 - body { 96 - --pad: 2rem; 97 - padding: var(--pad); 98 - width: calc(100% - 2 * var(--pad)); 99 - height: calc(100% - 2 * var(--pad)); 100 - display: flex; 101 - flex-direction: column; 102 - gap: 2rem; 103 - } 104 - :global(p, p > *) { 105 - line-height: 1.2; 106 - } 107 - :global(ul, li, h1, h2, p) { 108 - padding: 0; 109 - margin: 0; 110 - } 111 - :global(pre) { 112 - font-family: inherit; 113 - font-size: 1em; 114 - } 115 - :global(a:not(.block-link)) { 116 - color: var(--primary, black); 117 - text-underline-offset: 5px; 118 - text-decoration-thickness: 1.5px; 119 - transition: all 0.125s; 120 - } 121 - :global(a:not(.block-link):hover, a:not(.block-link):focus-visible) { 122 - font-weight: bold; 123 - text-underline-offset: calc(5px - 1px); 124 - text-decoration-thickness: 3px; 125 - } 126 - :global(ul) { 127 - list-style: none; 128 - } 129 - :global(ul li::before) { 130 - content: "— "; 131 - opacity: 0.5; 132 - font-weight: bold; 133 - } 134 - 135 - footer { 136 - margin-top: 5rem; 137 - display: flex; 138 - flex-direction: column; 139 - gap: 3rem; 140 - font-family: 141 - Victor Mono, 142 - monospace; 143 - } 144 - 145 - footer ul { 146 - display: flex; 147 - flex-direction: column; 148 - gap: 0.5em; 149 - list-style: none; 150 - padding: 0; 151 - } 152 - 153 - footer ul a { 154 - white-space: pre; 155 - } 156 - 157 - footer ul .purpose { 158 - font-style: italic; 159 - opacity: 0.75; 160 - } 161 - 162 - footer .locals { 163 - max-width: 80vw; 164 - white-space: wrap; 165 - overflow-x: hidden; 166 - } 167 - </style>
+145
src/layouts/Regular.astro
··· 1 + --- 2 + import { getCollection } from "astro:content"; 3 + import Bare from "./Bare.astro"; 4 + import { setCssColors } from "../colors"; 5 + import Navigation from "../components/Navigation.astro"; 6 + 7 + interface Props { 8 + /** 9 + * Colors to use for the layout. 10 + * Sets CSS variables --primary, --secondary, and ---tertiary. 11 + */ 12 + colors?: { primary: string; secondary: string; tertiary: string }; 13 + /** 14 + * Client-side redirect URL. 15 + */ 16 + clientSideRedirect?: string; 17 + } 18 + --- 19 + 20 + <Bare 21 + htmlAttributes={{ 22 + lang: Astro.locals.locale || Astro.locals.lang, 23 + style: setCssColors(Astro.props.colors), 24 + }} 25 + > 26 + { 27 + Astro.props.clientSideRedirect ? ( 28 + <Fragment slot="head"> 29 + <title>Redirecting to {Astro.props.clientSideRedirect}</title> 30 + <meta 31 + http-equiv="refresh" 32 + content={`0; url=${Astro.props.clientSideRedirect}`} 33 + /> 34 + <link rel="canonical" href={Astro.props.clientSideRedirect} /> 35 + </Fragment> 36 + ) : ( 37 + <title slot="head">gwen.works</title> 38 + ) 39 + } 40 + <Navigation /> 41 + <slot /> 42 + <footer> 43 + <p> 44 + made with <a href="/ortfo">ortfo/db</a> &amp; <a 45 + href="https://astro.build">astro</a 46 + > 47 + </p> 48 + 49 + <p>&lt;3 Gwenn {new Date().getFullYear()}</p> 50 + 51 + <p>generative ai cannot make art</p> 52 + 53 + <ul> 54 + { 55 + (await getCollection("sites")).map( 56 + ({ data: { name, url, purpose } }) => ( 57 + <> 58 + <li> 59 + <a href={url}>{`/to/${name}`.padEnd(15)}</a> 60 + <span class="purpose">{purpose}</span> 61 + </li> 62 + </> 63 + ), 64 + ) 65 + } 66 + </ul> 67 + 68 + <pre 69 + class="locals" 70 + set:html={JSON.stringify(Astro.locals, null, 2).replace( 71 + Astro.locals.buildCommit ?? "", 72 + `<a href=https://github.com/gwennlbh/portfolio/commit/${Astro.locals.buildCommit}>${Astro.locals.buildCommit?.slice(0, 8)}</a>`, 73 + )} 74 + /> 75 + </footer> 76 + </Bare> 77 + 78 + <style> 79 + footer { 80 + margin-top: 5rem; 81 + display: flex; 82 + flex-direction: column; 83 + gap: 3rem; 84 + font-family: 85 + Victor Mono, 86 + monospace; 87 + } 88 + 89 + footer ul { 90 + display: flex; 91 + flex-direction: column; 92 + gap: 0.5em; 93 + list-style: none; 94 + padding: 0; 95 + } 96 + 97 + footer ul a { 98 + white-space: pre; 99 + } 100 + 101 + footer ul .purpose { 102 + font-style: italic; 103 + opacity: 0.75; 104 + } 105 + 106 + footer .locals { 107 + max-width: 80vw; 108 + white-space: wrap; 109 + overflow-x: hidden; 110 + } 111 + 112 + :global(p, p > *) { 113 + line-height: 1.2; 114 + } 115 + :global(ul, li, h1, h2, p) { 116 + padding: 0; 117 + margin: 0; 118 + } 119 + :global(pre) { 120 + font-family: inherit; 121 + font-size: 1em; 122 + } 123 + :global(a:not(.block-link)) { 124 + color: var(--primary, black); 125 + text-underline-offset: 5px; 126 + text-decoration-thickness: 1.5px; 127 + transition: all 0.125s; 128 + } 129 + :global(a:not(.block-link):hover, a:not(.block-link):focus-visible) { 130 + font-weight: bold; 131 + text-underline-offset: calc(5px - 1px); 132 + text-decoration-thickness: 3px; 133 + } 134 + :global(ul) { 135 + list-style: none; 136 + } 137 + :global(ul li::before) { 138 + content: "— "; 139 + opacity: 0.5; 140 + font-weight: bold; 141 + } 142 + body { 143 + --pad: 2rem; 144 + } 145 + </style>
+1 -1
src/pages/404.astro
··· 1 1 --- 2 2 import StrongHeader from "../components/StrongHeader.astro"; 3 - import Layout from "../layouts/Layout.astro"; 3 + import Layout from "../layouts/Regular.astro"; 4 4 --- 5 5 6 6 <Layout>
+1 -1
src/pages/blog/[entry].astro
··· 2 2 import type { GetStaticPaths } from "astro"; 3 3 import { getEntry } from "astro:content"; 4 4 import { getCollection } from "astro:content"; 5 - import Layout from "../../layouts/Layout.astro"; 5 + import Layout from "../../layouts/Regular.astro"; 6 6 import StrongHeader from "../../components/StrongHeader.astro"; 7 7 8 8 export const getStaticPaths = (async () => {
+1 -1
src/pages/blog/index.astro
··· 1 1 --- 2 2 import { getCollection } from "astro:content"; 3 3 import StrongHeader from "../../components/StrongHeader.astro"; 4 - import Layout from "../../layouts/Layout.astro"; 4 + import Layout from "../../layouts/Regular.astro"; 5 5 6 6 const posts = await getCollection("blogEntries"); 7 7 const dateFormatter = new Intl.DateTimeFormat(Astro.locals.locale, {
+1 -1
src/pages/collections/[collection].astro
··· 4 4 import Translated from "../../components/Translated.astro"; 5 5 import StrongHeader from "../../components/StrongHeader.astro"; 6 6 import WorksGrid from "../../components/WorksGrid.astro"; 7 - import Layout from "../../layouts/Layout.astro"; 7 + import Layout from "../../layouts/Regular.astro"; 8 8 import picomatch from "picomatch"; 9 9 10 10 export const getStaticPaths = (async () => {
+1 -1
src/pages/contact.astro
··· 1 1 --- 2 2 import { getEntry } from "astro:content"; 3 3 import StrongHeader from "../components/StrongHeader.astro"; 4 - import Layout from "../layouts/Layout.astro"; 4 + import Layout from "../layouts/Regular.astro"; 5 5 6 6 const bsky = await getEntry("sites", "bluesky"); 7 7 const insta = await getEntry("sites", "instagram");
+1 -1
src/pages/index.astro
··· 1 1 --- 2 2 import WorksGrid from "../components/WorksGrid.astro"; 3 3 import StrongHeader from "../components/StrongHeader.astro"; 4 - import Layout from "../layouts/Layout.astro"; 4 + import Layout from "../layouts/Regular.astro"; 5 5 import { getCollection, getEntry } from "astro:content"; 6 6 7 7 const works = (await getCollection("works")).map((w) => w.data);
+1 -1
src/pages/resume.astro src/pages/resume/old.astro
··· 3 3 import { intervalToDuration } from "date-fns"; 4 4 import { isAliased } from "../aliases.js"; 5 5 import StrongHeader from "../components/StrongHeader.astro"; 6 - import Layout from "../layouts/Layout.astro"; 6 + import Layout from "../layouts/Regular.astro"; 7 7 8 8 const works = await getCollection("works"); 9 9 const experiences = await getCollection("experiences");
+13
src/pages/resume/Reference.astro
··· 1 + --- 2 + interface Props { 3 + url: string; 4 + parens?: boolean; 5 + } 6 + 7 + const { parens = false } = Astro.props; 8 + const url = new URL("https://" + Astro.props.url); 9 + --- 10 + 11 + {parens && "("}<a href={url} target="_blank">{url.hostname + url.pathname}</a>{ 12 + parens && ")" 13 + }
+24
src/pages/resume/Tech.astro
··· 1 + --- 2 + import { getEntry } from "astro:content"; 3 + 4 + interface Props { 5 + name: string; 6 + } 7 + 8 + const { 9 + data: { name, slug }, 10 + } = (await getEntry("technologies", Astro.props.name.toLowerCase())) ?? { 11 + data: { name: "", slug: "" }, 12 + }; 13 + --- 14 + 15 + { 16 + name && slug ? ( 17 + <strong> 18 + <a href={`/using/${slug}`}>{name}</a> 19 + </strong> 20 + ) : ( 21 + <strong>{Astro.props.name}</strong> 22 + ) 23 + } 24 +
+407
src/pages/resume/index.astro
··· 1 + --- 2 + import { getCollection } from "astro:content"; 3 + import Bare from "../../layouts/Bare.astro"; 4 + import Tech from "./Tech.astro"; 5 + import Reference from "./Reference.astro"; 6 + 7 + const wakatime = await getCollection("wakatime").then((entries) => 8 + Object.fromEntries( 9 + entries.map((entry) => [ 10 + entry.id, 11 + Math.floor(entry.data.total_seconds / 3600), 12 + ]), 13 + ), 14 + ); 15 + 16 + const timeSpent = { 17 + htmlcssjs: wakatime.html + wakatime.css + wakatime.javascript, 18 + python: wakatime.python, 19 + }; 20 + 21 + const education = await getCollection("education").then((entries) => 22 + entries.map(({ data }) => data), 23 + ); 24 + --- 25 + 26 + <Bare 27 + bodyStyles={{ 28 + color: "var(--gray)", 29 + background: "var(--void)", 30 + "--pad": "1.5em", 31 + }} 32 + > 33 + <header> 34 + <h1>Gwenn Le Bihan</h1> 35 + <p class="intro" i18n> 36 + I am interested in almost anything that is both creative &amp; digital. 37 + </p> 38 + <dl> 39 + <dt>Portfolio</dt> 40 + <dd><a href="https://gwen.works">gwen.works</a></dd> 41 + <dt>Email</dt> 42 + <dd> 43 + <a href="https://gwen.works/to/email">gwenn.lebihan7 (at) gmail.com</a> 44 + </dd> 45 + </dl> 46 + </header> 47 + 48 + <main> 49 + <h2>Skills</h2> 50 + <section class="skills"> 51 + <div class="language"> 52 + <h3>Language</h3> 53 + <h4>French</h4> 54 + <ul> 55 + <li>Native</li> 56 + </ul> 57 + <h4>English</h4> 58 + <ul> 59 + <li> 60 + <strong>950/990</strong> 61 + (<a href="https://www.etsglobal.org/fr/en">TOEIC</a>) 62 + </li> 63 + <li> 64 + <strong>176/180</strong> 65 + (<a 66 + href="https://www.etsglobal.org/fr/en/test-type-family/toeic-bridge-test" 67 + >TOEIC Bridge</a 68 + >) 69 + </li> 70 + <li> 71 + <strong>C1</strong> 72 + (<a 73 + href="https://www.cambridgeenglish.org/fr/exams-and-tests/linguaskill/" 74 + >Cambridge LinguaSkill</a 75 + >) 76 + </li> 77 + </ul> 78 + <h4>Japanese</h4> 79 + <ul> 80 + <li>Japanese</li> 81 + </ul> 82 + </div> 83 + <div class="programming"> 84 + <h3>Programming</h3> 85 + <h4>Web</h4> 86 + <ul> 87 + <li> 88 + <strong>{timeSpent.htmlcssjs}+</strong> hours of 89 + <Tech name="html" />, <Tech name="css" /> and <Tech 90 + name="javascript" 91 + /> 92 + </li> 93 + <li> 94 + Large platform in <Tech name="graphql" />+<Tech name="sveltekit" /> 95 + <Reference parens url="github.com/inp-net/churros" /> 96 + </li> 97 + <li> 98 + Technical GraphQL documentation site generator <Reference 99 + parens 100 + url="github.com/graphinx/graphinx" 101 + /> 102 + </li> 103 + <li> 104 + Deployment of several services on a <Tech name="Kubernetes" /> cluster 105 + </li> 106 + </ul> 107 + <h4>Data science</h4> 108 + <ul> 109 + <li> 110 + <strong>{timeSpent.python}+</strong> hours of <Tech name="python" /> 111 + </li> 112 + <li> 113 + Detection &amp; classification webapp to help entomoly research 114 + using <strong><a href="/neural networks">neural networks</a></strong 115 + > 116 + <Reference parens url="github.com/cigaleapp/cigale" /> 117 + </li> 118 + </ul> 119 + <h4>Miscelleanous</h4> 120 + <ul> 121 + <li> 122 + CLI programs in Python, <Tech name="Ruby" /> or <Tech name="Go" /> 123 + <Reference parens url="gwen.works/terminal" /> 124 + </li> 125 + <li> 126 + Homework and class notes taken in <Tech name="LaTeX" /> &amp; <Tech 127 + name="Typst" 128 + /> 129 + </li> 130 + </ul> 131 + </div> 132 + <div class="social"> 133 + <h3>Social</h3> 134 + <ul> 135 + <li> 136 + Active member of multiple <strong>student associations</strong> 137 + </li> 138 + <li> 139 + <strong>Organized &amp; taught</strong> web programming <strong 140 + >classes</strong 141 + > 142 + </li> 143 + <li> 144 + <strong>Performed</strong> electronic music <strong>live</strong> 145 + </li> 146 + <li> 147 + Was a <strong>point of contact</strong> between users and developers 148 + for a large student web platform 149 + </li> 150 + </ul> 151 + </div> 152 + <div class="media"> 153 + <h3>Design</h3> 154 + <h4>User interfaces</h4> 155 + <ul> 156 + <li> 157 + Designed in 158 + <Tech name="Figma" /> or <Tech name="Penpot" /> 159 + prior to implementation 160 + </li> 161 + </ul> 162 + <h4>Media</h4> 163 + <ul> 164 + <li> 165 + Posters for associations using Adobe <Tech name="Photoshop" />, <Tech 166 + name="InDesign" 167 + /> and <Tech name="Illustrator" /> 168 + </li> 169 + <li> 170 + Short films with Adobe <Tech name="Premiere Pro" /> and <Tech 171 + name="After Effects" 172 + /> 173 + </li> 174 + <li> 175 + Electronic music production w/ <Tech name="FL Studio" /> 176 + <Reference parens url="gwen.works/music" /> 177 + </li> 178 + </ul> 179 + </div> 180 + <div class="transdisciplinary"> 181 + <h3>Transdisciplinary</h3> 182 + <ul> 183 + <li> 184 + 2D Video engine made for music video creation with <abbr 185 + title="Digial Audio Workstation, such as FL Studio for example" 186 + >DAW</abbr 187 + > integrations & <Tech name="WASM" /> support using Rust <Reference 188 + parens 189 + url="gwen.works/shapemaker" 190 + /> 191 + </li> 192 + </ul> 193 + </div> 194 + </section> 195 + <section class="education"> 196 + <h2>Education</h2> 197 + <dl class="timeline"> 198 + <dt>now</dt> 199 + { 200 + education 201 + .sort((a, b) => a.time - b.time) 202 + .reverse() 203 + .map(({ time, title, school, location, diploma }) => ( 204 + <dd> 205 + <h3> 206 + <span class="main"> 207 + {school.name} 208 + </span> 209 + <span class="secondary"> 210 + @ {location} 211 + </span> 212 + </h3> 213 + <p> 214 + {title} 215 + <br> 216 + {'results' in diploma ? "" : diploma.name} 217 + </p> 218 + </dd> 219 + <dt> 220 + {time} 221 + </dt> 222 + )) 223 + } 224 + </dl> 225 + </section> 226 + <section> 227 + <h2>Experience</h2> 228 + </section> 229 + </main> 230 + </Bare> 231 + 232 + <style> 233 + @media print { 234 + :root { 235 + font-size: 0.7rem; 236 + } 237 + } 238 + 239 + section.skills { 240 + columns: 2; 241 + } 242 + 243 + @media screen and (max-width: 800px) { 244 + section.skills { 245 + columns: 1; 246 + } 247 + } 248 + 249 + section.skills > div { 250 + break-inside: avoid; 251 + } 252 + 253 + section.education dd { 254 + margin-top: 3ch; 255 + } 256 + 257 + section.education dt { 258 + text-align: center; 259 + width: 100%; 260 + color: var(--gold); 261 + background-color: var(--void); 262 + height: 1lh; 263 + line-height: 1.2; 264 + padding: 1ch 0; 265 + z-index: 1; 266 + } 267 + 268 + section.education dl { 269 + position: relative; 270 + } 271 + 272 + section.education dl::before { 273 + content: ""; 274 + position: absolute; 275 + top: 0; 276 + bottom: 0; 277 + width: 0.5ch; 278 + left: 2ch; 279 + background: var(--gold); 280 + z-index: 1; 281 + } 282 + 283 + section.education h3 .main { 284 + font-weight: bold; 285 + color: var(--quartz); 286 + } 287 + 288 + section.education h3 .secondary { 289 + font-weight: normal; 290 + color: var(--jade); 291 + } 292 + 293 + 294 + :root { 295 + --diamond: #39c6df; 296 + --jade: #73daca; 297 + --gold: #e4ab6a; 298 + --gray: #7982a9; 299 + --quartz: #f5f5f5; 300 + --void: #16161e; 301 + --ruby: #f7768e; 302 + --lapis: #60a2f7; 303 + } 304 + 305 + dl { 306 + display: grid; 307 + grid-template-columns: max-content 2fr; 308 + gap: 0.5ch 2ch; 309 + } 310 + 311 + dd, 312 + dt { 313 + margin: 0; 314 + } 315 + 316 + h1 { 317 + color: var(--jade); 318 + font-size: 2.5em; 319 + margin: 0; 320 + margin-bottom: 0.25ch; 321 + line-height: 1; 322 + } 323 + 324 + h2 { 325 + color: var(--jade); 326 + font-size: 2em; 327 + margin: 0; 328 + } 329 + 330 + h3 { 331 + font-size: 1em; 332 + margin: 0; 333 + } 334 + 335 + section.skills h3 { 336 + color: var(--lapis); 337 + font-family: "Victor Mono", monospace; 338 + } 339 + section.skills h3::after { 340 + content: "-------------------------------------"; 341 + display: block; 342 + } 343 + 344 + h4 { 345 + font-size: 1em; 346 + margin: 0; 347 + font-family: "Victor Mono", monospace; 348 + color: var(--jade); 349 + } 350 + 351 + .intro { 352 + font-family: "Victor Mono", monospace; 353 + font-style: italic; 354 + color: var(--jade); 355 + } 356 + 357 + main { 358 + line-height: 1.4; 359 + } 360 + 361 + h3, 362 + li, 363 + dt, 364 + dd { 365 + font-family: "Victor Mono", monospace; 366 + } 367 + 368 + p { 369 + margin: 0; 370 + } 371 + 372 + ul { 373 + padding-left: 0; 374 + margin: 0; 375 + margin-bottom: 2ch; 376 + } 377 + 378 + li { 379 + list-style: none; 380 + } 381 + 382 + li::before { 383 + content: "— "; 384 + color: var(--ruby); 385 + } 386 + 387 + :global(a, a:visited) { 388 + color: var(--diamond); 389 + text-decoration-color: currentColor; 390 + } 391 + 392 + :global(a:hover, a:focus-visible) { 393 + color: var(--jade); 394 + text-decoration-color: currentColor; 395 + text-decoration-thickness: 2px; 396 + } 397 + 398 + :global(strong, strong a) { 399 + font-weight: normal; 400 + color: var(--gold); 401 + } 402 + 403 + :global(strong a:is(:hover, :focus-visible)) { 404 + color: var(--ruby); 405 + } 406 + 407 + </style>
+1 -1
src/pages/tags/[tag].astro
··· 3 3 import { getCollection, getEntry } from "astro:content"; 4 4 import StrongHeader from "../../components/StrongHeader.astro"; 5 5 import WorksGrid from "../../components/WorksGrid.astro"; 6 - import Layout from "../../layouts/Layout.astro"; 6 + import Layout from "../../layouts/Regular.astro"; 7 7 8 8 export const getStaticPaths = (async () => { 9 9 const tags = await getCollection("tags");
+1 -1
src/pages/to/[site].astro
··· 2 2 import type { GetStaticPaths } from "astro"; 3 3 import { getCollection, getEntry } from "astro:content"; 4 4 import StrongHeader from "../../components/StrongHeader.astro"; 5 - import Layout from "../../layouts/Layout.astro"; 5 + import Layout from "../../layouts/Regular.astro"; 6 6 7 7 export const getStaticPaths = (async () => 8 8 getCollection("sites").then((sites) =>
+1 -1
src/pages/using/[tech].astro
··· 2 2 import type { GetStaticPaths } from "astro"; 3 3 import { getCollection, getEntry } from "astro:content"; 4 4 import StrongHeader from "../../components/StrongHeader.astro"; 5 - import Layout from "../../layouts/Layout.astro"; 5 + import Layout from "../../layouts/Regular.astro"; 6 6 import WorksGrid from "../../components/WorksGrid.astro"; 7 7 export const getStaticPaths = (async () => { 8 8 return await getCollection("technologies").then((techs) =>
+1 -1
src/pages/works/[work].astro
··· 4 4 import * as YAML from "yaml"; 5 5 import StrongHeader from "../../components/StrongHeader.astro"; 6 6 import TagReference from "../../components/TagReference.astro"; 7 - import Layout from "../../layouts/Layout.astro"; 7 + import Layout from "../../layouts/Regular.astro"; 8 8 import BlockLink from "./BlockLink.astro"; 9 9 import BlockMedia from "./BlockMedia.astro"; 10 10 import BlockParagraph from "./BlockParagraph.astro";
+7 -1
tags.yaml
··· 1 - # yaml-language-server: $schema=https://ortfo.org/tags.schema.json 2 1 3 2 # todo: deprecate 4 3 - singular: school ··· 162 161 # Expriments on mathematics and art, mostly visual interpretations of concepts that could lead to new insights on said concept. 163 162 # combines: math and experiments and (graphism or video or music or sound) 164 163 # 164 + 165 + - singular: neural network 166 + plural: neural networks 167 + aliases: [nn, neural-networks, machine learning, ml] 168 + description: | 169 + A type of machine learning model that is inspired by the structure and function of the human brain, used for tasks such as image recognition, natural language processing, and more. 170 + learn more at: https://en.wikipedia.org/wiki/Neural_network