/* Border-only validation highlight shared by every application form. */
:root .crm-workspace input.input-validation-error.input-validation-error,
:root .crm-workspace select.input-validation-error.input-validation-error,
:root .crm-workspace textarea.input-validation-error.input-validation-error,
:root .login-page input.input-validation-error.input-validation-error,
:root .login-page select.input-validation-error.input-validation-error,
:root .login-page textarea.input-validation-error.input-validation-error,
:root .crm-workspace input.popup-validation-error.popup-validation-error,
:root .crm-workspace select.popup-validation-error.popup-validation-error,
:root .crm-workspace textarea.popup-validation-error.popup-validation-error,
:root .crm-workspace input[aria-invalid="true"][aria-invalid="true"],
:root .crm-workspace select[aria-invalid="true"][aria-invalid="true"],
:root .crm-workspace textarea[aria-invalid="true"][aria-invalid="true"],
:root .login-page input[aria-invalid="true"][aria-invalid="true"],
:root .login-page select[aria-invalid="true"][aria-invalid="true"],
:root .login-page textarea[aria-invalid="true"][aria-invalid="true"],
input.input-validation-error,
select.input-validation-error,
textarea.input-validation-error,
input[aria-invalid="true"],
select[aria-invalid="true"],
textarea[aria-invalid="true"],
.input-group:has(.input-validation-error),
.input-group:has([aria-invalid="true"]),
.money-input:has(.input-validation-error),
.money-input:has([aria-invalid="true"]),
.contact-page-phone:has(.input-validation-error),
.address-phone-group:has(.input-validation-error) {
    border-color: #dc2626 !important;
}

:root .crm-workspace .validation-border-error.validation-border-error,
:root .login-page .validation-border-error.validation-border-error,
.validation-border-error {
    border-color: #dc2626 !important;
}

.popup-validation-error,
.inventory-field:has(.field-validation-error) > input,
.inventory-field:has(.field-validation-error) > select,
.inventory-field:has(.field-validation-error) > textarea,
.inventory-field:has(.field-validation-error) > .money-input,
.inventory-field:has(.field-validation-error) > .contact-page-phone,
.inventory-field:has(.field-validation-error) > .address-phone-group,
.form-group:has(.field-validation-error) > .input-group,
.form-group:has(label.error) > .input-group {
    border-color: #dc2626 !important;
}

select.input-validation-error + .select2-container .select2-selection,
select[aria-invalid="true"] + .select2-container .select2-selection {
    border-color: #dc2626 !important;
}

:root .crm-workspace select.input-validation-error.input-validation-error + .select2-container .select2-selection,
:root .login-page select.input-validation-error.input-validation-error + .select2-container .select2-selection,
:root .crm-workspace .inventory-field:has(.field-validation-error) .select2-selection,
:root .login-page .form-group:has(.field-validation-error) .select2-selection {
    border-color: #dc2626 !important;
}

:root .crm-workspace .money-input:has(input.input-validation-error),
:root .crm-workspace .contact-page-phone:has(input.input-validation-error),
:root .crm-workspace .address-phone-group:has(input.input-validation-error),
:root .login-page .input-group:has(.input-validation-error),
:root .login-page .form-group:has(.field-validation-error) .input-group,
:root .login-page .module-selection:has(.field-validation-error) {
    border-color: #dc2626 !important;
}

.inventory-field:has(.field-validation-error) .select2-selection,
select.popup-validation-error + .select2-container .select2-selection {
    border-color: #dc2626 !important;
}

/* Compound phone controls use their wrapper as the only visible border. */
.crm-workspace .inventory-field .contact-page-phone > input.input-validation-error,
.crm-workspace .inventory-field:has(.field-validation-error) .contact-page-phone > input,
.crm-workspace .inventory-field .contact-page-phone.validation-border-error > input,
.crm-workspace .party-modal .inventory-field .address-phone-group > input.popup-validation-error,
.crm-workspace .party-modal .inventory-field .address-phone-group.validation-border-error > input {
    border: 0 !important;
    outline: 0 !important;
    box-shadow: none !important;
}

