bevy_extended_ui 1.4.0-beta.2

Create simply ui's with css and html for bevy.
Documentation
use bevy::prelude::*;
use regex::Regex;

use crate::widgets::{
    Button, CheckBox, InputValue, RadioButton, SwitchButton, ToggleButton, UIWidgetState,
    ValidationRules,
};

/// Updates widget validation state based on configured rules and input values.
pub fn update_validation_states(
    mut query: Query<(
        &ValidationRules,
        &mut UIWidgetState,
        Option<&InputValue>,
        Option<&Button>,
        Option<&CheckBox>,
        Option<&RadioButton>,
        Option<&ToggleButton>,
        Option<&SwitchButton>,
    )>,
) {
    for (rules, mut state, input_value, button, checkbox, radio, toggle, switch) in query.iter_mut()
    {
        let mut invalid = false;

        if rules.required {
            let satisfied = if let Some(value) = input_value {
                !value.0.trim().is_empty()
            } else if button.is_some()
                || checkbox.is_some()
                || radio.is_some()
                || toggle.is_some()
                || switch.is_some()
            {
                state.checked
            } else {
                true
            };

            if !satisfied {
                invalid = true;
            }
        }

        if let Some(value) = input_value {
            let len = value.0.chars().count();

            if let Some(min) = rules.min_length {
                if len < min {
                    invalid = true;
                }
            }

            if let Some(max) = rules.max_length {
                if len > max {
                    invalid = true;
                }
            }

            if let Some(pattern) = &rules.pattern {
                if !value.0.is_empty() {
                    if let Ok(regex) = Regex::new(pattern) {
                        if !regex.is_match(&value.0) {
                            invalid = true;
                        }
                    } else {
                        invalid = true;
                    }
                }
            }
        }

        if state.invalid != invalid {
            state.invalid = invalid;
        }
    }
}