Перейти к содержимому
Плотность
Тема

Сборки

Дашборд

Сводка за сутки: ряд метрик, тренд, таблица прогонов. Ни одного класса, кроме китовых, и ни одной строки скрипта.

Компонент

Прогоны

Сводка за последние сутки по всем проектам.

Прогонов
128
12% к прошлой неделе
Среднее время
42 с
18% к прошлой
Токенов
184 тыс.
без изменений
Упало
7
5 новых
Последние прогоны
Последние прогоны
Состояние Токенов
worldgen-01 идёт 18,261 204
biomes-04 готово 11,538 910
audio-pass упало 4,21 180
nightly-4127 с замечаниями 33,982 640
Итого67,8183 934
Токены в сутки
  • Расход 184 тыс.
Бюджет 184 320 из 250 000
При текущем темпе хватит ещё примерно на 3 прогона.
Разметка
<div class="inst-container inst-container--full inst-stack">

  <div class="inst-page-header">
    <div class="inst-page-header-main">
      <h3 class="inst-page-title">Прогоны</h3>
      <p class="inst-page-desc">Сводка за последние сутки по всем проектам.</p>
    </div>
    <div class="inst-page-actions">
      <div class="inst-segmented" role="radiogroup" aria-label="Период">
        <button type="button" role="radio" aria-checked="false">Сутки</button>
        <button type="button" role="radio" aria-checked="true">Неделя</button>
        <button type="button" role="radio" aria-checked="false">Месяц</button>
      </div>
      <button class="inst-btn inst-btn--sm inst-btn--primary" type="button">Запустить</button>
    </div>
  </div>

  <div class="inst-metric-row">
    <div class="inst-metric">
      <div class="inst-metric-label">Прогонов</div>
      <div class="inst-metric-value">128</div>
      <div class="inst-metric-delta" data-dir="up" data-tone="ok">12% к прошлой неделе</div>
    </div>
    <div class="inst-metric">
      <div class="inst-metric-label">Среднее время</div>
      <div class="inst-metric-value">42<span class="inst-metric-unit">&nbsp;с</span></div>
      <div class="inst-metric-delta" data-dir="down" data-tone="ok">18% к прошлой</div>
    </div>
    <div class="inst-metric">
      <div class="inst-metric-label">Токенов</div>
      <div class="inst-metric-value">184<span class="inst-metric-unit">&nbsp;тыс.</span></div>
      <div class="inst-metric-delta">без изменений</div>
    </div>
    <div class="inst-metric">
      <div class="inst-metric-label">Упало</div>
      <div class="inst-metric-value">7</div>
      <div class="inst-metric-delta" data-dir="up" data-tone="error">5 новых</div>
    </div>
  </div>

  <div class="inst-split">
    <div class="inst-split-main inst-panel">
      <div class="inst-panel-header">
        <span class="inst-panel-title">Последние прогоны</span>
        <span class="inst-panel-actions">
          <span class="inst-search">
            <input class="inst-input inst-input--sm" type="search" placeholder="Фильтр" aria-label="Фильтр по прогонам">
          </span>
        </span>
      </div>
      <div class="inst-panel-body inst-panel-body--flush">
        <table class="inst-table">
          <caption class="inst-u-visually-hidden">Последние прогоны</caption>
          <thead>
            <tr>
              <th aria-sort="descending"><button class="inst-sort" type="button">Прогон</button></th>
              <th>Состояние</th>
              <th class="inst-num"><button class="inst-sort" type="button">Время, с</button></th>
              <th class="inst-num">Токенов</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>worldgen-01</td>
              <td><span class="inst-badge" data-tone="running"><span class="inst-dot"></span>идёт</span></td>
              <td class="inst-num">18,2</td><td class="inst-num">61 204</td>
            </tr>
            <tr>
              <td>biomes-04</td>
              <td><span class="inst-badge" data-tone="ok"><span class="inst-dot"></span>готово</span></td>
              <td class="inst-num">11,5</td><td class="inst-num">38 910</td>
            </tr>
            <tr>
              <td>audio-pass</td>
              <td><span class="inst-badge" data-tone="error"><span class="inst-dot"></span>упало</span></td>
              <td class="inst-num">4,2</td><td class="inst-num">1 180</td>
            </tr>
            <tr>
              <td>nightly-4127</td>
              <td><span class="inst-badge" data-tone="warn"><span class="inst-dot"></span>с замечаниями</span></td>
              <td class="inst-num">33,9</td><td class="inst-num">82 640</td>
            </tr>
          </tbody>
          <tfoot>
            <tr><td>Итого</td><td></td><td class="inst-num">67,8</td><td class="inst-num">183 934</td></tr>
          </tfoot>
        </table>
      </div>
    </div>

    <div class="inst-split-side inst-stack inst-stack--tight">
      <div class="inst-panel">
        <div class="inst-panel-header"><span class="inst-panel-title">Токены в сутки</span></div>
        <div class="inst-panel-body inst-stack inst-stack--tight">
          <svg class="inst-sparkline" viewBox="0 0 120 32" preserveAspectRatio="none" aria-hidden="true">
            <path class="inst-sparkline-area" d="M0,26 12,22 24,24 36,16 48,18 60,10 72,13 84,7 96,9 108,4 120,6 120,32 0,32Z"/>
            <path class="inst-sparkline-line" d="M0,26 12,22 24,24 36,16 48,18 60,10 72,13 84,7 96,9 108,4 120,6"/>
          </svg>
          <ul class="inst-legend">
            <li class="inst-legend-item"><span class="inst-legend-swatch"></span>Расход <span class="inst-legend-value">184 тыс.</span></li>
          </ul>
        </div>
      </div>

      <div class="inst-budget">
        <div class="inst-budget-row">
          <span>Бюджет</span>
          <span class="inst-budget-value">184&nbsp;320 <span class="inst-budget-of">из 250&nbsp;000</span></span>
        </div>
        <div class="inst-meter" role="progressbar" aria-label="Расход бюджета"
             aria-valuenow="74" aria-valuemin="0" aria-valuemax="100">
          <div class="inst-meter-fill" style="inline-size:74%"></div>
        </div>
        <div class="inst-budget-note">При текущем темпе хватит ещё примерно на 3 прогона.</div>
      </div>
    </div>
  </div>
</div>

Из чего собрано

Ни одного нового класса. Экран целиком — существующие компоненты, поставленные рядом.

Часть Чем собрана
Название и действия Шапка экрана, сегментированный контрол, кнопка
Ряд чисел Метрика без рамок: четыре числа — одна группа
Две колонки Сплит. Переносится сам, без медиазапроса
Таблица Таблица в панели с телом --flush
Состояние строки Бейдж с точкой: тон и слово
Тренд Спарклайн и легенда
Остаток Бюджет прогона с мерой
Ритм Стопка и сетка, ширина — контейнер

Что здесь видно

Плотность работает целиком. Переключите её в «Виде»: высоты контролов, отступы панелей и шаг таблицы меняются разом, потому что все они приходят из ролей, а не из чисел в разметке.

Тон — один словарь. data-tone на бейдже строки, на дельте метрики и на заливке меры означает одно и то же и красится из одного места.

Числа выровнены. Табличные цифры включены во всём ките, поэтому разряды в колонке стоят друг под другом без единого правила в разметке.

Ни одной тени. Глубина передана поверхностями: --surface-page под экраном, --surface-raised у панелей, врез у поля поиска.

Почему кит устроен именно так — конституция · Открытый код под MIT, github.com/keshon/instrument