@@ -265,24 +265,48 @@ impl PropertyHandler for BorderHandler {
265265 BorderRightColor(val) => property!(border_right, color, val, Physical),
266266 BorderBlockStartColor(val) => property!(border_block_start, color, val, Logical),
267267 BorderBlockEndColor(val) => property!(border_block_end, color, val, Logical),
268+ BorderBlockColor(val) => {
269+ property!(border_block_start, color, val, Logical);
270+ property!(border_block_end, color, val, Logical);
271+ }
268272 BorderInlineStartColor(val) => property!(border_inline_start, color, val, Logical),
269273 BorderInlineEndColor(val) => property!(border_inline_end, color, val, Logical),
274+ BorderInlineColor(val) => {
275+ property!(border_inline_start, color, val, Logical);
276+ property!(border_inline_end, color, val, Logical);
277+ }
270278 BorderTopWidth(val) => property!(border_top, width, val, Physical),
271279 BorderBottomWidth(val) => property!(border_bottom, width, val, Physical),
272280 BorderLeftWidth(val) => property!(border_left, width, val, Physical),
273281 BorderRightWidth(val) => property!(border_right, width, val, Physical),
274282 BorderBlockStartWidth(val) => property!(border_block_start, width, val, Logical),
275283 BorderBlockEndWidth(val) => property!(border_block_end, width, val, Logical),
284+ BorderBlockWidth(val) => {
285+ property!(border_block_start, width, val, Logical);
286+ property!(border_block_end, width, val, Logical);
287+ }
276288 BorderInlineStartWidth(val) => property!(border_inline_start, width, val, Logical),
277289 BorderInlineEndWidth(val) => property!(border_inline_end, width, val, Logical),
290+ BorderInlineWidth(val) => {
291+ property!(border_inline_start, width, val, Logical);
292+ property!(border_inline_end, width, val, Logical);
293+ }
278294 BorderTopStyle(val) => property!(border_top, style, val, Physical),
279295 BorderBottomStyle(val) => property!(border_bottom, style, val, Physical),
280296 BorderLeftStyle(val) => property!(border_left, style, val, Physical),
281297 BorderRightStyle(val) => property!(border_right, style, val, Physical),
282298 BorderBlockStartStyle(val) => property!(border_block_start, style, val, Logical),
283299 BorderBlockEndStyle(val) => property!(border_block_end, style, val, Logical),
300+ BorderBlockStyle(val) => {
301+ property!(border_block_start, style, val, Logical);
302+ property!(border_block_end, style, val, Logical);
303+ }
284304 BorderInlineStartStyle(val) => property!(border_inline_start, style, val, Logical),
285305 BorderInlineEndStyle(val) => property!(border_inline_end, style, val, Logical),
306+ BorderInlineStyle(val) => {
307+ property!(border_inline_start, style, val, Logical);
308+ property!(border_inline_end, style, val, Logical);
309+ }
286310 BorderTop(val) => set_border!(border_top, val, Physical),
287311 BorderBottom(val) => set_border!(border_bottom, val, Physical),
288312 BorderLeft(val) => set_border!(border_left, val, Physical),
@@ -451,37 +475,49 @@ impl BorderHandler {
451475 ($prop: expr, $key: ident) => {{
452476 let has_prop = $block_start.$key.is_some() && $block_end.$key.is_some() && $inline_start.$key.is_some() && $inline_end.$key.is_some();
453477 if has_prop {
454- dest.push($prop(Rect::new($block_start.$key.clone().unwrap(), $block_end.$key.clone().unwrap(), $inline_start.$key.clone().unwrap(), $inline_end.$key.clone().unwrap())));
478+ if !$is_logical || ($block_start.$key == $block_end.$key && $block_end.$key == $inline_start.$key && $inline_start.$key == $inline_end.$key) {
479+ let rect = Rect::new(
480+ std::mem::take(&mut $block_start.$key).unwrap(),
481+ std::mem::take(&mut $inline_end.$key).unwrap(),
482+ std::mem::take(&mut $block_end.$key).unwrap(),
483+ std::mem::take(&mut $inline_start.$key).unwrap()
484+ );
485+ dest.push($prop(rect));
486+ }
487+ }
488+ }};
489+ }
490+
491+ macro_rules! logical_shorthand {
492+ ($prop: expr, $key: ident, $start: expr, $end: expr) => {{
493+ let has_prop = $start.$key.is_some() && $start.$key == $end.$key;
494+ if has_prop {
495+ dest.push($prop(std::mem::take(&mut $start.$key).unwrap()));
496+ $end.$key = None;
455497 }
456498 has_prop
457499 }};
458500 }
459501
460- let has_style = shorthand!(BorderStyle, style);
461- let has_width = shorthand!(BorderWidth, width);
462- let has_color = shorthand!(BorderColor, color);
502+ shorthand!(BorderStyle, style);
503+ shorthand!(BorderWidth, width);
504+ shorthand!(BorderColor, color);
463505
464506 macro_rules! side {
465507 ($val: expr, $shorthand: ident, $width: ident, $style: ident, $color: ident) => {
466508 if $val.is_valid() {
467509 dest.push(Property::$shorthand($val.to_border()));
468510 } else {
469- if !has_style {
470- if let Some(style) = &$val.style {
471- dest.push($style(style.clone()));
472- }
511+ if let Some(style) = &$val.style {
512+ dest.push($style(style.clone()));
473513 }
474514
475- if !has_width {
476- if let Some(width) = &$val.width {
477- dest.push($width(width.clone()));
478- }
515+ if let Some(width) = &$val.width {
516+ dest.push($width(width.clone()));
479517 }
480518
481- if !has_color {
482- if let Some(color) = &$val.color {
483- dest.push($color(color.clone()));
484- }
519+ if let Some(color) = &$val.color {
520+ dest.push($color(color.clone()));
485521 }
486522 }
487523 };
@@ -490,13 +526,25 @@ impl BorderHandler {
490526 if $is_logical && $block_start == $block_end && $block_start.is_valid() {
491527 dest.push(BorderBlock($block_start.to_border()))
492528 } else {
529+ if $is_logical && !$block_start.is_valid() && !$block_end.is_valid() {
530+ logical_shorthand!(BorderBlockStyle, style, $block_start, $block_end);
531+ logical_shorthand!(BorderBlockWidth, width, $block_start, $block_end);
532+ logical_shorthand!(BorderBlockColor, color, $block_start, $block_end);
533+ }
534+
493535 side!($block_start, $block_start_prop, $block_start_width, $block_start_style, $block_start_color);
494536 side!($block_end, $block_end_prop, $block_end_width, $block_end_style, $block_end_color);
495537 }
496538
497539 if $is_logical && $inline_start == $inline_end && $inline_start.is_valid() {
498540 dest.push(BorderBlock($block_start.to_border()))
499541 } else {
542+ if $is_logical && !$inline_start.is_valid() && !$inline_end.is_valid() {
543+ logical_shorthand!(BorderInlineStyle, style, $inline_start, $inline_end);
544+ logical_shorthand!(BorderInlineWidth, width, $inline_start, $inline_end);
545+ logical_shorthand!(BorderInlineColor, color, $inline_start, $inline_end);
546+ }
547+
500548 side!($inline_start, $inline_start_prop, $inline_start_width, $inline_start_style, $inline_start_color);
501549 side!($inline_end, $inline_end_prop, $inline_end_width, $inline_end_style, $inline_end_color);
502550 }
0 commit comments