diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 0000000..e9761f9 --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "portfolio-php", + "runtimeExecutable": "php", + "runtimeArgs": ["-d", "post_max_size=20M", "-d", "upload_max_filesize=20M", "-S", "localhost:8090"], + "port": 8090 + } + ] +} diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..4a65525 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,12 @@ +{ + "permissions": { + "allow": [ + "mcp__Claude_Preview__preview_screenshot", + "mcp__Claude_Preview__preview_start", + "mcp__Claude_Preview__preview_stop", + "Bash(php -l *)", + "mcp__Claude_Preview__preview_console_logs", + "mcp__Claude_Preview__preview_resize" + ] + } +} diff --git a/database/scriptDatabase.sql b/database/scriptDatabase.sql index bc87f45..e718bea 100644 --- a/database/scriptDatabase.sql +++ b/database/scriptDatabase.sql @@ -165,4 +165,18 @@ ADD COLUMN pdf_filename VARCHAR(255) NULL; ALTER TABLE schools ADD COLUMN pdf_data LONGBLOB NULL, -ADD COLUMN pdf_filename VARCHAR(255) NULL; \ No newline at end of file +ADD COLUMN pdf_filename VARCHAR(255) NULL; + +-- ============================================================ +-- Juillet 2026 (5) : icône Devicon en alternative à l'image pour +-- le bandeau de logos (surtout utile pour "Outils que je sais +-- manipuler" : Devicon est un équivalent gratuit de Font Awesome +-- dédié aux logos d'outils/langages/frameworks, cf. devicon.dev) +-- ============================================================ + +-- icon : classes CSS Devicon (ex: "devicon-docker-plain colored"), prioritaire sur logo_url +-- si les deux sont renseignés. logo_url devient facultatif : il faut au moins l'un des deux +-- (validé côté PHP), pour les outils absents de Devicon (Proxmox, GLPI, FOG...) +ALTER TABLE logo_banners +ADD COLUMN icon VARCHAR(100) NULL AFTER name, +MODIFY COLUMN logo_url VARCHAR(255) NULL; \ No newline at end of file diff --git a/elements/header.php b/elements/header.php index 07b3a9b..113350d 100644 --- a/elements/header.php +++ b/elements/header.php @@ -52,6 +52,9 @@ $currentPage = basename($_SERVER['PHP_SELF']); + +
diff --git a/functions/listLogos.php b/functions/listLogos.php index dcb763f..8f335ae 100644 --- a/functions/listLogos.php +++ b/functions/listLogos.php @@ -12,11 +12,13 @@ function listeLogos($category = null) { global $dbh; try { + // SELECT * : la colonne icon est optionnelle (le bandeau continue de fonctionner + // avec les logos déjà en place même si la migration SQL n'a pas encore été exécutée) if ($category !== null) { - $stmt = $dbh->prepare('SELECT id, category, name, logo_url, link_url, position FROM logo_banners WHERE category = :category ORDER BY position ASC, id ASC'); + $stmt = $dbh->prepare('SELECT * FROM logo_banners WHERE category = :category ORDER BY position ASC, id ASC'); $stmt->bindValue(':category', $category, PDO::PARAM_STR); } else { - $stmt = $dbh->prepare('SELECT id, category, name, logo_url, link_url, position FROM logo_banners ORDER BY category ASC, position ASC, id ASC'); + $stmt = $dbh->prepare('SELECT * FROM logo_banners ORDER BY category ASC, position ASC, id ASC'); } $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); @@ -30,7 +32,7 @@ function recupererLogoParId($id) { global $dbh; try { - $stmt = $dbh->prepare('SELECT id, category, name, logo_url, link_url, position FROM logo_banners WHERE id = :id'); + $stmt = $dbh->prepare('SELECT * FROM logo_banners WHERE id = :id'); $stmt->bindValue(':id', $id, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC); @@ -39,6 +41,20 @@ function recupererLogoParId($id) { } } +// Fonction interne qui affiche le contenu visuel d'une tuile : une icône Devicon si elle est +// renseignée (prioritaire), sinon l'image. Ne retourne rien si aucun des deux n'est présent. +function afficherLogoVisuel($logo) { + $icone = trim($logo['icon'] ?? ''); + $image = trim($logo['logo_url'] ?? ''); + $nom = htmlspecialchars($logo['name']); + + if ($icone !== '') { + echo ''; + } elseif ($image !== '') { + echo '' . $nom . '
'; diff --git a/functions/listSkills.php b/functions/listSkills.php index 02f2991..7b0562b 100644 --- a/functions/listSkills.php +++ b/functions/listSkills.php @@ -32,6 +32,41 @@ function recupererSkillParId($id) { } } +// Icônes Devicon dont la couleur de marque "colored" est noire ou quasi-noire (vérifié dans +// devicon.min.css : linux #000, apple #000, bash #293138, ansible #1a1918) : invisibles sur +// la tuile sombre du bandeau. On les affiche dans la couleur claire par défaut à la place. +const DEVICON_COLORED_TROP_SOMBRE = ['devicon-linux-plain', 'devicon-apple-plain', 'devicon-bash-plain', 'devicon-ansible-plain']; + +// Fonction interne qui affiche le visuel (icône ou image) d'un item de compétence. +// Format accepté avant le "|" : soit des classes d'icône (Font Awesome ou Devicon), soit +// "img:URL" pour utiliser une vraie image de logo (pour les outils absents des polices +// d'icônes, ex : GLPI, FOG, Proxmox, VirtualBox, Guacamole). +// $colorise active les vraies couleurs de marque des icônes Devicon (utilisé uniquement +// pour le bandeau de la home : sur la page Compétences les icônes restent en orange +// uniforme, cohérent avec le reste de la liste) +function afficherVisuelItem($itemIcone, $classe = '', $colorise = false) { + if (strpos($itemIcone, 'img:') === 0) { + $image = htmlspecialchars(substr($itemIcone, 4)); + echo '+ Le bandeau "Outils que je sais manipuler" est désormais dérivé automatiquement de la + page Compétences (icône dans le champ "icone|texte" de chaque item). + Cette section ne gère plus que le bandeau "Ils m'ont fait confiance". +