///|
/// Declaration/string keys for multi-stop gradient brushes. Kept out of
/// `rich_text_editor_helpers.mbt` so the helper file stays under its line
/// budget; both functions are package-private like their siblings.
fn rich_text_stops_gradient_declaration_key(
spec : @core.StopsGradientSpec,
) -> @core.DeclarationKey {
rich_text_record_key("Brush.StopsGradient", [
("axis", rich_text_gradient_axis_key(spec.axis)),
(
"stops",
@core.DeclarationKey::array(
spec.stops.map(stop => {
rich_text_record_key("GradientStop", [
("at", @core.DeclarationKey::double(stop.at)),
("color", declaration_color_key(stop.color)),
])
}),
),
),
("oklab", @core.DeclarationKey::bool(spec.oklab)),
])
}
///|
fn rich_text_gradient_axis_key(
axis : @core.GradientAxis,
) -> @core.DeclarationKey {
match axis {
@core.LinearAxis(start, end) =>
rich_text_record_key("GradientAxis.Linear", [
("start", declaration_point_key(start)),
("end", declaration_point_key(end)),
])
@core.RadialAxis(center, radius) =>
rich_text_record_key("GradientAxis.Radial", [
("center", declaration_point_key(center)),
("radius", @core.DeclarationKey::double(radius)),
])
@core.ConicAxis(center, angle) =>
rich_text_record_key("GradientAxis.Conic", [
("center", declaration_point_key(center)),
("angle", @core.DeclarationKey::double(angle)),
])
}
}
///|
fn rich_text_stops_gradient_key(spec : @core.StopsGradientSpec) -> String {
let stops = spec.stops
.map(stop => "\{stop.at}:\{rich_text_color_key(stop.color)}")
.join(";")
let axis = match spec.axis {
@core.LinearAxis(start, end) => "l:\{start.x},\{start.y},\{end.x},\{end.y}"
@core.RadialAxis(center, radius) => "r:\{center.x},\{center.y},\{radius}"
@core.ConicAxis(center, angle) => "c:\{center.x},\{center.y},\{angle}"
}
"stops:\{axis}:\{spec.oklab}:\{stops}"
}