setProperty method

dynamic setProperty(
  1. String name,
  2. dynamic value
)

Implementation

setProperty(String name, value) {

  // Memorize the variable value to renderStyle object.
  if (CSSVariable.isCSSSVariableProperty(name)) {
    setCSSVariable(name, value.toString());
    return;
  }

  // Get the computed value of CSS variable.
  if (value is CSSVariable) {
    value = value.computedValue(name);
  }

  if (value is CSSCalcValue) {
    if (name == BACKGROUND_POSITION_X || name == BACKGROUND_POSITION_Y) {
      value = CSSBackgroundPosition(calcValue: value);
    } else {
      value = value.computedValue(name);
      if (value != null) {
        value = CSSLengthValue(value, CSSLengthType.PX);
      }
    }
  }

  // Map logical properties to physical properties based on current direction
  String propertyName = name;
  final bool isRTL = direction == TextDirection.rtl;

  // Handle inline-start properties (maps to left in LTR, right in RTL)
  if (name == MARGIN_INLINE_START) {
    propertyName = isRTL ? MARGIN_RIGHT : MARGIN_LEFT;
  } else if (name == PADDING_INLINE_START) {
    propertyName = isRTL ? PADDING_RIGHT : PADDING_LEFT;
  } else if (name == BORDER_INLINE_START) {
    propertyName = isRTL ? BORDER_RIGHT : BORDER_LEFT;
  } else if (name == BORDER_INLINE_START_WIDTH) {
    propertyName = isRTL ? BORDER_RIGHT_WIDTH : BORDER_LEFT_WIDTH;
  } else if (name == BORDER_INLINE_START_STYLE) {
    propertyName = isRTL ? BORDER_RIGHT_STYLE : BORDER_LEFT_STYLE;
  } else if (name == BORDER_INLINE_START_COLOR) {
    propertyName = isRTL ? BORDER_RIGHT_COLOR : BORDER_LEFT_COLOR;
  } else if (name == INSET_INLINE_START) {
    propertyName = isRTL ? RIGHT : LEFT;
  }
  // Handle inline-end properties (maps to right in LTR, left in RTL)
  else if (name == MARGIN_INLINE_END) {
    propertyName = isRTL ? MARGIN_LEFT : MARGIN_RIGHT;
  } else if (name == PADDING_INLINE_END) {
    propertyName = isRTL ? PADDING_LEFT : PADDING_RIGHT;
  } else if (name == BORDER_INLINE_END) {
    propertyName = isRTL ? BORDER_LEFT : BORDER_RIGHT;
  } else if (name == BORDER_INLINE_END_WIDTH) {
    propertyName = isRTL ? BORDER_LEFT_WIDTH : BORDER_RIGHT_WIDTH;
  } else if (name == BORDER_INLINE_END_STYLE) {
    propertyName = isRTL ? BORDER_LEFT_STYLE : BORDER_RIGHT_STYLE;
  } else if (name == BORDER_INLINE_END_COLOR) {
    propertyName = isRTL ? BORDER_LEFT_COLOR : BORDER_RIGHT_COLOR;
  } else if (name == INSET_INLINE_END) {
    propertyName = isRTL ? LEFT : RIGHT;
  }
  // Handle block-start properties (maps to top)
  else if (name == MARGIN_BLOCK_START) {
    propertyName = MARGIN_TOP;
  } else if (name == PADDING_BLOCK_START) {
    propertyName = PADDING_TOP;
  } else if (name == BORDER_BLOCK_START) {
    propertyName = BORDER_TOP;
  } else if (name == BORDER_BLOCK_START_WIDTH) {
    propertyName = BORDER_TOP_WIDTH;
  } else if (name == BORDER_BLOCK_START_STYLE) {
    propertyName = BORDER_TOP_STYLE;
  } else if (name == BORDER_BLOCK_START_COLOR) {
    propertyName = BORDER_TOP_COLOR;
  } else if (name == INSET_BLOCK_START) {
    propertyName = TOP;
  }
  // Handle block-end properties (maps to bottom)
  else if (name == MARGIN_BLOCK_END) {
    propertyName = MARGIN_BOTTOM;
  } else if (name == PADDING_BLOCK_END) {
    propertyName = PADDING_BOTTOM;
  } else if (name == BORDER_BLOCK_END) {
    propertyName = BORDER_BOTTOM;
  } else if (name == BORDER_BLOCK_END_WIDTH) {
    propertyName = BORDER_BOTTOM_WIDTH;
  } else if (name == BORDER_BLOCK_END_STYLE) {
    propertyName = BORDER_BOTTOM_STYLE;
  } else if (name == BORDER_BLOCK_END_COLOR) {
    propertyName = BORDER_BOTTOM_COLOR;
  } else if (name == INSET_BLOCK_END) {
    propertyName = BOTTOM;
  }

  // Use the mapped property name for the switch statement
  name = propertyName;

  switch (name) {
    case DISPLAY:
      display = value;
      break;
    case Z_INDEX:
      zIndex = value;
      break;
    case OVERFLOW_X:
      overflowX = value;
      break;
    case OVERFLOW_Y:
      overflowY = value;
      break;
    case OPACITY:
      opacity = value;
      break;
    case VISIBILITY:
      visibility = value;
      break;
    case CONTENT_VISIBILITY:
      contentVisibility = value;
      break;
    case POSITION:
      position = value;
      break;
    case TOP:
      top = value;
      break;
    case LEFT:
      left = value;
      break;
    case BOTTOM:
      bottom = value;
      break;
    case RIGHT:
      right = value;
      break;
    // Size
    case WIDTH:
      width = value;
      break;
    case MIN_WIDTH:
      minWidth = value;
      break;
    case MAX_WIDTH:
      maxWidth = value;
      break;
    case HEIGHT:
      height = value;
      break;
    case MIN_HEIGHT:
      minHeight = value;
      break;
    case MAX_HEIGHT:
      maxHeight = value;
      break;
    case ASPECT_RATIO:
      // Preferred aspect ratio (width/height). Null means 'auto'.
      aspectRatio = value as double?;
      break;
    // Flex
    case FLEX_DIRECTION:
      flexDirection = value;
      break;
    case FLEX_WRAP:
      flexWrap = value;
      break;
    case ALIGN_CONTENT:
      alignContent = value;
      break;
    case GRID_TEMPLATE_COLUMNS:
      gridTemplateColumns = value;
      break;
    case GRID_TEMPLATE_ROWS:
      gridTemplateRows = value;
      break;
    case GRID_TEMPLATE_AREAS:
      gridTemplateAreasDefinition = value;
      break;
    case GRID_AUTO_ROWS:
      gridAutoRows = value;
      break;
    case GRID_AUTO_COLUMNS:
      gridAutoColumns = value;
      break;
    case GRID_AUTO_FLOW:
      gridAutoFlow = value;
      break;
    case GRID_ROW_START:
      gridRowStart = value;
      gridAreaName = null;
      break;
    case GRID_ROW_END:
      gridRowEnd = value;
      gridAreaName = null;
      break;
    case GRID_COLUMN_START:
      gridColumnStart = value;
      gridAreaName = null;
      break;
    case GRID_COLUMN_END:
      gridColumnEnd = value;
      gridAreaName = null;
      break;
    case GRID_AREA_INTERNAL:
      gridAreaName = value as String?;
      break;
    case ALIGN_ITEMS:
      alignItems = value;
      break;
    case JUSTIFY_CONTENT:
      justifyContent = value;
      break;
    case JUSTIFY_ITEMS:
      justifyItems = value;
      break;
    case JUSTIFY_SELF:
      justifySelf = value;
      break;
    case ALIGN_SELF:
      alignSelf = value;
      break;
    case FLEX_GROW:
      flexGrow = value;
      break;
    case FLEX_SHRINK:
      flexShrink = value;
      break;
    case FLEX_BASIS:
      flexBasis = value;
      break;
    case ORDER:
      order = value;
      break;
    // Gap
    case GAP:
      gap = value;
      break;
    case ROW_GAP:
      rowGap = value;
      break;
    case COLUMN_GAP:
      columnGap = value;
      break;
    // Background
    case BACKGROUND_COLOR:
      backgroundColor = value;
      break;
    case BACKGROUND_ATTACHMENT:
      backgroundAttachment = value;
      break;
    case BACKGROUND_IMAGE:
      backgroundImage = value;
      break;
    case BACKGROUND_REPEAT:
      backgroundRepeat = value;
      break;
    case BACKGROUND_POSITION_X:
      backgroundPositionX = value;
      if (DebugFlags.enableBackgroundLogs) {
        try {
          final CSSBackgroundPosition p = value as CSSBackgroundPosition;
          renderingLogger.finer('[Background] set BACKGROUND_POSITION_X -> ${p.cssText()} '
              '(len=${p.length != null} pct=${p.percentage != null} calc=${p.calcValue != null})');
        } catch (_) {}
      }
      break;
    case BACKGROUND_POSITION_Y:
      backgroundPositionY = value;
      if (DebugFlags.enableBackgroundLogs) {
        try {
          final CSSBackgroundPosition p = value as CSSBackgroundPosition;
          renderingLogger.finer('[Background] set BACKGROUND_POSITION_Y -> ${p.cssText()} '
              '(len=${p.length != null} pct=${p.percentage != null} calc=${p.calcValue != null})');
        } catch (_) {}
      }
      break;
    case BACKGROUND_SIZE:
      backgroundSize = value;
      break;
    case BACKGROUND_CLIP:
      backgroundClip = value;
      break;
    case BACKGROUND_ORIGIN:
      backgroundOrigin = value;
      break;
    // Padding
    case PADDING_TOP:
      paddingTop = value;
      break;
    case PADDING_RIGHT:
      paddingRight = value;
      break;
    case PADDING_BOTTOM:
      paddingBottom = value;
      break;
    case PADDING_LEFT:
      paddingLeft = value;
      break;
    // Border
    case BORDER_LEFT_WIDTH:
      borderLeftWidth = value;
      break;
    case BORDER_TOP_WIDTH:
      borderTopWidth = value;
      break;
    case BORDER_RIGHT_WIDTH:
      borderRightWidth = value;
      break;
    case BORDER_BOTTOM_WIDTH:
      borderBottomWidth = value;
      break;
    case BORDER_LEFT_STYLE:
      borderLeftStyle = value;
      break;
    case BORDER_TOP_STYLE:
      borderTopStyle = value;
      break;
    case BORDER_RIGHT_STYLE:
      borderRightStyle = value;
      break;
    case BORDER_BOTTOM_STYLE:
      borderBottomStyle = value;
      break;
    case BORDER_LEFT_COLOR:
      borderLeftColor = value;
      break;
    case BORDER_TOP_COLOR:
      borderTopColor = value;
      break;
    case BORDER_RIGHT_COLOR:
      borderRightColor = value;
      break;
    case BORDER_BOTTOM_COLOR:
      borderBottomColor = value;
      break;
    case BOX_SHADOW:
      boxShadow = value;
      break;
    case BORDER_TOP_LEFT_RADIUS:
      borderTopLeftRadius = value;
      break;
    case BORDER_TOP_RIGHT_RADIUS:
      borderTopRightRadius = value;
      break;
    case BORDER_BOTTOM_LEFT_RADIUS:
      borderBottomLeftRadius = value;
      break;
    case BORDER_BOTTOM_RIGHT_RADIUS:
      borderBottomRightRadius = value;
      break;
    // Margin
    case MARGIN_LEFT:
      marginLeft = value;
      break;
    case MARGIN_TOP:
      marginTop = value;
      break;
    case MARGIN_RIGHT:
      marginRight = value;
      break;
    case MARGIN_BOTTOM:
      marginBottom = value;
      break;
    // Text
    case COLOR:
      color = value;
      break;
    case TEXT_DECORATION_LINE:
      textDecorationLine = value;
      break;
    case TEXT_DECORATION_STYLE:
      textDecorationStyle = value;
      break;
    case TEXT_DECORATION_COLOR:
      textDecorationColor = value;
      break;
    case FONT_WEIGHT:
      fontWeight = value;
      break;
    case FONT_STYLE:
      fontStyle = value;
      break;
    case FONT_FAMILY:
      fontFamily = value;
      break;
    case FONT_SIZE:
      fontSize = value;
      break;
    case LINE_HEIGHT:
      lineHeight = value;
      break;
    case LETTER_SPACING:
      letterSpacing = value;
      break;
    case WORD_SPACING:
      wordSpacing = value;
      break;
    case TEXT_SHADOW:
      textShadow = value;
      break;
    case WHITE_SPACE:
      whiteSpace = value;
      break;
    case TEXT_OVERFLOW:
      textOverflow = value;
      break;
    case WORD_BREAK:
      wordBreak = value;
      break;
    case LINE_CLAMP:
      lineClamp = value;
      break;
    case TEXT_TRANSFORM:
      textTransform = value;
      break;
    case TAB_SIZE:
      tabSize = value;
      break;
    case TEXT_INDENT:
      // Accept CSSLengthValue or parse from string
      if (value is CSSLengthValue) {
        textIndent = value;
      } else if (value is String) {
        final parsed = CSSLength.parseLength(value, this, TEXT_INDENT, Axis.horizontal);
        if (parsed != CSSLengthValue.unknown) {
          textIndent = parsed;
        }
      }
      break;
    case VERTICAL_ALIGN:
      verticalAlign = value;
      break;
    case TEXT_ALIGN:
      textAlign = value;
      break;
    case DIRECTION:
      direction = value;
      break;
    case WRITING_MODE:
      writingMode = value as CSSWritingMode;
      break;
    // Transform
    case TRANSFORM:
      transform = value;
      break;
    case TRANSFORM_ORIGIN:
      transformOrigin = value;
      break;
    // Transition
    case TRANSITION_DELAY:
      transitionDelay = value;
      break;
    case TRANSITION_DURATION:
      transitionDuration = value;
      break;
    case TRANSITION_TIMING_FUNCTION:
      transitionTimingFunction = value;
      break;
    case TRANSITION_PROPERTY:
      transitionProperty = value;
      break;
    // Animation
    case ANIMATION_DELAY:
      animationDelay = value;
      break;
    case ANIMATION_NAME:
      animationName = value;
      break;
    case ANIMATION_DIRECTION:
      animationDirection = value;
      break;
    case ANIMATION_DURATION:
      animationDuration = value;
      break;
    case ANIMATION_PLAY_STATE:
      animationPlayState = value;
      break;
    case ANIMATION_FILL_MODE:
      animationFillMode = value;
      break;
    case ANIMATION_ITERATION_COUNT:
      animationIterationCount = value;
      break;
    case ANIMATION_TIMING_FUNCTION:
      animationTimingFunction = value;
      break;
    // Others
    case OBJECT_FIT:
      objectFit = value;
      break;
    case OBJECT_POSITION:
      objectPosition = value;
      break;
    case FILTER:
      filter = value;
      break;
    case SLIVER_DIRECTION:
      sliverDirection = value;
      break;
    case CARETCOLOR:
      caretColor = (value as CSSColor).value;
      break;
  }
}