fix: corriger la syntaxe et ajouter des retours à la ligne manquants dans plusieurs fichiers

This commit is contained in:
2025-12-18 23:18:18 +01:00
parent 6654f42588
commit 929899722b
22 changed files with 209 additions and 161 deletions

View File

@@ -1,12 +1,12 @@
export default defineAppConfig({
ui: {
container: {
base: 'max-w-4xl',
base: 'max-w-4xl'
},
colors: {
primary: 'neutral',
neutral: 'neutral',
red: 'red',
},
},
red: 'red'
}
}
})

View File

@@ -1,6 +1,6 @@
<script lang="ts" setup>
useHead({
link: [{ rel: 'icon', type: 'image/webp', href: '/favicon.webp' }],
link: [{ rel: 'icon', type: 'image/webp', href: '/favicon.webp' }]
})
</script>

View File

@@ -2,7 +2,7 @@
import { socials } from '~~/types'
const { t } = useI18n({
useScope: 'local',
useScope: 'local'
})
</script>
@@ -43,7 +43,7 @@ const { t } = useI18n({
<div class="mt-8 w-full flex justify-center text-xs">
{{
t('copyright', {
date: new Date().getFullYear(),
date: new Date().getFullYear()
})
}}
</div>

View File

@@ -7,16 +7,16 @@ const openContactDrawer = ref(false)
const router = useRouter()
defineShortcuts({
c: () => openContactDrawer.value = !openContactDrawer.value,
backspace: () => router.back(),
backspace: () => router.back()
})
const socialsList = [
{
label: 'Email',
icon: 'i-ph-envelope-duotone',
to: 'mailto:arthurdanjou@outlook.fr',
to: 'mailto:arthurdanjou@outlook.fr'
},
...socials,
...socials
]
</script>
@@ -58,14 +58,17 @@ const socialsList = [
variant="ghost"
/>
</UTooltip>
<USeparator orientation="vertical" class="h-6" />
<USeparator
orientation="vertical"
class="h-6"
/>
<UDropdownMenu
v-model:open="openContactDrawer"
:items="socialsList"
:content="{
align: 'center',
side: 'bottom',
sideOffset: 8,
sideOffset: 8
}"
>
<UTooltip
@@ -83,7 +86,10 @@ const socialsList = [
/>
</UTooltip>
</UDropdownMenu>
<USeparator orientation="vertical" class="h-6" />
<USeparator
orientation="vertical"
class="h-6"
/>
<LangSwitcher />
</nav>
</header>

View File

@@ -2,12 +2,12 @@
defineProps({
title: {
type: String,
required: true,
required: true
},
description: {
type: String,
required: true,
},
required: true
}
})
</script>

View File

@@ -18,7 +18,7 @@ async function changeLocale(newLocale: string) {
}
defineShortcuts({
l: () => lang.value = currentLocale.value!.code === 'en' ? 'fr' : currentLocale.value!.code === 'fr' ? 'es' : 'en',
l: () => lang.value = currentLocale.value!.code === 'en' ? 'fr' : currentLocale.value!.code === 'fr' ? 'es' : 'en'
})
</script>
@@ -33,7 +33,7 @@ defineShortcuts({
:content="{
align: 'center',
side: 'right',
sideOffset: 8,
sideOffset: 8
}"
>
<USelect

View File

@@ -21,7 +21,7 @@ function toggleDark(event: MouseEvent | { clientX: number, clientY: number }) {
const y = event.clientY
const endRadius = Math.hypot(
Math.max(x, innerWidth - x),
Math.max(y, innerHeight - y),
Math.max(y, innerHeight - y)
)
const transition = document.startViewTransition(async () => {
switchTheme()
@@ -31,27 +31,27 @@ function toggleDark(event: MouseEvent | { clientX: number, clientY: number }) {
.then(() => {
const clipPath = [
`circle(0px at ${x}px ${y}px)`,
`circle(${endRadius}px at ${x}px ${y}px)`,
`circle(${endRadius}px at ${x}px ${y}px)`
]
document.documentElement.animate(
{
clipPath: colorMode.value === 'dark'
? [...clipPath].reverse()
: clipPath,
: clipPath
},
{
duration: 400,
easing: 'ease-out',
pseudoElement: colorMode.value === 'dark'
? '::view-transition-old(root)'
: '::view-transition-new(root)',
},
: '::view-transition-new(root)'
}
)
})
}
defineShortcuts({
t: () => toggleDark({ clientX: window.innerWidth, clientY: 0 }),
t: () => toggleDark({ clientX: window.innerWidth, clientY: 0 })
})
</script>

View File

@@ -4,16 +4,16 @@ import type { PropType } from 'vue'
defineProps({
text: {
type: [String, Number],
required: true,
required: true
},
hover: {
type: String,
required: true,
required: true
},
position: {
type: String as PropType<'top' | 'right' | 'bottom' | 'left'>,
default: 'top',
},
default: 'top'
}
})
</script>
@@ -25,11 +25,11 @@ defineProps({
:content="{
align: 'center',
side: position,
sideOffset: 8,
sideOffset: 8
}"
:text="hover"
>
<strong class="leading-3 cursor-help">{{ text }}</strong>
</UTooltip>
</ClientOnly>
</template>
</template>

View File

@@ -2,12 +2,12 @@
defineProps({
icon: {
type: String,
required: true,
required: true
},
color: {
type: String,
default: 'gray',
},
default: 'gray'
}
})
const colorVariants = {
@@ -23,13 +23,16 @@ const colorVariants = {
zinc: 'text-zinc-500/80 decoration-zinc-400/40',
orange: 'text-orange-500/80 decoration-orange-400/40',
amber: 'text-amber-500/80 decoration-amber-400/40',
emerald: 'text-emerald-500/80 decoration-emerald-400/40',
emerald: 'text-emerald-500/80 decoration-emerald-400/40'
}
</script>
<template>
<span class="inline-flex items-center transform translate-y-1 gap-1">
<UIcon :name="icon" size="16" />
<UIcon
:name="icon"
size="16"
/>
<span
:class="colorVariants[color as keyof typeof colorVariants]"
class="sofia font-semibold underline-offset-2 underline"
@@ -37,4 +40,4 @@ const colorVariants = {
<slot />
</span>
</span>
</template>
</template>

View File

@@ -45,7 +45,7 @@ type FormattedActivity = {
state: string
start: {
ago: string
formatted: { date: string; time: string }
formatted: { date: string, time: string }
}
} | null
@@ -61,7 +61,7 @@ const formattedActivity = computed<FormattedActivity>(() => {
const stateWord = (state && state.split(' ').length >= 2 ? state.split(' ')[1] : t('secret')) as string
const ago = useTimeAgo(timestamps.start, {
messages: activityMessages[locale.value as keyof typeof activityMessages] as UseTimeAgoMessages,
messages: activityMessages[locale.value as keyof typeof activityMessages] as UseTimeAgoMessages
}).value
const formatDate = (date: number, format: string) =>
@@ -75,9 +75,9 @@ const formattedActivity = computed<FormattedActivity>(() => {
ago,
formatted: {
date: formatDate(timestamps.start, 'DD MMM YYYY'),
time: formatDate(timestamps.start, 'HH:mm'),
},
},
time: formatDate(timestamps.start, 'HH:mm')
}
}
}
})
@@ -89,15 +89,28 @@ const editorIcon = computed(() => {
<template>
<ClientOnly>
<div v-if="formattedActivity" class="flex items-start gap-2 mt-4">
<div
v-if="formattedActivity"
class="flex items-start gap-2 mt-4"
>
<UTooltip :text="isActive ? t('tooltip.online') : t('tooltip.idling')">
<div class="relative flex h-3 w-3 mt-2">
<div v-if="isActive" class="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-500 opacity-75" />
<div :class="isActive ? 'bg-green-500' : 'bg-amber-500'" class="relative inline-flex rounded-full h-3 w-3" />
<div
v-if="isActive"
class="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-500 opacity-75"
/>
<div
:class="isActive ? 'bg-green-500' : 'bg-amber-500'"
class="relative inline-flex rounded-full h-3 w-3"
/>
</div>
</UTooltip>
<i18n-t v-if="isActive" keypath="working" tag="div">
<i18n-t
v-if="isActive"
keypath="working"
tag="div"
>
<template #state>
<strong>{{ formattedActivity.state.split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(' ') }}</strong>
</template>
@@ -106,7 +119,10 @@ const editorIcon = computed(() => {
</template>
<template #editor>
<span class="space-x-1">
<UIcon :name="editorIcon" size="16" />
<UIcon
:name="editorIcon"
size="16"
/>
<strong>{{ formattedActivity.name }}</strong>
</span>
</template>
@@ -119,24 +135,41 @@ const editorIcon = computed(() => {
</template>
</i18n-t>
<i18n-t v-else keypath="idling" tag="div" class="space-x-1">
<i18n-t
v-else
keypath="idling"
tag="div"
class="space-x-1"
>
<template #editor>
<span class="space-x-1">
<UIcon :name="editorIcon" size="16" />
<UIcon
:name="editorIcon"
size="16"
/>
<strong>{{ formattedActivity.name }}</strong>
</span>
</template>
</i18n-t>
</div>
<div v-else class="my-5 flex md:items-start gap-2">
<div
v-else
class="my-5 flex md:items-start gap-2"
>
<UTooltip :text="t('tooltip.offline')">
<div class="relative flex h-3 w-3 mt-2">
<div class="relative cursor-not-allowed inline-flex rounded-full h-3 w-3 bg-red-500" />
</div>
</UTooltip>
<i18n-t keypath="offline" tag="p" class="not-prose">
<template #maths><i>{{ t('maths') }}</i></template>
<i18n-t
keypath="offline"
tag="p"
class="not-prose"
>
<template #maths>
<i>{{ t('maths') }}</i>
</template>
</i18n-t>
</div>
</ClientOnly>

View File

@@ -1,7 +1,7 @@
<script lang="ts" setup>
const { width } = useWindowSize()
const { t } = useI18n({
useScope: 'local',
useScope: 'local'
})
</script>

View File

@@ -2,11 +2,11 @@
defineProps({
label: {
type: String,
required: true,
required: true
},
href: {
type: String,
required: true,
required: true
},
icon: {
type: String,
@@ -14,8 +14,8 @@ defineProps({
},
blanked: {
type: Boolean,
default: false,
},
default: false
}
})
</script>

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
const styleVars = {
'--animated-speed': '50s',
'--animated-speed': '50s'
}
</script>

View File

@@ -1,6 +1,6 @@
<script lang="ts" setup>
const { t } = useI18n({
useScope: 'local',
useScope: 'local'
})
</script>

View File

@@ -3,7 +3,7 @@ import type { Stats } from '~~/types'
import { usePrecision } from '@vueuse/math'
const { locale, locales, t } = useI18n({
useScope: 'local',
useScope: 'local'
})
const currentLocale = computed(() => locales.value.find(l => l.code === locale.value))

View File

@@ -6,7 +6,10 @@
</h1>
<p class="text-center flex gap-1">
I think you're lost, let's go back
<HomeLink label="home" href="/" />
<HomeLink
label="home"
href="/"
/>
</p>
</div>
</UApp>

View File

@@ -10,4 +10,4 @@
<style scoped>
</style>
</style>

View File

@@ -3,21 +3,25 @@ const { locale } = useI18n()
useSeoMeta({
title: 'Arthur Danjou - AI enjoyer and Maths student',
description: 'Developer enjoying Artificial Intelligence and Machine Learning. Mathematics Student at Paris Dauphine-PSL University specialised in Statistics',
description: 'Developer enjoying Artificial Intelligence and Machine Learning. Mathematics Student at Paris Dauphine-PSL University specialised in Statistics'
})
const { data: page } = await useAsyncData(`/home/${locale.value}`, () => {
return queryCollection('main').path(`/home/${locale.value}`).first()
}, {
watch: [locale],
watch: [locale]
})
</script>
<template>
<main class="max-w-none! prose dark:prose-invert">
<ContentRenderer v-if="page" :value="page" class="mt-8 md:mt-16" />
<ContentRenderer
v-if="page"
:value="page"
class="mt-8 md:mt-16"
/>
<HomeStats />
<HomeActivity />
<HomeActivity />
<HomeQuote />
<HomeCatchPhrase />
</main>

View File

@@ -3,6 +3,6 @@ import { defineCollection } from '@nuxt/content'
export const collections = {
main: defineCollection({
type: 'page',
source: 'home/*.md',
}),
source: 'home/*.md'
})
}

View File

@@ -2,4 +2,4 @@ import withNuxt from './.nuxt/eslint.config.mjs'
export default withNuxt(
// Your custom configs here
)
)

View File

@@ -1,19 +1,4 @@
export default defineNuxtConfig({
compatibilityDate: '2025-12-13',
app: {
pageTransition: { name: 'page', mode: 'out-in' },
head: {
templateParams: {
separator: '•',
},
},
rootAttrs: {
class: 'bg-[var(--ui-bg)]',
},
},
css: ['~/assets/css/main.css'],
modules: [
'@nuxt/ui',
@@ -25,9 +10,27 @@ export default defineNuxtConfig({
'nuxt-studio'
],
hub: {
cache: true,
db: 'sqlite',
devtools: {
enabled: true
},
app: {
pageTransition: { name: 'page', mode: 'out-in' },
head: {
templateParams: {
separator: '•'
}
},
rootAttrs: {
class: 'bg-[var(--ui-bg)]'
}
},
css: ['~/assets/css/main.css'],
colorMode: {
preference: 'system',
fallback: 'light'
},
ui: {
@@ -47,70 +50,8 @@ export default defineNuxtConfig({
'blue',
'purple',
'pink',
'neutral',
],
},
},
studio: {
route: '/studio',
repository: {
provider: 'github',
owner: 'ArthurDanjou',
repo: 'artsite',
branch: 'master'
}
},
colorMode: {
preference: 'system',
fallback: 'light',
},
devtools: {
enabled: true,
},
i18n: {
strategy: 'no_prefix',
locales: [
{
label: 'English',
code: 'en',
language: 'en-EN',
icon: 'i-twemoji-flag-united-kingdom',
},
{
label: 'Français',
code: 'fr',
language: 'fr-FR',
icon: 'i-twemoji-flag-france',
},
{
label: 'Español',
code: 'es',
language: 'es-ES',
icon: 'i-twemoji-flag-spain',
},
],
defaultLocale: 'en',
},
routeRules: {
'/api/activity': {
proxy: `${process.env.NUXT_API_URL}/api/activity`
},
'/api/stats': {
proxy: `${process.env.NUXT_API_URL}/api/stats`
}
},
nitro: {
preset: 'cloudflare_pages',
prerender: {
routes: ['/'],
crawlLinks: true,
'neutral'
]
}
},
@@ -120,14 +61,38 @@ export default defineNuxtConfig({
},
public: {
i18n: {
baseUrl: '',
},
baseUrl: ''
}
}
},
routeRules: {
'/api/activity': {
proxy: `${process.env.NUXT_API_URL}/api/activity`
},
'/api/stats': {
proxy: `${process.env.NUXT_API_URL}/api/stats`
}
},
experimental: {
viewTransition: true
},
compatibilityDate: '2025-12-13',
nitro: {
preset: 'cloudflare_pages',
prerender: {
routes: ['/'],
crawlLinks: true
}
},
hub: {
cache: true,
db: 'sqlite'
},
eslint: {
config: {
@@ -137,4 +102,38 @@ export default defineNuxtConfig({
}
}
},
})
i18n: {
strategy: 'no_prefix',
locales: [
{
label: 'English',
code: 'en',
language: 'en-EN',
icon: 'i-twemoji-flag-united-kingdom'
},
{
label: 'Français',
code: 'fr',
language: 'fr-FR',
icon: 'i-twemoji-flag-france'
},
{
label: 'Español',
code: 'es',
language: 'es-ES',
icon: 'i-twemoji-flag-spain'
}
],
defaultLocale: 'en'
},
studio: {
route: '/studio',
repository: {
provider: 'github',
owner: 'ArthurDanjou',
repo: 'artsite',
branch: 'master'
}
}
})

View File

@@ -48,7 +48,7 @@ export const IDEs = [
{ name: 'IntelliJ IDEA Ultimate', icon: 'i-logos:intellij-idea' },
{ name: 'WebStorm', icon: 'i-logos:webstorm' },
{ name: 'PyCharm Professional', icon: 'i-logos:pycharm' },
{ name: 'Cursor', icon: 'i-vscode-icons-file-type-cursorrules' },
{ name: 'Cursor', icon: 'i-vscode-icons-file-type-cursorrules' }
] as const
type TimeUnit = (n: number, past?: boolean) => string
@@ -93,7 +93,7 @@ export const activityMessages: Record<'en' | 'fr' | 'es', ActivityMessages> = {
hour: createSimpleTimeUnit('hour'),
minute: createSimpleTimeUnit('minute'),
second: createSimpleTimeUnit('second'),
invalid: '',
invalid: ''
},
fr: {
justNow: 'à l\'instant',
@@ -106,7 +106,7 @@ export const activityMessages: Record<'en' | 'fr' | 'es', ActivityMessages> = {
hour: createSimpleTimeUnit('heure'),
minute: createSimpleTimeUnit('minute'),
second: createSimpleTimeUnit('seconde'),
invalid: '',
invalid: ''
},
es: {
justNow: 'justo ahora',
@@ -119,15 +119,15 @@ export const activityMessages: Record<'en' | 'fr' | 'es', ActivityMessages> = {
hour: createSimpleTimeUnit('hora'),
minute: createSimpleTimeUnit('minuto'),
second: createSimpleTimeUnit('segundo'),
invalid: '',
},
invalid: ''
}
}
export const socials = [
{ icon: 'i-ph-x-logo-duotone', label: 'Twitter', to: 'https://twitter.com/ArthurDanj' },
{ icon: 'i-ph-github-logo-duotone', label: 'GitHub', to: 'https://github.com/ArthurDanjou' },
{ icon: 'i-ph-linkedin-logo-duotone', label: 'LinkedIn', to: 'https://www.linkedin.com/in/arthurdanjou/' },
{ icon: 'i-ph-discord-logo-duotone', label: 'Discord', to: 'https://discordapp.com/users/179635349100691456' },
{ icon: 'i-ph-discord-logo-duotone', label: 'Discord', to: 'https://discordapp.com/users/179635349100691456' }
] as const
type Locale = 'en' | 'fr' | 'es'
@@ -146,6 +146,6 @@ export const navs: readonly Nav[] = [
label: { en: 'resume', fr: 'cv', es: 'currículum' },
icon: 'address-book-duotone',
to: 'https://api.arthurdanjou.fr/api/resumes/en',
target: '_blank',
},
target: '_blank'
}
] as const