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); }
}

.field {
    display: grid;

    .help-text {
        font-size: 0.75rem;
        color: var(--text-muted, #6c757d);
        margin-top: 0.25rem;
        min-height: 1lh;
    }

    .error-list {
        list-style: none;
        margin: 0.25rem 0 0 0;
        padding: 0 0 0 0.75rem;
        font-size: 0.75rem;
        color: var(--red-alert);
    }

    &::after {
        grid-row: 2;
        grid-column: 1;
        justify-self: end;
        align-self: center;
        margin-inline-end: 0.75rem;
    }

    &:has(input[type="date"], input[type="datetime-local"], input[type="time"], input[type="number"]) { &::after { margin-inline-end: 2.25rem; } }

    &: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) {
        > label { color: var(--success-green); }
        &::after { content: "✓"; color: var(--success-green); }
    }

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

    &:has(.error-list) {
        > label { color: var(--red-alert); }
        :is(input, textarea, select) { border-color: var(--red-alert); outline: 2px solid var(--red-alert); }
        &::after { content: "✗"; color: var(--red-alert); }
    }

    &.label--floating {
        > input, > select, > textarea { grid-area: 1 / 1; }
        &::after { grid-row: 1; }
        .error-list, .help-text { grid-row: 2; }

        > label {
            grid-area: 1 / 1;
            align-self: center;
            justify-self: start;
            position: relative;
            top: 0;
            margin-inline-start: 0.75rem;
            z-index: 1;
            transition: top 0.2s ease, font-size 0.2s ease, color 0.2s ease;
            pointer-events: none;
            color: var(--gray);
            padding: 0 0.25rem;
            border-radius: 10px;
        }

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

        &[data-prefix] {
            input { padding-inline-start: 2.5rem; }

            &::before {
                content: attr(data-prefix);
                grid-area: 1 / 1;
                align-self: center;
                justify-self: start;
                margin-inline-start: 0.75rem;
                color: var(--gray);
                pointer-events: none;
                opacity: 0;
                transition: opacity 0.2s ease;
            }

            &:has(input:is(:focus, :not(:placeholder-shown)))::before { opacity: 1; }
        }
    }
}

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;
}

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

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