// +spec:overflow:647a7b - overflow property (visible/hidden/clip/scroll/auto), overflow-clip-margin, text-overflow defined in CSS Overflow 3
// +spec:overflow:2bf182 - overflow:scroll always shows scrollbar whether or not content is clipped
// +spec:overflow:8fcdd8 - auto causes scrolling mechanism for overflowing boxes (table exception is UA-level)
// +spec:overflow:81e306 - clipping region clips all aspects outside it; clipped content does not cause overflow
// +spec:overflow:fd38ce - overflow properties specify whether a box's content is clipped / scroll container
// +spec:overflow:3be57c - overflow:hidden disables user scrolling but programmatic scrolling still works
let other_is_scrollable = !matches!(other_axis, LayoutOverflow::Visible | LayoutOverflow::Clip);
"Invalid overflow value: \"{}\". Expected 'scroll', 'auto', 'hidden', 'visible', or 'clip'.", val
"auto" | "overlay" => Ok(LayoutOverflow::Auto), // +spec:overflow:6120e6 - "overlay" is a legacy value alias of "auto"
// +spec:box-model:e98b7c - scrollbar gutter: space between inner border edge and outer padding edge
"Invalid scrollbar-gutter value: \"{}\". Expected 'auto', 'stable', or 'stable both-edges'.", val
/// Right edge offset in pixels. `None` means `auto` (= used width + horiz padding + horiz border).
/// Bottom edge offset in pixels. `None` means `auto` (= used height + vert padding + vert border).
pub fn parse_clip_rect<'a>(input: &'a str) -> Result<StyleClipRect, StyleClipRectParseError<'a>> {