Autre chose, tous les scripts JS sont externes, sauf dans un dossier "bb" qui contient un forum avec des scripts dans les pages html.
Afin d'éviter script-src 'unsafe-inline' Gemini suggère cette méthode :

Dans le .htaccess

Header always set Content-Security-Policy "script-src 'self' 'nonce-%{UNIQUE_ID}e';"


Modifiez vos balises <script> dans le dossier /bb

<script nonce="<?php echo $_SERVER['UNIQUE_ID']; ?>">
    // Votre code JavaScript actuel ici
    console.log("Ce script inline s'exécute en toute sécurité !");
</script>


Qu'en pensez-vous ?
Modifié par boteha_2 (11 Oct 2026 - 12:52)
Salut,
je ne réponds pas à ta question, mais c'est un problème que soulève Niuxe.
Il faut faire très attention aux images de fond. Est-ce vraiment ça que recherchent les visiteurs ?
Pour revenir à ta question, as-tu essayé de prendre toi-même des photos de motifs entiers ?
Quelles sont les informations que le menuisier veut faire passer ?
Et en effet, l'image de la page d'accueil ne peut pas être en "Lazyloading.
Enfin, il y a des astuces. Regarde ce site, comment il adopte une image background sans menus :
https://setze.fr/
Bonjour et bienvenue sur le forum !

Tu soulignes des points techniques très justes :
- WebP/AVIF,
- accessibilité

C'est une très bonne démarche.

Cependant, du point de vue conception visuelle et de la mise en page, il faut toutefois garder en tête cette hiérarchie visuelle :

1. La clarté de l'information : la lisibilité et la hiérarchie des contenus restent prioritaires.
2. La composition : l'équilibre des blancs et la structure des blocs.
3. La typographie et le contraste : une bonne mise au point du texte.

La texture de fond n'est qu'un détail. Elle ne doit venir qu'en tout dernier lieu pour soutenir la direction artistique (ici le côté artisanal du bois), sans jamais venir parasiter les trois points évoqués. Si elle attire l'œil ou gêne la lecture, cela devient contre-productif : tu fatigues ton lecteur et il risque de repartir sans même consulter le document.

Par ailleurs, un effet qui paraît sympa ou original au premier abord peut vite devenir fatigant à la longue. Le cerveau doit lutter pour filtrer le fond et se concentrer sur le texte, ce qui accélère la fatigue visuelle. Il est nettement préférable de faire simple et efficace. Personnellement, je suis adepte du minimalisme.
___

- Mise en page et impression
- Règles de l'écriture typographique du français
- Mise en page(s), etc.
- Grid systems in graphic design
Modifié par Niuxe (07 Oct 2026 - 19:35)
Bonjour à tous,

Je travaille en ce moment sur un petit site vitrine pour un artisan menuisier, et je me suis retrouvé face à un problème que beaucoup d'entre vous ont sans doute déjà rencontré : trouver des textures de fond (bois, papier, béton léger) qui soient à la fois discrètes, répétables sans couture visible et suffisamment légères pour ne pas plomber le temps de chargement.

Jusqu'ici, je piochais dans des banques d'images gratuites, mais j'avais toujours le même souci : soit la licence était floue, soit la texture se répétait de façon évidente dès qu'on l'utilisait en background-repeat sur un grand écran. J'ai donc testé plusieurs approches ces dernières semaines et je voulais partager mon retour, et surtout avoir vos avis.

1) La génération par IA
J'ai essayé un ai texture generator -https://imgtoimg-ai.com/usecase/ai-texture-generator : on décrit la matière voulue (par exemple « chêne clair, grain fin, légèrement usé ») et l'outil propose des tuiles carrées censées être raccordables. Le résultat est plutôt bluffant pour des fonds décoratifs. Il faut tout de même vérifier les bords à la main : sur une dizaine de tuiles, deux ou trois présentaient une petite rupture de motif visible à 1920 px de large.

2) L'optimisation derrière
Une fois la tuile choisie, je l'exporte en 512×512, puis je la convertis en WebP et en AVIF avec un fallback JPEG via image-set(). Sur un fond bois, je passe ainsi d'environ 180 Ko à moins de 30 Ko en AVIF, sans différence perceptible une fois le contenu par-dessus.

3) L'accessibilité et le contraste
Point important que j'ai failli oublier : une texture, même discrète, réduit le contraste du texte. J'ajoute systématiquement un léger voile (background-color semi-transparent en superposition) et je contrôle le ratio avec l'outil de contraste du navigateur. Pour les utilisateurs qui activent prefers-contrast: more, je supprime carrément la texture.

4) Le CSS utilisé
Rien de très exotique : background-image avec image-set, background-size fixé à 256px pour garder un grain fin sur écrans haute densité, et un background-attachment classique (j'évite fixed qui pose des soucis de performance sur mobile).

Mes questions pour vous :
- Est-ce que vous utilisez des textures générées pour vos projets clients, ou est-ce que vous restez sur de la photo réelle ?
- Avez-vous une méthode fiable pour détecter automatiquement les raccords ratés d'une tuile avant de la mettre en production ?
- AVIF en fond CSS : vous le servez déjà partout, ou vous attendez encore ?

Merci d'avance pour vos retours, je mettrai à jour le sujet avec ce que j'aurai appris !
Modifié par Felipe (07 Oct 2026 - 14:22)
Pas la main sur le html, mais la main sur le css, alors qu'une partie (?) de ce css est sur la page html. Étrange.
De plus, ces espaces sont très corrects. Les titres doivent être bien séparés du texte qui les suit.
Je ne changerai rien de ce côté.
Bonjour,

Je développe Calculateur Gratuit et je souhaiterais un regard extérieur sur l’interface de cette page :
https://calculateur-gratuit.fr/outils/calcul-pourcentage/

Le calculateur propose dix modes, avec des boutons tels que « X % d’une valeur », « % d’un total », « Évolution » et « Points de % ». Les résultats changent immédiatement pendant la saisie. La page utilise Next.js, React et TypeScript.

Mon interrogation concerne surtout le choix du mode et la lecture du résultat sur mobile. Pour un calcul de 80 à 100, le mode « Évolution » donne +25 %. Dans l’autre sens, de 100 à 80, on obtient −20 % : la valeur de référence change. Cet exemple me semble utile pour vérifier que les intitulés restent compréhensibles.

J’aimerais vos avis sur trois points :
- Comprend-on assez vite la différence entre « % d’un total » et « Évolution », ou faudrait-il afficher une question concrète avant les boutons ?
- Sur un petit écran, les différents résultats et la formule se distinguent-ils suffisamment ?
- Lors de la navigation au clavier et de la saisie de nombres décimaux, voyez-vous un obstacle ou une information manquante ?

Je suis le créateur du site. Je cherche des remarques précises sur ces éléments pour guider les améliorations. Merci pour vos critiques.
Bonjour

J'ai un soucis de CSS sur la page https://qua.name/rolistologie/revue-de-presse-octobre-2026
Pour contexte, je n'ai pas la main sur le HTML, uniquement le CSS.

Mon problème, il y a un étrange espacement entre les h2 et les p de l'article, par exemple entre "Incendie du château de Monchat" et "Un nouveau drame lié à la canicule et au manque de moyen des pompiers."

Toutes les margins (annoncées et effectivement calculées par le navigateur) sont bien à 0, il n'y a pas de padding...
Est-ce que vous auriez une idée pour expliquer cet espacement (en vue de le supprimer) ?

Merci
Bonjour,

1) J'oublie SMTP.
Je ne sais pas si cela diminue la sécurité mais c'est plus fluide.

