.join-form {
  max-width: var(--form-width);
}

/* Generate sits inside the right end of the handle field, so the field keeps
   the same width as the others and nothing goes under it. */
.join-handle {
  position: relative;
}

.join-handle .input {
  padding-right: 6.5rem;
}

.join-generate {
  position: absolute;
  top: 5px;
  bottom: 5px;
  right: 5px;
  height: auto;
  display: flex;
  align-items: center;
  line-height: 1;
  font: inherit;
  font-size: 0.875rem;
  font-weight: var(--weight-semibold, 600);
  color: var(--accent);
  background: color-mix(in srgb, var(--accent) 8%, var(--bg));
  border: 0;
  border-radius: 6px;
  padding: 0 12px;
  cursor: pointer;
}

.join-generate:hover {
  background: color-mix(in srgb, var(--accent) 14%, var(--bg));
}

.join-terms {
  display: flex;
  gap: var(--space-2);
  align-items: center;
  margin: var(--space-4) 0;
  font-size: 0.9375rem;
}

.join-terms input {
  margin: 0;
  flex: none;
}

.join-terms a {
  text-decoration: none;
}

/* The terms line is a little wider than the fields; past phone width it
   runs past the form's edge rather than breaking "Privacy Policy" in two. */
@media (min-width: 641px) {
  .join-terms {
    white-space: nowrap;
  }
}

.join-error {
  color: var(--danger-ink, var(--danger));
  margin: 0 0 var(--space-4);
}

.join-hp {
  position: absolute;
  left: -10000px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.join-actions {
  margin-top: var(--space-2);
}

/* The button spans the form, like the payment button on /purchase, so the
   one action reads as the end of the form. */
.join-actions .button {
  width: 100%;
  justify-content: center;
}
