/// A page of a website: an HTML document with the shared scaffolding assembled around the page's content.
///
/// A conforming page supplies its locale, its title, the stylesheets and scripts it needs, its head metadata, and its content; the protocol assembles the
/// rest of the document around them: the viewport declaration and stylesheet links followed by the metadata in the head, and the content followed by
/// the script tags in the body.
publicprotocolPage:HTMLDocument,Sendable{
// MARK: Associated types
/// The type of the page's markup.
associatedtypeContent:HTML
/// The type of the page's head metadata markup.
associatedtypeMetadata:HTML
// MARK: Properties
/// The version token appended to the page's asset URLs, or `nil` to leave them unversioned.
varassetVersion:String?{get}
/// The page's markup, rendered before the ``scripts``.
@HTMLBuilder
varcontent:Content{get}
/// The locale the page content is localized to.
varlocale:Locale{get}
/// The markup placed in the document head after the ``stylesheets``: icon and manifest
/// links, extra meta tags, and the like.
@HTMLBuilder
varmetadata:Metadata{get}
/// The scripts loaded at the end of the document body, in order.
varscripts:[anyAsset]{get}
/// The stylesheets linked in the document head, in order.
varstylesheets:[anyAsset]{get}
}
// MARK: - Implementations
publicextensionPage{
// MARK: Computed
/// The page ``content`` followed by its ``scripts``.
@HTMLBuilder
varbody:someHTML{
content
forfileinscripts{
script(.src(file.urlPath(
for:.js,
version:assetVersion
))){}
}
}
/// The viewport declaration and ``stylesheets`` links followed by the ``metadata``, placed in the document head.