# `DocShell.Presentation.SiteProjector`
[🔗](https://github.com/futhr/doc_shell/blob/v2.0.0/lib/doc_shell/presentation/site_projector.ex#L1)

Turns validated documentation collections into a renderer-neutral site.

The host owns the choices that make one site different from another: title,
taxonomy, routes, navigation, visibility, locales, and redirects. It supplies
those choices through `DocShell.Presentation.SiteSource`. The projector then
applies the portable guarantees shared by every renderer: source identity,
finite limits, deterministic anchors and digests, a closed internal-link
graph, reading order, search records, and renderer capability requirements.

Projection performs no rendering, filesystem writes, network requests, or
authorization. The result is a `DocShell.Presentation.Site` value that a
hosted renderer or `DocShell.Presentation.StaticExporter` can consume without
reopening the source corpora.

# `project`

```elixir
@spec project(keyword()) :: {:ok, DocShell.Presentation.Site.t()} | {:error, term()}
```

Projects loaded collections through a host site source.

The required `:collections` option contains values returned by
`DocShell.Generate.Collection.load/1`. `:source` defaults to
`DocShell.Presentation.SiteSource.Default`; a host can provide another module
to choose routes and taxonomy. Projection is deterministic except for the
generated snapshot identity, which callers may set with `:generation_id`.

Returns a complete `doc-shell-site/v1` value or a tagged error before any
rendering or publication occurs.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
