Frontières entre paquets
La question qui tranche
Huit paquets, et une seule règle pour savoir où va une chose : à quel public s'adresse-t-elle ? Pas « est-ce partagé ? » — tout finit par être partagé, et un paquet nommé d'après ce critère devient l'endroit où l'on range ce qu'on ne sait pas classer.
Un exemple qui rend la règle concrète. Le vocabulaire de rendu — ComponentTone, ComponentSize, ComponentVariant — tient en soixante-cinq lignes et sert à vingt-cinq fichiers. Le client HTTP en fait mille huit cents et sert à trois. Dans le même paquet, copier un Badge depuis le registre obligerait à installer un client HTTP complet, avec ses greffons, ses transports, son stockage de jetons et sa logique de réessai. Deux publics, deux paquets.
Où va quoi
- Le vocabulaire est fait de valeurs —
ComponentToneest un nom que chaque plateforme traduit. Il vit auprès des couleurs et des espacements. toneClassne l'a pas suivi, alors qu'il manipule le même vocabulaire : il fabrique un nom de classe CSS, donc une convention de rendu. Le natif traduira le même ton en objet de style et ne l'appellera jamais. Il vit dans@sia-ui/utils, auprès decn.- Le contrat de formulaire vit avec
useLocalForm, son implémentation de référence. Les deux vont ensemble et ni l'un ni l'autre ne touche le DOM. RegistryItemdécrit une entrée du registre : c'est la forme du paquetregistry, qui n'a aucune raison de dépendre d'un paquet d'interface pour décrire un fichier à copier.- Le client HTTP est
@sia-ui/api. Il n'a aucun rapport avec l'interface : ni React, ni DOM, ni tokens. Il est utilisable seul, dans une application native, un script Node, un backend-for-frontend.
Ce qui ne se partage pas non plus : la forme des props. Le web étend HTMLAttributes et prend className, le natif étend ViewProps et prend style. Chaque composant déclare donc ses props chez lui — voir 31 — Source unique.
La pile
@sia-ui/tokens valeurs : couleurs, espacements, mouvement, vocabulaire
@sia-ui/utils fonctions sans dépendance
@sia-ui/api client HTTP — indépendant de l'interface
@sia-ui/headless comportement, avec React, sans plateforme
@sia-ui/react primitives de runtime DOM
@sia-ui/react-web composants DOM
@sia-ui/react-native composants natifs, à venirreact-native dépendra exactement du même ensemble que react-web : tokens, utils, headless, plus api s'il en a besoin.
Ce que la règle interdit
- Un composant de
react-webn'importe rien depuis un autre dossier que le sien : la CLI ne sert quecomponents/<Nom>/, et un import vers../../arrive cassé chez l'utilisateur. C'est vérifié parpackages/cli/src/install.test.ts. headlessn'importe pasreact-web.tokensn'importe pas React.- Un réexport n'est pas une frontière : un dossier qui ne fait que réexporter un paquet voisin est une indirection, pas une couche.
La prochaine couture
@sia-ui/tokens mélange des valeurs brutes — couleurs, espacements, vocabulaire — et de la génération CSS : toCssVariables, themeVariables. Le natif voudra les premières sans la seconde. Ce n'est pas bloquant, le tree-shaking s'en charge, mais c'est à examiner le jour où le paquet natif existera.