{% load i18n %}

{% trans "Metric" %}

{% trans "KPI tiles for at-a-glance numeric summaries. Wrap tiles in " %}dcr-metric-grid{% trans " for automatic responsive columns." %}

Active Workers12
Tasks Processed847
Retrying3
Failed1
Offline-

{% trans "Usage" %}

<!-- value modifiers: (none) · success · warning · danger · disabled -->
<div class="dcr-metric-grid">
  <div class="dcr-metric">
    <span class="dcr-metric__label">Tasks Processed</span>
    <span class="dcr-metric__value dcr-metric__value--success">847</span>
  </div>
</div>

{% trans "Definition List" %}

{% trans "Label / value pairs on a subtle background. Two layouts: " %}{% trans "vertical" %}{% trans " (stacked rows, default) and " %}{% trans "horizontal" %}{% trans " (inline info bar, add " %}--horizontal{% trans ")." %}

{% trans "Vertical (default)" %}

{% trans "Key" %}
user:42:profile
{% trans "Type" %}
HASH
{% trans "TTL" %}
1h (31m {% trans "remaining" %})
{% trans "Size" %}
412 B

{% trans "Usage" %}

<dl class="dcr-dl">
  <div class="dcr-dl__row">
    <dt class="dcr-dl__label">Key</dt>
    <dd class="dcr-dl__value dcr-dl__value--mono">user:42:profile</dd>
  </div>
  <div class="dcr-dl__row">
    <dt class="dcr-dl__label">Type</dt>
    <dd class="dcr-dl__value"><span class="dcr-badge dcr-badge--warning">HASH</span></dd>
  </div>
  <div class="dcr-dl__row">
    <dt class="dcr-dl__label">TTL</dt>
    <dd class="dcr-dl__value">1h <span class="dcr-dl__secondary">(31m remaining)</span></dd>
  </div>
</dl>

{% trans "Horizontal (--horizontal)" %}

{% trans "Host" %}
redis-prod-1.internal:6379
{% trans "Version" %}
7.2.4
{% trans "Databases" %}
16
{% trans "Total Keys" %}
12

{% trans "Usage" %}

<dl class="dcr-dl dcr-dl--horizontal">
  <div class="dcr-dl__item">
    <dt class="dcr-dl__label">Host</dt>
    <dd class="dcr-dl__value dcr-dl__value--mono">redis-prod-1.internal:6379</dd>
  </div>
  <div class="dcr-dl__item">
    <dt class="dcr-dl__label">Version</dt>
    <dd class="dcr-dl__value">7.2.4</dd>
  </div>
</dl>

{% trans "Horizontal with action (--horizontal + __actions)" %}

{% trans "Total Events" %}
1,842
{% trans "Groups" %}
27
{% trans "Unresolved" %}
19
{% trans "Last 24 h" %}
312

{% trans "Usage" %}

<dl class="dcr-dl dcr-dl--horizontal">
  <div class="dcr-dl__item">
    <dt class="dcr-dl__label">Total Events</dt>
    <dd class="dcr-dl__value">1,842</dd>
  </div>
  <div class="dcr-dl__item">
    <dt class="dcr-dl__label">Unresolved</dt>
    <dd class="dcr-dl__value" style="color:var(--dcr-color-danger)">19</dd>
  </div>
  <!-- __actions is pushed to the far right via margin-left:auto -->
  <div class="dcr-dl__actions">
    <a href="…" class="dcr-btn dcr-btn--ghost dcr-btn--sm">View grouped</a>
  </div>
</dl>

{% trans "Panel Grid" %}

{% trans "Responsive grid for the panel index page. Use " %}dcr-panel-grid{% trans " as the container and " %}dcr-panel-card{% trans " for each item. Wrap the icon in " %}dcr-panel-card__icon-wrap{% trans " with a colour modifier. Use " %}dcr-badge{% trans " variants for install status. Add " %}dcr-panel-card--coming-soon{% trans " to dim unavailable panels." %}

{% trans "Featured Panels" %}

{% trans "NOT INSTALLED" %}

{% trans "Redis Panel" %}

{% trans "Monitor connections, memory, keys, and throughput." %}

{% trans "INSTALLED" %}

{% trans "Cache Panel" %}

{% trans "Inspect cached entries, hit/miss ratios." %}

{% trans "COMING SOON" %}

{% trans "Error Panel" %}

{% trans "Monitor errors, stack traces, and exceptions." %}

{% trans "Community Panels" %}

{% trans "INSTALLED" %}

{% trans "DJ Control Room Base" %}

{% trans "Core framework for Django Control Room panels." %}

{% trans "Usage" %}

<!-- section label -->
<div class="dcr-section-header">
  <h3 class="dcr-section-header__title">Featured Panels</h3>
