Skip to content

AppShell ​

La coquille d'une application.

Elle n'invente rien : la navigation est le Sidebar, le tiroir est le Drawer, les droits viennent de @sia-ui/headless. Ce qu'elle apporte est l'assemblage — trois états de barre, une bascule mobile, et une seule source de vérité pour ce qui est visible et pour ce qui est actif.

Installation ​

bash
sia-ui add app-shell

Ou par le paquet, sans rien copier :

tsx
import { AppShell, AppShellBrand, AppShellRailItem } from "@sia-ui/react-web";

Props de AppShellBrand ​

Identité de produit adaptée au rail de l'AppShell.

L'application fournit le symbole et le texte une seule fois. Le composant masque sa copie dès que son parent reçoit data-collapsed.

PropTypeDéfautDescription
* iconReactNode—Symbole conservé lorsque la navigation devient un rail.
* nameReactNode—Nom du produit, masqué automatiquement dans le rail.
descriptionReactNode—Ligne secondaire facultative, masquée avec le nom.

Props de AppShellRailItem ​

Contenu icône + libellé qui s'adapte automatiquement au rail.

PropTypeDéfautDescription
* iconReactNode—Symbole toujours visible dans le rail.
* labelstring—Libellé masqué visuellement dans le rail et conservé comme nom accessible.
as"button" | "div" | "a"divÉlément rendu : contenu simple, action ou lien.
disabledboolean—
hrefstring—
type"button" | "submit" | "reset"button

Props de AppShell ​

PropTypeDéfautDescription
* navSidebarEntry[]—
activeKeystring—La clé de l'entrée courante. Laissée vide, elle est déduite de currentPath. La fournir explicitement ne sert que si les clés ne correspondent à aucune adresse.
ariaLabelstring—
brandReactNode—En tête de barre latérale : logo, nom du produit, sélecteur d'entité. AppShellBrand masque son texte automatiquement dans le rail. Un contenu entièrement personnalisé reçoit toujours data-collapsed sur son parent.
can(rule: PermissionRule) => boolean—Évalue les règles de permission. Le filtrage est fait une seule fois ici : ni la barre latérale ni les onglets ne doivent avoir leur propre idée de ce qui est visible.
classNamestring—
collapsibleAppShellCollapsibleicon
contentWidth"wide" | "narrow" | "full"wideLa largeur de la zone de contenu. Décidée ici plutôt qu'écran par écran : des largeurs posées page après page finissent par diverger, et personne ne sait laquelle fait foi.
currentPathstring—L'adresse courante — le point d'accroche du routeur. Une seule chaîne, que tous savent produire : tsx const { pathname } = useLocation(); // React Router const pathname = usePathname(); // Next.js const [pathname] = useLocation(); // wouter De là, la coquille déduit l'entrée active par le préfixe le plus long, et referme le tiroir mobile à chaque navigation — sans jamais importer de routeur.
defaultSidebarState"expanded" | "collapsed" | "hidden"expanded
drawerPropsPartial<Omit<DrawerProps, "children" | "open" | "defaultOpen" | "onOpenChange">>—Réglages du tiroir mobile — taille, fermeture au clic extérieur, classe.
footerReactNode—
headerReactNode—La barre du haut : recherche, notifications, avatar de compte.
mobileBreakpointnumber768Sous cette largeur, la barre latérale cède la place.
mobileNav"both" | "drawer" | "tabs"drawer
onNavigate(item: SidebarItem) => void—
onSidebarStateChange(state: SidebarState) => void—
pageReactNode—Au-dessus du contenu, pleine largeur de la zone. L'endroit d'un PageHeader. La coquille ne prend pas de title : un <h1> rendu par la coquille force chaque page à passer par ses props, et une page qui veut deux titres ou une mise en page à elle doit se battre.
renderLinkSidebarRenderLink—Branche les liens sur le routeur. À stabiliser avec useCallback.
side"left" | "right"left
sidebarCollapsedWidthstring—
sidebarFooterReactNode—Bas de la barre latérale, sous la navigation. C'est la place de la déconnexion et des réglages du compte — ce qui sort de l'application, par opposition à l'en-tête, réservé à ce qui agit sur l'écran courant. AppShellRailItem masque son libellé automatiquement ; un contenu personnalisé peut encore lire data-collapsed sur son parent.
sidebarPropsPartial&lt;Omit&lt;SidebarProps, "variant" | "items" | "can" | "activeKey" | "renderLink" | "onNavigate" | "collapsed" | "side" | "header" | "footer" | "ariaLabel"&gt;&gt;—Réglages de la barre latérale — taille, ton, accordéon, branches ouvertes, volets du rail. Ce que la coquille décide seule en est retiré : les entrées filtrées, l'entrée active, l'état réduit, les liens, l'en-tête et le pied, le côté et la variante — tous déjà réglables ici, et qui doivent rester d'accord avec la mise en page de la coquille.
sidebarState"expanded" | "collapsed" | "hidden"—
sidebarWidthstring—Toute valeur CSS : 16rem, 280px, min(20vw, 320px).
stickyHeaderbooleantrueL'en-tête suit-il le défilement.
variant"default" | "filled" | "floating"default

* obligatoire.

Voir aussi ​

Publié sous licence MIT.