use PHPMailer\PHPMailer\PHPMailer;
// use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;


2) Je n'oublie pas d'aller chercher 2 scripts dans le dossier PHPMailer.

require_once 'PHPMailer/src/PHPMailer.php';
// require_once 'PHPMailer/src/SMTP.php';
require_once 'PHPMailer/src/Exception.php';


Au moins ça marche...
Modifié par boteha_2 (03 Oct 2026 - 19:41)
Rodolphe a écrit :
- Git
- Docker
- VsCode et ses extensions (dont git graph, todotree, project manager)
- Frameworks et autres outillages : npm/pnpm, vite, vue/nuxt, postcss, stylelint, eslint, prettier, sqlite
- Côté PHP : composer, phpstan
- Screenshotage : ShareX sous Windows, Snapzy sous macOS
- Linux : ncdu, htop, lazygit

J&apos;ai essayé plusieurs fois de trouver des Terminaux plus évolués que les natifs (Tabby, Termius...), mais pour le moment rien ne m&apos;a convaincu.


À propos de htop, as tu essayé btop ? Pour manipuler les fichiers dans un terminal, as tu essayé yazi

As tu essayé kitty ? J'ai eu d'excellents échos de ce terminal. Personnellement, j'utilise gnome terminal couplé avec tmux.
- Git
- Docker
- VsCode et ses extensions (dont git graph, todotree, project manager)
- Frameworks et autres outillages : npm/pnpm, vite, vue/nuxt, postcss, stylelint, eslint, prettier, sqlite
- Côté PHP : composer, phpstan
- Screenshotage : ShareX sous Windows, Snapzy sous macOS
- Linux : ncdu, htop, lazygit

J'ai essayé plusieurs fois de trouver des Terminaux plus évolués que les natifs (Tabby, Termius...), mais pour le moment rien ne m'a convaincu.
connecté
Ah, Rust ! Tu peux nous raconter un peu tes projets avec ce language ? Ce serait cool de pouvoir partager entre nous sur le forum.

