From 21f68108d0b96c5ce1f8d0f897eaf2cf97e956a0 Mon Sep 17 00:00:00 2001 From: deepikahr Date: Mon, 6 Jan 2020 10:58:47 +0530 Subject: [PATCH 01/13] GFTabbarView error fixed --- example/lib/main.dart | 421 ++++++++++++------------- lib/components/tabs/gf_tabBarView.dart | 17 +- 2 files changed, 222 insertions(+), 216 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 6b35c3bb..7c1dc956 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -140,32 +140,36 @@ class _MyHomePageState extends State with SingleTickerProviderStateM ), ), appBar: GFAppBar( -// backgroundColor: Colors.tealAccent, + backgroundColor: Colors.tealAccent, centerTitle: true, - title: GFSegmentTabs( + title: +// Text("UI KIT"), + GFSegmentTabs( + tabController: tabController, initialIndex: 0, length: 3, tabs: [ Tab( child: Text( - "Gelatin", + "cream", ), ), Tab( child: Text( - "Donuts", + "serum", ), ), Tab( child: Text( - "Pastry", + "toner", ), ), ], +// borderRadius: BorderRadius.circular(50.0), ), -// trailing: [ -// GFIconButton(icon: Icon(Icons.directions_bus), onPressed: null) -// ], + trailing: [ + GFIconButton(icon: Icon(Icons.directions_bus), onPressed: null) + ], ), backgroundColor: Colors.teal, body: @@ -179,46 +183,57 @@ class _MyHomePageState extends State with SingleTickerProviderStateM mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - GFAvatar( - radius: 80.0, - backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), - ), +// GFAvatar( +// radius: 80.0, +// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), +// ), +// +// GFSegmentTabs( +// tabController: tabController, +//// height: 38.0, +//// width: 180.0, +// initialIndex: 0, +// length: 3, +// tabs: [ +// Tab( +// child: Text( +// "Gelatin", +// ), +// ), +// Tab( +// child: Text( +// "Donuts", +// ), +// ), +// Tab( +// child: Text( +// "Pastry", +// ), +// ), +// ], +//// tabBarColor: Colors.pink.withOpacity(0.6), +//// indicatorSize: TabBarIndicatorSize.tab, +//// indicatorColor: Colors.tealAccent, +//// indicator: BoxDecoration( +//// color: Colors.pink, +//// border: Border.all(color: Colors.green, width: 1.0), +//// borderRadius: BorderRadius.circular(50.0) +//// ), +//// indicatorPadding: EdgeInsets.all(8.0), +//// indicatorWeight: 2.0, +//// border: Border.all(color: Colors.orange, width: 2.0), +//// borderRadius: BorderRadius.circular(50.0) +// ), - GFSegmentTabs( -// height: 38.0, -// width: 180.0, - initialIndex: 0, - length: 3, - tabs: [ - Tab( - child: Text( - "Gelatin", - ), - ), - Tab( - child: Text( - "Donuts", - ), - ), - Tab( - child: Text( - "Pastry", - ), - ), - ], -// tabBarColor: Colors.pink.withOpacity(0.6), -// indicatorSize: TabBarIndicatorSize.tab, -// indicatorColor: Colors.tealAccent, -// indicator: BoxDecoration( -// color: Colors.pink, -// border: Border.all(color: Colors.green, width: 1.0), -// borderRadius: BorderRadius.circular(50.0) -// ), -// indicatorPadding: EdgeInsets.all(8.0), -// indicatorWeight: 2.0, -// border: Border.all(color: Colors.orange, width: 2.0), -// borderRadius: BorderRadius.circular(50.0) - ), +// GFTabBarView( +// controller: tabController, +// height: 400.0, +// children: [ +// Container(color: Colors.red), +// Container(color: Colors.green), +// Container(color: Colors.blue) +// ] +// ), @@ -273,101 +288,85 @@ class _MyHomePageState extends State with SingleTickerProviderStateM // }, // ), - GFButton( -// color: Colors.green, - onPressed: null, - child: Text("share"), - type: GFType.outline, - shape: GFButtonShape.pills, -//textColor: GFColor.danger, -//borderSide: BorderSide(color: Colors.pink, width: 2.0), -// buttonBoxShadow: true, -// boxShadow: BoxShadow( -// color: Colors.pink, -// blurRadius: 1.5, -// spreadRadius: 2.0, -// offset: Offset.zero, -// ), - ), - - GFTabs( - initialIndex: 0, - length: 3, - tabs: [ - GFButton( - onPressed: null, - child: Text("share"), - icon: Icon(Icons.share), - buttonBoxShadow: true, - ), - Tab( - icon: Icon(Icons.error), - child: Text( - "Orders", - ), - ), - Tab( - child: Text( - "Pastry", - ), - ), - ], - tabBarView: GFTabBarView( - children: [ - Container( - color: Colors.red, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - GFToast( - child: Text("sdc"), - backgroundColor: Colors.pink, - button: GFButton( - text: 'dsx', - onPressed: (){ - print("fdsc"); - }, - ), - ), - RawMaterialButton( - onPressed: null, - child: Text("fv"), - ), - FlatButton(onPressed: null, child: Text("cds")), - Icon(Icons.directions_railway), - GFButton( - onPressed: null, - child: Text("share"), - icon: Icon(Icons.share), - shape: GFButtonShape.pills, - type: GFType.transparent, - ), - ], - ), - ), - Icon(Icons.directions_car), - Icon(Icons.directions_transit), - ], - ), - indicatorColor: Colors.teal, -// indicatorSize: TabBarIndicatorSize.label, -// labelColor: Colors.lightGreen, -// unselectedLabelColor: Colors.black, -// labelStyle: TextStyle( -// fontWeight: FontWeight.w500, -// fontSize: 13.0, -// color: Colors.deepOrange, -// fontFamily: 'OpenSansBold', -// ), -// unselectedLabelStyle: TextStyle( -// fontWeight: FontWeight.w500, -// fontSize: 13.0, -// color: Colors.black, -// fontFamily: 'OpenSansBold', +// GFTabs( +// initialIndex: 0, +// length: 3, +// tabs: [ +// GFButton( +// onPressed: null, +// child: Text("share"), +// icon: Icon(Icons.share), +// buttonBoxShadow: true, +// ), +// Tab( +// icon: Icon(Icons.error), +// child: Text( +// "Orders", +// ), +// ), +// Tab( +// child: Text( +// "Pastry", +// ), +// ), +// ], +// tabBarView: GFTabBarView( +// children: [ +// Container( +// color: Colors.red, +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// +// GFToast( +// child: Text("sdc"), +// backgroundColor: Colors.pink, +// button: GFButton( +// text: 'dsx', +// onPressed: (){ +// print("fdsc"); +// }, +// ), +// ), +// RawMaterialButton( +// onPressed: null, +// child: Text("fv"), +// ), +// FlatButton(onPressed: null, child: Text("cds")), +// Icon(Icons.directions_railway), +// GFButton( +// onPressed: null, +// child: Text("share"), +// icon: Icon(Icons.share), +// shape: GFButtonShape.pills, +// type: GFType.transparent, +// ), +// ], +// ), +// ), +// Icon(Icons.directions_car), +// Icon(Icons.directions_transit), +// ], // ), - ), +// indicatorColor: Colors.teal, +//// indicatorSize: TabBarIndicatorSize.label, +//// labelColor: Colors.lightGreen, +//// unselectedLabelColor: Colors.black, +//// labelStyle: TextStyle( +//// fontWeight: FontWeight.w500, +//// fontSize: 13.0, +//// color: Colors.deepOrange, +//// fontFamily: 'OpenSansBold', +//// ), +//// unselectedLabelStyle: TextStyle( +//// fontWeight: FontWeight.w500, +//// fontSize: 13.0, +//// color: Colors.black, +//// fontFamily: 'OpenSansBold', +//// ), +// ), // // GFSlider( // autoPlay: true, @@ -558,30 +557,30 @@ class _MyHomePageState extends State with SingleTickerProviderStateM //// //// borderRadius: BorderRadius.circular(20.0), // ), - GFIconBadges( - onPressed: null, - child: GFIconButton( - onPressed: null, - icon: Icon(Icons.ac_unit), - ), - counterChild: GFBadge( - text: '12', - -// color: GFColor.dark -////, -// shape: GFBadgeShape.circle, -// -// size: GFSize.small, -// -// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// -// textColor: GFColor.white, -// -// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +// GFIconBadges( +// onPressed: null, +// child: GFIconButton( +// onPressed: null, +// icon: Icon(Icons.ac_unit), +// ), +// counterChild: GFBadge( +// text: '12', // -// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.orange, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - ), - ), +//// color: GFColor.dark +//////, +//// shape: GFBadgeShape.circle, +//// +//// size: GFSize.small, +//// +//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +//// +//// textColor: GFColor.white, +//// +//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +//// +//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.orange, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +// ), +// ), // GFIconButton( // onPressed: null, // icon: Icon(Icons.ac_unit), @@ -600,63 +599,63 @@ class _MyHomePageState extends State with SingleTickerProviderStateM //// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), //// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), // ), - GFButtonBadge( - onPressed: null, -// position: GFIconPosition.start, -// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - text: 'goodies', -// color: GFColor.danger, -// shape: GFButtonShape.pills, - type: GFType.outline, -// size: GFSize.small, - counterChild: GFBadge( - child: Text("12"), -// color: GFColor.dark, - shape: GFBadgeShape.circle, -// size: GFSize.small, -// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// textColor: GFColor.white, -// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), - ), - ), -// GFBadge( -// text: '12', +// GFButtonBadge( +// onPressed: null, +//// position: GFIconPosition.start, +//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +// text: 'goodies', +//// color: GFColor.danger, +//// shape: GFButtonShape.pills, +// type: GFType.outline, +//// size: GFSize.small, +// counterChild: GFBadge( +// child: Text("12"), //// color: GFColor.dark, // shape: GFBadgeShape.circle, //// size: GFSize.small, //// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), //// textColor: GFColor.white, //// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +// ), // ), -// GFButton( -// text: 'goodies', -// onPressed: () {}, -// icon: Icon(Icons.access_alarms), -// ), -// GFButton( -// type: GFType.solid, -// shape: GFButtonShape.pills, -// text: 'goodies', -// onPressed: () {}, +// GFBadge( +// text: '12', +//// color: GFColor.dark, +// shape: GFBadgeShape.circle, +//// size: GFSize.small, +//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +//// textColor: GFColor.white, //// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -//// size: GFSize.large, -//// buttonBoxShadow: true, -//// blockButton: true, -//// fullWidthButton: true, -//// color: GFColor.primary, -//// textColor: GFColor.secondary, -//// icon: Icon(Icons.error, color: Colors.white,), -//// position: GFIconPosition.start, -//// boxShadow: BoxShadow( -//// color: Colors.pink, -//// blurRadius: 2.0, -//// spreadRadius: 1.0, -//// offset: Offset.zero, -//// ), -//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), // ), + GFButton( + text: 'goodies', + onPressed: () {}, + icon: Icon(Icons.access_alarms), + ), + GFButton( + type: GFType.solid, + shape: GFButtonShape.pills, + text: 'goodies', + onPressed: () {}, +// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +// size: GFSize.large, +// buttonBoxShadow: true, +// blockButton: true, +// fullWidthButton: true, +// color: GFColor.primary, +// textColor: GFColor.secondary, +// icon: Icon(Icons.error, color: Colors.white,), +// position: GFIconPosition.start, +// boxShadow: BoxShadow( +// color: Colors.pink, +// blurRadius: 2.0, +// spreadRadius: 1.0, +// offset: Offset.zero, +// ), +// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), + ), ], ), ), diff --git a/lib/components/tabs/gf_tabBarView.dart b/lib/components/tabs/gf_tabBarView.dart index 86886f4f..88bf9beb 100644 --- a/lib/components/tabs/gf_tabBarView.dart +++ b/lib/components/tabs/gf_tabBarView.dart @@ -25,6 +25,7 @@ class GFTabBarView extends StatefulWidget { @required this.children, this.controller, this.physics, + this.height, this.dragStartBehavior = DragStartBehavior.start, }) : assert(children != null), assert(dragStartBehavior != null), @@ -56,6 +57,9 @@ class GFTabBarView extends StatefulWidget { /// {@macro flutter.widgets.scrollable.dragStartBehavior} final DragStartBehavior dragStartBehavior; + /// [GFTabBarView] height can be fixed using [double] + final double height; + @override _GFTabBarViewState createState() => _GFTabBarViewState(); } @@ -223,11 +227,14 @@ class _GFTabBarViewState extends State { }()); return NotificationListener( onNotification: _handleScrollNotification, - child: PageView( - dragStartBehavior: widget.dragStartBehavior, - controller: _pageController, - physics: widget.physics == null ? _kGFTabBarViewPhysics : _kGFTabBarViewPhysics.applyTo(widget.physics), - children: _childrenWithKey, + child: Container( + height: widget.height == null ? MediaQuery.of(context).size.height : widget.height, + child: PageView( + dragStartBehavior: widget.dragStartBehavior, + controller: _pageController, + physics: widget.physics == null ? _kGFTabBarViewPhysics : _kGFTabBarViewPhysics.applyTo(widget.physics), + children: _childrenWithKey, + ), ), ); } From 6ae34c59273b5bf12e104cc9cc0ab64ef78eaa89 Mon Sep 17 00:00:00 2001 From: deepikahr Date: Mon, 6 Jan 2020 11:29:35 +0530 Subject: [PATCH 02/13] GFButton fixing --- example/lib/main.dart | 270 +++++++++++++++------------ lib/components/button/gf_button.dart | 152 ++++++++------- 2 files changed, 234 insertions(+), 188 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 7c1dc956..9d576b67 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -81,109 +81,133 @@ class _MyHomePageState extends State with SingleTickerProviderStateM @override Widget build(BuildContext context) { return Scaffold( - drawer: GFDrawer( - colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.6), BlendMode.darken), - backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), - gradient: LinearGradient( - begin: Alignment.topRight, - end: Alignment.bottomLeft, - stops: [0.1, 0.5, 0.7, 0.9], - colors: [ - Colors.teal[800], - Colors.teal[600], - Colors.teal[400], - Colors.teal[200], - ], - ), - child: ListView( - padding: EdgeInsets.zero, - children: [ - GFDrawerHeader( - currentAccountPicture: GFAvatar( - radius: 80.0, - backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), - ), - - decoration: BoxDecoration( - color: Colors.teal.withOpacity(0.45), - ), - otherAccountsPictures: [ - Image( - image: NetworkImage("https://cdn.pixabay.com/photo/2019/12/20/00/03/road-4707345_960_720.jpg"), - fit: BoxFit.cover, - ), - GFAvatar( - child: Text("dcf"), - ) - ], - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('user'), - Text('user@asdf.com'), - ], - ), - ), - ListTile( - title: Text('Item 1'), - onTap: () { - Navigator.pop(context); - }, - ), - ListTile( - title: Text('Item 2'), - onTap: () { - }, - ), - ], - ), - ), +// drawer: GFDrawer( +// colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.6), BlendMode.darken), +// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), +// gradient: LinearGradient( +// begin: Alignment.topRight, +// end: Alignment.bottomLeft, +// stops: [0.1, 0.5, 0.7, 0.9], +// colors: [ +// Colors.teal[800], +// Colors.teal[600], +// Colors.teal[400], +// Colors.teal[200], +// ], +// ), +// child: ListView( +// padding: EdgeInsets.zero, +// children: [ +// GFDrawerHeader( +// currentAccountPicture: GFAvatar( +// radius: 80.0, +// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), +// ), +// +// decoration: BoxDecoration( +// color: Colors.teal.withOpacity(0.45), +// ), +// otherAccountsPictures: [ +// Image( +// image: NetworkImage("https://cdn.pixabay.com/photo/2019/12/20/00/03/road-4707345_960_720.jpg"), +// fit: BoxFit.cover, +// ), +// GFAvatar( +// child: Text("dcf"), +// ) +// ], +// child: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Text('user'), +// Text('user@asdf.com'), +// ], +// ), +// ), +// ListTile( +// title: Text('Item 1'), +// onTap: () { +// Navigator.pop(context); +// }, +// ), +// ListTile( +// title: Text('Item 2'), +// onTap: () { +// }, +// ), +// ], +// ), +// ), appBar: GFAppBar( backgroundColor: Colors.tealAccent, centerTitle: true, title: -// Text("UI KIT"), - GFSegmentTabs( - tabController: tabController, - initialIndex: 0, - length: 3, - tabs: [ - Tab( - child: Text( - "cream", - ), - ), - Tab( - child: Text( - "serum", - ), - ), - Tab( - child: Text( - "toner", - ), - ), - ], -// borderRadius: BorderRadius.circular(50.0), - ), - trailing: [ - GFIconButton(icon: Icon(Icons.directions_bus), onPressed: null) - ], + Text("UI KIT"), +// GFSegmentTabs( +// tabController: tabController, +// initialIndex: 0, +// length: 3, +// tabs: [ +// Tab( +// child: Text( +// "cream", +// ), +// ), +// Tab( +// child: Text( +// "serum", +// ), +// ), +// Tab( +// child: Text( +// "toner", +// ), +// ), +// ], +//// borderRadius: BorderRadius.circular(50.0), +// ), +// trailing: [ +// GFIconButton(icon: Icon(Icons.directions_bus), onPressed: null) +// ], ), - backgroundColor: Colors.teal, +// backgroundColor: Colors.teal, body: // GFTabBarView(controller: tabController, children: [ // Container(color: Colors.red), // Container(color: Colors.green), // Container(color: Colors.blue) // ]), - SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ -// GFAvatar( + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + GFButton( + text: 'goodies', + onPressed: () {}, + icon: Icon(Icons.access_alarms), + hoverColor: Colors.orange, + color: Colors.pink, + focusColor: Colors.green, + type: GFType.outline, + ), + RawMaterialButton( + child: Text('goodies'), + onPressed: () { + print('dddddddddd'); + }, + fillColor: Colors.pink, + hoverColor: Colors.orange, + focusColor: Colors.teal, + ), + ], + ) +// SingleChildScrollView( +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +//// GFAvatar( // radius: 80.0, // backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), // ), @@ -628,37 +652,37 @@ class _MyHomePageState extends State with SingleTickerProviderStateM //// textColor: GFColor.white, //// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), // ), - GFButton( - text: 'goodies', - onPressed: () {}, - icon: Icon(Icons.access_alarms), - ), - GFButton( - type: GFType.solid, - shape: GFButtonShape.pills, - text: 'goodies', - onPressed: () {}, -// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -// size: GFSize.large, -// buttonBoxShadow: true, -// blockButton: true, -// fullWidthButton: true, -// color: GFColor.primary, -// textColor: GFColor.secondary, -// icon: Icon(Icons.error, color: Colors.white,), -// position: GFIconPosition.start, -// boxShadow: BoxShadow( -// color: Colors.pink, -// blurRadius: 2.0, -// spreadRadius: 1.0, -// offset: Offset.zero, -// ), -// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - ), - ], - ), - ), + +// GFButton( +// type: GFType.solid, +// shape: GFButtonShape.pills, +// text: 'goodies', +// onPressed: () { +// print('dddddddddd'); +// }, +// hoverColor: Colors.orange, +// focusColor: Colors.teal, +//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +//// size: GFSize.large, +//// buttonBoxShadow: true, +//// blockButton: true, +//// fullWidthButton: true, +//// color: GFColor.primary, +//// textColor: GFColor.secondary, +//// icon: Icon(Icons.error, color: Colors.white,), +//// position: GFIconPosition.start, +//// boxShadow: BoxShadow( +//// color: Colors.pink, +//// blurRadius: 2.0, +//// spreadRadius: 1.0, +//// offset: Offset.zero, +//// ), +//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +// ), +// ], +// ), +// ), ); } } diff --git a/lib/components/button/gf_button.dart b/lib/components/button/gf_button.dart index 73975bc4..6a0e834f 100644 --- a/lib/components/button/gf_button.dart +++ b/lib/components/button/gf_button.dart @@ -219,44 +219,11 @@ class _GFButtonState extends State { BoxShadow boxShadow; final Set _states = {}; - @override - void initState() { - this.color = getGFColor(widget.color); - this.textColor = widget.type == GFType.outline && widget.textColor == null ? this.color : widget.textColor == null ? getGFColor(GFColor.dark) : getGFColor(widget.textColor); - this.child = widget.text != null ? Text(widget.text) : widget.child; - this.icon = widget.icon; - this.onPressed = widget.onPressed; - this.type = widget.type; - this.shape = widget.shape; - this.size = getGFSize(widget.size); - this.position = widget.position; - _updateState(MaterialState.disabled, !widget.enabled); - super.initState(); - } - bool get _hovered => _states.contains(MaterialState.hovered); bool get _focused => _states.contains(MaterialState.focused); bool get _pressed => _states.contains(MaterialState.pressed); bool get _disabled => _states.contains(MaterialState.disabled); - double blockWidth(context) { - return MediaQuery.of(context).size.width * 0.88; - } - - double fullWidth(context) { - return MediaQuery.of(context).size.width; - } - - double buttonWidth() { - if (widget.blockButton == true) { - return blockWidth(context); - } else if (widget.fullWidthButton == true) { - return fullWidth(context); - } else { - return null; - } - } - void _updateState(MaterialState state, bool value) { value ? _states.add(state) : _states.remove(state); } @@ -288,6 +255,39 @@ class _GFButtonState extends State { } } + @override + void initState() { + this.color = getGFColor(widget.color); + this.textColor = widget.type == GFType.outline && widget.textColor == null ? this.color : widget.textColor == null ? getGFColor(GFColor.dark) : getGFColor(widget.textColor); + this.child = widget.text != null ? Text(widget.text) : widget.child; + this.icon = widget.icon; + this.onPressed = widget.onPressed; + this.type = widget.type; + this.shape = widget.shape; + this.size = getGFSize(widget.size); + this.position = widget.position; + _updateState(MaterialState.disabled, !widget.enabled); + super.initState(); + } + + double blockWidth(context) { + return MediaQuery.of(context).size.width * 0.88; + } + + double fullWidth(context) { + return MediaQuery.of(context).size.width; + } + + double buttonWidth() { + if (widget.blockButton == true) { + return blockWidth(context); + } else if (widget.fullWidthButton == true) { + return fullWidth(context); + } else { + return null; + } + } + @override void didUpdateWidget(GFButton oldWidget) { _updateState(MaterialState.disabled, !widget.enabled); @@ -301,12 +301,28 @@ class _GFButtonState extends State { super.didUpdateWidget(oldWidget); } + double get _effectiveElevation { + // These conditionals are in order of precedence, so be careful about + // reorganizing them. + if (_disabled) { + return widget.disabledElevation; + } + if (_pressed) { + return widget.highlightElevation; + } + if (_hovered) { + return widget.hoverElevation; + } + if (_focused) { + return widget.focusElevation; + } + return widget.elevation; + } + @override Widget build(BuildContext context) { - ShapeBorder shape; - final Color effectiveTextColor = MaterialStateProperty.resolveAs( widget.textStyle?.color, _states); final Color themeColor = @@ -316,19 +332,6 @@ class _GFButtonState extends State { width: widget.borderSide?.width ?? 1.0, ); - Size minSize; - switch (widget.materialTapTargetSize) { - case MaterialTapTargetSize.padded: - minSize = const Size(48.0, 48.0); - break; - case MaterialTapTargetSize.shrinkWrap: - minSize = Size.zero; - break; - default: - minSize = Size.zero; - break; - } - final BorderSide shapeBorder = widget.type == GFType.outline ? outlineBorder : widget.borderSide != null @@ -338,8 +341,6 @@ class _GFButtonState extends State { width: 0.0, ); - - if (this.shape == GFButtonShape.pills) { shape = RoundedRectangleBorder( borderRadius: BorderRadius.circular(50.0), side: shapeBorder); @@ -389,6 +390,7 @@ class _GFButtonState extends State { BoxConstraints(minHeight: 26.0, minWidth: 98.0), decoration: getBoxShadow(), child: Material( +// elevation: _effectiveElevation, textStyle: widget.textStyle == null ? TextStyle(color: this.textColor, fontSize: 14) : widget.textStyle, shape: widget.type == GFType.transparent ? null : widget.borderShape == null ? shape : widget.borderShape, color: widget.type == GFType.transparent || widget.type == GFType.outline ? Colors.transparent : this.color, @@ -396,6 +398,10 @@ class _GFButtonState extends State { animationDuration: widget.animationDuration, clipBehavior: widget.clipBehavior, child: InkWell( + focusNode: widget.focusNode, + canRequestFocus: widget.enabled, + onFocusChange: _handleFocusedChanged, + autofocus: widget.autofocus, onHighlightChanged: _handleHighlightChanged, splashColor: widget.splashColor, highlightColor: widget.highlightColor, @@ -403,6 +409,8 @@ class _GFButtonState extends State { hoverColor: widget.hoverColor, onHover: _handleHoveredChanged, onTap: widget.onPressed, + onLongPress: widget.onLongPress, + enableFeedback: widget.enableFeedback, customBorder: widget.type == GFType.transparent ? null : widget.borderShape == null ? shape : widget.borderShape, child: IconTheme.merge( data: IconThemeData(color: effectiveTextColor), @@ -442,15 +450,19 @@ class _GFButtonState extends State { ), ); - return Semantics( - container: true, - button: true, - enabled: widget.enabled, - child: _InputPadding( - minSize: minSize, - child: result, - ), - ); + Size minSize; + switch (widget.materialTapTargetSize) { + case MaterialTapTargetSize.padded: + minSize = const Size(48.0, 48.0); + break; + case MaterialTapTargetSize.shrinkWrap: + minSize = Size.zero; + break; + default: + minSize = Size.zero; + break; + } + // return Semantics( // container: true, @@ -458,14 +470,24 @@ class _GFButtonState extends State { // enabled: widget.enabled, // child: _InputPadding( // minSize: minSize, -// child: Focus( -// focusNode: widget.focusNode, -// onFocusChange: _handleFocusedChanged, -// autofocus: widget.autofocus, -// child: -// ), +// child: result, // ), // ); + + return Semantics( + container: true, + button: true, + enabled: widget.enabled, + child: _InputPadding( + minSize: minSize, + child: Focus( + focusNode: widget.focusNode, + onFocusChange: _handleFocusedChanged, + autofocus: widget.autofocus, + child: result + ), + ), + ); } } From 459f81b486860658338e58e5e30681d8c2118bfc Mon Sep 17 00:00:00 2001 From: deepikahr Date: Mon, 6 Jan 2020 12:32:51 +0530 Subject: [PATCH 03/13] gfbutton and gf avatar gfsize fixed --- demo_app/lib/screens/home.dart | 499 ++++++++++++++------------- demo_app/test/widget_test.dart | 46 +-- example/lib/main.dart | 254 +------------- lib/components/avatar/gf_avatar.dart | 9 +- lib/components/button/gf_button.dart | 6 +- lib/size/gf_size.dart | 6 +- 6 files changed, 292 insertions(+), 528 deletions(-) diff --git a/demo_app/lib/screens/home.dart b/demo_app/lib/screens/home.dart index 926acdd3..09eec93d 100644 --- a/demo_app/lib/screens/home.dart +++ b/demo_app/lib/screens/home.dart @@ -1,6 +1,6 @@ -import 'package:demo_app/screens/cards.dart'; -import 'package:demo_app/screens/icon-button.dart'; -import 'package:demo_app/screens/list-tiles.dart'; +//import 'package:demo_app/screens/cards.dart'; +//import 'package:demo_app/screens/icon-button.dart'; +//import 'package:demo_app/screens/list-tiles.dart'; import 'package:flutter/material.dart'; import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/card/gf_card.dart'; @@ -73,254 +73,255 @@ class _HomePageState extends State { // ), // ) - body: + body:Text("Dcfs") - Column( - children: [ - Row( - children: [ - Expanded( - child: Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Buttons()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.bubble_chart, - color: getGFColor(GFColor.white)), - Text( - 'Buttons', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - ))), - Expanded( - child: Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Avatars()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.face, color: getGFColor(GFColor.white)), - Text( - 'Avatar', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - )), - ), - Expanded( - child: Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Toggles()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.all_inclusive, - color: getGFColor(GFColor.white)), - Text( - 'Toggle', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - ))) - ], - ), - - Row( - children: [ - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Headers()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.menu, - color: getGFColor(GFColor.white)), - Text( - 'Header', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - )) ), - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Toasts()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.call_to_action, - color: getGFColor(GFColor.white)), - Text( - 'Toast', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - )) ), - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Cards()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.credit_card, - color: getGFColor(GFColor.white)), - Text( - 'Card', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - )) ) - ], - ), +// Column( +// children: [ +// Row( +// children: [ +// Expanded( +// child: Container( +// height: 100, +// child: GestureDetector( +// onTap: () { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (BuildContext context) => Buttons()), +// ); +// }, +// child: GFCard( +// color: getGFColor(GFColor.success), +// content: Column( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Icon(Icons.bubble_chart, +// color: getGFColor(GFColor.white)), +// Text( +// 'Buttons', +// style: TextStyle(color: getGFColor(GFColor.white)), +// ) +// ], +// ), +// ), +// ))), +// Expanded( +// child: Container( +// height: 100, +// child: GestureDetector( +// onTap: () { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (BuildContext context) => Avatars()), +// ); +// }, +// child: GFCard( +// color: getGFColor(GFColor.success), +// content: Column( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Icon(Icons.face, color: getGFColor(GFColor.white)), +// Text( +// 'Avatar', +// style: TextStyle(color: getGFColor(GFColor.white)), +// ) +// ], +// ), +// ), +// )), +// ), +// Expanded( +// child: Container( +// height: 100, +// child: GestureDetector( +// onTap: () { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (BuildContext context) => Toggles()), +// ); +// }, +// child: GFCard( +// color: getGFColor(GFColor.success), +// content: Column( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Icon(Icons.all_inclusive, +// color: getGFColor(GFColor.white)), +// Text( +// 'Toggle', +// style: TextStyle(color: getGFColor(GFColor.white)), +// ) +// ], +// ), +// ), +// ))) +// ], +// ), - Row( - children: [ - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => IconButtons()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.insert_emoticon, - color: getGFColor(GFColor.white)), - Text( - 'Icon Button', - style: TextStyle(color: getGFColor(GFColor.white), fontSize: 12), - ) - ], - ), - ), - )) ), - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => ListTiles()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.list, - color: getGFColor(GFColor.white)), - Text( - 'ListTile', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - )) ), - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Badges()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.apps, - color: getGFColor(GFColor.white)), - Text( - 'Badges', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - )) ) - ], - ) - ], - ), +// Row( +// children: [ +// Expanded(child:Container( +// height: 100, +// child: GestureDetector( +// onTap: () { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (BuildContext context) => Headers()), +// ); +// }, +// child: GFCard( +// color: getGFColor(GFColor.success), +// content: Column( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Icon(Icons.menu, +// color: getGFColor(GFColor.white)), +// Text( +// 'Header', +// style: TextStyle(color: getGFColor(GFColor.white)), +// ) +// ], +// ), +// ), +// )) ), +// Expanded(child:Container( +// height: 100, +// child: GestureDetector( +// onTap: () { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (BuildContext context) => Toasts()), +// ); +// }, +// child: GFCard( +// color: getGFColor(GFColor.success), +// content: Column( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Icon(Icons.call_to_action, +// color: getGFColor(GFColor.white)), +// Text( +// 'Toast', +// style: TextStyle(color: getGFColor(GFColor.white)), +// ) +// ], +// ), +// ), +// )) ), +// Expanded(child:Container( +// height: 100, +// child: GestureDetector( +// onTap: () { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (BuildContext context) => Cards()), +// ); +// }, +// child: GFCard( +// color: getGFColor(GFColor.success), +// content: Column( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Icon(Icons.credit_card, +// color: getGFColor(GFColor.white)), +// Text( +// 'Card', +// style: TextStyle(color: getGFColor(GFColor.white)), +// ) +// ], +// ), +// ), +// )) ) +// ], +// ), +// +// Row( +// children: [ +// Expanded(child:Container( +// height: 100, +// child: GestureDetector( +// onTap: () { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (BuildContext context) => IconButtons()), +// ); +// }, +// child: GFCard( +// color: getGFColor(GFColor.success), +// content: Column( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Icon(Icons.insert_emoticon, +// color: getGFColor(GFColor.white)), +// Text( +// 'Icon Button', +// style: TextStyle(color: getGFColor(GFColor.white), fontSize: 12), +// ) +// ], +// ), +// ), +// )) ), +// Expanded(child:Container( +// height: 100, +// child: GestureDetector( +// onTap: () { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (BuildContext context) => ListTiles()), +// ); +// }, +// child: GFCard( +// color: getGFColor(GFColor.success), +// content: Column( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Icon(Icons.list, +// color: getGFColor(GFColor.white)), +// Text( +// 'ListTile', +// style: TextStyle(color: getGFColor(GFColor.white)), +// ) +// ], +// ), +// ), +// )) ), +// Expanded(child:Container( +// height: 100, +// child: GestureDetector( +// onTap: () { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (BuildContext context) => Badges()), +// ); +// }, +// child: GFCard( +// color: getGFColor(GFColor.success), +// content: Column( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Icon(Icons.apps, +// color: getGFColor(GFColor.white)), +// Text( +// 'Badges', +// style: TextStyle(color: getGFColor(GFColor.white)), +// ) +// ], +// ), +// ), +// )) +// ) +// ], +// ) +// ], +// ), ); } } diff --git a/demo_app/test/widget_test.dart b/demo_app/test/widget_test.dart index 5f343444..98c3ecc4 100644 --- a/demo_app/test/widget_test.dart +++ b/demo_app/test/widget_test.dart @@ -5,26 +5,26 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:demo_app/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} +//import 'package:flutter/material.dart'; +//import 'package:flutter_test/flutter_test.dart'; +// +//import 'package:demo_app/main.dart'; +// +//void main() { +// testWidgets('Counter increments smoke test', (WidgetTester tester) async { +// // Build our app and trigger a frame. +// await tester.pumpWidget(MyApp()); +// +// // Verify that our counter starts at 0. +// expect(find.text('0'), findsOneWidget); +// expect(find.text('1'), findsNothing); +// +// // Tap the '+' icon and trigger a frame. +// await tester.tap(find.byIcon(Icons.add)); +// await tester.pump(); +// +// // Verify that our counter has incremented. +// expect(find.text('0'), findsNothing); +// expect(find.text('1'), findsOneWidget); +// }); +//} diff --git a/example/lib/main.dart b/example/lib/main.dart index 764814b4..f5de158e 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -4,6 +4,7 @@ import 'package:ui_kit/components/badge/gf_button_badge.dart'; import 'package:ui_kit/components/avatar/gf_avatar.dart'; import 'package:ui_kit/components/badge/gf_badge.dart'; import 'package:ui_kit/components/segment_tabs/gf_segment_tabs.dart'; +import 'package:ui_kit/size/gf_size.dart'; import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/shape/gf_button_shape.dart'; import 'package:ui_kit/shape/gf_badge_shape.dart'; @@ -70,7 +71,6 @@ class _MyHomePageState extends State @override Widget build(BuildContext context) { return Scaffold( -<<<<<<< HEAD // drawer: GFDrawer( // colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.6), BlendMode.darken), // backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), @@ -129,72 +129,9 @@ class _MyHomePageState extends State // ], // ), // ), -======= - drawer: GFDrawer( - colorFilter: new ColorFilter.mode( - Colors.black.withOpacity(0.6), BlendMode.darken), - backgroundImage: NetworkImage( - "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), - gradient: LinearGradient( - begin: Alignment.topRight, - end: Alignment.bottomLeft, - stops: [0.1, 0.5, 0.7, 0.9], - colors: [ - Colors.teal[800], - Colors.teal[600], - Colors.teal[400], - Colors.teal[200], - ], - ), - child: ListView( - padding: EdgeInsets.zero, - children: [ - GFDrawerHeader( - currentAccountPicture: GFAvatar( - radius: 80.0, - backgroundImage: NetworkImage( - "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), - ), - decoration: BoxDecoration( - color: Colors.teal.withOpacity(0.45), - ), - otherAccountsPictures: [ - Image( - image: NetworkImage( - "https://cdn.pixabay.com/photo/2019/12/20/00/03/road-4707345_960_720.jpg"), - fit: BoxFit.cover, - ), - GFAvatar( - child: Text("dcf"), - ) - ], - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('user'), - Text('user@asdf.com'), - ], - ), - ), - ListTile( - title: Text('Item 1'), - onTap: () { - Navigator.pop(context); - }, - ), - ListTile( - title: Text('Item 2'), - onTap: () {}, - ), - ], - ), - ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 appBar: GFAppBar( backgroundColor: Colors.tealAccent, centerTitle: true, -<<<<<<< HEAD title: Text("UI KIT"), // GFSegmentTabs( @@ -220,29 +157,6 @@ class _MyHomePageState extends State // ], //// borderRadius: BorderRadius.circular(50.0), // ), -======= - title: GFSegmentTabs( - initialIndex: 0, - length: 3, - tabs: [ - Tab( - child: Text( - "Gelatin", - ), - ), - Tab( - child: Text( - "Donuts", - ), - ), - Tab( - child: Text( - "Pastry", - ), - ), - ], - ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 // trailing: [ // GFIconButton(icon: Icon(Icons.directions_bus), onPressed: null) // ], @@ -254,11 +168,11 @@ class _MyHomePageState extends State // Container(color: Colors.green), // Container(color: Colors.blue) // ]), -<<<<<<< HEAD Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ + GFButton( text: 'goodies', onPressed: () {}, @@ -267,6 +181,9 @@ class _MyHomePageState extends State color: Colors.pink, focusColor: Colors.green, type: GFType.outline, +// size: GFSize.large, +// blockButton: true, +// fullWidthButton: true, ), RawMaterialButton( child: Text('goodies'), @@ -284,7 +201,7 @@ class _MyHomePageState extends State // mainAxisAlignment: MainAxisAlignment.center, // crossAxisAlignment: CrossAxisAlignment.center, // children: [ -//// GFAvatar( +// GFAvatar( // radius: 80.0, // backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), // ), @@ -325,18 +242,6 @@ class _MyHomePageState extends State //// border: Border.all(color: Colors.orange, width: 2.0), //// borderRadius: BorderRadius.circular(50.0) // ), -======= - SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - GFAvatar( - radius: 80.0, - backgroundImage: NetworkImage( - "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), - ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 // GFTabBarView( // controller: tabController, @@ -399,7 +304,6 @@ class _MyHomePageState extends State // }, // ), -<<<<<<< HEAD // GFTabs( // initialIndex: 0, @@ -479,102 +383,6 @@ class _MyHomePageState extends State //// fontFamily: 'OpenSansBold', //// ), // ), -======= - GFButton( -// color: Colors.green, - onPressed: null, - child: Text("share"), - type: GFType.outline, - shape: GFButtonShape.pills, -//textColor: GFColor.danger, -//borderSide: BorderSide(color: Colors.pink, width: 2.0), -// buttonBoxShadow: true, -// boxShadow: BoxShadow( -// color: Colors.pink, -// blurRadius: 1.5, -// spreadRadius: 2.0, -// offset: Offset.zero, -// ), - ), - - GFTabs( - initialIndex: 0, - length: 3, - tabs: [ - GFButton( - onPressed: null, - child: Text("share"), - icon: Icon(Icons.share), - buttonBoxShadow: true, - ), - Tab( - icon: Icon(Icons.error), - child: Text( - "Orders", - ), - ), - Tab( - child: Text( - "Pastry", - ), - ), - ], - tabBarView: GFTabBarView( - children: [ - Container( - color: Colors.red, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - GFToast( - child: Text("sdc"), - backgroundColor: Colors.pink, - button: GFButton( - text: 'dsx', - onPressed: () { - print("fdsc"); - }, - ), - ), - RawMaterialButton( - onPressed: null, - child: Text("fv"), - ), - FlatButton(onPressed: null, child: Text("cds")), - Icon(Icons.directions_railway), - GFButton( - onPressed: null, - child: Text("share"), - icon: Icon(Icons.share), - shape: GFButtonShape.pills, - type: GFType.transparent, - ), - ], - ), - ), - Icon(Icons.directions_car), - Icon(Icons.directions_transit), - ], - ), - indicatorColor: Colors.teal, -// indicatorSize: TabBarIndicatorSize.label, -// labelColor: Colors.lightGreen, -// unselectedLabelColor: Colors.black, -// labelStyle: TextStyle( -// fontWeight: FontWeight.w500, -// fontSize: 13.0, -// color: Colors.deepOrange, -// fontFamily: 'OpenSansBold', -// ), -// unselectedLabelStyle: TextStyle( -// fontWeight: FontWeight.w500, -// fontSize: 13.0, -// color: Colors.black, -// fontFamily: 'OpenSansBold', -// ), - ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 // // GFSlider( // autoPlay: true, @@ -765,7 +573,6 @@ class _MyHomePageState extends State //// //// borderRadius: BorderRadius.circular(20.0), // ), -<<<<<<< HEAD // GFIconBadges( // onPressed: null, // child: GFIconButton( @@ -790,32 +597,6 @@ class _MyHomePageState extends State //// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.orange, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), // ), // ), -======= - // GFIconBadges( - // onPressed: null, - // child: GFIconButton( - // onPressed: null, - // icon: Icon(Icons.ac_unit), - // ), - // counterChild: GFBadge( - // text: '12', - -// color: GFColor.dark -////, -// shape: GFBadgeShape.circle, -// -// size: GFSize.small, -// -// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// -// textColor: GFColor.white, -// -// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -// -// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.orange, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - // ), - // ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 // GFIconButton( // onPressed: null, // icon: Icon(Icons.ac_unit), @@ -834,7 +615,6 @@ class _MyHomePageState extends State //// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), //// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), // ), -<<<<<<< HEAD // GFButtonBadge( // onPressed: null, //// position: GFIconPosition.start, @@ -855,28 +635,6 @@ class _MyHomePageState extends State //// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), // ), // ), -======= - GFButtonBadge( - onPressed: null, -// position: GFIconPosition.start, -// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - text: 'goodies', -// color: GFColor.danger, -// shape: GFButtonShape.pills, - type: GFType.outline, -// size: GFSize.small, - counterChild: GFBadge( - child: Text("12"), -// color: GFColor.dark, - shape: GFBadgeShape.circle, -// size: GFSize.small, -// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// textColor: GFColor.white, -// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), - ), - ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 // GFBadge( // text: '12', //// color: GFColor.dark, diff --git a/lib/components/avatar/gf_avatar.dart b/lib/components/avatar/gf_avatar.dart index 7cd3253b..3de93666 100644 --- a/lib/components/avatar/gf_avatar.dart +++ b/lib/components/avatar/gf_avatar.dart @@ -51,13 +51,16 @@ class GFAvatar extends StatelessWidget { this.maxRadius, this.borderRadius, this.shape = GFAvatarShape.circle, - this.size = GFSize.medium}) + this.size = GFSize.medium + }) : assert(radius == null || (minRadius == null && maxRadius == null)), super(key: key); + double get _minDiameter { + print('sssssssssssssss ${getGFSize(size)}'); if (radius == null && minRadius == null && maxRadius == null) { - return getGFSize(size); + return 1.5 * getGFSize(size); } else { return 2.0 * (radius ?? minRadius ?? 0); } @@ -65,7 +68,7 @@ class GFAvatar extends StatelessWidget { double get _maxDiameter { if (radius == null && minRadius == null && maxRadius == null) { - return getGFSize(size); + return 1.5 * getGFSize(size); } else { return 2.0 * (radius ?? maxRadius ?? 0); } diff --git a/lib/components/button/gf_button.dart b/lib/components/button/gf_button.dart index 764de72b..1891d3a0 100644 --- a/lib/components/button/gf_button.dart +++ b/lib/components/button/gf_button.dart @@ -386,10 +386,12 @@ class _GFButtonState extends State { return null; } + print('ddddddddddddd ${this.size}'); + final Widget result = Container( constraints: this.icon == null - ? BoxConstraints(minHeight: 26.0, minWidth: 88.0) - : BoxConstraints(minHeight: 26.0, minWidth: 98.0), + ? BoxConstraints(minWidth: 88.0) + : BoxConstraints(minWidth: 98.0), decoration: getBoxShadow(), child: Material( textStyle: widget.textStyle == null diff --git a/lib/size/gf_size.dart b/lib/size/gf_size.dart index e254a5f1..6940b91d 100644 --- a/lib/size/gf_size.dart +++ b/lib/size/gf_size.dart @@ -1,8 +1,8 @@ enum GFSize { small, medium, large } -const double SMALL = 35.0; -const double MEDIUM = 50.0; -const double LARGE = 65.0; +const double SMALL = 26.0; +const double MEDIUM = 36.0; +const double LARGE = 46.0; const double BLOCK = 40.0; /// Pass [GFSize] or [double] From 877cbc795cf9bc4b4feaad2c0dd7a4d3b3a5b28e Mon Sep 17 00:00:00 2001 From: deepikahr Date: Mon, 6 Jan 2020 18:05:30 +0530 Subject: [PATCH 04/13] GFButton theme has been completed --- demo_app/lib/screens/cards.dart | 2 +- example/lib/main.dart | 37 +- lib/colors/gf_color.dart | 2 +- lib/components/avatar/gf_avatar.dart | 1 - lib/components/button/gf_button.dart | 816 ++++++++++++++- .../{button_bar => button}/gf_button_bar.dart | 0 lib/components/button/gf_button_theme.dart | 956 ++++++++++++++++++ lib/components/card/gf_card.dart | 2 +- .../gf_segment_tabs.dart | 0 9 files changed, 1752 insertions(+), 64 deletions(-) rename lib/components/{button_bar => button}/gf_button_bar.dart (100%) create mode 100644 lib/components/button/gf_button_theme.dart rename lib/components/{segment_tabs => tabs}/gf_segment_tabs.dart (100%) diff --git a/demo_app/lib/screens/cards.dart b/demo_app/lib/screens/cards.dart index 9b5b449c..48d6f439 100644 --- a/demo_app/lib/screens/cards.dart +++ b/demo_app/lib/screens/cards.dart @@ -5,7 +5,7 @@ import 'package:ui_kit/components/list_tile/gf_list_tile.dart'; import 'package:ui_kit/components/avatar/gf_avatar.dart'; import 'package:ui_kit/position/gf_position.dart'; import 'package:ui_kit/components/button/gf_icon_button.dart'; -import 'package:ui_kit/components/button_bar/gf_button_bar.dart'; +import 'package:ui_kit/components/button/gf_button_bar.dart'; import 'package:ui_kit/components/button/gf_button.dart'; import 'package:ui_kit/types/gf_heading_type.dart'; import 'package:ui_kit/types/gf_type.dart'; diff --git a/example/lib/main.dart b/example/lib/main.dart index f5de158e..b753000f 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,9 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/button/gf_button.dart'; import 'package:ui_kit/components/badge/gf_button_badge.dart'; import 'package:ui_kit/components/avatar/gf_avatar.dart'; import 'package:ui_kit/components/badge/gf_badge.dart'; -import 'package:ui_kit/components/segment_tabs/gf_segment_tabs.dart'; +import 'package:ui_kit/components/tabs/gf_segment_tabs.dart'; import 'package:ui_kit/size/gf_size.dart'; import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/shape/gf_button_shape.dart'; @@ -175,24 +176,30 @@ class _MyHomePageState extends State GFButton( text: 'goodies', - onPressed: () {}, - icon: Icon(Icons.access_alarms), - hoverColor: Colors.orange, - color: Colors.pink, - focusColor: Colors.green, - type: GFType.outline, + onPressed: (){}, +// textColor: GFColor.danger, +// icon: Icon(Icons.access_alarms), +// hoverColor: GFColor.dark, +// color: GFColor.success, +// focusColor: GFColor.danger, + type: GFType.solid, +// splashColor: GFColor.warning, +// highlightColor: GFColor.alt, // size: GFSize.large, +// disabledColor: GFColor.dark, +//disabledTextColor: GFColor.light, // blockButton: true, // fullWidthButton: true, ), - RawMaterialButton( - child: Text('goodies'), - onPressed: () { - print('dddddddddd'); - }, - fillColor: Colors.pink, - hoverColor: Colors.orange, - focusColor: Colors.teal, + + RaisedButton( + child: Text('goodiesMaterialButton button '), + onPressed: (){}, +// color: Colors.blueGrey, +// hoverColor: Colors.blueGrey, +// focusColor: Colors.teal, +// splashColor: Colors.amber, +// highlightColor: Colors.cyan, ), ], ) diff --git a/lib/colors/gf_color.dart b/lib/colors/gf_color.dart index f7a256d2..09efd415 100644 --- a/lib/colors/gf_color.dart +++ b/lib/colors/gf_color.dart @@ -73,7 +73,7 @@ Color getGFColor(dynamic color) { return TRANSPARENT; break; default: - return PRIMARY; + return null; break; } } diff --git a/lib/components/avatar/gf_avatar.dart b/lib/components/avatar/gf_avatar.dart index 3de93666..26cbfcca 100644 --- a/lib/components/avatar/gf_avatar.dart +++ b/lib/components/avatar/gf_avatar.dart @@ -58,7 +58,6 @@ class GFAvatar extends StatelessWidget { double get _minDiameter { - print('sssssssssssssss ${getGFSize(size)}'); if (radius == null && minRadius == null && maxRadius == null) { return 1.5 * getGFSize(size); } else { diff --git a/lib/components/button/gf_button.dart b/lib/components/button/gf_button.dart index 1891d3a0..ffe4ea9a 100644 --- a/lib/components/button/gf_button.dart +++ b/lib/components/button/gf_button.dart @@ -10,6 +10,644 @@ import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/position/gf_position.dart'; import 'package:ui_kit/colors/gf_color.dart'; +class GFButtonTheme extends StatelessWidget { + + const GFButtonTheme({ + this.textTheme = ButtonTextTheme.normal, + this.minWidth = 88.0, + this.height = 36.0, + EdgeInsetsGeometry padding, + ShapeBorder shape, + this.layoutBehavior = ButtonBarLayoutBehavior.padded, + this.alignedDropdown = false, + Color buttonColor, + Color disabledColor, + Color focusColor, + Color hoverColor, + Color highlightColor, + Color splashColor, + this.colorScheme, + MaterialTapTargetSize materialTapTargetSize, + }) : assert(textTheme != null), + assert(minWidth != null && minWidth >= 0.0), + assert(height != null && height >= 0.0), + assert(alignedDropdown != null), + assert(layoutBehavior != null), + _buttonColor = buttonColor, + _disabledColor = disabledColor, + _focusColor = focusColor, + _hoverColor = hoverColor, + _highlightColor = highlightColor, + _splashColor = splashColor, + _padding = padding, + _shape = shape, + _materialTapTargetSize = materialTapTargetSize; + + /// The minimum width for buttons. + /// + /// The actual horizontal space allocated for a button's child is + /// at least this value less the theme's horizontal [padding]. + /// + /// Defaults to 88.0 logical pixels. + final double minWidth; + + /// The minimum height for buttons. + /// + /// Defaults to 36.0 logical pixels. + final double height; + + /// Defines a button's base colors, and the defaults for the button's minimum + /// size, internal padding, and shape. + /// + /// Despite the name, this property is not a [TextTheme], its value is not a + /// collection of [TextStyle]s. + final ButtonTextTheme textTheme; + + /// Defines whether a [ButtonBar] should size itself with a minimum size + /// constraint or with padding. + /// + /// Defaults to [ButtonBarLayoutBehavior.padded]. + final ButtonBarLayoutBehavior layoutBehavior; + + /// Simply a convenience that returns [minWidth] and [height] as a + /// [BoxConstraints] object: + /// + /// ```dart + /// return BoxConstraints( + /// minWidth: minWidth, + /// minHeight: height, + /// ); + /// ``` + BoxConstraints get constraints { + return BoxConstraints( + minWidth: minWidth, + minHeight: height, + ); + } + + /// Padding for a button's child (typically the button's label). + /// + /// Defaults to 24.0 on the left and right if [textTheme] is + /// [ButtonTextTheme.primary], 16.0 on the left and right otherwise. + /// + /// See also: + /// + /// * [getPadding], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + EdgeInsetsGeometry get padding { + if (_padding != null) + return _padding; + switch (textTheme) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return const EdgeInsets.symmetric(horizontal: 16.0); + case ButtonTextTheme.primary: + return const EdgeInsets.symmetric(horizontal: 24.0); + } + assert(false); + return EdgeInsets.zero; + } + final EdgeInsetsGeometry _padding; + + /// The shape of a button's material. + /// + /// The button's highlight and splash are clipped to this shape. If the + /// button has an elevation, then its drop shadow is defined by this + /// shape as well. + /// + /// Defaults to a rounded rectangle with circular corner radii of 4.0 if + /// [textTheme] is [ButtonTextTheme.primary], a rounded rectangle with + /// circular corner radii of 2.0 otherwise. + /// + /// See also: + /// + /// * [getShape], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + ShapeBorder get shape { + if (_shape != null) + return _shape; + switch (textTheme) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(2.0)), + ); + case ButtonTextTheme.primary: + return const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(4.0)), + ); + } + return const RoundedRectangleBorder(); + } + final ShapeBorder _shape; + + /// If true, then a [DropdownButton] menu's width will match the button's + /// width. + /// + /// If false (the default), then the dropdown's menu will be wider than + /// its button. In either case the dropdown button will line up the leading + /// edge of the menu's value with the leading edge of the values + /// displayed by the menu items. + /// + /// This property only affects [DropdownButton] and its menu. + final bool alignedDropdown; + + /// The background fill color for [RaisedButton]s. + /// + /// This property is null by default. + /// + /// If the button is in the focused, hovering, or highlighted state, then the + /// [focusColor], [hoverColor], or [highlightColor] will take precedence over + /// the [focusColor]. + /// + /// See also: + /// + /// * [getFillColor], which is used by [RaisedButton] to compute its + /// background fill color. + final Color _buttonColor; + + /// The background fill color for disabled [RaisedButton]s. + /// + /// This property is null by default. + /// + /// See also: + /// + /// * [getDisabledFillColor], which is used by [RaisedButton] to compute its + /// background fill color. + final Color _disabledColor; + + /// The fill color of the button when it has the input focus. + /// + /// This property is null by default. + /// + /// If the button is in the hovering or highlighted state, then the [hoverColor] + /// or [highlightColor] will take precedence over the [focusColor]. + /// + /// See also: + /// + /// * [getFocusColor], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + final Color _focusColor; + + /// The fill color of the button when a pointer is hovering over it. + /// + /// This property is null by default. + /// + /// If the button is in the highlighted state, then the [highlightColor] will + /// take precedence over the [hoverColor]. + /// + /// See also: + /// + /// * [getHoverColor], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + final Color _hoverColor; + + /// The color of the overlay that appears when a button is pressed. + /// + /// This property is null by default. + /// + /// See also: + /// + /// * [getHighlightColor], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + final Color _highlightColor; + + /// The color of the ink "splash" overlay that appears when a button is tapped. + /// + /// This property is null by default. + /// + /// See also: + /// + /// * [getSplashColor], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + final Color _splashColor; + + /// A set of thirteen colors that can be used to derive the button theme's + /// colors. + /// + /// This property was added much later than the theme's set of highly + /// specific colors, like [ThemeData.buttonColor], [ThemeData.highlightColor], + /// [ThemeData.splashColor] etc. + /// + /// The colors for new button classes can be defined exclusively in terms + /// of [colorScheme]. When it's possible, the existing buttons will + /// (continue to) gradually migrate to it. + final ColorScheme colorScheme; + + // The minimum size of a button's tap target. + // + // This property is null by default. + // + // See also: + // + // * [getMaterialTargetTapSize], which is used by [RaisedButton], + // [OutlineButton] and [FlatButton]. + final MaterialTapTargetSize _materialTapTargetSize; + + /// The [button]'s overall brightness. + /// + /// Returns the button's [MaterialButton.colorBrightness] if it is non-null, + /// otherwise the color scheme's [ColorScheme.brightness] is returned. + Brightness getBrightness(MaterialButton button) { + return button.colorBrightness ?? colorScheme.brightness; + } + + /// Defines the [button]'s base colors, and the defaults for the button's + /// minimum size, internal padding, and shape. + /// + /// Despite the name, this property is not the [TextTheme] whose + /// [TextTheme.button] is used as the button text's [TextStyle]. + ButtonTextTheme getTextTheme(MaterialButton button) { + return button.textTheme ?? textTheme; + } + + /// The foreground color of the [button]'s text and icon when + /// [MaterialButton.onPressed] is null (when MaterialButton.enabled is false). + /// + /// Returns the button's [MaterialButton.disabledColor] if it is non-null. + /// Otherwise the color scheme's [ColorScheme.onSurface] color is returned + /// with its opacity set to 0.38. + /// + /// If [MaterialButton.textColor] is a [MaterialStateProperty], it will be + /// used as the `disabledTextColor`. It will be resolved in the [MaterialState.disabled] state. + Color getDisabledTextColor(MaterialButton button) { + if (button.textColor is MaterialStateProperty) + return button.textColor; + if (button.disabledTextColor != null) + return button.disabledTextColor; + return colorScheme.onSurface.withOpacity(0.38); + } + + /// The [button]'s background color when [MaterialButton.onPressed] is null + /// (when [MaterialButton.enabled] is false). + /// + /// Returns the button's [MaterialButton.disabledColor] if it is non-null. + /// + /// Otherwise the value of the `disabledColor` constructor parameter + /// is returned, if it is non-null. + /// + /// Otherwise the color scheme's [ColorScheme.onSurface] color is returned + /// with its opacity set to 0.38. + Color getDisabledFillColor(MaterialButton button) { + if (button.disabledColor != null) + return button.disabledColor; + if (_disabledColor != null) + return _disabledColor; + return colorScheme.onSurface.withOpacity(0.38); + } + + /// The button's background fill color or null for buttons that don't have + /// a background color. + /// + /// Returns [MaterialButton.color] if it is non-null and the button + /// is enabled. + /// + /// Otherwise, returns [MaterialButton.disabledColor] if it is non-null and + /// the button is disabled. + /// + /// Otherwise, if button is a [FlatButton] or an [OutlineButton] then null is + /// returned. + /// + /// Otherwise, if button is a [RaisedButton], returns the `buttonColor` + /// constructor parameter if it was non-null and the button is enabled. + /// + /// Otherwise the fill color depends on the value of [getTextTheme]. + /// + /// * [ButtonTextTheme.normal] or [ButtonTextTheme.accent], the + /// color scheme's [ColorScheme.primary] color if the [button] is enabled + /// the value of [getDisabledFillColor] otherwise. + /// * [ButtonTextTheme.primary], if the [button] is enabled then the value + /// of the `buttonColor` constructor parameter if it is non-null, + /// otherwise the color scheme's ColorScheme.primary color. If the button + /// is not enabled then the colorScheme's [ColorScheme.onSurface] color + /// with opacity 0.12. + Color getFillColor(MaterialButton button) { + final Color fillColor = button.enabled ? button.color : button.disabledColor; + if (fillColor != null) + return fillColor; + + if (button is FlatButton || button is OutlineButton || button.runtimeType == MaterialButton) + return null; + + if (button.enabled && button is RaisedButton && _buttonColor != null) + return _buttonColor; + + switch (getTextTheme(button)) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return button.enabled ? colorScheme.primary : getDisabledFillColor(button); + case ButtonTextTheme.primary: + return button.enabled + ? _buttonColor ?? colorScheme.primary + : colorScheme.onSurface.withOpacity(0.12); + } + + assert(false); + return null; + } + + /// The foreground color of the [button]'s text and icon. + /// + /// If [button] is not [MaterialButton.enabled], the value of + /// [getDisabledTextColor] is returned. If the button is enabled and + /// [buttonTextColor] is non-null, then [buttonTextColor] is returned. + /// + /// Otherwise the text color depends on the value of [getTextTheme] + /// and [getBrightness]. + /// + /// * [ButtonTextTheme.normal]: [Colors.white] is used if [getBrightness] + /// resolves to [Brightness.dark]. [Colors.black87] is used if + /// [getBrightness] resolves to [Brightness.light]. + /// * [ButtonTextTheme.accent]: [colorScheme.secondary]. + /// * [ButtonTextTheme.primary]: If [getFillColor] is dark then [Colors.white], + /// otherwise if [button] is a [FlatButton] or an [OutlineButton] then + /// [colorScheme.primary], otherwise [Colors.black]. + Color getTextColor(MaterialButton button) { + if (!button.enabled) + return getDisabledTextColor(button); + + if (button.textColor != null) + return button.textColor; + + switch (getTextTheme(button)) { + case ButtonTextTheme.normal: + return getBrightness(button) == Brightness.dark ? Colors.white : Colors.black87; + + case ButtonTextTheme.accent: + return colorScheme.secondary; + + case ButtonTextTheme.primary: + final Color fillColor = getFillColor(button); + final bool fillIsDark = fillColor != null + ? ThemeData.estimateBrightnessForColor(fillColor) == Brightness.dark + : getBrightness(button) == Brightness.dark; + if (fillIsDark) + return Colors.white; + if (button is FlatButton || button is OutlineButton) + return colorScheme.primary; + return Colors.black; + } + + assert(false); + return null; + } + + /// The color of the ink "splash" overlay that appears when the (enabled) + /// [button] is tapped. + /// + /// Returns the button's [MaterialButton.splashColor] if it is non-null. + /// + /// Otherwise, returns the value of the `splashColor` constructor parameter + /// it is non-null and [button] is a [RaisedButton] or an [OutlineButton]. + /// + /// Otherwise, returns the value of the `splashColor` constructor parameter + /// if it is non-null and [button] is a [FlatButton] and + /// [getTextTheme] is not [ButtonTextTheme.primary] + /// + /// Otherwise, returns [getTextColor] with an opacity of 0.12. + Color getSplashColor(MaterialButton button) { + if (button.splashColor != null) + return button.splashColor; + + if (_splashColor != null && (button is RaisedButton || button is OutlineButton)) + return _splashColor; + + if (_splashColor != null && button is FlatButton) { + switch (getTextTheme(button)) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return _splashColor; + case ButtonTextTheme.primary: + break; + } + } + + return getTextColor(button).withOpacity(0.12); + } + + /// The fill color of the button when it has input focus. + /// + /// Returns the button's [MaterialButton.focusColor] if it is non-null. + /// Otherwise the focus color depends on [getTextTheme]: + /// + /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent]: returns the + /// value of the `focusColor` constructor parameter if it is non-null, + /// otherwise the value of [getTextColor] with opacity 0.12. + /// * [ButtonTextTheme.primary], returns [Colors.transparent]. + Color getFocusColor(MaterialButton button) { + return button.focusColor ?? _focusColor ?? getTextColor(button).withOpacity(0.12); + } + + /// The fill color of the button when it has input focus. + /// + /// Returns the button's [MaterialButton.focusColor] if it is non-null. + /// Otherwise the focus color depends on [getTextTheme]: + /// + /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent], + /// [ButtonTextTheme.primary]: returns the value of the `focusColor` + /// constructor parameter if it is non-null, otherwise the value of + /// [getTextColor] with opacity 0.04. + Color getHoverColor(MaterialButton button) { + return button.hoverColor ?? _hoverColor ?? getTextColor(button).withOpacity(0.04); + } + + /// The color of the overlay that appears when the [button] is pressed. + /// + /// Returns the button's [MaterialButton.highlightColor] if it is non-null. + /// Otherwise the highlight color depends on [getTextTheme]: + /// + /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent]: returns the + /// value of the `highlightColor` constructor parameter if it is non-null, + /// otherwise the value of [getTextColor] with opacity 0.16. + /// * [ButtonTextTheme.primary], returns [Colors.transparent]. + Color getHighlightColor(MaterialButton button) { + if (button.highlightColor != null) + return button.highlightColor; + + switch (getTextTheme(button)) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return _highlightColor ?? getTextColor(button).withOpacity(0.16); + case ButtonTextTheme.primary: + return Colors.transparent; + } + + assert(false); + return Colors.transparent; + } + + /// The [button]'s elevation when it is enabled and has not been pressed. + /// + /// Returns the button's [MaterialButton.elevation] if it is non-null. + /// + /// If button is a [FlatButton] then elevation is 0.0, otherwise it is 2.0. + double getElevation(MaterialButton button) { + if (button.elevation != null) + return button.elevation; + if (button is FlatButton) + return 0.0; + return 2.0; + } + + /// The [button]'s elevation when it is enabled and has focus. + /// + /// Returns the button's [MaterialButton.focusElevation] if it is non-null. + /// + /// If button is a [FlatButton] or an [OutlineButton] then the focus + /// elevation is 0.0, otherwise the highlight elevation is 4.0. + double getFocusElevation(MaterialButton button) { + if (button.focusElevation != null) + return button.focusElevation; + if (button is FlatButton) + return 0.0; + if (button is OutlineButton) + return 0.0; + return 4.0; + } + + /// The [button]'s elevation when it is enabled and has focus. + /// + /// Returns the button's [MaterialButton.hoverElevation] if it is non-null. + /// + /// If button is a [FlatButton] or an [OutlineButton] then the hover + /// elevation is 0.0, otherwise the highlight elevation is 4.0. + double getHoverElevation(MaterialButton button) { + if (button.hoverElevation != null) + return button.hoverElevation; + if (button is FlatButton) + return 0.0; + if (button is OutlineButton) + return 0.0; + return 4.0; + } + + /// The [button]'s elevation when it is enabled and has been pressed. + /// + /// Returns the button's [MaterialButton.highlightElevation] if it is non-null. + /// + /// If button is a [FlatButton] or an [OutlineButton] then the highlight + /// elevation is 0.0, otherwise the highlight elevation is 8.0. + double getHighlightElevation(MaterialButton button) { + if (button.highlightElevation != null) + return button.highlightElevation; + if (button is FlatButton) + return 0.0; + if (button is OutlineButton) + return 0.0; + return 8.0; + } + + /// The [button]'s elevation when [MaterialButton.onPressed] is null (when + /// MaterialButton.enabled is false). + /// + /// Returns the button's [MaterialButton.elevation] if it is non-null. + /// + /// Otherwise the disabled elevation is 0.0. + double getDisabledElevation(MaterialButton button) { + if (button.disabledElevation != null) + return button.disabledElevation; + return 0.0; + } + + /// Padding for the [button]'s child (typically the button's label). + /// + /// Returns the button's [MaterialButton.padding] if it is non-null. + /// + /// If this is a button constructed with [RaisedButton.icon] or + /// [FlatButton.icon] or [OutlineButton.icon] then the padding is: + /// `EdgeInsetsDirectional.only(start: 12.0, end: 16.0)`. + /// + /// Otherwise, returns [padding] if it is non-null. + /// + /// Otherwise, returns horizontal padding of 24.0 on the left and right if + /// [getTextTheme] is [ButtonTextTheme.primary], 16.0 on the left and right + /// otherwise. + EdgeInsetsGeometry getPadding(MaterialButton button) { + if (button.padding != null) + return button.padding; + + if (button is MaterialButtonWithIconMixin) + return const EdgeInsetsDirectional.only(start: 12.0, end: 16.0); + + if (_padding != null) + return _padding; + + switch (getTextTheme(button)) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return const EdgeInsets.symmetric(horizontal: 16.0); + case ButtonTextTheme.primary: + return const EdgeInsets.symmetric(horizontal: 24.0); + } + assert(false); + return EdgeInsets.zero; + } + + /// The shape of the [button]'s [Material]. + /// + /// Returns the button's [MaterialButton.shape] if it is non-null, otherwise + /// [shape] is returned. + ShapeBorder getShape(MaterialButton button) { + return button.shape ?? shape; + } + + /// The duration of the [button]'s highlight animation. + /// + /// Returns the button's [MaterialButton.animationDuration] it if is non-null, + /// otherwise 200ms. + Duration getAnimationDuration(MaterialButton button) { + return button.animationDuration ?? kThemeChangeDuration; + } + + /// The [BoxConstraints] that the define the [button]'s size. + /// + /// By default this method just returns [constraints]. Subclasses + /// could override this method to return a value that was, + /// for example, based on the button's type. + BoxConstraints getConstraints(MaterialButton button) => constraints; + + /// The minimum size of the [button]'s tap target. + /// + /// Returns the button's [MaterialButton.tapTargetSize] if it is non-null. + /// + /// Otherwise the value of the [materialTapTargetSize] constructor + /// parameter is returned if that's non-null. + /// + /// Otherwise [MaterialTapTargetSize.padded] is returned. + MaterialTapTargetSize getMaterialTapTargetSize(MaterialButton button) { + return button.materialTapTargetSize ?? _materialTapTargetSize ?? MaterialTapTargetSize.padded; + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData( + buttonTheme: ButtonThemeData( + textTheme: textTheme ?? this.textTheme, + layoutBehavior: layoutBehavior ?? this.layoutBehavior, + minWidth: minWidth ?? this.minWidth, + height: height ?? this.height, + padding: padding ?? this.padding, + shape: shape ?? this.shape, + alignedDropdown: alignedDropdown ?? this.alignedDropdown, + buttonColor: _buttonColor, + disabledColor: _disabledColor, + focusColor: _focusColor, + hoverColor: _hoverColor, + highlightColor: _highlightColor, + splashColor: _splashColor, + colorScheme: colorScheme, + materialTapTargetSize: _materialTapTargetSize, + ) + ), + home: Scaffold( + body: GFButton(), + ), + ); + } +} + class GFButton extends StatefulWidget { /// Called when the button is tapped or otherwise activated. final VoidCallback onPressed; @@ -92,9 +730,35 @@ class GFButton extends StatefulWidget { /// Pass [GFColor] or [Color] final dynamic color; + /// The fill color of the button when the button is disabled. + /// + /// The default value of this color is the theme's disabled color, + /// [ThemeData.disabledColor]. + /// + /// See also: + /// + /// * [color] - the fill color of the button when the button is [enabled]. + final dynamic disabledColor; + /// Pass [GFColor] or [Color] final dynamic textColor; + /// The color to use for this button's text when the button is disabled. + /// + /// The button's [Material.textStyle] will be the current theme's button + /// text style, [ThemeData.textTheme.button], configured with this color. + /// + /// The default value is the theme's disabled color, + /// [ThemeData.disabledColor]. + /// + /// If [textColor] is a [MaterialStateProperty], [disabledTextColor] + /// will be ignored. + /// + /// See also: + /// + /// * [textColor] - The color to use for this button's text when the button is [enabled]. + final dynamic disabledTextColor; + /// size of [double] or [GFSize] i.e, 1.2, small, medium, large etc. final dynamic size; @@ -159,7 +823,7 @@ class GFButton extends StatefulWidget { this.hoverColor, this.highlightColor, this.splashColor, - this.elevation = 2.0, + this.elevation = 0.0, this.focusElevation = 4.0, this.hoverElevation = 4.0, this.highlightElevation = 1.0, @@ -186,11 +850,14 @@ class GFButton extends StatefulWidget { this.fullWidthButton, this.colorScheme, this.enableFeedback, - this.onLongPress}) + this.onLongPress, + this.disabledColor, + this.disabledTextColor, + }) : materialTapTargetSize = materialTapTargetSize ?? MaterialTapTargetSize.padded, assert(shape != null, 'Button shape can not be null'), - assert(elevation != null && elevation >= 0.0), +// assert(elevation != null && elevation >= 0.0), assert(focusElevation != null && focusElevation >= 0.0), assert(hoverElevation != null && hoverElevation >= 0.0), assert(highlightElevation != null && highlightElevation >= 0.0), @@ -207,7 +874,9 @@ class GFButton extends StatefulWidget { class _GFButtonState extends State { Color color; + Color disabledColor; Color textColor; + Color disabledTextColor; Widget child; Widget icon; Function onPressed; @@ -222,11 +891,7 @@ class _GFButtonState extends State { @override void initState() { this.color = getGFColor(widget.color); - this.textColor = widget.type == GFType.outline && widget.textColor == null - ? this.color - : widget.textColor == null - ? getGFColor(GFColor.dark) - : getGFColor(widget.textColor); + this.textColor = getGFColor(widget.textColor); this.child = widget.text != null ? Text(widget.text) : widget.child; this.icon = widget.icon; this.onPressed = widget.onPressed; @@ -234,13 +899,15 @@ class _GFButtonState extends State { this.shape = widget.shape; this.size = getGFSize(widget.size); this.position = widget.position; + this.disabledColor = getGFColor(widget.disabledColor); + this.disabledTextColor = getGFColor(widget.disabledTextColor); _updateState(MaterialState.disabled, !widget.enabled); super.initState(); } bool get _hovered => _states.contains(MaterialState.hovered); - // bool get _focused => _states.contains(MaterialState.focused); + bool get _focused => _states.contains(MaterialState.focused); bool get _pressed => _states.contains(MaterialState.pressed); bool get _disabled => _states.contains(MaterialState.disabled); @@ -277,13 +944,13 @@ class _GFButtonState extends State { } } - // void _handleFocusedChanged(bool value) { - // if (_focused != value) { - // setState(() { - // _updateState(MaterialState.focused, value); - // }); - // } - // } + void _handleFocusedChanged(bool value) { + if (_focused != value) { + setState(() { + _updateState(MaterialState.focused, value); + }); + } + } @override void didUpdateWidget(GFButton oldWidget) { @@ -298,6 +965,25 @@ class _GFButtonState extends State { super.didUpdateWidget(oldWidget); } + double get _effectiveElevation { + // These conditionals are in order of precedence, so be careful about + // reorganizing them. + if (_disabled) { + return widget.disabledElevation; + } + if (_pressed) { + return widget.highlightElevation; + } + if (_hovered) { + return widget.hoverElevation; + } + if (_focused) { + return widget.focusElevation; + } + return widget.elevation; + } + + @override Widget build(BuildContext context) { ShapeBorder shape; @@ -326,12 +1012,52 @@ class _GFButtonState extends State { break; } + Color getDisabledFillColor() { + if (this.disabledColor != null) + return this.disabledColor; + else { + return Theme.of(context).colorScheme.onSurface.withOpacity(0.38); + } + } + + Color getColor() { + if (widget.type == GFType.transparent || widget.type == GFType.outline) + return Colors.transparent; + else{ + final Color fillColor = this.color == null ? getGFColor(GFColor.dark) : this.color; + if (fillColor != null) + return fillColor; + } + } + + Color getDisabledTextColor() { + if (this.disabledColor != null) + return this.disabledTextColor; + else{ + return Theme.of(context).disabledColor; + } + } + + + Color getTextColor() { + + if (widget.type == GFType.outline){ + return widget.enabled ? this.textColor == null ? this.color : this.textColor : getDisabledTextColor(); + } + if (this.textColor == null) { + return getGFColor(GFColor.dark); + } + else{ + return this.textColor; + } + } + final BorderSide shapeBorder = widget.type == GFType.outline ? outlineBorder : widget.borderSide != null ? widget.borderSide : BorderSide( - color: this.color == null ? themeColor : this.color, + color: this.color == null ? themeColor : getColor(), width: 0.0, ); @@ -386,46 +1112,46 @@ class _GFButtonState extends State { return null; } - print('ddddddddddddd ${this.size}'); - final Widget result = Container( constraints: this.icon == null ? BoxConstraints(minWidth: 88.0) : BoxConstraints(minWidth: 98.0), decoration: getBoxShadow(), child: Material( + elevation: _effectiveElevation, textStyle: widget.textStyle == null - ? TextStyle(color: this.textColor, fontSize: 14) + ? TextStyle(color: widget.enabled ? getTextColor() : getDisabledTextColor(), fontSize: 14) : widget.textStyle, shape: widget.type == GFType.transparent ? null : widget.borderShape == null ? shape : widget.borderShape, - color: - widget.type == GFType.transparent || widget.type == GFType.outline - ? Colors.transparent - : this.color, + color: widget.enabled ? getColor() : getDisabledFillColor(), type: this.color == null ? MaterialType.transparency : MaterialType.button, animationDuration: widget.animationDuration, clipBehavior: widget.clipBehavior, child: InkWell( + focusNode: widget.focusNode, + canRequestFocus: widget.enabled, + onFocusChange: _handleFocusedChanged, + autofocus: widget.autofocus, onHighlightChanged: _handleHighlightChanged, + onHover: _handleHoveredChanged, + onTap: widget.onPressed, + onLongPress: widget.onLongPress, + enableFeedback: widget.enableFeedback, splashColor: getGFColor(widget.splashColor), highlightColor: getGFColor(widget.highlightColor), focusColor: getGFColor(widget.focusColor), hoverColor: getGFColor(widget.hoverColor), - onHover: _handleHoveredChanged, - onTap: widget.onPressed, customBorder: widget.type == GFType.transparent ? null : widget.borderShape == null ? shape : widget.borderShape, child: IconTheme.merge( data: IconThemeData(color: effectiveTextColor), child: Container( - height: widget.blockButton == true - ? BLOCK - : widget.fullWidthButton == true ? BLOCK : this.size, + height: this.size, width: buttonWidth(), padding: widget.padding, child: Center( @@ -459,30 +1185,30 @@ class _GFButtonState extends State { ), ); - return Semantics( - container: true, - button: true, - enabled: widget.enabled, - child: _InputPadding( - minSize: minSize, - child: result, - ), - ); - // return Semantics( // container: true, // button: true, // enabled: widget.enabled, // child: _InputPadding( // minSize: minSize, -// child: Focus( -// focusNode: widget.focusNode, -// onFocusChange: _handleFocusedChanged, -// autofocus: widget.autofocus, -// child: -// ), +// child: result, // ), // ); + + return Semantics( + container: true, + button: true, + enabled: widget.enabled, + child: _InputPadding( + minSize: minSize, + child: Focus( + focusNode: widget.focusNode, + onFocusChange: _handleFocusedChanged, + autofocus: widget.autofocus, + child: result + ), + ), + ); } } diff --git a/lib/components/button_bar/gf_button_bar.dart b/lib/components/button/gf_button_bar.dart similarity index 100% rename from lib/components/button_bar/gf_button_bar.dart rename to lib/components/button/gf_button_bar.dart diff --git a/lib/components/button/gf_button_theme.dart b/lib/components/button/gf_button_theme.dart new file mode 100644 index 00000000..2962ef45 --- /dev/null +++ b/lib/components/button/gf_button_theme.dart @@ -0,0 +1,956 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; + +/// Used with [ButtonTheme] and [ButtonThemeData] to define a button's base +/// colors, and the defaults for the button's minimum size, internal padding, +/// and shape. +/// +/// See also: +/// +/// * [RaisedButton], [FlatButton], [OutlineButton], which are configured +/// based on the ambient [ButtonTheme]. +enum ButtonTextTheme { + /// Button text is black or white depending on [ThemeData.brightness]. + normal, + + /// Button text is [ThemeData.accentColor]. + accent, + + /// Button text is based on [ThemeData.primaryColor]. + primary, +} + +/// Used with [ButtonTheme] and [ButtonThemeData] to define how the button bar +/// should size itself with either constraints or internal padding. +enum ButtonBarLayoutBehavior { + /// Button bars will be constrained to a minimum height of 52. + /// + /// This setting is require to create button bars which conform to the + /// material specification. + constrained, + + /// Button bars will calculate their padding from the button theme padding. + padded, +} + +/// Used with [ButtonThemeData] to configure the color and geometry of buttons. +/// +/// A button theme can be specified as part of the overall Material theme +/// using [ThemeData.buttonTheme]. The Material theme's button theme data +/// can be overridden with [ButtonTheme]. +/// +/// The actual appearance of buttons depends on the button theme, the +/// button's enabled state, its elevation (if any), and the overall [Theme]. +/// +/// See also: +/// +/// * [FlatButton] [RaisedButton], and [OutlineButton], which are styled +/// based on the ambient button theme. +/// * [RawMaterialButton], which can be used to configure a button that doesn't +/// depend on any inherited themes. +class ButtonTheme extends InheritedTheme { + /// Creates a button theme. + /// + /// The [textTheme], [minWidth], [height], and [colorScheme] arguments + /// must not be null. + ButtonTheme({ + Key key, + ButtonTextTheme textTheme = ButtonTextTheme.normal, + ButtonBarLayoutBehavior layoutBehavior = ButtonBarLayoutBehavior.padded, + double minWidth = 88.0, + double height = 36.0, + EdgeInsetsGeometry padding, + ShapeBorder shape, + bool alignedDropdown = false, + Color buttonColor, + Color disabledColor, + Color focusColor, + Color hoverColor, + Color highlightColor, + Color splashColor, + ColorScheme colorScheme, + MaterialTapTargetSize materialTapTargetSize, + Widget child, + }) : assert(textTheme != null), + assert(minWidth != null && minWidth >= 0.0), + assert(height != null && height >= 0.0), + assert(alignedDropdown != null), + assert(layoutBehavior != null), + data = ButtonThemeData( + textTheme: textTheme, + minWidth: minWidth, + height: height, + padding: padding, + shape: shape, + alignedDropdown: alignedDropdown, + layoutBehavior: layoutBehavior, + buttonColor: buttonColor, + disabledColor: disabledColor, + focusColor: focusColor, + hoverColor: hoverColor, + highlightColor: highlightColor, + splashColor: splashColor, + colorScheme: colorScheme, + materialTapTargetSize: materialTapTargetSize, + ), + super(key: key, child: child); + + /// Creates a button theme from [data]. + /// + /// The [data] argument must not be null. + const ButtonTheme.fromButtonThemeData({ + Key key, + @required this.data, + Widget child, + }) : assert(data != null), + super(key: key, child: child); + + // TODO(darrenaustin): remove after this deprecation warning has been on + // stable for a couple of releases. + // See https://github.com/flutter/flutter/issues/37333 + // + /// Creates a button theme that is appropriate for button bars, as used in + /// dialog footers and in the headers of data tables. + /// + /// Deprecated. Please use [ButtonBarTheme] instead which offers more + /// flexibility to configure [ButtonBar] widgets. + /// + /// To migrate instances of code that were just wrapping a [ButtonBar]: + /// + /// ```dart + /// ButtonTheme.bar( + /// child: ButtonBar(...) + /// ); + /// ``` + /// + /// you can just remove the `ButtonTheme.bar` as the defaults are now handled + /// by [ButtonBar] directly. + /// + /// If you have more complicated usages of `ButtonTheme.bar` like: + /// + /// ```dart + /// ButtonTheme.bar( + /// padding: EdgeInsets.symmetric(horizontal: 10.0), + /// textTheme: ButtonTextTheme.accent, + /// child: ButtonBar(...), + /// ); + /// ``` + /// + /// you can remove the `ButtonTheme.bar` and move the parameters to the + /// [ButtonBar] instance directly: + /// + /// ```dart + /// ButtonBar( + /// padding: EdgeInsets.symmetric(horizontal: 10.0), + /// textTheme: ButtonTextTheme.accent, + /// ... + /// ); + /// ``` + /// + /// You can also replace the defaults for all [ButtonBar] widgets by updating + /// [ThemeData.buttonBarTheme] for your app. + @Deprecated( + 'Use ButtonBarTheme instead. ' + 'This feature was deprecated after v1.9.1.' + ) + ButtonTheme.bar({ + Key key, + ButtonTextTheme textTheme = ButtonTextTheme.accent, + double minWidth = 64.0, + double height = 36.0, + EdgeInsetsGeometry padding = const EdgeInsets.symmetric(horizontal: 8.0), + ShapeBorder shape, + bool alignedDropdown = false, + Color buttonColor, + Color disabledColor, + Color focusColor, + Color hoverColor, + Color highlightColor, + Color splashColor, + ColorScheme colorScheme, + Widget child, + ButtonBarLayoutBehavior layoutBehavior = ButtonBarLayoutBehavior.padded, + }) : assert(textTheme != null), + assert(minWidth != null && minWidth >= 0.0), + assert(height != null && height >= 0.0), + assert(alignedDropdown != null), + data = ButtonThemeData( + textTheme: textTheme, + minWidth: minWidth, + height: height, + padding: padding, + shape: shape, + alignedDropdown: alignedDropdown, + layoutBehavior: layoutBehavior, + buttonColor: buttonColor, + disabledColor: disabledColor, + focusColor: focusColor, + hoverColor: hoverColor, + highlightColor: highlightColor, + splashColor: splashColor, + colorScheme: colorScheme, + ), + super(key: key, child: child); + + /// Specifies the color and geometry of buttons. + final ButtonThemeData data; + + /// The closest instance of this class that encloses the given context. + /// + /// Typical usage is as follows: + /// + /// ```dart + /// ButtonThemeData theme = ButtonTheme.of(context); + /// ``` + static ButtonThemeData of(BuildContext context) { + final ButtonTheme inheritedButtonTheme = context.dependOnInheritedWidgetOfExactType(); + ButtonThemeData buttonTheme = inheritedButtonTheme?.data; + if (buttonTheme?.colorScheme == null) { // if buttonTheme or buttonTheme.colorScheme is null + final ThemeData theme = Theme.of(context); +// buttonTheme ??= theme.buttonTheme; + if (buttonTheme.colorScheme == null) { + buttonTheme = buttonTheme.copyWith( + colorScheme: theme.buttonTheme.colorScheme ?? theme.colorScheme, + ); + assert(buttonTheme.colorScheme != null); + } + } + return buttonTheme; + } + + @override + Widget wrap(BuildContext context, Widget child) { + final ButtonTheme ancestorTheme = context.findAncestorWidgetOfExactType(); + return identical(this, ancestorTheme) ? child : ButtonTheme.fromButtonThemeData(data: data, child: child); + } + + @override + bool updateShouldNotify(ButtonTheme oldWidget) => data != oldWidget.data; +} + +/// Used with [ButtonTheme] to configure the color and geometry of buttons. +/// +/// A button theme can be specified as part of the overall Material theme +/// using [ThemeData.buttonTheme]. The Material theme's button theme data +/// can be overridden with [ButtonTheme]. +class ButtonThemeData extends Diagnosticable { + /// Create a button theme object that can be used with [ButtonTheme] + /// or [ThemeData]. + /// + /// The [textTheme], [minWidth], [height], [alignedDropDown], and + /// [layoutBehavior] parameters must not be null. The [minWidth] and + /// [height] parameters must greater than or equal to zero. + /// + /// The ButtonTheme's methods that have a [MaterialButton] parameter and + /// have a name with a `get` prefix are used by [RaisedButton], + /// [OutlineButton], and [FlatButton] to configure a [RawMaterialButton]. + const ButtonThemeData({ + this.textTheme = ButtonTextTheme.normal, + this.minWidth = 88.0, + this.height = 36.0, + EdgeInsetsGeometry padding, + ShapeBorder shape, + this.layoutBehavior = ButtonBarLayoutBehavior.padded, + this.alignedDropdown = false, + Color buttonColor, + Color disabledColor, + Color focusColor, + Color hoverColor, + Color highlightColor, + Color splashColor, + this.colorScheme, + MaterialTapTargetSize materialTapTargetSize, + }) : assert(textTheme != null), + assert(minWidth != null && minWidth >= 0.0), + assert(height != null && height >= 0.0), + assert(alignedDropdown != null), + assert(layoutBehavior != null), + _buttonColor = buttonColor, + _disabledColor = disabledColor, + _focusColor = focusColor, + _hoverColor = hoverColor, + _highlightColor = highlightColor, + _splashColor = splashColor, + _padding = padding, + _shape = shape, + _materialTapTargetSize = materialTapTargetSize; + + /// The minimum width for buttons. + /// + /// The actual horizontal space allocated for a button's child is + /// at least this value less the theme's horizontal [padding]. + /// + /// Defaults to 88.0 logical pixels. + final double minWidth; + + /// The minimum height for buttons. + /// + /// Defaults to 36.0 logical pixels. + final double height; + + /// Defines a button's base colors, and the defaults for the button's minimum + /// size, internal padding, and shape. + /// + /// Despite the name, this property is not a [TextTheme], its value is not a + /// collection of [TextStyle]s. + final ButtonTextTheme textTheme; + + /// Defines whether a [ButtonBar] should size itself with a minimum size + /// constraint or with padding. + /// + /// Defaults to [ButtonBarLayoutBehavior.padded]. + final ButtonBarLayoutBehavior layoutBehavior; + + /// Simply a convenience that returns [minWidth] and [height] as a + /// [BoxConstraints] object: + /// + /// ```dart + /// return BoxConstraints( + /// minWidth: minWidth, + /// minHeight: height, + /// ); + /// ``` + BoxConstraints get constraints { + return BoxConstraints( + minWidth: minWidth, + minHeight: height, + ); + } + + /// Padding for a button's child (typically the button's label). + /// + /// Defaults to 24.0 on the left and right if [textTheme] is + /// [ButtonTextTheme.primary], 16.0 on the left and right otherwise. + /// + /// See also: + /// + /// * [getPadding], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + EdgeInsetsGeometry get padding { + if (_padding != null) + return _padding; + switch (textTheme) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return const EdgeInsets.symmetric(horizontal: 16.0); + case ButtonTextTheme.primary: + return const EdgeInsets.symmetric(horizontal: 24.0); + } + assert(false); + return EdgeInsets.zero; + } + final EdgeInsetsGeometry _padding; + + /// The shape of a button's material. + /// + /// The button's highlight and splash are clipped to this shape. If the + /// button has an elevation, then its drop shadow is defined by this + /// shape as well. + /// + /// Defaults to a rounded rectangle with circular corner radii of 4.0 if + /// [textTheme] is [ButtonTextTheme.primary], a rounded rectangle with + /// circular corner radii of 2.0 otherwise. + /// + /// See also: + /// + /// * [getShape], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + ShapeBorder get shape { + if (_shape != null) + return _shape; + switch (textTheme) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(2.0)), + ); + case ButtonTextTheme.primary: + return const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(4.0)), + ); + } + return const RoundedRectangleBorder(); + } + final ShapeBorder _shape; + + /// If true, then a [DropdownButton] menu's width will match the button's + /// width. + /// + /// If false (the default), then the dropdown's menu will be wider than + /// its button. In either case the dropdown button will line up the leading + /// edge of the menu's value with the leading edge of the values + /// displayed by the menu items. + /// + /// This property only affects [DropdownButton] and its menu. + final bool alignedDropdown; + + /// The background fill color for [RaisedButton]s. + /// + /// This property is null by default. + /// + /// If the button is in the focused, hovering, or highlighted state, then the + /// [focusColor], [hoverColor], or [highlightColor] will take precedence over + /// the [focusColor]. + /// + /// See also: + /// + /// * [getFillColor], which is used by [RaisedButton] to compute its + /// background fill color. + final Color _buttonColor; + + /// The background fill color for disabled [RaisedButton]s. + /// + /// This property is null by default. + /// + /// See also: + /// + /// * [getDisabledFillColor], which is used by [RaisedButton] to compute its + /// background fill color. + final Color _disabledColor; + + /// The fill color of the button when it has the input focus. + /// + /// This property is null by default. + /// + /// If the button is in the hovering or highlighted state, then the [hoverColor] + /// or [highlightColor] will take precedence over the [focusColor]. + /// + /// See also: + /// + /// * [getFocusColor], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + final Color _focusColor; + + /// The fill color of the button when a pointer is hovering over it. + /// + /// This property is null by default. + /// + /// If the button is in the highlighted state, then the [highlightColor] will + /// take precedence over the [hoverColor]. + /// + /// See also: + /// + /// * [getHoverColor], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + final Color _hoverColor; + + /// The color of the overlay that appears when a button is pressed. + /// + /// This property is null by default. + /// + /// See also: + /// + /// * [getHighlightColor], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + final Color _highlightColor; + + /// The color of the ink "splash" overlay that appears when a button is tapped. + /// + /// This property is null by default. + /// + /// See also: + /// + /// * [getSplashColor], which is used by [RaisedButton], [OutlineButton] + /// and [FlatButton]. + final Color _splashColor; + + /// A set of thirteen colors that can be used to derive the button theme's + /// colors. + /// + /// This property was added much later than the theme's set of highly + /// specific colors, like [ThemeData.buttonColor], [ThemeData.highlightColor], + /// [ThemeData.splashColor] etc. + /// + /// The colors for new button classes can be defined exclusively in terms + /// of [colorScheme]. When it's possible, the existing buttons will + /// (continue to) gradually migrate to it. + final ColorScheme colorScheme; + + // The minimum size of a button's tap target. + // + // This property is null by default. + // + // See also: + // + // * [getMaterialTargetTapSize], which is used by [RaisedButton], + // [OutlineButton] and [FlatButton]. + final MaterialTapTargetSize _materialTapTargetSize; + + /// The [button]'s overall brightness. + /// + /// Returns the button's [MaterialButton.colorBrightness] if it is non-null, + /// otherwise the color scheme's [ColorScheme.brightness] is returned. + Brightness getBrightness(MaterialButton button) { + return button.colorBrightness ?? colorScheme.brightness; + } + + /// Defines the [button]'s base colors, and the defaults for the button's + /// minimum size, internal padding, and shape. + /// + /// Despite the name, this property is not the [TextTheme] whose + /// [TextTheme.button] is used as the button text's [TextStyle]. + ButtonTextTheme getTextTheme(MaterialButton button) { + return button.textTheme ?? textTheme; + } + + /// The foreground color of the [button]'s text and icon when + /// [MaterialButton.onPressed] is null (when MaterialButton.enabled is false). + /// + /// Returns the button's [MaterialButton.disabledColor] if it is non-null. + /// Otherwise the color scheme's [ColorScheme.onSurface] color is returned + /// with its opacity set to 0.38. + /// + /// If [MaterialButton.textColor] is a [MaterialStateProperty], it will be + /// used as the `disabledTextColor`. It will be resolved in the [MaterialState.disabled] state. + Color getDisabledTextColor(MaterialButton button) { + if (button.textColor is MaterialStateProperty) + return button.textColor; + if (button.disabledTextColor != null) + return button.disabledTextColor; + return colorScheme.onSurface.withOpacity(0.38); + } + + /// The [button]'s background color when [MaterialButton.onPressed] is null + /// (when [MaterialButton.enabled] is false). + /// + /// Returns the button's [MaterialButton.disabledColor] if it is non-null. + /// + /// Otherwise the value of the `disabledColor` constructor parameter + /// is returned, if it is non-null. + /// + /// Otherwise the color scheme's [ColorScheme.onSurface] color is returned + /// with its opacity set to 0.38. + Color getDisabledFillColor(MaterialButton button) { + if (button.disabledColor != null) + return button.disabledColor; + if (_disabledColor != null) + return _disabledColor; + return colorScheme.onSurface.withOpacity(0.38); + } + + /// The button's background fill color or null for buttons that don't have + /// a background color. + /// + /// Returns [MaterialButton.color] if it is non-null and the button + /// is enabled. + /// + /// Otherwise, returns [MaterialButton.disabledColor] if it is non-null and + /// the button is disabled. + /// + /// Otherwise, if button is a [FlatButton] or an [OutlineButton] then null is + /// returned. + /// + /// Otherwise, if button is a [RaisedButton], returns the `buttonColor` + /// constructor parameter if it was non-null and the button is enabled. + /// + /// Otherwise the fill color depends on the value of [getTextTheme]. + /// + /// * [ButtonTextTheme.normal] or [ButtonTextTheme.accent], the + /// color scheme's [ColorScheme.primary] color if the [button] is enabled + /// the value of [getDisabledFillColor] otherwise. + /// * [ButtonTextTheme.primary], if the [button] is enabled then the value + /// of the `buttonColor` constructor parameter if it is non-null, + /// otherwise the color scheme's ColorScheme.primary color. If the button + /// is not enabled then the colorScheme's [ColorScheme.onSurface] color + /// with opacity 0.12. + Color getFillColor(MaterialButton button) { + final Color fillColor = button.enabled ? button.color : button.disabledColor; + if (fillColor != null) + return fillColor; + + if (button is FlatButton || button is OutlineButton || button.runtimeType == MaterialButton) + return null; + + if (button.enabled && button is RaisedButton && _buttonColor != null) + return _buttonColor; + + switch (getTextTheme(button)) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return button.enabled ? colorScheme.primary : getDisabledFillColor(button); + case ButtonTextTheme.primary: + return button.enabled + ? _buttonColor ?? colorScheme.primary + : colorScheme.onSurface.withOpacity(0.12); + } + + assert(false); + return null; + } + + /// The foreground color of the [button]'s text and icon. + /// + /// If [button] is not [MaterialButton.enabled], the value of + /// [getDisabledTextColor] is returned. If the button is enabled and + /// [buttonTextColor] is non-null, then [buttonTextColor] is returned. + /// + /// Otherwise the text color depends on the value of [getTextTheme] + /// and [getBrightness]. + /// + /// * [ButtonTextTheme.normal]: [Colors.white] is used if [getBrightness] + /// resolves to [Brightness.dark]. [Colors.black87] is used if + /// [getBrightness] resolves to [Brightness.light]. + /// * [ButtonTextTheme.accent]: [colorScheme.secondary]. + /// * [ButtonTextTheme.primary]: If [getFillColor] is dark then [Colors.white], + /// otherwise if [button] is a [FlatButton] or an [OutlineButton] then + /// [colorScheme.primary], otherwise [Colors.black]. + Color getTextColor(MaterialButton button) { + if (!button.enabled) + return getDisabledTextColor(button); + + if (button.textColor != null) + return button.textColor; + + switch (getTextTheme(button)) { + case ButtonTextTheme.normal: + return getBrightness(button) == Brightness.dark ? Colors.white : Colors.black87; + + case ButtonTextTheme.accent: + return colorScheme.secondary; + + case ButtonTextTheme.primary: + final Color fillColor = getFillColor(button); + final bool fillIsDark = fillColor != null + ? ThemeData.estimateBrightnessForColor(fillColor) == Brightness.dark + : getBrightness(button) == Brightness.dark; + if (fillIsDark) + return Colors.white; + if (button is FlatButton || button is OutlineButton) + return colorScheme.primary; + return Colors.black; + } + + assert(false); + return null; + } + + /// The color of the ink "splash" overlay that appears when the (enabled) + /// [button] is tapped. + /// + /// Returns the button's [MaterialButton.splashColor] if it is non-null. + /// + /// Otherwise, returns the value of the `splashColor` constructor parameter + /// it is non-null and [button] is a [RaisedButton] or an [OutlineButton]. + /// + /// Otherwise, returns the value of the `splashColor` constructor parameter + /// if it is non-null and [button] is a [FlatButton] and + /// [getTextTheme] is not [ButtonTextTheme.primary] + /// + /// Otherwise, returns [getTextColor] with an opacity of 0.12. + Color getSplashColor(MaterialButton button) { + if (button.splashColor != null) + return button.splashColor; + + if (_splashColor != null && (button is RaisedButton || button is OutlineButton)) + return _splashColor; + + if (_splashColor != null && button is FlatButton) { + switch (getTextTheme(button)) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return _splashColor; + case ButtonTextTheme.primary: + break; + } + } + + return getTextColor(button).withOpacity(0.12); + } + + /// The fill color of the button when it has input focus. + /// + /// Returns the button's [MaterialButton.focusColor] if it is non-null. + /// Otherwise the focus color depends on [getTextTheme]: + /// + /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent]: returns the + /// value of the `focusColor` constructor parameter if it is non-null, + /// otherwise the value of [getTextColor] with opacity 0.12. + /// * [ButtonTextTheme.primary], returns [Colors.transparent]. + Color getFocusColor(MaterialButton button) { + return button.focusColor ?? _focusColor ?? getTextColor(button).withOpacity(0.12); + } + + /// The fill color of the button when it has input focus. + /// + /// Returns the button's [MaterialButton.focusColor] if it is non-null. + /// Otherwise the focus color depends on [getTextTheme]: + /// + /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent], + /// [ButtonTextTheme.primary]: returns the value of the `focusColor` + /// constructor parameter if it is non-null, otherwise the value of + /// [getTextColor] with opacity 0.04. + Color getHoverColor(MaterialButton button) { + return button.hoverColor ?? _hoverColor ?? getTextColor(button).withOpacity(0.04); + } + + /// The color of the overlay that appears when the [button] is pressed. + /// + /// Returns the button's [MaterialButton.highlightColor] if it is non-null. + /// Otherwise the highlight color depends on [getTextTheme]: + /// + /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent]: returns the + /// value of the `highlightColor` constructor parameter if it is non-null, + /// otherwise the value of [getTextColor] with opacity 0.16. + /// * [ButtonTextTheme.primary], returns [Colors.transparent]. + Color getHighlightColor(MaterialButton button) { + if (button.highlightColor != null) + return button.highlightColor; + + switch (getTextTheme(button)) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return _highlightColor ?? getTextColor(button).withOpacity(0.16); + case ButtonTextTheme.primary: + return Colors.transparent; + } + + assert(false); + return Colors.transparent; + } + + /// The [button]'s elevation when it is enabled and has not been pressed. + /// + /// Returns the button's [MaterialButton.elevation] if it is non-null. + /// + /// If button is a [FlatButton] then elevation is 0.0, otherwise it is 2.0. + double getElevation(MaterialButton button) { + if (button.elevation != null) + return button.elevation; + if (button is FlatButton) + return 0.0; + return 2.0; + } + + /// The [button]'s elevation when it is enabled and has focus. + /// + /// Returns the button's [MaterialButton.focusElevation] if it is non-null. + /// + /// If button is a [FlatButton] or an [OutlineButton] then the focus + /// elevation is 0.0, otherwise the highlight elevation is 4.0. + double getFocusElevation(MaterialButton button) { + if (button.focusElevation != null) + return button.focusElevation; + if (button is FlatButton) + return 0.0; + if (button is OutlineButton) + return 0.0; + return 4.0; + } + + /// The [button]'s elevation when it is enabled and has focus. + /// + /// Returns the button's [MaterialButton.hoverElevation] if it is non-null. + /// + /// If button is a [FlatButton] or an [OutlineButton] then the hover + /// elevation is 0.0, otherwise the highlight elevation is 4.0. + double getHoverElevation(MaterialButton button) { + if (button.hoverElevation != null) + return button.hoverElevation; + if (button is FlatButton) + return 0.0; + if (button is OutlineButton) + return 0.0; + return 4.0; + } + + /// The [button]'s elevation when it is enabled and has been pressed. + /// + /// Returns the button's [MaterialButton.highlightElevation] if it is non-null. + /// + /// If button is a [FlatButton] or an [OutlineButton] then the highlight + /// elevation is 0.0, otherwise the highlight elevation is 8.0. + double getHighlightElevation(MaterialButton button) { + if (button.highlightElevation != null) + return button.highlightElevation; + if (button is FlatButton) + return 0.0; + if (button is OutlineButton) + return 0.0; + return 8.0; + } + + /// The [button]'s elevation when [MaterialButton.onPressed] is null (when + /// MaterialButton.enabled is false). + /// + /// Returns the button's [MaterialButton.elevation] if it is non-null. + /// + /// Otherwise the disabled elevation is 0.0. + double getDisabledElevation(MaterialButton button) { + if (button.disabledElevation != null) + return button.disabledElevation; + return 0.0; + } + + /// Padding for the [button]'s child (typically the button's label). + /// + /// Returns the button's [MaterialButton.padding] if it is non-null. + /// + /// If this is a button constructed with [RaisedButton.icon] or + /// [FlatButton.icon] or [OutlineButton.icon] then the padding is: + /// `EdgeInsetsDirectional.only(start: 12.0, end: 16.0)`. + /// + /// Otherwise, returns [padding] if it is non-null. + /// + /// Otherwise, returns horizontal padding of 24.0 on the left and right if + /// [getTextTheme] is [ButtonTextTheme.primary], 16.0 on the left and right + /// otherwise. + EdgeInsetsGeometry getPadding(MaterialButton button) { + if (button.padding != null) + return button.padding; + + if (button is MaterialButtonWithIconMixin) + return const EdgeInsetsDirectional.only(start: 12.0, end: 16.0); + + if (_padding != null) + return _padding; + + switch (getTextTheme(button)) { + case ButtonTextTheme.normal: + case ButtonTextTheme.accent: + return const EdgeInsets.symmetric(horizontal: 16.0); + case ButtonTextTheme.primary: + return const EdgeInsets.symmetric(horizontal: 24.0); + } + assert(false); + return EdgeInsets.zero; + } + + /// The shape of the [button]'s [Material]. + /// + /// Returns the button's [MaterialButton.shape] if it is non-null, otherwise + /// [shape] is returned. + ShapeBorder getShape(MaterialButton button) { + return button.shape ?? shape; + } + + /// The duration of the [button]'s highlight animation. + /// + /// Returns the button's [MaterialButton.animationDuration] it if is non-null, + /// otherwise 200ms. + Duration getAnimationDuration(MaterialButton button) { + return button.animationDuration ?? kThemeChangeDuration; + } + + /// The [BoxConstraints] that the define the [button]'s size. + /// + /// By default this method just returns [constraints]. Subclasses + /// could override this method to return a value that was, + /// for example, based on the button's type. + BoxConstraints getConstraints(MaterialButton button) => constraints; + + /// The minimum size of the [button]'s tap target. + /// + /// Returns the button's [MaterialButton.tapTargetSize] if it is non-null. + /// + /// Otherwise the value of the [materialTapTargetSize] constructor + /// parameter is returned if that's non-null. + /// + /// Otherwise [MaterialTapTargetSize.padded] is returned. + MaterialTapTargetSize getMaterialTapTargetSize(MaterialButton button) { + return button.materialTapTargetSize ?? _materialTapTargetSize ?? MaterialTapTargetSize.padded; + } + + /// Creates a copy of this button theme data object with the matching fields + /// replaced with the non-null parameter values. + ButtonThemeData copyWith({ + ButtonTextTheme textTheme, + ButtonBarLayoutBehavior layoutBehavior, + double minWidth, + double height, + EdgeInsetsGeometry padding, + ShapeBorder shape, + bool alignedDropdown, + Color buttonColor, + Color disabledColor, + Color focusColor, + Color hoverColor, + Color highlightColor, + Color splashColor, + ColorScheme colorScheme, + MaterialTapTargetSize materialTapTargetSize, + }) { + return ButtonThemeData( + textTheme: textTheme ?? this.textTheme, + layoutBehavior: layoutBehavior ?? this.layoutBehavior, + minWidth: minWidth ?? this.minWidth, + height: height ?? this.height, + padding: padding ?? this.padding, + shape: shape ?? this.shape, + alignedDropdown: alignedDropdown ?? this.alignedDropdown, + buttonColor: buttonColor ?? _buttonColor, + disabledColor: disabledColor ?? _disabledColor, + focusColor: focusColor ?? _focusColor, + hoverColor: hoverColor ?? _hoverColor, + highlightColor: highlightColor ?? _highlightColor, + splashColor: splashColor ?? _splashColor, + colorScheme: colorScheme ?? this.colorScheme, + materialTapTargetSize: materialTapTargetSize ?? _materialTapTargetSize, + ); + } + + @override + bool operator ==(dynamic other) { + if (other.runtimeType != runtimeType) + return false; + final ButtonThemeData typedOther = other; + return textTheme == typedOther.textTheme + && minWidth == typedOther.minWidth + && height == typedOther.height + && padding == typedOther.padding + && shape == typedOther.shape + && alignedDropdown == typedOther.alignedDropdown + && _buttonColor == typedOther._buttonColor + && _disabledColor == typedOther._disabledColor + && _focusColor == typedOther._focusColor + && _hoverColor == typedOther._hoverColor + && _highlightColor == typedOther._highlightColor + && _splashColor == typedOther._splashColor + && colorScheme == typedOther.colorScheme + && _materialTapTargetSize == typedOther._materialTapTargetSize; + } + + @override + int get hashCode { + return hashValues( + textTheme, + minWidth, + height, + padding, + shape, + alignedDropdown, + _buttonColor, + _disabledColor, + _focusColor, + _hoverColor, + _highlightColor, + _splashColor, + colorScheme, + _materialTapTargetSize, + ); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + const ButtonThemeData defaultTheme = ButtonThemeData(); + properties.add(EnumProperty('textTheme', textTheme, defaultValue: defaultTheme.textTheme)); + properties.add(DoubleProperty('minWidth', minWidth, defaultValue: defaultTheme.minWidth)); + properties.add(DoubleProperty('height', height, defaultValue: defaultTheme.height)); + properties.add(DiagnosticsProperty('padding', padding, defaultValue: defaultTheme.padding)); + properties.add(DiagnosticsProperty('shape', shape, defaultValue: defaultTheme.shape)); + properties.add(FlagProperty('alignedDropdown', + value: alignedDropdown, + defaultValue: defaultTheme.alignedDropdown, + ifTrue: 'dropdown width matches button', + )); + properties.add(ColorProperty('buttonColor', _buttonColor, defaultValue: null)); + properties.add(ColorProperty('disabledColor', _disabledColor, defaultValue: null)); + properties.add(ColorProperty('focusColor', _focusColor, defaultValue: null)); + properties.add(ColorProperty('hoverColor', _hoverColor, defaultValue: null)); + properties.add(ColorProperty('highlightColor', _highlightColor, defaultValue: null)); + properties.add(ColorProperty('splashColor', _splashColor, defaultValue: null)); + properties.add(DiagnosticsProperty('colorScheme', colorScheme, defaultValue: defaultTheme.colorScheme)); + properties.add(DiagnosticsProperty('materialTapTargetSize', _materialTapTargetSize, defaultValue: null)); + } +} diff --git a/lib/components/card/gf_card.dart b/lib/components/card/gf_card.dart index a99df63d..320c9013 100644 --- a/lib/components/card/gf_card.dart +++ b/lib/components/card/gf_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:ui_kit/components/button_bar/gf_button_bar.dart'; +import 'package:ui_kit/components/button/gf_button_bar.dart'; import 'package:ui_kit/components/list_tile/gf_list_tile.dart'; import 'package:ui_kit/components/image/gf_image_overlay.dart'; import 'package:ui_kit/position/gf_position.dart'; diff --git a/lib/components/segment_tabs/gf_segment_tabs.dart b/lib/components/tabs/gf_segment_tabs.dart similarity index 100% rename from lib/components/segment_tabs/gf_segment_tabs.dart rename to lib/components/tabs/gf_segment_tabs.dart From af7d37fe908e636dcbd924fd5c3f6b7d1b628b11 Mon Sep 17 00:00:00 2001 From: deepikahr Date: Tue, 7 Jan 2020 12:03:48 +0530 Subject: [PATCH 05/13] GFButton changes done --- example/lib/main.dart | 29 +- lib/colors/gf_color.dart | 18 +- lib/components/button/gf_button.dart | 759 +++------------------- lib/components/button/gf_icon_button.dart | 24 +- lib/size/gf_size.dart | 8 +- lib/types/gf_type.dart | 2 +- 6 files changed, 129 insertions(+), 711 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index b753000f..57c87785 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -16,6 +16,7 @@ import 'package:ui_kit/components/drawer/gf_drawer_header.dart'; import 'package:ui_kit/components/toast/gf_toast.dart'; import 'package:ui_kit/components/appbar/gf_appbar.dart'; import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; +import 'package:ui_kit/components/button/gf_icon_button.dart'; final List imageList = [ "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg", @@ -180,18 +181,38 @@ class _MyHomePageState extends State // textColor: GFColor.danger, // icon: Icon(Icons.access_alarms), // hoverColor: GFColor.dark, -// color: GFColor.success, + color: GFColor.secondary, // focusColor: GFColor.danger, - type: GFType.solid, + type: GFType.outline2x, + shape: GFButtonShape.pills, // splashColor: GFColor.warning, // highlightColor: GFColor.alt, // size: GFSize.large, // disabledColor: GFColor.dark, -//disabledTextColor: GFColor.light, -// blockButton: true, +// disabledTextColor: GFColor.light, + blockButton: true, // fullWidthButton: true, ), + GFIconButton( + onPressed: null, + icon: Icon(Icons.ac_unit), +// iconSize: 12.0, + type: GFType.outline2x, +// shape: GFButtonShape.pills, +// size: GFSize.large, +// buttonBoxShadow: true, +// color: GFColor.primary, +// boxShadow: BoxShadow( +// color: Colors.pink, +// blurRadius: 2.0, +// spreadRadius: 1.0, +// offset: Offset.zero, +// ), +// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), + ), + RaisedButton( child: Text('goodiesMaterialButton button '), onPressed: (){}, diff --git a/lib/colors/gf_color.dart b/lib/colors/gf_color.dart index 09efd415..149d5e6c 100644 --- a/lib/colors/gf_color.dart +++ b/lib/colors/gf_color.dart @@ -17,17 +17,17 @@ enum GFColor { } -const PRIMARY = Color(0xff3f6ad8); -const SECONDARY = Color(0xff6c757c); -const SUCCESS =Color(0xff3ac47c); -const INFO = Color(0xff13aaff); -const WARNING = Color(0xfff7b825); -const DANGER = Color(0xffd92550); +const PRIMARY = Color(0xff3880FF); +const SECONDARY = Color(0xffAA66CC); +const SUCCESS =Color(0xff10DC60); +const INFO = Color(0xff33B5E5); +const WARNING = Color(0xffFFBB33); +const DANGER = Color(0xffF04141); +const LIGHT = Color(0xffE0E0E0); +const DARK = Color(0xff222428); +const WHITE = Color(0xffffffff); const FOCUS = Color(0xff434054); const ALT = Color(0xff794c8a); -const LIGHT = Color(0xffededed); -const DARK = Color(0xff333a40); -const WHITE = Color(0xffffffff); const TRANSPARENT = Colors.transparent; /// Pass [GFColor] or [Color] diff --git a/lib/components/button/gf_button.dart b/lib/components/button/gf_button.dart index ffe4ea9a..da0be74c 100644 --- a/lib/components/button/gf_button.dart +++ b/lib/components/button/gf_button.dart @@ -10,644 +10,6 @@ import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/position/gf_position.dart'; import 'package:ui_kit/colors/gf_color.dart'; -class GFButtonTheme extends StatelessWidget { - - const GFButtonTheme({ - this.textTheme = ButtonTextTheme.normal, - this.minWidth = 88.0, - this.height = 36.0, - EdgeInsetsGeometry padding, - ShapeBorder shape, - this.layoutBehavior = ButtonBarLayoutBehavior.padded, - this.alignedDropdown = false, - Color buttonColor, - Color disabledColor, - Color focusColor, - Color hoverColor, - Color highlightColor, - Color splashColor, - this.colorScheme, - MaterialTapTargetSize materialTapTargetSize, - }) : assert(textTheme != null), - assert(minWidth != null && minWidth >= 0.0), - assert(height != null && height >= 0.0), - assert(alignedDropdown != null), - assert(layoutBehavior != null), - _buttonColor = buttonColor, - _disabledColor = disabledColor, - _focusColor = focusColor, - _hoverColor = hoverColor, - _highlightColor = highlightColor, - _splashColor = splashColor, - _padding = padding, - _shape = shape, - _materialTapTargetSize = materialTapTargetSize; - - /// The minimum width for buttons. - /// - /// The actual horizontal space allocated for a button's child is - /// at least this value less the theme's horizontal [padding]. - /// - /// Defaults to 88.0 logical pixels. - final double minWidth; - - /// The minimum height for buttons. - /// - /// Defaults to 36.0 logical pixels. - final double height; - - /// Defines a button's base colors, and the defaults for the button's minimum - /// size, internal padding, and shape. - /// - /// Despite the name, this property is not a [TextTheme], its value is not a - /// collection of [TextStyle]s. - final ButtonTextTheme textTheme; - - /// Defines whether a [ButtonBar] should size itself with a minimum size - /// constraint or with padding. - /// - /// Defaults to [ButtonBarLayoutBehavior.padded]. - final ButtonBarLayoutBehavior layoutBehavior; - - /// Simply a convenience that returns [minWidth] and [height] as a - /// [BoxConstraints] object: - /// - /// ```dart - /// return BoxConstraints( - /// minWidth: minWidth, - /// minHeight: height, - /// ); - /// ``` - BoxConstraints get constraints { - return BoxConstraints( - minWidth: minWidth, - minHeight: height, - ); - } - - /// Padding for a button's child (typically the button's label). - /// - /// Defaults to 24.0 on the left and right if [textTheme] is - /// [ButtonTextTheme.primary], 16.0 on the left and right otherwise. - /// - /// See also: - /// - /// * [getPadding], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - EdgeInsetsGeometry get padding { - if (_padding != null) - return _padding; - switch (textTheme) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return const EdgeInsets.symmetric(horizontal: 16.0); - case ButtonTextTheme.primary: - return const EdgeInsets.symmetric(horizontal: 24.0); - } - assert(false); - return EdgeInsets.zero; - } - final EdgeInsetsGeometry _padding; - - /// The shape of a button's material. - /// - /// The button's highlight and splash are clipped to this shape. If the - /// button has an elevation, then its drop shadow is defined by this - /// shape as well. - /// - /// Defaults to a rounded rectangle with circular corner radii of 4.0 if - /// [textTheme] is [ButtonTextTheme.primary], a rounded rectangle with - /// circular corner radii of 2.0 otherwise. - /// - /// See also: - /// - /// * [getShape], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - ShapeBorder get shape { - if (_shape != null) - return _shape; - switch (textTheme) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(2.0)), - ); - case ButtonTextTheme.primary: - return const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(4.0)), - ); - } - return const RoundedRectangleBorder(); - } - final ShapeBorder _shape; - - /// If true, then a [DropdownButton] menu's width will match the button's - /// width. - /// - /// If false (the default), then the dropdown's menu will be wider than - /// its button. In either case the dropdown button will line up the leading - /// edge of the menu's value with the leading edge of the values - /// displayed by the menu items. - /// - /// This property only affects [DropdownButton] and its menu. - final bool alignedDropdown; - - /// The background fill color for [RaisedButton]s. - /// - /// This property is null by default. - /// - /// If the button is in the focused, hovering, or highlighted state, then the - /// [focusColor], [hoverColor], or [highlightColor] will take precedence over - /// the [focusColor]. - /// - /// See also: - /// - /// * [getFillColor], which is used by [RaisedButton] to compute its - /// background fill color. - final Color _buttonColor; - - /// The background fill color for disabled [RaisedButton]s. - /// - /// This property is null by default. - /// - /// See also: - /// - /// * [getDisabledFillColor], which is used by [RaisedButton] to compute its - /// background fill color. - final Color _disabledColor; - - /// The fill color of the button when it has the input focus. - /// - /// This property is null by default. - /// - /// If the button is in the hovering or highlighted state, then the [hoverColor] - /// or [highlightColor] will take precedence over the [focusColor]. - /// - /// See also: - /// - /// * [getFocusColor], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - final Color _focusColor; - - /// The fill color of the button when a pointer is hovering over it. - /// - /// This property is null by default. - /// - /// If the button is in the highlighted state, then the [highlightColor] will - /// take precedence over the [hoverColor]. - /// - /// See also: - /// - /// * [getHoverColor], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - final Color _hoverColor; - - /// The color of the overlay that appears when a button is pressed. - /// - /// This property is null by default. - /// - /// See also: - /// - /// * [getHighlightColor], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - final Color _highlightColor; - - /// The color of the ink "splash" overlay that appears when a button is tapped. - /// - /// This property is null by default. - /// - /// See also: - /// - /// * [getSplashColor], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - final Color _splashColor; - - /// A set of thirteen colors that can be used to derive the button theme's - /// colors. - /// - /// This property was added much later than the theme's set of highly - /// specific colors, like [ThemeData.buttonColor], [ThemeData.highlightColor], - /// [ThemeData.splashColor] etc. - /// - /// The colors for new button classes can be defined exclusively in terms - /// of [colorScheme]. When it's possible, the existing buttons will - /// (continue to) gradually migrate to it. - final ColorScheme colorScheme; - - // The minimum size of a button's tap target. - // - // This property is null by default. - // - // See also: - // - // * [getMaterialTargetTapSize], which is used by [RaisedButton], - // [OutlineButton] and [FlatButton]. - final MaterialTapTargetSize _materialTapTargetSize; - - /// The [button]'s overall brightness. - /// - /// Returns the button's [MaterialButton.colorBrightness] if it is non-null, - /// otherwise the color scheme's [ColorScheme.brightness] is returned. - Brightness getBrightness(MaterialButton button) { - return button.colorBrightness ?? colorScheme.brightness; - } - - /// Defines the [button]'s base colors, and the defaults for the button's - /// minimum size, internal padding, and shape. - /// - /// Despite the name, this property is not the [TextTheme] whose - /// [TextTheme.button] is used as the button text's [TextStyle]. - ButtonTextTheme getTextTheme(MaterialButton button) { - return button.textTheme ?? textTheme; - } - - /// The foreground color of the [button]'s text and icon when - /// [MaterialButton.onPressed] is null (when MaterialButton.enabled is false). - /// - /// Returns the button's [MaterialButton.disabledColor] if it is non-null. - /// Otherwise the color scheme's [ColorScheme.onSurface] color is returned - /// with its opacity set to 0.38. - /// - /// If [MaterialButton.textColor] is a [MaterialStateProperty], it will be - /// used as the `disabledTextColor`. It will be resolved in the [MaterialState.disabled] state. - Color getDisabledTextColor(MaterialButton button) { - if (button.textColor is MaterialStateProperty) - return button.textColor; - if (button.disabledTextColor != null) - return button.disabledTextColor; - return colorScheme.onSurface.withOpacity(0.38); - } - - /// The [button]'s background color when [MaterialButton.onPressed] is null - /// (when [MaterialButton.enabled] is false). - /// - /// Returns the button's [MaterialButton.disabledColor] if it is non-null. - /// - /// Otherwise the value of the `disabledColor` constructor parameter - /// is returned, if it is non-null. - /// - /// Otherwise the color scheme's [ColorScheme.onSurface] color is returned - /// with its opacity set to 0.38. - Color getDisabledFillColor(MaterialButton button) { - if (button.disabledColor != null) - return button.disabledColor; - if (_disabledColor != null) - return _disabledColor; - return colorScheme.onSurface.withOpacity(0.38); - } - - /// The button's background fill color or null for buttons that don't have - /// a background color. - /// - /// Returns [MaterialButton.color] if it is non-null and the button - /// is enabled. - /// - /// Otherwise, returns [MaterialButton.disabledColor] if it is non-null and - /// the button is disabled. - /// - /// Otherwise, if button is a [FlatButton] or an [OutlineButton] then null is - /// returned. - /// - /// Otherwise, if button is a [RaisedButton], returns the `buttonColor` - /// constructor parameter if it was non-null and the button is enabled. - /// - /// Otherwise the fill color depends on the value of [getTextTheme]. - /// - /// * [ButtonTextTheme.normal] or [ButtonTextTheme.accent], the - /// color scheme's [ColorScheme.primary] color if the [button] is enabled - /// the value of [getDisabledFillColor] otherwise. - /// * [ButtonTextTheme.primary], if the [button] is enabled then the value - /// of the `buttonColor` constructor parameter if it is non-null, - /// otherwise the color scheme's ColorScheme.primary color. If the button - /// is not enabled then the colorScheme's [ColorScheme.onSurface] color - /// with opacity 0.12. - Color getFillColor(MaterialButton button) { - final Color fillColor = button.enabled ? button.color : button.disabledColor; - if (fillColor != null) - return fillColor; - - if (button is FlatButton || button is OutlineButton || button.runtimeType == MaterialButton) - return null; - - if (button.enabled && button is RaisedButton && _buttonColor != null) - return _buttonColor; - - switch (getTextTheme(button)) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return button.enabled ? colorScheme.primary : getDisabledFillColor(button); - case ButtonTextTheme.primary: - return button.enabled - ? _buttonColor ?? colorScheme.primary - : colorScheme.onSurface.withOpacity(0.12); - } - - assert(false); - return null; - } - - /// The foreground color of the [button]'s text and icon. - /// - /// If [button] is not [MaterialButton.enabled], the value of - /// [getDisabledTextColor] is returned. If the button is enabled and - /// [buttonTextColor] is non-null, then [buttonTextColor] is returned. - /// - /// Otherwise the text color depends on the value of [getTextTheme] - /// and [getBrightness]. - /// - /// * [ButtonTextTheme.normal]: [Colors.white] is used if [getBrightness] - /// resolves to [Brightness.dark]. [Colors.black87] is used if - /// [getBrightness] resolves to [Brightness.light]. - /// * [ButtonTextTheme.accent]: [colorScheme.secondary]. - /// * [ButtonTextTheme.primary]: If [getFillColor] is dark then [Colors.white], - /// otherwise if [button] is a [FlatButton] or an [OutlineButton] then - /// [colorScheme.primary], otherwise [Colors.black]. - Color getTextColor(MaterialButton button) { - if (!button.enabled) - return getDisabledTextColor(button); - - if (button.textColor != null) - return button.textColor; - - switch (getTextTheme(button)) { - case ButtonTextTheme.normal: - return getBrightness(button) == Brightness.dark ? Colors.white : Colors.black87; - - case ButtonTextTheme.accent: - return colorScheme.secondary; - - case ButtonTextTheme.primary: - final Color fillColor = getFillColor(button); - final bool fillIsDark = fillColor != null - ? ThemeData.estimateBrightnessForColor(fillColor) == Brightness.dark - : getBrightness(button) == Brightness.dark; - if (fillIsDark) - return Colors.white; - if (button is FlatButton || button is OutlineButton) - return colorScheme.primary; - return Colors.black; - } - - assert(false); - return null; - } - - /// The color of the ink "splash" overlay that appears when the (enabled) - /// [button] is tapped. - /// - /// Returns the button's [MaterialButton.splashColor] if it is non-null. - /// - /// Otherwise, returns the value of the `splashColor` constructor parameter - /// it is non-null and [button] is a [RaisedButton] or an [OutlineButton]. - /// - /// Otherwise, returns the value of the `splashColor` constructor parameter - /// if it is non-null and [button] is a [FlatButton] and - /// [getTextTheme] is not [ButtonTextTheme.primary] - /// - /// Otherwise, returns [getTextColor] with an opacity of 0.12. - Color getSplashColor(MaterialButton button) { - if (button.splashColor != null) - return button.splashColor; - - if (_splashColor != null && (button is RaisedButton || button is OutlineButton)) - return _splashColor; - - if (_splashColor != null && button is FlatButton) { - switch (getTextTheme(button)) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return _splashColor; - case ButtonTextTheme.primary: - break; - } - } - - return getTextColor(button).withOpacity(0.12); - } - - /// The fill color of the button when it has input focus. - /// - /// Returns the button's [MaterialButton.focusColor] if it is non-null. - /// Otherwise the focus color depends on [getTextTheme]: - /// - /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent]: returns the - /// value of the `focusColor` constructor parameter if it is non-null, - /// otherwise the value of [getTextColor] with opacity 0.12. - /// * [ButtonTextTheme.primary], returns [Colors.transparent]. - Color getFocusColor(MaterialButton button) { - return button.focusColor ?? _focusColor ?? getTextColor(button).withOpacity(0.12); - } - - /// The fill color of the button when it has input focus. - /// - /// Returns the button's [MaterialButton.focusColor] if it is non-null. - /// Otherwise the focus color depends on [getTextTheme]: - /// - /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent], - /// [ButtonTextTheme.primary]: returns the value of the `focusColor` - /// constructor parameter if it is non-null, otherwise the value of - /// [getTextColor] with opacity 0.04. - Color getHoverColor(MaterialButton button) { - return button.hoverColor ?? _hoverColor ?? getTextColor(button).withOpacity(0.04); - } - - /// The color of the overlay that appears when the [button] is pressed. - /// - /// Returns the button's [MaterialButton.highlightColor] if it is non-null. - /// Otherwise the highlight color depends on [getTextTheme]: - /// - /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent]: returns the - /// value of the `highlightColor` constructor parameter if it is non-null, - /// otherwise the value of [getTextColor] with opacity 0.16. - /// * [ButtonTextTheme.primary], returns [Colors.transparent]. - Color getHighlightColor(MaterialButton button) { - if (button.highlightColor != null) - return button.highlightColor; - - switch (getTextTheme(button)) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return _highlightColor ?? getTextColor(button).withOpacity(0.16); - case ButtonTextTheme.primary: - return Colors.transparent; - } - - assert(false); - return Colors.transparent; - } - - /// The [button]'s elevation when it is enabled and has not been pressed. - /// - /// Returns the button's [MaterialButton.elevation] if it is non-null. - /// - /// If button is a [FlatButton] then elevation is 0.0, otherwise it is 2.0. - double getElevation(MaterialButton button) { - if (button.elevation != null) - return button.elevation; - if (button is FlatButton) - return 0.0; - return 2.0; - } - - /// The [button]'s elevation when it is enabled and has focus. - /// - /// Returns the button's [MaterialButton.focusElevation] if it is non-null. - /// - /// If button is a [FlatButton] or an [OutlineButton] then the focus - /// elevation is 0.0, otherwise the highlight elevation is 4.0. - double getFocusElevation(MaterialButton button) { - if (button.focusElevation != null) - return button.focusElevation; - if (button is FlatButton) - return 0.0; - if (button is OutlineButton) - return 0.0; - return 4.0; - } - - /// The [button]'s elevation when it is enabled and has focus. - /// - /// Returns the button's [MaterialButton.hoverElevation] if it is non-null. - /// - /// If button is a [FlatButton] or an [OutlineButton] then the hover - /// elevation is 0.0, otherwise the highlight elevation is 4.0. - double getHoverElevation(MaterialButton button) { - if (button.hoverElevation != null) - return button.hoverElevation; - if (button is FlatButton) - return 0.0; - if (button is OutlineButton) - return 0.0; - return 4.0; - } - - /// The [button]'s elevation when it is enabled and has been pressed. - /// - /// Returns the button's [MaterialButton.highlightElevation] if it is non-null. - /// - /// If button is a [FlatButton] or an [OutlineButton] then the highlight - /// elevation is 0.0, otherwise the highlight elevation is 8.0. - double getHighlightElevation(MaterialButton button) { - if (button.highlightElevation != null) - return button.highlightElevation; - if (button is FlatButton) - return 0.0; - if (button is OutlineButton) - return 0.0; - return 8.0; - } - - /// The [button]'s elevation when [MaterialButton.onPressed] is null (when - /// MaterialButton.enabled is false). - /// - /// Returns the button's [MaterialButton.elevation] if it is non-null. - /// - /// Otherwise the disabled elevation is 0.0. - double getDisabledElevation(MaterialButton button) { - if (button.disabledElevation != null) - return button.disabledElevation; - return 0.0; - } - - /// Padding for the [button]'s child (typically the button's label). - /// - /// Returns the button's [MaterialButton.padding] if it is non-null. - /// - /// If this is a button constructed with [RaisedButton.icon] or - /// [FlatButton.icon] or [OutlineButton.icon] then the padding is: - /// `EdgeInsetsDirectional.only(start: 12.0, end: 16.0)`. - /// - /// Otherwise, returns [padding] if it is non-null. - /// - /// Otherwise, returns horizontal padding of 24.0 on the left and right if - /// [getTextTheme] is [ButtonTextTheme.primary], 16.0 on the left and right - /// otherwise. - EdgeInsetsGeometry getPadding(MaterialButton button) { - if (button.padding != null) - return button.padding; - - if (button is MaterialButtonWithIconMixin) - return const EdgeInsetsDirectional.only(start: 12.0, end: 16.0); - - if (_padding != null) - return _padding; - - switch (getTextTheme(button)) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return const EdgeInsets.symmetric(horizontal: 16.0); - case ButtonTextTheme.primary: - return const EdgeInsets.symmetric(horizontal: 24.0); - } - assert(false); - return EdgeInsets.zero; - } - - /// The shape of the [button]'s [Material]. - /// - /// Returns the button's [MaterialButton.shape] if it is non-null, otherwise - /// [shape] is returned. - ShapeBorder getShape(MaterialButton button) { - return button.shape ?? shape; - } - - /// The duration of the [button]'s highlight animation. - /// - /// Returns the button's [MaterialButton.animationDuration] it if is non-null, - /// otherwise 200ms. - Duration getAnimationDuration(MaterialButton button) { - return button.animationDuration ?? kThemeChangeDuration; - } - - /// The [BoxConstraints] that the define the [button]'s size. - /// - /// By default this method just returns [constraints]. Subclasses - /// could override this method to return a value that was, - /// for example, based on the button's type. - BoxConstraints getConstraints(MaterialButton button) => constraints; - - /// The minimum size of the [button]'s tap target. - /// - /// Returns the button's [MaterialButton.tapTargetSize] if it is non-null. - /// - /// Otherwise the value of the [materialTapTargetSize] constructor - /// parameter is returned if that's non-null. - /// - /// Otherwise [MaterialTapTargetSize.padded] is returned. - MaterialTapTargetSize getMaterialTapTargetSize(MaterialButton button) { - return button.materialTapTargetSize ?? _materialTapTargetSize ?? MaterialTapTargetSize.padded; - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - debugShowCheckedModeBanner: false, - theme: ThemeData( - buttonTheme: ButtonThemeData( - textTheme: textTheme ?? this.textTheme, - layoutBehavior: layoutBehavior ?? this.layoutBehavior, - minWidth: minWidth ?? this.minWidth, - height: height ?? this.height, - padding: padding ?? this.padding, - shape: shape ?? this.shape, - alignedDropdown: alignedDropdown ?? this.alignedDropdown, - buttonColor: _buttonColor, - disabledColor: _disabledColor, - focusColor: _focusColor, - hoverColor: _hoverColor, - highlightColor: _highlightColor, - splashColor: _splashColor, - colorScheme: colorScheme, - materialTapTargetSize: _materialTapTargetSize, - ) - ), - home: Scaffold( - body: GFButton(), - ), - ); - } -} - class GFButton extends StatefulWidget { /// Called when the button is tapped or otherwise activated. final VoidCallback onPressed; @@ -721,7 +83,7 @@ class GFButton extends StatefulWidget { /// {@macro flutter.widgets.Clip} final Clip clipBehavior; - /// Button type of [GFType] i.e, solid, outline, dashed + /// Button type of [GFType] i.e, solid, outline, outline2x, transparent final GFType type; /// Button type of [GFButtonShape] i.e, standard, pills, square, shadow, icons @@ -988,76 +350,102 @@ class _GFButtonState extends State { Widget build(BuildContext context) { ShapeBorder shape; - final Color effectiveTextColor = MaterialStateProperty.resolveAs( - widget.textStyle?.color, _states); - final Color themeColor = - Theme.of(context).colorScheme.onSurface.withOpacity(0.12); - final BorderSide outlineBorder = BorderSide( - color: this.color == null - ? themeColor - : widget.borderSide == null ? this.color : widget.borderSide.color, - width: widget.borderSide?.width ?? 1.0, - ); - - Size minSize; - switch (widget.materialTapTargetSize) { - case MaterialTapTargetSize.padded: - minSize = const Size(48.0, 48.0); - break; - case MaterialTapTargetSize.shrinkWrap: - minSize = Size.zero; - break; - default: - minSize = Size.zero; - break; + Color getBorderColor() { + if(widget.enabled){ + final Color fillColor = this.color == null ? getGFColor(GFColor.primary) : this.color; + if (fillColor != null) + return fillColor; + }else{ + if (this.disabledColor != null) + return this.disabledColor; + else { + return this.color.withOpacity(0.48); + } + } } Color getDisabledFillColor() { + if (widget.type == GFType.transparent || widget.type == GFType.outline || widget.type == GFType.outline2x) + return Colors.transparent; if (this.disabledColor != null) return this.disabledColor; else { - return Theme.of(context).colorScheme.onSurface.withOpacity(0.38); + return this.color.withOpacity(0.48); } } Color getColor() { - if (widget.type == GFType.transparent || widget.type == GFType.outline) + if (widget.type == GFType.transparent || widget.type == GFType.outline || widget.type == GFType.outline2x) return Colors.transparent; else{ - final Color fillColor = this.color == null ? getGFColor(GFColor.dark) : this.color; + final Color fillColor = this.color == null ? getGFColor(GFColor.primary) : this.color; if (fillColor != null) return fillColor; } } Color getDisabledTextColor() { - if (this.disabledColor != null) + + if (this.disabledTextColor != null) return this.disabledTextColor; - else{ - return Theme.of(context).disabledColor; + else if (widget.type == GFType.outline || widget.type == GFType.outline2x || widget.type == GFType.transparent){ + return this.color; + }else{ + return getGFColor(GFColor.dark); } } Color getTextColor() { - if (widget.type == GFType.outline){ - return widget.enabled ? this.textColor == null ? this.color : this.textColor : getDisabledTextColor(); + if (widget.type == GFType.outline || widget.type == GFType.outline2x || widget.type == GFType.transparent){ + return widget.enabled ? this.textColor == null ? + this.color == getGFColor(GFColor.transparent) ? getGFColor(GFColor.dark) : this.color : this.textColor : getDisabledTextColor(); } - if (this.textColor == null) { + if (this.textColor == null) { + if(this.color == getGFColor(GFColor.transparent)){ return getGFColor(GFColor.dark); + }else { + return getGFColor(GFColor.white); } - else{ - return this.textColor; - } + } + else{ + return this.textColor; + } + } + + final Color effectiveTextColor = MaterialStateProperty.resolveAs( + widget.textStyle?.color, _states); + final Color themeColor = + Theme.of(context).colorScheme.onSurface.withOpacity(0.12); + final BorderSide outlineBorder = BorderSide( + color: this.color == null + ? themeColor + : widget.borderSide == null ? getBorderColor() : widget.borderSide.color, + width: widget.borderSide?.width ?? widget.type == GFType.outline2x ? 2.0 : 1.0, + ); + + Size minSize; + switch (widget.materialTapTargetSize) { + case MaterialTapTargetSize.padded: + minSize = const Size(48.0, 48.0); + break; + case MaterialTapTargetSize.shrinkWrap: + minSize = Size.zero; + break; + default: + minSize = Size.zero; + break; } - final BorderSide shapeBorder = widget.type == GFType.outline + + + final BorderSide shapeBorder = widget.type == GFType.outline || widget.type == GFType.outline2x ? outlineBorder : widget.borderSide != null ? widget.borderSide : BorderSide( - color: this.color == null ? themeColor : getColor(), + color: this.color == null ? themeColor : getBorderColor(), width: 0.0, ); @@ -1069,7 +457,7 @@ class _GFButtonState extends State { borderRadius: BorderRadius.circular(0.0), side: shapeBorder); } else if (this.shape == GFButtonShape.standard) { shape = RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0), side: shapeBorder); + borderRadius: BorderRadius.circular(3.0), side: shapeBorder); } else { shape = RoundedRectangleBorder( borderRadius: BorderRadius.circular(50.0), side: shapeBorder); @@ -1082,7 +470,7 @@ class _GFButtonState extends State { } else { return BoxDecoration( color: widget.type == GFType.transparent || - widget.type == GFType.outline + widget.type == GFType.outline || widget.type == GFType.outline2x ? Colors.transparent : this.color, borderRadius: widget.shape == GFButtonShape.pills @@ -1112,15 +500,26 @@ class _GFButtonState extends State { return null; } + getTextStyle(){ + if(widget.size == GFSize.small){ + return TextStyle(color: widget.enabled ? getTextColor() : getDisabledTextColor(), fontSize: 12); + }else if(widget.size == GFSize.medium){ + return TextStyle(color: widget.enabled ? getTextColor() : getDisabledTextColor(), fontSize: 13, fontWeight: FontWeight.w400); + } + else if(widget.size == GFSize.large){ + return TextStyle(color: widget.enabled ? getTextColor() : getDisabledTextColor(), fontSize: 14, fontWeight: FontWeight.w500); + } + } + final Widget result = Container( constraints: this.icon == null - ? BoxConstraints(minWidth: 88.0) - : BoxConstraints(minWidth: 98.0), + ? BoxConstraints(minWidth: 80.0) + : BoxConstraints(minWidth: 90.0), decoration: getBoxShadow(), child: Material( elevation: _effectiveElevation, textStyle: widget.textStyle == null - ? TextStyle(color: widget.enabled ? getTextColor() : getDisabledTextColor(), fontSize: 14) + ? getTextStyle() : widget.textStyle, shape: widget.type == GFType.transparent ? null diff --git a/lib/components/button/gf_icon_button.dart b/lib/components/button/gf_icon_button.dart index 573b68a6..6e272be1 100644 --- a/lib/components/button/gf_icon_button.dart +++ b/lib/components/button/gf_icon_button.dart @@ -134,6 +134,8 @@ class _GFIconButtonState extends State { else currentColor = widget.disabledColor ?? Theme.of(context).disabledColor; + + final Color themeColor = Theme.of(context).colorScheme.onSurface.withOpacity(0.12); final BorderSide outlineBorder = BorderSide( @@ -167,21 +169,17 @@ class _GFIconButtonState extends State { } if (widget.size == GFSize.small) { - this.height = 36.0; - this.width = 36.0; - this.iconPixel = 24.0; + this.height = 30.0; + this.width = 30.0; + this.iconPixel = 18.0; } else if (widget.size == GFSize.medium) { - this.height = 44.0; - this.width = 44.0; - this.iconPixel = 24.0; + this.height = 35.0; + this.width = 35.0; + this.iconPixel = 18.0; } else if (widget.size == GFSize.large) { - this.height = 50.0; - this.width = 50.0; - this.iconPixel = 28.0; - } else { - this.height = 44.0; - this.width = 44.0; - this.iconPixel = 24.0; + this.height = 40.0; + this.width = 40.0; + this.iconPixel = 18.0; } Widget result = Container( diff --git a/lib/size/gf_size.dart b/lib/size/gf_size.dart index 6940b91d..f5d36f1c 100644 --- a/lib/size/gf_size.dart +++ b/lib/size/gf_size.dart @@ -1,9 +1,9 @@ enum GFSize { small, medium, large } -const double SMALL = 26.0; -const double MEDIUM = 36.0; -const double LARGE = 46.0; -const double BLOCK = 40.0; +const double SMALL = 30.0; +const double MEDIUM = 35.0; +const double LARGE = 40.0; +//const double BLOCK = 40.0; /// Pass [GFSize] or [double] double getGFSize(dynamic size) { diff --git a/lib/types/gf_type.dart b/lib/types/gf_type.dart index 4c81df0d..1a40249c 100644 --- a/lib/types/gf_type.dart +++ b/lib/types/gf_type.dart @@ -1 +1 @@ -enum GFType { solid, outline, transparent } +enum GFType { solid, outline, outline2x, transparent } From 059fb87c7d12268cd51b70fe69fa68ebd0e6eb5d Mon Sep 17 00:00:00 2001 From: "Shravya.ckm" Date: Tue, 7 Jan 2020 12:08:54 +0530 Subject: [PATCH 06/13] changed in gf-list-tile , buttons-demo in progress --- demo_app/lib/assets/icons/avatar.png | Bin 0 -> 793 bytes demo_app/lib/assets/icons/back.png | Bin 0 -> 690 bytes demo_app/lib/assets/icons/badge.png | Bin 0 -> 687 bytes demo_app/lib/assets/icons/buttons.png | Bin 0 -> 909 bytes demo_app/lib/assets/icons/buttons.svg | 1 + demo_app/lib/assets/icons/card.png | Bin 0 -> 424 bytes demo_app/lib/assets/icons/chips.png | Bin 0 -> 1194 bytes demo_app/lib/assets/icons/danger.svg | 12 + demo_app/lib/assets/icons/dark.svg | 11 + demo_app/lib/assets/icons/dribble.svg | 6 + demo_app/lib/assets/icons/fb.svg | 6 + demo_app/lib/assets/icons/google.svg | 6 + demo_app/lib/assets/icons/info.svg | 12 + demo_app/lib/assets/icons/items.png | Bin 0 -> 967 bytes demo_app/lib/assets/icons/light.svg | 11 + demo_app/lib/assets/icons/link.svg | 17 + demo_app/lib/assets/icons/linkedin.svg | 6 + demo_app/lib/assets/icons/lists.png | Bin 0 -> 638 bytes demo_app/lib/assets/icons/menu.png | Bin 0 -> 373 bytes demo_app/lib/assets/icons/next.png | Bin 0 -> 708 bytes demo_app/lib/assets/icons/pinterest.svg | 6 + demo_app/lib/assets/icons/primary.svg | 19 + demo_app/lib/assets/icons/secondary.svg | 17 + demo_app/lib/assets/icons/slack.svg | 6 + demo_app/lib/assets/icons/slider.png | Bin 0 -> 922 bytes demo_app/lib/assets/icons/success.svg | 11 + demo_app/lib/assets/icons/tabs.png | Bin 0 -> 581 bytes demo_app/lib/assets/icons/toast.png | Bin 0 -> 643 bytes demo_app/lib/assets/icons/toggle.png | Bin 0 -> 998 bytes demo_app/lib/assets/icons/twitter.svg | 6 + demo_app/lib/assets/icons/typo.png | Bin 0 -> 719 bytes demo_app/lib/assets/icons/warning.svg | 10 + demo_app/lib/assets/icons/whatsapp.svg | 6 + demo_app/lib/assets/icons/youtube.svg | 6 + demo_app/lib/assets/logo/logo.png | Bin 0 -> 2841 bytes demo_app/lib/screens/button/button-types.dart | 237 +++ demo_app/lib/screens/button/icon-buttons.dart | 781 +++++++++ demo_app/lib/screens/button/pill-buttons.dart | 681 ++++++++ .../lib/screens/button/shadow-buttons.dart | 793 +++++++++ .../lib/screens/button/social-buttons.dart | 337 ++++ .../lib/screens/button/square-buttons.dart | 681 ++++++++ .../standard-buttons.dart} | 619 +++---- demo_app/lib/screens/home.dart | 828 ++++++--- demo_app/pubspec.lock | 22 + demo_app/pubspec.yaml | 51 +- example/lib/main.dart | 1548 ++++++++--------- lib/components/list_tile/gf_list_tile.dart | 61 +- lib/size/gf_size.dart | 6 +- 48 files changed, 5377 insertions(+), 1443 deletions(-) create mode 100644 demo_app/lib/assets/icons/avatar.png create mode 100644 demo_app/lib/assets/icons/back.png create mode 100644 demo_app/lib/assets/icons/badge.png create mode 100644 demo_app/lib/assets/icons/buttons.png create mode 100644 demo_app/lib/assets/icons/buttons.svg create mode 100644 demo_app/lib/assets/icons/card.png create mode 100644 demo_app/lib/assets/icons/chips.png create mode 100644 demo_app/lib/assets/icons/danger.svg create mode 100644 demo_app/lib/assets/icons/dark.svg create mode 100644 demo_app/lib/assets/icons/dribble.svg create mode 100644 demo_app/lib/assets/icons/fb.svg create mode 100644 demo_app/lib/assets/icons/google.svg create mode 100644 demo_app/lib/assets/icons/info.svg create mode 100644 demo_app/lib/assets/icons/items.png create mode 100644 demo_app/lib/assets/icons/light.svg create mode 100644 demo_app/lib/assets/icons/link.svg create mode 100644 demo_app/lib/assets/icons/linkedin.svg create mode 100644 demo_app/lib/assets/icons/lists.png create mode 100644 demo_app/lib/assets/icons/menu.png create mode 100644 demo_app/lib/assets/icons/next.png create mode 100644 demo_app/lib/assets/icons/pinterest.svg create mode 100644 demo_app/lib/assets/icons/primary.svg create mode 100644 demo_app/lib/assets/icons/secondary.svg create mode 100644 demo_app/lib/assets/icons/slack.svg create mode 100644 demo_app/lib/assets/icons/slider.png create mode 100644 demo_app/lib/assets/icons/success.svg create mode 100644 demo_app/lib/assets/icons/tabs.png create mode 100644 demo_app/lib/assets/icons/toast.png create mode 100644 demo_app/lib/assets/icons/toggle.png create mode 100644 demo_app/lib/assets/icons/twitter.svg create mode 100644 demo_app/lib/assets/icons/typo.png create mode 100644 demo_app/lib/assets/icons/warning.svg create mode 100644 demo_app/lib/assets/icons/whatsapp.svg create mode 100644 demo_app/lib/assets/icons/youtube.svg create mode 100644 demo_app/lib/assets/logo/logo.png create mode 100644 demo_app/lib/screens/button/button-types.dart create mode 100644 demo_app/lib/screens/button/icon-buttons.dart create mode 100644 demo_app/lib/screens/button/pill-buttons.dart create mode 100644 demo_app/lib/screens/button/shadow-buttons.dart create mode 100644 demo_app/lib/screens/button/social-buttons.dart create mode 100644 demo_app/lib/screens/button/square-buttons.dart rename demo_app/lib/screens/{buttons.dart => button/standard-buttons.dart} (60%) diff --git a/demo_app/lib/assets/icons/avatar.png b/demo_app/lib/assets/icons/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..685ad1a33fb89afebf2bca791ff0a6df0545dcb0 GIT binary patch literal 793 zcmV+!1LpjRP)TM^6A(_| zZ~|SJ(VcNgSR|YPTxCi(VPTcUPoCA21d?H&S(3J(e7BN+bg{5Ou>m0OvLJwgsAjkl?AYQ{fuA3| zd7A@wNiI18&V)%i8A6*s%AY?b%})d_98|YSZrueiK1bAc(&=vi7dkbcz?v0QI1&-v zC50l0m$rC8e&_}3(=ju^Stk{AI+W`1^hMV~`UIb(Z9vjaSPr%)|F3|}U(*mi!Y z;k&duyY2i4IAZVFLf1+p;izA3jY}wbdy5CPo-OT$aA7%Ej;_djvQj***S)?Mn6gS8 zF8r9Jd<5L74s7>xpTMTh`(EoQ3x}%}N?)@}N4>rmlx%TXsh-TefJ$8KRGR=dvVnoW zCD%2E_E_jt+XP>^0Gl*jYPgE^-{_j2*^QaTFcuJ?c-=4@w-5EW*r~}i z{66FUBXCC1PoGlKcaUvJCm>Fuf5H+>2a_r!UpQq&ILaiK(Ps!vJRJIA>B|T#WfZ!v zmvEM=gJ@WFJ0h2*oCNIup8wStl-dKQlZ=BR2|j<^Oz(2q_y;YIZeDRfOdr@^G0(Ak8yb*`4CqrnTP5`Uq%)+zD4cwXJ}M zs})FF1S&Vknr3|_fwpFD90YRkB@75fW=~*|L>@!b(;Q4vh5UPa8$0RbfLVsV=`4e> z+!`Vcp~kHY{q!2fk7Y?P0018d1^@s660l}|00004b3#c}2nYxW zdb6^e*pqCydxgXtzaJ2NuD4MCgi4_i;}X<*)a zpZ&ghZ{`sUeAR08xRmk&A!HAL&4YUh*DWdKB7mFqdi`=Qzigb)d1 z{%J-jg<%+PDW$JH&zsd2J%|Qy&JTrQIG#EBZ;qyEE;GiSd7gKkxUQ>HbSVge(s}`+ zIJsO-E4r#7uQ=y3f0LqNKgSq@X__xcrBYe(eLu?~#|kHez_#s{hA7|nV;!;@IF5t= z5J(f~juSXdH8PW#)1?8;Qx-Z!hRJy!x$nb4nIMt@%`+DKodz~7hS>I~3nGV$NexjH zXr8vPI%OdLF2uyc(EyE31<`;nCoQyh8yH&(QMexuNCiy^}bhZ*S=A2&H79MnwUrHz=?V0!!1dUk-iUEa% z4)PyIl+=K}#7ZI`zev$IXZK#A!rczWKE;DlLo{r42SxL&4JcsyoerGOqd}P<8r0s! zdi_E;FnMhQIzCEWdy1j8-&p^SkFD1=3^J!H4eXynHvWw-m&-3X=Le;XulY1-(zg9+ zrCcr_Q%YS9f?zsrkT`qGvfeYsuJmp?*L80RA&zj)x5POn-TyT~KJh&7V*fgIUH7(> z@_-OxTBlB_(Qo%!Fg<7KS(s9)6+G8~{wy3hxUPE?z#JiDZ`P?^DfNa@dZSjWJ&of2 Y1l_DPecer{=Kufz07*qoM6N<$f*pM-!vFvP literal 0 HcmV?d00001 diff --git a/demo_app/lib/assets/icons/badge.png b/demo_app/lib/assets/icons/badge.png new file mode 100644 index 0000000000000000000000000000000000000000..5d233517133f8a7431135cf6b18ff0cb79cd82a2 GIT binary patch literal 687 zcmV;g0#N;lP)_Z6im2t`Dp8FeAnh1lL$tS=zAF_UguH@c9_CwJ=7qaP|qjsoLcm z5#K;Sm3BS=I7)DLoKXV&AY`R#d#8*hanKDXd9f2@1aDvk@~mciHxmU_ix(WEtosyZ zdX1a_HKs6`EU0##61>t1dFOBux78(#e4NG^5=$ zlgX-G?t5V!TpS;>EY1>Cjjn#n&Tn2GsuY?GH&rjFUuQM_ zo@wVop7pcy3r(O&Zu5HiKoPm?=e$y@wq@fS7{RE?Y%eeUTN;x|04tzXYIQQ2<2Pg$ V3)L|2v2FkW002ovPDHLkV1hpiB)6{ z04@;{0vPQaAr%4ZfLsV+-OXN~)>lsIevhZ0g|ACybXKqnGUaD|Z;go6BC@|@h03UX zLxF_L@0ZXtb_s4e2MOeqq$OabEq2{8qQK732oVw$krcr-*Pc8AcDApAGmP|virxy}C)z#w;peK%S(aezC^*Z++ zkghupH4%`lTC9+NqWyc@!zFW*pmI0bVz0a1)B~a^Y|fNbOiYrA{)@PnsY{@};<)@D zkWw;FU_-@3HC`AmO~<4yQZy|UGXfmcV#hioH4t4Vz_QMcfE^tbn7XhvgBy2&>jNi? z2F-cl>$3kteQ!ZlR0+^PdI&|bwRj;j>ViFbUBNtPZfG_+!Q1r!)lKG`3xCw6o50m8 zKXt+}DlXuI=7s@r+pWfqNhecO#jM2&iBW8*?~?$c&ncNFssgJFV%Q1NF>1!7fH*Zv z1uY#^LcXi5emVKCjGTQ;P~^LQzak~Gte$cwdjBU7CtH<-V5F23Wn2Y}9}ts_5uLGJ z`%?s@n5=+Uepc5A&Zj3>rzU-;rl3ttiJzKB&n*L#z;%liuezdHY%Ofw%wFZ)GN6BM zY#GpbfO^8ns>TcJev8{<)EiIE`=TSH$ZX>eCY1=HX@eH**l|j?9jk$7<;|G*+cgXZ8;4x@3f0T z$=%Lg@B5LG3Y2a+TfuFI1sxMKQeK+JM-x7i(QQU|2yh}0i;zkiyu8 \ No newline at end of file diff --git a/demo_app/lib/assets/icons/card.png b/demo_app/lib/assets/icons/card.png new file mode 100644 index 0000000000000000000000000000000000000000..79543ea64e8f7e17a74064a76bf5605858cc1faf GIT binary patch literal 424 zcmV;Z0ayNsP)(QvZzwv}(+ zKG*_kIM%b!Uj|12p1)wn!3}K#H9SU82V3_Sa>~}NsPk-7iaKSTvQrAUt*a?JIAz;W zmVmrV+|*<>jC)E&6kV4%$7HcgS3-d0LvYOmA-!+(34^g^xdBZRw*{^;im-BIu zoEWZo>;GC`DXe)=RTL3<%)3eFXNUCP`Wa!vfdIz@SF21YB5~eLqHoyw>Suzj0@(ID zzieQ8ZXl4C=|tvoLc|s(GG`!rMIy6MS(o3gaD~sx5g=hZ3T%#oHBQ}Nl0iNKVq+R?KG&;Ciy<(Xq}Rf z*x#g$t5ExBzxO`x^ZC5*vyHF|F5Cqi!6*5DaoKm$cd~;N@W-`-%yMkichYyVgB0+` zwS&y^7mq)#{+{L7*E%XcX@gjOCTTt!4mQiQV^5Z#cNlBt)`BJ%E5xp-V_E56%3+Q;&;e zSXWOV!Kso!$)#x8;3?eBm`Fw)27oCB_`ap2K6b-$CE1@j@_IlB9L+_wSKNwu{an=5 zuZZBRrD$I|VLOr(v++2T@NIKMQ@tj@ix<(=3nhdPZbr558s#{WjOc1U7YaQHhrijV zEwEo#hXRC;+4oCGSC?dMfw!^kj2oCA>tU>P)0DN|rb&i%^)zGb+oh3NtundKi1l?B zLQ@D3tGrJDbNN00Bv+-m)$Js~Q!A{;#{l42OHQAv7vIpyh@M!<3+sa`!{6WDOe_=J z=rIs+uwF4Dx}NV^le{MSK<2r9z1V#%C#UvvleAwKti*ma6|IU)L{~oqz!T2u(&?P6 zove(BWD_R|XfKZ|bz_3;j491tcgm0G>Wy_qPu?0y|6Utc*U4};@q)nUjhvz#t7KvDoqH%N(HUgJSCG}{vlg*z=ds*FI42=_`KAtJ48`H%m+|OiU zaUBXz-I6c-#zoQ&5;N-U;@;qazYd+dQ?p$c5b==)+jTMDwKnASb}b9J5&AW!q#owp zu4R(C`bh!UQLBO>p0gBl~(UenxMzPMHb(zs5A$!e~wU=DMb|}E< z)v?)<>tBed$KN7?VM|HBxkEe}!isugf`I*G$>~p>dUGXdCr2`gcM0fKArLtJ=kWP! zJ55&9j~qq_OfrBkELnTctsgFuc9DVku|up>nq&x<1cXHbG}c(&xT9QLb_3b!bNk!0 zN9dLiNCJij0U=gmczkJO<`=Av0yWREyX@FS8OToZqn9CZUx<=T%V*zLbn~pce3pgdj#M+ z>5 literal 0 HcmV?d00001 diff --git a/demo_app/lib/assets/icons/danger.svg b/demo_app/lib/assets/icons/danger.svg new file mode 100644 index 00000000..dea91e14 --- /dev/null +++ b/demo_app/lib/assets/icons/danger.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/demo_app/lib/assets/icons/dark.svg b/demo_app/lib/assets/icons/dark.svg new file mode 100644 index 00000000..a5e5eb1b --- /dev/null +++ b/demo_app/lib/assets/icons/dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/demo_app/lib/assets/icons/dribble.svg b/demo_app/lib/assets/icons/dribble.svg new file mode 100644 index 00000000..dbaca3b1 --- /dev/null +++ b/demo_app/lib/assets/icons/dribble.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/demo_app/lib/assets/icons/fb.svg b/demo_app/lib/assets/icons/fb.svg new file mode 100644 index 00000000..e6078c98 --- /dev/null +++ b/demo_app/lib/assets/icons/fb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/demo_app/lib/assets/icons/google.svg b/demo_app/lib/assets/icons/google.svg new file mode 100644 index 00000000..d837859e --- /dev/null +++ b/demo_app/lib/assets/icons/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/demo_app/lib/assets/icons/info.svg b/demo_app/lib/assets/icons/info.svg new file mode 100644 index 00000000..21fd193c --- /dev/null +++ b/demo_app/lib/assets/icons/info.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/demo_app/lib/assets/icons/items.png b/demo_app/lib/assets/icons/items.png new file mode 100644 index 0000000000000000000000000000000000000000..1a495321c667459f84342e08f9e41a732582af84 GIT binary patch literal 967 zcmV;&133JNP)n1#cMUQ|ZB+36p zWvQf8a*jM8!*!0t3WO?^luFK#2V}U;kyx_u$Z&mB;hMXAyTZN977?;wDhl!h=oYv| zigjkJe`}@LA%WqVyLev&^F9GKF~7xt2BJe_&+mdFVEj?XEOA9mgFppuYMK2 zo;s;DewD9+jH~Wqr`QL7?~J8W0=;pA72#{B^-Vt#`DU4CNzgglY^(Jb6C`uZ(k_8M zdjVkOZq;329HK2RMVa}~C^Qbd&Uzq{XsdNQQU~EG06*(3{{)boREB>TYQwYm2|#N>82WiJx+i~8 zt}xi6GKa8vV%4S@JYtY^v=NQ}KF%YBo4a6%P$lN?Q;EZT)-E)*lIiYu_JqSY z#-dgA%LThv-Y!)@sCe~D-<-5~qE&@PMgWdzO1i46O;EAcq9(d1M7YgpMD%KK;gp^a zB^z^tf1mW}aY5%#^x7%Th>1Va_OSsycV21@l?WfS-8baV%Q~DK6_IeGT(6|zMKVTG zybcyf^uA%cxKTPgVL+W3_J}~cLtFl6sEukQSI>CU#8b=T6=E`@Vif8%FDxQN!PqCF zl@aIE47ENWJYx=_$9q1SeV$t;1G@P3U}95zgAgF5o$)G}l43K;-1lcdj9y?Ig}P~M z1Al6(jY>S5+3ybi;}LD4w{QUPw)Zcm$uy~v1dCKMiTBcEE0s)> p8cDE7C6jnBO}0|WG^vpU%U>a2cu7rv`Y`|i002ovPDHLkV1i|1#3uj% literal 0 HcmV?d00001 diff --git a/demo_app/lib/assets/icons/light.svg b/demo_app/lib/assets/icons/light.svg new file mode 100644 index 00000000..bf6f73a6 --- /dev/null +++ b/demo_app/lib/assets/icons/light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/demo_app/lib/assets/icons/link.svg b/demo_app/lib/assets/icons/link.svg new file mode 100644 index 00000000..9260d523 --- /dev/null +++ b/demo_app/lib/assets/icons/link.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/demo_app/lib/assets/icons/linkedin.svg b/demo_app/lib/assets/icons/linkedin.svg new file mode 100644 index 00000000..7adb1746 --- /dev/null +++ b/demo_app/lib/assets/icons/linkedin.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/demo_app/lib/assets/icons/lists.png b/demo_app/lib/assets/icons/lists.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e9317457760454f2406cd12028a6d0df04e110 GIT binary patch literal 638 zcmV-^0)hRBP)gLp35vm6mt7aD&C!!)EAKYAO5h%V=tG{M9_Pxy zc4T`Co#Db67Jo3&R5V^c$qQup$NMTV9|LGMY;WLMxQ6ZJZlkIEE6n5E+hy6IL0+n7 z;6$a2EHkE8X<3#-cafQg&z++$8DoPIIDpn7+Z%ZmaOKc#66j4@uuts=iBzr?Gz~Zg z|A}nB<7=TbTp9o`9mBvGpL?lx66_}}OW|_>eFpPcZh?5MuLr{*Ia_RNryIY#^ec}|n=LqPOkDjope~}44Mkl#Y9kpqW8!KRr6ih>rI^ONUb6ZB z``zog9wjce^<4FCF`=5~r(hL}PTc#t?E1U%gJda2?(TTSnLGm*XSTA`R_n^$ Y0fD^-R(*LN+W-In07*qoM6N<$g6pp;W&i*H literal 0 HcmV?d00001 diff --git a/demo_app/lib/assets/icons/menu.png b/demo_app/lib/assets/icons/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..0932d5f5bfc9d96a84c2bf650274ae49fcbcdde1 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^Rv^s51|%Qu_R;`SEX7WqAsj$Z!;#X#z`&^E>EalY z;rw=np;(iFfQ$L|hTs*xI#-7{zIXN;R8@@a=t z4Oj0!=}aNji$1~+UZiooTbu)D_vtJ5>A9Ov4GNb)S9BHV)nQ9(5Z=wWbw3^2-+fy)Ax9#q3&sS@jt!RGX!AO;&lHE#mErTDJHi zoA6ra&jN+jXVp$$JyQ7TFXPMq&4K?66dLumsr{XQaj)#rlX-?mXB`WicX?xTpRmm? zDcNaR8CQgQMWQ@RT)U=K9dM~UyuonWm-`ok)&*4@-th6oqT7e{mA5RsT56ItwI@ux tGi&nZDECESCo@VXt}wG)U8;gzSYNBe&RW93N*@@G44$rjF6*2UngB<4n?L{n literal 0 HcmV?d00001 diff --git a/demo_app/lib/assets/icons/next.png b/demo_app/lib/assets/icons/next.png new file mode 100644 index 0000000000000000000000000000000000000000..8d3c89d96e5398f6105ddf47d3c1edf78c30f97a GIT binary patch literal 708 zcmV;#0z3VQP)P0018d1^@s660l}|00004b3#c}2nYxW zdW=rhFISsrw z?=$bsydMPHR;g5)4a0DbbACdSBxAcwWFLlM3&3Xp%hhW2>F^90Zfx6L@qPca=Xo=} z?}KwLVt0oQAq13Cq|@m&S(e|`YPGA8LJWxjp68wK^?Fl@E$?z5lgTtxRef2j)vl02 zp)kuBTWq)6Gvfjb?dZC`rYOqo2(sF4x6d-h#?64DDA0BN4Y6&z={SzDmp2%7D@l@& z%jH_6SS<2JqcKW<&+>dekN*t94pPYLJ|sVR)P%z2Po=PNBMarb4|BN*DM$tqf^Z3N zFB=$~)S!InBm1BQ5{iR_Ad$HUP*WAmGT|b)ozi{ht#-28St}g~|90viICLZ$y?bgdL)Au9@KA z$lh;4{U!#8E+GVoGk!4(qyTfN3GJ&mKo~O2_=(kD(CWz>n~*0WaUXl0B!%vuC;QUl zZQFj^>2%Kh>uKc@W9(+9)0s{h?@{`OVboPsy%m>G%d#F027?RTZZ|*bpr|~WAT>>U zR;^a&x9YTIS&xDsIOBQVbPxmx!vyW`4>_8%WLb`8;X0-Cbp(h+JDNeEP`C)7Ob9sz qAn{ZWpv5`=C`r;%rBZo5^!hhAQ9*r(t;8$<0000 + + + + + diff --git a/demo_app/lib/assets/icons/primary.svg b/demo_app/lib/assets/icons/primary.svg new file mode 100644 index 00000000..c2ad37e4 --- /dev/null +++ b/demo_app/lib/assets/icons/primary.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/demo_app/lib/assets/icons/secondary.svg b/demo_app/lib/assets/icons/secondary.svg new file mode 100644 index 00000000..56c06ebe --- /dev/null +++ b/demo_app/lib/assets/icons/secondary.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/demo_app/lib/assets/icons/slack.svg b/demo_app/lib/assets/icons/slack.svg new file mode 100644 index 00000000..ed08c2a0 --- /dev/null +++ b/demo_app/lib/assets/icons/slack.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/demo_app/lib/assets/icons/slider.png b/demo_app/lib/assets/icons/slider.png new file mode 100644 index 0000000000000000000000000000000000000000..f141a3a7609a40a64ef8586a2934eaa6459dc096 GIT binary patch literal 922 zcmV;L17-Y)P)L000004b3#c}2nYxW zdVSn>GAsuakUH4D02M)10R<=-ujXdR(czoO!{;K20$5^=W~Dy$s?r7&penE&l%CB| zd2Y%n%K<4@)4zB2*x2=n1w2G9>b!&|d$aL;d1mX;xAit~D1pn0$F9OQQdb4tQLqh4 zPrS>&ARftft1dX~_iXhFLWo1kpmGZL1*kj^BPBWLcr|y69`_%clwRT5)?7Vbo0mX2 zuuzl(n}ghX~i~e_*0;E?o6ME>uhj>tgP@}QAdAeLKZ|n-nJ8)RP zIdo({U>OUe6a@yYpfbQL1cCr?&K-cgQKRjJ1?=sQ3)RbM*k07~@1KHU z^u|ObZZGAKjc3c#{a!Fc3!-!!>skWh(cx)KTO}Zbump|mN`VWl*_q>JHwrnz~fh1w#BMbyq1WY@Euv9WHg3W8GkNzeS6$LY|uI z&Nv`bP&K8EY8)E}ZxcsM{V=-2?NzO70-AUq(?}-nNYVxzXwnh3J-$=acEppm=M+sk w!nVhEirS8N()OI9Nk`cB_)byV5l`CQUrH%cN#Pyi{r~^~07*qoM6N<$g38CNL;wH) literal 0 HcmV?d00001 diff --git a/demo_app/lib/assets/icons/success.svg b/demo_app/lib/assets/icons/success.svg new file mode 100644 index 00000000..b06b4ae5 --- /dev/null +++ b/demo_app/lib/assets/icons/success.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/demo_app/lib/assets/icons/tabs.png b/demo_app/lib/assets/icons/tabs.png new file mode 100644 index 0000000000000000000000000000000000000000..49678a20998ec923e9c7d9e2feaeb946e5403749 GIT binary patch literal 581 zcmV-L0=oT)P)gq&Sg9uv7S^S(Q!o)vqDO!ez)jRdh)Z08 z3-AWGqKO;b8emM3RtPP94T&;zx-8T3|MSh8_ojpdT$BKhP?PIISxG8MK^f3;6$ERc zR3)h-1!X|XRS+y~JX)?=u7Wa1@cvFY9PNxB9% z$hwngEJ!mG*0 z>g6&=JgNfZHnW+FnR`RRb=1;`t0R_4FL;rODDvr6u?xa+_&d1Uw;S0-{}ETm-cnU0TJ^0CS_ zdVl&oI)#}S?~^001#KhD{5B+%mft65b;L3$^=KDqa$U}@4E}WN#&}!|nnLaegi2Hi zts>>g6jB9IDR2r<Pe`S~(Hw*WE(+FnIkQJP$WAgdhsWgzNd$-j%A9Ziz2CQY&= zAx23`pk$&^Nt$FyLX47>K*>a-k~GPZgcv0$fs%kQyk$h$`j{Oo6BZAr%n?yh-2*u%7_l1TqtA zsECtPD24L~bk7NtV$}H!GZ{=L`MWj@1Wknvem=VUhkmZ!3j&na{H0XRH7@t<8wrZ9d@|B9^_S&jxtER2mg#Lil zJ2;`hYOAKL+W!cwr17Q@+hy-sZco9tZj}5m_ws%JRwB^{IN%6^pH%>Ycu$~dLQWMh z{1qSJFPLp4jVb_#?e`)9!!*7oxL^Zqb|^Cg*pGSpr(R?R2Z0_S1s}bk3_}tZW(DmJ0u4&p#+UPJ!WiW`>k-YOQ7)T9j9ZgW zO7S*02D$$%qg<}Tcx3@i`)3)(%N_n3r{n>Ey6tPA3}~J?FlgA$wwb=1C0gd7)38;* dX+*tBpZ8^P^+<@#T)6-M002ovPDHLkV1k<+DG&ev literal 0 HcmV?d00001 diff --git a/demo_app/lib/assets/icons/toggle.png b/demo_app/lib/assets/icons/toggle.png new file mode 100644 index 0000000000000000000000000000000000000000..f33816f91a6e58020b03c9d8b5d6ab9df3cd387e GIT binary patch literal 998 zcmVNklVH4bU3G5>jojW= zo%g=ac~9NC)r2+jqcy?_1NyTiZ4xz!uF?*e(Osp%Eos{%Y7$+g9WbN2N`o_-kr`bx zy5H-->qE^>dAf_3yMoJ1G%i}#k7N6tnMP@t*61d4edma*egJI*t^%}f9*iptN&qMU z@|JLi2UZ$b3A8QOlS)ui7Csi(A5#DrR^6 z=iVPzX_jhDXiz8by(7?O)rA(;F<}zm3#wYgRGjhopNZYsTv&}zp!2&c{YjwKu)?+O zlgzUqenw1>RrDBe0CWA+~FI_p!iXn5kZPn zYcuGMuRXd2?_QPVUs}&-V8Y2|1X0Yd7x2GDH@i(2vc2H-*b*m;>1?mot~&>s&zuGL zL|g|3W}XJ*d66DDqXQa1T1=;fCH5orVpbb;9@Z-ns9nd{=UQe=!qPedZULbalDTM? z4%UMV)~&l4eKyxN+WT9Rw4dv~Pnp@5@NZbKOR7y{;x|?Bc&%r0v36+CpfH*1?I%iH z(fLdR_z&S`Z>vJ8)8#f78V9u&=obSI_avMREjtMIjyX{HFU8J{V{se?;($~h-MAKCPMvrXT~5b}YZ*|* z#x-o2Nwi_3Q8Z=}Rcu_tmYGBwHX21^CQ-%4HEfwlv|*!BG-eW2Y+S>Zt(ips2ePF) UN{w3V-2eap07*qoM6N<$g7Uo4Pyhe` literal 0 HcmV?d00001 diff --git a/demo_app/lib/assets/icons/twitter.svg b/demo_app/lib/assets/icons/twitter.svg new file mode 100644 index 00000000..ac962749 --- /dev/null +++ b/demo_app/lib/assets/icons/twitter.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/demo_app/lib/assets/icons/typo.png b/demo_app/lib/assets/icons/typo.png new file mode 100644 index 0000000000000000000000000000000000000000..905923625485877f89657e7b06189d8655c5ad99 GIT binary patch literal 719 zcmV;=0x!x)X5MY0BG3}sTdd- zC=xqG>=3~V6p5G#HHaw=Qj<4eA{Gn;2?0_`K6H%&wv#%(t(v;Rma;_mocr^4zkAR1 z5gemOju9(T*uz?_RN4PR*`@c@^Bj&IL!?IVrdzb1`CmLSHZYu(JAm93$bte)EbO`V z%EOFg?veZe;GKwEODwEX(r8znxMuT~;aF<|d75b0u{TrL!#bWKm0ffy)R~yzTeoPJ z!ZAkM+7OZZTDe5Z?((aaKPD2^aI6-Hyog+wIT6u=u+=Zx^$A$VS_QBwkV~`j5c~?D zI|S;Vi*`3Q?08^qr<6OndwOf?WP6I@Ts2w?nXNZqaT;<f3JrhS4*ns!bdk86HAb}Fi7)9Ygp4CH)9-YF@ zyWGZIz1g0f^F`)Bo}I@ + + + + + + + + + diff --git a/demo_app/lib/assets/icons/whatsapp.svg b/demo_app/lib/assets/icons/whatsapp.svg new file mode 100644 index 00000000..992ff345 --- /dev/null +++ b/demo_app/lib/assets/icons/whatsapp.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/demo_app/lib/assets/icons/youtube.svg b/demo_app/lib/assets/icons/youtube.svg new file mode 100644 index 00000000..b2503883 --- /dev/null +++ b/demo_app/lib/assets/icons/youtube.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/demo_app/lib/assets/logo/logo.png b/demo_app/lib/assets/logo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..27e5cae095f2b8c9a7149a417fb55de77c63d705 GIT binary patch literal 2841 zcmV+!3+D8RP)X;o_oIYyXSWvUnsA>oH4=0V9^m|#vzd2*cZ@$>|IdPJVCXS z+Y{^oN(9)WZ1OYsH9yQ%?FH3)6KwCKx(RsTWPl9@v}XQuzt4AD&!W243D`HeHGv)& z0XBnu02;tB<2r+21JhX`&L$99dpk|m%bN=;UyMuFr0_}ez$mcsQJ?B7=sDQj9oLC& zpUOx*GcTEJYY13MAe-cI2G)At_TGUNy906Q`+pH`oNLFy-5Sf{437WN`;7#f`J=&Z z|D2A+Tf0ugo}3-Umy=;^Bv790*UU9uv*Rkv-_akBK4vxmoB|*nkgNc?e4Ruz;bJnX z9ej=9tZ&a`dy*PUmI8j=Q}}8d_MV-T+c)Dz*7TOQsB&jiy$9c?pU%6ZucIlC~>4rUH8yJ7`7FGN% z9(zKve}Fyr{L&Yh@PxOZ@}-PcXA-PQ4_DxNq*W^NpYDb9A*l-d*@WPjbI0ca@JpVN{`R%LQAunIz89jrU$z}6KrNq1~3hP zMBRxjiK4^Na;*i}UjaxV_v7)XTB4tb!o?mlrvg}J{iIn29t7}v0F81kGp_}3Ie^ox zizFA~A4DX7KWGh;3skyM?3D>T&D-4An z5pW4KK4e0OshG_>2*!65!2{4N2EW6=pk{uxrLgiLk;(Yyl36JZ<7QTL0f7}X`c1`E zEz17naJtO-*OF`u821I0e%jE+)rwFUH1%(yft?TFDF8E01Ze}(tV^|&h<1;2A%x1aC7(;7Wzn-Z z>2V?o(cn;YuvGAp4n%I1^|uuO)(A^Qvn3SS%6Qfc23ILNABnUjU>dsJdH8_TAY;*Z ztYC+9N;Tg*^J9j-$6HvnKJuL0#`1D#-0RnRS$k1s*oN#~Wvdl%sWy0dbAIKA)*f>2 zELotGTE~iSZ_cl*5wMeB+rrGp`a3$W>n_>RF0x+~u*)p!l>+MBalp<5AWnIZh#Hx> z1i-xjRsuLSYL7hoK7e@^mB$CRVLZ>w68R%*$oe_*BWqF0W7?qFA+mzI+`Z4Zby z_b7gp^kBFRW#yoBQ>_K#-R7#w2eQhROiP081+C3B%|+GE5Bnw>*cXKAM&Q&KBijaG zN<@y2HL_;|*b3l!BB~w-Y`4UNP_oD{vjF&@)C9nBLk+1lB%jYFqJB#@_Q*EWGg|8v zro%si>Z#Y@)}xtTEZb~;-e9LT7Uwy&dLNMDltYm^a#0que!kf^a8FiRQl8Lw5c(%= z1yv2Pf}I3FoGc*5vZP0T6u_4);aI_z0`N@>@cYMVkC=Hh*xv*oIa{JTT%AW4DZT6d z6N~HC1;-qjc2~?$xIHUzHc(GH`yOf zTalm)Dzm+>psr~+XPZXw*4DW-;j~D(yUL~28OnFWN4<{V4ftwJUo6OumSN_ztsH-D zJYa{;X1*4{?Es|ee1V8Y^ybVgz5Ck$uC*e27J$tF?k1vFB5kqqc3^mj!pt`Tco@L+ z@mj9o{S&Fib9P={1eLVTPjp?!g)hH1tkc=(ai!|iElOis80<}FC*{tZc^KfIHx*P$ zff-)z`mz!ObpJqrmvt_v5atS1^f{%a8$odP1|!(aoHQ(v|n%=`Q7y+1{N3MD(pXw9!a=4vQ8%h0OAgt@Y{lj|}v2eP}2z9Un} zby{jrZPLK5AnC{2m3d^UU#Al}$_zz|e1>mjPkvqNxL`B0BLY<(9Z~Th&dic~rFsvI zOG97K08g|EILs`}DH6HTf?2b1=~V@6sRN`c{WX9sL=+m-Ftb$WGI3jKP2B`+q5JJJ zL?NQkP=uMK2NxC)`-EO)?tU>5eM+^K5jhRz=MeK#1Ez0T=e#<(Y-6ulPkL@z>MPKA zrm3jn@sJRM+zn;L3Xl&%PB6L{SYp)llNGX|!8ocgkjATDB4HIboxgF#-=Ij`!_DGiGk*xCL|#XJLq7J$+iuruS~X2ZK)Myy#o zOQ+ij8wOQiRp*6Ug$+YXrVbKC!%N14x5Wz1XfH6c3@g^6`pMOGqOY6~f<-Xo%($TOK)=IrwzAOIg&GRJ+&b?^10tAUhryxskK zq-P!1?oBXqW|Us&4+M^OEZq8OA-5VTbMd98I_!?~wBlqkairPo+LOsC*_!P3?)lXR zB6Yg!7oQI{&H$;N!Jt{+J-<5ij?P_|O-+G4UlC^v8nnNodte_H)yXBN^tVb~jsVWJ zF=v}(^aK#t*Hut+D9p&Up5&=X$>$RH><>-sBEXKMY`Mweka)j($ych=EIJj+l;1_K z^t*QqM`ApHPs%3V1EG0hgj(q<>&IwiqMa<&wB*4Y3uvKUq2TWlQ6zIj(=++}Bzj;p z*oity+MZ{ulrUCXl&Eti^~B+UM1w6XA$hI}z+FW2?>KCk6g|lv5U}I>f3vX-5|E`5 rmU->d@ _ButtonTypesState(); +} + +class _ButtonTypesState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: getGFColor(GFColor.dark), + leading: GestureDetector( + onTap: (){ + Navigator.pop(context); + }, + child:Image.asset('lib/assets/icons/back.png') + ), + title: Text('Buttons', style: TextStyle(fontSize: 17),), + centerTitle: true, + ), + + body: ListView( + children: [ + SizedBox( + height: 20, + ), + GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => StandardButtons() + ), + ); + }, + child:Container( + margin: EdgeInsets.only(left: 15, right: 15, top: 20), + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(7)), + color: getGFColor(GFColor.dark), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.40), + blurRadius: 5.0 + ) + ] + ), + child: GFListTile( + color: getGFColor(GFColor.dark), + showDivider: false, + title: Text('Standard Buttons', style: TextStyle(color: getGFColor(GFColor.white)),), + icon: Image.asset('lib/assets/icons/next.png'), + + ), + ) + ), + + GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => PillsButtons() + ), + ); + }, + child:Container( + margin: EdgeInsets.only(left: 15, right: 15, top: 20), + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(7)), + color: getGFColor(GFColor.dark), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.40), + blurRadius: 5.0 + ) + ] + ), + child: GFListTile( + color: getGFColor(GFColor.dark), + showDivider: false, + title: Text('Pills Buttons', style: TextStyle(color: getGFColor(GFColor.white)),), + icon: Image.asset('lib/assets/icons/next.png') + ), + ) + ), + + + GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => SquareButtons() + ), + ); + }, + child:Container( + margin: EdgeInsets.only(left: 15, right: 15, top: 20), + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(7)), + color: getGFColor(GFColor.dark), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.40), + blurRadius: 5.0 + ) + ] + ), + child: GFListTile( + color: getGFColor(GFColor.dark), + showDivider: false, + title: Text('Square Buttons', style: TextStyle(color: getGFColor(GFColor.white)),), + icon: Image.asset('lib/assets/icons/next.png') + ), + ) + ), + + GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => ShadowButtons() + ), + ); + }, + child:Container( + margin: EdgeInsets.only(left: 15, right: 15, top: 20), + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(7)), + color: getGFColor(GFColor.dark), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.40), + blurRadius: 5.0 + ) + ] + ), + child: GFListTile( + color: getGFColor(GFColor.dark), + showDivider: false, + title: Text('Shadow Buttons', style: TextStyle(color: getGFColor(GFColor.white)),), + icon: Image.asset('lib/assets/icons/next.png') + ), + ) + ), + + GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => IconButtons() + ), + ); + }, + child:Container( + margin: EdgeInsets.only(left: 15, right: 15, top: 20), + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(7)), + color: getGFColor(GFColor.dark), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.40), + blurRadius: 5.0 + ) + ] + ), + child: GFListTile( + color: getGFColor(GFColor.dark), + showDivider: false, + title: Text('Icons Buttons', style: TextStyle(color: getGFColor(GFColor.white)),), + icon: Image.asset('lib/assets/icons/next.png') + ), + ) + ), + + GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => SocialButtons() + ), + ); + }, + child:Container( + + margin: EdgeInsets.only(left: 15, right: 15, top: 20, bottom: 20), + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(7)), + color: getGFColor(GFColor.dark), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.40), + blurRadius: 5.0 + ) + ] + ), + child: GFListTile( + color: getGFColor(GFColor.dark), + showDivider: false, + title: Text('Social Buttons', style: TextStyle(color: getGFColor(GFColor.white)),), + icon: Image.asset('lib/assets/icons/next.png') + ), + ) + ), + + + ], + ) + + ); + } +} diff --git a/demo_app/lib/screens/button/icon-buttons.dart b/demo_app/lib/screens/button/icon-buttons.dart new file mode 100644 index 00000000..67169ebc --- /dev/null +++ b/demo_app/lib/screens/button/icon-buttons.dart @@ -0,0 +1,781 @@ +import 'package:flutter/material.dart'; +import 'package:ui_kit/colors/gf_color.dart'; +import 'package:ui_kit/components/button/gf_button.dart'; +import 'package:ui_kit/components/button/gf_icon_button.dart'; +import 'package:ui_kit/components/card/gf_card.dart'; +import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/shape/gf_button_shape.dart'; +import 'package:ui_kit/types/gf_type.dart'; +import 'package:ui_kit/size/gf_size.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class IconButtons extends StatefulWidget { + @override + _IconButtonsState createState() => _IconButtonsState(); +} + +class _IconButtonsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: getGFColor(GFColor.dark), + leading: GestureDetector( + onTap: (){ + Navigator.pop(context); + }, + child:Image.asset('lib/assets/icons/back.png') + ), + title: Text( + 'Icon Buttons', + style: TextStyle(fontSize: 17), + ), + centerTitle: true, + ), + + body: ListView( + children: [ + Padding( + padding: EdgeInsets.only(left: 15, top: 30), + child: GFHeader( + text: 'Solid Icons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), +// +// GFCard( +// content: Column( +// children: [ +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +//// GFIconButton( +//// onPressed: null, +//// icon: Icon(Icons.ac_unit), +////// iconSize: 12.0, +//// type: GFType.solid, +//// shape: GFButtonShape.pills, +//// size: GFSize.large, +////// buttonBoxShadow: true, +////// color: GFColor.primary, +////// boxShadow: BoxShadow( +////// color: Colors.pink, +////// blurRadius: 2.0, +////// spreadRadius: 1.0, +////// offset: Offset.zero, +////// ), +////// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +////// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +//// ), +// +// +// ], +// ), +// ], +// ) +// ) + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GFButton( + onPressed: null, + child: Text( + "Primary", + ), + icon: SvgPicture.asset('lib/assets/icons/primary.svg') + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: null, + child: Text("Second"), + icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), + color: GFColor.secondary, + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: null, + child: Text( + "Success", + ), + icon: SvgPicture.asset('lib/assets/icons/success.svg'), + color: GFColor.success, + ),) + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + icon: SvgPicture.asset('lib/assets/icons/warning.svg'), + color: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + icon: SvgPicture.asset('lib/assets/icons/danger.svg'), + color: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + icon: SvgPicture.asset('lib/assets/icons/info.svg'), + color: GFColor.info, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + icon: SvgPicture.asset('lib/assets/icons/light.svg'), + type: GFType.solid, + color: GFColor.light, + ), + + GFButton( + onPressed: null, + child: Text( + "Dark", + style: TextStyle(color: getGFColor(GFColor.white)), + ), + icon: SvgPicture.asset('lib/assets/icons/dark.svg'), + color: GFColor.dark, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + icon: SvgPicture.asset('lib/assets/icons/link.svg'), + color: GFColor.alt, + ), + ], + ), + ], + ), + ), + + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Outline Icons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GFButton( + onPressed: null, + type: GFType.outline, + child: Text( + "Primary", + ), + icon: SvgPicture.asset('lib/assets/icons/primary.svg', color: getGFColor(GFColor.primary),) + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: null, + child: Text("Second"), + icon: SvgPicture.asset('lib/assets/icons/secondary.svg', color: getGFColor(GFColor.secondary),), + color: GFColor.secondary, + type: GFType.outline, + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: null, + child: Text( + "Success", + ), + icon: SvgPicture.asset('lib/assets/icons/success.svg', color: getGFColor(GFColor.success),), + color: GFColor.success, + type: GFType.outline, + ),) + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + icon: SvgPicture.asset('lib/assets/icons/warning.svg', color: getGFColor(GFColor.warning),), + color: GFColor.warning, + type: GFType.outline, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + icon: SvgPicture.asset('lib/assets/icons/danger.svg', color: getGFColor(GFColor.danger),), + color: GFColor.danger, + type: GFType.outline, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + icon: SvgPicture.asset('lib/assets/icons/info.svg', color: getGFColor(GFColor.info),), + color: GFColor.info, + type: GFType.outline, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + icon: SvgPicture.asset('lib/assets/icons/light.svg', color: getGFColor(GFColor.light),), + type: GFType.outline, + color: GFColor.light, + + ), + + GFButton( + onPressed: null, + child: Text( + "Dark", + + ), + icon: SvgPicture.asset('lib/assets/icons/dark.svg', color: getGFColor(GFColor.dark),), + color: GFColor.dark, + type: GFType.outline, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + icon: SvgPicture.asset('lib/assets/icons/link.svg', color: getGFColor(GFColor.alt),), + color: GFColor.alt, + type: GFType.outline, + ), + ], + ), + ], + ), + ), + + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Square Icons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GFButton( + onPressed: null, + shape: GFButtonShape.square, + child: Text( + "Primary", + ), + icon: SvgPicture.asset('lib/assets/icons/primary.svg') + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: null, + shape: GFButtonShape.square, + child: Text("Second"), + icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), + color: GFColor.secondary, + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + shape: GFButtonShape.square, + onPressed: null, + child: Text( + "Success", + ), + icon: SvgPicture.asset('lib/assets/icons/success.svg'), + color: GFColor.success, + ),) + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + shape: GFButtonShape.square, + child: Text( + "Warning", + ), + icon: SvgPicture.asset('lib/assets/icons/warning.svg'), + color: GFColor.warning, + + ), + GFButton( + onPressed: null, + shape: GFButtonShape.square, + child: Text( + "Danger", + ), + icon: SvgPicture.asset('lib/assets/icons/danger.svg'), + color: GFColor.danger, + ), + GFButton( + onPressed: null, + shape: GFButtonShape.square, + child: Text( + "Info", + ), + icon: SvgPicture.asset('lib/assets/icons/info.svg'), + color: GFColor.info, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + shape: GFButtonShape.square, + child: Text( + "Light", + ), + icon: SvgPicture.asset('lib/assets/icons/light.svg'), + type: GFType.solid, + color: GFColor.light, + ), + + GFButton( + onPressed: null, + shape: GFButtonShape.square, + child: Text( + "Dark", + style: TextStyle(color: getGFColor(GFColor.white)), + ), + icon: SvgPicture.asset('lib/assets/icons/dark.svg'), + color: GFColor.dark, + ), + GFButton( + onPressed: null, + shape: GFButtonShape.square, + child: Text( + "Alt", + ), + icon: SvgPicture.asset('lib/assets/icons/link.svg'), + color: GFColor.alt, + ), + ], + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Pills Icons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GFButton( + onPressed: null, + shape: GFButtonShape.pills, + child: Text( + "Primary", + ), + icon: SvgPicture.asset('lib/assets/icons/primary.svg') + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: null, + shape: GFButtonShape.pills, + child: Text("Second"), + icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), + color: GFColor.secondary, + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + shape: GFButtonShape.pills, + onPressed: null, + child: Text( + "Success", + ), + icon: SvgPicture.asset('lib/assets/icons/success.svg'), + color: GFColor.success, + ),) + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + shape: GFButtonShape.pills, + child: Text( + "Warning", + ), + icon: SvgPicture.asset('lib/assets/icons/warning.svg'), + color: GFColor.warning, + + ), + GFButton( + onPressed: null, + shape: GFButtonShape.pills, + child: Text( + "Danger", + ), + icon: SvgPicture.asset('lib/assets/icons/danger.svg'), + color: GFColor.danger, + ), + GFButton( + onPressed: null, + shape: GFButtonShape.pills, + child: Text( + "Info", + ), + icon: SvgPicture.asset('lib/assets/icons/info.svg'), + color: GFColor.info, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + shape: GFButtonShape.pills, + child: Text( + "Light", + ), + icon: SvgPicture.asset('lib/assets/icons/light.svg'), + type: GFType.solid, + color: GFColor.light, + ), + + GFButton( + onPressed: null, + shape: GFButtonShape.pills, + child: Text( + "Dark", + style: TextStyle(color: getGFColor(GFColor.white)), + ), + icon: SvgPicture.asset('lib/assets/icons/dark.svg'), + color: GFColor.dark, + ), + GFButton( + onPressed: null, + shape: GFButtonShape.pills, + child: Text( + "Alt", + ), + icon: SvgPicture.asset('lib/assets/icons/link.svg'), + color: GFColor.alt, + ), + ], + ), + ], + ), + ), + + + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Button Sizes', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text("Large", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.large, + icon: SvgPicture.asset('lib/assets/icons/primary.svg'), + ), + GFButton( + onPressed: null, + child: Text("Normal", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.medium, + icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), + ), + GFButton( + onPressed: null, + child: Text("Small", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.small, + icon: SvgPicture.asset('lib/assets/icons/info.svg'), + ), + ], + ), + + ], + ), + ), + + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Block Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text("Large", + ), + + size: GFSize.large, + icon: SvgPicture.asset('lib/assets/icons/primary.svg'), + + ), + + SizedBox( + height: 10, + ), + + GFButton( + onPressed: null, + blockButton: true, + child: Text("Normal", + ), + + size: GFSize.medium, + icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), + ), + + SizedBox( + height: 10, + ), + + + GFButton( + onPressed: null, + blockButton: true, + child: Text("Small", + ), + + size: GFSize.small, + icon: SvgPicture.asset('lib/assets/icons/success.svg'), + + ), + + ], + ), + ), + + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Icons Only', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFIconButton( + type: GFType.solid, + icon: SvgPicture.asset('lib/assets/icons/primary.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.secondary, + icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.success, + icon: SvgPicture.asset('lib/assets/icons/success.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.warning, + icon: SvgPicture.asset('lib/assets/icons/warning.svg'), onPressed: null), + + ], + ), + + + SizedBox( + height: 20, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFIconButton( + type: GFType.solid, + color: GFColor.danger, + icon: SvgPicture.asset('lib/assets/icons/danger.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.info, + icon: SvgPicture.asset('lib/assets/icons/info.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.light, + icon: SvgPicture.asset('lib/assets/icons/light.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.dark, + icon: SvgPicture.asset('lib/assets/icons/dark.svg'), onPressed: null), + + ], + ), + SizedBox( + height: 10, + ), + + + ], + ), + ), + + + ], + ) + ); + } +} diff --git a/demo_app/lib/screens/button/pill-buttons.dart b/demo_app/lib/screens/button/pill-buttons.dart new file mode 100644 index 00000000..a5fe8a7f --- /dev/null +++ b/demo_app/lib/screens/button/pill-buttons.dart @@ -0,0 +1,681 @@ +import 'package:flutter/material.dart'; +import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/tabs/gf_tabs.dart'; +import 'package:ui_kit/components/button/gf_button.dart'; +import 'package:ui_kit/size/gf_size.dart'; +import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_type.dart'; +import 'package:ui_kit/shape/gf_button_shape.dart'; +import 'package:ui_kit/colors/gf_color.dart'; +import 'package:ui_kit/components/card/gf_card.dart'; +import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; + +class PillsButtons extends StatefulWidget { + @override + _PillsButtonsState createState() => _PillsButtonsState(); +} + +class _PillsButtonsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: getGFColor(GFColor.dark), + leading: GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Image.asset('lib/assets/icons/back.png')), + title: Text( + 'Pills Buttons', + style: TextStyle(fontSize: 17), + ), + centerTitle: true, + ), + body: GFTabs( + height: MediaQuery.of(context).size.height, + tabBarColor: Color(0xFFD3E9ED), + initialIndex: 0, + length: 3, + indicatorColor: getGFColor(GFColor.info), + unselectedLabelColor: getGFColor(GFColor.danger), + labelColor: getGFColor(GFColor.warning), + tabs: [ + GFButton( + onPressed: null, + child: Text( + "Solid", + style: TextStyle(fontSize: 12), + ), + type: GFType.solid, + textColor: GFColor.white, + ), + GFButton( + onPressed: null, + child: Text( + "Outline", + style: TextStyle(fontSize: 12), + ), + type: GFType.outline, + shape: GFButtonShape.pills, + ), + GFButton( + onPressed: null, + text: 'Outline 2x', + textStyle: TextStyle(fontSize: 12, color: getGFColor(GFColor.dark)), + type: GFType.transparent, + ), + ], + tabBarView: GFTabBarView( + children: [ + Container( +// color: Colors.red, + child: ListView( + children: [ + Padding( + padding: EdgeInsets.only(left: 15, top: 30), + child: GFHeader( + text: 'Default', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + shape: GFButtonShape.pills, + child: Text( + "Primary", + ), + type: GFType.solid, + color: GFColor.primary, + ), + GFButton( + onPressed: null, + child: Text( + "Secondary", + ), + color: GFColor.secondary, + type: GFType.solid, + shape: GFButtonShape.pills, + ), + GFButton( + onPressed: null, + child: Text( + "Success", + ), + type: GFType.solid, + shape: GFButtonShape.pills, + color: GFColor.success, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + type: GFType.solid, + shape: GFButtonShape.pills, + color: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + type: GFType.solid, + shape: GFButtonShape.pills, + color: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + type: GFType.solid, + shape: GFButtonShape.pills, + color: GFColor.info, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + type: GFType.solid, + shape: GFButtonShape.pills, + color: GFColor.light, + ), + GFButton( + onPressed: null, + child: Text( + "Dark", + ), + type: GFType.solid, + shape: GFButtonShape.pills, + color: GFColor.dark, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + type: GFType.solid, + shape: GFButtonShape.pills, + color: GFColor.alt, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Transparent", + ), + type: GFType.solid, + color: GFColor.transparent, + ), + ], + ) + ], + ), + ), + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Button Sizes', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text("Large", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.large, + shape: GFButtonShape.pills, + ), + GFButton( + onPressed: null, + child: Text("Normal", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.medium, + shape: GFButtonShape.pills, + ), + GFButton( + onPressed: null, + child: Text("Small", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.small, + shape: GFButtonShape.pills, + ), + ], + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Block Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text("Large", + style: + TextStyle(color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.large, + shape: GFButtonShape.pills, + ), + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text("Normal", + style: + TextStyle(color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.medium, + shape: GFButtonShape.pills, + ), + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text("Small", + style: + TextStyle(color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.small, + shape: GFButtonShape.pills, + ), + ], + ), + ), + ], + ), + ), + + //tab 2 + Container( +// color: Colors.red, + child: ListView( + children: [ + Padding( + padding: EdgeInsets.only(left: 15, top: 30), + child: GFHeader( + text: 'Default', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + shape: GFButtonShape.pills, + child: Text( + "Primary", + ), + type: GFType.outline, + color: GFColor.primary, + ), + GFButton( + onPressed: null, + child: Text( + "Secondary", + ), + color: GFColor.secondary, + type: GFType.outline, + shape: GFButtonShape.pills, + ), + GFButton( + onPressed: null, + child: Text( + "Success", + ), + type: GFType.outline, + shape: GFButtonShape.pills, + color: GFColor.success, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + type: GFType.outline, + shape: GFButtonShape.pills, + color: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + type: GFType.outline, + shape: GFButtonShape.pills, + color: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + type: GFType.outline, + shape: GFButtonShape.pills, + color: GFColor.info, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + type: GFType.outline, + shape: GFButtonShape.pills, + color: GFColor.light, + ), + GFButton( + onPressed: null, + child: Text( + "Dark", + ), + type: GFType.outline, + shape: GFButtonShape.pills, + color: GFColor.dark, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + type: GFType.outline, + shape: GFButtonShape.pills, + color: GFColor.alt, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Transparent", + ), + type: GFType.solid, + color: GFColor.transparent, + ), + ], + ) + ], + ), + ), + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Button Sizes', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Large", + ), + color: GFColor.primary, + size: GFSize.large, + type: GFType.outline, + shape: GFButtonShape.pills, + ), + GFButton( + onPressed: null, + child: Text( + "Normal", + ), + color: GFColor.primary, + size: GFSize.medium, + type: GFType.outline, + shape: GFButtonShape.pills, + ), + GFButton( + onPressed: null, + child: Text( + "Small", + ), + color: GFColor.primary, + size: GFSize.small, + type: GFType.outline, + shape: GFButtonShape.pills, + ), + ], + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Block Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text( + "Large", + ), + color: GFColor.primary, + size: GFSize.large, + type: GFType.outline, + shape: GFButtonShape.pills, + ), + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text( + "Normal", + ), + color: GFColor.primary, + size: GFSize.medium, + type: GFType.outline, + shape: GFButtonShape.pills, + ), + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text( + "Small", + ), + color: GFColor.primary, + size: GFSize.small, + type: GFType.outline, + shape: GFButtonShape.pills, + ), + ], + ), + ), + ], + ), + ), + + //tab 3 + Container( + margin: EdgeInsets.only(top: 20, right: 20, left: 20), + height: 100, + child: Column( + children: [ + GFHeader( + text: 'Transparent', + type: GFHeadingType.typo6, + ), + Row( + children: [ + GFButton( + onPressed: null, + child: Text( + "Primary", + ), + type: GFType.transparent, + textColor: GFColor.primary, + ), + GFButton( + onPressed: null, + child: Text( + "Secondary", + ), + type: GFType.transparent, + textColor: GFColor.secondary, + ), + GFButton( + onPressed: null, + child: Text( + "Success", + ), + type: GFType.transparent, + textColor: GFColor.success, + ), + ], + ), + Row( + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + type: GFType.transparent, + textColor: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + type: GFType.transparent, + textColor: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Dark", + ), + type: GFType.transparent, + textColor: GFColor.dark, + ), + ], + ), + Row( + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + type: GFType.transparent, + textColor: GFColor.light, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + type: GFType.transparent, + textColor: GFColor.info, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + type: GFType.transparent, + textColor: GFColor.alt, + ), + ], + ), + ], + )) + ], + ), + ), + ); + } +} diff --git a/demo_app/lib/screens/button/shadow-buttons.dart b/demo_app/lib/screens/button/shadow-buttons.dart new file mode 100644 index 00000000..546509ba --- /dev/null +++ b/demo_app/lib/screens/button/shadow-buttons.dart @@ -0,0 +1,793 @@ +import 'package:flutter/material.dart'; +import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/tabs/gf_tabs.dart'; +import 'package:ui_kit/components/button/gf_button.dart'; +import 'package:ui_kit/size/gf_size.dart'; +import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_type.dart'; +import 'package:ui_kit/shape/gf_button_shape.dart'; +import 'package:ui_kit/colors/gf_color.dart'; +import 'package:ui_kit/components/card/gf_card.dart'; +import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; + +class ShadowButtons extends StatefulWidget { + @override + _ShadowButtonsState createState() => _ShadowButtonsState(); +} + +class _ShadowButtonsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: getGFColor(GFColor.dark), + leading: GestureDetector( + onTap: (){ + Navigator.pop(context); + }, + child:Image.asset('lib/assets/icons/back.png') + ), + title: Text( + 'Shadow Buttons', + style: TextStyle(fontSize: 17), + ), + centerTitle: true, + ), + body: GFTabs( + height: MediaQuery.of(context).size.height, + tabBarColor: Color(0xFFD3E9ED), + initialIndex: 0, + length: 3, + indicatorColor: getGFColor(GFColor.info), + unselectedLabelColor: getGFColor(GFColor.danger), + labelColor: getGFColor(GFColor.warning), + tabs: [ + GFButton( + onPressed: null, + child: Text( + "Solid", + style: TextStyle(fontSize: 12), + ), + type: GFType.solid, + textColor: GFColor.white, + ), + GFButton( + onPressed: null, + child: Text( + "Outline", + style: TextStyle(fontSize: 12), + ), + type: GFType.outline, + shape: GFButtonShape.pills, + ), + GFButton( + onPressed: null, + text: 'Outline 2x', + textStyle: TextStyle(fontSize: 12, color: getGFColor(GFColor.dark)), + type: GFType.transparent, + ), + ], + tabBarView: GFTabBarView( + children: [ + Container( +// color: Colors.red, + child: ListView( + children: [ + Padding(padding: EdgeInsets.only(left:15, top:30), + child: GFHeader( + text: 'Default', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + shape: GFButtonShape.standard, + + buttonBoxShadow: true, + child: Text("Primary", + style: TextStyle( + color: getGFColor(GFColor.white))), + + color: GFColor.primary, + ), + GFButton( + onPressed: null, + child: Text("Secondary", + style: TextStyle( + color: getGFColor(GFColor.white))), + + color: GFColor.secondary, + buttonBoxShadow: true, + ), + GFButton( + onPressed: null, + child: Text( + "Success", + ), + buttonBoxShadow: true, + color: GFColor.success, + ), + ], + ), + + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + buttonBoxShadow: true, + color: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text("Danger", + style: TextStyle( + color: getGFColor(GFColor.white))), + buttonBoxShadow: true, + color: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + buttonBoxShadow: true, + color: GFColor.info, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + buttonBoxShadow: true, + color: GFColor.light, + ), + + GFButton( + onPressed: null, + child: Text( + "Dark", + style: + TextStyle(color: getGFColor(GFColor.white)), + ), + buttonBoxShadow: true, + color: GFColor.dark, + ), + GFButton( + onPressed: null, + child: Text("Alt", + style: TextStyle( + color: getGFColor(GFColor.white))), + buttonBoxShadow: true, + color: GFColor.alt, + ), + ], + ), +SizedBox( + height: 10, +) +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: null, +// child: Text( +// "Transparent", +// ), buttonBoxShadow: true, +// color: GFColor.transparent, +// ), +// ], +// ) + ], + ), + ), + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Transparent Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Primary", + ), + type: GFType.transparent, + textColor: GFColor.primary, + color: GFColor.dark, + ), + GFButton( + onPressed: null, + child: Text( + "Secondary", + ), + type: GFType.transparent, + textColor: GFColor.secondary, + ), + GFButton( + onPressed: null, + child: Text( + "Success", + ), + type: GFType.transparent, + textColor: GFColor.success, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + type: GFType.transparent, + textColor: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + type: GFType.transparent, + textColor: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + type: GFType.transparent, + textColor: GFColor.info, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + type: GFType.transparent, + textColor: GFColor.light, + ), + GFButton( + onPressed: null, + child: Text( + "Dark", + ), + type: GFType.transparent, + textColor: GFColor.dark, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + type: GFType.transparent, + textColor: GFColor.alt, + ), + ], + ), + ], + ), + ), + + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Button Sizes', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text("Large", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.large, + buttonBoxShadow: true, + ), + GFButton( + onPressed: null, + child: Text("Normal", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.medium, + buttonBoxShadow: true, + ), + GFButton( + onPressed: null, + child: Text("Small", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.small, + buttonBoxShadow: true, + ), + ], + ), + + ], + ), + ), + + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Block Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text("Large", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.large, + buttonBoxShadow: true, + ), + + SizedBox( + height: 10, + ), + + GFButton( + onPressed: null, + blockButton: true, + child: Text("Normal", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.medium, + buttonBoxShadow: true, + ), + + SizedBox( + height: 10, + ), + + + GFButton( + onPressed: null, + blockButton: true, + child: Text("Small", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.small, + buttonBoxShadow: true, + ), + + ], + ), + ), + ], + ), + ), + + + //tab 2 + Container( +// color: Colors.red, + child: ListView( + children: [ + + Padding(padding: EdgeInsets.only(left:15, top:30), + child: GFHeader( + text: 'Default', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Primary", + + ), + + + type: GFType.outline, + + + + + ), + + + GFButton( + onPressed: null, + child: Text("Secondary"), + type: GFType.outline, + color: GFColor.secondary, + ), + GFButton( + onPressed: null, + child: Text( + "Success", + ), + type: GFType.outline, + color: GFColor.success, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + type: GFType.outline, + color: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + type: GFType.outline, + color: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + type: GFType.outline, + color: GFColor.info, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + type: GFType.outline, + color: GFColor.light, + ), + + GFButton( + onPressed: null, + child: Text( + "Dark", + ), + type: GFType.outline, + color: GFColor.dark, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + type: GFType.outline, + color: GFColor.alt, + ), + ], + ), + ], + ), + ), + + + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Button Sizes', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text("Large", + ), + color: GFColor.primary, + size: GFSize.large, + type: GFType.outline, + ), + GFButton( + onPressed: null, + child: Text("Normal", + ), + color: GFColor.primary, + size: GFSize.medium, + type: GFType.outline, + ), + GFButton( + onPressed: null, + child: Text("Small", + ), + color: GFColor.primary, + size: GFSize.small, + type: GFType.outline, + ), + ], + ), + + ], + ), + ), + + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Block Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text("Large", + ), + color: GFColor.primary, + size: GFSize.large, + type: GFType.outline, + ), + + SizedBox( + height: 10, + ), + + GFButton( + onPressed: null, + blockButton: true, + child: Text("Normal", + ), + color: GFColor.primary, + size: GFSize.medium, + type: GFType.outline, + ), + + SizedBox( + height: 10, + ), + + + GFButton( + onPressed: null, + blockButton: true, + child: Text("Small", + ), + color: GFColor.primary, + size: GFSize.small, + type: GFType.outline, + ), + + ], + ), + ), + + ], + ), + ), + + + //tab 3 + Container( + margin: EdgeInsets.only(top: 20, right: 20, left: 20), + height: 100, + child: Column( + children: [ + GFHeader( + text: 'Transparent', + type: GFHeadingType.typo6, + ), + Row( + children: [ + GFButton( + onPressed: null, + child: Text( + "Primary", + ), + type: GFType.transparent, + textColor: GFColor.primary, + ), + GFButton( + onPressed: null, + child: Text( + "Secondary", + ), + type: GFType.transparent, + textColor: GFColor.secondary, + ), + GFButton( + onPressed: null, + child: Text( + "Success", + ), + type: GFType.transparent, + textColor: GFColor.success, + ), + ], + ), + Row( + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + type: GFType.transparent, + textColor: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + type: GFType.transparent, + textColor: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Dark", + ), + type: GFType.transparent, + textColor: GFColor.dark, + ), + ], + ), + Row( + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + type: GFType.transparent, + textColor: GFColor.light, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + type: GFType.transparent, + textColor: GFColor.info, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + type: GFType.transparent, + textColor: GFColor.alt, + ), + ], + ), + ], + )) + ], + ), + ), + ); + } +} diff --git a/demo_app/lib/screens/button/social-buttons.dart b/demo_app/lib/screens/button/social-buttons.dart new file mode 100644 index 00000000..05f65dd9 --- /dev/null +++ b/demo_app/lib/screens/button/social-buttons.dart @@ -0,0 +1,337 @@ +import 'package:flutter/material.dart'; +import 'package:ui_kit/colors/gf_color.dart'; +import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/components/button/gf_button.dart'; +import 'package:ui_kit/components/button/gf_icon_button.dart'; +import 'package:ui_kit/components/card/gf_card.dart'; +import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/shape/gf_button_shape.dart'; +import 'package:ui_kit/types/gf_type.dart'; +import 'package:ui_kit/size/gf_size.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class SocialButtons extends StatefulWidget { + @override + _SocialButtonsState createState() => _SocialButtonsState(); +} + +class _SocialButtonsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: getGFColor(GFColor.dark), + leading: GestureDetector( + onTap: (){ + Navigator.pop(context); + }, + child:Image.asset('lib/assets/icons/back.png') + ), + title: Text( + 'Social Buttons', + style: TextStyle(fontSize: 17), + ), + centerTitle: true, + ), + + body: ListView( + children: [ + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Social Buttons Full', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GFButton( + onPressed: null, + child: Text( + "FB", + ), + icon: SvgPicture.asset('lib/assets/icons/fb.svg') + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: null, + child: Text("Twitter"), + icon: SvgPicture.asset('lib/assets/icons/twitter.svg'), + color: GFColor.secondary, + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: null, + child: Text( + "Whtsap", + ), + icon: SvgPicture.asset('lib/assets/icons/whatsapp.svg'), + color: GFColor.success, + ),) + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Google +", + ), + icon: SvgPicture.asset('lib/assets/icons/google.svg'), + color: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Dribble", + ), + icon: SvgPicture.asset('lib/assets/icons/dribble.svg'), + color: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "LinkedIn", + ), + icon: SvgPicture.asset('lib/assets/icons/linkedin.svg'), + color: GFColor.info, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Youtube", + ), + icon: SvgPicture.asset('lib/assets/icons/youtube.svg'), + type: GFType.solid, + color: GFColor.light, + ), + + GFButton( + onPressed: null, + child: Text( + "Slack", + style: TextStyle(color: getGFColor(GFColor.white)), + ), + icon: SvgPicture.asset('lib/assets/icons/slack.svg'), + color: GFColor.dark, + ), + GFButton( + onPressed: null, + child: Text( + "Pinterest", + ), + icon: SvgPicture.asset('lib/assets/icons/pinterest.svg'), + color: GFColor.alt, + ), + ], + ), + ], + ), + ), + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Social Buttons Icons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFIconButton( + type: GFType.solid, + icon: SvgPicture.asset('lib/assets/icons/fb.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.secondary, + icon: SvgPicture.asset('lib/assets/icons/twitter.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.success, + icon: SvgPicture.asset('lib/assets/icons/whatsapp.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.warning, + icon: SvgPicture.asset('lib/assets/icons/google.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.danger, + icon: SvgPicture.asset('lib/assets/icons/dribble.svg'), onPressed: null), + + ], + ), + + + SizedBox( + height: 20, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + + GFIconButton( + type: GFType.solid, + color: GFColor.info, + icon: SvgPicture.asset('lib/assets/icons/linkedin.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.light, + icon: SvgPicture.asset('lib/assets/icons/youtube.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.dark, + icon: SvgPicture.asset('lib/assets/icons/slack.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.danger, + + icon: SvgPicture.asset('lib/assets/icons/pinterest.svg'), onPressed: null), + + ], + ), + SizedBox( + height: 10, + ), + + + ], + ), + ), + + + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Floating Social Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFIconButton( + type: GFType.solid, + shape: GFButtonShape.pills, + icon: SvgPicture.asset('lib/assets/icons/fb.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.secondary, + shape: GFButtonShape.pills, + icon: SvgPicture.asset('lib/assets/icons/twitter.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.success, + shape: GFButtonShape.pills, + icon: SvgPicture.asset('lib/assets/icons/whatsapp.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.warning, + shape: GFButtonShape.pills, + icon: SvgPicture.asset('lib/assets/icons/google.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.danger, + shape: GFButtonShape.pills, + icon: SvgPicture.asset('lib/assets/icons/dribble.svg'), onPressed: null), + + ], + ), + + + SizedBox( + height: 20, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + + GFIconButton( + type: GFType.solid, + color: GFColor.info, + shape: GFButtonShape.pills, + icon: SvgPicture.asset('lib/assets/icons/linkedin.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.light, + shape: GFButtonShape.pills, + icon: SvgPicture.asset('lib/assets/icons/youtube.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.dark, + shape: GFButtonShape.pills, + icon: SvgPicture.asset('lib/assets/icons/slack.svg'), onPressed: null), + GFIconButton( + type: GFType.solid, + color: GFColor.danger, + shape: GFButtonShape.pills, + icon: SvgPicture.asset('lib/assets/icons/pinterest.svg'), onPressed: null), + + ], + ), + SizedBox( + height: 10, + ), + + + ], + ), + ), + + + ], + ), + ); + } +} diff --git a/demo_app/lib/screens/button/square-buttons.dart b/demo_app/lib/screens/button/square-buttons.dart new file mode 100644 index 00000000..d6dd285b --- /dev/null +++ b/demo_app/lib/screens/button/square-buttons.dart @@ -0,0 +1,681 @@ +import 'package:flutter/material.dart'; +import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/tabs/gf_tabs.dart'; +import 'package:ui_kit/components/button/gf_button.dart'; +import 'package:ui_kit/size/gf_size.dart'; +import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_type.dart'; +import 'package:ui_kit/shape/gf_button_shape.dart'; +import 'package:ui_kit/colors/gf_color.dart'; +import 'package:ui_kit/components/card/gf_card.dart'; +import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; + +class SquareButtons extends StatefulWidget { + @override + _SquareButtonsState createState() => _SquareButtonsState(); +} + +class _SquareButtonsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: getGFColor(GFColor.dark), + leading: GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Image.asset('lib/assets/icons/back.png')), + title: Text( + 'Square Buttons', + style: TextStyle(fontSize: 17), + ), + centerTitle: true, + ), + body: GFTabs( + height: MediaQuery.of(context).size.height, + tabBarColor: Color(0xFFD3E9ED), + initialIndex: 0, + length: 3, + indicatorColor: getGFColor(GFColor.info), + unselectedLabelColor: getGFColor(GFColor.danger), + labelColor: getGFColor(GFColor.warning), + tabs: [ + GFButton( + onPressed: null, + child: Text( + "Solid", + style: TextStyle(fontSize: 12), + ), + type: GFType.solid, + textColor: GFColor.white, + ), + GFButton( + onPressed: null, + child: Text( + "Outline", + style: TextStyle(fontSize: 12), + ), + type: GFType.outline, + shape: GFButtonShape.square, + ), + GFButton( + onPressed: null, + text: 'Outline 2x', + textStyle: TextStyle(fontSize: 12, color: getGFColor(GFColor.dark)), + type: GFType.transparent, + ), + ], + tabBarView: GFTabBarView( + children: [ + Container( +// color: Colors.red, + child: ListView( + children: [ + Padding( + padding: EdgeInsets.only(left: 15, top: 30), + child: GFHeader( + text: 'Default', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + shape: GFButtonShape.square, + child: Text( + "Primary", + ), + type: GFType.solid, + color: GFColor.primary, + ), + GFButton( + onPressed: null, + child: Text( + "Secondary", + ), + color: GFColor.secondary, + type: GFType.solid, + shape: GFButtonShape.square, + ), + GFButton( + onPressed: null, + child: Text( + "Success", + ), + type: GFType.solid, + shape: GFButtonShape.square, + color: GFColor.success, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + type: GFType.solid, + shape: GFButtonShape.square, + color: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + type: GFType.solid, + shape: GFButtonShape.square, + color: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + type: GFType.solid, + shape: GFButtonShape.square, + color: GFColor.info, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + type: GFType.solid, + shape: GFButtonShape.square, + color: GFColor.light, + ), + GFButton( + onPressed: null, + child: Text( + "Dark", + ), + type: GFType.solid, + shape: GFButtonShape.square, + color: GFColor.dark, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + type: GFType.solid, + shape: GFButtonShape.square, + color: GFColor.alt, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Transparent", + ), + type: GFType.solid, + color: GFColor.transparent, + ), + ], + ) + ], + ), + ), + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Button Sizes', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text("Large", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.large, + shape: GFButtonShape.square, + ), + GFButton( + onPressed: null, + child: Text("Normal", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.medium, + shape: GFButtonShape.square, + ), + GFButton( + onPressed: null, + child: Text("Small", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.small, + shape: GFButtonShape.square, + ), + ], + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Block Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text("Large", + style: + TextStyle(color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.large, + shape: GFButtonShape.square, + ), + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text("Normal", + style: + TextStyle(color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.medium, + shape: GFButtonShape.square, + ), + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text("Small", + style: + TextStyle(color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.small, + shape: GFButtonShape.square, + ), + ], + ), + ), + ], + ), + ), + + //tab 2 + Container( +// color: Colors.red, + child: ListView( + children: [ + Padding( + padding: EdgeInsets.only(left: 15, top: 30), + child: GFHeader( + text: 'Default', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + shape: GFButtonShape.square, + child: Text( + "Primary", + ), + type: GFType.outline, + color: GFColor.primary, + ), + GFButton( + onPressed: null, + child: Text( + "Secondary", + ), + color: GFColor.secondary, + type: GFType.outline, + shape: GFButtonShape.square, + ), + GFButton( + onPressed: null, + child: Text( + "Success", + ), + type: GFType.outline, + shape: GFButtonShape.square, + color: GFColor.success, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + type: GFType.outline, + shape: GFButtonShape.square, + color: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + type: GFType.outline, + shape: GFButtonShape.square, + color: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + type: GFType.outline, + shape: GFButtonShape.square, + color: GFColor.info, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + type: GFType.outline, + shape: GFButtonShape.square, + color: GFColor.light, + ), + GFButton( + onPressed: null, + child: Text( + "Dark", + ), + type: GFType.outline, + shape: GFButtonShape.square, + color: GFColor.dark, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + type: GFType.outline, + shape: GFButtonShape.square, + color: GFColor.alt, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Transparent", + ), + type: GFType.solid, + color: GFColor.transparent, + ), + ], + ) + ], + ), + ), + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Button Sizes', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: null, + child: Text( + "Large", + ), + color: GFColor.primary, + size: GFSize.large, + type: GFType.outline, + shape: GFButtonShape.square, + ), + GFButton( + onPressed: null, + child: Text( + "Normal", + ), + color: GFColor.primary, + size: GFSize.medium, + type: GFType.outline, + shape: GFButtonShape.square, + ), + GFButton( + onPressed: null, + child: Text( + "Small", + ), + color: GFColor.primary, + size: GFSize.small, + type: GFType.outline, + shape: GFButtonShape.square, + ), + ], + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Block Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text( + "Large", + ), + color: GFColor.primary, + size: GFSize.large, + type: GFType.outline, + shape: GFButtonShape.square, + ), + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text( + "Normal", + ), + color: GFColor.primary, + size: GFSize.medium, + type: GFType.outline, + shape: GFButtonShape.square, + ), + SizedBox( + height: 10, + ), + GFButton( + onPressed: null, + blockButton: true, + child: Text( + "Small", + ), + color: GFColor.primary, + size: GFSize.small, + type: GFType.outline, + shape: GFButtonShape.square, + ), + ], + ), + ), + ], + ), + ), + + //tab 3 + Container( + margin: EdgeInsets.only(top: 20, right: 20, left: 20), + height: 100, + child: Column( + children: [ + GFHeader( + text: 'Transparent', + type: GFHeadingType.typo6, + ), + Row( + children: [ + GFButton( + onPressed: null, + child: Text( + "Primary", + ), + type: GFType.transparent, + textColor: GFColor.primary, + ), + GFButton( + onPressed: null, + child: Text( + "Secondary", + ), + type: GFType.transparent, + textColor: GFColor.secondary, + ), + GFButton( + onPressed: null, + child: Text( + "Success", + ), + type: GFType.transparent, + textColor: GFColor.success, + ), + ], + ), + Row( + children: [ + GFButton( + onPressed: null, + child: Text( + "Warning", + ), + type: GFType.transparent, + textColor: GFColor.warning, + ), + GFButton( + onPressed: null, + child: Text( + "Danger", + ), + type: GFType.transparent, + textColor: GFColor.danger, + ), + GFButton( + onPressed: null, + child: Text( + "Dark", + ), + type: GFType.transparent, + textColor: GFColor.dark, + ), + ], + ), + Row( + children: [ + GFButton( + onPressed: null, + child: Text( + "Light", + ), + type: GFType.transparent, + textColor: GFColor.light, + ), + GFButton( + onPressed: null, + child: Text( + "Info", + ), + type: GFType.transparent, + textColor: GFColor.info, + ), + GFButton( + onPressed: null, + child: Text( + "Alt", + ), + type: GFType.transparent, + textColor: GFColor.alt, + ), + ], + ), + ], + )) + ], + ), + ), + ); + } +} diff --git a/demo_app/lib/screens/buttons.dart b/demo_app/lib/screens/button/standard-buttons.dart similarity index 60% rename from demo_app/lib/screens/buttons.dart rename to demo_app/lib/screens/button/standard-buttons.dart index 0a7055e3..11d83cf7 100644 --- a/demo_app/lib/screens/buttons.dart +++ b/demo_app/lib/screens/button/standard-buttons.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:ui_kit/components/header/gf_header.dart'; import 'package:ui_kit/components/tabs/gf_tabs.dart'; import 'package:ui_kit/components/button/gf_button.dart'; +import 'package:ui_kit/size/gf_size.dart'; import 'package:ui_kit/types/gf_heading_type.dart'; import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/shape/gf_button_shape.dart'; @@ -9,21 +10,28 @@ import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/card/gf_card.dart'; import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; -class Buttons extends StatefulWidget { +class StandardButtons extends StatefulWidget { @override - _ButtonsState createState() => _ButtonsState(); + _StandardButtonsState createState() => _StandardButtonsState(); } -class _ButtonsState extends State { +class _StandardButtonsState extends State { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: getGFColor(GFColor.dark), + leading: GestureDetector( + onTap: (){ + Navigator.pop(context); + }, + child:Image.asset('lib/assets/icons/back.png') + ), title: Text( - 'Buttons', - style: TextStyle(fontSize: 14), + 'Standard Buttons', + style: TextStyle(fontSize: 17), ), + centerTitle: true, ), body: GFTabs( height: MediaQuery.of(context).size.height, @@ -54,7 +62,7 @@ class _ButtonsState extends State { ), GFButton( onPressed: null, - text: 'Transparent', + text: 'Outline 2x', textStyle: TextStyle(fontSize: 12, color: getGFColor(GFColor.dark)), type: GFType.transparent, ), @@ -65,15 +73,21 @@ class _ButtonsState extends State { // color: Colors.red, child: ListView( children: [ + Padding(padding: EdgeInsets.only(left:15, top:30), + child: GFHeader( + text: 'Default', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), GFCard( content: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( - text: 'Standard', - type: GFHeadingType.typo6, - ), + SizedBox( height: 10, ), @@ -82,6 +96,7 @@ class _ButtonsState extends State { children: [ GFButton( onPressed: null, + shape: GFButtonShape.standard, child: Text("Primary", style: TextStyle( color: getGFColor(GFColor.white))), @@ -106,6 +121,10 @@ class _ButtonsState extends State { ), ], ), + + SizedBox( + height: 10, + ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -128,32 +147,28 @@ class _ButtonsState extends State { GFButton( onPressed: null, child: Text( - "Light", + "Info", ), type: GFType.solid, - color: GFColor.light, + color: GFColor.info, ), ], ), + SizedBox( + height: 10, + ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( onPressed: null, child: Text( - "Info", + "Light", ), type: GFType.solid, - color: GFColor.info, - ), - GFButton( - onPressed: null, - child: Text("Alt", - style: TextStyle( - color: getGFColor(GFColor.white))), - type: GFType.solid, - color: GFColor.alt, + color: GFColor.light, ), + GFButton( onPressed: null, child: Text( @@ -164,6 +179,14 @@ class _ButtonsState extends State { type: GFType.solid, color: GFColor.dark, ), + GFButton( + onPressed: null, + child: Text("Alt", + style: TextStyle( + color: getGFColor(GFColor.white))), + type: GFType.solid, + color: GFColor.alt, + ), ], ), Row( @@ -182,44 +205,49 @@ class _ButtonsState extends State { ], ), ), + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Transparent Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + GFCard( content: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( - text: 'Pills', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( onPressed: null, - child: Text("Primary", - style: TextStyle( - color: getGFColor(GFColor.white))), - color: GFColor.primary, - shape: GFButtonShape.pills, + child: Text( + "Primary", + ), + type: GFType.transparent, + textColor: GFColor.primary, + color: GFColor.dark, ), GFButton( onPressed: null, - child: Text("Secondary", - style: TextStyle( - color: getGFColor(GFColor.white))), - color: GFColor.secondary, - shape: GFButtonShape.pills, + child: Text( + "Secondary", + ), + type: GFType.transparent, + textColor: GFColor.secondary, ), GFButton( onPressed: null, child: Text( "Success", ), - shape: GFButtonShape.pills, - color: GFColor.success, + type: GFType.transparent, + textColor: GFColor.success, ), ], ), @@ -231,24 +259,24 @@ class _ButtonsState extends State { child: Text( "Warning", ), - shape: GFButtonShape.pills, - color: GFColor.warning, + type: GFType.transparent, + textColor: GFColor.warning, ), GFButton( onPressed: null, - child: Text("Danger", - style: TextStyle( - color: getGFColor(GFColor.white))), - shape: GFButtonShape.pills, - color: GFColor.danger, + child: Text( + "Danger", + ), + type: GFType.transparent, + textColor: GFColor.danger, ), GFButton( onPressed: null, child: Text( - "Light", + "Info", ), - shape: GFButtonShape.pills, - color: GFColor.light, + type: GFType.transparent, + textColor: GFColor.info, ), ], ), @@ -258,56 +286,50 @@ class _ButtonsState extends State { GFButton( onPressed: null, child: Text( - "Info", + "Light", ), - shape: GFButtonShape.pills, - color: GFColor.info, - ), - GFButton( - onPressed: null, - child: Text("Alt", - style: TextStyle( - color: getGFColor(GFColor.white))), - shape: GFButtonShape.pills, - color: GFColor.alt, + type: GFType.transparent, + textColor: GFColor.light, ), GFButton( onPressed: null, child: Text( "Dark", - style: - TextStyle(color: getGFColor(GFColor.white)), ), - shape: GFButtonShape.pills, - color: GFColor.dark, + type: GFType.transparent, + textColor: GFColor.dark, ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ GFButton( onPressed: null, child: Text( - "Transparent", + "Alt", ), - shape: GFButtonShape.pills, - color: GFColor.transparent, + type: GFType.transparent, + textColor: GFColor.alt, ), ], - ) + ), ], ), ), + + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Button Sizes', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + GFCard( content: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( - text: 'Square', - type: GFHeadingType.typo6, - ), SizedBox( height: 10, ), @@ -316,122 +338,122 @@ class _ButtonsState extends State { children: [ GFButton( onPressed: null, - child: Text("Primary", + child: Text("Large", style: TextStyle( color: getGFColor(GFColor.white))), color: GFColor.primary, - shape: GFButtonShape.square, + size: GFSize.large, ), GFButton( onPressed: null, - child: Text("Secondary", + child: Text("Normal", style: TextStyle( color: getGFColor(GFColor.white))), - color: GFColor.secondary, - shape: GFButtonShape.square, - ), - GFButton( - onPressed: null, - child: Text( - "Success", - ), - shape: GFButtonShape.square, - color: GFColor.success, - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: null, - child: Text( - "Warning", - ), - shape: GFButtonShape.square, - color: GFColor.warning, + color: GFColor.primary, + size: GFSize.medium, ), GFButton( onPressed: null, - child: Text("Danger", + child: Text("Small", style: TextStyle( color: getGFColor(GFColor.white))), - shape: GFButtonShape.square, - color: GFColor.danger, - ), - GFButton( - onPressed: null, - child: Text( - "Light", - ), - shape: GFButtonShape.square, - color: GFColor.light, + color: GFColor.primary, + size: GFSize.small, ), ], ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: null, - child: Text( - "Info", - ), - shape: GFButtonShape.square, - color: GFColor.info, - ), - GFButton( - onPressed: null, - child: Text("Alt", - style: TextStyle( - color: getGFColor(GFColor.white))), - shape: GFButtonShape.square, - color: GFColor.alt, - ), - GFButton( - onPressed: null, - child: Text( - "Dark", - style: - TextStyle(color: getGFColor(GFColor.white)), - ), - shape: GFButtonShape.square, - color: GFColor.dark, - ), - ], + + ], + ), + ), + + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Block Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: null, - child: Text( - "Transparent", - ), - shape: GFButtonShape.square, - color: GFColor.transparent, - ), - ], - ) + GFButton( + onPressed: null, + blockButton: true, + child: Text("Large", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.large, + ), + + SizedBox( + height: 10, + ), + + GFButton( + onPressed: null, + blockButton: true, + child: Text("Normal", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.medium, + ), + + SizedBox( + height: 10, + ), + + + GFButton( + onPressed: null, + blockButton: true, + child: Text("Small", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.small, + ), + ], ), ), ], ), ), + + + //tab 2 Container( // color: Colors.red, child: ListView( children: [ + + Padding(padding: EdgeInsets.only(left:15, top:30), + child: GFHeader( + text: 'Default', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), GFCard( content: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( - text: 'Standard', - type: GFHeadingType.typo6, - ), SizedBox( height: 10, ), @@ -483,10 +505,10 @@ class _ButtonsState extends State { GFButton( onPressed: null, child: Text( - "Light", + "Info", ), type: GFType.outline, - color: GFColor.light, + color: GFColor.info, ), ], ), @@ -496,41 +518,52 @@ class _ButtonsState extends State { GFButton( onPressed: null, child: Text( - "Info", + "Light", ), type: GFType.outline, - color: GFColor.info, + color: GFColor.light, ), + GFButton( onPressed: null, child: Text( - "Alt", + "Dark", ), type: GFType.outline, - color: GFColor.alt, + color: GFColor.dark, ), GFButton( onPressed: null, child: Text( - "Dark", + "Alt", ), type: GFType.outline, - color: GFColor.dark, + color: GFColor.alt, ), ], ), ], ), ), + + + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Button Sizes', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + GFCard( content: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( - text: 'Pills', - type: GFHeadingType.typo6, - ), SizedBox( height: 10, ), @@ -539,214 +572,104 @@ class _ButtonsState extends State { children: [ GFButton( onPressed: null, - child: Text( - "Primary", - ), - type: GFType.outline, + child: Text("Large", + ), color: GFColor.primary, - shape: GFButtonShape.pills, - ), - GFButton( - onPressed: null, - child: Text( - "Secondary", - ), - color: GFColor.secondary, - shape: GFButtonShape.pills, - type: GFType.outline, - ), - GFButton( - onPressed: null, - child: Text( - "Success", - ), - shape: GFButtonShape.pills, - color: GFColor.success, - type: GFType.outline, - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: null, - child: Text( - "Warning", - ), - shape: GFButtonShape.pills, - color: GFColor.warning, - type: GFType.outline, - ), - GFButton( - onPressed: null, - child: Text( - "Danger", - ), - shape: GFButtonShape.pills, - color: GFColor.danger, - type: GFType.outline, - ), - GFButton( - onPressed: null, - child: Text( - "Light", - ), - shape: GFButtonShape.pills, - color: GFColor.light, - type: GFType.outline, - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: null, - child: Text( - "Info", - ), - shape: GFButtonShape.pills, - color: GFColor.info, + size: GFSize.large, type: GFType.outline, ), GFButton( onPressed: null, - child: Text( - "Alt", - ), - shape: GFButtonShape.pills, - color: GFColor.alt, + child: Text("Normal", + ), + color: GFColor.primary, + size: GFSize.medium, type: GFType.outline, ), GFButton( onPressed: null, - child: Text( - "Dark", - ), - shape: GFButtonShape.pills, - color: GFColor.dark, + child: Text("Small", + ), + color: GFColor.primary, + size: GFSize.small, type: GFType.outline, ), ], ), + ], ), ), + + + Padding(padding: EdgeInsets.only(left:15, top:20), + child: GFHeader( + text: 'Block Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + + ), + ), + + GFCard( content: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( - text: 'Square', - type: GFHeadingType.typo6, - ), SizedBox( height: 10, ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: null, - child: Text( - "Primary", - ), - type: GFType.outline, - color: GFColor.primary, - shape: GFButtonShape.square, - ), - GFButton( - onPressed: null, - child: Text( - "Secondary", - ), - color: GFColor.secondary, - shape: GFButtonShape.square, - type: GFType.outline, - ), - GFButton( - onPressed: null, - child: Text( - "Success", + GFButton( + onPressed: null, + blockButton: true, + child: Text("Large", ), - shape: GFButtonShape.square, - color: GFColor.success, - type: GFType.outline, - ), - ], + color: GFColor.primary, + size: GFSize.large, + type: GFType.outline, ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: null, - child: Text( - "Warning", - ), - shape: GFButtonShape.square, - color: GFColor.warning, - type: GFType.outline, - ), - GFButton( - onPressed: null, - child: Text( - "Danger", - ), - shape: GFButtonShape.square, - color: GFColor.danger, - type: GFType.outline, - ), - GFButton( - onPressed: null, - child: Text( - "Light", - ), - shape: GFButtonShape.square, - color: GFColor.light, - type: GFType.outline, - ), - ], + + SizedBox( + height: 10, ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: null, - child: Text( - "Info", - ), - shape: GFButtonShape.square, - color: GFColor.info, - type: GFType.outline, - ), - GFButton( - onPressed: null, - child: Text( - "Alt", - ), - shape: GFButtonShape.square, - color: GFColor.alt, - type: GFType.outline, - ), - GFButton( - onPressed: null, - child: Text( - "Dark", + + GFButton( + onPressed: null, + blockButton: true, + child: Text("Normal", ), - shape: GFButtonShape.square, - color: GFColor.dark, - type: GFType.outline, - ), - ], + color: GFColor.primary, + size: GFSize.medium, + type: GFType.outline, ), + + SizedBox( + height: 10, + ), + + + GFButton( + onPressed: null, + blockButton: true, + child: Text("Small", + ), + color: GFColor.primary, + size: GFSize.small, + type: GFType.outline, + ), + ], ), ), + ], ), ), + + + //tab 3 Container( margin: EdgeInsets.only(top: 20, right: 20, left: 20), height: 100, diff --git a/demo_app/lib/screens/home.dart b/demo_app/lib/screens/home.dart index 926acdd3..0dda68b8 100644 --- a/demo_app/lib/screens/home.dart +++ b/demo_app/lib/screens/home.dart @@ -1,3 +1,4 @@ +import 'package:demo_app/screens/button/button-types.dart'; import 'package:demo_app/screens/cards.dart'; import 'package:demo_app/screens/icon-button.dart'; import 'package:demo_app/screens/list-tiles.dart'; @@ -5,11 +6,12 @@ import 'package:flutter/material.dart'; import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/card/gf_card.dart'; import 'avatars.dart'; -import 'buttons.dart'; import 'toggles.dart'; import 'headers.dart'; import 'toasts.dart'; import 'badges.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import '../screens/button/standard-buttons.dart'; class HomePage extends StatefulWidget { @override @@ -22,305 +24,563 @@ class _HomePageState extends State { return Scaffold( appBar: AppBar( backgroundColor: getGFColor(GFColor.dark), - title: Text( - 'GET FLUTTER', - style: TextStyle(fontSize: 14), - ), + title: Image.asset('lib/assets/logo/logo.png'), centerTitle: true, ), -// body: Container( -// child: Row( -// mainAxisAlignment: MainAxisAlignment.spaceBetween, -// children: [ -// Expanded(child: GestureDetector( -// onTap: (){ -// Navigator.push( -// context, -// MaterialPageRoute( -// builder: (BuildContext context) => Buttons()), -// ); -// }, -// child: GFCard( -// color: getGFColor(GFColor.success), -// content: Column( -// mainAxisAlignment: MainAxisAlignment.spaceBetween, -// children: [ -// Icon(Icons.bubble_chart), -// Text('Buttons') -// ], -// ), -// ), -// )), -// Expanded(child: GestureDetector( -// onTap: (){ -// Navigator.push( -// context, -// MaterialPageRoute( -// builder: (BuildContext context) => Avatars()), -// ); -// }, -// child: GFCard( -// color: getGFColor(GFColor.warning), -// content: Column( -// children: [ -// Icon(Icons.face), -// Text('Avatar') -// ], -// ), -// ), -// ),) -// ], -// ), -// ) - body: - Column( - children: [ - Row( - children: [ - Expanded( - child: Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Buttons()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.bubble_chart, - color: getGFColor(GFColor.white)), - Text( - 'Buttons', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - ))), - Expanded( - child: Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Avatars()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.face, color: getGFColor(GFColor.white)), - Text( - 'Avatar', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - )), + Container( + margin: EdgeInsets.only(left: 15, right: 15), + child: ListView( + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => ButtonTypes() + ), + ); + }, + child: Container( + height: 160, + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + ] + ), + + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, + ), + Image.asset('lib/assets/icons/buttons.png'), + Text('Buttons', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), ), - Expanded( - child: Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Toggles()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.all_inclusive, - color: getGFColor(GFColor.white)), - Text( - 'Toggle', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), - ), - ))) - ], - ), - - Row( - children: [ - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Headers()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.menu, - color: getGFColor(GFColor.white)), - Text( - 'Header', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], - ), + ),), + SizedBox( + width: 23, + ), + + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => Cards()), + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + + ] + ), + height:160, + + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, + ), + Image.asset('lib/assets/icons/card.png'), +// SvgPicture.asset('lib/assets/icons/buttons.svg', color: getGFColor(GFColor.success),), + Text('Cards', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + )) + ], + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Buttons() ), - )) ), - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Toasts()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.call_to_action, - color: getGFColor(GFColor.white)), - Text( - 'Toast', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + ] + ), + height:160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, ), + Image.asset('lib/assets/icons/chips.png'), + Text('Chips', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + ),), + + SizedBox( + width: 23, + ), + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Buttons() ), - )) ), - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Cards()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.credit_card, - color: getGFColor(GFColor.white)), - Text( - 'Card', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + + ] + ), + height:160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, ), + Image.asset('lib/assets/icons/items.png'), +// SvgPicture.asset('lib/assets/icons/buttons.svg', color: getGFColor(GFColor.success),), + Text('Items', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + )) + ], + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Buttons() ), - )) ) - ], - ), - - Row( - children: [ - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => IconButtons()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.insert_emoticon, - color: getGFColor(GFColor.white)), - Text( - 'Icon Button', - style: TextStyle(color: getGFColor(GFColor.white), fontSize: 12), - ) - ], + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + ] + ), + height:160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, ), + Image.asset('lib/assets/icons/lists.png'), + Text('Lists', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + ),), + + SizedBox( + width: 23, + ), + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Buttons() + ), + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + + ] + ), + height:160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, + ), + Image.asset('lib/assets/icons/menu.png'), +// SvgPicture.asset('lib/assets/icons/buttons.svg', color: getGFColor(GFColor.success),), + Text('Menu', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + )) + + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Buttons() + ), + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + ] + ), + height:160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, + ), + Image.asset('lib/assets/icons/slider.png'), + Text('Sliders', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + ),), + + SizedBox( + width: 23, + ), + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Buttons() ), - )) ), - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => ListTiles()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.list, - color: getGFColor(GFColor.white)), - Text( - 'ListTile', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + + ] + ), + height:160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Image.asset('lib/assets/icons/tabs.png'), +// SvgPicture.asset('lib/assets/icons/buttons.svg', color: getGFColor(GFColor.success),), + Text('Tabs', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + )) + ], + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Buttons() + ), + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + ] + ), + height:160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, ), + Image.asset('lib/assets/icons/toast.png'), + Text('Toasts', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + ),), + + SizedBox( + width: 23, + ), + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Buttons() + ), + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + + ] + ), + height:160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Image.asset('lib/assets/icons/toggle.png'), +// SvgPicture.asset('lib/assets/icons/buttons.svg', color: getGFColor(GFColor.success),), + Text('Toggle', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + )) + ], + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Buttons() ), - )) ), - Expanded(child:Container( - height: 100, - child: GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => Badges()), - ); - }, - child: GFCard( - color: getGFColor(GFColor.success), - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Icon(Icons.apps, - color: getGFColor(GFColor.white)), - Text( - 'Badges', - style: TextStyle(color: getGFColor(GFColor.white)), - ) - ], + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + ] + ), + height:160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, ), + Image.asset('lib/assets/icons/badge.png'), + Text('Badges', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + ),), + SizedBox(width: 23,), + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Buttons() + ), + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + + ] + ), + height:160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Image.asset('lib/assets/icons/avatar.png'), +// SvgPicture.asset('lib/assets/icons/buttons.svg', color: getGFColor(GFColor.success),), + Text('Avatars', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + )) + ], + ), + + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GestureDetector( + onTap: (){ + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => Headers() ), - )) ) - ], - ) - ], - ), + ); + }, + child: Container( + margin: EdgeInsets.only(top:23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + ] + ), + height:160, + + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, + ), + Image.asset('lib/assets/icons/typo.png'), + Text('Typography', style: TextStyle(fontSize: 20, color: getGFColor(GFColor.white,)),) + ], + ), + ), + ),) + + ], + ), + SizedBox( + height: 20, + ), + + + ], + ), + ) ); } } diff --git a/demo_app/pubspec.lock b/demo_app/pubspec.lock index 57c5df30..91263cf1 100644 --- a/demo_app/pubspec.lock +++ b/demo_app/pubspec.lock @@ -69,6 +69,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + url: "https://pub.dartlang.org" + source: hosted + version: "0.15.0" flutter_test: dependency: "direct dev" description: flutter @@ -102,6 +109,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.4" + path_drawing: + dependency: transitive + description: + name: path_drawing + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" pedantic: dependency: transitive description: @@ -200,3 +221,4 @@ packages: version: "3.5.0" sdks: dart: ">=2.4.0 <3.0.0" + flutter: ">=1.5.9-pre.94 <2.0.0" diff --git a/demo_app/pubspec.yaml b/demo_app/pubspec.yaml index 47d0c1f5..fe54de5e 100644 --- a/demo_app/pubspec.yaml +++ b/demo_app/pubspec.yaml @@ -1,16 +1,5 @@ name: demo_app description: A new Flutter project. - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html version: 1.0.0+1 environment: @@ -23,6 +12,7 @@ dependencies: path: ../ cupertino_icons: ^0.1.2 + flutter_svg: ^0.15.0 dev_dependencies: flutter_test: @@ -30,3 +20,42 @@ dev_dependencies: flutter: uses-material-design: true + + assets: + - lib/assets/logo/logo.png + - lib/assets/icons/buttons.png + - lib/assets/icons/buttons.svg + - lib/assets/icons/avatar.png + - lib/assets/icons/badge.png + - lib/assets/icons/card.png + - lib/assets/icons/chips.png + - lib/assets/icons/items.png + - lib/assets/icons/lists.png + - lib/assets/icons/menu.png + - lib/assets/icons/slider.png + - lib/assets/icons/tabs.png + - lib/assets/icons/toast.png + - lib/assets/icons/toggle.png + - lib/assets/icons/typo.png + - lib/assets/icons/back.png + - lib/assets/icons/next.png + - lib/assets/icons/primary.svg + - lib/assets/icons/secondary.svg + - lib/assets/icons/success.svg + - lib/assets/icons/warning.svg + - lib/assets/icons/danger.svg + - lib/assets/icons/info.svg + - lib/assets/icons/dark.svg + - lib/assets/icons/link.svg + - lib/assets/icons/light.svg + - lib/assets/icons/fb.svg + - lib/assets/icons/twitter.svg + - lib/assets/icons/whatsapp.svg + - lib/assets/icons/google.svg + - lib/assets/icons/dribble.svg + - lib/assets/icons/youtube.svg + - lib/assets/icons/slack.svg + - lib/assets/icons/pinterest.svg + - lib/assets/icons/linkedin.svg + + diff --git a/example/lib/main.dart b/example/lib/main.dart index 764814b4..80666d52 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,79 +1,140 @@ -import 'package:flutter/material.dart'; -import 'package:ui_kit/components/button/gf_button.dart'; -import 'package:ui_kit/components/badge/gf_button_badge.dart'; -import 'package:ui_kit/components/avatar/gf_avatar.dart'; -import 'package:ui_kit/components/badge/gf_badge.dart'; -import 'package:ui_kit/components/segment_tabs/gf_segment_tabs.dart'; -import 'package:ui_kit/types/gf_type.dart'; -import 'package:ui_kit/shape/gf_button_shape.dart'; -import 'package:ui_kit/shape/gf_badge_shape.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:ui_kit/components/tabs/gf_tabs.dart'; -import 'package:ui_kit/components/drawer/gf_drawer.dart'; -import 'package:ui_kit/components/drawer/gf_drawer_header.dart'; -import 'package:ui_kit/components/toast/gf_toast.dart'; -import 'package:ui_kit/components/appbar/gf_appbar.dart'; -import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; - -final List imageList = [ - "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg", - "https://cdn.pixabay.com/photo/2017/12/13/00/23/christmas-3015776_960_720.jpg", - "https://cdn.pixabay.com/photo/2019/12/19/10/55/christmas-market-4705877_960_720.jpg", - "https://cdn.pixabay.com/photo/2019/12/20/00/03/road-4707345_960_720.jpg", - "https://cdn.pixabay.com/photo/2019/12/22/04/18/x-mas-4711785__340.jpg", - "https://cdn.pixabay.com/photo/2016/11/22/07/09/spruce-1848543__340.jpg" -]; - -void main() => runApp(MyApp()); - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'UI_KIT_EXAMPLE', - theme: ThemeData( - primarySwatch: Colors.blue, - ), - debugShowCheckedModeBanner: false, - home: MyHomePage(title: 'UI_KIT_EXAMPLE'), - ); - } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State - with SingleTickerProviderStateMixin { - TabController tabController; - - @override - void initState() { - super.initState(); - tabController = TabController(length: 3, vsync: this); - } - - @override - void dispose() { - tabController.dispose(); - super.dispose(); - } - - bool switchValue = true; - - @override - Widget build(BuildContext context) { - return Scaffold( -<<<<<<< HEAD +//import 'package:flutter/material.dart'; +//import 'package:ui_kit/components/button/gf_button.dart'; +//import 'package:ui_kit/components/badge/gf_button_badge.dart'; +//import 'package:ui_kit/components/avatar/gf_avatar.dart'; +//import 'package:ui_kit/components/badge/gf_badge.dart'; +//import 'package:ui_kit/components/segment_tabs/gf_segment_tabs.dart'; +//import 'package:ui_kit/types/gf_type.dart'; +//import 'package:ui_kit/shape/gf_button_shape.dart'; +//import 'package:ui_kit/shape/gf_badge_shape.dart'; +//import 'package:flutter/cupertino.dart'; +//import 'package:ui_kit/components/tabs/gf_tabs.dart'; +//import 'package:ui_kit/components/drawer/gf_drawer.dart'; +//import 'package:ui_kit/components/drawer/gf_drawer_header.dart'; +//import 'package:ui_kit/components/toast/gf_toast.dart'; +//import 'package:ui_kit/components/appbar/gf_appbar.dart'; +//import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; +// +//final List imageList = [ +// "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg", +// "https://cdn.pixabay.com/photo/2017/12/13/00/23/christmas-3015776_960_720.jpg", +// "https://cdn.pixabay.com/photo/2019/12/19/10/55/christmas-market-4705877_960_720.jpg", +// "https://cdn.pixabay.com/photo/2019/12/20/00/03/road-4707345_960_720.jpg", +// "https://cdn.pixabay.com/photo/2019/12/22/04/18/x-mas-4711785__340.jpg", +// "https://cdn.pixabay.com/photo/2016/11/22/07/09/spruce-1848543__340.jpg" +//]; +// +//void main() => runApp(MyApp()); +// +//class MyApp extends StatelessWidget { +// @override +// Widget build(BuildContext context) { +// return MaterialApp( +// title: 'UI_KIT_EXAMPLE', +// theme: ThemeData( +// primarySwatch: Colors.blue, +// ), +// debugShowCheckedModeBanner: false, +// home: MyHomePage(title: 'UI_KIT_EXAMPLE'), +// ); +// } +//} +// +//class MyHomePage extends StatefulWidget { +// MyHomePage({Key key, this.title}) : super(key: key); +// +// final String title; +// +// @override +// _MyHomePageState createState() => _MyHomePageState(); +//} +// +//class _MyHomePageState extends State +// with SingleTickerProviderStateMixin { +// TabController tabController; +// +// @override +// void initState() { +// super.initState(); +// tabController = TabController(length: 3, vsync: this); +// } +// +// @override +// void dispose() { +// tabController.dispose(); +// super.dispose(); +// } +// +// bool switchValue = true; +// +// @override +// Widget build(BuildContext context) { +// return Scaffold( +//<<<<<<< HEAD +//// drawer: GFDrawer( +//// colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.6), BlendMode.darken), +//// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), +//// gradient: LinearGradient( +//// begin: Alignment.topRight, +//// end: Alignment.bottomLeft, +//// stops: [0.1, 0.5, 0.7, 0.9], +//// colors: [ +//// Colors.teal[800], +//// Colors.teal[600], +//// Colors.teal[400], +//// Colors.teal[200], +//// ], +//// ), +//// child: ListView( +//// padding: EdgeInsets.zero, +//// children: [ +//// GFDrawerHeader( +//// currentAccountPicture: GFAvatar( +//// radius: 80.0, +//// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), +//// ), +//// +//// decoration: BoxDecoration( +//// color: Colors.teal.withOpacity(0.45), +//// ), +//// otherAccountsPictures: [ +//// Image( +//// image: NetworkImage("https://cdn.pixabay.com/photo/2019/12/20/00/03/road-4707345_960_720.jpg"), +//// fit: BoxFit.cover, +//// ), +//// GFAvatar( +//// child: Text("dcf"), +//// ) +//// ], +//// child: Column( +//// mainAxisAlignment: MainAxisAlignment.start, +//// crossAxisAlignment: CrossAxisAlignment.start, +//// children: [ +//// Text('user'), +//// Text('user@asdf.com'), +//// ], +//// ), +//// ), +//// ListTile( +//// title: Text('Item 1'), +//// onTap: () { +//// Navigator.pop(context); +//// }, +//// ), +//// ListTile( +//// title: Text('Item 2'), +//// onTap: () { +//// }, +//// ), +//// ], +//// ), +//// ), +//======= // drawer: GFDrawer( -// colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.6), BlendMode.darken), -// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), +// colorFilter: new ColorFilter.mode( +// Colors.black.withOpacity(0.6), BlendMode.darken), +// backgroundImage: NetworkImage( +// "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), // gradient: LinearGradient( // begin: Alignment.topRight, // end: Alignment.bottomLeft, @@ -91,15 +152,16 @@ class _MyHomePageState extends State // GFDrawerHeader( // currentAccountPicture: GFAvatar( // radius: 80.0, -// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), +// backgroundImage: NetworkImage( +// "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), // ), -// // decoration: BoxDecoration( // color: Colors.teal.withOpacity(0.45), // ), // otherAccountsPictures: [ // Image( -// image: NetworkImage("https://cdn.pixabay.com/photo/2019/12/20/00/03/road-4707345_960_720.jpg"), +// image: NetworkImage( +// "https://cdn.pixabay.com/photo/2019/12/20/00/03/road-4707345_960_720.jpg"), // fit: BoxFit.cover, // ), // GFAvatar( @@ -123,187 +185,332 @@ class _MyHomePageState extends State // ), // ListTile( // title: Text('Item 2'), -// onTap: () { -// }, +// onTap: () {}, // ), // ], // ), // ), -======= - drawer: GFDrawer( - colorFilter: new ColorFilter.mode( - Colors.black.withOpacity(0.6), BlendMode.darken), - backgroundImage: NetworkImage( - "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), - gradient: LinearGradient( - begin: Alignment.topRight, - end: Alignment.bottomLeft, - stops: [0.1, 0.5, 0.7, 0.9], - colors: [ - Colors.teal[800], - Colors.teal[600], - Colors.teal[400], - Colors.teal[200], - ], - ), - child: ListView( - padding: EdgeInsets.zero, - children: [ - GFDrawerHeader( - currentAccountPicture: GFAvatar( - radius: 80.0, - backgroundImage: NetworkImage( - "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), - ), - decoration: BoxDecoration( - color: Colors.teal.withOpacity(0.45), - ), - otherAccountsPictures: [ - Image( - image: NetworkImage( - "https://cdn.pixabay.com/photo/2019/12/20/00/03/road-4707345_960_720.jpg"), - fit: BoxFit.cover, - ), - GFAvatar( - child: Text("dcf"), - ) - ], - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('user'), - Text('user@asdf.com'), - ], - ), - ), - ListTile( - title: Text('Item 1'), - onTap: () { - Navigator.pop(context); - }, - ), - ListTile( - title: Text('Item 2'), - onTap: () {}, - ), - ], - ), - ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 - appBar: GFAppBar( - backgroundColor: Colors.tealAccent, - centerTitle: true, -<<<<<<< HEAD - title: - Text("UI KIT"), -// GFSegmentTabs( -// tabController: tabController, +//>>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 +// appBar: GFAppBar( +// backgroundColor: Colors.tealAccent, +// centerTitle: true, +//<<<<<<< HEAD +// title: +// Text("UI KIT"), +//// GFSegmentTabs( +//// tabController: tabController, +//// initialIndex: 0, +//// length: 3, +//// tabs: [ +//// Tab( +//// child: Text( +//// "cream", +//// ), +//// ), +//// Tab( +//// child: Text( +//// "serum", +//// ), +//// ), +//// Tab( +//// child: Text( +//// "toner", +//// ), +//// ), +//// ], +////// borderRadius: BorderRadius.circular(50.0), +//// ), +//======= +// title: GFSegmentTabs( // initialIndex: 0, // length: 3, // tabs: [ // Tab( // child: Text( -// "cream", +// "Gelatin", // ), // ), // Tab( // child: Text( -// "serum", +// "Donuts", // ), // ), // Tab( // child: Text( -// "toner", +// "Pastry", // ), // ), // ], -//// borderRadius: BorderRadius.circular(50.0), // ), -======= - title: GFSegmentTabs( - initialIndex: 0, - length: 3, - tabs: [ - Tab( - child: Text( - "Gelatin", - ), - ), - Tab( - child: Text( - "Donuts", - ), - ), - Tab( - child: Text( - "Pastry", - ), - ), - ], - ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 -// trailing: [ -// GFIconButton(icon: Icon(Icons.directions_bus), onPressed: null) -// ], - ), -// backgroundColor: Colors.teal, - body: -// GFTabBarView(controller: tabController, children: [ -// Container(color: Colors.red), -// Container(color: Colors.green), -// Container(color: Colors.blue) -// ]), -<<<<<<< HEAD - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - GFButton( - text: 'goodies', - onPressed: () {}, - icon: Icon(Icons.access_alarms), - hoverColor: Colors.orange, - color: Colors.pink, - focusColor: Colors.green, - type: GFType.outline, - ), - RawMaterialButton( - child: Text('goodies'), - onPressed: () { - print('dddddddddd'); - }, - fillColor: Colors.pink, - hoverColor: Colors.orange, - focusColor: Colors.teal, - ), - ], - ) -// SingleChildScrollView( +//>>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 +//// trailing: [ +//// GFIconButton(icon: Icon(Icons.directions_bus), onPressed: null) +//// ], +// ), +//// backgroundColor: Colors.teal, +// body: +//// GFTabBarView(controller: tabController, children: [ +//// Container(color: Colors.red), +//// Container(color: Colors.green), +//// Container(color: Colors.blue) +//// ]), +//<<<<<<< HEAD +// Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// GFButton( +// text: 'goodies', +// onPressed: () {}, +// icon: Icon(Icons.access_alarms), +// hoverColor: Colors.orange, +// color: Colors.pink, +// focusColor: Colors.green, +// type: GFType.outline, +// ), +// RawMaterialButton( +// child: Text('goodies'), +// onPressed: () { +// print('dddddddddd'); +// }, +// fillColor: Colors.pink, +// hoverColor: Colors.orange, +// focusColor: Colors.teal, +// ), +// ], +// ) +//// SingleChildScrollView( +//// child: Column( +//// mainAxisAlignment: MainAxisAlignment.center, +//// crossAxisAlignment: CrossAxisAlignment.center, +//// children: [ +////// GFAvatar( +//// radius: 80.0, +//// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), +//// ), +//// +//// GFSegmentTabs( +//// tabController: tabController, +////// height: 38.0, +////// width: 180.0, +//// initialIndex: 0, +//// length: 3, +//// tabs: [ +//// Tab( +//// child: Text( +//// "Gelatin", +//// ), +//// ), +//// Tab( +//// child: Text( +//// "Donuts", +//// ), +//// ), +//// Tab( +//// child: Text( +//// "Pastry", +//// ), +//// ), +//// ], +////// tabBarColor: Colors.pink.withOpacity(0.6), +////// indicatorSize: TabBarIndicatorSize.tab, +////// indicatorColor: Colors.tealAccent, +////// indicator: BoxDecoration( +////// color: Colors.pink, +////// border: Border.all(color: Colors.green, width: 1.0), +////// borderRadius: BorderRadius.circular(50.0) +////// ), +////// indicatorPadding: EdgeInsets.all(8.0), +////// indicatorWeight: 2.0, +////// border: Border.all(color: Colors.orange, width: 2.0), +////// borderRadius: BorderRadius.circular(50.0) +//// ), +//======= +// SingleChildScrollView( // child: Column( // mainAxisAlignment: MainAxisAlignment.center, // crossAxisAlignment: CrossAxisAlignment.center, // children: [ -//// GFAvatar( +// GFAvatar( // radius: 80.0, -// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), +// backgroundImage: NetworkImage( +// "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), // ), +//>>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 +// +//// GFTabBarView( +//// controller: tabController, +//// height: 400.0, +//// children: [ +//// Container(color: Colors.red), +//// Container(color: Colors.green), +//// Container(color: Colors.blue) +//// ] +//// ), // -// GFSegmentTabs( -// tabController: tabController, -//// height: 38.0, -//// width: 180.0, +//// GFItemsSlider( +//// rowCount: 3, +//// children: imageList.map( +//// (url) { +//// return Container( +//// margin: EdgeInsets.all(5.0), +//// child: ClipRRect( +//// borderRadius: BorderRadius.all(Radius.circular(5.0)), +//// child: Image.network( +//// url, +//// fit: BoxFit.cover, +//// width: 1000.0 +//// ), +//// ), +//// ); +//// }, +//// ).toList(), +//// ), +// +//// GFSlider( +//// rowCount: 3, +//// pagerSize: 12.0, +//// activeIndicator: Colors.pink, +//// passiveIndicator: Colors.pink.withOpacity(0.4), +//// viewportFraction: 1.0, +//// aspectRatio: 2.0, +//// autoPlay: true, +//// enlargeMainPage: true, +//// pagination: true, +//// items: imageList.map( +//// (url) { +//// return Container( +//// margin: EdgeInsets.all(5.0), +//// child: ClipRRect( +//// borderRadius: BorderRadius.all(Radius.circular(5.0)), +//// child: Image.network( +//// url, +//// fit: BoxFit.cover, +//// width: 1000.0 +//// ), +//// ), +//// ); +//// }, +//// ).toList(), +//// onPageChanged: (index) { +//// setState(() { +//// index; +//// }); +//// }, +//// ), +// +//<<<<<<< HEAD +// +//// GFTabs( +//// initialIndex: 0, +//// length: 3, +//// tabs: [ +//// GFButton( +//// onPressed: null, +//// child: Text("share"), +//// icon: Icon(Icons.share), +//// buttonBoxShadow: true, +//// ), +//// Tab( +//// icon: Icon(Icons.error), +//// child: Text( +//// "Orders", +//// ), +//// ), +//// Tab( +//// child: Text( +//// "Pastry", +//// ), +//// ), +//// ], +//// tabBarView: GFTabBarView( +//// children: [ +//// Container( +//// color: Colors.red, +//// child: Column( +//// mainAxisAlignment: MainAxisAlignment.center, +//// crossAxisAlignment: CrossAxisAlignment.center, +//// children: [ +//// +//// GFToast( +//// child: Text("sdc"), +//// backgroundColor: Colors.pink, +//// button: GFButton( +//// text: 'dsx', +//// onPressed: (){ +//// print("fdsc"); +//// }, +//// ), +//// ), +//// RawMaterialButton( +//// onPressed: null, +//// child: Text("fv"), +//// ), +//// FlatButton(onPressed: null, child: Text("cds")), +//// Icon(Icons.directions_railway), +//// GFButton( +//// onPressed: null, +//// child: Text("share"), +//// icon: Icon(Icons.share), +//// shape: GFButtonShape.pills, +//// type: GFType.transparent, +//// ), +//// ], +//// ), +//// ), +//// Icon(Icons.directions_car), +//// Icon(Icons.directions_transit), +//// ], +//// ), +//// indicatorColor: Colors.teal, +////// indicatorSize: TabBarIndicatorSize.label, +////// labelColor: Colors.lightGreen, +////// unselectedLabelColor: Colors.black, +////// labelStyle: TextStyle( +////// fontWeight: FontWeight.w500, +////// fontSize: 13.0, +////// color: Colors.deepOrange, +////// fontFamily: 'OpenSansBold', +////// ), +////// unselectedLabelStyle: TextStyle( +////// fontWeight: FontWeight.w500, +////// fontSize: 13.0, +////// color: Colors.black, +////// fontFamily: 'OpenSansBold', +////// ), +//// ), +//======= +// GFButton( +//// color: Colors.green, +// onPressed: null, +// child: Text("share"), +// type: GFType.outline, +// shape: GFButtonShape.pills, +////textColor: GFColor.danger, +////borderSide: BorderSide(color: Colors.pink, width: 2.0), +//// buttonBoxShadow: true, +//// boxShadow: BoxShadow( +//// color: Colors.pink, +//// blurRadius: 1.5, +//// spreadRadius: 2.0, +//// offset: Offset.zero, +//// ), +// ), +// +// GFTabs( // initialIndex: 0, // length: 3, // tabs: [ -// Tab( -// child: Text( -// "Gelatin", -// ), +// GFButton( +// onPressed: null, +// child: Text("share"), +// icon: Icon(Icons.share), +// buttonBoxShadow: true, // ), // Tab( +// icon: Icon(Icons.error), // child: Text( -// "Donuts", +// "Orders", // ), // ), // Tab( @@ -312,157 +519,45 @@ class _MyHomePageState extends State // ), // ), // ], -//// tabBarColor: Colors.pink.withOpacity(0.6), -//// indicatorSize: TabBarIndicatorSize.tab, -//// indicatorColor: Colors.tealAccent, -//// indicator: BoxDecoration( -//// color: Colors.pink, -//// border: Border.all(color: Colors.green, width: 1.0), -//// borderRadius: BorderRadius.circular(50.0) -//// ), -//// indicatorPadding: EdgeInsets.all(8.0), -//// indicatorWeight: 2.0, -//// border: Border.all(color: Colors.orange, width: 2.0), -//// borderRadius: BorderRadius.circular(50.0) -// ), -======= - SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - GFAvatar( - radius: 80.0, - backgroundImage: NetworkImage( - "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), - ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 - -// GFTabBarView( -// controller: tabController, -// height: 400.0, +// tabBarView: GFTabBarView( // children: [ -// Container(color: Colors.red), -// Container(color: Colors.green), -// Container(color: Colors.blue) -// ] -// ), - -// GFItemsSlider( -// rowCount: 3, -// children: imageList.map( -// (url) { -// return Container( -// margin: EdgeInsets.all(5.0), -// child: ClipRRect( -// borderRadius: BorderRadius.all(Radius.circular(5.0)), -// child: Image.network( -// url, -// fit: BoxFit.cover, -// width: 1000.0 +// Container( +// color: Colors.red, +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// GFToast( +// child: Text("sdc"), +// backgroundColor: Colors.pink, +// button: GFButton( +// text: 'dsx', +// onPressed: () { +// print("fdsc"); +// }, +// ), // ), -// ), -// ); -// }, -// ).toList(), -// ), - -// GFSlider( -// rowCount: 3, -// pagerSize: 12.0, -// activeIndicator: Colors.pink, -// passiveIndicator: Colors.pink.withOpacity(0.4), -// viewportFraction: 1.0, -// aspectRatio: 2.0, -// autoPlay: true, -// enlargeMainPage: true, -// pagination: true, -// items: imageList.map( -// (url) { -// return Container( -// margin: EdgeInsets.all(5.0), -// child: ClipRRect( -// borderRadius: BorderRadius.all(Radius.circular(5.0)), -// child: Image.network( -// url, -// fit: BoxFit.cover, -// width: 1000.0 -// ), -// ), -// ); -// }, -// ).toList(), -// onPageChanged: (index) { -// setState(() { -// index; -// }); -// }, -// ), - -<<<<<<< HEAD - -// GFTabs( -// initialIndex: 0, -// length: 3, -// tabs: [ -// GFButton( -// onPressed: null, -// child: Text("share"), -// icon: Icon(Icons.share), -// buttonBoxShadow: true, -// ), -// Tab( -// icon: Icon(Icons.error), -// child: Text( -// "Orders", -// ), -// ), -// Tab( -// child: Text( -// "Pastry", -// ), -// ), -// ], -// tabBarView: GFTabBarView( -// children: [ -// Container( -// color: Colors.red, -// child: Column( -// mainAxisAlignment: MainAxisAlignment.center, -// crossAxisAlignment: CrossAxisAlignment.center, -// children: [ -// -// GFToast( -// child: Text("sdc"), -// backgroundColor: Colors.pink, -// button: GFButton( -// text: 'dsx', -// onPressed: (){ -// print("fdsc"); -// }, +// RawMaterialButton( +// onPressed: null, +// child: Text("fv"), +// ), +// FlatButton(onPressed: null, child: Text("cds")), +// Icon(Icons.directions_railway), +// GFButton( +// onPressed: null, +// child: Text("share"), +// icon: Icon(Icons.share), +// shape: GFButtonShape.pills, +// type: GFType.transparent, // ), -// ), -// RawMaterialButton( -// onPressed: null, -// child: Text("fv"), -// ), -// FlatButton(onPressed: null, child: Text("cds")), -// Icon(Icons.directions_railway), -// GFButton( -// onPressed: null, -// child: Text("share"), -// icon: Icon(Icons.share), -// shape: GFButtonShape.pills, -// type: GFType.transparent, -// ), -// ], +// ], +// ), // ), -// ), -// Icon(Icons.directions_car), -// Icon(Icons.directions_transit), -// ], -// ), -// indicatorColor: Colors.teal, +// Icon(Icons.directions_car), +// Icon(Icons.directions_transit), +// ], +// ), +// indicatorColor: Colors.teal, //// indicatorSize: TabBarIndicatorSize.label, //// labelColor: Colors.lightGreen, //// unselectedLabelColor: Colors.black, @@ -478,302 +573,232 @@ class _MyHomePageState extends State //// color: Colors.black, //// fontFamily: 'OpenSansBold', //// ), -// ), -======= - GFButton( -// color: Colors.green, - onPressed: null, - child: Text("share"), - type: GFType.outline, - shape: GFButtonShape.pills, -//textColor: GFColor.danger, -//borderSide: BorderSide(color: Colors.pink, width: 2.0), -// buttonBoxShadow: true, -// boxShadow: BoxShadow( -// color: Colors.pink, -// blurRadius: 1.5, -// spreadRadius: 2.0, -// offset: Offset.zero, -// ), - ), - - GFTabs( - initialIndex: 0, - length: 3, - tabs: [ - GFButton( - onPressed: null, - child: Text("share"), - icon: Icon(Icons.share), - buttonBoxShadow: true, - ), - Tab( - icon: Icon(Icons.error), - child: Text( - "Orders", - ), - ), - Tab( - child: Text( - "Pastry", - ), - ), - ], - tabBarView: GFTabBarView( - children: [ - Container( - color: Colors.red, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - GFToast( - child: Text("sdc"), - backgroundColor: Colors.pink, - button: GFButton( - text: 'dsx', - onPressed: () { - print("fdsc"); - }, - ), - ), - RawMaterialButton( - onPressed: null, - child: Text("fv"), - ), - FlatButton(onPressed: null, child: Text("cds")), - Icon(Icons.directions_railway), - GFButton( - onPressed: null, - child: Text("share"), - icon: Icon(Icons.share), - shape: GFButtonShape.pills, - type: GFType.transparent, - ), - ], - ), - ), - Icon(Icons.directions_car), - Icon(Icons.directions_transit), - ], - ), - indicatorColor: Colors.teal, -// indicatorSize: TabBarIndicatorSize.label, -// labelColor: Colors.lightGreen, -// unselectedLabelColor: Colors.black, -// labelStyle: TextStyle( -// fontWeight: FontWeight.w500, -// fontSize: 13.0, -// color: Colors.deepOrange, -// fontFamily: 'OpenSansBold', -// ), -// unselectedLabelStyle: TextStyle( -// fontWeight: FontWeight.w500, -// fontSize: 13.0, -// color: Colors.black, -// fontFamily: 'OpenSansBold', -// ), - ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 -// -// GFSlider( -// autoPlay: true, -// viewportFraction: 1.0, -// aspectRatio: MediaQuery.of(context).size.aspectRatio, -// items: imageList.map( -// (url) { -// return Container( -// margin: EdgeInsets.all(5.0), -// child: ClipRRect( -// borderRadius: BorderRadius.all(Radius.circular(5.0)), -// child: Image.network( -// url, -// fit: BoxFit.cover, -// width: 1000.0, -// ), -// ), -// ); -// }, -// ).toList(), -// onPageChanged: (index) { -// setState(() { -// index; -// }); -// }, -// ), -// GFCard( -// boxFit: BoxFit.cover, -// colorFilter: new ColorFilter.mode( -// Colors.black.withOpacity(0.67), BlendMode.darken), -// image: Image.asset("lib/assets/food.jpeg"), -//// imageOverlay: AssetImage("lib/assets/food.jpeg"), -// titlePosition: GFPosition.end, -// title: GFListTile( -// avatar: GFAvatar( -// child: Text("tb"), -// ), -// title: Text( -// 'title', -// style: TextStyle(color: Colors.grey), -// ), -// subTitle: Text( -// 'subtitle', -// style: TextStyle(color: Colors.grey), -// ), -// icon: GFIconButton( -// onPressed: null, -// icon: Icon(Icons.favorite_border), -// type: GFType.transparent, -// ), -// ), -// content: Text( -// "Flutter " -// "Flutter is Google's mobile UI framework for crafting" -// " high-quality native interfaces on iOS and Android in " -// "Flutter ", -// style: TextStyle(color: Colors.grey), -// ), -// buttonBar: GFButtonBar( -// mainAxisSize: MainAxisSize.min, -// children: [ -// GFButton( -// onPressed: null, -// child: Text("favorite"), -// icon: Icon(Icons.favorite_border), -// type: GFType.transparent, -// ), -// GFButton( -// onPressed: null, -// child: Text("share"), -// icon: Icon(Icons.share), -// type: GFType.outline, -// ), -// ], -// ), // ), -// GFButtonBar( -// mainAxisSize: MainAxisSize.min, -// children: [ -// GFButton( -// onPressed: null, -// child: Text("like"), -// icon: Icon(Icons.favorite_border), -// type: GFType.transparent, -// ), -// GFButton( -// onPressed: null, -// child: Text("comment"), -// ), -// GFButton( -// color: Colors.teal, -// onPressed: (){}, -// child: Text("share"), -// icon: Icon(Icons.share), -// type: GFType.outline, -// ), -// ], -// ), -// -// -// GFListTile( -// avatar: GFAvatar( -// child: Text("tb"), -// ), -// title: Text('title'), -// subTitle: Text('subtitle'), -// icon: GFIconButton( -// onPressed: null, -// type: GFType.transparent, -// icon: Icon(Icons.favorite_border), -// ), -// ), -// GFImageOverlay( -// width: MediaQuery.of(context).size.width, -// margin: EdgeInsets.all(16.0), -// padding: EdgeInsets.all(16.0), -// child: Column( -// children: [ -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// ], -// ), -//// color: Colors.orange, -// image: AssetImage("lib/assets/food.jpeg"), -// boxFit: BoxFit.cover, -// colorFilter: new ColorFilter.mode( -// Colors.black.withOpacity(0.6), BlendMode.darken), -// borderRadius: new BorderRadius.circular(5.0), -//// border: Border.all(color: Colors.pink, width: 2.0), -// ), -// GFAvatar( -// // radius: 20.0, -//// maxRadius: 50, -// -// child: Text("de"), -// -//// backgroundColor: Colors.pink, +//>>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 +//// +//// GFSlider( +//// autoPlay: true, +//// viewportFraction: 1.0, +//// aspectRatio: MediaQuery.of(context).size.aspectRatio, +//// items: imageList.map( +//// (url) { +//// return Container( +//// margin: EdgeInsets.all(5.0), +//// child: ClipRRect( +//// borderRadius: BorderRadius.all(Radius.circular(5.0)), +//// child: Image.network( +//// url, +//// fit: BoxFit.cover, +//// width: 1000.0, +//// ), +//// ), +//// ); +//// }, +//// ).toList(), +//// onPageChanged: (index) { +//// setState(() { +//// index; +//// }); +//// }, +//// ), +//// GFCard( +//// boxFit: BoxFit.cover, +//// colorFilter: new ColorFilter.mode( +//// Colors.black.withOpacity(0.67), BlendMode.darken), +//// image: Image.asset("lib/assets/food.jpeg"), +////// imageOverlay: AssetImage("lib/assets/food.jpeg"), +//// titlePosition: GFPosition.end, +//// title: GFListTile( +//// avatar: GFAvatar( +//// child: Text("tb"), +//// ), +//// title: Text( +//// 'title', +//// style: TextStyle(color: Colors.grey), +//// ), +//// subTitle: Text( +//// 'subtitle', +//// style: TextStyle(color: Colors.grey), +//// ), +//// icon: GFIconButton( +//// onPressed: null, +//// icon: Icon(Icons.favorite_border), +//// type: GFType.transparent, +//// ), +//// ), +//// content: Text( +//// "Flutter " +//// "Flutter is Google's mobile UI framework for crafting" +//// " high-quality native interfaces on iOS and Android in " +//// "Flutter ", +//// style: TextStyle(color: Colors.grey), +//// ), +//// buttonBar: GFButtonBar( +//// mainAxisSize: MainAxisSize.min, +//// children: [ +//// GFButton( +//// onPressed: null, +//// child: Text("favorite"), +//// icon: Icon(Icons.favorite_border), +//// type: GFType.transparent, +//// ), +//// GFButton( +//// onPressed: null, +//// child: Text("share"), +//// icon: Icon(Icons.share), +//// type: GFType.outline, +//// ), +//// ], +//// ), +//// ), +//// GFButtonBar( +//// mainAxisSize: MainAxisSize.min, +//// children: [ +//// GFButton( +//// onPressed: null, +//// child: Text("like"), +//// icon: Icon(Icons.favorite_border), +//// type: GFType.transparent, +//// ), +//// GFButton( +//// onPressed: null, +//// child: Text("comment"), +//// ), +//// GFButton( +//// color: Colors.teal, +//// onPressed: (){}, +//// child: Text("share"), +//// icon: Icon(Icons.share), +//// type: GFType.outline, +//// ), +//// ], +//// ), //// -////// backgroundImage: , //// -//// foregroundColor: Colors.deepOrangeAccent, +//// GFListTile( +//// avatar: GFAvatar( +//// child: Text("tb"), +//// ), +//// title: Text('title'), +//// subTitle: Text('subtitle'), +//// icon: GFIconButton( +//// onPressed: null, +//// type: GFType.transparent, +//// icon: Icon(Icons.favorite_border), +//// ), +//// ), +//// GFImageOverlay( +//// width: MediaQuery.of(context).size.width, +//// margin: EdgeInsets.all(16.0), +//// padding: EdgeInsets.all(16.0), +//// child: Column( +//// children: [ +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// new Text( +//// 'Hello world', +//// style: TextStyle(color: Colors.white), +//// ), +//// ], +//// ), +////// color: Colors.orange, +//// image: AssetImage("lib/assets/food.jpeg"), +//// boxFit: BoxFit.cover, +//// colorFilter: new ColorFilter.mode( +//// Colors.black.withOpacity(0.6), BlendMode.darken), +//// borderRadius: new BorderRadius.circular(5.0), +////// border: Border.all(color: Colors.pink, width: 2.0), +//// ), +//// GFAvatar( +//// // radius: 20.0, +////// maxRadius: 50, //// -// shape: GFAvatarShape.standard, +//// child: Text("de"), //// -//// size: GFSize.medium, +////// backgroundColor: Colors.pink, +////// +//////// backgroundImage: , +////// +////// foregroundColor: Colors.deepOrangeAccent, +////// +//// shape: GFAvatarShape.standard, +////// +////// size: GFSize.medium, +////// +////// borderRadius: BorderRadius.circular(20.0), +//// ), +//<<<<<<< HEAD +//// GFIconBadges( +//// onPressed: null, +//// child: GFIconButton( +//// onPressed: null, +//// icon: Icon(Icons.ac_unit), +//// ), +//// counterChild: GFBadge( +//// text: '12', //// -//// borderRadius: BorderRadius.circular(20.0), -// ), -<<<<<<< HEAD -// GFIconBadges( -// onPressed: null, -// child: GFIconButton( -// onPressed: null, -// icon: Icon(Icons.ac_unit), -// ), -// counterChild: GFBadge( -// text: '12', +////// color: GFColor.dark +////////, +////// shape: GFBadgeShape.circle, +////// +////// size: GFSize.small, +////// +////// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +////// +////// textColor: GFColor.white, +////// +////// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +////// +////// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.orange, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +//// ), +//// ), +//======= +// // GFIconBadges( +// // onPressed: null, +// // child: GFIconButton( +// // onPressed: null, +// // icon: Icon(Icons.ac_unit), +// // ), +// // counterChild: GFBadge( +// // text: '12', // //// color: GFColor.dark //////, @@ -788,53 +813,49 @@ class _MyHomePageState extends State //// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), //// //// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.orange, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), -// ), -// ), -======= - // GFIconBadges( - // onPressed: null, - // child: GFIconButton( - // onPressed: null, - // icon: Icon(Icons.ac_unit), - // ), - // counterChild: GFBadge( - // text: '12', - -// color: GFColor.dark -////, -// shape: GFBadgeShape.circle, -// -// size: GFSize.small, -// -// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// -// textColor: GFColor.white, -// -// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -// -// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.orange, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - // ), - // ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 -// GFIconButton( -// onPressed: null, -// icon: Icon(Icons.ac_unit), -//// iconSize: 12.0, -// type: GFType.solid, -// shape: GFButtonShape.pills, -// size: GFSize.large, -//// buttonBoxShadow: true, -//// color: GFColor.primary, -//// boxShadow: BoxShadow( -//// color: Colors.pink, -//// blurRadius: 2.0, -//// spreadRadius: 1.0, -//// offset: Offset.zero, +// // ), +// // ), +//>>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 +//// GFIconButton( +//// onPressed: null, +//// icon: Icon(Icons.ac_unit), +////// iconSize: 12.0, +//// type: GFType.solid, +//// shape: GFButtonShape.pills, +//// size: GFSize.large, +////// buttonBoxShadow: true, +////// color: GFColor.primary, +////// boxShadow: BoxShadow( +////// color: Colors.pink, +////// blurRadius: 2.0, +////// spreadRadius: 1.0, +////// offset: Offset.zero, +////// ), +////// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +////// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +//// ), +//<<<<<<< HEAD +//// GFButtonBadge( +//// onPressed: null, +////// position: GFIconPosition.start, +////// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +////// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +//// text: 'goodies', +////// color: GFColor.danger, +////// shape: GFButtonShape.pills, +//// type: GFType.outline, +////// size: GFSize.small, +//// counterChild: GFBadge( +//// child: Text("12"), +////// color: GFColor.dark, +//// shape: GFBadgeShape.circle, +////// size: GFSize.small, +////// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +////// textColor: GFColor.white, +////// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), //// ), -//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), -// ), -<<<<<<< HEAD +//// ), +//======= // GFButtonBadge( // onPressed: null, //// position: GFIconPosition.start, @@ -848,75 +869,54 @@ class _MyHomePageState extends State // counterChild: GFBadge( // child: Text("12"), //// color: GFColor.dark, -// shape: GFBadgeShape.circle, +// shape: GFBadgeShape.circle, //// size: GFSize.small, //// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), //// textColor: GFColor.white, //// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), // ), // ), -======= - GFButtonBadge( - onPressed: null, -// position: GFIconPosition.start, -// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - text: 'goodies', -// color: GFColor.danger, -// shape: GFButtonShape.pills, - type: GFType.outline, -// size: GFSize.small, - counterChild: GFBadge( - child: Text("12"), -// color: GFColor.dark, - shape: GFBadgeShape.circle, -// size: GFSize.small, -// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// textColor: GFColor.white, -// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), - ), - ), ->>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 -// GFBadge( -// text: '12', -//// color: GFColor.dark, -// shape: GFBadgeShape.circle, -//// size: GFSize.small, -//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// textColor: GFColor.white, -//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -// ), - -// GFButton( -// type: GFType.solid, -// shape: GFButtonShape.pills, -// text: 'goodies', -// onPressed: () { -// print('dddddddddd'); -// }, -// hoverColor: Colors.orange, -// focusColor: Colors.teal, -//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -//// size: GFSize.large, -//// buttonBoxShadow: true, -//// blockButton: true, -//// fullWidthButton: true, -//// color: GFColor.primary, -//// textColor: GFColor.secondary, -//// icon: Icon(Icons.error, color: Colors.white,), -//// position: GFIconPosition.start, -//// boxShadow: BoxShadow( -//// color: Colors.pink, -//// blurRadius: 2.0, -//// spreadRadius: 1.0, -//// offset: Offset.zero, -//// ), -//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), -// ), -// ], -// ), -// ), - ); - } -} +//>>>>>>> 624c13bd73a6aaef4bf4a74566250f82c53c1129 +//// GFBadge( +//// text: '12', +////// color: GFColor.dark, +//// shape: GFBadgeShape.circle, +////// size: GFSize.small, +////// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +////// textColor: GFColor.white, +////// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +//// ), +// +//// GFButton( +//// type: GFType.solid, +//// shape: GFButtonShape.pills, +//// text: 'goodies', +//// onPressed: () { +//// print('dddddddddd'); +//// }, +//// hoverColor: Colors.orange, +//// focusColor: Colors.teal, +////// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +////// size: GFSize.large, +////// buttonBoxShadow: true, +////// blockButton: true, +////// fullWidthButton: true, +////// color: GFColor.primary, +////// textColor: GFColor.secondary, +////// icon: Icon(Icons.error, color: Colors.white,), +////// position: GFIconPosition.start, +////// boxShadow: BoxShadow( +////// color: Colors.pink, +////// blurRadius: 2.0, +////// spreadRadius: 1.0, +////// offset: Offset.zero, +////// ), +////// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +////// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +//// ), +//// ], +//// ), +//// ), +// ); +// } +//} diff --git a/lib/components/list_tile/gf_list_tile.dart b/lib/components/list_tile/gf_list_tile.dart index 4f3df6f4..39cd030d 100644 --- a/lib/components/list_tile/gf_list_tile.dart +++ b/lib/components/list_tile/gf_list_tile.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/avatar/gf_avatar.dart'; class GFListTile extends StatelessWidget { @@ -24,6 +25,12 @@ class GFListTile extends StatelessWidget { ///type of [bool] corresponds to true or false to show or hide the divider final bool showDivider; + ///type of [double] , the height corresponds to the height of the [GFListTile] which should not be less than the [minHeight] + final double height; + + ///type of [double], the minHeight corresponds to the minimun height of the [GFListTile] + final double minHeight; + const GFListTile( {Key key, this.color, @@ -32,34 +39,42 @@ class GFListTile extends StatelessWidget { this.subTitle , this.description , this.icon, + this.height, + this.minHeight, this.showDivider = true }) : super(key: key); @override Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ListTile( - leading: avatar, - title: title, - subtitle: subTitle != null || description != null ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - subTitle ?? Container(), - description ?? Container() - ], - ): null, - trailing: icon != null ? Column( - children: [ - Padding(padding: EdgeInsets.only(top: description != null ? 0.0 : 8.0), child: - icon ) - ], - ): null - ), - showDivider ? Divider() : Container() - ], - ); + return + Container( + color: color !=null? color: getGFColor(GFColor.white), + constraints: BoxConstraints(minHeight: minHeight !=null ? minHeight: 60), + height: height, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListTile( + leading: avatar, + title: title, + subtitle: subTitle != null || description != null ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + subTitle ?? Container(), + description ?? Container() + ], + ): null, + trailing: icon != null ? Column( + children: [ + Padding(padding: EdgeInsets.only(top: title != null ? 15.0 : 0.0), child: + icon ) + ], + ): null + ), + showDivider ? Divider() : Container() + ], + ), + ); } } \ No newline at end of file diff --git a/lib/size/gf_size.dart b/lib/size/gf_size.dart index e254a5f1..1d6244e5 100644 --- a/lib/size/gf_size.dart +++ b/lib/size/gf_size.dart @@ -1,8 +1,8 @@ enum GFSize { small, medium, large } -const double SMALL = 35.0; -const double MEDIUM = 50.0; -const double LARGE = 65.0; +const double SMALL = 20.0; +const double MEDIUM = 35.0; +const double LARGE = 50.0; const double BLOCK = 40.0; /// Pass [GFSize] or [double] From f1f05453f6fd2abd1d4842070d89f861fe5f96c5 Mon Sep 17 00:00:00 2001 From: deepikahr Date: Tue, 7 Jan 2020 14:30:33 +0530 Subject: [PATCH 07/13] GFIconButton error fixed --- example/lib/main.dart | 6 +- lib/components/button/gf_button.dart | 2 +- lib/components/button/gf_icon_button.dart | 88 ++++++++++++++--------- 3 files changed, 61 insertions(+), 35 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 57c87785..5758485b 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -192,17 +192,19 @@ class _MyHomePageState extends State // disabledTextColor: GFColor.light, blockButton: true, // fullWidthButton: true, +// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), ), GFIconButton( onPressed: null, - icon: Icon(Icons.ac_unit), + icon: Icon(Icons.ac_unit,), // iconSize: 12.0, type: GFType.outline2x, // shape: GFButtonShape.pills, // size: GFSize.large, // buttonBoxShadow: true, -// color: GFColor.primary, + color: GFColor.secondary, // boxShadow: BoxShadow( // color: Colors.pink, // blurRadius: 2.0, diff --git a/lib/components/button/gf_button.dart b/lib/components/button/gf_button.dart index da0be74c..890d16b8 100644 --- a/lib/components/button/gf_button.dart +++ b/lib/components/button/gf_button.dart @@ -422,7 +422,7 @@ class _GFButtonState extends State { color: this.color == null ? themeColor : widget.borderSide == null ? getBorderColor() : widget.borderSide.color, - width: widget.borderSide?.width ?? widget.type == GFType.outline2x ? 2.0 : 1.0, + width: widget.borderSide?.width == null ? widget.type == GFType.outline2x ? 2.0 : 1.0 : widget.borderSide?.width, ); Size minSize; diff --git a/lib/components/button/gf_icon_button.dart b/lib/components/button/gf_icon_button.dart index 6e272be1..289e75c0 100644 --- a/lib/components/button/gf_icon_button.dart +++ b/lib/components/button/gf_icon_button.dart @@ -26,7 +26,7 @@ class GFIconButton extends StatefulWidget { /// The color for the button's icon when a pointer is hovering over it. final Color hoverColor; - /// Button type of [GFType] i.e, solid, outline, transparent + /// Button type of [GFType] i.e, solid, outline, outline2x transparent final GFType type; /// Button type of [GFButtonShape] i.e, standard, pills, square, shadow, icons @@ -87,14 +87,15 @@ class GFIconButton extends StatefulWidget { this.focusNode, this.autofocus = false, this.tooltip, - this.type = GFType.transparent, + this.type = GFType.solid, this.shape = GFButtonShape.standard, this.color = GFColor.primary, this.borderShape, this.boxShadow, this.size = GFSize.medium, this.buttonBoxShadow, - this.borderSide}) + this.borderSide, + }) : assert(iconSize != null), assert(padding != null), assert(alignment != null), @@ -128,22 +129,45 @@ class _GFIconButtonState extends State { @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); - Color currentColor; - if (widget.onPressed != null) - currentColor = widget.color; - else - currentColor = widget.disabledColor ?? Theme.of(context).disabledColor; + Color getBorderColor() { + if(widget.onPressed != null){ + return this.color; + }else{ + if (widget.disabledColor != null) + return widget.disabledColor; + else { + return this.color.withOpacity(0.48); + } + } + } + Color getDisabledFillColor() { + if (widget.type == GFType.transparent || widget.type == GFType.outline || widget.type == GFType.outline2x) + return Colors.transparent; + if (widget.disabledColor != null) + return widget.disabledColor; + else { + return this.color.withOpacity(0.48); + } + } + + Color getColor() { + if (widget.type == GFType.transparent || widget.type == GFType.outline || widget.type == GFType.outline2x) + return Colors.transparent; + else{ + return this.color; + } + } final Color themeColor = Theme.of(context).colorScheme.onSurface.withOpacity(0.12); final BorderSide outlineBorder = BorderSide( - color: widget.borderSide == null ? themeColor : widget.borderSide.color, - width: widget.borderSide?.width ?? 1.0, + color: widget.borderSide == null ? getBorderColor() : widget.borderSide.color, + width: widget.borderSide?.width == null ? widget.type == GFType.outline2x ? 2.0 : 1.0 : widget.borderSide?.width, ); - final BorderSide shapeBorder = widget.type == GFType.outline + final BorderSide shapeBorder = widget.type == GFType.outline || widget.type == GFType.outline2x ? outlineBorder : widget.borderSide != null ? widget.borderSide @@ -156,16 +180,13 @@ class _GFIconButtonState extends State { if (this.shape == GFButtonShape.pills) { shape = RoundedRectangleBorder( - borderRadius: BorderRadius.circular(50.0), side: shapeBorder); + borderRadius: BorderRadius.circular(20.0), side: shapeBorder); } else if (this.shape == GFButtonShape.square) { shape = RoundedRectangleBorder( borderRadius: BorderRadius.circular(0.0), side: shapeBorder); } else if (this.shape == GFButtonShape.standard) { shape = RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0), side: shapeBorder); - } else { - shape = RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0), side: shapeBorder); + borderRadius: BorderRadius.circular(3.0), side: shapeBorder); } if (widget.size == GFSize.small) { @@ -182,15 +203,26 @@ class _GFIconButtonState extends State { this.iconPixel = 18.0; } + getIconColor(){ + if (widget.type == GFType.transparent || widget.type == GFType.outline || widget.type == GFType.outline2x) + return widget.onPressed != null ? + this.color == getGFColor(GFColor.transparent) ? getGFColor(GFColor.dark) : this.color : this.color.withOpacity(0.48); + else if(this.color == getGFColor(GFColor.transparent)){ + return widget.onPressed != null ? getGFColor(GFColor.dark) : getGFColor(GFColor.white); + } + else{ + return getGFColor(GFColor.white); + } + } + Widget result = Container( - height: - widget.shape == GFButtonShape.pills ? this.height + 6 : this.height, - width: widget.shape == GFButtonShape.pills ? this.width + 6 : this.width, + height: this.height, + width: widget.shape == GFButtonShape.pills ? this.width + 10 : this.width, padding: widget.padding, child: IconTheme.merge( data: IconThemeData( size: widget.iconSize > 0.0 ? widget.iconSize : this.iconPixel, - color: currentColor, + color: getIconColor(), ), child: widget.icon, ), @@ -209,10 +241,7 @@ class _GFIconButtonState extends State { return null; } else { return BoxDecoration( - color: widget.type == GFType.transparent || - widget.type == GFType.outline - ? Colors.transparent - : this.color, + color: widget.onPressed != null ? getColor() : getDisabledFillColor(), borderRadius: widget.shape == GFButtonShape.pills ? BorderRadius.circular(50.0) : widget.shape == GFButtonShape.standard @@ -249,21 +278,16 @@ class _GFIconButtonState extends State { child: ConstrainedBox( constraints: BoxConstraints(maxWidth: 60.0, maxHeight: 60.0), child: Container( - height: widget.shape == GFButtonShape.pills - ? this.height + 6 - : this.height, + height: this.height, width: widget.shape == GFButtonShape.pills - ? this.width + 6 + ? this.width + 10 : this.width, decoration: getBoxShadow(), child: Material( shape: widget.type == GFType.transparent ? null : widget.borderShape == null ? shape : widget.borderShape, - color: widget.type == GFType.transparent || - widget.type == GFType.outline - ? Colors.transparent - : this.color, + color: widget.onPressed != null ? getColor() : getDisabledFillColor(), type: widget.type == GFType.transparent ? MaterialType.transparency : MaterialType.button, From e94505662a47ffa4a4b9f22601359a5a9cde36d8 Mon Sep 17 00:00:00 2001 From: Navin Sharma Date: Tue, 7 Jan 2020 15:28:17 +0530 Subject: [PATCH 08/13] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..b09e1144 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at info@ionicfirebaseapp.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq From 53fcc8921fc4278d894cb6493f40384ccf4aa788 Mon Sep 17 00:00:00 2001 From: Navin Sharma Date: Tue, 7 Jan 2020 15:42:42 +0530 Subject: [PATCH 09/13] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..dd84ea78 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..bbcbbe7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From a7a1d8617e91f8b905e82bddeda2acd8d5b2aae9 Mon Sep 17 00:00:00 2001 From: Navin Sharma Date: Tue, 7 Jan 2020 15:45:48 +0530 Subject: [PATCH 10/13] Create CONTRIBUTING.md --- CONTRIBUTING.md | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..a4e22705 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,92 @@ +# Contributing + +When contributing to this repository, please first discuss the change you wish to make via issue, +email, or any other method with the owners of this repository before making a change. + +Please note we have a code of conduct, please follow it in all your interactions with the project. + +## Pull Request Process + +1. Ensure any install or build dependencies are removed before the end of the layer when doing a + build. +2. Update the README.md with details of changes to the interface, this includes new environment + variables, exposed ports, useful file locations and container parameters. +3. Increase the version numbers in any examples files and the README.md to the new version that this + Pull Request would represent. +4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you + do not have permission to do that, you may request the second reviewer to merge it for you. + +## Code of Conduct + +### Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +### Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +### Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +### Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +### Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at [INSERT EMAIL ADDRESS]. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +### Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ From 4761fa5e6396e56f79f416ceccc4fb2eb038e4c8 Mon Sep 17 00:00:00 2001 From: deepikahr Date: Tue, 7 Jan 2020 17:54:55 +0530 Subject: [PATCH 11/13] GFTabs, GFCarousel errors fixed --- demo_app/lib/screens/avatars.dart | 16 +- demo_app/lib/screens/badges.dart | 86 +- demo_app/lib/screens/buttons.dart | 32 +- demo_app/lib/screens/cards.dart | 28 +- demo_app/lib/screens/headers.dart | 28 +- demo_app/lib/screens/icon-button.dart | 16 +- demo_app/lib/screens/list-tiles.dart | 20 +- demo_app/lib/screens/toasts.dart | 4 +- demo_app/lib/screens/toggles.dart | 20 +- example/lib/main.dart | 1026 +++++++++-------- lib/components/badge/gf_button_badge.dart | 418 +++++-- lib/components/button/gf_button_theme.dart | 956 --------------- lib/components/button/gf_social_button.dart | 274 +++++ .../gf_carousel.dart} | 20 +- .../gf_items_carousel.dart} | 20 +- lib/components/tabs/gf_segment_tabs.dart | 13 +- lib/components/tabs/gf_tabs.dart | 3 +- .../gf_typography.dart} | 28 +- lib/types/gf_heading_type.dart | 1 - lib/types/gf_typography_type.dart | 1 + pubspec.yaml | 1 + 21 files changed, 1328 insertions(+), 1683 deletions(-) delete mode 100644 lib/components/button/gf_button_theme.dart create mode 100644 lib/components/button/gf_social_button.dart rename lib/components/{slider/gf_slider.dart => carousel/gf_carousel.dart} (95%) rename lib/components/{slider/gf_items_slider.dart => carousel/gf_items_carousel.dart} (90%) rename lib/components/{header/gf_header.dart => typography/gf_typography.dart} (86%) delete mode 100644 lib/types/gf_heading_type.dart create mode 100644 lib/types/gf_typography_type.dart diff --git a/demo_app/lib/screens/avatars.dart b/demo_app/lib/screens/avatars.dart index 6b9ac2ad..fecf6873 100644 --- a/demo_app/lib/screens/avatars.dart +++ b/demo_app/lib/screens/avatars.dart @@ -2,9 +2,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:ui_kit/components/avatar/gf_avatar.dart'; import 'package:ui_kit/components/card/gf_card.dart'; -import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/typography/gf_typography.dart'; import 'package:ui_kit/shape/gf_avatar_shape.dart'; -import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; import 'package:ui_kit/colors/gf_color.dart'; class Avatars extends StatefulWidget { @@ -27,9 +27,9 @@ class _AvatarsState extends State { content: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( + GFTypography( text: 'Circle Avatar', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -109,9 +109,9 @@ class _AvatarsState extends State { content: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( + GFTypography( text: 'Square Avatar', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -200,9 +200,9 @@ class _AvatarsState extends State { content: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( + GFTypography( text: 'Standard Avatar', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, diff --git a/demo_app/lib/screens/badges.dart b/demo_app/lib/screens/badges.dart index c355f07b..dfdc20c4 100644 --- a/demo_app/lib/screens/badges.dart +++ b/demo_app/lib/screens/badges.dart @@ -4,14 +4,14 @@ import 'package:ui_kit/components/badge/gf_badge.dart'; import 'package:ui_kit/components/badge/gf_button_badge.dart'; import 'package:ui_kit/components/badge/gf_icon_badge.dart'; import 'package:ui_kit/components/card/gf_card.dart'; -import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/typography/gf_typography.dart'; import 'package:ui_kit/components/tabs/gf_tabs.dart'; import 'package:ui_kit/components/button/gf_icon_button.dart'; import 'package:ui_kit/position/gf_position.dart'; import 'package:ui_kit/shape/gf_badge_shape.dart'; import 'package:ui_kit/shape/gf_button_shape.dart'; import 'package:ui_kit/size/gf_size.dart'; -import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; @@ -51,9 +51,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Types of Badges', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -90,9 +90,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Circled Badges with different Sizes', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -126,9 +126,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Squared Badges with different sizes', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -162,9 +162,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Pills with different sizes', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -201,9 +201,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Standard Badges with different sizes', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -241,9 +241,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Types of Button Badges', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -255,7 +255,7 @@ class _BadgesState extends State { shape: GFButtonShape.pills, type: GFType.solid, color: GFColor.info, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.warning, shape: GFBadgeShape.circle, @@ -268,7 +268,7 @@ class _BadgesState extends State { shape: GFButtonShape.square, type: GFType.solid, color: GFColor.warning, - counterChild: GFBadge( + icon: GFBadge( text: '12', shape: GFBadgeShape.circle, color: GFColor.info, @@ -280,7 +280,7 @@ class _BadgesState extends State { color: GFColor.success, shape: GFButtonShape.standard, type: GFType.solid, - counterChild: GFBadge( + icon: GFBadge( text: '12', textColor: GFColor.white, color: GFColor.danger, @@ -297,9 +297,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Positions of Button Badges', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -311,7 +311,7 @@ class _BadgesState extends State { shape: GFButtonShape.pills, type: GFType.solid, color: GFColor.info, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.warning, shape: GFBadgeShape.circle, @@ -324,7 +324,7 @@ class _BadgesState extends State { shape: GFButtonShape.square, type: GFType.solid, color: GFColor.warning, - counterChild: GFBadge( + icon: GFBadge( text: '12', shape: GFBadgeShape.circle, color: GFColor.info, @@ -337,7 +337,7 @@ class _BadgesState extends State { color: GFColor.success, shape: GFButtonShape.standard, type: GFType.solid, - counterChild: GFBadge( + icon: GFBadge( text: '12', textColor: GFColor.white, color: GFColor.danger, @@ -355,9 +355,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Pilled shape Button Badges with sizes', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -370,7 +370,7 @@ class _BadgesState extends State { size: GFSize.large, type: GFType.solid, color: GFColor.info, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.warning, size: GFSize.large, @@ -385,7 +385,7 @@ class _BadgesState extends State { size: GFSize.medium, type: GFType.outline, color: GFColor.info, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.warning, size: GFSize.medium, @@ -400,7 +400,7 @@ class _BadgesState extends State { size: GFSize.small, type: GFType.transparent, color: GFColor.info, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.warning, size: GFSize.small, @@ -418,9 +418,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Squared shape Button Badges with sizes', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -433,7 +433,7 @@ class _BadgesState extends State { size: GFSize.large, type: GFType.solid, color: GFColor.warning, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.info, size: GFSize.large, @@ -448,7 +448,7 @@ class _BadgesState extends State { size: GFSize.medium, type: GFType.outline, color: GFColor.warning, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.info, size: GFSize.medium, @@ -463,7 +463,7 @@ class _BadgesState extends State { size: GFSize.small, type: GFType.transparent, color: GFColor.warning, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.info, size: GFSize.small, @@ -481,9 +481,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Standard Button Badges with sizes', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -496,7 +496,7 @@ class _BadgesState extends State { size: GFSize.large, type: GFType.solid, color: GFColor.primary, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.danger, size: GFSize.large, @@ -512,7 +512,7 @@ class _BadgesState extends State { size: GFSize.medium, type: GFType.outline, color: GFColor.primary, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.danger, textColor: GFColor.white, @@ -528,7 +528,7 @@ class _BadgesState extends State { size: GFSize.small, type: GFType.transparent, color: GFColor.primary, - counterChild: GFBadge( + icon: GFBadge( text: '12', color: GFColor.danger, textColor: GFColor.white, @@ -551,9 +551,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Types of Icon Badges', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -625,9 +625,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Shapes of Icon Badges', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -693,9 +693,9 @@ class _BadgesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Sizes of Icon Badges', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, diff --git a/demo_app/lib/screens/buttons.dart b/demo_app/lib/screens/buttons.dart index 0a7055e3..851a7fa2 100644 --- a/demo_app/lib/screens/buttons.dart +++ b/demo_app/lib/screens/buttons.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/typography/gf_typography.dart'; import 'package:ui_kit/components/tabs/gf_tabs.dart'; import 'package:ui_kit/components/button/gf_button.dart'; -import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/shape/gf_button_shape.dart'; import 'package:ui_kit/colors/gf_color.dart'; @@ -70,9 +70,9 @@ class _ButtonsState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( + GFTypography( text: 'Standard', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -187,9 +187,9 @@ class _ButtonsState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( + GFTypography( text: 'Pills', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -304,9 +304,9 @@ class _ButtonsState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( + GFTypography( text: 'Square', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -428,9 +428,9 @@ class _ButtonsState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( + GFTypography( text: 'Standard', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -527,9 +527,9 @@ class _ButtonsState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( + GFTypography( text: 'Pills', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -638,9 +638,9 @@ class _ButtonsState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - GFHeader( + GFTypography( text: 'Square', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -752,9 +752,9 @@ class _ButtonsState extends State { height: 100, child: Column( children: [ - GFHeader( + GFTypography( text: 'Transparent', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), Row( children: [ diff --git a/demo_app/lib/screens/cards.dart b/demo_app/lib/screens/cards.dart index 48d6f439..edc00409 100644 --- a/demo_app/lib/screens/cards.dart +++ b/demo_app/lib/screens/cards.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:ui_kit/components/card/gf_card.dart'; -import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/typography/gf_typography.dart'; import 'package:ui_kit/components/list_tile/gf_list_tile.dart'; import 'package:ui_kit/components/avatar/gf_avatar.dart'; import 'package:ui_kit/position/gf_position.dart'; import 'package:ui_kit/components/button/gf_icon_button.dart'; import 'package:ui_kit/components/button/gf_button_bar.dart'; import 'package:ui_kit/components/button/gf_button.dart'; -import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/colors/gf_color.dart'; class Cards extends StatefulWidget { @@ -26,9 +26,9 @@ class _CardsState extends State { body: ListView( children: [ Padding(padding: EdgeInsets.all(20), child: - GFHeader( + GFTypography( text: 'Basic Card', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ),), GFCard( boxFit: BoxFit.cover, @@ -61,9 +61,9 @@ class _CardsState extends State { ), Padding(padding: EdgeInsets.all(20), child: - GFHeader( + GFTypography( text: 'Basic Card 1', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ),), GFCard( boxFit: BoxFit.cover, @@ -101,9 +101,9 @@ class _CardsState extends State { ), Padding(padding: EdgeInsets.all(20), child: - GFHeader( + GFTypography( text: 'Basic Card 2', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ),), GFCard( boxFit: BoxFit.cover, @@ -157,9 +157,9 @@ class _CardsState extends State { ), Padding(padding: EdgeInsets.all(20), child: - GFHeader( + GFTypography( text: 'Basic Card 3', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ),), GFCard( boxFit: BoxFit.cover, @@ -214,9 +214,9 @@ class _CardsState extends State { ), ), Padding(padding: EdgeInsets.all(20), child: - GFHeader( + GFTypography( text: 'Basic Card 4', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ),), GFCard( @@ -263,9 +263,9 @@ class _CardsState extends State { ), Padding(padding: EdgeInsets.all(20), child: - GFHeader( + GFTypography( text: 'Basic Card 5', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ),), GFCard( boxFit: BoxFit.cover, diff --git a/demo_app/lib/screens/headers.dart b/demo_app/lib/screens/headers.dart index 20517021..2f1db46f 100644 --- a/demo_app/lib/screens/headers.dart +++ b/demo_app/lib/screens/headers.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/avatar/gf_avatar.dart'; import 'package:ui_kit/components/card/gf_card.dart'; -import 'package:ui_kit/components/header/gf_header.dart'; -import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/components/typography/gf_typography.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; class Headers extends StatefulWidget { @override @@ -31,29 +31,29 @@ class _HeadersState extends State { crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - GFHeader( + GFTypography( text: 'GF Header Typo1', - type: GFHeadingType.typo1, + type: GFTypographyType.typo1, backgroundImage: NetworkImage( 'https://cdn.pixabay.com/photo/2019/12/25/16/49/happy-new-year-4718894_960_720.png'), ), SizedBox( height: 40, ), - GFHeader( + GFTypography( icon: GFAvatar(), text: 'GF Header Typo2', - type: GFHeadingType.typo2, + type: GFTypographyType.typo2, dividerColor: GFColor.primary, dividerAlignment: Alignment.center, ), SizedBox( height: 40, ), - GFHeader( + GFTypography( icon: Icon(Icons.insert_emoticon), text: 'GF Header Typo3', - type: GFHeadingType.typo3, + type: GFTypographyType.typo3, dividerWidth: 150, dividerColor: GFColor.warning, dividerBorderRadius: BorderRadius.all(Radius.circular(0)), @@ -61,9 +61,9 @@ class _HeadersState extends State { SizedBox( height: 40, ), - GFHeader( + GFTypography( text: 'GF Header Typo4', - type: GFHeadingType.typo4, + type: GFTypographyType.typo4, dividerWidth: 345, icon: Image.network( 'https://cdn.pixabay.com/photo/2016/12/15/03/27/cocoa-1908020_960_720.jpg', @@ -72,17 +72,17 @@ class _HeadersState extends State { SizedBox( height: 40, ), - GFHeader( + GFTypography( text: 'GF Header Typo5', - type: GFHeadingType.typo5, + type: GFTypographyType.typo5, dividerColor: GFColor.alt, ), SizedBox( height: 40, ), - GFHeader( + GFTypography( text: 'GF Header Typo6', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, dividerWidth: 20, ), ], diff --git a/demo_app/lib/screens/icon-button.dart b/demo_app/lib/screens/icon-button.dart index 0266d586..4a7d8738 100644 --- a/demo_app/lib/screens/icon-button.dart +++ b/demo_app/lib/screens/icon-button.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/button/gf_icon_button.dart'; import 'package:ui_kit/components/card/gf_card.dart'; -import 'package:ui_kit/components/header/gf_header.dart'; -import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/components/typography/gf_typography.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/size/gf_size.dart'; @@ -28,9 +28,9 @@ class _IconButtonsState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Solid Icon Button', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 15.0, @@ -100,9 +100,9 @@ class _IconButtonsState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Outline Icon Button', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 15.0, @@ -168,9 +168,9 @@ class _IconButtonsState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Transparent Icon Button', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 15.0, diff --git a/demo_app/lib/screens/list-tiles.dart b/demo_app/lib/screens/list-tiles.dart index bec715a6..32249344 100644 --- a/demo_app/lib/screens/list-tiles.dart +++ b/demo_app/lib/screens/list-tiles.dart @@ -3,10 +3,10 @@ import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/avatar/gf_avatar.dart'; import 'package:ui_kit/components/button/gf_icon_button.dart'; import 'package:ui_kit/components/card/gf_card.dart'; -import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/typography/gf_typography.dart'; import 'package:ui_kit/components/list_tile/gf_list_tile.dart'; import 'package:ui_kit/shape/gf_avatar_shape.dart'; -import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; class ListTiles extends StatefulWidget { @override @@ -28,9 +28,9 @@ class _ListTilesState extends State { GFCard( content: GFListTile( - title: GFHeader( + title: GFTypography( text: 'List tile', - type: GFHeadingType.typo5, + type: GFTypographyType.typo5, showDivider: false, ), subTitle: Text('Lorem ipsum', style: TextStyle(color: getGFColor(GFColor.dark)),), @@ -44,9 +44,9 @@ class _ListTilesState extends State { avatar: GFAvatar( shape: GFAvatarShape.standard, ), - title: GFHeader( + title: GFTypography( text: 'List tile', - type: GFHeadingType.typo5, + type: GFTypographyType.typo5, showDivider: false, ), subTitle: Text('Lorem ipsum', style: TextStyle(color: getGFColor(GFColor.dark)),), @@ -60,9 +60,9 @@ class _ListTilesState extends State { GFCard( content: GFListTile( - title: GFHeader( + title: GFTypography( text: 'List tile', - type: GFHeadingType.typo5, + type: GFTypographyType.typo5, showDivider: false, ), subTitle: Text('Lorem ipsum', style: TextStyle(color: getGFColor(GFColor.dark)),), @@ -82,9 +82,9 @@ class _ListTilesState extends State { avatar: GFAvatar( shape: GFAvatarShape.square, ), - title: GFHeader( + title: GFTypography( text: 'List tile', - type: GFHeadingType.typo5, + type: GFTypographyType.typo5, showDivider: false, ), subTitle: Text('Lorem ipsum', style: TextStyle(color: getGFColor(GFColor.dark)),), diff --git a/demo_app/lib/screens/toasts.dart b/demo_app/lib/screens/toasts.dart index 3ec68dfd..fd6f6a5d 100644 --- a/demo_app/lib/screens/toasts.dart +++ b/demo_app/lib/screens/toasts.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/button/gf_button.dart'; import 'package:ui_kit/components/card/gf_card.dart'; -import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/header/gf_typography.dart'; import 'package:ui_kit/components/toast/gf_toast.dart'; -import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; import 'package:ui_kit/types/gf_type.dart'; class Toasts extends StatefulWidget { diff --git a/demo_app/lib/screens/toggles.dart b/demo_app/lib/screens/toggles.dart index 9199a3e5..691795dd 100644 --- a/demo_app/lib/screens/toggles.dart +++ b/demo_app/lib/screens/toggles.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; import 'package:ui_kit/components/card/gf_card.dart'; -import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/typography/gf_typography.dart'; import 'package:ui_kit/components/toggle/gf_toggle.dart'; -import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; import 'package:ui_kit/types/gf_toggle_type.dart'; import 'package:ui_kit/colors/gf_color.dart'; @@ -27,9 +27,9 @@ class _TogglesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Android', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -43,9 +43,9 @@ class _TogglesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'IOS', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -59,9 +59,9 @@ class _TogglesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Square', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, @@ -75,9 +75,9 @@ class _TogglesState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Custom', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, diff --git a/example/lib/main.dart b/example/lib/main.dart index 5758485b..7df22efa 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -17,6 +17,16 @@ import 'package:ui_kit/components/toast/gf_toast.dart'; import 'package:ui_kit/components/appbar/gf_appbar.dart'; import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; import 'package:ui_kit/components/button/gf_icon_button.dart'; +import 'package:ui_kit/components/button/gf_social_button.dart'; +import 'package:ui_kit/components/carousel/gf_carousel.dart'; +import 'package:ui_kit/components/carousel/gf_items_carousel.dart'; +import 'package:ui_kit/shape/gf_avatar_shape.dart'; +import 'package:ui_kit/components/card/gf_card.dart'; +import 'package:ui_kit/components/image/gf_image_overlay.dart'; +import 'package:ui_kit/components/list_tile/gf_list_tile.dart'; +import 'package:ui_kit/position/gf_position.dart'; +import 'package:ui_kit/components/button/gf_button_bar.dart'; +import 'package:ui_kit/components/badge/gf_icon_badge.dart'; final List imageList = [ "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg", @@ -170,40 +180,109 @@ class _MyHomePageState extends State // Container(color: Colors.green), // Container(color: Colors.blue) // ]), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - - GFButton( - text: 'goodies', - onPressed: (){}, + SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + + GFButton( + text: "whatsapp", + icon: Icon(Icons.directions_bike), + ), + + GFButton( + text: "linkedin", + icon: Icon(Icons.directions_bike), + ), + + + GFButtonBadge( + onPressed: (){}, +// position: GFIconPosition.start, +// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +// text: 'goodiesdxs', +// color: GFColor.danger, +// shape: GFButtonShape.pills, +// type: GFType.outline2x, +// size: GFSize.small, + child: Text("der"), + icon: GFBadge( + child: Text("12"), +// color: GFColor.dark, +// shape: GFBadgeShape.circle, +// size: GFSize.small, +// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +// textColor: GFColor.white, +// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), + ), + ), + + GFSocialButton( + text: 'goodies', + onPressed: (){}, +// icon: GFBadge( +// child: Text("12"), +// color: GFColor.dark, +//// shape: GFBadgeShape.circle, +//// size: GFSize.small, +//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +//// textColor: GFColor.white, +//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +// ), + type: GFType.outline2x, + shape: GFButtonShape.pills, +// blockButton: true, + fullWidthButton: true, + + ), + + GFButton( +// icon: GFBadge( +// child: Text("12"), +// color: GFColor.dark, +//// shape: GFBadgeShape.circle, +//// size: GFSize.small, +//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +//// textColor: GFColor.white, +//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +// ), + text: 'goodies', + onPressed: (){}, // textColor: GFColor.danger, // icon: Icon(Icons.access_alarms), // hoverColor: GFColor.dark, - color: GFColor.secondary, + color: GFColor.secondary, // focusColor: GFColor.danger, - type: GFType.outline2x, - shape: GFButtonShape.pills, + type: GFType.solid, + shape: GFButtonShape.pills, + buttonBoxShadow: true, +// boxShadow: BoxShadow( +// color: Colors.pink, +// blurRadius: 2.0, +// spreadRadius: 1.0, +// offset: Offset.zero, +// ), // splashColor: GFColor.warning, // highlightColor: GFColor.alt, // size: GFSize.large, // disabledColor: GFColor.dark, // disabledTextColor: GFColor.light, - blockButton: true, + blockButton: true, // fullWidthButton: true, // borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), // borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - ), + ), - GFIconButton( - onPressed: null, - icon: Icon(Icons.ac_unit,), + GFIconButton( + onPressed: null, + icon: Icon(Icons.ac_unit,), // iconSize: 12.0, - type: GFType.outline2x, + type: GFType.solid, // shape: GFButtonShape.pills, // size: GFSize.large, -// buttonBoxShadow: true, + buttonBoxShadow: true, color: GFColor.secondary, // boxShadow: BoxShadow( // color: Colors.pink, @@ -213,498 +292,471 @@ class _MyHomePageState extends State // ), // borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), // borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - ), + ), - RaisedButton( - child: Text('goodiesMaterialButton button '), - onPressed: (){}, + RaisedButton( + child: Text('goodiesMaterialButton button '), + onPressed: (){}, // color: Colors.blueGrey, // hoverColor: Colors.blueGrey, // focusColor: Colors.teal, // splashColor: Colors.amber, // highlightColor: Colors.cyan, - ), - ], - ) -// SingleChildScrollView( -// child: Column( -// mainAxisAlignment: MainAxisAlignment.center, -// crossAxisAlignment: CrossAxisAlignment.center, -// children: [ -// GFAvatar( -// radius: 80.0, -// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), + ), + + GFAvatar( + radius: 80.0, + backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), + ), + + GFSegmentTabs( + tabController: tabController, +// height: 38.0, +// width: 180.0, + initialIndex: 0, + length: 3, + tabs: [ + Text( + "Gelatin", + ), + Tab( + child: Text( + "Donuts", + ), + ), + Tab( + child: Text( + "Pastry", + ), + ), + ], +// tabBarColor: Colors.pink.withOpacity(0.6), +// indicatorSize: TabBarIndicatorSize.tab, +// indicatorColor: Colors.tealAccent, +// indicator: BoxDecoration( +// color: Colors.pink, +// border: Border.all(color: Colors.green, width: 1.0), +// borderRadius: BorderRadius.circular(50.0) +// ), +// indicatorPadding: EdgeInsets.all(8.0), +// indicatorWeight: 2.0, +// border: Border.all(color: Colors.orange, width: 2.0), +// borderRadius: BorderRadius.circular(50.0) + ), + + GFTabBarView( + controller: tabController, + height: 400.0, + children: [ + Container(color: Colors.red), + Container(color: Colors.green), + Container(color: Colors.blue) + ] + ), + + GFItemsCarousel( + rowCount: 3, + children: imageList.map( + (url) { + return Container( + margin: EdgeInsets.all(5.0), + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + child: Image.network( + url, + fit: BoxFit.cover, + width: 1000.0 + ), + ), + ); + }, + ).toList(), + ), + + GFCarousel( + rowCount: 3, + pagerSize: 12.0, + activeIndicator: Colors.pink, + passiveIndicator: Colors.pink.withOpacity(0.4), + viewportFraction: 1.0, + aspectRatio: 2.0, + autoPlay: true, + enlargeMainPage: true, + pagination: true, + items: imageList.map( + (url) { + return Container( + margin: EdgeInsets.all(5.0), + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + child: Image.network( + url, + fit: BoxFit.cover, + width: 1000.0 + ), + ), + ); + }, + ).toList(), + onPageChanged: (index) { + setState(() { + index; + }); + }, + ), + + + GFTabs( + initialIndex: 0, + length: 3, + tabs: [ + GFButton( + onPressed: null, + child: Text("share"), + icon: Icon(Icons.share), + buttonBoxShadow: true, + ), + Tab( + icon: Icon(Icons.error), + child: Text( + "Orders", + ), + ), + Tab( + child: Text( + "Pastry", + ), + ), + ], + tabBarView: GFTabBarView( + children: [ + Container( + color: Colors.red, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + + GFToast( + child: Text("sdc"), + backgroundColor: Colors.pink, + button: GFButton( + text: 'dsx', + onPressed: (){ + print("fdsc"); + }, + ), + ), + RawMaterialButton( + onPressed: null, + child: Text("fv"), + ), + FlatButton(onPressed: null, child: Text("cds")), + Icon(Icons.directions_railway), + GFButton( + onPressed: null, + child: Text("share"), + icon: Icon(Icons.share), + shape: GFButtonShape.pills, + type: GFType.transparent, + ), + ], + ), + ), + Icon(Icons.directions_car), + Icon(Icons.directions_transit), + ], + ), +// indicatorColor: Colors.teal, +// indicatorSize: TabBarIndicatorSize.label, +// labelColor: Colors.lightGreen, +// unselectedLabelColor: Colors.black, +// labelStyle: TextStyle( +// fontWeight: FontWeight.w500, +// fontSize: 13.0, +// color: Colors.deepOrange, +// fontFamily: 'OpenSansBold', // ), -// -// GFSegmentTabs( -// tabController: tabController, -//// height: 38.0, -//// width: 180.0, -// initialIndex: 0, -// length: 3, -// tabs: [ -// Tab( -// child: Text( -// "Gelatin", -// ), -// ), -// Tab( -// child: Text( -// "Donuts", -// ), -// ), -// Tab( -// child: Text( -// "Pastry", -// ), -// ), -// ], -//// tabBarColor: Colors.pink.withOpacity(0.6), -//// indicatorSize: TabBarIndicatorSize.tab, -//// indicatorColor: Colors.tealAccent, -//// indicator: BoxDecoration( -//// color: Colors.pink, -//// border: Border.all(color: Colors.green, width: 1.0), -//// borderRadius: BorderRadius.circular(50.0) -//// ), -//// indicatorPadding: EdgeInsets.all(8.0), -//// indicatorWeight: 2.0, -//// border: Border.all(color: Colors.orange, width: 2.0), -//// borderRadius: BorderRadius.circular(50.0) +// unselectedLabelStyle: TextStyle( +// fontWeight: FontWeight.w500, +// fontSize: 13.0, +// color: Colors.black, +// fontFamily: 'OpenSansBold', // ), + ), -// GFTabBarView( -// controller: tabController, -// height: 400.0, -// children: [ -// Container(color: Colors.red), -// Container(color: Colors.green), -// Container(color: Colors.blue) -// ] -// ), + GFCarousel( + autoPlay: true, + viewportFraction: 1.0, + aspectRatio: MediaQuery.of(context).size.aspectRatio, + items: imageList.map( + (url) { + return Container( + margin: EdgeInsets.all(5.0), + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + child: Image.network( + url, + fit: BoxFit.cover, + width: 1000.0, + ), + ), + ); + }, + ).toList(), + onPageChanged: (index) { + setState(() { + index; + }); + }, + ), + GFCard( + boxFit: BoxFit.cover, + colorFilter: new ColorFilter.mode( + Colors.black.withOpacity(0.67), BlendMode.darken), + image: Image.asset("lib/assets/food.jpeg"), +// imageOverlay: AssetImage("lib/assets/food.jpeg"), + titlePosition: GFPosition.end, + title: GFListTile( + avatar: GFAvatar( + child: Text("tb"), + ), + title: Text( + 'title', + style: TextStyle(color: Colors.grey), + ), + subTitle: Text( + 'subtitle', + style: TextStyle(color: Colors.grey), + ), + icon: GFIconButton( + onPressed: null, + icon: Icon(Icons.favorite_border), + type: GFType.transparent, + ), + ), + content: Text( + "Flutter " + "Flutter is Google's mobile UI framework for crafting" + " high-quality native interfaces on iOS and Android in " + "Flutter ", + style: TextStyle(color: Colors.grey), + ), + buttonBar: GFButtonBar( + mainAxisSize: MainAxisSize.min, + children: [ + GFButton( + onPressed: null, + child: Text("favorite"), + icon: Icon(Icons.favorite_border), + type: GFType.transparent, + ), + GFButton( + onPressed: null, + child: Text("share"), + icon: Icon(Icons.share), + type: GFType.outline, + ), + ], + ), + ), + GFButtonBar( + mainAxisSize: MainAxisSize.min, + children: [ + GFButton( + onPressed: null, + child: Text("like"), + icon: Icon(Icons.favorite_border), + type: GFType.transparent, + ), + GFButton( + onPressed: null, + child: Text("comment"), + ), + GFButton( + color: Colors.teal, + onPressed: (){}, + child: Text("share"), + icon: Icon(Icons.share), + type: GFType.outline, + ), + ], + ), -// GFItemsSlider( -// rowCount: 3, -// children: imageList.map( -// (url) { -// return Container( -// margin: EdgeInsets.all(5.0), -// child: ClipRRect( -// borderRadius: BorderRadius.all(Radius.circular(5.0)), -// child: Image.network( -// url, -// fit: BoxFit.cover, -// width: 1000.0 -// ), -// ), -// ); -// }, -// ).toList(), -// ), -// GFSlider( -// rowCount: 3, -// pagerSize: 12.0, -// activeIndicator: Colors.pink, -// passiveIndicator: Colors.pink.withOpacity(0.4), -// viewportFraction: 1.0, -// aspectRatio: 2.0, -// autoPlay: true, -// enlargeMainPage: true, -// pagination: true, -// items: imageList.map( -// (url) { -// return Container( -// margin: EdgeInsets.all(5.0), -// child: ClipRRect( -// borderRadius: BorderRadius.all(Radius.circular(5.0)), -// child: Image.network( -// url, -// fit: BoxFit.cover, -// width: 1000.0 -// ), -// ), -// ); -// }, -// ).toList(), -// onPageChanged: (index) { -// setState(() { -// index; -// }); -// }, -// ), + GFListTile( + avatar: GFAvatar( + child: Text("tb"), + ), + title: Text('title'), + subTitle: Text('subtitle'), + icon: GFIconButton( + onPressed: null, + type: GFType.transparent, + icon: Icon(Icons.favorite_border), + ), + ), + GFImageOverlay( + width: MediaQuery.of(context).size.width, + margin: EdgeInsets.all(16.0), + padding: EdgeInsets.all(16.0), + child: Column( + children: [ + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + new Text( + 'Hello world', + style: TextStyle(color: Colors.white), + ), + ], + ), +// color: Colors.orange, + image: AssetImage("lib/assets/food.jpeg"), + boxFit: BoxFit.cover, + colorFilter: new ColorFilter.mode( + Colors.black.withOpacity(0.6), BlendMode.darken), + borderRadius: new BorderRadius.circular(5.0), +// border: Border.all(color: Colors.pink, width: 2.0), + ), + GFAvatar( + // radius: 20.0, +// maxRadius: 50, + child: Text("de"), -// GFTabs( -// initialIndex: 0, -// length: 3, -// tabs: [ -// GFButton( -// onPressed: null, -// child: Text("share"), -// icon: Icon(Icons.share), -// buttonBoxShadow: true, -// ), -// Tab( -// icon: Icon(Icons.error), -// child: Text( -// "Orders", -// ), -// ), -// Tab( -// child: Text( -// "Pastry", -// ), -// ), -// ], -// tabBarView: GFTabBarView( -// children: [ -// Container( -// color: Colors.red, -// child: Column( -// mainAxisAlignment: MainAxisAlignment.center, -// crossAxisAlignment: CrossAxisAlignment.center, -// children: [ +// backgroundColor: Colors.pink, // -// GFToast( -// child: Text("sdc"), -// backgroundColor: Colors.pink, -// button: GFButton( -// text: 'dsx', -// onPressed: (){ -// print("fdsc"); -// }, -// ), -// ), -// RawMaterialButton( -// onPressed: null, -// child: Text("fv"), -// ), -// FlatButton(onPressed: null, child: Text("cds")), -// Icon(Icons.directions_railway), -// GFButton( -// onPressed: null, -// child: Text("share"), -// icon: Icon(Icons.share), -// shape: GFButtonShape.pills, -// type: GFType.transparent, -// ), -// ], -// ), -// ), -// Icon(Icons.directions_car), -// Icon(Icons.directions_transit), -// ], -// ), -// indicatorColor: Colors.teal, -//// indicatorSize: TabBarIndicatorSize.label, -//// labelColor: Colors.lightGreen, -//// unselectedLabelColor: Colors.black, -//// labelStyle: TextStyle( -//// fontWeight: FontWeight.w500, -//// fontSize: 13.0, -//// color: Colors.deepOrange, -//// fontFamily: 'OpenSansBold', -//// ), -//// unselectedLabelStyle: TextStyle( -//// fontWeight: FontWeight.w500, -//// fontSize: 13.0, -//// color: Colors.black, -//// fontFamily: 'OpenSansBold', -//// ), -// ), +//// backgroundImage: , // -// GFSlider( -// autoPlay: true, -// viewportFraction: 1.0, -// aspectRatio: MediaQuery.of(context).size.aspectRatio, -// items: imageList.map( -// (url) { -// return Container( -// margin: EdgeInsets.all(5.0), -// child: ClipRRect( -// borderRadius: BorderRadius.all(Radius.circular(5.0)), -// child: Image.network( -// url, -// fit: BoxFit.cover, -// width: 1000.0, -// ), -// ), -// ); -// }, -// ).toList(), -// onPageChanged: (index) { -// setState(() { -// index; -// }); -// }, -// ), -// GFCard( -// boxFit: BoxFit.cover, -// colorFilter: new ColorFilter.mode( -// Colors.black.withOpacity(0.67), BlendMode.darken), -// image: Image.asset("lib/assets/food.jpeg"), -//// imageOverlay: AssetImage("lib/assets/food.jpeg"), -// titlePosition: GFPosition.end, -// title: GFListTile( -// avatar: GFAvatar( -// child: Text("tb"), -// ), -// title: Text( -// 'title', -// style: TextStyle(color: Colors.grey), -// ), -// subTitle: Text( -// 'subtitle', -// style: TextStyle(color: Colors.grey), -// ), -// icon: GFIconButton( -// onPressed: null, -// icon: Icon(Icons.favorite_border), -// type: GFType.transparent, -// ), -// ), -// content: Text( -// "Flutter " -// "Flutter is Google's mobile UI framework for crafting" -// " high-quality native interfaces on iOS and Android in " -// "Flutter ", -// style: TextStyle(color: Colors.grey), -// ), -// buttonBar: GFButtonBar( -// mainAxisSize: MainAxisSize.min, -// children: [ -// GFButton( -// onPressed: null, -// child: Text("favorite"), -// icon: Icon(Icons.favorite_border), -// type: GFType.transparent, -// ), -// GFButton( -// onPressed: null, -// child: Text("share"), -// icon: Icon(Icons.share), -// type: GFType.outline, -// ), -// ], -// ), -// ), -// GFButtonBar( -// mainAxisSize: MainAxisSize.min, -// children: [ -// GFButton( -// onPressed: null, -// child: Text("like"), -// icon: Icon(Icons.favorite_border), -// type: GFType.transparent, -// ), -// GFButton( -// onPressed: null, -// child: Text("comment"), -// ), -// GFButton( -// color: Colors.teal, -// onPressed: (){}, -// child: Text("share"), -// icon: Icon(Icons.share), -// type: GFType.outline, -// ), -// ], -// ), +// foregroundColor: Colors.deepOrangeAccent, // + shape: GFAvatarShape.standard, // -// GFListTile( -// avatar: GFAvatar( -// child: Text("tb"), -// ), -// title: Text('title'), -// subTitle: Text('subtitle'), -// icon: GFIconButton( -// onPressed: null, -// type: GFType.transparent, -// icon: Icon(Icons.favorite_border), -// ), -// ), -// GFImageOverlay( -// width: MediaQuery.of(context).size.width, -// margin: EdgeInsets.all(16.0), -// padding: EdgeInsets.all(16.0), -// child: Column( -// children: [ -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// new Text( -// 'Hello world', -// style: TextStyle(color: Colors.white), -// ), -// ], -// ), -//// color: Colors.orange, -// image: AssetImage("lib/assets/food.jpeg"), -// boxFit: BoxFit.cover, -// colorFilter: new ColorFilter.mode( -// Colors.black.withOpacity(0.6), BlendMode.darken), -// borderRadius: new BorderRadius.circular(5.0), -//// border: Border.all(color: Colors.pink, width: 2.0), -// ), -// GFAvatar( -// // radius: 20.0, -//// maxRadius: 50, +// size: GFSize.medium, // -// child: Text("de"), +// borderRadius: BorderRadius.circular(20.0), + ), + GFIconBadge( + onPressed: null, + child: GFIconButton( + onPressed: null, + icon: Icon(Icons.ac_unit), + ), + counterChild: GFBadge( + text: '12', + +// color: GFColor.dark +////, +// shape: GFBadgeShape.circle, // -//// backgroundColor: Colors.pink, -//// -////// backgroundImage: , -//// -//// foregroundColor: Colors.deepOrangeAccent, -//// -// shape: GFAvatarShape.standard, -//// -//// size: GFSize.medium, -//// -//// borderRadius: BorderRadius.circular(20.0), -// ), -// GFIconBadges( -// onPressed: null, -// child: GFIconButton( -// onPressed: null, -// icon: Icon(Icons.ac_unit), -// ), -// counterChild: GFBadge( -// text: '12', +// size: GFSize.small, +// +// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +// +// textColor: GFColor.white, // -//// color: GFColor.dark -//////, -//// shape: GFBadgeShape.circle, -//// -//// size: GFSize.small, -//// -//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// -//// textColor: GFColor.white, -//// -//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -//// -//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.orange, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +// +// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.orange, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), + ), + ), + GFIconButton( + onPressed: null, + icon: Icon(Icons.ac_unit), +// iconSize: 12.0, + type: GFType.solid, + shape: GFButtonShape.pills, + size: GFSize.large, +// buttonBoxShadow: true, +// color: GFColor.primary, +// boxShadow: BoxShadow( +// color: Colors.pink, +// blurRadius: 2.0, +// spreadRadius: 1.0, +// offset: Offset.zero, // ), -// ), -// GFIconButton( -// onPressed: null, -// icon: Icon(Icons.ac_unit), -//// iconSize: 12.0, -// type: GFType.solid, -// shape: GFButtonShape.pills, +// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), + ), + + GFBadge( + text: '12', +// color: GFColor.dark, + shape: GFBadgeShape.circle, +// size: GFSize.small, +// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +// textColor: GFColor.white, +// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), + ), + + GFButton( + type: GFType.solid, + shape: GFButtonShape.pills, + text: 'goodies', + onPressed: () { + print('dddddddddd'); + }, + hoverColor: Colors.orange, + focusColor: Colors.teal, +// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), // size: GFSize.large, -//// buttonBoxShadow: true, -//// color: GFColor.primary, -//// boxShadow: BoxShadow( -//// color: Colors.pink, -//// blurRadius: 2.0, -//// spreadRadius: 1.0, -//// offset: Offset.zero, -//// ), -//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), -// ), -// GFButtonBadge( -// onPressed: null, -//// position: GFIconPosition.start, -//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), -// text: 'goodies', -//// color: GFColor.danger, -//// shape: GFButtonShape.pills, -// type: GFType.outline, -//// size: GFSize.small, -// counterChild: GFBadge( -// child: Text("12"), -//// color: GFColor.dark, -// shape: GFBadgeShape.circle, -//// size: GFSize.small, -//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// textColor: GFColor.white, -//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +// buttonBoxShadow: true, +// blockButton: true, +// fullWidthButton: true, +// color: GFColor.primary, +// textColor: GFColor.secondary, +// icon: Icon(Icons.error, color: Colors.white,), +// position: GFIconPosition.start, +// boxShadow: BoxShadow( +// color: Colors.pink, +// blurRadius: 2.0, +// spreadRadius: 1.0, +// offset: Offset.zero, // ), -// ), -// GFBadge( -// text: '12', -//// color: GFColor.dark, -// shape: GFBadgeShape.circle, -//// size: GFSize.small, -//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// textColor: GFColor.white, -//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -// ), - -// GFButton( -// type: GFType.solid, -// shape: GFButtonShape.pills, -// text: 'goodies', -// onPressed: () { -// print('dddddddddd'); -// }, -// hoverColor: Colors.orange, -// focusColor: Colors.teal, -//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -//// size: GFSize.large, -//// buttonBoxShadow: true, -//// blockButton: true, -//// fullWidthButton: true, -//// color: GFColor.primary, -//// textColor: GFColor.secondary, -//// icon: Icon(Icons.error, color: Colors.white,), -//// position: GFIconPosition.start, -//// boxShadow: BoxShadow( -//// color: Colors.pink, -//// blurRadius: 2.0, -//// spreadRadius: 1.0, -//// offset: Offset.zero, -//// ), -//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), -// ), -// ], -// ), -// ), +// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), + ), + ], + ), + ), ); } } diff --git a/lib/components/badge/gf_button_badge.dart b/lib/components/badge/gf_button_badge.dart index 0925bc51..9346f863 100644 --- a/lib/components/badge/gf_button_badge.dart +++ b/lib/components/badge/gf_button_badge.dart @@ -1,125 +1,397 @@ +import 'dart:math' as math; +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart'; -import 'package:ui_kit/shape/gf_badge_shape.dart'; +import 'package:ui_kit/components/button/gf_button.dart'; import 'package:ui_kit/shape/gf_button_shape.dart'; import 'package:ui_kit/size/gf_size.dart'; import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/position/gf_position.dart'; import 'package:ui_kit/colors/gf_color.dart'; -import 'package:ui_kit/components/button/gf_button.dart'; -class GFButtonBadge extends StatefulWidget { - /// Called when the badge is tapped or otherwise activated. +class GFButtonBadge extends GFButton{ + /// Called when the button is tapped or otherwise activated. final VoidCallback onPressed; + /// Called by the underlying [InkWell] widget's [InkWell.onHighlightChanged] callback. + final ValueChanged onHighlightChanged; + /// Defines the default text style, with [Material.textStyle], for the button's [child]. final TextStyle textStyle; - /// The border side for the badge's [Material]. + /// The border side for the button's [Material]. final BorderSide borderSide; - /// The internal padding for the badge's [child]. + /// The box shadow for the button's [Material]. + final BoxShadow boxShadow; + + /// Pass [GFColor] or [Color]. The color for the button's [Material] when it has the input focus. + final dynamic focusColor; + + /// Pass [GFColor] or [Color]. The color for the button's [Material] when a pointer is hovering over it. + final dynamic hoverColor; + + /// Pass [GFColor] or [Color]. The highlight color for the button's [InkWell]. + final dynamic highlightColor; + + /// Pass [GFColor] or [Color]. The splash color for the button's [InkWell]. + final dynamic splashColor; + + /// The elevation for the button's [Material] when the button is [enabled] but not pressed. + final double elevation; + + /// The elevation for the button's [Material] when the button is [enabled] and a pointer is hovering over it. + final double hoverElevation; + + /// The elevation for the button's [Material] when the button is [enabled] and has the input focus. + final double focusElevation; + + /// The elevation for the button's [Material] when the button is [enabled] and pressed. + final double highlightElevation; + + /// The elevation for the button's [Material] when the button is not [enabled]. + final double disabledElevation; + + /// The internal padding for the button's [child]. final EdgeInsetsGeometry padding; - /// The shape of the badge's [Material]. + /// Defines the button's size. + final BoxConstraints constraints; + + /// The shape of the button's [Material]. final ShapeBorder borderShape; - /// Badge type of [GFType] i.e, solid, outline, transparent + /// Defines the duration of animated changes for [shape] and [elevation]. + final Duration animationDuration; + + /// Typically the button's label. + final Widget child; + + /// Whether the button is enabled or disabled. + bool get enabled => onPressed != null; + + /// Configures the minimum size of the tap target. + final MaterialTapTargetSize materialTapTargetSize; + + /// {@macro flutter.widgets.Focus.focusNode} + final FocusNode focusNode; + + /// {@macro flutter.widgets.Focus.autofocus} + final bool autofocus; + + /// {@macro flutter.widgets.Clip} + final Clip clipBehavior; + + /// Button type of [GFType] i.e, solid, outline, outline2x, transparent final GFType type; - /// Badge type of [GFBadgeShape] i.e, standard, pills, square, circle + /// Button type of [GFButtonBadgeShape] i.e, standard, pills, square, shadow, icons final GFButtonShape shape; /// Pass [GFColor] or [Color] final dynamic color; + /// The fill color of the button when the button is disabled. + /// + /// The default value of this color is the theme's disabled color, + /// [ThemeData.disabledColor]. + /// + /// See also: + /// + /// * [color] - the fill color of the button when the button is [enabled]. + final dynamic disabledColor; + /// Pass [GFColor] or [Color] final dynamic textColor; + /// The color to use for this button's text when the button is disabled. + /// + /// The button's [Material.textStyle] will be the current theme's button + /// text style, [ThemeData.textTheme.button], configured with this color. + /// + /// The default value is the theme's disabled color, + /// [ThemeData.disabledColor]. + /// + /// If [textColor] is a [MaterialStateProperty], [disabledTextColor] + /// will be ignored. + /// + /// See also: + /// + /// * [textColor] - The color to use for this button's text when the button is [enabled]. + final dynamic disabledTextColor; + /// size of [double] or [GFSize] i.e, 1.2, small, medium, large etc. final dynamic size; - /// text of type [String] is used to display text on the button. + /// text of type [String] is alternative to child. text will get priority over child final String text; - /// child of type [Widget] is alternative to child. text will get priority over child. - /// You can use [GFBadge] for compatibility. - final Widget counterChild; + /// icon of type [Widget] + final Widget icon; - /// icon type of [GFPosition] i.e, start, end + /// icon type of [GFIconPosition] i.e, start, end final GFPosition position; - /// Create badges of all types. check out [GFIconBadge] for icon badges and [GFBadge] for default badges. - const GFButtonBadge({ - Key key, - @required this.onPressed, - this.textStyle, - this.padding = const EdgeInsets.symmetric(horizontal: 8.0), - this.borderShape, - this.type = GFType.solid, - this.shape = GFButtonShape.standard, - this.color = GFColor.primary, - this.textColor, - this.position = GFPosition.end, - this.size = GFSize.medium, - this.borderSide, - @required this.text, - @required this.counterChild, - }) : assert(shape != null, 'Badge shape can not be null'), - assert(padding != null), - super(key: key); + /// on true state blockButton gives block size button + final bool blockButton; - @override - _GFButtonBadgeState createState() => _GFButtonBadgeState(); -} + /// on true state full width Button gives full width button + final bool fullWidthButton; -class _GFButtonBadgeState extends State { - Color color; - Color textColor; - Widget child; - Widget icon; - Function onPressed; - GFType type; - GFButtonShape shape; - double size; - GFPosition position; + /// on true state default box shadow appears around button + final bool buttonBoxShadow; - @override - void initState() { - this.color = getGFColor(widget.color); - this.textColor = (widget.type == GFType.outline && widget.textColor == null) - ? this.color - : widget.textColor == null - ? getGFColor(GFColor.dark) - : getGFColor(widget.textColor); - this.onPressed = widget.onPressed; - this.type = widget.type; - this.shape = widget.shape; - this.size = getGFSize(widget.size); - this.position = widget.position; - super.initState(); - } + /// A set of thirteen colors that can be used to derive the button theme's + /// colors. + /// + /// This property was added much later than the theme's set of highly + /// specific colors, like [ThemeData.buttonColor], [ThemeData.highlightColor], + /// [ThemeData.splashColor] etc. + /// + /// The colors for new button classes can be defined exclusively in terms + /// of [colorScheme]. When it's possible, the existing buttons will + /// (continue to) gradually migrate to it. + final ColorScheme colorScheme; + + /// Whether detected gestures should provide acoustic and/or haptic feedback. + /// + /// For example, on Android a tap will produce a clicking sound and a + /// long-press will produce a short vibration, when feedback is enabled. + /// + /// See also: + /// + /// * [Feedback] for providing platform-specific feedback to certain actions. + final bool enableFeedback; + + /// Called when the button is long-pressed. + /// + /// If this callback and [onPressed] are null, then the button will be disabled. + /// + /// See also: + /// + /// * [enabled], which is true if the button is enabled. + final VoidCallback onLongPress; + + /// Create buttons of all types. check out [GFIconButton] for icon buttons, and [GFBadge] for badges + const GFButtonBadge( + {Key key, + @required this.onPressed, + this.onHighlightChanged, + this.textStyle, + this.boxShadow, + this.buttonBoxShadow, + this.focusColor, + this.hoverColor, + this.highlightColor, + this.splashColor, + this.elevation = 0.0, + this.focusElevation = 4.0, + this.hoverElevation = 4.0, + this.highlightElevation = 1.0, + this.disabledElevation = 0.0, + this.padding = const EdgeInsets.symmetric(horizontal: 8.0), + this.constraints, + this.borderShape, + this.animationDuration = kThemeChangeDuration, + this.clipBehavior = Clip.none, + this.focusNode, + this.autofocus = false, + MaterialTapTargetSize materialTapTargetSize, + this.child, + this.type = GFType.solid, + this.shape = GFButtonShape.standard, + this.color = GFColor.primary, + this.textColor, + this.position = GFPosition.end, + this.size = GFSize.medium, + this.borderSide, + this.text, + this.icon, + this.blockButton, + this.fullWidthButton, + this.colorScheme, + this.enableFeedback, + this.onLongPress, + this.disabledColor, + this.disabledTextColor, + }) + : materialTapTargetSize = + materialTapTargetSize ?? MaterialTapTargetSize.padded, + assert(shape != null, 'Button shape can not be null'), +// assert(elevation != null && elevation >= 0.0), + assert(focusElevation != null && focusElevation >= 0.0), + assert(hoverElevation != null && hoverElevation >= 0.0), + assert(highlightElevation != null && highlightElevation >= 0.0), + assert(disabledElevation != null && disabledElevation >= 0.0), + assert(padding != null), + assert(animationDuration != null), + assert(clipBehavior != null), + assert(autofocus != null); @override Widget build(BuildContext context) { + return ConstrainedBox( constraints: BoxConstraints(minHeight: 26.0, minWidth: 98.0), child: Container( height: this.size, child: GFButton( - textStyle: widget.textStyle, - borderSide: widget.borderSide, - color: this.color, - textColor: this.textColor, - text: widget.text, - onPressed: this.onPressed, - type: this.type, - shape: this.shape, - position: this.position, - size: this.size, - borderShape: widget.borderShape, - icon: widget.counterChild, + onPressed: onPressed, + onHighlightChanged: onHighlightChanged, + textStyle: textStyle, + boxShadow: boxShadow, + buttonBoxShadow: buttonBoxShadow, + focusColor: focusColor, + hoverColor: hoverColor, + highlightColor: highlightColor, + splashColor: splashColor, + elevation: elevation, + focusElevation: focusElevation, + hoverElevation: hoverElevation, + highlightElevation:highlightElevation, + disabledElevation: disabledElevation, + constraints: constraints, + borderShape: borderShape, + animationDuration: animationDuration, + clipBehavior: clipBehavior, + focusNode: focusNode, + autofocus : autofocus , + child: child, + type :GFType.solid, + shape :GFButtonShape.standard, + color :GFColor.primary, + textColor: textColor, + position :GFPosition.start, + size :GFSize.medium, + borderSide: borderSide, + text: text, + icon: icon, + blockButton: blockButton, + fullWidthButton: fullWidthButton, + disabledColor: disabledTextColor, + disabledTextColor: disabledColor, ), ), ); + } } + + + + +// +//class GFButtonBadge extends StatefulWidget { +// /// Called when the badge is tapped or otherwise activated. +// final VoidCallback onPressed; +// +// /// Defines the default text style, with [Material.textStyle], for the button's [child]. +// final TextStyle textStyle; +// +// /// The border side for the badge's [Material]. +// final BorderSide borderSide; +// +// /// The internal padding for the badge's [child]. +// final EdgeInsetsGeometry padding; +// +// /// The shape of the badge's [Material]. +// final ShapeBorder borderShape; +// +// /// Badge type of [GFType] i.e, solid, outline, transparent +// final GFType type; +// +// /// Badge type of [GFBadgeShape] i.e, standard, pills, square, circle +// final GFButtonShape shape; +// +// /// Pass [GFColor] or [Color] +// final dynamic color; +// +// /// Pass [GFColor] or [Color] +// final dynamic textColor; +// +// /// size of [double] or [GFSize] i.e, 1.2, small, medium, large etc. +// final dynamic size; +// +// /// text of type [String] is used to display text on the button. +// final String text; +// +// /// child of type [Widget] is alternative to child. text will get priority over child. +// /// You can use [GFBadge] for compatibility. +// final Widget icon; +// +// /// icon type of [GFPosition] i.e, start, end +// final GFPosition position; +// +// /// Create badges of all types. check out [GFIconBadge] for icon badges and [GFBadge] for default badges. +// const GFButtonBadge({ +// Key key, +// @required this.onPressed, +// this.textStyle, +// this.padding = const EdgeInsets.symmetric(horizontal: 8.0), +// this.borderShape, +// this.type = GFType.solid, +// this.shape = GFButtonShape.standard, +// this.color = GFColor.primary, +// this.textColor, +// this.position = GFPosition.end, +// this.size = GFSize.medium, +// this.borderSide, +// @required this.text, +// @required this.icon, +// }) : assert(shape != null, 'Badge shape can not be null'), +// assert(padding != null), +// super(key: key); +// +// @override +// _GFButtonBadgeState createState() => _GFButtonBadgeState(); +//} +// +//class _GFButtonBadgeState extends State { +// Color color; +// Color textColor; +// Widget child; +// Widget icon; +// Function onPressed; +// GFType type; +// GFButtonShape shape; +// double size; +// GFPosition position; +// +// @override +// void initState() { +// this.color = getGFColor(widget.color); +// this.textColor = getGFColor(widget.textColor); +// this.onPressed = widget.onPressed; +// this.type = widget.type; +// this.shape = widget.shape; +// this.size = getGFSize(widget.size); +// this.position = widget.position; +// super.initState(); +// } +// +// @override +// Widget build(BuildContext context) { +// return ConstrainedBox( +// constraints: BoxConstraints(minHeight: 26.0, minWidth: 98.0), +// child: Container( +// height: this.size, +// child: GFButton( +// textStyle: widget.textStyle, +// borderSide: widget.borderSide, +// color: this.color, +// textColor: this.textColor, +// text: widget.text, +// onPressed: this.onPressed, +// type: this.type, +// shape: this.shape, +// position: this.position, +// size: this.size, +// borderShape: widget.borderShape, +// icon: widget.icon, +// ), +// ), +// ); +// } +//} diff --git a/lib/components/button/gf_button_theme.dart b/lib/components/button/gf_button_theme.dart deleted file mode 100644 index 2962ef45..00000000 --- a/lib/components/button/gf_button_theme.dart +++ /dev/null @@ -1,956 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter/material.dart'; - -/// Used with [ButtonTheme] and [ButtonThemeData] to define a button's base -/// colors, and the defaults for the button's minimum size, internal padding, -/// and shape. -/// -/// See also: -/// -/// * [RaisedButton], [FlatButton], [OutlineButton], which are configured -/// based on the ambient [ButtonTheme]. -enum ButtonTextTheme { - /// Button text is black or white depending on [ThemeData.brightness]. - normal, - - /// Button text is [ThemeData.accentColor]. - accent, - - /// Button text is based on [ThemeData.primaryColor]. - primary, -} - -/// Used with [ButtonTheme] and [ButtonThemeData] to define how the button bar -/// should size itself with either constraints or internal padding. -enum ButtonBarLayoutBehavior { - /// Button bars will be constrained to a minimum height of 52. - /// - /// This setting is require to create button bars which conform to the - /// material specification. - constrained, - - /// Button bars will calculate their padding from the button theme padding. - padded, -} - -/// Used with [ButtonThemeData] to configure the color and geometry of buttons. -/// -/// A button theme can be specified as part of the overall Material theme -/// using [ThemeData.buttonTheme]. The Material theme's button theme data -/// can be overridden with [ButtonTheme]. -/// -/// The actual appearance of buttons depends on the button theme, the -/// button's enabled state, its elevation (if any), and the overall [Theme]. -/// -/// See also: -/// -/// * [FlatButton] [RaisedButton], and [OutlineButton], which are styled -/// based on the ambient button theme. -/// * [RawMaterialButton], which can be used to configure a button that doesn't -/// depend on any inherited themes. -class ButtonTheme extends InheritedTheme { - /// Creates a button theme. - /// - /// The [textTheme], [minWidth], [height], and [colorScheme] arguments - /// must not be null. - ButtonTheme({ - Key key, - ButtonTextTheme textTheme = ButtonTextTheme.normal, - ButtonBarLayoutBehavior layoutBehavior = ButtonBarLayoutBehavior.padded, - double minWidth = 88.0, - double height = 36.0, - EdgeInsetsGeometry padding, - ShapeBorder shape, - bool alignedDropdown = false, - Color buttonColor, - Color disabledColor, - Color focusColor, - Color hoverColor, - Color highlightColor, - Color splashColor, - ColorScheme colorScheme, - MaterialTapTargetSize materialTapTargetSize, - Widget child, - }) : assert(textTheme != null), - assert(minWidth != null && minWidth >= 0.0), - assert(height != null && height >= 0.0), - assert(alignedDropdown != null), - assert(layoutBehavior != null), - data = ButtonThemeData( - textTheme: textTheme, - minWidth: minWidth, - height: height, - padding: padding, - shape: shape, - alignedDropdown: alignedDropdown, - layoutBehavior: layoutBehavior, - buttonColor: buttonColor, - disabledColor: disabledColor, - focusColor: focusColor, - hoverColor: hoverColor, - highlightColor: highlightColor, - splashColor: splashColor, - colorScheme: colorScheme, - materialTapTargetSize: materialTapTargetSize, - ), - super(key: key, child: child); - - /// Creates a button theme from [data]. - /// - /// The [data] argument must not be null. - const ButtonTheme.fromButtonThemeData({ - Key key, - @required this.data, - Widget child, - }) : assert(data != null), - super(key: key, child: child); - - // TODO(darrenaustin): remove after this deprecation warning has been on - // stable for a couple of releases. - // See https://github.com/flutter/flutter/issues/37333 - // - /// Creates a button theme that is appropriate for button bars, as used in - /// dialog footers and in the headers of data tables. - /// - /// Deprecated. Please use [ButtonBarTheme] instead which offers more - /// flexibility to configure [ButtonBar] widgets. - /// - /// To migrate instances of code that were just wrapping a [ButtonBar]: - /// - /// ```dart - /// ButtonTheme.bar( - /// child: ButtonBar(...) - /// ); - /// ``` - /// - /// you can just remove the `ButtonTheme.bar` as the defaults are now handled - /// by [ButtonBar] directly. - /// - /// If you have more complicated usages of `ButtonTheme.bar` like: - /// - /// ```dart - /// ButtonTheme.bar( - /// padding: EdgeInsets.symmetric(horizontal: 10.0), - /// textTheme: ButtonTextTheme.accent, - /// child: ButtonBar(...), - /// ); - /// ``` - /// - /// you can remove the `ButtonTheme.bar` and move the parameters to the - /// [ButtonBar] instance directly: - /// - /// ```dart - /// ButtonBar( - /// padding: EdgeInsets.symmetric(horizontal: 10.0), - /// textTheme: ButtonTextTheme.accent, - /// ... - /// ); - /// ``` - /// - /// You can also replace the defaults for all [ButtonBar] widgets by updating - /// [ThemeData.buttonBarTheme] for your app. - @Deprecated( - 'Use ButtonBarTheme instead. ' - 'This feature was deprecated after v1.9.1.' - ) - ButtonTheme.bar({ - Key key, - ButtonTextTheme textTheme = ButtonTextTheme.accent, - double minWidth = 64.0, - double height = 36.0, - EdgeInsetsGeometry padding = const EdgeInsets.symmetric(horizontal: 8.0), - ShapeBorder shape, - bool alignedDropdown = false, - Color buttonColor, - Color disabledColor, - Color focusColor, - Color hoverColor, - Color highlightColor, - Color splashColor, - ColorScheme colorScheme, - Widget child, - ButtonBarLayoutBehavior layoutBehavior = ButtonBarLayoutBehavior.padded, - }) : assert(textTheme != null), - assert(minWidth != null && minWidth >= 0.0), - assert(height != null && height >= 0.0), - assert(alignedDropdown != null), - data = ButtonThemeData( - textTheme: textTheme, - minWidth: minWidth, - height: height, - padding: padding, - shape: shape, - alignedDropdown: alignedDropdown, - layoutBehavior: layoutBehavior, - buttonColor: buttonColor, - disabledColor: disabledColor, - focusColor: focusColor, - hoverColor: hoverColor, - highlightColor: highlightColor, - splashColor: splashColor, - colorScheme: colorScheme, - ), - super(key: key, child: child); - - /// Specifies the color and geometry of buttons. - final ButtonThemeData data; - - /// The closest instance of this class that encloses the given context. - /// - /// Typical usage is as follows: - /// - /// ```dart - /// ButtonThemeData theme = ButtonTheme.of(context); - /// ``` - static ButtonThemeData of(BuildContext context) { - final ButtonTheme inheritedButtonTheme = context.dependOnInheritedWidgetOfExactType(); - ButtonThemeData buttonTheme = inheritedButtonTheme?.data; - if (buttonTheme?.colorScheme == null) { // if buttonTheme or buttonTheme.colorScheme is null - final ThemeData theme = Theme.of(context); -// buttonTheme ??= theme.buttonTheme; - if (buttonTheme.colorScheme == null) { - buttonTheme = buttonTheme.copyWith( - colorScheme: theme.buttonTheme.colorScheme ?? theme.colorScheme, - ); - assert(buttonTheme.colorScheme != null); - } - } - return buttonTheme; - } - - @override - Widget wrap(BuildContext context, Widget child) { - final ButtonTheme ancestorTheme = context.findAncestorWidgetOfExactType(); - return identical(this, ancestorTheme) ? child : ButtonTheme.fromButtonThemeData(data: data, child: child); - } - - @override - bool updateShouldNotify(ButtonTheme oldWidget) => data != oldWidget.data; -} - -/// Used with [ButtonTheme] to configure the color and geometry of buttons. -/// -/// A button theme can be specified as part of the overall Material theme -/// using [ThemeData.buttonTheme]. The Material theme's button theme data -/// can be overridden with [ButtonTheme]. -class ButtonThemeData extends Diagnosticable { - /// Create a button theme object that can be used with [ButtonTheme] - /// or [ThemeData]. - /// - /// The [textTheme], [minWidth], [height], [alignedDropDown], and - /// [layoutBehavior] parameters must not be null. The [minWidth] and - /// [height] parameters must greater than or equal to zero. - /// - /// The ButtonTheme's methods that have a [MaterialButton] parameter and - /// have a name with a `get` prefix are used by [RaisedButton], - /// [OutlineButton], and [FlatButton] to configure a [RawMaterialButton]. - const ButtonThemeData({ - this.textTheme = ButtonTextTheme.normal, - this.minWidth = 88.0, - this.height = 36.0, - EdgeInsetsGeometry padding, - ShapeBorder shape, - this.layoutBehavior = ButtonBarLayoutBehavior.padded, - this.alignedDropdown = false, - Color buttonColor, - Color disabledColor, - Color focusColor, - Color hoverColor, - Color highlightColor, - Color splashColor, - this.colorScheme, - MaterialTapTargetSize materialTapTargetSize, - }) : assert(textTheme != null), - assert(minWidth != null && minWidth >= 0.0), - assert(height != null && height >= 0.0), - assert(alignedDropdown != null), - assert(layoutBehavior != null), - _buttonColor = buttonColor, - _disabledColor = disabledColor, - _focusColor = focusColor, - _hoverColor = hoverColor, - _highlightColor = highlightColor, - _splashColor = splashColor, - _padding = padding, - _shape = shape, - _materialTapTargetSize = materialTapTargetSize; - - /// The minimum width for buttons. - /// - /// The actual horizontal space allocated for a button's child is - /// at least this value less the theme's horizontal [padding]. - /// - /// Defaults to 88.0 logical pixels. - final double minWidth; - - /// The minimum height for buttons. - /// - /// Defaults to 36.0 logical pixels. - final double height; - - /// Defines a button's base colors, and the defaults for the button's minimum - /// size, internal padding, and shape. - /// - /// Despite the name, this property is not a [TextTheme], its value is not a - /// collection of [TextStyle]s. - final ButtonTextTheme textTheme; - - /// Defines whether a [ButtonBar] should size itself with a minimum size - /// constraint or with padding. - /// - /// Defaults to [ButtonBarLayoutBehavior.padded]. - final ButtonBarLayoutBehavior layoutBehavior; - - /// Simply a convenience that returns [minWidth] and [height] as a - /// [BoxConstraints] object: - /// - /// ```dart - /// return BoxConstraints( - /// minWidth: minWidth, - /// minHeight: height, - /// ); - /// ``` - BoxConstraints get constraints { - return BoxConstraints( - minWidth: minWidth, - minHeight: height, - ); - } - - /// Padding for a button's child (typically the button's label). - /// - /// Defaults to 24.0 on the left and right if [textTheme] is - /// [ButtonTextTheme.primary], 16.0 on the left and right otherwise. - /// - /// See also: - /// - /// * [getPadding], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - EdgeInsetsGeometry get padding { - if (_padding != null) - return _padding; - switch (textTheme) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return const EdgeInsets.symmetric(horizontal: 16.0); - case ButtonTextTheme.primary: - return const EdgeInsets.symmetric(horizontal: 24.0); - } - assert(false); - return EdgeInsets.zero; - } - final EdgeInsetsGeometry _padding; - - /// The shape of a button's material. - /// - /// The button's highlight and splash are clipped to this shape. If the - /// button has an elevation, then its drop shadow is defined by this - /// shape as well. - /// - /// Defaults to a rounded rectangle with circular corner radii of 4.0 if - /// [textTheme] is [ButtonTextTheme.primary], a rounded rectangle with - /// circular corner radii of 2.0 otherwise. - /// - /// See also: - /// - /// * [getShape], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - ShapeBorder get shape { - if (_shape != null) - return _shape; - switch (textTheme) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(2.0)), - ); - case ButtonTextTheme.primary: - return const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(4.0)), - ); - } - return const RoundedRectangleBorder(); - } - final ShapeBorder _shape; - - /// If true, then a [DropdownButton] menu's width will match the button's - /// width. - /// - /// If false (the default), then the dropdown's menu will be wider than - /// its button. In either case the dropdown button will line up the leading - /// edge of the menu's value with the leading edge of the values - /// displayed by the menu items. - /// - /// This property only affects [DropdownButton] and its menu. - final bool alignedDropdown; - - /// The background fill color for [RaisedButton]s. - /// - /// This property is null by default. - /// - /// If the button is in the focused, hovering, or highlighted state, then the - /// [focusColor], [hoverColor], or [highlightColor] will take precedence over - /// the [focusColor]. - /// - /// See also: - /// - /// * [getFillColor], which is used by [RaisedButton] to compute its - /// background fill color. - final Color _buttonColor; - - /// The background fill color for disabled [RaisedButton]s. - /// - /// This property is null by default. - /// - /// See also: - /// - /// * [getDisabledFillColor], which is used by [RaisedButton] to compute its - /// background fill color. - final Color _disabledColor; - - /// The fill color of the button when it has the input focus. - /// - /// This property is null by default. - /// - /// If the button is in the hovering or highlighted state, then the [hoverColor] - /// or [highlightColor] will take precedence over the [focusColor]. - /// - /// See also: - /// - /// * [getFocusColor], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - final Color _focusColor; - - /// The fill color of the button when a pointer is hovering over it. - /// - /// This property is null by default. - /// - /// If the button is in the highlighted state, then the [highlightColor] will - /// take precedence over the [hoverColor]. - /// - /// See also: - /// - /// * [getHoverColor], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - final Color _hoverColor; - - /// The color of the overlay that appears when a button is pressed. - /// - /// This property is null by default. - /// - /// See also: - /// - /// * [getHighlightColor], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - final Color _highlightColor; - - /// The color of the ink "splash" overlay that appears when a button is tapped. - /// - /// This property is null by default. - /// - /// See also: - /// - /// * [getSplashColor], which is used by [RaisedButton], [OutlineButton] - /// and [FlatButton]. - final Color _splashColor; - - /// A set of thirteen colors that can be used to derive the button theme's - /// colors. - /// - /// This property was added much later than the theme's set of highly - /// specific colors, like [ThemeData.buttonColor], [ThemeData.highlightColor], - /// [ThemeData.splashColor] etc. - /// - /// The colors for new button classes can be defined exclusively in terms - /// of [colorScheme]. When it's possible, the existing buttons will - /// (continue to) gradually migrate to it. - final ColorScheme colorScheme; - - // The minimum size of a button's tap target. - // - // This property is null by default. - // - // See also: - // - // * [getMaterialTargetTapSize], which is used by [RaisedButton], - // [OutlineButton] and [FlatButton]. - final MaterialTapTargetSize _materialTapTargetSize; - - /// The [button]'s overall brightness. - /// - /// Returns the button's [MaterialButton.colorBrightness] if it is non-null, - /// otherwise the color scheme's [ColorScheme.brightness] is returned. - Brightness getBrightness(MaterialButton button) { - return button.colorBrightness ?? colorScheme.brightness; - } - - /// Defines the [button]'s base colors, and the defaults for the button's - /// minimum size, internal padding, and shape. - /// - /// Despite the name, this property is not the [TextTheme] whose - /// [TextTheme.button] is used as the button text's [TextStyle]. - ButtonTextTheme getTextTheme(MaterialButton button) { - return button.textTheme ?? textTheme; - } - - /// The foreground color of the [button]'s text and icon when - /// [MaterialButton.onPressed] is null (when MaterialButton.enabled is false). - /// - /// Returns the button's [MaterialButton.disabledColor] if it is non-null. - /// Otherwise the color scheme's [ColorScheme.onSurface] color is returned - /// with its opacity set to 0.38. - /// - /// If [MaterialButton.textColor] is a [MaterialStateProperty], it will be - /// used as the `disabledTextColor`. It will be resolved in the [MaterialState.disabled] state. - Color getDisabledTextColor(MaterialButton button) { - if (button.textColor is MaterialStateProperty) - return button.textColor; - if (button.disabledTextColor != null) - return button.disabledTextColor; - return colorScheme.onSurface.withOpacity(0.38); - } - - /// The [button]'s background color when [MaterialButton.onPressed] is null - /// (when [MaterialButton.enabled] is false). - /// - /// Returns the button's [MaterialButton.disabledColor] if it is non-null. - /// - /// Otherwise the value of the `disabledColor` constructor parameter - /// is returned, if it is non-null. - /// - /// Otherwise the color scheme's [ColorScheme.onSurface] color is returned - /// with its opacity set to 0.38. - Color getDisabledFillColor(MaterialButton button) { - if (button.disabledColor != null) - return button.disabledColor; - if (_disabledColor != null) - return _disabledColor; - return colorScheme.onSurface.withOpacity(0.38); - } - - /// The button's background fill color or null for buttons that don't have - /// a background color. - /// - /// Returns [MaterialButton.color] if it is non-null and the button - /// is enabled. - /// - /// Otherwise, returns [MaterialButton.disabledColor] if it is non-null and - /// the button is disabled. - /// - /// Otherwise, if button is a [FlatButton] or an [OutlineButton] then null is - /// returned. - /// - /// Otherwise, if button is a [RaisedButton], returns the `buttonColor` - /// constructor parameter if it was non-null and the button is enabled. - /// - /// Otherwise the fill color depends on the value of [getTextTheme]. - /// - /// * [ButtonTextTheme.normal] or [ButtonTextTheme.accent], the - /// color scheme's [ColorScheme.primary] color if the [button] is enabled - /// the value of [getDisabledFillColor] otherwise. - /// * [ButtonTextTheme.primary], if the [button] is enabled then the value - /// of the `buttonColor` constructor parameter if it is non-null, - /// otherwise the color scheme's ColorScheme.primary color. If the button - /// is not enabled then the colorScheme's [ColorScheme.onSurface] color - /// with opacity 0.12. - Color getFillColor(MaterialButton button) { - final Color fillColor = button.enabled ? button.color : button.disabledColor; - if (fillColor != null) - return fillColor; - - if (button is FlatButton || button is OutlineButton || button.runtimeType == MaterialButton) - return null; - - if (button.enabled && button is RaisedButton && _buttonColor != null) - return _buttonColor; - - switch (getTextTheme(button)) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return button.enabled ? colorScheme.primary : getDisabledFillColor(button); - case ButtonTextTheme.primary: - return button.enabled - ? _buttonColor ?? colorScheme.primary - : colorScheme.onSurface.withOpacity(0.12); - } - - assert(false); - return null; - } - - /// The foreground color of the [button]'s text and icon. - /// - /// If [button] is not [MaterialButton.enabled], the value of - /// [getDisabledTextColor] is returned. If the button is enabled and - /// [buttonTextColor] is non-null, then [buttonTextColor] is returned. - /// - /// Otherwise the text color depends on the value of [getTextTheme] - /// and [getBrightness]. - /// - /// * [ButtonTextTheme.normal]: [Colors.white] is used if [getBrightness] - /// resolves to [Brightness.dark]. [Colors.black87] is used if - /// [getBrightness] resolves to [Brightness.light]. - /// * [ButtonTextTheme.accent]: [colorScheme.secondary]. - /// * [ButtonTextTheme.primary]: If [getFillColor] is dark then [Colors.white], - /// otherwise if [button] is a [FlatButton] or an [OutlineButton] then - /// [colorScheme.primary], otherwise [Colors.black]. - Color getTextColor(MaterialButton button) { - if (!button.enabled) - return getDisabledTextColor(button); - - if (button.textColor != null) - return button.textColor; - - switch (getTextTheme(button)) { - case ButtonTextTheme.normal: - return getBrightness(button) == Brightness.dark ? Colors.white : Colors.black87; - - case ButtonTextTheme.accent: - return colorScheme.secondary; - - case ButtonTextTheme.primary: - final Color fillColor = getFillColor(button); - final bool fillIsDark = fillColor != null - ? ThemeData.estimateBrightnessForColor(fillColor) == Brightness.dark - : getBrightness(button) == Brightness.dark; - if (fillIsDark) - return Colors.white; - if (button is FlatButton || button is OutlineButton) - return colorScheme.primary; - return Colors.black; - } - - assert(false); - return null; - } - - /// The color of the ink "splash" overlay that appears when the (enabled) - /// [button] is tapped. - /// - /// Returns the button's [MaterialButton.splashColor] if it is non-null. - /// - /// Otherwise, returns the value of the `splashColor` constructor parameter - /// it is non-null and [button] is a [RaisedButton] or an [OutlineButton]. - /// - /// Otherwise, returns the value of the `splashColor` constructor parameter - /// if it is non-null and [button] is a [FlatButton] and - /// [getTextTheme] is not [ButtonTextTheme.primary] - /// - /// Otherwise, returns [getTextColor] with an opacity of 0.12. - Color getSplashColor(MaterialButton button) { - if (button.splashColor != null) - return button.splashColor; - - if (_splashColor != null && (button is RaisedButton || button is OutlineButton)) - return _splashColor; - - if (_splashColor != null && button is FlatButton) { - switch (getTextTheme(button)) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return _splashColor; - case ButtonTextTheme.primary: - break; - } - } - - return getTextColor(button).withOpacity(0.12); - } - - /// The fill color of the button when it has input focus. - /// - /// Returns the button's [MaterialButton.focusColor] if it is non-null. - /// Otherwise the focus color depends on [getTextTheme]: - /// - /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent]: returns the - /// value of the `focusColor` constructor parameter if it is non-null, - /// otherwise the value of [getTextColor] with opacity 0.12. - /// * [ButtonTextTheme.primary], returns [Colors.transparent]. - Color getFocusColor(MaterialButton button) { - return button.focusColor ?? _focusColor ?? getTextColor(button).withOpacity(0.12); - } - - /// The fill color of the button when it has input focus. - /// - /// Returns the button's [MaterialButton.focusColor] if it is non-null. - /// Otherwise the focus color depends on [getTextTheme]: - /// - /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent], - /// [ButtonTextTheme.primary]: returns the value of the `focusColor` - /// constructor parameter if it is non-null, otherwise the value of - /// [getTextColor] with opacity 0.04. - Color getHoverColor(MaterialButton button) { - return button.hoverColor ?? _hoverColor ?? getTextColor(button).withOpacity(0.04); - } - - /// The color of the overlay that appears when the [button] is pressed. - /// - /// Returns the button's [MaterialButton.highlightColor] if it is non-null. - /// Otherwise the highlight color depends on [getTextTheme]: - /// - /// * [ButtonTextTheme.normal], [ButtonTextTheme.accent]: returns the - /// value of the `highlightColor` constructor parameter if it is non-null, - /// otherwise the value of [getTextColor] with opacity 0.16. - /// * [ButtonTextTheme.primary], returns [Colors.transparent]. - Color getHighlightColor(MaterialButton button) { - if (button.highlightColor != null) - return button.highlightColor; - - switch (getTextTheme(button)) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return _highlightColor ?? getTextColor(button).withOpacity(0.16); - case ButtonTextTheme.primary: - return Colors.transparent; - } - - assert(false); - return Colors.transparent; - } - - /// The [button]'s elevation when it is enabled and has not been pressed. - /// - /// Returns the button's [MaterialButton.elevation] if it is non-null. - /// - /// If button is a [FlatButton] then elevation is 0.0, otherwise it is 2.0. - double getElevation(MaterialButton button) { - if (button.elevation != null) - return button.elevation; - if (button is FlatButton) - return 0.0; - return 2.0; - } - - /// The [button]'s elevation when it is enabled and has focus. - /// - /// Returns the button's [MaterialButton.focusElevation] if it is non-null. - /// - /// If button is a [FlatButton] or an [OutlineButton] then the focus - /// elevation is 0.0, otherwise the highlight elevation is 4.0. - double getFocusElevation(MaterialButton button) { - if (button.focusElevation != null) - return button.focusElevation; - if (button is FlatButton) - return 0.0; - if (button is OutlineButton) - return 0.0; - return 4.0; - } - - /// The [button]'s elevation when it is enabled and has focus. - /// - /// Returns the button's [MaterialButton.hoverElevation] if it is non-null. - /// - /// If button is a [FlatButton] or an [OutlineButton] then the hover - /// elevation is 0.0, otherwise the highlight elevation is 4.0. - double getHoverElevation(MaterialButton button) { - if (button.hoverElevation != null) - return button.hoverElevation; - if (button is FlatButton) - return 0.0; - if (button is OutlineButton) - return 0.0; - return 4.0; - } - - /// The [button]'s elevation when it is enabled and has been pressed. - /// - /// Returns the button's [MaterialButton.highlightElevation] if it is non-null. - /// - /// If button is a [FlatButton] or an [OutlineButton] then the highlight - /// elevation is 0.0, otherwise the highlight elevation is 8.0. - double getHighlightElevation(MaterialButton button) { - if (button.highlightElevation != null) - return button.highlightElevation; - if (button is FlatButton) - return 0.0; - if (button is OutlineButton) - return 0.0; - return 8.0; - } - - /// The [button]'s elevation when [MaterialButton.onPressed] is null (when - /// MaterialButton.enabled is false). - /// - /// Returns the button's [MaterialButton.elevation] if it is non-null. - /// - /// Otherwise the disabled elevation is 0.0. - double getDisabledElevation(MaterialButton button) { - if (button.disabledElevation != null) - return button.disabledElevation; - return 0.0; - } - - /// Padding for the [button]'s child (typically the button's label). - /// - /// Returns the button's [MaterialButton.padding] if it is non-null. - /// - /// If this is a button constructed with [RaisedButton.icon] or - /// [FlatButton.icon] or [OutlineButton.icon] then the padding is: - /// `EdgeInsetsDirectional.only(start: 12.0, end: 16.0)`. - /// - /// Otherwise, returns [padding] if it is non-null. - /// - /// Otherwise, returns horizontal padding of 24.0 on the left and right if - /// [getTextTheme] is [ButtonTextTheme.primary], 16.0 on the left and right - /// otherwise. - EdgeInsetsGeometry getPadding(MaterialButton button) { - if (button.padding != null) - return button.padding; - - if (button is MaterialButtonWithIconMixin) - return const EdgeInsetsDirectional.only(start: 12.0, end: 16.0); - - if (_padding != null) - return _padding; - - switch (getTextTheme(button)) { - case ButtonTextTheme.normal: - case ButtonTextTheme.accent: - return const EdgeInsets.symmetric(horizontal: 16.0); - case ButtonTextTheme.primary: - return const EdgeInsets.symmetric(horizontal: 24.0); - } - assert(false); - return EdgeInsets.zero; - } - - /// The shape of the [button]'s [Material]. - /// - /// Returns the button's [MaterialButton.shape] if it is non-null, otherwise - /// [shape] is returned. - ShapeBorder getShape(MaterialButton button) { - return button.shape ?? shape; - } - - /// The duration of the [button]'s highlight animation. - /// - /// Returns the button's [MaterialButton.animationDuration] it if is non-null, - /// otherwise 200ms. - Duration getAnimationDuration(MaterialButton button) { - return button.animationDuration ?? kThemeChangeDuration; - } - - /// The [BoxConstraints] that the define the [button]'s size. - /// - /// By default this method just returns [constraints]. Subclasses - /// could override this method to return a value that was, - /// for example, based on the button's type. - BoxConstraints getConstraints(MaterialButton button) => constraints; - - /// The minimum size of the [button]'s tap target. - /// - /// Returns the button's [MaterialButton.tapTargetSize] if it is non-null. - /// - /// Otherwise the value of the [materialTapTargetSize] constructor - /// parameter is returned if that's non-null. - /// - /// Otherwise [MaterialTapTargetSize.padded] is returned. - MaterialTapTargetSize getMaterialTapTargetSize(MaterialButton button) { - return button.materialTapTargetSize ?? _materialTapTargetSize ?? MaterialTapTargetSize.padded; - } - - /// Creates a copy of this button theme data object with the matching fields - /// replaced with the non-null parameter values. - ButtonThemeData copyWith({ - ButtonTextTheme textTheme, - ButtonBarLayoutBehavior layoutBehavior, - double minWidth, - double height, - EdgeInsetsGeometry padding, - ShapeBorder shape, - bool alignedDropdown, - Color buttonColor, - Color disabledColor, - Color focusColor, - Color hoverColor, - Color highlightColor, - Color splashColor, - ColorScheme colorScheme, - MaterialTapTargetSize materialTapTargetSize, - }) { - return ButtonThemeData( - textTheme: textTheme ?? this.textTheme, - layoutBehavior: layoutBehavior ?? this.layoutBehavior, - minWidth: minWidth ?? this.minWidth, - height: height ?? this.height, - padding: padding ?? this.padding, - shape: shape ?? this.shape, - alignedDropdown: alignedDropdown ?? this.alignedDropdown, - buttonColor: buttonColor ?? _buttonColor, - disabledColor: disabledColor ?? _disabledColor, - focusColor: focusColor ?? _focusColor, - hoverColor: hoverColor ?? _hoverColor, - highlightColor: highlightColor ?? _highlightColor, - splashColor: splashColor ?? _splashColor, - colorScheme: colorScheme ?? this.colorScheme, - materialTapTargetSize: materialTapTargetSize ?? _materialTapTargetSize, - ); - } - - @override - bool operator ==(dynamic other) { - if (other.runtimeType != runtimeType) - return false; - final ButtonThemeData typedOther = other; - return textTheme == typedOther.textTheme - && minWidth == typedOther.minWidth - && height == typedOther.height - && padding == typedOther.padding - && shape == typedOther.shape - && alignedDropdown == typedOther.alignedDropdown - && _buttonColor == typedOther._buttonColor - && _disabledColor == typedOther._disabledColor - && _focusColor == typedOther._focusColor - && _hoverColor == typedOther._hoverColor - && _highlightColor == typedOther._highlightColor - && _splashColor == typedOther._splashColor - && colorScheme == typedOther.colorScheme - && _materialTapTargetSize == typedOther._materialTapTargetSize; - } - - @override - int get hashCode { - return hashValues( - textTheme, - minWidth, - height, - padding, - shape, - alignedDropdown, - _buttonColor, - _disabledColor, - _focusColor, - _hoverColor, - _highlightColor, - _splashColor, - colorScheme, - _materialTapTargetSize, - ); - } - - @override - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - const ButtonThemeData defaultTheme = ButtonThemeData(); - properties.add(EnumProperty('textTheme', textTheme, defaultValue: defaultTheme.textTheme)); - properties.add(DoubleProperty('minWidth', minWidth, defaultValue: defaultTheme.minWidth)); - properties.add(DoubleProperty('height', height, defaultValue: defaultTheme.height)); - properties.add(DiagnosticsProperty('padding', padding, defaultValue: defaultTheme.padding)); - properties.add(DiagnosticsProperty('shape', shape, defaultValue: defaultTheme.shape)); - properties.add(FlagProperty('alignedDropdown', - value: alignedDropdown, - defaultValue: defaultTheme.alignedDropdown, - ifTrue: 'dropdown width matches button', - )); - properties.add(ColorProperty('buttonColor', _buttonColor, defaultValue: null)); - properties.add(ColorProperty('disabledColor', _disabledColor, defaultValue: null)); - properties.add(ColorProperty('focusColor', _focusColor, defaultValue: null)); - properties.add(ColorProperty('hoverColor', _hoverColor, defaultValue: null)); - properties.add(ColorProperty('highlightColor', _highlightColor, defaultValue: null)); - properties.add(ColorProperty('splashColor', _splashColor, defaultValue: null)); - properties.add(DiagnosticsProperty('colorScheme', colorScheme, defaultValue: defaultTheme.colorScheme)); - properties.add(DiagnosticsProperty('materialTapTargetSize', _materialTapTargetSize, defaultValue: null)); - } -} diff --git a/lib/components/button/gf_social_button.dart b/lib/components/button/gf_social_button.dart new file mode 100644 index 00000000..406247e7 --- /dev/null +++ b/lib/components/button/gf_social_button.dart @@ -0,0 +1,274 @@ +import 'dart:math' as math; +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; +import 'package:ui_kit/components/button/gf_button.dart'; +import 'package:ui_kit/shape/gf_button_shape.dart'; +import 'package:ui_kit/size/gf_size.dart'; +import 'package:ui_kit/types/gf_type.dart'; +import 'package:ui_kit/position/gf_position.dart'; +import 'package:ui_kit/colors/gf_color.dart'; + +class GFSocialButton extends GFButton{ + /// Called when the button is tapped or otherwise activated. + final VoidCallback onPressed; + + /// Called by the underlying [InkWell] widget's [InkWell.onHighlightChanged] callback. + final ValueChanged onHighlightChanged; + + /// Defines the default text style, with [Material.textStyle], for the button's [child]. + final TextStyle textStyle; + + /// The border side for the button's [Material]. + final BorderSide borderSide; + + /// The box shadow for the button's [Material]. + final BoxShadow boxShadow; + + /// Pass [GFColor] or [Color]. The color for the button's [Material] when it has the input focus. + final dynamic focusColor; + + /// Pass [GFColor] or [Color]. The color for the button's [Material] when a pointer is hovering over it. + final dynamic hoverColor; + + /// Pass [GFColor] or [Color]. The highlight color for the button's [InkWell]. + final dynamic highlightColor; + + /// Pass [GFColor] or [Color]. The splash color for the button's [InkWell]. + final dynamic splashColor; + + /// The elevation for the button's [Material] when the button is [enabled] but not pressed. + final double elevation; + + /// The elevation for the button's [Material] when the button is [enabled] and a pointer is hovering over it. + final double hoverElevation; + + /// The elevation for the button's [Material] when the button is [enabled] and has the input focus. + final double focusElevation; + + /// The elevation for the button's [Material] when the button is [enabled] and pressed. + final double highlightElevation; + + /// The elevation for the button's [Material] when the button is not [enabled]. + final double disabledElevation; + + /// The internal padding for the button's [child]. + final EdgeInsetsGeometry padding; + + /// Defines the button's size. + final BoxConstraints constraints; + + /// The shape of the button's [Material]. + final ShapeBorder borderShape; + + /// Defines the duration of animated changes for [shape] and [elevation]. + final Duration animationDuration; + + /// Typically the button's label. + final Widget child; + + /// Whether the button is enabled or disabled. + bool get enabled => onPressed != null; + + /// Configures the minimum size of the tap target. + final MaterialTapTargetSize materialTapTargetSize; + + /// {@macro flutter.widgets.Focus.focusNode} + final FocusNode focusNode; + + /// {@macro flutter.widgets.Focus.autofocus} + final bool autofocus; + + /// {@macro flutter.widgets.Clip} + final Clip clipBehavior; + + /// Button type of [GFType] i.e, solid, outline, outline2x, transparent + final GFType type; + + /// Button type of [GFSocialButtonShape] i.e, standard, pills, square, shadow, icons + final GFButtonShape shape; + + /// Pass [GFColor] or [Color] + final dynamic color; + + /// The fill color of the button when the button is disabled. + /// + /// The default value of this color is the theme's disabled color, + /// [ThemeData.disabledColor]. + /// + /// See also: + /// + /// * [color] - the fill color of the button when the button is [enabled]. + final dynamic disabledColor; + + /// Pass [GFColor] or [Color] + final dynamic textColor; + + /// The color to use for this button's text when the button is disabled. + /// + /// The button's [Material.textStyle] will be the current theme's button + /// text style, [ThemeData.textTheme.button], configured with this color. + /// + /// The default value is the theme's disabled color, + /// [ThemeData.disabledColor]. + /// + /// If [textColor] is a [MaterialStateProperty], [disabledTextColor] + /// will be ignored. + /// + /// See also: + /// + /// * [textColor] - The color to use for this button's text when the button is [enabled]. + final dynamic disabledTextColor; + + /// size of [double] or [GFSize] i.e, 1.2, small, medium, large etc. + final dynamic size; + + /// text of type [String] is alternative to child. text will get priority over child + final String text; + + /// icon of type [Widget] + final Widget icon; + + /// icon type of [GFIconPosition] i.e, start, end + final GFPosition position; + + /// on true state blockButton gives block size button + final bool blockButton; + + /// on true state full width Button gives full width button + final bool fullWidthButton; + + /// on true state default box shadow appears around button + final bool buttonBoxShadow; + + /// A set of thirteen colors that can be used to derive the button theme's + /// colors. + /// + /// This property was added much later than the theme's set of highly + /// specific colors, like [ThemeData.buttonColor], [ThemeData.highlightColor], + /// [ThemeData.splashColor] etc. + /// + /// The colors for new button classes can be defined exclusively in terms + /// of [colorScheme]. When it's possible, the existing buttons will + /// (continue to) gradually migrate to it. + final ColorScheme colorScheme; + + /// Whether detected gestures should provide acoustic and/or haptic feedback. + /// + /// For example, on Android a tap will produce a clicking sound and a + /// long-press will produce a short vibration, when feedback is enabled. + /// + /// See also: + /// + /// * [Feedback] for providing platform-specific feedback to certain actions. + final bool enableFeedback; + + /// Called when the button is long-pressed. + /// + /// If this callback and [onPressed] are null, then the button will be disabled. + /// + /// See also: + /// + /// * [enabled], which is true if the button is enabled. + final VoidCallback onLongPress; + + /// Create buttons of all types. check out [GFIconButton] for icon buttons, and [GFBadge] for badges + const GFSocialButton( + {Key key, + @required this.onPressed, + this.onHighlightChanged, + this.textStyle, + this.boxShadow, + this.buttonBoxShadow, + this.focusColor, + this.hoverColor, + this.highlightColor, + this.splashColor, + this.elevation = 0.0, + this.focusElevation = 4.0, + this.hoverElevation = 4.0, + this.highlightElevation = 1.0, + this.disabledElevation = 0.0, + this.padding = const EdgeInsets.symmetric(horizontal: 8.0), + this.constraints, + this.borderShape, + this.animationDuration = kThemeChangeDuration, + this.clipBehavior = Clip.none, + this.focusNode, + this.autofocus = false, + MaterialTapTargetSize materialTapTargetSize, + this.child, + this.type = GFType.solid, + this.shape = GFButtonShape.standard, + this.color = GFColor.primary, + this.textColor, + this.position = GFPosition.start, + this.size = GFSize.medium, + this.borderSide, + this.text, + this.icon, + this.blockButton, + this.fullWidthButton, + this.colorScheme, + this.enableFeedback, + this.onLongPress, + this.disabledColor, + this.disabledTextColor, + }) + : materialTapTargetSize = + materialTapTargetSize ?? MaterialTapTargetSize.padded, + assert(shape != null, 'Button shape can not be null'), +// assert(elevation != null && elevation >= 0.0), + assert(focusElevation != null && focusElevation >= 0.0), + assert(hoverElevation != null && hoverElevation >= 0.0), + assert(highlightElevation != null && highlightElevation >= 0.0), + assert(disabledElevation != null && disabledElevation >= 0.0), + assert(padding != null), + assert(animationDuration != null), + assert(clipBehavior != null), + assert(autofocus != null); + + @override + Widget build(BuildContext context) { + return GFButton( + onPressed: onPressed, + onHighlightChanged: onHighlightChanged, + textStyle: textStyle, + boxShadow: boxShadow, + buttonBoxShadow: buttonBoxShadow, + focusColor: focusColor, + hoverColor: hoverColor, + highlightColor: highlightColor, + splashColor: splashColor, + elevation: elevation, + focusElevation: focusElevation, + hoverElevation: hoverElevation, + highlightElevation:highlightElevation, + disabledElevation: disabledElevation, + constraints: constraints, + borderShape: borderShape, + animationDuration: animationDuration, + clipBehavior: clipBehavior, + focusNode: focusNode, + autofocus : autofocus , + child: child, + type :GFType.solid, + shape :GFButtonShape.standard, + color :GFColor.primary, + textColor: textColor, + position :GFPosition.start, + size :GFSize.medium, + borderSide: borderSide, + text: text, + icon: icon, + blockButton: blockButton, + fullWidthButton: fullWidthButton, + disabledColor: disabledTextColor, + disabledTextColor: disabledColor, + ); + } +} + + diff --git a/lib/components/slider/gf_slider.dart b/lib/components/carousel/gf_carousel.dart similarity index 95% rename from lib/components/slider/gf_slider.dart rename to lib/components/carousel/gf_carousel.dart index 52304775..31b28426 100644 --- a/lib/components/slider/gf_slider.dart +++ b/lib/components/carousel/gf_carousel.dart @@ -9,8 +9,8 @@ List map(List list, Function handler) { return result; } -class GFSlider extends StatefulWidget { - GFSlider( +class GFCarousel extends StatefulWidget { + GFCarousel( {@required this.items, this.pagerSize, this.passiveIndicator, @@ -53,7 +53,7 @@ class GFSlider extends StatefulWidget { /// The slider pagination's passive color. final Color passiveIndicator; - /// The [GFSlider] shows pagination on state true. + /// The [GFCarousel] shows pagination on state true. final bool pagination; /// The widgets to be shown as sliders. @@ -68,7 +68,7 @@ class GFSlider extends StatefulWidget { /// The fraction of the viewport that each page should occupy. Defaults to 0.8, which means each page fills 80% of the slide. final num viewportFraction; - /// The initial page to show when first creating the [GFSlider]. Defaults to 0. + /// The initial page to show when first creating the [GFCarousel]. Defaults to 0. final num initialPage; /// The actual index of the [PageView]. @@ -120,7 +120,7 @@ class GFSlider extends StatefulWidget { /// and can be used to control the [PageView] it is passed to. final PageController pageController; - /// Animates the controlled [GFSlider] to the next page. + /// Animates the controlled [GFCarousel] to the next page. /// /// The animation lasts for the given duration and follows the given curve. /// The returned [Future] resolves when the animation completes. @@ -128,7 +128,7 @@ class GFSlider extends StatefulWidget { return pageController.nextPage(duration: duration, curve: curve); } - /// Animates the controlled [GFSlider] to the previous page. + /// Animates the controlled [GFCarousel] to the previous page. /// /// The animation lasts for the given duration and follows the given curve. /// The returned [Future] resolves when the animation completes. @@ -136,7 +136,7 @@ class GFSlider extends StatefulWidget { return pageController.previousPage(duration: duration, curve: curve); } - /// Changes which page is displayed in the controlled [GFSlider]. + /// Changes which page is displayed in the controlled [GFCarousel]. /// /// Jumps the page position from its current value to the given value, /// without animation, and without checking if the new value is in range. @@ -147,7 +147,7 @@ class GFSlider extends StatefulWidget { .jumpToPage(pageController.page.toInt() + page - index); } - /// Animates the controlled [GFSlider] from the current page to the given page. + /// Animates the controlled [GFCarousel] from the current page to the given page. /// /// The animation lasts for the given duration and follows the given curve. /// The returned [Future] resolves when the animation completes. @@ -161,10 +161,10 @@ class GFSlider extends StatefulWidget { } @override - _GFSliderState createState() => _GFSliderState(); + _GFCarouselState createState() => _GFCarouselState(); } -class _GFSliderState extends State with TickerProviderStateMixin { +class _GFCarouselState extends State with TickerProviderStateMixin { Timer timer; /// Size of cell diff --git a/lib/components/slider/gf_items_slider.dart b/lib/components/carousel/gf_items_carousel.dart similarity index 90% rename from lib/components/slider/gf_items_slider.dart rename to lib/components/carousel/gf_items_carousel.dart index e54d32d1..8a55b837 100644 --- a/lib/components/slider/gf_items_slider.dart +++ b/lib/components/carousel/gf_items_carousel.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; /// /// The `details` object provides the position of the touch when it first /// touched the surface. -typedef GFItemsSliderSlideStartCallback = void Function( +typedef GFItemsCarouselSlideStartCallback = void Function( DragStartDetails details); /// Signature for when a pointer that is in contact with the screen and moving @@ -16,14 +16,14 @@ typedef GFItemsSliderSlideStartCallback = void Function( /// /// The `details` object provides the position of the touch and the distance it /// has travelled since the last update. -typedef GFItemsSliderSlideCallback = void Function(DragUpdateDetails details); +typedef GFItemsCarouselSlideCallback = void Function(DragUpdateDetails details); /// Signature for when a pointer that was previously in contact with the screen /// and moving is no longer in contact with the screen. /// /// The velocity at which the pointer was moving when it stopped contacting /// the screen is available in the `details`. -typedef GFItemsSliderSlideEndCallback = void Function(DragEndDetails details); +typedef GFItemsCarouselSlideEndCallback = void Function(DragEndDetails details); /// A widget that show draggable cells with animation. /// @@ -32,24 +32,24 @@ typedef GFItemsSliderSlideEndCallback = void Function(DragEndDetails details); /// Set drag handlers [onSlideStart], [onSlide], [onSlideEnd] /// /// Set left/right arrows [leftArrow], [rightArrow] -class GFItemsSlider extends StatefulWidget { +class GFItemsCarousel extends StatefulWidget { /// Count of visible cells final int rowCount; final List children; /// Signature for when a pointer has contacted the screen and has begun to move. - final GFItemsSliderSlideStartCallback onSlideStart; + final GFItemsCarouselSlideStartCallback onSlideStart; /// Signature for when a pointer that is in contact with the screen and moving /// has moved again. - final GFItemsSliderSlideCallback onSlide; + final GFItemsCarouselSlideCallback onSlide; /// Signature for when a pointer that was previously in contact with the screen /// and moving is no longer in contact with the screen. - final GFItemsSliderSlideEndCallback onSlideEnd; + final GFItemsCarouselSlideEndCallback onSlideEnd; - GFItemsSlider( + GFItemsCarousel( {this.rowCount, this.children, this.onSlideStart, @@ -57,10 +57,10 @@ class GFItemsSlider extends StatefulWidget { this.onSlideEnd}); @override - _GFItemsSliderState createState() => new _GFItemsSliderState(); + _GFItemsCarouselState createState() => new _GFItemsCarouselState(); } -class _GFItemsSliderState extends State +class _GFItemsCarouselState extends State with TickerProviderStateMixin { /// In milliseconds static final int dragAnimationDuration = 1000; diff --git a/lib/components/tabs/gf_segment_tabs.dart b/lib/components/tabs/gf_segment_tabs.dart index 06b98a34..5ac6badc 100644 --- a/lib/components/tabs/gf_segment_tabs.dart +++ b/lib/components/tabs/gf_segment_tabs.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; +import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; @@ -166,15 +167,15 @@ class _GFSegmentTabsState extends State { width: widget.width == null ? 240.0 : widget.width, decoration: BoxDecoration( border: widget.border == null ? Border.all(color: Colors.black26, width: 2.0) : widget.border, - borderRadius: widget.borderRadius == null ? BorderRadius.circular(8.0) : widget.borderRadius, + borderRadius: widget.borderRadius == null ? BorderRadius.circular(4.0) : widget.borderRadius, ), child: DefaultTabController( initialIndex: widget.initialIndex, length: widget.length, child: Material( - borderRadius: widget.borderRadius == null ? BorderRadius.circular(8.0) : widget.borderRadius, + borderRadius: widget.borderRadius == null ? BorderRadius.circular(2.0) : widget.borderRadius, type: MaterialType.button, - color: widget.tabBarColor ?? Colors.transparent, + color: widget.tabBarColor ?? getGFColor(GFColor.primary), child: TabBar( controller: widget.tabController, labelColor: widget.labelColor, @@ -185,9 +186,9 @@ class _GFSegmentTabsState extends State { indicatorSize: widget.indicatorSize, indicator: widget.indicator == null ? BoxDecoration( - color: widget.indicatorColor == null ? Colors.blueGrey : widget.indicatorColor, - border: Border.all(color: widget.indicatorColor == null ? Colors.blueGrey : widget.indicatorColor, width: 2.0), - borderRadius: widget.borderRadius == null ? BorderRadius.circular(6.0) : widget.borderRadius, + color: widget.indicatorColor == null ? Colors.black26 : widget.indicatorColor, + border: Border.all(color: widget.indicatorColor == null ? Colors.transparent : widget.indicatorColor, width: 2.0), + borderRadius: widget.borderRadius == null ? BorderRadius.circular(4.0) : widget.borderRadius, ) : widget.indicator, indicatorPadding: widget.indicatorPadding, indicatorWeight: widget.indicatorWeight, diff --git a/lib/components/tabs/gf_tabs.dart b/lib/components/tabs/gf_tabs.dart index b1e17584..5d3a7729 100644 --- a/lib/components/tabs/gf_tabs.dart +++ b/lib/components/tabs/gf_tabs.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; +import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; class GFTabs extends StatefulWidget { @@ -161,7 +162,7 @@ class _GFTabsState extends State { children: [ Material( type: MaterialType.button, - color: widget.tabBarColor ?? Theme.of(context).primaryColor, + color: widget.tabBarColor ?? getGFColor(GFColor.primary), child: TabBar( labelColor: widget.labelColor, unselectedLabelColor: widget.unselectedLabelColor, diff --git a/lib/components/header/gf_header.dart b/lib/components/typography/gf_typography.dart similarity index 86% rename from lib/components/header/gf_header.dart rename to lib/components/typography/gf_typography.dart index 7dddbdd6..389112db 100644 --- a/lib/components/header/gf_header.dart +++ b/lib/components/typography/gf_typography.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:ui_kit/colors/gf_color.dart'; -import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; -class GFHeader extends StatelessWidget { - const GFHeader( +class GFTypography extends StatelessWidget { + const GFTypography( {Key key, - this.type = GFHeadingType.typo4, + this.type = GFTypographyType.typo4, this.child, this.text, this.icon, @@ -49,32 +49,32 @@ class GFHeader extends StatelessWidget { ///pass [double] type to increase or decrease the width of the divider final double dividerWidth; - ///backgroundImage of type [ImageProvider] to set the background of [GFHeader] + ///backgroundImage of type [ImageProvider] to set the background of [GFTypography] final ImageProvider backgroundImage; - ///backgroundImagecolorFilter of type [ColorFilter] to set the background color of [GFHeader] only when backgroundImage is available + ///backgroundImagecolorFilter of type [ColorFilter] to set the background color of [GFTypography] only when backgroundImage is available final ColorFilter backgroundImagecolorFilter; - /// header type of [GFHeaderType] i.e, typo1, typo2, typo3, typo4, typo5, typo6 - final GFHeadingType type; + /// header type of [GFTypographyType] i.e, typo1, typo2, typo3, typo4, typo5, typo6 + final GFTypographyType type; @override Widget build(BuildContext context) { double fontSize; - if(type == GFHeadingType.typo1){ + if(type == GFTypographyType.typo1){ fontSize = 25.0; - }else if(type == GFHeadingType.typo2){ + }else if(type == GFTypographyType.typo2){ fontSize = 22.0; - }else if (type == GFHeadingType.typo3){ + }else if (type == GFTypographyType.typo3){ fontSize = 19.0; - }else if(type == GFHeadingType.typo4){ + }else if(type == GFTypographyType.typo4){ fontSize = 17.0; - }else if (type == GFHeadingType.typo5){ + }else if (type == GFTypographyType.typo5){ fontSize = 15.0; - }else if(type == GFHeadingType.typo6){ + }else if(type == GFTypographyType.typo6){ fontSize = 13.0; } diff --git a/lib/types/gf_heading_type.dart b/lib/types/gf_heading_type.dart deleted file mode 100644 index 23d7cdc6..00000000 --- a/lib/types/gf_heading_type.dart +++ /dev/null @@ -1 +0,0 @@ -enum GFHeadingType { typo1, typo2, typo3, typo4, typo5, typo6 } \ No newline at end of file diff --git a/lib/types/gf_typography_type.dart b/lib/types/gf_typography_type.dart new file mode 100644 index 00000000..ddcd579d --- /dev/null +++ b/lib/types/gf_typography_type.dart @@ -0,0 +1 @@ +enum GFTypographyType { typo1, typo2, typo3, typo4, typo5, typo6 } \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 210e5914..72d09fbf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,3 +16,4 @@ dev_dependencies: sdk: flutter flutter: + uses-material-design: true From e6b59bcb6da5be34e1fa2f6847f810646048eedf Mon Sep 17 00:00:00 2001 From: deepikahr Date: Fri, 10 Jan 2020 11:43:19 +0530 Subject: [PATCH 12/13] changes done in components --- demo_app/lib/screens/badges.dart | 28 +- demo_app/lib/screens/toasts.dart | 6 +- example/lib/main.dart | 1171 ++++++++++++-------- lib/components/badge/gf_button_badge.dart | 43 +- lib/components/badge/gf_icon_badge.dart | 5 +- lib/components/button/gf_icon_button.dart | 43 +- lib/components/card/gf_card.dart | 4 +- lib/components/carousel/gf_carousel.dart | 3 - lib/components/image/gf_image_overlay.dart | 2 +- lib/components/list_tile/gf_list_tile.dart | 112 +- lib/components/tabs/gf_segment_tabs.dart | 20 +- lib/components/tabs/gf_tabBar.dart | 196 ++++ lib/components/tabs/gf_tabs.dart | 38 +- lib/shape/gf_icon_button_shape.dart | 1 + 14 files changed, 1088 insertions(+), 584 deletions(-) create mode 100644 lib/components/tabs/gf_tabBar.dart create mode 100644 lib/shape/gf_icon_button_shape.dart diff --git a/demo_app/lib/screens/badges.dart b/demo_app/lib/screens/badges.dart index dfdc20c4..5beb7ca3 100644 --- a/demo_app/lib/screens/badges.dart +++ b/demo_app/lib/screens/badges.dart @@ -10,6 +10,7 @@ import 'package:ui_kit/components/button/gf_icon_button.dart'; import 'package:ui_kit/position/gf_position.dart'; import 'package:ui_kit/shape/gf_badge_shape.dart'; import 'package:ui_kit/shape/gf_button_shape.dart'; +import 'package:ui_kit/shape/gf_icon_button_shape.dart'; import 'package:ui_kit/size/gf_size.dart'; import 'package:ui_kit/types/gf_typography_type.dart'; import 'package:ui_kit/types/gf_type.dart'; @@ -562,9 +563,8 @@ class _BadgesState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFIconBadge( - onPressed: null, child: GFIconButton( - shape: GFButtonShape.pills, + shape: GFIconButtonShape.pills, color: GFColor.success, type: GFType.solid, onPressed: null, @@ -576,9 +576,8 @@ class _BadgesState extends State { size: GFSize.small, )), GFIconBadge( - onPressed: null, child: GFIconButton( - shape: GFButtonShape.square, + shape: GFIconButtonShape.square, color: GFColor.primary, type: GFType.solid, onPressed: null, @@ -590,9 +589,8 @@ class _BadgesState extends State { size: GFSize.small, )), GFIconBadge( - onPressed: null, child: GFIconButton( - shape: GFButtonShape.pills, + shape: GFIconButtonShape.pills, color: GFColor.danger, type: GFType.solid, onPressed: null, @@ -604,9 +602,8 @@ class _BadgesState extends State { size: GFSize.small, )), GFIconBadge( - onPressed: null, child: GFIconButton( - shape: GFButtonShape.standard, + shape: GFIconButtonShape.standard, type: GFType.solid, color: GFColor.warning, onPressed: null, @@ -636,9 +633,8 @@ class _BadgesState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFIconBadge( - onPressed: null, child: GFIconButton( - shape: GFButtonShape.pills, + shape: GFIconButtonShape.pills, onPressed: null, icon: Icon(Icons.mail), ), @@ -648,9 +644,8 @@ class _BadgesState extends State { size: GFSize.small, )), GFIconBadge( - onPressed: null, child: GFIconButton( - shape: GFButtonShape.square, + shape: GFIconButtonShape.square, onPressed: null, icon: Icon(Icons.mail), ), @@ -661,9 +656,8 @@ class _BadgesState extends State { size: GFSize.small, )), GFIconBadge( - onPressed: null, child: GFIconButton( - shape: GFButtonShape.pills, + shape: GFIconButtonShape.pills, onPressed: null, icon: Icon(Icons.mail), ), @@ -673,9 +667,8 @@ class _BadgesState extends State { size: GFSize.small, )), GFIconBadge( - onPressed: null, child: GFIconButton( - shape: GFButtonShape.standard, + shape: GFIconButtonShape.standard, onPressed: null, icon: Icon(Icons.mail), ), @@ -704,7 +697,6 @@ class _BadgesState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFIconBadge( - onPressed: null, child: GFIconButton( size: GFSize.large, onPressed: null, @@ -716,7 +708,6 @@ class _BadgesState extends State { size: GFSize.small, )), GFIconBadge( - onPressed: null, child: GFIconButton( size: GFSize.medium, onPressed: null, @@ -728,7 +719,6 @@ class _BadgesState extends State { size: GFSize.small, )), GFIconBadge( - onPressed: null, child: GFIconButton( size: GFSize.small, onPressed: null, diff --git a/demo_app/lib/screens/toasts.dart b/demo_app/lib/screens/toasts.dart index fd6f6a5d..8b02503a 100644 --- a/demo_app/lib/screens/toasts.dart +++ b/demo_app/lib/screens/toasts.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/button/gf_button.dart'; import 'package:ui_kit/components/card/gf_card.dart'; -import 'package:ui_kit/components/header/gf_typography.dart'; +import 'package:ui_kit/components/typography/gf_typography.dart'; import 'package:ui_kit/components/toast/gf_toast.dart'; import 'package:ui_kit/types/gf_typography_type.dart'; import 'package:ui_kit/types/gf_type.dart'; @@ -29,9 +29,9 @@ class _ToastsState extends State { GFCard( content: Column( children: [ - GFHeader( + GFTypography( text: 'Toast', - type: GFHeadingType.typo6, + type: GFTypographyType.typo6, ), SizedBox( height: 10, diff --git a/example/lib/main.dart b/example/lib/main.dart index 7df22efa..97bc01a7 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -4,6 +4,7 @@ import 'package:ui_kit/components/button/gf_button.dart'; import 'package:ui_kit/components/badge/gf_button_badge.dart'; import 'package:ui_kit/components/avatar/gf_avatar.dart'; import 'package:ui_kit/components/badge/gf_badge.dart'; +import 'package:ui_kit/components/list/gf_list.dart'; import 'package:ui_kit/components/tabs/gf_segment_tabs.dart'; import 'package:ui_kit/size/gf_size.dart'; import 'package:ui_kit/types/gf_type.dart'; @@ -27,6 +28,10 @@ import 'package:ui_kit/components/list_tile/gf_list_tile.dart'; import 'package:ui_kit/position/gf_position.dart'; import 'package:ui_kit/components/button/gf_button_bar.dart'; import 'package:ui_kit/components/badge/gf_icon_badge.dart'; +import 'package:ui_kit/shape/gf_icon_button_shape.dart'; +import 'package:ui_kit/components/tabs/gf_tabBar.dart'; +import 'package:ui_kit/components/typography/gf_typography.dart'; +import 'package:ui_kit/types/gf_typography_type.dart'; final List imageList = [ "https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg", @@ -175,8 +180,11 @@ class _MyHomePageState extends State ), // backgroundColor: Colors.teal, body: -// GFTabBarView(controller: tabController, children: [ -// Container(color: Colors.red), +// GFTabBarView( +// height: 200.0, +// controller: tabController, +// children: [ +// Container(color: Colors.red,), // Container(color: Colors.green), // Container(color: Colors.blue) // ]), @@ -185,29 +193,218 @@ class _MyHomePageState extends State mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - - GFButton( - text: "whatsapp", - icon: Icon(Icons.directions_bike), + + GFCard( + content: Column( + children: [ + GFTypography( + text: 'GF Header Typo1', + type: GFTypographyType.typo1, + showDivider: false, + ), + GFTypography( + text: 'GF Header Typo2', + type: GFTypographyType.typo2, + showDivider: false, + ), + GFTypography( + text: 'GF Header Typo3', + type: GFTypographyType.typo3, + showDivider: false, + ), + GFTypography( + text: 'GF Header Typo4', + type: GFTypographyType.typo4, + showDivider: false, + ), + GFTypography( + text: 'GF Header Typo5', + type: GFTypographyType.typo5, + showDivider: false, + ), + GFTypography( + text: 'GF Header Typo6', + type: GFTypographyType.typo6, + showDivider: false, + ), + ], + ), ), - GFButton( - text: "linkedin", - icon: Icon(Icons.directions_bike), + GFCard( + content: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFTypography( + text: 'GF Header Typo1', + type: GFTypographyType.typo1, + backgroundImage: NetworkImage( + 'https://cdn.pixabay.com/photo/2019/12/25/16/49/happy-new-year-4718894_960_720.png'), + ), + SizedBox( + height: 40, + ), + GFTypography( + icon: GFAvatar(), + text: 'GF Header Typo2', + type: GFTypographyType.typo2, + dividerColor: GFColor.primary, + dividerAlignment: Alignment.center, + ), + SizedBox( + height: 40, + ), + GFTypography( + icon: Icon(Icons.insert_emoticon), + text: 'GF Header Typo3', + type: GFTypographyType.typo3, + dividerWidth: 150, + dividerColor: GFColor.warning, + dividerBorderRadius: BorderRadius.all(Radius.circular(0)), + ), + SizedBox( + height: 40, + ), + GFTypography( + text: 'GF Header Typo4', + type: GFTypographyType.typo4, + dividerWidth: 345, + icon: Image.network( + 'https://cdn.pixabay.com/photo/2016/12/15/03/27/cocoa-1908020_960_720.jpg', + width: 50, + )), + SizedBox( + height: 40, + ), + GFTypography( + text: 'GF Header Typo5', + type: GFTypographyType.typo5, + dividerColor: GFColor.alt, + ), + SizedBox( + height: 40, + ), + GFTypography( + text: 'GF Header Typo6', + type: GFTypographyType.typo6, + dividerWidth: 20, + ), + ], + )), + + + +// GFButton( +// onPressed: (){}, +// text: "whatsapp", +// icon: Icon(Icons.directions_bike), +// ), +// +// GFButton( +// text: "linkedin", +// icon: Icon(Icons.directions_bike), +// ), + + GFListTile( +// padding: EdgeInsets.all(8.0), +// color: Colors.redAccent, +// avatar: GFAvatar( +// child: Text("tb"), +// ), + title: Text('title'), +// subTitle: Text('subtitle'), + icon: Text("99"), +// dividerColor: Colors.blue, +// dividerEndIndent: 20.0, +// dividerHeight: 2.0, +// dividerIndent: 30.0, +// dividerThickness: 5.0, +// showDivider: false, + ), + + + GFListTile( + avatar: GFAvatar( + shape: GFAvatarShape.standard, + ), + title: GFTypography( + text: 'List tile', + type: GFTypographyType.typo5, + showDivider: false, + ), + subTitle: Text('Lorem ipsum', style: TextStyle(color: getGFColor(GFColor.dark)),), + + description: Text('Dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ' + 'sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ', + style: TextStyle(fontSize: 13, color: getGFColor(GFColor.secondary))), + showDivider: true, + icon: GFIconButton( + onPressed: null, + type: GFType.transparent, + icon: Icon(Icons.favorite_border), + ), + ), + + + + GFCard( + content: GFListTile( + avatar: GFAvatar( + shape: GFAvatarShape.standard, + ), + title: GFTypography( + text: 'List tile', + type: GFTypographyType.typo5, + showDivider: false, + ), + subTitle: Text('Lorem ipsum', style: TextStyle(color: getGFColor(GFColor.dark)),), + + description: Text('Dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ', + style: TextStyle(fontSize: 13, color: getGFColor(GFColor.secondary))), + showDivider: false, + ), + ), + + GFCard( + content: GFImageOverlay( + height: 200.0, + width: MediaQuery.of(context).size.width, + child: Text("Dcs"), +// color: color ?? cardTheme.color ?? Theme.of(context).cardColor, + image: AssetImage("lib/assets/food.jpeg"), + boxFit: BoxFit.fill, + colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.67), BlendMode.darken), +// border: border, +// borderRadius: borderRadius ?? BorderRadius.all(Radius.circular(4.0)), + ), + ), + + + GFCard( + content: Container( + width: 190.0, + height: 190.0, + decoration: new BoxDecoration( + shape: BoxShape.circle, + image: new DecorationImage( + fit: BoxFit.fill, + image: AssetImage("lib/assets/food.jpeg",), + ) + )), ), GFButtonBadge( onPressed: (){}, -// position: GFIconPosition.start, +// position: GFPosition.end, // borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), // borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), -// text: 'goodiesdxs', -// color: GFColor.danger, + text: 'goodiesdxs', +// color: GFColor.success, // shape: GFButtonShape.pills, // type: GFType.outline2x, // size: GFSize.small, - child: Text("der"), icon: GFBadge( child: Text("12"), // color: GFColor.dark, @@ -219,96 +416,96 @@ class _MyHomePageState extends State ), ), - GFSocialButton( - text: 'goodies', - onPressed: (){}, -// icon: GFBadge( -// child: Text("12"), -// color: GFColor.dark, -//// shape: GFBadgeShape.circle, -//// size: GFSize.small, -//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// textColor: GFColor.white, -//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -// ), - type: GFType.outline2x, - shape: GFButtonShape.pills, -// blockButton: true, - fullWidthButton: true, - - ), - - GFButton( -// icon: GFBadge( -// child: Text("12"), -// color: GFColor.dark, -//// shape: GFBadgeShape.circle, -//// size: GFSize.small, -//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -//// textColor: GFColor.white, -//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), -// ), - text: 'goodies', - onPressed: (){}, -// textColor: GFColor.danger, -// icon: Icon(Icons.access_alarms), -// hoverColor: GFColor.dark, - color: GFColor.secondary, -// focusColor: GFColor.danger, - type: GFType.solid, - shape: GFButtonShape.pills, - buttonBoxShadow: true, -// boxShadow: BoxShadow( -// color: Colors.pink, -// blurRadius: 2.0, -// spreadRadius: 1.0, -// offset: Offset.zero, -// ), -// splashColor: GFColor.warning, -// highlightColor: GFColor.alt, -// size: GFSize.large, -// disabledColor: GFColor.dark, -// disabledTextColor: GFColor.light, - blockButton: true, -// fullWidthButton: true, -// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - ), - - GFIconButton( - onPressed: null, - icon: Icon(Icons.ac_unit,), -// iconSize: 12.0, - type: GFType.solid, -// shape: GFButtonShape.pills, -// size: GFSize.large, - buttonBoxShadow: true, - color: GFColor.secondary, -// boxShadow: BoxShadow( -// color: Colors.pink, -// blurRadius: 2.0, -// spreadRadius: 1.0, -// offset: Offset.zero, -// ), -// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - ), - - RaisedButton( - child: Text('goodiesMaterialButton button '), - onPressed: (){}, -// color: Colors.blueGrey, -// hoverColor: Colors.blueGrey, -// focusColor: Colors.teal, -// splashColor: Colors.amber, -// highlightColor: Colors.cyan, - ), - - GFAvatar( - radius: 80.0, - backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), - ), - +// GFSocialButton( +// text: 'social goodies', +// onPressed: (){}, +//// icon: GFBadge( +//// child: Text("12"), +//// color: GFColor.dark, +////// shape: GFBadgeShape.circle, +////// size: GFSize.small, +////// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +////// textColor: GFColor.white, +////// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +//// ), +// type: GFType.outline2x, +// shape: GFButtonShape.pills, +//// blockButton: true, +// fullWidthButton: true, +// +// ), +// +// GFButton( +//// icon: GFBadge( +//// child: Text("12"), +//// color: GFColor.dark, +////// shape: GFBadgeShape.circle, +////// size: GFSize.small, +////// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +////// textColor: GFColor.white, +////// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +//// ), +// text: 'goodies', +// onPressed: (){}, +//// textColor: GFColor.danger, +//// icon: Icon(Icons.access_alarms), +//// hoverColor: GFColor.dark, +// color: GFColor.secondary, +//// focusColor: GFColor.danger, +// type: GFType.solid, +// shape: GFButtonShape.pills, +// buttonBoxShadow: true, +//// boxShadow: BoxShadow( +//// color: Colors.pink, +//// blurRadius: 2.0, +//// spreadRadius: 1.0, +//// offset: Offset.zero, +//// ), +//// splashColor: GFColor.warning, +//// highlightColor: GFColor.alt, +//// size: GFSize.large, +//// disabledColor: GFColor.dark, +//// disabledTextColor: GFColor.light, +// blockButton: true, +//// fullWidthButton: true, +//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +// ), +// +// GFIconButton( +// onPressed: null, +// icon: Icon(Icons.ac_unit,), +//// iconSize: 12.0, +// type: GFType.solid, +//// shape: GFButtonShape.pills, +//// size: GFSize.large, +// buttonBoxShadow: true, +// color: GFColor.secondary, +//// boxShadow: BoxShadow( +//// color: Colors.pink, +//// blurRadius: 2.0, +//// spreadRadius: 1.0, +//// offset: Offset.zero, +//// ), +//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +// ), +// +// RaisedButton( +// child: Text('goodiesMaterialButton button '), +// onPressed: (){}, +//// color: Colors.blueGrey, +//// hoverColor: Colors.blueGrey, +//// focusColor: Colors.teal, +//// splashColor: Colors.amber, +//// highlightColor: Colors.cyan, +// ), +// +// GFAvatar( +// radius: 80.0, +// backgroundImage: NetworkImage("https://cdn.pixabay.com/photo/2017/12/03/18/04/christmas-balls-2995437_960_720.jpg"), +// ), +// GFSegmentTabs( tabController: tabController, // height: 38.0, @@ -343,319 +540,341 @@ class _MyHomePageState extends State // border: Border.all(color: Colors.orange, width: 2.0), // borderRadius: BorderRadius.circular(50.0) ), - - GFTabBarView( - controller: tabController, - height: 400.0, - children: [ - Container(color: Colors.red), - Container(color: Colors.green), - Container(color: Colors.blue) - ] - ), - - GFItemsCarousel( - rowCount: 3, - children: imageList.map( - (url) { - return Container( - margin: EdgeInsets.all(5.0), - child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(5.0)), - child: Image.network( - url, - fit: BoxFit.cover, - width: 1000.0 - ), - ), - ); - }, - ).toList(), - ), - - GFCarousel( - rowCount: 3, - pagerSize: 12.0, - activeIndicator: Colors.pink, - passiveIndicator: Colors.pink.withOpacity(0.4), - viewportFraction: 1.0, - aspectRatio: 2.0, - autoPlay: true, - enlargeMainPage: true, - pagination: true, - items: imageList.map( - (url) { - return Container( - margin: EdgeInsets.all(5.0), - child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(5.0)), - child: Image.network( - url, - fit: BoxFit.cover, - width: 1000.0 - ), - ), - ); - }, - ).toList(), - onPageChanged: (index) { - setState(() { - index; - }); - }, - ), - - - GFTabs( - initialIndex: 0, - length: 3, - tabs: [ - GFButton( - onPressed: null, - child: Text("share"), - icon: Icon(Icons.share), - buttonBoxShadow: true, - ), - Tab( - icon: Icon(Icons.error), - child: Text( - "Orders", - ), - ), - Tab( - child: Text( - "Pastry", - ), - ), - ], - tabBarView: GFTabBarView( - children: [ - Container( - color: Colors.red, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - - GFToast( - child: Text("sdc"), - backgroundColor: Colors.pink, - button: GFButton( - text: 'dsx', - onPressed: (){ - print("fdsc"); - }, - ), - ), - RawMaterialButton( - onPressed: null, - child: Text("fv"), - ), - FlatButton(onPressed: null, child: Text("cds")), - Icon(Icons.directions_railway), - GFButton( - onPressed: null, - child: Text("share"), - icon: Icon(Icons.share), - shape: GFButtonShape.pills, - type: GFType.transparent, - ), - ], - ), - ), - Icon(Icons.directions_car), - Icon(Icons.directions_transit), - ], - ), -// indicatorColor: Colors.teal, -// indicatorSize: TabBarIndicatorSize.label, -// labelColor: Colors.lightGreen, -// unselectedLabelColor: Colors.black, -// labelStyle: TextStyle( -// fontWeight: FontWeight.w500, -// fontSize: 13.0, -// color: Colors.deepOrange, -// fontFamily: 'OpenSansBold', +// +// GFTabBarView( +// controller: tabController, +// height: 400.0, +// children: [ +// Container(color: Colors.red), +// Container(color: Colors.green), +// Container(color: Colors.blue) +// ] // ), -// unselectedLabelStyle: TextStyle( -// fontWeight: FontWeight.w500, -// fontSize: 13.0, -// color: Colors.black, -// fontFamily: 'OpenSansBold', +// +// GFItemsCarousel( +// rowCount: 3, +// children: imageList.map( +// (url) { +// return Container( +// margin: EdgeInsets.all(5.0), +// child: ClipRRect( +// borderRadius: BorderRadius.all(Radius.circular(5.0)), +// child: Image.network( +// url, +// fit: BoxFit.cover, +// width: 1000.0 +// ), +// ), +// ); +// }, +// ).toList(), // ), - ), - - GFCarousel( - autoPlay: true, - viewportFraction: 1.0, - aspectRatio: MediaQuery.of(context).size.aspectRatio, - items: imageList.map( - (url) { - return Container( - margin: EdgeInsets.all(5.0), - child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(5.0)), - child: Image.network( - url, - fit: BoxFit.cover, - width: 1000.0, - ), - ), - ); - }, - ).toList(), - onPageChanged: (index) { - setState(() { - index; - }); - }, - ), - GFCard( - boxFit: BoxFit.cover, - colorFilter: new ColorFilter.mode( - Colors.black.withOpacity(0.67), BlendMode.darken), - image: Image.asset("lib/assets/food.jpeg"), +// +// GFCarousel( +//// pagerSize: 12.0, +//// activeIndicator: Colors.pink, +//// passiveIndicator: Colors.pink.withOpacity(0.4), +//// viewportFraction: 1.0, +//// aspectRatio: 2.0, +//// autoPlay: true, +//// enlargeMainPage: true, +//// pagination: true, +// items: imageList.map( +// (url) { +// return Container( +// margin: EdgeInsets.all(5.0), +// child: ClipRRect( +// borderRadius: BorderRadius.all(Radius.circular(5.0)), +// child: Image.network( +// url, +// fit: BoxFit.cover, +// width: 1000.0 +// ), +// ), +// ); +// }, +// ).toList(), +// onPageChanged: (index) { +// setState(() { +// index; +// }); +// }, +// ), +// +// +// GFTabs( +//// height: 100.0, +//// tabBarHeight: 52.0, +// initialIndex: 0, +// length: 3, +// tabs: [ +// GFButton( +// onPressed: null, +// child: Text("share"), +// icon: Icon(Icons.share), +// buttonBoxShadow: true, +// ), +// Tab( +// icon: Icon(Icons.error), +// child: Text( +// "Orders", +// ), +// ), +// Tab( +// child: Text( +// "Pastry", +// ), +// ), +// ], +// tabBarView: GFTabBarView( +// children: [ +// Container( +// color: Colors.red, +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// +// GFToast( +// child: Text("sdc"), +// backgroundColor: Colors.pink, +// button: GFButton( +// text: 'dsx', +// onPressed: (){ +// print("fdsc"); +// }, +// ), +// ), +// RawMaterialButton( +// onPressed: null, +// child: Text("fv"), +// ), +// FlatButton(onPressed: null, child: Text("cds")), +// Icon(Icons.directions_railway), +// GFButton( +// onPressed: null, +// child: Text("share"), +// icon: Icon(Icons.share), +// shape: GFButtonShape.pills, +// type: GFType.transparent, +// ), +// ], +// ), +// ), +// Icon(Icons.directions_car), +// Icon(Icons.directions_transit), +// ], +// ), +//// indicatorColor: Colors.teal, +//// indicatorSize: TabBarIndicatorSize.label, +//// labelColor: Colors.lightGreen, +//// unselectedLabelColor: Colors.black, +//// labelStyle: TextStyle( +//// fontWeight: FontWeight.w500, +//// fontSize: 13.0, +//// color: Colors.deepOrange, +//// fontFamily: 'OpenSansBold', +//// ), +//// unselectedLabelStyle: TextStyle( +//// fontWeight: FontWeight.w500, +//// fontSize: 13.0, +//// color: Colors.black, +//// fontFamily: 'OpenSansBold', +//// ), +// ), +// +// GFCarousel( +// autoPlay: true, +// viewportFraction: 1.0, +// aspectRatio: MediaQuery.of(context).size.aspectRatio, +// items: imageList.map( +// (url) { +// return Container( +// margin: EdgeInsets.all(5.0), +// child: ClipRRect( +// borderRadius: BorderRadius.all(Radius.circular(5.0)), +// child: Image.network( +// url, +// fit: BoxFit.cover, +// width: 1000.0, +// ), +// ), +// ); +// }, +// ).toList(), +// onPageChanged: (index) { +// setState(() { +// index; +// }); +// }, +// ), +// GFCard( +// boxFit: BoxFit.fill, +// colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.67), BlendMode.darken), +//// image: Image.asset("lib/assets/food.jpeg",), // imageOverlay: AssetImage("lib/assets/food.jpeg"), - titlePosition: GFPosition.end, - title: GFListTile( - avatar: GFAvatar( - child: Text("tb"), - ), - title: Text( - 'title', - style: TextStyle(color: Colors.grey), - ), - subTitle: Text( - 'subtitle', - style: TextStyle(color: Colors.grey), - ), - icon: GFIconButton( - onPressed: null, - icon: Icon(Icons.favorite_border), - type: GFType.transparent, - ), - ), - content: Text( - "Flutter " - "Flutter is Google's mobile UI framework for crafting" - " high-quality native interfaces on iOS and Android in " - "Flutter ", - style: TextStyle(color: Colors.grey), - ), - buttonBar: GFButtonBar( - mainAxisSize: MainAxisSize.min, - children: [ - GFButton( - onPressed: null, - child: Text("favorite"), - icon: Icon(Icons.favorite_border), - type: GFType.transparent, - ), - GFButton( - onPressed: null, - child: Text("share"), - icon: Icon(Icons.share), - type: GFType.outline, - ), - ], - ), - ), - GFButtonBar( - mainAxisSize: MainAxisSize.min, - children: [ - GFButton( - onPressed: null, - child: Text("like"), - icon: Icon(Icons.favorite_border), - type: GFType.transparent, - ), - GFButton( - onPressed: null, - child: Text("comment"), - ), - GFButton( - color: Colors.teal, - onPressed: (){}, - child: Text("share"), - icon: Icon(Icons.share), - type: GFType.outline, - ), - ], - ), - - - GFListTile( - avatar: GFAvatar( - child: Text("tb"), - ), - title: Text('title'), - subTitle: Text('subtitle'), - icon: GFIconButton( - onPressed: null, - type: GFType.transparent, - icon: Icon(Icons.favorite_border), - ), - ), - GFImageOverlay( - width: MediaQuery.of(context).size.width, - margin: EdgeInsets.all(16.0), - padding: EdgeInsets.all(16.0), - child: Column( - children: [ - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - new Text( - 'Hello world', - style: TextStyle(color: Colors.white), - ), - ], - ), -// color: Colors.orange, - image: AssetImage("lib/assets/food.jpeg"), - boxFit: BoxFit.cover, - colorFilter: new ColorFilter.mode( - Colors.black.withOpacity(0.6), BlendMode.darken), - borderRadius: new BorderRadius.circular(5.0), -// border: Border.all(color: Colors.pink, width: 2.0), - ), +// titlePosition: GFPosition.end, +// title: GFListTile( +// avatar: GFAvatar( +// child: Text("tb"), +// ), +// title: Text( +// 'title', +// style: TextStyle(color: Colors.grey), +// ), +// subTitle: Text( +// 'subtitle', +// style: TextStyle(color: Colors.grey), +// ), +// icon: GFIconButton( +// onPressed: null, +// icon: Icon(Icons.favorite_border), +// type: GFType.transparent, +// ), +// ), +// content: Text( +// "Flutter Flutter is Google's mobile UI framework for crafting" +// "Flutter Flutter is Google's mobile UI framework for crafting", +// style: TextStyle(color: Colors.grey), +// ), +// buttonBar: GFButtonBar( +// mainAxisSize: MainAxisSize.min, +// children: [ +// GFButton( +// onPressed: null, +// child: Text("favorite"), +// icon: Icon(Icons.favorite_border), +// type: GFType.transparent, +// ), +// GFButton( +// onPressed: null, +// child: Text("share"), +// icon: Icon(Icons.share), +// type: GFType.outline, +// ), +// ], +// ), +// ), +// GFButtonBar( +// mainAxisSize: MainAxisSize.min, +// children: [ +// GFButton( +// onPressed: null, +// child: Text("like"), +// icon: Icon(Icons.favorite_border), +// type: GFType.transparent, +// ), +// GFButton( +// onPressed: null, +// child: Text("comment"), +// ), +// GFButton( +// color: Colors.teal, +// onPressed: (){}, +// child: Text("share"), +// icon: Icon(Icons.share), +// type: GFType.outline, +// ), +// ], +// ), +// +// +// GFListTile( +// avatar: GFAvatar( +// child: Text("tb"), +// ), +// title: Text('title'), +// subTitle: Text('subtitle'), +// icon: GFIconButton( +// onPressed: null, +// type: GFType.transparent, +// icon: Icon(Icons.favorite_border), +// ), +// ), +// GFImageOverlay( +// width: MediaQuery.of(context).size.width, +// margin: EdgeInsets.all(16.0), +// padding: EdgeInsets.all(16.0), +// child: Column( +// children: [ +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// new Text( +// 'Hello world', +// style: TextStyle(color: Colors.white), +// ), +// ], +// ), +//// color: Colors.orange, +// image: AssetImage("lib/assets/food.jpeg"), +// boxFit: BoxFit.cover, +// colorFilter: new ColorFilter.mode( +// Colors.black.withOpacity(0.6), BlendMode.darken), +// borderRadius: new BorderRadius.circular(5.0), +//// border: Border.all(color: Colors.pink, width: 2.0), +// ), GFAvatar( // radius: 20.0, // maxRadius: 50, @@ -668,23 +887,28 @@ class _MyHomePageState extends State // // foregroundColor: Colors.deepOrangeAccent, // - shape: GFAvatarShape.standard, +// shape: GFAvatarShape.circle, // // size: GFSize.medium, // // borderRadius: BorderRadius.circular(20.0), ), GFIconBadge( - onPressed: null, - child: GFIconButton( - onPressed: null, - icon: Icon(Icons.ac_unit), + child: +// GFIconButton( +// onPressed: null, +// icon: Icon(Icons.ac_unit), +// size: GFSize.large, +// ), + GFAvatar( + child: Text("sefv"), + size: GFSize.small, ), counterChild: GFBadge( text: '12', -// color: GFColor.dark -////, +// color: GFColor.dark, +// // shape: GFBadgeShape.circle, // // size: GFSize.small, @@ -702,49 +926,11 @@ class _MyHomePageState extends State onPressed: null, icon: Icon(Icons.ac_unit), // iconSize: 12.0, - type: GFType.solid, - shape: GFButtonShape.pills, - size: GFSize.large, -// buttonBoxShadow: true, -// color: GFColor.primary, -// boxShadow: BoxShadow( -// color: Colors.pink, -// blurRadius: 2.0, -// spreadRadius: 1.0, -// offset: Offset.zero, -// ), -// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), - ), - - GFBadge( - text: '12', -// color: GFColor.dark, - shape: GFBadgeShape.circle, -// size: GFSize.small, -// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), -// textColor: GFColor.white, -// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), - ), - - GFButton( - type: GFType.solid, - shape: GFButtonShape.pills, - text: 'goodies', - onPressed: () { - print('dddddddddd'); - }, - hoverColor: Colors.orange, - focusColor: Colors.teal, -// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +// type: GFType.solid, +// shape: GFIconButtonShape.pills, // size: GFSize.large, // buttonBoxShadow: true, -// blockButton: true, -// fullWidthButton: true, -// color: GFColor.primary, -// textColor: GFColor.secondary, -// icon: Icon(Icons.error, color: Colors.white,), -// position: GFIconPosition.start, +// color: GFColor.warning, // boxShadow: BoxShadow( // color: Colors.pink, // blurRadius: 2.0, @@ -754,9 +940,72 @@ class _MyHomePageState extends State // borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), // borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), ), +// +// GFBadge( +// text: '12', +//// color: GFColor.dark, +// shape: GFBadgeShape.circle, +//// size: GFSize.small, +//// border: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +//// textColor: GFColor.white, +//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +// ), +// +// GFButton( +// type: GFType.solid, +// shape: GFButtonShape.pills, +// text: 'goodies', +// onPressed: () { +// print('dddddddddd'); +// }, +// hoverColor: Colors.orange, +// focusColor: Colors.teal, +//// textStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 8.0), +//// size: GFSize.large, +//// buttonBoxShadow: true, +//// blockButton: true, +//// fullWidthButton: true, +//// color: GFColor.primary, +//// textColor: GFColor.secondary, +//// icon: Icon(Icons.error, color: Colors.white,), +//// position: GFIconPosition.start, +//// boxShadow: BoxShadow( +//// color: Colors.pink, +//// blurRadius: 2.0, +//// spreadRadius: 1.0, +//// offset: Offset.zero, +//// ), +//// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +//// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), +// ), ], ), ), + bottomNavigationBar: + GFTabBar( + initialIndex: 0, + length: 3, + controller: tabController, + tabs: [ + GFButton( + onPressed: null, + child: Text("share"), + icon: Icon(Icons.share), + buttonBoxShadow: true, + ), + Tab( + icon: Icon(Icons.error), + child: Text( + "Orders", + ), + ), + Tab( + child: Text( + "Pastry", + ), + ), + ], + ), ); } } diff --git a/lib/components/badge/gf_button_badge.dart b/lib/components/badge/gf_button_badge.dart index 9346f863..39c6a0c6 100644 --- a/lib/components/badge/gf_button_badge.dart +++ b/lib/components/badge/gf_button_badge.dart @@ -1,6 +1,4 @@ -import 'dart:math' as math; import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart'; @@ -11,7 +9,8 @@ import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/position/gf_position.dart'; import 'package:ui_kit/colors/gf_color.dart'; -class GFButtonBadge extends GFButton{ +class GFButtonBadge extends GFButton { + /// Called when the button is tapped or otherwise activated. final VoidCallback onPressed; @@ -66,9 +65,6 @@ class GFButtonBadge extends GFButton{ /// Defines the duration of animated changes for [shape] and [elevation]. final Duration animationDuration; - /// Typically the button's label. - final Widget child; - /// Whether the button is enabled or disabled. bool get enabled => onPressed != null; @@ -128,9 +124,6 @@ class GFButtonBadge extends GFButton{ /// text of type [String] is alternative to child. text will get priority over child final String text; - /// icon of type [Widget] - final Widget icon; - /// icon type of [GFIconPosition] i.e, start, end final GFPosition position; @@ -174,7 +167,10 @@ class GFButtonBadge extends GFButton{ /// * [enabled], which is true if the button is enabled. final VoidCallback onLongPress; - /// Create buttons of all types. check out [GFIconButton] for icon buttons, and [GFBadge] for badges + /// Can be used to display [GFCounter], [Icons] inside button design + final Widget icon; + + /// Create buttons badges of all types. check out [GFIconButton] for icon buttons, and [GFBadge] for badges const GFButtonBadge( {Key key, @required this.onPressed, @@ -199,7 +195,6 @@ class GFButtonBadge extends GFButton{ this.focusNode, this.autofocus = false, MaterialTapTargetSize materialTapTargetSize, - this.child, this.type = GFType.solid, this.shape = GFButtonShape.standard, this.color = GFColor.primary, @@ -208,7 +203,6 @@ class GFButtonBadge extends GFButton{ this.size = GFSize.medium, this.borderSide, this.text, - this.icon, this.blockButton, this.fullWidthButton, this.colorScheme, @@ -216,6 +210,7 @@ class GFButtonBadge extends GFButton{ this.onLongPress, this.disabledColor, this.disabledTextColor, + this.icon, }) : materialTapTargetSize = materialTapTargetSize ?? MaterialTapTargetSize.padded, @@ -230,13 +225,14 @@ class GFButtonBadge extends GFButton{ assert(clipBehavior != null), assert(autofocus != null); + @override Widget build(BuildContext context) { return ConstrainedBox( constraints: BoxConstraints(minHeight: 26.0, minWidth: 98.0), child: Container( - height: this.size, + height: getGFSize(size), child: GFButton( onPressed: onPressed, onHighlightChanged: onHighlightChanged, @@ -258,13 +254,13 @@ class GFButtonBadge extends GFButton{ clipBehavior: clipBehavior, focusNode: focusNode, autofocus : autofocus , - child: child, - type :GFType.solid, - shape :GFButtonShape.standard, - color :GFColor.primary, +// child: child, + type : type, + shape : shape, + color : color, textColor: textColor, - position :GFPosition.start, - size :GFSize.medium, + position : position, + size : getGFSize(size), borderSide: borderSide, text: text, icon: icon, @@ -275,14 +271,13 @@ class GFButtonBadge extends GFButton{ ), ), ); - } } -// + //class GFButtonBadge extends StatefulWidget { // /// Called when the badge is tapped or otherwise activated. // final VoidCallback onPressed; @@ -319,7 +314,7 @@ class GFButtonBadge extends GFButton{ // // /// child of type [Widget] is alternative to child. text will get priority over child. // /// You can use [GFBadge] for compatibility. -// final Widget icon; +// final Widget counter; // // /// icon type of [GFPosition] i.e, start, end // final GFPosition position; @@ -339,7 +334,7 @@ class GFButtonBadge extends GFButton{ // this.size = GFSize.medium, // this.borderSide, // @required this.text, -// @required this.icon, +// @required this.counter, // }) : assert(shape != null, 'Badge shape can not be null'), // assert(padding != null), // super(key: key); @@ -389,7 +384,7 @@ class GFButtonBadge extends GFButton{ // position: this.position, // size: this.size, // borderShape: widget.borderShape, -// icon: widget.icon, +// icon: widget.counter, // ), // ), // ); diff --git a/lib/components/badge/gf_icon_badge.dart b/lib/components/badge/gf_icon_badge.dart index 88f9a269..f0329c2f 100644 --- a/lib/components/badge/gf_icon_badge.dart +++ b/lib/components/badge/gf_icon_badge.dart @@ -2,12 +2,10 @@ import 'package:flutter/material.dart'; import 'package:ui_kit/components/button/gf_icon_button.dart'; class GFIconBadge extends StatefulWidget { - /// Called when the badge is tapped or otherwise activated. - final VoidCallback onPressed; /// child of type [GFIconButton] is used to show icon. /// Use [Icon] widget for compatibility. - final GFIconButton child; + final Widget child; /// widget of type [Widget] is used to show counter to the top right corner of child. /// You can use [GFBadge] for compatibility. @@ -19,7 +17,6 @@ class GFIconBadge extends StatefulWidget { /// Create badges of all types, check out [GFBadge] for button badges and [GFIconBadge] for icon badges. const GFIconBadge({ Key key, - @required this.onPressed, this.padding = const EdgeInsets.symmetric(horizontal: 8.0), @required this.child, @required this.counterChild, diff --git a/lib/components/button/gf_icon_button.dart b/lib/components/button/gf_icon_button.dart index 289e75c0..33473552 100644 --- a/lib/components/button/gf_icon_button.dart +++ b/lib/components/button/gf_icon_button.dart @@ -2,7 +2,7 @@ import 'dart:math' as math; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart'; -import 'package:ui_kit/shape/gf_button_shape.dart'; +import 'package:ui_kit/shape/gf_icon_button_shape.dart'; import 'package:ui_kit/size/gf_size.dart'; import 'package:ui_kit/types/gf_type.dart'; import 'package:ui_kit/colors/gf_color.dart'; @@ -29,8 +29,8 @@ class GFIconButton extends StatefulWidget { /// Button type of [GFType] i.e, solid, outline, outline2x transparent final GFType type; - /// Button type of [GFButtonShape] i.e, standard, pills, square, shadow, icons - final GFButtonShape shape; + /// Button type of [GFIconButtonShape] i.e, standard, pills, square, shadow, icons + final GFIconButtonShape shape; /// Pass [GFColor] or [Color] final dynamic color; @@ -88,7 +88,7 @@ class GFIconButton extends StatefulWidget { this.autofocus = false, this.tooltip, this.type = GFType.solid, - this.shape = GFButtonShape.standard, + this.shape = GFIconButtonShape.standard, this.color = GFColor.primary, this.borderShape, this.boxShadow, @@ -111,7 +111,7 @@ class _GFIconButtonState extends State { Color color; Function onPressed; GFType type; - GFButtonShape shape; + GFIconButtonShape shape; BoxShadow boxShadow; double height; double width; @@ -178,15 +178,14 @@ class _GFIconButtonState extends State { ShapeBorder shape; - if (this.shape == GFButtonShape.pills) { - shape = RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20.0), side: shapeBorder); - } else if (this.shape == GFButtonShape.square) { - shape = RoundedRectangleBorder( - borderRadius: BorderRadius.circular(0.0), side: shapeBorder); - } else if (this.shape == GFButtonShape.standard) { - shape = RoundedRectangleBorder( - borderRadius: BorderRadius.circular(3.0), side: shapeBorder); + if (this.shape == GFIconButtonShape.pills) { + shape = RoundedRectangleBorder(borderRadius: BorderRadius.circular(20.0), side: shapeBorder); + } else if (this.shape == GFIconButtonShape.square) { + shape = RoundedRectangleBorder(borderRadius: BorderRadius.circular(0.0), side: shapeBorder); + } else if (this.shape == GFIconButtonShape.standard) { + shape = RoundedRectangleBorder(borderRadius: BorderRadius.circular(3.0), side: shapeBorder); + } else if (this.shape == GFIconButtonShape.circle) { + shape = RoundedRectangleBorder(borderRadius: BorderRadius.circular(50.0), side: shapeBorder); } if (widget.size == GFSize.small) { @@ -216,8 +215,8 @@ class _GFIconButtonState extends State { } Widget result = Container( - height: this.height, - width: widget.shape == GFButtonShape.pills ? this.width + 10 : this.width, + height: widget.shape == GFIconButtonShape.circle ? this.height + 6 : this.height, + width: widget.shape == GFIconButtonShape.pills ? this.width + 10 : widget.shape == GFIconButtonShape.circle ? this.height + 6 : this.width, padding: widget.padding, child: IconTheme.merge( data: IconThemeData( @@ -242,10 +241,8 @@ class _GFIconButtonState extends State { } else { return BoxDecoration( color: widget.onPressed != null ? getColor() : getDisabledFillColor(), - borderRadius: widget.shape == GFButtonShape.pills - ? BorderRadius.circular(50.0) - : widget.shape == GFButtonShape.standard - ? BorderRadius.circular(5.0) + borderRadius: widget.shape == GFIconButtonShape.circle ? BorderRadius.circular(50.0) + : widget.shape == GFIconButtonShape.standard ? BorderRadius.circular(3.0) : widget.shape == GFIconButtonShape.pills ? BorderRadius.circular(20.0) : BorderRadius.zero, boxShadow: [ widget.boxShadow == null && widget.buttonBoxShadow == true @@ -278,10 +275,8 @@ class _GFIconButtonState extends State { child: ConstrainedBox( constraints: BoxConstraints(maxWidth: 60.0, maxHeight: 60.0), child: Container( - height: this.height, - width: widget.shape == GFButtonShape.pills - ? this.width + 10 - : this.width, + height: widget.shape == GFIconButtonShape.circle ? this.height + 6 : this.height, + width: widget.shape == GFIconButtonShape.pills ? this.width + 10 : widget.shape == GFIconButtonShape.circle ? this.height + 6 : this.width, decoration: getBoxShadow(), child: Material( shape: widget.type == GFType.transparent diff --git a/lib/components/card/gf_card.dart b/lib/components/card/gf_card.dart index 320c9013..c5de141c 100644 --- a/lib/components/card/gf_card.dart +++ b/lib/components/card/gf_card.dart @@ -15,7 +15,7 @@ class GFCard extends StatelessWidget { this.elevation, this.shape, this.borderOnForeground = true, - this.padding = const EdgeInsets.all(12.0), + this.padding = const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), this.margin, this.clipBehavior, this.semanticContainer, @@ -54,7 +54,7 @@ class GFCard extends StatelessWidget { /// The empty space that surrounds the card. Defines the card's outer [Container.margin]. final EdgeInsetsGeometry margin; - /// The empty space that surrounds the card. Defines the card's outer [Container.margin].. + /// The empty space that surrounds the card. Defines the card's outer [Container.padding].. final EdgeInsetsGeometry padding; /// Whether this widget represents a single semantic container, or if false diff --git a/lib/components/carousel/gf_carousel.dart b/lib/components/carousel/gf_carousel.dart index 31b28426..3186c24e 100644 --- a/lib/components/carousel/gf_carousel.dart +++ b/lib/components/carousel/gf_carousel.dart @@ -31,7 +31,6 @@ class GFCarousel extends StatefulWidget { this.enlargeMainPage = false, this.onPageChanged, this.scrollPhysics, - this.rowCount, this.scrollDirection: Axis.horizontal}) : this.realPage = enableInfiniteScroll ? realPage + initialPage : initialPage, @@ -41,8 +40,6 @@ class GFCarousel extends StatefulWidget { enableInfiniteScroll ? realPage + initialPage : initialPage, ); - /// Count of visible cells - final int rowCount; /// The pagination dots size can be defined using [double]. final double pagerSize; diff --git a/lib/components/image/gf_image_overlay.dart b/lib/components/image/gf_image_overlay.dart index 9733d742..d41b24af 100644 --- a/lib/components/image/gf_image_overlay.dart +++ b/lib/components/image/gf_image_overlay.dart @@ -62,7 +62,7 @@ class GFImageOverlay extends StatelessWidget { Widget build(BuildContext context) { return Container( alignment: alignment, - height: height ?? MediaQuery.of(context).size.height * 0.3, + height: height, width: width ?? MediaQuery.of(context).size.width, margin: margin, padding: padding, diff --git a/lib/components/list_tile/gf_list_tile.dart b/lib/components/list_tile/gf_list_tile.dart index 4f3df6f4..729a7beb 100644 --- a/lib/components/list_tile/gf_list_tile.dart +++ b/lib/components/list_tile/gf_list_tile.dart @@ -18,12 +18,63 @@ class GFListTile extends StatelessWidget { /// The descriprion to display inside the [GFListTile]. see [Text] final Widget description; + /// The descriprion to display inside the [GFListTile]. see [Text] + final Widget trailing; + /// The icon to display inside the [GFListTile]. see [Icon] final Widget icon; ///type of [bool] corresponds to true or false to show or hide the divider final bool showDivider; + /// The empty space that surrounds the card. Defines the card's outer [Container.margin].. + final EdgeInsetsGeometry padding; + + /// The divider's height extent. + /// + /// The divider itself is always drawn as a horizontal line that is centered + /// within the height specified by this value. + /// + /// If this is null, then the [DividerThemeData.space] is used. If that is + /// also null, then this defaults to 16.0. + final double dividerHeight; + + /// The thickness of the line drawn within the divider. + /// + /// A divider with a [thickness] of 0.0 is always drawn as a line with a + /// height of exactly one device pixel. + /// + /// If this is null, then the [DividerThemeData.dividerThickness] is used. If + /// that is also null, then this defaults to 0.0. + final double dividerThickness; + + /// The amount of empty space to the leading edge of the divider. + /// + /// If this is null, then the [DividerThemeData.indent] is used. If that is + /// also null, then this defaults to 0.0. + final double dividerIndent; + + /// The amount of empty space to the trailing edge of the divider. + /// + /// If this is null, then the [DividerThemeData.endIndent] is used. If that is + /// also null, then this defaults to 0.0. + final double dividerEndIndent; + + /// The color to use when painting the line. + /// + /// If this is null, then the [DividerThemeData.color] is used. If that is + /// also null, then [ThemeData.dividerColor] is used. + /// + /// {@tool sample} + /// + /// ```dart + /// Divider( + /// color: Colors.deepOrange, + /// ) + /// ``` + /// {@end-tool} + final Color dividerColor; + const GFListTile( {Key key, this.color, @@ -32,33 +83,58 @@ class GFListTile extends StatelessWidget { this.subTitle , this.description , this.icon, - this.showDivider = true + this.showDivider = true, + this.padding, + this.trailing, + this.dividerEndIndent, + this.dividerHeight, + this.dividerIndent, + this.dividerThickness, + this.dividerColor }) : super(key: key); @override Widget build(BuildContext context) { + + final double height = this.dividerHeight ?? 16.0; + final double thickness = this.dividerThickness ?? 0.0; + final double indent = this.dividerIndent ?? 0.0; + final double endIndent = this.dividerEndIndent ?? 0.0; + return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ListTile( - leading: avatar, - title: title, - subtitle: subTitle != null || description != null ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - subTitle ?? Container(), - description ?? Container() - ], - ): null, - trailing: icon != null ? Column( - children: [ - Padding(padding: EdgeInsets.only(top: description != null ? 0.0 : 8.0), child: - icon ) - ], - ): null + Container( + margin: padding, + color: color, + child: ListTile( + leading: avatar, + title: title, + subtitle: subTitle != null || description != null ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + subTitle ?? Container(), + description ?? Container() + ], + ): null, + trailing: icon != null ? Column( + children: [ + Padding(padding: EdgeInsets.only(top: 16.0), child: + icon ) + ], + ): null + ), ), - showDivider ? Divider() : Container() + + showDivider ? + Divider( + height: height ?? dividerHeight, + thickness: thickness ?? dividerThickness, + color: dividerColor ?? Theme.of(context).dividerColor, + indent: indent ?? dividerIndent, + endIndent: endIndent ?? dividerEndIndent, + ) : Container() ], ); } diff --git a/lib/components/tabs/gf_segment_tabs.dart b/lib/components/tabs/gf_segment_tabs.dart index 5ac6badc..93039dd3 100644 --- a/lib/components/tabs/gf_segment_tabs.dart +++ b/lib/components/tabs/gf_segment_tabs.dart @@ -166,8 +166,8 @@ class _GFSegmentTabsState extends State { height: widget.height == null ? 28.0 : widget.height, width: widget.width == null ? 240.0 : widget.width, decoration: BoxDecoration( - border: widget.border == null ? Border.all(color: Colors.black26, width: 2.0) : widget.border, - borderRadius: widget.borderRadius == null ? BorderRadius.circular(4.0) : widget.borderRadius, + border: widget.border == null ? Border.all(color: getGFColor(GFColor.primary), width:1.0) : widget.border, + borderRadius: widget.borderRadius == null ? BorderRadius.circular(2.0) : widget.borderRadius, ), child: DefaultTabController( initialIndex: widget.initialIndex, @@ -175,20 +175,20 @@ class _GFSegmentTabsState extends State { child: Material( borderRadius: widget.borderRadius == null ? BorderRadius.circular(2.0) : widget.borderRadius, type: MaterialType.button, - color: widget.tabBarColor ?? getGFColor(GFColor.primary), + color: widget.tabBarColor ?? Colors.transparent, child: TabBar( controller: widget.tabController, - labelColor: widget.labelColor, - unselectedLabelColor: widget.unselectedLabelColor, - labelStyle: widget.labelStyle, - unselectedLabelStyle: widget.unselectedLabelStyle, - indicatorColor: widget.indicatorColor == null ? Colors.blueGrey : widget.indicatorColor, + labelColor: widget.labelColor ?? getGFColor(GFColor.white), + unselectedLabelColor: widget.unselectedLabelColor ?? getGFColor(GFColor.primary), + labelStyle: widget.labelStyle ?? TextStyle(fontSize: 12.0), + unselectedLabelStyle: widget.unselectedLabelStyle ?? TextStyle(fontSize: 12.0), + indicatorColor: widget.indicatorColor == null ? getGFColor(GFColor.primary) : widget.indicatorColor, indicatorSize: widget.indicatorSize, indicator: widget.indicator == null ? BoxDecoration( - color: widget.indicatorColor == null ? Colors.black26 : widget.indicatorColor, + color: widget.indicatorColor == null ? getGFColor(GFColor.primary) : widget.indicatorColor, border: Border.all(color: widget.indicatorColor == null ? Colors.transparent : widget.indicatorColor, width: 2.0), - borderRadius: widget.borderRadius == null ? BorderRadius.circular(4.0) : widget.borderRadius, + borderRadius: widget.borderRadius == null ? BorderRadius.circular(0.0) : widget.borderRadius, ) : widget.indicator, indicatorPadding: widget.indicatorPadding, indicatorWeight: widget.indicatorWeight, diff --git a/lib/components/tabs/gf_tabBar.dart b/lib/components/tabs/gf_tabBar.dart new file mode 100644 index 00000000..80bb68f3 --- /dev/null +++ b/lib/components/tabs/gf_tabBar.dart @@ -0,0 +1,196 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'package:ui_kit/colors/gf_color.dart'; +import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; + +class GFTabBar extends StatefulWidget { + GFTabBar({ + Key key, + this.initialIndex = 0, + @required this.length, + this.tabBarHeight, + this.tabBarColor, + this.indicatorColor, + this.indicatorWeight = 2.0, + this.indicatorPadding = EdgeInsets.zero, + this.indicator, + this.indicatorSize, + this.labelColor, + this.labelStyle, + this.labelPadding, + this.unselectedLabelColor, + this.unselectedLabelStyle, + this.tabBarView, + this.tabs, + this.controller, + }): + assert(length != null && length >= 0), + assert(initialIndex != null && initialIndex >= 0 && (length == 0 || initialIndex < length)); + + /// The initial index of the selected tab. Defaults to zero. + final int initialIndex; + + /// The total number of tabs. Typically greater than one. Must match [TabBar.tabs]'s and + /// [TabBarView.children]'s length. + final int length; + + /// Sets [GFTabBar] height + final double tabBarHeight; + + /// Sets [TabBar] color using material color [Color] + final Color tabBarColor; + + /// The color of the line that appears below the selected tab. + /// + /// If this parameter is null, then the value of the Theme's indicatorColor + /// property is used. + /// + /// If [indicator] is specified, this property is ignored. + final Color indicatorColor; + + /// The thickness of the line that appears below the selected tab. + /// + /// The value of this parameter must be greater than zero and its default + /// value is 2.0. + /// + /// If [indicator] is specified, this property is ignored. + final double indicatorWeight; + + /// The horizontal padding for the line that appears below the selected tab. + /// + /// For [isScrollable] tab bars, specifying [kTabLabelPadding] will align + /// the indicator with the tab's text for [Tab] widgets and all but the + /// shortest [Tab.text] values. + /// + /// The [EdgeInsets.top] and [EdgeInsets.bottom] values of the + /// [indicatorPadding] are ignored. + /// + /// The default value of [indicatorPadding] is [EdgeInsets.zero]. + /// + /// If [indicator] is specified, this property is ignored. + final EdgeInsetsGeometry indicatorPadding; + + /// Defines the appearance of the selected tab indicator. + /// + /// If [indicator] is specified, the [indicatorColor], [indicatorWeight], + /// and [indicatorPadding] properties are ignored. + /// + /// The default, underline-style, selected tab indicator can be defined with + /// [UnderlineTabIndicator]. + /// + /// The indicator's size is based on the tab's bounds. If [indicatorSize] + /// is [TabBarIndicatorSize.tab] the tab's bounds are as wide as the space + /// occupied by the tab in the tab bar. If [indicatorSize] is + /// [TabBarIndicatorSize.label], then the tab's bounds are only as wide as + /// the tab widget itself. + final Decoration indicator; + + /// Defines how the selected tab indicator's size is computed. + /// + /// The size of the selected tab indicator is defined relative to the + /// tab's overall bounds if [indicatorSize] is [TabBarIndicatorSize.tab] + /// (the default) or relative to the bounds of the tab's widget if + /// [indicatorSize] is [TabBarIndicatorSize.label]. + /// + /// The selected tab's location appearance can be refined further with + /// the [indicatorColor], [indicatorWeight], [indicatorPadding], and + /// [indicator] properties. + final TabBarIndicatorSize indicatorSize; + + /// The color of selected tab labels. + /// + /// Unselected tab labels are rendered with the same color rendered at 70% + /// opacity unless [unselectedLabelColor] is non-null. + /// + /// If this parameter is null, then the color of the [ThemeData.primaryTextTheme]'s + /// body2 text color is used. + final Color labelColor; + + /// The color of unselected tab labels. + /// + /// If this property is null, unselected tab labels are rendered with the + /// [labelColor] with 70% opacity. + final Color unselectedLabelColor; + + /// The text style of the selected tab labels. + /// + /// If [unselectedLabelStyle] is null, then this text style will be used for + /// both selected and unselected label styles. + /// + /// If this property is null, then the text style of the + /// [ThemeData.primaryTextTheme]'s body2 definition is used. + final TextStyle labelStyle; + + /// The padding added to each of the tab labels. + /// + /// If this property is null, then kTabLabelPadding is used. + final EdgeInsetsGeometry labelPadding; + + /// The text style of the unselected tab labels + /// + /// If this property is null, then the [labelStyle] value is used. If [labelStyle] + /// is null, then the text style of the [ThemeData.primaryTextTheme]'s + /// body2 definition is used. + final TextStyle unselectedLabelStyle; + + /// One widget per tab. + /// Its length must match the length of the [GFTabBar.tabs] + /// list, as well as the [controller]'s [GFTabBar.length]. + final GFTabBarView tabBarView; + + /// Typically a list of two or more [Tab] widgets. + /// + /// The length of this list must match the [controller]'s [TabController.length] + /// and the length of the [TabBarView.children] list. + final List tabs; + + final TabController controller; + + @override + _GFTabBarState createState() => _GFTabBarState(); +} + +class _GFTabBarState extends State { + @override + Widget build(BuildContext context) { + return Container( + height: widget.tabBarHeight == null ? MediaQuery.of(context).size.height * 0.1 : widget.tabBarHeight, + child: Material( + type: MaterialType.button, + color: widget.tabBarColor ?? getGFColor(GFColor.primary), + child: TabBar( + controller: widget.controller, + labelColor: widget.labelColor, + unselectedLabelColor: widget.unselectedLabelColor, + labelStyle: widget.labelStyle, + unselectedLabelStyle: widget.unselectedLabelStyle, + indicatorColor: widget.indicatorColor, + indicatorSize: widget.indicatorSize, + indicator: widget.indicator, + indicatorPadding: widget.indicatorPadding, + indicatorWeight: widget.indicatorWeight, + tabs: widget.tabs, + ), + ), + ); + } +} + + + + + + + + + + + + + + + + + diff --git a/lib/components/tabs/gf_tabs.dart b/lib/components/tabs/gf_tabs.dart index 5d3a7729..d588e6b7 100644 --- a/lib/components/tabs/gf_tabs.dart +++ b/lib/components/tabs/gf_tabs.dart @@ -4,6 +4,7 @@ import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'package:ui_kit/colors/gf_color.dart'; import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; +import 'package:ui_kit/components/tabs/gf_tabBar.dart'; class GFTabs extends StatefulWidget { GFTabs({ @@ -24,6 +25,8 @@ class GFTabs extends StatefulWidget { this.unselectedLabelStyle, this.tabBarView, this.tabs, + this.controller, + this.tabBarHeight, }): assert(length != null && length >= 0), assert(initialIndex != null && initialIndex >= 0 && (length == 0 || initialIndex < length)); @@ -145,6 +148,10 @@ class GFTabs extends StatefulWidget { /// and the length of the [TabBarView.children] list. final List tabs; + final TabController controller; + + final double tabBarHeight; + @override _GFTabsState createState() => _GFTabsState(); } @@ -160,21 +167,22 @@ class _GFTabsState extends State { height: widget.height == null ? MediaQuery.of(context).size.height * 0.5 : widget.height, child: Column( children: [ - Material( - type: MaterialType.button, - color: widget.tabBarColor ?? getGFColor(GFColor.primary), - child: TabBar( - labelColor: widget.labelColor, - unselectedLabelColor: widget.unselectedLabelColor, - labelStyle: widget.labelStyle, - unselectedLabelStyle: widget.unselectedLabelStyle, - indicatorColor: widget.indicatorColor, - indicatorSize: widget.indicatorSize, - indicator: widget.indicator, - indicatorPadding: widget.indicatorPadding, - indicatorWeight: widget.indicatorWeight, - tabs: widget.tabs, - ), + GFTabBar( + length: widget.length, + initialIndex: widget.initialIndex, + tabBarHeight: widget.tabBarHeight, + tabBarColor: widget.tabBarColor ?? getGFColor(GFColor.primary), + controller: widget.controller, + labelColor: widget.labelColor, + unselectedLabelColor: widget.unselectedLabelColor, + labelStyle: widget.labelStyle, + unselectedLabelStyle: widget.unselectedLabelStyle, + indicatorColor: widget.indicatorColor, + indicatorSize: widget.indicatorSize, + indicator: widget.indicator, + indicatorPadding: widget.indicatorPadding, + indicatorWeight: widget.indicatorWeight, + tabs: widget.tabs, ), Expanded( child: widget.tabBarView diff --git a/lib/shape/gf_icon_button_shape.dart b/lib/shape/gf_icon_button_shape.dart new file mode 100644 index 00000000..c6633dbc --- /dev/null +++ b/lib/shape/gf_icon_button_shape.dart @@ -0,0 +1 @@ +enum GFIconButtonShape { standard, pills, square, circle } \ No newline at end of file From bfa7dfae4c0a66775065eda800a8e95f1611a481 Mon Sep 17 00:00:00 2001 From: "Shravya.ckm" Date: Fri, 10 Jan 2020 12:02:56 +0530 Subject: [PATCH 13/13] getFlutter web version is in progress --- demo_app/lib/assets/icons/images.png | Bin 0 -> 840 bytes demo_app/lib/screens/badges.dart | 770 -------- demo_app/lib/screens/badges/badges.dart | 291 +++ demo_app/lib/screens/button/icon-buttons.dart | 477 ++++- demo_app/lib/screens/button/pill-buttons.dart | 44 +- .../lib/screens/button/shadow-buttons.dart | 1734 ++++++++++------- .../lib/screens/button/social-buttons.dart | 160 +- .../lib/screens/button/square-buttons.dart | 42 +- .../lib/screens/button/standard-buttons.dart | 39 +- demo_app/lib/screens/home.dart | 50 +- demo_app/pubspec.yaml | 1 + example/lib/main.dart | 13 +- gf_web/.gitignore | 37 + gf_web/.metadata | 10 + gf_web/README.md | 16 + gf_web/android/.gitignore | 7 + gf_web/android/app/build.gradle | 67 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 30 + .../kotlin/com/example/gf_web/MainActivity.kt | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 8 + .../app/src/profile/AndroidManifest.xml | 7 + gf_web/android/build.gradle | 31 + gf_web/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + gf_web/android/settings.gradle | 15 + gf_web/ios/.gitignore | 32 + gf_web/ios/Flutter/AppFrameworkInfo.plist | 26 + gf_web/ios/Flutter/Debug.xcconfig | 1 + gf_web/ios/Flutter/Release.xcconfig | 1 + gf_web/ios/Runner.xcodeproj/project.pbxproj | 518 +++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 + .../contents.xcworkspacedata | 7 + gf_web/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + gf_web/ios/Runner/Base.lproj/Main.storyboard | 26 + gf_web/ios/Runner/Info.plist | 45 + gf_web/ios/Runner/Runner-Bridging-Header.h | 1 + gf_web/lib/assets/icons/avatar.png | Bin 0 -> 793 bytes gf_web/lib/assets/icons/back.png | Bin 0 -> 690 bytes gf_web/lib/assets/icons/badge.png | Bin 0 -> 687 bytes gf_web/lib/assets/icons/buttons.png | Bin 0 -> 909 bytes gf_web/lib/assets/icons/buttons.svg | 1 + gf_web/lib/assets/icons/card.png | Bin 0 -> 424 bytes gf_web/lib/assets/icons/chips.png | Bin 0 -> 1194 bytes gf_web/lib/assets/icons/danger.svg | 12 + gf_web/lib/assets/icons/dark.svg | 11 + gf_web/lib/assets/icons/dribble.svg | 6 + gf_web/lib/assets/icons/fb.svg | 6 + gf_web/lib/assets/icons/google.svg | 6 + gf_web/lib/assets/icons/images.png | Bin 0 -> 840 bytes gf_web/lib/assets/icons/info.svg | 12 + gf_web/lib/assets/icons/items.png | Bin 0 -> 967 bytes gf_web/lib/assets/icons/light.svg | 11 + gf_web/lib/assets/icons/link.svg | 17 + gf_web/lib/assets/icons/linkedin.svg | 6 + gf_web/lib/assets/icons/lists.png | Bin 0 -> 638 bytes gf_web/lib/assets/icons/menu.png | Bin 0 -> 373 bytes gf_web/lib/assets/icons/next.png | Bin 0 -> 708 bytes gf_web/lib/assets/icons/pinterest.svg | 6 + gf_web/lib/assets/icons/primary.svg | 19 + gf_web/lib/assets/icons/secondary.svg | 17 + gf_web/lib/assets/icons/slack.svg | 6 + gf_web/lib/assets/icons/slider.png | Bin 0 -> 289 bytes gf_web/lib/assets/icons/success.svg | 11 + gf_web/lib/assets/icons/tabs.png | Bin 0 -> 581 bytes gf_web/lib/assets/icons/toast.png | Bin 0 -> 643 bytes gf_web/lib/assets/icons/toggle.png | Bin 0 -> 998 bytes gf_web/lib/assets/icons/twitter.svg | 6 + gf_web/lib/assets/icons/typo.png | Bin 0 -> 719 bytes gf_web/lib/assets/icons/warning.svg | 10 + gf_web/lib/assets/icons/whatsapp.svg | 6 + gf_web/lib/assets/icons/youtube.svg | 6 + gf_web/lib/assets/logo.png | Bin 0 -> 2841 bytes gf_web/lib/assets/screen.png | Bin 0 -> 127182 bytes gf_web/lib/main.dart | 110 ++ .../lib/screens/buttons/standard-buttons.dart | 442 +++++ gf_web/lib/screens/layout/body.dart | 23 + gf_web/lib/screens/layout/header.dart | 45 + gf_web/lib/screens/layout/layout.dart | 53 + gf_web/lib/screens/layout/mobile-demo.dart | 16 + gf_web/lib/screens/layout/routes.dart | 15 + gf_web/lib/screens/layout/sidebar.dart | 236 +++ gf_web/lib/screens/pages/home.dart | 33 + gf_web/lib/styles/styles.dart | 42 + gf_web/pubspec.lock | 202 ++ gf_web/pubspec.yaml | 26 + gf_web/test/widget_test.dart | 30 + gf_web/web/index.html | 10 + lib/components/button/gf_button.dart | 2 +- lib/components/button/gf_icon_button.dart | 88 +- 119 files changed, 4692 insertions(+), 1701 deletions(-) create mode 100644 demo_app/lib/assets/icons/images.png delete mode 100644 demo_app/lib/screens/badges.dart create mode 100644 demo_app/lib/screens/badges/badges.dart create mode 100644 gf_web/.gitignore create mode 100644 gf_web/.metadata create mode 100644 gf_web/README.md create mode 100644 gf_web/android/.gitignore create mode 100644 gf_web/android/app/build.gradle create mode 100644 gf_web/android/app/src/debug/AndroidManifest.xml create mode 100644 gf_web/android/app/src/main/AndroidManifest.xml create mode 100644 gf_web/android/app/src/main/kotlin/com/example/gf_web/MainActivity.kt create mode 100644 gf_web/android/app/src/main/res/drawable/launch_background.xml create mode 100644 gf_web/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 gf_web/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 gf_web/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 gf_web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 gf_web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 gf_web/android/app/src/main/res/values/styles.xml create mode 100644 gf_web/android/app/src/profile/AndroidManifest.xml create mode 100644 gf_web/android/build.gradle create mode 100644 gf_web/android/gradle.properties create mode 100644 gf_web/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 gf_web/android/settings.gradle create mode 100644 gf_web/ios/.gitignore create mode 100644 gf_web/ios/Flutter/AppFrameworkInfo.plist create mode 100644 gf_web/ios/Flutter/Debug.xcconfig create mode 100644 gf_web/ios/Flutter/Release.xcconfig create mode 100644 gf_web/ios/Runner.xcodeproj/project.pbxproj create mode 100644 gf_web/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 gf_web/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 gf_web/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 gf_web/ios/Runner/AppDelegate.swift create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 gf_web/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 gf_web/ios/Runner/Base.lproj/Main.storyboard create mode 100644 gf_web/ios/Runner/Info.plist create mode 100644 gf_web/ios/Runner/Runner-Bridging-Header.h create mode 100644 gf_web/lib/assets/icons/avatar.png create mode 100644 gf_web/lib/assets/icons/back.png create mode 100644 gf_web/lib/assets/icons/badge.png create mode 100644 gf_web/lib/assets/icons/buttons.png create mode 100644 gf_web/lib/assets/icons/buttons.svg create mode 100644 gf_web/lib/assets/icons/card.png create mode 100644 gf_web/lib/assets/icons/chips.png create mode 100644 gf_web/lib/assets/icons/danger.svg create mode 100644 gf_web/lib/assets/icons/dark.svg create mode 100644 gf_web/lib/assets/icons/dribble.svg create mode 100644 gf_web/lib/assets/icons/fb.svg create mode 100644 gf_web/lib/assets/icons/google.svg create mode 100644 gf_web/lib/assets/icons/images.png create mode 100644 gf_web/lib/assets/icons/info.svg create mode 100644 gf_web/lib/assets/icons/items.png create mode 100644 gf_web/lib/assets/icons/light.svg create mode 100644 gf_web/lib/assets/icons/link.svg create mode 100644 gf_web/lib/assets/icons/linkedin.svg create mode 100644 gf_web/lib/assets/icons/lists.png create mode 100644 gf_web/lib/assets/icons/menu.png create mode 100644 gf_web/lib/assets/icons/next.png create mode 100644 gf_web/lib/assets/icons/pinterest.svg create mode 100644 gf_web/lib/assets/icons/primary.svg create mode 100644 gf_web/lib/assets/icons/secondary.svg create mode 100644 gf_web/lib/assets/icons/slack.svg create mode 100644 gf_web/lib/assets/icons/slider.png create mode 100644 gf_web/lib/assets/icons/success.svg create mode 100644 gf_web/lib/assets/icons/tabs.png create mode 100644 gf_web/lib/assets/icons/toast.png create mode 100644 gf_web/lib/assets/icons/toggle.png create mode 100644 gf_web/lib/assets/icons/twitter.svg create mode 100644 gf_web/lib/assets/icons/typo.png create mode 100644 gf_web/lib/assets/icons/warning.svg create mode 100644 gf_web/lib/assets/icons/whatsapp.svg create mode 100644 gf_web/lib/assets/icons/youtube.svg create mode 100644 gf_web/lib/assets/logo.png create mode 100644 gf_web/lib/assets/screen.png create mode 100644 gf_web/lib/main.dart create mode 100644 gf_web/lib/screens/buttons/standard-buttons.dart create mode 100644 gf_web/lib/screens/layout/body.dart create mode 100644 gf_web/lib/screens/layout/header.dart create mode 100644 gf_web/lib/screens/layout/layout.dart create mode 100644 gf_web/lib/screens/layout/mobile-demo.dart create mode 100644 gf_web/lib/screens/layout/routes.dart create mode 100644 gf_web/lib/screens/layout/sidebar.dart create mode 100644 gf_web/lib/screens/pages/home.dart create mode 100644 gf_web/lib/styles/styles.dart create mode 100644 gf_web/pubspec.lock create mode 100644 gf_web/pubspec.yaml create mode 100644 gf_web/test/widget_test.dart create mode 100644 gf_web/web/index.html diff --git a/demo_app/lib/assets/icons/images.png b/demo_app/lib/assets/icons/images.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e4cb024692a2f438d9fbf794faa6aa01820fa4 GIT binary patch literal 840 zcmV-O1GoH%P))Qd500004b3#c}2nYxW zd3m6vw~sNC9E6#*kbmbaF8Y8m@_hwqfFG;$ldgw4;dw zPL74YKn4@ts4H=Bkb}ig9ZY&e#7Q@CFkGT0b+9F1@0s6~!%J!JuJ^kZA#`ki_j~X2 zzQ6B#ze_1)<`_r(L&pkYOIxC&CWtG*z7i)8ha};N5{Fdy17W3=NSXR|W_kePvtas3 z#80*~<83bir63#tpa9~h*2MA)b#3Z4nC=rW*Gmv72(_GBgkmoW0JriEh^80sj zsUZhp>aQ)$m~2i~ZS#Hey215pqse-5q0(2$Z(n)$H7c|mgrpK`S>Gh0QGmbI64i^9 z@lquUh!lj3C)Bb&3qk=*HW3tnH)@G$HVTLogs57S?xe2W%n;Ih*W_2eqv;CY%5lIAAvmK0T27^R~Xa^vY5he!PVwf?3$ejm41`Pwk ziTb!TzOw0E8wtV>VE;B-p88CrTww4IOEX5I0*L3Fcss)-5H7d6o^%Wm20#Qp^M3Nu zKz+ajFaT28w$!k2UXbS2+Yv-qfPZT24Yxg$hfTQMI;V~A49#r!SLeNhGBiY|03HzM zx-IJq-*z0P#YP2iO}=+yt+X*t<-JRkJ*o}QoAi7c2D0?1IBFZNJ%QMH~@2 _BadgesState(); -} - -class _BadgesState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - backgroundColor: getGFColor(GFColor.dark), - title: Text( - 'Badges', - style: TextStyle(fontSize: 14), - ), - ), - body: GFTabs( - height: MediaQuery.of(context).size.height, - tabBarColor: Color(0xFFD3E9ED), - initialIndex: 0, - length: 3, - tabs: [ - Padding( - padding: EdgeInsets.only(top: 15, bottom: 15), - child: Text('Badge'), - ), - Text('Button Badge'), - Text('Icon Badge'), - ], - tabBarView: GFTabBarView( - children: [ - ListView( - children: [ - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Types of Badges', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFBadge( - text: '1', - shape: GFBadgeShape.circle, - color: GFColor.success, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.square, - color: GFColor.primary, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.pills, - color: GFColor.danger, - textColor: GFColor.white, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.standard, - color: GFColor.warning, - ), - ], - ), - ], - ), - ), - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Circled Badges with different Sizes', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFBadge( - text: '1', - shape: GFBadgeShape.circle, - size: GFSize.large, - color: GFColor.success, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.circle, - size: GFSize.medium, - color: GFColor.success, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.circle, - size: GFSize.small, - color: GFColor.success, - ), - ], - ), - ], - ), - ), - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Squared Badges with different sizes', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFBadge( - text: '1', - shape: GFBadgeShape.square, - size: GFSize.large, - color: GFColor.primary, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.square, - size: GFSize.medium, - color: GFColor.primary, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.square, - size: GFSize.small, - color: GFColor.primary, - ), - ], - ), - ], - ), - ), - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Pills with different sizes', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFBadge( - text: '1', - shape: GFBadgeShape.pills, - size: GFSize.large, - color: GFColor.danger, - textColor: GFColor.white, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.pills, - size: GFSize.medium, - textColor: GFColor.white, - color: GFColor.danger, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.pills, - size: GFSize.small, - textColor: GFColor.white, - color: GFColor.danger, - ), - ], - ), - ], - ), - ), - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Standard Badges with different sizes', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFBadge( - text: '1', - shape: GFBadgeShape.standard, - size: GFSize.large, - color: GFColor.warning, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.standard, - size: GFSize.medium, - color: GFColor.warning, - ), - GFBadge( - text: '1', - shape: GFBadgeShape.standard, - size: GFSize.small, - color: GFColor.warning, - ), - ], - ), - ], - ), - ) - ], - ), - ListView( - children: [ - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Types of Button Badges', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButtonBadge( - shape: GFButtonShape.pills, - type: GFType.solid, - color: GFColor.info, - counterChild: GFBadge( - text: '12', - color: GFColor.warning, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Pills', - position: GFPosition.end, - ), - GFButtonBadge( - shape: GFButtonShape.square, - type: GFType.solid, - color: GFColor.warning, - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - color: GFColor.info, - ), - onPressed: null, - text: 'Square', - ), - GFButtonBadge( - color: GFColor.success, - shape: GFButtonShape.standard, - type: GFType.solid, - counterChild: GFBadge( - text: '12', - textColor: GFColor.white, - color: GFColor.danger, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Standard', - ), - ], - ), - ], - ), - ), - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Positions of Button Badges', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButtonBadge( - shape: GFButtonShape.pills, - type: GFType.solid, - color: GFColor.info, - counterChild: GFBadge( - text: '12', - color: GFColor.warning, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Pills', - position: GFPosition.start, - ), - GFButtonBadge( - shape: GFButtonShape.square, - type: GFType.solid, - color: GFColor.warning, - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - color: GFColor.info, - ), - onPressed: null, - text: 'Square', - position: GFPosition.start, - ), - GFButtonBadge( - color: GFColor.success, - shape: GFButtonShape.standard, - type: GFType.solid, - counterChild: GFBadge( - text: '12', - textColor: GFColor.white, - color: GFColor.danger, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Standard', - position: GFPosition.start, - ), - ], - ), - ], - ), - ), - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Pilled shape Button Badges with sizes', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButtonBadge( - shape: GFButtonShape.pills, - size: GFSize.large, - type: GFType.solid, - color: GFColor.info, - counterChild: GFBadge( - text: '12', - color: GFColor.warning, - size: GFSize.large, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Solid', - position: GFPosition.end, - ), - GFButtonBadge( - shape: GFButtonShape.pills, - size: GFSize.medium, - type: GFType.outline, - color: GFColor.info, - counterChild: GFBadge( - text: '12', - color: GFColor.warning, - size: GFSize.medium, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Outline', - position: GFPosition.end, - ), - GFButtonBadge( - shape: GFButtonShape.pills, - size: GFSize.small, - type: GFType.transparent, - color: GFColor.info, - counterChild: GFBadge( - text: '12', - color: GFColor.warning, - size: GFSize.small, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Transp', - position: GFPosition.end, - ), - ], - ), - ], - ), - ), - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Squared shape Button Badges with sizes', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButtonBadge( - shape: GFButtonShape.square, - size: GFSize.large, - type: GFType.solid, - color: GFColor.warning, - counterChild: GFBadge( - text: '12', - color: GFColor.info, - size: GFSize.large, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Solid', - position: GFPosition.end, - ), - GFButtonBadge( - shape: GFButtonShape.square, - size: GFSize.medium, - type: GFType.outline, - color: GFColor.warning, - counterChild: GFBadge( - text: '12', - color: GFColor.info, - size: GFSize.medium, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Outline', - position: GFPosition.end, - ), - GFButtonBadge( - shape: GFButtonShape.square, - size: GFSize.small, - type: GFType.transparent, - color: GFColor.warning, - counterChild: GFBadge( - text: '12', - color: GFColor.info, - size: GFSize.small, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Transp', - position: GFPosition.end, - ), - ], - ), - ], - ), - ), - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Standard Button Badges with sizes', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButtonBadge( - shape: GFButtonShape.standard, - size: GFSize.large, - type: GFType.solid, - color: GFColor.primary, - counterChild: GFBadge( - text: '12', - color: GFColor.danger, - size: GFSize.large, - textColor: GFColor.white, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Solid', - position: GFPosition.end, - ), - GFButtonBadge( - shape: GFButtonShape.standard, - size: GFSize.medium, - type: GFType.outline, - color: GFColor.primary, - counterChild: GFBadge( - text: '12', - color: GFColor.danger, - textColor: GFColor.white, - size: GFSize.medium, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Outline', - position: GFPosition.end, - ), - GFButtonBadge( - shape: GFButtonShape.standard, - size: GFSize.small, - type: GFType.transparent, - color: GFColor.primary, - counterChild: GFBadge( - text: '12', - color: GFColor.danger, - textColor: GFColor.white, - size: GFSize.small, - shape: GFBadgeShape.circle, - ), - onPressed: null, - text: 'Transp', - position: GFPosition.end, - ), - ], - ), - ], - ), - ) - ], - ), - ListView( - children: [ - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Types of Icon Badges', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFIconBadge( - onPressed: null, - child: GFIconButton( - shape: GFButtonShape.pills, - color: GFColor.success, - type: GFType.solid, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - size: GFSize.small, - )), - GFIconBadge( - onPressed: null, - child: GFIconButton( - shape: GFButtonShape.square, - color: GFColor.primary, - type: GFType.solid, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - size: GFSize.small, - )), - GFIconBadge( - onPressed: null, - child: GFIconButton( - shape: GFButtonShape.pills, - color: GFColor.danger, - type: GFType.solid, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - size: GFSize.small, - )), - GFIconBadge( - onPressed: null, - child: GFIconButton( - shape: GFButtonShape.standard, - type: GFType.solid, - color: GFColor.warning, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - size: GFSize.small, - )), - ], - ) - ], - ), - ), - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Shapes of Icon Badges', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFIconBadge( - onPressed: null, - child: GFIconButton( - shape: GFButtonShape.pills, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - size: GFSize.small, - )), - GFIconBadge( - onPressed: null, - child: GFIconButton( - shape: GFButtonShape.square, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - color: GFColor.dark, - shape: GFBadgeShape.circle, - size: GFSize.small, - )), - GFIconBadge( - onPressed: null, - child: GFIconButton( - shape: GFButtonShape.pills, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - size: GFSize.small, - )), - GFIconBadge( - onPressed: null, - child: GFIconButton( - shape: GFButtonShape.standard, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - size: GFSize.small, - ), - ), - ], - ) - ], - ), - ), - GFCard( - content: Column( - children: [ - GFHeader( - text: 'Sizes of Icon Badges', - type: GFHeadingType.typo6, - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFIconBadge( - onPressed: null, - child: GFIconButton( - size: GFSize.large, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - size: GFSize.small, - )), - GFIconBadge( - onPressed: null, - child: GFIconButton( - size: GFSize.medium, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - size: GFSize.small, - )), - GFIconBadge( - onPressed: null, - child: GFIconButton( - size: GFSize.small, - onPressed: null, - icon: Icon(Icons.mail), - ), - counterChild: GFBadge( - text: '12', - shape: GFBadgeShape.circle, - size: GFSize.small, - )), - ], - ) - ], - ), - ) - ], - ) - ], - ), - indicatorColor: getGFColor(GFColor.dark), - indicatorSize: TabBarIndicatorSize.label, - labelColor: getGFColor(GFColor.success), - unselectedLabelColor: Colors.black, - labelStyle: TextStyle( - fontWeight: FontWeight.w500, - fontSize: 13.0, - color: Colors.deepOrange, - fontFamily: 'OpenSansBold', - ), - unselectedLabelStyle: TextStyle( - fontWeight: FontWeight.w500, - fontSize: 13.0, - color: Colors.black, - fontFamily: 'OpenSansBold', - ), - ), - ); - } -} diff --git a/demo_app/lib/screens/badges/badges.dart b/demo_app/lib/screens/badges/badges.dart new file mode 100644 index 00000000..1dff0821 --- /dev/null +++ b/demo_app/lib/screens/badges/badges.dart @@ -0,0 +1,291 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:ui_kit/colors/gf_color.dart'; +import 'package:ui_kit/components/badge/gf_badge.dart'; +import 'package:ui_kit/components/badge/gf_button_badge.dart'; +import 'package:ui_kit/components/badge/gf_icon_badge.dart'; +import 'package:ui_kit/components/card/gf_card.dart'; +import 'package:ui_kit/components/header/gf_header.dart'; +import 'package:ui_kit/components/tabs/gf_tabs.dart'; +import 'package:ui_kit/components/button/gf_icon_button.dart'; +import 'package:ui_kit/position/gf_position.dart'; +import 'package:ui_kit/shape/gf_badge_shape.dart'; +import 'package:ui_kit/shape/gf_button_shape.dart'; +import 'package:ui_kit/size/gf_size.dart'; +import 'package:ui_kit/types/gf_heading_type.dart'; +import 'package:ui_kit/types/gf_type.dart'; +import 'package:ui_kit/components/tabs/gf_tabBarView.dart'; + +class Badges extends StatefulWidget { + @override + _BadgesState createState() => _BadgesState(); +} + +class _BadgesState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: getGFColor(GFColor.dark), + title: Text( + 'Badges', + style: TextStyle(fontSize: 17), + ), + centerTitle: true, + ), + body: ListView( + children: [ + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'With Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + GFCard( + content: Column( + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButtonBadge( + counterChild: GFBadge( + text: '6', + shape: GFBadgeShape.pills, + ), + onPressed: (){}, + text: 'Primary', + ), + GFButtonBadge( + counterChild: GFBadge( + text: '6', + shape: GFBadgeShape.pills, + ), + onPressed: (){}, + text: 'Second', + color: GFColor.secondary, + ), + GFButtonBadge( + counterChild: GFBadge( + text: '6', + shape: GFBadgeShape.pills, + ), + onPressed: (){}, + text: 'Success', + color: GFColor.success, + ), + ], + ), + + SizedBox( + height: 20, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButtonBadge( + counterChild: GFBadge( + text: '6', + shape: GFBadgeShape.pills, + ), + onPressed: (){}, + text: 'Warning', + color: GFColor.warning, + ), + GFButtonBadge( + counterChild: GFBadge( + text: '6', + shape: GFBadgeShape.pills, + ), + onPressed: (){}, + text: 'Danger', + color: GFColor.danger, + ), + GFButtonBadge( + counterChild: GFBadge( + text: '6', + shape: GFBadgeShape.pills, + ), + onPressed: (){}, + text: 'Info', + color: GFColor.info, + ), + ], + ), + SizedBox( + height: 20, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButtonBadge( + counterChild: GFBadge( + text: '6', + shape: GFBadgeShape.pills, + ), + onPressed: (){}, + text: 'Light', + color: GFColor.light, + ), + GFButtonBadge( + counterChild: GFBadge( + text: '6', + shape: GFBadgeShape.pills, + ), + onPressed: (){}, + text: 'Dark', + textStyle: TextStyle(color: getGFColor(GFColor.white)), + + color: GFColor.dark, + ), + GFButtonBadge( + counterChild: GFBadge( + text: '6', + shape: GFBadgeShape.pills, + ), + onPressed: (){}, + text: 'Link', + color: GFColor.transparent, + ), + ], + ), + SizedBox( + height: 10, + ), + ], + ), + ), + + Padding( + padding: EdgeInsets.only(left: 15, top: 20), + child: GFHeader( + text: 'Icon with Badges', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + + GFCard( + content: Column( + children: [ + SizedBox( + height: 20, + ), + Row( + children: [ + GFIconBadge( + onPressed: null, + child: GFIconButton( + type: GFType.transparent, + onPressed: (){}, + icon: SvgPicture.asset('lib/assets/icons/primary.svg', color: getGFColor(GFColor.primary),) + ), + counterChild: GFBadge( + text: '12', + shape: GFBadgeShape.circle, + size: GFSize.small, + )), + GFIconBadge( + onPressed: null, + child: GFIconButton( + type: GFType.transparent, + onPressed: (){}, + icon: SvgPicture.asset('lib/assets/icons/secondary.svg', color: getGFColor(GFColor.secondary),) + ), + counterChild: GFBadge( + text: '12', + shape: GFBadgeShape.circle, + size: GFSize.small, + )), + GFIconBadge( + onPressed: null, + child: GFIconButton( + type: GFType.transparent, + onPressed: (){}, + icon: SvgPicture.asset('lib/assets/icons/success.svg', color: getGFColor(GFColor.success),) + ), + counterChild: GFBadge( + text: '12', + shape: GFBadgeShape.circle, + size: GFSize.small, + )), + GFIconBadge( + onPressed: null, + child: GFIconButton( + type: GFType.transparent, + onPressed: (){}, + icon: SvgPicture.asset('lib/assets/icons/warning.svg', color: getGFColor(GFColor.warning),) + ), + counterChild: GFBadge( + text: '12', + shape: GFBadgeShape.circle, + size: GFSize.small, + )), + GFIconBadge( + onPressed: null, + child: GFIconButton( + type: GFType.transparent, + onPressed: (){}, + icon: SvgPicture.asset('lib/assets/icons/danger.svg', color: getGFColor(GFColor.danger),) + ), + counterChild: GFBadge( + text: '12', + shape: GFBadgeShape.circle, + size: GFSize.small, + )), + ], + ), + Row( + children: [ + GFIconBadge( + onPressed: null, + child: GFIconButton( + type: GFType.transparent, + onPressed: (){}, + icon: SvgPicture.asset('lib/assets/icons/info.svg', color: getGFColor(GFColor.info),) + ), + counterChild: GFBadge( + text: '12', + shape: GFBadgeShape.standard, + size: GFSize.small, + )), + GFIconBadge( + onPressed: null, + child: GFIconButton( + type: GFType.transparent, + onPressed: (){}, + icon: SvgPicture.asset('lib/assets/icons/light.svg', color: getGFColor(GFColor.light),) + ), + counterChild: GFBadge( + text: '12', + shape: GFBadgeShape.square, + size: GFSize.small, + )), + GFIconBadge( + onPressed: null, + child: GFIconButton( + type: GFType.transparent, + onPressed: (){}, + icon: SvgPicture.asset('lib/assets/icons/dark.svg', color: getGFColor(GFColor.dark),) + ), + counterChild: GFBadge( + text: '12', + shape: GFBadgeShape.pills, + size: GFSize.small, + )), + ], + ) + ], + ), + ), + ], + ), + ); + } +} diff --git a/demo_app/lib/screens/button/icon-buttons.dart b/demo_app/lib/screens/button/icon-buttons.dart index 67169ebc..0cad9746 100644 --- a/demo_app/lib/screens/button/icon-buttons.dart +++ b/demo_app/lib/screens/button/icon-buttons.dart @@ -53,7 +53,7 @@ class _IconButtonsState extends State { // mainAxisAlignment: MainAxisAlignment.spaceBetween, // children: [ //// GFIconButton( -//// onPressed: null, +//// onPressed: (){}, //// icon: Icon(Icons.ac_unit), ////// iconSize: 12.0, //// type: GFType.solid, @@ -90,7 +90,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Primary", ), @@ -100,7 +100,7 @@ class _IconButtonsState extends State { width: 6, ), Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, child: Text("Second"), icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), color: GFColor.secondary, @@ -109,7 +109,7 @@ class _IconButtonsState extends State { width: 6, ), Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Success", ), @@ -125,7 +125,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Warning", ), @@ -133,7 +133,7 @@ class _IconButtonsState extends State { color: GFColor.warning, ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Danger", ), @@ -141,7 +141,7 @@ class _IconButtonsState extends State { color: GFColor.danger, ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Info", ), @@ -157,7 +157,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Light", ), @@ -167,7 +167,7 @@ class _IconButtonsState extends State { ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Dark", style: TextStyle(color: getGFColor(GFColor.white)), @@ -176,21 +176,24 @@ class _IconButtonsState extends State { color: GFColor.dark, ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( - "Alt", + "Link", ), icon: SvgPicture.asset('lib/assets/icons/link.svg'), - color: GFColor.alt, + color: GFColor.transparent, ), ], ), + SizedBox( + height: 10, + ), ], ), ), Padding( - padding: EdgeInsets.only(left: 15, top: 20), + padding: EdgeInsets.only(left: 15, top: 10), child: GFHeader( text: 'Outline Icons', type: GFHeadingType.typo5, @@ -211,7 +214,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, type: GFType.outline, child: Text( "Primary", @@ -222,7 +225,7 @@ class _IconButtonsState extends State { width: 6, ), Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, child: Text("Second"), icon: SvgPicture.asset('lib/assets/icons/secondary.svg', color: getGFColor(GFColor.secondary),), color: GFColor.secondary, @@ -232,7 +235,7 @@ class _IconButtonsState extends State { width: 6, ), Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Success", ), @@ -249,7 +252,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Warning", ), @@ -258,7 +261,7 @@ class _IconButtonsState extends State { type: GFType.outline, ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Danger", ), @@ -267,7 +270,7 @@ class _IconButtonsState extends State { type: GFType.outline, ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Info", ), @@ -284,7 +287,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Light", ), @@ -295,7 +298,7 @@ class _IconButtonsState extends State { ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Dark", @@ -305,22 +308,158 @@ class _IconButtonsState extends State { type: GFType.outline, ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( - "Alt", + "Link", ), icon: SvgPicture.asset('lib/assets/icons/link.svg', color: getGFColor(GFColor.alt),), - color: GFColor.alt, + color: GFColor.transparent, type: GFType.outline, ), ], ), + SizedBox( + height: 10, + ), ], ), ), Padding( - padding: EdgeInsets.only(left: 15, top: 20), + padding: EdgeInsets.only(left: 15, top: 10), + child: GFHeader( + text: 'Outline 2x Icons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GFButton( + onPressed: (){}, + type: GFType.outline2x, + child: Text( + "Primary", + ), + icon: SvgPicture.asset('lib/assets/icons/primary.svg', color: getGFColor(GFColor.primary),) + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: (){}, + child: Text("Second"), + icon: SvgPicture.asset('lib/assets/icons/secondary.svg', color: getGFColor(GFColor.secondary),), + color: GFColor.secondary, + type: GFType.outline2x, + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: (){}, + child: Text( + "Success", + ), + icon: SvgPicture.asset('lib/assets/icons/success.svg', color: getGFColor(GFColor.success),), + color: GFColor.success, + type: GFType.outline2x, + ),) + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: (){}, + child: Text( + "Warning", + ), + icon: SvgPicture.asset('lib/assets/icons/warning.svg', color: getGFColor(GFColor.warning),), + color: GFColor.warning, + type: GFType.outline2x, + ), + GFButton( + onPressed: (){}, + child: Text( + "Danger", + ), + icon: SvgPicture.asset('lib/assets/icons/danger.svg', color: getGFColor(GFColor.danger),), + color: GFColor.danger, + type: GFType.outline2x, + ), + GFButton( + onPressed: (){}, + child: Text( + "Info", + ), + icon: SvgPicture.asset('lib/assets/icons/info.svg', color: getGFColor(GFColor.info),), + color: GFColor.info, + type: GFType.outline2x, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: (){}, + child: Text( + "Light", + ), + icon: SvgPicture.asset('lib/assets/icons/light.svg', color: getGFColor(GFColor.light),), + type: GFType.outline2x, + color: GFColor.light, + + ), + + GFButton( + onPressed: (){}, + child: Text( + "Dark", + + ), + icon: SvgPicture.asset('lib/assets/icons/dark.svg', color: getGFColor(GFColor.dark),), + color: GFColor.dark, + type: GFType.outline2x, + ), + GFButton( + onPressed: (){}, + child: Text( + "Link", + ), + icon: SvgPicture.asset('lib/assets/icons/link.svg', color: getGFColor(GFColor.alt),), + color: GFColor.transparent, + + ), + ], + ), + SizedBox( + height: 10, + ), + ], + ), + ), + + Padding( + padding: EdgeInsets.only(left: 15, top: 10), child: GFHeader( text: 'Square Icons', type: GFHeadingType.typo5, @@ -341,7 +480,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.square, child: Text( "Primary", @@ -352,7 +491,7 @@ class _IconButtonsState extends State { width: 6, ), Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.square, child: Text("Second"), icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), @@ -363,7 +502,7 @@ class _IconButtonsState extends State { ), Expanded(child: GFButton( shape: GFButtonShape.square, - onPressed: null, + onPressed: (){}, child: Text( "Success", ), @@ -379,7 +518,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.square, child: Text( "Warning", @@ -389,7 +528,7 @@ class _IconButtonsState extends State { ), GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.square, child: Text( "Danger", @@ -398,7 +537,7 @@ class _IconButtonsState extends State { color: GFColor.danger, ), GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.square, child: Text( "Info", @@ -415,7 +554,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.square, child: Text( "Light", @@ -426,7 +565,7 @@ class _IconButtonsState extends State { ), GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.square, child: Text( "Dark", @@ -436,21 +575,25 @@ class _IconButtonsState extends State { color: GFColor.dark, ), GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.square, child: Text( - "Alt", + "Link", ), icon: SvgPicture.asset('lib/assets/icons/link.svg'), - color: GFColor.alt, + color: GFColor.transparent, ), ], ), + SizedBox( + height: 10, + ), ], ), ), + Padding( - padding: EdgeInsets.only(left: 15, top: 20), + padding: EdgeInsets.only(left: 15, top: 10), child: GFHeader( text: 'Pills Icons', type: GFHeadingType.typo5, @@ -471,7 +614,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.pills, child: Text( "Primary", @@ -482,7 +625,7 @@ class _IconButtonsState extends State { width: 6, ), Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.pills, child: Text("Second"), icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), @@ -493,7 +636,7 @@ class _IconButtonsState extends State { ), Expanded(child: GFButton( shape: GFButtonShape.pills, - onPressed: null, + onPressed: (){}, child: Text( "Success", ), @@ -509,7 +652,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.pills, child: Text( "Warning", @@ -519,7 +662,7 @@ class _IconButtonsState extends State { ), GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.pills, child: Text( "Danger", @@ -528,7 +671,7 @@ class _IconButtonsState extends State { color: GFColor.danger, ), GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.pills, child: Text( "Info", @@ -545,7 +688,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.pills, child: Text( "Light", @@ -556,7 +699,7 @@ class _IconButtonsState extends State { ), GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.pills, child: Text( "Dark", @@ -566,23 +709,158 @@ class _IconButtonsState extends State { color: GFColor.dark, ), GFButton( - onPressed: null, + onPressed: (){}, shape: GFButtonShape.pills, child: Text( - "Alt", + "Link", ), icon: SvgPicture.asset('lib/assets/icons/link.svg'), - color: GFColor.alt, + color: GFColor.transparent, ), ], ), + SizedBox( + height: 10, + ), + ], + ), + ), + + Padding( + padding: EdgeInsets.only(left: 15, top: 10), + child: GFHeader( + text: 'Shadow Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), + + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: GFButton( + onPressed: (){}, + child: Text( + "Primary", + ), + icon: SvgPicture.asset('lib/assets/icons/primary.svg'), + buttonBoxShadow: true, + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: (){}, + child: Text("Second"), + icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), + color: GFColor.secondary, + buttonBoxShadow: true, + ),), + SizedBox( + width: 6, + ), + Expanded(child: GFButton( + onPressed: (){}, + child: Text( + "Success", + ), + icon: SvgPicture.asset('lib/assets/icons/success.svg'), + color: GFColor.success, + buttonBoxShadow: true, + ),) + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: (){}, + child: Text( + "Warning", + ), + icon: SvgPicture.asset('lib/assets/icons/warning.svg'), + color: GFColor.warning, + buttonBoxShadow: true, + ), + GFButton( + onPressed: (){}, + child: Text( + "Danger", + ), + icon: SvgPicture.asset('lib/assets/icons/danger.svg'), + color: GFColor.danger, + buttonBoxShadow: true, + ), + GFButton( + onPressed: (){}, + child: Text( + "Info", + ), + icon: SvgPicture.asset('lib/assets/icons/info.svg'), + color: GFColor.info, + buttonBoxShadow: true, + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: (){}, + child: Text( + "Light", + ), + icon: SvgPicture.asset('lib/assets/icons/light.svg'), + type: GFType.solid, + color: GFColor.light, + buttonBoxShadow: true, + ), + + GFButton( + onPressed: (){}, + child: Text( + "Dark", + style: TextStyle(color: getGFColor(GFColor.white)), + ), + icon: SvgPicture.asset('lib/assets/icons/dark.svg'), + color: GFColor.dark, + buttonBoxShadow: true, + ), + GFButton( + onPressed: (){}, + child: Text( + "Link", + ), + icon: SvgPicture.asset('lib/assets/icons/link.svg'), + color: GFColor.transparent, + ), + ], + ), + SizedBox( + height: 10, + ), ], ), ), Padding( - padding: EdgeInsets.only(left: 15, top: 20), + padding: EdgeInsets.only(left: 15, top: 10), child: GFHeader( text: 'Button Sizes', type: GFHeadingType.typo5, @@ -603,7 +881,7 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, child: Text("Large", style: TextStyle( color: getGFColor(GFColor.white))), @@ -612,7 +890,7 @@ class _IconButtonsState extends State { icon: SvgPicture.asset('lib/assets/icons/primary.svg'), ), GFButton( - onPressed: null, + onPressed: (){}, child: Text("Normal", style: TextStyle( color: getGFColor(GFColor.white))), @@ -621,7 +899,7 @@ class _IconButtonsState extends State { icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), ), GFButton( - onPressed: null, + onPressed: (){}, child: Text("Small", style: TextStyle( color: getGFColor(GFColor.white))), @@ -631,13 +909,16 @@ class _IconButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), Padding( - padding: EdgeInsets.only(left: 15, top: 20), + padding: EdgeInsets.only(left: 15, top: 10), child: GFHeader( text: 'Block Buttons', type: GFHeadingType.typo5, @@ -654,7 +935,7 @@ class _IconButtonsState extends State { height: 10, ), GFButton( - onPressed: null, + onPressed: (){}, blockButton: true, child: Text("Large", ), @@ -669,7 +950,7 @@ class _IconButtonsState extends State { ), GFButton( - onPressed: null, + onPressed: (){}, blockButton: true, child: Text("Normal", ), @@ -684,7 +965,7 @@ class _IconButtonsState extends State { GFButton( - onPressed: null, + onPressed: (){}, blockButton: true, child: Text("Small", ), @@ -693,6 +974,9 @@ class _IconButtonsState extends State { icon: SvgPicture.asset('lib/assets/icons/success.svg'), ), + SizedBox( + height: 10, + ), ], ), @@ -720,20 +1004,17 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFIconButton( - type: GFType.solid, - icon: SvgPicture.asset('lib/assets/icons/primary.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/primary.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, color: GFColor.secondary, - icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/secondary.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, color: GFColor.success, - icon: SvgPicture.asset('lib/assets/icons/success.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/success.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, + color: GFColor.warning, - icon: SvgPicture.asset('lib/assets/icons/warning.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/warning.svg'), onPressed: (){}), ], ), @@ -746,29 +1027,79 @@ class _IconButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFIconButton( - type: GFType.solid, + color: GFColor.danger, - icon: SvgPicture.asset('lib/assets/icons/danger.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/danger.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, + color: GFColor.info, - icon: SvgPicture.asset('lib/assets/icons/info.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/info.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, + color: GFColor.light, - icon: SvgPicture.asset('lib/assets/icons/light.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/light.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, + color: GFColor.dark, - icon: SvgPicture.asset('lib/assets/icons/dark.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/dark.svg'), onPressed: (){}), ], ), SizedBox( - height: 10, + height: 20, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFIconButton( + type: GFType.outline, + icon: Icon(Icons.settings), onPressed: (){}), + GFIconButton( + type: GFType.outline, + color: GFColor.secondary, + icon:Icon(Icons.send), onPressed: (){}), + GFIconButton( + type: GFType.outline, + color: GFColor.success, + icon: Icon(Icons.file_download), onPressed: (){}), + GFIconButton( + type: GFType.outline, + color: GFColor.warning, + icon: Icon(Icons.warning), onPressed: (){}), + + ], ), + SizedBox( + height: 20, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFIconButton( + type: GFType.outline, + color: GFColor.danger, + icon:Icon(Icons.insert_drive_file), onPressed: (){}), + GFIconButton( + type: GFType.outline, + color: GFColor.info, + icon: Icon(Icons.delete), onPressed: (){}), + GFIconButton( + type: GFType.outline, + color: GFColor.light, + icon: Icon(Icons.info), onPressed: (){}), + GFIconButton( + type: GFType.outline, + color: GFColor.dark, + icon: Icon(Icons.apps), onPressed: (){}), + + ], + ), + SizedBox( + height: 10, + ), + ], ), ), diff --git a/demo_app/lib/screens/button/pill-buttons.dart b/demo_app/lib/screens/button/pill-buttons.dart index 57b6d26d..67224d28 100644 --- a/demo_app/lib/screens/button/pill-buttons.dart +++ b/demo_app/lib/screens/button/pill-buttons.dart @@ -42,7 +42,7 @@ class _PillsButtonsState extends State { labelColor: getGFColor(GFColor.warning), tabs: [ GFButton( - onPressed: (){}, + onPressed: null, child: Text( "Solid", style: TextStyle(fontSize: 12), @@ -52,7 +52,7 @@ class _PillsButtonsState extends State { shape: GFButtonShape.pills, ), GFButton( - onPressed: (){}, + onPressed: null, child: Text( "Outline", style: TextStyle(fontSize: 12), @@ -61,7 +61,7 @@ class _PillsButtonsState extends State { shape: GFButtonShape.pills, ), GFButton( - onPressed: (){}, + onPressed: null, text: 'Outline 2x', textStyle: TextStyle(fontSize: 12, color: getGFColor(GFColor.dark)), type: GFType.outline2x, @@ -185,6 +185,9 @@ class _PillsButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -301,6 +304,9 @@ class _PillsButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -355,6 +361,9 @@ class _PillsButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -411,6 +420,9 @@ class _PillsButtonsState extends State { size: GFSize.small, shape: GFButtonShape.pills, ), + SizedBox( + height: 10, + ), ], ), ), @@ -542,6 +554,9 @@ class _PillsButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), @@ -666,6 +681,9 @@ class _PillsButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -719,8 +737,12 @@ class _PillsButtonsState extends State { type: GFType.outline, shape: GFButtonShape.pills, ), + ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -780,6 +802,9 @@ class _PillsButtonsState extends State { type: GFType.outline, shape: GFButtonShape.pills, ), + SizedBox( + height: 10, + ), ], ), ), @@ -911,6 +936,9 @@ class _PillsButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), @@ -1035,6 +1063,9 @@ class _PillsButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -1088,8 +1119,12 @@ class _PillsButtonsState extends State { type: GFType.outline2x, shape: GFButtonShape.pills, ), + ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -1149,6 +1184,9 @@ class _PillsButtonsState extends State { type: GFType.outline2x, shape: GFButtonShape.pills, ), + SizedBox( + height: 10, + ), ], ), ), diff --git a/demo_app/lib/screens/button/shadow-buttons.dart b/demo_app/lib/screens/button/shadow-buttons.dart index b1eda37f..b4672e44 100644 --- a/demo_app/lib/screens/button/shadow-buttons.dart +++ b/demo_app/lib/screens/button/shadow-buttons.dart @@ -33,774 +33,1038 @@ class _ShadowButtonsState extends State { ), centerTitle: true, ), - body: GFTabs( - height: MediaQuery.of(context).size.height, - tabBarColor: Color(0xFFD3E9ED), - initialIndex: 0, - length: 3, - indicatorColor: getGFColor(GFColor.info), - unselectedLabelColor: getGFColor(GFColor.danger), - labelColor: getGFColor(GFColor.warning), - tabs: [ - GFButton( - onPressed: (){}, - child: Text( - "Solid", - style: TextStyle(fontSize: 12), - ), - buttonBoxShadow: true, - textColor: GFColor.white, - ), - GFButton( - onPressed: (){}, - child: Text( - "Outline", - style: TextStyle(fontSize: 12), - ), - type: GFType.outline, - ), - GFButton( - onPressed: (){}, - text: 'Outline 2x', - textStyle: TextStyle(fontSize: 12, color: getGFColor(GFColor.dark)), - type: GFType.outline2x, - ), - ], - tabBarView: GFTabBarView( - children: [ - Container( +// body: GFTabs( +// height: MediaQuery.of(context).size.height, +// tabBarColor: Color(0xFFD3E9ED), +// initialIndex: 0, +// length: 3, +// indicatorColor: getGFColor(GFColor.info), +// unselectedLabelColor: getGFColor(GFColor.danger), +// labelColor: getGFColor(GFColor.warning), +// tabs: [ +// GFButton( +// onPressed: (){}, +// child: Text( +// "Solid", +// style: TextStyle(fontSize: 12), +// ), +// buttonBoxShadow: true, +// textColor: GFColor.white, +// ), +// GFButton( +// onPressed: null, +// child: Text( +// "Outline", +// style: TextStyle(fontSize: 12), +// ), +// type: GFType.outline, +// ), +// GFButton( +// onPressed: null, +// text: 'Outline 2x', +// textStyle: TextStyle(fontSize: 12, color: getGFColor(GFColor.dark)), +// type: GFType.outline2x, +// ), +// ], +// tabBarView: GFTabBarView( +// children: [ +// Container( +//// color: Colors.red, +// child: ListView( +// children: [ +// Padding(padding: EdgeInsets.only(left:15, top:30), +// child: GFHeader( +// text: 'Default', +// type: GFHeadingType.typo5, +// dividerWidth: 25, +// dividerColor: Color(0xFF19CA4B), +// +// ), +// ), +// GFCard( +// content: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// +// SizedBox( +// height: 10, +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// shape: GFButtonShape.standard, +// +// buttonBoxShadow: true, +// child: Text("Primary", +// ), +// +// color: GFColor.primary, +// ), +// GFButton( +// onPressed: (){}, +// child: Text("Secondary", +// ), +// +// color: GFColor.secondary, +// buttonBoxShadow: true, +// ), +// GFButton( +// onPressed: (){}, +// child: Text( +// "Success", +// ), +// buttonBoxShadow: true, +// color: GFColor.success, +// ), +// ], +// ), +// +// SizedBox( +// height: 10, +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text( +// "Warning", +// ), +// buttonBoxShadow: true, +// color: GFColor.warning, +// ), +// GFButton( +// onPressed: (){}, +// child: Text("Danger", +// ), +// buttonBoxShadow: true, +// color: GFColor.danger, +// ), +// GFButton( +// onPressed: (){}, +// child: Text( +// "Info", +// ), +// buttonBoxShadow: true, +// color: GFColor.info, +// ), +// ], +// ), +// SizedBox( +// height: 10, +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text( +// "Light", +// ), +// buttonBoxShadow: true, +// color: GFColor.light, +// ), +// +// GFButton( +// onPressed: (){}, +// child: Text( +// "Dark", +// style: +// TextStyle(color: getGFColor(GFColor.white)), +// ), +// buttonBoxShadow: true, +// color: GFColor.dark, +// ), +// GFButton( +// onPressed: (){}, +// child: Text("Link", +// ), +// buttonBoxShadow: false, +// color: GFColor.transparent, +// ), +// ], +// ), +//SizedBox( +// height: 10, +//) +// +// ], +// ), +// ), +// +// +// +// +// Padding(padding: EdgeInsets.only(left:15, top:10), +// child: GFHeader( +// text: 'Button Sizes', +// type: GFHeadingType.typo5, +// dividerWidth: 25, +// dividerColor: Color(0xFF19CA4B), +// +// ), +// ), +// +// +// GFCard( +// content: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// SizedBox( +// height: 10, +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text("Large", +// ), +// color: GFColor.primary, +// size: GFSize.large, +// buttonBoxShadow: true, +// ), +// GFButton( +// onPressed: (){}, +// child: Text("Normal", +// ), +// color: GFColor.primary, +// size: GFSize.medium, +// buttonBoxShadow: true, +// ), +// GFButton( +// onPressed: (){}, +// child: Text("Small", +// ), +// color: GFColor.primary, +// size: GFSize.small, +// buttonBoxShadow: true, +// ), +// ], +// ), +// SizedBox( +// height: 10, +// ), +// +// ], +// ), +// ), +// +// +// Padding(padding: EdgeInsets.only(left:15, top:10), +// child: GFHeader( +// text: 'Block Buttons', +// type: GFHeadingType.typo5, +// dividerWidth: 25, +// dividerColor: Color(0xFF19CA4B), +// +// ), +// ), +// +// +// GFCard( +// content: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// SizedBox( +// height: 10, +// ), +// GFButton( +// onPressed: (){}, +// blockButton: true, +// child: Text("Large", +// style: TextStyle( +// color: getGFColor(GFColor.white))), +// color: GFColor.primary, +// size: GFSize.large, +// buttonBoxShadow: true, +// ), +// +// SizedBox( +// height: 10, +// ), +// +// GFButton( +// onPressed: (){}, +// blockButton: true, +// child: Text("Normal", +// style: TextStyle( +// color: getGFColor(GFColor.white))), +// color: GFColor.primary, +// size: GFSize.medium, +// buttonBoxShadow: true, +// ), +// +// SizedBox( +// height: 10, +// ), +// +// +// GFButton( +// onPressed: (){}, +// blockButton: true, +// child: Text("Small", +// style: TextStyle( +// color: getGFColor(GFColor.white))), +// color: GFColor.primary, +// size: GFSize.small, +// buttonBoxShadow: true, +// ), +// SizedBox( +// height: 10, +// ), +// +// ], +// ), +// ), +// ], +// ), +// ), +// +// +// //tab 2 +// Container( +//// color: Colors.red, +// child: ListView( +// children: [ +// +// Padding(padding: EdgeInsets.only(left:15, top:30), +// child: GFHeader( +// text: 'Default', +// type: GFHeadingType.typo5, +// dividerWidth: 25, +// dividerColor: Color(0xFF19CA4B), +// +// ), +// ), +// GFCard( +// content: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// SizedBox( +// height: 10, +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text( +// "Primary", +// +// ), +// +// type: GFType.outline, +// +// ), +// +// +// GFButton( +// onPressed: (){}, +// child: Text("Secondary"), +// type: GFType.outline, +// color: GFColor.secondary, +// ), +// GFButton( +// onPressed: (){}, +// child: Text( +// "Success", +// ), +// type: GFType.outline, +// color: GFColor.success, +// ), +// ], +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text( +// "Warning", +// ), +// type: GFType.outline, +// color: GFColor.warning, +// ), +// GFButton( +// onPressed: (){}, +// child: Text( +// "Danger", +// ), +// type: GFType.outline, +// color: GFColor.danger, +// ), +// GFButton( +// onPressed: (){}, +// child: Text( +// "Info", +// ), +// type: GFType.outline, +// color: GFColor.info, +// ), +// ], +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text( +// "Light", +// ), +// type: GFType.outline, +// color: GFColor.light, +// ), +// +// GFButton( +// onPressed: (){}, +// child: Text( +// "Dark", +// ), +// type: GFType.outline, +// color: GFColor.dark, +// ), +// GFButton( +// onPressed: (){}, +// child: Text( +// "Link", +// ), +// color: GFColor.transparent, +// ), +// ], +// ), +// ], +// ), +// ), +// +// +// +// Padding(padding: EdgeInsets.only(left:15, top:10), +// child: GFHeader( +// text: 'Button Sizes', +// type: GFHeadingType.typo5, +// dividerWidth: 25, +// dividerColor: Color(0xFF19CA4B), +// +// ), +// ), +// +// +// GFCard( +// content: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// SizedBox( +// height: 10, +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text("Large", +// ), +// color: GFColor.primary, +// size: GFSize.large, +// type: GFType.outline, +// ), +// GFButton( +// onPressed: (){}, +// child: Text("Normal", +// ), +// color: GFColor.primary, +// size: GFSize.medium, +// type: GFType.outline, +// ), +// GFButton( +// onPressed: (){}, +// child: Text("Small", +// ), +// color: GFColor.primary, +// size: GFSize.small, +// type: GFType.outline, +// ), +// ], +// ), +// +// ], +// ), +// ), +// +// +// Padding(padding: EdgeInsets.only(left:15, top:10), +// child: GFHeader( +// text: 'Block Buttons', +// type: GFHeadingType.typo5, +// dividerWidth: 25, +// dividerColor: Color(0xFF19CA4B), +// +// ), +// ), +// +// +// GFCard( +// content: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// SizedBox( +// height: 10, +// ), +// GFButton( +// onPressed: (){}, +// blockButton: true, +// child: Text("Large", +// ), +// color: GFColor.primary, +// size: GFSize.large, +// type: GFType.outline, +// ), +// +// SizedBox( +// height: 10, +// ), +// +// GFButton( +// onPressed: (){}, +// blockButton: true, +// child: Text("Normal", +// ), +// color: GFColor.primary, +// size: GFSize.medium, +// type: GFType.outline, +// ), +// +// SizedBox( +// height: 10, +// ), +// +// +// GFButton( +// onPressed: (){}, +// blockButton: true, +// child: Text("Small", +// ), +// color: GFColor.primary, +// size: GFSize.small, +// type: GFType.outline, +// ), +// +// ], +// ), +// ), +// +// ], +// ), +// ), +// +// +// //tab 3 +// Container( +//// color: Colors.red, +// child: ListView( +// children: [ +// +// Padding(padding: EdgeInsets.only(left:15, top:30), +// child: GFHeader( +// text: 'Default', +// type: GFHeadingType.typo5, +// dividerWidth: 25, +// dividerColor: Color(0xFF19CA4B), +// +// ), +// ), +// GFCard( +// content: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// SizedBox( +// height: 10, +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text( +// "Primary", +// +// ), +// +// type: GFType.outline2x, +// +// ), +// +// +// GFButton( +// onPressed: (){}, +// child: Text("Secondary"), +// type: GFType.outline2x, +// color: GFColor.secondary, +// ), +// GFButton( +// onPressed: (){}, +// child: Text( +// "Success", +// ), +// type: GFType.outline2x, +// color: GFColor.success, +// ), +// ], +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text( +// "Warning", +// ), +// type: GFType.outline2x, +// color: GFColor.warning, +// ), +// GFButton( +// onPressed: (){}, +// child: Text( +// "Danger", +// ), +// type: GFType.outline2x, +// color: GFColor.danger, +// ), +// GFButton( +// onPressed: (){}, +// child: Text( +// "Info", +// ), +// type: GFType.outline2x, +// color: GFColor.info, +// ), +// ], +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text( +// "Light", +// ), +// type: GFType.outline2x, +// color: GFColor.light, +// ), +// +// GFButton( +// onPressed: (){}, +// child: Text( +// "Dark", +// ), +// type: GFType.outline2x, +// color: GFColor.dark, +// ), +// GFButton( +// onPressed: (){}, +// child: Text( +// "Link", +// ), +// +// color: GFColor.transparent, +// ), +// ], +// ), +// ], +// ), +// ), +// +// +// +// Padding(padding: EdgeInsets.only(left:15, top:10), +// child: GFHeader( +// text: 'Button Sizes', +// type: GFHeadingType.typo5, +// dividerWidth: 25, +// dividerColor: Color(0xFF19CA4B), +// +// ), +// ), +// +// +// GFCard( +// content: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// SizedBox( +// height: 10, +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GFButton( +// onPressed: (){}, +// child: Text("Large", +// ), +// color: GFColor.primary, +// size: GFSize.large, +// type: GFType.outline2x, +// ), +// GFButton( +// onPressed: (){}, +// child: Text("Normal", +// ), +// color: GFColor.primary, +// size: GFSize.medium, +// type: GFType.outline2x, +// ), +// GFButton( +// onPressed: (){}, +// child: Text("Small", +// ), +// color: GFColor.primary, +// size: GFSize.small, +// type: GFType.outline2x, +// ), +// ], +// ), +// +// ], +// ), +// ), +// +// +// Padding(padding: EdgeInsets.only(left:15, top:10), +// child: GFHeader( +// text: 'Block Buttons', +// type: GFHeadingType.typo5, +// dividerWidth: 25, +// dividerColor: Color(0xFF19CA4B), +// +// ), +// ), +// +// +// GFCard( +// content: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// SizedBox( +// height: 10, +// ), +// GFButton( +// onPressed: (){}, +// blockButton: true, +// child: Text("Large", +// ), +// color: GFColor.primary, +// size: GFSize.large, +// type: GFType.outline2x, +// ), +// +// SizedBox( +// height: 10, +// ), +// +// GFButton( +// onPressed: (){}, +// blockButton: true, +// child: Text("Normal", +// ), +// color: GFColor.primary, +// size: GFSize.medium, +// type: GFType.outline2x, +// ), +// +// SizedBox( +// height: 10, +// ), +// +// +// GFButton( +// onPressed: (){}, +// blockButton: true, +// child: Text("Small", +// ), +// color: GFColor.primary, +// size: GFSize.small, +// type: GFType.outline2x, +// ), +// +// ], +// ), +// ), +// +// ], +// ), +// ), +// ], +// ), +// ), + + body: Container( // color: Colors.red, - child: ListView( - children: [ - Padding(padding: EdgeInsets.only(left:15, top:30), - child: GFHeader( - text: 'Default', - type: GFHeadingType.typo5, - dividerWidth: 25, - dividerColor: Color(0xFF19CA4B), - - ), - ), - GFCard( - content: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - shape: GFButtonShape.standard, - - buttonBoxShadow: true, - child: Text("Primary", - ), - - color: GFColor.primary, - ), - GFButton( - onPressed: (){}, - child: Text("Secondary", - ), - - color: GFColor.secondary, - buttonBoxShadow: true, - ), - GFButton( - onPressed: (){}, - child: Text( - "Success", - ), - buttonBoxShadow: true, - color: GFColor.success, - ), - ], - ), - - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text( - "Warning", - ), - buttonBoxShadow: true, - color: GFColor.warning, - ), - GFButton( - onPressed: (){}, - child: Text("Danger", - ), - buttonBoxShadow: true, - color: GFColor.danger, - ), - GFButton( - onPressed: (){}, - child: Text( - "Info", - ), - buttonBoxShadow: true, - color: GFColor.info, - ), - ], - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text( - "Light", - ), - buttonBoxShadow: true, - color: GFColor.light, - ), - - GFButton( - onPressed: (){}, - child: Text( - "Dark", - style: - TextStyle(color: getGFColor(GFColor.white)), - ), - buttonBoxShadow: true, - color: GFColor.dark, - ), - GFButton( - onPressed: (){}, - child: Text("Link", - ), - buttonBoxShadow: false, - color: GFColor.transparent, - ), - ], - ), -SizedBox( - height: 10, -) - - ], - ), - ), - - - - - Padding(padding: EdgeInsets.only(left:15, top:10), - child: GFHeader( - text: 'Button Sizes', - type: GFHeadingType.typo5, - dividerWidth: 25, - dividerColor: Color(0xFF19CA4B), - - ), - ), - - - GFCard( - content: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text("Large", - ), - color: GFColor.primary, - size: GFSize.large, - buttonBoxShadow: true, - ), - GFButton( - onPressed: (){}, - child: Text("Normal", - ), - color: GFColor.primary, - size: GFSize.medium, - buttonBoxShadow: true, - ), - GFButton( - onPressed: (){}, - child: Text("Small", - ), - color: GFColor.primary, - size: GFSize.small, - buttonBoxShadow: true, - ), - ], - ), + child: ListView( + children: [ + Padding(padding: EdgeInsets.only(left:15, top:30), + child: GFHeader( + text: 'Default', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), - ], + ), + ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: (){}, + shape: GFButtonShape.standard, + + buttonBoxShadow: true, + child: Text("Primary", + ), + + color: GFColor.primary, ), - ), - - - Padding(padding: EdgeInsets.only(left:15, top:10), - child: GFHeader( - text: 'Block Buttons', - type: GFHeadingType.typo5, - dividerWidth: 25, - dividerColor: Color(0xFF19CA4B), + GFButton( + onPressed: (){}, + child: Text("Secondary", + ), + color: GFColor.secondary, + buttonBoxShadow: true, ), - ), - - - GFCard( - content: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 10, - ), - GFButton( - onPressed: (){}, - blockButton: true, - child: Text("Large", - style: TextStyle( - color: getGFColor(GFColor.white))), - color: GFColor.primary, - size: GFSize.large, - buttonBoxShadow: true, - ), - - SizedBox( - height: 10, - ), - - GFButton( - onPressed: (){}, - blockButton: true, - child: Text("Normal", - style: TextStyle( - color: getGFColor(GFColor.white))), - color: GFColor.primary, - size: GFSize.medium, - buttonBoxShadow: true, - ), - - SizedBox( - height: 10, - ), - - - GFButton( - onPressed: (){}, - blockButton: true, - child: Text("Small", - style: TextStyle( - color: getGFColor(GFColor.white))), - color: GFColor.primary, - size: GFSize.small, - buttonBoxShadow: true, - ), - - ], + GFButton( + onPressed: (){}, + child: Text( + "Success", + ), + buttonBoxShadow: true, + color: GFColor.success, ), - ), - ], - ), - ), - - - //tab 2 - Container( -// color: Colors.red, - child: ListView( - children: [ - - Padding(padding: EdgeInsets.only(left:15, top:30), - child: GFHeader( - text: 'Default', - type: GFHeadingType.typo5, - dividerWidth: 25, - dividerColor: Color(0xFF19CA4B), - + ], + ), + + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: (){}, + child: Text( + "Warning", + ), + buttonBoxShadow: true, + color: GFColor.warning, ), - ), - GFCard( - content: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text( - "Primary", - - ), - - type: GFType.outline, - - ), - - - GFButton( - onPressed: (){}, - child: Text("Secondary"), - type: GFType.outline, - color: GFColor.secondary, - ), - GFButton( - onPressed: (){}, - child: Text( - "Success", - ), - type: GFType.outline, - color: GFColor.success, - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text( - "Warning", - ), - type: GFType.outline, - color: GFColor.warning, - ), - GFButton( - onPressed: (){}, - child: Text( - "Danger", - ), - type: GFType.outline, - color: GFColor.danger, - ), - GFButton( - onPressed: (){}, - child: Text( - "Info", - ), - type: GFType.outline, - color: GFColor.info, - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text( - "Light", - ), - type: GFType.outline, - color: GFColor.light, - ), - - GFButton( - onPressed: (){}, - child: Text( - "Dark", - ), - type: GFType.outline, - color: GFColor.dark, - ), - GFButton( - onPressed: (){}, - child: Text( - "Link", - ), - color: GFColor.transparent, - ), - ], - ), - ], + GFButton( + onPressed: (){}, + child: Text("Danger", + ), + buttonBoxShadow: true, + color: GFColor.danger, ), - ), - - - - Padding(padding: EdgeInsets.only(left:15, top:10), - child: GFHeader( - text: 'Button Sizes', - type: GFHeadingType.typo5, - dividerWidth: 25, - dividerColor: Color(0xFF19CA4B), - + GFButton( + onPressed: (){}, + child: Text( + "Info", + ), + buttonBoxShadow: true, + color: GFColor.info, ), - ), - - - GFCard( - content: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text("Large", - ), - color: GFColor.primary, - size: GFSize.large, - type: GFType.outline, - ), - GFButton( - onPressed: (){}, - child: Text("Normal", - ), - color: GFColor.primary, - size: GFSize.medium, - type: GFType.outline, - ), - GFButton( - onPressed: (){}, - child: Text("Small", - ), - color: GFColor.primary, - size: GFSize.small, - type: GFType.outline, - ), - ], - ), - - ], + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: (){}, + child: Text( + "Light", + ), + buttonBoxShadow: true, + color: GFColor.light, ), - ), - - - Padding(padding: EdgeInsets.only(left:15, top:10), - child: GFHeader( - text: 'Block Buttons', - type: GFHeadingType.typo5, - dividerWidth: 25, - dividerColor: Color(0xFF19CA4B), + GFButton( + onPressed: (){}, + child: Text( + "Dark", + style: + TextStyle(color: getGFColor(GFColor.white)), + ), + buttonBoxShadow: true, + color: GFColor.dark, ), - ), - - - GFCard( - content: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 10, - ), - GFButton( - onPressed: (){}, - blockButton: true, - child: Text("Large", - ), - color: GFColor.primary, - size: GFSize.large, - type: GFType.outline, - ), - - SizedBox( - height: 10, - ), - - GFButton( - onPressed: (){}, - blockButton: true, - child: Text("Normal", - ), - color: GFColor.primary, - size: GFSize.medium, - type: GFType.outline, - ), - - SizedBox( - height: 10, - ), - - - GFButton( - onPressed: (){}, - blockButton: true, - child: Text("Small", - ), - color: GFColor.primary, - size: GFSize.small, - type: GFType.outline, - ), - - ], + GFButton( + onPressed: (){}, + child: Text("Link", + ), + buttonBoxShadow: false, + color: GFColor.transparent, ), - ), + ], + ), + SizedBox( + height: 10, + ) - ], - ), + ], ), + ), - //tab 3 - Container( -// color: Colors.red, - child: ListView( - children: [ - - Padding(padding: EdgeInsets.only(left:15, top:30), - child: GFHeader( - text: 'Default', - type: GFHeadingType.typo5, - dividerWidth: 25, - dividerColor: Color(0xFF19CA4B), - - ), - ), - GFCard( - content: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text( - "Primary", - - ), - - type: GFType.outline2x, - - ), - - - GFButton( - onPressed: (){}, - child: Text("Secondary"), - type: GFType.outline2x, - color: GFColor.secondary, - ), - GFButton( - onPressed: (){}, - child: Text( - "Success", - ), - type: GFType.outline2x, - color: GFColor.success, - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text( - "Warning", - ), - type: GFType.outline2x, - color: GFColor.warning, - ), - GFButton( - onPressed: (){}, - child: Text( - "Danger", - ), - type: GFType.outline2x, - color: GFColor.danger, - ), - GFButton( - onPressed: (){}, - child: Text( - "Info", - ), - type: GFType.outline2x, - color: GFColor.info, - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text( - "Light", - ), - type: GFType.outline2x, - color: GFColor.light, - ), - - GFButton( - onPressed: (){}, - child: Text( - "Dark", - ), - type: GFType.outline2x, - color: GFColor.dark, - ), - GFButton( - onPressed: (){}, - child: Text( - "Link", - ), - color: GFColor.transparent, - ), - ], - ), - ], - ), - ), + Padding(padding: EdgeInsets.only(left:15, top:10), + child: GFHeader( + text: 'Button Sizes', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), + ), + ), - Padding(padding: EdgeInsets.only(left:15, top:10), - child: GFHeader( - text: 'Button Sizes', - type: GFHeadingType.typo5, - dividerWidth: 25, - dividerColor: Color(0xFF19CA4B), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GFButton( + onPressed: (){}, + child: Text("Large", + ), + color: GFColor.primary, + size: GFSize.large, + buttonBoxShadow: true, ), - ), - - - GFCard( - content: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GFButton( - onPressed: (){}, - child: Text("Large", - ), - color: GFColor.primary, - size: GFSize.large, - type: GFType.outline2x, - ), - GFButton( - onPressed: (){}, - child: Text("Normal", - ), - color: GFColor.primary, - size: GFSize.medium, - type: GFType.outline2x, - ), - GFButton( - onPressed: (){}, - child: Text("Small", - ), - color: GFColor.primary, - size: GFSize.small, - type: GFType.outline2x, - ), - ], - ), - - ], + GFButton( + onPressed: (){}, + child: Text("Normal", + ), + color: GFColor.primary, + size: GFSize.medium, + buttonBoxShadow: true, ), - ), - - - Padding(padding: EdgeInsets.only(left:15, top:10), - child: GFHeader( - text: 'Block Buttons', - type: GFHeadingType.typo5, - dividerWidth: 25, - dividerColor: Color(0xFF19CA4B), - + GFButton( + onPressed: (){}, + child: Text("Small", + ), + color: GFColor.primary, + size: GFSize.small, + buttonBoxShadow: true, ), - ), - - - GFCard( - content: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 10, - ), - GFButton( - onPressed: (){}, - blockButton: true, - child: Text("Large", - ), - color: GFColor.primary, - size: GFSize.large, - type: GFType.outline2x, - ), + ], + ), + SizedBox( + height: 10, + ), - SizedBox( - height: 10, - ), - - GFButton( - onPressed: (){}, - blockButton: true, - child: Text("Normal", - ), - color: GFColor.primary, - size: GFSize.medium, - type: GFType.outline2x, - ), + ], + ), + ), - SizedBox( - height: 10, - ), + Padding(padding: EdgeInsets.only(left:15, top:10), + child: GFHeader( + text: 'Block Buttons', + type: GFHeadingType.typo5, + dividerWidth: 25, + dividerColor: Color(0xFF19CA4B), - GFButton( - onPressed: (){}, - blockButton: true, - child: Text("Small", - ), - color: GFColor.primary, - size: GFSize.small, - type: GFType.outline2x, - ), + ), + ), - ], - ), - ), - ], - ), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + GFButton( + onPressed: (){}, + blockButton: true, + child: Text("Large", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.large, + buttonBoxShadow: true, + ), + + SizedBox( + height: 10, + ), + + GFButton( + onPressed: (){}, + blockButton: true, + child: Text("Normal", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.medium, + buttonBoxShadow: true, + ), + + SizedBox( + height: 10, + ), + + + GFButton( + onPressed: (){}, + blockButton: true, + child: Text("Small", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.small, + buttonBoxShadow: true, + ), + SizedBox( + height: 10, + ), + + ], ), - ], - ), + ), + ], ), + ), ); } } diff --git a/demo_app/lib/screens/button/social-buttons.dart b/demo_app/lib/screens/button/social-buttons.dart index 05f65dd9..895dd1df 100644 --- a/demo_app/lib/screens/button/social-buttons.dart +++ b/demo_app/lib/screens/button/social-buttons.dart @@ -53,36 +53,44 @@ class _SocialButtonsState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - + SizedBox( + height: 10, + ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded(child: GFButton( - onPressed: null, + Expanded(child: + GFButton( + buttonBoxShadow: true, + color: Color(0xFF3B5998), + onPressed: (){}, child: Text( "FB", ), icon: SvgPicture.asset('lib/assets/icons/fb.svg') - ),), + ), + ), SizedBox( width: 6, ), Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, child: Text("Twitter"), icon: SvgPicture.asset('lib/assets/icons/twitter.svg'), - color: GFColor.secondary, + color:Color(0xFF00ACEE), + buttonBoxShadow: true, ),), SizedBox( width: 6, ), Expanded(child: GFButton( - onPressed: null, + onPressed: (){}, child: Text( - "Whtsap", + "Whatsap", ), icon: SvgPicture.asset('lib/assets/icons/whatsapp.svg'), - color: GFColor.success, + color: Color(0xFF25D366), + buttonBoxShadow: true, ),) ], ), @@ -93,28 +101,31 @@ class _SocialButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Google +", ), icon: SvgPicture.asset('lib/assets/icons/google.svg'), - color: GFColor.warning, + color: Color(0xFFDD4B39), + buttonBoxShadow: true, ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Dribble", ), icon: SvgPicture.asset('lib/assets/icons/dribble.svg'), - color: GFColor.danger, + color: Color(0xFFEA4C89), + buttonBoxShadow: true, ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( "LinkedIn", ), icon: SvgPicture.asset('lib/assets/icons/linkedin.svg'), - color: GFColor.info, + color: Color(0xFF0E76A8), + buttonBoxShadow: true, ), ], ), @@ -125,34 +136,39 @@ class _SocialButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Youtube", ), icon: SvgPicture.asset('lib/assets/icons/youtube.svg'), - type: GFType.solid, - color: GFColor.light, + color: Color(0xFFC4302B), + buttonBoxShadow: true, ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Slack", style: TextStyle(color: getGFColor(GFColor.white)), ), icon: SvgPicture.asset('lib/assets/icons/slack.svg'), - color: GFColor.dark, + color:Color(0XFF2EB67D), + buttonBoxShadow: true, ), GFButton( - onPressed: null, + onPressed: (){}, child: Text( "Pinterest", ), icon: SvgPicture.asset('lib/assets/icons/pinterest.svg'), - color: GFColor.alt, + color: Color(0XFFC8232C), + buttonBoxShadow: true, ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -179,24 +195,22 @@ class _SocialButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFIconButton( - type: GFType.solid, - icon: SvgPicture.asset('lib/assets/icons/fb.svg'), onPressed: null), + color: Color(0xFF3B5998), + icon: SvgPicture.asset('lib/assets/icons/fb.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.secondary, - icon: SvgPicture.asset('lib/assets/icons/twitter.svg'), onPressed: null), + + color:Color(0xFF00ACEE), + icon: SvgPicture.asset('lib/assets/icons/twitter.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.success, - icon: SvgPicture.asset('lib/assets/icons/whatsapp.svg'), onPressed: null), + color: Color(0xFF25D366), + icon: SvgPicture.asset('lib/assets/icons/whatsapp.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.warning, - icon: SvgPicture.asset('lib/assets/icons/google.svg'), onPressed: null), + + color: Color(0xFFDD4B39), + icon: SvgPicture.asset('lib/assets/icons/google.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.danger, - icon: SvgPicture.asset('lib/assets/icons/dribble.svg'), onPressed: null), + color: Color(0xFFEA4C89), + icon: SvgPicture.asset('lib/assets/icons/dribble.svg'), onPressed: (){}), ], ), @@ -210,22 +224,21 @@ class _SocialButtonsState extends State { children: [ GFIconButton( - type: GFType.solid, - color: GFColor.info, - icon: SvgPicture.asset('lib/assets/icons/linkedin.svg'), onPressed: null), + color: Color(0xFF0E76A8), + icon: SvgPicture.asset('lib/assets/icons/linkedin.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.light, - icon: SvgPicture.asset('lib/assets/icons/youtube.svg'), onPressed: null), + + color: Color(0xFFC4302B), + icon: SvgPicture.asset('lib/assets/icons/youtube.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.dark, - icon: SvgPicture.asset('lib/assets/icons/slack.svg'), onPressed: null), + + color:Color(0XFF2EB67D), + icon: SvgPicture.asset('lib/assets/icons/slack.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.danger, - icon: SvgPicture.asset('lib/assets/icons/pinterest.svg'), onPressed: null), + color: Color(0XFFC8232C), + + icon: SvgPicture.asset('lib/assets/icons/pinterest.svg'), onPressed: (){}), ], ), @@ -262,29 +275,28 @@ class _SocialButtonsState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GFIconButton( - type: GFType.solid, + color: Color(0xFF3B5998), shape: GFButtonShape.pills, - icon: SvgPicture.asset('lib/assets/icons/fb.svg'), onPressed: null), + + icon: SvgPicture.asset('lib/assets/icons/fb.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.secondary, + + color:Color(0xFF00ACEE), shape: GFButtonShape.pills, - icon: SvgPicture.asset('lib/assets/icons/twitter.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/twitter.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.success, + color: Color(0xFF25D366), shape: GFButtonShape.pills, - icon: SvgPicture.asset('lib/assets/icons/whatsapp.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/whatsapp.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.warning, + + color: Color(0xFFDD4B39), shape: GFButtonShape.pills, - icon: SvgPicture.asset('lib/assets/icons/google.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/google.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.danger, + color: Color(0xFFEA4C89), shape: GFButtonShape.pills, - icon: SvgPicture.asset('lib/assets/icons/dribble.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/dribble.svg'), onPressed: (){}), ], ), @@ -298,25 +310,25 @@ class _SocialButtonsState extends State { children: [ GFIconButton( - type: GFType.solid, - color: GFColor.info, + color: Color(0xFF0E76A8), shape: GFButtonShape.pills, - icon: SvgPicture.asset('lib/assets/icons/linkedin.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/linkedin.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.light, + + color: Color(0xFFC4302B), shape: GFButtonShape.pills, - icon: SvgPicture.asset('lib/assets/icons/youtube.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/youtube.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.dark, + + color:Color(0XFF2EB67D), shape: GFButtonShape.pills, - icon: SvgPicture.asset('lib/assets/icons/slack.svg'), onPressed: null), + icon: SvgPicture.asset('lib/assets/icons/slack.svg'), onPressed: (){}), GFIconButton( - type: GFType.solid, - color: GFColor.danger, + + color: Color(0XFFC8232C), shape: GFButtonShape.pills, - icon: SvgPicture.asset('lib/assets/icons/pinterest.svg'), onPressed: null), + + icon: SvgPicture.asset('lib/assets/icons/pinterest.svg'), onPressed: (){}), ], ), diff --git a/demo_app/lib/screens/button/square-buttons.dart b/demo_app/lib/screens/button/square-buttons.dart index 3fbd52d6..a7f9331a 100644 --- a/demo_app/lib/screens/button/square-buttons.dart +++ b/demo_app/lib/screens/button/square-buttons.dart @@ -42,7 +42,7 @@ class _SquareButtonsState extends State { labelColor: getGFColor(GFColor.warning), tabs: [ GFButton( - onPressed: (){}, + onPressed: null, child: Text( "Solid", style: TextStyle(fontSize: 12), @@ -51,7 +51,7 @@ class _SquareButtonsState extends State { shape: GFButtonShape.square, ), GFButton( - onPressed: (){}, + onPressed: null, child: Text( "Outline", style: TextStyle(fontSize: 12), @@ -60,7 +60,7 @@ class _SquareButtonsState extends State { shape: GFButtonShape.square, ), GFButton( - onPressed: (){}, + onPressed: null, text: 'Outline 2x', textStyle: TextStyle(fontSize: 12, color: getGFColor(GFColor.dark)), type: GFType.outline2x, @@ -183,6 +183,9 @@ class _SquareButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), @@ -297,6 +300,9 @@ class _SquareButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), @@ -350,6 +356,9 @@ class _SquareButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -406,6 +415,9 @@ class _SquareButtonsState extends State { size: GFSize.small, shape: GFButtonShape.square, ), + SizedBox( + height: 10, + ), ], ), ), @@ -535,6 +547,9 @@ class _SquareButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -656,6 +671,9 @@ class _SquareButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -711,6 +729,9 @@ class _SquareButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -770,6 +791,9 @@ class _SquareButtonsState extends State { type: GFType.outline, shape: GFButtonShape.square, ), + SizedBox( + height: 10, + ), ], ), ), @@ -899,6 +923,9 @@ class _SquareButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -1020,6 +1047,9 @@ class _SquareButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -1075,6 +1105,9 @@ class _SquareButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -1134,6 +1167,9 @@ class _SquareButtonsState extends State { type: GFType.outline2x, shape: GFButtonShape.square, ), + SizedBox( + height: 10, + ), ], ), ), diff --git a/demo_app/lib/screens/button/standard-buttons.dart b/demo_app/lib/screens/button/standard-buttons.dart index 1e26bb04..775094d1 100644 --- a/demo_app/lib/screens/button/standard-buttons.dart +++ b/demo_app/lib/screens/button/standard-buttons.dart @@ -43,7 +43,7 @@ class _StandardButtonsState extends State { labelColor: getGFColor(GFColor.warning), tabs: [ GFButton( - onPressed: (){}, + onPressed: null, child: Text( "Solid", style: TextStyle(fontSize: 12), @@ -52,7 +52,7 @@ class _StandardButtonsState extends State { textColor: GFColor.white, ), GFButton( - onPressed: (){}, + onPressed: null, child: Text( "Outline", style: TextStyle(fontSize: 12), @@ -60,7 +60,7 @@ class _StandardButtonsState extends State { type: GFType.outline, ), GFButton( - onPressed: (){}, + onPressed:null, text: 'Outline 2x', textStyle: TextStyle(fontSize: 12, color: getGFColor(GFColor.dark)), type: GFType.outline2x, @@ -422,6 +422,9 @@ class _StandardButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -473,6 +476,9 @@ class _StandardButtonsState extends State { color: GFColor.primary, size: GFSize.small, ), + SizedBox( + height: 10, + ), ], ), @@ -538,6 +544,9 @@ class _StandardButtonsState extends State { color: GFColor.primary, size: GFSize.small, ), + SizedBox( + height: 10, + ), ], ), @@ -661,6 +670,9 @@ class _StandardButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -774,6 +786,9 @@ class _StandardButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -826,6 +841,9 @@ class _StandardButtonsState extends State { size: GFSize.small, type: GFType.outline, ), + SizedBox( + height: 10, + ), ], ), @@ -891,6 +909,9 @@ class _StandardButtonsState extends State { size: GFSize.small, type: GFType.outline, ), + SizedBox( + height: 10, + ), ], ), @@ -1015,6 +1036,9 @@ class _StandardButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -1128,6 +1152,9 @@ class _StandardButtonsState extends State { ), ], ), + SizedBox( + height: 10, + ), ], ), ), @@ -1180,6 +1207,9 @@ class _StandardButtonsState extends State { size: GFSize.small, type: GFType.outline2x, ), + SizedBox( + height: 10, + ), ], ), @@ -1245,6 +1275,9 @@ class _StandardButtonsState extends State { size: GFSize.small, type: GFType.outline2x, ), + SizedBox( + height: 10, + ), ], ), diff --git a/demo_app/lib/screens/home.dart b/demo_app/lib/screens/home.dart index add9f18e..2f3add5e 100644 --- a/demo_app/lib/screens/home.dart +++ b/demo_app/lib/screens/home.dart @@ -9,7 +9,7 @@ import 'avatars.dart'; import 'toggles.dart'; import 'headers.dart'; import 'toasts.dart'; -import 'badges.dart'; +import '../screens/badges/badges.dart'; import 'package:flutter_svg/flutter_svg.dart'; import '../screens/button/standard-buttons.dart'; @@ -505,7 +505,7 @@ class _HomePageState extends State { Navigator.push( context, MaterialPageRoute( -// builder: (BuildContext context) => Buttons() + builder: (BuildContext context) => Badges() ), ); }, @@ -631,6 +631,52 @@ class _HomePageState extends State { ), ), ), + ), + SizedBox( + width: 20, + ), + Expanded( + child: GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( +// builder: (BuildContext context) => Headers() + ), + ); + }, + child: Container( + margin: EdgeInsets.only(top: 23), + decoration: BoxDecoration( +// color:getGFColor( GFColor.dark,), + color: Color(0xFF333333), + borderRadius: BorderRadius.all(Radius.circular(7)), + boxShadow: [ + new BoxShadow( + color: Colors.black.withOpacity(0.61), + blurRadius: 8.0, + spreadRadius: 0.0), + ]), + height: 160, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + height: 10, + ), + Image.asset('lib/assets/icons/images.png'), + Text( + 'Images', + style: TextStyle( + fontSize: 20, + color: getGFColor( + GFColor.white, + )), + ) + ], + ), + ), + ), ) ], ), diff --git a/demo_app/pubspec.yaml b/demo_app/pubspec.yaml index fe54de5e..95424a34 100644 --- a/demo_app/pubspec.yaml +++ b/demo_app/pubspec.yaml @@ -37,6 +37,7 @@ flutter: - lib/assets/icons/toast.png - lib/assets/icons/toggle.png - lib/assets/icons/typo.png + - lib/assets/icons/images.png - lib/assets/icons/back.png - lib/assets/icons/next.png - lib/assets/icons/primary.svg diff --git a/example/lib/main.dart b/example/lib/main.dart index 2e97b8f6..5645cab7 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -190,16 +190,19 @@ class _MyHomePageState extends State // disabledTextColor: GFColor.light, blockButton: true, // fullWidthButton: true, - ), - GFIconButton( - onPressed: null, - icon: Icon(Icons.ac_unit), +// borderSide: BorderSide(color: Colors.pink, width: 1.0, style: BorderStyle.solid), +// borderShape: RoundedRectangleBorder(side: BorderSide(color: Colors.pink, width: 2.0, style: BorderStyle.solid), borderRadius: BorderRadius.zero), + ), + + GFIconButton( + onPressed: null, + icon: Icon(Icons.ac_unit,), // iconSize: 12.0, type: GFType.outline2x, // shape: GFButtonShape.pills, // size: GFSize.large, // buttonBoxShadow: true, -// color: GFColor.primary, + color: GFColor.secondary, // boxShadow: BoxShadow( // color: Colors.pink, // blurRadius: 2.0, diff --git a/gf_web/.gitignore b/gf_web/.gitignore new file mode 100644 index 00000000..ae1f1838 --- /dev/null +++ b/gf_web/.gitignore @@ -0,0 +1,37 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Exceptions to above rules. +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/gf_web/.metadata b/gf_web/.metadata new file mode 100644 index 00000000..361e1e4c --- /dev/null +++ b/gf_web/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 18cd7a3601bcffb36fdf2f679f763b5e827c2e8e + channel: beta + +project_type: app diff --git a/gf_web/README.md b/gf_web/README.md new file mode 100644 index 00000000..f4f9b0c6 --- /dev/null +++ b/gf_web/README.md @@ -0,0 +1,16 @@ +# gf_web + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/gf_web/android/.gitignore b/gf_web/android/.gitignore new file mode 100644 index 00000000..bc2100d8 --- /dev/null +++ b/gf_web/android/.gitignore @@ -0,0 +1,7 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java diff --git a/gf_web/android/app/build.gradle b/gf_web/android/app/build.gradle new file mode 100644 index 00000000..0c927f7f --- /dev/null +++ b/gf_web/android/app/build.gradle @@ -0,0 +1,67 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.gf_web" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' +} diff --git a/gf_web/android/app/src/debug/AndroidManifest.xml b/gf_web/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..56702152 --- /dev/null +++ b/gf_web/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/gf_web/android/app/src/main/AndroidManifest.xml b/gf_web/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..048a3923 --- /dev/null +++ b/gf_web/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/gf_web/android/app/src/main/kotlin/com/example/gf_web/MainActivity.kt b/gf_web/android/app/src/main/kotlin/com/example/gf_web/MainActivity.kt new file mode 100644 index 00000000..2735dc9f --- /dev/null +++ b/gf_web/android/app/src/main/kotlin/com/example/gf_web/MainActivity.kt @@ -0,0 +1,12 @@ +package com.example.gf_web + +import androidx.annotation.NonNull; +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugins.GeneratedPluginRegistrant + +class MainActivity: FlutterActivity() { + override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { + GeneratedPluginRegistrant.registerWith(flutterEngine); + } +} diff --git a/gf_web/android/app/src/main/res/drawable/launch_background.xml b/gf_web/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/gf_web/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/gf_web/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/gf_web/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/gf_web/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/gf_web/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/gf_web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/gf_web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/gf_web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/gf_web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/gf_web/android/app/src/main/res/values/styles.xml b/gf_web/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..00fa4417 --- /dev/null +++ b/gf_web/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/gf_web/android/app/src/profile/AndroidManifest.xml b/gf_web/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..56702152 --- /dev/null +++ b/gf_web/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/gf_web/android/build.gradle b/gf_web/android/build.gradle new file mode 100644 index 00000000..3100ad2d --- /dev/null +++ b/gf_web/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.5.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/gf_web/android/gradle.properties b/gf_web/android/gradle.properties new file mode 100644 index 00000000..38c8d454 --- /dev/null +++ b/gf_web/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/gf_web/android/gradle/wrapper/gradle-wrapper.properties b/gf_web/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..296b146b --- /dev/null +++ b/gf_web/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/gf_web/android/settings.gradle b/gf_web/android/settings.gradle new file mode 100644 index 00000000..5a2f14fb --- /dev/null +++ b/gf_web/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/gf_web/ios/.gitignore b/gf_web/ios/.gitignore new file mode 100644 index 00000000..e96ef602 --- /dev/null +++ b/gf_web/ios/.gitignore @@ -0,0 +1,32 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/gf_web/ios/Flutter/AppFrameworkInfo.plist b/gf_web/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..6b4c0f78 --- /dev/null +++ b/gf_web/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/gf_web/ios/Flutter/Debug.xcconfig b/gf_web/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/gf_web/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/gf_web/ios/Flutter/Release.xcconfig b/gf_web/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/gf_web/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/gf_web/ios/Runner.xcodeproj/project.pbxproj b/gf_web/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..6cd9af51 --- /dev/null +++ b/gf_web/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,518 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.gfWeb; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.gfWeb; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.gfWeb; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/gf_web/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/gf_web/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/gf_web/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/gf_web/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/gf_web/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..a28140cf --- /dev/null +++ b/gf_web/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gf_web/ios/Runner.xcworkspace/contents.xcworkspacedata b/gf_web/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/gf_web/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/gf_web/ios/Runner/AppDelegate.swift b/gf_web/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/gf_web/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/gf_web/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/gf_web/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/gf_web/ios/Runner/Base.lproj/LaunchScreen.storyboard b/gf_web/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/gf_web/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gf_web/ios/Runner/Base.lproj/Main.storyboard b/gf_web/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/gf_web/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gf_web/ios/Runner/Info.plist b/gf_web/ios/Runner/Info.plist new file mode 100644 index 00000000..f80a85cd --- /dev/null +++ b/gf_web/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + gf_web + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/gf_web/ios/Runner/Runner-Bridging-Header.h b/gf_web/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..7335fdf9 --- /dev/null +++ b/gf_web/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" \ No newline at end of file diff --git a/gf_web/lib/assets/icons/avatar.png b/gf_web/lib/assets/icons/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..685ad1a33fb89afebf2bca791ff0a6df0545dcb0 GIT binary patch literal 793 zcmV+!1LpjRP)TM^6A(_| zZ~|SJ(VcNgSR|YPTxCi(VPTcUPoCA21d?H&S(3J(e7BN+bg{5Ou>m0OvLJwgsAjkl?AYQ{fuA3| zd7A@wNiI18&V)%i8A6*s%AY?b%})d_98|YSZrueiK1bAc(&=vi7dkbcz?v0QI1&-v zC50l0m$rC8e&_}3(=ju^Stk{AI+W`1^hMV~`UIb(Z9vjaSPr%)|F3|}U(*mi!Y z;k&duyY2i4IAZVFLf1+p;izA3jY}wbdy5CPo-OT$aA7%Ej;_djvQj***S)?Mn6gS8 zF8r9Jd<5L74s7>xpTMTh`(EoQ3x}%}N?)@}N4>rmlx%TXsh-TefJ$8KRGR=dvVnoW zCD%2E_E_jt+XP>^0Gl*jYPgE^-{_j2*^QaTFcuJ?c-=4@w-5EW*r~}i z{66FUBXCC1PoGlKcaUvJCm>Fuf5H+>2a_r!UpQq&ILaiK(Ps!vJRJIA>B|T#WfZ!v zmvEM=gJ@WFJ0h2*oCNIup8wStl-dKQlZ=BR2|j<^Oz(2q_y;YIZeDRfOdr@^G0(Ak8yb*`4CqrnTP5`Uq%)+zD4cwXJ}M zs})FF1S&Vknr3|_fwpFD90YRkB@75fW=~*|L>@!b(;Q4vh5UPa8$0RbfLVsV=`4e> z+!`Vcp~kHY{q!2fk7Y?P0018d1^@s660l}|00004b3#c}2nYxW zdb6^e*pqCydxgXtzaJ2NuD4MCgi4_i;}X<*)a zpZ&ghZ{`sUeAR08xRmk&A!HAL&4YUh*DWdKB7mFqdi`=Qzigb)d1 z{%J-jg<%+PDW$JH&zsd2J%|Qy&JTrQIG#EBZ;qyEE;GiSd7gKkxUQ>HbSVge(s}`+ zIJsO-E4r#7uQ=y3f0LqNKgSq@X__xcrBYe(eLu?~#|kHez_#s{hA7|nV;!;@IF5t= z5J(f~juSXdH8PW#)1?8;Qx-Z!hRJy!x$nb4nIMt@%`+DKodz~7hS>I~3nGV$NexjH zXr8vPI%OdLF2uyc(EyE31<`;nCoQyh8yH&(QMexuNCiy^}bhZ*S=A2&H79MnwUrHz=?V0!!1dUk-iUEa% z4)PyIl+=K}#7ZI`zev$IXZK#A!rczWKE;DlLo{r42SxL&4JcsyoerGOqd}P<8r0s! zdi_E;FnMhQIzCEWdy1j8-&p^SkFD1=3^J!H4eXynHvWw-m&-3X=Le;XulY1-(zg9+ zrCcr_Q%YS9f?zsrkT`qGvfeYsuJmp?*L80RA&zj)x5POn-TyT~KJh&7V*fgIUH7(> z@_-OxTBlB_(Qo%!Fg<7KS(s9)6+G8~{wy3hxUPE?z#JiDZ`P?^DfNa@dZSjWJ&of2 Y1l_DPecer{=Kufz07*qoM6N<$f*pM-!vFvP literal 0 HcmV?d00001 diff --git a/gf_web/lib/assets/icons/badge.png b/gf_web/lib/assets/icons/badge.png new file mode 100644 index 0000000000000000000000000000000000000000..5d233517133f8a7431135cf6b18ff0cb79cd82a2 GIT binary patch literal 687 zcmV;g0#N;lP)_Z6im2t`Dp8FeAnh1lL$tS=zAF_UguH@c9_CwJ=7qaP|qjsoLcm z5#K;Sm3BS=I7)DLoKXV&AY`R#d#8*hanKDXd9f2@1aDvk@~mciHxmU_ix(WEtosyZ zdX1a_HKs6`EU0##61>t1dFOBux78(#e4NG^5=$ zlgX-G?t5V!TpS;>EY1>Cjjn#n&Tn2GsuY?GH&rjFUuQM_ zo@wVop7pcy3r(O&Zu5HiKoPm?=e$y@wq@fS7{RE?Y%eeUTN;x|04tzXYIQQ2<2Pg$ V3)L|2v2FkW002ovPDHLkV1hpiB)6{ z04@;{0vPQaAr%4ZfLsV+-OXN~)>lsIevhZ0g|ACybXKqnGUaD|Z;go6BC@|@h03UX zLxF_L@0ZXtb_s4e2MOeqq$OabEq2{8qQK732oVw$krcr-*Pc8AcDApAGmP|virxy}C)z#w;peK%S(aezC^*Z++ zkghupH4%`lTC9+NqWyc@!zFW*pmI0bVz0a1)B~a^Y|fNbOiYrA{)@PnsY{@};<)@D zkWw;FU_-@3HC`AmO~<4yQZy|UGXfmcV#hioH4t4Vz_QMcfE^tbn7XhvgBy2&>jNi? z2F-cl>$3kteQ!ZlR0+^PdI&|bwRj;j>ViFbUBNtPZfG_+!Q1r!)lKG`3xCw6o50m8 zKXt+}DlXuI=7s@r+pWfqNhecO#jM2&iBW8*?~?$c&ncNFssgJFV%Q1NF>1!7fH*Zv z1uY#^LcXi5emVKCjGTQ;P~^LQzak~Gte$cwdjBU7CtH<-V5F23Wn2Y}9}ts_5uLGJ z`%?s@n5=+Uepc5A&Zj3>rzU-;rl3ttiJzKB&n*L#z;%liuezdHY%Ofw%wFZ)GN6BM zY#GpbfO^8ns>TcJev8{<)EiIE`=TSH$ZX>eCY1=HX@eH**l|j?9jk$7<;|G*+cgXZ8;4x@3f0T z$=%Lg@B5LG3Y2a+TfuFI1sxMKQeK+JM-x7i(QQU|2yh}0i;zkiyu8 \ No newline at end of file diff --git a/gf_web/lib/assets/icons/card.png b/gf_web/lib/assets/icons/card.png new file mode 100644 index 0000000000000000000000000000000000000000..79543ea64e8f7e17a74064a76bf5605858cc1faf GIT binary patch literal 424 zcmV;Z0ayNsP)(QvZzwv}(+ zKG*_kIM%b!Uj|12p1)wn!3}K#H9SU82V3_Sa>~}NsPk-7iaKSTvQrAUt*a?JIAz;W zmVmrV+|*<>jC)E&6kV4%$7HcgS3-d0LvYOmA-!+(34^g^xdBZRw*{^;im-BIu zoEWZo>;GC`DXe)=RTL3<%)3eFXNUCP`Wa!vfdIz@SF21YB5~eLqHoyw>Suzj0@(ID zzieQ8ZXl4C=|tvoLc|s(GG`!rMIy6MS(o3gaD~sx5g=hZ3T%#oHBQ}Nl0iNKVq+R?KG&;Ciy<(Xq}Rf z*x#g$t5ExBzxO`x^ZC5*vyHF|F5Cqi!6*5DaoKm$cd~;N@W-`-%yMkichYyVgB0+` zwS&y^7mq)#{+{L7*E%XcX@gjOCTTt!4mQiQV^5Z#cNlBt)`BJ%E5xp-V_E56%3+Q;&;e zSXWOV!Kso!$)#x8;3?eBm`Fw)27oCB_`ap2K6b-$CE1@j@_IlB9L+_wSKNwu{an=5 zuZZBRrD$I|VLOr(v++2T@NIKMQ@tj@ix<(=3nhdPZbr558s#{WjOc1U7YaQHhrijV zEwEo#hXRC;+4oCGSC?dMfw!^kj2oCA>tU>P)0DN|rb&i%^)zGb+oh3NtundKi1l?B zLQ@D3tGrJDbNN00Bv+-m)$Js~Q!A{;#{l42OHQAv7vIpyh@M!<3+sa`!{6WDOe_=J z=rIs+uwF4Dx}NV^le{MSK<2r9z1V#%C#UvvleAwKti*ma6|IU)L{~oqz!T2u(&?P6 zove(BWD_R|XfKZ|bz_3;j491tcgm0G>Wy_qPu?0y|6Utc*U4};@q)nUjhvz#t7KvDoqH%N(HUgJSCG}{vlg*z=ds*FI42=_`KAtJ48`H%m+|OiU zaUBXz-I6c-#zoQ&5;N-U;@;qazYd+dQ?p$c5b==)+jTMDwKnASb}b9J5&AW!q#owp zu4R(C`bh!UQLBO>p0gBl~(UenxMzPMHb(zs5A$!e~wU=DMb|}E< z)v?)<>tBed$KN7?VM|HBxkEe}!isugf`I*G$>~p>dUGXdCr2`gcM0fKArLtJ=kWP! zJ55&9j~qq_OfrBkELnTctsgFuc9DVku|up>nq&x<1cXHbG}c(&xT9QLb_3b!bNk!0 zN9dLiNCJij0U=gmczkJO<`=Av0yWREyX@FS8OToZqn9CZUx<=T%V*zLbn~pce3pgdj#M+ z>5 literal 0 HcmV?d00001 diff --git a/gf_web/lib/assets/icons/danger.svg b/gf_web/lib/assets/icons/danger.svg new file mode 100644 index 00000000..dea91e14 --- /dev/null +++ b/gf_web/lib/assets/icons/danger.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/gf_web/lib/assets/icons/dark.svg b/gf_web/lib/assets/icons/dark.svg new file mode 100644 index 00000000..a5e5eb1b --- /dev/null +++ b/gf_web/lib/assets/icons/dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/gf_web/lib/assets/icons/dribble.svg b/gf_web/lib/assets/icons/dribble.svg new file mode 100644 index 00000000..dbaca3b1 --- /dev/null +++ b/gf_web/lib/assets/icons/dribble.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/gf_web/lib/assets/icons/fb.svg b/gf_web/lib/assets/icons/fb.svg new file mode 100644 index 00000000..e6078c98 --- /dev/null +++ b/gf_web/lib/assets/icons/fb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/gf_web/lib/assets/icons/google.svg b/gf_web/lib/assets/icons/google.svg new file mode 100644 index 00000000..d837859e --- /dev/null +++ b/gf_web/lib/assets/icons/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/gf_web/lib/assets/icons/images.png b/gf_web/lib/assets/icons/images.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e4cb024692a2f438d9fbf794faa6aa01820fa4 GIT binary patch literal 840 zcmV-O1GoH%P))Qd500004b3#c}2nYxW zd3m6vw~sNC9E6#*kbmbaF8Y8m@_hwqfFG;$ldgw4;dw zPL74YKn4@ts4H=Bkb}ig9ZY&e#7Q@CFkGT0b+9F1@0s6~!%J!JuJ^kZA#`ki_j~X2 zzQ6B#ze_1)<`_r(L&pkYOIxC&CWtG*z7i)8ha};N5{Fdy17W3=NSXR|W_kePvtas3 z#80*~<83bir63#tpa9~h*2MA)b#3Z4nC=rW*Gmv72(_GBgkmoW0JriEh^80sj zsUZhp>aQ)$m~2i~ZS#Hey215pqse-5q0(2$Z(n)$H7c|mgrpK`S>Gh0QGmbI64i^9 z@lquUh!lj3C)Bb&3qk=*HW3tnH)@G$HVTLogs57S?xe2W%n;Ih*W_2eqv;CY%5lIAAvmK0T27^R~Xa^vY5he!PVwf?3$ejm41`Pwk ziTb!TzOw0E8wtV>VE;B-p88CrTww4IOEX5I0*L3Fcss)-5H7d6o^%Wm20#Qp^M3Nu zKz+ajFaT28w$!k2UXbS2+Yv-qfPZT24Yxg$hfTQMI;V~A49#r!SLeNhGBiY|03HzM zx-IJq-*z0P#YP2iO}=+yt+X*t<-JRkJ*o}QoAi7c2D0?1IBFZNJ%QMH~@2 + + + + + + + + + + + diff --git a/gf_web/lib/assets/icons/items.png b/gf_web/lib/assets/icons/items.png new file mode 100644 index 0000000000000000000000000000000000000000..1a495321c667459f84342e08f9e41a732582af84 GIT binary patch literal 967 zcmV;&133JNP)n1#cMUQ|ZB+36p zWvQf8a*jM8!*!0t3WO?^luFK#2V}U;kyx_u$Z&mB;hMXAyTZN977?;wDhl!h=oYv| zigjkJe`}@LA%WqVyLev&^F9GKF~7xt2BJe_&+mdFVEj?XEOA9mgFppuYMK2 zo;s;DewD9+jH~Wqr`QL7?~J8W0=;pA72#{B^-Vt#`DU4CNzgglY^(Jb6C`uZ(k_8M zdjVkOZq;329HK2RMVa}~C^Qbd&Uzq{XsdNQQU~EG06*(3{{)boREB>TYQwYm2|#N>82WiJx+i~8 zt}xi6GKa8vV%4S@JYtY^v=NQ}KF%YBo4a6%P$lN?Q;EZT)-E)*lIiYu_JqSY z#-dgA%LThv-Y!)@sCe~D-<-5~qE&@PMgWdzO1i46O;EAcq9(d1M7YgpMD%KK;gp^a zB^z^tf1mW}aY5%#^x7%Th>1Va_OSsycV21@l?WfS-8baV%Q~DK6_IeGT(6|zMKVTG zybcyf^uA%cxKTPgVL+W3_J}~cLtFl6sEukQSI>CU#8b=T6=E`@Vif8%FDxQN!PqCF zl@aIE47ENWJYx=_$9q1SeV$t;1G@P3U}95zgAgF5o$)G}l43K;-1lcdj9y?Ig}P~M z1Al6(jY>S5+3ybi;}LD4w{QUPw)Zcm$uy~v1dCKMiTBcEE0s)> p8cDE7C6jnBO}0|WG^vpU%U>a2cu7rv`Y`|i002ovPDHLkV1i|1#3uj% literal 0 HcmV?d00001 diff --git a/gf_web/lib/assets/icons/light.svg b/gf_web/lib/assets/icons/light.svg new file mode 100644 index 00000000..bf6f73a6 --- /dev/null +++ b/gf_web/lib/assets/icons/light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/gf_web/lib/assets/icons/link.svg b/gf_web/lib/assets/icons/link.svg new file mode 100644 index 00000000..9260d523 --- /dev/null +++ b/gf_web/lib/assets/icons/link.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/gf_web/lib/assets/icons/linkedin.svg b/gf_web/lib/assets/icons/linkedin.svg new file mode 100644 index 00000000..7adb1746 --- /dev/null +++ b/gf_web/lib/assets/icons/linkedin.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/gf_web/lib/assets/icons/lists.png b/gf_web/lib/assets/icons/lists.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e9317457760454f2406cd12028a6d0df04e110 GIT binary patch literal 638 zcmV-^0)hRBP)gLp35vm6mt7aD&C!!)EAKYAO5h%V=tG{M9_Pxy zc4T`Co#Db67Jo3&R5V^c$qQup$NMTV9|LGMY;WLMxQ6ZJZlkIEE6n5E+hy6IL0+n7 z;6$a2EHkE8X<3#-cafQg&z++$8DoPIIDpn7+Z%ZmaOKc#66j4@uuts=iBzr?Gz~Zg z|A}nB<7=TbTp9o`9mBvGpL?lx66_}}OW|_>eFpPcZh?5MuLr{*Ia_RNryIY#^ec}|n=LqPOkDjope~}44Mkl#Y9kpqW8!KRr6ih>rI^ONUb6ZB z``zog9wjce^<4FCF`=5~r(hL}PTc#t?E1U%gJda2?(TTSnLGm*XSTA`R_n^$ Y0fD^-R(*LN+W-In07*qoM6N<$g6pp;W&i*H literal 0 HcmV?d00001 diff --git a/gf_web/lib/assets/icons/menu.png b/gf_web/lib/assets/icons/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..0932d5f5bfc9d96a84c2bf650274ae49fcbcdde1 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^Rv^s51|%Qu_R;`SEX7WqAsj$Z!;#X#z`&^E>EalY z;rw=np;(iFfQ$L|hTs*xI#-7{zIXN;R8@@a=t z4Oj0!=}aNji$1~+UZiooTbu)D_vtJ5>A9Ov4GNb)S9BHV)nQ9(5Z=wWbw3^2-+fy)Ax9#q3&sS@jt!RGX!AO;&lHE#mErTDJHi zoA6ra&jN+jXVp$$JyQ7TFXPMq&4K?66dLumsr{XQaj)#rlX-?mXB`WicX?xTpRmm? zDcNaR8CQgQMWQ@RT)U=K9dM~UyuonWm-`ok)&*4@-th6oqT7e{mA5RsT56ItwI@ux tGi&nZDECESCo@VXt}wG)U8;gzSYNBe&RW93N*@@G44$rjF6*2UngB<4n?L{n literal 0 HcmV?d00001 diff --git a/gf_web/lib/assets/icons/next.png b/gf_web/lib/assets/icons/next.png new file mode 100644 index 0000000000000000000000000000000000000000..8d3c89d96e5398f6105ddf47d3c1edf78c30f97a GIT binary patch literal 708 zcmV;#0z3VQP)P0018d1^@s660l}|00004b3#c}2nYxW zdW=rhFISsrw z?=$bsydMPHR;g5)4a0DbbACdSBxAcwWFLlM3&3Xp%hhW2>F^90Zfx6L@qPca=Xo=} z?}KwLVt0oQAq13Cq|@m&S(e|`YPGA8LJWxjp68wK^?Fl@E$?z5lgTtxRef2j)vl02 zp)kuBTWq)6Gvfjb?dZC`rYOqo2(sF4x6d-h#?64DDA0BN4Y6&z={SzDmp2%7D@l@& z%jH_6SS<2JqcKW<&+>dekN*t94pPYLJ|sVR)P%z2Po=PNBMarb4|BN*DM$tqf^Z3N zFB=$~)S!InBm1BQ5{iR_Ad$HUP*WAmGT|b)ozi{ht#-28St}g~|90viICLZ$y?bgdL)Au9@KA z$lh;4{U!#8E+GVoGk!4(qyTfN3GJ&mKo~O2_=(kD(CWz>n~*0WaUXl0B!%vuC;QUl zZQFj^>2%Kh>uKc@W9(+9)0s{h?@{`OVboPsy%m>G%d#F027?RTZZ|*bpr|~WAT>>U zR;^a&x9YTIS&xDsIOBQVbPxmx!vyW`4>_8%WLb`8;X0-Cbp(h+JDNeEP`C)7Ob9sz qAn{ZWpv5`=C`r;%rBZo5^!hhAQ9*r(t;8$<0000 + + + + + diff --git a/gf_web/lib/assets/icons/primary.svg b/gf_web/lib/assets/icons/primary.svg new file mode 100644 index 00000000..c2ad37e4 --- /dev/null +++ b/gf_web/lib/assets/icons/primary.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/gf_web/lib/assets/icons/secondary.svg b/gf_web/lib/assets/icons/secondary.svg new file mode 100644 index 00000000..56c06ebe --- /dev/null +++ b/gf_web/lib/assets/icons/secondary.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/gf_web/lib/assets/icons/slack.svg b/gf_web/lib/assets/icons/slack.svg new file mode 100644 index 00000000..ed08c2a0 --- /dev/null +++ b/gf_web/lib/assets/icons/slack.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/gf_web/lib/assets/icons/slider.png b/gf_web/lib/assets/icons/slider.png new file mode 100644 index 0000000000000000000000000000000000000000..03fb809b9aa1fea41cb8ca9cb2515be10f2d7323 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^mLSZ*1|)kVnp=SsOR)rc0u2aJ0hLgoBaFF*DU5t@H@(KVw3!R#|O8a#>Da2A^6 z#+4AR9C0>Gk<(L|b;D{w9kY2>xu-8S->_T1KI6-;ZxYUF!8I9MJ?i!bf1A2*x6zZm z@(w`{qTgr{!f*vZL^PJn2 zvMF4xI`%`+&Nbf0pL@NuXFmD2eOmg72|jGD6HFRJvIHk7&gAJ*$YjvGqNL(%Bq`!} ki6Ll(t4CXkk%kpx@PiBQtY7@w5A-90r>mdKI;Vst02vEyX8-^I literal 0 HcmV?d00001 diff --git a/gf_web/lib/assets/icons/success.svg b/gf_web/lib/assets/icons/success.svg new file mode 100644 index 00000000..b06b4ae5 --- /dev/null +++ b/gf_web/lib/assets/icons/success.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/gf_web/lib/assets/icons/tabs.png b/gf_web/lib/assets/icons/tabs.png new file mode 100644 index 0000000000000000000000000000000000000000..49678a20998ec923e9c7d9e2feaeb946e5403749 GIT binary patch literal 581 zcmV-L0=oT)P)gq&Sg9uv7S^S(Q!o)vqDO!ez)jRdh)Z08 z3-AWGqKO;b8emM3RtPP94T&;zx-8T3|MSh8_ojpdT$BKhP?PIISxG8MK^f3;6$ERc zR3)h-1!X|XRS+y~JX)?=u7Wa1@cvFY9PNxB9% z$hwngEJ!mG*0 z>g6&=JgNfZHnW+FnR`RRb=1;`t0R_4FL;rODDvr6u?xa+_&d1Uw;S0-{}ETm-cnU0TJ^0CS_ zdVl&oI)#}S?~^001#KhD{5B+%mft65b;L3$^=KDqa$U}@4E}WN#&}!|nnLaegi2Hi zts>>g6jB9IDR2r<Pe`S~(Hw*WE(+FnIkQJP$WAgdhsWgzNd$-j%A9Ziz2CQY&= zAx23`pk$&^Nt$FyLX47>K*>a-k~GPZgcv0$fs%kQyk$h$`j{Oo6BZAr%n?yh-2*u%7_l1TqtA zsECtPD24L~bk7NtV$}H!GZ{=L`MWj@1Wknvem=VUhkmZ!3j&na{H0XRH7@t<8wrZ9d@|B9^_S&jxtER2mg#Lil zJ2;`hYOAKL+W!cwr17Q@+hy-sZco9tZj}5m_ws%JRwB^{IN%6^pH%>Ycu$~dLQWMh z{1qSJFPLp4jVb_#?e`)9!!*7oxL^Zqb|^Cg*pGSpr(R?R2Z0_S1s}bk3_}tZW(DmJ0u4&p#+UPJ!WiW`>k-YOQ7)T9j9ZgW zO7S*02D$$%qg<}Tcx3@i`)3)(%N_n3r{n>Ey6tPA3}~J?FlgA$wwb=1C0gd7)38;* dX+*tBpZ8^P^+<@#T)6-M002ovPDHLkV1k<+DG&ev literal 0 HcmV?d00001 diff --git a/gf_web/lib/assets/icons/toggle.png b/gf_web/lib/assets/icons/toggle.png new file mode 100644 index 0000000000000000000000000000000000000000..f33816f91a6e58020b03c9d8b5d6ab9df3cd387e GIT binary patch literal 998 zcmVNklVH4bU3G5>jojW= zo%g=ac~9NC)r2+jqcy?_1NyTiZ4xz!uF?*e(Osp%Eos{%Y7$+g9WbN2N`o_-kr`bx zy5H-->qE^>dAf_3yMoJ1G%i}#k7N6tnMP@t*61d4edma*egJI*t^%}f9*iptN&qMU z@|JLi2UZ$b3A8QOlS)ui7Csi(A5#DrR^6 z=iVPzX_jhDXiz8by(7?O)rA(;F<}zm3#wYgRGjhopNZYsTv&}zp!2&c{YjwKu)?+O zlgzUqenw1>RrDBe0CWA+~FI_p!iXn5kZPn zYcuGMuRXd2?_QPVUs}&-V8Y2|1X0Yd7x2GDH@i(2vc2H-*b*m;>1?mot~&>s&zuGL zL|g|3W}XJ*d66DDqXQa1T1=;fCH5orVpbb;9@Z-ns9nd{=UQe=!qPedZULbalDTM? z4%UMV)~&l4eKyxN+WT9Rw4dv~Pnp@5@NZbKOR7y{;x|?Bc&%r0v36+CpfH*1?I%iH z(fLdR_z&S`Z>vJ8)8#f78V9u&=obSI_avMREjtMIjyX{HFU8J{V{se?;($~h-MAKCPMvrXT~5b}YZ*|* z#x-o2Nwi_3Q8Z=}Rcu_tmYGBwHX21^CQ-%4HEfwlv|*!BG-eW2Y+S>Zt(ips2ePF) UN{w3V-2eap07*qoM6N<$g7Uo4Pyhe` literal 0 HcmV?d00001 diff --git a/gf_web/lib/assets/icons/twitter.svg b/gf_web/lib/assets/icons/twitter.svg new file mode 100644 index 00000000..ac962749 --- /dev/null +++ b/gf_web/lib/assets/icons/twitter.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/gf_web/lib/assets/icons/typo.png b/gf_web/lib/assets/icons/typo.png new file mode 100644 index 0000000000000000000000000000000000000000..905923625485877f89657e7b06189d8655c5ad99 GIT binary patch literal 719 zcmV;=0x!x)X5MY0BG3}sTdd- zC=xqG>=3~V6p5G#HHaw=Qj<4eA{Gn;2?0_`K6H%&wv#%(t(v;Rma;_mocr^4zkAR1 z5gemOju9(T*uz?_RN4PR*`@c@^Bj&IL!?IVrdzb1`CmLSHZYu(JAm93$bte)EbO`V z%EOFg?veZe;GKwEODwEX(r8znxMuT~;aF<|d75b0u{TrL!#bWKm0ffy)R~yzTeoPJ z!ZAkM+7OZZTDe5Z?((aaKPD2^aI6-Hyog+wIT6u=u+=Zx^$A$VS_QBwkV~`j5c~?D zI|S;Vi*`3Q?08^qr<6OndwOf?WP6I@Ts2w?nXNZqaT;<f3JrhS4*ns!bdk86HAb}Fi7)9Ygp4CH)9-YF@ zyWGZIz1g0f^F`)Bo}I@ + + + + + + + + + diff --git a/gf_web/lib/assets/icons/whatsapp.svg b/gf_web/lib/assets/icons/whatsapp.svg new file mode 100644 index 00000000..992ff345 --- /dev/null +++ b/gf_web/lib/assets/icons/whatsapp.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/gf_web/lib/assets/icons/youtube.svg b/gf_web/lib/assets/icons/youtube.svg new file mode 100644 index 00000000..b2503883 --- /dev/null +++ b/gf_web/lib/assets/icons/youtube.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/gf_web/lib/assets/logo.png b/gf_web/lib/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..27e5cae095f2b8c9a7149a417fb55de77c63d705 GIT binary patch literal 2841 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 literal 0 HcmV?d00001 diff --git a/gf_web/lib/main.dart b/gf_web/lib/main.dart new file mode 100644 index 00000000..c06d0f7f --- /dev/null +++ b/gf_web/lib/main.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:gf_web/screens/pages/home.dart'; +import 'screens/layout/routes.dart'; + + +void main() => runApp(MyApp()); + +class MyApp extends StatelessWidget { + // This widget is the root of your application. + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + debugShowCheckedModeBanner: false, + + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: HomePage(), + + initialRoute: "/", +routes: routes, + ); + } +} + + +class FirstScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('First Screen'), + ), + body: Center( + child: RaisedButton( + child: Text('Launch screen'), + onPressed: () { + // Navigate to the second screen using a named route. + Navigator.pushNamed(context, '/second'); + }, + ), + ), + ); + } +} + +class SecondScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Second Screen"), + ), + body: Center( + child: RaisedButton( + onPressed: () { + // Navigate back to the first screen by popping the current route + // off the stack. + Navigator.pushNamed(context, '/third'); + }, + child: Text('Third!'), + ), + ), + ); + } +} + +class ThirdScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("3 Screen"), + ), + body: Center( + child: RaisedButton( + onPressed: () { + // Navigate back to the first screen by popping the current route + // off the stack. + Navigator.pushNamed(context, '/fourth'); + }, + child: Text('Fourth!'), + ), + ), + ); + } +} + +class FourthScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("4 Screen"), + ), + body: Center( + child: RaisedButton( + onPressed: () { + // Navigate back to the first screen by popping the current route + // off the stack. + Navigator.pushNamed(context, '/'); + }, + child: Text('Go back!'), + ), + ), + ); + } +} \ No newline at end of file diff --git a/gf_web/lib/screens/buttons/standard-buttons.dart b/gf_web/lib/screens/buttons/standard-buttons.dart new file mode 100644 index 00000000..a6d8eac3 --- /dev/null +++ b/gf_web/lib/screens/buttons/standard-buttons.dart @@ -0,0 +1,442 @@ +import 'package:flutter/material.dart'; +import 'package:gf_web/screens/layout/layout.dart'; +import '../../styles/styles.dart'; +import 'package:ui_kit/components/button/gf_button.dart'; +import 'package:ui_kit/components/card/gf_card.dart'; +import 'package:ui_kit/colors/gf_color.dart'; +import 'package:ui_kit/types/gf_type.dart'; +import 'package:ui_kit/size/gf_size.dart'; + +class StandardButtons extends StatefulWidget { + @override + _StandardButtonsState createState() => _StandardButtonsState(); +} + +class _StandardButtonsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Layout( + body: ListView( + children: [ + Text('Standard Buttons', style: hintStyleTextblackbolder(),), + SizedBox( + height: 20, + ), + Text('Buttons of type Standard which comes in different sizes that can be used in forms, alerts, and more...', style: hintStyleTextblackdull(),), + SizedBox( + height: 30, + ), + Text('Solid Buttons', style: hintStyleTextblackbold(),), + GFCard( + content: Column( + children: [ + Row( + children: [ + Expanded(child: GFButton( + onPressed: (){}, + text: 'Primary', + textColor: Colors.white, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'Primary', + textColor: Colors.white, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'Primary', + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'Secondary', + color: GFColor.secondary, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'Success', + color: GFColor.success, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'Warning', + color: GFColor.warning, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'danger', + color: GFColor.danger, + )) + ], + ), +SizedBox( + height: 20, +), + Row( + children: [ + Expanded(child: GFButton( + onPressed: (){}, + text: 'Info', + color: GFColor.info, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'Light', + color: GFColor.light, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'Dark', + color: GFColor.dark, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'Link', + color: GFColor.transparent, + )), + SizedBox( + width: 10, + ), + Expanded(child: Text('')) + + ], + ), + + ], + ), + ), + SizedBox( + height: 20, + ), + + Text('Disabled Buttons', style: hintStyleTextblackbold(),), + GFCard( + content: Column( + children: [ + Row( + children: [ + Expanded(child: GFButton( + onPressed:null, + text: 'Primary', + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'Secondary', + color: GFColor.secondary, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'Success', + color: GFColor.success, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'Warning', + color: GFColor.warning, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'danger', + color: GFColor.danger, + )) + ], + ), + SizedBox( + height: 20, + ), + Row( + children: [ + Expanded(child: GFButton( + onPressed:null, + text: 'Info', + color: GFColor.info, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'Light', + color: GFColor.light, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'Dark', + color: GFColor.dark, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'Link', + color: GFColor.transparent, + )), + SizedBox( + width: 10, + ), + Expanded(child: Text('')) + + ], + ), + + ], + ), + ), + + SizedBox( + height: 20, + ), + + Text('Transparent Buttons', style: hintStyleTextblackbold(),), + GFCard( + content: Column( + children: [ + Row( + children: [ + Expanded(child: GFButton( + onPressed:null, + text: 'Primary', + type: GFType.transparent, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'Secondary', + color: GFColor.secondary, + type: GFType.transparent, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'Success', + color: GFColor.success, + type: GFType.transparent, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'Warning', + color: GFColor.warning, + type: GFType.transparent, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'danger', + color: GFColor.danger, + type: GFType.transparent, + )) + ], + ), + SizedBox( + height: 20, + ), + Row( + children: [ + Expanded(child: GFButton( + onPressed:null, + text: 'Info', + color: GFColor.info, + type: GFType.transparent, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'Light', + color: GFColor.light, + type: GFType.transparent, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed:null, + text: 'Dark', + color: GFColor.dark, + type: GFType.transparent, + )), + SizedBox( + width: 10, + ), + Expanded(child: GFButton( + onPressed: (){}, + text: 'Link', + color: GFColor.transparent, + type: GFType.transparent, + )), + SizedBox( + width: 10, + ), + Expanded(child: Text('')) + + ], + ), + + ], + ), + ), + SizedBox( + height: 20, + ), + + Text(' Button Sizes', style: hintStyleTextblackbold(),), + GFCard( + content: Column( + children: [ + Row( + children: [ + Expanded(child:GFButton( + onPressed: (){}, + child: Text("Large", + ), + + size: GFSize.large, + ), + ), + SizedBox( + width: 10, + ), + Expanded(child:GFButton( + onPressed: (){}, + child: Text("Medium", + ), + size: GFSize.medium, + ), + ), + SizedBox( + width: 10, + ), + Expanded(child:GFButton( + onPressed: (){}, + child: Text("Small", + ), + size: GFSize.small, + ), + ), + + ], + ), + + + ], + ), + ), + + SizedBox( + height: 20, + ), + + Text(' Block Buttons', style: hintStyleTextblackbold(),), + GFCard( + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + GFButton( + onPressed: (){}, + blockButton: true, + child: Text("Large", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.large, + ), + + SizedBox( + height: 10, + ), + + GFButton( + onPressed: (){}, + blockButton: true, + child: Text("Normal", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.medium, + ), + + SizedBox( + height: 10, + ), + + + GFButton( + onPressed: (){}, + blockButton: true, + child: Text("Small", + style: TextStyle( + color: getGFColor(GFColor.white))), + color: GFColor.primary, + size: GFSize.small, + ), + SizedBox( + height: 10, + ), + + ], + ), + + ) + ], + ), + ), + ); + } +} diff --git a/gf_web/lib/screens/layout/body.dart b/gf_web/lib/screens/layout/body.dart new file mode 100644 index 00000000..f56ad48a --- /dev/null +++ b/gf_web/lib/screens/layout/body.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class Body extends StatefulWidget { + @override + _BodyState createState() => _BodyState(); +} + +class _BodyState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body:Container( + margin: EdgeInsets.only(left: 40, top: 20), + child: ListView( + children: [ + Text('dfcghyjunkm') + ], + ), + ) + ); + } +} diff --git a/gf_web/lib/screens/layout/header.dart b/gf_web/lib/screens/layout/header.dart new file mode 100644 index 00000000..c9797ff1 --- /dev/null +++ b/gf_web/lib/screens/layout/header.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +class Header extends StatefulWidget { + @override + _HeaderState createState() => _HeaderState(); +} + +class _HeaderState extends State
{ + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Container( + color: Colors.black, + width: MediaQuery.of(context).size.width, + height: 100, + child: Row( +// mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Flexible( + fit: FlexFit.tight, + flex: 6, +// child: Image.asset('lib/assets/logo.png') + child: Image.network('https://ik.imagekit.io/ionicfirebaseapp/get-flutter-logo_FAN-82xCG.png', height: 40.0,), + ), + Flexible( + fit: FlexFit.tight, + flex: 8, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text('Home', style: TextStyle(fontSize: 17, color: Colors.white, fontWeight: FontWeight.w600),), + Text('Features', style: TextStyle(fontSize: 17, color: Colors.white, fontWeight: FontWeight.w600),), + Text('Docs', style: TextStyle(fontSize: 17, color: Colors.white, fontWeight: FontWeight.w600),), + Text('Blog', style: TextStyle(fontSize: 17, color: Colors.white, fontWeight: FontWeight.w600),), + Text('Contact', style: TextStyle(fontSize: 17, color: Colors.white, fontWeight: FontWeight.w600),) + ], + )) + ], + ), + + ), + ); + } +} diff --git a/gf_web/lib/screens/layout/layout.dart b/gf_web/lib/screens/layout/layout.dart new file mode 100644 index 00000000..bfdf59d2 --- /dev/null +++ b/gf_web/lib/screens/layout/layout.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:gf_web/screens/layout/mobile-demo.dart'; +import 'sidebar.dart'; +import 'header.dart'; +import 'body.dart'; + +class Layout extends StatefulWidget { + final Widget body; + const Layout ({Key key, + this.body, + }):super(key:key); + + @override + _LayoutState createState() => _LayoutState(); +} + +class _LayoutState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Column( + children: [ + Container( + height: 70, + child: Header(), + ), + Row( + children: [ + Container( + height: MediaQuery.of(context).size.height-70, + width: 300, + child: Sidebar(), + ), + Container( + padding: EdgeInsets.only(top: 20, left: 20, right: 20), + height:MediaQuery.of(context).size.height -70, + width: MediaQuery.of(context).size.width -730, + child: widget.body + ), + Container( + width: 430, +// color: Colors.red, + height: 600, + child: MobileDemo(), + ) + ], + ) + ], + ), + ); + } +} diff --git a/gf_web/lib/screens/layout/mobile-demo.dart b/gf_web/lib/screens/layout/mobile-demo.dart new file mode 100644 index 00000000..e7e0c21a --- /dev/null +++ b/gf_web/lib/screens/layout/mobile-demo.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; + +class MobileDemo extends StatefulWidget { + @override + _MobileDemoState createState() => _MobileDemoState(); +} + +class _MobileDemoState extends State { + @override + Widget build(BuildContext context) { + return Container( + height: 300, + child: Image.asset('lib/assets/screen.png'), + ); + } +} diff --git a/gf_web/lib/screens/layout/routes.dart b/gf_web/lib/screens/layout/routes.dart new file mode 100644 index 00000000..a2ef37f1 --- /dev/null +++ b/gf_web/lib/screens/layout/routes.dart @@ -0,0 +1,15 @@ + + + +import 'package:gf_web/screens/buttons/standard-buttons.dart'; +import 'package:gf_web/screens/pages/home.dart'; + + +//Map route = Map(); + +final routes = + { + '/gf-buttons/standard-button': (context) => StandardButtons(), +// '/third': (context) => ThirdScreen(), +// '/fourth':(context) => FourthScreen() + }; diff --git a/gf_web/lib/screens/layout/sidebar.dart b/gf_web/lib/screens/layout/sidebar.dart new file mode 100644 index 00000000..b3dc8934 --- /dev/null +++ b/gf_web/lib/screens/layout/sidebar.dart @@ -0,0 +1,236 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:gf_web/styles/styles.dart'; + +class Sidebar extends StatefulWidget { + @override + _SidebarState createState() => _SidebarState(); +} + +class _SidebarState extends State with TickerProviderStateMixin { + Animation animation; + AnimationController animationController; + AnimationController controller; + Animation offset; + + + @override + void initState() { + super.initState(); + animationController = AnimationController(duration: Duration(seconds: 2), vsync: this); + controller = AnimationController(vsync: this, duration: Duration(milliseconds: 300)); + offset = Tween(begin: Offset.zero, end: Offset(0.0, 0.1),).animate(controller); +// animation = Tween(begin: 1.0, end: 0.0).animate(CurvedAnimation(parent: animationController, curve: Curves.fastLinearToSlowEaseIn)); + } + + + + bool showButtonTypes = false; + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( +margin: EdgeInsets.only(right: 10,), + padding: EdgeInsets.only(left:60, right: 20, top:30), + width: 300, + height: MediaQuery.of(context).size.height, + decoration: BoxDecoration( + border: Border.all( + color: Colors.black.withOpacity(0.30) + ), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.40), + blurRadius: 5.0 + ), + ] + ), + child: ListView( + children: [ + + Text('COMPONENTS', style: hintStyleTextblack(),), + SizedBox( + height: 25, + ), + GestureDetector( + onTap: (){ + setState(() { + switch (controller.status) { + case AnimationStatus.completed: + controller.forward(from: 0); + break; + case AnimationStatus.dismissed: + controller.forward(); + break; + default: + } + showButtonTypes = !showButtonTypes; + }); + + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('GF Buttons', style: hintStyleTextblackdull()), + showButtonTypes? Icon(Icons.keyboard_arrow_down): Icon(Icons.keyboard_arrow_right) + ], + ) + ), + showButtonTypes? + SlideTransition( + position: offset, + child: Container( + height: 200, + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.40) + ) + ] + ), + padding: EdgeInsets.only(top:0, bottom: 30, left: 25, right: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: (){ + Navigator.pushNamed(context, '/gf-buttons/standard-button'); + }, + child: Text('Standard Buttons'), + ), + Text('Pills Buttons'), + Text('Square Buttons'), + Text('Shadow Buttons'), + Text('Icon Buttons'), + Text('Social Buttons') + ], + ), + ), + ):Container(), + + SizedBox( + height: 20, + ), + + Text('GF Badge', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Avatar', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Image', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Card', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Slider', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Tile', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Tab', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Typography', style: hintStyleTextblackdull()), + SizedBox( + height: 30, + ), + Text('COMING SOON', style: hintStyleTextblack(),), + SizedBox( + height: 25, + ), + Text('GF Forms', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Chip', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + + Text('GF List', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Spinner', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Header', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Footer', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Toggle', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Drawer', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Accordian', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Toast', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Alert', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Model', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Action Sheet', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Floating Button', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Popover', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Recorder', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Infinite Scroll', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Searchbar', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + Text('GF Refresher', style: hintStyleTextblackdull()), + SizedBox( + height: 20, + ), + ], + ), + ), + ); + } +} diff --git a/gf_web/lib/screens/pages/home.dart b/gf_web/lib/screens/pages/home.dart new file mode 100644 index 00000000..c26544f9 --- /dev/null +++ b/gf_web/lib/screens/pages/home.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:gf_web/screens/layout/layout.dart'; + + +class HomePage extends StatefulWidget { + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Layout( + body: Column( + children: [ + Text('Introduction', style: TextStyle(fontSize: 20),), + SizedBox( + height: 20, + ), + Text('GetFlutter is UI libraries for building flutter app.', style: TextStyle(fontSize: 20),), + SizedBox( + height: 20, + ), + Image.network('https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LvKegU8SBuWnETMfqrz%2F-LxtgL3yw3epnXU4dni3%2F-LxtgsMugSV2jttI5pTC%2FButtons%403x.png?alt=media&token=54a7ad05-716d-4cd2-84f7-78e2697fbdec', + height: 600,) + ], + ) + ) + ); + } +} \ No newline at end of file diff --git a/gf_web/lib/styles/styles.dart b/gf_web/lib/styles/styles.dart new file mode 100644 index 00000000..7490beba --- /dev/null +++ b/gf_web/lib/styles/styles.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +final primary = const Color(0xff19CA4B); +final secondary = const Color(0xFFFF7644); +final blacktext = const Color(0xFF0D0D0D); +final blackdull = const Color(0xFFbababa); + + + +//.............................................RalewayRegular................................................................................... + +TextStyle hintStyleTextblackdull() { + return TextStyle( + fontWeight: FontWeight.w500, + fontSize: 16.0, + color: blacktext.withOpacity(0.60), + ); +} + +TextStyle hintStyleTextblack() { + return TextStyle( + fontWeight: FontWeight.w500, + fontSize: 17.0, + color: blacktext, + ); +} + +TextStyle hintStyleTextblackbold() { + return TextStyle( + fontWeight: FontWeight.w600, + fontSize: 23.0, + color: blacktext, + ); +} + +TextStyle hintStyleTextblackbolder() { + return TextStyle( + fontWeight: FontWeight.w600, + fontSize: 26.0, + color: blacktext, + ); +} \ No newline at end of file diff --git a/gf_web/pubspec.lock b/gf_web/pubspec.lock new file mode 100644 index 00000000..c6869e31 --- /dev/null +++ b/gf_web/pubspec.lock @@ -0,0 +1,202 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.2" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.14.11" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + image: + dependency: transitive + description: + name: image + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.4" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.6" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.8" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.4" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0+1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.5" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.11" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + ui_kit: + dependency: "direct dev" + description: + path: ".." + relative: true + source: path + version: "0.0.1" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "3.5.0" +sdks: + dart: ">=2.4.0 <3.0.0" diff --git a/gf_web/pubspec.yaml b/gf_web/pubspec.yaml new file mode 100644 index 00000000..7f4c2c0d --- /dev/null +++ b/gf_web/pubspec.yaml @@ -0,0 +1,26 @@ +name: gf_web +description: A new Flutter project. + +version: 1.0.0+1 + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^0.1.2 + +dev_dependencies: + flutter_test: + sdk: flutter + ui_kit: + path: ../ + +flutter: + uses-material-design: true + + assets: + - lib/assets/logo.png + - lib/assets/icons/next.png + - lib/assets/screen.png diff --git a/gf_web/test/widget_test.dart b/gf_web/test/widget_test.dart new file mode 100644 index 00000000..e89b8c9e --- /dev/null +++ b/gf_web/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:gf_web/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/gf_web/web/index.html b/gf_web/web/index.html new file mode 100644 index 00000000..3f15ee61 --- /dev/null +++ b/gf_web/web/index.html @@ -0,0 +1,10 @@ + + + + + gf_web + + + + + diff --git a/lib/components/button/gf_button.dart b/lib/components/button/gf_button.dart index da0be74c..890d16b8 100644 --- a/lib/components/button/gf_button.dart +++ b/lib/components/button/gf_button.dart @@ -422,7 +422,7 @@ class _GFButtonState extends State { color: this.color == null ? themeColor : widget.borderSide == null ? getBorderColor() : widget.borderSide.color, - width: widget.borderSide?.width ?? widget.type == GFType.outline2x ? 2.0 : 1.0, + width: widget.borderSide?.width == null ? widget.type == GFType.outline2x ? 2.0 : 1.0 : widget.borderSide?.width, ); Size minSize; diff --git a/lib/components/button/gf_icon_button.dart b/lib/components/button/gf_icon_button.dart index 6e272be1..289e75c0 100644 --- a/lib/components/button/gf_icon_button.dart +++ b/lib/components/button/gf_icon_button.dart @@ -26,7 +26,7 @@ class GFIconButton extends StatefulWidget { /// The color for the button's icon when a pointer is hovering over it. final Color hoverColor; - /// Button type of [GFType] i.e, solid, outline, transparent + /// Button type of [GFType] i.e, solid, outline, outline2x transparent final GFType type; /// Button type of [GFButtonShape] i.e, standard, pills, square, shadow, icons @@ -87,14 +87,15 @@ class GFIconButton extends StatefulWidget { this.focusNode, this.autofocus = false, this.tooltip, - this.type = GFType.transparent, + this.type = GFType.solid, this.shape = GFButtonShape.standard, this.color = GFColor.primary, this.borderShape, this.boxShadow, this.size = GFSize.medium, this.buttonBoxShadow, - this.borderSide}) + this.borderSide, + }) : assert(iconSize != null), assert(padding != null), assert(alignment != null), @@ -128,22 +129,45 @@ class _GFIconButtonState extends State { @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); - Color currentColor; - if (widget.onPressed != null) - currentColor = widget.color; - else - currentColor = widget.disabledColor ?? Theme.of(context).disabledColor; + Color getBorderColor() { + if(widget.onPressed != null){ + return this.color; + }else{ + if (widget.disabledColor != null) + return widget.disabledColor; + else { + return this.color.withOpacity(0.48); + } + } + } + Color getDisabledFillColor() { + if (widget.type == GFType.transparent || widget.type == GFType.outline || widget.type == GFType.outline2x) + return Colors.transparent; + if (widget.disabledColor != null) + return widget.disabledColor; + else { + return this.color.withOpacity(0.48); + } + } + + Color getColor() { + if (widget.type == GFType.transparent || widget.type == GFType.outline || widget.type == GFType.outline2x) + return Colors.transparent; + else{ + return this.color; + } + } final Color themeColor = Theme.of(context).colorScheme.onSurface.withOpacity(0.12); final BorderSide outlineBorder = BorderSide( - color: widget.borderSide == null ? themeColor : widget.borderSide.color, - width: widget.borderSide?.width ?? 1.0, + color: widget.borderSide == null ? getBorderColor() : widget.borderSide.color, + width: widget.borderSide?.width == null ? widget.type == GFType.outline2x ? 2.0 : 1.0 : widget.borderSide?.width, ); - final BorderSide shapeBorder = widget.type == GFType.outline + final BorderSide shapeBorder = widget.type == GFType.outline || widget.type == GFType.outline2x ? outlineBorder : widget.borderSide != null ? widget.borderSide @@ -156,16 +180,13 @@ class _GFIconButtonState extends State { if (this.shape == GFButtonShape.pills) { shape = RoundedRectangleBorder( - borderRadius: BorderRadius.circular(50.0), side: shapeBorder); + borderRadius: BorderRadius.circular(20.0), side: shapeBorder); } else if (this.shape == GFButtonShape.square) { shape = RoundedRectangleBorder( borderRadius: BorderRadius.circular(0.0), side: shapeBorder); } else if (this.shape == GFButtonShape.standard) { shape = RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0), side: shapeBorder); - } else { - shape = RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0), side: shapeBorder); + borderRadius: BorderRadius.circular(3.0), side: shapeBorder); } if (widget.size == GFSize.small) { @@ -182,15 +203,26 @@ class _GFIconButtonState extends State { this.iconPixel = 18.0; } + getIconColor(){ + if (widget.type == GFType.transparent || widget.type == GFType.outline || widget.type == GFType.outline2x) + return widget.onPressed != null ? + this.color == getGFColor(GFColor.transparent) ? getGFColor(GFColor.dark) : this.color : this.color.withOpacity(0.48); + else if(this.color == getGFColor(GFColor.transparent)){ + return widget.onPressed != null ? getGFColor(GFColor.dark) : getGFColor(GFColor.white); + } + else{ + return getGFColor(GFColor.white); + } + } + Widget result = Container( - height: - widget.shape == GFButtonShape.pills ? this.height + 6 : this.height, - width: widget.shape == GFButtonShape.pills ? this.width + 6 : this.width, + height: this.height, + width: widget.shape == GFButtonShape.pills ? this.width + 10 : this.width, padding: widget.padding, child: IconTheme.merge( data: IconThemeData( size: widget.iconSize > 0.0 ? widget.iconSize : this.iconPixel, - color: currentColor, + color: getIconColor(), ), child: widget.icon, ), @@ -209,10 +241,7 @@ class _GFIconButtonState extends State { return null; } else { return BoxDecoration( - color: widget.type == GFType.transparent || - widget.type == GFType.outline - ? Colors.transparent - : this.color, + color: widget.onPressed != null ? getColor() : getDisabledFillColor(), borderRadius: widget.shape == GFButtonShape.pills ? BorderRadius.circular(50.0) : widget.shape == GFButtonShape.standard @@ -249,21 +278,16 @@ class _GFIconButtonState extends State { child: ConstrainedBox( constraints: BoxConstraints(maxWidth: 60.0, maxHeight: 60.0), child: Container( - height: widget.shape == GFButtonShape.pills - ? this.height + 6 - : this.height, + height: this.height, width: widget.shape == GFButtonShape.pills - ? this.width + 6 + ? this.width + 10 : this.width, decoration: getBoxShadow(), child: Material( shape: widget.type == GFType.transparent ? null : widget.borderShape == null ? shape : widget.borderShape, - color: widget.type == GFType.transparent || - widget.type == GFType.outline - ? Colors.transparent - : this.color, + color: widget.onPressed != null ? getColor() : getDisabledFillColor(), type: widget.type == GFType.transparent ? MaterialType.transparency : MaterialType.button,