input:not([type="radio"], [type="checkbox"]),
select,
textarea {
    width: 100%;
    border: 1px solid var(--border-color, grey);
    border-radius: 4px;
    padding: 0.75rem;
    font-size: 1rem;
    font-family: inherit;
    background-color: white;
    color: black;
    transition: border-color 0.2s ease, box-shadow 0.2s ease;

    &:focus:not(:focus-visible) {
        outline: none;
        border-color: #0066cc;
        box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.1);
    }

    &:disabled {
        background-color: ghostwhite;
        color: lightgray;
        cursor: not-allowed;
    }

    &:hover:not(:disabled) { cursor: pointer; }
    &:focus-visible {
        outline: 2px solid var(--color-4);
        border-color: var(--color-4);
    }
    &:user-valid:required { outline: 2px solid var(--success-green); }
    &:user-invalid:required { outline: 2px solid var(--red-alert); }
}

label:has(input:not([type="checkbox"], [type="radio"], [type="hidden"])),
label:has(textarea),
label:has(select) {
    position: relative;
    display: block;

    &.label--floating {
        > span {
            position: absolute;
            left: 0.75rem;
            top: 50%;
            transform: translateY(-50%);
            transition: top 0.2s ease, transform 0.2s ease, font-size 0.2s ease, color 0.2s ease;
            pointer-events: none;
            color: var(--gray);
            padding: 0 0.25rem;
        }

        &:has(:is(input, textarea):focus) > span:first-child,
        &:has(:is(input, textarea):not(:placeholder-shown)) > span:first-child,
        &:has(:is(input, textarea):autofill) > span:first-child,
        &:has(:is(input, textarea):-webkit-autofill) > span:first-child,
        &:has(select:focus) > span:first-child,
        &:has(select option[value]:not([value=""]):checked) > span:first-child {
            top: 0;
            font-size: 0.75rem;
            background: white;
        }

        &::after {
            position: absolute;
            inset: 0 0.75rem 0 auto;
            display: grid;
            place-content: center;
        }
    }

    &:not(.label--floating) {
        > span {
            display: block;
            margin-bottom: 0.25rem;
            color: var(--gray);
        }

        &::after {
            position: absolute;
            inset: auto 0.75rem 0 auto;
            height: 3rem;
            display: grid;
            place-content: center;
        }
    }

    &:has(:is(input, textarea):required:not(:user-valid):not(:user-invalid))::after {
        content: "✱";
        color: var(--color-4);
        font-size: 0.75rem;
    }

    &:has(:is(input, textarea):user-valid:required)::after {
        content: "✓";
        color: var(--success-green);
    }

    &:has(:is(input, textarea):user-invalid:required)::after {
        content: "✗";
        color: var(--red-alert);
    }

    &:has(:is(input, textarea):user-valid:required) > span {
        color: var(--success-green);
    }

    &:has(:is(input, textarea):user-invalid:required) > span {
        color: var(--red-alert);
    }
}

input.input--compact {
    block-size: 2rem;
    font-size: 0.75rem;
    padding: 0.3125rem 0.5rem;
    line-height: 1.2;
}

select.input--compact {
    block-size: 2rem;
    padding-block: 0.25rem;
}

input.input--compact-date {
    block-size: 1.5rem;
    font-size: 0.75rem;
    padding: 0.25rem 0.5rem;
}

div:has(> input[type="checkbox"]) {
    display: flex;
    align-items: center;
    gap: 0.75rem;

    input[type="checkbox"] {
        order: -1;
        width: 1.25rem;
        height: 1.25rem;
    }

    label { margin-bottom: 0; }
}

.form-help, .help-text {
    font-size: 0.875rem;
    color: var(--text-muted, #6c757d);
    margin-top: 0.25rem;
}

label:has(input, textarea, select) + ul {
    list-style: none;
    margin: 0.25rem 0 0 0;
    padding: 0 0 0 0.75rem;
    font-size: 0.75rem;
    color: var(--red-alert);
}

label:has(input:not([type="checkbox"], [type="radio"], [type="hidden"])):has(+ ul),
label:has(textarea):has(+ ul),
label:has(select):has(+ ul) {
    > span { color: var(--red-alert); }

    input, textarea, select {
        border-color: var(--red-alert);
        outline: 2px solid var(--red-alert);
    }

    &::after {
        content: "✗";
        color: var(--red-alert);
    }
}
