Compare commits

..

3 Commits

Author SHA1 Message Date
Nico 898a289426 updated article i18n logic 2023-05-19 02:15:13 +02:00
Nico ad29621be0 updated i18n to 1.7.1
added extractRouteLangCode
2023-05-18 19:46:56 +02:00
Nico aa89b603dc updated astro to 2.4.4 for bug reproduction 2023-05-17 17:56:56 +02:00
77 changed files with 1637 additions and 2040 deletions

142
.astro/types.d.ts vendored
View File

@ -20,14 +20,26 @@ declare module 'astro:content' {
declare module 'astro:content' { declare module 'astro:content' {
export { z } from 'astro/zod'; export { z } from 'astro/zod';
export type CollectionEntry<C extends keyof AnyEntryMap> = AnyEntryMap[C][keyof AnyEntryMap[C]];
type Flatten<T> = T extends { [K: string]: infer U } ? U : never; // TODO: Remove this when having this fallback is no longer relevant. 2.3? 3.0? - erika, 2023-04-04
/**
export type CollectionKey = keyof AnyEntryMap; * @deprecated
export type CollectionEntry<C extends CollectionKey> = Flatten<AnyEntryMap[C]>; * `astro:content` no longer provide `image()`.
*
export type ContentCollectionKey = keyof ContentEntryMap; * Please use it through `schema`, like such:
export type DataCollectionKey = keyof DataEntryMap; * ```ts
* import { defineCollection, z } from "astro:content";
*
* defineCollection({
* schema: ({ image }) =>
* z.object({
* image: image(),
* }),
* });
* ```
*/
export const image: never;
// This needs to be in sync with ImageMetadata // This needs to be in sync with ImageMetadata
export type ImageFunction = () => import('astro/zod').ZodObject<{ export type ImageFunction = () => import('astro/zod').ZodObject<{
@ -42,17 +54,19 @@ declare module 'astro:content' {
import('astro/zod').ZodLiteral<'tiff'>, import('astro/zod').ZodLiteral<'tiff'>,
import('astro/zod').ZodLiteral<'webp'>, import('astro/zod').ZodLiteral<'webp'>,
import('astro/zod').ZodLiteral<'gif'>, import('astro/zod').ZodLiteral<'gif'>,
import('astro/zod').ZodLiteral<'svg'>, import('astro/zod').ZodLiteral<'svg'>
import('astro/zod').ZodLiteral<'avif'>,
] ]
>; >;
}>; }>;
type BaseSchemaWithoutEffects = type BaseSchemaWithoutEffects =
| import('astro/zod').AnyZodObject | import('astro/zod').AnyZodObject
| import('astro/zod').ZodUnion<[BaseSchemaWithoutEffects, ...BaseSchemaWithoutEffects[]]> | import('astro/zod').ZodUnion<import('astro/zod').AnyZodObject[]>
| import('astro/zod').ZodDiscriminatedUnion<string, import('astro/zod').AnyZodObject[]> | import('astro/zod').ZodDiscriminatedUnion<string, import('astro/zod').AnyZodObject[]>
| import('astro/zod').ZodIntersection<BaseSchemaWithoutEffects, BaseSchemaWithoutEffects>; | import('astro/zod').ZodIntersection<
import('astro/zod').AnyZodObject,
import('astro/zod').AnyZodObject
>;
type BaseSchema = type BaseSchema =
| BaseSchemaWithoutEffects | BaseSchemaWithoutEffects
@ -83,7 +97,7 @@ declare module 'astro:content' {
export function getEntryBySlug< export function getEntryBySlug<
C extends keyof ContentEntryMap, C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}), E extends ValidContentEntrySlug<C> | (string & {})
>( >(
collection: C, collection: C,
// Note that this has to accept a regular string too, for SSR // Note that this has to accept a regular string too, for SSR
@ -108,7 +122,7 @@ 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: {
collection: C; collection: C;
slug: E; slug: E;
@ -117,7 +131,7 @@ declare module 'astro:content' {
: 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: {
collection: C; collection: C;
id: E; id: E;
@ -126,7 +140,7 @@ declare module 'astro:content' {
: Promise<CollectionEntry<C> | undefined>; : Promise<CollectionEntry<C> | undefined>;
export function getEntry< export function getEntry<
C extends keyof ContentEntryMap, C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}), E extends ValidContentEntrySlug<C> | (string & {})
>( >(
collection: C, collection: C,
slug: E slug: E
@ -135,7 +149,7 @@ declare module 'astro:content' {
: 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 & {})
>( >(
collection: C, collection: C,
id: E id: E
@ -187,112 +201,112 @@ declare module 'astro:content' {
"articles": { "articles": {
"en/2022.md": { "en/2022.md": {
id: "en/2022.md"; id: "en/2022.md";
slug: "en/2022"; slug: "2022";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/2023.md": { "en/2023.md": {
id: "en/2023.md"; id: "en/2023.md";
slug: "en/2023"; slug: "2023";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/after-effects-expressions.mdx": { "en/after-effects-expressions.mdx": {
id: "en/after-effects-expressions.mdx"; id: "en/after-effects-expressions.mdx";
slug: "en/after-effects-expressions"; slug: "after-effects-expressions";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".mdx"] }; } & { render(): Render[".mdx"] };
"en/faq.md": { "en/faq.md": {
id: "en/faq.md"; id: "en/faq.md";
slug: "en/faq"; slug: "faq";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/gratuiste.md": { "en/gratuiste.md": {
id: "en/gratuiste.md"; id: "en/gratuiste.md";
slug: "en/gratuiste"; slug: "gratuiste";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/sci-hub-blocage.mdx": { "en/sci-hub-blocage.mdx": {
id: "en/sci-hub-blocage.mdx"; id: "en/sci-hub-blocage.mdx";
slug: "en/sci-hub-blocage"; slug: "sci-hub-unblock";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".mdx"] }; } & { render(): Render[".mdx"] };
"en/the-day-I-jamd.mdx": { "en/the-day-I-jamd.mdx": {
id: "en/the-day-I-jamd.mdx"; id: "en/the-day-I-jamd.mdx";
slug: "en/the-day-i-jamd"; slug: "the-day-I-jamd";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".mdx"] }; } & { render(): Render[".mdx"] };
"en/video-compression.mdx": { "en/video-compression.mdx": {
id: "en/video-compression.mdx"; id: "en/video-compression.mdx";
slug: "en/video-compression"; slug: "video-compression";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".mdx"] }; } & { render(): Render[".mdx"] };
"fr/2022.md": { "fr/2022.md": {
id: "fr/2022.md"; id: "fr/2022.md";
slug: "fr/2022"; slug: "2022";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/2023.md": { "fr/2023.md": {
id: "fr/2023.md"; id: "fr/2023.md";
slug: "fr/2023"; slug: "2023";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/after-effects-expressions.md": { "fr/after-effects-expressions.md": {
id: "fr/after-effects-expressions.md"; id: "fr/after-effects-expressions.md";
slug: "fr/after-effects-expressions"; slug: "after-effects-expressions";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/faq.md": { "fr/faq.md": {
id: "fr/faq.md"; id: "fr/faq.md";
slug: "fr/faq"; slug: "faq";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/gratuiste.md": { "fr/gratuiste.md": {
id: "fr/gratuiste.md"; id: "fr/gratuiste.md";
slug: "fr/gratuiste"; slug: "gratuiste";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/sci-hub-blocage.mdx": { "fr/sci-hub-blocage.mdx": {
id: "fr/sci-hub-blocage.mdx"; id: "fr/sci-hub-blocage.mdx";
slug: "fr/sci-hub-blocage"; slug: "sci-hub-blocage";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".mdx"] }; } & { render(): Render[".mdx"] };
"fr/the-day-I-jamd.mdx": { "fr/the-day-I-jamd.mdx": {
id: "fr/the-day-I-jamd.mdx"; id: "fr/the-day-I-jamd.mdx";
slug: "fr/the-day-i-jamd"; slug: "the-day-I-jamd";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
} & { render(): Render[".mdx"] }; } & { render(): Render[".mdx"] };
"fr/video-compression.md": { "fr/video-compression.md": {
id: "fr/video-compression.md"; id: "fr/video-compression.md";
slug: "fr/video-compression"; slug: "video-compression";
body: string; body: string;
collection: "articles"; collection: "articles";
data: InferEntrySchema<"articles"> data: InferEntrySchema<"articles">
@ -301,112 +315,98 @@ declare module 'astro:content' {
"fragments": { "fragments": {
"en/acme-sh-tls-cert.md": { "en/acme-sh-tls-cert.md": {
id: "en/acme-sh-tls-cert.md"; id: "en/acme-sh-tls-cert.md";
slug: "en/acme-sh-tls-cert"; slug: "acme-sh-tls-cert";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/array-vs-array.md": { "en/array-vs-array.md": {
id: "en/array-vs-array.md"; id: "en/array-vs-array.md";
slug: "en/array-vs-array"; slug: "array-vs-array";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/buttons.md": { "en/buttons.md": {
id: "en/buttons.md"; id: "en/buttons.md";
slug: "en/buttons"; slug: "buttons";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/image-full.mdx": { "en/image-full.mdx": {
id: "en/image-full.mdx"; id: "en/image-full.mdx";
slug: "en/image-full"; slug: "image-full";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".mdx"] }; } & { render(): Render[".mdx"] };
"en/nuxt-graphql-static.md": { "en/nuxt-graphql-static.md": {
id: "en/nuxt-graphql-static.md"; id: "en/nuxt-graphql-static.md";
slug: "en/nuxt-graphql-static"; slug: "nuxt-graphql-static";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/super-cookies.mdx": { "en/super-cookies.md": {
id: "en/super-cookies.mdx"; id: "en/super-cookies.md";
slug: "en/super-cookies"; slug: "super-cookies";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".mdx"] }; } & { render(): Render[".md"] };
"en/toulouse-fun.md": { "en/toulouse-fun.md": {
id: "en/toulouse-fun.md"; id: "en/toulouse-fun.md";
slug: "en/toulouse-fun"; slug: "toulouse-fun";
body: string;
collection: "fragments";
data: InferEntrySchema<"fragments">
} & { render(): Render[".md"] };
"en/visited-links.md": {
id: "en/visited-links.md";
slug: "en/visited-links";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/acme-sh-tls-cert.md": { "fr/acme-sh-tls-cert.md": {
id: "fr/acme-sh-tls-cert.md"; id: "fr/acme-sh-tls-cert.md";
slug: "fr/acme-sh-tls-cert"; slug: "acme-sh-tls-cert";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/array-vs-array.md": { "fr/array-vs-array.md": {
id: "fr/array-vs-array.md"; id: "fr/array-vs-array.md";
slug: "fr/array-vs-array"; slug: "array-vs-array";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/buttons.mdx": { "fr/buttons.mdx": {
id: "fr/buttons.mdx"; id: "fr/buttons.mdx";
slug: "fr/buttons"; slug: "buttons";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".mdx"] }; } & { render(): Render[".mdx"] };
"fr/image-full.mdx": { "fr/image-full.mdx": {
id: "fr/image-full.mdx"; id: "fr/image-full.mdx";
slug: "fr/image-full"; slug: "image-full";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".mdx"] }; } & { render(): Render[".mdx"] };
"fr/nuxt-graphql-static.md": { "fr/nuxt-graphql-static.md": {
id: "fr/nuxt-graphql-static.md"; id: "fr/nuxt-graphql-static.md";
slug: "fr/nuxt-graphql-static"; slug: "nuxt-graphql-static";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/super-cookies.mdx": { "fr/super-cookies.mdx": {
id: "fr/super-cookies.mdx"; id: "fr/super-cookies.mdx";
slug: "fr/super-cookies"; slug: "super-cookies";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
} & { render(): Render[".mdx"] }; } & { render(): Render[".mdx"] };
"fr/toulouse-fun.md": { "fr/toulouse-fun.md": {
id: "fr/toulouse-fun.md"; id: "fr/toulouse-fun.md";
slug: "fr/toulouse-fun"; slug: "toulouse-fun";
body: string;
collection: "fragments";
data: InferEntrySchema<"fragments">
} & { render(): Render[".md"] };
"fr/visited-links.md": {
id: "fr/visited-links.md";
slug: "fr/visited-links";
body: string; body: string;
collection: "fragments"; collection: "fragments";
data: InferEntrySchema<"fragments"> data: InferEntrySchema<"fragments">
@ -415,56 +415,56 @@ declare module 'astro:content' {
"references": { "references": {
"en/3w.md": { "en/3w.md": {
id: "en/3w.md"; id: "en/3w.md";
slug: "en/3w"; slug: "3w";
body: string; body: string;
collection: "references"; collection: "references";
data: InferEntrySchema<"references"> data: InferEntrySchema<"references">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/natureo.md": { "en/natureo.md": {
id: "en/natureo.md"; id: "en/natureo.md";
slug: "en/natureo"; slug: "natureo";
body: string; body: string;
collection: "references"; collection: "references";
data: InferEntrySchema<"references"> data: InferEntrySchema<"references">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/parole-expression.md": { "en/parole-expression.md": {
id: "en/parole-expression.md"; id: "en/parole-expression.md";
slug: "en/parole-expression"; slug: "parole-expression";
body: string; body: string;
collection: "references"; collection: "references";
data: InferEntrySchema<"references"> data: InferEntrySchema<"references">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"en/rose-primaire.md": { "en/rose-primaire.md": {
id: "en/rose-primaire.md"; id: "en/rose-primaire.md";
slug: "en/rose-primaire"; slug: "rose-primaire";
body: string; body: string;
collection: "references"; collection: "references";
data: InferEntrySchema<"references"> data: InferEntrySchema<"references">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/3w.md": { "fr/3w.md": {
id: "fr/3w.md"; id: "fr/3w.md";
slug: "fr/3w"; slug: "3w";
body: string; body: string;
collection: "references"; collection: "references";
data: InferEntrySchema<"references"> data: InferEntrySchema<"references">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/natureo.md": { "fr/natureo.md": {
id: "fr/natureo.md"; id: "fr/natureo.md";
slug: "fr/natureo"; slug: "natureo";
body: string; body: string;
collection: "references"; collection: "references";
data: InferEntrySchema<"references"> data: InferEntrySchema<"references">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/parole-expression.md": { "fr/parole-expression.md": {
id: "fr/parole-expression.md"; id: "fr/parole-expression.md";
slug: "fr/parole-expression"; slug: "parole-expression";
body: string; body: string;
collection: "references"; collection: "references";
data: InferEntrySchema<"references"> data: InferEntrySchema<"references">
} & { render(): Render[".md"] }; } & { render(): Render[".md"] };
"fr/rose-primaire.md": { "fr/rose-primaire.md": {
id: "fr/rose-primaire.md"; id: "fr/rose-primaire.md";
slug: "fr/rose-primaire"; slug: "rose-primaire";
body: string; body: string;
collection: "references"; collection: "references";
data: InferEntrySchema<"references"> data: InferEntrySchema<"references">

View File

@ -4,21 +4,20 @@ import { defineConfig } from "astro/config";
import i18n from "astro-i18n"; import i18n from "astro-i18n";
// https://astro.build/config // https://astro.build/config
import image from "@astrojs/image";
import mdx from "@astrojs/mdx"; import mdx from "@astrojs/mdx";
import sitemap from "@astrojs/sitemap"; import sitemap from "@astrojs/sitemap";
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
site: "https://www.nardu.in", site: "https://www.nardu.in",
image: { compressHTML: true,
domains: ["assets.nardu.in"],
remotePatterns: [{ protocol: "https" }],
},
markdown: { markdown: {
syntaxHighlight: "prism", syntaxHighlight: "prism",
}, },
integrations: [ integrations: [
i18n(), i18n(),
image(),
mdx(), mdx(),
sitemap({ sitemap({
i18n: { i18n: {

View File

@ -13,12 +13,12 @@
"i18n:sync": "astro-i18n sync" "i18n:sync": "astro-i18n sync"
}, },
"dependencies": { "dependencies": {
"@astrojs/mdx": "^1.1.0", "@astrojs/image": "^0.16.9",
"@astrojs/rss": "^3.0.0", "@astrojs/mdx": "^0.19.2",
"@astrojs/sitemap": "^3.0.0", "@astrojs/rss": "^2.4.2",
"astro": "3.1.1", "@astrojs/sitemap": "^1.3.1",
"astro-i18n": "1.8.1", "astro": "^2.5.0",
"sharp": "^0.32.6" "astro-i18n": "^1.7.2"
}, },
"devDependencies": { "devDependencies": {
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",

File diff suppressed because it is too large Load Diff

View File

@ -1,20 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 400 479">
<path fill="none" d="M0 0h400v478.049H0z"/>
<clipPath id="a">
<path d="M0 0h400v478.049H0z"/>
</clipPath>
<g clip-path="url(#a)">
<path fill="#162e57" d="M29.269 268.293h29.268v209.756H29.269zm39.024 0h29.268v209.756H68.293z"/>
<path fill="#ff826c" d="M43.903 29.268h43.902v53.659H43.903zm0-29.268h58.537v29.268H43.903z"/>
<path fill="#d4ebf2" d="M0 82.927h43.903v185.366H0z"/>
<path fill="#d4ebf2" fill-rule="nonzero" d="M165.854 175.6v-24.39h-29.268v-29.27h-24.39V82.917h-24.39v185.376h24.39V175.6h24.39v29.278h48.78V175.6h-19.512Z"/>
<path fill="#ff826c" d="M43.903 82.927h43.902v185.366H43.903zM9.415 258.536h29.61v34.147H9.415z"/>
<path fill="#162e57" d="M360.976 478.039h-29.268V268.283h29.268zm-39.024 0h-29.269V268.283h29.269z"/>
<path fill="#ff826c" d="M346.342 82.917H302.44V9.747h43.902z"/>
<path fill="#ff826c" fill-rule="nonzero" d="M400 121.941h-9.756V82.917H278.05v39.024h-24.39v29.269h-29.268v24.39H204.88v29.278h48.78V175.6h24.39v92.693h112.195v-14.635h9.757V121.941Z"/>
<path fill="#ff826c" d="M400 292.673h-29.61v-39.024H400zm-200-73.171h-29.268v-29.268h29.269z"/>
<path fill="#d4ebf2" d="M321.952 199.56h-14.498V82.918h14.498z"/>
<path fill="#162e57" d="M346.342 48.77h-24.39V24.38h24.39z"/>
<path fill="#ff826c" fill-rule="nonzero" d="M214.635 190.234h-34.147v9.756H200v19.522h14.635v-29.278Z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,24 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 547 260">
<g transform="translate(-176.96 -424.18)">
<path fill="none" d="M176.96 424.18h546.08v260H176.96z"/>
<clipPath id="a">
<path d="M176.96 424.18h546.08v260H176.96z"/>
</clipPath>
<g clip-path="url(#a)">
<path fill="#ff826c" fill-rule="nonzero" d="M699 439.36h-15v15h-10v-15h-15v15h-10v-15h-15v35h10v15h45v-15h10v-35Z"/>
<path fill="#d4ebf2" fill-rule="nonzero" d="M674 539.36v-50h-15v20h-15v20h15v65h15v-30h20v-25h-20Z"/>
<path fill="#ff826c" fill-rule="nonzero" d="M404.42 579.36v25h15v80h85v-80h15v-25h-115Zm-211.5 0v25h15v80h85v-80h15v-25h-115Zm416.08 0v25h15v80h85v-80h15v-25H609Z"/>
<path fill="#d4ebf2" fill-rule="nonzero" d="M524.42 524.36h-35v-75h-60v90h15v40h45v-35h7.31v10h27.69v-30Z"/>
<path fill="#10113a" d="M470.11 464.36h9.31v10h-9.31zm-25.35 20h9.31v10h-9.31zm20.35 20h9.31v10h-9.31zm20 20h9.31v10h-9.31zm-25.35 15h9.31v10h-9.31z"/>
<path fill="#d4ebf2" d="M444.42 564.36h4.31v10h-4.31z"/>
<path fill="#10113a" d="M429.42 459.36h4.31v10h-4.31zm-171.5 15h10v105h-10z"/>
<path fill="#ff826c" fill-rule="nonzero" d="M292.92 434.36h-10v-10h-40v10h-10v30h10v10h40v-10h10v-30Z"/>
<path fill="#d4ebf2" d="M227.92 484.36h30v25h-30zm40 25h30v30h-30zm-15-70h20v20h-20z"/>
<path fill="#ff826c" d="M177.92 499.36h20v20h-20z"/>
<path fill="#d4ebf2" fill-rule="nonzero" d="M247.92 529.36v30h-10v10h-30v10h50v-50h-10Z"/>
<path fill="#d4ebf2" fill-rule="nonzero" d="M237.92 529.36h-10v10h-10v10h-10v10h30v-30Z"/>
<path fill="#d4ebf2" d="M207.92 529.36h10v10h-10zm-10-10h10v10h-10z"/>
<path fill="#d4ebf2" fill-rule="nonzero" d="M187.92 509.36h-5v10h15v-15h-10v5Z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 821 B

After

Width:  |  Height:  |  Size: 821 B

View File

@ -1,44 +1,15 @@
--- ---
import { Image, getImage } from "astro:assets"; import { Picture } from "@astrojs/image/components";
const { src, alt, width, height, ...attrs } = Astro.props; const { src, alt, width, height, ...attrs } = Astro.props;
// if h/w attributes are declared, use them. If not, use from the source file
const imgHeight = height ? height : src.height;
const imgWidth = width ? width : src.width;
// compute avif and webp format in order to use inside a <picture> element
const imgAvif = await getImage({
src: src,
format: "avif",
width: Number(imgWidth),
height: Number(imgHeight),
});
const imgWebp = await getImage({
src: src,
format: "webp",
width: Number(imgWidth),
height: Number(imgHeight),
});
--- ---
<picture> <Picture
<source src={src}
srcset={imgAvif.src} widths={[320, 640, 768]}
sizes={`(max-inline-size: ${imgWidth}px) 100vw, ${imgHeight}px`} aspectRatio={`${width}:${height}`}
type="image/avif" sizes={`(max-inline-size: ${width}px) 100vw, ${width}px`}
/> formats={["avif", "webp"]}
<source alt={alt ? alt : ""}
srcset={imgWebp.src} {...attrs}
sizes={`(max-inline-size: ${imgWidth}px) 100vw, ${imgHeight}px`} />
type="image/webp"
/>
<Image
src={src}
width={Number(imgWidth)}
height={Number(imgHeight)}
format="jpg"
alt={alt ? alt : ""}
{...attrs}
/>
</picture>

View File

@ -9,33 +9,35 @@ const isReference = routeName === t("references.slug");
--- ---
<div class:list={["card", { "card--link": !isReference }]}> <div class:list={["card", { "card--link": !isReference }]}>
<h3> <div>
<h3>
{
!isReference ? (
<a
class="clean-link card__link"
href={`${l(`/${routeName}`)}/${item.slug}`}
>
{item.data.title}
</a>
) : (
<span>{item.data.title}</span>
)
}
</h3>
<h4>{item.data.subtitle}</h4>
<ListTags list={item.data.tags} />
{ {
!isReference ? ( isReference && (
<a <a href={item.data.url} rel="noopener noreferer">
class="clean-link card__link" {t("references.cta")}
href={`${l(`/${routeName}`)}/${item.data.permalink}`} <span class="sr-only"> {item.data.title}</span>
>
{item.data.title}
</a> </a>
) : (
<span>{item.data.title}</span>
) )
} }
</h3> </div>
<h4>{item.data.subtitle}</h4>
<ListTags list={item.data.tags} />
{
isReference && (
<a href={item.data.url} rel="noopener noreferer">
{t("references.cta")}
<span class="sr-only"> {item.data.title}</span>
</a>
)
}
</div> </div>
<style define:vars={{ permalink: item.data.permalink }}> <style scoped>
.card { .card {
padding: var(--space-s-m) var(--space-xs-s); padding: var(--space-s-m) var(--space-xs-s);
position: relative; position: relative;
@ -123,9 +125,6 @@ const isReference = routeName === t("references.slug");
.card::after { .card::after {
transition: opacity ease 0.2s, transform ease 0.2s; transition: opacity ease 0.2s, transform ease 0.2s;
} }
.card--link {
view-transition-name: var(--permalink);
}
h3 a { h3 a {
transition: color ease 0.2s; transition: color ease 0.2s;
} }

View File

@ -1,17 +1,17 @@
--- ---
// import { renderContent } from "astro-i18n";
import MetaDate from "./MetaDate.astro"; import MetaDate from "./MetaDate.astro";
import TOC from "./TOC.astro"; import TOC from "./TOC.astro";
const { content } = Astro.props; const { content } = Astro.props;
const { Content, headings } = await content.render(); const { Content, headings } = await content.render();
// const { html, headings } = await renderContent(Astro, content);
const toc = headings.map((heading) => { const toc = headings.map((heading) => {
return heading; return heading;
}); });
import "../styles/vendor/one-dark-pro.css"; if (content.data.code) {
import "../styles/vendor/one-dark-pro.css";
}
--- ---
<div class="sidebar region"> <div class="sidebar region">
@ -20,17 +20,13 @@ import "../styles/vendor/one-dark-pro.css";
<h1>{content.data.title}</h1> <h1>{content.data.title}</h1>
<p class="h3">{content.data.subtitle}</p> <p class="h3">{content.data.subtitle}</p>
<MetaDate item={content.data} /> <MetaDate item={content.data} />
<!-- <div class="flow content" set:html={html}> --> <div class="flow content">
<Content /> <Content />
</div>
</article> </article>
</div> </div>
<style define:vars={{ permalink: content.data.permalink }}> <style>
@media (prefers-reduced-motion: no-preference) {
article {
view-transition-name: var(--permalink);
}
}
.sidebar { .sidebar {
--gutter: var(--space-xs-m); --gutter: var(--space-xs-m);
} }

View File

@ -1,17 +0,0 @@
---
import { t } from "astro-i18n";
const { pageTitle } = Astro.props;
---
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{pageTitle} - Nicolas Arduin</title>
<meta name="description" content={t("seo.meta.description")} />
<meta name="robots" content="index,follow." />
<meta name="author" content="Nicolas Arduin" />
<meta name="subject" content="Développement de sites web, accessibilité." />
<meta name="view-transition" content="same-origin" />
</head>

View File

@ -34,7 +34,7 @@ const { item } = Astro.props;
text-align: center; text-align: center;
gap: var(--space-xs); gap: var(--space-xs);
cursor: pointer; cursor: pointer;
background-color: var(--color-white); background-color: var(--color-light-blue);
transform: translateY(0); transform: translateY(0);
} }
.card:focus-within { .card:focus-within {

View File

@ -10,26 +10,24 @@ const { toc } = Astro.props;
<ol class="table-of-content__list" role="list"> <ol class="table-of-content__list" role="list">
{ {
// loop over the toc // loop over the toc
toc.map( toc.map((heading) =>
( // if h2, set as a li
heading heading.depth === 2 ? (
// if h2, set as a li <li>
) => <a href={`#${heading.slug}`} class="toc-2">
heading.depth === 2 ? ( {heading.text}
</a>
</li>
) : // if h3, set as inner ol > li
heading.depth === 3 ? (
<ol role="list">
<li> <li>
<a href={`#${heading.slug}`} class="toc-2"> <a href={`#${heading.slug}`} class="toc-3">
{heading.text} {heading.text}
</a> </a>
</li> // if h3, set as inner ol > li </li>
) : heading.depth === 3 ? ( </ol>
<ol role="list"> ) : null
<li>
<a href={`#${heading.slug}`} class="toc-3">
{heading.text}
</a>
</li>
</ol>
) : null
) )
} }
</ol> </ol>
@ -70,18 +68,15 @@ const { toc } = Astro.props;
} }
.table-of-content__list a::before { .table-of-content__list a::before {
content: ""; content: "·";
position: absolute; position: absolute;
top: 50%; top: 0;
left: 0; left: 0;
inline-size: 2px;
block-size: 2px;
border-radius: 4px;
transform: translate(-6px, 0); transform: translate(-6px, 0);
background-color: var(--color-grey); color: var(--color-grey);
} }
.table-of-content__list a:visited::before { .table-of-content__list a:visited::before {
background-color: white; color: white;
} }
.table-of-content__list a:focus, .table-of-content__list a:focus,

View File

@ -2,7 +2,7 @@
title: Nico v2.0 title: Nico v2.0
subtitle: 2022 update of many things. subtitle: 2022 update of many things.
lang: en lang: en
permalink: "2022" slug: "2022"
excerpt: Changes in my services, the website and myself. excerpt: Changes in my services, the website and myself.
tags: ["Freelance"] tags: ["Freelance"]
type: articles type: articles

View File

@ -2,7 +2,7 @@
title: Nico v2.5 title: Nico v2.5
subtitle: Update 2023. subtitle: Update 2023.
lang: en lang: en
permalink: "2023" slug: "2023"
excerpt: New changes. excerpt: New changes.
tags: ["Freelance"] tags: ["Freelance"]
type: articles type: articles
@ -22,7 +22,7 @@ I have completely redeveloped my site with <a href="https://astro.build/" rel="n
I will definitely do an article or two about Astro and the extensions I used. It was a great experience. Nuxt v2 is not really up to date anymore, so the performance was not good. Astro has completely fixed that. I will definitely do an article or two about Astro and the extensions I used. It was a great experience. Nuxt v2 is not really up to date anymore, so the performance was not good. Astro has completely fixed that.
My <a href="https://pagespeed.web.dev/analysis/https-nardu-in/06as4el7ed?form_factor=mobile" rel="noopener noreferer">PageSpeed</a> performance score had dropped to 77/100. Thanks to Astro I'm back to a solid **95/100** without any particular optimization. With some small efforts, I've reached the good old 100/100. My <a href="https://pagespeed.web.dev/" rel="noopener noreferer">PageSpeed</a> performance score had dropped to 77/100. Thanks to Astro I'm back to a solid **95/100** without any particular optimization.
I then did a work of modernization of the codebase. Hello CSS variables and goodbye `media queries`. In no particular order, here are some of the improvements I made: I then did a work of modernization of the codebase. Hello CSS variables and goodbye `media queries`. In no particular order, here are some of the improvements I made:

View File

@ -2,7 +2,7 @@
title: After Effects Expressions title: After Effects Expressions
subtitle: Animation on steroïds. subtitle: Animation on steroïds.
lang: en lang: en
permalink: "after-effects-expressions" slug: "after-effects-expressions"
excerpt: Expressions in After Effects have always been blurry for me. I know they exist, I know they're powerful, I know it could save a lot of time and clean complex keyframe filled compositions but… They are hard to learn! excerpt: Expressions in After Effects have always been blurry for me. I know they exist, I know they're powerful, I know it could save a lot of time and clean complex keyframe filled compositions but… They are hard to learn!
tags: ["Design"] tags: ["Design"]
type: articles type: articles
@ -11,6 +11,9 @@ code: true
--- ---
import AstroImage from "../../../components/AstroImage.astro"; import AstroImage from "../../../components/AstroImage.astro";
export const basicExpression =
"https://assets.nardu.in/basic_expression_d81b12f1ac.jpeg";
export const shortcut = "https://assets.nardu.in/shortcut_39cc19d383.jpeg";
## An ever lasting battle ## An ever lasting battle
@ -22,7 +25,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_d81b12f1ac.jpeg" src={basicExpression}
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 +36,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_39cc19d383.jpeg" src={shortcut}
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

@ -2,7 +2,7 @@
title: Accessibility and sobriety title: Accessibility and sobriety
subtitle: Translation in progress, stay tuned ;) subtitle: Translation in progress, stay tuned ;)
lang: en lang: en
permalink: "faq" slug: "faq"
draft: true draft: true
excerpt: Why, how et and especially what. excerpt: Why, how et and especially what.
tags: ["Freelance"] tags: ["Freelance"]

View File

@ -2,7 +2,7 @@
title: Gratuiste title: Gratuiste
subtitle: Translation in progress, stay tuned ;) subtitle: Translation in progress, stay tuned ;)
lang: en lang: en
permalink: "gratuiste" slug: "gratuiste"
draft: true draft: true
excerpt: Translation in progress, stay tuned ;) excerpt: Translation in progress, stay tuned ;)
tags: ["Design", "Freelance"] tags: ["Design", "Freelance"]

View File

@ -2,7 +2,7 @@
title: "Access blocked Sci-hub" title: "Access blocked Sci-hub"
subtitle: "The science of sharing." subtitle: "The science of sharing."
lang: en lang: en
permalink: "sci-hub-unblock" slug: "sci-hub-unblock"
key: "scihub" key: "scihub"
excerpt: "In March 2019, the Paris Regional Court ruled in favour of the publishers of scientific articles Elsevier and Springer Nature by ordering internet service providers to block access to these two websites. Here is how to access them if they are blocked in your country anyway." excerpt: "In March 2019, the Paris Regional Court ruled in favour of the publishers of scientific articles Elsevier and Springer Nature by ordering internet service providers to block access to these two websites. Here is how to access them if they are blocked in your country anyway."
tags: ["Internet", "Science"] tags: ["Internet", "Science"]
@ -12,6 +12,13 @@ updatedAt: "2022-12-27T12:08:00.000Z"
--- ---
import AstroImage from "../../../components/AstroImage.astro"; import AstroImage from "../../../components/AstroImage.astro";
export const macOs =
"https://assets.nardu.in/ef5a4b8e82a046e6a466c73c2fd9e99e.jpg";
export const windowsSettings = "https://assets.nardu.in/sci-hub-settings.jpg";
export const windowsNetwork = "https://assets.nardu.in/sci-hub-network.jpg";
export const windowsAdapter = "https://assets.nardu.in/sci-hub-adapter.jpg";
export const windowsAdapterSettings =
"https://assets.nardu.in/sci-hub-adapter-settings.jpg";
The current sci-hub address is: <a href="https://sci-hub.se" rel="noreferer noopener">sci-hub.se</a> The current sci-hub address is: <a href="https://sci-hub.se" rel="noreferer noopener">sci-hub.se</a>
@ -46,7 +53,7 @@ Go to:
From there, you can add DNS servers by clicking the + icon. Click ok and apply the new settings. You might need to restart your computer for the changes to work. From there, you can add DNS servers by clicking the + icon. Click ok and apply the new settings. You might need to restart your computer for the changes to work.
<AstroImage <AstroImage
src="https://assets.nardu.in/ef5a4b8e82a046e6a466c73c2fd9e99e.jpg" src={macOs}
width="728" width="728"
height="1060" height="1060"
alt="MacOS network and DNS settings" alt="MacOS network and DNS settings"
@ -67,28 +74,28 @@ Go to:
From there, you can add DNS servers. Click save. You might need to restart your computer for the changes to work. From there, you can add DNS servers. Click save. You might need to restart your computer for the changes to work.
<AstroImage <AstroImage
src="https://assets.nardu.in/sci-hub-settings.jpg" src={windowsSettings}
width="728" width="728"
height="319" height="319"
alt="Windows system settings" alt="Windows system settings"
/> />
<AstroImage <AstroImage
src="https://assets.nardu.in/sci-hub-network.jpg" src={windowsNetwork}
width="728" width="728"
height="803" height="803"
alt="Windows network settings" alt="Windows network settings"
/> />
<AstroImage <AstroImage
src="https://assets.nardu.in/sci-hub-adapter.jpg" src={windowsAdapter}
width="728" width="728"
height="327" height="327"
alt="Windows network connections settings" alt="Windows network connections settings"
/> />
<AstroImage <AstroImage
src="https://assets.nardu.in/sci-hub-adapter-settings.jpg" src={windowsAdapterSettings}
width="728" width="728"
height="434" height="434"
alt="Windows network adapter settings" alt="Windows network adapter settings"

View File

@ -2,7 +2,7 @@
title: The day I Jamd title: The day I Jamd
subtitle: A story of unusual tools and fun gambles. subtitle: A story of unusual tools and fun gambles.
lang: en lang: en
permalink: "the-day-I-jamd" slug: "the-day-I-jamd"
excerpt: Ooh, yeah! All right! Were jammin excerpt: Ooh, yeah! All right! Were jammin
tags: ["Dev", "Jamstack"] tags: ["Dev", "Jamstack"]
type: articles type: articles
@ -11,6 +11,8 @@ updatedAt: "2022-12-27T15:40:06.000Z"
--- ---
import AstroImage from "../../../components/AstroImage.astro"; import AstroImage from "../../../components/AstroImage.astro";
export const wordpress = "https://assets.nardu.in/wordpress_8ee6f54b98.jpeg";
export const strapi11ty = "https://assets.nardu.in/static_2c0d9f1eb8.jpeg";
## The not so easy choice ## The not so easy choice
@ -31,7 +33,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_8ee6f54b98.jpeg" src={wordpress}
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 +44,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_2c0d9f1eb8.jpeg" src={strapi11ty}
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

@ -2,7 +2,7 @@
title: Video compression title: Video compression
subtitle: Encode like you mean it. subtitle: Encode like you mean it.
lang: en lang: en
permalink: "video-compression" slug: "video-compression"
excerpt: How to gain precious weight when encoding videos. excerpt: How to gain precious weight when encoding videos.
tags: ["Design"] tags: ["Design"]
type: articles type: articles
@ -11,6 +11,11 @@ updatedAt: "2022-06-08T14:24:06.000Z"
--- ---
import AstroImage from "../../../components/AstroImage.astro"; import AstroImage from "../../../components/AstroImage.astro";
export const premiereExport = "https://assets.nardu.in/video-premiere-1.jpeg";
export const handbrakeBase = "https://assets.nardu.in/video-handbrake-1.jpeg";
export const handbrakeVideo = "https://assets.nardu.in/video-handbrake-2.jpeg";
export const handbrakeAudio = "https://assets.nardu.in/video-handbrake-3.jpeg";
export const handbrakeWeb = "https://assets.nardu.in/video-handbrake-4.jpg";
## Let's play. ## Let's play.
@ -26,11 +31,7 @@ With a good connection, users will not see the difference. But if we go down tha
Let's say we exported a 1920x1080 video from Premiere Pro with these basic settings: Let's say we exported a 1920x1080 video from Premiere Pro with these basic settings:
<AstroImage <AstroImage src={premiereExport} width="673" height="800" alt="" />
src="https://assets.nardu.in/video-premiere-1.jpeg"
width="673"
height="800"
/>
It's gorgeous, it's Full HD, it's 1:30 minute of excellent editing but it's 50mb… What a shame. It's gorgeous, it's Full HD, it's 1:30 minute of excellent editing but it's 50mb… What a shame.
@ -51,11 +52,7 @@ While it's not as nice as Premiere Pro, it has way more exporting capabilities.
1. Check Web Optimized 1. Check Web Optimized
1. Keep MPEG-4 as the format 1. Keep MPEG-4 as the format
<AstroImage <AstroImage src={handbrakeBase} width="728" height="337" alt="" />
src="https://assets.nardu.in/video-handbrake-1.jpeg"
width="728"
height="337"
/>
### Video screen ### Video screen
@ -64,11 +61,7 @@ While it's not as nice as Premiere Pro, it has way more exporting capabilities.
1. Choose Peak Framerate. If you don't know the framerate, keep the default setting 1. Choose Peak Framerate. If you don't know the framerate, keep the default setting
1. Choose the type of video you are encoding (film, animation…) 1. Choose the type of video you are encoding (film, animation…)
<AstroImage <AstroImage src={handbrakeVideo} width="728" height="337" alt="" />
src="https://assets.nardu.in/video-handbrake-2.jpeg"
width="728"
height="337"
/>
### Audio screen ### Audio screen
@ -79,11 +72,7 @@ If you have an audio channel, these settings are great and will not influence th
1. Samplerate 44.1 1. Samplerate 44.1
1. Bitrate 192 to 256 (your choice) 1. Bitrate 192 to 256 (your choice)
<AstroImage <AstroImage src={handbrakeAudio} width="728" height="337" alt="" />
src="https://assets.nardu.in/video-handbrake-3.jpeg"
width="728"
height="337"
/>
### Export! ### Export!
@ -104,12 +93,7 @@ Webm is an html video format and VP9 is its latest codec.
Using Handbrake and webm/VP9, we can achieve really great compression without losing too much quality (or none at all depending on the settings). I was able to divide by 4 the size of a video using these presets: Using Handbrake and webm/VP9, we can achieve really great compression without losing too much quality (or none at all depending on the settings). I was able to divide by 4 the size of a video using these presets:
<AstroImage <AstroImage src={handbrakeWeb} width="728" height="313" alt="" />
src="https://assets.nardu.in/video-handbrake-4.jpg"
width="728"
height="313"
alt=""
/>
The only down side is that it takes some time to encode. It will depend on the video length and your computing power. The only down side is that it takes some time to encode. It will depend on the video length and your computing power.

View File

@ -2,7 +2,7 @@
title: Nico v2.0 title: Nico v2.0
subtitle: Mise à jour 2022 de plein de trucs. subtitle: Mise à jour 2022 de plein de trucs.
lang: fr lang: fr
permalink: "2022" slug: "2022"
excerpt: Évolution des services, du site et de moi-même. excerpt: Évolution des services, du site et de moi-même.
tags: ["Freelance"] tags: ["Freelance"]
type: articles type: articles

View File

@ -2,7 +2,7 @@
title: Nico v2.5 title: Nico v2.5
subtitle: Mise à jour 2023. subtitle: Mise à jour 2023.
lang: fr lang: fr
permalink: "2023" slug: "2023"
excerpt: Suite des évolutions. excerpt: Suite des évolutions.
tags: ["Freelance"] tags: ["Freelance"]
type: articles type: articles
@ -22,7 +22,7 @@ J'ai entièrement re-développé mon site avec <a href="https://astro.build/" re
Je ferai certainement un ou deux articles/fragments sur Astro et les extensions que j'ai utilisées. En tout cas c'était super comme expérience. Nuxt v2 n'étant plus vraiment à jour, les performances n'étaient plus au rendez-vous. Astro a complètement corrigé ça. Je ferai certainement un ou deux articles/fragments sur Astro et les extensions que j'ai utilisées. En tout cas c'était super comme expérience. Nuxt v2 n'étant plus vraiment à jour, les performances n'étaient plus au rendez-vous. Astro a complètement corrigé ça.
Mon score de performance <a href="https://pagespeed.web.dev/analysis/https-nardu-in/06as4el7ed?form_factor=mobile" rel="noopener noreferer" hreflang="en" lang="en">PageSpeed</a> était tombé à 77/100. Grâce à Astro je retrouve un solide **95/100** sans optimisation particulière. Avec quelques efforts sur le poids des ressources, je retrouve ce bon vieux 100/100. Mon score de performance <a href="https://pagespeed.web.dev/" rel="noopener noreferer" hreflang="en" lang="en">PageSpeed</a> était tombé à 77/100. Grâce à Astro je retrouve un solide **95/100** sans optimisation particulière.
J'ai ensuite fait un travail de modernisation du code. Bonjour variables CSS et au-revoir les `media queries`. En vrac, voici certaines améliorations que j'ai mises en place&nbsp;: J'ai ensuite fait un travail de modernisation du code. Bonjour variables CSS et au-revoir les `media queries`. En vrac, voici certaines améliorations que j'ai mises en place&nbsp;:

View File

@ -3,7 +3,7 @@ title: After Effects Expressions
subtitle: En cours de traduction, revenez bientôt ;) subtitle: En cours de traduction, revenez bientôt ;)
lang: fr lang: fr
draft: true draft: true
permalink: "after-effects-expressions" slug: "after-effects-expressions"
excerpt: En cours de traduction, revenez bientôt ;) excerpt: En cours de traduction, revenez bientôt ;)
tags: ["Design"] tags: ["Design"]
type: articles type: articles

View File

@ -2,7 +2,7 @@
title: Accessibilité, sobriété et F.A.Q. title: Accessibilité, sobriété et F.A.Q.
subtitle: Explications sur ma vision et mon fonctionnement. subtitle: Explications sur ma vision et mon fonctionnement.
lang: fr lang: fr
permalink: "faq" slug: "faq"
excerpt: Pourquoi, comment et surtout quèsaco. excerpt: Pourquoi, comment et surtout quèsaco.
tags: ["Freelance"] tags: ["Freelance"]
type: articles type: articles

View File

@ -2,7 +2,7 @@
title: "Gratuiste" title: "Gratuiste"
subtitle: "Ou le travail gratuit." subtitle: "Ou le travail gratuit."
lang: fr lang: fr
permalink: "gratuiste" slug: "gratuiste"
excerpt: "Jai cherché un moyen de mettre mes compétences au service dautrui et je pense avoir trouvé: je vais travailler gratuitement pour des associations." excerpt: "Jai cherché un moyen de mettre mes compétences au service dautrui et je pense avoir trouvé: je vais travailler gratuitement pour des associations."
tags: ["Graphisme", "Freelance"] tags: ["Graphisme", "Freelance"]
type: articles type: articles

View File

@ -2,7 +2,7 @@
title: "Sci-hub bloqué, comment contourner" title: "Sci-hub bloqué, comment contourner"
subtitle: "La science du partage." subtitle: "La science du partage."
lang: fr lang: fr
permalink: "sci-hub-blocage" slug: "sci-hub-blocage"
excerpt: "Le tribunal de grande instance de Paris a ordonné aux fournisseurs daccès à internet de bloquer laccès à sci-hub. Voici comment contourner les blocages mis en place." excerpt: "Le tribunal de grande instance de Paris a ordonné aux fournisseurs daccès à internet de bloquer laccès à sci-hub. Voici comment contourner les blocages mis en place."
tags: ["Internet", "Science"] tags: ["Internet", "Science"]
type: articles type: articles
@ -11,6 +11,13 @@ updatedAt: "2022-12-27T12:08:00.000Z"
--- ---
import AstroImage from "../../../components/AstroImage.astro"; import AstroImage from "../../../components/AstroImage.astro";
export const macOs =
"https://assets.nardu.in/ef5a4b8e82a046e6a466c73c2fd9e99e.jpg";
export const windowsSettings = "https://assets.nardu.in/sci-hub-settings.jpg";
export const windowsNetwork = "https://assets.nardu.in/sci-hub-network.jpg";
export const windowsAdapter = "https://assets.nardu.in/sci-hub-adapter.jpg";
export const windowsAdapterSettings =
"https://assets.nardu.in/sci-hub-adapter-settings.jpg";
L'adresse actuelle de sci-hub est&nbsp;: [sci-hub.se](https://sci-hub.se) L'adresse actuelle de sci-hub est&nbsp;: [sci-hub.se](https://sci-hub.se)
@ -49,7 +56,7 @@ Ouvrez&nbsp;:
De là, vous pouvez ajouter des serveurs DNS en cliquant sur l'icône +. Cliquez sur ok et appliquez les nouveaux paramètres. Vous devrez peut-être redémarrer votre ordinateur pour que les changements fonctionnent. De là, vous pouvez ajouter des serveurs DNS en cliquant sur l'icône +. Cliquez sur ok et appliquez les nouveaux paramètres. Vous devrez peut-être redémarrer votre ordinateur pour que les changements fonctionnent.
<AstroImage <AstroImage
src="https://assets.nardu.in/ef5a4b8e82a046e6a466c73c2fd9e99e.jpg" src={macOs}
width="728" width="728"
height="1060" height="1060"
alt="MacOS réglages réseau et DNS" alt="MacOS réglages réseau et DNS"
@ -68,28 +75,28 @@ Ouvrez&nbsp;:
1. Utiliser ladresse de serveur DNS suivante 1. Utiliser ladresse de serveur DNS suivante
<AstroImage <AstroImage
src="https://assets.nardu.in/sci-hub-settings.jpg" src={windowsSettings}
width="728" width="728"
height="319" height="319"
alt="Réglages windows" alt="Réglages windows"
/> />
<AstroImage <AstroImage
src="https://assets.nardu.in/sci-hub-network.jpg" src={windowsNetwork}
width="728" width="728"
height="803" height="803"
alt="Windows réglages réseaux" alt="Windows réglages réseaux"
/> />
<AstroImage <AstroImage
src="https://assets.nardu.in/sci-hub-adapter.jpg" src={windowsAdapter}
width="728" width="728"
height="327" height="327"
alt="Windows régalges connections réseaux" alt="Windows régalges connections réseaux"
/> />
<AstroImage <AstroImage
src="https://assets.nardu.in/sci-hub-adapter-settings.jpg" src={windowsAdapterSettings}
width="728" width="728"
height="434" height="434"
alt="Windows options adaptateur réseau" alt="Windows options adaptateur réseau"

View File

@ -2,7 +2,7 @@
title: The day I Jamd title: The day I Jamd
subtitle: Des paris, des outils et du fun. subtitle: Des paris, des outils et du fun.
lang: fr lang: fr
permalink: "the-day-I-jamd" slug: "the-day-I-jamd"
excerpt: Ooh, yeah! All right! Were jammin excerpt: Ooh, yeah! All right! Were jammin
tags: ["Dev", "Jamstack"] tags: ["Dev", "Jamstack"]
type: articles type: articles
@ -11,6 +11,8 @@ updatedAt: "2022-12-27T15:40:06.000Z"
--- ---
import AstroImage from "../../../components/AstroImage.astro"; import AstroImage from "../../../components/AstroImage.astro";
export const wordpress = "https://assets.nardu.in/wordpress_8ee6f54b98.jpeg";
export const strapi11ty = "https://assets.nardu.in/static_2c0d9f1eb8.jpeg";
## La solution de non facilité ## La solution de non facilité
@ -31,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_8ee6f54b98.jpeg" src={wordpress}
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."
@ -42,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_2c0d9f1eb8.jpeg" src={strapi11ty}
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

@ -3,7 +3,7 @@ title: Compression vidéo
subtitle: En cours de traduction, revenez bientôt ;) subtitle: En cours de traduction, revenez bientôt ;)
lang: fr lang: fr
draft: true draft: true
permalink: "video-compression" slug: "video-compression"
excerpt: Pas encore traduit excerpt: Pas encore traduit
tags: ["Design"] tags: ["Design"]
type: articles type: articles

View File

@ -7,7 +7,6 @@ const articles = defineCollection({
lang: z.enum(["fr", "en"]), lang: z.enum(["fr", "en"]),
tags: z.array(z.string()), // An array of strings tags: z.array(z.string()), // An array of strings
type: z.string(), type: z.string(),
permalink: z.string(),
// Parse pubDate as a browser-standard `Date` object // Parse pubDate as a browser-standard `Date` object
createdAt: z.string().transform((str) => new Date(str)), createdAt: z.string().transform((str) => new Date(str)),
updatedAt: z updatedAt: z
@ -26,7 +25,6 @@ const fragments = defineCollection({
lang: z.enum(["fr", "en"]), lang: z.enum(["fr", "en"]),
tags: z.array(z.string()), // An array of strings tags: z.array(z.string()), // An array of strings
type: z.string(), type: z.string(),
permalink: z.string(),
// Parse pubDate as a browser-standard `Date` object // Parse pubDate as a browser-standard `Date` object
createdAt: z.string().transform((str) => new Date(str)), createdAt: z.string().transform((str) => new Date(str)),
updatedAt: z updatedAt: z
@ -44,7 +42,6 @@ const references = defineCollection({
subtitle: z.string(), subtitle: z.string(),
url: z.string(), url: z.string(),
lang: z.enum(["fr", "en"]), lang: z.enum(["fr", "en"]),
permalink: z.string(),
tags: z.array(z.string()), // An array of strings tags: z.array(z.string()), // An array of strings
// Parse pubDate as a browser-standard `Date` object // Parse pubDate as a browser-standard `Date` object
createdAt: z.string().transform((str) => new Date(str)), createdAt: z.string().transform((str) => new Date(str)),

View File

@ -2,7 +2,7 @@
title: Strong TLS certificates with acme.sh title: Strong TLS certificates with acme.sh
subtitle: 384-bit of https subtitle: 384-bit of https
lang: en lang: en
permalink: "acme-sh-tls-cert" slug: "acme-sh-tls-cert"
createdAt: "2022-06-08T14:24:06.000Z" createdAt: "2022-06-08T14:24:06.000Z"
excerpt: Real cert have curves. excerpt: Real cert have curves.
tags: ["security"] tags: ["security"]

View File

@ -2,7 +2,7 @@
title: Filter an array against another array title: Filter an array against another array
subtitle: Array vs Array. subtitle: Array vs Array.
lang: en lang: en
permalink: "array-vs-array" slug: "array-vs-array"
createdAt: "2022-06-08T14:24:06.000Z" createdAt: "2022-06-08T14:24:06.000Z"
excerpt: My peak javascript excerpt: My peak javascript
tags: ["nuxt.js"] tags: ["nuxt.js"]

View File

@ -2,7 +2,7 @@
title: Buttons hover title: Buttons hover
subtitle: Simple, but nice. subtitle: Simple, but nice.
lang: en lang: en
permalink: "buttons" slug: "buttons"
draft: true draft: true
excerpt: Easy to grab and use hover effects. excerpt: Easy to grab and use hover effects.
tags: ["CSS"] tags: ["CSS"]

View File

@ -3,7 +3,7 @@ title: Full width image
subtitle: Translation in progress, stay tuned ;) subtitle: Translation in progress, stay tuned ;)
lang: en lang: en
draft: true draft: true
permalink: "image-full" slug: "image-full"
createdAt: "2020-09-15T09:00:00.000Z" createdAt: "2020-09-15T09:00:00.000Z"
updatedAt: "2022-06-08T14:24:06.000Z" updatedAt: "2022-06-08T14:24:06.000Z"
tags: ["CSS"] tags: ["CSS"]

View File

@ -2,7 +2,7 @@
title: Static website and GraphQL queries with Nuxt.js title: Static website and GraphQL queries with Nuxt.js
subtitle: Graphql client is king. subtitle: Graphql client is king.
lang: en lang: en
permalink: "nuxt-graphql-static" slug: "nuxt-graphql-static"
createdAt: "2022-06-08T14:24:06.000Z" createdAt: "2022-06-08T14:24:06.000Z"
updatedAt: "2022-09-08T13:43:33.000Z" updatedAt: "2022-09-08T13:43:33.000Z"
excerpt: When the most used gql module doesn't work… excerpt: When the most used gql module doesn't work…
@ -131,7 +131,7 @@ export default {
const locale = app.i18n.localeProperties.iso const locale = app.i18n.localeProperties.iso
const data = await $graphql.default.request(articleQuery, { const data = await $graphql.default.request(articleQuery, {
code: locale, code: locale,
permalink: params.slug, slug: params.slug,
}) })
return { data } return { data }
}, },

View File

@ -2,7 +2,7 @@
title: The best cookies title: The best cookies
subtitle: Consentless biscuits. subtitle: Consentless biscuits.
lang: en lang: en
permalink: "super-cookies" slug: "super-cookies"
createdAt: "2022-06-08T14:24:06.000Z" createdAt: "2022-06-08T14:24:06.000Z"
excerpt: It's a real recipe, not a joke about annoying files. excerpt: It's a real recipe, not a joke about annoying files.
tags: ["food"] tags: ["food"]
@ -10,6 +10,8 @@ type: snippets
--- ---
import AstroImage from "../../../components/AstroImage.astro"; import AstroImage from "../../../components/AstroImage.astro";
export const cookies1 = "https://assets.nardu.in/cookies-fig-1.jpg";
export const cookies2 = "https://assets.nardu.in/cookies-fig-2.jpg";
## Vegetalian version ## Vegetalian version
@ -74,14 +76,14 @@ Chocolate can be replaced by anything like nuts, raisins, legos... (don't eat le
## Figures ## Figures
<AstroImage <AstroImage
src="https://assets.nardu.in/cookies-fig-1.jpg" src={cookies1}
width="753" width="753"
height="1248" height="1248"
alt="All ingredients mixed together to form a brown paste." alt="All ingredients mixed together to form a brown paste."
/> />
<AstroImage <AstroImage
src="https://assets.nardu.in/cookies-fig-2.jpg" src={cookies2}
width="753" width="753"
height="1248" height="1248"
alt="The cookies are round and soft after baking." alt="The cookies are rounded and soft after baking."
/> />

View File

@ -2,7 +2,7 @@
title: Toulouse yourself title: Toulouse yourself
subtitle: Only the bestest subtitle: Only the bestest
lang: en lang: en
permalink: "toulouse-fun" slug: "toulouse-fun"
excerpt: Gonna have to trust me on this ¯\_(ツ)_/¯ excerpt: Gonna have to trust me on this ¯\_(ツ)_/¯
tags: ["lifestyle"] tags: ["lifestyle"]
type: snippets type: snippets

View File

@ -1,13 +0,0 @@
---
title: Visited links and visuel aid
subtitle: Translation in progress, stay tuned ;)
lang: en
draft: true
permalink: "visited-links"
excerpt: Petit hack CSS
tags: ["Front-end"]
type: snippets
createdAt: "2023-06-06T18:34:00.000Z"
---
[Go back to available snippets](/en/snippets)

View File

@ -2,7 +2,7 @@
title: Certificates TLS robustes avec acme.sh title: Certificates TLS robustes avec acme.sh
subtitle: 384-bit de https subtitle: 384-bit de https
lang: fr lang: fr
permalink: "acme-sh-tls-cert" slug: "acme-sh-tls-cert"
createdAt: "2022-06-08T14:24:06.000Z" createdAt: "2022-06-08T14:24:06.000Z"
excerpt: La sécurité avec des courbes. excerpt: La sécurité avec des courbes.
tags: ["sécurité"] tags: ["sécurité"]

View File

@ -3,7 +3,7 @@ title: Filtrer un array avec un autre array
subtitle: En cours de traduction. subtitle: En cours de traduction.
lang: fr lang: fr
draft: true draft: true
permalink: "array-vs-array" slug: "array-vs-array"
createdAt: "2022-06-08T14:24:06.000Z" createdAt: "2022-06-08T14:24:06.000Z"
excerpt: En cours de traduction. excerpt: En cours de traduction.
tags: ["nuxt.js"] tags: ["nuxt.js"]

View File

@ -2,7 +2,7 @@
title: "Effets de survol de boutons" title: "Effets de survol de boutons"
subtitle: "Simples mais efficaces." subtitle: "Simples mais efficaces."
lang: fr lang: fr
permalink: "buttons" slug: "buttons"
draft: true draft: true
excerpt: Quelques effets de survol faciles à récupérer et utiliser. excerpt: Quelques effets de survol faciles à récupérer et utiliser.
tags: ["CSS"] tags: ["CSS"]
@ -51,7 +51,7 @@ Tous les boutons présents utilisent ces styles comme base en guise de «&nbsp;r
background-color: hotpink; background-color: hotpink;
} }
.btn-icon::before { .btn-icon::before {
content: url("./assets/svg/arrow-right-white.svg"); content: url("~assets/svg/arrow-right-white.svg");
position: absolute; position: absolute;
width: 20px; width: 20px;
top: 50%; top: 50%;

View File

@ -2,7 +2,7 @@
title: Image pleine largeur title: Image pleine largeur
subtitle: Casser le conteneur. subtitle: Casser le conteneur.
lang: fr lang: fr
permalink: "image-full" slug: "image-full"
createdAt: "2020-09-15T09:00:00.000Z" createdAt: "2020-09-15T09:00:00.000Z"
updatedAt: "2022-06-08T14:24:06.000Z" updatedAt: "2022-06-08T14:24:06.000Z"
excerpt: Faire déborder une image de son conteneur sans tout casser. excerpt: Faire déborder une image de son conteneur sans tout casser.
@ -11,16 +11,23 @@ type: fragments
--- ---
import AstroImage from "../../../components/AstroImage.astro"; import AstroImage from "../../../components/AstroImage.astro";
export const example =
"https://assets.nardu.in/image_bleed_container_9e3939b3ae.jpeg";
export const context =
"https://assets.nardu.in/image_bleed_original_d49f0d11bf.jpeg";
export const container =
"https://assets.nardu.in/image_bleed_full_2a902f9539.jpeg";
export const banner =
"https://assets.nardu.in/image_bleed_height_81b4ce969a.jpeg";
export const broken =
"https://assets.nardu.in/image_bleed_deformed_479046d2cb.jpeg";
export const result = "https://assets.nardu.in/image_bleed_6c164e82b3.jpeg";
## Image inline ## Image inline
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={example} width="320" height="568" alt="" />
src="https://assets.nardu.in/image_bleed_container_9e3939b3ae.jpeg"
width="320"
height="568"
/>
### Contexte ### Contexte
@ -49,11 +56,7 @@ img {
} }
``` ```
<AstroImage <AstroImage src={context} width="320" height="568" alt="" />
src="https://assets.nardu.in/image_bleed_original_d49f0d11bf.jpeg"
width="320"
height="568"
/>
### Déborder du conteneur ### Déborder du conteneur
@ -67,11 +70,7 @@ Afin de faire prendre à l'image toute la largeur, on agit sur son conteneur&nbs
} }
``` ```
<AstroImage <AstroImage src={container} width="320" height="568" alt="" />
src="https://assets.nardu.in/image_bleed_full_2a902f9539.jpeg"
width="320"
height="568"
/>
### Faire une bannière ### Faire une bannière
@ -86,11 +85,7 @@ On peut alors réduire la hauteur du conteneur pour obtenir une bannière plutô
} }
``` ```
<AstroImage <AstroImage src={banner} width="320" height="568" alt="" />
src="https://assets.nardu.in/image_bleed_height_81b4ce969a.jpeg"
width="320"
height="568"
/>
Il faut ensuite forcer l'image à prendre toute la largeur du conteneur&nbsp;: Il faut ensuite forcer l'image à prendre toute la largeur du conteneur&nbsp;:
@ -100,11 +95,7 @@ Il faut ensuite forcer l'image à prendre toute la largeur du conteneur&nbsp;:
} }
``` ```
<AstroImage <AstroImage src={broken} width="320" height="568" alt="" />
src="https://assets.nardu.in/image_bleed_deformed_479046d2cb.jpeg"
width="320"
height="568"
/>
Pas top… Pas top…
@ -119,11 +110,7 @@ Pas top…
} }
``` ```
<AstroImage <AstroImage src={result} width="320" height="568" alt="" />
src="https://assets.nardu.in/image_bleed_6c164e82b3.jpeg"
width="320"
height="568"
/>
Cette technique s'apparente à l'utilisation d'une image de background mais en dur 😁 Cette technique s'apparente à l'utilisation d'une image de background mais en dur 😁

View File

@ -2,7 +2,7 @@
title: Site statique et requêtes GraphQL avec Nuxt.js title: Site statique et requêtes GraphQL avec Nuxt.js
subtitle: Le client graphql est roi. subtitle: Le client graphql est roi.
lang: fr lang: fr
permalink: "nuxt-graphql-static" slug: "nuxt-graphql-static"
createdAt: "2022-06-08T14:24:06.000Z" createdAt: "2022-06-08T14:24:06.000Z"
updatedAt: "2022-09-08T13:43:33.000Z" updatedAt: "2022-09-08T13:43:33.000Z"
excerpt: Quand le module gql le plus utilisé ne fonctionne pas… excerpt: Quand le module gql le plus utilisé ne fonctionne pas…
@ -131,7 +131,7 @@ export default {
const locale = app.i18n.localeProperties.iso const locale = app.i18n.localeProperties.iso
const data = await $graphql.default.request(articleQuery, { const data = await $graphql.default.request(articleQuery, {
code: locale, code: locale,
permalink: params.slug, slug: params.slug,
}) })
return { data } return { data }
}, },

View File

@ -2,7 +2,7 @@
title: Les meilleurs cookies title: Les meilleurs cookies
subtitle: Des gâteaux sans consentement. subtitle: Des gâteaux sans consentement.
lang: fr lang: fr
permalink: "super-cookies" slug: "super-cookies"
createdAt: "2022-06-08T14:24:06.000Z" createdAt: "2022-06-08T14:24:06.000Z"
excerpt: C'est vraiment une recette hein, pas une blague sur les fichiers temporaires. excerpt: C'est vraiment une recette hein, pas une blague sur les fichiers temporaires.
tags: ["cuisine"] tags: ["cuisine"]
@ -10,6 +10,8 @@ type: fragments
--- ---
import AstroImage from "../../../components/AstroImage.astro"; import AstroImage from "../../../components/AstroImage.astro";
export const cookies1 = "https://assets.nardu.in/cookies-fig-1.jpg";
export const cookies2 = "https://assets.nardu.in/cookies-fig-2.jpg";
## Version végétalienne ## Version végétalienne
@ -74,13 +76,13 @@ Le chocolat peut-être remplacé par n'importe quoi comme des noix, des raisins
## Figures ## Figures
<AstroImage <AstroImage
src="https://assets.nardu.in/cookies-fig-1.jpg" src={cookies1}
width="753" width="753"
height="1248" height="1248"
alt="Tous les ingrédients mélangés forment une pâte marron." alt="Tous les ingrédients mélangés forment une pâte marron."
/> />
<AstroImage <AstroImage
src="https://assets.nardu.in/cookies-fig-2.jpg" src={cookies2}
width="753" width="753"
height="1248" height="1248"
alt="Les cookies cuits sont bombés et très moelleux." alt="Les cookies cuits sont bombés et très moelleux."

View File

@ -3,7 +3,7 @@ title: Toulouse yourself
subtitle: En cours de traduction. subtitle: En cours de traduction.
lang: fr lang: fr
draft: true draft: true
permalink: "toulouse-fun" slug: "toulouse-fun"
createdAt: "2022-06-22T15:34:45.000Z" createdAt: "2022-06-22T15:34:45.000Z"
excerpt: En cours de traduction. excerpt: En cours de traduction.
tags: ["lifestyle"] tags: ["lifestyle"]

View File

@ -1,83 +0,0 @@
---
title: Liens visités et indication visuelle
subtitle: Comment différencier les liens déjà cliqués
lang: fr
draft: false
permalink: "visited-links"
excerpt: Petit hack CSS
tags: ["Front-end"]
type: snippets
createdAt: "2023-06-06T18:34:00.000Z"
---
## La théorie
Il est possible sur le web d'appliquer un style différent aux liens déjà visités par un utilisateur. Par défaut, un lien non visité est bleu tandis qu'un lien visité est violet.
Généralement, ces styles sont modifiés, voire supprimés dans le cas des liens visités. L'information qu'un lien a déjà été visité ne semble pas indispensable à la navigation. C'est sûrement vrai, mais personnellement, je suis assez content d'avoir un rappel des pages que j'ai déjà consultées lorsque je navigue.
Une information uniquement communiquée par la couleur est faillible, car certaines personnes ne distinguent pas les couleurs correctement. J'ai alors cherché un moyen d'ajouter un élément graphique supplémentaire aux liens visités/non visités. La solution démontrée ici n'est certainement pas idéale, elle se rapproche plus d'une expérience, à priori inoffensive pour l'internaute.
## La spécification
Quand je me suis intéressé à ce qu'il était possible de faire avec les liens déjà visités, j'ai découvert qu'extrêmement peu de propriétés <abbr>CSS</abbr> étaient autorisées. En effet, seulement des changements de couleurs sont disponibles. Ceci est dû au fait qu'il était possible de récupérer l'historique de navigation d'un utilisateur grâce aux styles des liens visités. Le sélecteur `:visited` a donc été restreint par les navigateurs afin de lutter contre cette brèche de la vie privée. [Plus d'informations dans cet article.](https://developer.mozilla.org/fr/docs/Web/CSS/Privacy_and_the_:visited_selector)
## La pratique
Que faire alors, en terme de style, quand on ne peut changer que des couleurs&nbsp;?
D'après MDN, les propriétés suivantes sont modifiables&nbsp;:
- `color`
- `background-color`
- `border-color` (et les propriétés détaillées associées),
- `column-rule-color`
- `outline-color`
- `text-decoration-color`
- `text-emphasis-color`
- Les composantes de couleur liées aux attributs SVG `fill` et `stroke`.
Changer la couleur d'un lien visité ne sera pas compris par les internautes, à moins de garder une colorimétrie proche de celle par défaut (bleu et violet).
En revanche, il est possible de "&nbsp;masquer&nbsp;" un élément en modifiant sa couleur pour qu'elle corresponde à la couleur du fond de la page ou de l'élément parent. On pourrait ainsi imaginer masquer une `border` ou un `outline`.
J'ai personnellement choisi de faire différemment. J'ai décidé d'utiliser un pseudo-élément `::before` sur l'état non visité du lien puis de le masquer quand celui-ci devient visité.
### Le code
```css
a {
position: relative;
text-decoration: none;
}
a::before {
content: "";
position: absolute;
top: 50%;
left: 0;
inline-size: 2px;
block-size: 2px;
border-radius: 4px;
transform: translate(-6px, 0);
background-color: grey;
}
a:visited::before {
background-color: white;
}
```
Ces règles, utilisées dans la table des matières de mes articles, ajoutent une sorte de petite puce ou pastille au début du lien. Cette puce est ensuite passée en blanc sur fond blanc une fois que le lien est visité, ce qui la masque visuellement.
### Accessibilité
On pourrait simplifier la règle et utiliser le caractère de puce directement dans la propriété `content` mais les lecteurs d'écran annonceront alors ce caractère lors de leur retranscription du lien. De plus, les lecteurs d'écrans annoncent déjà si un lien est visité avant de lire son intitulé.
## Aller plus loin
Afin de pousser l'expérience un peu plus loin, j'ai tenté d'utiliser des éléments plus explicites pour signifier l'état visité du lien. Bien qu'encore assez imparfait, il est possible de créer un indicateur plus complet de lien visité.
L'idée est d'avoir un `::before` et un `::after`, chacun contenant une icône en base 64 blanche en tant qu'image de fond. Quand le lien est non visité, le `::before` contient un fond coloré qui fait apparaître l'icône. Quand le lien passe en visité, le fond du `::before` devient blanc et celui du `::after` devient coloré, ce qui masque la première icône et affiche la deuxième.
Il est nécessaire de positionner les icônes côte à côte sinon elles se retrouveront l'une sur l'autre.
[Voir la démo sur codepen.](https://codepen.io/narduin/pen/VwVwmrO)

View File

@ -3,7 +3,7 @@ title: 3w
subtitle: I wrote the doc! subtitle: I wrote the doc!
url: https://3-w.fr url: https://3-w.fr
lang: en lang: en
permalink: "3w" slug: "3w"
excerpt: Développement web et compagnie. excerpt: Développement web et compagnie.
tags: ["Front-end", "docs"] tags: ["Front-end", "docs"]
createdAt: "2022-10-19T18:02:00.000Z" createdAt: "2022-10-19T18:02:00.000Z"

View File

@ -3,7 +3,7 @@ title: Nature en Occitanie
subtitle: Sobriety is only natural. subtitle: Sobriety is only natural.
url: https://www.natureo.org/ url: https://www.natureo.org/
lang: en lang: en
permalink: "natureo" slug: "natureo"
excerpt: Développement web et compagnie. excerpt: Développement web et compagnie.
tags: ["Front-end", "accessibility", "sobriety", "CMS"] tags: ["Front-end", "accessibility", "sobriety", "CMS"]
createdAt: "2023-04-19T18:02:00.000Z" createdAt: "2023-04-19T18:02:00.000Z"

View File

@ -3,7 +3,7 @@ title: Parole Expression
subtitle: A new website for the association. subtitle: A new website for the association.
url: https://www.paroleexpression.fr/ url: https://www.paroleexpression.fr/
lang: en lang: en
permalink: "parole-expression" slug: "parole-expression"
excerpt: Développement web et compagnie. excerpt: Développement web et compagnie.
tags: ["Front-end", "sobriety", "CMS"] tags: ["Front-end", "sobriety", "CMS"]
createdAt: "2022-04-19T17:11:00.000Z" createdAt: "2022-04-19T17:11:00.000Z"

View File

@ -3,7 +3,7 @@ title: Rose Primaire
subtitle: An agency we love. subtitle: An agency we love.
url: https://roseprimaire.com/ url: https://roseprimaire.com/
lang: en lang: en
permalink: "rose-primaire" slug: "rose-primaire"
excerpt: Web dev and other things. excerpt: Web dev and other things.
tags: ["Front-end", "accessibility", "sobriety", "CMS"] tags: ["Front-end", "accessibility", "sobriety", "CMS"]
createdAt: "2023-04-19T17:11:00.000Z" createdAt: "2023-04-19T17:11:00.000Z"

View File

@ -3,7 +3,7 @@ title: 3w
subtitle: J'ai fait de la doc! subtitle: J'ai fait de la doc!
url: https://3-w.fr url: https://3-w.fr
lang: fr lang: fr
permalink: "3w" slug: "3w"
excerpt: Développement web et compagnie. excerpt: Développement web et compagnie.
tags: ["Front-end", "documentation"] tags: ["Front-end", "documentation"]
createdAt: "2022-10-19T18:02:00.000Z" createdAt: "2022-10-19T18:02:00.000Z"

View File

@ -3,7 +3,7 @@ title: Nature en Occitanie
subtitle: La sobriété au naturel. subtitle: La sobriété au naturel.
url: https://www.natureo.org/ url: https://www.natureo.org/
lang: fr lang: fr
permalink: "natureo" slug: "natureo"
excerpt: Développement web et compagnie. excerpt: Développement web et compagnie.
tags: ["Front-end", "accessibilité", "éco-conception", "CMS"] tags: ["Front-end", "accessibilité", "éco-conception", "CMS"]
createdAt: "2023-04-19T18:02:00.000Z" createdAt: "2023-04-19T18:02:00.000Z"

View File

@ -3,7 +3,7 @@ title: Parole Expression
subtitle: Un nouveau site pour l'association. subtitle: Un nouveau site pour l'association.
url: https://www.paroleexpression.fr/ url: https://www.paroleexpression.fr/
lang: fr lang: fr
permalink: parole-expression slug: "parole-expression"
excerpt: Développement web et compagnie. excerpt: Développement web et compagnie.
tags: ["Front-end", "éco-conception", "CMS"] tags: ["Front-end", "éco-conception", "CMS"]
createdAt: "2022-04-19T17:11:00.000Z" createdAt: "2022-04-19T17:11:00.000Z"

View File

@ -3,7 +3,7 @@ title: Rose Primaire
subtitle: Une agence comme on l'aime. subtitle: Une agence comme on l'aime.
url: https://roseprimaire.com/ url: https://roseprimaire.com/
lang: fr lang: fr
permalink: "rose-primaire" slug: "rose-primaire"
excerpt: Développement web et compagnie. excerpt: Développement web et compagnie.
tags: ["Front-end", "accessibilité", "éco-conception", "CMS"] tags: ["Front-end", "accessibilité", "éco-conception", "CMS"]
createdAt: "2023-04-19T17:11:00.000Z" createdAt: "2023-04-19T17:11:00.000Z"

View File

@ -2,13 +2,15 @@
type: section type: section
id: offre id: offre
lang: en lang: en
image: /assets/images/home/offre-1.1.svg slug:
createdAt:
image: /assets/images/home/offres.svg
order: 1 order: 1
quickTitle: My offers quickTitle: My offers
quickImage: /assets/images/home/icon-desktop.svg quickImage: /assets/images/home/icon-desktop.svg
--- ---
## Full website offer ## Full website offer.
### Small website, blog, landing page… ### Small website, blog, landing page…
@ -19,7 +21,7 @@ Whether it's a creation or a redesign, I can handle everything:
- hosting and deploying; - hosting and deploying;
- maintenance. - maintenance.
### Bigger websites, e-commerce ### Bigger websites, e-commerce.
When the project is larger, I call on talented partners who share the same values: When the project is larger, I call on talented partners who share the same values:

View File

@ -2,19 +2,21 @@
type: section type: section
id: methodology id: methodology
lang: en lang: en
slug:
createdAt:
image: /assets/images/home/methodo.svg image: /assets/images/home/methodo.svg
order: 2 order: 2
quickTitle: My methodology quickTitle: My methodology
quickImage: /assets/images/home/icon-methodo.svg quickImage: /assets/images/home/icon-methodo.svg
--- ---
## Methodology ## Methodology.
### Accessibility by default ### Accessibility by default.
Committed to a more accessible web, I create **websites** relying on the [french General Accessibility Guidelines (RGAA)](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/) as well as the [Opquast recommandations.](https://www.opquast.com/en/making-the-web-better/) Committed to a more accessible web, I create **websites** relying on the [french General Accessibility Guidelines (RGAA)](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/) as well as the [Opquast recommandations.](https://www.opquast.com/en/making-the-web-better/)
### Sobriety by choice ### Sobriety by choice.
I specialize in the development of **static websites**, adopting an [eco-design](https://en.wikipedia.org/wiki/Ecological_design) approach. I specialize in the development of **static websites**, adopting an [eco-design](https://en.wikipedia.org/wiki/Ecological_design) approach.
It means that the website is designed to only include the necessary functionalities for its use. It means that the website is designed to only include the necessary functionalities for its use.

View File

@ -2,26 +2,28 @@
type: section type: section
id: about id: about
lang: en lang: en
slug:
createdAt:
image: /assets/images/home/about.svg image: /assets/images/home/about.svg
order: 3 order: 3
quickTitle: Me quickTitle: Me
quickImage: /assets/images/home/icon-heart.svg quickImage: /assets/images/home/icon-heart.svg
--- ---
## About ## About.
### Trainings myself ### Trainings myself.
In order to strengthen my skills, I have completed the following training and certifications: In order to strengthen my skills, I have completed the following training and certifications:
- [Opquast](https://directory.opquast.com/en/certificat/CTQSKP/) - Mastering Web Quality Assurance; - [Opquast](https://directory.opquast.com/en/certificat/CTQSKP/) - Mastering Web Quality Assurance;
- Access42 - Developing and coding accessible websites (cert number: 696fa2e0-cc67-11ec-88d2-9dabf3f992d4). - Access42 - Developing and coding accessible websites (cert number: 696fa2e0-cc67-11ec-88d2-9dabf3f992d4).
### Trainings others ### Trainings others.
For several years, I have been teaching web development courses on various campuses. For several years, I have been teaching web development courses on various campuses.
### Free time ### Free time.
I try to contribute to [open source projects](https://git.nardu.in/explore/repos) that I enjoy. I try to contribute to [open source projects](https://git.nardu.in/explore/repos) that I enjoy.

View File

@ -0,0 +1,31 @@
---
type: section
id: offre
lang: fr
slug:
createdAt:
image: /assets/images/home/offres.svg
order: 1
quickTitle: Mes offres en freelance
quickImage: /assets/images/home/icon-desktop.svg
---
## Offres site web.
### Petit site vitrine, blog, landing page.
Qu'il s'agisse d'une création ou d'une refonte, je m'occupe de tout&nbsp;:
- développement sur-mesure&nbsp;;
- configuration d'un outil de gestion des contenus (si pertinent)&nbsp;;
- hébergement et mise en ligne&nbsp;;
- maintenance.
### Plus gros site, e-commerce.
Lorsque le projet est plus volumineux, je fais appel à des partenaires talentueux partageant les mêmes valeurs&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.
[Consultez quelques références ici&nbsp;!](/references/)

View File

@ -1,19 +0,0 @@
---
type: section
id: offre
lang: fr
createdAt:
image: /assets/images/home/offre-1.1.svg
order: 1
quickTitle: Mes offres en freelance
quickImage: /assets/images/home/icon-desktop.svg
reference: parole-expression
---
## L'offre site web classique
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.
<!-- <a href="/offres/web-classique" class="btn">L'offre classique en détails</a> -->

View File

@ -1,17 +0,0 @@
---
type: section
lang: fr
image: /assets/images/home/offre-1.2.svg
reference: rose-primaire
---
## L'offre accessibilité avancée
Cette offre s'adresse plus spécifiquement aux entités pour lesquelles **l'accessibilité du site est un critère majeur.** Qu'il s'agisse d'une création ou d'une mise en conformité après un audit d'accessibilité.
Lorsque le projet le nécessite, je fais appel à des partenaires talentueux partageant les mêmes valeurs&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.
<!-- <a href="/offres/accessibilite" class="btn">L'offre accessibilité en détails</a> -->

View File

@ -1,9 +0,0 @@
---
type: section
lang: fr
image: /assets/images/home/offre-1.3.svg
---
## Et l'éco-conception alors&nbsp;?
Je ne conçois pas l'éco-conception comme une offre. C'est plutôt une façon de travailler, voire même une vision de mon métier. On fait rarement de l'éco-conception sans accessibilité, j'applique donc ces méthodologies quelque soit le projet&nbsp;!

View File

@ -10,13 +10,13 @@ quickTitle: Ma méthodologie
quickImage: /assets/images/home/icon-methodo.svg quickImage: /assets/images/home/icon-methodo.svg
--- ---
## Méthodologie ## Méthodologie.
### Accessibilité par défaut ### Accessibilité par défaut.
Engagé pour un web plus accessible, je crée des **sites web** en m'appuyant sur le [référentiel général d'amélioration de l'accessibilité (RGAA)](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/) ainsi que sur les bonnes pratiques [Opquast.](https://www.opquast.com/rendre-le-web-meilleur/) Engagé pour un web plus accessible, je crée des **sites web** en m'appuyant sur le [référentiel général d'amélioration de l'accessibilité (RGAA)](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/) ainsi que sur les bonnes pratiques [Opquast.](https://www.opquast.com/rendre-le-web-meilleur/)
### Sobriété par choix ### Sobriété par choix.
Je privilégie le développement de **sites statiques** en adoptant une approche [d'éco-conception numérique.](https://eco-conception.designersethiques.org/guide/fr/) Je privilégie le développement de **sites statiques** en adoptant une approche [d'éco-conception numérique.](https://eco-conception.designersethiques.org/guide/fr/)
C'est-à-dire que le site est pensé pour n'embarquer que les fonctionnalités nécessaires à son utilisation. C'est-à-dire que le site est pensé pour n'embarquer que les fonctionnalités nécessaires à son utilisation.

View File

@ -10,20 +10,20 @@ quickTitle: Moi
quickImage: /assets/images/home/icon-heart.svg quickImage: /assets/images/home/icon-heart.svg
--- ---
## À propos ## À propos.
### Formations personnelles ### Formations personnelles.
Afin de solidifier mes compétences, j'ai suivi les formations et passé les certifications suivantes&nbsp;: Afin de solidifier mes compétences, j'ai suivi les formations et passé les certifications suivantes&nbsp;:
- [Opquast](https://directory.opquast.com/fr/certificat/CTQSKP/) - Maîtrise de la qualité en projet web&nbsp;; - [Opquast](https://directory.opquast.com/fr/certificat/CTQSKP/) - Maîtrise de la qualité en projet web&nbsp;;
- Access42 - Développer et coder des sites accessibles (certificat numéro&nbsp;: 696fa2e0-cc67-11ec-88d2-9dabf3f992d4). - Access42 - Développer et coder des sites accessibles (certificat numéro&nbsp;: 696fa2e0-cc67-11ec-88d2-9dabf3f992d4).
### Formations des autres ### Formations des autres.
Depuis plusieurs années, j'interviens dans différents campus afin de dispenser des cours de développement web. Depuis plusieurs années, j'interviens dans différents campus afin de dispenser des cours de développement web.
### Temps libre ### Temps libre.
Jessaie de contribuer à des [projets open source](https://git.nardu.in/explore/repos) qui me tiennent à cœur et je m'engage localement avec le collectif [good-it!](https://www.good-it.org/) Jessaie de contribuer à des [projets open source](https://git.nardu.in/explore/repos) qui me tiennent à cœur et je m'engage localement avec le collectif [good-it!](https://www.good-it.org/)

2
src/env.d.ts vendored
View File

@ -1,4 +1,4 @@
/// <reference path="../.astro/types.d.ts" /> /// <reference path="../.astro/types.d.ts" />
/// <reference types="astro/client" /> /// <reference types="@astrojs/image/client" />
/// <reference path="../.astro-i18n/generated.d.ts" /> /// <reference path="../.astro-i18n/generated.d.ts" />

Binary file not shown.

Binary file not shown.

View File

@ -1,18 +1,27 @@
--- ---
import { astroI18n } from "astro-i18n"; import { t, astroI18n } from "astro-i18n";
astroI18n.init(Astro); astroI18n.init(Astro);
import "../styles/style.css"; import "../styles/style.css";
import Head from "../components/Head.astro";
import Header from "../components/Header.astro"; import Header from "../components/Header.astro";
import Footer from "../components/Footer.astro"; import Footer from "../components/Footer.astro";
const { pageTitle } = Astro.props; const { pageTitle, titleColor } = Astro.props;
--- ---
<html lang={astroI18n.langCode} dir="ltr"> <html lang={astroI18n.langCode} dir="ltr">
<Head pageTitle={pageTitle} /> <head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{pageTitle} - Nicolas Arduin</title>
<meta name="description" content={t("seo.meta.description")} />
<meta name="robots" content="index,follow." />
<meta name="author" content="Nicolas Arduin" />
<meta name="subject" content="Développement de sites web, accessibilité." />
</head>
<body> <body>
<div class="wrapper"> <div class="wrapper">
<Header /> <Header />

View File

@ -1,5 +1,6 @@
--- ---
import { createStaticPaths } from "astro-i18n"; import { astroI18n, createStaticPaths } from "astro-i18n";
// astroI18n.init(Astro);
import { getCollection } from "astro:content"; import { getCollection } from "astro:content";
@ -11,7 +12,7 @@ export const getStaticPaths = createStaticPaths(async ({ langCode }) => {
return data.lang === langCode; return data.lang === langCode;
}); });
return articles.map((article) => ({ return articles.map((article) => ({
params: { slug: article.data.permalink }, params: { slug: article.slug },
props: { article }, props: { article },
})); }));
}, import.meta.url); }, import.meta.url);
@ -27,8 +28,11 @@ export const getStaticPaths = createStaticPaths(async ({ langCode }) => {
// } // }
const { article } = Astro.props; const { article } = Astro.props;
// article is ok in logs but not diaplyed properly on the actual page
console.log(article);
--- ---
<BaseLayout pageTitle={article.data.title}> <BaseLayout pageTitle={article.data.title}>
{article.data.lang}
<EditorialContent content={article} /> <EditorialContent content={article} />
</BaseLayout> </BaseLayout>

View File

@ -26,7 +26,7 @@ export async function get(context) {
lang: post.data.lang, lang: post.data.lang,
// Compute RSS link from post `slug` // Compute RSS link from post `slug`
// This example assumes all posts are rendered as `/blog/[slug]` routes // This example assumes all posts are rendered as `/blog/[slug]` routes
link: `/en/${post.data.type}/${post.data.permalink}/`, link: `/en/${post.data.type}/${post.slug}/`,
})), })),
// (optional) inject custom xml // (optional) inject custom xml
customData: `<language>en-us</language>`, customData: `<language>en-us</language>`,

View File

@ -1,30 +1,21 @@
--- ---
import { createStaticPaths } from "astro-i18n"; import { l, t, astroI18n } from "astro-i18n";
astroI18n.init(Astro);
import { getCollection } from "astro:content"; import { getCollection } from "astro:content";
import EditorialContent from "../../components/EditorialContent.astro"; import EditorialContent from "../../components/EditorialContent.astro";
import BaseLayout from "../../layouts/BaseLayout.astro"; import BaseLayout from "../../layouts/BaseLayout.astro";
export const getStaticPaths = createStaticPaths(async ({ langCode }) => { export async function getStaticPaths() {
const snippets = await getCollection("fragments", ({ data }) => { const snippets = await getCollection("fragments", ({ data }) => {
return data.lang === langCode; return data.lang === astroI18n.langCode;
}); });
return snippets.map((snippet) => ({ return snippets.map((snippet) => ({
params: { slug: snippet.data.permalink }, params: { slug: snippet.slug },
props: { snippet }, props: { snippet },
})); }));
}, import.meta.url); }
// export async function getStaticPaths() {
// const snippets = await getCollection("fragments", ({ data }) => {
// return data.lang === astroI18n.langCode;
// });
// return snippets.map((snippet) => ({
// params: { slug: snippet.slug },
// props: { snippet },
// }));
// }
const { snippet } = Astro.props; const { snippet } = Astro.props;
--- ---

View File

@ -35,9 +35,6 @@ const localizedSnippets = await getCollection("fragments", ({ data }) => {
const sortedSnippets = localizedSnippets.sort( const sortedSnippets = localizedSnippets.sort(
(a, b) => b.data.createdAt - a.data.createdAt (a, b) => b.data.createdAt - a.data.createdAt
); );
const localizedReferences = await getCollection("references", ({ data }) => {
return data.lang === astroI18n.langCode && !data.draft;
});
--- ---
<BaseLayout pageTitle={pageTitle}> <BaseLayout pageTitle={pageTitle}>
@ -47,14 +44,11 @@ const localizedReferences = await getCollection("references", ({ data }) => {
<h2 class="intro__subtitle">{t("index.subtitle")}</h2> <h2 class="intro__subtitle">{t("index.subtitle")}</h2>
<ul class="quick-access__list" role="list"> <ul class="quick-access__list" role="list">
{ {
localizedSections.map( localizedSections.map((section) => (
(section) => <li>
section.frontmatter.id && ( <QuickAccessCard item={section.frontmatter} />
<li> </li>
<QuickAccessCard item={section.frontmatter} /> ))
</li>
)
)
} }
</ul> </ul>
</section> </section>
@ -66,16 +60,6 @@ const localizedReferences = await getCollection("references", ({ data }) => {
<div class="section__container"> <div class="section__container">
<div class="flow section__content"> <div class="flow section__content">
<section.Content /> <section.Content />
{section.frontmatter.reference && (
<div class="section__reference">
<ListCards
list={localizedReferences.filter((ref) => {
return ref.data.permalink === section.frontmatter.reference;
})}
routeName={t("references.slug")}
/>
</div>
)}
</div> </div>
<div class="section__image"> <div class="section__image">
<img <img
@ -165,7 +149,6 @@ const localizedReferences = await getCollection("references", ({ data }) => {
/* SECTIONS */ /* SECTIONS */
.section { .section {
--region-space: var(--space-l-3xl);
container-name: section; container-name: section;
container-type: inline-size; container-type: inline-size;
} }
@ -173,7 +156,7 @@ const localizedReferences = await getCollection("references", ({ data }) => {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
gap: var(--space-m-xl); gap: var(--space-m-l);
} }
.section :global(h2) { .section :global(h2) {
@ -194,33 +177,20 @@ const localizedReferences = await getCollection("references", ({ data }) => {
@container section (min-width: 50rem) { @container section (min-width: 50rem) {
.section__container { .section__container {
position: relative;
flex-direction: row; flex-direction: row;
align-items: flex-start; align-items: flex-start;
} }
.section__image { .section__image {
order: 1; order: 1;
position: sticky; position: sticky;
top: var(--space-3xl); top: 20px;
flex-grow: 1; flex-grow: 1;
flex-basis: 18rem; flex-basis: 18rem;
} }
.section__content { .section__content {
order: 2; order: 2;
flex-basis: 0; flex-basis: 0;
min-inline-size: 32ch; min-inline-size: 40ch;
font-size: var(--size-1);
}
.section__content :global(h2) {
font-size: var(--size-5);
line-height: 1.2;
}
.section__reference {
margin-block-start: 50vh;
padding-block-end: var(--space-3xl);
}
.section__reference :global(.card a) {
font-size: var(--size-0);
} }
} }
</style> </style>

View File

@ -26,7 +26,7 @@ export async function get(context) {
lang: post.data.lang, lang: post.data.lang,
// Compute RSS link from post `slug` // Compute RSS link from post `slug`
// This example assumes all posts are rendered as `/blog/[slug]` routes // This example assumes all posts are rendered as `/blog/[slug]` routes
link: `/${post.data.type}/${post.data.permalink}/`, link: `/${post.data.type}/${post.slug}/`,
})), })),
// (optional) inject custom xml // (optional) inject custom xml
customData: `<language>fr-fr</language>`, customData: `<language>fr-fr</language>`,

View File

@ -19,6 +19,13 @@
font-style: normal; font-style: normal;
font-display: swap; font-display: swap;
} }
@font-face {
font-family: "recoleta";
src: url("../../fonts/recoleta/Recoleta-SemiBold.woff2") format("woff2");
font-weight: 600;
font-style: normal;
font-display: swap;
}
/* /*
* reduces Cumulative Layout Shift * reduces Cumulative Layout Shift

View File

@ -14,7 +14,7 @@
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.5; line-height: 1.4;
color: var(--color-dark); color: var(--color-dark);
background-color: var(--color-light-white); background-color: var(--color-light-white);
accent-color: var(--color-brique); accent-color: var(--color-brique);
@ -23,30 +23,34 @@ body {
main { main {
min-block-size: 100vh; min-block-size: 100vh;
} }
:where(h1, h2, h3, h4, .h2, .h3, .h4) { :where(h1, h2, h3, .h2, .h3) {
font-weight: bold; font-family: var(--font-secondary);
} }
:where(h1) { :where(h1) {
max-inline-size: 20ch; max-inline-size: 20ch;
font-size: var(--size-6); font-size: var(--size-6);
font-weight: bold;
color: var(--color-dark-blue); color: var(--color-dark-blue);
} }
h2, h2,
.h2 { .h2 {
font-size: var(--size-4); font-size: var(--size-4);
font-weight: bold;
} }
h3, h3,
.h3 { .h3 {
max-inline-size: initial; max-inline-size: initial;
font-size: var(--size-2); font-size: var(--size-2);
font-weight: bold;
letter-spacing: 0.05rem; letter-spacing: 0.05rem;
} }
h4, h4,
.h4 { .h4 {
font-size: var(--size-2); font-size: var(--size-2);
font-weight: bold;
color: var(--color-dark); color: var(--color-dark);
} }
@ -61,9 +65,9 @@ a {
color: var(--color-blue); color: var(--color-blue);
text-decoration: underline; text-decoration: underline;
} }
/* a:visited { a:visited {
color: currentColor; color: currentColor;
} */ }
a:hover, a:hover,
a:focus { a:focus {
text-decoration: none; text-decoration: none;
@ -107,23 +111,37 @@ ol:not([role="list"]) > li + li {
background: none; background: none;
} }
.btn { .btn {
padding: var(--space-2xs) var(--space-xs); padding: var(--space-xs) var(--space-s);
margin-block: var(--space-s); margin-block: var(--space-s);
display: inline-block; display: inline-block;
font-size: var(--size-0); font-size: var(--size--1);
font-weight: bold; font-weight: bold;
text-decoration: none; text-decoration: none;
border: 2px solid var(--color-blue); border: 2px solid var(--color-red);
border-radius: var(--radius-small); border-radius: 14px;
color: var(--color-white); color: var(--color-red);
background-color: var(--color-blue); background-color: transparent;
transition-property: color, background-color; transition-property: color, background-color;
transition-duration: 0.3s; transition-duration: 0.2s;
transition-timing-function: ease; transition-timing-function: ease-in-out;
} }
.btn:hover, .btn:hover {
.btn:focus { color: var(--color-light);
color: var(--color-blue); background-color: var(--color-red);
}
.reset-button {
padding: var(--space-3xs) var(--space-2xs);
/* margin-inline-start: auto; */
font-size: var(--size--1);
color: var(--color-light);
border: 1px solid transparent;
background-color: var(--color-dark);
border-radius: var(--radius);
}
.reset-button:not([disabled]):hover {
color: var(--color-dark);
border: 1px solid var(--color-dark);
background-color: var(--color-white); background-color: var(--color-white);
} }
@ -141,7 +159,7 @@ button[disabled] {
/* clean style link */ /* clean style link */
.clean-link { .clean-link {
text-decoration: none; text-decoration: none;
font-weight: inherit; font-weight: normal;
color: currentColor; color: currentColor;
} }
.clean-link:hover { .clean-link:hover {
@ -225,3 +243,11 @@ blockquote code {
.content pre[class*="language-"] { .content pre[class*="language-"] {
white-space: pre-wrap; white-space: pre-wrap;
} }
/* .astro-code .filename {
margin: 0.5rem 0;
display: block;
font-family: var(--font-code);
font-size: 1.4rem;
text-align: right;
} */

View File

@ -123,17 +123,7 @@ a:not([class]) {
} }
/* Make it clear that interactive elements are interactive */ /* Make it clear that interactive elements are interactive */
:where( :where(a[href], area, button, input, label[for], select, summary, textarea, [tabindex]:not([tabindex*="-"])) {
a[href],
area,
button,
input,
label[for],
select,
summary,
textarea,
[tabindex]:not([tabindex*="-"])
) {
cursor: pointer; cursor: pointer;
touch-action: manipulation; touch-action: manipulation;
} }
@ -155,17 +145,11 @@ a:not([class]) {
} }
} }
:where(:not(:active)):focus-visible { :where(:not(:active)):focus-visible {
outline-offset: 2px; outline-offset: 5px;
} }
/* Make sure users can't select button text */ /* Make sure users can't select button text */
:where( :where(button, button[type], input[type="button"], input[type="submit"], input[type="reset"]),
button,
button[type],
input[type="button"],
input[type="submit"],
input[type="reset"]
),
:where(input[type="file"])::-webkit-file-upload-button, :where(input[type="file"])::-webkit-file-upload-button,
:where(input[type="file"])::file-selector-button { :where(input[type="file"])::file-selector-button {
-webkit-tap-highlight-color: transparent; -webkit-tap-highlight-color: transparent;
@ -175,13 +159,7 @@ a:not([class]) {
} }
/* Disabled cursor for disabled buttons */ /* Disabled cursor for disabled buttons */
:where( :where(button, button[type], input[type="button"], input[type="submit"], input[type="reset"])[disabled] {
button,
button[type],
input[type="button"],
input[type="submit"],
input[type="reset"]
)[disabled] {
cursor: not-allowed; cursor: not-allowed;
} }

View File

@ -1,9 +1,7 @@
/* VARIABLES */ /* VARIABLES */
:root { :root {
/* font sizes /* font sizes */
https://utopia.fyi/type/calculator?c=320,18,1.2,1040,20,1.25,5,2,&s=0.75%7C0.5%7C0.25,1.5%7C2%7C3%7C4%7C6,m-xl&g=s,l,xl,12
*/
--size--1: clamp(0.94rem, calc(0.91rem + 0.14vw), 1rem); --size--1: clamp(0.94rem, calc(0.91rem + 0.14vw), 1rem);
--size-0: clamp(1.13rem, calc(1.07rem + 0.28vw), 1.25rem); --size-0: clamp(1.13rem, calc(1.07rem + 0.28vw), 1.25rem);
--size-1: clamp(1.35rem, calc(1.26rem + 0.47vw), 1.56rem); --size-1: clamp(1.35rem, calc(1.26rem + 0.47vw), 1.56rem);
@ -15,9 +13,7 @@
--size-7: clamp(4.03rem, calc(3.17rem + 4.29vw), 5.96rem); --size-7: clamp(4.03rem, calc(3.17rem + 4.29vw), 5.96rem);
--size-8: clamp(4.84rem, calc(3.68rem + 5.81vw), 7.45rem); --size-8: clamp(4.84rem, calc(3.68rem + 5.81vw), 7.45rem);
/* spaces /* spaces */
https://utopia.fyi/space/calculator?c=320,18,1.2,1040,20,1.25,5,2,&s=0.75|0.5|0.25,1.5|2|3|4|6,m-xl&g=s,l,xl,12
*/
--space-3xs: clamp(0.31rem, calc(0.31rem + 0vw), 0.31rem); --space-3xs: clamp(0.31rem, calc(0.31rem + 0vw), 0.31rem);
--space-2xs: clamp(0.56rem, calc(0.53rem + 0.14vw), 0.63rem); --space-2xs: clamp(0.56rem, calc(0.53rem + 0.14vw), 0.63rem);
--space-xs: clamp(0.88rem, calc(0.85rem + 0.14vw), 0.94rem); --space-xs: clamp(0.88rem, calc(0.85rem + 0.14vw), 0.94rem);
@ -46,9 +42,7 @@
--space-xs-l: clamp(0.88rem, calc(0.15rem + 3.61vw), 2.5rem); --space-xs-l: clamp(0.88rem, calc(0.15rem + 3.61vw), 2.5rem);
--space-s-l: clamp(1.13rem, calc(0.51rem + 3.06vw), 2.5rem); --space-s-l: clamp(1.13rem, calc(0.51rem + 3.06vw), 2.5rem);
--space-s-xl: clamp(1.13rem, calc(-0.04rem + 5.83vw), 3.75rem); --space-s-xl: clamp(1.13rem, calc(-0.04rem + 5.83vw), 3.75rem);
--space-m-xl: clamp(1.69rem, calc(0.77rem + 4.58vw), 3.75rem);
--space-l-2xl: clamp(2.25rem, calc(1.03rem + 6.11vw), 5rem); --space-l-2xl: clamp(2.25rem, calc(1.03rem + 6.11vw), 5rem);
--space-l-3xl: clamp(2.25rem, calc(-0.08rem + 11.67vw), 7.5rem);
/* fonts */ /* fonts */
--font-primary: "wotfard", "ArialReplace", sans-serif; --font-primary: "wotfard", "ArialReplace", sans-serif;

View File

@ -1,6 +1,5 @@
code[class*="language-"], code[class*="language-"],
pre[class*="language-"], pre[class*="language-"] {
:not(pre) > code {
color: #abb2bf; color: #abb2bf;
background: none; background: none;
font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;
@ -34,13 +33,10 @@ pre[class*="language-"] {
pre[class*="language-"] { pre[class*="language-"] {
background: #282c34; background: #282c34;
} }
:not(pre) > code[class*="language-"], :not(pre) > code[class*="language-"] {
:not(pre) > code { padding: 0.1em;
padding: 0.2em;
white-space: normal;
color: var(--color-dark);
border-radius: 0.3em; border-radius: 0.3em;
background-color: var(--color-light-grey); white-space: normal;
} }
pre[class*="language-"]::selection, pre[class*="language-"]::selection,
pre[class*="language-"] ::selection, pre[class*="language-"] ::selection,