Compare commits

..

4 commits

Author SHA1 Message Date
6aaf87f11a Mise à jour des traductions EN/AR des pages index et about
- Synchronisation avec le contenu FR actuel (image jalil-2.jpg, suppression cercle animé, section théâtre mise à jour, liens photo actifs, section blog commentée, email corrigé)
2026-02-17 01:43:59 +01:00
536e52d5ee Suppression des fichiers .jpg~ et ajout de *~ au .gitignore 2026-02-17 01:22:36 +01:00
8c550a947f Ajout du mode automatique (préférence système) au toggle dark mode
Le toggle cycle maintenant entre auto → light → dark. En mode auto, le thème suit prefers-color-scheme et réagit en temps réel aux changements système. L'icône et l'aria-label reflètent l'état courant.
2026-02-17 01:17:58 +01:00
24b63d4e9b Correction dark mode : unification sur la clé localStorage 'theme'
Le script anti-flicker lisait 'dark_mode' alors que le toggle (DarkModeToggle.astro) écrivait dans 'theme', rendant la persistance du dark mode inopérante. Suppression du code dark mode mort dans main.js (showDay/showNight, listener #darkToggle, window.darkMode) qui référençait des éléments HTML supprimés du header.
2026-02-17 01:08:43 +01:00
8 changed files with 110 additions and 164 deletions

3
.gitignore vendored
View file

@ -20,6 +20,9 @@ pnpm-debug.log*
# images fetched from NAS # images fetched from NAS
src/assets/images/photos/ src/assets/images/photos/
# editor backup files
*~
# macOS-specific files # macOS-specific files
.DS_Store .DS_Store

View file

@ -1,7 +1,3 @@
// Add your javascript here
window.darkMode = false;
const stickyClasses = ["fixed", "h-14"]; const stickyClasses = ["fixed", "h-14"];
const unstickyClasses = ["absolute", "h-20"]; const unstickyClasses = ["absolute", "h-20"];
const stickyClassesContainer = [ const stickyClassesContainer = [
@ -17,32 +13,12 @@ let headerElement = null;
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
headerElement = document.getElementById("header"); headerElement = document.getElementById("header");
if (
localStorage.getItem("dark_mode") &&
localStorage.getItem("dark_mode") === "true"
) {
window.darkMode = true;
showNight();
} else {
showDay();
}
stickyHeaderFuncionality(); stickyHeaderFuncionality();
applyMenuItemClasses(); applyMenuItemClasses();
evaluateHeaderPosition(); evaluateHeaderPosition();
mobileMenuFunctionality(); mobileMenuFunctionality();
}); });
// window.toggleDarkMode = function(){
// document.documentElement.classList.toggle('dark');
// if(document.documentElement.classList.contains('dark')){
// localStorage.setItem('dark_mode', true);
// window.darkMode = true;
// } else {
// window.darkMode = false;
// localStorage.setItem('dark_mode', false);
// }
// }
window.stickyHeaderFuncionality = () => { window.stickyHeaderFuncionality = () => {
window.addEventListener("scroll", () => { window.addEventListener("scroll", () => {
evaluateHeaderPosition(); evaluateHeaderPosition();
@ -69,70 +45,6 @@ window.evaluateHeaderPosition = () => {
} }
}; };
document.getElementById("darkToggle").addEventListener("click", () => {
document.documentElement.classList.add("duration-300");
if (document.documentElement.classList.contains("dark")) {
localStorage.removeItem("dark_mode");
showDay(true);
} else {
localStorage.setItem("dark_mode", true);
showNight(true);
}
});
function showDay(animate) {
document.getElementById("sun").classList.remove("setting");
document.getElementById("moon").classList.remove("rising");
let timeout = 0;
if (animate) {
timeout = 500;
document.getElementById("moon").classList.add("setting");
}
setTimeout(() => {
document.getElementById("dayText").classList.remove("hidden");
document.getElementById("nightText").classList.add("hidden");
document.getElementById("moon").classList.add("hidden");
document.getElementById("sun").classList.remove("hidden");
if (animate) {
document.documentElement.classList.remove("dark");
document.getElementById("sun").classList.add("rising");
}
}, timeout);
}
function showNight(animate) {
document.getElementById("moon").classList.remove("setting");
document.getElementById("sun").classList.remove("rising");
let timeout = 0;
if (animate) {
timeout = 500;
document.getElementById("sun").classList.add("setting");
}
setTimeout(() => {
document.getElementById("nightText").classList.remove("hidden");
document.getElementById("dayText").classList.add("hidden");
document.getElementById("sun").classList.add("hidden");
document.getElementById("moon").classList.remove("hidden");
if (animate) {
document.documentElement.classList.add("dark");
document.getElementById("moon").classList.add("rising");
}
}, timeout);
}
window.applyMenuItemClasses = () => { window.applyMenuItemClasses = () => {
const menuItems = document.querySelectorAll("#menu a"); const menuItems = document.querySelectorAll("#menu a");
for (let i = 0; i < menuItems.length; i++) { for (let i = 0; i < menuItems.length; i++) {
@ -140,7 +52,6 @@ window.applyMenuItemClasses = () => {
menuItems[i].classList.add("text-neutral-900", "dark:text-white"); menuItems[i].classList.add("text-neutral-900", "dark:text-white");
} }
} }
//:class="{ 'text-neutral-900 dark:text-white': window.location.pathname == '{menu.url}', 'text-neutral-700 dark:text-neutral-400': window.location.pathname != '{menu.url}' }"
}; };
function mobileMenuFunctionality() { function mobileMenuFunctionality() {

View file

@ -1,16 +1,30 @@
--- ---
// DarkModeToggle component - toggles between light and dark mode // DarkModeToggle component - cycles between auto / light / dark
--- ---
<button <button
id="darkModeToggle" id="darkModeToggle"
type="button" type="button"
class="flex items-center justify-center w-8 h-8 rounded-lg cursor-pointer text-neutral-600 dark:text-neutral-300 hover:text-neutral-900 dark:hover:text-white hover:bg-neutral-100 dark:hover:bg-neutral-800 transition-colors" class="flex items-center justify-center w-8 h-8 rounded-lg cursor-pointer text-neutral-600 dark:text-neutral-300 hover:text-neutral-900 dark:hover:text-white hover:bg-neutral-100 dark:hover:bg-neutral-800 transition-colors"
aria-label="Toggle dark mode" aria-label="Changer le thème"
> >
<!-- Auto icon (system preference) -->
<svg <svg
class="w-5 h-5 dark:hidden" class="w-5 h-5 hidden"
id="sunIcon" data-theme-icon="auto"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
<!-- Light icon (sun) -->
<svg
class="w-5 h-5 hidden"
data-theme-icon="light"
fill="none" fill="none"
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
@ -22,9 +36,10 @@
d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"
></path> ></path>
</svg> </svg>
<!-- Dark icon (moon) -->
<svg <svg
class="hidden w-5 h-5 dark:block" class="w-5 h-5 hidden"
id="moonIcon" data-theme-icon="dark"
fill="none" fill="none"
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
@ -39,17 +54,62 @@
</button> </button>
<script> <script>
function setupDarkModeToggle() { function getThemePreference(): 'auto' | 'light' | 'dark' {
const toggle = document.getElementById('darkModeToggle'); const stored = localStorage.getItem('theme');
if (stored === 'light' || stored === 'dark') return stored;
return 'auto';
}
toggle?.addEventListener('click', () => { function getEffectiveDark(preference: 'auto' | 'light' | 'dark'): boolean {
document.documentElement.classList.toggle('dark'); if (preference === 'dark') return true;
const isDark = document.documentElement.classList.contains('dark'); if (preference === 'light') return false;
localStorage.setItem('theme', isDark ? 'dark' : 'light'); return window.matchMedia('(prefers-color-scheme: dark)').matches;
}
function applyTheme(preference: 'auto' | 'light' | 'dark') {
const isDark = getEffectiveDark(preference);
document.documentElement.classList.toggle('dark', isDark);
updateIcon(preference);
updateAriaLabel(preference);
}
function updateIcon(preference: 'auto' | 'light' | 'dark') {
document.querySelectorAll<HTMLElement>('[data-theme-icon]').forEach(icon => {
icon.classList.toggle('hidden', icon.dataset.themeIcon !== preference);
});
}
function updateAriaLabel(preference: 'auto' | 'light' | 'dark') {
const toggle = document.getElementById('darkModeToggle');
const labels = { auto: 'Thème : automatique', light: 'Thème : clair', dark: 'Thème : sombre' };
toggle?.setAttribute('aria-label', labels[preference]);
}
const cycle: Record<string, 'light' | 'dark' | 'auto'> = { auto: 'light', light: 'dark', dark: 'auto' };
function setupDarkModeToggle() {
const toggle = document.getElementById('darkModeToggle');
const preference = getThemePreference();
applyTheme(preference);
toggle?.addEventListener('click', () => {
const current = getThemePreference();
const next = cycle[current];
if (next === 'auto') {
localStorage.removeItem('theme');
} else {
localStorage.setItem('theme', next);
}
applyTheme(next);
});
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
if (getThemePreference() === 'auto') {
applyTheme('auto');
}
}); });
} }
// Run on page load and on Astro navigation
setupDarkModeToggle(); setupDarkModeToggle();
document.addEventListener('astro:after-swap', setupDarkModeToggle); document.addEventListener('astro:after-swap', setupDarkModeToggle);
</script> </script>

View file

@ -15,10 +15,8 @@ const { title } = Astro.props;
<!-- Used to add dark mode right away, adding here prevents any flicker --> <!-- Used to add dark mode right away, adding here prevents any flicker -->
<script is:inline> <script is:inline>
if (typeof Storage !== 'undefined') { if (typeof Storage !== 'undefined') {
if ( var theme = localStorage.getItem('theme');
localStorage.getItem('dark_mode') && if (theme === 'dark' || (!theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
localStorage.getItem('dark_mode') == 'true'
) {
document.documentElement.classList.add('dark') document.documentElement.classList.add('dark')
} }
} }

View file

@ -11,7 +11,7 @@ import Layout from "../../layouts/main.astro";
جليل عرفاوي جليل عرفاوي
</h1> </h1>
<h2 class="mb-6 text-xl font-medium text-neutral-600 dark:text-neutral-300 md:text-2xl"> <h2 class="mb-6 text-xl font-medium text-neutral-600 dark:text-neutral-300 md:text-2xl">
مطوّر • عاشق للمسرح • هاوي للتصوير مطوّر • ممثل • مصوّر
</h2> </h2>
<p class="mb-8 text-lg text-neutral-600 dark:text-neutral-400 leading-relaxed"> <p class="mb-8 text-lg text-neutral-600 dark:text-neutral-400 leading-relaxed">
مرحبًا بكم في عالمي الإبداعي حيث يلتقي الكود بالفن مرحبًا بكم في عالمي الإبداعي حيث يلتقي الكود بالفن
@ -30,11 +30,10 @@ import Layout from "../../layouts/main.astro";
<div class="relative justify-end w-full mt-12 md:flex md:pr-10 md:w-1/2 md:mt-0"> <div class="relative justify-end w-full mt-12 md:flex md:pr-10 md:w-1/2 md:mt-0">
<div class="relative z-50 w-full max-w-sm mx-auto"> <div class="relative z-50 w-full max-w-sm mx-auto">
<div class="absolute top-6 left-6 z-40 w-20 h-20 rounded-full bg-gradient-to-br from-blue-400 to-purple-600 animate-pulse"></div>
<div class="relative z-30 p-1 bg-gradient-to-br from-blue-500 via-purple-500 to-pink-500 rounded-3xl"> <div class="relative z-30 p-1 bg-gradient-to-br from-blue-500 via-purple-500 to-pink-500 rounded-3xl">
<div class="bg-white dark:bg-neutral-950 rounded-3xl p-4"> <div class="bg-white dark:bg-neutral-950 rounded-3xl p-4">
<img <img
src="/assets/images/photo.png" src="/assets/images/jalil-2.jpg"
alt="جليل عرفاوي" alt="جليل عرفاوي"
loading="eager" loading="eager"
decoding="auto" decoding="auto"
@ -47,11 +46,9 @@ import Layout from "../../layouts/main.astro";
</div> </div>
</div> </div>
<!-- Universe Cards Section -->
<div dir="rtl" lang="ar" class="relative z-20 w-full max-w-6xl mx-auto mt-24 px-7 xl:px-0"> <div dir="rtl" lang="ar" class="relative z-20 w-full max-w-6xl mx-auto mt-24 px-7 xl:px-0">
<div class="grid grid-cols-1 md:grid-cols-3 gap-8"> <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<!-- Professional Universe -->
<div class="group relative overflow-hidden bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-blue-950/30 dark:to-indigo-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-blue-200/50 dark:border-blue-800/30"> <div class="group relative overflow-hidden bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-blue-950/30 dark:to-indigo-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-blue-200/50 dark:border-blue-800/30">
<div class="absolute top-4 left-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">💻</div> <div class="absolute top-4 left-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">💻</div>
<div class="relative z-10"> <div class="relative z-10">
@ -59,7 +56,7 @@ import Layout from "../../layouts/main.astro";
المطوّر المطوّر
</h3> </h3>
<p class="text-blue-700 dark:text-blue-300 mb-6 leading-relaxed"> <p class="text-blue-700 dark:text-blue-300 mb-6 leading-relaxed">
شغوف بحرفة البرمجة، TDD والهندسة النظيفة. خبير في TypeScript و Node.js و DevOps. شغوف بحرفة البرمجة، DDD والهندسة النظيفة. خبير في TypeScript و Node.js.
</p> </p>
<div class="space-y-3"> <div class="space-y-3">
<span class="block text-blue-400/50 dark:text-blue-600/50 cursor-not-allowed" title="قيد الإنشاء"> <span class="block text-blue-400/50 dark:text-blue-600/50 cursor-not-allowed" title="قيد الإنشاء">
@ -75,7 +72,6 @@ import Layout from "../../layouts/main.astro";
</div> </div>
</div> </div>
<!-- Theater Universe -->
<div class="group relative overflow-hidden bg-gradient-to-br from-yellow-50 to-orange-100 dark:from-yellow-950/30 dark:to-orange-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-yellow-200/50 dark:border-yellow-800/30"> <div class="group relative overflow-hidden bg-gradient-to-br from-yellow-50 to-orange-100 dark:from-yellow-950/30 dark:to-orange-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-yellow-200/50 dark:border-yellow-800/30">
<div class="absolute top-4 left-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">🎭</div> <div class="absolute top-4 left-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">🎭</div>
<div class="relative z-10"> <div class="relative z-10">
@ -83,23 +79,16 @@ import Layout from "../../layouts/main.astro";
المسرح المسرح
</h3> </h3>
<p class="text-orange-700 dark:text-orange-300 mb-6 leading-relaxed"> <p class="text-orange-700 dark:text-orange-300 mb-6 leading-relaxed">
عاشق للمسرح ومبدع للمحتوى الفكاهي. من خشبة المسرح إلى وسائل التواصل الاجتماعي، استكشاف فن الإضحاك. مرتجل شغوف، أستكشف أيضًا المسرح المكتوب والتمثيل أمام الكاميرا.
</p> </p>
<div class="space-y-3"> <div class="space-y-3">
<span class="block text-orange-400/50 dark:text-orange-600/50 cursor-not-allowed" title="قيد الإنشاء"> <span class="block text-orange-400/50 dark:text-orange-600/50 cursor-not-allowed" title="قيد الإنشاء">
← المسار الفني 🚧 ← المسار الفني 🚧
</span> </span>
<span class="block text-orange-400/50 dark:text-orange-600/50 cursor-not-allowed" title="قيد الإنشاء">
← عروضي 🚧
</span>
<span class="block text-orange-400/50 dark:text-orange-600/50 cursor-not-allowed" title="قيد الإنشاء">
← مدوّنة المسرح 🚧
</span>
</div> </div>
</div> </div>
</div> </div>
<!-- Photography Universe -->
<div class="group relative overflow-hidden bg-gradient-to-br from-purple-50 to-pink-100 dark:from-purple-950/30 dark:to-pink-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-purple-200/50 dark:border-purple-800/30"> <div class="group relative overflow-hidden bg-gradient-to-br from-purple-50 to-pink-100 dark:from-purple-950/30 dark:to-pink-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-purple-200/50 dark:border-purple-800/30">
<div class="absolute top-4 left-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">📸</div> <div class="absolute top-4 left-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">📸</div>
<div class="relative z-10"> <div class="relative z-10">
@ -107,25 +96,22 @@ import Layout from "../../layouts/main.astro";
التصوير التصوير
</h3> </h3>
<p class="text-purple-700 dark:text-purple-300 mb-6 leading-relaxed"> <p class="text-purple-700 dark:text-purple-300 mb-6 leading-relaxed">
هاوي تصوير فوتوغرافي، ألتقط اللحظات وأروي القصص من خلال العدسة. هاوي تصوير فوتوغرافي شغوف. التقاط اللحظة، ورواية قصة من خلال العدسة.
</p> </p>
<div class="space-y-3"> <div class="space-y-3">
<a href="/photo" class="block text-purple-600 dark:text-purple-400 hover:text-purple-800 dark:hover:text-purple-200 font-medium"> <a href="/photo" class="block text-purple-600 dark:text-purple-400 hover:text-purple-800 dark:hover:text-purple-200 font-medium">
← معرض الصور ← معرض الصور
</a> </a>
<span class="block text-purple-400/50 dark:text-purple-600/50 cursor-not-allowed" title="قيد الإنشاء"> <a href="/photo/blog" class="block text-purple-600 dark:text-purple-400 hover:text-purple-800 dark:hover:text-purple-200 font-medium">
← الألبومات 🚧 ← مُدوّنة الصور
</span> </a>
<span class="block text-purple-400/50 dark:text-purple-600/50 cursor-not-allowed" title="قيد الإنشاء">
← مدوّنة التصوير 🚧
</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- Blog Section --> <!-- Blog Section
<div dir="rtl" lang="ar" class="relative z-20 w-full max-w-6xl mx-auto mt-24 px-7 xl:px-0"> <div dir="rtl" lang="ar" class="relative z-20 w-full max-w-6xl mx-auto mt-24 px-7 xl:px-0">
<div class="text-center mb-12"> <div class="text-center mb-12">
<h2 class="text-3xl font-bold text-neutral-800 dark:text-neutral-200 mb-4"> <h2 class="text-3xl font-bold text-neutral-800 dark:text-neutral-200 mb-4">
@ -146,6 +132,7 @@ import Layout from "../../layouts/main.astro";
</span> </span>
</div> </div>
</div> </div>
-->
<!-- Contact Section --> <!-- Contact Section -->
<div dir="rtl" lang="ar" class="relative z-20 w-full max-w-6xl mx-auto mt-24 mb-16 px-7 xl:px-0"> <div dir="rtl" lang="ar" class="relative z-20 w-full max-w-6xl mx-auto mt-24 mb-16 px-7 xl:px-0">
@ -158,19 +145,19 @@ import Layout from "../../layouts/main.astro";
</p> </p>
<div class="flex justify-center space-x-6 space-x-reverse"> <div class="flex justify-center space-x-6 space-x-reverse">
<a href="https://linkedin.com/in/jalil" class="p-3 bg-blue-600 text-white rounded-full hover:bg-blue-700 transition-colors"> <a href="https://linkedin.com/in/jalil" target="_blank" rel="noopener noreferrer" class="p-3 bg-blue-600 text-white rounded-full hover:bg-blue-700 transition-colors">
<svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24"> <svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/> <path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
</svg> </svg>
</a> </a>
<a href="https://github.com/jalilarfaoui" class="p-3 bg-neutral-800 text-white rounded-full hover:bg-neutral-900 transition-colors"> <a href="https://github.com/jalilarfaoui" target="_blank" rel="noopener noreferrer" class="p-3 bg-neutral-800 text-white rounded-full hover:bg-neutral-900 transition-colors">
<svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24"> <svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/> <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg> </svg>
</a> </a>
<a href="mailto:contact@jalil.arfaoui.net" class="p-3 bg-green-600 text-white rounded-full hover:bg-green-700 transition-colors"> <a href="mailto:jalil@arfaoui.net" class="p-3 bg-green-600 text-white rounded-full hover:bg-green-700 transition-colors">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" /> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
</svg> </svg>
@ -178,4 +165,4 @@ import Layout from "../../layouts/main.astro";
</div> </div>
</div> </div>
</div> </div>
</Layout> </Layout>

View file

@ -11,7 +11,7 @@ import Link from "../../components/Link.astro";
description="حرفي في البرمجة، عاشق للمسرح، هاوي للتصوير الفوتوغرافي." description="حرفي في البرمجة، عاشق للمسرح، هاوي للتصوير الفوتوغرافي."
/> />
<img src="/assets/images/photo.png" class="relative z-30 w-full my-10 rounded-xl" alt="جليل عرفاوي" /> <img src="/assets/images/jalil.jpg" class="relative z-30 w-full my-10 rounded-xl" alt="جليل عرفاوي" />
<h2 class="mb-4 text-2xl font-bold dark:text-neutral-200">من أنا؟</h2> <h2 class="mb-4 text-2xl font-bold dark:text-neutral-200">من أنا؟</h2>
<div class="space-y-4 text-gray-600 dark:text-neutral-400 leading-relaxed"> <div class="space-y-4 text-gray-600 dark:text-neutral-400 leading-relaxed">

View file

@ -11,7 +11,7 @@ import Link from "../../components/Link.astro";
description="Code craftsman, theater enthusiast, photography lover." description="Code craftsman, theater enthusiast, photography lover."
/> />
<img src="/assets/images/photo.png" class="relative z-30 w-full my-10 rounded-xl" alt="Jalil Arfaoui" /> <img src="/assets/images/jalil.jpg" class="relative z-30 w-full my-10 rounded-xl" alt="Jalil Arfaoui" />
<h2 class="mb-4 text-2xl font-bold dark:text-neutral-200">Who am I?</h2> <h2 class="mb-4 text-2xl font-bold dark:text-neutral-200">Who am I?</h2>
<div class="space-y-4 text-gray-600 dark:text-neutral-400 leading-relaxed"> <div class="space-y-4 text-gray-600 dark:text-neutral-400 leading-relaxed">

View file

@ -2,7 +2,7 @@
import Layout from "../../layouts/main.astro"; import Layout from "../../layouts/main.astro";
--- ---
<Layout title="Jalil Arfaoui - Developer • Actor • Photographer"> <Layout title="Jalil Arfaoui - Developer • Comedian • Photographer">
<!-- Hero Section --> <!-- Hero Section -->
<div class="relative z-20 w-full max-w-6xl mx-auto mt-16 px-7 md:mt-24 lg:mt-32 xl:px-0"> <div class="relative z-20 w-full max-w-6xl mx-auto mt-16 px-7 md:mt-24 lg:mt-32 xl:px-0">
<div class="flex flex-col items-center md:flex-row"> <div class="flex flex-col items-center md:flex-row">
@ -11,7 +11,7 @@ import Layout from "../../layouts/main.astro";
Jalil Arfaoui Jalil Arfaoui
</h1> </h1>
<h2 class="mb-6 text-xl font-medium text-neutral-600 dark:text-neutral-300 md:text-2xl"> <h2 class="mb-6 text-xl font-medium text-neutral-600 dark:text-neutral-300 md:text-2xl">
Developer • Theater enthusiast • Photography lover Developer • Comedian • Photographer
</h2> </h2>
<p class="mb-8 text-lg text-neutral-600 dark:text-neutral-400 leading-relaxed"> <p class="mb-8 text-lg text-neutral-600 dark:text-neutral-400 leading-relaxed">
Welcome to my creative universe where code meets art Welcome to my creative universe where code meets art
@ -30,11 +30,10 @@ import Layout from "../../layouts/main.astro";
<div class="relative justify-end w-full mt-12 md:flex md:pl-10 md:w-1/2 md:mt-0"> <div class="relative justify-end w-full mt-12 md:flex md:pl-10 md:w-1/2 md:mt-0">
<div class="relative z-50 w-full max-w-sm mx-auto"> <div class="relative z-50 w-full max-w-sm mx-auto">
<div class="absolute top-6 right-6 z-40 w-20 h-20 rounded-full bg-gradient-to-br from-blue-400 to-purple-600 animate-pulse"></div>
<div class="relative z-30 p-1 bg-gradient-to-br from-blue-500 via-purple-500 to-pink-500 rounded-3xl"> <div class="relative z-30 p-1 bg-gradient-to-br from-blue-500 via-purple-500 to-pink-500 rounded-3xl">
<div class="bg-white dark:bg-neutral-950 rounded-3xl p-4"> <div class="bg-white dark:bg-neutral-950 rounded-3xl p-4">
<img <img
src="/assets/images/photo.png" src="/assets/images/jalil-2.jpg"
alt="Jalil Arfaoui" alt="Jalil Arfaoui"
loading="eager" loading="eager"
decoding="auto" decoding="auto"
@ -47,11 +46,9 @@ import Layout from "../../layouts/main.astro";
</div> </div>
</div> </div>
<!-- Universe Cards Section -->
<div class="relative z-20 w-full max-w-6xl mx-auto mt-24 px-7 xl:px-0"> <div class="relative z-20 w-full max-w-6xl mx-auto mt-24 px-7 xl:px-0">
<div class="grid grid-cols-1 md:grid-cols-3 gap-8"> <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<!-- Professional Universe -->
<div class="group relative overflow-hidden bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-blue-950/30 dark:to-indigo-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-blue-200/50 dark:border-blue-800/30"> <div class="group relative overflow-hidden bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-blue-950/30 dark:to-indigo-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-blue-200/50 dark:border-blue-800/30">
<div class="absolute top-4 right-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">💻</div> <div class="absolute top-4 right-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">💻</div>
<div class="relative z-10"> <div class="relative z-10">
@ -59,7 +56,7 @@ import Layout from "../../layouts/main.astro";
Developer Developer
</h3> </h3>
<p class="text-blue-700 dark:text-blue-300 mb-6 leading-relaxed"> <p class="text-blue-700 dark:text-blue-300 mb-6 leading-relaxed">
Passionate about Software Craftsmanship, TDD and clean architecture. TypeScript, Node.js and DevOps expert. Passionate about Software Craftsmanship, DDD and Clean Architecture. TypeScript and Node.js expert.
</p> </p>
<div class="space-y-3"> <div class="space-y-3">
<span class="block text-blue-400/50 dark:text-blue-600/50 cursor-not-allowed" title="Under construction"> <span class="block text-blue-400/50 dark:text-blue-600/50 cursor-not-allowed" title="Under construction">
@ -75,7 +72,6 @@ import Layout from "../../layouts/main.astro";
</div> </div>
</div> </div>
<!-- Theater Universe -->
<div class="group relative overflow-hidden bg-gradient-to-br from-yellow-50 to-orange-100 dark:from-yellow-950/30 dark:to-orange-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-yellow-200/50 dark:border-yellow-800/30"> <div class="group relative overflow-hidden bg-gradient-to-br from-yellow-50 to-orange-100 dark:from-yellow-950/30 dark:to-orange-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-yellow-200/50 dark:border-yellow-800/30">
<div class="absolute top-4 right-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">🎭</div> <div class="absolute top-4 right-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">🎭</div>
<div class="relative z-10"> <div class="relative z-10">
@ -83,23 +79,16 @@ import Layout from "../../layouts/main.astro";
Theater Theater
</h3> </h3>
<p class="text-orange-700 dark:text-orange-300 mb-6 leading-relaxed"> <p class="text-orange-700 dark:text-orange-300 mb-6 leading-relaxed">
Theater enthusiast and creator of humorous content. Exploring the art of making people laugh, from stage to social media. Passionate improviser, I'm also exploring written theater and on-camera acting.
</p> </p>
<div class="space-y-3"> <div class="space-y-3">
<span class="block text-orange-400/50 dark:text-orange-600/50 cursor-not-allowed" title="Under construction"> <span class="block text-orange-400/50 dark:text-orange-600/50 cursor-not-allowed" title="Under construction">
→ Artistic journey 🚧 → Artistic journey 🚧
</span> </span>
<span class="block text-orange-400/50 dark:text-orange-600/50 cursor-not-allowed" title="Under construction">
→ My shows 🚧
</span>
<span class="block text-orange-400/50 dark:text-orange-600/50 cursor-not-allowed" title="Under construction">
→ Theater blog 🚧
</span>
</div> </div>
</div> </div>
</div> </div>
<!-- Photography Universe -->
<div class="group relative overflow-hidden bg-gradient-to-br from-purple-50 to-pink-100 dark:from-purple-950/30 dark:to-pink-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-purple-200/50 dark:border-purple-800/30"> <div class="group relative overflow-hidden bg-gradient-to-br from-purple-50 to-pink-100 dark:from-purple-950/30 dark:to-pink-950/30 rounded-3xl p-8 hover:scale-105 transition-all duration-300 border border-purple-200/50 dark:border-purple-800/30">
<div class="absolute top-4 right-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">📸</div> <div class="absolute top-4 right-4 text-4xl opacity-20 group-hover:opacity-40 transition-opacity">📸</div>
<div class="relative z-10"> <div class="relative z-10">
@ -107,25 +96,22 @@ import Layout from "../../layouts/main.astro";
Photography Photography
</h3> </h3>
<p class="text-purple-700 dark:text-purple-300 mb-6 leading-relaxed"> <p class="text-purple-700 dark:text-purple-300 mb-6 leading-relaxed">
Photography hobbyist capturing moments and telling stories through the lens. Passionate photography enthusiast. Capturing the moment, telling a story through the lens.
</p> </p>
<div class="space-y-3"> <div class="space-y-3">
<a href="/photo" class="block text-purple-600 dark:text-purple-400 hover:text-purple-800 dark:hover:text-purple-200 font-medium"> <a href="/photo" class="block text-purple-600 dark:text-purple-400 hover:text-purple-800 dark:hover:text-purple-200 font-medium">
→ Photo portfolio → Photo portfolio
</a> </a>
<span class="block text-purple-400/50 dark:text-purple-600/50 cursor-not-allowed" title="Under construction"> <a href="/photo/blog" class="block text-purple-600 dark:text-purple-400 hover:text-purple-800 dark:hover:text-purple-200 font-medium">
→ Galleries 🚧 → Photo Feed
</span> </a>
<span class="block text-purple-400/50 dark:text-purple-600/50 cursor-not-allowed" title="Under construction">
→ Photo blog 🚧
</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- Blog Section --> <!-- Blog Section
<div class="relative z-20 w-full max-w-6xl mx-auto mt-24 px-7 xl:px-0"> <div class="relative z-20 w-full max-w-6xl mx-auto mt-24 px-7 xl:px-0">
<div class="text-center mb-12"> <div class="text-center mb-12">
<h2 class="text-3xl font-bold text-neutral-800 dark:text-neutral-200 mb-4"> <h2 class="text-3xl font-bold text-neutral-800 dark:text-neutral-200 mb-4">
@ -146,6 +132,7 @@ import Layout from "../../layouts/main.astro";
</span> </span>
</div> </div>
</div> </div>
-->
<!-- Contact Section --> <!-- Contact Section -->
<div class="relative z-20 w-full max-w-6xl mx-auto mt-24 mb-16 px-7 xl:px-0"> <div class="relative z-20 w-full max-w-6xl mx-auto mt-24 mb-16 px-7 xl:px-0">
@ -158,19 +145,19 @@ import Layout from "../../layouts/main.astro";
</p> </p>
<div class="flex justify-center space-x-6"> <div class="flex justify-center space-x-6">
<a href="https://linkedin.com/in/jalil" class="p-3 bg-blue-600 text-white rounded-full hover:bg-blue-700 transition-colors"> <a href="https://linkedin.com/in/jalil" target="_blank" rel="noopener noreferrer" class="p-3 bg-blue-600 text-white rounded-full hover:bg-blue-700 transition-colors">
<svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24"> <svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/> <path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
</svg> </svg>
</a> </a>
<a href="https://github.com/jalilarfaoui" class="p-3 bg-neutral-800 text-white rounded-full hover:bg-neutral-900 transition-colors"> <a href="https://github.com/jalilarfaoui" target="_blank" rel="noopener noreferrer" class="p-3 bg-neutral-800 text-white rounded-full hover:bg-neutral-900 transition-colors">
<svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24"> <svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/> <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg> </svg>
</a> </a>
<a href="mailto:contact@jalil.arfaoui.net" class="p-3 bg-green-600 text-white rounded-full hover:bg-green-700 transition-colors"> <a href="mailto:jalil@arfaoui.net" class="p-3 bg-green-600 text-white rounded-full hover:bg-green-700 transition-colors">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" /> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
</svg> </svg>
@ -178,4 +165,4 @@ import Layout from "../../layouts/main.astro";
</div> </div>
</div> </div>
</div> </div>
</Layout> </Layout>