rustio-admin 0.24.0

Django Admin, but for Rust. A small, focused admin framework.
Documentation
/* ============================================================
 * rustio-admin / layout / sidebar
 *
 * Left navigation rail — section headings, link rows, active-rail
 * accent. Pinned in the flex row at tablet+; collapses to an
 * off-canvas drawer below 768px (see layout/responsive.css).
 * ============================================================ */

.rio-sidebar {
  flex: 0 0 var(--rio-sidebar-w);
  /* v0.15: chrome tier (Principle 10). Sidebar matches topbar
   * so the operator skeleton reads as one continuous frame
   * holding the content area. v0.16: internal padding generous
   * (`--rio-s5` vertical / `--rio-s4` horizontal) so sidebar items
   * have breathing room without losing the rail's visual weight. */
  background: var(--rio-surface-chrome);
  border-inline-end: 1px solid var(--rio-border);
  padding: var(--rio-s5) var(--rio-s4);
}
.rio-sidebar-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--rio-s1);                          /* 4px between items */
}
.rio-sidebar-section {
  /* v0.16: 12px (was 11px) uppercase label — readable at chrome
   * distance, matches the table-header treatment so the
   * "uppercase label" pattern reads the same everywhere. */
  font-size: 0.75rem;                          /* 12px */
  font-weight: var(--rio-fw-semibold);
  text-transform: uppercase;
  letter-spacing: var(--rio-tracking-allcaps);
  color: var(--rio-text-subtle);
  margin: var(--rio-s5) 0 var(--rio-s2);
  padding: 0 var(--rio-s3);
}
.rio-sidebar-section:first-child { margin-top: 0; }
.rio-sidebar-link {
  /* v0.16 — 16px font, 1.6 line-height, 12/16px padding → ~40px
   * click target. Sidebar items go from cramped 32px rows to
   * comfortable 40px without inflating the rail. */
  display: flex;
  align-items: center;
  gap: var(--rio-s3);                          /* 12px icon → label */
  padding: var(--rio-s3) var(--rio-s4);        /* 12px / 16px */
  border-radius: var(--rio-radius-sm);
  color: var(--rio-text);
  font-size: var(--rio-fs-md);                 /* 16px */
  font-weight: var(--rio-fw-medium);
  line-height: var(--rio-lh-ui);               /* 1.6 */
  transition: background 0.12s, color 0.12s, box-shadow 0.12s;
}
.rio-sidebar-link:hover {
  /* On the chrome surface, hover lifts to surface-2 (the table
   * header tone) — visible but quieter than surface-3 which
   * stayed the row-selection colour. */
  background: var(--rio-surface-2);
  color: var(--rio-text-strong);
  text-decoration: none;
}
.rio-sidebar-link.is-active {
  /* Active link: accent-tinted wash + an explicit 3px stripe.
   * The stripe is the directional cue ("you are here ↓"); the
   * wash gives the row weight against the new chrome surface. */
  background: rgb(var(--rio-accent-rgb) / 0.12);
  color: var(--rio-accent);
  box-shadow: inset 3px 0 0 var(--rio-accent);
}
.rio-sidebar-link .rio-icon {
  width: 18px;
  height: 18px;
  color: var(--rio-text-subtle);
  flex-shrink: 0;
  transition: color 0.12s;
}
.rio-sidebar-link:hover .rio-icon { color: var(--rio-text-strong); }
.rio-sidebar-link.is-active .rio-icon { color: var(--rio-accent); }