J'ai fait mon premier projet "hello world" avec ce language, vers mars-avril de cette année, un calendrier liturgique, comme toujours lorsque j'apprends un nouveau langage (node.js, F#...) ; mais contrairement aux autres tentatives, cette fois je suis allé jusqu'au bout du delire. Je vous ferais une présentation à l'occasion.

Anymah a écrit :
C’est pas un langage orienté web même s’il existe des frameworks qui rendent cela possible.

Il existe des solutions, très peu nombreuses, et je ne les ai pas étudié, on peut aussi créer des projets avec des outils bas niveau tels que Tokyo, Axium et Maud.

Je suis en train de créer ma propre solution PostgreSQL/ Rust, Marius, mais Rust est la partie ennuyeuse de l'histoire, car j'ai surtout misé sur des architectures issues des moteurs de jeux et du trading haute fréquence. Ça ressemble plus à un compilateur ou un système d'exploitation qu'à un framework web au final, mais ce sera quand-même un CMS. Ça fait maintenant plusieurs mois que je bosse dessus et je ne pense pas que j'aurais terminé d'ici plusieurs mois encore. D'ailleurs, est-ce un projet qui peut se terminer en réalité ?
Modifié par Olivier C (23 Sep 2026 - 18:08)
Hello !

Merci pour le partage !

Pour ma part, le premier outil dont je ne peux pas me passer c’est la stack JetBrains pour les IDEs. Ils sont très complets et possèdent des fonctionnalités subtiles qui rendent le développement bien plus agréable (le gestionnaire de base de données intégré par exemple). Comme mentionné au-dessus, Zed c’est un IDE qui vaut la peine d’être testé pour tous ceux qui utilisent VSCode. C’est écrit en Rust, donc c’est hyper léger et rapide. Par contre, l’interface elle casse des codes établis depuis longtemps. On aime ou pas.

Je sais pas si on peut considérer un langage comme un outil, mais pour ma part j’ai bien aimé développer en Rust ces derniers temps. Il a le vent en poupe dans les toutes les grandes institutions, entre autres en raison de sa nature sécurisée de gérer la mémoire et sa rapidité d’exécution. La différence entre VSCode et Zed c’est un exemple. C’est pas un langage orienté web même s’il existe des frameworks qui rendent cela possible.

En ce qui concerne les base de données, je suis convaincu par PostgreSql aussi. C’est hautement extensible, au point où l’on peut résoudre des problématiques habituellement résolues plus haut-niveau. Rien que pour ça, les ORMs sont à éviter. Je pense que c’est plus intéressant de maîtriser correctement un dialecte, créer et optimiser ses requêtes soi-même.

Vous avez mentionné Git aussi, perso je le trouve juste indispensable en fait. C’est pas négociable. Je ne vois pas comment on peut travailler sur un projet sérieux sans versionning, au moins SVN même si c’est dépassé.

Et sinon, je bosse sous macOS. Je trouve le système super efficace, avec une stack entière pré-installée pour les développeurs, le reste s’installe en une ligne de commande avec Brew. C’est une architecture proche de Linux, maîtriser l’un rends confortable avec l’autre.
Modifié par Anymah (22 Sep 2026 - 21:09)
Bonjour,

Je développe Cœur de Famille, un espace familial privé qui réunit arbre, photos, événements et souvenirs des proches. Je cherche des regards extérieurs sur la lisibilité du parcours : une personne peu habituée aux outils de généalogie comprend-elle comment passer de l’arbre aux souvenirs d’un proche ?

La page de présentation : https://coeurdefamille.fr/memoire-familiale

Un exemple fictif accessible sans compte : https://coeurdefamille.fr/demo?start=69&person=69#profil

La Fiche Mémoire rassemble biographie, repères de vie, photos anciennes et anecdotes. J’aimerais surtout vos critiques sur la hiérarchie de l’information, les libellés et la navigation sur mobile. Qu’est-ce qui vous paraît peu clair au premier passage ? Merci pour vos retours.
Modifié par Florent_CoeurFamille (22 Sep 2026 - 11:45)
connecté
Bonjour Niuxe,

a écrit :
Ta question est relativement vague.

Oui, c'est vrai, je reformule :

Quels sont les outils de développement dont vous ne pourriez plus vous passer ? Et surtout, pour quels cas d'usage concrets ?

Ce qui motive cette question : la recherche des points de friction, les trucs qui agacent (toujours intéressant à décortiquer).

a écrit :
À une époque, j'utilisais Atom. Puis, je me suis remis à Vim. Parce que VSC, non merci !

Tu as vu que l'équipe d'Atom a sorti Zed ? Un IDE très rapide, qui d'ailleurs peut-être utilisé de manière optimisée pour Vim. Il est écrit en Rust.. Bon, par contre le logo il a été dessiné par le stagiaire. Je l'ai essayé et il est clair que sa vitesse est sans comparaison avec un Visual Studio Code qui, lui, fonctionne sur meteor.js, avec toute la lourdeur que cela implique, même si les équipes de Microsoft se sont évertuées à améliorer le framework open source pour les besoins de leur logiciel.

Cependant je reste encore sous VSC pour l'instant : j'ai du mal à m'adapter à l'ergonomie de Zed. Quand à Vim, je ne m'y fait pas, le manque de pratique sans doute, je ne tape pas assez de code pour en tirer parti.

FastAPI... Je suis allé voir parce que je ne connaissais pas du tout (d'une manière générale je ne connais pas l'écosystème Python). J'ai été intrigué car le développeur insiste sur la rapidité de son framework, or je sais que Python s'appuie souvent sur C en arrière plan, c'est le cas notamment lorsqu'on lance un serveur en Python. Donc j'ai vérifié, pour FastApi c'est bien le cas : le framework s'appuie sur Pydantic pour sa sérialisation / désérialisation des données, librairie qui elle-même a récemment été réécrite en Rust. Et bien sûr, sous le capot, il y a aussi... du C. FastAPI semble faire tout ce qu'il peut pour supprimer les couches d'abstraction inutiles.

À côté de cela SQLAlchemy est presque l'antithèse : en bon ORM, des couches d'abstraction il en traverse tant et plus (sans compter le problème du N+1). J'imagine qu'en contrepartie on y gagne en productivité mais, les ORMs et moi c'est une grande histoire de désamour. Rien que d'apprendre une nouvelle syntaxe pour chacun d'entre eux ça me déprime, je préfère taper directement du SQL, d'autant plus que, maintenant, les LLMs peuvent absorber la complexité de cette implémentation.

PostgreSQL, ma base de données relationnelle favorite. Pour moi, elle reste pertinente même pour le Data-Oiented Design face aux bases de données par colonnes (OLAP) en raison de sa capacité à envoyer des notifications (LISTEN/NOTIFY).

Par contre, et c'est un grand manquement de ma parr : je n'ai encore jamais testé SQLite. Stack réputée pour être topissime. Cela ne manquera pas d'arriver, j'attends seulement d'avoir un projet lié à de l'embarqué.

Un dernier mot sur Git, mon meilleur ami... et mon pire ennemi ! Qu'est-ce que j'ai pu galérer avec lui parfois ! J'en ai même écrit un post-mortem pour ne pas oublier mes déboires avec lui. Et encore, je développe en solo...
Modifié par Olivier C (22 Sep 2026 - 23:08)
Salut Olivier, Smiley smile

Ta question est relativement vague.

Olivier C a écrit :

Parmi les outils que vous utilisez pour le développement, quels sont ceux dont vous ne pourriez vous passer (par exemple Vite.js) ? Et surtout pour quels cas d'utilisation pratique ?


Debian et plus généralement GNU/Linux. Parce que Windows pour le développement, c'est une blague (ormis si on développe en Cb et/ou en .not)

Olivier C a écrit :

Je ne parle pas des IDEs

Et si, je pense que c'est aussi une réel question. À une époque, j'utilisais Atom. Puis, je me suis remis à Vim. Parce que VSC, non merci ! Depuis, mon Vim (+ tmux) est ultra customisé et je n'envie pas VSC. Demain, je dois changer d'IDE, j'irai me pendre (au moins ça).

Pour les frameworks ou libriairie ou Database :
- Jinja
- SQLAlchemy
- Django
- Flask
- Fastapi
- PostgrSQL
- Sqlite3
- Git

Côté JS, en fait pas grand chose. Bien que ViteJS soit un excellent outil, il n'est pas essentiel. Enfin, je dirai NodeJS et npm pour l'indispensable.
connecté
Bonjour à tous,

Le forum est calme en ce moment et depuis quelques temps déjà (merci les LLMs), j'en profite donc pour vous poser une question par curiosité :

Parmi les outils que vous utilisez pour le développement, quels sont ceux dont vous ne pourriez vous passer (par exemple Vite.js) ? Et surtout pour quels cas d'utilisation pratique ?

Ou encore, l'outil existe mais n'est pas optimal pour vos besoins, où il n'est plus maintenu, etc... **

Toutes stacks confondues, on ne se limite pas à NPM. La question ne se limite pas non plus à un domaine : en principe on parle du web, mais pas exclusivement.
Je ne parle pas des IDEs, par contre leurs plugins ça compte. On ne parle pas non plus des LLMs et de leur workflow, on parle uniquement des outils déterministes.

C'est à vous.

---

** Ce fût par exemple le cas pour moi avec Stylus, un préprocesseur CSS, cet exemple date un peu ; actuellement je trouve que Pug, un système de templating HTML, suis le même chemin
Modifié par Olivier C (21 Sep 2026 - 12:07)
Bonjour.

Je cherche à créer des albums photo qui s affiche correctement sur tout les supports.

Le problème est le suivant mon menu s affiche bien sur mon ordinateur mais sur mon téléphone c'est une autre pair de manche..

Le menu hamburger que j'ai créer ne s 'affiche correctement qu'une fois qu'il a été cliqué. C'est à dire que on voit pas mon header autrement qu'aprés avoir cliqué sur le menu hamburger.

J'ai bien essayé de régler le problème avec différente IA mais rien n'y fait. Je précise que je suis débutant désolé si le soucis paraît simple et que je vous fais perdre un peu de temps mais moi je n'ai pas trouvé la solution malgré de longue heures à chercher la solution Smiley confused .


voici le code :
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mes Albums Photos - Version Design Personnalisé</title>
    
    <!-- Styles de base de lightGallery + Plugins (Miniatures & Téléchargement) -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.7.2/css/lightgallery-bundle.min.css">
    <style>
        /* ========================================================
           VOS STYLES CSS PERSONNALISÉS (INTÉGRÉS)
           ======================================================== */
        body {
            background-image : url('fond.jpg');
            background-color : #440909;
            margin: 0px;
            margin-bottom : 10px;
            font-family : "Trebuchet MS", "sans serif";
            font-size: 14px;
            color : white;
        }

        #header{
            height : 112px;
            background: url('header.jpg');
            background-repeat : no-repeat;
            background-color : #5c0e1b; 
            border : 1px solid #25060b;
            margin: auto;
            margin-top : 0px;
        }

        h1,h2,h3,h4{
            border-left: 3px solid black;
            border-bottom : 1px solid black;
            border-radius: 4px;
			box-shadow: inset 0px 2px 5px rgba(0, 0, 0, 0.5);
            padding-left: 4px;
            width: 290px;
            padding-bottom: 3px;
            background: #701705;
            background-position : right;
            background-repeat: no-repeat;
            color: white;
            margin-top: 0px;
            font-size: 14px;
        }

