Communitygithub.com

Professor-Chen/cursor-byok

Implémenter ou réviser des interfaces flottantes de bureau comme les listes déroulantes, popovers, infobulles, menus, zones de saisie avec liste déroulante et superpositions imbriquées dans apps/desktop.

Qu'est-ce que cursor-byok ?

Ce skill guide l'implémentation d'interfaces flottantes dans `apps/desktop` en utilisant `@floating-ui/dom`. Il impose le rendu des superpositions via `createPortal` dans `document.body` pour éviter les problèmes de découpage liés aux contextes d'empilement. Le positionnement est géré avec `computePosition` dans `autoUpdate`, et les coordonnées sont stockées dans l'état React, en évitant les mutations directes du style. Les invariants d'interaction (focus, fermeture, accessibilité ARIA) sont strictement définis, notamment pour les superpositions imbriquées. Le skill est particulièrement utile pour les développeurs travaillant sur Cursor, Claude Code ou Codex, garantissant une implémentation cohérente et accessible des composants flottants de bureau.

Compatible avec~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/Professor-Chen/cursor-byok/tree/HEAD/.agents/skills/floating-ui

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Interface flottante

Utilisez @floating-ui/dom pour tout élément interactif positionné par rapport à un déclencheur. Ne calculez pas les coordonnées manuellement et ne vous fiez pas aux décalages CSS absolus pour les listes déroulantes, popovers, menus, listes de zone de saisie ou infobulles.

Structure requise

  • Rendez les superpositions via createPortal(..., document.body) afin que la disposition et les contextes d'empilement ne les coupent pas.
  • Positionnez avec computePosition dans autoUpdate ; nettoyez la fonction retournée par autoUpdate lorsque la superposition se ferme ou se démonte.
  • Partez du contrôle existant le plus proche dans apps/desktop/src/components/ui. Faites correspondre ses middlewares de placement, offset, flip, shift et size sauf si l'interaction nécessite une différence délibérée.
  • Stockez les valeurs calculées left, top, width et la hauteur disponible dans l'état React. Appliquez l'état à la racine du portail ; ne modifiez pas directement les styles de l'élément.
  • Utilisez size lorsque la largeur de référence ou la hauteur de la fenêtre contraint la superposition. Les listes susceptibles de s'agrandir doivent utiliser components/virtual/VirtualList.tsx ; conservez les en-têtes et pieds de page fixes en dehors de la fenêtre virtuelle.

Invariants d'interaction

  • Gardez la bordure d'ouverture/de focus du déclencheur visible tant que le focus est à l'intérieur d'une superposition portailée.
  • Fermez lors d'une interaction pointeur en dehors et avec la touche Échap, puis ramenez le focus au déclencheur.
  • La vérification de clic en dehors doit inclure à la fois le déclencheur et la superposition. Une superposition portailée imbriquée doit empêcher son événement pointeur d'atteindre l'écouteur de clic en dehors du parent, donc interagir avec un menu enfant ne ferme jamais son parent.
  • Exposez l'état du déclencheur avec aria-expanded, aria-controls et le aria-haspopup approprié ; attribuez à la superposition les sémantiques correspondantes de menu, listbox, dialogue ou infobulle.
  • Vérifiez le placement près de tous les bords de la fenêtre, les clics sur les superpositions imbriquées, la fermeture au clavier, le défilement virtuel et le comportement des pieds de page fixes.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills associés