chore : remove duplicate code in lib and core
This commit is contained in:
@@ -1,9 +1,8 @@
|
||||
import 'package:device_preview/device_preview.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rasadyar_app/domain/service/user/user_service.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/routes/app_pages.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
import 'package:rasadyar_core/infrastructure/di/di.dart';
|
||||
|
||||
void main() async {
|
||||
|
||||
@@ -1,368 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AppColor {
|
||||
AppColor._();
|
||||
|
||||
//region --- Blue Colors ---
|
||||
static const Color blueLight = Color(
|
||||
0xFFeaefff,
|
||||
); // #eaefff rgb(234, 239, 255)
|
||||
static const Color blueLightHover = Color(
|
||||
0xFFe0e7ff,
|
||||
); // #e0e7ff rgb(224, 231, 255)
|
||||
static const Color blueLightActive = Color(
|
||||
0xFFbecdff,
|
||||
); // #becdff rgb(190, 205, 255)
|
||||
static const Color blueNormal = Color(0xFF2d5fff); // #2d5fff rgb(45, 95, 255)
|
||||
static const Color blueNormalHover = Color(
|
||||
0xFF2956e6,
|
||||
); // #2956e6 rgb(41, 86, 230)
|
||||
static const Color blueNormalActive = Color(
|
||||
0xFF244ccc,
|
||||
); // #244ccc rgb(36, 76, 204)
|
||||
static const Color blueDark = Color(0xFF2247bf); // #2247bf rgb(34, 71, 191)
|
||||
static const Color blueDarkHover = Color(
|
||||
0xFF1b3999,
|
||||
); // #1b3999 rgb(27, 57, 153)
|
||||
static const Color blueDarkActive = Color(
|
||||
0xFF142b73,
|
||||
); // #142b73 rgb(20, 43, 115)
|
||||
static const Color blueDarker = Color(0xFF102159); // #102159 rgb(16, 33, 89)
|
||||
//endregion
|
||||
|
||||
//region --- Green Colors ---
|
||||
static const Color greenLight = Color(
|
||||
0xFFe6faf5,
|
||||
); // #e6faf5 rgb(230, 250, 245)
|
||||
static const Color greenLightHover = Color(
|
||||
0xFFd9f7f0,
|
||||
); // #d9f7f0 rgb(217, 247, 240)
|
||||
static const Color greenLightActive = Color(
|
||||
0xFFb0efdf,
|
||||
); // #b0efdf rgb(176, 239, 223)
|
||||
static const Color greenNormal = Color(
|
||||
0xFF00cc99,
|
||||
); // #00cc99 rgb(0, 204, 153)
|
||||
static const Color greenNormalHover = Color(
|
||||
0xFF00b88a,
|
||||
); // #00b88a rgb(0, 184, 138)
|
||||
static const Color greenNormalActive = Color(
|
||||
0xFF00a37a,
|
||||
); // #00a37a rgb(0, 163, 122)
|
||||
static const Color greenDark = Color(0xFF009973); // #009973 rgb(0, 153, 115)
|
||||
static const Color greenDarkHover = Color(
|
||||
0xFF007a5c,
|
||||
); // #007a5c rgb(0, 122, 92)
|
||||
static const Color greenDarkActive = Color(
|
||||
0xFF005c45,
|
||||
); // #005c45 rgb(0, 92, 69)
|
||||
static const Color greenDarker = Color(0xFF004736); // #004736 rgb(0, 71, 54)
|
||||
//endregion
|
||||
|
||||
//region --- Black Colors ---
|
||||
static const Color blackLight = Color(
|
||||
0xFFe6e6e6,
|
||||
); // #e6e6e6 rgb(230, 230, 230)
|
||||
static const Color blackLightHover = Color(
|
||||
0xFFd9d9d9,
|
||||
); // #d9d9d9 rgb(217, 217, 217)
|
||||
static const Color blackLightActive = Color(
|
||||
0xFFb0b0b0,
|
||||
); // #b0b0b0 rgb(176, 176, 176)
|
||||
static const Color blackNormal = Color(0xFF000000); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackNormalHover = Color(
|
||||
0xFF000000,
|
||||
); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackNormalActive = Color(
|
||||
0xFF000000,
|
||||
); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackDark = Color(0xFF000000); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackDarkHover = Color(0xFF000000); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackDarkActive = Color(
|
||||
0xFF000000,
|
||||
); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackDarker = Color(0xFF000000); // #000000 rgb(0, 0, 0)
|
||||
//endregion
|
||||
|
||||
//region ---Dark Grey Colors ---
|
||||
static const Color darkGreyLight = Color(
|
||||
0xFFeaeaea,
|
||||
); // #eaeaea rgb(234, 234, 234)
|
||||
static const Color darkGreyLightHover = Color(
|
||||
0xFFdfdfdf,
|
||||
); // #dfdfdf rgb(223, 223, 223)
|
||||
static const Color darkGreyLightActive = Color(
|
||||
0xFFbdbdbd,
|
||||
); // #bdbdbd rgb(189, 189, 189)
|
||||
static const Color darkGreyNormal = Color(
|
||||
0xFF2a2a2a,
|
||||
); // #2a2a2a rgb(42, 42, 42)
|
||||
static const Color darkGreyNormalHover = Color(
|
||||
0xFF262626,
|
||||
); // #262626 rgb(38, 38, 38)
|
||||
static const Color darkGreyNormalActive = Color(
|
||||
0xFF222222,
|
||||
); // #222222 rgb(34, 34, 34)
|
||||
static const Color darkGreyDark = Color(
|
||||
0xFF202020,
|
||||
); // #202020 rgb(32, 32, 32)
|
||||
static const Color darkGreyDarkHover = Color(
|
||||
0xFF191919,
|
||||
); // #191919 rgb(25, 25, 25)
|
||||
static const Color darkGreyDarkActive = Color(
|
||||
0xFF131313,
|
||||
); // #131313 rgb(19, 19, 19)
|
||||
static const Color darkGreyDarker = Color(
|
||||
0xFF0f0f0f,
|
||||
); // #0f0f0f rgb(15, 15, 15)
|
||||
//endregion
|
||||
|
||||
//region ---Medium Grey Colors ---
|
||||
static const Color mediumGreyLight = Color(
|
||||
0xFFf4f4f4,
|
||||
); // #f4f4f4 rgb(244, 244, 244)
|
||||
static const Color mediumGreyLightHover = Color(
|
||||
0xFFeeeeee,
|
||||
); // #eeeeee rgb(238, 238, 238)
|
||||
static const Color mediumGreyLightActive = Color(
|
||||
0xFFdcdcdc,
|
||||
); // #dcdcdc rgb(220, 220, 220)
|
||||
static const Color mediumGreyNormal = Color(
|
||||
0xFF8f8f8f,
|
||||
); // #8f8f8f rgb(143, 143, 143)
|
||||
static const Color mediumGreyNormalHover = Color(
|
||||
0xFF818181,
|
||||
); // #818181 rgb(129, 129, 129)
|
||||
static const Color mediumGreyNormalActive = Color(
|
||||
0xFF727272,
|
||||
); // #727272 rgb(114, 114, 114)
|
||||
static const Color mediumGreyDark = Color(
|
||||
0xFF6b6b6b,
|
||||
); // #6b6b6b rgb(107, 107, 107)
|
||||
static const Color mediumGreyDarkHover = Color(
|
||||
0xFF565656,
|
||||
); // #565656 rgb(86, 86, 86)
|
||||
static const Color mediumGreyDarkActive = Color(
|
||||
0xFF404040,
|
||||
); // #404040 rgb(64, 64, 64)
|
||||
static const Color mediumGreyDarker = Color(
|
||||
0xFF323232,
|
||||
); // #323232 rgb(50, 50, 50)
|
||||
//endregion
|
||||
|
||||
//region ---Light Grey Colors ---
|
||||
static const Color lightGreyLight = Color(
|
||||
0xFFfdfdfd,
|
||||
); // #fdfdfd rgb(253, 253, 253)
|
||||
static const Color lightGreyLightHover = Color(
|
||||
0xFFfcfcfc,
|
||||
); // #fcfcfc rgb(252, 252, 252)
|
||||
static const Color lightGreyLightActive = Color(
|
||||
0xFFfafafa,
|
||||
); // #fafafa rgb(250, 250, 250)
|
||||
static const Color lightGreyNormal = Color(
|
||||
0xFFeeeeee,
|
||||
); // #eeeeee rgb(238, 238, 238)
|
||||
static const Color lightGreyNormalHover = Color(
|
||||
0xFFd6d6d6,
|
||||
); // #d6d6d6 rgb(214, 214, 214)
|
||||
static const Color lightGreyNormalActive = Color(
|
||||
0xFFbebebe,
|
||||
); // #bebebe rgb(190, 190, 190)
|
||||
static const Color lightGreyDark = Color(
|
||||
0xFFb3b3b3,
|
||||
); // #b3b3b3 rgb(179, 179, 179)
|
||||
static const Color lightGreyDarkHover = Color(
|
||||
0xFF8f8f8f,
|
||||
); // #8f8f8f rgb(143, 143, 143)
|
||||
static const Color lightGreyDarkActive = Color(
|
||||
0xFF6b6b6b,
|
||||
); // #6b6b6b rgb(107, 107, 107)
|
||||
static const Color lightGreyDarker = Color(
|
||||
0xFF535353,
|
||||
); // #535353 rgb(83, 83, 83)
|
||||
//endregion
|
||||
|
||||
//region ---WhiteGrey Colors ---
|
||||
static const Color whiteGreyLight = Color(
|
||||
0xFFfefefe,
|
||||
); // #fefefe rgb(254, 254, 254)
|
||||
static const Color whiteGreyLightHover = Color(
|
||||
0xFFfefefe,
|
||||
); // #fefefe rgb(254, 254, 254)
|
||||
static const Color whiteGreyLightActive = Color(
|
||||
0xFFfdfdfd,
|
||||
); // #fdfdfd rgb(253, 253, 253)
|
||||
static const Color whiteGreyNormal = Color(
|
||||
0xFFf9f9f9,
|
||||
); // #f9f9f9 rgb(249, 249, 249)
|
||||
static const Color whiteGreyNormalHover = Color(
|
||||
0xFFe0e0e0,
|
||||
); // #e0e0e0 rgb(224, 224, 224)
|
||||
static const Color whiteGreyNormalActive = Color(
|
||||
0xFFc7c7c7,
|
||||
); // #c7c7c7 rgb(199, 199, 199)
|
||||
static const Color whiteGreyDark = Color(
|
||||
0xFFbbbbbb,
|
||||
); // #bbbbbb rgb(187, 187, 187)
|
||||
static const Color whiteGreyDarkHover = Color(
|
||||
0xFF959595,
|
||||
); // #959595 rgb(149, 149, 149)
|
||||
static const Color whiteGreyDarkActive = Color(
|
||||
0xFF707070,
|
||||
); // #707070 rgb(112, 112, 112)
|
||||
static const Color whiteGreyDarker = Color(
|
||||
0xFF575757,
|
||||
); // #575757 rgb(87, 87, 87)
|
||||
//endregion
|
||||
|
||||
//region ---White Colors ---
|
||||
static const Color whiteLight = Color(
|
||||
0xFFffffff,
|
||||
); // #ffffff rgb(255, 255, 255)
|
||||
static const Color whiteLightHover = Color(
|
||||
0xFFffffff,
|
||||
); // #ffffff rgb(255, 255, 255)
|
||||
static const Color whiteLightActive = Color(
|
||||
0xFFffffff,
|
||||
); // #ffffff rgb(255, 255, 255)
|
||||
static const Color whiteNormal = Color(
|
||||
0xFFffffff,
|
||||
); // #ffffff rgb(255, 255, 255)
|
||||
static const Color whiteNormalHover = Color(
|
||||
0xFFe6e6e6,
|
||||
); // #e6e6e6 rgb(230, 230, 230)
|
||||
static const Color whiteNormalActive = Color(
|
||||
0xFFcccccc,
|
||||
); // #cccccc rgb(204, 204, 204)
|
||||
static const Color whiteDark = Color(
|
||||
0xFFbfbfbf,
|
||||
); // #bfbfbf rgb(191, 191, 191)
|
||||
static const Color whiteDarkHover = Color(
|
||||
0xFF999999,
|
||||
); // #999999 rgb(153, 153, 153)
|
||||
static const Color whiteDarkActive = Color(
|
||||
0xFF737373,
|
||||
); // #737373 rgb(115, 115, 115)
|
||||
static const Color whiteDarker = Color(0xFF595959); // #595959 rgb(89, 89, 89)
|
||||
//endregion
|
||||
|
||||
//region --- green1 Colors ---
|
||||
static const Color green1Light = Color(
|
||||
0xFFe6f6f4,
|
||||
); // #e6f6f4 rgb(230, 246, 244)
|
||||
static const Color green1LightHover = Color(
|
||||
0xFFd9f2ef,
|
||||
); // #d9f2ef rgb(217, 242, 239)
|
||||
static const Color green1LightActive = Color(
|
||||
0xFFb0e4dd,
|
||||
); // #b0e4dd rgb(176, 228, 221)
|
||||
static const Color green1Normal = Color(
|
||||
0xFF00a991,
|
||||
); // #00a991 rgb(0, 169, 145)
|
||||
static const Color green1NormalHover = Color(
|
||||
0xFF009883,
|
||||
); // #009883 rgb(0, 152, 131)
|
||||
static const Color green1NormalActive = Color(
|
||||
0xFF008774,
|
||||
); // #008774 rgb(0, 135, 116)
|
||||
static const Color green1Dark = Color(0xFF007f6d); // #007f6d rgb(0, 127, 109)
|
||||
static const Color green1DarkHover = Color(
|
||||
0xFF006557,
|
||||
); // #006557 rgb(0, 101, 87)
|
||||
static const Color green1DarkActive = Color(
|
||||
0xFF004c41,
|
||||
); // #004c41 rgb(0, 76, 65)
|
||||
static const Color green1Darker = Color(0xFF003b33); // #003b33 rgb(0, 59, 51)
|
||||
//endregion
|
||||
|
||||
//region --- Yellow Colors ---
|
||||
static const Color yellowLight = Color(
|
||||
0xFFfff9e6,
|
||||
); // #fff9e6 rgb(255, 249, 230)
|
||||
static const Color yellowLightHover = Color(
|
||||
0xFFfff6da,
|
||||
); // #fff6da rgb(255, 246, 218)
|
||||
static const Color yellowLightActive = Color(
|
||||
0xFFffecb2,
|
||||
); // #ffecb2 rgb(255, 236, 178)
|
||||
static const Color yellowNormal = Color(
|
||||
0xFFffc107,
|
||||
); // #ffc107 rgb(255, 193, 7)
|
||||
static const Color yellowNormalHover = Color(
|
||||
0xFFe6ae06,
|
||||
); // #e6ae06 rgb(230, 174, 6)
|
||||
static const Color yellowNormalActive = Color(
|
||||
0xFFcc9a06,
|
||||
); // #cc9a06 rgb(204, 154, 6)
|
||||
static const Color yellowDark = Color(0xFFbf9105); // #bf9105 rgb(191, 145, 5)
|
||||
static const Color yellowDarkHover = Color(
|
||||
0xFF997404,
|
||||
); // #997404 rgb(153, 116, 4)
|
||||
static const Color yellowDarkActive = Color(
|
||||
0xFF735703,
|
||||
); // #735703 rgb(115, 87, 3)
|
||||
static const Color yellowDarker = Color(0xFF594402); // #594402 rgb(89, 68, 2)
|
||||
//endregion
|
||||
|
||||
//region --- red Colors ---
|
||||
static const Color redLight = Color(0xFFfdeeee); // #fdeeee rgb(253, 238, 238)
|
||||
static const Color redLightHover = Color(
|
||||
0xFFfce6e6,
|
||||
); // #fce6e6 rgb(252, 230, 230)
|
||||
static const Color redLightActive = Color(
|
||||
0xFFf9cbcb,
|
||||
); // #f9cbcb rgb(249, 203, 203)
|
||||
static const Color redNormal = Color(0xFFeb5757); // #eb5757 rgb(235, 87, 87)
|
||||
static const Color redNormalHover = Color(
|
||||
0xFFd44e4e,
|
||||
); // #d44e4e rgb(212, 78, 78)
|
||||
static const Color redNormalActive = Color(
|
||||
0xFFbc4646,
|
||||
); // #bc4646 rgb(188, 70, 70)
|
||||
static const Color redDark = Color(0xFFb04141); // #b04141 rgb(176, 65, 65)
|
||||
static const Color redDarkHover = Color(
|
||||
0xFF8d3434,
|
||||
); // #8d3434 rgb(141, 52, 52)
|
||||
static const Color redDarkActive = Color(
|
||||
0xFF6a2727,
|
||||
); // #6a2727 rgb(106, 39, 39)
|
||||
static const Color redDarker = Color(0xFF521e1e); // #521e1e rgb(82, 30, 30)
|
||||
//endregion
|
||||
|
||||
//region --- Teal Colors ---
|
||||
static const Color tealLight = Color(
|
||||
0xFFe8f6f8,
|
||||
); // #e8f6f8 rgb(232, 246, 248)
|
||||
static const Color tealLightHover = Color(
|
||||
0xFFdcf1f4,
|
||||
); // #dcf1f4 rgb(220, 241, 244)
|
||||
static const Color tealLightActive = Color(
|
||||
0xFFb7e2e9,
|
||||
); // #b7e2e9 rgb(183, 226, 233)
|
||||
static const Color tealNormal = Color(
|
||||
0xFF17a2b8,
|
||||
); // #17a2b8 rgb(23, 162, 184)
|
||||
static const Color tealNormalHover = Color(
|
||||
0xFF1592a6,
|
||||
); // #1592a6 rgb(21, 146, 166)
|
||||
static const Color tealNormalActive = Color(
|
||||
0xFF128293,
|
||||
); // #128293 rgb(18, 130, 147)
|
||||
static const Color tealDark = Color(0xFF117a8a); // #117a8a rgb(17, 122, 138)
|
||||
static const Color tealDarkHover = Color(
|
||||
0xFF0e616e,
|
||||
); // #0e616e rgb(14, 97, 110)
|
||||
static const Color tealDarkActive = Color(
|
||||
0xFF0a4953,
|
||||
); // #0a4953 rgb(10, 73, 83)
|
||||
static const Color tealDarker = Color(0xFF083940); // #083940 rgb(8, 57, 64)
|
||||
//endregion
|
||||
|
||||
//region --- category Colors ---
|
||||
static const Color confirm = greenNormalActive;
|
||||
static const Color warning =yellowNormal;
|
||||
static const Color error =redNormal;
|
||||
static const Color info = tealNormal;
|
||||
//endregion
|
||||
}
|
||||
@@ -1,169 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AppFonts {
|
||||
AppFonts._(); // Private constructor to prevent instantiation
|
||||
|
||||
// --- Font Families ---
|
||||
static const String yekan = 'yekan';
|
||||
|
||||
// --- Font Weights ---
|
||||
static const FontWeight regular = FontWeight.w400;
|
||||
static const FontWeight bold = FontWeight.w600;
|
||||
static const double _height = 1.20;
|
||||
|
||||
static const TextStyle yekan61 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 61,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan49 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 48,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan39 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 39,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan31 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 31,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan25 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 25,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan24 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 24,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan20 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 20,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan18 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 18,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan16 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 16,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan14 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 13,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan13 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 13,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan10 = TextStyle(
|
||||
// Rounded from 10.24
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 10,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan61Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 61,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan49Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 48,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan39Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 39,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan31Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 31,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan25Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 25,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan24Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 24,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan20Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 20,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan16Bold = TextStyle(
|
||||
// Base size bold
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 16,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan13Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 13,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan10Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 10,
|
||||
height: _height,
|
||||
);
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
///This file is automatically generated. DO NOT EDIT, all your changes would be lost.
|
||||
class Assets {
|
||||
Assets._();
|
||||
|
||||
static const String iconsAdd = 'assets/icons/add.svg';
|
||||
static const String iconsArrowLeft = 'assets/icons/arrow_left.svg';
|
||||
static const String iconsArrowRight = 'assets/icons/arrow_right.svg';
|
||||
static const String iconsBgHeaderUserProfile = 'assets/icons/bg_header_user_profile.svg';
|
||||
static const String iconsCalendar = 'assets/icons/calendar.svg';
|
||||
static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg';
|
||||
static const String iconsCall = 'assets/icons/call.svg';
|
||||
static const String iconsDiagram = 'assets/icons/diagram.svg';
|
||||
static const String iconsDownload = 'assets/icons/download.svg';
|
||||
static const String iconsEdit = 'assets/icons/edit.svg';
|
||||
static const String iconsExcelDownload = 'assets/icons/excel_download.svg';
|
||||
static const String iconsFilter = 'assets/icons/filter.svg';
|
||||
static const String iconsGps = 'assets/icons/gps.svg';
|
||||
static const String iconsInformation = 'assets/icons/information.svg';
|
||||
static const String iconsKey = 'assets/icons/key.svg';
|
||||
static const String iconsLogout = 'assets/icons/logout.svg';
|
||||
static const String iconsMap = 'assets/icons/map.svg';
|
||||
static const String iconsMapMarker = 'assets/icons/map_marker.svg';
|
||||
static const String iconsMessageAdd = 'assets/icons/message_add.svg';
|
||||
static const String iconsPdfDownload = 'assets/icons/pdf_download.svg';
|
||||
static const String iconsPictureFrame = 'assets/icons/picture_frame.svg';
|
||||
static const String iconsProfileCircle = 'assets/icons/profile_circle.svg';
|
||||
static const String iconsProfileUser = 'assets/icons/profile_user.svg';
|
||||
static const String iconsReceiptDiscount = 'assets/icons/receipt_discount.svg';
|
||||
static const String iconsScan = 'assets/icons/scan.svg';
|
||||
static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg';
|
||||
static const String iconsSecurityTime = 'assets/icons/security_time.svg';
|
||||
static const String iconsSetting = 'assets/icons/setting.svg';
|
||||
static const String iconsTagUser = 'assets/icons/tag_user.svg';
|
||||
static const String iconsTrash = 'assets/icons/trash.svg';
|
||||
static const String iconsUser = 'assets/icons/user.svg';
|
||||
static const String iconsUserSquare = 'assets/icons/user_square.svg';
|
||||
static const String imagesInnerSplash = 'assets/images/inner_splash.webp';
|
||||
static const String imagesOutterSplash = 'assets/images/outter_splash.webp';
|
||||
static const String vecAddSvg = 'assets/vec/add.svg.vec';
|
||||
static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec';
|
||||
static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec';
|
||||
static const String vecBgHeaderUserProfileSvg = 'assets/vec/bg_header_user_profile.svg.vec';
|
||||
static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec';
|
||||
static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec';
|
||||
static const String vecCallSvg = 'assets/vec/call.svg.vec';
|
||||
static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec';
|
||||
static const String vecDownloadSvg = 'assets/vec/download.svg.vec';
|
||||
static const String vecEditSvg = 'assets/vec/edit.svg.vec';
|
||||
static const String vecExcelDownloadSvg = 'assets/vec/excel_download.svg.vec';
|
||||
static const String vecFilterSvg = 'assets/vec/filter.svg.vec';
|
||||
static const String vecGpsSvg = 'assets/vec/gps.svg.vec';
|
||||
static const String vecInformationSvg = 'assets/vec/information.svg.vec';
|
||||
static const String vecKeySvg = 'assets/vec/key.svg.vec';
|
||||
static const String vecLogoutSvg = 'assets/vec/logout.svg.vec';
|
||||
static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec';
|
||||
static const String vecMapSvg = 'assets/vec/map.svg.vec';
|
||||
static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec';
|
||||
static const String vecPdfDownloadSvg = 'assets/vec/pdf_download.svg.vec';
|
||||
static const String vecPictureFrameSvg = 'assets/vec/picture_frame.svg.vec';
|
||||
static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec';
|
||||
static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec';
|
||||
static const String vecReceiptDiscountSvg = 'assets/vec/receipt_discount.svg.vec';
|
||||
static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec';
|
||||
static const String vecScanSvg = 'assets/vec/scan.svg.vec';
|
||||
static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec';
|
||||
static const String vecSettingSvg = 'assets/vec/setting.svg.vec';
|
||||
static const String vecTagUserSvg = 'assets/vec/tag_user.svg.vec';
|
||||
static const String vecTrashSvg = 'assets/vec/trash.svg.vec';
|
||||
static const String vecUserSquareSvg = 'assets/vec/user_square.svg.vec';
|
||||
static const String vecUserSvg = 'assets/vec/user.svg.vec';
|
||||
|
||||
}
|
||||
@@ -1,8 +1,7 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/captcha/captcha_widget.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
|
||||
enum AuthType { useAndPass, otp }
|
||||
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:inspection/inspection.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_fonts.dart';
|
||||
import 'package:rasadyar_app/presentation/common/assets.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/buttons/elevated.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/captcha/captcha_widget.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/vec_widget.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
import 'package:rasadyar_core/presentation/widget/captcha/captcha_widget.dart';
|
||||
|
||||
import 'logic.dart';
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/assets.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
|
||||
|
||||
import 'logic.dart';
|
||||
|
||||
|
||||
@@ -1,16 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_fonts.dart';
|
||||
import 'package:rasadyar_app/presentation/utils/color_utils.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/buttons/elevated.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/buttons/fab.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/buttons/fab_outlined.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/buttons/outline_elevated.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/buttons/text_button.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/inputs/r_input.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/pagination/pagination_from_until.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/pagination/show_more.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/tabs/tab.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
|
||||
|
||||
class SystemDesignPage extends StatefulWidget {
|
||||
const SystemDesignPage({super.key});
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_fonts.dart';
|
||||
|
||||
class RElevated extends StatefulWidget {
|
||||
RElevated({
|
||||
super.key,
|
||||
required this.text,
|
||||
required this.onPressed,
|
||||
foregroundColor,
|
||||
backgroundColor,
|
||||
disabledBackgroundColor,
|
||||
disabledForegroundColor,
|
||||
radius,
|
||||
textStyle,
|
||||
this.width = 150.0,
|
||||
this.height = 56.0,
|
||||
});
|
||||
|
||||
final String text;
|
||||
final VoidCallback? onPressed;
|
||||
final double width;
|
||||
final double height;
|
||||
Color? foregroundColor;
|
||||
Color? backgroundColor;
|
||||
Color? disabledForegroundColor;
|
||||
Color? disabledBackgroundColor;
|
||||
double? radius;
|
||||
TextStyle? textStyle;
|
||||
|
||||
@override
|
||||
State<RElevated> createState() => _RElevatedState();
|
||||
}
|
||||
|
||||
class _RElevatedState extends State<RElevated> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ElevatedButton(
|
||||
onPressed: widget.onPressed,
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: widget.backgroundColor ?? AppColor.blueNormal,
|
||||
foregroundColor: widget.foregroundColor ?? Colors.white,
|
||||
disabledBackgroundColor:
|
||||
widget.disabledBackgroundColor ?? AppColor.blueNormal.withAlpha(38),
|
||||
disabledForegroundColor: widget.disabledForegroundColor ?? Colors.white,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(widget.radius ?? 8),
|
||||
),
|
||||
fixedSize: Size(widget.width, widget.height),
|
||||
padding: EdgeInsets.zero,
|
||||
textStyle: widget.textStyle ?? AppFonts.yekan24,
|
||||
),
|
||||
child: Text(widget.text),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,234 +0,0 @@
|
||||
/*
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/assets.dart';
|
||||
import 'package:rasadyar_app/presentation/utils/color_utils.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/vec_widget.dart';
|
||||
|
||||
class RFab extends StatefulWidget {
|
||||
|
||||
|
||||
final VoidCallback? onPressed;
|
||||
Color? foregroundColor;
|
||||
Color? backgroundColor;
|
||||
Color? disabledForegroundColor;
|
||||
Color? disabledBackgroundColor;
|
||||
double? radius;
|
||||
ShapeBorder? shapeBorder;
|
||||
Widget? icon;
|
||||
|
||||
@override
|
||||
State<RFab> createState() => _RFabState();
|
||||
|
||||
//region Add
|
||||
RFab.smallAdd({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecAddSvg),
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.add({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecAddSvg),
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Edit
|
||||
RFab.smallEdit({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecEditSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.edit({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecEditSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region delete
|
||||
RFab.smallDelete({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecTrashSvg),
|
||||
backgroundColor: AppColor.redNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.delete({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecTrashSvg),
|
||||
backgroundColor: AppColor.redNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region action
|
||||
RFab.smallAction({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecScanSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.action({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecScanSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region filter
|
||||
RFab.smallFilter({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecFilterSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.filter({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecFilterSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region download
|
||||
RFab.smallDownload({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecDownloadSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.download({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecDownloadSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Excel
|
||||
RFab.smallExcel({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecDownloadSvg),
|
||||
backgroundColor: AppColor.greenDark,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.excel({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecDownloadSvg),
|
||||
backgroundColor: AppColor.greenDark,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Back
|
||||
RFab.smallBack({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecArrowLeftSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.back({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecArrowLeftSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region General
|
||||
RFab.small({
|
||||
required this.onPressed,
|
||||
required this.icon,
|
||||
required this.backgroundColor,
|
||||
super.key,
|
||||
}) : radius = 40.0,
|
||||
foregroundColor = Colors.white;
|
||||
|
||||
RFab({
|
||||
required this.onPressed,
|
||||
required this.icon,
|
||||
required this.backgroundColor,
|
||||
super.key,
|
||||
}) : radius = 56.0,
|
||||
foregroundColor = Colors.white;
|
||||
|
||||
//endregion
|
||||
}
|
||||
|
||||
class _RFabState extends State<RFab> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ElevatedButton(
|
||||
onPressed: widget.onPressed,
|
||||
style: ButtonStyle(
|
||||
side: WidgetStateProperty.all(BorderSide.none),
|
||||
backgroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return widget.backgroundColor?.pressedColor ??
|
||||
AppColor.blueNormalActive;
|
||||
} else if (states.contains(WidgetState.hovered)) {
|
||||
return widget.backgroundColor?.hoverColor ??
|
||||
AppColor.blueNormalHover;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.backgroundColor?.disabledColor ??
|
||||
AppColor.blueNormal.disabledColor;
|
||||
}
|
||||
return widget.backgroundColor ?? AppColor.blueNormal;
|
||||
}),
|
||||
foregroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.disabled)) {
|
||||
return widget.foregroundColor?.disabledColor;
|
||||
}
|
||||
return widget.foregroundColor;
|
||||
}),
|
||||
|
||||
shape: WidgetStatePropertyAll(
|
||||
CircleBorder(side: BorderSide(width: 1, color: Colors.transparent)),
|
||||
),
|
||||
fixedSize: WidgetStatePropertyAll(
|
||||
Size(widget.radius ?? 56, widget.radius ?? 56),
|
||||
),
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
),
|
||||
child: widget.icon,
|
||||
);
|
||||
}
|
||||
}
|
||||
*/
|
||||
@@ -1,607 +0,0 @@
|
||||
/*
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/assets.dart';
|
||||
import 'package:rasadyar_app/presentation/utils/color_utils.dart';
|
||||
import 'package:rasadyar_app/presentation/widget/vec_widget.dart';
|
||||
|
||||
class RFabOutlined extends StatefulWidget {
|
||||
final Widget icon;
|
||||
VoidCallback? onPressed;
|
||||
final Color backgroundColor;
|
||||
final Color? borderColor;
|
||||
final double? radius;
|
||||
OutlinedBorder? shapeBorder;
|
||||
|
||||
@override
|
||||
State<RFabOutlined> createState() => _RFabOutlinedState();
|
||||
|
||||
//region General
|
||||
RFabOutlined({
|
||||
required this.icon,
|
||||
required this.onPressed,
|
||||
required this.backgroundColor,
|
||||
required this.borderColor,
|
||||
this.radius = 56.0,
|
||||
super.key,
|
||||
}) : shapeBorder = CircleBorder(
|
||||
side: BorderSide(color: borderColor ?? Colors.transparent),
|
||||
);
|
||||
|
||||
RFabOutlined.noBorder({
|
||||
required this.icon,
|
||||
required this.onPressed,
|
||||
required this.backgroundColor,
|
||||
super.key,
|
||||
}) : borderColor = Colors.transparent,
|
||||
radius = 56.0,
|
||||
shapeBorder = CircleBorder(
|
||||
side: BorderSide(color: Colors.transparent, width: 1),
|
||||
);
|
||||
|
||||
RFabOutlined.small({
|
||||
required this.icon,
|
||||
required this.onPressed,
|
||||
required this.backgroundColor,
|
||||
required this.borderColor,
|
||||
super.key,
|
||||
}) : radius = 40.0,
|
||||
shapeBorder = CircleBorder(
|
||||
side: BorderSide(color: borderColor ?? Colors.transparent, width: 1),
|
||||
);
|
||||
|
||||
RFabOutlined.smallNoBorder({
|
||||
required this.icon,
|
||||
required this.onPressed,
|
||||
required this.backgroundColor,
|
||||
super.key,
|
||||
}) : borderColor = Colors.transparent,
|
||||
radius = 40.0,
|
||||
shapeBorder = CircleBorder(
|
||||
side: BorderSide(color: Colors.transparent, width: 1),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Add
|
||||
RFabOutlined.smallAdd({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
borderColor: AppColor.greenNormal,
|
||||
icon: vecWidget2(
|
||||
Assets.vecAddSvg,
|
||||
|
||||
color: AppColor.greenNormal,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallAddNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecAddSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenNormal
|
||||
: AppColor.greenNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.add({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
borderColor: AppColor.greenNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecAddSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenNormal
|
||||
: AppColor.greenNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.addNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecAddSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenNormal
|
||||
: AppColor.greenNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Edit
|
||||
RFabOutlined.smallEdit({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecEditSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallEditNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecEditSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.edit({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecEditSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.editNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecEditSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Delete
|
||||
RFabOutlined.smallDelete({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.redNormal,
|
||||
borderColor: AppColor.redNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecTrashSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.redNormal
|
||||
: AppColor.redNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallDeleteNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.redNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecTrashSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.redNormal
|
||||
: AppColor.redNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.delete({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.redNormal,
|
||||
borderColor: AppColor.redNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecTrashSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.redNormal
|
||||
: AppColor.redNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.deleteNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.redNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecTrashSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.redNormal
|
||||
: AppColor.redNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Action
|
||||
RFabOutlined.smallAction({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecScanSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallActionNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecScanSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.action({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecScanSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.actionNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecScanSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Filter
|
||||
RFabOutlined.smallFilter({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecFilterSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallFilterNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecFilterSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.filter({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecFilterSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.filterNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecFilterSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Download
|
||||
RFabOutlined.smallDownload({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallDownloadNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.download({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.downloadNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Excel
|
||||
RFabOutlined.smallExcel({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenDark,
|
||||
borderColor: AppColor.greenDark,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallExcelNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenDark,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.excel({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenDark,
|
||||
borderColor: AppColor.greenDark,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.excelNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenDark,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Back
|
||||
RFabOutlined.smallBack({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecArrowLeftSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallBackNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecArrowLeftSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.back({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecArrowLeftSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.backNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecArrowLeftSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
}
|
||||
|
||||
class _RFabOutlinedState extends State<RFabOutlined> {
|
||||
bool isOnPressed =false;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return OutlinedButton(
|
||||
onPressed:widget.onPressed ,
|
||||
style: ButtonStyle(
|
||||
side: WidgetStateProperty.resolveWith<BorderSide?>((states) {
|
||||
if (states.contains(WidgetState.disabled)) {
|
||||
return BorderSide(
|
||||
color:
|
||||
widget.borderColor?.disabledColor ??
|
||||
AppColor.blueNormal.disabledColor,
|
||||
width: 2,
|
||||
);
|
||||
}
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal,
|
||||
width: 2,
|
||||
);
|
||||
}),
|
||||
backgroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return widget.backgroundColor;
|
||||
} else if (states.contains(WidgetState.hovered)) {
|
||||
return widget.backgroundColor.hoverColor ??
|
||||
AppColor.blueNormal.hoverColor;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.backgroundColor.disabledColor ??
|
||||
AppColor.blueNormal.disabledColor;
|
||||
}
|
||||
return Colors.transparent;
|
||||
}),
|
||||
foregroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return Colors.white;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.backgroundColor.disabledColor ??
|
||||
AppColor.blueNormal.disabledColor;
|
||||
}
|
||||
return widget.backgroundColor;
|
||||
}),
|
||||
|
||||
shape: WidgetStatePropertyAll(widget.shapeBorder),
|
||||
fixedSize: WidgetStatePropertyAll(
|
||||
Size(widget.radius ?? 56, widget.radius ?? 56),
|
||||
),
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
),
|
||||
child: widget.icon
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
@@ -1,101 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_fonts.dart';
|
||||
import 'package:rasadyar_app/presentation/utils/color_utils.dart';
|
||||
|
||||
class ROutlinedElevated extends StatefulWidget {
|
||||
ROutlinedElevated({
|
||||
super.key,
|
||||
required this.text,
|
||||
required this.onPressed,
|
||||
this.foregroundColor,
|
||||
this.backgroundColor,
|
||||
this.borderColor,
|
||||
this.disabledBackgroundColor,
|
||||
this.pressedBackgroundColor,
|
||||
this.radius,
|
||||
this.textStyle,
|
||||
this.width = 150.0,
|
||||
this.height = 56.0,
|
||||
});
|
||||
|
||||
final String text;
|
||||
final VoidCallback? onPressed;
|
||||
final double width;
|
||||
final double height;
|
||||
Color? foregroundColor;
|
||||
Color? backgroundColor;
|
||||
|
||||
Color? borderColor;
|
||||
|
||||
Color? disabledBackgroundColor;
|
||||
Color? pressedBackgroundColor;
|
||||
double? radius;
|
||||
TextStyle? textStyle;
|
||||
|
||||
@override
|
||||
State<ROutlinedElevated> createState() => _ROutlinedElevatedState();
|
||||
}
|
||||
|
||||
class _ROutlinedElevatedState extends State<ROutlinedElevated> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return OutlinedButton(
|
||||
onPressed: widget.onPressed,
|
||||
style: ButtonStyle(
|
||||
side: WidgetStateProperty.resolveWith<BorderSide?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal,
|
||||
width: 2,
|
||||
);
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38),
|
||||
width: 2,
|
||||
);
|
||||
}
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal,
|
||||
width: 2,
|
||||
);
|
||||
}),
|
||||
backgroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
if (widget.pressedBackgroundColor != null) {
|
||||
return widget.pressedBackgroundColor;
|
||||
}
|
||||
return widget.backgroundColor?.pressedColor ?? AppColor.blueNormal;
|
||||
} else if (states.contains(WidgetState.hovered)) {
|
||||
return widget.backgroundColor?.hoverColor ??
|
||||
AppColor.blueNormal.hoverColor;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.backgroundColor?.disabledColor ?? Colors.transparent;
|
||||
}
|
||||
return widget.backgroundColor;
|
||||
}),
|
||||
foregroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return Colors.white;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return AppColor.blueNormal.withAlpha(38);
|
||||
}
|
||||
return AppColor.blueNormal;
|
||||
}),
|
||||
|
||||
shape: WidgetStatePropertyAll(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(widget.radius ?? 8),
|
||||
),
|
||||
),
|
||||
fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)),
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
textStyle: WidgetStatePropertyAll(
|
||||
widget.textStyle ??
|
||||
AppFonts.yekan24.copyWith(color: AppColor.blueNormal),
|
||||
),
|
||||
),
|
||||
child: Text(widget.text),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_fonts.dart';
|
||||
import 'package:rasadyar_app/presentation/utils/color_utils.dart';
|
||||
|
||||
class ROutlinedElevatedIcon extends StatefulWidget {
|
||||
ROutlinedElevatedIcon({
|
||||
super.key,
|
||||
required this.text,
|
||||
required this.onPressed,
|
||||
this.foregroundColor,
|
||||
this.backgroundColor,
|
||||
this.borderColor,
|
||||
this.disabledBackgroundColor,
|
||||
this.pressedBackgroundColor,
|
||||
this.radius,
|
||||
this.textStyle,
|
||||
this.width = 150.0,
|
||||
this.height = 56.0,
|
||||
});
|
||||
|
||||
final String text;
|
||||
final VoidCallback? onPressed;
|
||||
final double width;
|
||||
final double height;
|
||||
Color? foregroundColor;
|
||||
Color? backgroundColor;
|
||||
|
||||
Color? borderColor;
|
||||
|
||||
Color? disabledBackgroundColor;
|
||||
Color? pressedBackgroundColor;
|
||||
double? radius;
|
||||
TextStyle? textStyle;
|
||||
Widget? icon;
|
||||
|
||||
@override
|
||||
State<ROutlinedElevatedIcon> createState() => _ROutlinedElevatedStateIcon();
|
||||
}
|
||||
|
||||
class _ROutlinedElevatedStateIcon extends State<ROutlinedElevatedIcon> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return OutlinedButton.icon(
|
||||
icon: widget.icon,
|
||||
label: Text(widget.text),
|
||||
onPressed: widget.onPressed,
|
||||
style: ButtonStyle(
|
||||
side: WidgetStateProperty.resolveWith<BorderSide?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal,
|
||||
width: 2,
|
||||
);
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38),
|
||||
width: 2,
|
||||
);
|
||||
}
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal,
|
||||
width: 2,
|
||||
);
|
||||
}),
|
||||
backgroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
if (widget.pressedBackgroundColor != null) {
|
||||
return widget.pressedBackgroundColor;
|
||||
}
|
||||
return widget.backgroundColor?.pressedColor ?? AppColor.blueNormal;
|
||||
} else if (states.contains(WidgetState.hovered)) {
|
||||
return widget.backgroundColor?.hoverColor ??
|
||||
AppColor.blueNormal.hoverColor;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.backgroundColor?.disabledColor ?? Colors.transparent;
|
||||
}
|
||||
return widget.backgroundColor;
|
||||
}),
|
||||
foregroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return Colors.white;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return AppColor.blueNormal.withAlpha(38);
|
||||
}
|
||||
return AppColor.blueNormal;
|
||||
}),
|
||||
|
||||
shape: WidgetStatePropertyAll(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(widget.radius ?? 8),
|
||||
),
|
||||
),
|
||||
fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)),
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
textStyle: WidgetStatePropertyAll(
|
||||
widget.textStyle ??
|
||||
AppFonts.yekan24.copyWith(color: AppColor.blueNormal),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_fonts.dart';
|
||||
|
||||
class RTextButton extends StatefulWidget {
|
||||
RTextButton({
|
||||
super.key,
|
||||
required this.text,
|
||||
required this.onPressed,
|
||||
this.foregroundColor,
|
||||
this.backgroundColor,
|
||||
this.borderColor,
|
||||
this.disabledBackgroundColor,
|
||||
this.radius,
|
||||
this.textStyle,
|
||||
this.width = 150.0,
|
||||
this.height = 56.0,
|
||||
});
|
||||
|
||||
final String text;
|
||||
final VoidCallback? onPressed;
|
||||
final double width;
|
||||
final double height;
|
||||
Color? foregroundColor;
|
||||
Color? backgroundColor;
|
||||
Color? borderColor;
|
||||
|
||||
Color? disabledBackgroundColor;
|
||||
double? radius;
|
||||
TextStyle? textStyle;
|
||||
|
||||
@override
|
||||
State<RTextButton> createState() => _RTextButtonState();
|
||||
}
|
||||
|
||||
class _RTextButtonState extends State<RTextButton> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return TextButton(
|
||||
style: ButtonStyle(
|
||||
side: WidgetStatePropertyAll(BorderSide.none),
|
||||
backgroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return widget.backgroundColor ?? AppColor.blueNormal;
|
||||
} else if (states.contains(WidgetState.hovered)) {
|
||||
return widget.backgroundColor?.withAlpha(38) ?? AppColor.blueNormal.withAlpha(38);
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.disabledBackgroundColor ?? Colors.transparent;
|
||||
}
|
||||
return Colors.transparent;
|
||||
}),
|
||||
foregroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return Colors.white;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return AppColor.blueNormal.withAlpha(38);
|
||||
}
|
||||
return AppColor.blueNormal;
|
||||
}),
|
||||
|
||||
shape: WidgetStatePropertyAll(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(widget.radius ?? 8),
|
||||
),
|
||||
),
|
||||
fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)),
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
textStyle: WidgetStatePropertyAll(
|
||||
widget.textStyle ??
|
||||
AppFonts.yekan24.copyWith(color: AppColor.blueNormal),
|
||||
),
|
||||
),
|
||||
onPressed:widget.onPressed,
|
||||
child: Text(widget.text),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,266 +0,0 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_fonts.dart';
|
||||
|
||||
class CaptchaController {
|
||||
int? captchaCode;
|
||||
TextEditingController textController = TextEditingController();
|
||||
GlobalKey<FormState> formKey = GlobalKey<FormState>();
|
||||
|
||||
late Function() refreshCaptcha;
|
||||
|
||||
bool validate() {
|
||||
if (formKey.currentState?.validate() == true) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
String get enteredText => textController.text;
|
||||
|
||||
bool isCorrect() {
|
||||
return textController.text == captchaCode.toString();
|
||||
}
|
||||
|
||||
void clear() {
|
||||
textController.clear();
|
||||
}
|
||||
}
|
||||
|
||||
class RandomLinePainter extends CustomPainter {
|
||||
final Random random = Random();
|
||||
final Paint linePaint;
|
||||
final List<Offset> points;
|
||||
|
||||
RandomLinePainter({
|
||||
required this.points,
|
||||
required Color lineColor,
|
||||
double strokeWidth = 2.0,
|
||||
}) : linePaint =
|
||||
Paint()
|
||||
..color = lineColor
|
||||
..strokeWidth = strokeWidth
|
||||
..strokeCap = StrokeCap.round
|
||||
..style = PaintingStyle.stroke;
|
||||
|
||||
@override
|
||||
void paint(Canvas canvas, Size size) {
|
||||
final path = Path();
|
||||
|
||||
if (points.isNotEmpty) {
|
||||
path.moveTo(points[0].dx, points[0].dy);
|
||||
|
||||
for (int i = 1; i < points.length; i++) {
|
||||
path.lineTo(points[i].dx, points[i].dy);
|
||||
}
|
||||
|
||||
canvas.drawPath(path, linePaint);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
bool shouldRepaint(RandomLinePainter oldDelegate) => true;
|
||||
}
|
||||
|
||||
class CaptchaWidget extends StatefulWidget {
|
||||
final CaptchaController controller;
|
||||
final bool autoValidateMode;
|
||||
|
||||
const CaptchaWidget({
|
||||
required this.controller,
|
||||
this.autoValidateMode = false,
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
_CaptchaWidgetState createState() => _CaptchaWidgetState();
|
||||
}
|
||||
|
||||
class _CaptchaWidgetState extends State<CaptchaWidget> {
|
||||
late List<Offset> points;
|
||||
late List<Offset> points1;
|
||||
late List<Offset> points2;
|
||||
bool isOnError = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
generateLines();
|
||||
getRandomSixDigitNumber();
|
||||
|
||||
// Set the refresh function in the controller
|
||||
widget.controller.refreshCaptcha = () {
|
||||
getRandomSixDigitNumber();
|
||||
generateLines();
|
||||
setState(() {});
|
||||
};
|
||||
}
|
||||
|
||||
void generateLines() {
|
||||
points = generateRandomLine();
|
||||
points1 = generateRandomLine();
|
||||
points2 = generateRandomLine();
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
List<Offset> generateRandomLine() {
|
||||
final random = Random();
|
||||
int pointCount = random.nextInt(10) + 5;
|
||||
List<Offset> points = [];
|
||||
|
||||
double previousY = 0;
|
||||
|
||||
for (int i = 0; i < pointCount; i++) {
|
||||
double x = (i / (pointCount - 1)) * 135;
|
||||
|
||||
if (i == 0) {
|
||||
previousY = 24;
|
||||
} else {
|
||||
double change = (random.nextDouble() * 20) - 10;
|
||||
previousY = max(5, min(43, previousY + change));
|
||||
}
|
||||
|
||||
points.add(Offset(x, previousY));
|
||||
}
|
||||
|
||||
return points;
|
||||
}
|
||||
|
||||
void getRandomSixDigitNumber() {
|
||||
final random = Random();
|
||||
widget.controller.captchaCode = random.nextInt(900000) + 100000;
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
width: 135,
|
||||
height: 48,
|
||||
decoration: BoxDecoration(
|
||||
color: AppColor.whiteNormalHover,
|
||||
border: Border.all(color: Colors.grey.shade300),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: Stack(
|
||||
alignment: AlignmentDirectional.center,
|
||||
children: [
|
||||
CustomPaint(
|
||||
painter: RandomLinePainter(
|
||||
points: points,
|
||||
lineColor: Colors.blue,
|
||||
strokeWidth: 1.0,
|
||||
),
|
||||
size: const Size(double.infinity, double.infinity),
|
||||
),
|
||||
CustomPaint(
|
||||
painter: RandomLinePainter(
|
||||
points: points1,
|
||||
lineColor: Colors.green,
|
||||
strokeWidth: 1.0,
|
||||
),
|
||||
size: const Size(double.infinity, double.infinity),
|
||||
),
|
||||
CustomPaint(
|
||||
painter: RandomLinePainter(
|
||||
points: points2,
|
||||
lineColor: Colors.red,
|
||||
strokeWidth: 1.0,
|
||||
),
|
||||
size: const Size(double.infinity, double.infinity),
|
||||
),
|
||||
Text(
|
||||
widget.controller.captchaCode.toString(),
|
||||
style: AppFonts.yekan24,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
onPressed: widget.controller.refreshCaptcha,
|
||||
icon: Icon(CupertinoIcons.refresh, size: 16),
|
||||
),
|
||||
Expanded(
|
||||
child: Form(
|
||||
key: widget.controller.formKey,
|
||||
autovalidateMode:
|
||||
widget.autoValidateMode
|
||||
? AutovalidateMode.onUserInteraction
|
||||
: AutovalidateMode.disabled,
|
||||
child: TextFormField(
|
||||
controller: widget.controller.textController,
|
||||
decoration: InputDecoration(
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
gapPadding: 11,
|
||||
),
|
||||
labelText: 'کد امنیتی',
|
||||
labelStyle: AppFonts.yekan13,
|
||||
errorStyle: AppFonts.yekan10.copyWith(
|
||||
color: AppColor.redNormal,
|
||||
fontSize: 8,
|
||||
),
|
||||
suffixIconConstraints: BoxConstraints(
|
||||
maxHeight: 24,
|
||||
minHeight: 24,
|
||||
maxWidth: 24,
|
||||
minWidth: 24,
|
||||
),
|
||||
|
||||
suffix:
|
||||
widget.controller.textController.text.trim().isNotEmpty
|
||||
? clearButton(() {
|
||||
widget.controller.textController.clear();
|
||||
setState(() {});
|
||||
})
|
||||
: null,
|
||||
counterText: '',
|
||||
),
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
decimal: false,
|
||||
signed: false,
|
||||
),
|
||||
maxLines: 1,
|
||||
maxLength: 6,
|
||||
onChanged: (value) {
|
||||
if (isOnError) {
|
||||
isOnError = !isOnError;
|
||||
widget.controller.formKey.currentState?.reset();
|
||||
widget.controller.textController.text = value;
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
validator: (value) {
|
||||
if (value == null || value.isEmpty) {
|
||||
isOnError = true;
|
||||
return 'کد امنیتی را وارد کنید';
|
||||
}
|
||||
if (value != widget.controller.captchaCode.toString()) {
|
||||
isOnError = true;
|
||||
return '⚠️کد امنیتی وارد شده اشتباه است';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
style: AppFonts.yekan13,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget clearButton(VoidCallback onTap) {
|
||||
return GestureDetector(
|
||||
onTap: onTap,
|
||||
child: Icon(CupertinoIcons.multiply_circle, size: 18),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,216 +0,0 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
@immutable
|
||||
class RTextField extends StatefulWidget {
|
||||
RTextField(
|
||||
{super.key,
|
||||
this.maxLines,
|
||||
this.maxLength,
|
||||
this.hintText,
|
||||
this.padding,
|
||||
this.onChanged,
|
||||
this.onSubmitted,
|
||||
this.keyboardType,
|
||||
this.showCounter = false,
|
||||
this.isDense,
|
||||
this.initText,
|
||||
this.isForNumber = false,
|
||||
this.style,
|
||||
this.hintStyle,
|
||||
this.suffixIcon,
|
||||
this.prefixIcon,
|
||||
this.validator,
|
||||
this.readonly = false,
|
||||
this.boxConstraints,
|
||||
this.minLines,
|
||||
this.radius,
|
||||
this.filled,
|
||||
this.enabled,
|
||||
this.errorStyle,
|
||||
this.labelStyle,
|
||||
this.label}) {
|
||||
filled = filled ?? false;
|
||||
obscure = false;
|
||||
_inputBorder = OutlineInputBorder(
|
||||
borderSide: BorderSide(color: Colors.grey.shade300),
|
||||
borderRadius: BorderRadius.circular(radius ?? 16));
|
||||
}
|
||||
|
||||
RTextField.noBorder(
|
||||
{super.key,
|
||||
this.maxLines,
|
||||
this.maxLength,
|
||||
this.hintText,
|
||||
this.padding,
|
||||
this.onChanged,
|
||||
this.onSubmitted,
|
||||
this.keyboardType,
|
||||
this.showCounter = false,
|
||||
this.isDense,
|
||||
this.initText,
|
||||
this.style,
|
||||
this.hintStyle,
|
||||
this.suffixIcon,
|
||||
this.radius,
|
||||
this.validator,
|
||||
this.boxConstraints,
|
||||
this.minLines,
|
||||
this.isForNumber = false,
|
||||
this.readonly = false,
|
||||
this.label,
|
||||
this.filled,
|
||||
this.errorStyle,
|
||||
this.labelStyle,
|
||||
this.enabled}) {
|
||||
_inputBorder = OutlineInputBorder(
|
||||
borderSide: BorderSide.none,
|
||||
borderRadius: BorderRadius.circular(radius ?? 16));
|
||||
obscure = false;
|
||||
filled = filled ?? true;
|
||||
}
|
||||
|
||||
RTextField.password(
|
||||
{super.key,
|
||||
this.maxLines = 1,
|
||||
this.maxLength,
|
||||
this.hintText,
|
||||
this.padding,
|
||||
this.onChanged,
|
||||
this.onSubmitted,
|
||||
this.keyboardType,
|
||||
this.showCounter = false,
|
||||
this.isDense,
|
||||
this.initText,
|
||||
this.style,
|
||||
this.hintStyle,
|
||||
this.suffixIcon,
|
||||
this.prefixIcon,
|
||||
this.radius,
|
||||
this.validator,
|
||||
this.boxConstraints,
|
||||
this.minLines,
|
||||
this.isForNumber = false,
|
||||
this.readonly = false,
|
||||
this.label,
|
||||
this.filled,
|
||||
this.errorStyle,
|
||||
this.labelStyle,
|
||||
this.enabled}) {
|
||||
_inputBorder = OutlineInputBorder(
|
||||
borderSide: BorderSide.none,
|
||||
borderRadius: BorderRadius.circular(radius ?? 16));
|
||||
filled = filled ?? true;
|
||||
obscure = true;
|
||||
_isPassword = true;
|
||||
prefixIcon = prefixIcon ?? const Icon(CupertinoIcons.person);
|
||||
}
|
||||
|
||||
final int? maxLines;
|
||||
final int? minLines;
|
||||
final int? maxLength;
|
||||
final String? hintText;
|
||||
final String? label;
|
||||
final EdgeInsets? padding;
|
||||
final TextStyle? style;
|
||||
final TextStyle? errorStyle;
|
||||
final TextStyle? hintStyle;
|
||||
final TextStyle? labelStyle;
|
||||
final bool showCounter;
|
||||
final bool? isDense;
|
||||
final bool? isForNumber;
|
||||
final bool readonly;
|
||||
bool? obscure;
|
||||
final bool? enabled;
|
||||
final double? radius;
|
||||
final TextInputType? keyboardType;
|
||||
final Function(String)? onChanged;
|
||||
final Function(String)? onSubmitted;
|
||||
final FormFieldValidator? validator;
|
||||
final String? initText;
|
||||
Widget? suffixIcon;
|
||||
Widget? prefixIcon;
|
||||
bool? filled;
|
||||
bool _isPassword = false;
|
||||
|
||||
final BoxConstraints? boxConstraints;
|
||||
late final InputBorder? _inputBorder;
|
||||
|
||||
@override
|
||||
State<RTextField> createState() => _RTextFieldState();
|
||||
}
|
||||
|
||||
class _RTextFieldState extends State<RTextField> {
|
||||
final TextEditingController _controller = TextEditingController();
|
||||
bool? obscure;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
if (widget.initText != null) {
|
||||
_controller.text = widget.initText!;
|
||||
}
|
||||
obscure = widget.obscure;
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(covariant RTextField oldWidget) {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
if (widget.initText != oldWidget.initText) {
|
||||
_controller.text = widget.initText ?? '';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Padding(
|
||||
padding: widget.padding ?? const EdgeInsets.symmetric(vertical: 6.0),
|
||||
child: TextFormField(
|
||||
controller: _controller,
|
||||
readOnly: widget.readonly,
|
||||
minLines: widget.minLines,
|
||||
maxLines: widget.maxLines,
|
||||
onChanged: widget.onChanged,
|
||||
validator: widget.validator,
|
||||
enabled: widget.enabled,
|
||||
obscureText: obscure ?? false,
|
||||
onTapOutside: (event) {
|
||||
FocusScope.of(context).unfocus();
|
||||
},
|
||||
onFieldSubmitted: widget.onSubmitted,
|
||||
maxLength: widget.maxLength,
|
||||
textDirection: TextDirection.rtl,
|
||||
style: widget.style ,
|
||||
keyboardType: widget.keyboardType,
|
||||
decoration: InputDecoration(
|
||||
errorStyle: widget.errorStyle,
|
||||
errorMaxLines: 1,
|
||||
isDense: widget.isDense,
|
||||
suffixIcon: widget.suffixIcon ??
|
||||
(widget._isPassword
|
||||
? IconButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
obscure = !obscure!;
|
||||
});
|
||||
},
|
||||
icon: Icon(!obscure!
|
||||
? CupertinoIcons.eye_slash
|
||||
: CupertinoIcons.eye))
|
||||
: null),
|
||||
suffixIconConstraints: widget.boxConstraints,
|
||||
prefixIcon: widget.prefixIcon,
|
||||
prefixIconConstraints: widget.boxConstraints,
|
||||
hintText: widget.hintText,
|
||||
labelText: widget.label,
|
||||
labelStyle: widget.labelStyle,
|
||||
filled: widget.filled,
|
||||
counter: widget.showCounter ? null : const SizedBox(),
|
||||
hintStyle: widget.hintStyle,
|
||||
enabledBorder: widget._inputBorder,
|
||||
focusedBorder: widget._inputBorder,
|
||||
border: widget._inputBorder),
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -1,255 +0,0 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_fonts.dart';
|
||||
|
||||
class PaginationFromUntil extends StatefulWidget {
|
||||
const PaginationFromUntil({super.key});
|
||||
|
||||
@override
|
||||
State<PaginationFromUntil> createState() => _PaginationFromUntilState();
|
||||
}
|
||||
|
||||
class _PaginationFromUntilState extends State<PaginationFromUntil> {
|
||||
int current = 1;
|
||||
int total = 10;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
width: 164,
|
||||
height: 47,
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: ShapeDecoration(
|
||||
color: const Color(0xFFEAEFFF),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50)),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
FloatingActionButton.small(
|
||||
onPressed: () {
|
||||
if(current>1){
|
||||
setState(() {
|
||||
current--;
|
||||
});
|
||||
}
|
||||
|
||||
},
|
||||
shape: CircleBorder(),
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.white,
|
||||
child: Icon(CupertinoIcons.arrow_left, color: AppColor.blueNormal),
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
'$current از $total',
|
||||
textAlign: TextAlign.center,
|
||||
textDirection: TextDirection.rtl,
|
||||
style: AppFonts.yekan16.copyWith(
|
||||
color: AppColor.blueNormal,
|
||||
),
|
||||
),
|
||||
),
|
||||
FloatingActionButton.small(
|
||||
|
||||
onPressed:() {
|
||||
if (current < total) {
|
||||
setState(() {
|
||||
current++;
|
||||
});
|
||||
}
|
||||
},
|
||||
shape: CircleBorder(),
|
||||
elevation: 0,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
child: Icon(CupertinoIcons.arrow_right, color: Colors.white),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Stack buildStack() {
|
||||
return Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 4,
|
||||
top: 4,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 40,
|
||||
top: 40,
|
||||
child: Container(
|
||||
transform:
|
||||
Matrix4.identity()
|
||||
..translate(0.0, 0.0)
|
||||
..rotateZ(-3.14),
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: ShapeDecoration(
|
||||
color:
|
||||
Colors.white /* Secondary */,
|
||||
shape: RoundedRectangleBorder(
|
||||
side: BorderSide(
|
||||
width: 1,
|
||||
color:
|
||||
Colors
|
||||
.white /* Secondary */,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius.circular(50),
|
||||
),
|
||||
),
|
||||
child: Stack(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 8,
|
||||
top: 8,
|
||||
child: Container(width: 24, height: 24, child: Stack()),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 120,
|
||||
top: 3,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 40,
|
||||
top: 40,
|
||||
child: Container(
|
||||
transform:
|
||||
Matrix4.identity()
|
||||
..translate(0.0, 0.0)
|
||||
..rotateZ(-3.14),
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: ShapeDecoration(
|
||||
color: const Color(
|
||||
0xFF2D5FFF,
|
||||
) /* Primary */,
|
||||
shape: RoundedRectangleBorder(
|
||||
side: BorderSide(
|
||||
width: 1,
|
||||
color: const Color(
|
||||
0xFF2D5FFF,
|
||||
) /* Primary */,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius.circular(50),
|
||||
),
|
||||
),
|
||||
child: Stack(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 8,
|
||||
top: 8,
|
||||
child: Container(width: 24, height: 24, child: Stack()),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 63,
|
||||
top: 9,
|
||||
child: Text(
|
||||
'1 از 17',
|
||||
style: TextStyle(
|
||||
color: const Color(0xFF2D5FFF) /* Primary */,
|
||||
fontSize: 16,
|
||||
fontFamily: 'IRANYekanFN',
|
||||
fontWeight: FontWeight.w400,
|
||||
height: 1.75,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_fonts.dart';
|
||||
|
||||
class RShowMore extends StatefulWidget {
|
||||
const RShowMore({super.key});
|
||||
|
||||
@override
|
||||
State<RShowMore> createState() => _RShowMoreState();
|
||||
}
|
||||
|
||||
class _RShowMoreState extends State<RShowMore>
|
||||
with SingleTickerProviderStateMixin {
|
||||
bool _toggled = false;
|
||||
late final AnimationController _controller;
|
||||
late final Animation<double> _iconRotation;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
_controller = AnimationController(
|
||||
vsync: this,
|
||||
duration: const Duration(milliseconds: 500),
|
||||
);
|
||||
_iconRotation = Tween<double>(
|
||||
begin: 0,
|
||||
end: 0.50,
|
||||
) // 90 degrees (quarter turn)
|
||||
.animate(CurvedAnimation(parent: _controller, curve: Curves.easeInOut));
|
||||
}
|
||||
|
||||
void _toggle() {
|
||||
setState(() => _toggled = !_toggled);
|
||||
_toggled ? _controller.forward() : _controller.reverse();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: _toggle,
|
||||
behavior: HitTestBehavior.opaque,
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
spacing: 8,
|
||||
children: [
|
||||
RotationTransition(
|
||||
turns: _iconRotation,
|
||||
child: const Icon(CupertinoIcons.chevron_down, size: 12,color:AppColor.blueNormal ,),
|
||||
),
|
||||
|
||||
AnimatedSwitcher(
|
||||
duration: const Duration(milliseconds: 500),
|
||||
transitionBuilder:
|
||||
(child, animation) =>
|
||||
FadeTransition(opacity: animation, child: child),
|
||||
child: Text(
|
||||
_toggled ? 'کمتر' : 'مشاهده بیشتر',
|
||||
key: ValueKey(_toggled),
|
||||
style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 50,)
|
||||
],
|
||||
|
||||
|
||||
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,784 +0,0 @@
|
||||
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
/// @docImport 'switch.dart';
|
||||
library;
|
||||
|
||||
import 'dart:collection';
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
|
||||
// Minimum padding from edges of the segmented control to edges of
|
||||
// encompassing widget.
|
||||
const EdgeInsetsGeometry _kHorizontalItemPadding = EdgeInsets.symmetric(
|
||||
horizontal: 16.0,
|
||||
);
|
||||
|
||||
// Minimum height of the segmented control.
|
||||
const double _kMinSegmentedControlHeight = 28.0;
|
||||
|
||||
// The default color used for the text of the disabled segment.
|
||||
const Color _kDisableTextColor = Color.fromARGB(115, 122, 122, 122);
|
||||
|
||||
// The duration of the fade animation used to transition when a new widget
|
||||
// is selected.
|
||||
const Duration _kFadeDuration = Duration(milliseconds: 165);
|
||||
|
||||
class NewCupertinoSegmentedControl<T extends Object> extends StatefulWidget {
|
||||
/// Creates an iOS-style segmented control bar.
|
||||
///
|
||||
/// The [children] argument must be an ordered [Map] such as a
|
||||
/// [LinkedHashMap]. Further, the length of the [children] list must be
|
||||
/// greater than one.
|
||||
///
|
||||
/// Each widget value in the map of [children] must have an associated key
|
||||
/// that uniquely identifies this widget. This key is what will be returned
|
||||
/// in the [onValueChanged] callback when a new value from the [children] map
|
||||
/// is selected.
|
||||
///
|
||||
/// The [groupValue] is the currently selected value for the segmented control.
|
||||
/// If no [groupValue] is provided, or the [groupValue] is null, no widget will
|
||||
/// appear as selected. The [groupValue] must be either null or one of the keys
|
||||
/// in the [children] map.
|
||||
NewCupertinoSegmentedControl({
|
||||
super.key,
|
||||
required this.children,
|
||||
required this.onValueChanged,
|
||||
this.groupValue,
|
||||
this.unselectedColor,
|
||||
this.selectedColor,
|
||||
this.borderColor,
|
||||
this.pressedColor,
|
||||
this.disabledColor,
|
||||
this.disabledTextColor,
|
||||
this.padding,
|
||||
this.disabledChildren = const <Never>{},
|
||||
}) : assert(children.length >= 2),
|
||||
assert(
|
||||
groupValue == null ||
|
||||
children.keys.any((T child) => child == groupValue),
|
||||
'The groupValue must be either null or one of the keys in the children map.',
|
||||
);
|
||||
|
||||
/// The identifying keys and corresponding widget values in the
|
||||
/// segmented control.
|
||||
///
|
||||
/// The map must have more than one entry.
|
||||
/// This attribute must be an ordered [Map] such as a [LinkedHashMap].
|
||||
final Map<T, Widget> children;
|
||||
|
||||
/// The identifier of the widget that is currently selected.
|
||||
///
|
||||
/// This must be one of the keys in the [Map] of [children].
|
||||
/// If this attribute is null, no widget will be initially selected.
|
||||
final T? groupValue;
|
||||
|
||||
/// The callback that is called when a new option is tapped.
|
||||
///
|
||||
/// The segmented control passes the newly selected widget's associated key
|
||||
/// to the callback but does not actually change state until the parent
|
||||
/// widget rebuilds the segmented control with the new [groupValue].
|
||||
final ValueChanged<T> onValueChanged;
|
||||
|
||||
/// The color used to fill the backgrounds of unselected widgets and as the
|
||||
/// text color of the selected widget.
|
||||
///
|
||||
/// Defaults to [CupertinoTheme]'s `primaryContrastingColor` if null.
|
||||
final Color? unselectedColor;
|
||||
|
||||
/// The color used to fill the background of the selected widget and as the text
|
||||
/// color of unselected widgets.
|
||||
///
|
||||
/// Defaults to [CupertinoTheme]'s `primaryColor` if null.
|
||||
final Color? selectedColor;
|
||||
|
||||
/// The color used as the border around each widget.
|
||||
///
|
||||
/// Defaults to [CupertinoTheme]'s `primaryColor` if null.
|
||||
final Color? borderColor;
|
||||
|
||||
/// The color used to fill the background of the widget the user is
|
||||
/// temporarily interacting with through a long press or drag.
|
||||
///
|
||||
/// Defaults to the selectedColor at 20% opacity if null.
|
||||
final Color? pressedColor;
|
||||
|
||||
/// The color used to fill the background of the segment when it is disabled.
|
||||
///
|
||||
/// If null, this color will be 50% opacity of the [selectedColor] when
|
||||
/// the segment is selected. If the segment is unselected, this color will be
|
||||
/// set to [unselectedColor].
|
||||
final Color? disabledColor;
|
||||
|
||||
/// The color used for the text of the segment when it is disabled.
|
||||
final Color? disabledTextColor;
|
||||
|
||||
/// The CupertinoSegmentedControl will be placed inside this padding.
|
||||
///
|
||||
/// Defaults to EdgeInsets.symmetric(horizontal: 16.0)
|
||||
final EdgeInsetsGeometry? padding;
|
||||
|
||||
/// The set of identifying keys that correspond to the segments that should be disabled.
|
||||
///
|
||||
/// All segments are enabled by default.
|
||||
final Set<T> disabledChildren;
|
||||
|
||||
@override
|
||||
State<NewCupertinoSegmentedControl<T>> createState() =>
|
||||
_SegmentedControlState<T>();
|
||||
}
|
||||
|
||||
class _SegmentedControlState<T extends Object>
|
||||
extends State<NewCupertinoSegmentedControl<T>>
|
||||
with TickerProviderStateMixin<NewCupertinoSegmentedControl<T>> {
|
||||
T? _pressedKey;
|
||||
|
||||
final List<AnimationController> _selectionControllers =
|
||||
<AnimationController>[];
|
||||
final List<ColorTween> _childTweens = <ColorTween>[];
|
||||
|
||||
late ColorTween _forwardBackgroundColorTween;
|
||||
late ColorTween _reverseBackgroundColorTween;
|
||||
late ColorTween _textColorTween;
|
||||
|
||||
Color? _selectedColor;
|
||||
Color? _unselectedColor;
|
||||
Color? _borderColor;
|
||||
Color? _pressedColor;
|
||||
Color? _selectedDisabledColor;
|
||||
Color? _unselectedDisabledColor;
|
||||
Color? _disabledTextColor;
|
||||
|
||||
AnimationController createAnimationController() {
|
||||
return AnimationController(duration: _kFadeDuration, vsync: this)
|
||||
..addListener(() {
|
||||
setState(() {
|
||||
// State of background/text colors has changed
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
bool _updateColors() {
|
||||
assert(mounted, 'This should only be called after didUpdateDependencies');
|
||||
bool changed = false;
|
||||
final Color disabledTextColor =
|
||||
widget.disabledTextColor ?? _kDisableTextColor;
|
||||
if (_disabledTextColor != disabledTextColor) {
|
||||
changed = true;
|
||||
_disabledTextColor = disabledTextColor;
|
||||
}
|
||||
final Color selectedColor =
|
||||
widget.selectedColor ?? CupertinoTheme.of(context).primaryColor;
|
||||
if (_selectedColor != selectedColor) {
|
||||
changed = true;
|
||||
_selectedColor = selectedColor;
|
||||
}
|
||||
final Color unselectedColor =
|
||||
widget.unselectedColor ??
|
||||
CupertinoTheme.of(context).primaryContrastingColor;
|
||||
if (_unselectedColor != unselectedColor) {
|
||||
changed = true;
|
||||
_unselectedColor = unselectedColor;
|
||||
}
|
||||
final Color selectedDisabledColor =
|
||||
widget.disabledColor ?? selectedColor.withOpacity(0.5);
|
||||
final Color unselectedDisabledColor =
|
||||
widget.disabledColor ?? unselectedColor;
|
||||
if (_selectedDisabledColor != selectedDisabledColor ||
|
||||
_unselectedDisabledColor != unselectedDisabledColor) {
|
||||
changed = true;
|
||||
_selectedDisabledColor = selectedDisabledColor;
|
||||
_unselectedDisabledColor = unselectedDisabledColor;
|
||||
}
|
||||
final Color borderColor =
|
||||
widget.borderColor ?? CupertinoTheme.of(context).primaryColor;
|
||||
if (_borderColor != borderColor) {
|
||||
changed = true;
|
||||
_borderColor = borderColor;
|
||||
}
|
||||
final Color pressedColor =
|
||||
widget.pressedColor ??
|
||||
CupertinoTheme.of(context).primaryColor.withOpacity(0.2);
|
||||
if (_pressedColor != pressedColor) {
|
||||
changed = true;
|
||||
_pressedColor = pressedColor;
|
||||
}
|
||||
|
||||
_forwardBackgroundColorTween = ColorTween(
|
||||
begin: _pressedColor,
|
||||
end: _selectedColor,
|
||||
);
|
||||
_reverseBackgroundColorTween = ColorTween(
|
||||
begin: _unselectedColor,
|
||||
end: _selectedColor,
|
||||
);
|
||||
_textColorTween = ColorTween(begin: _selectedColor, end: _unselectedColor);
|
||||
return changed;
|
||||
}
|
||||
|
||||
void _updateAnimationControllers() {
|
||||
assert(mounted, 'This should only be called after didUpdateDependencies');
|
||||
for (final AnimationController controller in _selectionControllers) {
|
||||
controller.dispose();
|
||||
}
|
||||
_selectionControllers.clear();
|
||||
_childTweens.clear();
|
||||
|
||||
for (final T key in widget.children.keys) {
|
||||
final AnimationController animationController =
|
||||
createAnimationController();
|
||||
if (widget.groupValue == key) {
|
||||
_childTweens.add(_reverseBackgroundColorTween);
|
||||
animationController.value = 1.0;
|
||||
} else {
|
||||
_childTweens.add(_forwardBackgroundColorTween);
|
||||
}
|
||||
_selectionControllers.add(animationController);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
|
||||
if (_updateColors()) {
|
||||
_updateAnimationControllers();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(NewCupertinoSegmentedControl<T> oldWidget) {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
|
||||
if (_updateColors() ||
|
||||
oldWidget.children.length != widget.children.length) {
|
||||
_updateAnimationControllers();
|
||||
}
|
||||
|
||||
if (oldWidget.groupValue != widget.groupValue) {
|
||||
int index = 0;
|
||||
for (final T key in widget.children.keys) {
|
||||
if (widget.groupValue == key) {
|
||||
_childTweens[index] = _forwardBackgroundColorTween;
|
||||
_selectionControllers[index].forward();
|
||||
} else {
|
||||
_childTweens[index] = _reverseBackgroundColorTween;
|
||||
_selectionControllers[index].reverse();
|
||||
}
|
||||
index += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
for (final AnimationController animationController
|
||||
in _selectionControllers) {
|
||||
animationController.dispose();
|
||||
}
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _onTapDown(T currentKey) {
|
||||
if (_pressedKey == null && currentKey != widget.groupValue) {
|
||||
setState(() {
|
||||
_pressedKey = currentKey;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _onTapCancel() {
|
||||
setState(() {
|
||||
_pressedKey = null;
|
||||
});
|
||||
}
|
||||
|
||||
void _onTap(T currentKey) {
|
||||
if (currentKey != _pressedKey) {
|
||||
return;
|
||||
}
|
||||
if (!widget.disabledChildren.contains(currentKey)) {
|
||||
if (currentKey != widget.groupValue) {
|
||||
widget.onValueChanged(currentKey);
|
||||
}
|
||||
}
|
||||
_pressedKey = null;
|
||||
}
|
||||
|
||||
Color? getTextColor(int index, T currentKey) {
|
||||
if (widget.disabledChildren.contains(currentKey)) {
|
||||
return _disabledTextColor;
|
||||
}
|
||||
if (_selectionControllers[index].isAnimating) {
|
||||
return _textColorTween.evaluate(_selectionControllers[index]);
|
||||
}
|
||||
if (widget.groupValue == currentKey) {
|
||||
return _unselectedColor;
|
||||
}
|
||||
return _selectedColor;
|
||||
}
|
||||
|
||||
Color? getBackgroundColor(int index, T currentKey) {
|
||||
if (widget.disabledChildren.contains(currentKey)) {
|
||||
return widget.groupValue == currentKey
|
||||
? _selectedDisabledColor
|
||||
: _unselectedDisabledColor;
|
||||
}
|
||||
if (_selectionControllers[index].isAnimating) {
|
||||
return _childTweens[index].evaluate(_selectionControllers[index]);
|
||||
}
|
||||
if (widget.groupValue == currentKey) {
|
||||
return _selectedColor;
|
||||
}
|
||||
if (_pressedKey == currentKey) {
|
||||
return _pressedColor;
|
||||
}
|
||||
return _unselectedColor;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final List<Widget> gestureChildren = <Widget>[];
|
||||
final List<Color> backgroundColors = <Color>[];
|
||||
int index = 0;
|
||||
int? selectedIndex;
|
||||
int? pressedIndex;
|
||||
for (final T currentKey in widget.children.keys) {
|
||||
selectedIndex = (widget.groupValue == currentKey) ? index : selectedIndex;
|
||||
pressedIndex = (_pressedKey == currentKey) ? index : pressedIndex;
|
||||
|
||||
final TextStyle textStyle = DefaultTextStyle.of(
|
||||
context,
|
||||
).style.copyWith(color: getTextColor(index, currentKey));
|
||||
final IconThemeData iconTheme = IconThemeData(
|
||||
color: getTextColor(index, currentKey),
|
||||
);
|
||||
|
||||
Widget child = Center(child: widget.children[currentKey]);
|
||||
|
||||
child = MouseRegion(
|
||||
cursor: kIsWeb ? SystemMouseCursors.click : MouseCursor.defer,
|
||||
child: GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTapDown:
|
||||
widget.disabledChildren.contains(currentKey)
|
||||
? null
|
||||
: (TapDownDetails event) {
|
||||
_onTapDown(currentKey);
|
||||
},
|
||||
onTapCancel:
|
||||
widget.disabledChildren.contains(currentKey)
|
||||
? null
|
||||
: _onTapCancel,
|
||||
onTap: () {
|
||||
_onTap(currentKey);
|
||||
},
|
||||
child: IconTheme(
|
||||
data: iconTheme,
|
||||
child: DefaultTextStyle(
|
||||
style: textStyle,
|
||||
child: Semantics(
|
||||
button: true,
|
||||
inMutuallyExclusiveGroup: true,
|
||||
selected: widget.groupValue == currentKey,
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
backgroundColors.add(getBackgroundColor(index, currentKey)!);
|
||||
gestureChildren.add(child);
|
||||
index += 1;
|
||||
}
|
||||
|
||||
final Widget box = _SegmentedControlRenderWidget<T>(
|
||||
selectedIndex: selectedIndex,
|
||||
pressedIndex: pressedIndex,
|
||||
backgroundColors: backgroundColors,
|
||||
borderColor: _borderColor!,
|
||||
children: gestureChildren,
|
||||
);
|
||||
|
||||
return Padding(
|
||||
padding: widget.padding ?? _kHorizontalItemPadding,
|
||||
child: UnconstrainedBox(constrainedAxis: Axis.horizontal, child: box),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _SegmentedControlRenderWidget<T> extends MultiChildRenderObjectWidget {
|
||||
const _SegmentedControlRenderWidget({
|
||||
super.key,
|
||||
super.children,
|
||||
required this.selectedIndex,
|
||||
required this.pressedIndex,
|
||||
required this.backgroundColors,
|
||||
required this.borderColor,
|
||||
});
|
||||
|
||||
final int? selectedIndex;
|
||||
final int? pressedIndex;
|
||||
final List<Color> backgroundColors;
|
||||
final Color borderColor;
|
||||
|
||||
@override
|
||||
RenderObject createRenderObject(BuildContext context) {
|
||||
return _RenderSegmentedControl<T>(
|
||||
textDirection: Directionality.of(context),
|
||||
selectedIndex: selectedIndex,
|
||||
pressedIndex: pressedIndex,
|
||||
backgroundColors: backgroundColors,
|
||||
borderColor: borderColor,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void updateRenderObject(
|
||||
BuildContext context,
|
||||
_RenderSegmentedControl<T> renderObject,
|
||||
) {
|
||||
renderObject
|
||||
..textDirection = Directionality.of(context)
|
||||
..selectedIndex = selectedIndex
|
||||
..pressedIndex = pressedIndex
|
||||
..backgroundColors = backgroundColors
|
||||
..borderColor = borderColor;
|
||||
}
|
||||
}
|
||||
|
||||
class _SegmentedControlContainerBoxParentData
|
||||
extends ContainerBoxParentData<RenderBox> {
|
||||
RRect? surroundingRect;
|
||||
}
|
||||
|
||||
typedef _NextChild = RenderBox? Function(RenderBox child);
|
||||
|
||||
class _RenderSegmentedControl<T> extends RenderBox
|
||||
with
|
||||
ContainerRenderObjectMixin<
|
||||
RenderBox,
|
||||
ContainerBoxParentData<RenderBox>
|
||||
>,
|
||||
RenderBoxContainerDefaultsMixin<
|
||||
RenderBox,
|
||||
ContainerBoxParentData<RenderBox>
|
||||
> {
|
||||
_RenderSegmentedControl({
|
||||
required int? selectedIndex,
|
||||
required int? pressedIndex,
|
||||
required TextDirection textDirection,
|
||||
required List<Color> backgroundColors,
|
||||
required Color borderColor,
|
||||
}) : _textDirection = textDirection,
|
||||
_selectedIndex = selectedIndex,
|
||||
_pressedIndex = pressedIndex,
|
||||
_backgroundColors = backgroundColors,
|
||||
_borderColor = borderColor;
|
||||
|
||||
int? get selectedIndex => _selectedIndex;
|
||||
int? _selectedIndex;
|
||||
|
||||
set selectedIndex(int? value) {
|
||||
if (_selectedIndex == value) {
|
||||
return;
|
||||
}
|
||||
_selectedIndex = value;
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
||||
int? get pressedIndex => _pressedIndex;
|
||||
int? _pressedIndex;
|
||||
|
||||
set pressedIndex(int? value) {
|
||||
if (_pressedIndex == value) {
|
||||
return;
|
||||
}
|
||||
_pressedIndex = value;
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
||||
TextDirection get textDirection => _textDirection;
|
||||
TextDirection _textDirection;
|
||||
|
||||
set textDirection(TextDirection value) {
|
||||
if (_textDirection == value) {
|
||||
return;
|
||||
}
|
||||
_textDirection = value;
|
||||
markNeedsLayout();
|
||||
}
|
||||
|
||||
List<Color> get backgroundColors => _backgroundColors;
|
||||
List<Color> _backgroundColors;
|
||||
|
||||
set backgroundColors(List<Color> value) {
|
||||
if (_backgroundColors == value) {
|
||||
return;
|
||||
}
|
||||
_backgroundColors = value;
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
||||
Color get borderColor => _borderColor;
|
||||
Color _borderColor;
|
||||
|
||||
set borderColor(Color value) {
|
||||
if (_borderColor == value) {
|
||||
return;
|
||||
}
|
||||
_borderColor = value;
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
||||
@override
|
||||
double computeMinIntrinsicWidth(double height) {
|
||||
RenderBox? child = firstChild;
|
||||
double minWidth = 0.0;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
final double childWidth = child.getMinIntrinsicWidth(height);
|
||||
minWidth = math.max(minWidth, childWidth);
|
||||
child = childParentData.nextSibling;
|
||||
}
|
||||
return minWidth * childCount;
|
||||
}
|
||||
|
||||
@override
|
||||
double computeMaxIntrinsicWidth(double height) {
|
||||
RenderBox? child = firstChild;
|
||||
double maxWidth = 0.0;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
final double childWidth = child.getMaxIntrinsicWidth(height);
|
||||
maxWidth = math.max(maxWidth, childWidth);
|
||||
child = childParentData.nextSibling;
|
||||
}
|
||||
return maxWidth * childCount;
|
||||
}
|
||||
|
||||
@override
|
||||
double computeMinIntrinsicHeight(double width) {
|
||||
RenderBox? child = firstChild;
|
||||
double minHeight = 0.0;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
final double childHeight = child.getMinIntrinsicHeight(width);
|
||||
minHeight = math.max(minHeight, childHeight);
|
||||
child = childParentData.nextSibling;
|
||||
}
|
||||
return minHeight;
|
||||
}
|
||||
|
||||
@override
|
||||
double computeMaxIntrinsicHeight(double width) {
|
||||
RenderBox? child = firstChild;
|
||||
double maxHeight = 0.0;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
final double childHeight = child.getMaxIntrinsicHeight(width);
|
||||
maxHeight = math.max(maxHeight, childHeight);
|
||||
child = childParentData.nextSibling;
|
||||
}
|
||||
return maxHeight;
|
||||
}
|
||||
|
||||
@override
|
||||
double? computeDistanceToActualBaseline(TextBaseline baseline) {
|
||||
return defaultComputeDistanceToHighestActualBaseline(baseline);
|
||||
}
|
||||
|
||||
@override
|
||||
void setupParentData(RenderBox child) {
|
||||
if (child.parentData is! _SegmentedControlContainerBoxParentData) {
|
||||
child.parentData = _SegmentedControlContainerBoxParentData();
|
||||
}
|
||||
}
|
||||
|
||||
void _layoutRects(
|
||||
_NextChild nextChild,
|
||||
RenderBox? leftChild,
|
||||
RenderBox? rightChild,
|
||||
) {
|
||||
RenderBox? child = leftChild;
|
||||
double start = 0.0;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
final Offset childOffset = Offset(start, 0.0);
|
||||
childParentData.offset = childOffset;
|
||||
final Rect childRect = Rect.fromLTWH(
|
||||
start,
|
||||
0.0,
|
||||
child.size.width,
|
||||
child.size.height,
|
||||
);
|
||||
final RRect rChildRect;
|
||||
if (child == leftChild) {
|
||||
rChildRect = RRect.fromRectAndCorners(
|
||||
childRect,
|
||||
topLeft: const Radius.circular(10.0),
|
||||
bottomLeft: const Radius.circular(10.0),
|
||||
);
|
||||
} else if (child == rightChild) {
|
||||
rChildRect = RRect.fromRectAndCorners(
|
||||
childRect,
|
||||
topRight: const Radius.circular(10.0),
|
||||
bottomRight: const Radius.circular(10.0),
|
||||
);
|
||||
} else {
|
||||
rChildRect = RRect.fromRectAndCorners(childRect);
|
||||
}
|
||||
childParentData.surroundingRect = rChildRect;
|
||||
start += child.size.width;
|
||||
child = nextChild(child);
|
||||
}
|
||||
}
|
||||
|
||||
Size _calculateChildSize(BoxConstraints constraints) {
|
||||
double maxHeight = _kMinSegmentedControlHeight;
|
||||
double childWidth = constraints.minWidth / childCount;
|
||||
RenderBox? child = firstChild;
|
||||
while (child != null) {
|
||||
childWidth = math.max(
|
||||
childWidth,
|
||||
child.getMaxIntrinsicWidth(double.infinity),
|
||||
);
|
||||
child = childAfter(child);
|
||||
}
|
||||
childWidth = math.min(childWidth, constraints.maxWidth / childCount);
|
||||
child = firstChild;
|
||||
while (child != null) {
|
||||
final double boxHeight = child.getMaxIntrinsicHeight(childWidth);
|
||||
maxHeight = math.max(maxHeight, boxHeight);
|
||||
child = childAfter(child);
|
||||
}
|
||||
return Size(childWidth, maxHeight);
|
||||
}
|
||||
|
||||
Size _computeOverallSizeFromChildSize(Size childSize) {
|
||||
return constraints.constrain(
|
||||
Size(childSize.width * childCount, childSize.height),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
double? computeDryBaseline(
|
||||
covariant BoxConstraints constraints,
|
||||
TextBaseline baseline,
|
||||
) {
|
||||
final Size childSize = _calculateChildSize(constraints);
|
||||
final BoxConstraints childConstraints = BoxConstraints.tight(childSize);
|
||||
|
||||
BaselineOffset baselineOffset = BaselineOffset.noBaseline;
|
||||
for (
|
||||
RenderBox? child = firstChild;
|
||||
child != null;
|
||||
child = childAfter(child)
|
||||
) {
|
||||
baselineOffset = baselineOffset.minOf(
|
||||
BaselineOffset(child.getDryBaseline(childConstraints, baseline)),
|
||||
);
|
||||
}
|
||||
return baselineOffset.offset;
|
||||
}
|
||||
|
||||
@override
|
||||
Size computeDryLayout(BoxConstraints constraints) {
|
||||
final Size childSize = _calculateChildSize(constraints);
|
||||
return _computeOverallSizeFromChildSize(childSize);
|
||||
}
|
||||
|
||||
@override
|
||||
void performLayout() {
|
||||
final BoxConstraints constraints = this.constraints;
|
||||
final Size childSize = _calculateChildSize(constraints);
|
||||
|
||||
final BoxConstraints childConstraints = BoxConstraints.tightFor(
|
||||
width: childSize.width,
|
||||
height: childSize.height,
|
||||
);
|
||||
|
||||
RenderBox? child = firstChild;
|
||||
while (child != null) {
|
||||
child.layout(childConstraints, parentUsesSize: true);
|
||||
child = childAfter(child);
|
||||
}
|
||||
|
||||
switch (textDirection) {
|
||||
case TextDirection.rtl:
|
||||
_layoutRects(childBefore, lastChild, firstChild);
|
||||
case TextDirection.ltr:
|
||||
_layoutRects(childAfter, firstChild, lastChild);
|
||||
}
|
||||
|
||||
size = _computeOverallSizeFromChildSize(childSize);
|
||||
}
|
||||
|
||||
@override
|
||||
void paint(PaintingContext context, Offset offset) {
|
||||
RenderBox? child = firstChild;
|
||||
int index = 0;
|
||||
while (child != null) {
|
||||
_paintChild(context, offset, child, index);
|
||||
child = childAfter(child);
|
||||
index += 1;
|
||||
}
|
||||
}
|
||||
|
||||
void _paintChild(
|
||||
PaintingContext context,
|
||||
Offset offset,
|
||||
RenderBox child,
|
||||
int childIndex,
|
||||
) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
|
||||
context.canvas.drawRRect(
|
||||
childParentData.surroundingRect!.shift(offset),
|
||||
Paint()
|
||||
..color = backgroundColors[childIndex]
|
||||
..style = PaintingStyle.fill,
|
||||
);
|
||||
context.canvas.drawRRect(
|
||||
childParentData.surroundingRect!.shift(offset),
|
||||
Paint()
|
||||
..color = borderColor
|
||||
..strokeWidth = 1.0
|
||||
..style = PaintingStyle.stroke,
|
||||
);
|
||||
|
||||
context.paintChild(child, childParentData.offset + offset);
|
||||
}
|
||||
|
||||
@override
|
||||
bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {
|
||||
RenderBox? child = lastChild;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
if (childParentData.surroundingRect!.contains(position)) {
|
||||
return result.addWithPaintOffset(
|
||||
offset: childParentData.offset,
|
||||
position: position,
|
||||
hitTest: (BoxHitTestResult result, Offset localOffset) {
|
||||
assert(localOffset == position - childParentData.offset);
|
||||
return child!.hitTest(result, position: localOffset);
|
||||
},
|
||||
);
|
||||
}
|
||||
child = childParentData.previousSibling;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,115 +0,0 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_fonts.dart';
|
||||
|
||||
import 'new_tab.dart';
|
||||
|
||||
class CupertinoSegmentedControlDemo extends StatefulWidget {
|
||||
const CupertinoSegmentedControlDemo({super.key});
|
||||
|
||||
@override
|
||||
State<CupertinoSegmentedControlDemo> createState() =>
|
||||
_CupertinoSegmentedControlDemoState();
|
||||
}
|
||||
|
||||
class _CupertinoSegmentedControlDemoState
|
||||
extends State<CupertinoSegmentedControlDemo> {
|
||||
int _selectedSegment = 0;
|
||||
|
||||
// The data for the segments
|
||||
final Map<int, Widget> _segments = const {
|
||||
0: Text('Segment 1'),
|
||||
1: Text('Segment 2'),
|
||||
2: Text('Segment 3'),
|
||||
};
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SafeArea(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
CupertinoSlidingSegmentedControl<int>(
|
||||
children: _segments,
|
||||
groupValue: _selectedSegment,
|
||||
|
||||
onValueChanged: (int? value) {
|
||||
setState(() {
|
||||
_selectedSegment = value!;
|
||||
});
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Text(
|
||||
'Selected Segment: ${_selectedSegment + 1}',
|
||||
style: const TextStyle(fontSize: 24),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class CupertinoSegmentedControlDemo2 extends StatefulWidget {
|
||||
const CupertinoSegmentedControlDemo2({super.key});
|
||||
|
||||
@override
|
||||
State<CupertinoSegmentedControlDemo2> createState() =>
|
||||
_CupertinoSegmentedControlDemoState2();
|
||||
}
|
||||
|
||||
class _CupertinoSegmentedControlDemoState2
|
||||
extends State<CupertinoSegmentedControlDemo2> {
|
||||
int _selectedSegment = 0;
|
||||
|
||||
// The data for the segments
|
||||
final Map<int, Widget> _segments = {
|
||||
0:Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(50)
|
||||
),
|
||||
child: Text('لاشه', style: AppFonts.yekan13),
|
||||
),
|
||||
1: Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(50)
|
||||
),
|
||||
child: Text('زنده', style: AppFonts.yekan13),
|
||||
),
|
||||
};
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SafeArea(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
NewCupertinoSegmentedControl<int>(
|
||||
padding: EdgeInsetsDirectional.symmetric(
|
||||
horizontal: 20,
|
||||
vertical: 10,
|
||||
),
|
||||
children: _segments,
|
||||
groupValue: _selectedSegment,
|
||||
selectedColor: AppColor.blueNormal,
|
||||
unselectedColor: Colors.white,
|
||||
borderColor: Colors.grey.shade300,
|
||||
onValueChanged: (int value) {
|
||||
setState(() {
|
||||
_selectedSegment = value;
|
||||
});
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Text(
|
||||
'Selected Segment: ${_selectedSegment + 1}',
|
||||
style: const TextStyle(fontSize: 24),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,133 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:rasadyar_app/presentation/common/app_color.dart';
|
||||
import 'package:vector_graphics/vector_graphics.dart';
|
||||
|
||||
SvgPicture vecWidget(
|
||||
String assets, {
|
||||
double? width,
|
||||
double? height,
|
||||
BoxFit? fit,
|
||||
Color? color,
|
||||
}) {
|
||||
return SvgPicture(
|
||||
AssetBytesLoader(assets),
|
||||
width: width,
|
||||
height: height,
|
||||
fit: fit ?? BoxFit.contain,
|
||||
colorFilter:
|
||||
color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null,
|
||||
);
|
||||
}
|
||||
|
||||
SvgPicture svgWidget(
|
||||
String assets, {
|
||||
double? width,
|
||||
double? height,
|
||||
BoxFit? fit,
|
||||
Color? color,
|
||||
}) {
|
||||
return SvgPicture.asset(
|
||||
assets,
|
||||
width: width,
|
||||
height: height,
|
||||
fit: fit ?? BoxFit.contain,
|
||||
colorFilter:
|
||||
color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget vecWidget2(
|
||||
String assets, {
|
||||
double? width,
|
||||
double? height,
|
||||
BoxFit? fit,
|
||||
Color? color,
|
||||
}) {
|
||||
final resolvedColor = WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return Colors.white;
|
||||
}
|
||||
return color;
|
||||
}).resolve({}); // You can pass actual states if needed
|
||||
|
||||
return IconTheme(
|
||||
data: IconThemeData(color: resolvedColor),
|
||||
child: SvgPicture(
|
||||
AssetBytesLoader(assets),
|
||||
width: width,
|
||||
height: height,
|
||||
fit: fit ?? BoxFit.contain,
|
||||
colorFilter: resolvedColor != null
|
||||
? ColorFilter.mode(resolvedColor, BlendMode.srcIn)
|
||||
: null,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
class ColoredSvgButton extends StatefulWidget {
|
||||
final String svgPath;
|
||||
final String text;
|
||||
final VoidCallback? onPressed;
|
||||
|
||||
const ColoredSvgButton({
|
||||
required this.svgPath,
|
||||
required this.text,
|
||||
this.onPressed,
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
State<ColoredSvgButton> createState() => _ColoredSvgButtonState();
|
||||
}
|
||||
|
||||
class _ColoredSvgButtonState extends State<ColoredSvgButton> {
|
||||
bool _isPressed = false;
|
||||
bool _isHovered = false;
|
||||
|
||||
Color _getIconColor() {
|
||||
if (_isPressed) return Colors.white;
|
||||
if (_isHovered) return AppColor.blueNormal.withAlpha(50);
|
||||
return AppColor.blueNormal;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MouseRegion(
|
||||
onEnter: (_) => setState(() => _isHovered = true),
|
||||
onExit: (_) => setState(() {
|
||||
_isHovered = false;
|
||||
_isPressed = false;
|
||||
}),
|
||||
child: GestureDetector(
|
||||
onTapDown: (_) => setState(() => _isPressed = true),
|
||||
onTapUp: (_) => setState(() => _isPressed = false),
|
||||
onTapCancel: () => setState(() => _isPressed = false),
|
||||
child: OutlinedButton.icon(
|
||||
icon: SvgPicture.asset(
|
||||
widget.svgPath,
|
||||
width: 24,
|
||||
height: 24,
|
||||
color: _getIconColor(),
|
||||
),
|
||||
label: Text(widget.text),
|
||||
onPressed: widget.onPressed,
|
||||
style: OutlinedButton.styleFrom(
|
||||
side: BorderSide(
|
||||
color: AppColor.blueNormal,
|
||||
width: 2,
|
||||
),
|
||||
foregroundColor: AppColor.blueNormal,
|
||||
backgroundColor: _isPressed ? AppColor.blueNormal : null,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user