@layer utilities {
  /* Text */
  .txt-x-small { font-size: var(--txt-x-small); }
  .txt-small { font-size: var(--txt-small); }
  .txt-medium { font-size: var(--txt-medium); }
  .txt-large { font-size: var(--txt-large); }
  .txt-x-large { font-size: var(--txt-x-large); }
  .txt-xx-large { font-size: var(--txt-xx-large); }

  .txt-small--responsive { font-size: var(--font-small-responsive); }
  .txt-medium--responsive { font-size: var(--font-medium-responsive); }
  .txt-large--responsive { font-size: var(--font-large-responsive); }
  .txt-x-large--responsive { font-size: var(--font-x-large-responsive); }

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

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

  .txt-ink { color: var(--color-text); }
  .txt-subtle { color: var(--color-text-subtle); }
  .txt-ink-inverted { color: var(--color-ink-inverted); }
  .txt-blue { color: var(--color-blue); }
  .txt-theme { color: var(--color-theme); }
  .txt-positive { color: var(--color-positive); }
  .txt-negative { color: var(--color-negative); }

  .txt-underlined { text-decoration: underline; color: inherit; }
  .txt-undecorated { text-decoration: none; color: inherit; }
  .txt-tight-lines { line-height: 1; }
  .txt-normal { font-weight: 400; font-style: normal; }
  .txt-nowrap { white-space: nowrap; }
  .txt-uppercase { text-transform: uppercase; }

  /* Lists */
  .list-unbulleted { list-style: none; }
  .list-bordered {
    li {
      border-block-end: 1px dashed var(--color-ink-light);

      &:first-of-type {
        border-block-start: 1px dashed var(--color-ink-light);
      }
    }
  }
  .list-divided {
    li + li {
      border-block-start: 1px dashed var(--color-subtle-dark);
    }
  }

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

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

  .align-self-start { align-self: start; }

  .contain { contain: inline-size; }

  .block { display: block; }
  .inline-block { display: inline-block; }
  .contents { display: contents; }
  .grid { display: grid; }

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

  .flex-item-grow { flex-grow: 1; }
  .flex-item-shrink { flex-shrink: 1; }
  .flex-item-no-shrink { flex-shrink: 0; }
  .flex-item-justify-start { margin-inline-end: auto; }
  .flex-item-justify-end { margin-inline-start: auto; }
  .flex-item-1 { flex: 1; }

  .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%; }
  .min-width { min-inline-size: 0; }
  .half-width { inline-size: 50%; }
  .max-width { max-inline-size: 100%; }
  .min-content { inline-size: min-content; }
  .max-inline-size { max-inline-size: 100%; }

  /* Overflow */
  .overflow-x { overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth; }
  .overflow-y { overflow-y: auto; scroll-snap-type: y mandatory; scroll-behavior: smooth; }
  .overflow-clip { text-overflow: clip; white-space: nowrap; overflow: hidden; }
  .overflow-ellipsis { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; max-inline-size: 100cqi; }

  .overflow-hide-scrollbar::-webkit-scrollbar {
    @media (pointer: course) {
      display: none;
    }
  }

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

  .overflow-fade {
    --fade-width: 2em;
    --fade-color: var(--color-body);
    position: relative;

    &::before,
    &::after {
      background: linear-gradient(90deg, var(--fade-color), transparent);
      block-size: 100%;
      content: "";
      inline-size: var(--fade-width);
      inset-block-start: 0;
      inset-inline-start: 0;
      position: absolute;
    }

    &:after {
      background: linear-gradient(-90deg, var(--fade-color), transparent);
      inset-inline: auto 0;
    }
  }

  /* Padding */
  .pad { padding: var(--block-space) var(--inline-space); }
  .pad-double { padding: var(--block-space-double) var(--inline-space-double); }

  .pad-block { padding-block: var(--block-space); }
  .pad-block-start { padding-block-start: var(--block-space); }
  .pad-block-end { padding-block-end: var(--block-space); }
  .pad-block-half { padding-block: var(--block-space-half); }
  .pad-block-start-half { padding-block-start: var(--block-space-half); }

  .pad-inline { padding-inline: var(--inline-space); }
  .pad-inline-start { padding-inline-start: var(--inline-space); }
  .pad-inline-end { padding-inline-end: var(--inline-space); }
  .pad-inline-half { padding-inline: var(--inline-space-half); }
  .pad-inline-double { padding-inline: var(--inline-space-double); }

  .unpad { padding: 0; }

  /* Margins */
  .margin { margin: var(--block-space) var(--inline-space); }
  .margin-block { margin-block: var(--block-space); }
  .margin-block-half { margin-block: var(--block-space-half); }
  .margin-block-quarter { margin-block: var(--block-space-quarter); }
  .margin-block-start { margin-block-start: var(--block-space); }
  .margin-block-start-half { margin-block-start: var(--block-space-half); }
  .margin-block-start-quarter { margin-block-start: var(--block-space-quarter); }
  .margin-block-end { margin-block-end: var(--block-space); }
  .margin-block-end-half { margin-block-end: var(--block-space-half); }
  .margin-block-end-quarter { margin-block-end: var(--block-space-quarter); }
  .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-block-triple { margin-block: var(--block-space-triple); }
  .margin-block-end-triple { margin-block-end: var(--block-space-triple); }
  .margin-block-start-triple { margin-block-start: var(--block-space-triple); }

  .margin-inline { margin-inline: var(--inline-space); }
  .margin-inline-start { margin-inline-start: var(--inline-space); }
  .margin-inline-start-half { margin-inline-start: var(--inline-space-half); }
  .margin-inline-end { margin-inline-end: var(--inline-space); }
  .margin-inline-end-half { margin-inline-end: var(--inline-space-half); }
  .margin-inline-half { margin-inline: var(--inline-space-half); }
  .margin-inline-double { margin-inline: var(--inline-space-double); }

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

  .margin-none-inline { margin-inline: 0; }
  .margin-none-inline-start { margin-inline-start: 0; }
  .margin-none-inline-end { margin-inline-end: 0; }

  .margin-negative-inline { margin-inline: calc(-1 * var(--inline-space)); }
  .margin-negative-block { margin-block: calc(-1 * var(--block-space)); }
  .margin-negative-block-start { margin-block-start: calc(-1 * var(--block-space)); }
  .margin-negative-block-start-double { margin-block-start: calc(-1 * var(--block-space-double)); }
  .margin-negative-block-start-triple { margin-block-start: calc(-1 * var(--block-space-triple)); }
  .margin-negative-block-end { margin-block-end: calc(-1 * var(--block-space)); }
  .margin-negative-block-end-half { margin-block-end: calc(-0.5 * var(--block-space)); }

  .space-double > * + * { margin-block-start: var(--block-space-double); }

  .center { margin-inline: auto; }
  .center-block { margin-block: auto; }

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

  /* Fills */
  .fill { background-color: var(--color-body); }
  .fill-ink { background-color: var(--color-ink); }
  .fill-canvas { background-color: var(--color-canvas); }
  .fill-shade { background-color: var(--color-theme-lighter); }
  .fill-selected { background-color: var(--color-theme-lightest); }
  .fill-ink-lighter { background-color: var(--color-ink-lighter); }
  .fill-positive-light { background-color: var(--color-positive-light); }
  .fill-positive-lighter { background-color: var(--color-positive-lighter); }
  .fill-transparent { background-color: transparent; }

  .translucent { opacity: var(--opacity, 0.5); }

  /* Borders */
  .border { border: var(--border-size, 1px) solid var(--border-color, var(--color-ink-lighter)); }
  .border-top { border-block-start: var(--border-size, 1px) solid var(--border-color, var(--color-ink-lighter)); }
  .borderless { border: 0; }
  .border-dashed { border-style: dashed; }

  /* Border radius */
  .border-radius { border-radius: var(--border-radius, 1em); }

  /* Shadows */
  .no-shadow-on-hover:hover { --hover-size: 0; }

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

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

  /* Width */
  .fit-width { inline-size: fit-content; }

  /* Rotate */
  .rotate-positive-1 { transform: rotate(1deg); }
  .rotate-negative-1 { transform: rotate(-1deg); }

  /* Interactivity */
  .no-pointer-events {
    pointer-events: none;
  }

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

  /* Visibility */
  [hidden] { display: none!important; }
  [contents] { display: contents; }
  [data-authorized-visibility="unauthorized"] { display: none; }
  .hidden-for-scoped-access {
    .has-scoped-session & {
      display: none;
    }
  }
}
