@layer plone-components.quanta {
  .q.react-aria-TextField,
  .q.react-aria-TextAreaField {
    position: relative;

    .react-aria-Label {
      color: var(--quanta-sapphire);
      pointer-events: none;
      touch-action: none;
      transition:
        margin-top 0.15s ease-in-out,
        margin-left 0.15s ease-in-out,
        transform 0.15s ease-in-out;
      user-select: none;
    }

    .react-aria-Label:has(+ .react-aria-Input, + .react-aria-TextArea) {
      position: absolute;
      top: 10px;
      left: 12px;
    }

    .react-aria-Label:has(
        + .react-aria-Input[data-focused],
        + .react-aria-TextArea[data-focused]
      ),
    .react-aria-Label:has(
        + .react-aria-Input:not(:placeholder-shown),
        + .react-aria-TextArea:not(:placeholder-shown)
      ) {
      margin-top: -30px;
      margin-left: -12px;
      transform: scale(0.8571428571, 0.8571428571);
      transform-origin: 0 0;
    }

    .react-aria-Label:has(
        + .react-aria-Input:not(:placeholder-shown):not(:hover):not(
            :active
          ):not(:focus),
        + .react-aria-TextArea:not(:placeholder-shown):not(:hover):not(
            :active
          ):not(:focus)
      ) {
      color: var(--basic-500);
    }

    .react-aria-Label:has(
        + .react-aria-Input[required],
        + .react-aria-TextArea[required]
      )::after {
      /* https://yoksel.github.io/url-encoder/ */
      content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24'%3E%3Cpath fill='hsl(7, 90%25, 59%25)' d='M12 18a6 6 0 100-12 6 6 0 000 12z'/%3E%3C/svg%3E");
    }

    .react-aria-Label:has(
        + .react-aria-Input[required]:not(:placeholder-shown):not(:hover):not(
            :active
          ):not(:focus),
        + .react-aria-TextArea[required]:not(:placeholder-shown):not(
            :hover
          ):not(:active):not(:focus)
      )::after {
      filter: grayscale(1);
    }

    .react-aria-Label:has(
        + .react-aria-Input[data-invalid],
        + .react-aria-TextArea[data-invalid]
      ) {
      color: var(--quanta-candy) !important;

      &::after {
        filter: none !important;
      }
    }

    .react-aria-Label:has(
        + .react-aria-Input[data-disabled],
        + .react-aria-TextArea[data-disabled]
      ) {
      color: var(--basic-400) !important;
    }

    .react-aria-Label:has(
        + .react-aria-Input[readonly],
        + .react-aria-TextArea[readonly]
      ) {
      color: var(--basic-500);
    }
  }

  .q.react-aria-TextField,
  .q.react-aria-TextAreaField {
    .react-aria-Input,
    .react-aria-TextArea {
      width: 100%;
      padding: 12px;
      border: 0;
      border-radius: 6px;
      background-color: var(--basic-200);
      box-shadow: 0 0 0 rgba(2, 19, 34, 0);
      caret-color: var(--quanta-cobalt);
      color: var(--text-color);
      cursor: text;
      text-overflow: ellipsis;
      transition:
        background-color 0.15s ease-in-out,
        box-shadow 0.15s ease-in-out;

      &[data-hovered] {
        background-color: var(--basic-300);
      }

      &[data-focused] {
        background-color: var(--basic-50);
        box-shadow: inset 0 0 0 2px var(--quanta-cobalt);
        outline: 0;
      }

      &[data-invalid] {
        background-color: var(--quanta-ballet);
        outline: 0;

        &[data-focused] {
          background-color: var(--basic-50);
          box-shadow: inset 0 0 0 2px var(--quanta-rose);
        }
      }

      &[data-disabled] {
        background-color: var(--basic-50);
        box-shadow: inset 0 0 0 1px var(--basic-300);
        color: var(--basic-300);
        pointer-events: none;

        & + .react-aria-Text {
          color: var(--basic-300);
        }
      }

      &[readonly] {
        border: 1px dashed var(--basic-400);
        background-color: var(--basic-50);
        box-shadow: none;
      }

      &::placeholder {
        color: var(--basic-400);
        opacity: 0;
        transition: opacity $time-tiny ease-in-out;
      }

      &:active::placeholder,
      &:focus::placeholder {
        opacity: 1;
      }
    }

    .react-aria-Text {
      padding-top: 3px;
      color: var(--basic-500);
      font-size: 0.9rem;
      font-weight: 500;
      letter-spacing: 0.012em;
      line-height: 1.714285714285;
    }
  }
}