#menu-toggle { display: none; }

/* ========== MENU RESPONSIVE ========== */

/* Bouton hamburger (caché sur grand écran) */
#menu-toggle {
    display: none;
    background: #680D15;
    border: 1px solid #25060b;
    border-radius: 4px;
    padding: 8px 12px;
    cursor: pointer;
    position: absolute;
    top: 10px;
    right: 15px;
    z-index: 200;
}

#menu-toggle span {
    display: block;
    width: 22px;
    height: 2px;
    margin: 5px 0;
    background: #ffffff;
    transition: 0.3s;
}

/* Version mobile */
@media (max-width: 700px) {

    #menu-toggle {
        display: block;
    }

    #menu {
        display: none;
        flex-direction: column;
        width: 100%;
        background-color: #680D15;          /* couleur du menu */
        border: 1px solid #25060b;
        border-radius: 4px;
        box-shadow: 3px 3px 8px rgba(0,0,0,0.5);
        position: absolute;
        top: 50px;
        left: 0;
        z-index: 150;
        padding: 10px 0;
    }

    #menu.ouvert {
        display: flex;
    }

    #menu dl {
        width: 100%;
        margin: 0;
        border: none;
        background-color: #701705;          /* couleur des boutons */
        border-bottom: 1px solid #25060b;
    }

    #menu dt {
        height: auto;
        padding: 12px 0;
        font-size: 15px;
    }

    #menu dt a {
        color: white;
        text-decoration: none;
        display: block;
    }

    #menu dt:hover {
        background-color: #5c0e1b;          /* couleur au survol */
    }
}


#menu-toggle span {
  display: block; width: 22px; height: 2px; margin: 5px 0;
  background: #fff;
}
@media (max-width: 600px) {
  #menu-toggle { display: block; }
  #menu { display: none; flex-direction: column; }
  #menu.ouvert { display: flex; }
}

      #menu { 
	box-shadow: 3px 3px 5px 0 rgba(0, 0, 0, 0.5); 
	border-radius : 4px; 
    width: 100%;
    font-family: "Arial";
    font-size: 12px;
    background-color: #680D15;
    border: 1px solid #25060b;
    height: 20px;
    position: relative;
    top: 96px;           
    margin-bottom: 96px; 
    left: -1px;
    z-index: 100;
        }

       #menu dl {
	background-color: #701705;
	border-left: 1px solid black;
	border-right: 1px solid black;
	border-radius: 2px;
    float: left;
    width: 150px; 
    margin: 0px;
    color: white;
    margin-left: 25px;
}

        #menu dt{
            cursor: pointer;
            text-align: center;
            font-weight: bold;
            color: white;
            height: 19px;
        }

        #menu dd{ 
            text-align : center;
            color: white;
            margin: 0;
            padding: 0;
            list-style-type: none;
        }

        #menu ul{	   
            margin: 0;
            padding: 0;
            list-style-type: none;
        }

        #menu li{
          
            
            width: 107px;
            height : 19px;
            border: 1px solid #25060b;
            border-top : 0px;
            text-align: center;
            color: white;
            list-style-type: none;
            padding: 0px;
            padding-top: 4px;
        }

        #menu li a:hover{		  
            padding-top: 1px;
            text-align: center;
        }

        #menu li a, #menu dt a{	 
            color: white;
            text-decoration: none;
            display: block;
            height: 100%;
            border: 0 none;
        }

        #menu li a:hover{ color: white; }
        #menu dt a:hover{ color: white; }

        #nav{
            padding: 0;
            height: 20px;
            position: relative;
            top : -30px;
            left: 132px;
        }

        #navlist{
            margin: 0px;
            padding: 0px 0px;
            display: block;
        }

        #navlist li{
            list-style: none;
            float: left;
            border-right : 1px solid #bababa;
        }

        #nav a, #navlist li.extend{
            margin: 0px;
            display: block;
            border-bottom: 1px solid black;
            padding: 1px 6px;
            text-decoration: none;
            background: white;
            font: normal 12px verdana, serif;
            color: black;
        }

        #nav a:hover{
            position : relative;
            top : 1px;
            z-index: 100;
        }

        #menu a#current{
            padding: 0px 5px;
            padding-top : 65px;
            background: #651220;
            border: 1px solid #25060b;
            border-bottom : 0px;
            color: black;
            font-weight : bold;
            height : 92px;
            position : relative;
            top : -22px;
            z-index: 100;
        }

        #photo a{ text-decoration: none; }	
        #photo a:hover{ background: none; }
        #photo a:span{ display: none; }

        #photo a:hover span{ 
            display: inline;
            position : absolute;
            top: 24px; 
            left: 22px;
            width: 536px;
            height: 304px;
            background: none;
            color: #efefd3;
        }

        div.contenu { 
    width: 98%; 
    border: 1px solid #25060b;
    background: #651220;
    padding: 4px;
    padding-top: 15px;    
    padding-bottom: 12px;
    color: white;
    position: relative;     
    margin: 0 auto;         
    margin-top: 10px;       
    margin-bottom: 10px;
    
    min-height: 550px;
    box-sizing: border-box; 
}
		
        div.contenu ul { margin: 8px; padding: 8px; }
        div.contenu li { margin-bottom: 6px; }

        #foot {
            border: 1px dashed #74474e;
            background-color : #671926;
            text-align : center;
            color : black;
            font-weight : bold;
            margin-top : 50px;
            padding : 8px;
        }

        /* ========================================================
           STYLES PROPRES À LA GRILLE DES ALBUMS (ADAPTATIF MOBILE)
           ======================================================== */
        .section-album {
            margin-bottom: 40px;
        }
        .galerie-grille {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
            gap: 15px;
            margin-top: 15px;
        }
        .galerie-grille a {
            display: block;
            overflow: hidden;
            border-radius: 6px;
            box-shadow: 0 4px 8px rgba(0,0,0,0.3);
            border: 1px solid #25060b;
        }
        .galerie-grille img {
            width: 100%;
            height: 150px;
            object-fit: cover;
            display: block;
            transition: transform 0.3s ease;
        }
        .galerie-grille a:hover img {
            transform: scale(1.05);
        }
    </style>