/* Match the established popup validation surface throughout the application. */
:root .crm-workspace input.input-validation-error.input-validation-error,
:root .crm-workspace select.input-validation-error.input-validation-error,
:root .crm-workspace textarea.input-validation-error.input-validation-error,
:root .crm-workspace input.popup-validation-error.popup-validation-error,
:root .crm-workspace select.popup-validation-error.popup-validation-error,
:root .crm-workspace textarea.popup-validation-error.popup-validation-error,
:root .crm-workspace input[aria-invalid="true"][aria-invalid="true"],
:root .crm-workspace select[aria-invalid="true"][aria-invalid="true"],
:root .crm-workspace textarea[aria-invalid="true"][aria-invalid="true"],
:root .login-page input.input-validation-error.input-validation-error,
:root .login-page select.input-validation-error.input-validation-error,
:root .login-page textarea.input-validation-error.input-validation-error,
:root .login-page input[aria-invalid="true"][aria-invalid="true"],
:root .login-page select[aria-invalid="true"][aria-invalid="true"],
:root .login-page textarea[aria-invalid="true"][aria-invalid="true"],
:root .crm-workspace .validation-border-error.validation-border-error,
:root .login-page .validation-border-error.validation-border-error,
:root .crm-workspace .inventory-field:has(.field-validation-error) > input,
:root .crm-workspace .inventory-field:has(.field-validation-error) > select,
:root .crm-workspace .inventory-field:has(.field-validation-error) > textarea,
:root .crm-workspace .inventory-field:has(.field-validation-error) > .money-input,
:root .crm-workspace .inventory-field:has(.field-validation-error) > .contact-page-phone,
:root .crm-workspace .inventory-field:has(.field-validation-error) > .address-phone-group,
:root .login-page .form-group:has(.field-validation-error) .input-group,
:root .login-page .module-selection:has(.field-validation-error) {
    background-color: #fff7f7 !important;
}

:root .crm-workspace select.input-validation-error.input-validation-error + .select2-container .select2-selection,
:root .crm-workspace select.popup-validation-error.popup-validation-error + .select2-container .select2-selection,
:root .login-page select.input-validation-error.input-validation-error + .select2-container .select2-selection,
:root .crm-workspace .inventory-field:has(.field-validation-error) .select2-selection,
:root .login-page .form-group:has(.field-validation-error) .select2-selection,
:root .crm-workspace .inventory-field .contact-page-phone > input.input-validation-error,
:root .crm-workspace .inventory-field:has(.field-validation-error) .contact-page-phone > input,
:root .crm-workspace .inventory-field .contact-page-phone.validation-border-error > input,
:root .crm-workspace .party-modal .inventory-field .address-phone-group > input.popup-validation-error,
:root .crm-workspace .party-modal .inventory-field .address-phone-group.validation-border-error > input {
    border: 0 !important;
    outline: 0 !important;
    background-color: transparent !important;
    box-shadow: none !important;
}

/* Preserve rounded corners when dropdown validation changes the border colour. */
:root select.input-validation-error,
:root select.popup-validation-error,
:root select[aria-invalid="true"] {
    box-sizing: border-box !important;
    border-radius: 11px !important;
    background-clip: padding-box !important;
}

:root .select2-container .select2-selection.input-validation-error,
:root select.input-validation-error + .select2-container .select2-selection,
:root select.popup-validation-error + .select2-container .select2-selection,
:root select[aria-invalid="true"] + .select2-container .select2-selection,
:root .inventory-field:has(.field-validation-error) .select2-selection,
:root .form-group:has(.field-validation-error) .select2-selection {
    box-sizing: border-box !important;
    overflow: hidden !important;
    border-radius: 11px !important;
    background-clip: padding-box !important;
}

:root .login-page .input-group.validation-border-error,
:root .login-page .input-group:has(select.input-validation-error),
:root .login-page .form-group:has(.field-validation-error) .input-group {
    box-sizing: border-box !important;
    overflow: hidden !important;
    border-radius: 14px !important;
    background-clip: padding-box !important;
    box-shadow: none !important;
}

:root .login-page .input-group select.input-validation-error,
:root .login-page .input-group select[aria-invalid="true"],
:root .login-page .input-group .select2-selection {
    border-radius: 12px !important;
}

/* Grouped authentication selects use the wrapper as their single visible border. */
:root .login-page .input-group.validation-border-error .select2-selection,
:root .login-page .input-group:has(select.input-validation-error) .select2-selection,
:root .login-page .input-group:has(select[aria-invalid="true"]) .select2-selection,
:root .login-page .form-group:has(.field-validation-error) .input-group .select2-selection {
    border-color: transparent !important;
    box-shadow: none !important;
}

:root .login-page .input-group:has(select.input-validation-error) > select,
:root .login-page .input-group:has(select[aria-invalid="true"]) > select,
:root .login-page .form-group:has(.field-validation-error) .input-group > select {
    border: 0 !important;
    border-radius: 0 !important;
    box-shadow: none !important;
}

/* Internal control icons follow the validation colour across every form. */
:root .input-group:has(.input-validation-error) i,
:root .input-group:has([aria-invalid="true"]) i,
:root .input-group.validation-border-error i,
:root .form-group:has(.field-validation-error) .input-group i,
:root .inventory-field:has(.field-validation-error) i,
:root .money-input:has(.input-validation-error) > span,
:root .money-input.validation-border-error > span,
:root .contact-page-phone:has(.input-validation-error) .address-country-prefix,
:root .contact-page-phone.validation-border-error .address-country-prefix,
:root .address-phone-group:has(.input-validation-error) .address-country-prefix,
:root .address-phone-group:has(.popup-validation-error) .address-country-prefix,
:root .address-phone-group.validation-border-error .address-country-prefix {
    color: #dc2626 !important;
}

