Compare commits
2 Commits
ff0ba456a9
...
3d00b4d3cb
Author | SHA1 | Date | |
---|---|---|---|
|
3d00b4d3cb | ||
|
b602b45c05 |
16
.astro-i18n/generated.d.ts
vendored
16
.astro-i18n/generated.d.ts
vendored
@ -1,19 +1,21 @@
|
|||||||
type DefaultLangCode = "fr"
|
type DefaultLangCode = "fr"
|
||||||
type SupportedLangCode = "en"
|
type SupportedLangCode = "en"
|
||||||
type LangCode = DefaultLangCode | SupportedLangCode
|
type LangCode = DefaultLangCode | SupportedLangCode
|
||||||
type RouteUri = | "/articles/[slug]" | "/articles" | "/agments/[slug]" | "/agments" | "/references" | "/" | "/plan-du-site"
|
type RouteUri = | "/articles/[slug]" | "/articles" | "/agments/[slug]" | "/agments" | "/references" | "/veille" | "/" | "/plan-du-site"
|
||||||
type RouteParams = {"/articles/[slug]": { "slug": string; }; "/articles": undefined; "/agments/[slug]": { "slug": string; }; "/agments": undefined; "/references": undefined; "/": undefined; "/plan-du-site": undefined; }
|
type RouteParams = {"/articles/[slug]": { "slug": string; }; "/articles": undefined; "/agments/[slug]": { "slug": string; }; "/agments": undefined; "/references": undefined; "/veille": undefined; "/": undefined; "/plan-du-site": undefined; }
|
||||||
type TranslationPath = "accueil" | "tagline" | "copyright" | "contact.title" | "contact.email" | "contact.tel" | "contenuVide" | "header.skipLink" | "header.mainNav" | "header.homeLink" | "sitemap" | "prevNext.contenus" | "prevNext.precedent" | "prevNext.suivant" | "article.titre" | "article.tagline" | "article.published" | "meta.publication" | "meta.modification" | "meta.credit" | "fragments.titre" | "fragments.tagline" | "references.titre" | "references.slug" | "references.cta" | "references.tagline" | "erreur.introuvable" | "erreur.autre" | "erreur.lienRetour" | "seo.article.title" | "seo.article.description" | "seo.code.title" | "seo.code.description" | "seo.references.title" | "seo.references.description" | "index.articles.pageName" | "index.articles.subtitle" | "index.fragments.pageName" | "index.fragments.subtitle" | "index.references.pageName" | "index.references.subtitle" | "index.title" | "index.subtitle" | "index.quoi" | "index.comment" | "index.opensource" | "index.writing" | "index.latestProjects" | "index.latestArticles" | "index.allProjects" | "index.allArticles" | "index.latestSnippets" | "index.allSnippets" | "index.toc" | "contact.contenuVide"
|
type TranslationPath = "accueil" | "tagline" | "copyright" | "contact.title" | "contact.email" | "contact.tel" | "contenuVide" | "header.skipLink" | "header.mainNav" | "header.homeLink" | "sitemap" | "prevNext.contenus" | "prevNext.precedent" | "prevNext.suivant" | "article.titre" | "article.tagline" | "article.published" | "meta.publication" | "meta.modification" | "meta.credit" | "fragments.titre" | "fragments.tagline" | "references.titre" | "references.slug" | "references.cta" | "references.tagline" | "veille.titre" | "veille.tagline" | "erreur.introuvable" | "erreur.autre" | "erreur.lienRetour" | "seo.meta.description" | "seo.article.title" | "seo.article.description" | "seo.code.title" | "seo.code.description" | "seo.references.title" | "seo.references.description" | "index.articles.pageName" | "index.articles.subtitle" | "index.fragments.pageName" | "index.fragments.subtitle" | "index.references.pageName" | "index.references.subtitle" | "index.veille.pageName" | "index.veille.subtitle" | "index.title" | "index.subtitle" | "index.quoi" | "index.comment" | "index.opensource" | "index.writing" | "index.latestProjects" | "index.latestArticles" | "index.allProjects" | "index.allArticles" | "index.latestSnippets" | "index.allSnippets" | "index.toc" | "contact.contenuVide"
|
||||||
type TranslationOptions = { "accueil": {} | undefined; "tagline": {} | undefined; "copyright": {} | undefined; "contact.title": {} | undefined; "contact.email": {} | undefined; "contact.tel": {} | undefined; "contenuVide": {} | undefined; "header.skipLink": {} | undefined; "header.mainNav": {} | undefined; "header.homeLink": {} | undefined; "sitemap": {} | undefined; "prevNext.contenus": {} | undefined; "prevNext.precedent": {} | undefined; "prevNext.suivant": {} | undefined; "article.titre": {} | undefined; "article.tagline": {} | undefined; "article.published": { datetime: unknown; options: unknown; }; "meta.publication": {} | undefined; "meta.modification": {} | undefined; "meta.credit": {} | undefined; "fragments.titre": {} | undefined; "fragments.tagline": {} | undefined; "references.titre": {} | undefined; "references.slug": {} | undefined; "references.cta": {} | undefined; "references.tagline": {} | undefined; "erreur.introuvable": {} | undefined; "erreur.autre": {} | undefined; "erreur.lienRetour": {} | undefined; "seo.article.title": {} | undefined; "seo.article.description": {} | undefined; "seo.code.title": {} | undefined; "seo.code.description": {} | undefined; "seo.references.title": {} | undefined; "seo.references.description": {} | undefined; "index.articles.pageName": {} | undefined; "index.articles.subtitle": {} | undefined; "index.fragments.pageName": {} | undefined; "index.fragments.subtitle": {} | undefined; "index.references.pageName": {} | undefined; "index.references.subtitle": {} | undefined; "index.title": {} | undefined; "index.subtitle": {} | undefined; "index.quoi": {} | undefined; "index.comment": {} | undefined; "index.opensource": {} | undefined; "index.writing": {} | undefined; "index.latestProjects": {} | undefined; "index.latestArticles": {} | undefined; "index.allProjects": {} | undefined; "index.allArticles": {} | undefined; "index.latestSnippets": {} | undefined; "index.allSnippets": {} | undefined; "index.toc": {} | undefined; "contact.contenuVide": {} | undefined; }
|
type TranslationOptions = { "accueil": {} | undefined; "tagline": {} | undefined; "copyright": {} | undefined; "contact.title": {} | undefined; "contact.email": {} | undefined; "contact.tel": {} | undefined; "contenuVide": {} | undefined; "header.skipLink": {} | undefined; "header.mainNav": {} | undefined; "header.homeLink": {} | undefined; "sitemap": {} | undefined; "prevNext.contenus": {} | undefined; "prevNext.precedent": {} | undefined; "prevNext.suivant": {} | undefined; "article.titre": {} | undefined; "article.tagline": {} | undefined; "article.published": { datetime: unknown; options: unknown; }; "meta.publication": {} | undefined; "meta.modification": {} | undefined; "meta.credit": {} | undefined; "fragments.titre": {} | undefined; "fragments.tagline": {} | undefined; "references.titre": {} | undefined; "references.slug": {} | undefined; "references.cta": {} | undefined; "references.tagline": {} | undefined; "veille.titre": {} | undefined; "veille.tagline": {} | undefined; "erreur.introuvable": {} | undefined; "erreur.autre": {} | undefined; "erreur.lienRetour": {} | undefined; "seo.meta.description": {} | undefined; "seo.article.title": {} | undefined; "seo.article.description": {} | undefined; "seo.code.title": {} | undefined; "seo.code.description": {} | undefined; "seo.references.title": {} | undefined; "seo.references.description": {} | undefined; "index.articles.pageName": {} | undefined; "index.articles.subtitle": {} | undefined; "index.fragments.pageName": {} | undefined; "index.fragments.subtitle": {} | undefined; "index.references.pageName": {} | undefined; "index.references.subtitle": {} | undefined; "index.veille.pageName": {} | undefined; "index.veille.subtitle": {} | undefined; "index.title": {} | undefined; "index.subtitle": {} | undefined; "index.quoi": {} | undefined; "index.comment": {} | undefined; "index.opensource": {} | undefined; "index.writing": {} | undefined; "index.latestProjects": {} | undefined; "index.latestArticles": {} | undefined; "index.allProjects": {} | undefined; "index.allArticles": {} | undefined; "index.latestSnippets": {} | undefined; "index.allSnippets": {} | undefined; "index.toc": {} | undefined; "contact.contenuVide": {} | undefined; }
|
||||||
|
|
||||||
declare module "astro-i18n" {
|
declare module "astro-i18n" {
|
||||||
export * from "astro-i18n/"
|
export * from "astro-i18n/"
|
||||||
|
|
||||||
export function l<Uri extends RouteUri>(
|
export function l<Uri extends RouteUri>(
|
||||||
route: Uri | string & {},
|
route: Uri | string & {},
|
||||||
...args: keyof RouteParams extends Uri
|
...args: Uri extends keyof RouteParams
|
||||||
? [params?: Record<string, string>, targetLangCode?: LangCode, routeLangCode?: LangCode]
|
? undefined extends RouteParams[Uri]
|
||||||
: [params: RouteParams[Uri], targetLangCode?: LangCode, routeLangCode?: LangCode]
|
? [params?: Record<string, string>, targetLangCode?: LangCode, routeLangCode?: LangCode]
|
||||||
|
: [params: RouteParams[Uri], targetLangCode?: LangCode, routeLangCode?: LangCode]
|
||||||
|
: [params?: Record<string, string>, targetLangCode?: LangCode, routeLangCode?: LangCode]
|
||||||
): string
|
): string
|
||||||
|
|
||||||
export function t<Path extends TranslationPath>(
|
export function t<Path extends TranslationPath>(
|
||||||
|
14
package.json
14
package.json
@ -13,17 +13,15 @@
|
|||||||
"i18n:sync": "astro-i18n sync"
|
"i18n:sync": "astro-i18n sync"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/image": "^0.16.6",
|
"@astrojs/image": "^0.16.7",
|
||||||
"@astrojs/mdx": "^0.19.0",
|
"@astrojs/mdx": "^0.19.1",
|
||||||
"@astrojs/sitemap": "^1.2.2",
|
"@astrojs/rss": "^2.4.1",
|
||||||
"astro": "2.3.0",
|
"@astrojs/sitemap": "^1.3.0",
|
||||||
"astro-i18n": "^1.6.9"
|
"astro": "2.4.3",
|
||||||
|
"astro-i18n": "^1.6.10"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"autoprefixer": "^10.4.13",
|
"autoprefixer": "^10.4.13",
|
||||||
"postcss": "^8.4.20"
|
"postcss": "^8.4.20"
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": "16.19.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1704
pnpm-lock.yaml
1704
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
@ -15,6 +15,7 @@ import { l, t } from "astro-i18n";
|
|||||||
<li>
|
<li>
|
||||||
<a href="tel:+33749464239" title={t("contact.tel")}>+337 49 46 42 39</a>
|
<a href="tel:+33749464239" title={t("contact.tel")}>+337 49 46 42 39</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href={l("/veille")}>{t("veille.titre")}</a></li>
|
||||||
<li><a href={l("/plan-du-site")}>{t("sitemap")}</a></li>
|
<li><a href={l("/plan-du-site")}>{t("sitemap")}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
|
@ -17,21 +17,38 @@ function rawDate(date) {
|
|||||||
---
|
---
|
||||||
|
|
||||||
<div class="meta">
|
<div class="meta">
|
||||||
<p class="meta__date">
|
{
|
||||||
{t("meta.publication")} :
|
!!item.createdAt && (
|
||||||
<time datetime={rawDate(item.createdAt)}>{formatDate(item.createdAt)}</time>
|
<p class="meta__date">
|
||||||
</p>
|
{t("meta.publication")} :
|
||||||
|
<time datetime={rawDate(item.createdAt)}>
|
||||||
|
{formatDate(item.createdAt)}
|
||||||
|
</time>
|
||||||
|
</p>
|
||||||
|
)
|
||||||
|
}
|
||||||
{
|
{
|
||||||
formatDate(item.createdAt) != formatDate(item.updatedAt) &&
|
formatDate(item.createdAt) != formatDate(item.updatedAt) &&
|
||||||
|
!!item.createdAt &&
|
||||||
!!item.updatedAt && (
|
!!item.updatedAt && (
|
||||||
<p class="meta__date">
|
<p class="meta__date">
|
||||||
{t("meta.modification")} :
|
{t("meta.modification")} :
|
||||||
<time datetime={rawDate(item.createdAt)}>
|
<time datetime={rawDate(item.updatedAt)}>
|
||||||
{formatDate(item.updatedAt)}
|
{formatDate(item.updatedAt)}
|
||||||
</time>
|
</time>
|
||||||
</p>
|
</p>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
!item.createdAt && !!item.updatedAt && (
|
||||||
|
<p class="meta__date">
|
||||||
|
{t("meta.modification")} :
|
||||||
|
<time datetime={rawDate(item.updatedAt)}>
|
||||||
|
{formatDate(item.updatedAt)}
|
||||||
|
</time>
|
||||||
|
</p>
|
||||||
|
)
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
@ -5,6 +5,7 @@ lang: en
|
|||||||
slug: "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
|
||||||
createdAt: "2022-06-08T14:24:06.000Z"
|
createdAt: "2022-06-08T14:24:06.000Z"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ lang: en
|
|||||||
slug: "2023"
|
slug: "2023"
|
||||||
excerpt: New changes.
|
excerpt: New changes.
|
||||||
tags: ["Freelance"]
|
tags: ["Freelance"]
|
||||||
|
type: articles
|
||||||
createdAt: "2023-02-03T17:41:00.000Z"
|
createdAt: "2023-02-03T17:41:00.000Z"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ lang: en
|
|||||||
slug: "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
|
||||||
createdAt: "2019-04-24T09:00:00.000Z"
|
createdAt: "2019-04-24T09:00:00.000Z"
|
||||||
code: true
|
code: true
|
||||||
---
|
---
|
||||||
|
@ -6,6 +6,7 @@ slug: "faq"
|
|||||||
draft: true
|
draft: true
|
||||||
excerpt: Why, how et and especially what.
|
excerpt: Why, how et and especially what.
|
||||||
tags: ["Freelance"]
|
tags: ["Freelance"]
|
||||||
|
type: articles
|
||||||
createdAt: "2022-06-22T15:34:45.000Z"
|
createdAt: "2022-06-22T15:34:45.000Z"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ slug: "gratuiste"
|
|||||||
draft: true
|
draft: true
|
||||||
excerpt: Translation in progress, stay tuned ;)
|
excerpt: Translation in progress, stay tuned ;)
|
||||||
tags: ["Design", "Freelance"]
|
tags: ["Design", "Freelance"]
|
||||||
|
type: articles
|
||||||
createdAt: "2017-05-27T07:47:36.000Z"
|
createdAt: "2017-05-27T07:47:36.000Z"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ 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"]
|
||||||
|
type: articles
|
||||||
createdAt: "2019-03-31T07:47:36.000Z"
|
createdAt: "2019-03-31T07:47:36.000Z"
|
||||||
updatedAt: "2022-12-27T12:08:00.000Z"
|
updatedAt: "2022-12-27T12:08:00.000Z"
|
||||||
---
|
---
|
||||||
|
@ -5,6 +5,7 @@ lang: en
|
|||||||
slug: "the-day-I-jamd"
|
slug: "the-day-I-jamd"
|
||||||
excerpt: Ooh, yeah! All right! We’re jammin’
|
excerpt: Ooh, yeah! All right! We’re jammin’
|
||||||
tags: ["Dev", "Jamstack"]
|
tags: ["Dev", "Jamstack"]
|
||||||
|
type: articles
|
||||||
createdAt: "2020-10-08T09:00:00.000Z"
|
createdAt: "2020-10-08T09:00:00.000Z"
|
||||||
updatedAt: "2022-12-27T15:40:06.000Z"
|
updatedAt: "2022-12-27T15:40:06.000Z"
|
||||||
---
|
---
|
||||||
|
@ -5,6 +5,7 @@ lang: en
|
|||||||
slug: "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
|
||||||
createdAt: "2021-05-05T09:00:00.000Z"
|
createdAt: "2021-05-05T09:00:00.000Z"
|
||||||
updatedAt: "2022-06-08T14:24:06.000Z"
|
updatedAt: "2022-06-08T14:24:06.000Z"
|
||||||
---
|
---
|
||||||
|
@ -5,6 +5,7 @@ lang: fr
|
|||||||
slug: "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
|
||||||
createdAt: "2022-06-08T14:24:06.000Z"
|
createdAt: "2022-06-08T14:24:06.000Z"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ lang: fr
|
|||||||
slug: "2023"
|
slug: "2023"
|
||||||
excerpt: Suite des évolutions.
|
excerpt: Suite des évolutions.
|
||||||
tags: ["Freelance"]
|
tags: ["Freelance"]
|
||||||
|
type: articles
|
||||||
createdAt: "2023-02-03T17:41:00.000Z"
|
createdAt: "2023-02-03T17:41:00.000Z"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ draft: true
|
|||||||
slug: "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
|
||||||
createdAt: "2019-04-24T09:00:00.000Z"
|
createdAt: "2019-04-24T09:00:00.000Z"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ lang: fr
|
|||||||
slug: "faq"
|
slug: "faq"
|
||||||
excerpt: Pourquoi, comment et surtout quèsaco.
|
excerpt: Pourquoi, comment et surtout quèsaco.
|
||||||
tags: ["Freelance"]
|
tags: ["Freelance"]
|
||||||
|
type: articles
|
||||||
createdAt: "2022-06-22T15:34:45.000Z"
|
createdAt: "2022-06-22T15:34:45.000Z"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ lang: fr
|
|||||||
slug: "gratuiste"
|
slug: "gratuiste"
|
||||||
excerpt: "J’ai cherché un moyen de mettre mes compétences au service d’autrui et je pense avoir trouvé: je vais travailler gratuitement pour des associations."
|
excerpt: "J’ai cherché un moyen de mettre mes compétences au service d’autrui et je pense avoir trouvé: je vais travailler gratuitement pour des associations."
|
||||||
tags: ["Graphisme", "Freelance"]
|
tags: ["Graphisme", "Freelance"]
|
||||||
|
type: articles
|
||||||
createdAt: "2017-05-27T07:47:36.000Z"
|
createdAt: "2017-05-27T07:47:36.000Z"
|
||||||
updatedAt: "2022-12-27T15:36:06.000Z"
|
updatedAt: "2022-12-27T15:36:06.000Z"
|
||||||
---
|
---
|
||||||
|
@ -5,6 +5,7 @@ lang: fr
|
|||||||
slug: "sci-hub-blocage"
|
slug: "sci-hub-blocage"
|
||||||
excerpt: "Le tribunal de grande instance de Paris a ordonné aux fournisseurs d’accès à internet de bloquer l’accès à sci-hub. Voici comment contourner les blocages mis en place."
|
excerpt: "Le tribunal de grande instance de Paris a ordonné aux fournisseurs d’accès à internet de bloquer l’accès à sci-hub. Voici comment contourner les blocages mis en place."
|
||||||
tags: ["Internet", "Science"]
|
tags: ["Internet", "Science"]
|
||||||
|
type: articles
|
||||||
createdAt: "2019-03-31T07:47:36.000Z"
|
createdAt: "2019-03-31T07:47:36.000Z"
|
||||||
updatedAt: "2022-12-27T12:08:00.000Z"
|
updatedAt: "2022-12-27T12:08:00.000Z"
|
||||||
---
|
---
|
||||||
|
@ -5,6 +5,7 @@ lang: fr
|
|||||||
slug: "the-day-I-jamd"
|
slug: "the-day-I-jamd"
|
||||||
excerpt: Ooh, yeah! All right! We’re jammin’
|
excerpt: Ooh, yeah! All right! We’re jammin’
|
||||||
tags: ["Dev", "Jamstack"]
|
tags: ["Dev", "Jamstack"]
|
||||||
|
type: articles
|
||||||
createdAt: "2020-10-08T07:47:36.000Z"
|
createdAt: "2020-10-08T07:47:36.000Z"
|
||||||
updatedAt: "2022-12-27T15:40:06.000Z"
|
updatedAt: "2022-12-27T15:40:06.000Z"
|
||||||
---
|
---
|
||||||
|
@ -6,6 +6,7 @@ draft: true
|
|||||||
slug: "video-compression"
|
slug: "video-compression"
|
||||||
excerpt: Pas encore traduit
|
excerpt: Pas encore traduit
|
||||||
tags: ["Design"]
|
tags: ["Design"]
|
||||||
|
type: articles
|
||||||
createdAt: "2021-05-05T09:00:00.000Z"
|
createdAt: "2021-05-05T09:00:00.000Z"
|
||||||
updatedAt: "2022-06-08T14:24:06.000Z"
|
updatedAt: "2022-06-08T14:24:06.000Z"
|
||||||
---
|
---
|
||||||
|
@ -6,6 +6,7 @@ const articles = defineCollection({
|
|||||||
subtitle: z.string(),
|
subtitle: z.string(),
|
||||||
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(),
|
||||||
// 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
|
||||||
@ -23,6 +24,7 @@ const fragments = defineCollection({
|
|||||||
subtitle: z.string(),
|
subtitle: z.string(),
|
||||||
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(),
|
||||||
// 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
|
||||||
|
@ -6,6 +6,7 @@ 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"]
|
||||||
|
type: snippets
|
||||||
---
|
---
|
||||||
|
|
||||||
## Disclaimer
|
## Disclaimer
|
||||||
|
@ -6,6 +6,7 @@ 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"]
|
||||||
|
type: snippets
|
||||||
---
|
---
|
||||||
|
|
||||||
## Context
|
## Context
|
||||||
|
@ -7,6 +7,7 @@ draft: true
|
|||||||
excerpt: Easy to grab and use hover effects.
|
excerpt: Easy to grab and use hover effects.
|
||||||
tags: ["CSS"]
|
tags: ["CSS"]
|
||||||
code: true
|
code: true
|
||||||
|
type: snippets
|
||||||
createdAt: "2020-10-08T09:00:00.000Z"
|
createdAt: "2020-10-08T09:00:00.000Z"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ 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"]
|
||||||
|
type: snippets
|
||||||
---
|
---
|
||||||
|
|
||||||
[Go back to available snippets](/en/snippets)
|
[Go back to available snippets](/en/snippets)
|
||||||
|
@ -7,6 +7,7 @@ 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…
|
||||||
tags: ["nuxt.js"]
|
tags: ["nuxt.js"]
|
||||||
|
type: snippets
|
||||||
---
|
---
|
||||||
|
|
||||||
## The problem
|
## The problem
|
||||||
|
@ -6,6 +6,7 @@ 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"]
|
||||||
|
type: snippets
|
||||||
---
|
---
|
||||||
|
|
||||||
import AstroImage from "../../../components/AstroImage.astro";
|
import AstroImage from "../../../components/AstroImage.astro";
|
||||||
|
@ -5,6 +5,7 @@ lang: en
|
|||||||
slug: "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
|
||||||
createdAt: "2022-06-22T15:34:45.000Z"
|
createdAt: "2022-06-22T15:34:45.000Z"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ 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é"]
|
||||||
|
type: fragments
|
||||||
---
|
---
|
||||||
|
|
||||||
## Attention
|
## Attention
|
||||||
|
@ -7,6 +7,7 @@ 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"]
|
||||||
|
type: fragments
|
||||||
---
|
---
|
||||||
|
|
||||||
[Voir les fragments disponibles](/fragments)
|
[Voir les fragments disponibles](/fragments)
|
||||||
|
@ -6,6 +6,7 @@ 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"]
|
||||||
|
type: fragments
|
||||||
code: true
|
code: true
|
||||||
createdAt: "2020-10-08T09:00:00.000Z"
|
createdAt: "2020-10-08T09:00:00.000Z"
|
||||||
---
|
---
|
||||||
|
@ -7,6 +7,7 @@ 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.
|
||||||
tags: ["CSS"]
|
tags: ["CSS"]
|
||||||
|
type: fragments
|
||||||
---
|
---
|
||||||
|
|
||||||
import AstroImage from "../../../components/AstroImage.astro";
|
import AstroImage from "../../../components/AstroImage.astro";
|
||||||
|
@ -7,6 +7,7 @@ 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…
|
||||||
tags: ["nuxt.js"]
|
tags: ["nuxt.js"]
|
||||||
|
type: fragments
|
||||||
---
|
---
|
||||||
|
|
||||||
## Le problème
|
## Le problème
|
||||||
|
@ -6,6 +6,7 @@ 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"]
|
||||||
|
type: fragments
|
||||||
---
|
---
|
||||||
|
|
||||||
import AstroImage from "../../../components/AstroImage.astro";
|
import AstroImage from "../../../components/AstroImage.astro";
|
||||||
|
@ -7,6 +7,7 @@ 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"]
|
||||||
|
type: fragments
|
||||||
---
|
---
|
||||||
|
|
||||||
[Voir les fragments disponibles](/fragments)
|
[Voir les fragments disponibles](/fragments)
|
||||||
|
26
src/data/veille/en/2023.md
Normal file
26
src/data/veille/en/2023.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
lang: en
|
||||||
|
title: 2023
|
||||||
|
updatedAt: "2023-04-20T17:12:06.000Z"
|
||||||
|
---
|
||||||
|
|
||||||
|
- [3D in CSS](https://garden.bradwoods.io/notes/css/3d) – Explanations et examples of 3D in CSS.
|
||||||
|
- [Fable](https://fable.app) – Motion design app.
|
||||||
|
- [Rive](https://rive.app) – Motion design app.
|
||||||
|
- [Cake Desk](https://cakedesk.app/) – Invoicing application.
|
||||||
|
- [Smooth CSS shadow](https://shadows.brumm.af/) – Generator.
|
||||||
|
- [Smol CSS](https://smolcss.dev/) – CSS snippets.
|
||||||
|
- [Optical adjustment](https://marvelapp.com/blog/optical-adjustment-logic-vs-designers/) – Optical vs logical alignment.
|
||||||
|
- [Datawrapper](https://blog.datawrapper.de/category/datavis-dos-and-donts/) – Advice on data visualization.
|
||||||
|
- [Assistivlabs](https://assistivlabs.com/) – Test accessibility with real softwares.
|
||||||
|
- [`time` input done right](https://adamsilver.io/blog/designing-a-time-input-backed-by-research/) – Article.
|
||||||
|
- [Tabby](https://tabby.sh) – An alternative terminal app.
|
||||||
|
- [Newglyph](https://newglyph.com/) – Independant foundry.
|
||||||
|
- [Headless UI](https://headlessui.com/vue/dialog) – LUI librairy in vue and react.
|
||||||
|
- [Sexy privacy](https://privacy.sexy) – Privacy tools for windows and macos.
|
||||||
|
- [33 JavaScript concepts](https://github.com/leonardomso/33-js-concepts) – Articles.
|
||||||
|
- [Formbricks](https://formbricks.com/) – Open source alternative to google form/typeform.
|
||||||
|
- [SVG loader](https://github.com/n3r4zzurr0/svg-spinners) – Collection.
|
||||||
|
- [a11yphant](https://a11yphant.com/) – Code challenges to learn accessibility.
|
||||||
|
- [Modern CSS](https://moderncss.dev/) – CSS snippets.
|
||||||
|
- [Moderne CSS container](https://twitter.com/KevinJPowell/status/1501555193799925761) – Tweet from Kevin Powell ❤️
|
31
src/data/veille/fr/2023.md
Normal file
31
src/data/veille/fr/2023.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
lang: fr
|
||||||
|
title: 2023
|
||||||
|
updatedAt: "2023-04-20T17:12:06.000Z"
|
||||||
|
---
|
||||||
|
|
||||||
|
- [L’accessibilité n’est pas une variable d’ajustement](https://www.sophie-drouvroy.com/blog/laccessibilite-nest-pas-une-variable-dajustement/) — Sophie Drouvroy, intégratrice front-end, partage son quotidien en tant que personne sourde dans notre société.
|
||||||
|
> L’accessibilité doit être au cœur du projet et pas une cerise sur le gâteau.
|
||||||
|
- [3D en CSS (english)](https://garden.bradwoods.io/notes/css/3d) – Explications et exemples des propriétés 3D en CSS.
|
||||||
|
- [Climat : Comment ne pas déprimer ?](https://www.lemonde.fr/podcasts/article/2022/06/21/climat-comment-ne-pas-deprimer_6131347_5463015.html) – Podcast.
|
||||||
|
- [Fable (english)](https://fable.app) – Application de motion design.
|
||||||
|
- [Rive (english)](https://rive.app) – Application de motion design.
|
||||||
|
- [Cake Desk](https://cakedesk.app/) – Application de facturation.
|
||||||
|
- [Ombre fluide en CSS](https://shadows.brumm.af/) – Générateur.
|
||||||
|
- [Smol CSS](https://smolcss.dev/) – Collection de fragments CSS.
|
||||||
|
- [Ajustement optique](https://marvelapp.com/blog/optical-adjustment-logic-vs-designers/) (english) – Aligner visuellement plutôt que techniquement.
|
||||||
|
- [Datawrapper](https://blog.datawrapper.de/category/datavis-dos-and-donts/) (english) – Conseils pour montrer de la donnée.
|
||||||
|
- [Assistivlabs](https://assistivlabs.com/) (english) – Service de test des technologies d'assistance (browserstack mais pour l'accessibilité).
|
||||||
|
- [Les caractères fantaisistes et l'accessibilité](https://www.lalutineduweb.fr/detournement-unicode-emojis-accessibilite/) – Explications et exemples de l'enfer que sont les caractères Unicode pour les technologies d'assistance.
|
||||||
|
- [Créer un champ `time` sur le web](https://adamsilver.io/blog/designing-a-time-input-backed-by-research/) (english) – Article.
|
||||||
|
- [La cascade](https://la-cascade.io) – Collection d'articles sur le CSS.
|
||||||
|
- [Tabby](https://tabby.sh) (english) – An alternative terminal app.
|
||||||
|
- [Newglyph](https://newglyph.com/) – Fonderie indépendante.
|
||||||
|
- [<span lang="en">Headless UI</span>](https://headlessui.com/vue/dialog) (english) – Librairie de composants vue et react.
|
||||||
|
- [Vie privée sexy](https://privacy.sexy) (english) – Outils de confidentialité pour windows et macos.
|
||||||
|
- [33 concepts JavaScript](https://github.com/leonardomso/33-js-concepts) (english) – Articles.
|
||||||
|
- [Formbricks](https://formbricks.com/) (english) – Alternative open source à google form/typeform.
|
||||||
|
- [Animations de chargement SVG](https://github.com/n3r4zzurr0/svg-spinners) – Collection.
|
||||||
|
- [a11yphant](https://a11yphant.com/) (english) – Challenges de code pour apprendre l'accessibilité.
|
||||||
|
- [CSS moderne](https://moderncss.dev/) (english) – Fragments CSS.
|
||||||
|
- [Conteneur moderne en CSS](https://twitter.com/KevinJPowell/status/1501555193799925761) (english) – Tweet de Kevin Powell ❤️
|
@ -39,6 +39,10 @@
|
|||||||
"cta": "Consulter le site",
|
"cta": "Consulter le site",
|
||||||
"tagline": "Quelques références."
|
"tagline": "Quelques références."
|
||||||
},
|
},
|
||||||
|
"veille": {
|
||||||
|
"titre": "veille",
|
||||||
|
"tagline": "Des liens, en vrac."
|
||||||
|
},
|
||||||
"erreur": {
|
"erreur": {
|
||||||
"introuvable": "Page introuvable",
|
"introuvable": "Page introuvable",
|
||||||
"autre": "Oups… désolé pour cette erreur.",
|
"autre": "Oups… désolé pour cette erreur.",
|
||||||
|
34
src/pages/en/rss.xml.js
Normal file
34
src/pages/en/rss.xml.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import rss from "@astrojs/rss";
|
||||||
|
import { getCollection } from "astro:content";
|
||||||
|
|
||||||
|
export async function get(context) {
|
||||||
|
const articles = await getCollection("articles", ({ data }) => {
|
||||||
|
return data.lang === "en" && !data.draft;
|
||||||
|
});
|
||||||
|
const fragments = await getCollection("fragments", ({ data }) => {
|
||||||
|
return data.lang === "en" && !data.draft;
|
||||||
|
});
|
||||||
|
const posts = articles.concat(fragments);
|
||||||
|
return rss({
|
||||||
|
// `<title>` field in output xml
|
||||||
|
title: "Nicolas Arduin",
|
||||||
|
// `<description>` field in output xml
|
||||||
|
description: "Articles from nardu.in",
|
||||||
|
// Pull in your project "site" from the endpoint context
|
||||||
|
// https://docs.astro.build/en/reference/api-reference/#contextsite
|
||||||
|
site: context.site,
|
||||||
|
// Array of `<item>`s in output xml
|
||||||
|
// See "Generating items" section for examples using content collections and glob imports
|
||||||
|
items: posts.map((post) => ({
|
||||||
|
title: post.data.title,
|
||||||
|
pubDate: post.data.createdAt,
|
||||||
|
description: post.data.subtitle,
|
||||||
|
lang: post.data.lang,
|
||||||
|
// Compute RSS link from post `slug`
|
||||||
|
// This example assumes all posts are rendered as `/blog/[slug]` routes
|
||||||
|
link: `/en/${post.data.type}/${post.slug}/`,
|
||||||
|
})),
|
||||||
|
// (optional) inject custom xml
|
||||||
|
customData: `<language>en-us</language>`,
|
||||||
|
});
|
||||||
|
}
|
7
src/pages/en/veille/index.astro
Normal file
7
src/pages/en/veille/index.astro
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
import Page from "../../veille/index.astro"
|
||||||
|
|
||||||
|
const { props } = Astro
|
||||||
|
---
|
||||||
|
|
||||||
|
<Page {...props} />
|
@ -66,17 +66,16 @@ const pageTitle = t("sitemap");
|
|||||||
<a href={l("/references")}>{t("references.titre")}</a>
|
<a href={l("/references")}>{t("references.titre")}</a>
|
||||||
</h2>
|
</h2>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<h2>
|
||||||
|
<a href={l("/veille")}>{t("veille.titre")}</a>
|
||||||
|
</h2>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
</BaseLayout>
|
</BaseLayout>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
/* :link {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
:link:hover {
|
|
||||||
text-decoration: none;
|
|
||||||
} */
|
|
||||||
h2 {
|
h2 {
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
}
|
}
|
||||||
|
34
src/pages/rss.xml.js
Normal file
34
src/pages/rss.xml.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import rss from "@astrojs/rss";
|
||||||
|
import { getCollection } from "astro:content";
|
||||||
|
|
||||||
|
export async function get(context) {
|
||||||
|
const articles = await getCollection("articles", ({ data }) => {
|
||||||
|
return data.lang === "fr" && !data.draft;
|
||||||
|
});
|
||||||
|
const fragments = await getCollection("fragments", ({ data }) => {
|
||||||
|
return data.lang === "fr" && !data.draft;
|
||||||
|
});
|
||||||
|
const posts = articles.concat(fragments);
|
||||||
|
return rss({
|
||||||
|
// `<title>` field in output xml
|
||||||
|
title: "Nicolas Arduin",
|
||||||
|
// `<description>` field in output xml
|
||||||
|
description: "Articles publiés sur nardu.in",
|
||||||
|
// Pull in your project "site" from the endpoint context
|
||||||
|
// https://docs.astro.build/en/reference/api-reference/#contextsite
|
||||||
|
site: context.site,
|
||||||
|
// Array of `<item>`s in output xml
|
||||||
|
// See "Generating items" section for examples using content collections and glob imports
|
||||||
|
items: posts.map((post) => ({
|
||||||
|
title: post.data.title,
|
||||||
|
pubDate: post.data.createdAt,
|
||||||
|
description: post.data.subtitle,
|
||||||
|
lang: post.data.lang,
|
||||||
|
// Compute RSS link from post `slug`
|
||||||
|
// This example assumes all posts are rendered as `/blog/[slug]` routes
|
||||||
|
link: `/${post.data.type}/${post.slug}/`,
|
||||||
|
})),
|
||||||
|
// (optional) inject custom xml
|
||||||
|
customData: `<language>fr-fr</language>`,
|
||||||
|
});
|
||||||
|
}
|
4
src/pages/veille/i18n/en.json
Normal file
4
src/pages/veille/i18n/en.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"pageName": "External stuff",
|
||||||
|
"subtitle": "Links, articles, videos…"
|
||||||
|
}
|
4
src/pages/veille/i18n/fr.json
Normal file
4
src/pages/veille/i18n/fr.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"pageName": "Veille",
|
||||||
|
"subtitle": "Des liens, des articles, des vidéos… en vrac."
|
||||||
|
}
|
43
src/pages/veille/index.astro
Normal file
43
src/pages/veille/index.astro
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
import { t, astroI18n } from "astro-i18n";
|
||||||
|
astroI18n.init(Astro);
|
||||||
|
|
||||||
|
const pageTitle = t("index.veille.pageName");
|
||||||
|
|
||||||
|
import BaseLayout from "../../layouts/BaseLayout.astro";
|
||||||
|
import MetaDate from "../../components/MetaDate.astro";
|
||||||
|
|
||||||
|
// get all content
|
||||||
|
const allSections = await Astro.glob("../../data/veille/**/*.md");
|
||||||
|
// only keep the right locale version
|
||||||
|
const localizedSections = allSections.filter((section) => {
|
||||||
|
return section.frontmatter.lang === astroI18n.langCode;
|
||||||
|
});
|
||||||
|
---
|
||||||
|
|
||||||
|
<BaseLayout pageTitle={pageTitle}>
|
||||||
|
<section class="region flow">
|
||||||
|
<h1>{pageTitle}</h1>
|
||||||
|
<p>{t("index.veille.subtitle")}</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{
|
||||||
|
localizedSections.map((section) => (
|
||||||
|
<section class="flow content">
|
||||||
|
<h2>{section.frontmatter.title}</h2>
|
||||||
|
<MetaDate item={section.frontmatter} />
|
||||||
|
<section.Content />
|
||||||
|
</section>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</BaseLayout>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.content :global(ul > li) {
|
||||||
|
padding-block: var(--space-m);
|
||||||
|
}
|
||||||
|
.content :global(ul > li + li) {
|
||||||
|
margin: 0;
|
||||||
|
border-top: 1px solid var(--color-brique);
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in New Issue
Block a user