getValidMediaRules method
Implementation
List<CSSRule>? getValidMediaRules(double? windowWidth, double? windowHeight, bool isDarkMode) {
List<CSSRule>? _mediaRules = [];
if (rules == null) {
return _mediaRules;
}
if (cssMediaQuery == null) {
return rules;
}
// bool isMediaTypeNotOp = cssMediaQuery._mediaUnary == TokenKind.MEDIA_OP_ONLY;
//w3c has media type screen/print/speech/all, but webf only work on screen and all
String? mediaType = cssMediaQuery!._mediaType?.name;
if (mediaType != null && mediaType != MediaType.SCREEN && mediaType != MediaType.ALL) {
return _mediaRules;
}
List<bool> conditions = [];
List<bool> ops = [];
for (CSSMediaExpression expression in cssMediaQuery!.expressions) {
// [max-width: 1800px, min-width: 450px]
if (expression.mediaStyle != null) {
dynamic maxAspectRatio = expression.mediaStyle!['max-aspect-ratio'];
if (maxAspectRatio != null && windowWidth != null && windowHeight != null) {
double? maxAPS;
if (maxAspectRatio is String) {
maxAPS = parseStringToDouble(maxAspectRatio);
} else if (maxAspectRatio is double) {
maxAPS = maxAspectRatio;
}
if (maxAPS != null) {
bool condition = windowWidth / windowHeight <= maxAPS;
conditions.add(condition);
ops.add(expression.op == MediaOperator.AND);
}
}
dynamic minAspectRatio = expression.mediaStyle!['min-aspect-ratio'];
if (minAspectRatio != null && windowWidth != null && windowHeight != null) {
double? minAPS;
if (minAspectRatio is String) {
minAPS = parseStringToDouble(minAspectRatio);
} else if (minAspectRatio is double) {
minAPS = minAspectRatio;
}
if (minAPS != null) {
bool condition = windowWidth / windowHeight >= minAPS;
conditions.add(condition);
ops.add(expression.op == MediaOperator.AND);
}
}
dynamic maxWidth = expression.mediaStyle!['max-width'];
if (windowWidth != null && maxWidth != null) {
double maxWidthValue = CSSLength.parseLength(maxWidth, null).value ?? -1;
bool condition = windowWidth < maxWidthValue;
conditions.add(condition);
ops.add(expression.op == MediaOperator.AND);
}
dynamic minWidth = expression.mediaStyle!['min-width'];
if (windowWidth != null && minWidth != null) {
double minWidthValue = CSSLength.parseLength(minWidth, null).value ?? -1;
bool condition = windowWidth > minWidthValue;
conditions.add(condition);
ops.add(expression.op == MediaOperator.AND);
}
dynamic prefersColorScheme = expression.mediaStyle!['prefers-color-scheme'];
if (prefersColorScheme != null) {
bool isMediaDarkMode = prefersColorScheme == 'dark';
bool condition = isMediaDarkMode == isDarkMode;
conditions.add(condition);
ops.add(expression.op == MediaOperator.AND);
}
}
}
bool isValid = true;
for (int i = 0; i < conditions.length; i ++) {
bool con = conditions[i];
bool isAnd = ops[i];
if (isAnd) {
isValid = isValid && con;
} else {
isValid = isValid || con;
}
}
if (isValid) {
_mediaRules = rules;
}
return _mediaRules;
}