{# # ============================================================================ # ORGANISM: SIDEBAR # ============================================================================ # # Navigation principale de l'application Bubul. # Combine la molécule nav-item avec la logique métier (rôles, outils, routes). # # ============================================================================ # COMPOSITION (Molécules et Atomes utilisés) # ============================================================================ # # - _molecules/nav-item/nav-item.html.twig # - _atoms/icon/icon.html.twig # - _atoms/logo/logo.html.twig # # ============================================================================ # PARAMÈTRES # ============================================================================ # # | Paramètre | Type | Défaut | Description | # |------------------|---------|-----------|--------------------------------| # | variant | string | 'bubul' | Variante : 'bubul' ou 'sam' | # | collapsed | bool | false | État collapsed | # | currentRoute | string | null | Route actuelle pour état actif | # | accessibleTools | array | [] | Outils accessibles | # | isAdmin | bool | false | Utilisateur admin | # | isManager | bool | false | Utilisateur manager | # | companyUuid | string | null | UUID entreprise (manager) | # | version | string | null | Version de l'application | # | interactive | bool | true | Active le controller Stimulus | # | static | bool | false | Mode statique (pour démos) | # | navItemSize | string | 'lg' | Taille nav-items (sm, md, lg) | # | logoSize | string | '2xl' | Taille logo expanded | # | logoSizeCollapsed| string | 'md' | Taille logo collapsed | # # ============================================================================ #} {# ============================================================================ CONFIGURATION DES VALEURS PAR DÉFAUT ============================================================================ #} {% set variant = variant ?? 'bubul' %} {% set isSam = variant == 'sam' %} {% set navColorScheme = isSam ? 'violet' : 'blue' %} {% set collapsed = collapsed ?? (app.user.settings.sidebarCollapsed|default(false)) %} {% set currentRoute = currentRoute ?? app.request.attributes.get('_route')|default('') %} {% set accessibleTools = accessibleTools ?? accessible_tools|default([]) %} {% set isAdmin = isAdmin ?? is_granted('ROLE_ADMIN')|default(false) %} {% set isManager = isManager ?? (is_granted('ROLE_COMPANY_MANAGER')|default(false) and not isAdmin) %} {% set isCommercial = is_granted('ROLE_COMMERCIAL') and not isAdmin %} {% set companyUuid = companyUuid ?? (app.user.company.uuid|default(null)) %} {% set version = version ?? app_version|default('0.0.0') %} {% set interactive = interactive ?? true %} {% set static = static ?? false %} {% set navItemSize = navItemSize ?? 'lg' %} {% set logoSize = logoSize ?? 'xl' %} {% set logoSizeCollapsed = logoSizeCollapsed ?? 'md' %} {# ============================================================================ CLASSES TAILWIND ============================================================================ #} {% set sidebarWidth = collapsed ? 'w-[72px]' : 'w-[250px]' %} {% set positionClasses = static ? 'relative h-[600px]' : 'fixed top-0 left-0 h-screen z-40' %} {# Couleur de fond : 'bubul' → sky (par défaut), 'sam' → violet (couleur à remplacer par la couleur définitive) #} {% set bgClasses = isSam ? 'bg-gradient-to-b from-violet-50/95 via-violet-100/95 to-white/95 border-r border-violet-200/40' : 'bg-gradient-to-b from-sky-50/95 via-sky-100/95 to-white/95 border-r border-primary/10' %} {% set containerClasses = [ positionClasses, 'flex flex-col', sidebarWidth, bgClasses, 'backdrop-blur-xl', 'shadow-lg', 'transition-all duration-300 ease-out', static ? 'rounded-xl overflow-hidden' : '' ]|join(' ')|trim %} {# ============================================================================ HELPERS ============================================================================ #} {% macro isRouteActive(currentRoute, targetRoute, startsWith = false) %} {%- if startsWith -%} {{ currentRoute starts with targetRoute ? true : false }} {%- else -%} {{ currentRoute == targetRoute ? true : false }} {%- endif -%} {% endmacro %} {# ============================================================================ RENDU HTML ============================================================================ #}