FAQ
Pourquoi n'y a-t-il pas de mécanisme d'installation via app.use()
React ne possède pas le système de plugins de Vue. @lh-ui/react est entièrement constitué d'exports nommés, à importer à la demande — ce qui se prête aussi mieux au tree-shaking. La configuration globale se fait en enveloppant l'application dans le composant LhConfigProvider.
Pourquoi les styles ne sont-ils pas injectés automatiquement
Stratégie d'import à la demande alignée sur @lh-ui/vue2 : l'entrée du paquet n'injecte pas de effet de bord avec l'intégralité des styles ; c'est à l'utilisateur d'importer explicitement @lh-ui/react/theme.css et @lh-ui/react/style/<name>. La raison est que l'import à la demande est la pratique dominante dans l'écosystème React, et qu'un effet de bord global romprait le tree-shaking.
Pourquoi onChange prend deux paramètres
La signature à deux paramètres (value, event) est isomorphe au emit('change', [val, e]) de lh-ui-plus : elle facilite la migration depuis Vue et conserve la capacité à récupérer l'événement natif.
Pourquoi la position des couches n'utilise-t-elle pas floating-ui
Ligne rouge de la famille : le calcul géométrique des couches est implémenté dans @lh-ui/share/core/shared/popper, toutes les plateformes partagent la même logique et le même traitement des cas limites (retournement, repli sur dépassement, flèche). Introduire une bibliothèque tierce provoquerait une dérive des comportements entre les plateformes.
Pourquoi les transitions n'utilisent-elles pas react-transition-group
Même raison. useTransition est une machine d'états interne mounted + phase développée par cette bibliothèque, dont les noms de classe sont strictement identiques à ceux du SCSS de share (*-enter-from / *-enter-active / *-enter-to), et sûre en StrictMode.
Pourquoi Dialog est-il purement contrôlé
L'état open est entièrement détenu par l'état externe : tout chemin de fermeture (clic sur le masque / Esc / bouton de fermeture) ne fait qu'appeler onClose. lh-ui-plus conserve en interne un état intermédiaire isVisible synchronisé en double liaison via watch ; la version React supprime cette couche : la sémantique contrôlée est plus pure, et cela évite la concurrence entre props et état interne.
Quand plusieurs Dialog sont ouverts, pourquoi Esc n'en ferme-t-il qu'un seul
useLhOverlayStack maintient une pile d'ouverture, et Esc ne ferme que la couche au sommet. C'est ce qu'exige le modèle de dialogue APG, afin d'éviter qu'une seule frappe n'emporte toutes les couches d'un coup.
Les services impératifs créent-ils plusieurs roots React
Non. Les services tels que message partagent un root unique créé paresseusement, instancié à la première invocation puis ajouté au body, et la file de messages est gérée par l'état interne du composant. destroyContainer() appelle explicitement root.unmount().
Que se passe-t-il si l'on appelle message en SSR
Un simple avertissement en développement, puis un no-op, sans aucune création de nœud DOM. Toutes les opérations DOM sont placées dans useEffect / useIsomorphicLayoutEffect, et useLhLocale s'appuie sur useSyncExternalStore pour fournir un instantané SSR cohérent.
Pourquoi forwardRef plutôt que la prop ref directement
Pour supporter à la fois React 18 et 19. Le ref-as-prop de React 19 n'existe pas sur la version 18, et forwardRef est le sur-ensemble commun aux deux versions. Tous les composants focalisables (button / input / select / dialog / tooltip) transmettent le ref.
Peut-on utiliser lh-ui-plus et cette bibliothèque dans un même projet
Oui : les noms de classe et les jetons des deux bibliothèques sont strictement identiques, sans conflit de styles. Mais cela n'est généralement pas nécessaire — il s'agit de deux déclinaisons technologiques d'une même famille de composants. En cas de coexistence dans un scénario de migration progressive, vérifiez que les plages de version de @lh-ui/share des deux bibliothèques sont compatibles.
Qu'est-ce qui n'est pas implémenté dans la première itération
Les composants P1/P2 (Popover, Drawer, Dropdown, Table, etc.) ne sont pas implémentés. Les trois services impératifs
(message / notification / loading) sont, eux, intégralement implémentés.