From 4802f23b727148209cc30826992b595aa9485687 Mon Sep 17 00:00:00 2001 From: tristan Date: Tue, 9 Jun 2026 16:16:31 +0200 Subject: [PATCH] feat(input) : anneau de focus clavier sur InputText et InputEmail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Anneau outline m-primary affiché uniquement à la navigation clavier (Tab), pas au clic souris. Composable partagé useKbdFocusRing (détection de modalité clavier/souris) + utilitaire CSS .m-focus-ring-kbd. Le visuel existant (grossissement, label flottant, bordure bleue) reste inchangé. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/assets/css/malio.css | 18 +++++++ app/components/malio/input/InputEmail.vue | 8 +++- app/components/malio/input/InputText.vue | 8 +++- .../malio/shared/useKbdFocusRing.ts | 48 +++++++++++++++++++ 4 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 app/components/malio/shared/useKbdFocusRing.ts diff --git a/app/assets/css/malio.css b/app/assets/css/malio.css index 2d5f716..95c5667 100644 --- a/app/assets/css/malio.css +++ b/app/assets/css/malio.css @@ -2,6 +2,24 @@ @tailwind components; @tailwind utilities; +@layer components { + /* Anneau de focus clavier standard (navigation au Tab), invisible à la souris. + Deux déclencheurs, même rendu : + - .m-focus-ring → s'appuie sur :focus-visible natif. Pour les éléments + où :focus-visible se limite déjà au clavier (boutons, + onglets, tuiles, checkbox/radio…). + - .m-focus-ring-kbd → classe ajoutée en JS (via useKbdFocusRing) uniquement + quand le focus vient du clavier. Pour les champs texte, + où :focus-visible natif se déclenche aussi à la souris. + Le `:focus` sur .m-focus-ring-kbd élève la spécificité pour passer devant le + `outline-none` des inputs. */ + .m-focus-ring:focus-visible, + .m-focus-ring-kbd:focus { + outline: 2px solid rgb(var(--m-primary) / 1); + outline-offset: 2px; + } +} + @layer base { :root { /* ── Globales ── */ diff --git a/app/components/malio/input/InputEmail.vue b/app/components/malio/input/InputEmail.vue index 95bb5a7..7ed98dc 100644 --- a/app/components/malio/input/InputEmail.vue +++ b/app/components/malio/input/InputEmail.vue @@ -19,8 +19,8 @@ type="email" inputmode="email" @input="onInput" - @focus="isFocused = true" - @blur="isFocused = false" + @focus="isFocused = true; onKbdFocus()" + @blur="isFocused = false; onKbdBlur()" >