Drag & Drop widgets et presets
1) Concept et scénarios
Les widgets Drag & Drop sont des blocs interactifs (cartes graphiques, tableaux, filtres, boutons-actions) que l'utilisateur place librement sur la toile avec une référence à la grille. Préréglages - schémas et styles enregistrés (layout + thème + paramètres) qui peuvent être rapidement appliqués, partagés et convertis.
Scénarios types :- Assemblage de dashboard à partir de blocs finis (cartes KPI, graphiques, filtres).
- Changement rapide de schéma via les préréglages Compact, Analytique, Présentation.
- Co-éditer : Le produit place les widgets, l'analyste configure les sources.
- Publication « lecture seule » pour les stackholders.
2) Principes architecturaux
1. Grid-first : positionnement dans les colonnes/lignes logiques (12/24), pixels - dérivés.
2. Snapping & Guides : guides magnétiques, collage à la grille et aux voisins, alignement.
3. Constraint-aware : limiteurs de taille/proportions, min/max, lock-aspect.
4. Safe-by-default : stockage automatique continu, publication transactionnelle, undo/redo.
5. A11y-first : DnD à partir du clavier et la voix des modifications.
6. Realtime-ready : CRDT/OT pour les sessions multijoueurs.
7. Themable : jetons de conception, préréglages de thème, modes clairs/sombres/contrastés.
8. Portable : exportation/importation JSON/YAML ; le versioning des circuits.
3) Modèle de données (simplifié)
json
{
"id": "layout_01",
"name": "Analytics - Compact,"
"version": "2. 1. 0",
"grid": { "cols": 12, "rowHeight": 8, "gutter": 8, "margin": 16 },
"theme": { "preset": "light-pro", "tokens": { "radius": 12, "elevation": "soft" } },
"widgets": [
{
"id": "w_kpi_1",
"type": "kpi",
"title": "GGR",
"pos": { "x": 0, "y": 0, "w": 3, "h": 4, "z": 1 },
"constraints": { "minW": 2, "minH": 3, "lockAspect": false },
"props": { "format": "currency", "source": "ggr_daily" }
},
{
"id": "w_chart_1",
"type": "lineChart",
"title": "Deposits Trend",
"pos": { "x": 3, "y": 0, "w": 6, "h": 8, "z": 1 },
"props": { "source": "deposits", "legend": true }
},
{
"id": "w_table_1",
"type": "table",
"title": "Top Segments",
"pos": { "x": 9, "y": 0, "w": 3, "h": 12, "z": 2 },
"props": { "source": "segments_top", "pageSize": 12 }
}
],
"meta": { "createdBy": "dima", "updatedAt": "2025-11-03T17:55:00Z" }
}
4) Grilles, références et guides
Grille : 12 colonnes pour le bureau, 6 pour la tablette, 4 pour les téléphones ; 'rowHeight' est le même pour le pas vertical stable.
Snapping : ancrage sur les bords/centres ; « aimants » pour 4/8 px ; les hydes intelligents quand ils se rapprochent de leurs voisins.
Auto-flow : transfert automatique plus bas en cas de conflit ; algorithme des « blocs tombants ».
Responsive : breakpoints → alternatives « pos » sous chaque breakpoint.
5) Événements et états DnD
События: `dragStart`, `drag`, `dragOver`, `drop`, `resizeStart`, `resize`, `resizeEnd`, `select`, `group`, `ungroup`, `reorder`, `undo`, `redo`.
États :- Ghost/Preview : contour translucide pendant le glisser-déposer.
- Placeholders : zones autorisées (éclairage vert) interdites (rouge).
- Collision map : calcul rapide des cellules occupées (bitset/arbre interval).
6) Recyse, alignement, z-index
Poignées de recyse dans les coins + maintien 'Shift'pour garder les proportions.
Alignement du groupe : « à gauche/à droite », « au centre », « répartir uniformément ».
Niveaux de superposition : 'z' avec limite de portée, boutons « avant/arrière ».
7) Groupes, conteneurs et imbrications
Groupes : sélection multiple, co-glisser, alignement de groupe.
Conteneur de widgets : tabs, accordéons, carrousels - ils savent accepter les widgets enfants.
Limiteurs de conteneur : grille extérieure ≠ intérieure (autres colonnes).
8) Presets (modèles) et versions
Types de presets : layout, thème (thème), « jeu de widgets », « schéma + données ».
Versioning : 'semver' du schéma et de la migration (map des champs, défauts).
Preview & Apply : aperçu avant application.
Scoped presets : personnel, équipe, global ; droits de lecture/édition.
Exportation/importation : JSON/YAML, signature par la somme de contrôle, vérification de la compatibilité de la version.
9) Accessibilité (A11y) et clavier
Keyboard DnD complet :- 'Enter/Space '- commencer le transfert ; les flèches sont le déplacement d'un pas de grille ; "Shift' + les flèches sont un pas accéléré ;" Esc "est l'annulation.
- 'Ctrl/Cmd + G '- grouper ;' Ctrl/Cmd + Maj + G '- dissocier.
- 'Alt ': Désactivez temporairement le maillage.
- Voix SR : "Déplacé vers (x, y). Collage : inclus. Conflit : oui/non".
- Anneaux de focus, gros stylos de vente, zones de drop avec description.
10) Tache et modèles mobiles
Long-press (300-500 ms) pour démarrer DnD.
Targets augmentés (minimum 40-48 px).
Barres d'outils adaptatives (barre d'outils inférieure).
« Mode d'édition » : verrouillage du défilement de la toile, auto-scroll vertical lors du transfert vers le bord.
11) Actions des widgets (Widgets activables)
CTA intégré (bouton), menu contextuel, drag-clone (duplication avec maintien 'Alt').
« Presets rapides » pour le widget (densité, légende, couleur).
États : loading/empty/error, bouchons sécurisés (« données en retard »).
12) Collaboration et publications
Realtime : CRDT (par exemple, Yjs) ou OT (Quill-Approach) sont les curseurs des membres, verrouillage des groupes.
Droits : 'Owner', 'Editor', 'Viewer' ; publication d'un instantané (snapshot immuable).
Flux : brouillon → rummage → publication ; comparaison des changements (diff layout's).
13) Undo/Redo et le stockage automatique
Bus de commande : chaque opération est une commande avec 'do/undo'.
Journal sur le client (in-memory + persist périodique), limite de longueur.
Auto-save : toutes les N secondes/par 'idle', avec l'indicateur « Enregistré ».
14) Temisation et jetons de conception
json
{
"themeId": "light-pro",
"tokens": {
"fontScale": { "h1": 24, "h2": 18, "body": 14 },
"radius": 12,
"elevation": "soft",
"palette": { "primary": "#3366FF", "critical": "#E53935" }
}
}
Basculez les thèmes sans recalculer (jetons visuels uniquement).
Contraste AA/AAA, mode High-Contrast, thème sombre avec gris correct.
15) Performance
Dessin par couches (canvas/webgl pour les graphiques complexes, DOM pour le chrome).
Virtualisation des listes/tables, throttle 'drag' (16 ms), requestAnimationFrame.
Diff rendu : redessiner uniquement les widgets modifiés.
Cache de comptage des collisions et des heidlines.
16) Sécurité et protection du contenu
Sanbox pour les widgets HTML (iframe, CSP, 'sandbox' drapeaux).
Limitation des drops : types whitelist (fichiers, liens, presets JSON) ; vérification de la taille et du contenu.
Droits de presets (RBAC/ABAC), vérification des exportations/importations.
17) API des widgets (contrat)
ts interface Widget {
id: string;
type: string;
pos: { x:number; y:number; w:number; h:number; z:number };
constraints?: { minW?:number; minH?:number; maxW?:number; maxH?:number; lockAspect?:boolean };
props: Record<string, unknown>;
validate? (props): { ok: boolean; errors?: string[] };
onDrop? (dataTransfer): DropResult ;//support for external drop onAction? (actionId: string, payload?: any): void;
}
Événements du cycle de vie : 'mount',' resize ',' visibilityChange '.
Validation des props avant publication.
18) Importations/exportations et migrations
Exporte : 'grid', 'widgets', 'theme', 'meta'.
Importation : vérification des versions du schéma, migration automatique (map champs/défauts), rapport.
Preset de fichier lock avec hachage pour garantir l'intégrité.
19) Raccourcis clavier (recommandé)
Navigation : '←↑→↓' est un mouvement ; 'Maj' + flèches est une étape rapide.
Resise : 'Alt' + flèches.
Opérations : 'Ctrl/Cmd + D'est un duplicata ;' Ctrl/Cmd + G 'est un groupe ;' Ctrl/Cmd + Maj + G est un groupe dégroupé.
Niveaux : '['/']' - arrière/avant sur z-index.
Undo/Redo: `Ctrl/Cmd+Z` / `Ctrl/Cmd+Shift+Z` (или `Y`).
Presets : 'Ctrl/Cmd + 1.. 9' - appliquez rapidement les sauvegardes.
20) modèles UX
Hydes rapides au premier démarrage (micro-onboard en 3-5 étapes).
Mode de grille : Commutateur « afficher/masquer la grille ».
Indices inline sur les collisions (« non disponible : min largeur du widget = 3 »).
Historique des mises en page : retour à la version précédente.
21) Plan d'essai
Unit : calcul des collisions, snapping, validateur constraints.
Intégration : DnD avec une souris/un clavier ; groupements ; conteneurs.
E2E : assemblage du dashboard « à partir de zéro », application du preset, publication, exportation/importation.
Chaos : retards de rendu, perte de connexion (realtime), conflit de droits.
A11y : scripts clavier, voix SR, contraste.
22) Chèque de mise en œuvre
- Grille/breakpoint et snapping personnalisés
- Resise/groupes/alignement fonctionne et testé
- Clavier DnD et conseils à l'écran inclus
- Auto Save, undo/redo, historique des mises en page
- Presets : versions, droits, exportations/importations
- Thèmes et jetons de conception, mode High-Contrast
- Collaboration realtime et résolution des conflits
- Limitation des drops, validation des fichiers, sandbox HTML
- Métriques : adoption, temps avant le premier placement, erreurs de collisions
23) Mini-FAQ
Pourquoi seulement la grille, pas les coordonnées libres ?
La grille facilite l'alignement, l'adaptation, la portabilité des préréglages et les performances.
Comment stocker les différents layout sous les breakpoints ?
Chaque widget a 'pos' sur le breakpoint (desktop/tablet/mobile) avec un arrière automatique.
Que choisir pour la collaboration - OT ou CRDT ?
Le CRDT est plus facile pour les conflits hors ligne ; OT - ok pour les opérations de texte linéaire. Pour layout, le CRDT est plus souvent pris.
Résultat
Les bons widgets Drag & Drop ne sont pas seulement « glisser la carte ». Il s'agit d'un maillage et d'un snapping rigoureux, de groupes conviviaux et d'alignement, d'une disponibilité au clavier, de presets stables avec versions et exportations, de publications sécurisées et de collaboration. Construisez cela autour d'un modèle de données fiable, d'un UX réfléchi et d'un plan de test - et le constructeur deviendra rapide, compréhensible et résistant à la croissance du contenu et des équipes.