:root {
  --inline-space: 1ch;
  --inline-space-half: calc(var(--inline-space) / 2);

  --block-space: 1rem;
  --block-space-half: calc(var(--block-space) / 2);
  --block-space-double: calc(var(--block-space) * 2);
  --block-space-triple: calc(var(--block-space) * 3);
}

/* Text */
.txt-small { font-size: 0.8em; }
.txt-large { font-size: 1.4rem; }

.txt-align-center { text-align: center; }
.txt-align-start { text-align: start; }
.txt-align-end { text-align: end; }

.txt-subtle { color: var(--color-subtle-dark); }
.txt-negative { color: var(--color-negative); }

.txt-monospace { font-family: var(--font-mono); }

/* Flexbox and Grid */
.justify-center { justify-content: center; }
.justify-space-between { justify-content: space-between; }

.align-center { align-items: center; }

.flex { display: flex; }
.flex-inline { display: inline-flex; }
.flex-column { flex-direction: column; }

.flex-item-grow { flex-grow: 1; }
.flex-item-no-shrink { flex-shrink: 0; }

.grid {
  display: grid;
  grid-auto-flow: row dense;
  grid-auto-rows: minmax(0, auto);
}
.grid-2-columns { grid-template-columns: repeat(2, 1fr); }

.gap {
  column-gap: var(--column-gap, var(--inline-space));
  row-gap: var(--row-gap, var(--block-space));
}

.gap-half {
  column-gap: var(--inline-space-half);
  row-gap: var(--block-space-half);
}

/* Sizing */
.full-width { inline-size: 100%; }

/* Overflow */
.overflow-ellipsis { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; }

.overflow-line-clamp {
  -webkit-line-clamp: var(--lines, 2);
  -webkit-box-orient: vertical;
  display: -webkit-box;
  overflow: hidden;
  text-overflow: clip;
  white-space: normal;
}

/* Padding */
.unpad { padding: 0; }

/* Margins */
.margin-block { margin-block: var(--block-space); }
.margin-block-half { margin-block: var(--block-space-half); }
.margin-block-start { margin-block-start: var(--block-space); }
.margin-block-start-half { margin-block-start: var(--block-space-half); }
.margin-block-double { margin-block: var(--block-space-double); }
.margin-block-end-double { margin-block-end: var(--block-space-double); }
.margin-block-start-double { margin-block-start: var(--block-space-double); }

.margin-none { margin: 0; }
.margin-none-block-start { margin-block-start: 0; }

.center { margin-inline: auto; }
.end { margin-inline: auto 0; }

/* Position */
.position-relative { position: relative; }

/* Borders */
.border-bottom { border-bottom: var(--border-size, 1px) solid var(--border-color, var(--color-subtle)); }
.borderless { border: 0; }

/* Shadows */
.shadow {
  box-shadow:
    0 0 0 1px oklch(var(--lch-always-black) / 0.02),
    0 0.2em 1.6em -0.8em oklch(var(--lch-always-black) / 0.2),
    0 0.4em 2.4em -1em oklch(var(--lch-always-black) / 0.3),
    0 0.4em 0.8em -1.2em oklch(var(--lch-always-black) / 0.4),
    0 0.8em 1.2em -1.6em oklch(var(--lch-always-black) / 0.5),
    0 1.2em 1.6em -2em oklch(var(--lch-always-black) / 0.6);

  @media (prefers-color-scheme: dark) {
    box-shadow:
      0 0 0 1px oklch(var(--lch-always-black) / 0.42),
      0 0.2em 1.6em -0.8em oklch(var(--lch-always-black) / 0.6),
      0 0.4em 2.4em -1em oklch(var(--lch-always-black) / 0.7),
      0 0.4em 0.8em -1.2em oklch(var(--lch-always-black) / 0.8),
      0 0.8em 1.2em -1.6em oklch(var(--lch-always-black) / 0.9),
      0 1.2em 1.6em -2em oklch(var(--lch-always-black) / 1);
  }
}

/* Separators */
.separator {
  height: 2px;
  background: linear-gradient(
    to right,
    var(--color-subtle),
    var(--color-link)
  );
}

.separator-reverse {
  height: 2px;
  background: linear-gradient(
    to left,
    var(--color-subtle),
    var(--color-link)
  );
}

/* Accessibility */
.for-screen-reader {
  block-size: 1px;
  clip-path: inset(50%);
  inline-size: 1px;
  overflow: hidden;
  position: absolute;
  white-space: nowrap;
}

[contents] { display: contents; }
