otter 0.5.1

Otter game system; main Rust crate.
Documentation
{# -*- HTML -*- -#}
<!-- Copyright 2020u Ian Jackson
     SPDX-License-Identifier: AGPL-3.0-or-later
     There is NO WARRANTY. -->
{% import "macros" as m %}{# -*- HTML -*- -#}
{{ m::header() }}
<style>
  body {
    min-height: 100vw;
  }
  div[class=uos] { display: flex; flex-wrap: wrap; }
  div[class|=uokey] {
    outline: 1px solid #000;
    margin: 1px;
    padding-left: 5px;
    padding-right: 6.5px;
    align-self: start;
  }
  table[id=log] {
    width: 100%;
  }
  td[class=logts] {
    padding-left: 5px;
    text-align: right;
  }
  div[class=uokey-r] {
    align-self: end;
  }
  div[id=infopane] {
    height: 100px;
  }
  .uos-mid {
    flex-grow: 1;
  }
  div[id=player_list_columns] {
    columns: 3;
  }
</style>
<div class="upper">
{{ m::nick() }}
|
{{ m::wresting() }}
|
{{ m::status() }}
|
<a href="/l?{{ ptoken }}">switch to landscape view</a> |
{% if links != "" -%}
<span id="links">{{ links }} |</span>
{% endif -%}
{{ m::zoom() }}
{{ m::errors() }}

{{ m::space() }}
<p>{{ m::infopane() }}

<p>
  <div id="logscroll" style="overflow-y: scroll; height: 200px;">
    <table id="log">
      {% for ent in log %}
      <tr><td class="logmsg">{{ ent.logent.logent.html | safe }}</td><td class="logts">{{ent.when}}</td></tr>
      {%- endfor %}
    </table>
  </div>
</div>
{{ m::footer() }}