Applies the fix round from the finish-reviewer's disposition on commit
4b19cbd, in one batch:
- System's disk table is unreadable below 560px: horizontal-scrolling a
6-column table hid the usage bar and the temperature, the two
readings that matter most (discipline 3 — one shared ruler — was
unauditable as a result). Added a disk_row() macro and a phone-only
.tt-disk-rows reflow (name + full 20-cell bar + temp on one line,
device/free/total beneath), CSS-toggled against the existing table
at the same breakpoint.
- Contrast failure on the highest-severity state: white text on the
red .tt-field.crit/.tt-toast.error/.tt-btn.armed reversals measured
4.0:1, under the 4.5:1 floor. Switched to black text (5.25:1),
matching the black-on-yellow .warn pattern already in use — and
fixed a second instance of the same bug: .tt-field.crit had no
.tt-field-meta override, unlike .warn.
- Two type families where the direction contract names one blocky
monospace: unified on a single self-hosted face (Space Mono, one
weight, no bold) for both body and the double-height row.
- FIRST VIEWPORT proportion: an unpromised 6-item Just Added grid was
competing with NOW SHOWING for the fold instead of the contract's
"lower two-thirds in double-height cyan." Cut to a fixed 3-item,
fixed-3-column row, which also fixes the orphaned-tile grid defect
as a side effect (a fixed count can't leave a lone tile beside empty
tracks).
- Three flat mid-grey fills contradicted discipline 1 (no in-between
tone): .tt-tile-art, .tt-btn:disabled, and .tt-err pre all painted a
solid --ink-dimmer background. Centralized the dither .tt-tile-art
already used correctly into a shared --dither-mid generator and
applied it to all three.
- Google Fonts dependency on a LAN-only home server: a dropped webfont
request was a silent identity change, not a graceful fallback.
Self-hosted Space Mono under static/fonts/ via @font-face; dropped
the <link> tags from _shell.html and login.html.
- Deliberately deferred: "pages differ in stock" (discipline 5) still
fires on only one band service-wide. Every other finding was a
bounded fix to existing code; this one asks for a new mechanism (an
aggregate status band on P100) rather than a correction, so it's
flagged for a follow-up rather than rushed into this batch.
Recaptured desktop.png, mobile.png, desktop-system.png and
mobile-system.png (the four files the reviewer's findings cited)
through the same true-390px iframe method as the prior round, and
returned them for the fix round's verdict pass.
Known follow-up: DESIGN.md's typography section (written by the
documenter before this batch) still names the old two-family pairing
and needs a re-run now that the font system changed under it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBw1QodG8ZMYHrGeQfqyDS
144 lines
6.4 KiB
HTML
144 lines
6.4 KiB
HTML
{% extends "_shell.html" %}
|
|
{% from "_macros.html" import service_error, bar, tile %}
|
|
{% block title %}P100 Media Centre{% endblock %}
|
|
|
|
{% block content %}
|
|
{#- The masthead. Double height, the service's own colour, and the one
|
|
place on the page bloom is allowed. -#}
|
|
<h1 class="tt-dh bloom tt-masthead">MEDIA CENTRE</h1>
|
|
|
|
{#- ── The index IS the status page ──────────────────────────────
|
|
Every destination row carries its own live figure in its own
|
|
colour, so choosing where to go and reading how things are are
|
|
the same act. This is the whole thesis in one block. -#}
|
|
<div class="tt-rows">
|
|
<a class="tt-row" href="{{ request.script_root }}/watch">
|
|
<span class="tt-row-num">101</span>
|
|
<span class="tt-row-name">Watch</span>
|
|
<span class="tt-row-body"><span class="tt-row-sub">Who is streaming right now</span></span>
|
|
{% if tautulli.status == 'ok' %}
|
|
<span class="tt-row-val {{ 'ok' if tautulli.active_streams else 'off' }}" id="tt-streams-row">
|
|
<span id="tt-streams">{{ tautulli.active_streams }}</span> STREAMING</span>
|
|
{% else %}
|
|
<span class="tt-row-val alert">OFF AIR</span>
|
|
{% endif %}
|
|
</a>
|
|
|
|
<a class="tt-row" href="{{ request.script_root }}/library">
|
|
<span class="tt-row-num">102</span>
|
|
<span class="tt-row-name">Library</span>
|
|
<span class="tt-row-body"><span class="tt-row-sub">Everything already held</span></span>
|
|
{% if sonarr.status == 'ok' or radarr.status == 'ok' %}
|
|
<span class="tt-row-val">{{ sonarr.total_series | default(0) }} SHOWS {{ radarr.total_movies | default(0) }} FILMS</span>
|
|
{% else %}
|
|
<span class="tt-row-val alert">OFF AIR</span>
|
|
{% endif %}
|
|
</a>
|
|
|
|
<a class="tt-row" href="{{ request.script_root }}/discover">
|
|
<span class="tt-row-num">103</span>
|
|
<span class="tt-row-name">Discover</span>
|
|
<span class="tt-row-body"><span class="tt-row-sub">Popular, and not yet held</span></span>
|
|
<span class="tt-row-val">{{ (rt_movies | length) + (rt_tv | length) }} SUGGESTED</span>
|
|
</a>
|
|
|
|
<a class="tt-row" href="{{ request.script_root }}/requests">
|
|
<span class="tt-row-num">104</span>
|
|
<span class="tt-row-name">Requests</span>
|
|
<span class="tt-row-body"><span class="tt-row-sub">Waiting on a decision</span></span>
|
|
{% if ombi.status == 'ok' %}
|
|
<span class="tt-row-val {{ 'pending' if ombi.total_pending else 'off' }}">{{ ombi.total_pending | default(0) }} PENDING</span>
|
|
{% else %}
|
|
<span class="tt-row-val alert">OFF AIR</span>
|
|
{% endif %}
|
|
</a>
|
|
|
|
<a class="tt-row" href="{{ request.script_root }}/system">
|
|
<span class="tt-row-num">105</span>
|
|
<span class="tt-row-name">System</span>
|
|
<span class="tt-row-body"><span class="tt-row-sub">Array, disks and indexers</span></span>
|
|
{% if unraid.status == 'ok' %}
|
|
{%- set pct = unraid.array_used_pct | default(0) | float -%}
|
|
<span class="tt-row-val {{ 'alert' if pct >= 90 else ('warn' if pct >= 75 else 'ok') }}">{{ pct | round | int }}% FULL</span>
|
|
{% else %}
|
|
<span class="tt-row-val alert">OFF AIR</span>
|
|
{% endif %}
|
|
</a>
|
|
|
|
<a class="tt-row" href="{{ request.script_root }}/activity">
|
|
<span class="tt-row-num">106</span>
|
|
<span class="tt-row-name">Activity</span>
|
|
<span class="tt-row-body"><span class="tt-row-sub">What the stack has been doing</span></span>
|
|
{% if sabnzbd.status == 'ok' %}
|
|
<span class="tt-row-val {{ '' if sabnzbd.queue_count else 'off' }}"><span id="sab-queue">{{ sabnzbd.queue_count }}</span> IN QUEUE</span>
|
|
{% else %}
|
|
<span class="tt-row-val alert">OFF AIR</span>
|
|
{% endif %}
|
|
</a>
|
|
|
|
<a class="tt-row" href="{{ request.script_root }}/settings">
|
|
<span class="tt-row-num">900</span>
|
|
<span class="tt-row-name">Settings</span>
|
|
<span class="tt-row-body"><span class="tt-row-sub">Keys, timezone and password</span></span>
|
|
</a>
|
|
</div>
|
|
|
|
<div class="tt-sep" aria-hidden="true"></div>
|
|
|
|
{#- ── Now showing ───────────────────────────────────────────────
|
|
The lower two-thirds. The furthest-along stream is set at double
|
|
height in the live colour, with its progress as whole mosaic
|
|
cells on the service's one ruler. -#}
|
|
<div class="tt-field">
|
|
<span>Now Showing</span>
|
|
{% if tautulli.status == 'ok' %}
|
|
<span class="tt-field-meta">{{ tautulli.active_streams }} active</span>
|
|
{% endif %}
|
|
</div>
|
|
|
|
{% if tautulli.status != 'ok' %}
|
|
{{ service_error('Tautulli', tautulli.error) }}
|
|
{% elif hero %}
|
|
<div class="tt-now">
|
|
<div class="tt-dh bloom tt-now-title">{{ hero.title }}</div>
|
|
<div class="tt-now-meta">
|
|
{{ hero.user or hero.username }}
|
|
{%- if hero.player %} · {{ hero.player }}{% endif %}
|
|
{%- if hero.quality %} · {{ hero.quality }}{% endif %}
|
|
{%- if hero.state %} · {{ hero.state | upper }}{% endif %}
|
|
</div>
|
|
<div class="tt-now-line">
|
|
{{ bar(hero.progress | default(0), 'ok') }}
|
|
<span class="tt-now-pct">{{ hero.progress | default(0) | round | int }}%</span>
|
|
{% if hero.remaining %}<span class="tt-row-sub">{{ hero.remaining }} LEFT</span>{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
{% if other_sessions %}
|
|
<div class="tt-rows tt-rows-after">
|
|
{% for s in other_sessions %}
|
|
<div class="tt-row">
|
|
<span class="tt-row-body">
|
|
<span class="tt-row-title">{{ s.title }}</span>
|
|
<span class="tt-row-sub">{{ s.user or s.username }}{% if s.player %} · {{ s.player }}{% endif %}</span>
|
|
</span>
|
|
{{ bar(s.progress | default(0), 'ok') }}
|
|
<span class="tt-row-val">{{ s.progress | default(0) | round | int }}%</span>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
{% else %}
|
|
<p class="tt-empty">Nothing streaming. The service is quiet.</p>
|
|
{% endif %}
|
|
|
|
{#- ── Just added ──────────────────────────────────────────────── -#}
|
|
{% if recently_added %}
|
|
<div class="tt-field"><span>Just Added</span></div>
|
|
<div class="tt-tiles tt-tiles-row">
|
|
{% for it in recently_added %}
|
|
{{ tile(it.title, it.sub, it.poster, it.ago) }}
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
{% endblock %}
|