parseRgb function
Parses an rgb() / rgba() colour.
Accepts comma- or space-separated channels, an optional / alpha, and
percentage channels. Returns null for anything else.
Implementation
AstryxRgba? parseRgb(String value) {
final open = value.indexOf('(');
if (open == -1 || !value.trim().endsWith(')')) return null;
final body = value
.substring(open + 1, value.lastIndexOf(')'))
.replaceAll('/', ' ');
final parts = body
.split(_channelSeparator)
.map((p) => p.trim())
.where((p) => p.isNotEmpty)
.toList();
if (parts.length < 3) return null;
double channel(String p) {
final n = p.endsWith('%')
? (parseFloatLoose(p) / 100) * 255
: parseFloatLoose(p);
return clampDouble(n, 0, 255);
}
final r = channel(parts[0]);
final g = channel(parts[1]);
final b = channel(parts[2]);
if (r.isNaN || g.isNaN || b.isNaN) return null;
var a = 1.0;
if (parts.length >= 4) {
final raw = parts[3];
a = raw.endsWith('%') ? parseFloatLoose(raw) / 100 : parseFloatLoose(raw);
if (a.isNaN) return null;
a = clampDouble(a, 0, 1);
}
return AstryxRgba(r: r, g: g, b: b, a: a);
}