</div>

<div class="dcr-panel-grid">

  <!-- installed - accent icon wrap -->
  <div class="dcr-panel-card">
    <div class="dcr-panel-card__top">
      <div class="dcr-panel-card__icon-wrap dcr-panel-card__icon-wrap--accent">
        <svg class="dcr-panel-card__icon" …></svg>
      </div>
      <span class="dcr-badge dcr-badge--success">INSTALLED</span>
    </div>
    <h3 class="dcr-panel-card__title">Redis Panel</h3>
    <p class="dcr-panel-card__desc">Monitor connections…</p>
    <div class="dcr-panel-card__footer">
      <a href="/redis/" class="dcr-panel-card__link">View panel</a>
    </div>
  </div>

  <!-- icon wrap colour variants -->
  <!-- (none) · accent · success · warning · danger · info · muted · purple · indigo -->

  <!-- not installed -->
  <div class="dcr-panel-card">
    …
    <span class="dcr-badge dcr-badge--muted">NOT INSTALLED</span>
    …
    <a href="#" class="dcr-panel-card__link">Install panel</a>
  </div>

  <!-- coming soon -->
  <div class="dcr-panel-card dcr-panel-card--coming-soon">
    …
    <span class="dcr-badge dcr-badge--warning">COMING SOON</span>
    …
    <span class="dcr-panel-card__link dcr-panel-card__link--muted">Coming soon</span>
  </div>

</div>

</div>

{% trans "Split Card" %}

{% trans "A full-width bordered card divided into equal columns by vertical rules. Add as many " %}dcr-split-card__section{% trans " children as needed - the dividers are generated automatically. Stacks vertically on narrow viewports. Compose freely with " %}dcr-panel-card__icon-wrap{% trans " and " %}dcr-panel-card__link{% trans " inside each section." %}

{% trans "2-way split" %}

{% trans "More panels on the way" %}

{% trans "We're building more tools to bring full observability to your Django admin. Follow our progress on GitHub." %}

{% trans "Build your own panel" %}

{% trans "Django Control Room is built to be extended. Use our cookiecutter template to scaffold a fully structured panel plugin in seconds." %}

{% trans "Usage" %}

<div class="dcr-split-card">
  <div class="dcr-split-card__section">
    <div class="dcr-panel-card__icon-wrap dcr-panel-card__icon-wrap--info">
      <svg class="dcr-panel-card__icon" …></svg>
    </div>
    <h3 class="dcr-split-card__title">More panels on the way</h3>
    <p class="dcr-split-card__desc">Description text.</p>
    <div class="dcr-split-card__footer">
      <a href="#" class="dcr-panel-card__link">GitHub</a>
    </div>
  </div>
  <div class="dcr-split-card__section">
    <!-- second section … -->
  </div>
</div>

{% trans "3-way split" %}

{% trans "Open source" %}

{% trans "MIT-licensed and fully open. Inspect the code, file issues, or contribute on GitHub." %}

{% trans "Read the docs" %}

{% trans "Full API reference, configuration options, and how-to guides for panel authors." %}

{% trans "Join the community" %}

{% trans "Ask questions, share panels, and stay up to date in the Django Control Room Discord." %}

{% trans "Usage" %}

<!-- 3-way split: just add a third section -->
<div class="dcr-split-card">
  <div class="dcr-split-card__section">…</div>
  <div class="dcr-split-card__section">…</div>
  <div class="dcr-split-card__section">…</div>
</div>

{% trans "Card" %}

{% trans "Generic bordered container for building any card-like panel UI. Compose " %}dcr-card__header{% trans ", " %}dcr-card__body{% trans ", " %}dcr-card__row{% trans ", and " %}dcr-card__footer{% trans " as needed. Add " %}dcr-card__header--subtle{% trans " to tint the header. Use " %}dcr-card__body--flush{% trans " to remove padding from the body (e.g. when the body contains a table or list)." %}

{% trans "Header + body" %}

{% trans "Card title" %}

{% trans "meta" %}

{% trans "Body content goes here. Use " %}dcr-card__body{% trans " for padded content." %}

{% trans "Subtle header + body + footer" %}

{% trans "Subtle header" %}

{% trans "Live" %}

{% trans "Use " %}dcr-card__header--subtle{% trans " for a tinted header row." %}

{% trans "Flush body (table / list)" %}

{% trans "Flush body" %}

{% trans "Row one" %}
{% trans "Row two" %}
{% trans "Row three" %}
{% trans "Body only (no header)" %}

{% trans "Cards don't require a header. Drop any zone you don't need." %}

{% trans "Usage" %}