:root .input-group:has(.input-validation-error) svg,
:root .input-group:has([aria-invalid="true"]) svg,
:root .input-group.validation-border-error svg,
:root .form-group:has(.field-validation-error) .input-group svg {
    fill: #dc2626 !important;
    stroke: #dc2626 !important;
}

:root select.input-validation-error + .select2-container .select2-selection__arrow b,
:root select.popup-validation-error + .select2-container .select2-selection__arrow b,
:root select[aria-invalid="true"] + .select2-container .select2-selection__arrow b,
:root .inventory-field:has(.field-validation-error) .select2-selection__arrow b,
:root .form-group:has(.field-validation-error) .select2-selection__arrow b {
    border-top-color: #dc2626 !important;
    border-bottom-color: #dc2626 !important;
}

/* The Select2 replacement is the visible workspace control. Keep its complete
   validation outline even though the original select is hidden by Select2. */
:root .crm-workspace select.input-validation-error + .select2-container--default .select2-selection--single,
:root .crm-workspace select.popup-validation-error + .select2-container--default .select2-selection--single,
:root .crm-workspace select[aria-invalid="true"] + .select2-container--default .select2-selection--single,
:root .crm-workspace .select2-container--default.input-validation-error .select2-selection--single,
:root .crm-workspace .inventory-field:has(> select.input-validation-error) > .select2-container--default .select2-selection--single,
:root .crm-workspace .inventory-field:has(> select[aria-invalid="true"]) > .select2-container--default .select2-selection--single,
:root .crm-workspace .inventory-field:has(> .field-validation-error) > .select2-container--default .select2-selection--single {
    box-sizing: border-box !important;
    border: var(--crm-control-border-width, 1.5px) solid #dc2626 !important;
    border-radius: var(--crm-control-radius, 12px) !important;
    background-color: #fff7f7 !important;
    background-clip: padding-box !important;
    box-shadow: none !important;
}

/* Same restoration, for multi-selects (Roles/Members/Teams, ...): a `.select2-selection` rule
   further up this file (the "compound wrapper controls draw their own border" block) sets
   `border: 0 !important` on ANY `.select2-selection` - both --single and --multiple share that base
   class - inside an invalid .inventory-field. The --single case gets its border put back by the
   block just above; --multiple never did, so an empty required multi-select would end up with no
   border at all instead of the same red outline once you removed every chip. */
:root .crm-workspace select.input-validation-error + .select2-container--default .select2-selection--multiple,
:root .crm-workspace select.popup-validation-error + .select2-container--default .select2-selection--multiple,
:root .crm-workspace select[aria-invalid="true"] + .select2-container--default .select2-selection--multiple,
:root .crm-workspace .select2-container--default.input-validation-error .select2-selection--multiple,
:root .crm-workspace .inventory-field:has(> select.input-validation-error) > .select2-container--default .select2-selection--multiple,
:root .crm-workspace .inventory-field:has(> select[aria-invalid="true"]) > .select2-container--default .select2-selection--multiple,
:root .crm-workspace .inventory-field:has(> .field-validation-error) > .select2-container--default .select2-selection--multiple {
    box-sizing: border-box !important;
    border: var(--crm-control-border-width, 1.5px) solid #dc2626 !important;
    border-radius: var(--crm-control-radius, 12px) !important;
    background-color: #fff7f7 !important;
    background-clip: padding-box !important;
    box-shadow: none !important;
}

/* Popup selects are validated by JavaScript and their Select2 container may
   not remain the select's immediate sibling after modal re-initialisation. */
:root .crm-workspace .party-modal .inventory-field:has(select.popup-validation-error) .select2-container--default .select2-selection--single,
:root .crm-workspace .party-modal .inventory-field:has(select[aria-invalid="true"]) .select2-container--default .select2-selection--single,
:root .crm-workspace .party-modal .select2-container--default:has(+ select.popup-validation-error) .select2-selection--single {
    box-sizing: border-box !important;
    border: var(--crm-control-border-width, 1.5px) solid #dc2626 !important;
    border-radius: var(--crm-control-radius, 12px) !important;
    background-color: #fff7f7 !important;
    background-clip: padding-box !important;
    box-shadow: 0 0 0 3px rgba(220, 38, 38, .12) !important;
}

/* Popup phone inputs are compound controls: validate the single visible
   wrapper instead of drawing a second border around the inner input. */
