Astral plugins can add generated routes during static builds. Built-in pagination helpers cover common collection index pages.
Collection pagination plugin
site do
plugins [
{Astral.Plugin.CollectionPages,
collection: :posts,
pattern: "/blog/*page",
page_size: 10,
layout: "blog.html"}
]
endThe *page route parameter omits page one:
/blog/
/blog/2/
/blog/3/The pagination layout receives @page, @collection, @site, @collections, @routes, and @route.
<h1>Blog</h1>
<%= for entry <- @page.entries do %>
<article>
<h2><a href="<%= entry.route_path %>"><%= entry.data.title %></a></h2>
</article>
<% end %>
<nav>
<%= if @page.urls.previous do %>
<a href="<%= @page.urls.previous %>">Previous</a>
<% end %>
<%= if @page.urls.next do %>
<a href="<%= @page.urls.next %>">Next</a>
<% end %>
</nav>Lower-level pagination helpers
Use Astral.Pagination directly for custom generated indexes:
entries
|> Astral.Pagination.pages(pattern: "/blog/*page", page_size: 10)
|> Astral.Pagination.routes(site.config, assigns: %{collection: :posts})Route patterns
Astral route patterns use Plug/Phoenix-style segments:
/blog/:slug
/blog/*page
/tags/:tag/*pageUse generated routes when a page is not backed by a single file in pages/.