{% extends "base.html" %} {% from "_event.html" import event_row with context %} {% from "_when.html" import when_field with context %} {% block body %} {% include "_timer.html" %} {#- THE PLAY SURFACE. Four big doors, nothing to configure. The photo door submits the moment a file is picked โ€” one tap, camera, done. Badges come from each module's dashboard_card ("due", "3 open", "ready"). -#}
{% for m, c in cards %}{% if m.nav %} {{ m.icon }}{{ m.title }}{% if c.badge %}{{ c.badge }}{% endif %} {% endif %}{% endfor %}
๐Ÿ“ธ with a caption, or a photo from earlier
{{ when_field('โฑ taken earlier? set the time') }}
{% if not st.active %}

Cage up

more: dice ยท hidden timer ยท note ยท started earlier

If max > min, a random duration in that range wins over the fields above.

{{ when_field('โฑ already locked? set when it started', 'Locked since') }}

Last lock

{% if last %}

{{ last_state.elapsed|dur }}

ended {{ last.ended_at|local }} ยท base {{ last_state.base_seconds|dur }} ยท adjustments {{ last_state.adjust_seconds|sdur }}

๐Ÿ“ค share recap โฌ‡ recap card {% if last.note %}+ note{% endif %}
{% else %}

The kennel is quiet. The first lock starts the log.

{% endif %}
{% else %}

Clock โš™

{% for m in quick %}
{% endfor %} {% for m in quick %}
{% endfor %}
{% if st.frozen %}
{{ when_field('โฑ thawed earlier?') }}
{% else %}
{{ when_field('โฑ froze earlier?') }}
{% endif %}
fine adjust ยท with a reason ยท for earlier
{{ when_field() }}

Session

{{ when_field() }}
{% if undo_ev %} {#- The label MUST name its target. A wheel spin with effect=freeze emits the spin and then the freeze at the same ts, and the (ts, id) sort makes the FREEZE the newest โ€” so a bare "Undo" pressed after a spin would eat the freeze and leave the spin standing. Naming it makes that visible instead of surprising. -#}
{% if undo_why %}

{{ undo_why }}

{% endif %} {% endif %}
{% if st.can_unlock %}
{% else %} {# ๐Ÿ”ด A FOURTH LEAK, and the most direct of them: this confirm() printed `remaining` VERBATIM on a hidden lock โ€” not an operand of end_at, the countdown itself, in a dialog you cannot avoid reading because you must click it. Gated like the clock. #}
{% endif %}

๐Ÿ“ค share where this lock stands

{% endif %}
{% include "_acts.html" %}
{% for m, c in cards %}

{{ m.icon }} {{ m.title }} โš™

{% include c.template %}
{% endfor %}

Recent timeline โ†’

{% if recent %} {% else %}

The log is empty.

{% endif %}
{% endblock %}