ui complete

This commit is contained in:
amirrezaghabeli
2025-08-04 08:07:26 +03:30
parent df02cff668
commit ae4c81cad0
8 changed files with 125 additions and 88 deletions
+4
View File
@@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.0013 29.3307C23.3651 29.3307 29.3346 23.3612 29.3346 15.9974C29.3346 8.6336 23.3651 2.66406 16.0013 2.66406C8.63751 2.66406 2.66797 8.6336 2.66797 15.9974C2.66797 23.3612 8.63751 29.3307 16.0013 29.3307Z" fill="#FCFCFC" stroke="#888888" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17.6816 20.7102L12.9883 16.0035L17.6816 11.2969" stroke="#888888" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 588 B

+4
View File
@@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.0013 29.3307C23.3651 29.3307 29.3346 23.3612 29.3346 15.9974C29.3346 8.6336 23.3651 2.66406 16.0013 2.66406C8.63751 2.66406 2.66797 8.6336 2.66797 15.9974C2.66797 23.3612 8.63751 29.3307 16.0013 29.3307Z" fill="#FCFCFC" stroke="#888888" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14.3203 20.7102L19.0136 16.0035L14.3203 11.2969" stroke="#888888" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 588 B

+2
View File
@@ -15,4 +15,6 @@ class AssetsManager {
static const closeCircle = 'assets/icons/close-circle.svg'; static const closeCircle = 'assets/icons/close-circle.svg';
static const seFlag = 'assets/icons/SE.png'; static const seFlag = 'assets/icons/SE.png';
static const location = 'assets/icons/location.svg'; static const location = 'assets/icons/location.svg';
static const arrowCircleLeft = 'assets/icons/arrow-circle-left.svg';
static const arrowCircleRight = 'assets/icons/arrow-circle-right.svg';
} }
+40 -22
View File
@@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import '../../common/widgets/bottom_navigation.dart'; import '../../common/widgets/bottom_navigation.dart';
import '../../core/constants/assets.dart';
import '../../core/constants/colors.dart'; import '../../core/constants/colors.dart';
import '../../core/utils/size_config.dart'; import '../../core/utils/size_config.dart';
import 'models/tender_model.dart'; import 'models/tender_model.dart';
@@ -42,7 +44,7 @@ class _TendersScreenState extends State<TendersScreen>
child: SingleChildScrollView( child: SingleChildScrollView(
child: Padding( child: Padding(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: 24.0.w(), // horizontal: 24.0.w(),
vertical: 24.0.h(), vertical: 24.0.h(),
), ),
child: Column( child: Column(
@@ -52,27 +54,43 @@ class _TendersScreenState extends State<TendersScreen>
MainTabBar(controller: controller), MainTabBar(controller: controller),
SizedBox(height: 24.0.h()), SizedBox(height: 24.0.h()),
SizedBox( Stack(
width: double.infinity, children: [
height: 762.0.h(), SizedBox(
child: PageView.builder( width: double.infinity,
scrollDirection: Axis.horizontal, height: 762.0.h(),
itemCount: sampleTenders.length, child: PageView.builder(
itemBuilder: (context, index) { scrollDirection: Axis.horizontal,
final tender = sampleTenders[index]; itemCount: sampleTenders.length,
itemBuilder: (context, index) {
return TenderCard( final tender = sampleTenders[index];
date: tender.date, return TenderCard(
deadline: tender.deadline, date: tender.date,
title: tender.title, deadline: tender.deadline,
description: tender.description, title: tender.title,
tenderId: tender.tenderId, description: tender.description,
location: tender.location, tenderId: tender.tenderId,
country: tender.country, location: tender.location,
matchPercentage: tender.matchPercentage, country: tender.country,
); matchPercentage: tender.matchPercentage,
}, );
), },
),
),
Positioned(
top: 237.0.h(),
bottom: 366.0.h(),
left: 9.0.w(),
right: 9.0.w(),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SvgPicture.asset(AssetsManager.arrowCircleLeft),
SvgPicture.asset(AssetsManager.arrowCircleRight),
],
),
),
],
), ),
], ],
), ),
@@ -19,6 +19,7 @@ class _MainTabBarState extends State<MainTabBar> {
return Container( return Container(
width: double.infinity, width: double.infinity,
height: 51.0.h(), height: 51.0.h(),
margin: EdgeInsets.symmetric(horizontal: 24.0.w()),
padding: EdgeInsets.symmetric(horizontal: 8.0.w(), vertical: 8.0.h()), padding: EdgeInsets.symmetric(horizontal: 8.0.w(), vertical: 8.0.h()),
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColors.grey10, color: AppColors.grey10,
@@ -0,0 +1,52 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import '../../../core/constants/assets.dart';
import '../../../core/utils/size_config.dart';
class TenderActionButtons extends StatelessWidget {
final VoidCallback? onLike;
final VoidCallback? onDislike;
final VoidCallback? onClose;
final bool isLiked;
final bool isDisliked;
const TenderActionButtons({
super.key,
this.onLike,
this.onDislike,
this.onClose,
this.isLiked = false,
this.isDisliked = false,
});
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(width: 16.0.w()),
// Dislike button
GestureDetector(
onTap: onDislike,
child: SvgPicture.asset(AssetsManager.dislike),
),
SizedBox(width: 16.0.w()),
// Close button
GestureDetector(
onTap: onClose,
child: SvgPicture.asset(AssetsManager.closeCircle),
),
SizedBox(width: 16.0.w()),
// Like button
GestureDetector(
onTap: onLike,
child: SvgPicture.asset(AssetsManager.like),
),
],
);
}
}
+20 -17
View File
@@ -10,24 +10,27 @@ class TenderAppBar extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Row( return Padding(
mainAxisAlignment: MainAxisAlignment.spaceBetween, padding: EdgeInsets.symmetric(horizontal: 24.0.w()),
children: [ child: Row(
Text( mainAxisAlignment: MainAxisAlignment.spaceBetween,
AppStrings.tendersTitle, children: [
style: TextStyle( Text(
fontSize: 20.0.sp(), AppStrings.tendersTitle,
fontWeight: FontWeight.w600, style: TextStyle(
color: AppColors.grey70, fontSize: 20.0.sp(),
fontWeight: FontWeight.w600,
color: AppColors.grey70,
),
), ),
), Image.asset(
Image.asset( AssetsManager.tenderLogo,
AssetsManager.tenderLogo, width: 59.0.w(),
width: 59.0.w(), height: 28.0.h(),
height: 28.0.h(), fit: BoxFit.cover,
fit: BoxFit.cover, ),
), ],
], ),
); );
} }
} }
+2 -49
View File
@@ -4,6 +4,7 @@ import 'package:flutter_svg/svg.dart';
import '../../../core/constants/assets.dart'; import '../../../core/constants/assets.dart';
import '../../../core/constants/colors.dart'; import '../../../core/constants/colors.dart';
import '../../../core/utils/size_config.dart'; import '../../../core/utils/size_config.dart';
import 'tender_action_buttons.dart';
class TenderCard extends StatelessWidget { class TenderCard extends StatelessWidget {
final String date; final String date;
@@ -220,7 +221,7 @@ class TenderCard extends StatelessWidget {
), ),
), ),
// Apply button // See More button
GestureDetector( GestureDetector(
onTap: onApply, onTap: onApply,
child: Container( child: Container(
@@ -261,51 +262,3 @@ class TenderCard extends StatelessWidget {
); );
} }
} }
// Action buttons row widget
class TenderActionButtons extends StatelessWidget {
final VoidCallback? onLike;
final VoidCallback? onDislike;
final VoidCallback? onClose;
final bool isLiked;
final bool isDisliked;
const TenderActionButtons({
super.key,
this.onLike,
this.onDislike,
this.onClose,
this.isLiked = false,
this.isDisliked = false,
});
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(width: 16.0.w()),
// Dislike button
GestureDetector(
onTap: onDislike,
child: SvgPicture.asset(AssetsManager.dislike),
),
SizedBox(width: 16.0.w()),
// Close button
GestureDetector(
onTap: onClose,
child: SvgPicture.asset(AssetsManager.closeCircle),
),
SizedBox(width: 16.0.w()),
// Like button
GestureDetector(
onTap: onLike,
child: SvgPicture.asset(AssetsManager.like),
),
],
);
}
}