Compare commits

..

No commits in common. "main" and "update/v5" have entirely different histories.

47 changed files with 153 additions and 841 deletions

View file

@ -30,10 +30,7 @@
"type": "string" "type": "string"
}, },
"reference": { "reference": {
"type": "array", "type": "string"
"items": {
"type": "string"
}
}, },
"$schema": { "$schema": {
"type": "string" "type": "string"

View file

@ -1,16 +1,14 @@
export default new Map([ export default new Map([
["src/content/fragments/fr/buttons.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Ffragments%2Ffr%2Fbuttons.mdx&astroContentModuleFlag=true")], ["src/content/articles/en/after-effects-expressions.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Fen%2Fafter-effects-expressions.mdx&astroContentModuleFlag=true")],
["src/content/fragments/en/image-full.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Ffragments%2Fen%2Fimage-full.mdx&astroContentModuleFlag=true")],
["src/content/articles/en/video-compression.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Fen%2Fvideo-compression.mdx&astroContentModuleFlag=true")],
["src/content/fragments/en/super-cookies.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Ffragments%2Fen%2Fsuper-cookies.mdx&astroContentModuleFlag=true")],
["src/content/articles/en/the-day-I-jamd.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Fen%2Fthe-day-I-jamd.mdx&astroContentModuleFlag=true")],
["src/content/articles/en/sci-hub-blocage.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Fen%2Fsci-hub-blocage.mdx&astroContentModuleFlag=true")],
["src/content/articles/fr/sci-hub-blocage.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Ffr%2Fsci-hub-blocage.mdx&astroContentModuleFlag=true")],
["src/content/fragments/fr/image-full.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Ffragments%2Ffr%2Fimage-full.mdx&astroContentModuleFlag=true")], ["src/content/fragments/fr/image-full.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Ffragments%2Ffr%2Fimage-full.mdx&astroContentModuleFlag=true")],
["src/content/fragments/fr/super-cookies.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Ffragments%2Ffr%2Fsuper-cookies.mdx&astroContentModuleFlag=true")], ["src/content/fragments/fr/super-cookies.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Ffragments%2Ffr%2Fsuper-cookies.mdx&astroContentModuleFlag=true")],
["src/content/articles/en/sci-hub-blocage.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Fen%2Fsci-hub-blocage.mdx&astroContentModuleFlag=true")], ["src/content/fragments/fr/buttons.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Ffragments%2Ffr%2Fbuttons.mdx&astroContentModuleFlag=true")],
["src/content/articles/en/after-effects-expressions.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Fen%2Fafter-effects-expressions.mdx&astroContentModuleFlag=true")],
["src/content/articles/en/the-day-I-jamd.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Fen%2Fthe-day-I-jamd.mdx&astroContentModuleFlag=true")],
["src/content/articles/en/video-compression.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Fen%2Fvideo-compression.mdx&astroContentModuleFlag=true")],
["src/content/fragments/en/image-full.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Ffragments%2Fen%2Fimage-full.mdx&astroContentModuleFlag=true")],
["src/content/fragments/en/super-cookies.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Ffragments%2Fen%2Fsuper-cookies.mdx&astroContentModuleFlag=true")],
["src/content/articles/fr/2025.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Ffr%2F2025.mdx&astroContentModuleFlag=true")],
["src/content/articles/fr/configuration-serveur.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Ffr%2Fconfiguration-serveur.mdx&astroContentModuleFlag=true")],
["src/content/articles/fr/sci-hub-blocage.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Ffr%2Fsci-hub-blocage.mdx&astroContentModuleFlag=true")],
["src/content/articles/fr/the-day-I-jamd.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Ffr%2Fthe-day-I-jamd.mdx&astroContentModuleFlag=true")]]); ["src/content/articles/fr/the-day-I-jamd.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Farticles%2Ffr%2Fthe-day-I-jamd.mdx&astroContentModuleFlag=true")]]);

49
.astro/content.d.ts vendored
View file

@ -42,21 +42,6 @@ declare module 'astro:content' {
ContentEntryMap[C] ContentEntryMap[C]
>['slug']; >['slug'];
export type ReferenceDataEntry<
C extends CollectionKey,
E extends keyof DataEntryMap[C] = string,
> = {
collection: C;
id: E;
};
export type ReferenceContentEntry<
C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}) = string,
> = {
collection: C;
slug: E;
};
/** @deprecated Use `getEntry` instead. */ /** @deprecated Use `getEntry` instead. */
export function getEntryBySlug< export function getEntryBySlug<
C extends keyof ContentEntryMap, C extends keyof ContentEntryMap,
@ -87,17 +72,19 @@ declare module 'astro:content' {
export function getEntry< export function getEntry<
C extends keyof ContentEntryMap, C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}), E extends ValidContentEntrySlug<C> | (string & {}),
>( >(entry: {
entry: ReferenceContentEntry<C, E>, collection: C;
): E extends ValidContentEntrySlug<C> slug: E;
}): E extends ValidContentEntrySlug<C>
? Promise<CollectionEntry<C>> ? Promise<CollectionEntry<C>>
: Promise<CollectionEntry<C> | undefined>; : Promise<CollectionEntry<C> | undefined>;
export function getEntry< export function getEntry<
C extends keyof DataEntryMap, C extends keyof DataEntryMap,
E extends keyof DataEntryMap[C] | (string & {}), E extends keyof DataEntryMap[C] | (string & {}),
>( >(entry: {
entry: ReferenceDataEntry<C, E>, collection: C;
): E extends keyof DataEntryMap[C] id: E;
}): E extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]> ? Promise<DataEntryMap[C][E]>
: Promise<CollectionEntry<C> | undefined>; : Promise<CollectionEntry<C> | undefined>;
export function getEntry< export function getEntry<
@ -123,10 +110,16 @@ declare module 'astro:content' {
/** Resolve an array of entry references from the same collection */ /** Resolve an array of entry references from the same collection */
export function getEntries<C extends keyof ContentEntryMap>( export function getEntries<C extends keyof ContentEntryMap>(
entries: ReferenceContentEntry<C, ValidContentEntrySlug<C>>[], entries: {
collection: C;
slug: ValidContentEntrySlug<C>;
}[],
): Promise<CollectionEntry<C>[]>; ): Promise<CollectionEntry<C>[]>;
export function getEntries<C extends keyof DataEntryMap>( export function getEntries<C extends keyof DataEntryMap>(
entries: ReferenceDataEntry<C, keyof DataEntryMap[C]>[], entries: {
collection: C;
id: keyof DataEntryMap[C];
}[],
): Promise<CollectionEntry<C>[]>; ): Promise<CollectionEntry<C>[]>;
export function render<C extends keyof AnyEntryMap>( export function render<C extends keyof AnyEntryMap>(
@ -138,8 +131,14 @@ declare module 'astro:content' {
): import('astro/zod').ZodEffects< ): import('astro/zod').ZodEffects<
import('astro/zod').ZodString, import('astro/zod').ZodString,
C extends keyof ContentEntryMap C extends keyof ContentEntryMap
? ReferenceContentEntry<C, ValidContentEntrySlug<C>> ? {
: ReferenceDataEntry<C, keyof DataEntryMap[C]> collection: C;
slug: ValidContentEntrySlug<C>;
}
: {
collection: C;
id: keyof DataEntryMap[C];
}
>; >;
// Allow generic `string` to avoid excessive type errors in the config // Allow generic `string` to avoid excessive type errors in the config
// if `dev` is not running to update as you edit. // if `dev` is not running to update as you edit.

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,5 @@
{ {
"_variables": { "_variables": {
"lastUpdateCheck": 1750326901251 "lastUpdateCheck": 1735403503212
} }
} }

View file

@ -4,8 +4,5 @@
"editor.insertSpaces": false, "editor.insertSpaces": false,
"editor.detectIndentation": false, "editor.detectIndentation": false,
"editor.tabSize": 2, "editor.tabSize": 2,
"astro.content-intellisense": true, "astro.content-intellisense": true
"[vue]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
}
} }

