mergeComponentProps function

Map<String, Object?> mergeComponentProps(
  1. Map<String, Object?> props, {
  2. String? className,
  3. Map<String, Object?> defaultStyle = const {},
  4. Map<String, Object?> variantStyle = const {},
  5. DartStyle? dartStyle,
  6. Map<String, Object?> style = const {},
})

Merges component props, classes, inline styles, and scoped Dart styles.

Implementation

Map<String, Object?> mergeComponentProps(
  Map<String, Object?> props, {
  String? className,
  Map<String, Object?> defaultStyle = const {},
  Map<String, Object?> variantStyle = const {},
  DartStyle? dartStyle,
  Map<String, Object?> style = const {},
}) {
  final existingClass = props['className']?.toString();
  final existingStyle = props['style'];
  final mergedStyle = mergeStyles(
    defaultStyle,
    variantStyle,
    dartStyle?.toMap() ?? const {},
    style,
    switch (existingStyle) {
      Map<String, Object?> map => map,
      String css => {'_cssText': css},
      _ => const <String, Object?>{},
    },
  );

  final next = {...props}..remove('style');
  final scopedClass = dartStyle?.hasScopedStyles == true
      ? _scopedClassName(dartStyle!)
      : null;
  final classes = joinClassNames([existingClass, className, scopedClass]);

  return {
    ...next,
    if (classes.isNotEmpty) 'className': classes,
    if (scopedClass != null)
      '_flintStyleCss': _scopedCss(scopedClass, dartStyle!),
    if (mergedStyle.isNotEmpty)
      'style': existingStyle is String
          ? [
              styleToCss(
                mergeStyles(
                  defaultStyle,
                  variantStyle,
                  dartStyle?.toMap() ?? const {},
                  style,
                ),
              ),
              existingStyle,
            ].where((value) => value.trim().isNotEmpty).join('; ')
          : mergedStyle,
  };
}