rustio-admin 0.30.0

Django Admin, but for Rust. A small, focused admin framework.
Documentation
/* ============================================================
 * rustio-admin / pages / tools  —  history (audit), object history,
 * db browser. Generic .rio-table, audit badges, field diffs, avatar,
 * date dividers, and the db-browser schema cards.
 * ============================================================ */

/* The DS .rio-table (components/data.css, contract §9) is the single authority —
 * the history / audit / db-browser tables use it directly. An earlier competing
 * redefinition lived here (gray thead fill, mono headers) and, loading after the
 * component sheet, shadowed the §9 table globally. Removed so every .rio-table
 * renders the one contract look. */

/* The canonical .rio-pill (contract §9) lives in components/data.css — the
 * audit/history/health pages use it directly; the earlier duplicate here
 * (mono, dotted) was removed so there is one pill system. */

/* ---- Health page ---- */
.rio-health__summary { display: flex; align-items: center; gap: var(--rio-space-12); margin-block-end: var(--rio-space-16); }
.rio-health__row--error td { background: var(--rio-danger-tint); }
.rio-health__row--warn td { background: var(--rio-warn-tint); }

/* ---- Avatar + "by" ---- */
.rio-avatar { inline-size: 28px; block-size: 28px; flex: none; border-radius: var(--rio-radius-md); background: var(--rio-rust-tint); color: var(--rio-rust); display: grid; place-items: center; font-family: var(--rio-font-display); font-weight: 700; font-size: var(--rio-text-12); }
.rio-by { display: inline-flex; align-items: center; gap: var(--rio-space-8); color: var(--rio-text); text-decoration: none; }
.rio-by:hover { color: var(--rio-rust); }

/* ---- Date divider rows ---- */
.rio-history-date-divider th, tr.lx-date th {
  padding: 8px 16px !important; background: var(--rio-bg);
  font-family: var(--rio-font-body); font-size: var(--rio-text-12); font-weight: 700;
  letter-spacing: 0.04em; text-transform: uppercase; color: var(--rio-text-mute); text-align: start;
}

/* ---- Field diffs ---- */
.rio-history-diff, .lx-diff { margin: var(--rio-space-8) 0 0; display: grid; gap: 2px; }
.rio-history-diff__row, .lx-diff__row { display: flex; align-items: baseline; gap: 8px; font-size: var(--rio-text-13); }
.rio-history-diff__label, .lx-diff__label { color: var(--rio-text-faint); min-inline-size: 90px; font-family: var(--rio-font-mono); }
.rio-history-diff dd, .lx-diff dd { margin: 0; }
.rio-history-diff__old, .lx-diff__old { color: var(--rio-danger); text-decoration: line-through; }
.rio-history-diff__arrow, .lx-diff__arrow { color: var(--rio-text-faint); }
.rio-history-diff__new, .lx-diff__new { color: var(--rio-success); }

/* ---- DB browser ---- */
.rio-db-stats { display: flex; flex-wrap: wrap; gap: var(--rio-space-48); margin: 0; }
.rio-db-stat dt { font-family: var(--rio-font-body); font-weight: 700; font-size: var(--rio-text-12); text-transform: uppercase; letter-spacing: 0.05em; color: var(--rio-text-mute); }
.rio-db-stat dd { margin: 2px 0 0; font-family: var(--rio-font-mono); font-size: var(--rio-text-30); font-weight: 500; color: var(--rio-text-hi); font-variant-numeric: lining-nums tabular-nums; }
.rio-db-table { padding: 0 !important; overflow: hidden; }
.rio-db-table__header { display: flex; align-items: baseline; justify-content: space-between; gap: var(--rio-space-16); padding: var(--rio-space-16) var(--rio-space-20); border-block-end: 1px solid var(--rio-line); }
.rio-db-table__header h2 { margin: 0; font-family: var(--rio-font-mono); font-size: var(--rio-text-17); color: var(--rio-text-hi); }
.rio-db-fks { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--rio-space-20); padding: var(--rio-space-20); border-block-start: 1px solid var(--rio-line); }
.rio-db-fks__group h3 { font-family: var(--rio-font-body); font-weight: 700; font-size: var(--rio-text-12); text-transform: uppercase; letter-spacing: 0.05em; color: var(--rio-text-mute); margin: 0 0 var(--rio-space-8); }
.rio-db-fk-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--rio-space-6); font-size: var(--rio-text-13); }
.rio-db-fk-list a { color: var(--rio-rust); text-decoration: none; }