From 0a7b881b70a8d699c391ade2583071f3ca0e2aa5 Mon Sep 17 00:00:00 2001 From: LBU Date: Wed, 26 Aug 2026 10:13:15 +0200 Subject: [PATCH 1/8] FSHSP-160 feat(editor): add color pickers, indentation and popup menus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fontFamily/fontSize: replace native . - Add indent/outdent tools (native execCommand passthrough, opt-in via tools like fontSize). - Add textColor/highlightColor tools, each opening a new ui-swatch-picker popup. Colors are written as ui-editor-color-*/ui-editor-highlight-* classes bound to --primitives-* tokens, never inline styles. - New ui-swatch-picker component (projects/ui-kit/forms/): color grid popup derived from primitives tokens, 2D roving-tabindex keyboard nav, listbox/option a11y pattern, reused by ui-editor for both pickers. - Regenerate docs manifest and component-vars (npm run docs:config). Docs: rewrite the "listes déroulantes" section of ui-editor.mdx to reflect the select/popup split and updated tool list. --- CHANGELOG.md | 56 +++ docs/components-index.md | 3 +- .../ui-editor/src/lib/ui-editor-commands.ts | 153 +++++++- .../forms/ui-editor/src/lib/ui-editor.html | 131 +++++-- .../forms/ui-editor/src/lib/ui-editor.scss | 75 +++- .../forms/ui-editor/src/lib/ui-editor.ts | 247 +++++++++++- projects/ui-kit/forms/ui-editor/ui-editor.mdx | 88 ++++- .../forms/ui-editor/ui-editor.stories.ts | 58 ++- .../forms/ui-swatch-picker/ng-package.json | 7 + .../src/lib/ui-swatch-picker.html | 60 +++ .../src/lib/ui-swatch-picker.scss | 109 ++++++ .../src/lib/ui-swatch-picker.ts | 360 ++++++++++++++++++ .../forms/ui-swatch-picker/src/public-api.ts | 5 + .../ui-swatch-picker/ui-swatch-picker.mdx | 102 +++++ .../ui-swatch-picker.stories.ts | 126 ++++++ 15 files changed, 1485 insertions(+), 95 deletions(-) create mode 100644 projects/ui-kit/forms/ui-swatch-picker/ng-package.json create mode 100644 projects/ui-kit/forms/ui-swatch-picker/src/lib/ui-swatch-picker.html create mode 100644 projects/ui-kit/forms/ui-swatch-picker/src/lib/ui-swatch-picker.scss create mode 100644 projects/ui-kit/forms/ui-swatch-picker/src/lib/ui-swatch-picker.ts create mode 100644 projects/ui-kit/forms/ui-swatch-picker/src/public-api.ts create mode 100644 projects/ui-kit/forms/ui-swatch-picker/ui-swatch-picker.mdx create mode 100644 projects/ui-kit/forms/ui-swatch-picker/ui-swatch-picker.stories.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d02326e..5b5b1a43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,62 @@ Le format suit [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/) et le pr - Réduit volontairement par rapport à PrimeNG : 4 directions (pas 8 — les diagonales), 2 dispositions (pas 4 — sans `quarter-circle`/`semi-circle`), et un seul étalonnage de touches clavier commun aux dispositions plutôt qu'un mappage par cas. `showTooltips` (booléen) simplifie `tooltipOptions` : la position suit automatiquement le sens de déploiement. - 5 hooks `--ui-speed-dial-*` (empan, décalage d'apparition des actions, rayon par défaut du cercle, palier d'empilement, assombrissement du masque). +- **`ui-editor` : outils `indent`/`outdent`** (FSHSP-160). Deux nouveaux `EditorButtonTool`, + passthrough direct sur `document.execCommand('indent'|'outdent')` — pas de marker ni de classe + à convertir, contrairement à `fontFamily`/`fontSize`. Absents de `DEFAULT_EDITOR_TOOLS` (même + logique que `fontSize` : opt-in via `tools`), icônes FontAwesome `indent`/`outdent`. + +- **`ui-editor` : outils `textColor`/`highlightColor`** (FSHSP-160). Deux nouveaux + `EditorButtonTool`, chacun ouvrant un `ui-swatch-picker` en popup (`size="small"`) ancré à son + bouton `ui-button`, plutôt qu'une commande directe — la sélection se fait dans le + `swatchSelect` du nuancier. Palette réutilisée depuis `DEFAULT_SWATCH_PALETTE` + (`ui-swatch-picker`) : `EDITOR_COLORS`/`EDITOR_HIGHLIGHTS` sont dérivées de la même liste pour + que le nuancier et les classes générées portent toujours le même jeu de tokens + `--primitives-*`. Écrits en **classe** (`ui-editor-color-*`/`ui-editor-highlight-*`) — jamais + en style en ligne — via le même mécanisme marker → conversion que `fontFamily`/`fontSize` : + `document.execCommand('foreColor', …)` émet un `` converti en ``, + tandis que `hiliteColor` n'émet **pas** de `` (vérifié empiriquement, Chromium et + Firefox) — il pose un `style="background-color:…"` sur un ``, converti via un sélecteur + d'attribut `style` plutôt que `font[color]`. Le bouton de chaque outil affiche un liseré sous + son icône dans la couleur en vigueur au curseur ; le nuancier propose une pastille + « Aucune couleur » (`allowClear`) qui retire la classe couleur/surlignage de la sélection sans + effacer le reste de la mise en forme — `foreColor`/`hiliteColor` n'ont pas de commande native + « retirer la couleur ». Absents de `DEFAULT_EDITOR_TOOLS` (même logique d'opt-in que + `fontSize`/`indent`/`outdent`). + +- **`ui-swatch-picker` — nuancier de couleur réutilisable** (FSHSP-160). `ui-editor` avait + besoin d'un nuancier couleur texte / surlignage, et rien dans le kit ne couvrait ce + besoin : `ui-menu` structure des commandes, pas une grille de teintes. `ui-swatch-picker` + reprend la mécanique overlay de `ui-menu` (`CdkConnectedOverlay`, `autoFlip`, + re-position au scroll) sans porter son propre bouton trigger — même contrat de + composition que `ui-button-split` avec `ui-menu` (`toggle(event)`/`show(event)`/ + `hide(focusTrigger?)`, `popup`). + - `DEFAULT_SWATCH_PALETTE` (export nommé) : grille 7×5 dérivée des tokens `primitives.*` + (7 teintes `primary`/`secondary`/`green`/`orange`/`red`/`slate`/`grey` × 5 paliers + `900`→`100`, foncé → clair) plus `black`/`white` — chaque pastille pointe une variable + `--primitives-{teinte}-{palier}`, jamais un hex en dur : un rebind de marque change la + grille sans recompilation. `palette` accepte un `UiSwatchGroup[]` personnalisé. + - Navigation clavier **grille 2D** (roving tabindex) : flèches, `Début`/`Fin`, + `Entrée`/`Espace` sélectionnent, `Échap` ferme le popup — mêmes bases que le roving + focus de `ui-menu`, adaptées au calcul ligne/colonne. + - A11y : `role="listbox"` / `role="option"` sur de vrais `