<!-- header + body -->
<div class="dcr-card">
  <div class="dcr-card__header">
    <h3 class="dcr-card__title">
      <svg class="dcr-card__title-icon" …></svg>
      Card title
    </h3>
    <span class="dcr-card__meta">meta</span>
  </div>
  <div class="dcr-card__body">…</div>
  <div class="dcr-card__footer">Footer note</div>
</div>

<!-- subtle (tinted) header -->
<div class="dcr-card">
  <div class="dcr-card__header dcr-card__header--subtle">…</div>
  …
</div>

<!-- flush body (no padding - use for tables, lists) -->
<div class="dcr-card">
  <div class="dcr-card__header">…</div>
  <div class="dcr-card__body dcr-card__body--flush">…</div>
</div>

{% trans "Card: Activity Feed" %}

{% trans "Use " %}dcr-card{% trans " with " %}dcr-card__row{% trans " items. Each row uses " %}dcr-card__row-source{% trans " (badge), " %}dcr-card__row-text{% trans ", and " %}dcr-card__row-time{% trans "." %}

{% trans "Recent activity" %}

{% trans "Across all panels" %}
ERRORS {% trans "New error group: KeyError in checkout.views.create_order" %} 2m {% trans "ago" %}
CELERY {% trans "Worker celery@web-2 reconnected after brief disconnect" %} 14m {% trans "ago" %}
CACHE {% trans "Backend longterm hit rate climbed back above 90%" %} 38m {% trans "ago" %}

{% trans "Usage" %}

<div class="dcr-card">
  <div class="dcr-card__header">
    <h3 class="dcr-card__title">
      <svg class="dcr-card__title-icon" …></svg>
      Recent activity
    </h3>
    <span class="dcr-card__meta">Across all panels</span>
  </div>
  <div class="dcr-card__row">
    <span class="dcr-card__row-source"><span class="dcr-badge dcr-badge--warning">ERRORS</span></span>
    <span class="dcr-card__row-text">KeyError in checkout.views.create_order</span>
    <span class="dcr-card__row-time">2m ago</span>
  </div>
</div>

{% trans "Card: Key/Value" %}

{% trans "Use " %}dcr-card{% trans " with " %}dcr-card__row{% trans " items. Each row uses " %}dcr-card__row-label{% trans " and " %}dcr-card__row-value{% trans " (add " %}--bold{% trans " for emphasis). " %}dcr-card__footer{% trans " adds a muted note below the rows." %}

{% trans "System" %}

Django 5.0.6
Python 3.12.3
Database PostgreSQL 16
Cache Redis 7.2

{% trans "Usage" %}

<div class="dcr-card">
  <div class="dcr-card__header">
    <h3 class="dcr-card__title">System</h3>
  </div>
  <div class="dcr-card__row">
    <span class="dcr-card__row-label">Django</span>
    <span class="dcr-card__row-value">5.0.6</span>
  </div>
  <div class="dcr-card__row">
    <span class="dcr-card__row-label">Database</span>
    <span class="dcr-card__row-value dcr-card__row-value--bold">PostgreSQL 16</span>
  </div>
  <div class="dcr-card__footer">Last refreshed just now.</div>
</div>

{% trans "Code Viewer" %}

{% trans "Use " %}dcr-code-viewer{% trans " as the outer wrapper. " %}dcr-code-viewer__header{% trans " / " %}__label{% trans " / " %}__meta{% trans " style the labelled header strip. " %}dcr-code-viewer__body{% trans " holds the highlight.js code block. Optionally add a " %}dcr-code-viewer__title{% trans " zone for function signatures." %}

<> {% trans "Raw Value" %} 412 B
{"id": "42", "username": "ada", "theme": "dark"}

{% trans "Usage" %}

<div class="dcr-code-viewer">
  <div class="dcr-code-viewer__header">
    <span class="dcr-code-viewer__label"><> Raw Value</span>
    <span class="dcr-code-viewer__meta">412 B</span>
  </div>
  <pre class="dcr-code-viewer__body"><code class="language-json">{"key": "value"}</code></pre>
</div>

<!-- With optional title zone -->
<div class="dcr-code-viewer">
  <div class="dcr-code-viewer__title">
    <div class="dcr-code-viewer__title-main">
      <div class="dcr-code-viewer__title-sig">
        <span class="dcr-code-viewer__title-lineno">1</span>
        <span class="dcr-code-viewer__title-name">create_profile</span>
        <span class="dcr-code-viewer__title-params">sender = auth.User</span>
      </div>
      <div class="dcr-code-viewer__title-path">profiles/signals.py:14</div>
    </div>
    <div class="dcr-code-viewer__title-tags">
      <span class="dcr-badge">profiles</span>
    </div>
  </div>
  <div class="dcr-code-viewer__header">…</div>
  <pre class="dcr-code-viewer__body">…</pre>
</div>