laterite-admin 0.9.1

Laterite CMF admin surface: the Axum router, session middleware, and login shell
Documentation
<!DOCTYPE html>
<html lang="{{ self.locale() }}" data-theme="light">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>{{ self.t("Set up") }} {{ brand }}</title>
  <link rel="icon" type="image/svg+xml" href="{{ self.asset("mark.svg") }}">
  <link rel="stylesheet" href="{{ self.asset("laterite.css") }}">
  {% include "_theme_boot.html" %}
</head>
<body>
  <div class="lat-login">
    <div class="lat-login__form">
      <div class="lat-login__inner">
        <div class="lat-login__brand">
          <img src="{{ self.asset("mark.png") }}" alt="">
          <h1>{{ brand }}</h1>
        </div>
        <h2 class="lat-login__title">{{ self.t("Create the first administrator") }}</h2>
        <p class="lat-login__lead">{{ self.t("This install has no accounts yet. Set one up to sign in.") }}</p>
        {% if let Some(message) = error %}<div class="lat-alert">{{ message }}</div>{% endif %}
        <form method="post" action="{{ base }}/setup">
          <div class="lat-field">
            <label class="lat-field__label" for="username">{{ self.t("Username") }}</label>
            <input class="lat-input" type="text" id="username" name="username" autocomplete="username" autofocus required>
          </div>
          <div class="lat-field">
            <label class="lat-field__label" for="first_name">{{ self.t("First name") }}</label>
            <input class="lat-input" type="text" id="first_name" name="first_name" autocomplete="given-name" required>
          </div>
          <div class="lat-field">
            <label class="lat-field__label" for="last_name">{{ self.t("Last name") }} <span class="lat-field__opt">{{ self.t("(optional)") }}</span></label>
            <input class="lat-input" type="text" id="last_name" name="last_name" autocomplete="family-name">
          </div>
          <div class="lat-field">
            <label class="lat-field__label" for="email">{{ self.t("Email") }}</label>
            <input class="lat-input" type="email" id="email" name="email" autocomplete="email" required>
          </div>
          <div class="lat-field">
            <label class="lat-field__label" for="password">{{ self.t("Password") }}</label>
            <input class="lat-input" type="password" id="password" name="password" autocomplete="new-password" minlength="{{ min_password }}" required>
            <p class="lat-help">{{ self.tf("At least {n} characters.", [("n", min_password)]) }}</p>
          </div>
          <div class="lat-field">
            <label class="lat-field__label" for="timezone">{{ self.t("Display timezone") }}</label>
            <select class="lat-input lat-select" id="timezone" name="timezone">
              {% for zone in zones %}<option value="{{ zone.name }}"{% if zone.selected %} selected{% endif %}>{{ zone.name }}</option>{% endfor %}
            </select>
            <p class="lat-help">{{ self.t("Dates render in this zone. Storage is always UTC, and you can change it later in Preferences.") }}</p>
          </div>
          <button class="lat-btn lat-btn--primary lat-btn--lg lat-btn--block" type="submit" style="margin-top:20px">{{ self.t("Create administrator") }}</button>
        </form>
      </div>
      <a class="lat-poweredby" href="https://laterite.rs" target="_blank" rel="noopener noreferrer"><img src="{{ self.asset("mark.png") }}" alt="" width="14" height="14">{{ self.t("Powered by Laterite") }}</a>
    </div>
    <div class="lat-login__hero" aria-hidden="true">
      <div class="lat-hero-blob lat-hero-blob--1"></div>
      <div class="lat-hero-blob lat-hero-blob--2"></div>
      <div class="lat-hero-blob lat-hero-blob--3"></div>
      <div class="lat-hero__caption">
        <div class="lat-hero__eyebrow">{{ self.t("Open source Rust web framework") }}</div>
        <div class="lat-hero__tag">{{ self.t("Build sites. Ship solid.") }}</div>
      </div>
    </div>
  </div>
</body>
</html>