From 4a9f9efeb3888a63c04c3ad47fb0756592d98bb6 Mon Sep 17 00:00:00 2001 From: User3 Date: Mon, 26 May 2025 15:30:53 +0300 Subject: [PATCH] #sprint-1 --- assets/people.png | Bin 0 -> 4211 bytes example/assets/people.png | Bin 0 -> 4211 bytes .../{counter.dart => counter_section.dart} | 6 +- example/lib/main.dart | 6 +- example/lib/select_section.dart | 40 ++++++++++++ example/lib/toggle_section.dart | 28 ++++++++ example/pubspec.lock | 16 +++++ example/pubspec.yaml | 2 + lib/select.dart | 61 +++++++++++++++++- lib/toggle.dart | 27 ++++++++ lib/ui_kit.dart | 2 +- pubspec.yaml | 2 + 12 files changed, 184 insertions(+), 6 deletions(-) create mode 100644 assets/people.png create mode 100644 example/assets/people.png rename example/lib/{counter.dart => counter_section.dart} (80%) create mode 100644 example/lib/select_section.dart create mode 100644 example/lib/toggle_section.dart create mode 100644 lib/toggle.dart diff --git a/assets/people.png b/assets/people.png new file mode 100644 index 0000000000000000000000000000000000000000..47ceae0173baa938fd6b2adbcc787f14b75a2bde GIT binary patch literal 4211 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 JPDHLkV1mNJ*`xpf literal 0 HcmV?d00001 diff --git a/example/assets/people.png b/example/assets/people.png new file mode 100644 index 0000000000000000000000000000000000000000..47ceae0173baa938fd6b2adbcc787f14b75a2bde GIT binary patch literal 4211 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 JPDHLkV1mNJ*`xpf literal 0 HcmV?d00001 diff --git a/example/lib/counter.dart b/example/lib/counter_section.dart similarity index 80% rename from example/lib/counter.dart rename to example/lib/counter_section.dart index 5928031..35f20eb 100644 --- a/example/lib/counter.dart +++ b/example/lib/counter_section.dart @@ -1,4 +1,5 @@ import 'package:flutter/widgets.dart'; +import 'package:ui_kit/counter.dart'; import 'package:ui_kit/ui_kit.dart'; class CounterSection extends StatefulWidget { @@ -11,9 +12,10 @@ class CounterSection extends StatefulWidget { class _CounterSectionState extends State { @override Widget build(BuildContext context) { - return SizedBox( + return Container( + margin: EdgeInsets.only(bottom: height(context) * 5), width: 64, - height: height(context) * 30, + height: height(context) * 5, child: ListView.builder( itemCount: 2, itemBuilder: (BuildContext context, int index) { diff --git a/example/lib/main.dart b/example/lib/main.dart index cf8d94f..444f7ca 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -2,12 +2,14 @@ import 'package:example/bottom_sheet_section.dart'; import 'package:example/button_section.dart'; import 'package:example/card_section.dart'; import 'package:example/colors_section.dart'; -import 'package:example/counter.dart'; +import 'package:example/counter_section.dart'; import 'package:example/fonts_section.dart'; import 'package:example/header_section.dart'; import 'package:example/inputs_section.dart'; import 'package:example/search_section.dart'; +import 'package:example/select_section.dart'; import 'package:example/small_button_section.dart'; +import 'package:example/toggle_section.dart'; import 'package:flutter/material.dart'; import 'package:ui_kit/ui_kit.dart'; @@ -41,6 +43,8 @@ class MainApp extends StatelessWidget { HeaderSection(), CardSection(), CounterSection(), + ToggleSection(), + SelectSection(), ], ), ), diff --git a/example/lib/select_section.dart b/example/lib/select_section.dart new file mode 100644 index 0000000..725f5df --- /dev/null +++ b/example/lib/select_section.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:ui_kit/select.dart'; +import 'package:ui_kit/utils.dart'; + +class SelectSection extends StatefulWidget { + const SelectSection({super.key}); + + @override + State createState() => _SelectSectionState(); +} + +class _SelectSectionState extends State { + static final selectItems = [ + {'value': ''}, + {'value': 'Мужской'}, + {'value': 'Гарвард Троцкий', 'image': "assets/people.png"}, + ]; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: width(context) * 100, + height: height(context) * 33, + child: ListView.builder( + itemCount: selectItems.length, + itemBuilder: (BuildContext context, int index) { + final currenItem = selectItems[index]; + return Container( + padding: EdgeInsets.only(bottom: height(context) * 2), + child: SelectWidget( + hintText: 'Пол', + selectedValue: currenItem['value'] ?? "", + image: currenItem['image'], + ), + ); + }, + ), + ); + } +} diff --git a/example/lib/toggle_section.dart b/example/lib/toggle_section.dart new file mode 100644 index 0000000..2a74886 --- /dev/null +++ b/example/lib/toggle_section.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:ui_kit/ui_kit.dart'; + +class ToggleSection extends StatefulWidget { + const ToggleSection({super.key}); + + @override + State createState() => _ToggleSectionState(); +} + +class _ToggleSectionState extends State { + @override + Widget build(BuildContext context) { + return SizedBox( + width: 48, + height: height(context) * 20, + child: ListView.builder( + itemCount: 2, + itemBuilder: (BuildContext context, int index) { + return Container( + margin: EdgeInsets.only(bottom: height(context) * 1.5), + child: ToggleWidget(initialValue: index != 1 ? true : false), + ); + }, + ), + ); + } +} diff --git a/example/pubspec.lock b/example/pubspec.lock index 0e8196e..3887b7b 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -49,6 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + dropdown_button2: + dependency: "direct main" + description: + name: dropdown_button2 + sha256: b0fe8d49a030315e9eef6c7ac84ca964250155a6224d491c1365061bc974a9e1 + url: "https://pub.dev" + source: hosted + version: "2.3.9" fake_async: dependency: transitive description: @@ -62,6 +70,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_advanced_switch: + dependency: "direct main" + description: + name: flutter_advanced_switch + sha256: e1147161a3dd9b708a71c65e76174d4d1a0a5908a571b8b38b65c79b142c52a0 + url: "https://pub.dev" + source: hosted + version: "3.1.0" flutter_lints: dependency: "direct dev" description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 9fe7f4b..a5937ef 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -7,8 +7,10 @@ environment: sdk: ^3.8.0 dependencies: + dropdown_button2: ^2.3.9 flutter: sdk: flutter + flutter_advanced_switch: ^3.1.0 modal_bottom_sheet: ^3.0.0 ui_kit: path: .. diff --git a/lib/select.dart b/lib/select.dart index 059cd75..e037ccc 100644 --- a/lib/select.dart +++ b/lib/select.dart @@ -1,7 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:ui_kit/ui_kit.dart'; class SelectWidget extends StatefulWidget { - const SelectWidget({super.key}); + const SelectWidget({ + super.key, + this.selectedValue = '', + this.image, + required this.hintText, + }); + final String selectedValue; + final String? image; + final String hintText; @override State createState() => _SelectWidgetState(); @@ -10,6 +20,53 @@ class SelectWidget extends StatefulWidget { class _SelectWidgetState extends State { @override Widget build(BuildContext context) { - return Scaffold(); + return GestureDetector( + onTap: () { + showBottomSheetFunc(Column(), context); + }, + child: Container( + height: 48, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: inputBgColor, + border: Border.all(color: inputStrokeColor, width: 1), + ), + padding: EdgeInsets.symmetric(horizontal: 14, vertical: 14), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Row( + children: [ + widget.image != null + ? Row( + children: [ + Image.asset( + widget.image ?? '', + width: 24, + height: 24, + ), + SizedBox(width: 12), + ], + ) + : SizedBox(), + Text( + widget.selectedValue == '' + ? widget.hintText + : widget.selectedValue, + style: headlineRegular.copyWith( + color: widget.selectedValue != '' + ? blackColor + : captionColor, + ), + ), + ], + ), + ), + SvgPicture.asset('assets/chevron-down.svg'), + ], + ), + ), + ); } } diff --git a/lib/toggle.dart b/lib/toggle.dart new file mode 100644 index 0000000..2701e0f --- /dev/null +++ b/lib/toggle.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_advanced_switch/flutter_advanced_switch.dart'; +import 'package:ui_kit/ui_kit.dart'; + +class ToggleWidget extends StatefulWidget { + const ToggleWidget({super.key, this.initialValue = false}); + final bool initialValue; + + @override + State createState() => _ToggleWidgetState(); +} + +class _ToggleWidgetState extends State { + final controller00 = ValueNotifier(false); + @override + Widget build(BuildContext context) { + return AdvancedSwitch( + controller: controller00, + width: 48, + height: 28, + initialValue: widget.initialValue, + activeColor: primaryColor, + inactiveColor: inputBgColor, + enabled: true, + ); + } +} diff --git a/lib/ui_kit.dart b/lib/ui_kit.dart index 5c6fbe1..3d26f4b 100644 --- a/lib/ui_kit.dart +++ b/lib/ui_kit.dart @@ -14,4 +14,4 @@ export 'card.dart'; export 'cards/primary_card.dart'; export 'cards/cart_card.dart'; export 'cards/project_card.dart'; -export 'counter.dart'; +export 'toggle.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index 8fd53af..5b26e21 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,8 +8,10 @@ environment: flutter: ">=1.17.0" dependencies: + dropdown_button2: ^2.3.9 flutter: sdk: flutter + flutter_advanced_switch: ^3.1.0 flutter_svg: ^2.1.0 modal_bottom_sheet: ^3.0.0