</head>
<body>

    <!-- ZONE DE L'ENTÊTE -->
    <div id="header">
<button id="menu-toggle" aria-label="Ouvrir le menu">
  <span></span><span></span><span></span>
</button>
<div id="menu">
 <dl>
                <dt><a href="#ancres-album photo general">album general</a></dt>
            </dl>
            <dl>
                <dt><a href="#ancres-album nature">album nature</a></dt>
            </dl>
            <dl>
        <dt><a href="#ancres-album dessin">album dessin</a></dt>
    </dl>
</div>   

    <!-- ZONE PRINCIPALE DE CONTENU (Reçoit vos albums) -->
    <div class="contenu">

        <!-- ALBUM 1 -->
        <div id="ancres-album photo general" class="section-album">
            <h2>album photo général</h2>
            <div id="album-general" class="galerie-grille">
                <a href="album_photo_general/1.jpg" data-src="album_photo_general/1.jpg">
                    <img src="album_photo_general/miniatures/1.jpg" alt=""loading="lazy" />
                </a>
                 <a href="album_photo_general/2.jpg" data-src="album_photo_general/2.jpg">
                    <img src="album_photo_general/miniatures/2.jpg" alt="" loading="lazy"/>
                </a>
                 <a href="album_photo_general/3.jpg" data-src="album_photo_general/3.jpg">
                    <img src="album_photo_general/miniatures/3.jpg" alt="" loading="lazy"/>
                </a>
        		 <a href="album_photo_general/4.jpg" data-src="album_photo_general/4.jpg">
                    <img src="album_photo_general/miniatures/4.jpg" alt="" loading="lazy" />
                </a>
        		 <a href="album_photo_general/5.jpg" data-src="album_photo_general/5.jpg">
                    <img src="album_photo_general/miniatures/5.jpg" alt="" loading="lazy"/>
                </a>
        		 <a href="album_photo_general/6.jpg" data-src="album_photo_general/6.jpg">
                    <img src="album_photo_general/miniatures/6.jpg" alt="" loading="lazy"/>
                </a>
        		 <a href="album_photo_general/7.jpg" data-src="album_photo_general/7.jpg">
                    <img src="album_photo_general/miniatures/7.jpg" alt="" loading="lazy"/>
                </a>
        		 <a href="album_photo_general/8.jpg" data-src="album_photo_general/8.jpg">
                    <img src="album_photo_general/miniatures/8.jpg" alt="" loading="lazy"/>
                </a>
        		 <a href="album_photo_general/9.jpg" data-src="album_photo_general/9.jpg">
                    <img src="album_photo_general/miniatures/9.jpg" alt="" loading="lazy"/>
                </a>
        		 <a href="album_photo_general/10.jpg" data-src="album_photo_general/10.jpg">
                    <img src="album_photo_general/miniatures/10.jpg" alt="" loading="lazy"/>
                </a>
        		 <a href="album_photo_general/11.png" data-src="album_photo_general/11.png">
                    <img src="album_photo_general/miniatures/11.png" alt="" loading="lazy"/>
                </a>
        
            </div>
        </div>

        <!-- ALBUM 2 -->
         <div id="ancres-album nature" class="section-album">
            <h2>album nature</h2>
            <div id="album-nature" class="galerie-grille">
                <a href="album_nature/1.jpg" data-src="album_nature/1.jpg">
                    <img src="album_nature/miniatures/1.jpg" alt="" loading="lazy"/>
                </a>
                <a href="album_nature/2.jpg" data-src="album_nature/2.jpg">
                    <img src="album_nature/miniatures/2.jpg" alt="" loading="lazy"/>
                </a>
                <a href="album_nature/3.jpg" data-src="album_nature/3.jpg">
                    <img src="album_nature/miniatures/3.jpg" alt="" loading="lazy"/>
                </a>
                <a href="album_nature/4.jpg" data-src="album_nature/4.jpg">
                    <img src="album_nature/miniatures/4.jpg" alt="" loading="lazy"/>
                </a>
                <a href="album_nature/5.jpg" data-src="album_nature/5.jpg">
                    <img src="album_nature/miniatures/5.jpg" alt="" loading="lazy"/>
                </a>
                <a href="album_nature/6.jpg" data-src="album_nature/6.jpg">
                    <img src="album_nature/miniatures/6.jpg" alt="" loading="lazy" />
                </a>
                <a href="album_nature/7.jpg" data-src="album_nature/7.jpg">
                    <img src="album_nature/miniatures/7.jpg" alt="" loading="lazy"/>
                </a>
         <a href="album_nature/8.jpg" data-src="album_nature/8.jpg">
                    <img src="album_nature/miniatures/8.jpg" alt="" loading="lazy"/>
                </a>
        <a href="album_nature/9.jpg" data-src="album_nature/9.jpg">
                    <img src="album_nature/miniatures/9.jpg" alt="" loading="lazy"/>
                </a>
        
            </div>
        </div>

        <!-- PIED DE PAGE INTERNE -->
        <div id="foot">
            © Mon Site Photo - Tous droits réservés
        </div>

    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.2/lightgallery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.2/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.2/plugins/download/lg-download.min.js"></script>
    
    <script>
        // Options partagées (Miniatures + Téléchargement)
        const optionsGalerie = {
            speed: 500,
            licenseKey: '0000-0000-000-0000',
            plugins: [lgThumbnail, lgDownload], 
            download: true,
            thumbnail: true,
            showThumbByDefault: true
        };

        // Activation des galeries
        lightGallery(document.getElementById('album_photo_general'), optionsGalerie);
        lightGallery(document.getElementById('album_nature'), optionsGalerie);
    </script>
 <script>
 	document.getElementById('menu-toggle')
 	 .addEventListener('click', function () {
    document.getElementById('menu').classList.toggle('ouvert');
  });
