(** The page shell: everything that surrounds a page's own content. Pages hand this module a {!body_data} description and receive a complete document. The shell decides which navigation applies, whether a toolbar is present, and what goes in the head — pages never assemble those themselves. *) (** {1 Re-exported types} *) type page = Components.page = | Summary | Commits | Files (** Which repository page is being shown. *) type site = Components.site = { user_name : string; root_title : string; nav_logo : string; } (** Site-wide presentation settings. *) val site : user_name:string -> root_title:string -> nav_logo:string -> site (** Construct a {!site} record. *) (** {1 Page data} *) type body_data = { title : string; repo : string option; subtitle : string; active : page; toolbar : Ui.node list; content : Ui.node list; home_href : string option; } (** Everything the shell needs to wrap a page's content in the standard document structure. *) (** {1 Rendering} *) val render : ?page_title:string -> site -> body_data -> Ui.node (** Produce a complete HTML document from a page description. [page_title] becomes the [