```python
def match_setting(rules: dict, name: str) -> str | None:
    """
    Match a dotted option name against style rules to find the winning value.

    :param rules: A dictionary mapping selector strings to string values.
    :param name: The dotted option name to resolve.
    :return: The winning value or None if no selector covers the name.
    """
    if not isinstance(name, str) or not name:
        raise ValueError("Name must be a non-empty string.")
    
    if "*" in name and (name != "*" or not name.endswith(".*")):
        raise ValueError("Selector star must stand alone or end with '.*'.")
    
    def match(selector: str) -> str | None:
        if selector == "*":
            return rules.get("*", None)
        
        prefix, suffix = selector.rsplit(".", 1)
        if suffix != ".*":
            raise ValueError(f"Invalid selector format: {selector}")
        
        for key in sorted(rules.keys()):
            if key.startswith(prefix):
                return rules[key]
        
        return None
    
    return match(name)
```