:root .crm-workspace .party-modal .address-phone-group:has(> input.popup-validation-error),
:root .crm-workspace .party-modal .address-phone-group:has(> input[aria-invalid="true"]),
:root .crm-workspace .party-modal .contact-page-phone:has(> input.popup-validation-error),
:root .crm-workspace .party-modal .contact-page-phone:has(> input[aria-invalid="true"]) {
    box-sizing: border-box !important;
    border: var(--crm-control-border-width, 1.5px) solid #dc2626 !important;
    border-radius: var(--crm-control-radius, 12px) !important;
    background-color: #fff7f7 !important;
    background-clip: padding-box !important;
    box-shadow: 0 0 0 3px rgba(220, 38, 38, .12) !important;
}

:root .crm-workspace .party-modal .address-phone-group:has(> input.popup-validation-error) > input,
:root .crm-workspace .party-modal .address-phone-group:has(> input[aria-invalid="true"]) > input,
:root .crm-workspace .party-modal .contact-page-phone:has(> input.popup-validation-error) > input,
:root .crm-workspace .party-modal .contact-page-phone:has(> input[aria-invalid="true"]) > input {
    border: 0 !important;
    outline: 0 !important;
    background-color: transparent !important;
    box-shadow: none !important;
}

:root .crm-workspace .party-modal .address-phone-group:has(> input.popup-validation-error) .address-country-prefix i,
:root .crm-workspace .party-modal .address-phone-group:has(> input[aria-invalid="true"]) .address-country-prefix i,
:root .crm-workspace .party-modal .contact-page-phone:has(> input.popup-validation-error) .address-country-prefix i,
:root .crm-workspace .party-modal .contact-page-phone:has(> input[aria-invalid="true"]) .address-country-prefix i {
    color: #dc2626 !important;
}

:root .crm-workspace .party-modal .address-phone-group:has(> input.popup-validation-error) .address-country-prefix svg,
:root .crm-workspace .party-modal .address-phone-group:has(> input[aria-invalid="true"]) .address-country-prefix svg,
:root .crm-workspace .party-modal .contact-page-phone:has(> input.popup-validation-error) .address-country-prefix svg,
:root .crm-workspace .party-modal .contact-page-phone:has(> input[aria-invalid="true"]) .address-country-prefix svg {
    color: #dc2626 !important;
    fill: #dc2626 !important;
}

/* Shared quick-create dialogs (Brand, Product, and future popup forms). */
:root .crm-workspace .quick-entity-dialog input.popup-validation-error,
:root .crm-workspace .quick-entity-dialog select.popup-validation-error,
:root .crm-workspace .quick-entity-dialog textarea.popup-validation-error,
:root .crm-workspace .quick-entity-dialog input[aria-invalid="true"],
:root .crm-workspace .quick-entity-dialog select[aria-invalid="true"],
:root .crm-workspace .quick-entity-dialog textarea[aria-invalid="true"],
:root .crm-workspace .quick-entity-dialog .select2-selection.popup-validation-error {
    box-sizing: border-box !important;
    border: var(--crm-control-border-width, 1.5px) solid #dc2626 !important;
    border-radius: var(--crm-control-radius, 12px) !important;
    background-color: #fff7f7 !important;
    background-clip: padding-box !important;
    box-shadow: 0 0 0 3px rgba(220, 38, 38, .12) !important;
}

:root .crm-workspace .quick-entity-dialog select.popup-validation-error + .select2-container--default .select2-selection--single,
:root .crm-workspace .quick-entity-dialog select[aria-invalid="true"] + .select2-container--default .select2-selection--single,
:root .crm-workspace .quick-entity-dialog label:has(> select.popup-validation-error) .select2-selection--single,
:root .crm-workspace .quick-entity-dialog label:has(> span > select.popup-validation-error) .select2-selection--single {
    box-sizing: border-box !important;
    border: var(--crm-control-border-width, 1.5px) solid #dc2626 !important;
    border-radius: var(--crm-control-radius, 12px) !important;
    background-color: #fff7f7 !important;
    background-clip: padding-box !important;
    box-shadow: 0 0 0 3px rgba(220, 38, 38, .12) !important;
}

:root .crm-workspace .quick-entity-dialog select.popup-validation-error + .select2-container .select2-selection__arrow b,
:root .crm-workspace .quick-entity-dialog select[aria-invalid="true"] + .select2-container .select2-selection__arrow b,
:root .crm-workspace .quick-entity-dialog label:has(select.popup-validation-error) .select2-selection__arrow b {
    border-top-color: #dc2626 !important;
    border-bottom-color: #dc2626 !important;
}

/* Validation is communicated by the highlighted control and the form-level
   message box/summary. Do not render repetitive messages below each field. */
:root .field-validation-error,
:root .field-validation-valid,
:root [data-valmsg-for],
:root .quick-entity-error {
    display: none !important;
    min-height: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
}