</script>
</body>
</html>
Salut,
Ceci fonctionne chez moi. J'ai aussi un peu galéré pour l'installer.
require_once "PHPMailer/src/Exception.php";
	require_once "PHPMailer/src/PHPMailer.php";
	require_once "PHPMailer/src/SMTP.php";
	
	use PHPMailer\PHPMailer\PHPMailer;
	use PHPMailer\PHPMailer\SMTP;
	use PHPMailer\PHPMailer\Exception;

As-tu bien ça aussi :
$courriel->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;            
		$courriel->Port       = 465;

Voilà déjà un moment que je l'ai installé, mais je me souviens avoir eu un problème avec le port.
Rectification.

Si :

$mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;


Le message d'erreur devient :

Fatal error: Uncaught PHPMailer\PHPMailer\Exception: SMTP Error: Could not connect to SMTP host. in /home/monsite/www/PHPMailer603/src/PHPMailer.php:2465 Stack trace: #0 /home/monsite/www/PHPMailer603/src/PHPMailer.php(2235): PHPMailer\PHPMailer\PHPMailer->smtpConnect(Array) #1 /home/monsite/www/PHPMailer603/src/PHPMailer.php(1855): PHPMailer\PHPMailer\PHPMailer->smtpSend('Date: Sat, 12 S...', '--b1=_MQmAq9YlS...') #2 /home/monsite/www/PHPMailer603/src/PHPMailer.php(1670): PHPMailer\PHPMailer\PHPMailer->postSend() #3 /home/monsite/www/MailHeaderCab.php(611): PHPMailer\PHPMailer\PHPMailer->send() #4 /home/monsite/www/mailTraitecab.php(560): Envoi_Mail(Array, 'contact@monsite...', 'Adresse IP : 78...', 'adm') #5 {main} thrown in /home/monsite/www/PHPMailer603/src/PHPMailer.php on line 2465
Bonjour casper2,

J'ai essayé mais cela m'envoie le même message d'erreur.
Je connais la doc github, elle ne répond pas à mon problème.

J'ai essayé :

$mail = new PHPMailer\PHPMailer\PHPMailer(true);
avec
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
ou
$mail->SMTPSecure =PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
ou
$mail->SMTPSecure =PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;


Et idem avec :

$mail = new PHPMailer(true);


Toujours la même erreur.

Je précise que je n'autilise par le composer et que les scripts PHPMailer sont dans le dossier PHPMailer603.
Modifié par boteha_2 (12 Sep 2026 - 17:14)
Bonjour,

J'utilise PHPMailer depuis des années, cela marche bien sauf quand OVH me bloque des mails car SMTP n'est soi-disant pas activé.

J'ai donc ajouté quelques lignes de code préconisées chez Ionos :

use PHPMailer\PHPMailer\PHPMailer;

// Ajout
use PHPMailer\PHPMailer\SMTP;
// Fin ajout

use PHPMailer\PHPMailer\Exception;

require_once 'PHPMailer603/src/PHPMailer.php';

// Ajout
require_once 'PHPMailer603/src/SMTP.php';
// Fin ajout

require_once 'PHPMailer603/src/Exception.php';

$mail = new PHPMailer\PHPMailer\PHPMailer;

// Ajout
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
// Fin ajout


Et je me prends l'erreur :

Uncaught Error: Class "PHPMailer" not found

Avez-vous une explication ?
Modifié par boteha_2 (12 Sep 2026 - 15:42)
connecté
Le problème ne se situe pas forcément dans la qualité du site ou de l'application, il faut se mettre à la place des utilisateurs :

Les gens sont habitués à faire ça avec des outils gratuits, fiables, et déjà présents dans leur interface de smartphone ou PC. Concrètement leur agenda (Google Calendar, etc) ou, plus simplement encore, une alarme.

Pourquoi alors prendre un abonnement payant ? Qui plus est pour un produit dont on ne connaît pas la fiabilité ? Et dont on ne sait même pas s'il existera dans un an ou deux ?

À mon avis la réflexion se situe à ce niveau.
crossyroad a écrit :
Je trouve l’idée vraiment utile, surtout pour centraliser les rappels du quotidien et éviter d’oublier les rendez-vous ou l’entretien de la maison. Le fait de partir d’un besoin concret pour ses parents rend aussi le projet très parlant


Merci pour le retour, ça fait presque un an que je retourne le problème dans tout les sens, le principe est simple mais la simplicité des fois c'est pas le plus facile à faire...
connecté
Pour @if je comprends, mais tu vois, pour ce cas d'usage précis, celui donné dans l'exemple, j'opterais pour une approche vanilla CSS tout de même :

:root {
  color-scheme: light dark;

  --shadow-core-1: 0 2px 4px rgba(0, 0, 0, 0.1);
  --shadow-core-2: 0 4px 8px rgba(0, 0, 0, 0.15);
  --shadow-core-3: 0 8px 16px rgba(0, 0, 0, 0.2);

  --shadow-glow-dark: 0 0 12px rgba(255, 255, 255, 0.05);

  /* Thème clair par défaut */
  --elevation-1: var(--shadow-core-1);
  --elevation-2: var(--shadow-core-2);
  --elevation-3: var(--shadow-core-3);
}

@media (prefers-color-scheme: dark) {
  :root {
      /* Concaténation de ombre + Lueur */
      --elevation-1: var(--shadow-core-1), var(--shadow-glow-dark);
      --elevation-2: var(--shadow-core-2), var(--shadow-glow-dark);
      --elevation-3: var(--shadow-core-3), var(--shadow-glow-dark);
  }
}

.card {
  box-shadow: var(--elevation-2);
}

.modal {
  box-shadow: var(--elevation-3);
}

