Render Kratos self-service flows as themed pages (todo §4); buildFlowView + views/auth.ejs + login/registration/recovery/verification/settings routes

This commit is contained in:
2026-06-17 17:55:56 +02:00
parent 2a64cfd409
commit 0928f9dd39
11 changed files with 405 additions and 4 deletions

8
views/partials/alert.ejs Normal file
View File

@@ -0,0 +1,8 @@
<%#
Inline alert / notice banner (design-system tone tokens). Config:
text, tone? ∈ pos|neg|info|warn (default info), title?
%><%
const tone = locals.tone || "info";
const icon = tone === "pos" ? "i-check-circle" : "i-alert";
-%>
<div class="alert alert-<%= tone %>" role="<%= tone === "neg" ? "alert" : "status" %>"><svg class="ico ico-sm" aria-hidden="true"><use href="#<%= icon %>"/></svg><div class="alert-body"><% if (locals.title) { %><strong><%= locals.title %></strong><% } %><span><%= locals.text %></span></div></div>

View File

@@ -0,0 +1,17 @@
<%#
Kratos flow form body (todo §4): the inner of the auth-card form — flow messages,
hidden inputs (incl. csrf_token), themed fields, then submit button(s). `flow` is a
FlowView (src/flow-view.ts). Captured by views/auth.ejs and handed to auth-card's body.
-%>
<% flow.messages.forEach((m) => { -%>
<%- include("alert", m) %>
<% }) -%>
<% flow.hidden.forEach((h) => { -%>
<input type="hidden" name="<%= h.name %>" value="<%= h.value %>">
<% }) -%>
<% flow.fields.forEach((field) => { -%>
<%- include("field", field) %>
<% }) -%>
<% flow.buttons.forEach((b, i) => { -%>
<button type="submit" class="btn btn-block<%= i === 0 ? " btn-primary" : "" %>"<% if (b.name) { %> name="<%= b.name %>"<% } %><% if (b.value != null) { %> value="<%= b.value %>"<% } %>><%= b.label %></button>
<% }) -%>