From cb4582841741fcc478333b17955f75b876e8a4a5 Mon Sep 17 00:00:00 2001 From: KangGio <169110234+KangGio@users.noreply.github.com> Date: Thu, 17 Jul 2025 13:53:07 +0900 Subject: [PATCH 1/3] button --- pubspec.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index d993b91..63806a4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" boolean_selector: dependency: transitive description: @@ -53,10 +53,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" flutter: dependency: "direct main" description: flutter @@ -79,10 +79,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: @@ -204,10 +204,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.0.0" sdks: dart: ">=3.7.2 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" From a3071828c694610464b1ec2598622dbd1738873d Mon Sep 17 00:00:00 2001 From: KangGio <169110234+KangGio@users.noreply.github.com> Date: Thu, 17 Jul 2025 13:53:07 +0900 Subject: [PATCH 2/3] feat: custom button --- pubspec.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index d993b91..63806a4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" boolean_selector: dependency: transitive description: @@ -53,10 +53,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" flutter: dependency: "direct main" description: flutter @@ -79,10 +79,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: @@ -204,10 +204,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.0.0" sdks: dart: ">=3.7.2 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" From 0b2eb31caa02cfa53bebd4776be94960301b7854 Mon Sep 17 00:00:00 2001 From: KangGio <169110234+KangGio@users.noreply.github.com> Date: Thu, 17 Jul 2025 14:16:26 +0900 Subject: [PATCH 3/3] feat: custom button --- lib/custom button.dart | 123 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 lib/custom button.dart diff --git a/lib/custom button.dart b/lib/custom button.dart new file mode 100644 index 0000000..fceb152 --- /dev/null +++ b/lib/custom button.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +const Color lightPrimaryColor = Color(0xFF6C98FF); +const Color lightSecondaryColor = Color(0xFF87A9F7); + +const Color darkPrimaryColor = Color(0xFF497BEE); +const Color darkSecondaryColor = Color(0xFF6C98FF); + +const Color disabledColor = Color(0xFF808080); + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Button Variants Demo', + themeMode: ThemeMode.system, + theme: ThemeData( + useMaterial3: true, + brightness: Brightness.light, + colorScheme: ColorScheme.light( + primary: lightPrimaryColor, + secondary: lightSecondaryColor, + ), + ), + darkTheme: ThemeData( + useMaterial3: true, + brightness: Brightness.dark, + colorScheme: ColorScheme.dark( + primary: darkPrimaryColor, + secondary: darkSecondaryColor, + ), + ), + home: const ButtonDemoPage(), + ); + } +} + +class ButtonDemoPage extends StatelessWidget { + const ButtonDemoPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text("Button Variants")), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: const [ + CustomButton(variant: 'surface', disabled: false), + SizedBox(height: 10), + CustomButton(variant: 'surface', disabled: true), + SizedBox(height: 10), + CustomButton(variant: 'outline', disabled: false), + SizedBox(height: 10), + CustomButton(variant: 'outline', disabled: true), + ], + ), + ), + ); + } +} + +class CustomButton extends StatelessWidget { + final String variant; + final bool disabled; + + const CustomButton({ + super.key, + required this.variant, + required this.disabled, + }); + + @override + Widget build(BuildContext context) { + final bool isOutline = variant == 'outline'; + final colorScheme = Theme.of(context).colorScheme; + final Color primary = colorScheme.primary; + + return SizedBox( + width: 120, + height: 34, + child: ElevatedButton( + onPressed: disabled ? null : () {}, + style: ButtonStyle( + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return isOutline ? Colors.white : disabledColor; + } + return isOutline ? Colors.white : primary; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return isOutline ? disabledColor : Colors.white; + } + return isOutline ? primary : Colors.white; + }), + side: WidgetStateProperty.resolveWith((states) { + if (!isOutline) return BorderSide.none; + return BorderSide( + color: states.contains(WidgetState.disabled) + ? disabledColor + : primary, + ); + }), + padding: WidgetStateProperty.all( + const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + ), + elevation: WidgetStateProperty.all(0), + shape: WidgetStateProperty.all( + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ), + child: const Text('Button', style: TextStyle(fontSize: 12)), + ), + ); + } +}