/* Small, framework-free utilities for portal templates. */
*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  background: var(--bg);
  color: var(--txt);
  font-family: var(--font-sans);
  font-size: var(--fs-md);
  line-height: var(--lh-body);
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--txt);
}

a {
  color: var(--accent-400);
  text-decoration: none;
}

a:hover {
  color: var(--accent-300);
}

:focus-visible {
  outline: 1px solid var(--focus-line);
  outline-offset: 2px;
  box-shadow: var(--focus-ring);
}

.u-container {
  width: min(100% - 32px, 1280px);
  margin-inline: auto;
}

.u-stack {
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
}

.u-stack-sm { gap: var(--sp-2); }
.u-stack-lg { gap: var(--sp-6); }

.u-cluster {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-3);
}

.u-between {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-4);
}

.u-grid {
  display: grid;
  grid-template-columns: repeat(var(--cols, 12), minmax(0, 1fr));
  gap: var(--gap, var(--sp-4));
}

.u-span-2 { grid-column: span 2; }
.u-span-3 { grid-column: span 3; }
.u-span-4 { grid-column: span 4; }
.u-span-6 { grid-column: span 6; }
.u-span-8 { grid-column: span 8; }
.u-span-12 { grid-column: 1 / -1; }

.u-flex { display: flex; }
.u-inline-flex { display: inline-flex; }
.u-items-center { align-items: center; }
.u-justify-end { justify-content: flex-end; }
.u-gap-1 { gap: var(--sp-1); }
.u-gap-2 { gap: var(--sp-2); }
.u-gap-3 { gap: var(--sp-3); }
.u-gap-4 { gap: var(--sp-4); }
.u-gap-6 { gap: var(--sp-6); }

.u-p-2 { padding: var(--sp-2); }
.u-p-3 { padding: var(--sp-3); }
.u-p-4 { padding: var(--sp-4); }
.u-p-5 { padding: var(--sp-5); }
.u-p-6 { padding: var(--sp-6); }
.u-mt-2 { margin-top: var(--sp-2); }
.u-mt-4 { margin-top: var(--sp-4); }
.u-mt-6 { margin-top: var(--sp-6); }
.u-mb-0 { margin-bottom: 0; }

.u-text-2xs { font-size: var(--fs-2xs); }
.u-text-xs { font-size: var(--fs-xs); }
.u-text-sm { font-size: var(--fs-sm); }
.u-text-lg { font-size: var(--fs-lg); }
.u-text-xl { font-size: var(--fs-xl); }
.u-text-2xl { font-size: var(--fs-2xl); }
.u-text-3xl { font-size: var(--fs-3xl); }
.u-muted { color: var(--muted); }
.u-subtle { color: var(--text-subtle); }
.u-mono { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
.u-truncate {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.u-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

@media (max-width: 900px) {
  .u-grid {
    grid-template-columns: repeat(6, minmax(0, 1fr));
  }
  .u-span-8,
  .u-span-6,
  .u-span-4,
  .u-span-3 {
    grid-column: 1 / -1;
  }
  .u-between {
    align-items: flex-start;
    flex-direction: column;
  }
}

@media (max-width: 640px) {
  .u-container {
    width: min(100% - 20px, 1280px);
  }
  .u-grid {
    grid-template-columns: 1fr;
  }
  .u-span-2,
  .u-span-3,
  .u-span-4,
  .u-span-6,
  .u-span-8,
  .u-span-12 {
    grid-column: 1 / -1;
  }
}
