generateBase method

void generateBase(
  1. MapEntry? mapEntry
)

Implementation

void generateBase(MapEntry? mapEntry) {
  if (mapEntry != null) {
    final dirColor = join(pathColors, 'src');
    DirectoryHelper.createDir(dirColor);

    final pathBaseColor = join(dirColor, 'morpheme_color.dart');
    final colors = mapEntry.value['colors'] is Map
        ? mapEntry.value['colors'] as Map
        : {};
    pathBaseColor.write('''import 'package:flutter/material.dart';

extension MorphemeColorExtension on BuildContext {
MorphemeColor get color => Theme.of(this).extension<MorphemeColor>()!;
}

class MorphemeColor extends ThemeExtension<MorphemeColor> {
MorphemeColor({
  ${colors.entries.map((e) => '    required this.${e.key.toString().camelCase},').join('\n')}
});

${colors.entries.map((e) {
      final key = e.key.toString().camelCase;
      if (e.value is Map) {
        return '''  final MaterialColor ${key.camelCase};''';
      } else {
        return '''  final Color ${key.camelCase};''';
      }
    }).join('\n')}

@override
MorphemeColor copyWith({
  ${colors.entries.map((e) {
      final key = e.key.toString().camelCase;
      if (e.value is Map) {
        return '''    MaterialColor? ${key.camelCase},''';
      } else {
        return '''    Color? ${key.camelCase},''';
      }
    }).join('\n')}
}) {
  return MorphemeColor(
    ${colors.entries.map((e) => '      ${e.key.toString().camelCase}: ${e.key.toString().camelCase} ?? this.${e.key.toString().camelCase},').join('\n')}
  );
}

@override
MorphemeColor lerp(covariant MorphemeColor? other, double t) {
  if (other is MorphemeColor) {
    return this;
  }

  return MorphemeColor(
    ${colors.entries.map((e) {
      final key = e.key.toString().camelCase;
      if (e.value is Map) {
        return '''    ${key.camelCase}: other?.${key.camelCase} ?? ${key.camelCase},''';
      } else {
        return '''    ${key.camelCase}: Color.lerp(${key.camelCase}, other?.${key.camelCase}, t) ?? ${key.camelCase},''';
      }
    }).join('\n')}
  );
}
}
''');

    final dirTheme = join(pathThemes, 'src');
    DirectoryHelper.createDir(dirTheme);

    final pathBaseTheme = join(dirTheme, 'morpheme_theme.dart');
    if (!exists(pathBaseTheme)) {
      pathBaseTheme.write('''import 'package:flutter/material.dart';

import '../../morpheme_colors/morpheme_colors.dart';

abstract base class MorphemeTheme {
MorphemeTheme(this.id);

final String id;

MorphemeColor get color;
ThemeData get rawThemeData;
ColorScheme get colorScheme;

TextTheme get _getTextTheme => GoogleFonts.robotoTextTheme()
    .apply(bodyColor: color.black, displayColor: color.black)
    .merge(MorphemeTextTheme.textTheme);

ThemeData get themeData => rawThemeData.copyWith(
      scaffoldBackgroundColor: color.white,
      extensions: [color],
      appBarTheme: AppBarTheme(
        elevation: 0,
        color: color.white,
        foregroundColor: color.black,
        titleTextStyle: _getTextTheme.titleLarge,
      ),
      colorScheme: colorScheme,
      textTheme: _getTextTheme,
      inputDecorationTheme: InputDecorationTheme(
        hintStyle: _getTextTheme.bodyMedium?.apply(color: color.grey1),
        fillColor: color.white,
        filled: true,
        contentPadding: const EdgeInsets.symmetric(
          horizontal: MorphemeSizes.s16,
          vertical: MorphemeSizes.s8,
        ),
        enabledBorder: OutlineInputBorder(
          borderSide: BorderSide(color: color.grey1, width: 1),
          borderRadius: BorderRadius.circular(MorphemeSizes.s8),
        ),
        focusedBorder: OutlineInputBorder(
          borderSide: BorderSide(color: color.grey1, width: 1),
          borderRadius: BorderRadius.circular(MorphemeSizes.s8),
        ),
        focusedErrorBorder: OutlineInputBorder(
          borderSide: BorderSide(color: color.grey1, width: 1),
          borderRadius: BorderRadius.circular(MorphemeSizes.s8),
        ),
        errorBorder: OutlineInputBorder(
          borderSide: BorderSide(color: color.error, width: 1),
          borderRadius: BorderRadius.circular(MorphemeSizes.s8),
        ),
        disabledBorder: OutlineInputBorder(
          borderSide: BorderSide(color: color.grey1, width: 1),
          borderRadius: BorderRadius.circular(MorphemeSizes.s8),
        ),
      ),
      elevatedButtonTheme: ElevatedButtonThemeData(
        style: ElevatedButton.styleFrom(
          textStyle: _getTextTheme.labelLarge,
          shape: const RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(MorphemeSizes.s8)),
          ),
          padding: const EdgeInsets.symmetric(horizontal: MorphemeSizes.s16),
        ),
      ),
      outlinedButtonTheme: OutlinedButtonThemeData(
        style: OutlinedButton.styleFrom(
          textStyle: _getTextTheme.labelLarge,
          shape: const RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(MorphemeSizes.s8)),
          ),
          padding: const EdgeInsets.symmetric(horizontal: MorphemeSizes.s16),
        ),
      ),
      textButtonTheme: TextButtonThemeData(
        style: TextButton.styleFrom(
          textStyle: _getTextTheme.labelLarge,
          shape: const RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(MorphemeSizes.s8)),
          ),
          padding: const EdgeInsets.symmetric(horizontal: MorphemeSizes.s16),
        ),
      ),
    );

@override
bool operator ==(Object other) {
  if (identical(this, other)) return true;

  return other is MorphemeTheme && other.id == id;
}

@override
int get hashCode => id.hashCode;
}
''');
    }
  }
}