View file

@ -2,7 +2,6 @@ import { defineConfig } from 'astro/config'
import mdx from '@astrojs/mdx' import mdx from '@astrojs/mdx'
import sitemap from '@astrojs/sitemap' import sitemap from '@astrojs/sitemap'
import rehypeExternalLinks from 'rehype-external-links'
import { pluginLineNumbers } from '@expressive-code/plugin-line-numbers' import { pluginLineNumbers } from '@expressive-code/plugin-line-numbers'
import expressiveCode from 'astro-expressive-code' import expressiveCode from 'astro-expressive-code'
@ -16,9 +15,6 @@ export default defineConfig({
domains: ['assets.nardu.in'], domains: ['assets.nardu.in'],
remotePatterns: [{ protocol: 'https' }] remotePatterns: [{ protocol: 'https' }]
}, },
markdown: {
rehypePlugins: [[rehypeExternalLinks, { rel: ['noopener noreferer'] }]]
},
integrations: [ integrations: [
expressiveCode({ expressiveCode({
theme: 'one-dark-pro', theme: 'one-dark-pro',

BIN
bun.lockb

Binary file not shown.

View file

@ -10,20 +10,20 @@
"astro": "astro" "astro": "astro"
}, },
"dependencies": { "dependencies": {
"@astrojs/mdx": "4.3.0", "@astrojs/mdx": "4.0.3",
"@astrojs/rss": "4.0.12", "@astrojs/rss": "4.0.10",
"@astrojs/sitemap": "^3.4.1", "@astrojs/sitemap": "3.2.1",
"@astrojs/ts-plugin": "^1.10.4", "@astrojs/ts-plugin": "^1.10.4",
"@expressive-code/plugin-line-numbers": "^0.41.2", "@expressive-code/plugin-line-numbers": "^0.38.3",
"astro": "5.9.4", "astro": "5.1.1",
"astro-expressive-code": "^0.41.2", "astro-expressive-code": "^0.38.3",
"rehype-external-links": "^3.0.0", "sharp": "^0.33.5"
"sharp": "^0.34.2"
}, },
"devDependencies": { "devDependencies": {
"autoprefixer": "^10.4.21", "@shikijs/transformers": "^1.24.4",
"postcss": "^8.5.6", "autoprefixer": "^10.4.20",
"prettier": "^3.5.3", "postcss": "^8.4.49",
"prettier": "^3.4.2",
"prettier-plugin-astro": "^0.14.1", "prettier-plugin-astro": "^0.14.1",
"prettier-plugin-organize-imports": "^4.1.0" "prettier-plugin-organize-imports": "^4.1.0"
} }

View file

@ -1,49 +1,2 @@
User-agent: AI2Bot
User-agent: Ai2Bot-Dolma
User-agent: Amazonbot
User-agent: anthropic-ai
User-agent: Applebot
User-agent: Applebot-Extended
User-agent: Bytespider
User-agent: CCBot
User-agent: ChatGPT-User
User-agent: Claude-Web
User-agent: ClaudeBot
User-agent: cohere-ai
User-agent: cohere-training-data-crawler
User-agent: Crawlspace
User-agent: Diffbot
User-agent: DuckAssistBot
User-agent: FacebookBot
User-agent: FriendlyCrawler
User-agent: Google-Extended
User-agent: GoogleOther
User-agent: GoogleOther-Image
User-agent: GoogleOther-Video
User-agent: GPTBot
User-agent: iaskspider/2.0
User-agent: ICC-Crawler
User-agent: ImagesiftBot
User-agent: img2dataset
User-agent: ISSCyberRiskCrawler
User-agent: Kangaroo Bot
User-agent: Meta-ExternalAgent
User-agent: Meta-ExternalFetcher
User-agent: OAI-SearchBot
User-agent: omgili
User-agent: omgilibot
User-agent: PanguBot
User-agent: PerplexityBot
User-agent: PetalBot
User-agent: Scrapy
User-agent: SemrushBot-OCOB
User-agent: SemrushBot-SWA
User-agent: Sidetrade indexer bot
User-agent: Timpibot
User-agent: VelenPublicWebCrawler
User-agent: Webzio-Extended
User-agent: YouBot
Disallow: /
User-agent: * User-agent: *
Disallow: Allow: /
Sitemap: https://www.nardu.in/sitemap-index.xml

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

View file

@ -1,28 +0,0 @@
---
interface Props {
border?: boolean
}
const { border = false } = Astro.props
---
<span class:list={[{ outline: border }]}>
Garanti sans «&nbsp;<abbr title='intelligence artificielle'>IA</abbr>&nbsp;»
</span>
<style>
span {
padding: var(--space-3xs) var(--space-2xs);
display: inline-block;
font-size: var(--size--1);
border-radius: var(--radius);
color: var(--color-light-white);
background-color: var(--color-dark);
}
span.outline {
color: var(--color-dark);
border: 1px solid var(--color-dark);
background-color: var(--color-light-white);
}
</style>

View file

@ -87,8 +87,6 @@ const isReference = routeName === 'references'
&::after { &::after {
transform: translateX(0); transform: translateX(0);
opacity: 1; opacity: 1;
transition-duration: 0.6s;
transition-timing-function: var(--timing-bounce);
} }
h3 a { h3 a {
@ -102,12 +100,12 @@ const isReference = routeName === 'references'
transition: box-shadow 0.2s ease; transition: box-shadow 0.2s ease;
} }
&::before { &::before {
transition: transform 0.4s var(--timing-out-expo); transition: transform 0.2s ease-in-out;
} }
&::after { &::after {
transition-property: opacity, transform; transition:
transition-duration: 0.3s; opacity ease 0.2s,
transition-timing-function: ease-in-out; transform ease 0.2s;
} }
h3 a { h3 a {
transition: color ease 0.2s; transition: color ease 0.2s;

View file

@ -1,11 +1,8 @@
--- ---
import { Picture } from 'astro:assets'
import SocialRel from '../components/SocialRel.astro' import SocialRel from '../components/SocialRel.astro'
import fight from '../assets/images/fight-fascism.webp'
import AIFree from './AIFree.astro'
--- ---
<footer class='footer wrapper flow' role='contentinfo'> <footer class='footer wrapper' role='contentinfo'>
<section class='info'> <section class='info'>
<div> <div>
<p class='h4'>Nicolas Arduin</p> <p class='h4'>Nicolas Arduin</p>
@ -18,16 +15,6 @@ import AIFree from './AIFree.astro'
</ul> </ul>
<SocialRel /> <SocialRel />
</section> </section>
<section class='supports'>
<a
rel='noopener noreferer'
href='https://fightfascism.glitch.me/'
class='img-link'
>
<Picture src={fight} formats={['avif', 'webp']} alt='Fight fascism' />
</a>
<AIFree />
</section>
</footer> </footer>
<style> <style>
@ -46,12 +33,10 @@ import AIFree from './AIFree.astro'
color: var(--color-blue); color: var(--color-blue);
} }
.info, .info {
.supports {
display: flex; display: flex;
flex-flow: row wrap; flex-flow: row wrap;
justify-content: space-between; justify-content: space-between;
align-items: center;
gap: var(--space-s); gap: var(--space-s);
text-align: left; text-align: left;
} }

View file

@ -58,11 +58,11 @@ const { item } = Astro.props
} }
@media (prefers-reduced-motion: no-preference) { @media (prefers-reduced-motion: no-preference) {
.card { .card {
transition: all var(--timing-bounce) 0.4s; transition: all ease 0.2s;
} }
.card:hover { .card:hover {
transform: translateY(-10px); transform: translateY(-10px);
box-shadow: 0 4px 0 0 var(--accent-color); box-shadow: var(--shadow-elevation-high);
} }
.card:focus-within { .card:focus-within {
transform: translateY(-10px); transform: translateY(-10px);

View file

@ -62,7 +62,7 @@ const HPsectionSchema = z.object({
order: z.number(), order: z.number(),
quickTitle: z.string().optional(), quickTitle: z.string().optional(),
quickImage: z.string().optional(), quickImage: z.string().optional(),
reference: z.array(z.string()).optional() reference: z.string().optional()
}) })
const VeilleSchema = z.object({ const VeilleSchema = z.object({

View file

@ -22,7 +22,7 @@ So the last time I had to do a complex animation, **I took the damn time!**
Everyone uses expressions whether they know it or not. Most of the time it's a rather transparent process for the animator. For example: when parenting a property to another one, After Effects creates an expression for us. Everyone uses expressions whether they know it or not. Most of the time it's a rather transparent process for the animator. For example: when parenting a property to another one, After Effects creates an expression for us.
<AstroImage <AstroImage
src='https://assets.nardu.in/basic_expression.jpg' src='https://assets.nardu.in/basic_expression_d81b12f1ac.jpeg'
width='728' width='728'
height='80' height='80'
alt='Parenting the position of the form to a null creates an expression.' alt='Parenting the position of the form to a null creates an expression.'
@ -33,7 +33,7 @@ Over the last updates, Adobe has made an effort to make expressions more accessi
Those custom functions can be called through a menu once you enabled the expressions on a property. It offers organized shortcut and proper syntax to all of AE native functions and a bunch of JavaScript standard ones. Those custom functions can be called through a menu once you enabled the expressions on a property. It offers organized shortcut and proper syntax to all of AE native functions and a bunch of JavaScript standard ones.
<AstroImage <AstroImage
src='https://assets.nardu.in/shortcut.jpg' src='https://assets.nardu.in/shortcut_39cc19d383.jpeg'
width='728' width='728'
height='322' height='322'
alt='Alt + Click the stopwatch to access the shortcuts.' alt='Alt + Click the stopwatch to access the shortcuts.'

View file

@ -8,7 +8,7 @@ excerpt: 'In March 2019, the Paris Regional Court ruled in favour of the publish
tags: ['Internet', 'Science'] tags: ['Internet', 'Science']
type: articles type: articles
createdAt: '2019-03-31T07:47:36.000Z' createdAt: '2019-03-31T07:47:36.000Z'
updatedAt: '2025-06-19T12:08:00.000Z' updatedAt: '2022-12-27T12:08:00.000Z'
--- ---
import AstroImage from '../../../components/AstroImage.astro' import AstroImage from '../../../components/AstroImage.astro'
@ -102,24 +102,23 @@ There are many DNS servers available. The best known are Google, Cloudflare and
My favorite since it is a [french association](https://www.fdn.fr/) My favorite since it is a [french association](https://www.fdn.fr/)
#### Update June 2025 1. IPV4
- 80.67.169.12
- 80.67.169.40
2. IPV6
- 2001:910:800::12
- 2001:910:800::40
FDN disabled its open DNS service since last March. They provide [a tutorial to use their secure DNS (<abbr lang="en" title="DNS over TLS">DOT</abbr> and <abbr lang="en" title="DNS over HTTPS">DOH</abbr>) here.](https://git.fdn.fr/fdn-public/wiki/-/blob/master/support/faq/config_dns.md) ### [Quad9](https://www.quad9.net)
### [Mullvad](https://mullvad.net/en/help/dns-over-https-and-dns-over-tls) Quand9 is a non-profit foundation offering free public DNS servers. Their classic servers offer filtering of identified malicious domains. They do not collect data and are <abbr title="General Data Protection Regulation">GDPR</abbr>-compliant.
Mullvad offers open DNS resolvers but only in <abbr lang="en" title="DNS over TLS">DOT</abbr> and <abbr lang="en" title="DNS over HTTPS">DOH</abbr>.
### I just want a DNS now!
[DNSForge.de](https://dnsforge.de/)
1. IPV4 1. IPV4
- 176.9.93.198 - 9.9.9.9
- 176.9.1.117 - 149.112.112.112
2. IPV6 2. IPV6
- 2a01:4f8:151:34aa::198 - 2620:fe::fe
- 2a01:4f8:141:316d::117 - 2620:fe::9
## That's it. ## That's it.

View file

@ -31,7 +31,7 @@ Boy did they exceed my expectations! With almost no optimization on the static s
### wordpress ### wordpress
<AstroImage <AstroImage
src='https://assets.nardu.in/wordpress.jpg' src='https://assets.nardu.in/wordpress_8ee6f54b98.jpeg'
width='728' width='728'
height='412' height='412'
alt='Performance score of 53/100 on Wordpress.' alt='Performance score of 53/100 on Wordpress.'
@ -42,7 +42,7 @@ Despite a lot of efforts I could not do better. Im no expert in caching, do n
### 11ty + strapi ### 11ty + strapi
<AstroImage <AstroImage
src='https://assets.nardu.in/static.jpg' src='https://assets.nardu.in/static_2c0d9f1eb8.jpeg'
width='728' width='728'
height='412' height='412'
alt='Performance score of 97/100 on jamstack.' alt='Performance score of 97/100 on jamstack.'

View file

@ -1,181 +0,0 @@
---
title: 'Mise à jour 2025'
subtitle: 'Tout refaire ?'
lang: fr
slug: '2025'
excerpt: Presque tout changer ou du moins repenser beaucoup de choses.
tags: ['Freelance', 'Réflexion']
type: articles
createdAt: '2025-06-19T12:20:00.000Z'
draft: true
---
<table role='table'>
<caption>
Polices par défaut des navigateurs selon les systèmes d'exploitation.
</caption>
<thead>
<tr role='row'>
<th id='system' scope='col' role='columnheader'>
Système
</th>
<th id='firefox' scope='col' role='columnheader'>
Firefox
</th>
<th id='chromium' scope='col' role='columnheader'>
Chromium
</th>
<th id='safari' scope='col' role='columnheader'>
Safari
</th>
</tr>
</thead>
<tbody>
<tr>
<th id='linux' scope='row'>
Fedora/Ubuntu Gnome, Fedora KDE, Linux Mint Cinnamon, Debian Xfce
</th>
<td headers='firefox linux'>
<p>
<code>serif</code>
Noto Serif
</p>
<p>
<code>sans-serif</code>
Noto Sans
</p>
</td>
<td>
<p>
<code>serif</code>
Liberation Serif
</p>
<p>
<code>sans-serif</code>
Liberation Sans
</p>
</td>
<td>Non applicable</td>
</tr>
<tr>
<th id='android' scope='row'>
Android open source project
</th>
<td>
<p>
<code>serif</code>
Noto Serif
</p>
<p>
<code>sans-serif</code>
Roboto
</p>
</td>
<td>
<p>
<code>serif</code>
Noto Serif
</p>
<p>
<code>sans-serif</code>
Roboto
</p>
</td>
<td>Non applicable</td>
</tr>
<tr>
<th id='macos' scope='row'>
MacOs Sonoma
</th>
<td>
<p>
<code>serif</code>
Times
</p>
<p>
<code>sans-serif</code>
Helvetica
</p>
</td>
<td>
<p>
<code>serif</code>
Times
</p>
<p>
<code>sans-serif</code>
Helvetica
</p>
</td>
<td>
<p>
<code>serif</code>
Times
</p>
<p>
<code>sans-serif</code>
Helvetica
</p>
</td>
</tr>
<tr>
<th id='windows' scope='row'>
Windows 11
</th>
<td>
<p>
<code>serif</code>
Times New Roman
</p>
<code>sans-serif</code>
Arial
</td>
<td>
<p>
<code>serif</code>
Times New Roman
</p>
<p>
<code>sans-serif</code>
Arial
</p>
</td>
<td>Non applicable</td>
</tr>
<tr>
<th id='ios' scope='row'>
iOs 17 (?)
</th>
<td>
<p>
<code>serif</code>
???
</p>
<p>
<code>sans-serif</code>
???
</p>
</td>
<td>
<p>
<code>serif</code>
Times New Roman
</p>
<p>
<code>sans-serif</code>
Helvetica
</p>
</td>
<td>
<p>
<code>serif</code>
???
</p>
<p>
<code>sans-serif</code>
???
</p>
</td>
</tr>
</tbody>
</table>

View file

@ -1,15 +1,13 @@
--- ---
title: After Effects Expressions title: After Effects Expressions
subtitle: Article non traduit subtitle: En cours de traduction, revenez bientôt ;)
lang: fr lang: fr
draft: true draft: true
slug: 'after-effects-expressions' slug: 'after-effects-expressions'
excerpt: Article non traduit excerpt: En cours de traduction, revenez bientôt ;)
tags: ['Design'] tags: ['Design']
type: articles type: articles
createdAt: '2019-04-24T09:00:00.000Z' createdAt: '2019-04-24T09:00:00.000Z'
--- ---
[Lire la version anglaise](/articles/en-after-effects-expressions)
[Retour aux articles](/articles) [Retour aux articles](/articles)

View file

@ -1,277 +0,0 @@
---
title: 'Paramétrer un serveur pour héberger des trucs'
subtitle: 'Guide personnel.'
lang: fr
slug: 'configuration-serveur'
excerpt: Envie de mettre un site en ligne&nbsp;? D'héberger vos propres outils plutôt que de payer des abonnements&nbsp;? Bah lezgongue
tags: ['Dev', 'Backend']
type: articles
createdAt: '2025-01-28T22:20:00.000Z'
---
import { Picture } from 'astro:assets'
import coolifySettings from '@assets/images/articles/configuration-serveur/coolify-admin-settings.jpg'
import coolifyNewRessource from '@assets/images/articles/configuration-serveur/coolify-new-ressource.jpg'
import coolifyConfRessource from '@assets/images/articles/configuration-serveur/coolify-conf-ressource.jpg'
## Mon mémo perso.
Cet article est l'extension d'un fichier «&nbsp;pense-bête&nbsp;» que j'utilise depuis toujours quand je crée un nouveau serveur. Généralement un <abbr lang="en" title="Virtual Private Server">VPS</abbr>, généralement sous debian ou fedora.
Si vous voulez tester des trucs, voici [un lien de parrainage](https://hetzner.cloud/?ref=Jl7yPFuoBGDM) chez l'hébergeur allemand [Hetzner](https://hetzner.cloud) pour récupérer 20€ de crédit (et 10€ pour moi si vous y restez). [Conditions de l'offre.](https://www.hetzner.com/legal/referrals)
> Notez bien que je ne suis ni administrateur système ni expert en sécurité.
## Conf serveur
### Actions immédiates
Se connecter en root via ssh puis…
#### Paramétrer les locales
Parfois il manque la configuration des [locales](https://www.tecmint.com/set-system-locales-in-linux/) et ça cause des erreurs.
```bash {"Debian":4} {"Fedora":6}
# affiche la conf actuelle
locale
+
nano /etc/default/locale
+
nano /etc/locale.conf
# compléter ces lignes si besoin
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_ALL=en_US.UTF-8
```
#### Mettre à jour le système
```bash {"Debian":1} {"Fedora":4}
+
apt update
apt dist-upgrade
+
dnf check-update
dnf upgrade
```
#### Nouvel utilisateur
- Ajouter et renseigner un nouvel utilisateur.
- Ajouter l'utilisateur aux "sudoers".
- Ajouter sa clé ssh locale à l'utilisateur distant.
```bash {"Debian":3} {"Fedora":5} {"En local":8} {"Sur le serveur":13}
adduser USERNAME
+
usermod -aG sudo USERNAME
+
usermod -aG wheel USERNAME
+
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "mail@domain.tld"
# afficher puis copier la clé publique
cat ~/.ssh/id_ed25519.pub
+
su USERNAME
mkdir ~/.ssh
# coller la clé publique dans ce fichier
nano authorized_keys
```
#### bash alias
Ajoute un alias `ll` pour un `ls` plus explicite.
```bash title="~/.bashrc"
alias ll='ls -lah'
```
### SSH
configure [sshd_config](https://infosec.mozilla.org/guidelines/openssh)
```ssh-config title="/etc/ssh/sshd_config"
# Changer le port est recommandé mais pas obligatoire
Port 10485
# Désactive la connexion par mot de passe
AuthenticationMethods publickey
# Désactive la connexion via root
PermitRootLogin No
# modifier/adapter ces options si besoin
LoginGraceTime 120
StrictModes yes
PubkeyAuthentication yes
AuthorizedKeysFile /home/%u/.ssh/authorized_keys
PermitEmptyPasswords no
ChallengeResponseAuthentication no
X11Forwarding no
UseDNS no
MaxStartups 10:30:60
PermitTunnel no
```
Tester maintenant dans un autre terminal si la connexion ssh avec le nouvel utilisateur fonctionne.
Si oui&nbsp;: **redémarrer&nbsp;!**
### Pare-feu
- Installer
- Paramétrer
- Activer
#### Debian
[ufw](https://www.codeflow.site/fr/article/how-to-set-up-a-firewall-with-ufw-on-debian-10)
```bash
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh # ou ufw allow PORT
ufw allow http # ufw allow 80
ufw allow https # ufw allow 443
ufw enable
```
#### Fedora
[Firewalld](https://docs.fedoraproject.org/en-US/quick-docs/firewalld/#_viewing_the_current_status_of_firewalld)
```bash
dnf install firewalld
systemctl unmask firewalld
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-service=http
firewall-cmd --zone=public --add-service=https
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
```
### Crowdsec
[Crowdsec](https://doc.crowdsec.net/docs/getting_started/install_crowdsec/) est un système de sécurité qui détecte et bloque les connexions malveillantes.
- Installer crowdsec.
- Installer un "<span lang="en">bouncer</span>".
- Activer des [scenarios](https://doc.crowdsec.net/docs/next/cscli/cscli_scenarios_install) (facultatif).
```bash {"Debian":3} {"Fedora":6}
curl -s https://install.crowdsec.net | sudo sh
+
apt install crowdsec
apt install crowdsec-firewall-bouncer-iptables
+
dnf install crowdsec
dnf install crowdsec-firewall-bouncer-nftables
```
## Conf web
### Serveur web
J'utilisais généralement [OpenLiteSpeed](https://openlitespeed.org/) pour avoir une interface graphique, mais j'ai changé pour [Coolify](https://coolify.io) depuis quelques années.
#### Coolify
[Documentation.](https://coolify.io/docs/installation)
```bash
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bash
```
> Crowdsec et Coolify utilisent tous les deux le port 8080 par défaut. Il faut le changer pour un des deux (plus facile à [faire pour Crowdsec.](https://support.crowdsec.net/hc/en-gb/articles/10831013001234--Security-Engine-How-to-change-the-default-port))
<details class="flow">
<summary>Procédure détaillée</summary>
Il faut éditer deux fichiers:
```yaml title="/etc/crowdsec/config.yaml" "8080"
api:
server:
listen_uri: 127.0.0.1:8080
```
```yaml title="/etc/crowdsec/local_api_credentials.yaml" "8080"
url: http://127.0.0.1:8080
```
Puis charger la nouvelle configuration&nbsp;:
```bash
service crowdsec reload
```
</details>
##### Configuration
Une fois installé (suivre les instructions du script), on peut paramétrer Coolify avec un nom de domaine, généralement un sous-domaine du style `coolify.domaine.tld`
<Picture
src={coolifySettings}
formats={['avif', 'webp']}
alt="Instance's domain field inside settings"
/>
##### Ajouter une ressource
Dans coolify, les «&nbsp;ressources&nbsp;» correspondent à un site ou service web&nbsp;:
- site statique
- webapp
- base de données
- image docker
- etc.
Afin d'héberger un site ou une webapp «&nbsp;maison&nbsp;», il faudra avant tout que le code soit disponible sur une forge git. Soit en public soit en ayant paramétré une clé de déploiement au préalable.
<Picture src={coolifyNewRessource} formats={['avif', 'webp']} alt='' />
##### Configurer la ressource
Coolify va essayer de déterminer des [options par défaut](https://github.com/coollabsio/coolify-examples/) selon le dépôt git. Il ne restera plus qu'à ajuster les paramètres de la ressource&nbsp;:
- url du projet
- commande d'installation des paquets
- commande de construction du projet
- commande de démarrage
- variables d'environnement
- <span lang='en'>webhooks</span>
- etc.
<Picture src={coolifyConfRessource} formats={['avif', 'webp']} alt='' />
#### OpenLiteSpeed
Plus vraiment utilisé pour de nouveaux projets et moins évident à prendre en main. Mais puissant malgré tout&nbsp;!
[Documentation.](https://docs.openlitespeed.org/installation/repo/)
```bash
wget -O - https://repo.litespeed.sh | sudo bash
apt-get install openlitespeed
```
Récupérer le mot de passe admin `cat /usr/local/lsws/adminpasswd`
### Outils
Selon les besoins du projet&nbsp;:
- git
- [nvm](https://github.com/nvm-sh/nvm#install--update-script)
- [yarn](https://classic.yarnpkg.com/en/docs/getting-started)/[pnpm](https://pnpm.io/installation)/[bun](https://bun.sh/)
- [acme.sh](https://github.com/acmesh-official/acme.sh) ([tuto complet](/fragments/acme-sh-tls-cert/))

View file

@ -7,14 +7,12 @@ excerpt: 'Le tribunal de grande instance de Paris a ordonné aux fournisseurs d
tags: ['Internet', 'Science'] tags: ['Internet', 'Science']
type: articles type: articles
createdAt: '2019-03-31T07:47:36.000Z' createdAt: '2019-03-31T07:47:36.000Z'
updatedAt: '2025-06-19T12:08:00.000Z' updatedAt: '2022-12-27T12:08:00.000Z'
--- ---
import AstroImage from '../../../components/AstroImage.astro' import AstroImage from '../../../components/AstroImage.astro'
<a href='/articles/en-sci-hub-unblock/' lang='en'> <a href='/articles/en-sci-hub-unblock/' lang='en'>This content exists in english.</a>
This content exists in english.
</a>
L'adresse actuelle de sci-hub est&nbsp;: <a href="https://www.sci-hub.st/" rel="noreferer noopener">sci-hub.st</a> L'adresse actuelle de sci-hub est&nbsp;: <a href="https://www.sci-hub.st/" rel="noreferer noopener">sci-hub.st</a>
@ -109,28 +107,23 @@ Plusieurs fournisseurs :
Mes favoris puisquil sagit dune [association française.](https://www.fdn.fr/) Mes favoris puisquil sagit dune [association française.](https://www.fdn.fr/)
#### Mise à jour Juin 2025 1. IPV4
- 80.67.169.12
- 80.67.169.40
2. IPV6
- 2001:910:800::12
- 2001:910:800::40
FDN a désactivé ses DNS ouverts depuis Mars dernier. Ils mettent à disposition [un tutoriel pour utiliser leurs DNS sécurisés (<abbr lang="en" title="DNS over TLS">DOT</abbr> et <abbr lang="en" title="DNS over HTTPS">DOH</abbr>) ici.](https://git.fdn.fr/fdn-public/wiki/-/blob/master/support/faq/config_dns.md) ### [Quad9](https://www.quad9.net/fr)
### [Mullvad](https://mullvad.net/en/help/dns-over-https-and-dns-over-tls) Quand9 est une fondation à but non lucratif proposant des serveurs DNS publics et gratuits. Leurs serveur classiques offrent un filtrage de domaines malveillants identifiés. Ils ne collectent pas de données et sont conforment au <abbr title="Règlement général sur la protection des données">RGPD</abbr>.
Mullvad propose des serveurs DNS ouverts mais uniquement en <abbr lang="en" title="DNS over TLS">DOT</abbr> et <abbr lang="en" title="DNS over HTTPS">DOH</abbr>.
### [Résolveurs DNS Alternatifs](https://sebsauvage.net/wiki/doku.php?id=dns-alternatifs)
Liste de DNS et leurs caractéristiques publiée par [sebsauvage.net](https://sebsauvage.net)
### Je veux un DNS maintenant&nbsp;!
[DNSForge.de](https://dnsforge.de/)
1. IPV4 1. IPV4
- 176.9.93.198 - 9.9.9.9
- 176.9.1.117 - 149.112.112.112
2. IPV6 2. IPV6
- 2a01:4f8:151:34aa::198 - 2620:fe::fe
- 2a01:4f8:141:316d::117 - 2620:fe::9
## C'est tout. ## C'est tout.

View file

@ -10,9 +10,7 @@ createdAt: '2020-10-08T07:47:36.000Z'
updatedAt: '2022-12-27T15:40:06.000Z' updatedAt: '2022-12-27T15:40:06.000Z'
--- ---
<a href='/articles/en-the-day-I-jamd/' lang='en'> <a href='/articles/en-the-day-I-jamd/' lang='en'>This content exists in english.</a>
This content exists in english.
</a>
import AstroImage from '../../../components/AstroImage.astro' import AstroImage from '../../../components/AstroImage.astro'
@ -35,7 +33,7 @@ Jen suis resté pantois&nbsp;! Quasiment sans optimisation du côté statique
### wordpress ### wordpress
<AstroImage <AstroImage
src='https://assets.nardu.in/wordpress.jpg' src='https://assets.nardu.in/wordpress_8ee6f54b98.jpeg'
width='728' width='728'
height='412' height='412'
alt='Score de performance de 53/100 sur Wordpress.' alt='Score de performance de 53/100 sur Wordpress.'
@ -46,7 +44,7 @@ Malgré beaucoup defforts, je nai pas pu faire mieux. Je ne suis pas un ex
### 11ty + strapi ### 11ty + strapi
<AstroImage <AstroImage
src='https://assets.nardu.in/static.jpg' src='https://assets.nardu.in/static_2c0d9f1eb8.jpeg'
width='728' width='728'
height='412' height='412'
alt='Score de performance de 97/100 en Jamstack.' alt='Score de performance de 97/100 en Jamstack.'

View file

@ -17,7 +17,7 @@ import AstroImage from '../../../components/AstroImage.astro'
On est parfois obligé d'utiliser des images dans des balises `img` plutôt que dans un `background` en css. Comment faire alors pour que l'image sorte de son conteneur pour en faire une bannière&nbsp;? Exemple pratique à partir de ce même site. On est parfois obligé d'utiliser des images dans des balises `img` plutôt que dans un `background` en css. Comment faire alors pour que l'image sorte de son conteneur pour en faire une bannière&nbsp;? Exemple pratique à partir de ce même site.
<AstroImage <AstroImage
src='https://assets.nardu.in/image_bleed_container.jpg' src='https://assets.nardu.in/image_bleed_container_9e3939b3ae.jpeg'
width='320' width='320'
height='568' height='568'
/> />
@ -51,7 +51,7 @@ img {
``` ```
<AstroImage <AstroImage
src='https://assets.nardu.in/image_bleed_original.jpg' src='https://assets.nardu.in/image_bleed_original_d49f0d11bf.jpeg'
width='320' width='320'
height='568' height='568'
/> />
@ -70,7 +70,7 @@ Afin de faire prendre à l'image toute la largeur, on agit sur son conteneur&nbs
``` ```
<AstroImage <AstroImage
src='https://assets.nardu.in/image_bleed_full.jpg' src='https://assets.nardu.in/image_bleed_full_2a902f9539.jpeg'
width='320' width='320'
height='568' height='568'
/> />
@ -92,7 +92,7 @@ On peut alors réduire la hauteur du conteneur pour obtenir une bannière plutô
``` ```
<AstroImage <AstroImage
src='https://assets.nardu.in/image_bleed_height.jpg' src='https://assets.nardu.in/image_bleed_height_81b4ce969a.jpeg'
width='320' width='320'
height='568' height='568'
/> />
@ -107,7 +107,7 @@ Il faut ensuite forcer l'image à prendre toute la largeur du conteneur&nbsp;:
``` ```
<AstroImage <AstroImage
src='https://assets.nardu.in/image_bleed_deformed.jpg' src='https://assets.nardu.in/image_bleed_deformed_479046d2cb.jpeg'
width='320' width='320'
height='568' height='568'
/> />
@ -128,7 +128,7 @@ Pas top…
``` ```
<AstroImage <AstroImage
src='https://assets.nardu.in/image_bleed.jpg' src='https://assets.nardu.in/image_bleed_6c164e82b3.jpeg'
width='320' width='320'
height='568' height='568'
/> />

View file

@ -6,7 +6,7 @@ image: /assets/images/home/offre-1.1.svg
order: 1.1 order: 1.1
quickTitle: Mes offres en freelance quickTitle: Mes offres en freelance
quickImage: /assets/images/home/icon-desktop.svg quickImage: /assets/images/home/icon-desktop.svg
reference: ['parole-expression', 'natureo'] reference: parole-expression
--- ---
## L'offre site web classique ## L'offre site web classique
@ -14,3 +14,5 @@ reference: ['parole-expression', 'natureo']
Cette offre est destinée à un public souhaitant **se doter d'un site web**, sans forcément intégrer l'accessibilité au cœur du projet. Le site sera malgré tout développé au plus proche des règles du [référentiel général d'amélioration de l'accessibilité](https://accessibilite.numerique.gouv.fr/) (<abbr>RGAA</abbr>). Cette offre est destinée à un public souhaitant **se doter d'un site web**, sans forcément intégrer l'accessibilité au cœur du projet. Le site sera malgré tout développé au plus proche des règles du [référentiel général d'amélioration de l'accessibilité](https://accessibilite.numerique.gouv.fr/) (<abbr>RGAA</abbr>).
L'objectif principal de cette offre étant d'**établir une présence en ligne** pour le client. Que cette dernière ait un but informatif et/ou éditorial. L'objectif principal de cette offre étant d'**établir une présence en ligne** pour le client. Que cette dernière ait un but informatif et/ou éditorial.
<!-- <a href="/offres/web-classique" class="btn">L'offre classique en détails</a> -->

View file

@ -3,7 +3,7 @@ type: section
lang: fr lang: fr
order: 1.2 order: 1.2
image: /assets/images/home/offre-1.2.svg image: /assets/images/home/offre-1.2.svg
reference: ['rose-primaire'] reference: rose-primaire
--- ---
## L'offre accessibilité avancée ## L'offre accessibilité avancée
@ -14,3 +14,5 @@ Lorsque le projet le nécessite, je fais appel à des partenaires talentueux par
- [Rose Primaire](https://roseprimaire.com/) pour le conseil et l'accompagnement du projet&nbsp;; - [Rose Primaire](https://roseprimaire.com/) pour le conseil et l'accompagnement du projet&nbsp;;
- [Sylvain Plantier](https://jedessinebien.com/) et/ou [Benoît Etchevery](http://ben-etche.com/) pour l'illustration et la direction artistique. - [Sylvain Plantier](https://jedessinebien.com/) et/ou [Benoît Etchevery](http://ben-etche.com/) pour l'illustration et la direction artistique.
<!-- <a href="/offres/accessibilite" class="btn">L'offre accessibilité en détails</a> -->

View file

Before

Width:  |  Height:  |  Size: 582 B

After

Width:  |  Height:  |  Size: 582 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 528 B

After

Width:  |  Height:  |  Size: 528 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 331 B

After

Width:  |  Height:  |  Size: 331 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 671 B

After

Width:  |  Height:  |  Size: 671 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 429 B

After

Width:  |  Height:  |  Size: 429 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 464 B

After

Width:  |  Height:  |  Size: 464 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 953 B

After

Width:  |  Height:  |  Size: 953 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 821 B

After

Width:  |  Height:  |  Size: 821 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

Before After
Before After

View file

@ -4,7 +4,6 @@ import { getCollection, render } from 'astro:content'
import BaseLayout from '../layouts/BaseLayout.astro' import BaseLayout from '../layouts/BaseLayout.astro'
import QuickAccessCard from '../components/QuickAccessCard.astro' import QuickAccessCard from '../components/QuickAccessCard.astro'
import ListCards from '../components/ListCards.astro' import ListCards from '../components/ListCards.astro'
import AIFree from '@components/AIFree.astro'
const pageTitle = 'Accueil' const pageTitle = 'Accueil'
@ -43,14 +42,11 @@ const allReferences = await getCollection('references')
--- ---
<BaseLayout pageTitle={pageTitle}> <BaseLayout pageTitle={pageTitle}>
<section class='region intro flow'> <section class='region intro'>
<h1> <h1>
Des sites web <span class='highlight'>accessibles</span> Création de <span class='highlight'>sites&nbsp;web</span>
<a href='/articles/faq' class='clean-link'>sinon rien&nbsp;!</a> <a href='/articles/faq' class='clean-link'>sobres et accessibles</a>
</h1> </h1>
<div class='ai-badge'>
<AIFree />
</div>
<section class='quick-access'> <section class='quick-access'>
<h2 class='intro__subtitle'>Apprenez-en plus sur…</h2> <h2 class='intro__subtitle'>Apprenez-en plus sur…</h2>
<ul class='quick-access__list' role='list'> <ul class='quick-access__list' role='list'>
@ -78,7 +74,7 @@ const allReferences = await getCollection('references')
<div class='section__reference'> <div class='section__reference'>
<ListCards <ListCards
list={allReferences.filter((ref) => { list={allReferences.filter((ref) => {
return data.reference?.includes(ref.data.slug) return ref.data.slug === data.reference
})} })}
routeName='references' routeName='references'
/> />
@ -142,9 +138,6 @@ const allReferences = await getCollection('references')
.intro h1 :global(a:hover) { .intro h1 :global(a:hover) {
text-decoration: none; text-decoration: none;
} }
.intro .ai-badge {
text-align: center;
}
.intro__subtitle { .intro__subtitle {
margin: var(--space-s-m) 0; margin: var(--space-s-m) 0;
font-weight: 500; font-weight: 500;
@ -182,7 +175,7 @@ const allReferences = await getCollection('references')
.section :global(h2) { .section :global(h2) {
font-size: var(--size-3); font-size: var(--size-3);
color: var(--accent-color); color: var(--color-blue);
} }
.section :global(h3) { .section :global(h3) {
font-size: var(--size-1); font-size: var(--size-1);
@ -212,15 +205,19 @@ const allReferences = await getCollection('references')
.section__content { .section__content {
order: 2; order: 2;
flex-basis: 0; flex-basis: 0;
min-inline-size: 50ch; min-inline-size: 32ch;
font-size: var(--size-1);
} }
.section__content :global(h2) { .section__content :global(h2) {
font-size: var(--size-4); font-size: var(--size-5);
line-height: 1.2; line-height: 1.2;
} }
.section__reference { .section__reference {
margin-block-start: var(--space-2xl); margin-block-start: 50vh;
padding-block-end: var(--space-3xl); padding-block-end: var(--space-3xl);
} }
.section__reference :global(.card a) {
font-size: var(--size-0);
}
} }
</style> </style>

View file

@ -11,17 +11,13 @@
color: var(--color-brique); color: var(--color-brique);
} }
@view-transition {
navigation: auto;
}
body { body {
font-family: var(--font-primary); font-family: var(--font-primary);
font-size: var(--size-0); font-size: var(--size-0);
line-height: 1.4; line-height: 1.4;
color: var(--primary-color); color: var(--color-dark);
background-color: var(--primary-background); background-color: var(--color-light-white);
accent-color: var(--accent-color); accent-color: var(--color-brique);
} }
main { main {
@ -33,7 +29,7 @@ main {
:where(h1) { :where(h1) {
max-inline-size: 20ch; max-inline-size: 20ch;
font-size: var(--size-6); font-size: var(--size-6);
color: var(--title-color); color: var(--color-dark-blue);
} }
h2, h2,
@ -51,18 +47,18 @@ h3,
h4, h4,
.h4 { .h4 {
font-size: var(--size-1); font-size: var(--size-1);
color: var(--primary-color); color: var(--color-dark);
} }
h5, h5,
.h5 { .h5 {
font-size: var(--size-0); font-size: var(--size-1);
color: var(--primary-color); color: var(--color-darkBlue);
} }
a { a {
font-weight: 500; font-weight: 500;
color: var(--accent-color); color: var(--color-blue);
text-decoration: underline; text-decoration: underline;
} }
/* a:visited { /* a:visited {
@ -76,7 +72,7 @@ a:focus {
hr { hr {
margin-block: var(--space-m-l); margin-block: var(--space-m-l);
block-size: 4px; block-size: 4px;
background-color: var(--primary-color); background-color: var(--color-dark);
} }
hr.small { hr.small {
margin-block: var(--space-xs); margin-block: var(--space-xs);
@ -117,17 +113,17 @@ ol:not([role='list']) > li + li {
font-size: var(--size-0); font-size: var(--size-0);
font-weight: bold; font-weight: bold;
text-decoration: none; text-decoration: none;
border: 2px solid var(--accent-color); border: 2px solid var(--color-blue);
border-radius: var(--radius-small); border-radius: var(--radius-small);
color: var(--color-white); color: var(--color-white);
background-color: var(--accent-color); background-color: var(--color-blue);
transition-property: color, background-color; transition-property: color, background-color;
transition-duration: 0.3s; transition-duration: 0.3s;
transition-timing-function: ease; transition-timing-function: ease;
} }
.btn:hover, .btn:hover,
.btn:focus { .btn:focus {
color: var(--accent-color); color: var(--color-blue);
background-color: var(--color-white); background-color: var(--color-white);
} }
@ -139,7 +135,7 @@ button[disabled] {
} }
.highlight { .highlight {
color: var(--accent-color); color: var(--color-blue);
} }
/* clean style link */ /* clean style link */
@ -185,24 +181,13 @@ button[disabled] {
} }
} }
.img-link {
box-shadow: 2px 2px 0 0 var(--accent-color);
transition-property: box-shadow;
transition-duration: 0.4s;
transition-timing-function: var(--timing-bounce);
&:hover {
box-shadow: 12px 12px 0 0;
}
}
/* blockquote */ /* blockquote */
blockquote { blockquote {
margin: var(--space-s) 0; margin: var(--space-s) 0;
padding: var(--space-s); padding: var(--space-s);
font-weight: normal; font-weight: normal;
line-height: 1.4; line-height: 1.4;
border-left: 3px solid var(--accent-color); border-left: 3px solid var(--color-blue);
border-radius: 3px; border-radius: 3px;
background-color: var(--color-soft-blue); background-color: var(--color-soft-blue);
} }
@ -224,53 +209,3 @@ code {
font-family: var(--font-code); font-family: var(--font-code);
background-color: var(--color-light-grey); background-color: var(--color-light-grey);
} }
/* Tables */
table {
border-collapse: collapse;
}
table caption {
font-size: var(--size-1);
font-weight: bold;
}
caption,
th {
text-align: left;
padding: var(--space-xs);
}
th {
background-color: var(--color-light-blue);
}
th[scope='row'],
td {
font-size: var(--size--1);
border-inline-end: solid 1px var(--color-dark);
}
th,
td {
padding: var(--space-xs);
}
tr {
border-block: solid 1px var(--color-dark);
}
tr:nth-of-type(2n) {
background-color: var(--color-light-grey);
}
td::before {
display: none;
}
@media screen and (max-width: 56.25rem) {
th {
display: none;
}
td {
display: block;
}
td::before {
content: attr(data-cell) ': ';
display: inline;
font-weight: bold;
}
}

View file

@ -47,7 +47,7 @@ html {
/* Smooth scrolling for users that don't prefer reduced motion */ /* Smooth scrolling for users that don't prefer reduced motion */
@media (prefers-reduced-motion: no-preference) { @media (prefers-reduced-motion: no-preference) {
html { html:focus-within {
scroll-behavior: smooth; scroll-behavior: smooth;
} }
} }
@ -70,9 +70,7 @@ body {
max-inline-size: 100%; max-inline-size: 100%;
} }
:where(summary) { :where(details) {
padding: var(--space-3xs);
background-color: var(--color-light-grey);
cursor: pointer; cursor: pointer;
} }

View file

@ -51,16 +51,12 @@
--space-l-3xl: clamp(2.25rem, calc(-0.08rem + 11.67vw), 7.5rem); --space-l-3xl: clamp(2.25rem, calc(-0.08rem + 11.67vw), 7.5rem);
/* fonts */ /* fonts */
--font-primary: sans-serif; --font-primary: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
--font-code: monospace; --font-code: monospace;
--font-tnum: 'tnum' on; --font-tnum: 'tnum' on;
/* colors */ /* colors */
/* Enable when ready
color-scheme: light dark;
*/
--color-dark: hsl(239, 57%, 15%); --color-dark: hsl(239, 57%, 15%);
--color-grey: hsl(211, 12%, 35%); --color-grey: hsl(211, 12%, 35%);
--color-light-grey: hsl(0, 0%, 94%); --color-light-grey: hsl(0, 0%, 94%);
@ -75,21 +71,14 @@
--color-light-white: hsl(240, 50%, 98%); --color-light-white: hsl(240, 50%, 98%);
--color-black: hsl(0, 0%, 0%); --color-black: hsl(0, 0%, 0%);
--primary-color: light-dark(var(--color-dark), var(--color-light-grey));
--primary-background: light-dark(var(--color-light-white), var(--color-dark));
--accent-color: light-dark(var(--color-blue), var(--color-brique));
--title-color: light-dark(var(--color-dark-blue), var(--color-light-blue));
/* shadows */ /* shadows */
--shadow-color: 0deg 0% 80%; --shadow-color: 0deg 0% 80%;
--shadow-elevation-medium: --shadow-elevation-medium: 0px 0.7px 0.7px hsl(var(--shadow-color) / 0.28),
0px 0.7px 0.7px hsl(var(--shadow-color) / 0.28),
0px 1.5px 1.6px -0.7px hsl(var(--shadow-color) / 0.26), 0px 1.5px 1.6px -0.7px hsl(var(--shadow-color) / 0.26),
0px 2.9px 3px -1.5px hsl(var(--shadow-color) / 0.24), 0px 2.9px 3px -1.5px hsl(var(--shadow-color) / 0.24),
0px 6px 6.3px -2.2px hsl(var(--shadow-color) / 0.22), 0px 6px 6.3px -2.2px hsl(var(--shadow-color) / 0.22),
0px 11.8px 12.4px -3px hsl(var(--shadow-color) / 0.2); 0px 11.8px 12.4px -3px hsl(var(--shadow-color) / 0.2);
--shadow-elevation-high: --shadow-elevation-high: 0px 0.5px 0.5px hsl(var(--shadow-color) / 0.18),
0px 0.5px 0.5px hsl(var(--shadow-color) / 0.18),
0px 1.4px 1.5px -0.3px hsl(var(--shadow-color) / 0.18), 0px 1.4px 1.5px -0.3px hsl(var(--shadow-color) / 0.18),
0px 2.3px 2.4px -0.7px hsl(var(--shadow-color) / 0.17), 0px 2.3px 2.4px -0.7px hsl(var(--shadow-color) / 0.17),
0px 3.4px 3.6px -1px hsl(var(--shadow-color) / 0.16), 0px 3.4px 3.6px -1px hsl(var(--shadow-color) / 0.16),
@ -103,35 +92,4 @@
/* radius */ /* radius */
--radius: 20px; --radius: 20px;
--radius-small: 10px; --radius-small: 10px;
/* easing */
--timing-in-out-expo: cubic-bezier(0.9, 0, 0.1, 1);
--timing-out-expo: cubic-bezier(0, 0.55, 0.246, 1);
--timing-bounce: linear(
0,
0.01 1%,
0.039 2%,
0.088 3.1%,
0.154 4.2%,
0.309 6.3%,
0.791 12.1%,
1.011 15.4%,
1.091 17%,
1.152 18.6%,
1.198 20.3%,
1.223 22%,
1.232 24.2%,
1.214 26.7%,
1.175 29.3%,
1.058 35.4%,
1.007 38.5%,
0.969 41.9%,
0.949 45.4%,
0.95 50.5%,
0.998 62.1%,
1.011 68.6%,
1
);
} }

View file

@ -22,10 +22,6 @@
grid-column: wrapper; grid-column: wrapper;
} }
.wrapper:has(article.editorial) {
--content-width: 70rem;
}
/* set full width content to full grid */ /* set full width content to full grid */
.wrapper.full-width { .wrapper.full-width {
/* calculate inline padding based on available space minus content space to align full-width content with wrapper content */ /* calculate inline padding based on available space minus content space to align full-width content with wrapper content */

View file

@ -1,19 +1,18 @@
{ {
"extends": "astro/tsconfigs/base", "extends": "astro/tsconfigs/base",
"include": [".astro/types.d.ts", "**/*"], "include": [".astro/types.d.ts", "**/*"],
"exclude": ["dist"], "exclude": ["dist"],
"compilerOptions": { "compilerOptions": {
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@components/*": ["src/components/*"], "@components/*": ["src/components/*"],
"@layouts/*": ["src/layouts/*"], "@layouts/*": ["src/layouts/*"]
"@assets/*": ["src/assets/*"] },
}, "strictNullChecks": true,
"strictNullChecks": true, "plugins": [
"plugins": [ {
{ "name": "@astrojs/ts-plugin"
"name": "@astrojs/ts-plugin" }
} ]
] }
}
} }