Petit bonus ici : Le composant .card ignore totalement s'il est en thème clair ou sombre. Il n'a pas besoin de la classe utilitaire .modal-dark. Il demande le "niveau 2", et le pipeline CSS lui fournit la donnée exacte pré-calculée à la racine.

---

Tout ça m'a titillé alors j'ai cherché : apparemment, l'intérêt de @if de nos jours serait de supprimer du code mort, en ciblant la plateforme qui devra supporter l'application.
On pourrait alors faire par exemple :

@if $target-profile == 'embedded' {
  // Un fallback pour du legacy :
  border: 1px solid rgba(0, 0, 0, 0.15);
  background-color: #ffffff;
} @else {
  // Pour le support standard :
  background-color: rgba(255, 255, 255, 0.8);
  backdrop-filter: blur(#{$depth}px);
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  will-change: transform;
}

Donc, quelque chose d'externe à la logique du code ; c'est un invariant très fort pour moi, et suffisant pour que j'apprenne à m'en passer pour l'instant si le CSS vanilla est suffisant.

---

Pour la boucle @for par contre, je suis convaincu moi aussi par le besoin, je l'ai intégré à mon pipeline d'ailleurs. MAIS : je l'utilise de façon naïve, juste des itérations avec i :
.demo-items-color {
  $demoColorDeg: 15;
  $demoColorDeviation: 7;

  @for $i from 1 to 15 {
    & > :nth-child($(i)n) {
      background-color: hsl(calc($i * $demoColorDeviation - $demoColorDeviation + $demoColorDeg),
          100%,
          50%);
    }
  }
}

Cela me fait prendre conscience d'une chose : il manque à mon pipeline une résolution AOT de calc() lorsque cela est possible, résolution que fait un plugin comme PostCSS Calc :

/* Avant : */
h1 {
  font-size: calc(16px * 2);
  height: calc(100px - 2em);
  width: calc(2 * var(--base-width));
  margin-bottom: calc(16px * 1.5);
}


/* Après : */
h1 {
  font-size: 32px;
  height: calc(100px - 2em);
  width: calc(2 * var(--base-width));
  margin-bottom: 24px;
}

Il faudra donc que j'ajoute cette fonctionnalité à mon pipeline. Rien que pour avoir trouvé l'importance builder calc() lorsque c'est possible (mon intuition initiale, mais je ne l'avais pas mise en œuvre) ça valait le coup de vous poser la question sur le forum. Je vous remercie pour cela.

Bonne soirée à vous.
Modifié par Olivier C (04 Sep 2026 - 13:05)
Olivier C a écrit :
Effectivement, j&apos;avais oublié ce sujet d&apos;il y a 9 mois...
Je vous remercie messieurs.

Niuxe, si tu as le temps de poster un exemple concret pour l&apos;utilisation de @if et @else je suis preneur. Chez moi je n&apos;arrive pas à trouver de cas où leurs utilisations seraient pertinentes.


Yep, Smiley smile
Prenons cet exemple concret :
Tu dois créer un design systeme. tu veux une mixin simple pour appliquer des ombres (box-shadow), mais qui adapte son rendu si l'élément est sur fond sombre ou fond clair :


// Une map de configurations
$shadow-levels: (
  1: 0 2px 4px rgba(0, 0, 0, 0.1),
  2: 0 4px 8px rgba(0, 0, 0, 0.15),
  3: 0 8px 16px rgba(0, 0, 0, 0.2)
);

@mixin elevation($level: 1, $theme: 'light') {
  // vérifie le niveau demandé
  @if map-has-key($shadow-levels, $level) {
    
    // Traitement conditionnel selon le thème
    @if $theme == 'dark' {
      // Sur fond sombre, l'ombre noire ne se voit pas : ajoute une lueur (glow)
      box-shadow: map-get($shadow-levels, $level), 0 0 12px rgba(255, 255, 255, 0.05);
    } @else if $theme == 'light' {
      // Ombre classique pour fond clair
      box-shadow: map-get($shadow-levels, $level);
    } @else {
      @error "Le thème '#{$theme}' n'existe pas. Utilisez 'light' ou 'dark'.";
    }

  } @else {
    @warn "Niveau d'élévation invalide : #{$level}.";
  }
}

// --- Utilisation dans tes composants ---

.card {
  @include elevation(2, 'light');
}

.modal-dark {
  @include elevation(3, 'dark');
}


En CSS natif, tu devrais soit multiplier les classes utilitaires, soit répéter tes box-shadow à la main partout. .

À noter que la map peut être générée avec un @for :


@use "sass:map";
@use "sass:math";

// initialise une map vide
$shadow-levels: ();

// remplit dynamiquement avec la boucle @for
@for $i from 1 through 5 {
  $offset-y: $i * 2px;
  $blur: $i * 4px;
  $alpha: 0.05 + ($i * 0.05); // L'opacité augmente à chaque palier
  
  $shadow-value: 0 $offset-y $blur rgba(0, 0, 0, $alpha);

  // fusionne la nouvelle clé/valeur dans la map
  $shadow-levels: map.merge($shadow-levels, ($i: $shadow-value));
}


* je ne retrouve pas le fichier. Le code a été fait de tête. Je peux m'être trompé. C'est une piste à suivre dans le cas d'utilisation
Modifié par Niuxe (03 Sep 2026 - 15:15)
Salut Olivier,

De mon côté, je reste assez pragmatique et mes outils s'articulent autour de ViteJS comme bundler.

Pour le reste, ma stratégie dépend de la taille du projet :

- Projets légers / relativement moyens : Du CSS natif pur. Les évolutions récentes (nesting, custom properties, @layer, etc.) suffisent amplement dans 80 % des cas aujourd'hui.
- Gros projets / architectures complexes : Je reste fidèle à Sass.

Pourquoi Sass sur de grosses architectures alors que le natif a tant progressé ? Principalement pour sa puissance algorithmique que le CSS natif ne peut remplacer :

- @if et @for : Indispensables dès qu'il s'agit de générer des grilles, des échelles typographiques ou des utilitaires dynamiques.
- @mixin et @include : Pour encapsuler des motifs complexes sans répéter de code.
- @function : Pour traiter de la donnée, manipuler des couleurs ou calculer des échelles dynamiques directement à la compilation.

Côté méthodologie et organisation du code, j'utilise deux approches (suivant le projet) :

- L'Atomic Design pour la découpe composant/système de design.
- CUBE CSS (merci d'ailleurs à Raphaël pour la découverte de cette méthodologie).
Modifié par Niuxe (02 Sep 2026 - 01:34)
connecté
Bonjour à tous,

Bien sûr, il existe des enquêtes Stack Overflow, des npm trends et autres outils statistiques, mais pour vous-même : Vous utilisez quoi aujourd'hui comme outils de build pour vos styles ? Si vous en utilisez encore un d'ailleurs ? Et surtout pour quels types de projets (projet perso, d'envergure, legacy, etc) ?

Et ce qui m'intéresse le plus : quelles sont les fonctionnalités dont vous ne pouvez encore vous passer en 2026 ?

Pour vous inciter à répondre je commence par répondre moi-même à ma propre question :

Après avoir longtemps utilisé Stylus, désormais totalement legacy, n'avoir jamais été convaincu par le monolithe Sass, j'ai tenté PostCSS. Ce dernier vendait du rêve sur le papier, avançait sa modularité, mais dans la pratique il repose entièrement sur un écosystème composés de plugins tous autant chaotiques les uns que les autres : incompatibles entre eux souvent, deprecated du jour au lendemain. J'ai fini par adopter une solution maison, avec notamment Lightningcss.

Les avancés de CSS de ces 2 dernières années ont fait reculer le besoin viscéral d'avoir un préprocesseurs sur certains projets. Cependant, voici les fonctionnalités dont je ne peux me passer même aujourd'hui :

- Les variables : en effet, les custom properties ne seront jamais supportés par les media queries (@media) en raison du risque de récursivité infinie ; les @custom-media ne sont pas encore supportées et, de toute façon ne seront jamais supportés eux non plus par @container. Perso j'ai fait un système de variables qui supporte la syntaxe media queries level 5 **.
- Les mixins (@mixin et @include), mais je ne permet pas de descendre au-delà de 3 niveaux de récursivité, sinon je considère qu'il y a un problème de design ; en réalité, je devrais même interdire la récursivité pour cette feature...
- Fusion des @import, avec compatibilité layer(), en un unique fichier.
- Les boucles @for, à utiliser avec modération pour ne pas générer n'importe quoi.

Voilà, je crois que je n'ai rien oublié, j'ajouterais peut-être à terme la résolution de calc() sur les valeurs statiques, mais je ne permettrais pas les mélanges d'unités statiques comme le permet SASS, là encore je trouve que cela encourage les mauvais designs.

C'est à vous !

---

** Exemple :
$from-s-to-m: (50em < width <= 70em);

Modifié par Olivier C (02 Sep 2026 - 08:54)
Bonjour,

Je cherche des retours (HTML/CSS/clarté du texte, pas du référencement) sur Emis, un éditeur de devis et de factures PDF qui tourne dans le navigateur, sans compte.

Les pièces restent en localStorage. Gratuit avec filigrane ; 29 € une fois enlèvent le filigrane, à vie, sur ce navigateur.

Ce n'est pas une plateforme agréée, pas une e-facture, pas de Factur-X, pas Chorus Pro. Périmètre : devis, PDF particuliers, et PDF B2B jusqu'au 1er septembre 2027. Ensuite l'émission B2B passera par une PA. Emis n'en est pas une.

La mention de franchise par défaut est « TVA non applicable, art. L. 223 et s. du CIBS » (pas L. 233-3). Ce n'est pas un conseil fiscal.

Page : https://marine-anvil-swnt.here.now/
App : https://marine-anvil-swnt.here.now/app.html

Merci d'avance pour un regard franc, surtout si le discours 2026/2027 est ambigu ou si l'accessibilité cloche.
Rodolphe a écrit :

- les textes sont trop Claudés, on reconnaît sa plume partout Smiley rolleyes

Bongota a écrit :

Je ne savais pas que Claude avait un style, je n'ai jamais essayé cette IA.


Ça devient un jeu.
Rodolphe a écrit :

C'est du NextJS, la base de donnée c'est du SQLite, j'ai fait simple pour le moment.

J'adore SQLite, c'est la base la plus utilisée au monde. C'est un choix pratique avec un ORM pour prototaper. Attention aux promesses des ORM : on peut changer le driver (passer de SQLite à Postgres) en modifiant une ligne de config. Cepoendant, dans la vraie vie, le changement de dialecte (SQL) et de gestion des types (dates, booléens) apporte souvent son lot d'erreurs/bugs au moment de la migration.

En outre, garde en tête son fonctionnement : SQLite verrouille le fichier lors d'une écriture. Si ton appli est configurée en mode classique (sans le mode WAL) et qu'elle subit des écritures/lectures simultanées, tu risques des erreurs de type "database is locked". Pense au moins à passer en `PRAGMA journal_mode=WAL;` pour débloquer les lectures pendant les écritures.

Si tu cherches de la souplesse pour ton appli de rappels (surtout si tu manipules des structures de tâches très variables), regarder du côté d'une base orientée documents comme MongoDB (NoSQL) peut aussi être une option intéressante pour éviter d'avoir à gérer un schéma relationnel. Sinon, un bon vieux MySQL reste le standard dès qu'on veut un vrai serveur dédié.
Modifié par Niuxe (30 Aug 2026 - 21:32)
Bonjour Niuxe,

Ce serait mieux de passer par un web composant, je ne discute pas ce point, mais il me semble que cela m'oblige à changer la structure HTML et surtout je ne maîtrise pas du tout les web composants.

J'essaye de récupérer les éléments de ton web composant pour les intégrer dans un javascript traditionnel.

J'ai un peu avancé sur ce codepen, a priori sans bug, mais dès que j'essaye de mettre en œuvre la fonction updateTransform cela ne marche plus.

PS : je ne cible que la première image. Une fois que ce sera au point pour cette image je ferai une boucle pour les autres.
Rodolphe a écrit :
Hello, 2 retours très rapides (j&apos;avoue, je n&apos;ai pas testé pour le moment)

- on ne comprend pas exactement où on reçoit les rappels dans l&apos;introduction (&quot;là où vous regardez déjà : votre boîte mail, ou votre agenda si vous préférez&quot;, soit mais alors, précisément, ça fonctionne comment ? en tant que personne qui utilise des rappels et souhaite m&apos;organiser j&apos;aimerais savoir si je peux choisir, et parmi quelles solutions... ou bien si c&apos;est directement dans le site/application)
- les textes sont trop Claudés, on reconnaît sa plume partout Smiley rolleyes

Je ne savais pas que Claude avait un style, je n'ai jamais essayé cette IA. J'ai par contre vu que quelque chose ne collait pas toujours dans les textes, un sentiment étrange.
50 Dernières réponses